comet2コマンド実行時のリセット位置を変更
[YACASL2.git] / as / casl2lib / outd_q15.casl
1 ;; GR1に格納された値を、10進数の小数値として表示
2 OUTD    START
3         RPUSH
4         LAD     GR2,10          ; GR2に10進数の「10」を格納
5         LAD     GR0,0           ; 負数フラグ。GR1が負数の場合、GR0は1
6         XOR     GR4,GR4         ; 整数値の長さ
7         AND     GR1,GR1         ; GR1が0の場合
8         JZE     ZPRT            ; ↓
9         JPL     STDN            ; GR1が正数の場合、STDNにジャンプ
10         LD      GR5,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
11         ST      GR5,STR         ; ↓
12         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
13         CPA     GR1,=#8000      ; GR1が#8000より大きい場合、MDNへジャンプ
14         JPL     MDN             ; ↓
15         LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
16         ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
17         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
18         JUMP    PRT             ; ↓
19 MDN     CALL    ABS             ; GR1を正数に変換
20 STDN    LD      GR5,='0'        ; 「0」をSTR領域に格納
21         ST      GR5,STR,GR4     ; ↓
22         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
23         LD      GR5,='.'        ; 「.」をSTR領域に格納
24         ST      GR5,STR,GR4     ; ↓
25         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
26 ;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
27 TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
28         JZE     PRT             ; ↓
29         CALL    MUL             ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
30         LD      GR5,GR3         ; GR3をGR1にコピー
31         ADDA    GR5,='0'        ; GR1を文字に変換
32         ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
33         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
34         JUMP    TODIG           ; ループ
35 ZPRT    LD      GR5,='0'        ; 「0」をSTR領域に格納
36         ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
37         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
38 PRT     ST      GR4,LEN         ; LEN <- GR4
39         OUT     STR,LEN         ; ↓
40         RPOP
41         RET
42 STR     DS      20
43 LEN     DS      1
44         END
45 ;; GR1の値を10倍にし、GR3にオーバーフロー値を格納
46 MUL     START
47         PUSH    0,GR5
48         PUSH    0,GR6
49         LAD     GR3,0           ; GR3は、オーバーフロー値を格納
50         LAD     GR5,1           ; GR5は、インデックス
51         LD      GR6,GR1         ; GR6は、GR4の元の値を保持
52 MLOOP   CPA     GR5,=10         ; GR5が10になったらループ脱出
53         JZE     MFIN            ; ↓
54         ADDA    GR1,GR6         ; GR4 <- GR4 + GR6
55         LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
56         JOV     MADD            ; オーバーフローした場合、MADDへジャンプ
57         JUMP    MLOOP           ; ループ
58 MADD    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
59         AND     GR1,=#7FFF      ; GR4の最上位ビットをクリア
60         JUMP    MLOOP           ; ループ
61 MFIN    POP     GR6
62         POP     GR5
63         RET
64         END
65 ;; GR1の値を絶対値に変換する。GR1には0未満の数値が格納されていると想定。
66 ;; 例: -10 => 10, -20 => 20
67 ABS     START
68         XOR     GR1,=#FFFF      ; GR1の値を反転
69         LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
70         RET
71         END