X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=include%2Fassemble.h;h=eb0ab28b48f1e547e2580e83a1088cab4de46fba;hp=ae746fd1eb593b093cc997529ec2fc25bed0ed54;hb=7d5e10034319b163596c9f5930e333fc87043271;hpb=4fe8479d27f535a0ff44c9f6ce270249934e980f diff --git a/include/assemble.h b/include/assemble.h index ae746fd..eb0ab28 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -1,13 +1,16 @@ #ifndef YACASL2_ASSEMBLE_INCLUDED #define YACASL2_ASSEMBLE_INCLUDED -/* CASL IIの制限 */ +/* CASL IIの仕様 */ +enum { + LABELSIZE = 8, /* ラベルの最大文字数 */ + OPDSIZE = 40, /* オペラントの最大数。CASL IIシミュレータの制限 */ +}; + +/* YACASL2の制限 */ enum { LINESIZE = 1024, /* 行の最大文字数 */ TOKENSIZE = 256, /* トークンの最大文字数 */ - LABELSIZE = 8, /* ラベルの最大文字数 */ - LABELTABSIZE = 256, /* ラベルの最大数 */ - OPDSIZE = 40, /* オペラントの最大数 */ }; /* アセンブルモード */ @@ -18,36 +21,56 @@ typedef struct { bool asdetail; /* アセンブラ詳細結果を表示する場合はtrue */ bool onlyassemble; /* アセンブルだけを行う場合はtrue */ } ASMODE; -extern ASMODE asmode; -/* 値を格納するポインタ */ -extern WORD ptr; +extern ASMODE asmode; -/* リテラル(=付きの値)を格納するポインタ */ -extern WORD lptr; +/* アセンブル時のプロパティ */ +typedef struct { + WORD ptr; /* 現在のポインタ */ + WORD lptr; /* リテラル(=付きの値)を格納するポインタ */ + char *prog; /* 他のプログラムで参照する入口名 */ +} ASPROP; -/* 他のプログラムで参照する入口名 */ -extern char *prog; +extern ASPROP *asprop; -/* アセンブラ命令とマクロ命令を表す番号 */ +/* アセンブラ命令を表す番号 */ typedef enum { START = 01, END = 02, DS = 03, DC = 04, +} ASCMDID; + +/* アセンブラ命令を表す配列 */ +typedef struct { + ASCMDID cmdid; + int opdc_min; + int opdc_max; + char *cmd; +} ASCMD; + +/* マクロ命令を表す番号 */ +typedef enum { IN = 011, OUT = 012, RPUSH = 013, RPOP = 014, -} CASLCMD; +} MACROCMDID; -/* アセンブラ命令とマクロ命令を表す配列 */ +/* マクロ命令を表す配列 */ typedef struct { - CASLCMD cmdid; + MACROCMDID cmdid; int opdc_min; int opdc_max; char *cmd; -} CMDARRAY; +} MACROCMD; + +/* ラベル配列 */ +typedef struct { + char *prog; + char *label; + WORD adr; +} LABELARRAY; /* ラベル表 */ typedef struct _LABELTAB { @@ -57,12 +80,19 @@ typedef struct _LABELTAB { WORD adr; } LABELTAB; +enum { + LABELTABSIZE = 251, /* ラベル表のサイズ */ +}; + /* アセンブラが、1回目か、2回目か、を表す */ typedef enum { FIRST = 0, SECOND = 1, } PASS; +/* アセンブルのエラー定義 */ +bool addcerrlist_assemble(); + /* プログラム名とラベルに対応するハッシュ値を返す */ unsigned labelhash(const char *prog, const char *label); @@ -130,16 +160,16 @@ void writestr(const char *str, bool literal, PASS pass); /* アセンブラ命令DCをメモリに書込 */ void writeDC(const char *str, PASS pass); -/* 命令がアセンブラ命令の場合は処理を実行する。 - 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ +/* 命令がアセンブラ命令の場合は処理を実行する。 */ +/* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ bool assemblecmd(const CMDLINE *cmdl, PASS pass); /* 命令のコードを返す 命令が無効な場合は0xFFFF */ WORD getcmd(CMDTYPE type, const char *cmd); -/* 命令が機械語命令の場合は処理を実行 - 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ +/* 命令が機械語命令の場合は処理を実行 */ +/* 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ bool cometcmd(const CMDLINE *cmdl, PASS pass); /* 1行のアセンブル */