====== Novaload Special Tape Transfer 1.0 ====== ;--------------------------------------- ;Novaload Special Tape Transfer 1.0 ; ;(C) 2005 Nostalgia ; ;By Fungus / Nostalgia ;--------------------------------------- *= $1000 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 ;st clear 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 $1400,x sta $0400,x lda #$05 sta $d800,x inx cpx #$a0 bne pm1 lda #$1b sta $d011 wplay lda $01 ;wait for play and #$10 bne wplay jsr lod ;load header lda $01 ;motor off ora #$20 sta $01 ldx #$00 xl lda loader1,x sta $04a0,x lda loader1+$0100,x sta $05a0,x lda loader1+$0200,x sta $06a0,x lda loader1+$0300,x sta $07a0,x inx bne xl jmp $04a0 ;begin real loader lod lda #$01 ;open tape file tax tay jsr $ffba lda #$00 jsr $ffbd lda #$00 sta $c0 sta $93 jsr $f7d7 ;load header/file jmp $f84f ;--------------------------------------- ;nova special tape routines loader1 = * *= $04a0 .offs loader1-* savename = $0341 jsr clrmem ;clear memory jsr putindex jsr printload jsr printname sei ;begin loader 1 lda #$07 sta $01 lda #$1f sta $dc0d sta $dd0d lda $dc0d lda $dd0d ldx #$01 stx $ab ;eof marker dex stx $a5 ;address low stx $a7 ;y index lda #$55 ;sync sta $aa lda #irq1 sta $0315 lda #$f4 ;timing constant sta $dc04 lda #$03 sta $dc05 lda #$90 ;init irq on flag sta $dc0d ;input cli waitld1 lda $ab beq done1 bpl waitld1 lda #$30 ;load error done1 sta $90 lda $01 ;tape off ora #$20 sta $01 lda $90 beq loadok1 jmp loaderr loadok1 lda #$00 ;load addy is sta $ac ;always $0800 sta $ae lda #$08 sta $ad inc $a6 ;end addy is lda $a6 ;always even page sta $af ;on first file jsr save jsr putindex jsr printname lda #$00 ;intro is always sta $ac ;$e000-$ffff sta $ae sta $af lda #$e0 sta $ad jsr save jmp loader2 ;start loader 2 irq1 lda $dc05 ldy #$11 sty $dc0e inc $d020 ;load effect eor #$02 lsr a lsr a ror $a9 lda $a9 selfmod1 = *+1 bcc sync1 bcs exitirq1 sync1 cmp #$80 ;sync byte bne exitirq1 lda #$0a bne doself1 cmp #$aa beq sync2 lda #$02 bne doself1 sync2 lda #$33 doself1 sta selfmod1 resetin1 lda #$7f ;reset input byte sta $a9 exitirq1 lda $dc0d jmp $ea81 ldy $a7 ;store byte sta ($a5),y clc adc $aa sta $aa iny sty $a7 bne resetin1 lda #$33 bne doself1 cmp $aa ;check chksum bne error1 ;error selfmod2 = *+1 lda #$3b bne doself1 cmp #$f0 bne putchk1 ldy #$46 sty selfmod2 bne putchk1 beq errex1 ;eof if chksum ;= 00 putchk1 sta $aa sta $a6 lda #$21 bne doself1 errex1 sta $ab lda #$1f ;eof sta $dc0d bne exitirq1 error1 lda #$80 ;load error bne errex1 ;--------------------------------------- ;loader 2 loader2 jsr clrmem ;clear memory jsr putindex jsr printload jsr printname sei ;begin loader 2 lda #$07 sta $01 lda #$1f sta $dc0d ;irq nmi off sta $dd0d sta $ab lda $dc0d lda $dd0d lda #$00 sta $b4 ;y index sta selfmod3 ;#$00 sta $90 ;st sta $b7 ;loader variables sta $a9 sta $aa lda #$f4 ;timing contant sta $dc04 lda #$03 sta $dc05 lda #$90 ;irq on flag set sta $dc0d lda #irq2 sta $0315 cli waitld2 lda $ab beq done2 ;stop loading bpl waitld2 ;continue loading lda #$30 ;load error sta $90 done2 lda $01 ;tape motor off ora #$20 sta $01 lda $90 beq loadok2 jmp loaderr loadok2 lda loadaddy sta $ac lda loadaddy+$01 sta $ad ;fix high addy inc $ad jsr save jmp loader2 irq2 lda $dc05 ;get bit ldy #$11 sty $dc0e inc $d020 eor #$02 lsr a lsr a ror $a9 bcs exitirq2 lda $aa ;checksum sta $a8 ;checksum save adc $a9 ;byte in sta $aa ;new checksum ldy $b4 ;y index lda $a9 ;byte in sec selfmod3 = *+1 bcs sync3 sync3 cmp #$80 ;%10000000 bne exitirq2 lda #$08 bne doself2 sbc #$aa ;block id beq sync5 sync4 lda #$00 beq sync9 sync5 sta $aa ;checksum lda #$23 doself2 sta selfmod3 ;self mod resetin2 lda #$7f sta $a9 sty $b4 exitirq2 lda $dc0d ;exit irq jmp $ea81 sta $b5 cmp $b7 beq sync6 lda $b7 bne sync4 lda #$3e bne doself2 sync6 lda #$3b cpy $b5 bne doself2 lda #$42 bne doself2 sta bullshit,y lda #$42 bne sync8 sta $ac,y ;load variables sta loadaddy,y lda #$53 iny sty $b4 cpy #$06 bne resetin2 beq sync9 cmp $a8 ;checksum bne error2 lda $b1 ;set eof beq errex2 inc $ad ;high byte load dec $b1 bne sync7 lda $b0 ;set eof beq errex2 sta $b5 ;y index max sync7 lda #$78 bne doself2 errex2 sta $ab ;exit lda #$1f sta $dc0d ;irq off bne exitirq2 error2 lda #$80 ;error bne errex2 sta ($ac),y ;store in mem lda #$53 ;falls through sync8 iny cpy $b5 bne resetin2 sync9 ldy #$00 ;reset y index sty $b5 beq doself2 ;--------------------------------------- ;save routine save lda #$00 ;save file sta $d020 ;border = black jsr printsave lda #$01 ;open file for ldx cd ;write ldy #$01 jsr $ffba ;setlfs lda #$10 ldx #$41 ;$0340 16 chars ldy #$03 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 ($ac),y dec $01 jsr $ffa8 inc $d020 dec $d020 inc $ac bne b1 inc $ad b1 lda $ad cmp $af bne saveb lda $ac cmp $ae 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 savename,x and #$7f sta savename,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 savename+$0e pla and #$0f jsr convert1 sta savename+$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 ;Transfer Messages fileidx .byte $00 et1 .text "Load Error! " .text " " lt .text "Loading " st .text "Saving " loadaddy .byte $00,$00,$00,$00,$00,$00 bullshit