クロック周波数の定義を追加
[YACASL2.git] / as / outi.casl
1 ;GR1に格納された数値を表示
2 OUTI    START
3         PUSH    0,GR2
4         PUSH    0,GR3
5         PUSH    0,GR4
6         LAD GR0,0               ; 負数フラグ。GR1が負数の場合、GR0は1
7         LAD GR2,0
8         AND GR1,GR1
9         JZE INEXT               ; GR1が0の場合
10         JPL ILOOP               ; GR1が正数の場合
11         LAD GR0,1               ; GR1が負数の場合、負数フラグ設定
12         CALL INV                ;            負数を正数に変換
13 ILOOP   CPL GR1,TEN
14         JMI INEXT               ; GR1が10未満の場合は、ループ終了
15         CALL    DIV10           ; (GR1 / 10)の商をGR3、剰余をGR4に格納
16         ADDL    GR4,ZCHAR       ; (GR1 / 10)の剰余を文字に変換
17         ST  GR4,STR,GR2         ; 文字をメモリに格納
18         LAD GR2,1,GR2           ; GR2をインクリメント
19         LD  GR1,GR3             ; (GR1 / 10)の商をGR1に格納
20         JUMP    ILOOP
21 INEXT   ADDL    GR1,ZCHAR       ; ループ終了後の剰余を文字に変換
22         ST  GR1,STR,GR2         ; 文字をメモリに格納
23         LAD GR2,1,GR2           ; GR2をインクリメント
24         CPL GR0,=1              ; 負数フラグ判定
25         JNZ PRT
26         LD  GR1,='-'           ; 負数フラグがオンの場合、「-」をロード
27         ST  GR1,STR,GR2         ; 「-」をメモリに格納
28         LAD GR2,1,GR2           ; GR2をインクリメント
29 PRT     ST  GR2,LEN             ; GR2をメモリに格納
30         LAD GR1,STR             ; GR1に文字列のアドレスを格納
31         CALL    REV             ; アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
32         OUT STR,LEN             ; 文字列を印字
33         POP GR4
34         POP GR3
35         POP GR2
36         RET
37 TEN     DC  10
38 ZCHAR   DC '0'
39 STR     DS  6
40 LEN     DS  1
41         END
42 ;GR1を10で割ったときの商をGR3、剰余をGR4に格納
43 DIV10   LD  GR4,GR1         ; GR1の値をGR4にコピー
44         LAD GR3,0
45 DLOOP   CPL GR4,TEN
46         JMI DFIN            ; GR4が10未満の場合は終了
47         SUBL    GR4,TEN     ; GR4 <- GR4 - 10
48         LAD GR3,1,GR3       ; GR3をインクリメント
49         JUMP    DLOOP
50 DFIN    RET
51         END
52 ;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
53 ;例: 12345 -> 54321
54 REV     START
55         PUSH    0,GR3
56         PUSH    0,GR4
57         PUSH    0,GR5
58         LAD GR3,1
59 RPU     CPL GR2,GR3
60         JMI RNEXT
61         LD  GR4,GR1
62         ADDL    GR4,GR3
63         LD  GR4,-1,GR4
64         PUSH 0,GR4
65         LAD GR3,1,GR3
66         JUMP    RPU
67 RNEXT   LAD GR3,1
68 RPO     CPL GR2,GR3
69         JMI RFIN
70         POP GR4
71         LD  GR5,GR1
72         ADDL    GR5,GR3
73         ST  GR4,-1,GR5
74         LAD GR3,1,GR3
75         JUMP    RPO
76 RFIN    POP GR5
77         POP GR4
78         POP GR3
79         RET
80         END
81 ;GR1の内容をマイナス値にする
82 ;例: 10 -> -10, -20 -> 20
83 INV     START
84         XOR GR1,=#FFFF
85         LAD GR1,1,GR1
86         RET
87         END