From b207e1f1b0e573d396630eb57d4d6a9d818cec1d Mon Sep 17 00:00:00 2001 From: j8takagi Date: Thu, 2 Jul 2026 14:37:56 +0900 Subject: [PATCH] =?utf8?q?=E3=82=B5=E3=83=96=E3=83=AB=E3=83=BC=E3=83=81?= =?utf8?q?=E3=83=B3=E3=81=8C=E3=81=82=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=AB?= =?utf8?q?=E6=AD=A3=E5=B8=B8=E3=81=AB=E9=80=86=E3=82=A2=E3=82=BB=E3=83=B3?= =?utf8?q?=E3=83=96=E3=83=AB=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?utf8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- as/sample/outl.casl | 110 +++++++++++++++++ as/sample/outl.o | Bin 0 -> 516 bytes src/disassemble.c | 22 ++-- test/system/casl2rev/outl/0.txt | 182 +++++++++++++++++++++++++++++ test/system/casl2rev/outl/Makefile | 2 + test/system/casl2rev/outl/cmd | 1 + 6 files changed, 303 insertions(+), 14 deletions(-) create mode 100644 as/sample/outl.casl create mode 100644 as/sample/outl.o create mode 100644 test/system/casl2rev/outl/0.txt create mode 100644 test/system/casl2rev/outl/Makefile create mode 100755 test/system/casl2rev/outl/cmd diff --git a/as/sample/outl.casl b/as/sample/outl.casl new file mode 100644 index 0000000..f989012 --- /dev/null +++ b/as/sample/outl.casl @@ -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 index 0000000000000000000000000000000000000000..c5f8c55d14e34c4ca2224344d9f18e897ad11141 GIT binary patch literal 516 zcma)(J5mBc5Qe`+)GDIgam`oD!o*;CxN5ct_zdIm3G#03nDAOMfx z1uO$YLwlgKD9ga9`fK{{p6==X+v-3{Fe69{W(9MCd4Z=g5L5!ENNWvMrMUv#dlp>B zZsR%;6=h+&#EVROi1XM}FG455vlDC;N&X9#)HZ(_?x_SmQetCy%Cd~@X_{Z_dk*7eBbpkfnWQ!8pl&Mf?YMfE0LBu&1Tyn)VH$VLu zJqQZHvdsUCQDK1R3<+iGr7B5}ux^QGgeN!cM~EL}(h*@pc>FZETYWs?c4-LB{#eHz zYBilD?%^xCzR8XU 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 index 0000000..c8a51d2 --- /dev/null +++ b/test/system/casl2rev/outl/0.txt @@ -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 index 0000000..b6dac59 --- /dev/null +++ b/test/system/casl2rev/outl/Makefile @@ -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 index 0000000..8c4423d --- /dev/null +++ b/test/system/casl2rev/outl/cmd @@ -0,0 +1 @@ +../../../../casl2rev ../../../../as/sample/outl.o -- 2.47.3