0355a6f284d53d32cae98442da925a88fc9d9808
[YACASL2.git] / as / casl2lib / outl_q15.casl
1 ;; GR1に格納された値を、10進数の符号なし小数値として表示
2 OUTLQ15 START
3         RPUSH
4         LAD     GR2,10          ; GR2に10進数の「10」を格納
5         XOR     GR4,GR4         ; 整数値の長さ
6 STDN    LD      GR3,='0'        ; 「0」をSTR領域に格納
7         ST      GR3,STR,GR4     ; ↓
8         AND     GR1,GR1         ; GR1が0の場合、PRTへジャンプ
9         JZE     PRT             ; ↓
10         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
11         LD      GR3,='.'        ; 「.」をSTR領域に格納
12         ST      GR3,STR,GR4     ; ↓
13         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
14 ;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
15 TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
16         JZE     PRT             ; ↓
17         CALL    MULL            ; GR1とGR2の、積をGR0、オーバーフロー値をGR3に格納
18         LD      GR1,GR0         ; GR0をGR1にコピー
19         ADDA    GR3,='0'        ; GR3を文字に変換
20         ST      GR3,STR,GR4     ; (STR + GR3) <- GR1
21         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
22         JUMP    TODIG           ; ループ
23 PRT     ST      GR4,LEN         ; LEN <- GR4
24         OUT     STR,LEN         ; 文字列を出力
25         RPOP
26         RET
27 STR     DS      20
28 LEN     DS      1
29         END
30 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
31 ;;; 入力 GR1:被乗数 GR2:乗数
32 ;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
33 ;;; 積が65535より大きい場合は、オーバーフロー
34 MULL    START
35         PUSH    0,GR4
36         PUSH    0,GR5
37         XOR     GR0,GR0         ; 積
38         XOR     GR3,GR3         ; 上位word
39         XOR     GR5,GR5         ; 上位wordの一時値
40         AND     GR1,GR1         ; (GR1 = 0)の場合、終了
41         JZE     CHKOV           ; ↓
42         AND     GR2,GR2         ; (GR2 = 0)の場合、終了
43         JZE     CHKOV           ; ↓
44         LAD     GR4,1           ; 対象ビット
45 LOOP    PUSH    0,GR4           ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
46         AND     GR4,GR2         ; ↓
47         POP     GR4             ; ↓
48         JZE     NEXT1           ; ↓
49         ADDL    GR3,GR5         ; GR3 <- GR3 + GR5
50         ADDL    GR0,GR1         ; GR0 <- GR0 + GR1
51         JOV     AHB1            ; GR0がオーバーフローした場合、AHB1へジャンプ
52         JUMP    NEXT1           ; ↓
53 AHB1    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
54 NEXT1   SLL     GR4,1           ; GR4を1回左シフト
55         JOV     CHKOV           ; ↓
56         SLL     GR5,1           ; GR5を1回左シフト
57         CPL     GR4,GR2         ; (GR4 > GR2)の場合、CHKOVへジャンプ
58         JPL     CHKOV           ; ↓
59         SLL     GR1,1           ; GR1を1回左シフト
60         JOV     AHB2            ; GR1がオーバーフローした場合、AHBへジャンプ
61         JUMP    NEXT2           ; ↓
62 AHB2    LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
63 NEXT2   JUMP    LOOP            ; ループ終端
64 CHKOV   AND     GR3,GR3         ; GR3 = 0の場合、終了
65         JZE     FIN             ; ↓
66         LAD     GR4,#FFFF       ; GR3 <> 0の場合、オーバーフロー
67         SLL     GR4,1           ; ↓
68 FIN     POP     GR5
69         POP     GR4
70         RET
71         END