13 void printline(FILE *stream,
const char *filename,
int lineno,
char *line);
273 { 106,
"operand mismatch in CASL II command" },
274 { 107,
"no label in START" },
275 { 108,
"not command of operand \"r\"" },
276 { 109,
"not command of operand \"r1,r2\"" },
277 { 110,
"not command of operand \"r,adr[,x]\"" },
278 { 111,
"not command of operand \"adr[,x]\"" },
279 { 112,
"not command of no operand" },
280 { 113,
"operand too many in COMET II command" },
281 { 119,
"out of COMET II memory" },
282 { 120,
"GR0 in operand x" },
283 { 122,
"cannot create hash table" },
284 { 124,
"more than one character in literal" },
285 { 125,
"not GR in operand x" },
314 void printline(FILE *stream,
const char *filename,
int lineno,
char *line)
316 fprintf(stream,
"%s:%5d:%s", filename, lineno, line);
325 }
else if(isdigit(str[0]) || str[0] ==
'-' || str[0] ==
'#') {
329 if((adr =
getlabel(prog, str)) == 0xFFFF) {
342 if(strlen(str) != 3 ||
343 strncmp(str,
"GR", 2) != 0 ||
344 str[2] <
'0' || str[2] >
'0' + (
GRSIZE - 1))
348 r = (
WORD)(str[2] -
'0');
350 if(is_x ==
true && r == 0x0) {
359 assert(str[0] ==
'=');
383 fprintf(stdout,
"\t#%04X\t#%04X\n", adr, word);
389 assert(str[0] ==
'\'');
393 for(
int i = 1; str[i] !=
'\'' || str[++i] ==
'\''; i++) {
399 if(literal ==
true && lw ==
true) {
404 if(literal ==
true) {
420 if(str[0] ==
'#' || isdigit(str[0]) || str[0] ==
'-') {
437 if(!cmdl->
label[0]) {
444 if(cmdl->
opd->
opdv[0] != NULL) {
472 for(
int i = 0; i < atoi(cmdl->
opd->
opdv[0]); i++) {
486 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
504 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
506 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
524 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
526 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
545 for(
int i = 1; i <=
GRSIZE-1; i++) {
546 sprintf(line,
" PUSH 0,GR%d", i);
560 for(
int i =
GRSIZE-1; i >= 1; i--) {
561 sprintf(line,
" POP GR%d", i);
569 void (*cmdptr)() = NULL;
571 for(
int i = 0; cmdtbl[i].
name[0]; i++) {
572 if(strcmp(cmdl->
cmd, cmdtbl[i].
name) == 0) {
573 cmdptr = cmdtbl[i].
ptr;
574 (*cmdptr)(cmdl, pass);
597 else if((r_r1 =
grword(cmdl->
opd->
opdv[0],
false)) != 0xFFFF) {
613 cmd |= ((r_r1 << 4) | x_r2);
658 if(pass ==
SECOND && cmd == 0x8000) {
661 if(cmd != 0x8000 || (pass ==
SECOND && adr == 0xFFFF)) {
668 return (
cerr->
num == 0) ? true :
false;
686 return (
cerr->
num == 0) ? true :
false;
695 stat = (
cerr->
num == 0) ?
true :
false;
706 if(cmdl->
opd != NULL) {
707 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
729 if((fp = fopen(file,
"r")) == NULL) {
743 fprintf(stderr,
"Assemble error - %d: %s\n",
cerr->
num,
cerr->
msg);
748 return (
cerr->
num == 0) ? true :
false;
763 for(i = 0; i < filec; i++) {
767 }
else if(pass ==
SECOND) {
773 fprintf(stdout,
"\nAssemble %s (%d)\n", filev[i], pass);
782 fprintf(stdout,
"\nLabel::::\n");
809 if((fp = fopen(file,
"w")) == NULL) {
WORD getadr(const char *prog, const char *str, PASS pass)
アドレスを返す
bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
システムCOMET IIの命令をアセンブルする
bool assembletok(const CMDLINE *cmdl, PASS pass)
トークンをアセンブルする
bool assemblefile(const char *file, PASS pass)
指定された名前のファイルをアセンブル
ASMODE asmode
アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
ASPTR * asptr
アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
void outassemble(const char *file)
ファイルにアセンブル結果を書き込む
WORD getliteral(const char *str, PASS pass)
リテラルを返す
WORD grword(const char *str, bool is_x)
汎用レジスタを表す文字列からレジスタ番号を返す
void printline(FILE *stream, const char *filename, int lineno, char *line)
ファイルストリームの現在行を番号付きで表示する
bool assembleline(const char *line, PASS pass)
1行をアセンブルする
void addcerrlist_assemble()
アセンブルエラーをエラーリストに追加する
static CMD ascmd[]
アセンブラ命令
void writedc(const char *str, PASS pass)
DC命令を書込
static CERR cerr_assemble[]
アセンブルのエラー
static CMD macrocmd[]
マクロ命令
void writememory(WORD word, WORD adr, PASS pass)
アドレス値をメモリに書き込む
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
void writestr(const char *str, bool literal, PASS pass)
文字をメモリに書き込む
void addcerrlist_label()
ラベルのエラーをエラーリストに追加する
bool addlabel(const char *prog, const char *label, WORD adr)
プログラム名、ラベル、アドレスをラベル表に追加する
void printlabel()
ラベル表を表示する
WORD getlabel(const char *prog, const char *label)
プログラム名とラベルに対応するアドレスをラベル表から検索する
void freelabel()
ラベル表を解放する
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
void setcerr(int num, const char *str)
現在のエラーを設定する
void assemble_start(const CMDLINE *cmdl, PASS pass)
アセンブラ命令STARTの処理
void assemble_rpop(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPOP" をメモリに書き込む
void assemble_ds(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DSの処理
void assemble_dc(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DCの処理
void assemble_out(const CMDLINE *cmdl, PASS pass)
マクロ命令 "OUT OBUF,LEN" をアセンブル
bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
アセンブラ言語CASL IIの命令を処理する。
void assemble_end(const CMDLINE *cmdl, PASS pass)
アセンブラ命令ENDの処理
void assemble_in(const CMDLINE *cmdl, PASS pass)
マクロ命令 "IN IBUF,LEN" をアセンブル
void assemble_rpush(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPUSH" をメモリに書き込む
#define FREE(ptr)
メモリを解放するマクロ
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
SYSTEM * sys
COMET IIの仮想実行マシンシステム
WORD getcmdcode(const char *cmd, CMDTYPE type)
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
void addcerrlist_tok()
トークン取得のエラーを追加する
CMDLINE * linetok(const char *line)
行から、ラベル・コマンド・オペランドを取得する
unsigned short WORD
16ビットの数値を表すデータ型
WORD nh2word(const char *str)
10進数または16進数の文字列をWORD値に変換する
char * word2n(WORD word)
WORD値を10進数値を表す文字列に変換する
void addcerrlist_word()
wordデータ型についてのエラーをエラーリストに追加する