.export _c64_dio_asm_init .export _c64_dio_asm_read_block .export _c64_dio_asm_write_block .export _c64_dio_asm_track, _c64_dio_asm_sector .export _c64_dio_asm_ptr .importzp ptr1, ptr2 ;; job code $80 read, $90 write ciout = $ffa8 listen = $ffb1 second = $ff93 unlsn = $ffae nbytes = 34 esc = $42 blockread = 1 blockwrite = 2 errok = 0 errerr = 1 .data _c64_dio_asm_track: .byte 0 _c64_dio_asm_sector: .byte 0 _c64_dio_asm_ptr: .byte 0,0 .code ;--------------------------------------- _c64_dio_asm_read_block: lda #blockread jsr send lda _c64_dio_asm_track jsr send lda _c64_dio_asm_sector jsr send jsr recv cmp #errok bne readerr lda _c64_dio_asm_ptr sta ptr1 lda _c64_dio_asm_ptr+1 sta ptr1+1 ldy #0 readl: jsr recv sta (ptr1),y iny bne readl clc lda #0 tax rts readerr: ; sta $07c0 jsr recv ; sta $07c1 ldx #0 rts ;--------------------------------------- _c64_dio_asm_write_block: lda #blockwrite jsr send lda _c64_dio_asm_track jsr send lda _c64_dio_asm_sector jsr send lda _c64_dio_asm_ptr sta ptr1 lda _c64_dio_asm_ptr+1 sta ptr1+1 ldy #0 writel: lda (ptr1),y jsr send iny bne writel jsr recv cmp #errok bne writeerr lda #0 tax rts writeerr: ; sta $07c0 jsr recv ; sta $07c1 ldx #0 rts ;--------------------------------------- _c64_dio_asm_init: sta devnr lda #$00 sta drvmem lda #$05 sta drvmem+1 lda #drive sta ptr1+1 ; lda devnr ; ldx #icmd ; jsr drvcmd ; jsr unlsn mwl: lda devnr ldx #mwcmd jsr drvcmd ldy #0 lda (ptr1),y jsr ciout iny cpy #nbytes bne *-8 jsr unlsn lda drvmem clc adc #nbytes sta drvmem lda drvmem+1 adc #0 sta drvmem+1 lda ptr1 clc adc #nbytes sta ptr1 tax lda ptr1+1 adc #0 sta ptr1+1 cpx #driveend bcc mwl lda devnr ldx #mecmd jsr drvcmd jsr unlsn rts ;--------------------------------------- drvcmd: stx ptr2 sty ptr2+1 jsr listen lda #$6f jsr second ldy #0 lda (ptr2),y sta drvcmdcmp+1 inc ptr2 bne *+4 inc ptr2+1 ldy #0 lda (ptr2),y jsr ciout iny drvcmdcmp: cpy #0 bne *-8 rts ;--------------------------------------- devnr: .byte 8 mwcmd: .byte 6 .byte $4d, $2d, $57 drvmem: .word $0500 .byte nbytes .byte 0 mecmd: .byte 2 .byte $55, $33 .byte 0 ;--------------------------------------- send: sta ptr2 ldx #7 sendl: lsr ptr2 lda $dd00 and #$df ora #$10 bcc *+4 eor #$30 sta $dd00 lda #$c0 bit $dd00 bne *-3 lda $dd00 and #$cf sta $dd00 lda $dd00 and #$c0 eor #$c0 bne *-7 dex bpl sendl ldx $d020 lda #1 sta $d020 stx $d020 rts ;--------------------------------------- recv: ldx $d020 lda #0 sta $d020 stx $d020 ldx #7 recvl: lda $dd00 and #$c0 eor #$c0 beq *-7 asl a lda $dd00 and #$df ora #$10 bcs *+4 eor #$30 sta $dd00 ror ptr2 lda #$c0 bit $dd00 beq *-3 lda $dd00 and #$cf sta $dd00 dex bpl recvl lda ptr2 rts ;--------------------------------------- ;--------------------------------------- ;the code residing in the drive: ;--------------------------------------- dtmp = $46 dtmp2 = $97 dbuf = $0300 dbufcmd = $00 dbuftrack = $06 dbufsect = $07 retries = 4 bretries = 2 ;--------------------------------------- drive : .org $0500 cld tsx stx dstack sei jsr ledoff drivel: jsr dload jsr ledoff cli jmp drivel ;--------------------------------------- ledon: lda $1c00 ora #$08 sta $1c00 rts ledoff: lda $1c00 and #$f7 sta $1c00 rts ;--------------------------------------- drecv: ldx #7 drecvl: lda $1800 bmi atn and #5 beq *-7 lsr a lda #2 bcc *+4 lda #8 sta $1800 ror dtmp lda $1800 bmi atn and #5 eor #5 beq *-9 lda #0 sta $1800 dex bpl drecvl lda dtmp rts ;--------------------------------------- atn: ldx dstack txs cli rts ;--------------------------------------- dsend: sta dtmp ldx #7 dsendl: lsr dtmp lda #2 bcs *+4 lda #8 sta $1800 lda $1800 bmi atn and #5 eor #5 bne *-9 sta $1800 lda #5 bit $1800 bne *-3 dex bpl dsendl rts ;--------------------------------------- dload: ldy #0 jsr drecv sta dcmd jsr ledon jsr drecv sta dbuftrack jsr drecv sta dbufsect lda dcmd cmp #blockwrite bne dblockread dblockwrite: ldy #0 drecvpl: jsr drecv sta dbuf,y iny bne drecvpl jmp dputsect dblockread: jsr dgetsect dsendpage: ldy #0 dsendpl: lda dbuf,y jsr dsend iny bne dsendpl rts ;--------------------------------------- dgetsect: ; stx dbuftrack ; sty dbufsect ldx #retries dgetsectl: lda #$80 sta dbufcmd cli : lda dbufcmd bmi :- sei cmp #1 beq dgsnoerr cpx #0 beq dgsserr dex cpx #bretries bcs dgetsectl pha lda #$c0 sta dbufcmd cli : lda dbufcmd bmi :- pla cpx #0 bne dgetsectl dgsserr: pha lda #errerr jsr dsend pla jsr dsend rts dgsnoerr: lda #errok jsr dsend rts ;--------------------------------------- dputsect: ; stx dbuftrack ; sty dbufsect ldx #retries dputsectl: lda #$90 sta dbufcmd cli : lda dbufcmd bmi :- sei cmp #1 beq dpsnoerr cpx #0 beq dpsserr dex cpx #bretries bcs dputsectl pha lda #$c0 sta dbufcmd cli : lda dbufcmd bmi :- pla cpx #0 bne dputsectl dpsserr: pha lda #errerr jsr dsend pla jsr dsend rts dpsnoerr: lda #errok jsr dsend rts ;--------------------------------------- led: .byte 0,0 dstack: .byte 0 dcmd: .byte 0 .RELOC driveend: