added helper marks for head align tool, use CIA for stable timing
This commit is contained in:
1 parent
db9d6e7b60
commit
0b13ce175e
4 files changed
+129
-40
No files matched your search
@@ -46,10 +46,10 @@
|
|||||||
// I/O devices
|
// I/O devices
|
||||||
|
|
||||||
#define CONFIG_IEC
|
#define CONFIG_IEC
|
||||||
//#define CONFIG_IEC_DOLPHINDOS
|
#define CONFIG_IEC_DOLPHINDOS
|
||||||
//#define CONFIG_IEC_DOLPHINDOS_FAST
|
#define CONFIG_IEC_DOLPHINDOS_FAST
|
||||||
//#define CONFIG_IEC_JIFFYDOS
|
#define CONFIG_IEC_JIFFYDOS
|
||||||
//#define CONFIG_IEC_JIFFYDOS_BLANK
|
#define CONFIG_IEC_JIFFYDOS_BLANK
|
||||||
// #define CONFIG_IEC_BURST_CIA1 // please keep disabled for now
|
// #define CONFIG_IEC_BURST_CIA1 // please keep disabled for now
|
||||||
// #define CONFIG_IEC_BURST_CIA2 // please keep disabled for now
|
// #define CONFIG_IEC_BURST_CIA2 // please keep disabled for now
|
||||||
// #define CONFIG_IEC_BURST_SOFT // please keep disabled for now
|
// #define CONFIG_IEC_BURST_SOFT // please keep disabled for now
|
||||||
|
|||||||
@@ -138,26 +138,26 @@ IOINIT:
|
|||||||
|
|
||||||
// Checked using VICE that original ROM initializes timers this way
|
// Checked using VICE that original ROM initializes timers this way
|
||||||
ldx #$08
|
ldx #$08
|
||||||
stx CIA1_CRB // $DC0F
|
stx CIA1_CRB // $DC0F
|
||||||
stx CIA2_CRA // $DD0E
|
stx CIA2_CRA // $DD0E
|
||||||
stx CIA2_CRB // $DD0F
|
stx CIA2_CRB // $DD0F
|
||||||
|
|
||||||
// Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT
|
// Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT
|
||||||
// Checked on original ROMs, that it sets bit #2 (RS-232 output) high
|
// Checked on original ROMs, that it sets bit #2 (RS-232 output) high
|
||||||
|
|
||||||
ldx #%00000111 // XXX adapt this to IEC idle state, JMP at the end won't be needed
|
ldx #%00000111 // XXX adapt this to IEC idle state, JMP at the end won't be needed
|
||||||
stx CIA2_PRA // $DD00
|
stx CIA2_PRA // $DD00
|
||||||
|
|
||||||
// Put something sane in the IRQ timer
|
// Put something sane in the IRQ timer
|
||||||
jsr setup_irq_timer
|
jsr setup_irq_timer
|
||||||
|
|
||||||
// Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts)
|
// Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts)
|
||||||
ldx #$11
|
ldx #$11
|
||||||
stx CIA1_CRA // $DC0E
|
stx CIA1_CRA // $DC0E
|
||||||
|
|
||||||
// Enable timer interrupt
|
// Enable timer interrupt
|
||||||
ldx #$81
|
ldx #$81
|
||||||
stx CIA1_ICR // $DC0D
|
stx CIA1_ICR // $DC0D
|
||||||
|
|
||||||
#if CONFIG_IEC
|
#if CONFIG_IEC
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
#if CONFIG_TAPE_HEAD_ALIGN
|
#if CONFIG_TAPE_HEAD_ALIGN
|
||||||
|
|
||||||
|
|
||||||
.label __ha_start = 3 // starting row of the chart
|
.label __ha_start = 12 // starting row of the chart
|
||||||
.label __ha_rows = 20 // number of rows for scrolling
|
.label __ha_rows = 10 // number of rows for scrolling
|
||||||
|
|
||||||
// Helper tables
|
// Helper tables
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
.label __ha_lda_addr = $1200; // 2 bytes, for code generator
|
.label __ha_lda_addr = $1200; // 2 bytes, for code generator
|
||||||
.label __ha_sta_addr = $1202; // 2 bytes, for code generator
|
.label __ha_sta_addr = $1202; // 2 bytes, for code generator
|
||||||
.label __ha_counter = $1204; // 3 bytes
|
.label __ha_gfxflag = $1204;
|
||||||
|
|
||||||
// Generated code location
|
// Generated code location
|
||||||
|
|
||||||
@@ -50,6 +50,10 @@ tape_head_align:
|
|||||||
ldx #$02 // set timer A to 3 ticks
|
ldx #$02 // set timer A to 3 ticks
|
||||||
jsr tape_common_prepare_cia_by_x
|
jsr tape_common_prepare_cia_by_x
|
||||||
|
|
||||||
|
ldx #$FF // timer to control scroll speed
|
||||||
|
stx CIA1_TIMBLO // $DC06
|
||||||
|
stx CIA1_TIMBHI // $DC07
|
||||||
|
|
||||||
jsr tape_motor_on
|
jsr tape_motor_on
|
||||||
|
|
||||||
// Clear color data ($0800)
|
// Clear color data ($0800)
|
||||||
@@ -69,9 +73,10 @@ tape_head_align:
|
|||||||
// Make sure the row where the chart is being created is not visible
|
// Make sure the row where the chart is being created is not visible
|
||||||
|
|
||||||
lda #(CONFIG_COLOR_BG * $10 + CONFIG_COLOR_BG)
|
lda #(CONFIG_COLOR_BG * $10 + CONFIG_COLOR_BG)
|
||||||
ldy #$28
|
ldy #$22
|
||||||
!:
|
!:
|
||||||
sta $0800 + __ha_start * 40 - 1, y
|
sta $0800 + __ha_start * 40 + 2, y
|
||||||
|
// sta $0800 + __ha_start * 40 + 2 + (__ha_rows + 1) * 40, y
|
||||||
dey
|
dey
|
||||||
bne !-
|
bne !-
|
||||||
|
|
||||||
@@ -128,14 +133,34 @@ tape_head_align:
|
|||||||
inx
|
inx
|
||||||
bne !--
|
bne !--
|
||||||
|
|
||||||
// Generate helpercode for screen scrolling
|
// Initialize flag for additional GFX effects
|
||||||
|
|
||||||
|
stx __ha_gfxflag
|
||||||
|
|
||||||
|
// Generate helper code for screen scrolling
|
||||||
|
|
||||||
jsr tape_head_align_gen_code
|
jsr tape_head_align_gen_code
|
||||||
|
|
||||||
|
// Scroll several times to fill-in the screen
|
||||||
|
|
||||||
|
ldx #(__ha_rows * 8)
|
||||||
|
!:
|
||||||
|
phx_trash_a
|
||||||
|
jsr tape_head_align_scroll_gfx
|
||||||
|
plx_trash_a
|
||||||
|
|
||||||
|
dex
|
||||||
|
bne !-
|
||||||
|
|
||||||
tape_head_align_loop_1:
|
tape_head_align_loop_1:
|
||||||
|
|
||||||
// XXX check for STOP key, possibly terminate
|
// XXX check for STOP key, possibly terminate
|
||||||
|
|
||||||
|
// Launch the timer
|
||||||
|
|
||||||
|
ldx #%00011001 // start timer, one-shot force latch reload, count system ticks
|
||||||
|
stx CIA1_CRB // $DC0F
|
||||||
|
|
||||||
// Scroll the whole chart one line down
|
// Scroll the whole chart one line down
|
||||||
|
|
||||||
ldx #$00
|
ldx #$00
|
||||||
@@ -148,15 +173,9 @@ tape_head_align_loop_1:
|
|||||||
tax
|
tax
|
||||||
bne !-
|
bne !-
|
||||||
|
|
||||||
// XXX draw helper lines
|
// Draw helpers and decorators
|
||||||
|
|
||||||
// Initialize counter
|
jsr tape_head_align_apply_gfx
|
||||||
|
|
||||||
lda #$80
|
|
||||||
sta __ha_counter + 1
|
|
||||||
lda #$00
|
|
||||||
sta __ha_counter + 0
|
|
||||||
sta __ha_counter + 2
|
|
||||||
|
|
||||||
// Skip 2 pulses, these measurements will be too imprecise
|
// Skip 2 pulses, these measurements will be too imprecise
|
||||||
|
|
||||||
@@ -186,9 +205,12 @@ tape_head_align_loop_2:
|
|||||||
|
|
||||||
tape_head_align_drawn:
|
tape_head_align_drawn:
|
||||||
|
|
||||||
lda __ha_counter + 2
|
lda CIA1_TIMBLO
|
||||||
beq tape_head_align_loop_2
|
and CIA1_TIMBHI
|
||||||
bne tape_head_align_loop_1
|
eor #$FF
|
||||||
|
|
||||||
|
bne tape_head_align_loop_2
|
||||||
|
beq tape_head_align_loop_1
|
||||||
|
|
||||||
tape_head_align_quit:
|
tape_head_align_quit:
|
||||||
|
|
||||||
@@ -201,6 +223,85 @@ tape_head_align_quit:
|
|||||||
cli
|
cli
|
||||||
rts // XXX perform new after quit
|
rts // XXX perform new after quit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// XXX size-optimize code below
|
||||||
|
|
||||||
|
tape_head_align_scroll_gfx:
|
||||||
|
|
||||||
|
ldx #(8 * 0)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 1)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 6)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 13)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 21)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 30)
|
||||||
|
jsr __ha_scroll
|
||||||
|
ldx #(8 * 31)
|
||||||
|
jsr __ha_scroll
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
tape_head_align_apply_gfx:
|
||||||
|
|
||||||
|
// Apply GFX effects XXX improve it
|
||||||
|
|
||||||
|
lda __ha_gfxflag
|
||||||
|
inc __ha_gfxflag
|
||||||
|
and #%00001100
|
||||||
|
bne !+
|
||||||
|
ldy #%11110001
|
||||||
|
lda #%10001111
|
||||||
|
bne !++
|
||||||
|
!:
|
||||||
|
ldy #%00000001
|
||||||
|
lda #%10000000
|
||||||
|
!:
|
||||||
|
ora __ha_chart + 7 + 8 * 0
|
||||||
|
sta __ha_chart + 7 + 8 * 0
|
||||||
|
|
||||||
|
tya
|
||||||
|
ora __ha_chart + 7 + 8 * 31
|
||||||
|
sta __ha_chart + 7 + 8 * 31
|
||||||
|
|
||||||
|
// Draw helper lines
|
||||||
|
|
||||||
|
lda __ha_gfxflag
|
||||||
|
and #%00000010
|
||||||
|
beq !+
|
||||||
|
|
||||||
|
lda #%00010000
|
||||||
|
ora __ha_chart + 7 + 8 * 1
|
||||||
|
sta __ha_chart + 7 + 8 * 1
|
||||||
|
|
||||||
|
lda #%00001000
|
||||||
|
ora __ha_chart + 7 + 8 * 30
|
||||||
|
sta __ha_chart + 7 + 8 * 30
|
||||||
|
|
||||||
|
// For normal XXX check values
|
||||||
|
|
||||||
|
lda #%00000100
|
||||||
|
ora __ha_chart + 7 + 8 * 6
|
||||||
|
sta __ha_chart + 7 + 8 * 6
|
||||||
|
|
||||||
|
lda #%00010000
|
||||||
|
ora __ha_chart + 7 + 8 * 13
|
||||||
|
sta __ha_chart + 7 + 8 * 13
|
||||||
|
|
||||||
|
// For turbo XXX check values
|
||||||
|
|
||||||
|
lda #%01000000
|
||||||
|
ora __ha_chart + 7 + 8 * 21
|
||||||
|
sta __ha_chart + 7 + 8 * 21
|
||||||
|
!:
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
#endif // ROM layout
|
#endif // ROM layout
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,9 @@
|
|||||||
|
|
||||||
tape_head_align_get_pulse:
|
tape_head_align_get_pulse:
|
||||||
|
|
||||||
// This routine differs a lot from the one used to read pulse during tape reading:
|
// This routine differs from the one used to read pulse during tape reading:
|
||||||
// - it is not as precise
|
// - it is not as precise
|
||||||
// - it terminates when timer reaches $FF
|
// - it terminates when timer reaches $FF
|
||||||
// - it updates
|
|
||||||
|
|
||||||
lda #$10
|
lda #$10
|
||||||
!:
|
!:
|
||||||
@@ -33,17 +32,6 @@ tape_head_align_get_pulse:
|
|||||||
ldx #%01010001
|
ldx #%01010001
|
||||||
stx CIA2_CRB // $DD0F
|
stx CIA2_CRB // $DD0F
|
||||||
|
|
||||||
// Update time counter
|
|
||||||
|
|
||||||
tya
|
|
||||||
clc
|
|
||||||
adc __ha_counter + 0
|
|
||||||
sta __ha_counter + 0
|
|
||||||
bcc !+
|
|
||||||
inc __ha_counter + 1
|
|
||||||
bne !+
|
|
||||||
inc __ha_counter + 2
|
|
||||||
!:
|
|
||||||
// Return with time elapsed
|
// Return with time elapsed
|
||||||
|
|
||||||
tya
|
tya
|
||||||
|
|||||||
Reference in new issue
Block a user