--- /dev/null
+;;; 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
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;
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");
--- /dev/null
+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