casl2libフォルダを整理
[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
47 ;;; GR1を符号付き整数とみなし、絶対値に変換
48 ;;; 入力 GR1: -32768から32767の整数
49 ;;; 出力 GR1: 入力された整数の絶対値
50 ;;;       OF: 入力されたGR1が-32768の場合、1
51 ;;;       SF: 入力されたGR1が負数(-32767〜-1)の場合、1
52 ABS     START
53         AND     GR1,GR1         ; GR1が0以上の場合は、FINへジャンプ
54         JPL     FIN             ; ↓
55         JZE     FIN             ; ↓
56         XOR     GR1,ALLON       ; GR1のビットを反転
57         ADDA    GR1,ONE         ; GR1に1を追加
58         JOV     FIN             ; 足し算でオーバーフローの場合は、OF:1を保持してFINへジャンプ
59         CPL     GR1,ALLON       ; SF:1を設定
60 FIN     RET
61 ONE     DC      1
62 ALLON   DC      #FFFF
63         END
64 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
65 ;;; 入力 GR1:被乗数 GR2:乗数
66 ;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
67 ;;; 積が65535より大きい場合は、オーバーフロー
68 MULL    START
69         PUSH    0,GR4
70         PUSH    0,GR5
71         XOR     GR0,GR0         ; 積
72         XOR     GR3,GR3         ; 上位word
73         XOR     GR5,GR5         ; 上位wordの一時値
74         AND     GR1,GR1         ; (GR1 = 0)の場合、終了
75         JZE     CHKOV           ; ↓
76         AND     GR2,GR2         ; (GR2 = 0)の場合、終了
77         JZE     CHKOV           ; ↓
78         LAD     GR4,1           ; 対象ビット
79 LOOP    PUSH    0,GR4           ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
80         AND     GR4,GR2         ; ↓
81         POP     GR4             ; ↓
82         JZE     NEXT1           ; ↓
83         ADDL    GR3,GR5         ; GR3 <- GR3 + GR5
84         ADDL    GR0,GR1         ; GR0 <- GR0 + GR1
85         JOV     AHB1            ; GR0がオーバーフローした場合、AHB1へジャンプ
86         JUMP    NEXT1           ; ↓
87 AHB1    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
88 NEXT1   SLL     GR4,1           ; GR4を1回左シフト
89         JOV     CHKOV           ; ↓
90         SLL     GR5,1           ; GR5を1回左シフト
91         CPL     GR4,GR2         ; (GR4 > GR2)の場合、CHKOVへジャンプ
92         JPL     CHKOV           ; ↓
93         SLL     GR1,1           ; GR1を1回左シフト
94         JOV     AHB2            ; GR1がオーバーフローした場合、AHBへジャンプ
95         JUMP    NEXT2           ; ↓
96 AHB2    LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
97 NEXT2   JUMP    LOOP            ; ループ終端
98 CHKOV   AND     GR3,GR3         ; GR3 = 0の場合、終了
99         JZE     FIN             ; ↓
100         LAD     GR4,#FFFF       ; GR3 <> 0の場合、オーバーフロー
101         SLL     GR4,1           ; ↓
102 FIN     POP     GR5
103         POP     GR4
104         RET
105         END