root/as/misc/outd_q15.casl

/* [<][>][^][v][top][bottom][index][help] */
;; 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

/* [<][>][^][v][top][bottom][index][help] */