📄 cfs-1541-asm.s
字号:
;; ;; ;; 1541 CFS implementation ;; ;; Architecture: ;; ;; Functionality split between C64 and 1541: 1541 performs ;; directory lookup and finding files. 1541 communicates track/sector ;; address of file, C64 requests data to be read from track/sector. ;; ;; Example: reading directory ;; ;; C64: DIR ;; 1541: directory entries in CFS format ;; ;; Example: opening file ;; ;; C64: FILE filename ;; 1541: track/sector ;; ;; Example: reading file ;; ;; C64: track/sector, length ;; 1541: length, data, track/sector .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 = $ffa8listen = $ffb1second = $ff93unlsn = $ffaenbytes = 34esc = $42blockread = 1blockwrite = 2errok = 0errerr = 1.data_c64_dio_asm_track: .byte 0_c64_dio_asm_sector: .byte 0_c64_dio_asm_ptr: .byte 0,0 .code;---------------------------------------_cfs_1541_read: ;; First send READ command to drive lda #READ_CMD jsr send ;; If drive do not respond we must download drive code cmp #ERR_NOT_RESPONDING bne notload jsr download lda #read jsr sendnotload: ;; Send file descriptor and number of bytes to read lda _cfs_1541_fd jsr send lda _cfs_1541_bytes jsr send lda _cfs_1541_ptr sta ptr1 lda _cfs_1541_ptr + 1 sta ptr1 + 1 ;; Read bytes from drive ldy #0: jsr recv sta (ptr1),y iny cpy _cfs_1541_bytes bne - ;; Read the number of bytes that were actually read from the file jsr recv ;; Return the number of bytes read rts;--------------------------------------- _c64_dio_asm_read_block: lda #BLOCKREAD_CMD 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 #0readl: jsr recv sta (ptr1),y iny bne readl clc lda #0 tax rtsreaderr: ; 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 #0writel: lda (ptr1),y jsr send iny bne writel jsr recv cmp #errok bne writeerr lda #0 tax rtswriteerr: ; 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 lda #>drive sta ptr1+1 ; lda devnr ; ldx #<icmd ; ldy #>icmd ; jsr drvcmd ; jsr unlsnmwl: lda devnr ldx #<mwcmd ldy #>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 sbc #>driveend bcc mwl lda devnr ldx #<mecmd ldy #>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 inydrvcmdcmp: cpy #0 bne *-8 rts;---------------------------------------devnr: .byte 8mwcmd: .byte 6 .byte $4d, $2d, $57drvmem: .word $0500 .byte nbytes .byte 0mecmd: .byte 2 .byte $55, $33 .byte 0;---------------------------------------send: sta ptr2 ldx #7sendl: 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 #7recvl: 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 = $46dtmp2 = $97dbuf = $0300dbufcmd = $00dbuftrack = $06dbufsect = $07retries = 10bretries = 2;---------------------------------------drive : .org $0500 cld tsx stx dstack sei jsr ledoffdrivel: jsr dload jsr ledoff cli jmp drivel;---------------------------------------ledon: lda $1c00 ora #$08 sta $1c00 rtsledoff: lda $1c00 and #$f7 sta $1c00 rts;---------------------------------------drecv: ldx #7drecvl: 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 #7dsendl: 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 dblockreaddblockwrite: ldy #0drecvpl: jsr drecv sta dbuf,y iny bne drecvpl jmp dputsectdblockread: jsr dgetsectdsendpage: ldy #0dsendpl: lda dbuf,y jsr dsend iny bne dsendpl rts;---------------------------------------dgetsect: ; stx dbuftrack ; sty dbufsect ldx #retriesdgetsectl: 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 dgetsectldgsserr: pha lda #errerr jsr dsend pla jsr dsend rtsdgsnoerr: lda #errok jsr dsend rts;---------------------------------------dputsect: ; stx dbuftrack ; sty dbufsect ldx #retriesdputsectl: 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 dputsectldpsserr: pha lda #errerr jsr dsend pla jsr dsend rtsdpsnoerr: lda #errok jsr dsend rts;---------------------------------------led: .byte 0,0dstack: .byte 0dcmd: .byte 0.RELOCdriveend:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -