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
|
|
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
|