メモリ管理の改善
[YACASL2.git] / src / assemble.c
index c9f1345..6d67955 100644 (file)
@@ -47,7 +47,7 @@ WORD getgr(const char *str, bool is_x)
     WORD r;
     /* 「GR[0-7]」以外の文字列では、0xFFFFを返して終了 */
     if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 &&
-         (*(str+2) >= '0' && *(str+2) <= '0' + GRSIZE)))
+         (*(str+2) >= '0' && *(str+2) <= '0' + (GRSIZE - 1))))
     {
         return 0xFFFF;
     }
@@ -86,11 +86,11 @@ bool writememory(WORD word, WORD adr, PASS pass)
     bool status = false;
 
     /* COMET IIメモリオーバーの場合 */
-    if(adr >= memsize) {
+    if(adr >= sys->memsize) {
         setcerr(119, word2n(adr));    /* out of COMET II memory */
     }
     if(cerr->num == 0) {
-        memory[adr] = word;
+        (sys->memory)[adr] = word;
         if(pass == SECOND && asmode.asdetail == true) {
             fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
         }
@@ -167,9 +167,9 @@ void writeDC(const char *str, PASS pass)
 bool assemblecmd(const CMDLINE *cmdl, PASS pass)
 {
     int i = 0;
-    CASLCMD cmd = 0;
+    ASCMDID cmdid = 0;
     bool status = false;
-    CMDARRAY ascmd[] = {
+    ASCMD ascmd[] = {
         { START, 0, 1, "START" },
         { END, 0, 0, "END" },
         { DC, 1, OPDSIZE, "DC" },
@@ -183,12 +183,12 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
                 setcerr(106, NULL);    /* operand count mismatch */
                 return false;
             }
-            cmd = ascmd[i].cmdid;
+            cmdid = ascmd[i].cmdid;
             break;
         }
     } while(ascmd[++i].cmdid != 0);
     /* アセンブラ命令 */
-    switch(cmd)
+    switch(cmdid)
     {
     case START:
         if(cmdl->label == NULL) {
@@ -196,10 +196,10 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
             return false;
         }
         /* プログラム名の設定 */
-        asprop->prog = strdup(cmdl->label);
+        asprop->prog = strdup_chk(cmdl->label, "asprop.prog");
         /* オペランドがある場合、実行開始番地を設定 */
         if(pass == SECOND && cmdl->opd->opdc == 1) {
-            if((progprop->start = getlabel(asprop->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
+            if((prog->start = getlabel(asprop->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
                 setcerr(103, cmdl->opd->opdv[0]);    /* label not found */
             }
         }
@@ -212,7 +212,7 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
         }
         /* 実行終了番地と次のプログラムの実行開始番地を設定 */
         else if(pass == SECOND) {
-            progprop->end = asprop->lptr;
+            prog->end = asprop->lptr;
         }
         asprop->prog = NULL;
         status = true;
@@ -249,9 +249,9 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
 bool macrocmd(const CMDLINE *cmdl, PASS pass)
 {
     int i = 0;
-    CASLCMD cmd;
+    MACROCMDID cmdid;
     bool status = false;
-    CMDARRAY macrocmd[] = {
+    MACROCMD macrocmd[] = {
         { IN, 2, 2, "IN" },
         { OUT, 2, 2, "OUT" },
         { RPUSH, 0, 0, "RPUSH" },
@@ -261,15 +261,17 @@ bool macrocmd(const CMDLINE *cmdl, PASS pass)
 
     do {
         if(strcmp(cmdl->cmd, macrocmd[i].cmd) == 0) {
-            if(cmdl->opd->opdc < macrocmd[i].opdc_min || cmdl->opd->opdc > macrocmd[i].opdc_max) {
+            if(cmdl->opd->opdc < macrocmd[i].opdc_min ||
+               cmdl->opd->opdc > macrocmd[i].opdc_max)
+            {
                 setcerr(106, NULL);    /* operand count mismatch */
                 return false;
             }
-            cmd = macrocmd[i].cmdid;
+            cmdid = macrocmd[i].cmdid;
             break;
         }
     } while(macrocmd[++i].cmdid != 0);
-    switch(cmd)
+    switch(cmdid)
     {
     case IN:
         status = writeIN(cmdl->opd->opdv[0], cmdl->opd->opdv[1], pass);
@@ -468,6 +470,8 @@ bool assemble(const char *file, PASS pass)
         if(cerr->num > 0) {
             break;
         }
+        free_chk(line, "line");
+        free_chk(cmdl, "cmdl");
     }
     if(cerr->num > 0) {
         fprintf(stderr, "Assemble error - %d: %s\n", cerr->num, cerr->msg);