126 lines
2.6 KiB
ArmAsm
126 lines
2.6 KiB
ArmAsm
|
||
//
|
||
// Tape (normal) part of the LOAD routine
|
||
//
|
||
|
||
|
||
// We have the following possible CPU frequencies:
|
||
// - C64 PAL: CPU frequency 0.985248 MHz
|
||
// - C64 NTSC: CPU frequency 1.022727 MHz
|
||
// Average is 1.0039875 MHz and we will take this value for calculation (but it really does not change much).
|
||
//
|
||
// We have to distinguish the following pulse lengths (http://sidpreservation.6581.org/tape-format/):
|
||
// - S (short) 352 us
|
||
// - M (medium) 512 us
|
||
// - L (long) 672 us
|
||
//
|
||
// This gives us the following thresholds
|
||
// - S vs M 432 us (108 or $6C 4-tick periods)
|
||
// - M vs L 592 us (149 or $95 4-tick periods)
|
||
//
|
||
// 4-tick periods should be enough - TAP file format description (http://unusedino.de/ec64/technical/formats/tap.html)
|
||
// tells it uses exactly 8 PAL ticks as a resolution
|
||
|
||
// The following encoding is used:
|
||
// (S,M) = 0 bit
|
||
// (M,S) = 1 bit
|
||
// (L,M) = new-data marker
|
||
// (L,S) = end-of-data marker
|
||
|
||
|
||
// XXX use pilot to calibrate reading speed
|
||
|
||
|
||
#if CONFIG_TAPE_NORMAL
|
||
|
||
|
||
load_tape_normal:
|
||
|
||
jsr tape_ditch_verify // only LOAD is supported, no VERIFY
|
||
|
||
// Setup CIA #2 timers
|
||
|
||
ldx #$03 // set timer A to 4 ticks
|
||
stx CIA2_TIMALO // $DD04
|
||
ldx #$00
|
||
stx CIA2_TIMAHI // $DD05
|
||
|
||
stx CIA2_TIMBHI // $DD07
|
||
dex // puts $FF - for running timer B as long as possible
|
||
stx CIA2_TIMBLO // $DD06
|
||
|
||
// Let timer A run continuously
|
||
|
||
ldx #%00010001 // start timer, force latch reload
|
||
stx CIA2_CRA // $DD0E
|
||
|
||
// Start playing
|
||
jsr tape_ask_play
|
||
|
||
// FALLTROUGH
|
||
|
||
load_tape_normal_header:
|
||
|
||
// Read pilot and sync of the first header
|
||
|
||
jsr tape_normal_pilot
|
||
ldy #$89
|
||
jsr tape_normal_sync
|
||
bcs load_tape_normal_header
|
||
|
||
ldy #$00
|
||
|
||
// FALLTROUGH
|
||
|
||
load_tape_normal_header_loop:
|
||
|
||
// Read the header
|
||
|
||
jsr tape_normal_get_byte // XXX handle errors
|
||
sta (TAPE1), y
|
||
iny
|
||
cpy #$15
|
||
bne load_tape_normal_header_loop
|
||
|
||
// Read pilot and sync of the second header
|
||
|
||
jsr tape_normal_pilot
|
||
ldy #$09
|
||
jsr tape_normal_sync
|
||
bcs load_tape_normal_header
|
||
|
||
// XXX do not skip second header, use it to correct data
|
||
ldy #$15
|
||
!:
|
||
jsr tape_normal_get_byte
|
||
dey
|
||
bne !-
|
||
|
||
// For now only one type of header is supported
|
||
|
||
ldy #$00
|
||
lda (TAPE1),y
|
||
|
||
cmp #$01
|
||
bne load_tape_normal_header // XXX also handle other header types, see Mapping the C64 page 77
|
||
|
||
// Handle the header
|
||
|
||
jsr tape_handle_header
|
||
bcs load_tape_normal_header // if name does not match, look for other header
|
||
|
||
// FALLTROUGH
|
||
|
||
load_tape_normal_payload:
|
||
|
||
|
||
|
||
|
||
// XXX replace this placeholder with a real routine
|
||
!:
|
||
jsr tape_normal_get_byte
|
||
jmp !-
|
||
|
||
|
||
#endif
|