;GR1に格納された数値を表示 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 ; 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 ;GR1の内容をマイナス値にする ;例: 10 -> -10, -20 -> 20 INV START XOR GR1,=#FFFF LAD GR1,1,GR1 RET END