アセンブル時の動作を整理
[YACASL2.git] / as / casl2lib / outa_q15.casl
1 ;; GR1に格納された値を、10進数の符号付き小数値として表示
2 OUTAQ15 START
3         RPUSH
4         LAD     GR2,10          ; GR2に10進数の「10」を格納
5         XOR     GR4,GR4         ; 整数値の長さ
6         XOR     GR3,GR3         ; 出力する文字を一時的に格納
7         AND     GR1,GR1         ; GR1の符号をチェック
8         JPL     STDN            ; ↓ GR1が正数の場合、STDNにジャンプ
9         LD      GR3,='-'        ; ↓ GR1が負数の場合、「-」をSTR領域に格納
10         ST      GR3,STR         ; ↓ ↓
11         LAD     GR4,1,GR4       ; ↓ ↓ GR4 <- GR4 + 1
12         CPA     GR1,=#8000      ; (GR1 = #8000)の場合、MINONEへジャンプ
13         JZE     MINONE          ; ↓
14         CALL    ABS             ; GR1を正数に変換
15 STDN    LD      GR3,='0'        ; 「0」をSTR領域に格納
16         ST      GR3,STR,GR4     ; ↓
17         AND     GR1,GR1         ; GR1が0の場合、PRTへジャンプ
18         JZE     PRT             ; ↓
19         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
20         LD      GR3,='.'        ; 「.」をSTR領域に格納
21         ST      GR3,STR,GR4     ; ↓
22         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
23         SLL     GR1,1           ; GR1を1回左シフト
24 ;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
25 TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
26         JZE     PRT             ; ↓
27         CALL    MULL            ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
28         LD      GR1,GR0         ; GR0をGR1にコピー
29         ADDA    GR3,='0'        ; GR1を文字に変換
30         ST      GR3,STR,GR4     ; (STR + GR4) <- GR1
31         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
32         JUMP    TODIG           ; ループ
33 ;; GR1 = -1の場合
34 MINONE  LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
35         ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
36         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
37         JUMP    PRT             ; ↓
38 ;; 値を出力
39 PRT     ST      GR4,LEN         ; LEN <- GR4
40         OUT     STR,LEN         ; ↓
41         RPOP
42         RET
43 STR     DS      20
44 LEN     DS      1
45         END
46