base:turbotape_loader_source
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:turbotape_loader_source [2015-04-17 04:34] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Turbo-tape Loader source ====== | ||
+ | Depending on the selected options, this is the absolute minimum that is required to load Turbo-tape data. Sources are in XA assembler format. This assembles right out of the box to stack $0100. | ||
+ | Use SYS 256 or SYS 2^8 to launch the program. :) Uncomment DEFINEs for the different options. Enjoy! | ||
+ | |||
+ | Enthusi 11/2010 | ||
+ | |||
+ | < | ||
+ | .word $0100 | ||
+ | |||
+ | zp1 =$c3 | ||
+ | zp2 =$c4 | ||
+ | BITCOUNT =$02 | ||
+ | bytebuffer =$bd | ||
+ | zp3 =$c1 | ||
+ | zp4 =$c2 | ||
+ | chkbyte=$10 | ||
+ | ; | ||
+ | *=$0100; | ||
+ | #define FX 1 | ||
+ | #define CHKSUM 1 | ||
+ | #define BASICRUN 1 | ||
+ | #define MESSAGES 1 | ||
+ | #define RESETMODE 1 | ||
+ | |||
+ | sei | ||
+ | begin | ||
+ | |||
+ | loader | ||
+ | init | ||
+ | #ifdef MESSAGES | ||
+ | jsr $f817 ; print PRESS PLAY ON TAPE message | ||
+ | ldy #00 ; Y is wasted then | ||
+ | #endif | ||
+ | lda #$1d | ||
+ | sta $01 ; | ||
+ | ror $d011 ; screen blanked to d020 | ||
+ | #ifdef CHKSUM | ||
+ | #ifndef RESETMODE | ||
+ | sty chkbyte ;chose one that's 0 already per default? chkbyte=$10 is 0 after RESET | ||
+ | #endif | ||
+ | #endif | ||
+ | sty $dd05 ;Y still 0 | ||
+ | lda #$fe ; timer threshold for TurboTape | ||
+ | sta $dd04 | ||
+ | jsr sync ; | ||
+ | stx zp3 ; instead of a later lda, sta | ||
+ | jsr get_byte ; | ||
+ | tay | ||
+ | initzp | ||
+ | jsr get_byte | ||
+ | sta zp4, | ||
+ | inx | ||
+ | cpx #$03 | ||
+ | bne initzp | ||
+ | debug | ||
+ | jsr sync ;x=0 | ||
+ | ; | ||
+ | ;essential code from here on | ||
+ | e_start | ||
+ | load | ||
+ | jsr get_byte | ||
+ | load1 | ||
+ | dec $01 ;to load below i/o area! | ||
+ | sta (zp3), | ||
+ | #ifdef CHKSUM | ||
+ | eor chkbyte | ||
+ | sta chkbyte | ||
+ | #endif | ||
+ | inc $01 | ||
+ | iny | ||
+ | bne next | ||
+ | inc zp4 | ||
+ | next | ||
+ | cpy zp1 | ||
+ | lda zp4 | ||
+ | sbc zp2 | ||
+ | bcc load | ||
+ | #ifdef CHKSUM | ||
+ | jsr get_byte | ||
+ | cmp chkbyte | ||
+ | beq ok | ||
+ | inc $d020 ; color cycling in case of checksum error | ||
+ | bvc *-3 | ||
+ | #endif | ||
+ | ok | ||
+ | rol $d011 ;screen back on | ||
+ | lda #$37 ;default setting | ||
+ | sta $01 | ||
+ | #ifdef BASICRUN | ||
+ | jsr $e453 ; prepare BASIC pointers for RUN | ||
+ | jsr $a660 ; | ||
+ | jsr $a68e ; RUN | ||
+ | jmp $a7ae ; | ||
+ | #else | ||
+ | jmp $080d ;exomizer, or just launch the loaded code directly | ||
+ | #endif | ||
+ | ; | ||
+ | get_byte | ||
+ | lda #$01 | ||
+ | sta bytebuffer ; | ||
+ | next_bit | ||
+ | jsr get_bit | ||
+ | rol bytebuffer | ||
+ | bcc next_bit ; | ||
+ | lda bytebuffer ; | ||
+ | rts | ||
+ | ; | ||
+ | get_bit | ||
+ | lda #$10 | ||
+ | bit_loop | ||
+ | bit $dc0d | ||
+ | beq bit_loop ; | ||
+ | lda $dd0d | ||
+ | pha | ||
+ | lda #$19 | ||
+ | sta $dd0e | ||
+ | pla | ||
+ | #ifdef FX | ||
+ | sta $d020 ;use bitvalue as d020 effect (I love that one) | ||
+ | #endif | ||
+ | lsr | ||
+ | rts | ||
+ | |||
+ | e_end | ||
+ | ; | ||
+ | sync | ||
+ | jsr get_bit | ||
+ | rol bytebuffer | ||
+ | lda bytebuffer | ||
+ | cmp # | ||
+ | bne sync | ||
+ | ldx #$09 ;9,8,... is real turboTape | ||
+ | sync2 ;I sometimes used 8,7,6... to avoid it being listed in vice :) | ||
+ | jsr get_byte | ||
+ | cmp #$02 | ||
+ | beq sync2 | ||
+ | sync3 | ||
+ | cpx bytebuffer | ||
+ | bne sync | ||
+ | jsr get_byte | ||
+ | dex | ||
+ | bne sync3 | ||
+ | rts | ||
+ | </ |
base/turbotape_loader_source.txt · Last modified: 2015-04-17 04:34 by 127.0.0.1