* CASL IIの仕様
*/
enum {
- LABELSIZE = 8, /** ラベルの最大文字数 */
- OPDSIZE = 40, /** オペラントの最大数。CASL IIシミュレータの制限 */
+ LABELSIZE = 8, /**<ラベルの最大文字数 */
+ OPDSIZE = 40, /**<オペラントの最大数。CASL IIシミュレータの制限 */
};
/**
* YACASL2の制限
*/
enum {
- LINESIZE = 1024, /* 行の最大文字数 */
- TOKENSIZE = 256, /* トークンの最大文字数 */
+ LINESIZE = 1024, /**<行の最大文字数 */
+ TOKENSIZE = 256, /**<トークンの最大文字数 */
};
/**
* アセンブルモード
*/
typedef struct {
- bool src; /* ソースを表示する場合はtrue */
- bool label; /* ラベル表を表示する場合はtrue */
- bool onlylabel; /* ラベル表を表示して終了する場合はtrue */
- bool asdetail; /* アセンブラ詳細結果を表示する場合はtrue */
- bool onlyassemble; /* アセンブルだけを行う場合はtrue */
+ 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; /* 他のプログラムで参照する入口名 */
+ WORD ptr; /**<現在のポインタ */
+ WORD lptr; /**<リテラル(=付きの値)を格納するポインタ */
+ char *prog; /**<他のプログラムで参照する入口名 */
} ASPROP;
+/**
+ * アセンブルのプロパティ: ptr, lptr, *prog
+ */
extern ASPROP *asprop;
/**
* アセンブラ命令を表す配列
*/
typedef struct {
- ASCMDID cmdid;
- int opdc_min;
- int opdc_max;
- char *cmd;
+ ASCMDID cmdid; /**<アセンブル命令のID */
+ int opdc_min; /**<最小オペランド数 */
+ int opdc_max; /**<最大オペランド数 */
+ char *cmd; /**<コマンド名 */
} ASCMD;
/**
* マクロ命令を表す配列
*/
typedef struct {
- MACROCMDID cmdid;
- int opdc_min;
- int opdc_max;
- char *cmd;
+ MACROCMDID cmdid; /**<アセンブル命令のID */
+ int opdc_min; /**<最小オペランド数 */
+ int opdc_max; /**<最大オペランド数 */
+ char *cmd; /**<コマンド名 */
} MACROCMD;
/**
* ラベル配列
*/
typedef struct {
- char *prog;
- char *label;
- WORD adr;
+ char *prog; /**<プログラム */
+ char *label; /**<ラベル */
+ WORD adr; /**<アドレス */
} LABELARRAY;
/**
* ラベル表
*/
typedef struct _LABELTAB {
- struct _LABELTAB *next;
- char *prog;
- char *label;
- WORD adr;
+ struct _LABELTAB *next; /**<リスト次項目へのポインタ */
+ char *prog; /**<プログラム名 */
+ char *label; /**<ラベル名 */
+ WORD adr; /**<アドレス */
} LABELTAB;
enum {
};
/**
- * アセンブラが、1回目か、2回目か、を表す
+ * アセンブラが、1回目か2回目か
*/
typedef enum {
FIRST = 0,
WORD getlabel(const char *prog, const char *label);
/**
- * ã\83©ã\83\99ã\83«ã\82\92表に追加する
+ * ã\83\97ã\83ã\82°ã\83©ã\83 å\90\8dã\80\81ã\83©ã\83\99ã\83«ã\80\81ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92ã\83©ã\83\99ã\83«表に追加する
*/
bool addlabel(const char *prog, const char *label, WORD word);
* オペランド
*/
typedef struct {
- int opdc;
- char *opdv[OPDSIZE];
+ int opdc; /**<オペランド数 */
+ char *opdv[OPDSIZE]; /**<オペランド配列 */
} OPD;
/**
* 命令行
*/
typedef struct {
- char *label;
- char *cmd;
- OPD *opd;
+ char *label; /**<ラベル */
+ char *cmd; /**<コマンド */
+ OPD *opd; /**<オペランド */
} CMDLINE;
/**
- * 1行を解析する
+ * 空白またはタブで区切られた1行から、トークンを取得する
*/
CMDLINE *linetok(const char *line);
bool assemble(const char *file, PASS pass);
/**
- * 指定されたファイルにアセンブル結果を書込
+ * 引数で指定したファイルにアセンブル結果を書込
*/
void outassemble(const char *file);
+++ /dev/null
-#ifndef YACASL2_CASL2_INCLUDED
-#define YACASL2_CASL2_INCLUDED
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <time.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "word.h"
-#include "hash.h"
-#include "cmem.h"
-#include "cerr.h"
-
-/* COMET IIの規格 */
-enum {
- CMDSIZE = 4, /* 命令の最大文字数 */
- GRSIZE = 8, /* 汎用レジスタの数。COMET II規格で、7 */
- DEFAULT_MEMSIZE = 512, /* デフォルトのメモリ容量。COMET II規格では、65536語 */
- DEFAULT_CLOCKS = 5000000, /* デフォルトのクロック周波数。COMET II規格では、未定義 */
-};
-
-/* COMET II フラグのマスク値 */
-enum {
- OF = 0x4, /* Overflow Flag */
- SF = 0x2, /* Sign Flag */
- ZF = 0x1, /* Zero Flag */
-};
-
-/* COMET IIのCPU */
-typedef struct {
- WORD gr[GRSIZE]; /* 汎用レジスタ */
- WORD sp; /* スタックポインタ */
- WORD pr; /* プログラムレジスタ */
- WORD fr; /* フラグレジスタ */
-} CPU;
-
-/* COMET IIの仮装実行マシンシステム */
-typedef struct {
- CPU *cpu; /* CPU */
- WORD *memory; /* メモリ */
- int memsize; /* メモリサイズ */
- int clocks; /* クロック周波数 */
-} SYSTEM;
-
-extern SYSTEM *sys;
-
-/* COMET II 命令 */
-/* 命令タイプは、オペランドにより6種類に分類 */
-typedef enum {
- /* オペランド数2または3 */
- /* 第1オペランド: 汎用レジスタ */
- /* 第2オペランド: アドレス */
- /* 第3オペランド: 指標レジスタ */
- R_ADR_X = 010,
- /* オペランド数2または3 */
- /* 第1オペランド: 汎用レジスタ、*/
- /* 第2オペランド: アドレスに格納されている内容 */
- /* 第3オペランド: 指標レジスタ */
- R_ADR_X_ = 011,
- /* オペランド数2 */
- /* 第1オペランド: 汎用レジスタ */
- /* 第2オペランド: 汎用レジスタ */
- R1_R2 = 020,
- /* オペランド数1または2 */
- /* 第1オペランド: アドレス */
- /* 第2オペランド: 指標レジスタ */
- ADR_X = 030,
- /* オペランド数1 */
- /* 第1オペランド: 汎用レジスタ */
- R_ = 040,
- /* オペランドなし */
- NONE = 0,
-} CMDTYPE;
-
-/* 命令コード配列 */
-typedef struct {
- char *name;
- CMDTYPE type;
- WORD code;
-} CMD;
-
-/* 命令コード配列のサイズ */
-extern int comet2cmdsize;
-
-/* 命令コードのハッシュ表 */
-typedef struct _CMDTAB {
- struct _CMDTAB *next;
- CMD *cmd;
-} CMDTAB;
-
-extern CMDTAB **cmdtype_code;
-extern CMDTAB **code_type;
-extern int cmdtabsize;
-
-/* CASL2プログラムのプロパティ */
-typedef struct {
- WORD start; /* プログラムの開始番地 */
- WORD end; /* プログラムの終了番地 */
-} PROGPROP;
-
-extern PROGPROP *prog;
-
-/* COMET II仮想マシンのリセット */
-void reset(int memsize, int clocks);
-
-/* COMET II仮想マシンのシャットダウン */
-void shutdown();
-
-/* 命令と命令タイプがキーのハッシュ表を作成する */
-bool create_cmdtype_code();
-
-/* 命令と命令タイプから、命令コードを取得する */
-/* 無効な場合は0xFFFFを返す */
-WORD getcmdcode(const char *cmd, CMDTYPE type);
-
-/* 命令と命令タイプがキーのハッシュ表を表示する */
-void print_cmdtype_code();
-
-/* 命令と命令タイプがキーのハッシュ表を解放する */
-void free_cmdtype_code();
-
-/* 命令コードがキーのハッシュ表を作成する */
-bool create_code_type();
-
-/* 命令コードから命令タイプを取得する */
-/* 無効な場合はNONEを返す */
-CMDTYPE getcmdtype(WORD code);
-
-/* 命令コードがキーのハッシュ表を表示する */
-void print_code_type();
-
-/* 命令コードがキーのハッシュ表を解放する */
-void free_code_type();
-
-/* 指定されたファイルにアセンブル結果を書込 */
-void outassemble(const char *file);
-
-#endif /* YACASL2_CASL2_INCLUDEDの終端 */
* エラーの構造体
*/
typedef struct {
- int num; /* エラー番号 */
- char *msg; /* エラーメッセージ */
+ int num; /**<エラー番号 */
+ char *msg; /**<エラーメッセージ */
} CERR;
/**
* エラーリスト型
*/
typedef struct _CERRLIST {
- struct _CERRLIST *next;
- CERR *cerr;
+ struct _CERRLIST *next; /**<リスト次項目へのポインタ */
+ CERR *cerr; /**<エラーの構造体 */
} CERRLIST;
/**
#define YACASL2_CMEM_H_INCLUDED
#include <stdlib.h>
+/*
+ * 配列のサイズを返す
+ */
#ifndef ARRAYSIZE
#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))
#endif
-/* mallocを実行し、0で初期化 */
-/* メモリを確保できない場合はエラーを出力して終了 */
+/**
+ * mallocを実行し、0で初期化
+ * メモリを確保できない場合はエラーを出力して終了
+ */
void *malloc_chk(size_t size, char *tag);
-/* callocを実行 */
-/* メモリを確保できない場合はエラーを出力して終了 */
+/**
+ * callocを実行
+ * メモリを確保できない場合はエラーを出力して終了
+ */
void *calloc_chk(size_t nmemb, size_t size, char *tag);
-/* malloc_chkを実行してメモリを確保してから、 */
-/* コピーした文字列を返す */
+/**
+ * malloc_chkを実行してメモリを確保し、コピーした文字列を返す
+ */
char *strdup_chk(const char *s, char *tag);
-/* メモリがNULLの場合は解放 */
+/**
+ * メモリを解放
+ */
void free_chk(void *ptr, char *tag);
#endif
* ハッシュ共用体
*/
typedef struct {
- UTYPE type;
+ UTYPE type; /**<ハッシュ値の元データのデータ型 */
union {
- char *s;
- int i;
- } val;
+ char *s; /**<char型のデータ */
+ int i; /**<int型のデータ */
+ } val; /**<ハッシュ値の元データ */
} HKEY;
/**
ASMODE asmode = {false, false, false, false, false};
/**
- * アセンブルのプロパティ
+ * アセンブルのプロパティ: ptr, lptr, *prog
*/
ASPROP *asprop;
{ 101, "label already defined" },
{ 102, "label table is full" },
{ 103, "label not found" },
- { 104, "label length is too long" },
- { 105, "no command in the line" },
{ 106, "operand mismatch in assemble command" },
{ 107, "no label in START" },
{ 108, "not command of operand \"r\"" },
{ 111, "not command of operand \"adr[,x]\"" },
{ 112, "not command of no operand" },
{ 113, "operand too many in COMET II command" },
- { 117, "operand too many in DC" },
- { 118, "operand length too long" },
{ 119, "out of COMET II memory" },
{ 120, "GR0 in operand x" },
- { 121, "cannot get operand token" },
{ 122, "cannot create hash table" },
- { 123, "unclosed quote" },
{ 124, "more than one character in literal" },
{ 125, "not GR in operand x" },
};
-#ifndef UNITTEST
-static WORD getadr(const char *prog, const char *str, PASS pass);
+WORD getadr(const char *prog, const char *str, PASS pass);
-static WORD getgr(const char *str, bool is_x);
+WORD getgr(const char *str, bool is_x);
-static WORD getliteral(const char *str, PASS pass);
+WORD getliteral(const char *str, PASS pass);
-static bool assemblecmd(const CMDLINE *cmdl, PASS pass);
+bool assemblecmd(const CMDLINE *cmdl, PASS pass);
-static bool macrocmd(const CMDLINE *cmdl, PASS pass);
+bool macrocmd(const CMDLINE *cmdl, PASS pass);
-static bool writeIN(const char *ibuf, const char *len, PASS pass);
+bool writeIN(const char *ibuf, const char *len, PASS pass);
-static bool writeOUT(const char *obuf, const char *len, PASS pass);
+bool writeOUT(const char *obuf, const char *len, PASS pass);
-static bool writeRPUSH(PASS pass);
+bool writeRPUSH(PASS pass);
-static bool writeRPOP(PASS pass);
+bool writeRPOP(PASS pass);
-static bool cometcmd(const CMDLINE *cmdl, PASS pass);
+bool cometcmd(const CMDLINE *cmdl, PASS pass);
-static bool writememory(WORD word, WORD adr, PASS pass);
+bool writememory(WORD word, WORD adr, PASS pass);
-static void writestr(const char *str, bool literal, PASS pass);
+void writestr(const char *str, bool literal, PASS pass);
-static void writeDC(const char *str, PASS pass);
+void writeDC(const char *str, PASS pass);
-static bool assembleline(const CMDLINE *cmdl, PASS pass);
+bool assembleline(const CMDLINE *cmdl, PASS pass);
-static void printline(FILE *stream, const char *filename, int lineno, char *line);
-#endif
+void printline(FILE *stream, const char *filename, int lineno, char *line);
/**
* 汎用レジスタを表す文字列「GR[0-7]」から、レジスタ番号[0-7]をWORD値で返す
/**
* 機械語命令のリスト
*/
-CMD comet2cmd[] = {
+static CMD comet2cmd[] = {
{ "NOP", NONE, 0x0 },
{ "LD", R_ADR_X_, 0x1000 },
{ "ST", R_ADR_X, 0x1100 },
*/
static CMDTAB **cmdtype_code, **code_type;
-#ifndef UNITTEST
-static unsigned hash_cmdtype(const char *cmd, CMDTYPE type);
-
-static unsigned hash_code(WORD code);
-#endif
-
/**
* 命令の名前とタイプからハッシュ値を生成する
*/
}
/**
- * malloc_chkã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\83¡ã\83¢ã\83ªã\82\92確ä¿\9dã\81\97ã\81¦ã\81\8bã\82\89ã\80\81ã\82³ã\83\94ã\83¼ã\81\97ã\81\9fæ\96\87å\97å\88\97ã\82\92è¿\94ã\81\99
+ * malloc_chkを実行してメモリを確保し、コピーした文字列を返す
*/
char *strdup_chk(const char *s, char *tag)
{
void free_chk(void *ptr, char *tag)
{
free(ptr);
+ ptr = NULL;
}
--- /dev/null
+/**
+ * \mainpage YACASL2 内部仕様書
+ * \section メイン関数
+ * - casl2.c
+ * - comet2.c
+ * - dumpword.c
+ *
+ * \section ヘッダファイル
+ * - assemble.h
+ * - exec.h
+ * - struct.h
+ * - word.h
+ * - hash.h
+ * - cerr.h
+ * - cmem.h
+ *
+ * \section Webサイト
+ * http://www.j8takagi.net/yacasl2/
+ *
+ * \section 外部仕様書
+ * http://www.j8takagi.net/yacasl2/doc/yacasl2.html
+ *
+ * \section CASLII仕様書
+ *
+ * 試験で使用する情報処理用語・プログラム言語など(2008年10月版)
+ * http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf (PDFファイル)
+ * 別紙 1 アセンブラ言語の仕様
+ *
+ * \section ライセンス
+ * \author j8takagi
+ *
+ * YACASL2 is licensed under the MIT license.
+ *
+ * MIT Licenseの詳細は、LICENSEファイルを参照してください。
+ */
#include "exec.h"
/**
- * COMET IIのメモリを表示
+ * COMET IIのメモリを表示する
*/
void dumpmemory()
{
}
/**
- * COMET IIのレジスタを表示
+ * COMET IIのレジスタを表示する
*/
void dspregister()
{
#include "word.h"
#include "cerr.h"
+/**
+ * dumpwordコマンドのオプション
+ */
static struct option longopts[] = {
{ "arithmetic", no_argument, NULL, 'a' },
{ "logical", no_argument, NULL, 'l' },
static int labelcnt = 0; /* ラベル数 */
static LABELTAB *labels[LABELTABSIZE]; /* ラベル表 */
-#ifndef UNITTEST
-static unsigned labelhash(const char *prog, const char *label);
-
-static int compare_adr(const void *a, const void *b);
-#endif
-
/**
* プログラム名とラベルに対応するハッシュ値を返す
*/
}
/**
- * ã\83©ã\83\99ã\83«è¡¨ã\81\8bã\82\89ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92検索する
+ * ã\83\97ã\83ã\82°ã\83©ã\83 å\90\8dã\81¨ã\83©ã\83\99ã\83«ã\81«å¯¾å¿\9cã\81\99ã\82\8bã\82¢ã\83\89ã\83¬ã\82¹ã\82\92ã\83©ã\83\99ã\83«è¡¨ã\81\8bã\82\89検索する
*/
WORD getlabel(const char *prog, const char *label)
{
+++ /dev/null
-#include "casl2.h"
-#include "assemble.h"
-
-/* マクロ命令「IN IBUF,LEN」をメモリに書込 */
-/* PUSH 0,GR1 */
-/* PUSH 0,GR2 */
-/* LAD GR1,IBUF */
-/* LAD GR2,LEN */
-/* SVC 1 */
-/* POP GR2 */
-/* POP GR1 */
-bool writeIN(const char *ibuf, const char *len, PASS pass)
-{
- bool status = false;
-
- /* PUSH 0,GR1 */
- writememory(0x7001, (asprop->ptr)++, pass);
- writememory(0x0, (asprop->ptr)++, pass);
- /* PUSH 0,GR2 */
- writememory(0x7002, (asprop->ptr)++, pass);
- writememory(0x0, (asprop->ptr)++, pass);
- /* LAD GR1,IBUF */
- writememory(0x1210, (asprop->ptr)++, pass);
- writememory(getadr(asprop->prog, ibuf, pass), (asprop->ptr)++, pass);
- /* LAD GR2,LEN */
- writememory(0x1220, (asprop->ptr)++, pass);
- writememory(getadr(asprop->prog, len, pass), (asprop->ptr)++, pass);
- /* SVC 1 */
- writememory(0xF000, (asprop->ptr)++, pass);
- writememory(0x0001, (asprop->ptr)++, pass);
- /* POP GR2 */
- writememory(0x7120, (asprop->ptr)++, pass);
- /* POP GR1 */
- writememory(0x7110, (asprop->ptr)++, pass);
- if(cerr->num == 0) {
- status = true;
- }
- return status;
-}
-
-/* マクロ命令「OUT OBUF,LEN」をメモリに書込 */
-/* PUSH 0,GR1 */
-/* PUSH 0,GR2 */
-/* LAD GR1,OBUF */
-/* LAD GR2,LEN */
-/* SVC 2 */
-/* LAD GR1,=#A */
-/* LAD GR2,1 */
-/* SVC 2 */
-/* POP GR2 */
-/* POP GR1 */
-bool writeOUT(const char *obuf, const char *len, PASS pass)
-{
- bool status = false;
-
- /* PUSH 0,GR1 */
- writememory(0x7001, (asprop->ptr)++, pass);
- writememory(0x0, (asprop->ptr)++, pass);
- /* PUSH 0,GR2 */
- writememory(0x7002, (asprop->ptr)++, pass);
- writememory(0x0, (asprop->ptr)++, pass);
- /* LAD GR1,OBUF */
- writememory(0x1210, (asprop->ptr)++, pass);
- writememory(getadr(asprop->prog, obuf, pass), (asprop->ptr)++, pass);
- /* LAD GR2,OLEN */
- writememory(0x1220, (asprop->ptr)++, pass);
- writememory(getadr(asprop->prog, len, pass), (asprop->ptr)++, pass);
- /* SVC 2 */
- writememory(0xF000, (asprop->ptr)++, pass);
- writememory(0x0002, (asprop->ptr)++, pass);
- /* LAD GR1,=#A */
- writememory(0x1210, (asprop->ptr)++, pass);
- if(pass == FIRST) {
- (asprop->ptr)++;
- } else {
- writememory(asprop->lptr, (asprop->ptr)++, pass); /* リテラルのアドレスを書込 */
- }
- writememory(0xA, (asprop->lptr)++, pass);
- /* LAD GR2,=1 */
- writememory(0x1220, (asprop->ptr)++, pass);
- if(pass == FIRST) {
- (asprop->ptr)++;
- } else {
- writememory(asprop->lptr, (asprop->ptr)++, pass); /* リテラルのアドレスを書込 */
- }
- writememory(0x1, (asprop->lptr)++, pass);
- /* SVC 2 */
- writememory(0xF000, (asprop->ptr)++, pass);
- writememory(0x0002, (asprop->ptr)++, pass);
- /* POP GR2 */
- writememory(0x7120, (asprop->ptr)++, pass);
- /* POP GR1 */
- writememory(0x7110, (asprop->ptr)++, pass);
- if(cerr->num == 0) {
- status = true;
- }
- return status;
-}
-
-/* マクロ命令「RPUSH」をメモリに書き込む
- PUSH 0,GR1
- PUSH 0,GR2
- PUSH 0,GR3
- PUSH 0,GR4
- PUSH 0,GR5
- PUSH 0,GR6
- PUSH 0,GR7
- */
-bool writeRPUSH(PASS pass) {
- int i;
- bool status = false;
-
- for(i = 1; i <= 7; i++) {
- writememory(0x7000 + i, (asprop->ptr)++, pass); /* PUSH GRn */
- writememory(0x0, (asprop->ptr)++, pass);
- }
- if(cerr->num == 0) {
- status = true;
- }
- return status;
-}
-
-/* マクロ命令「RPOP」をメモリに書き込む
- POP GR7
- POP GR6
- POP GR5
- POP GR4
- POP GR3
- POP GR3
- POP GR2
- POP GR1
- */
-bool writeRPOP(PASS pass) {
- int i;
- bool status = false;
- for(i = 7; i >= 1; i--) {
- writememory((0x7100 + (i << 4)), (asprop->ptr)++, pass); /* POP GRn */
- }
- if(cerr->num == 0) {
- status = true;
- }
- return status;
-}
#include "struct.h"
#include "cmem.h"
-/* COMET IIの仮装実行マシンシステム */
+/**
+ * COMET IIの仮装実行マシンシステム
+ */
SYSTEM *sys;
-/* CASL IIプログラムのプロパティ */
+/**
+ * CASL IIプログラムのプロパティ
+ */
PROGPROP *prog;
-/* COMET II仮想マシンのリセット */
+/**
+ * COMET II仮想マシンのリセット
+ */
void reset(int memsize, int clocks)
{
int i;
prog = malloc_chk(sizeof(PROGPROP), "prog");
}
-/* COMET II仮想マシンのシャットダウン */
+/**
+ * COMET II仮想マシンのシャットダウン
+ */
void shutdown()
{
free_chk(prog, "prog");
#include "cmem.h"
#include "assemble.h"
-#ifndef UNITTEST
-static OPD *opdtok(const char *str);
-#endif
-
-/* 「,」区切りの文字列から、オペランドのトークンを取得 */
+/**
+ * 「,」区切りの文字列から、オペランドのトークンを取得
+ */
OPD *opdtok(const char *str)
{
OPD *opd = malloc_chk(sizeof(OPD), "opd");
int sepc = ',', rcnt = 0;
bool quoting = false;
+ CERR cerr_opdtok[] = {
+ { 117, "operand too many in DC" },
+ { 118, "operand length too long" },
+ { 121, "cannot get operand token" },
+ { 123, "unclosed quote" },
+ };
+ addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok);
opd->opdc = 0;
if(str == NULL) {
return opd;
return opd;
}
-/* 空白またはタブで区切られた1行から、トークンを取得 */
+/**
+ * 空白またはタブで区切られた1行から、トークンを取得する
+ */
CMDLINE *linetok(const char *line)
{
char *tokens, *p, *sepp;
bool quoting = false;
CMDLINE *cmdl = malloc_chk(sizeof(CMDLINE), "cmdl");
+ CERR cerr_linetok[] = {
+ { 104, "label length is too long" },
+ { 105, "no command in the line" },
+ };
+ addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok);
if(line == NULL || strlen(line) == 0) {
return NULL;
}
#include "word.h"
#include "cerr.h"
-/* wordのエラー定義 */
+/**
+ * wordのエラー定義
+ */
static CERR cerr_word[] = {
{ 114, "not integer" },
{ 115, "not hex" },
{ 116, "out of hex range" },
};
-/* 10進数の文字列をWORD値に変換 */
-static WORD n2word(const char *str)
+/**
+ * 10進数の文字列をWORD値に変換
+ */
+WORD n2word(const char *str)
{
assert(isdigit(*str) || *str == '-');
return (WORD)n;
}
-/* 16進数の文字列をWORD値に変換 */
-static WORD h2word(const char *str)
+/**
+ * 16進数の文字列をWORD値に変換
+ */
+WORD h2word(const char *str)
{
assert(*str == '#');
return word;
}
-/* 10進数または16進数の文字列をWORD値に変換 */
+/**
+ * 10進数または16進数の文字列をWORD値に変換
+ */
WORD nh2word(const char *str)
{
assert(sizeof(WORD)*8 == 16); /* WORD型のサイズが16ビットであることを確認 */
return word;
}
-/* WORD値を10進数の文字列に変換 */
+/**
+ * WORD値を10進数の文字列に変換
+ */
char *word2n(WORD word)
{
enum {
return digit;
}
-/* WORD値を2進数の文字列に変換 */
+/**
+ * WORD値を2進数の文字列に変換
+ */
char *word2bit(const WORD word)
{
enum {
return bit;
}
-/* WORD値を解析して表示 */
+/**
+ * WORD値を解析して表示
+ */
void print_dumpword(WORD word, bool logicalmode)
{
if(logicalmode == true) {
TEST = $(notdir $(CURRDIR))
# コマンドファイルのソース
-CMDSRC_FILE := $(CMD_FILE)
-#CMDSRC_FILE := $(CMD_FILE).c
+CMDSRC_FILE ?= $(CMD_FILE)
.PHONY: check set reset time cleantime clean cleanall
-../../../../casl2 -M720 inl.casl ../../../../as/casl2lib/inl.casl ../../../../as/casl2lib/outl.casl ../../../../as/casl2lib/str2l.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl <teststr.txt
+../../../../casl2 -M720 inl.casl ../../../../as/casl2lib/inl.casl ../../../../as/casl2lib/outl.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/str2l.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl <teststr.txt
-../../../../casl2 -M640 mull.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/outl.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl
+../../../../casl2 -M4096 mull.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/outl.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl
-Execute error - 201: load object file - full of COMET II memory
+Load error - 201: a.o: Loading - full of COMET II memory