X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=include%2Fassemble.h;h=f6e081add610e658bbb4b436f0c90088ba4367c0;hp=fddad63565f18ab25ce0fb9e89fc8f7c58e88c0e;hb=a901ac636091cc9d044a78525064b699ef7a2760;hpb=44cde08e6cf148928a219593c78a57abfd89b424 diff --git a/include/assemble.h b/include/assemble.h index fddad63..f6e081a 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -1,18 +1,34 @@ +#ifndef YACASL2_ASSEMBLE_INCLUDED +#define YACASL2_ASSEMBLE_INCLUDED + /* CASL IIの制限 */ enum { - LINESIZE = 1024, /* 行の最大文字数 */ - TOKENSIZE = 256, /* トークンの最大文字数 */ - LABELSIZE = 8, /* ラベルの最大文字数 */ + LINESIZE = 1024, /* 行の最大文字数 */ + TOKENSIZE = 256, /* トークンの最大文字数 */ + LABELSIZE = 8, /* ラベルの最大文字数 */ LABELTABSIZE = 256, /* ラベルの最大数 */ - OPDSIZE = 40 /* オペラントの最大数 */ + OPDSIZE = 40, /* オペラントの最大数 */ }; +/* アセンブルモード */ +typedef struct { + bool srcmode; /* ソースを表示する場合はtrue */ + bool labelmode; /* ラベル表を表示する場合はtrue */ + bool onlylabelmode; /* ラベル表を表示して終了する場合はtrue */ + bool asdetailmode; /* アセンブラ詳細結果を表示する場合はtrue */ + bool onlyassemblemode; /* アセンブルだけを行う場合はtrue */ +} ASMODE; +extern ASMODE asmode; + /* 値を格納するポインタ */ extern WORD ptr; /* リテラル(=付きの値)を格納するポインタ */ extern WORD lptr; +/* 他のプログラムで参照する入口名 */ +extern char *prog; + /* アセンブラ命令とマクロ命令を表す番号 */ typedef enum { START = 01, @@ -22,7 +38,7 @@ typedef enum { IN = 011, OUT = 012, RPUSH = 013, - RPOP = 014 + RPOP = 014, } CASLCMD; /* アセンブラ命令とマクロ命令を表す配列 */ @@ -36,21 +52,25 @@ typedef struct { /* ラベル表 */ typedef struct _LABELTAB { struct _LABELTAB *next; - char *name; + char *prog; + char *label; WORD adr; } LABELTAB; /* アセンブラが、1回目か、2回目か、を表す */ typedef enum { FIRST = 0, - SECOND = 1 + SECOND = 1, } PASS; -/* ラベル表からアドレスを検索する */ -WORD getlabel(const char *label); +/* プログラム名とラベルに対応するハッシュ値を返す */ +unsigned labelhash(const char *prog, const char *label); + +/* プログラム名とラベルに対応するアドレスをラベル表から検索する */ +WORD getlabel(const char *prog, const char *label); /* ラベルを表に追加する */ -bool addlabel(const char *label, WORD word); +bool addlabel(const char *prog, const char *label, WORD word); /* ラベル表を表示する */ void printlabel(); @@ -94,7 +114,7 @@ WORD gethex(const char *str); /* アドレスを返す */ /* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */ -WORD getadr(const char *str, PASS pass); +WORD getadr(const char *prog, const char *str, PASS pass); /* 定数の前に等号(=)をつけて記述される、リテラルを返す */ /* リテラルには、10進定数/16進定数/文字定数が含まれる */ @@ -141,3 +161,5 @@ bool writeRPUSH(PASS pass); /* マクロ命令「RPOP」をメモリに書込 */ bool writeRPOP(PASS pass); + +#endif