58a99511f507fd2b1ec8f833664e78355cf07364
[YACASL2.git] / as / FUNC / 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         ST      GR0,LEN         ; LENを初期化
7         AND     GR1,GR1         ; GR1が0の場合
8         JZE     ZPRT            ; ↓
9         JPL     STDN            ; GR1が正数の場合、STDNにジャンプ
10         PUSH    0,GR1
11         LD      GR1,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
12         CALL    STSTR           ; ↓
13         POP     GR1
14         CPA     GR1,=#8000      ; GR1が#8000より大きい場合
15         JPL     MDN             ; ↓
16         LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
17         CALL    STSTR           ; ↓
18         JUMP    PRT             ; ↓
19 MDN     CALL    ABS             ; GR1を正数に変換
20 STDN    PUSH    0,GR1           ; GR1を退避
21         LD      GR1,='0'        ; 「0」をSTR領域に格納
22         CALL    STSTR           ; ↓
23         LD      GR1,='.'        ; 「.」をSTR領域に格納
24         CALL    STSTR           ; ↓
25         POP     GR1             ; GR1を復元
26 ;; GR1の内容を小数値と見なし、10進数文字に変換してSTRに格納
27 TODIG   AND     GR1,GR1         ; GR4が0の場合は、ループを脱出
28         JZE     PRT             ; ↓
29         CALL    MUL             ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
30         PUSH    0,GR1           ; G1を退避
31         LD      GR1,GR3         ; GR3をGR1にコピー
32         ADDA    GR1,='0'        ; GR1を文字に変換
33         CALL    STSTR           ; GR1をSTR領域に格納
34         POP     GR1             ; GR1を復元
35         JUMP    TODIG           ; ループ
36 ZPRT    LD      GR1,='0'        ; 「0」をSTR領域に格納
37         CALL    STSTR           ; ↓
38 PRT     LAD     GR1,STR         ; ↓
39         OUT     STR,LEN         ; ↓
40         RPOP
41         RET
42 STR     DS      20
43 LEN     DS      1
44         END
45 ;; GR1をSTR領域に格納し、LENをインクリメント
46 STSTR   START
47         PUSH    0,GR1
48         PUSH    0,GR2
49         LD      GR2,LEN         ; GR2にLENの値をロード
50         ST      GR1,STR,GR2     ; STR+GR2 <- GR1
51         LAD     GR2,1,GR2       ; GR2 <- GR2 + 1
52         ST      GR2,LEN         ; LENにGR2を格納
53         POP     GR2
54         POP     GR1
55         RET
56         END
57 ;; GR1の値を10倍にし、GR3にオーバーフロー値を格納
58 MUL    START
59         PUSH    0,GR5
60         PUSH    0,GR6
61         LAD     GR3,0           ; GR3は、オーバーフロー値を格納
62         LAD     GR5,1           ; GR5は、インデックス
63         LD      GR6,GR1         ; GR6は、GR4の元の値を保持
64 MLOOP   CPA     GR5,=10         ; GR5が10になったらループ脱出
65         JZE     MFIN            ; ↓
66         ADDA    GR1,GR6         ; GR4 <- GR4 + GR6
67         LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
68         JOV     MADD            ; オーバーフローした場合、MADDへジャンプ
69         JUMP    MLOOP           ; ループ
70 MADD    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
71         AND     GR1,=#7FFF      ; GR4の最上位ビットをクリア
72         JUMP    MLOOP           ; ループ
73 MFIN    POP     GR6
74         POP     GR5
75         RET
76         END
77 ;; GR1の値を絶対値に変換する。GR1には0未満の数値が格納されていると想定。
78 ;; 例: -10 => 10, -20 => 20
79 ABS     START
80         XOR     GR1,=#FFFF      ; GR1の値を反転
81         LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
82         RET
83         END