;GR1に格納された数値を表示
-OUTI START
- PUSH 0,GR2
- PUSH 0,GR3
- PUSH 0,GR4
- LAD GR0,0
- LAD GR2,0
- AND GR1,GR1
- JZE INEXT
- JPL ILOOP
- LAD GR0,1
- CALL INV
-ILOOP CPL GR1,TEN
- JMI INEXT
- CALL DIV10
- ADDL GR4,ZCHAR
- ST GR4,STR,GR2
- LAD GR2,1,GR2
- LD GR1,GR3
- JUMP ILOOP
-INEXT ADDL GR1,ZCHAR
- ST GR1,STR,GR2
- LAD GR2,1,GR2
- CPL GR0,=1
- JNZ PRT
- LD GR1,MINUS
- ST GR1,STR,GR2
- LAD GR2,1,GR2
-PRT ST GR2,LEN
- LAD GR1,STR
- LD GR2,LEN
- CALL REV
- OUT STR,LEN
- POP GR4
- POP GR3
- POP GR2
- RET
-TEN DC 10
-ZCHAR DC '0'
-MINUS DC '-'
-STR DS 6
-LEN DS 1
- END
+OUTI START
+ PUSH 0,GR2
+ PUSH 0,GR3
+ PUSH 0,GR4
+ LAD GR0,0 ; 負数フラグ。GR1が負数の場合、GR0は1
+ LAD GR2,0
+ AND GR1,GR1
+ JZE INEXT ; GR1が0の場合
+ JPL ILOOP ; GR1が正数の場合
+ LAD GR0,1 ; GR1が負数の場合、負数フラグ設定
+ CALL INV ; 負数を正数に変換
+ILOOP CPL GR1,TEN
+ JMI INEXT ; GR1が10未満の場合は、ループ終了
+ CALL DIV10 ; (GR1 / 10)の商をGR3、剰余をGR4に格納
+ ADDL GR4,ZCHAR ; (GR1 / 10)の剰余を文字に変換
+ ST GR4,STR,GR2 ; 文字をメモリに格納
+ LAD GR2,1,GR2 ; GR2をインクリメント
+ LD GR1,GR3 ; (GR1 / 10)の商をGR1に格納
+ JUMP ILOOP
+INEXT ADDL GR1,ZCHAR ; ループ終了後の剰余を文字に変換
+ ST GR1,STR,GR2 ; 文字をメモリに格納
+ LAD GR2,1,GR2 ; GR2をインクリメント
+ CPL GR0,=1 ; 負数フラグ判定
+ JNZ PRT
+ LD GR1,='-' ; 負数フラグがオンの場合、「-」をロード
+ ST GR1,STR,GR2 ; 「-」をメモリに格納
+ LAD GR2,1,GR2 ; GR2をインクリメント
+PRT ST GR2,LEN ; GR2をメモリに格納
+ LAD GR1,STR ; GR1に文字列のアドレスを格納
+ CALL REV ; アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+ OUT STR,LEN ; 文字列を印字
+ POP GR4
+ POP GR3
+ POP GR2
+ RET
+TEN DC 10
+ZCHAR DC '0'
+STR DS 6
+LEN DS 1
+ END
;GR1を10で割ったときの商をGR3、剰余をGR4に格納
-DIV10 LD GR4,GR1
- LAD GR3,0
-DLOOP CPL GR4,TEN
- JMI DFIN
- SUBL GR4,TEN
- LAD GR3,1,GR3
- JUMP DLOOP
-DFIN RET
- END
+DIV10 LD GR4,GR1 ; GR1の値をGR4にコピー
+ LAD GR3,0
+DLOOP CPL GR4,TEN
+ JMI DFIN ; GR4が10未満の場合は終了
+ SUBL GR4,TEN ; GR4 <- GR4 - 10
+ LAD GR3,1,GR3 ; GR3をインクリメント
+ JUMP DLOOP
+DFIN RET
+ END
;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
;例: 12345 -> 54321
-REV START
- PUSH 0,GR3
- PUSH 0,GR4
- PUSH 0,GR5
- LAD GR3,1
-RPU CPL GR2,GR3
- JMI RNEXT
- LD GR4,GR1
- ADDL GR4,GR3
- LD GR4,-1,GR4
- PUSH 0,GR4
- LAD GR3,1,GR3
- JUMP RPU
-RNEXT LAD GR3,1
-RPO CPL GR2,GR3
- JMI RFIN
- POP GR4
- LD GR5,GR1
- ADDL GR5,GR3
- ST GR4,-1,GR5
- LAD GR3,1,GR3
- JUMP RPO
-RFIN POP GR5
- POP GR4
- POP GR3
- RET
- END
+REV START
+ PUSH 0,GR3
+ PUSH 0,GR4
+ PUSH 0,GR5
+ LAD GR3,1
+RPU CPL GR2,GR3
+ JMI RNEXT
+ LD GR4,GR1
+ ADDL GR4,GR3
+ LD GR4,-1,GR4
+ PUSH 0,GR4
+ LAD GR3,1,GR3
+ JUMP RPU
+RNEXT LAD GR3,1
+RPO CPL GR2,GR3
+ JMI RFIN
+ POP GR4
+ LD GR5,GR1
+ ADDL GR5,GR3
+ ST GR4,-1,GR5
+ LAD GR3,1,GR3
+ JUMP RPO
+RFIN POP GR5
+ POP GR4
+ POP GR3
+ RET
+ END
;GR1の内容をマイナス値にする
;例: 10 -> -10, -20 -> 20
-INV START
- XOR GR1,=#FFFF
- LAD GR1,1,GR1
- RET
- END
-;GR1に格納された数値を表示
-OUTI START
- PUSH 0,GR2
- PUSH 0,GR3
- PUSH 0,GR4
- LAD GR0,0
- LAD GR2,0
- AND GR1,GR1
- JZE INEXT
- JPL ILOOP
- LAD GR0,1
- CALL INV
-ILOOP CPL GR1,TEN
- JMI INEXT
- CALL DIV10
- ADDL GR4,ZCHAR
- ST GR4,STR,GR2
- LAD GR2,1,GR2
- LD GR1,GR3
- JUMP ILOOP
-INEXT ADDL GR1,ZCHAR
- ST GR1,STR,GR2
- LAD GR2,1,GR2
- CPL GR0,=1
- JNZ PRT
- LD GR1,MINUS
- ST GR1,STR,GR2
- LAD GR2,1,GR2
-PRT ST GR2,LEN
- LAD GR1,STR
- LD GR2,LEN
- CALL REV
- OUT STR,LEN
- POP GR4
- POP GR3
- POP GR2
- RET
-TEN DC 10
-ZCHAR DC '0'
-MINUS DC '-'
-STR DS 6
-LEN DS 1
- END
-;GR1を10で割ったときの商をGR3、剰余をGR4に格納
-DIV10 LD GR4,GR1
- LAD GR3,0
-DLOOP CPL GR4,TEN
- JMI DFIN
- SUBL GR4,TEN
- LAD GR3,1,GR3
- JUMP DLOOP
-DFIN RET
- END
-;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
-;例: 12345 -> 54321
-REV START
- PUSH 0,GR3
- PUSH 0,GR4
- PUSH 0,GR5
- LAD GR3,1
-RPU CPL GR2,GR3
- JMI RNEXT
- LD GR4,GR1
- ADDL GR4,GR3
- LD GR4,-1,GR4
- PUSH 0,GR4
- LAD GR3,1,GR3
- JUMP RPU
-RNEXT LAD GR3,1
-RPO CPL GR2,GR3
- JMI RFIN
- POP GR4
- LD GR5,GR1
- ADDL GR5,GR3
- ST GR4,-1,GR5
- LAD GR3,1,GR3
- JUMP RPO
-RFIN POP GR5
- POP GR4
- POP GR3
- RET
- END
-;GR1の内容をマイナス値にする
-;例: 10 -> -10, -20 -> 20
-INV START
- XOR GR1,=#FFFF
- LAD GR1,1,GR1
- RET
- END
+INV START
+ XOR GR1,=#FFFF
+ LAD GR1,1,GR1
+ RET
+ END