User Tools

Site Tools


base:burner_tape_transfer_1.0

Burner Tape Transfer 1.0

;---------------------------------------
;Burner Tape Transfer 1.0
;
;(C) 2005 Nostalgia
;
;By Fungus / Nostalgia
;---------------------------------------

         *= $0801

         .byte $08,$0b,$d5,$07,$9e
         .byte $32,$30,$36,$31,$00
         .byte $00,$00

cd       = $02

         lda $ba
         sta cd       ;save current
                      ;disk drive
         lda #$0b     ;setup
         sta $d011
         lda #$c1     ;no nmi
         sta $0318
         lda #$80
         sta $0291    ;no char shift
         lda #$17
         sta $d018    ;this set
         lda #$00
         sta $9d      ;no msgs
         sta $d020
         sta $d021
         lda #$2f     ;i/o config
         sta $00      ;bit 4 = input
         lda $01
         and #$07     ;mem config
         ora #$20     ;motor off
         sta $01
         lda #$00
         sta $0289    ;no keys
         sta $0286

         lda #$93
         jsr $ffd2    ;clr screen

         ldx #$00     ;print msg 1
pm1      lda $0b80,x
         sta $0400,x
         lda #$05
         sta $d800,x
         inx
         cpx #$a0
         bne pm1

         lda #$1b     ;screen on
         sta $d011

wplay    lda $01      ;wait for play
         and #$10
         bne wplay

         ldx #$00
xl       lda loader1,x
         sta $04a0,x
         lda loader1+$0100,x
         sta $05a0,x
         lda loader1+$0200,x
         sta $06a0,x
         inx
         bne xl

         jmp $04a0    ;begin real loader

;---------------------------------------
;burner tape routine

loader1  = *
         *= $04a0
         .offs loader1-*

moreload1
         cli
         jsr loadhead
         jsr namefile
         jsr idloader
moreload2
         jsr putindex
         jsr printload
         jsr printname
         jsr clrmem
         jsr load
         jsr save
         lda files
         beq moreload1
         bne moreload2

load     sei
         lda #$0b    ;screen off
         sta $d011
         lda #$80    ;threshold = $0180
         sta $dd04
         lda #$01
         sta $dd05
         lda #$19
         sta $dd0e
         lda #$00
         sta $fb     ;relocate load to
         lda #$08    ;$0800
         sta $fc

         lda #$07    ;motor on
         sta $01

restart  ldy #$00
         jsr sync
         jsr fbyte
         sta $20     ;load addy low
         sta $c1
         jsr fbyte
         sta $21     ;load addy high
         sta $c2
         jsr fbyte
         sta $22     ;end addy low
         sta $c3
         jsr fbyte
         sta $23     ;end addy high
         sta $c4

floop    jsr fbyte
         sta ($fb),y
         inc $fb
         bne aload
         inc $fc
aload    inc $c1
         bne cend
         inc $c2
cend     lda $c1
         cmp $c3
         lda $c2
         sbc $c4
         bcc floop
exit1    bit v3exit
         jsr fbyte   ;v1/2 more files
         sta files
         jsr fbyte   ;v1/2 jump addy
         sta jaddy
         jsr fbyte
         sta jaddy+1
         lda #$27    ;motor off
         sta $01
         rts

v3exit   lda #$27    ;motor off
         sta $01
         dec files
         lda $03b3
         sta jaddy
         lda $03b6
         sta jaddy+1
         rts

sync     jsr fbit    ;sync
endian1  ror $bd
         lda $bd
sync1    = *+1
         cmp #$96
         bne sync
wsync    jsr fbyte
sync2    = *+1
         cmp #$96
         beq wsync
sync3    = *+1
         cmp #$81
         bne sync
         rts

fbyte    ldx #$08    ;get byte
gbyte    jsr fbit
endian2  ror $bd
         inc $d020
         dex
         bne gbyte
         lda $bd
         rts

fbit     lda #$10    ;get bit
gbit     bit $dc0d
         beq gbit
         lda $dd0d
         lsr a
         lda #$19
         sta $dd0e
         rts

files    .byte $00   ;for burner 3/4
jaddy    .byte $00,$00

;---------------------------------------
;load header

loadhead
         lda #$01     ;open tape file
         tax
         tay
         jsr $ffba
         lda #$00
         jsr $ffbd
         lda #$00
         sta $c0
         sta $93
         jsr $f7d7    ;load header/file
         jsr $f84f
         lda $01      ;motor off
         ora #$20
         sta $01
         rts

;---------------------------------------
;id loader type

idloader
         ldx #$51
headdec  lda $0300,x ;decode header
         eor #$59
         sta $0300,x
         inx
         bne headdec

         lda $035e
         cmp #$a9
         beq version1
         cmp #$85
         beq version2
         cmp #$d0
         beq version3
         jmp loaderr ;unknown loader

version1
         lda $03c3   ;version 1 loader
         sta sync1   ;mods
         sta sync2
         lda $03ce
         sta sync3
         lda $03be
         sta endian1
         lda $03d7
         sta endian2
         rts
version2
         lda $03c5   ;version 2 loader
         sta sync1   ;mods
         sta sync2
         lda $03d0
         sta sync3
         lda $03c0
         sta endian1
         lda $03d9
         sta endian2
         rts
version3
         lda $03c4   ;version 3/4 loader
         sta sync1   ;mods
         sta sync2
         lda $03cf
         sta sync3
         lda $03bf
         sta endian1
         lda $03d8
         sta endian2
         lda #$4c
         sta exit1
         lda $03bb
         sta files
         rts

;---------------------------------------
;save routine

save
         lda #$00    ;save file
         sta $d020   ;border  = black
         lda #$1b
         sta $d011   ;screen on
         lda #$00
         sta $fb     ;init save addy
         lda #$08
         sta $fc
         jsr printsave
         lda $20     ;init end counter
         sta $c1
         lda $21
         sta $c2

         lda #$01    ;open file for
         ldx cd      ;write
         ldy #$01
         jsr $ffba   ;setlfs
         lda #$10
         ldx #<filename
         ldy #>filename
         jsr $ffbd   ;setname
         jsr $ffc0   ;open
         ldx #$01
         jsr $ffc9   ;chkout
         lda $ac     ;start addy low
         jsr $ffa8   ;send
         lda $ad     ;start addy high
         jsr $ffa8   ;send

         ldy #$00    ;save the file
saveb    sei
         inc $01
         lda ($fb),y
         dec $01
         jsr $ffa8
         inc $d020
         dec $d020

         inc $fb
         bne asave
         inc $fc
asave
         inc $c1
         bne bsave
         inc $c2
bsave    lda $c1
         cmp $c3
         bne saveb
         lda $c2
         sbc $c4
         bne saveb

         lda #$01
         jmp $ffc3   ;close the file

;---------------------------------------
;utility subroutines

loaderr
         lda #$02      ;print tape load
         sta $d020     ;error msg
         ldx #$17
perr1    lda et1,x
         and #$3f
         sta $0478,x
         lda #$01
         sta $d878,x
         dex
         bpl perr1
         jmp *         ;endless loop

printload
         ldx #$07      ;print loading
ll       lda lt,x      ;text
         and #$3f
         sta $0478,x
         lda #$05
         sta $d878,x
         dex
         bpl ll
         rts

printsave
         ldx #$07
dl       lda st,x      ;print save text
         and #$3f
         sta $0478,x
         lda #$05
         sta $d878,x
         dex
         bpl dl
         rts

printname
         ldx #$0f      ;print name
ln       lda filename,x
         and #$7f
         sta filename,x
         and #$3f
         sta $0480,x
         dex
         bpl ln
         rts

putindex
         lda fileidx
         inc fileidx
         pha
         lsr a
         lsr a
         lsr a
         lsr a
         jsr convert1
         sta filename+$0e
         pla
         and #$0f
         jsr convert1
         sta filename+$0f
         rts

convert1 ora #$30
         cmp #$3a
         bcc convert2
         adc #$06
convert2 rts

clrmem
         sei
         inc $01
         lda #$08
         sta clrit+$02
         lda #$00
         tax
clrit    sta $0800,x
         inx
         bne clrit
         inc clrit+$02
         bne clrit
         dec $01
         cli
         rts

namefile
         lda #$20
         ldx #$0f
clrname  sta filename,x
         dex
         bpl clrname
namer    ldy #$00     ;name file
         ldx #$00
dname    lda $0341,y
         beq skip
         cmp #$41     ;less than A
         bcc check2
         cmp #$5b     ;more than Z
         bcs skip
         bcc putname
check2   cmp #$30     ;less than 0
         bcc skip
         cmp #$3a     ;more than 9
         bcs skip
putname  sta filename,x
         inx
skip     iny
         cpy #$10
         bne dname
         rts

;---------------------------------------
;Transfer Messages

fileidx  .byte $00

et1      .text "Load Error!     "
         .text "        "
lt       .text "Loading "
st       .text "Saving  "

filename .text "                "
base/burner_tape_transfer_1.0.txt · Last modified: 2015-04-17 04:30 (external edit)