11void printline(FILE *stream,
const char *filename,
int lineno,
char *line);
249 { 106,
"operand mismatch in CASL II command" },
250 { 107,
"no label in START" },
251 { 108,
"not command of operand \"r\"" },
252 { 109,
"not command of operand \"r1,r2\"" },
253 { 110,
"not command of operand \"r,adr[,x]\"" },
254 { 111,
"not command of operand \"adr[,x]\"" },
255 { 112,
"not command of no operand" },
256 { 113,
"operand too many in COMET II command" },
257 { 119,
"out of COMET II memory" },
258 { 120,
"GR0 in operand x" },
259 { 122,
"cannot create hash table" },
260 { 124,
"more than one character in literal" },
261 { 125,
"not GR in operand x" },
290void printline(FILE *stream,
const char *filename,
int lineno,
char *line)
292 fprintf(stream,
"%s:%5d:%s", filename, lineno, line);
301 }
else if(isdigit(str[0]) || str[0] ==
'-' || str[0] ==
'#') {
305 if((adr =
getlabel(prog, str)) == 0xFFFF) {
318 if(strlen(str) != 3 ||
319 strncmp(str,
"GR", 2) != 0 ||
320 str[2] <
'0' || str[2] >
'0' + (
GRSIZE - 1))
324 r = (
WORD)(str[2] -
'0');
326 if(is_x ==
true && r == 0x0) {
335 assert(str[0] ==
'=');
352 if(adr >=
sys->memsize) {
357 (
sys->memory)[adr] = word;
359 fprintf(stdout,
"\t#%04X\t#%04X\n", adr, word);
365 assert(str[0] ==
'\'');
369 for(
int i = 1; str[i] !=
'\'' || str[++i] ==
'\''; i++) {
375 if(literal ==
true && lw ==
true) {
380 if(literal ==
true) {
396 if(str[0] ==
'#' || isdigit(str[0]) || str[0] ==
'-') {
413 if(!cmdl->
label[0]) {
420 if(cmdl->
opd->
opdv[0] != NULL) {
439 strcpy(
asptr->prog,
"");
448 for(
int i = 0; i < atoi(cmdl->
opd->
opdv[0]); i++) {
462 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
480 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
482 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
500 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
502 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
521 for(
int i = 1; i <=
GRSIZE-1; i++) {
522 sprintf(line,
" PUSH 0,GR%d", i);
536 for(
int i =
GRSIZE-1; i >= 1; i--) {
537 sprintf(line,
" POP GR%d", i);
547 for(
int i = 0; cmdtbl[i].
name[0]; i++) {
548 if(strcmp(cmdl->
cmd, cmdtbl[i].
name) == 0) {
549 cmdptr = cmdtbl[i].
ptr;
550 (*cmdptr)(cmdl, pass);
573 else if((r_r1 =
grword(cmdl->
opd->
opdv[0],
false)) != 0xFFFF) {
589 cmd |= ((r_r1 << 4) | x_r2);
634 if(pass ==
SECOND && cmd == 0x8000) {
637 if(cmd != 0x8000 || (pass ==
SECOND && adr == 0xFFFF)) {
644 return (
cerr->num == 0) ? true :
false;
662 return (
cerr->num == 0) ? true :
false;
671 stat = (
cerr->num == 0) ?
true :
false;
682 if(cmdl->
opd != NULL) {
683 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
705 if((fp = fopen(file,
"r")) == NULL) {
719 fprintf(stderr,
"Assemble error - %d: %s\n",
cerr->num,
cerr->msg);
724 return (
cerr->num == 0) ? true :
false;
739 for(i = 0; i < filec; i++) {
743 }
else if(pass ==
SECOND) {
749 fprintf(stdout,
"\nAssemble %s (%d)\n", filev[i], pass);
758 fprintf(stdout,
"\nLabel::::\n");
760 if(
asmode.onlylabel ==
true) {
785 if((fp = fopen(file,
"w")) == NULL) {
WORD getadr(const char *prog, const char *str, PASS pass)
アドレスを返す
void assemble_start(const CMDLINE *cmdl, PASS pass)
アセンブラ命令STARTの処理
void assemble_rpop(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPOP" をメモリに書き込む
bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
システムCOMET IIの命令をアセンブルする
bool assembletok(const CMDLINE *cmdl, PASS pass)
トークンをアセンブルする
bool assemblefile(const char *file, PASS pass)
指定された名前のファイルをアセンブル
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" をアセンブル
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[]
アセンブラ命令
bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
アセンブラ言語CASL IIの命令を処理する。
void writedc(const char *str, PASS pass)
DC命令を書込
void assemble_end(const CMDLINE *cmdl, PASS pass)
アセンブラ命令ENDの処理
static CERR cerr_assemble[]
アセンブルのエラー
static CMD macrocmd[]
マクロ命令
void assemble_in(const CMDLINE *cmdl, PASS pass)
マクロ命令 "IN IBUF,LEN" をアセンブル
void writememory(WORD word, WORD adr, PASS pass)
アドレス値をメモリに書き込む
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
void assemble_rpush(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPUSH" をメモリに書き込む
void writestr(const char *str, bool literal, PASS pass)
文字をメモリに書き込む
void addcerrlist_label()
ラベルのエラーをエラーリストに追加する
bool addlabel(const char *prog, const char *label, WORD adr)
プログラム名、ラベル、アドレスをラベル表に追加する
void printlabel()
ラベル表を表示する
ASMODE asmode
アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
ASPTR * asptr
アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
WORD getlabel(const char *prog, const char *label)
プログラム名とラベルに対応するアドレスをラベル表から検索する
void freelabel()
ラベル表を解放する
struct _CERR CERR
エラーを表すデータ型
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
void setcerr(int num, const char *str)
現在のエラーを設定する
#define FREE(ptr)
メモリを解放するマクロ
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
SYSTEM * sys
COMET IIの仮想実行マシンシステム
WORD getcmdcode(const char *cmd, CMDTYPE type)
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
CMDLINE * linetok(const char *line)
行から、ラベル・コマンド・オペランドを取得する
void addcerrlist_tok()
トークン取得のエラーを追加する
unsigned short WORD
16ビットの数値を表すデータ型
WORD nh2word(const char *str)
10進数または16進数の文字列をWORD値に変換する
void addcerrlist_word()
wordデータ型についてのエラーをエラーリストに追加する
char * word2n(WORD word)
WORD値を10進数値を表す文字列に変換する