-32768〜32767の数値を出力するアセンブラプログラムouti.caslを修正し、テストを追加
[YACASL2.git] / as / outi.casl
index a56a9db..41b2fec 100644 (file)
 ;GR1に格納された数値を表示
 ;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に格納
 ;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
 ;アドレスが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
 ;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