c64-dio-asm.s
来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· S 代码 · 共 506 行
S
506 行
.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;---------------------------------------_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 #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 = 4bretries = 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 + =
减小字号Ctrl + -
显示快捷键?