YACAL2: CASL2処理系
[YACASL2.git] / as / suba_p2.casl
1 MAIN    START
2 BEGIN   LD      GR1,A
3         SUBA    GR1,B
4     CALL        ITOA
5     RET
6 A       DC      0
7 B       DC      #7FFF
8 C       DS      1
9         END
10 ITOA    START
11         PUSH 0,GR2
12         PUSH 0,GR3
13         PUSH 0,GR4
14     LAD GR0,0
15     LAD GR2,0
16     AND GR1,GR1
17     JPL LOOP
18     JZE LOOP
19     LAD GR0,1
20     CALL MINUS
21 LOOP    CPA     GR1,=10
22         JMI     NEXT
23         CALL    DIV
24     ADDA        GR4,='0'
25     ST  GR4,STR,GR2
26     LAD GR2,1,GR2
27     LD  GR1,GR3
28     JUMP        LOOP
29 NEXT    ADDA    GR1,='0'
30         ST      GR1,STR,GR2
31         LAD     GR2,1,GR2
32     CPA GR0,=1
33     JPL PRT
34     JMI PRT
35     LD  GR1,='-'
36         ST      GR1,STR,GR2
37         LAD     GR2,1,GR2
38 PRT     ST      GR2,LEN
39         LAD     GR1,STR
40     LD  GR2,LEN
41     CALL REV
42         OUT     STR,LEN
43         POP GR4
44         POP GR3
45         POP GR2
46         RET
47 STR     DS      6
48 LEN     DS      1
49     END
50 ;GR1を10で割ったときの商をGR3、剰余をGR4に格納
51 DIV     LD      GR4,GR1
52         LAD     GR3,0
53 DLOOP   CPA     GR4,=10
54         JMI     DFIN
55     SUBL GR4,=10
56     LAD GR3,1,GR3
57     JUMP        DLOOP
58 DFIN RET
59         END
60 ;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
61 ;例: 12345 -> 54321
62 REV     START
63         PUSH    0,GR3
64     PUSH        0,GR4
65     PUSH        0,GR5
66         LAD     GR3,1
67 RPU     CPA     GR2,GR3
68         JMI     RNEXT
69     LD  GR4,GR1
70     ADDA        GR4,GR3
71     LD  GR4,-1,GR4
72         PUSH 0,GR4
73     LAD GR3,1,GR3
74     JUMP        RPU
75 RNEXT    LAD    GR3,1
76 RPO     CPA     GR2,GR3
77         JMI     RFIN
78     POP GR4
79     LD GR5,GR1
80     ADDA GR5,GR3
81     ST GR4,-1,GR5
82     LAD GR3,1,GR3
83     JUMP RPO
84 RFIN POP GR5
85         POP     GR4
86     POP GR3
87         RET
88         END
89 ;GR1の内容をマイナス値にする
90 ;例: 10 -> -10, -20 -> 20
91 MINUS   START
92         XOR     GR1,=#FFFF
93     LAD GR1,1,GR1
94     RET
95         END