blob: e32e710bac57c7319cba6d6629a5673a6a80a8e8 [file] [log] [blame]
adamdunkels74c1ecb2003-08-04 00:12:50 +00001
2
3 .export _c64_dio_asm_init
4 .export _c64_dio_asm_read_block
5 .export _c64_dio_asm_write_block
6
7 .export _c64_dio_asm_track, _c64_dio_asm_sector
8
9 .export _c64_dio_asm_ptr
10
11 .importzp ptr1, ptr2
12
13 ;; job code $80 read, $90 write
14
15
16ciout = $ffa8
17listen = $ffb1
18second = $ff93
19unlsn = $ffae
20
21nbytes = 34
22esc = $42
23
24blockread = 1
25blockwrite = 2
26
27errok = 0
28errerr = 1
29
30.data
31_c64_dio_asm_track: .byte 0
32_c64_dio_asm_sector: .byte 0
33_c64_dio_asm_ptr: .byte 0,0
34
35.code
adamdunkels74c1ecb2003-08-04 00:12:50 +000036;---------------------------------------
adamdunkels6c758d92003-08-05 13:57:32 +000037_c64_dio_asm_read_block:
adamdunkels74c1ecb2003-08-04 00:12:50 +000038
adamdunkels6c758d92003-08-05 13:57:32 +000039 lda #blockread
adamdunkels74c1ecb2003-08-04 00:12:50 +000040 jsr send
41
adamdunkels6c758d92003-08-05 13:57:32 +000042 lda _c64_dio_asm_track
adamdunkels74c1ecb2003-08-04 00:12:50 +000043 jsr send
adamdunkels6c758d92003-08-05 13:57:32 +000044 lda _c64_dio_asm_sector
adamdunkels74c1ecb2003-08-04 00:12:50 +000045 jsr send
46
47
48 jsr recv
49 cmp #errok
50 bne readerr
51
52 lda _c64_dio_asm_ptr
53 sta ptr1
54 lda _c64_dio_asm_ptr+1
55 sta ptr1+1
56 ldy #0
57readl:
58 jsr recv
59 sta (ptr1),y
60 iny
61 bne readl
62 clc
63 rts
64readerr:
65 ; sta $07c0
66 jsr recv
67 ; sta $07c1
68 sec
69 rts
70;---------------------------------------
adamdunkels6c758d92003-08-05 13:57:32 +000071_c64_dio_asm_write_block:
adamdunkels74c1ecb2003-08-04 00:12:50 +000072
73 lda #blockwrite
74 jsr send
75
adamdunkels6c758d92003-08-05 13:57:32 +000076 lda _c64_dio_asm_track
adamdunkels74c1ecb2003-08-04 00:12:50 +000077 jsr send
adamdunkels6c758d92003-08-05 13:57:32 +000078 lda _c64_dio_asm_sector
adamdunkels74c1ecb2003-08-04 00:12:50 +000079 jsr send
80
81
82 lda _c64_dio_asm_ptr
83 sta ptr1
84 lda _c64_dio_asm_ptr+1
85 sta ptr1+1
86 ldy #0
87writel:
88 lda (ptr1),y
89 jsr send
90 iny
91 bne writel
92
93 jsr recv
94 cmp #errok
95 bne writeerr
96 clc
97 rts
98
99writeerr:
100 ; sta $07c0
101 jsr recv
102 ; sta $07c1
103 sec
104 rts
105;---------------------------------------
adamdunkels6c758d92003-08-05 13:57:32 +0000106_c64_dio_asm_init:
adamdunkels74c1ecb2003-08-04 00:12:50 +0000107 sta devnr
108 lda #$00
109 sta drvmem
110 lda #$05
111 sta drvmem+1
112
113 lda #<drive
114 sta ptr1
115 lda #>drive
116 sta ptr1+1
117
118 ; lda devnr
119 ; ldx #<icmd
120 ; ldy #>icmd
121 ; jsr drvcmd
122 ; jsr unlsn
123
124mwl:
125 lda devnr
126 ldx #<mwcmd
127 ldy #>mwcmd
128 jsr drvcmd
129
130 ldy #0
131 lda (ptr1),y
132 jsr ciout
133 iny
134 cpy #nbytes
135 bne *-8
136
137 jsr unlsn
138
139 lda drvmem
140 clc
141 adc #nbytes
142 sta drvmem
143 lda drvmem+1
144 adc #0
145 sta drvmem+1
146
147 lda ptr1
148 clc
149 adc #nbytes
150 sta ptr1
151 tax
152 lda ptr1+1
153 adc #0
154 sta ptr1+1
155 cpx #<driveend
156 sbc #>driveend
157 bcc mwl
158
159 lda devnr
160 ldx #<mecmd
161 ldy #>mecmd
162 jsr drvcmd
163 jsr unlsn
164
165 rts
166;---------------------------------------
167drvcmd:
168 stx ptr2
169 sty ptr2+1
170 jsr listen
171 lda #$6f
172 jsr second
173
174 ldy #0
175 lda (ptr2),y
176 sta drvcmdcmp+1
177 inc ptr2
178 bne *+4
179 inc ptr2+1
180
181 ldy #0
182 lda (ptr2),y
183 jsr ciout
184 iny
185drvcmdcmp: cpy #0
186 bne *-8
187 rts
188;---------------------------------------
189devnr: .byte 8
190mwcmd: .byte 6
191 .byte $4d, $2d, $57
192drvmem: .word $0500
193 .byte nbytes
194 .byte 0
195mecmd: .byte 2
196 .byte $55, $33
197 .byte 0
198;---------------------------------------
199send:
200
201 sta ptr2
202 ldx #7
203sendl:
204 lsr ptr2
205
206
207 lda $dd00
208 and #$df
209 ora #$10
210 bcc *+4
211 eor #$30
212 sta $dd00
213
214 lda #$c0
215 bit $dd00
216 bne *-3
217
218 lda $dd00
219 and #$cf
220 sta $dd00
221
222 lda $dd00
223 and #$c0
224 eor #$c0
225 bne *-7
226
227 dex
228 bpl sendl
229
adamdunkels525d3e22003-08-04 00:52:42 +0000230 lda $d020
231 pha
232 lda #1
233 sta $d020
234 pla
235 sta $d020
236
adamdunkels74c1ecb2003-08-04 00:12:50 +0000237 rts
238;---------------------------------------
239recv:
adamdunkels525d3e22003-08-04 00:52:42 +0000240 lda $d020
241 pha
242 lda #0
243 sta $d020
244 pla
245 sta $d020
246
adamdunkels74c1ecb2003-08-04 00:12:50 +0000247 ldx #7
248recvl:
249 lda $dd00
250 and #$c0
251 eor #$c0
252 beq *-7
253 asl a
254
255 lda $dd00
256 and #$df
257 ora #$10
258 bcs *+4
259 eor #$30
260 sta $dd00
261 ror ptr2
262
263 lda #$c0
264 bit $dd00
265 beq *-3
266
267 lda $dd00
268 and #$cf
269 sta $dd00
270
271 dex
272 bpl recvl
273 lda ptr2
274 rts
275;---------------------------------------
276
277;---------------------------------------
278;Ôhe code residing in the drive:
279;---------------------------------------
280dtmp = $46
281dtmp2 = $97
282dbuf = $0300
283dbufcmd = $00
284dbuftrack = $06
285dbufsect = $07
286
287retries = 10
288bretries = 2
289;---------------------------------------
290drive :
291 .org $0500
292
293
294
295 cld
296 tsx
297 stx dstack
298 sei
299 jsr ledoff
300
301drivel:
302 jsr dload
303 jsr ledoff
304 cli
305 jmp drivel
306;---------------------------------------
307ledon:
308 lda $1c00
309 ora #$08
310 sta $1c00
311 rts
312ledoff:
313 lda $1c00
314 and #$f7
315 sta $1c00
316 rts
317;---------------------------------------
318drecv:
319 ldx #7
320drecvl:
321 lda $1800
322 bmi atn
323 and #5
324 beq *-7
325 lsr a
326 lda #2
327 bcc *+4
328 lda #8
329 sta $1800
330 ror dtmp
331 lda $1800
332 bmi atn
333 and #5
334 eor #5
335 beq *-9
336 lda #0
337 sta $1800
338 dex
339 bpl drecvl
340 lda dtmp
341 rts
342;---------------------------------------
343atn:
344 ldx dstack
345 txs
346 cli
347 rts
348;---------------------------------------
349dsend:
350 sta dtmp
351 ldx #7
352dsendl:
353 lsr dtmp
354 lda #2
355 bcs *+4
356 lda #8
357 sta $1800
358
359 lda $1800
360 bmi atn
361 and #5
362 eor #5
363 bne *-9
364
365 sta $1800
366
367 lda #5
368 bit $1800
369 bne *-3
370 dex
371 bpl dsendl
372 rts
373;---------------------------------------
374dload:
375 ldy #0
376
377 jsr drecv
378 sta dcmd
379
380 jsr ledon
381
382 jsr drecv
383 sta dbuftrack
384
385 jsr drecv
386 sta dbufsect
387
388 lda dcmd
389 cmp #blockwrite
390 bne dblockread
391dblockwrite:
392 ldy #0
393drecvpl:
394 jsr drecv
395 sta dbuf,y
396 iny
397 bne drecvpl
398
399 jmp dputsect
400
401dblockread:
402 jsr dgetsect
403
404dsendpage:
405 ldy #0
406dsendpl:
407 lda dbuf,y
408 jsr dsend
409 iny
410 bne dsendpl
411 rts
412;---------------------------------------
413dgetsect:
414 ; stx dbuftrack
415 ; sty dbufsect
416 ldx #retries
417dgetsectl:
418 lda #$80
419 sta dbufcmd
420
421 cli
422:
423 lda dbufcmd
424 bmi :-
425 sei
426 cmp #1
427 beq dgsnoerr
428
429 cpx #0
430 beq dgsserr
431 dex
432 cpx #bretries
433 bcs dgetsectl
434 pha
435 lda #$c0
436 sta dbufcmd
437 cli
438:
439 lda dbufcmd
440 bmi :-
441 pla
442 cpx #0
443 bne dgetsectl
444
445dgsserr:
446 pha
447 lda #errerr
448 jsr dsend
449 pla
450 jsr dsend
451 pla
452 pla
453 rts
454dgsnoerr:
455 lda #errok
456 jsr dsend
457 rts
458;---------------------------------------
459dputsect:
460 ; stx dbuftrack
461 ; sty dbufsect
462 ldx #retries
463dputsectl:
464 lda #$90
465 sta dbufcmd
466
467 cli
468:
469 lda dbufcmd
470 bmi :-
471 sei
472 cmp #1
473 beq dpsnoerr
474
475 cpx #0
476 beq dpsserr
477 dex
478 cpx #bretries
479 bcs dputsectl
480 pha
481 lda #$c0
482 sta dbufcmd
483 cli
484:
485 lda dbufcmd
486 bmi :-
487 pla
488 cpx #0
489 bne dputsectl
490
491dpsserr:
492 pha
493 lda #errerr
494 jsr dsend
495 pla
496 jsr dsend
497 pla
498 pla
499 rts
500dpsnoerr:
501 lda #errok
502 jsr dsend
503 rts
504;---------------------------------------
505led: .byte 0,0
506dstack: .byte 0
507dcmd: .byte 0
508.RELOC
509driveend:
510