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