アセンブラファイルの整理
[YACASL2.git] / as / misc / outd_q15.casl
diff --git a/as/misc/outd_q15.casl b/as/misc/outd_q15.casl
new file mode 100644 (file)
index 0000000..7268471
--- /dev/null
@@ -0,0 +1,64 @@
+;; GR1に格納された値を、10進数の小数値として表示
+OUTD    START
+        RPUSH
+        LAD     GR2,10          ; GR2に10進数の「10」を格納
+        LAD     GR0,0           ; 負数フラグ。GR1が負数の場合、GR0は1
+        XOR     GR4,GR4         ; 整数値の長さ
+        AND     GR1,GR1         ; GR1が0の場合
+        JZE     ZPRT            ; ↓
+        JPL     STDN            ; GR1が正数の場合、STDNにジャンプ
+        LD      GR5,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
+        ST      GR5,STR         ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+        CPA     GR1,=#8000      ; GR1が#8000より大きい場合、MDNへジャンプ
+        JPL     MDN             ; ↓
+        LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+        JUMP    PRT             ; ↓
+MDN     CALL    ABS             ; GR1を正数に変換
+STDN    LD      GR5,='0'        ; 「0」をSTR領域に格納
+        ST      GR5,STR,GR4     ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+        LD      GR5,='.'        ; 「.」をSTR領域に格納
+        ST      GR5,STR,GR4     ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
+TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
+        JZE     PRT             ; ↓
+        CALL    MUL             ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
+        LD      GR5,GR3         ; GR3をGR1にコピー
+        ADDA    GR5,='0'        ; GR1を文字に変換
+        ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+        JUMP    TODIG           ; ループ
+ZPRT    LD      GR5,='0'        ; 「0」をSTR領域に格納
+        ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+PRT     ST      GR4,LEN         ; LEN <- GR4
+        OUT     STR,LEN         ; ↓
+        RPOP
+        RET
+STR     DS      20
+LEN     DS      1
+        END
+;; GR1の値を10倍にし、GR3にオーバーフロー値を格納
+MUL     START
+        PUSH    0,GR5
+        PUSH    0,GR6
+        LAD     GR3,0           ; GR3は、オーバーフロー値を格納
+        LAD     GR5,1           ; GR5は、インデックス
+        LD      GR6,GR1         ; GR6は、GR4の元の値を保持
+MLOOP   CPA     GR5,=10         ; GR5が10になったらループ脱出
+        JZE     MFIN            ; ↓
+        ADDA    GR1,GR6         ; GR4 <- GR4 + GR6
+        LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
+        JOV     MADD            ; オーバーフローした場合、MADDへジャンプ
+        JUMP    MLOOP           ; ループ
+MADD    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
+        AND     GR1,=#7FFF      ; GR4の最上位ビットをクリア
+        JUMP    MLOOP           ; ループ
+MFIN    POP     GR6
+        POP     GR5
+        RET
+        END