;------------------------------------------ ; ; 1551USB Function-ROM Lo ; ; 27.03.2017 ; ; version 0.2 ; ; + pointer use (basic end) ; + nice directory browser (from E., Géza (Epy)) included ; + fixed rom exit and trampoline code ; ; ; replacement for the 3plus1 Lo-ROM ; ; Compiler: ACME ; ;----------------------------------------- ; ; zeropage storage ; ;-------------------------------------- p_lo = $2d ; pointer lo p_hi = $2e ; pointer hi blocks = $d2 t_lo = $d4 t_hi = $d5 s_lo = $d6 s_hi = $d7 ;----------------------------------------- ; ; I/O addresses ; ;-------------------------------------- ; drive 9 ; TIA 6523 porta = $fec0 ; data port portb = $fec1 ; pb0: st0 ; pb1: st1 portc = $fec2 ; pc6: ack ; pc7: dav ddra = $fec3 ddrb = $fec4 ddrc = $fec5 !to"funcrom.crt",plain ; ,cbm for prg-file *=$8000 JMP init modstart: JMP start !by $0c,$43,$42,$4d ; module-nr., "CBM" !scr "SYS1525: 1551USB" !by $00,$20,$20,$20 !scr "1551USB ON KEY F" !by $00,$20 ;----------------------------------------- ; ; Cartridge Jump-in for sysline ; ;-------------------------------------- copybytes: ldx #$05 lda #$80 ; cart_start hi sta $05F1 lda #$03 ; cart_start lo ; $8003 sta $05F0 sta $05F4 lda $FB jmp $FCFA ; ->$fc89 longjump ;----------------------------------------- ; ; Setup Banking, Sys-Line and F-Key ; ;-------------------------------------- init: ldy #$00 sty $D9 lda #$01 ; $01 internal function rom, $02 for extern sta $7FFF and #$03 tax sta $FDD0,X ; banking cmp #$01 beq + iny lda $055F sta $D9 + sty $D8 tya beq + ldy #$35 + ldx #$00 ; copy jump in - lda copybytes,X sta $05F5,Y iny inx cpx #$14 bcc - L_8072: ldx $D8 lda #$12 cmp $055F,X beq L_80A1 bcc L_8090 ldy #$7E - lda $0567,Y sta $0568,Y dey cpy $D9 bpl - inc $055F,X jmp L_8072 L_8090: ldy $D9 - lda $0568,Y sta $0567,Y iny bpl - dec $055F,X jmp L_8072 L_80A1: ldx $D9 ldy #$00 - lda $800A,Y ; get "SYS1525: 1551USB " sta $0567,X inx iny cpy #$12 bcc - ldx $D8 beq + ldy $D9 lda #$37 sta $056C,Y lda #$38 sta $056D,Y lda $FB sta $062B + ldx #$00 - lda $801D,X ; get "1551USB ON KEY F " beq + jsr $FFD2 inx bne - + lda $D8 clc adc #$31 jsr $FFD2 ; print 1 lda #$0D jmp $FFD2 ; cr rts ;----------------------------------------- ; ; New IRQ to cartridge ; ;-------------------------------------- start: sei lda #$01 ; $01 internal function rom, $02 for extern pha and #$03 tax sta $FDD0,x jsr $FF84 ; Initialize I/O devices jsr $FF87 ; RAM Test pla sta $FB jsr $FF8A ; Restore vectors to initial values jsr $FF81 ; Initialize screen editor lda #<cartridge ; cartridge jump in sta $02FE lda #>cartridge sta $02FF lda #$F1 ; irq -> banking-routines sta $0314 lda #$FC sta $0315 cli jmp * ;----------------------------------------- ; ; Program for the rom ; ;-------------------------------------- cartridge: lda #$ff sta $FF0C sta $FF0D ; hide cursor ldx #$00 lda #$73 - sta $0800,x sta $0900,x sta $0a00,x sta $0b00,x inx bne - lda #$a3 sta $ff15 sta $ff19 lda #$00 tax tay sta ddrb sta t_lo lda #<mainscreen sta s_lo lda #>mainscreen sta s_hi lda #$0c sta t_hi -- ldy #$00 - lda (s_lo),y sta (t_lo),y iny bne - inc s_hi inc t_hi inx cpx #$04 bne -- ldx #$00 lda portb cmp #$03 bne notfound ldx #$00 - lda interface+4,x ; interface found sta $0c00+222,x inx cpx #$07 bne - beq + notfound: lda interface,x ; interface not found sta $0c00+222,x inx cpx #$0b bne notfound + key: lda #$7f ; keyboard scanner sta $fd30 sta $ff08 lda $ff08 cmp #$fe ; "1" 32k+ loader beq _32kloader cmp #$f7 ; "2" directory-browser beq _browser cmp #$bf ; "Q" exit beq t_copy bne key _browser: jmp brows ;----------------------------------------- ; ; copy trampoline-code ; ;-------------------------------------- _32kloader: sei ldx #$00 - lda $9000,x ; copy loader sta $0333,x inx cpx #$ba bne - ldx #$00 ldy #$00 jmp t_copy brows: ldy #$00 ; copy ldx #$00 lda #$10 sta t_hi lda #$01 sta t_lo lda #$92 sta s_hi lda #$00 sta s_lo browser: lda (s_lo),y ; copy game or tool to ram sta (t_lo),y iny bne browser inc s_hi inc t_hi inx cpx #$18 bne browser t_copy: ldx #$4b ; copy trampoline-code -- lda $9100,x sta $7f00,x dex bpl -- jmp $7f00 ;----------------------------------------- ; ; Mainscreen and text ; ;-------------------------------------- mainscreen: !scr " CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC " !scr " 1551-usb " !scr " FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF " !scr " " !scr " " !scr " usb-interface: " !scr " " !scr " CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC " !scr " " !scr " " !scr " (1) 32k+ loader (sys819) " !scr " " !scr " (2) directory-browser " !scr " " !scr " (q) quit " !scr " " !scr " " !scr " " !scr " " !scr " " !scr " " !scr " " !scr " CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC " !scr " " !scr " version 0.2 http://www.cbmhardware.de " interface: !scr "not found !" ;----------------------------------------- ; ; Loader for Tapebuffer ; ;-------------------------------------- *=$9000 ; start sys819 ;*=$0333 sei lda #%01000000 sta ddrc and #$00 sta portc sta ddra sta ddrb tay tax lda portb cmp #$03 beq idler jmp eot ; interface not found and quit idler: ldx #$00 idle: lda portc cmp #$80 bne idle load: lda porta ; get pointer lo sta p_lo lda #$40 sta portc ; set ack (pc6) lda #$00 sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - lda porta ; get pointer hi sta p_hi lda #$40 sta portc ; set ack (pc6) asl sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - lda porta ; get blocks sta blocks lda #$40 sta portc ; set ack (pc6) asl sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - lda porta ; get load-addr lo sta t_lo lda #$40 sta portc ; set ack (pc6) asl sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - lda porta ; get load-addr hi sta t_hi lda #$40 sta portc ; set ack (pc6) asl sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - ; load prg ldy #$00 loadprg: -- lda porta ; get byte sta (t_lo),y ; save lda #$40 sta portc ; set ack (pc6) asl sta portc ; and delete ack - lda portc cmp #$80 ; wait for dav (pc7) bne - iny bne -- inx cpx blocks beq eot inc t_hi bne -- eot: jmp end end: cli rts ;----------------------------------------- ; ; Trampoline Code for ROM:off and restart Basic ; ; Tapebuffer will not be erased ; ;-------------------------------------- *=$9100 cart_off: sei lda #$00 sta $02FE sta $02FF lda #$a4 ; nativ irq sta $0314 lda #$f2 sta $0315 lda #$00 ; basic , kernal sta $FDD0 ; function rom off sta $fb lda $fb jsr $FF84 ; Initialize I/O devices jsr $FF8A ; Restore vectors to initial values jsr $8117 ; restore vectors ! jsr $FF81 ; Initialize screen editor cli ldy #$00 -- ldx #$00 ; wait .. - inx ; .. long .. bne - ; ..time .. iny ; .. for .. bne -- ; .. drive reset jsr $802e jsr $8818 jsr $8bbe lda #$03 sta $FF0C ora #$ff sta $FF0D jsr $8bea rts *=$9200 !bin "dirbrw_04-03-2015.prg",,2 ;endmarker *=$bffe !by $00, $02 ; rom version
Letzte Änderung: 2019-01-04 10:09:17