17void printline(FILE *stream,
const char *filename,
int lineno,
char *line);
261 { 106,
"operand mismatch in CASL II command" },
262 { 107,
"no label in START" },
263 { 108,
"not command of operand \"r\"" },
264 { 109,
"not command of operand \"r1,r2\"" },
265 { 110,
"not command of operand \"r,adr[,x]\"" },
266 { 111,
"not command of operand \"adr[,x]\"" },
267 { 112,
"not command of no operand" },
268 { 113,
"operand too many in COMET II command" },
269 { 119,
"out of COMET II memory" },
270 { 120,
"GR0 in operand x" },
271 { 122,
"cannot create hash table" },
272 { 124,
"more than one character in literal" },
273 { 125,
"not GR in operand x" },
274 { 126,
"syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (')." },
275 { 127,
"empty character constant" },
304void printline(FILE *stream,
const char *filename,
int lineno,
char *line)
306 fprintf(stream,
"%s:%5d:%s", filename, lineno, line);
315 }
else if(isdigit(str[0]) || str[0] ==
'-' || str[0] ==
'#') {
319 if((adr =
getlabel(prog, str)) == 0xFFFF) {
335 if(strlen(str) != 3 ||
336 strncmp(str,
"GR", 2) != 0 ||
337 str[2] <
'0' || str[2] >
'0' + (
GRSIZE - 1))
341 r = (
WORD)(str[2] -
'0');
343 if(is_x ==
true && r == 0x0) {
352 assert(str[0] ==
'=');
371 sprintf(llabel,
"=%04X", val);
385 assert(str[0] ==
'\'');
386 size_t len = strlen(str);
388 if(str[1] ==
'\'' && len == 2) {
390 }
else if (len == 1 || str[len - 1] !=
'\'') {
392 }
else if((str[1] !=
'\'' && len > 3) || (str[1] ==
'\'' && len > 4)) {
394 }
else if(str[1] ==
'\'' && len == 3 && str[2] ==
'\'') {
407 if(adr >=
sys->memsize) {
412 (
sys->memory)[adr] = word;
414 fprintf(stdout,
"\t#%04X\t#%04X\n", adr, word);
420 assert(str[0] ==
'\'');
423 if(str[1] ==
'\'' && str[2] ==
'\0') {
434 if(str[i + 1] !=
'\0' && str[i + 1] !=
'\'') {
437 }
else if(str[i + 1] ==
'\0') {
458 if(str[0] ==
'#' || isdigit(str[0]) || str[0] ==
'-') {
464 if(pass ==
SECOND && adr == 0xFFFF) {
478 if(!cmdl->
label[0]) {
485 if(cmdl->
opd->
opdv[0] != NULL) {
504 strcpy(
asptr->prog,
"");
513 for(
int i = 0; i < atoi(cmdl->
opd->
opdv[0]); i++) {
527 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
545 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
547 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
565 sprintf(line,
" LAD GR1,%s", cmdl->
opd->
opdv[0]);
567 sprintf(line,
" LAD GR2,%s", cmdl->
opd->
opdv[1]);
586 for(
int i = 1; i <=
GRSIZE-1; i++) {
587 sprintf(line,
" PUSH 0,GR%d", i);
601 for(
int i =
GRSIZE-1; i >= 1; i--) {
602 sprintf(line,
" POP GR%d", i);
612 for(
int i = 0; cmdtbl[i].
name[0]; i++) {
613 if(strcmp(cmdl->
cmd, cmdtbl[i].
name) == 0) {
614 cmdptr = cmdtbl[i].
ptr;
615 (*cmdptr)(cmdl, pass);
638 else if((r_r1 =
grword(cmdl->
opd->
opdv[0],
false)) != 0xFFFF) {
654 cmd |= ((r_r1 << 4) | x_r2);
699 if(pass ==
SECOND && cmd == 0x8000) {
702 if(cmd != 0x8000 || (pass ==
SECOND && adr == 0xFFFF)) {
709 return (
cerr->num == 0) ? true :
false;
727 return (
cerr->num == 0) ? true :
false;
736 stat = (
cerr->num == 0) ?
true :
false;
747 if(cmdl->
opd != NULL) {
748 for(
int i = 0; i < cmdl->
opd->
opdc; i++) {
770 if((fp = fopen(file,
"r")) == NULL) {
784 fprintf(stderr,
"Assemble error - %d: %s\n",
cerr->num,
cerr->msg);
789 return (
cerr->num == 0) ? true :
false;
804 for(i = 0; i < filec; i++) {
808 }
else if(pass ==
SECOND) {
814 fprintf(stdout,
"\nAssemble %s (%d)\n", filev[i], pass);
822 if(
asmode.label ==
true) {
825 if(
asmode.onlylabel ==
true) {
854 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 writestr(const char *str, 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()
アセンブルエラーをエラーリストに追加する
WORD getliteralquote(const char *str)
'ではじまる文字列からWORD値を返す
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 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 printliteral()
リテラルを表示する
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, reverse, 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進数値を表す文字列に変換する