Mercurial > hg > Members > kono > os9 > sbc09
comparison src/os9/level2/cmds/sbc09.asm @ 86:4967d1acd34a
add sbc09.asm
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 20 Aug 2018 00:48:11 +0900 |
parents | |
children | 60e629904ad6 |
comparison
equal
deleted
inserted
replaced
85:4652761a60f9 | 86:4967d1acd34a |
---|---|
1 ******************************************************************** | |
2 * sbc09 emulator | |
3 * | |
4 * $Id$ | |
5 * | |
6 * Edt/Rev YYYY/MM/DD Modified by | |
7 * Comment | |
8 * ------------------------------------------------------------------ | |
9 * 1 2018/08/20 S. Kono | |
10 * Emulatoe sbc09 on os9 lv2 | |
11 | |
12 nam Sbc09 | |
13 ttl Sbc09 emulator | |
14 | |
15 ifp1 | |
16 use defsfile | |
17 endc | |
18 | |
19 * Module header definitions | |
20 tylg set Prgrm+Objct | |
21 atrv set ReEnt+rev | |
22 rev set $00 | |
23 edition set 1 | |
24 | |
25 mod eom,name,tylg,atrv,start,size | |
26 | |
27 org 0 | |
28 ioentry rmb $80 | |
29 filepath rmb 2 | |
30 parmptr rmb 2 | |
31 stdin rmb 1 | |
32 chksum rmb 1 | |
33 bcount rmb 1 | |
34 adr rmb 2 | |
35 readbuff rmb $100 | |
36 org $400 | |
37 emstart rmb $e000-. | |
38 size equ . | |
39 | |
40 name fcs /Sbc09/ | |
41 fcb edition | |
42 | |
43 start | |
44 clr <stdin | |
45 stx <parmptr save parameter pointer | |
46 lda #READ. read access mode | |
47 os9 I$Open open file | |
48 bcs L0049 branch if error | |
49 sta <filepath else save path to file | |
50 stx <parmptr and updated parm pointer | |
51 L001F lda <filepath get path | |
52 leax readbuff,u point X to read buffer | |
53 ldy #200 read up to 200 bytes | |
54 os9 I$ReadLn read it! | |
55 bcs L0035 branch if error | |
56 bsr srecords | |
57 bra L001F else exit | |
58 L0035 cmpb #E$EOF did we get an EOF error? | |
59 * bne L0049 exit if not | |
60 lda <filepath else get path | |
61 os9 I$Close and close it | |
62 bcs L0049 branch if error | |
63 * ldx <parmptr get param pointer | |
64 * lda ,x get char | |
65 * cmpa #C$CR end of command line? | |
66 * bne start branch if not | |
67 | |
68 copytbl | |
69 leax iotbl,pcr | |
70 leay iotblend,pcr | |
71 pshs x,y | |
72 ldy #(iotblend-iotbl) | |
73 l1 ldb #$7e * JMP | |
74 stb ,u+ | |
75 ldd ,x++ | |
76 addb 1,s | |
77 adca ,s | |
78 std ,u++ | |
79 cmpx 2,s | |
80 bne l1 | |
81 puls x,y | |
82 jmp $400 | |
83 | |
84 Exit clrb | |
85 os9 F$Exit | |
86 | |
87 iotbl | |
88 fdb getchar-iotbl | |
89 fdb putchar-iotbl | |
90 fdb getline-iotbl | |
91 fdb putline-iotbl | |
92 fdb putcr-iotbl | |
93 fdb getpoll-iotbl | |
94 fdb xopenin-iotbl | |
95 fdb xopenout-iotbl | |
96 fdb xabortin-iotbl | |
97 fdb xclosein-iotbl | |
98 fdb xcloseout-iotbl | |
99 fdb delay-iotbl | |
100 iotblend | |
101 | |
102 L0049 | |
103 err ldb #1 | |
104 bra Exit | |
105 | |
106 srecords | |
107 leax readbuff,u | |
108 clr <chksum | |
109 sline lda ,x+ | |
110 cmpa #'S' | |
111 bne slast | |
112 lda ,x+ | |
113 cmpa #'1' | |
114 bne slast | |
115 bsr gthex2 | |
116 subb #3 | |
117 stb <bcount | |
118 bsr gthex2 | |
119 stb <adr | |
120 bsr gthex2 | |
121 stb <adr+1 | |
122 lda <bcount | |
123 ldy <adr | |
124 sbyte bsr gthex2 | |
125 stb ,y+ | |
126 deca | |
127 bgt sbyte | |
128 slast | |
129 bsr gthex2 | |
130 lda <chksum | |
131 cmpa #$ff | |
132 bne err1 | |
133 err1 | |
134 rts | |
135 | |
136 gthex4 pshs d | |
137 bsr gthex2 | |
138 stb ,s | |
139 bsr gthex2 | |
140 stb 1,s | |
141 puls d,pc | |
142 | |
143 gthex2 pshs b | |
144 bsr gthex1 | |
145 aslb | |
146 aslb | |
147 aslb | |
148 aslb | |
149 stb ,s | |
150 bsr gthex1 | |
151 addb ,s | |
152 stb ,s | |
153 addb <chksum | |
154 stb <chksum | |
155 puls b,pc | |
156 | |
157 gthex1 ldb ,x+ | |
158 subb #'0' | |
159 blo rgethex1 | |
160 cmpb #9 | |
161 bls rgethex1 | |
162 subb #7 | |
163 rgethex1 | |
164 rts | |
165 | |
166 putchar * Output one character in B register. | |
167 PSHS X,Y | |
168 BRA OUTCH1 | |
169 getchar * Input one character into B register. | |
170 PSHS A,B,X,Y | |
171 GETCH0 | |
172 LDA #0 | |
173 LEAX 1,S | |
174 LDY #1 | |
175 OS9 I$Read | |
176 BCS GETCH0 | |
177 PULS A,B,X,Y,PC | |
178 putcr * Output a newline. | |
179 LDB #C$CR | |
180 bsr putchar | |
181 LDB #C$LF | |
182 PSHS X,Y | |
183 OUTCH1 PSHS A,B | |
184 LEAX 1,S | |
185 LDA #1 | |
186 LDY #1 | |
187 OS9 I$Write | |
188 PULS A,B,X,Y,PC | |
189 getpoll | |
190 PSHS X,Y,D | |
191 LDA #0 | |
192 LDB #SS.Ready | |
193 OS9 I$GetStt | |
194 CMPB #$F6 Not Ready | |
195 BNE RSENSE | |
196 CLRB | |
197 PULS X,Y,D,PC | |
198 RSENSE | |
199 ORCC #1 set carry to indicate ready | |
200 RNSENSE | |
201 PULS X,Y,D,PC | |
202 | |
203 getline * Input line at address in X, length in B. | |
204 PSHS A,B,X,Y | |
205 GETLN0 | |
206 CLRA | |
207 TFR D,Y | |
208 LDA <stdin | |
209 OS9 I$ReadLn | |
210 BCS GETLN0 | |
211 * TFR Y,D | |
212 * LDA D,X | |
213 * CMPA #C$CR | |
214 * BNE GETLN1 | |
215 * LEAY -1,Y | |
216 GETLN1 STY ,S | |
217 PULS A,B,X,Y,PC | |
218 putline * Output string at address in X, length in B. | |
219 PSHS A,B,X,Y | |
220 CLRA | |
221 TFR D,Y | |
222 LDA <stdin | |
223 OS9 I$WritLn | |
224 PULS A,B,X,Y,PC | |
225 xopenin | |
226 xopenout | |
227 xabortin | |
228 xclosein | |
229 xcloseout | |
230 RTS | |
231 | |
232 delay PSHS D,X * address **$21** | |
233 * On input the D register contains the number of timer | |
234 * ticks to wait. Each timer tick is 20ms | |
235 TFR D,X | |
236 OS9 F$Sleep | |
237 PULS D,X,PC | |
238 org $400 | |
239 lbra Exit | |
240 | |
241 | |
242 | |
243 | |
244 emod | |
245 eom equ * | |
246 end |