X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=as%2Fouti.casl;h=41b2fec134b4d61f85433191445c3c8ec1703423;hp=a56a9dbe35c5f2b1356029ce2b7377176ff71992;hb=5d41f32f8e26c4f3d6e0186d960a5f3b98dcab27;hpb=63131a52ebd7efc0449a9418eccc86e877e78f3b diff --git a/as/outi.casl b/as/outi.casl index a56a9db..41b2fec 100644 --- a/as/outi.casl +++ b/as/outi.casl @@ -1,178 +1,87 @@ ;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