updated documentation, added synchronization and pilot support to tape load
This commit is contained in:
1 parent
8b0eff74a2
commit
58d5ba54c2
10 files changed
+108
-33
No files matched your search
+2
-1
@@ -1,2 +1,3 @@
|
||||
|
||||
Although the project itself is LGPL3, I (FeralChild64) allow to redistribute my contributions to this project under any OSI (Open Source Initiative) approved open source license.
|
||||
Although the project itself is LGPL3, I (FeralChild64 - Roman St********ski) allow to redistribute
|
||||
my contributions to this project under any OSI (Open Source Initiative) approved open source license.
|
||||
@@ -117,7 +117,7 @@ build/target_generic/OUTB.BIN build/target_generic/BASIC_combined.vs: \
|
||||
$(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(GEN_BASIC) $(SRCDIR_BASIC) \
|
||||
c64/,,config_generic.s build/target_generic/KERNAL_combined.sym \
|
||||
$(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s))
|
||||
build/target_testing/OUTB.BIN build/target_generic/BASIC_combined.vs: \
|
||||
build/target_testing/OUTB.BIN build/target_testing/BASIC_combined.vs: \
|
||||
$(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(GEN_BASIC) $(SRCDIR_BASIC) \
|
||||
c64/,,config_testing.s build/target_testing/KERNAL_combined.sym \
|
||||
$(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s))
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
.label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details
|
||||
.label CNTDN = $A5 // -- NOT IMPLEMENTED --
|
||||
.label BUFPNT = $A6 // -- NOT IMPLEMENTED --
|
||||
.label INBIT = $A7 // -- NOT IMPLEMENTED --
|
||||
.label INBIT = $A7 // temporary storage for tape / RS-232 received bits
|
||||
#if !CONFIG_LEGACY_SCNKEY
|
||||
.label BITCI = $A8 // -- NOT IMPLEMENTED --
|
||||
.label RINONE = $A9 // -- WIP -- (UP9600 only) RS-232 check for start bit flag
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
// (L,S) = end-of-data marker
|
||||
|
||||
|
||||
// XXX use pilot to calibrate reading speed
|
||||
|
||||
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
@@ -58,10 +61,18 @@ load_tape_normal:
|
||||
|
||||
load_tape_normal_header:
|
||||
|
||||
// XXX replace this placeholder by a real routine
|
||||
lda #$00
|
||||
sta ROPRTY // initialize EOR checksum
|
||||
!:
|
||||
jsr tape_normal_pilot
|
||||
ldy #$89
|
||||
jsr tape_normal_sync
|
||||
bcs !-
|
||||
|
||||
// XXX replace this placeholder with a real routine
|
||||
!:
|
||||
jsr tape_normal_get_byte
|
||||
jmp load_tape_normal_header
|
||||
jmp !-
|
||||
|
||||
|
||||
#endif
|
||||
@@ -14,17 +14,17 @@ tape_normal_get_bit:
|
||||
// Fetch the first pulse
|
||||
|
||||
jsr tape_normal_get_pulse
|
||||
bcc tape_normal_get_bit_0
|
||||
bcc tape_normal_get_bit_1
|
||||
|
||||
// First impulse was short, second should be long
|
||||
// First impulse was short, second should be medium
|
||||
|
||||
jsr tape_normal_get_pulse
|
||||
bcs tape_normal_get_bit_error
|
||||
|
||||
// We have a bit '1'
|
||||
// We have a bit '0'
|
||||
|
||||
// Carry flag already clear
|
||||
lda #$06
|
||||
lda #$00
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
@@ -34,21 +34,22 @@ tape_normal_get_bit_done:
|
||||
rts
|
||||
|
||||
|
||||
tape_normal_get_bit_0:
|
||||
tape_normal_get_bit_1:
|
||||
|
||||
// First impulse was long, second should be short
|
||||
// First impulse was medium, second should be short
|
||||
|
||||
jsr tape_normal_get_pulse
|
||||
bcc tape_normal_get_bit_error
|
||||
|
||||
// We have a bit '0'
|
||||
// We have a bit '1'
|
||||
|
||||
clc
|
||||
lda #$00
|
||||
beq tape_normal_get_bit_done // branch always
|
||||
lda #$06
|
||||
bne tape_normal_get_bit_done // branch always
|
||||
|
||||
|
||||
tape_normal_get_bit_error:
|
||||
|
||||
sec
|
||||
rts
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@ tape_normal_get_byte:
|
||||
|
||||
// Init byte checksum and canary bit
|
||||
lda #$01
|
||||
sta ROPRTY
|
||||
sta PRTY
|
||||
lda #%01111111 // canary bit is 0
|
||||
pha
|
||||
sta INBIT
|
||||
|
||||
// First we need a byte marker - (L,M)
|
||||
!:
|
||||
@@ -35,16 +35,13 @@ tape_normal_get_byte_loop:
|
||||
|
||||
// Handle parity bit
|
||||
lda #$01
|
||||
eor ROPRTY
|
||||
sta ROPRTY
|
||||
eor PRTY
|
||||
sta PRTY
|
||||
|
||||
sec
|
||||
!: // moved bit state from Zero to Carry flag
|
||||
|
||||
pla
|
||||
ror // put the bit in
|
||||
pha
|
||||
|
||||
ror INBIT // put the bit in
|
||||
bcs tape_normal_get_byte_loop // loop if no canary bit reached
|
||||
|
||||
// Byte retrieved (on stack), now we need to validate the checksum
|
||||
@@ -54,8 +51,8 @@ tape_normal_get_byte_loop:
|
||||
beq !+
|
||||
lda #$01
|
||||
!:
|
||||
eor ROPRTY
|
||||
beq tape_normal_get_byte_error
|
||||
eor PRTY
|
||||
bne tape_normal_get_byte_error
|
||||
|
||||
// Checksum validated succesfully
|
||||
|
||||
@@ -66,8 +63,8 @@ tape_normal_get_byte_loop:
|
||||
|
||||
tape_normal_get_byte_done:
|
||||
|
||||
pla
|
||||
stx VIC_EXTCOL
|
||||
lda INBIT
|
||||
rts
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
//
|
||||
// Tape (turbo) helper routine - handling the pilot
|
||||
//
|
||||
|
||||
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
tape_normal_pilot:
|
||||
|
||||
// Injest the pilot - series of short pulses. According to http://sidpreservation.6581.org/tape-format/
|
||||
// it consist of the foollowing number of pulses:
|
||||
// - $6A00 for header
|
||||
// - $1A00 for data and seq block header
|
||||
// - $4F for repeated header/data
|
||||
|
||||
ldy #$05 // this should be enough
|
||||
!:
|
||||
jsr tape_normal_get_pulse
|
||||
bcc tape_normal_pilot // not a pilot - try again
|
||||
|
||||
dey
|
||||
bne !-
|
||||
|
||||
rts
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
//
|
||||
// Tape (turbo) helper routine - synchronization handling
|
||||
//
|
||||
// .Y should contain start value (either $89 or $09)
|
||||
// Carry set = failed
|
||||
|
||||
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
tape_normal_sync:
|
||||
|
||||
// Injest bytes of decreasing values
|
||||
|
||||
jsr tape_normal_get_byte
|
||||
bcs tape_normal_sync_fail
|
||||
|
||||
cpy INBIT // INBIT contains same value as .A
|
||||
bne tape_normal_sync_fail
|
||||
|
||||
dey
|
||||
and #%01111110
|
||||
bne tape_normal_sync // branch if not $80 and not $00
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
|
||||
tape_normal_sync_fail:
|
||||
|
||||
sec
|
||||
rts
|
||||
|
||||
|
||||
#endif
|
||||
@@ -15,12 +15,12 @@
|
||||
tape_turbo_get_byte:
|
||||
|
||||
lda #$01
|
||||
sta ROPRTY // init the to-be-read byte with 1 (canary bit to mark loop end)
|
||||
sta INBIT // init the to-be-read byte with 1 (canary bit to mark loop end)
|
||||
!:
|
||||
jsr tape_turbo_get_bit
|
||||
rol ROPRTY
|
||||
rol INBIT
|
||||
bcc !- // is the initial 1 shifted into carry already?
|
||||
lda ROPRTY // much nicer than ldx #8: dex: loop
|
||||
lda INBIT // much nicer than ldx #8: dex: loop
|
||||
|
||||
rts
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
tape_turbo_sync_common:
|
||||
|
||||
jsr tape_turbo_get_bit
|
||||
rol ROPRTY
|
||||
lda ROPRTY
|
||||
rol INBIT
|
||||
lda INBIT
|
||||
cmp #$02
|
||||
bne tape_turbo_sync_common
|
||||
rts
|
||||
@@ -37,14 +37,14 @@ tape_turbo_sync_payload:
|
||||
|
||||
jsr tape_turbo_sync_common
|
||||
!:
|
||||
ldx #$09 // 9,8,... is real turboTape
|
||||
!: // I sometimes used 8,7,6... to avoid it being listed in vice :)
|
||||
ldx #$09 // 9, 8, ...
|
||||
!:
|
||||
jsr tape_turbo_get_byte
|
||||
cmp #$02
|
||||
beq !-
|
||||
ldy #$00
|
||||
!:
|
||||
cpx ROPRTY
|
||||
cpx INBIT
|
||||
bne tape_turbo_sync_payload
|
||||
jsr tape_turbo_get_byte
|
||||
dex
|
||||
|
||||
Reference in new issue
Block a user