]> j8takagi.net git repositories - yacasl2.git/commitdiff
サブルーチンがある場合に正常に逆アセンブルできるよう修正
authorj8takagi <j8takagi@nifty.com>
Thu, 2 Jul 2026 05:37:56 +0000 (14:37 +0900)
committerj8takagi <j8takagi@nifty.com>
Thu, 2 Jul 2026 05:37:56 +0000 (14:37 +0900)
as/sample/outl.casl [new file with mode: 0644]
as/sample/outl.o [new file with mode: 0644]
src/disassemble.c
test/system/casl2rev/outl/0.txt [new file with mode: 0644]
test/system/casl2rev/outl/Makefile [new file with mode: 0644]
test/system/casl2rev/outl/cmd [new file with mode: 0755]

diff --git a/as/sample/outl.casl b/as/sample/outl.casl
new file mode 100644 (file)
index 0000000..f989012
--- /dev/null
@@ -0,0 +1,110 @@
+;;; GR1に格納された値を、10進数の整数値(0〜65535)として表示
+;;; 依存プログラム: DIVL, REV
+OUTL    START
+        RPUSH
+        LAD     GR2,10          ; GR2に10進数の「10」を格納。
+        XOR     GR0,GR0         ; GR0 <- 0
+        XOR     GR4,GR4         ; 整数値の長さ
+        AND     GR1,GR1         ; GR1をテスト
+        JZE     ZERO            ; GR1が0の場合、ZEROにジャンプ
+STI     CPL     GR1,GR2         ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
+        JMI     STLST           ; ↓
+        CALL    DIVL            ; GR1とGR2の、商をGR0、剰余をGR3に格納
+        LD      GR1,GR3         ; GR1にGR3をコピー
+        LD      GR1,NCHAR,GR1   ; GR1を文字に変換
+        ST      GR1,STR,GR4     ; STR + GR4 <- (GR1)
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+        LD      GR1,GR0         ; GR0をGR1にコピー
+        JUMP    STI             ; ループ終端
+STLST   LD      GR1,NCHAR,GR1   ; GR1を文字に変換
+        ST      GR1,STR,GR4     ; STR + GR4 <- (GR1)
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+        JUMP    PRT             ; PRTにジャンプ
+ZERO    LD      GR1,NCHAR       ; 「0」をSTR領域に格納 GR1 <- (NCHAR)
+        ST      GR1,STR,GR4     ; ↓ STR + GR4 <- (GR1)
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+PRT     ST      GR4,LEN         ; LEN <- GR4
+        LD      GR2,LEN         ; GR2にLENの値を格納
+        LAD     GR1,STR         ; GR1に文字列のアドレスを格納
+        CALL    REV             ; 文字列を逆順に並べ替え
+        OUT     STR,LEN         ; 文字列を出力
+        RPOP
+        RET
+STR     DS      17              ; 符号付き2進数で表記した場合を想定し、17けた分のメモリを確保
+LEN     DS      1
+NCHAR   DC      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+        END
+;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
+;;; 入力 GR1:被除数 GR2:除数
+;;; 出力 GR0:商 GR3:剰余
+;;; (GR2 = 0)の場合、GR0 GR3とも0になり、オーバーフロー
+DIVL    START
+        PUSH    0,GR1
+        PUSH    0,GR2
+        PUSH    0,GR4
+        XOR     GR0,GR0         ; GR0:商 初期化
+        XOR     GR3,GR3         ; GR3:剰余 初期化
+        AND     GR2,GR2         ; (GR2 = 0)の場合、DIVZEROへジャンプ
+        JZE     DIVZERO         ; ↓
+        AND     GR1,GR1         ; (GR1 = 0)の場合、FINへジャンプ
+        JZE     FIN             ; ↓
+        ST      GR2,Y           ; YにGR2の初期値を保存
+        LAD     GR4,1           ; GR4:対象ビットのインデックス 初期化
+SL      CPL     GR2,GR1         ; ループ先頭。(GR2 > GR1)の場合、LOOPへループ脱出
+        JPL     LOOP            ; ↓
+        SLL     GR4,1           ; GR4を1回左シフト
+        ST      GR2,TMP         ; GR2の値をTMPに退避
+        SLL     GR2,1           ; GR2を1回左シフト
+        JOV     YOV             ; オーバーフローの場合は、YOVへジャンプ
+        JUMP    SL              ; ループ終端
+YOV     LD      GR2,TMP         ; GR2の値をTMPから復元
+        SRL     GR4,1           ; GR4を1回右シフト
+        JUMP    LPIN            ; LPINへジャンプ
+LOOP    SRL     GR4,1           ; ループ先頭。GR4を1回右シフト
+        JZE     SETMOD          ; (GR4 = 0)の場合、SETMODへループ脱出
+        SRL     GR2,1           ; GR2を1回右シフト
+        CPL     GR1,Y           ; (GR1 < Y)の場合、SETMODへループ脱出
+        JMI     SETMOD          ; ↓
+        CPL     GR1,GR2         ; (GR1 < GR2)の場合、ループ先頭へジャンプ
+        JMI     LOOP            ; ↓
+LPIN    SUBL    GR1,GR2         ; GR1 <- GR1 - GR2
+        ADDL    GR0,GR4         ; GR0 <- GR0 + GR4
+        JUMP    LOOP            ; ループ終端
+DIVZERO LAD     GR3,#8000       ; 強制的にオーバーフローを発生させ、GR3 <- 0
+        SLL     GR3,1           ; ↓
+        JUMP    FIN             ; FIN へジャンプ
+SETMOD  LD      GR3,GR1         ; GR3 <- GR1。剰余の設定
+FIN     POP     GR4
+        POP     GR2
+        POP     GR1
+        RET
+Y       DS      1
+TMP     DS      1
+        END
+;;; メモリー上にある指定されたアドレス、長さの文字列を逆順に並べ替える
+;;;     例: 12345 -> 54321、54321- -> -12345
+;;; 入力 GR1:文字列のアドレス GR2:文字列の長さ
+;;; 出力 (同上)
+REV     START
+        RPUSH
+        LAD     GR3,0           ; GR3の初期化
+PU      CPL     GR3,GR2         ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
+        JZE     NEXT            ; ↓
+        LD      GR4,GR1         ; GR4 <- GR1
+        ADDL    GR4,GR3         ; GR4 <- GR4 + GR3
+        LD      GR5,0,GR4       ; GR5 <- GR4アドレスの値
+        PUSH    0,GR5           ; GR5をプッシュ
+        LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
+        JUMP    PU              ; ループ終端
+NEXT    LAD     GR3,0           ; GR3の初期化
+PO      CPL     GR3,GR2         ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
+        JZE     FIN             ; ↓
+        POP     GR5             ; GR5にポップ
+        LD      GR4,GR1         ; GR4にGR1の値をコピー
+        ADDL    GR4,GR3         ; GR4 <- GR4 + GR3
+        ST      GR5,0,GR4       ; GR4のアドレス <- GR5の値
+        LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
+        JUMP    PO              ; ループ終端
+FIN     RPOP
+        RET
+        END
diff --git a/as/sample/outl.o b/as/sample/outl.o
new file mode 100644 (file)
index 0000000..c5f8c55
Binary files /dev/null and b/as/sample/outl.o differ
index bb50fe03c77de4845fce41ffd4786f40c6fc29f5..81f58a1201c966aaa90208f4c63299db39553b51 100644 (file)
@@ -148,7 +148,7 @@ WORD fgetword(FILE *stream)
 WORD zero_data_cnt(const WORD *data, WORD wordlen)
 {
     WORD cnt = 0;
-    for(cnt = 0; data[cnt] == 0 && cnt < wordlen; cnt++) {
+    for(cnt = 0; cnt < wordlen && data[cnt] == 0; cnt++) {
         ;
     }
     return cnt;
@@ -190,27 +190,21 @@ void disassemble_memory(WORD *memory, WORD start, WORD end)
         cmd = memory[ptr] & 0xFF00;
         cmdname = getcmdname(cmd);
         cmdtype = getcmdtype(cmd);
-        if(inprogram == true) {  /* プログラム領域の場合  */
-            if(cmdname == NULL || code_gr_valid(memory[ptr]) == false) {
-                disassemble_dc(memory[ptr], ptr);
-                ptr++;
+        if((cmd > 0 && cmdname != NULL && code_gr_valid(memory[ptr]) == true) || (inprogram == true && memory[ptr] == 0)) {
+            if(cmdtype == R_ADR_X || cmdtype == ADR_X) {
+                disassemble_cmd_adr_x(cmdtype, cmdname, memory[ptr], memory[ptr + 1], ptr);
             } else {
-                if(cmdtype == R_ADR_X || cmdtype == ADR_X) {
-                    disassemble_cmd_adr_x(cmdtype, cmdname, memory[ptr], memory[ptr + 1], ptr);
-                } else {
-                    disassemble_cmd_r(cmdtype, cmdname, memory[ptr], ptr);
-                }
-                ptr += code2cmdwordlen(cmd);
+                disassemble_cmd_r(cmdtype, cmdname, memory[ptr], ptr);
             }
+            ptr += code2cmdwordlen(cmd);
             inprogram = (cmd != 0x8100) ? true : false;
         } else {
-            /* if(memory[ptr] == 0 && ((zcnt = zero_data_cnt(memory + ptr, end - ptr + 1)) > 1 || ptr == end)) { /\* 0が2つ以上の場合とメモリー末尾の場合、DSとみなす *\/ */
-            if(memory[ptr] == 0 && (zcnt = zero_data_cnt(memory + ptr, end - ptr + 1)) > 1) { /* 0が2つ以上の場合、DSとみなす */
+            if(memory[ptr] == 0 && ((zcnt = zero_data_cnt(memory + ptr, end - ptr + 1)) > 1 || ptr == end)) { /* 0が2つ以上の場合とメモリー末尾の場合は、DSとみなす */
                 disassemble_ds(zcnt, ptr);
                 ptr += zcnt;
             } else {
                 disassemble_dc(memory[ptr], ptr);
-                ptr += 1;
+                ptr++;
             }
         }
         fprintf(stdout, "\n");
diff --git a/test/system/casl2rev/outl/0.txt b/test/system/casl2rev/outl/0.txt
new file mode 100644 (file)
index 0000000..c8a51d2
--- /dev/null
@@ -0,0 +1,182 @@
+MAIN    START
+        PUSH    #0000,GR1       ; #0000: #7001 #0000
+        PUSH    #0000,GR2       ; #0002: #7002 #0000
+        PUSH    #0000,GR3       ; #0004: #7003 #0000
+        PUSH    #0000,GR4       ; #0006: #7004 #0000
+        PUSH    #0000,GR5       ; #0008: #7005 #0000
+        PUSH    #0000,GR6       ; #000A: #7006 #0000
+        PUSH    #0000,GR7       ; #000C: #7007 #0000
+        LAD     GR2,#000A       ; #000E: #1220 #000A
+        XOR     GR0,GR0         ; #0010: #3600
+        XOR     GR4,GR4         ; #0011: #3644
+        AND     GR1,GR1         ; #0012: #3411
+        JZE     #002C           ; #0013: #6300 #002C
+        CPL     GR1,GR2         ; #0015: #4512
+        JMI     #0024           ; #0016: #6100 #0024
+        CALL    #008A           ; #0018: #8000 #008A
+        LD      GR1,GR3         ; #001A: #1413
+        LD      GR1,#0066,GR1   ; #001B: #1011 #0066
+        ST      GR1,#0054,GR4   ; #001D: #1114 #0054
+        LAD     GR4,#0001,GR4   ; #001F: #1244 #0001
+        LD      GR1,GR0         ; #0021: #1410
+        JUMP    #0015           ; #0022: #6400 #0015
+        LD      GR1,#0066,GR1   ; #0024: #1011 #0066
+        ST      GR1,#0054,GR4   ; #0026: #1114 #0054
+        LAD     GR4,#0001,GR4   ; #0028: #1244 #0001
+        JUMP    #0032           ; #002A: #6400 #0032
+        LD      GR1,#0066       ; #002C: #1010 #0066
+        ST      GR1,#0054,GR4   ; #002E: #1114 #0054
+        LAD     GR4,#0001,GR4   ; #0030: #1244 #0001
+        ST      GR4,#0065       ; #0032: #1140 #0065
+        LD      GR2,#0065       ; #0034: #1020 #0065
+        LAD     GR1,#0054       ; #0036: #1210 #0054
+        CALL    #00CD           ; #0038: #8000 #00CD
+        PUSH    #0000,GR1       ; #003A: #7001 #0000
+        PUSH    #0000,GR2       ; #003C: #7002 #0000
+        LAD     GR1,#0054       ; #003E: #1210 #0054
+        LAD     GR2,#0065       ; #0040: #1220 #0065
+        SVC     #0002           ; #0042: #F000 #0002
+        LAD     GR1,#0100       ; #0044: #1210 #0100
+        LAD     GR2,#0101       ; #0046: #1220 #0101
+        SVC     #0002           ; #0048: #F000 #0002
+        POP     GR2             ; #004A: #7120
+        POP     GR1             ; #004B: #7110
+        POP     GR7             ; #004C: #7170
+        POP     GR6             ; #004D: #7160
+        POP     GR5             ; #004E: #7150
+        POP     GR4             ; #004F: #7140
+        POP     GR3             ; #0050: #7130
+        POP     GR2             ; #0051: #7120
+        POP     GR1             ; #0052: #7110
+        RET                     ; #0053: #8100
+        DS      18              ; #0054: #0000
+                                ; #0055: #0000
+                                ; #0056: #0000
+                                ; #0057: #0000
+                                ; #0058: #0000
+                                ; #0059: #0000
+                                ; #005A: #0000
+                                ; #005B: #0000
+                                ; #005C: #0000
+                                ; #005D: #0000
+                                ; #005E: #0000
+                                ; #005F: #0000
+                                ; #0060: #0000
+                                ; #0061: #0000
+                                ; #0062: #0000
+                                ; #0063: #0000
+                                ; #0064: #0000
+                                ; #0065: #0000
+        DC      48              ; #0066: #0030 ::    48 = #0030 = 0000000000110000 = '0'
+        DC      49              ; #0067: #0031 ::    49 = #0031 = 0000000000110001 = '1'
+        DC      50              ; #0068: #0032 ::    50 = #0032 = 0000000000110010 = '2'
+        DC      51              ; #0069: #0033 ::    51 = #0033 = 0000000000110011 = '3'
+        DC      52              ; #006A: #0034 ::    52 = #0034 = 0000000000110100 = '4'
+        DC      53              ; #006B: #0035 ::    53 = #0035 = 0000000000110101 = '5'
+        DC      54              ; #006C: #0036 ::    54 = #0036 = 0000000000110110 = '6'
+        DC      55              ; #006D: #0037 ::    55 = #0037 = 0000000000110111 = '7'
+        DC      56              ; #006E: #0038 ::    56 = #0038 = 0000000000111000 = '8'
+        DC      57              ; #006F: #0039 ::    57 = #0039 = 0000000000111001 = '9'
+        DC      65              ; #0070: #0041 ::    65 = #0041 = 0000000001000001 = 'A'
+        DC      66              ; #0071: #0042 ::    66 = #0042 = 0000000001000010 = 'B'
+        DC      67              ; #0072: #0043 ::    67 = #0043 = 0000000001000011 = 'C'
+        DC      68              ; #0073: #0044 ::    68 = #0044 = 0000000001000100 = 'D'
+        DC      69              ; #0074: #0045 ::    69 = #0045 = 0000000001000101 = 'E'
+        DC      70              ; #0075: #0046 ::    70 = #0046 = 0000000001000110 = 'F'
+        DC      71              ; #0076: #0047 ::    71 = #0047 = 0000000001000111 = 'G'
+        DC      72              ; #0077: #0048 ::    72 = #0048 = 0000000001001000 = 'H'
+        DC      73              ; #0078: #0049 ::    73 = #0049 = 0000000001001001 = 'I'
+        DC      74              ; #0079: #004A ::    74 = #004A = 0000000001001010 = 'J'
+        DC      75              ; #007A: #004B ::    75 = #004B = 0000000001001011 = 'K'
+        DC      76              ; #007B: #004C ::    76 = #004C = 0000000001001100 = 'L'
+        DC      77              ; #007C: #004D ::    77 = #004D = 0000000001001101 = 'M'
+        DC      78              ; #007D: #004E ::    78 = #004E = 0000000001001110 = 'N'
+        DC      79              ; #007E: #004F ::    79 = #004F = 0000000001001111 = 'O'
+        DC      80              ; #007F: #0050 ::    80 = #0050 = 0000000001010000 = 'P'
+        DC      81              ; #0080: #0051 ::    81 = #0051 = 0000000001010001 = 'Q'
+        DC      82              ; #0081: #0052 ::    82 = #0052 = 0000000001010010 = 'R'
+        DC      83              ; #0082: #0053 ::    83 = #0053 = 0000000001010011 = 'S'
+        DC      84              ; #0083: #0054 ::    84 = #0054 = 0000000001010100 = 'T'
+        DC      85              ; #0084: #0055 ::    85 = #0055 = 0000000001010101 = 'U'
+        DC      86              ; #0085: #0056 ::    86 = #0056 = 0000000001010110 = 'V'
+        DC      87              ; #0086: #0057 ::    87 = #0057 = 0000000001010111 = 'W'
+        DC      88              ; #0087: #0058 ::    88 = #0058 = 0000000001011000 = 'X'
+        DC      89              ; #0088: #0059 ::    89 = #0059 = 0000000001011001 = 'Y'
+        DC      90              ; #0089: #005A ::    90 = #005A = 0000000001011010 = 'Z'
+        PUSH    #0000,GR1       ; #008A: #7001 #0000
+        PUSH    #0000,GR2       ; #008C: #7002 #0000
+        PUSH    #0000,GR4       ; #008E: #7004 #0000
+        XOR     GR0,GR0         ; #0090: #3600
+        XOR     GR3,GR3         ; #0091: #3633
+        AND     GR2,GR2         ; #0092: #3422
+        JZE     #00C0           ; #0093: #6300 #00C0
+        AND     GR1,GR1         ; #0095: #3411
+        JZE     #00C7           ; #0096: #6300 #00C7
+        ST      GR2,#00CB       ; #0098: #1120 #00CB
+        LAD     GR4,#0001       ; #009A: #1240 #0001
+        CPL     GR2,GR1         ; #009C: #4521
+        JPL     #00AF           ; #009D: #6500 #00AF
+        SLL     GR4,#0001       ; #009F: #5240 #0001
+        ST      GR2,#00CC       ; #00A1: #1120 #00CC
+        SLL     GR2,#0001       ; #00A3: #5220 #0001
+        JOV     #00A9           ; #00A5: #6600 #00A9
+        JUMP    #009C           ; #00A7: #6400 #009C
+        LD      GR2,#00CC       ; #00A9: #1020 #00CC
+        SRL     GR4,#0001       ; #00AB: #5340 #0001
+        JUMP    #00BC           ; #00AD: #6400 #00BC
+        SRL     GR4,#0001       ; #00AF: #5340 #0001
+        JZE     #00C6           ; #00B1: #6300 #00C6
+        SRL     GR2,#0001       ; #00B3: #5320 #0001
+        CPL     GR1,#00CB       ; #00B5: #4110 #00CB
+        JMI     #00C6           ; #00B7: #6100 #00C6
+        CPL     GR1,GR2         ; #00B9: #4512
+        JMI     #00AF           ; #00BA: #6100 #00AF
+        SUBL    GR1,GR2         ; #00BC: #2712
+        ADDL    GR0,GR4         ; #00BD: #2604
+        JUMP    #00AF           ; #00BE: #6400 #00AF
+        LAD     GR3,#8000       ; #00C0: #1230 #8000
+        SLL     GR3,#0001       ; #00C2: #5230 #0001
+        JUMP    #00C7           ; #00C4: #6400 #00C7
+        LD      GR3,GR1         ; #00C6: #1431
+        POP     GR4             ; #00C7: #7140
+        POP     GR2             ; #00C8: #7120
+        POP     GR1             ; #00C9: #7110
+        RET                     ; #00CA: #8100
+        DS      2               ; #00CB: #0000
+                                ; #00CC: #0000
+        PUSH    #0000,GR1       ; #00CD: #7001 #0000
+        PUSH    #0000,GR2       ; #00CF: #7002 #0000
+        PUSH    #0000,GR3       ; #00D1: #7003 #0000
+        PUSH    #0000,GR4       ; #00D3: #7004 #0000
+        PUSH    #0000,GR5       ; #00D5: #7005 #0000
+        PUSH    #0000,GR6       ; #00D7: #7006 #0000
+        PUSH    #0000,GR7       ; #00D9: #7007 #0000
+        LAD     GR3,#0000       ; #00DB: #1230 #0000
+        CPL     GR3,GR2         ; #00DD: #4532
+        JZE     #00EA           ; #00DE: #6300 #00EA
+        LD      GR4,GR1         ; #00E0: #1441
+        ADDL    GR4,GR3         ; #00E1: #2643
+        LD      GR5,#0000,GR4   ; #00E2: #1054 #0000
+        PUSH    #0000,GR5       ; #00E4: #7005 #0000
+        LAD     GR3,#0001,GR3   ; #00E6: #1233 #0001
+        JUMP    #00DD           ; #00E8: #6400 #00DD
+        LAD     GR3,#0000       ; #00EA: #1230 #0000
+        CPL     GR3,GR2         ; #00EC: #4532
+        JZE     #00F8           ; #00ED: #6300 #00F8
+        POP     GR5             ; #00EF: #7150
+        LD      GR4,GR1         ; #00F0: #1441
+        ADDL    GR4,GR3         ; #00F1: #2643
+        ST      GR5,#0000,GR4   ; #00F2: #1154 #0000
+        LAD     GR3,#0001,GR3   ; #00F4: #1233 #0001
+        JUMP    #00EC           ; #00F6: #6400 #00EC
+        POP     GR7             ; #00F8: #7170
+        POP     GR6             ; #00F9: #7160
+        POP     GR5             ; #00FA: #7150
+        POP     GR4             ; #00FB: #7140
+        POP     GR3             ; #00FC: #7130
+        POP     GR2             ; #00FD: #7120
+        POP     GR1             ; #00FE: #7110
+        RET                     ; #00FF: #8100
+        DC      10              ; #0100: #000A ::    10 = #000A = 0000000000001010 = '\n'
+        DC      1               ; #0101: #0001 ::     1 = #0001 = 0000000000000001
+        END
diff --git a/test/system/casl2rev/outl/Makefile b/test/system/casl2rev/outl/Makefile
new file mode 100644 (file)
index 0000000..b6dac59
--- /dev/null
@@ -0,0 +1,2 @@
+include ../Define.mk
+include ../Test.mk
diff --git a/test/system/casl2rev/outl/cmd b/test/system/casl2rev/outl/cmd
new file mode 100755 (executable)
index 0000000..8c4423d
--- /dev/null
@@ -0,0 +1 @@
+../../../../casl2rev ../../../../as/sample/outl.o