0
|
1 ********************************************************************
|
|
2 * CO32 - Hardware VDG co-driver for CCIO
|
|
3 *
|
|
4 * $Id$
|
|
5 *
|
1499
|
6 * Edt/Rev YYYY/MM/DD Modified by
|
|
7 * Comment
|
0
|
8 * ------------------------------------------------------------------
|
1499
|
9 * 1 ????/??/??
|
|
10 * From Tandy OS-9 Level One VR 02.00.00
|
1512
|
11 *
|
|
12 * 2003/09/22 Rodney Hamilton
|
|
13 * recoded dispatch table fcbs, fixed cursor color bug
|
0
|
14
|
|
15 nam CO32
|
|
16 ttl Hardware VDG co-driver for CCIO
|
|
17
|
|
18 * Disassembled 98/08/23 17:47:40 by Disasm v1.6 (C) 1988 by RML
|
|
19
|
|
20 ifp1
|
|
21 use defsfile
|
1582
|
22 use co32defs
|
0
|
23 endc
|
|
24
|
|
25 tylg set Systm+Objct
|
|
26 atrv set ReEnt+rev
|
1287
|
27 rev set $00
|
201
|
28 edition set 1
|
0
|
29
|
|
30 mod eom,name,tylg,atrv,start,size
|
|
31
|
|
32 u0000 rmb 0
|
|
33 size equ .
|
|
34 fcb $07
|
|
35
|
|
36 name fcs /CO32/
|
|
37 fcb edition
|
|
38
|
1512
|
39 start equ *
|
1580
|
40 lbra Init
|
|
41 lbra Write
|
|
42 lbra GetStat
|
|
43 lbra SetStat
|
1512
|
44 Term pshs y,x
|
1580
|
45 pshs u save U
|
|
46 ldd #$0200 32x16 VDG memory size
|
1582
|
47 ldu <VD.ScrnA,u $1D get pointer to memory
|
1580
|
48 os9 F$SRtMem return to system
|
|
49 puls u restore U
|
0
|
50 ldb <$70,u
|
|
51 andb #$FD
|
|
52 bra L0086
|
1512
|
53 * Init
|
1580
|
54 Init pshs y,x save regs
|
0
|
55 lda #$AF
|
1582
|
56 sta <VD.CColr,u $2C save default color cursor
|
1580
|
57 pshs u save static ptr
|
1582
|
58 ldd #768 allocate 768 bytes for now
|
1580
|
59 os9 F$SRqMem get it
|
|
60 tfr u,d put ptr in D
|
|
61 tfr u,x and X
|
|
62 bita #$01 odd page?
|
|
63 beq L0052 branch if not
|
1582
|
64 leax >256,x else move X up 256 bytes
|
1580
|
65 bra L0056 and return first 256 bytes
|
1582
|
66 L0052 leau >512,u else move X up 512 bytes
|
|
67 L0056 ldd #256 and return last 256 bytes
|
1580
|
68 os9 F$SRtMem free it!
|
|
69 puls u restore static ptr
|
1582
|
70 stx <VD.ScrnA,u $1D save VDG screen memory
|
0
|
71 pshs y
|
|
72 leay -$0E,y
|
|
73 clra
|
|
74 clrb
|
|
75 jsr [<$5B,u]
|
|
76 puls y
|
1582
|
77 stx <VD.CrsrA,u $21 save start cursor position
|
|
78 leax >512,x point to end of screen
|
|
79 stx <VD.ScrnE,u $1F save it
|
|
80 lda #$60 get default character
|
|
81 sta <VD.CChar,u $23 put character under the cursor
|
|
82 sta <VD.Chr1,u $2B only referenced here ??
|
|
83 lbsr ClrScrn clear the screen
|
0
|
84 ldb <$70,u
|
1580
|
85 orb #$02 set to CO32 found (?)
|
0
|
86 L0086 stb <$70,u
|
|
87 clrb
|
|
88 puls pc,y,x
|
1580
|
89
|
1512
|
90 * Write
|
1580
|
91 * Entry: A = char to write
|
|
92 * Y = path desc ptr
|
|
93 Write tsta
|
0
|
94 bmi L00D0
|
1580
|
95 cmpa #$1F byte $1F?
|
|
96 bls Dispatch branch if lower or same
|
1582
|
97 ldb <VD.CFlag,u $71
|
0
|
98 beq L00B0
|
|
99 cmpa #$5E
|
|
100 bne L00A0
|
|
101 lda #$00
|
|
102 bra L00D0
|
|
103 L00A0 cmpa #$5F
|
|
104 bne L00A8
|
|
105 lda #$1F
|
|
106 bra L00D0
|
|
107 L00A8 cmpa #$60
|
|
108 bne L00C0
|
|
109 lda #$67
|
|
110 bra L00D0
|
|
111 L00B0 cmpa #$7C
|
|
112 bne L00B8
|
|
113 lda #$21
|
|
114 bra L00D0
|
|
115 L00B8 cmpa #$7E
|
|
116 bne L00C0
|
|
117 lda #$2D
|
|
118 bra L00D0
|
|
119 L00C0 cmpa #$60
|
|
120 bcs L00C8
|
|
121 suba #$60
|
|
122 bra L00D0
|
|
123 L00C8 cmpa #$40
|
|
124 bcs L00CE
|
|
125 suba #$40
|
|
126 L00CE eora #$40
|
1582
|
127 L00D0 ldx <VD.CrsrA,u $21
|
0
|
128 sta ,x+
|
1582
|
129 stx <VD.CrsrA,u $21
|
|
130 cmpx <VD.ScrnE,u $1F
|
0
|
131 bcs L00DF
|
1582
|
132 bsr SScrl if at end of screen, scroll it
|
|
133 L00DF bsr ShowCrsr ends with a CLRB/RTS anyhow
|
1580
|
134
|
1512
|
135 * no operation entry point
|
1580
|
136 NoOp clrb
|
0
|
137 rts
|
1580
|
138
|
1582
|
139 SScrl ldx <VD.ScrnA,u $1D
|
|
140 leax <32,x
|
0
|
141 L00E9 ldd ,x++
|
1582
|
142 std <-34,x
|
|
143 cmpx <VD.ScrnE,u $1F
|
0
|
144 bcs L00E9
|
1582
|
145 leax <-32,x
|
|
146 stx <VD.CrsrA,u $21
|
|
147 lda #32
|
0
|
148 ldb #$60
|
|
149 L00FD stb ,x+
|
|
150 deca
|
|
151 bne L00FD
|
|
152 L0102 rts
|
1580
|
153
|
|
154 Dispatch cmpa #$1B
|
0
|
155 bcc L0113
|
|
156 cmpa #$0E
|
|
157 bhi L0102
|
1580
|
158 leax <DCodeTbl,pcr
|
0
|
159 lsla
|
|
160 ldd a,x
|
|
161 jmp d,x
|
|
162 L0113 comb
|
|
163 ldb #E$Write
|
|
164 rts
|
1512
|
165
|
|
166 * display functions dispatch table
|
1580
|
167 DCodeTbl fdb NoOp-DCodeTbl $ffca $00:no-op (null)
|
|
168 fdb CurHome-DCodeTbl $007d $01:HOME cursor
|
|
169 fdb CurXY-DCodeTbl $00c9 $02:CURSOR XY
|
|
170 fdb DelLine-DCodeTbl $0107 $03:ERASE LINE
|
|
171 fdb ErEOLine-DCodeTbl $00f9 $04:CLEAR TO EOL
|
|
172 fdb CrsrSw-DCodeTbl $0091 $05:CURSOR ON/OFF
|
|
173 fdb CurRght-DCodeTbl $005e $06:CURSOR RIGHT
|
|
174 fdb NoOp-DCodeTbl $ffca $07:no-op (bel:handled in CCIO)
|
|
175 fdb CurLeft-DCodeTbl $0050 $08:CURSOR LEFT
|
|
176 fdb CurUp-DCodeTbl $0119 $09:CURSOR UP
|
|
177 fdb CurDown-DCodeTbl $0038 $0A:CURSOR DOWN
|
|
178 fdb ErEOScrn-DCodeTbl $006c $0B:ERASE TO EOS
|
|
179 fdb ClrScrn-DCodeTbl $0070 $0C:CLEAR SCREEN
|
|
180 fdb Retrn-DCodeTbl $001e $0D:RETURN
|
|
181 fdb DoAlpha-DCodeTbl $012a $0E:DISPLAY ALPHA
|
1512
|
182
|
|
183 * $0D - move cursor to start of line (carriage return)
|
1580
|
184 Retrn bsr HideCrsr
|
0
|
185 tfr x,d
|
|
186 andb #$E0
|
|
187 stb <$22,u
|
1582
|
188 ShowCrsr ldx <VD.CrsrA,u $21 get cursor address
|
1580
|
189 lda ,x get char at cursor position
|
1582
|
190 sta <VD.CChar,u $23 save it
|
|
191 lda <VD.CColr,u $2C get cursor character
|
1580
|
192 beq L014D branch if none
|
|
193 L014B sta ,x else turn on cursor
|
0
|
194 L014D clrb
|
|
195 rts
|
1512
|
196
|
|
197 * $0A - cursor down (line feed)
|
1580
|
198 CurDown bsr HideCrsr hide cursor
|
1582
|
199 leax <32,x move X down one line
|
|
200 cmpx <VD.ScrnE,u $1F at end of screen?
|
1580
|
201 bcs L0162 branch if not
|
1582
|
202 leax <-32,x else go back up one line
|
1580
|
203 pshs x save X
|
|
204 bsr SScrl and scroll the screen
|
|
205 puls x restore pointer
|
1582
|
206 L0162 stx <VD.CrsrA,u $21 save cursor pointer
|
1580
|
207 bra ShowCrsr show cursor
|
1512
|
208
|
|
209 * $08 - cursor left
|
1580
|
210 CurLeft bsr HideCrsr hide cursor
|
1582
|
211 cmpx <VD.ScrnA,u $1D compare against start of screen
|
1580
|
212 bls L0173 ignore it if at the screen start
|
|
213 leax -$01,x else back up one
|
1582
|
214 stx <VD.CrsrA,u $21 save updated pointer
|
1580
|
215 L0173 bra ShowCrsr and show cursor
|
1512
|
216
|
|
217 * $06 - cursor right
|
1580
|
218 CurRght bsr HideCrsr hide cursor
|
|
219 leax $01,x move to the right
|
1582
|
220 cmpx <VD.ScrnE,u $1F compare against end of screen
|
1580
|
221 bcc L0181 if past end, ignore it
|
1582
|
222 stx <VD.CrsrA,u $21 else save updated pointer
|
1580
|
223 L0181 bra ShowCrsr and show cursor
|
1512
|
224
|
|
225 * $0B - erase to end of screen
|
1580
|
226 ErEOScrn bsr HideCrsr kill the cusror
|
|
227 bra L0189 and clear rest of the screen
|
1512
|
228
|
|
229 * $0C - clear screen
|
1580
|
230 ClrScrn bsr CurHome home cursor
|
|
231 L0189 lda #$60 get default char
|
|
232 L018B sta ,x+ save at location
|
1582
|
233 cmpx <VD.ScrnE,u $1F end of screen?
|
1580
|
234 bcs L018B branch if not
|
|
235 bra ShowCrsr now show cursor
|
1512
|
236
|
|
237 * $01 - home cursor
|
1580
|
238 CurHome bsr HideCrsr hide cursor
|
1582
|
239 ldx <VD.ScrnA,u $1D get pointer to screen
|
|
240 stx <VD.CrsrA,u $21 save as new cursor position
|
1580
|
241 bra ShowCrsr and show it
|
|
242
|
|
243 * Hides the cursor from the screen
|
|
244 * Exit: X = address of cursor
|
1582
|
245 HideCrsr ldx <VD.CrsrA,u $21 get address of cursor in X
|
|
246 lda <VD.CChar,u $23 get value of char under cursor
|
1580
|
247 sta ,x put char in place of cursor
|
|
248 clrb must be here, in general, for [...] BRA HideCrsr
|
0
|
249 rts
|
1512
|
250
|
|
251 * $05 XX - set cursor off/on/color per XX-32
|
1580
|
252 CrsrSw ldb #$01
|
|
253 leax <L01AF,pcr
|
0
|
254 bra L01E5
|
1580
|
255
|
1582
|
256 L01AF lda <VD.NChar,u $29 get next char
|
1580
|
257 suba #C$SPAC take out ASCII space
|
|
258 bne L01BB branch if not zero
|
1582
|
259 sta <VD.CColr,u $2C else save cursor color zero (no cursor)
|
1580
|
260 bra HideCrsr and hide cursor
|
|
261 L01BB cmpa #$0B greater than $0B?
|
|
262 bge L014D yep, just ignore byte
|
|
263 cmpa #$01 is it one?
|
|
264 bgt L01C7 branch if greater
|
|
265 lda #$AF else get default blue cursor color
|
|
266 bra L01D7 and save cursor color
|
|
267 L01C7 cmpa #$02 is it two?
|
|
268 bgt L01CF branch if larger
|
|
269 lda #$A0 else get black cursor color
|
|
270 bra L01D7 and save it
|
|
271 ** BUG ** BUG ** BUG ** BUG
|
|
272 L01CF suba #$03 ** BUG FIXED! ** !!! Was SUBB
|
|
273 lsla shift into upper nibble
|
0
|
274 lsla
|
|
275 lsla
|
|
276 lsla
|
|
277 ora #$8F
|
1582
|
278 L01D7 sta <VD.CColr,u $2C save new cursor
|
|
279 ldx <VD.CrsrA,u $21 get cursor address
|
1580
|
280 lbra L014B branch to save cursor in X
|
1512
|
281
|
|
282 * $02 XX YY - move cursor to col XX-32, row YY-32
|
1580
|
283 CurXY ldb #$02 we want to claim next two chars
|
|
284 leax <DoCurXY,pcr point to processing routine
|
0
|
285 L01E5 stx <$26,u
|
|
286 stb <$25,u
|
|
287 clrb
|
|
288 rts
|
1580
|
289
|
|
290 DoCurXY bsr HideCrsr hide cursor
|
1582
|
291 ldb <VD.NChar,u $29 get ASCII Y-pos
|
1580
|
292 subb #C$SPAC take out ASCII space
|
|
293 lda #32 go down
|
|
294 mul multiply it
|
1582
|
295 addb <VD.NChr2,u $28 add in X-pos
|
0
|
296 adca #$00
|
1580
|
297 subd #C$SPAC take out another ASCII space
|
1582
|
298 addd <VD.ScrnA,u $1D add top of screen address
|
|
299 cmpd <VD.ScrnE,u $1F at end of the screen?
|
1580
|
300 lbcc L014D exit if off the screen
|
1582
|
301 std <VD.CrsrA,u $21 otherwise save new cursor address
|
1580
|
302 lbra ShowCrsr and show cursor
|
1512
|
303
|
|
304 * $04 - erase to end of line
|
1580
|
305 ErEOLine bsr HideCrsr hide cursor
|
|
306 tfr x,d move current cursor position in D
|
|
307 andb #$1F number of characters put on this line
|
0
|
308 pshs b
|
1580
|
309 ldb #32
|
0
|
310 subb ,s+
|
1580
|
311 bra L0223 and clear one line
|
1512
|
312
|
|
313 * $03 - erase line
|
1580
|
314 DelLine lbsr Retrn do a CR
|
1512
|
315 ldb #32 line length
|
1580
|
316 L0223 lda #$60 get default character
|
1582
|
317 ldx <VD.CrsrA,u $21 get cursor address
|
1512
|
318 L0228 sta ,x+ fill screen line with 'space'
|
1580
|
319 decb decrement
|
|
320 bne L0228 and branch if not end
|
|
321 lbra ShowCrsr else show cursor
|
1512
|
322
|
|
323 * $09 - cursor up
|
1580
|
324 CurUp lbsr HideCrsr hide cursor
|
1582
|
325 leax <-32,x move X up one line
|
|
326 cmpx <VD.ScrnA,u $1D compare against start of screen
|
1580
|
327 bcs L023E branch if we went beyond
|
1582
|
328 stx <VD.CrsrA,u $21 else store updated X
|
1580
|
329 L023E lbra ShowCrsr and show cursor
|
1512
|
330
|
|
331 * $0E - switch screen to alphanumeric mode
|
1580
|
332 DoAlpha clra
|
0
|
333 clrb
|
|
334 jmp [<$5B,u]
|
1580
|
335
|
1512
|
336 * GetStat
|
1580
|
337 GetStat ldx PD.RGS,y
|
1512
|
338 cmpa #SS.AlfaS $1C
|
1580
|
339 beq Rt.AlfaS
|
1512
|
340 cmpa #SS.Cursr $25
|
1580
|
341 beq Rt.Cursr
|
|
342
|
1512
|
343 * SetStat
|
1580
|
344 SetStat comb
|
0
|
345 ldb #E$UnkSvc
|
|
346 rts
|
1580
|
347
|
1512
|
348 * SS.AlfaS getstat
|
1582
|
349 Rt.AlfaS ldd <VD.ScrnA,u $1D memory address of buffer
|
|
350 std R$X,x
|
|
351 ldd <VD.CrsrA,u $21
|
|
352 std R$Y,x
|
|
353 lda <VD.Caps,u $50 save caps lock status in A and exit
|
0
|
354 bra L02BA
|
1580
|
355
|
1512
|
356 * SS.Cursr getstat
|
1582
|
357 Rt.Cursr ldd <VD.CrsrA,u $21
|
|
358 subd <VD.ScrnA,u $1D
|
0
|
359 pshs b,a
|
|
360 clra
|
|
361 andb #$1F
|
|
362 addb #$20
|
1580
|
363 std R$X,x save column position in ASCII
|
|
364 puls b,a then divide by 32
|
0
|
365 lsra
|
|
366 rolb
|
|
367 rolb
|
|
368 rolb
|
|
369 rolb
|
|
370 clra
|
1580
|
371 andb #$0F only 16 line to a screen
|
0
|
372 addb #$20
|
|
373 std $06,x
|
1582
|
374 ldb <VD.CFlag,u $71
|
|
375 lda <VD.CChar,u $23
|
0
|
376 bmi L02BA
|
|
377 cmpa #$60
|
|
378 bcc L02A5
|
|
379 cmpa #$20
|
|
380 bcc L02A9
|
|
381 tstb
|
|
382 beq L02A3
|
|
383 cmpa #$00
|
|
384 bne L029B
|
|
385 lda #$5E
|
1580
|
386 bra L02BA save it and exit
|
|
387
|
0
|
388 L029B cmpa #$1F
|
|
389 bne L02A3
|
|
390 lda #$5F
|
|
391 bra L02BA
|
1580
|
392 L02A3 ora #$20 turn it into ASCII from vDG codes
|
0
|
393 L02A5 eora #$40
|
|
394 bra L02BA
|
|
395 L02A9 tstb
|
|
396 bne L02BA
|
1580
|
397 cmpa #$21 remap specific codes
|
0
|
398 bne L02B4
|
|
399 lda #$7C
|
|
400 bra L02BA
|
|
401 L02B4 cmpa #$2D
|
|
402 bne L02BA
|
|
403 lda #$7E
|
|
404 L02BA sta $01,x
|
|
405 clrb
|
|
406 rts
|
|
407
|
|
408 emod
|
|
409 eom equ *
|
|
410 end
|
|
411
|