86
|
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
|
91
|
35 work rmb 2
|
86
|
36 readbuff rmb $100
|
|
37 org $400
|
|
38 emstart rmb $e000-.
|
|
39 size equ .
|
|
40
|
|
41 name fcs /Sbc09/
|
|
42 fcb edition
|
|
43
|
|
44 start
|
|
45 clr <stdin
|
|
46 stx <parmptr save parameter pointer
|
91
|
47 stu <work save parameter pointer
|
86
|
48 lda #READ. read access mode
|
|
49 os9 I$Open open file
|
|
50 bcs L0049 branch if error
|
|
51 sta <filepath else save path to file
|
|
52 stx <parmptr and updated parm pointer
|
|
53 L001F lda <filepath get path
|
|
54 leax readbuff,u point X to read buffer
|
|
55 ldy #200 read up to 200 bytes
|
|
56 os9 I$ReadLn read it!
|
|
57 bcs L0035 branch if error
|
|
58 bsr srecords
|
|
59 bra L001F else exit
|
|
60 L0035 cmpb #E$EOF did we get an EOF error?
|
|
61 * bne L0049 exit if not
|
|
62 lda <filepath else get path
|
|
63 os9 I$Close and close it
|
|
64 bcs L0049 branch if error
|
|
65 * ldx <parmptr get param pointer
|
|
66 * lda ,x get char
|
|
67 * cmpa #C$CR end of command line?
|
|
68 * bne start branch if not
|
|
69
|
|
70 copytbl
|
87
|
71 lda #$17 lbra
|
|
72 sta $e400
|
|
73 leax Exit,pcr
|
|
74 leax -$e403,x
|
|
75 stx $e401
|
86
|
76 leax iotbl,pcr
|
|
77 leay iotblend,pcr
|
|
78 pshs x,y
|
|
79 ldy #(iotblend-iotbl)
|
|
80 l1 ldb #$7e * JMP
|
|
81 stb ,u+
|
|
82 ldd ,x++
|
|
83 addb 1,s
|
|
84 adca ,s
|
|
85 std ,u++
|
|
86 cmpx 2,s
|
91
|
87 ble l1
|
86
|
88 puls x,y
|
|
89 jmp $400
|
|
90
|
|
91 Exit clrb
|
|
92 os9 F$Exit
|
|
93
|
|
94 iotbl
|
91
|
95 fdb getchar-iotbl ; 0
|
|
96 fdb putchar-iotbl ; 3
|
|
97 fdb getline-iotbl ; 6
|
|
98 fdb putline-iotbl ; 9
|
|
99 fdb putcr-iotbl ; $C
|
|
100 fdb getpoll-iotbl ; $F
|
|
101 fdb xopenin-iotbl ; $12
|
|
102 fdb xopenout-iotbl ; $15
|
|
103 fdb xabortin-iotbl ; $18
|
|
104 fdb xclosein-iotbl ; $1B
|
|
105 fdb xcloseout-iotbl ; $21
|
|
106 fdb delay-iotbl ; $24
|
|
107 fdb noecho-iotbl ; $27
|
86
|
108 iotblend
|
|
109
|
|
110 L0049
|
|
111 err ldb #1
|
|
112 bra Exit
|
|
113
|
|
114 srecords
|
|
115 leax readbuff,u
|
|
116 clr <chksum
|
|
117 sline lda ,x+
|
|
118 cmpa #'S'
|
|
119 bne slast
|
|
120 lda ,x+
|
|
121 cmpa #'1'
|
|
122 bne slast
|
|
123 bsr gthex2
|
|
124 subb #3
|
|
125 stb <bcount
|
|
126 bsr gthex2
|
|
127 stb <adr
|
|
128 bsr gthex2
|
|
129 stb <adr+1
|
|
130 lda <bcount
|
|
131 ldy <adr
|
|
132 sbyte bsr gthex2
|
|
133 stb ,y+
|
|
134 deca
|
|
135 bgt sbyte
|
|
136 slast
|
|
137 bsr gthex2
|
|
138 lda <chksum
|
|
139 cmpa #$ff
|
|
140 bne err1
|
|
141 err1
|
|
142 rts
|
|
143
|
|
144 gthex4 pshs d
|
|
145 bsr gthex2
|
|
146 stb ,s
|
|
147 bsr gthex2
|
|
148 stb 1,s
|
|
149 puls d,pc
|
|
150
|
|
151 gthex2 pshs b
|
|
152 bsr gthex1
|
|
153 aslb
|
|
154 aslb
|
|
155 aslb
|
|
156 aslb
|
|
157 stb ,s
|
|
158 bsr gthex1
|
|
159 addb ,s
|
|
160 stb ,s
|
|
161 addb <chksum
|
|
162 stb <chksum
|
|
163 puls b,pc
|
|
164
|
|
165 gthex1 ldb ,x+
|
|
166 subb #'0'
|
|
167 blo rgethex1
|
|
168 cmpb #9
|
|
169 bls rgethex1
|
|
170 subb #7
|
|
171 rgethex1
|
|
172 rts
|
|
173
|
|
174 putchar * Output one character in B register.
|
|
175 PSHS X,Y
|
|
176 BRA OUTCH1
|
|
177 getchar * Input one character into B register.
|
|
178 PSHS A,B,X,Y
|
|
179 GETCH0
|
|
180 LDA #0
|
|
181 LEAX 1,S
|
|
182 LDY #1
|
|
183 OS9 I$Read
|
|
184 BCS GETCH0
|
|
185 PULS A,B,X,Y,PC
|
|
186 putcr * Output a newline.
|
|
187 LDB #C$CR
|
|
188 bsr putchar
|
|
189 LDB #C$LF
|
|
190 PSHS X,Y
|
|
191 OUTCH1 PSHS A,B
|
|
192 LEAX 1,S
|
|
193 LDA #1
|
|
194 LDY #1
|
|
195 OS9 I$Write
|
|
196 PULS A,B,X,Y,PC
|
|
197 getpoll
|
|
198 PSHS X,Y,D
|
|
199 LDA #0
|
|
200 LDB #SS.Ready
|
|
201 OS9 I$GetStt
|
|
202 CMPB #$F6 Not Ready
|
|
203 BNE RSENSE
|
|
204 CLRB
|
|
205 PULS X,Y,D,PC
|
|
206 RSENSE
|
|
207 ORCC #1 set carry to indicate ready
|
|
208 RNSENSE
|
|
209 PULS X,Y,D,PC
|
|
210
|
|
211 getline * Input line at address in X, length in B.
|
|
212 PSHS A,B,X,Y
|
|
213 GETLN0
|
|
214 CLRA
|
|
215 TFR D,Y
|
|
216 LDA <stdin
|
|
217 OS9 I$ReadLn
|
|
218 BCS GETLN0
|
87
|
219 LEAY -1,Y
|
|
220 TFR Y,D
|
86
|
221 * LDA D,X
|
|
222 * CMPA #C$CR
|
|
223 * BNE GETLN1
|
|
224 * LEAY -1,Y
|
|
225 GETLN1 STY ,S
|
|
226 PULS A,B,X,Y,PC
|
|
227 putline * Output string at address in X, length in B.
|
|
228 PSHS A,B,X,Y
|
|
229 CLRA
|
|
230 TFR D,Y
|
|
231 LDA <stdin
|
|
232 OS9 I$WritLn
|
|
233 PULS A,B,X,Y,PC
|
|
234 xopenin
|
|
235 xopenout
|
|
236 xabortin
|
|
237 xclosein
|
|
238 xcloseout
|
|
239 RTS
|
|
240
|
91
|
241 noecho LDA <stdin
|
|
242 CLRB
|
|
243 LDX <work
|
|
244 leax readbuff,X
|
|
245 OS9 I$GetStt
|
|
246 bcs err2
|
|
247 CLR IT.EKO,X
|
|
248 CLRB
|
|
249 OS9 I$SetStt
|
|
250 err2
|
|
251 RTS
|
|
252
|
86
|
253 delay PSHS D,X * address **$21**
|
|
254 * On input the D register contains the number of timer
|
|
255 * ticks to wait. Each timer tick is 20ms
|
|
256 TFR D,X
|
|
257 OS9 F$Sleep
|
|
258 PULS D,X,PC
|
|
259
|
|
260
|
|
261
|
|
262 emod
|
|
263 eom equ *
|
|
264 end
|