X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=include%2Fassemble.h;h=15d314c789dd2b47eae011fd961a47a382dc5f2f;hp=fddad63565f18ab25ce0fb9e89fc8f7c58e88c0e;hb=d1f82970bf7d41db2fea11b08cd8e308f6cb8138;hpb=1e636c95bf237645b6c9117e3eb64aa2d8aa4c90 diff --git a/include/assemble.h b/include/assemble.h index fddad63..15d314c 100644 --- a/include/assemble.h +++ b/include/assemble.h @@ -1,143 +1,175 @@ -/* CASL IIの制限 */ +#ifndef YACASL2_ASSEMBLE_INCLUDED +#define YACASL2_ASSEMBLE_INCLUDED + +#include +#include "struct.h" +#include "word.h" + +/** + * CASL IIの仕様 + */ +enum { + LABELSIZE = 8, /** ラベルの最大文字数 */ + OPDSIZE = 40, /** オペラントの最大数。CASL IIシミュレータの制限 */ +}; + +/** + * YACASL2の制限 + */ enum { - LINESIZE = 1024, /* 行の最大文字数 */ - TOKENSIZE = 256, /* トークンの最大文字数 */ - LABELSIZE = 8, /* ラベルの最大文字数 */ - LABELTABSIZE = 256, /* ラベルの最大数 */ - OPDSIZE = 40 /* オペラントの最大数 */ + LINESIZE = 1024, /* 行の最大文字数 */ + TOKENSIZE = 256, /* トークンの最大文字数 */ }; -/* 値を格納するポインタ */ -extern WORD ptr; +/** + * アセンブルモード + */ +typedef struct { + bool src; /* ソースを表示する場合はtrue */ + bool label; /* ラベル表を表示する場合はtrue */ + bool onlylabel; /* ラベル表を表示して終了する場合はtrue */ + bool asdetail; /* アセンブラ詳細結果を表示する場合はtrue */ + bool onlyassemble; /* アセンブルだけを行う場合はtrue */ +} ASMODE; + +extern ASMODE asmode; + +/** + * アセンブルのプロパティ + */ +typedef struct { + WORD ptr; /* 現在のポインタ */ + WORD lptr; /* リテラル(=付きの値)を格納するポインタ */ + char *prog; /* 他のプログラムで参照する入口名 */ +} ASPROP; -/* リテラル(=付きの値)を格納するポインタ */ -extern WORD lptr; +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; + RPOP = 014, +} 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 { struct _LABELTAB *next; - char *name; + char *prog; + char *label; WORD adr; } LABELTAB; -/* アセンブラが、1回目か、2回目か、を表す */ +enum { + /** + * ラベル表のサイズ + */ + LABELTABSIZE = 251, +}; + +/** + * アセンブラが、1回目か、2回目か、を表す + */ typedef enum { FIRST = 0, - SECOND = 1 + SECOND = 1, } PASS; -/* ラベル表からアドレスを検索する */ -WORD getlabel(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(); -/* ラベル表を解放する */ +/** + * ラベル表を解放する + */ void freelabel(); -/* オペランド */ +/** + * オペランド + */ typedef struct { int opdc; char *opdv[OPDSIZE]; } OPD; -/* 命令行 */ +/** + * 命令行 + */ typedef struct { char *label; char *cmd; OPD *opd; } CMDLINE; -/* 命令がマクロ命令の場合はメモリに書込 - 書込に成功した場合TRUE、それ以外の場合はFALSEを返す */ -bool macrocmd(const CMDLINE *cmdl, PASS pass); - -/* 「,」区切りの文字列から、オペランドを取得する */ -OPD *opdtok(const char *str); - -/* 1行を解析する */ +/** + * 1行を解析する + */ CMDLINE *linetok(const char *line); -/* 汎用レジスタを表す文字列「GR[0-7]」をWORD値に変換 - is_xがTRUEの場合は、指標レジスタとして用いる汎用レジスタ - 文字列が汎用レジスタを表さない場合は、0xFFFFを返す */ -WORD getgr(const char *str, bool is_x); - -/* 10進定数をWORDに変換 */ -WORD getint(const char *str); - -/* 16進定数をWORDに変換 */ -WORD gethex(const char *str); - -/* アドレスを返す */ -/* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */ -WORD getadr(const char *str, PASS pass); - -/* 定数の前に等号(=)をつけて記述される、リテラルを返す */ -/* リテラルには、10進定数/16進定数/文字定数が含まれる */ -WORD getliteral(const char *str, PASS pass); - -/* COMET IIのメモリにアドレス値を書き込む */ -bool writememory(WORD word, WORD adr, PASS pass); - -/* ' 'で囲まれた、文字定数をメモリに書込 */ -/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */ -void writestr(const char *str, bool literal, PASS pass); - -/* アセンブラ命令DCをメモリに書込 */ -void writeDC(const char *str, PASS pass); - -/* 命令がアセンブラ命令の場合は処理を実行する。 - 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ -bool assemblecmd(const CMDLINE *cmdl, PASS pass); - -/* 命令のコードを返す - 命令が無効な場合は0xFFFF */ -WORD getcmd(CMDTYPE type, const char *cmd); - -/* 命令が機械語命令の場合は処理を実行 - 実行に成功した場合TRUE、それ以外の場合はFALSEを返す */ -bool cometcmd(const CMDLINE *cmdl, PASS pass); - -/* 1行のアセンブル */ -/* アセンブル完了時はTRUE、未完了時はFALSEを返す */ -bool assembleline(const CMDLINE *cmdl, PASS pass); - -/* 指定された名前のファイルをアセンブル */ -/* 2回実行される */ +/** + * 指定された名前のファイルをアセンブル + * 2回実行される + */ bool assemble(const char *file, PASS pass); -/* マクロ命令「IN IBUF,LEN」をメモリに書込 */ -bool writeIN(const char *ibuf, const char *len, PASS pass); - -/* マクロ命令「OUT OBUF,LEN」をメモリに書込 */ -bool writeOUT(const char *obuf, const char *len, PASS pass); - -/* マクロ命令「RPUSH」をメモリに書込 */ -bool writeRPUSH(PASS pass); +/** + * 指定されたファイルにアセンブル結果を書込 + */ +void outassemble(const char *file); -/* マクロ命令「RPOP」をメモリに書込 */ -bool writeRPOP(PASS pass); +#endif /* YACASL2_ASSEMBLE_INCLUDEDの終端 */