Skip to content

Commit

Permalink
Finalise support for Apple IIc line by line artifact switching
Browse files Browse the repository at this point in the history
  • Loading branch information
IanSB committed May 28, 2021
1 parent 8d371fd commit 3eaff55
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 33 deletions.
129 changes: 100 additions & 29 deletions src/capture_line_ntsc_8bpp.S
Original file line number Diff line number Diff line change
Expand Up @@ -365,10 +365,6 @@ done_non_white\@:
mov r11, r11, lsr #4
bic r11, #0x00003000

// tst r12, #NTSC_Y_INVERT
// eorne r8, r8, #(0x12 << PIXEL_BASE)
// eorne r8, r8, #(0x12 << (PIXEL_BASE + 6))

and r9, r8, #(0x07 << PIXEL_BASE)

cmp r9, #(0x01 << PIXEL_BASE) //red?
Expand Down Expand Up @@ -446,10 +442,6 @@ done_non_white\@:
mov r11, r11, lsr #2
bic r11, #0x00003000

// tst r12, #NTSC_Y_INVERT
// eorne r8, r8, #(0x12 << PIXEL_BASE)
// eorne r8, r8, #(0x12 << (PIXEL_BASE + 6))

and r9, r8, #(0x07 << PIXEL_BASE)

cmp r9, #(0x01 << PIXEL_BASE) //red?
Expand Down Expand Up @@ -514,8 +506,6 @@ done_non_white\@:
b preload_capture_line_ntsc_8bpp_cga
capture_line_ntsc_8bpp_cga:
push {lr}
ldr r12, =ntsc_status
ldr r12, [r12]
SKIP_PSYNC_NO_OLD_CPLD_NTSC
mov r11, #0
WAIT_FOR_PSYNC_EDGE
Expand Down Expand Up @@ -763,8 +753,6 @@ bit_count:
b preload_capture_line_ntsc_sixbits_8bpp_cga
capture_line_ntsc_sixbits_8bpp_cga:
push {lr}
ldr r12, =ntsc_status
ldr r12, [r12]
SKIP_PSYNC_NO_OLD_CPLD_NTSC
mov r11, #0
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
Expand Down Expand Up @@ -816,31 +804,114 @@ preload_capture_line_ntsc_sixbits_8bpp_cga:

.ltorg

// *** 8 bit mono ***
.align 6
b preload_capture_line_ntsc_sixbits_8bpp_mono
capture_line_ntsc_sixbits_8bpp_mono:
push {lr}
ldr r12, =ntsc_status
ldr r12, [r12]
tst r12, #NTSC_ARTIFACT
beq no_ntsc_sixbits_8bpp_mono
SKIP_PSYNC_NO_OLD_CPLD_NTSC
mov r11, #0
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
loop_8bpp_mono_wide:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
NTSC_DECODE r5
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
NTSC_DECODE r6

WRITE_R5_R6_IF_LAST
cmp r1, #1
popeq {r0, pc}

WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
NTSC_DECODE r7
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
NTSC_DECODE r10

WRITE_R5_R6_R7_R10

subs r1, r1, #2
bne loop_8bpp_mono_wide
pop {r0, pc}

no_ntsc_sixbits_8bpp_mono:
SKIP_PSYNC_NO_OLD_CPLD_NTSC
loop_8bpp_mono6:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_LOW_BITS_8BPP_WIDE r11 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_HIGH_BITS_8BPP_WIDE r5 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_LOW_BITS_8BPP_WIDE r11 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_HIGH_BITS_8BPP_WIDE r6 // input in r8

WRITE_R5_R6_IF_LAST
cmp r1, #1
popeq {r0, pc}

WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_LOW_BITS_8BPP_WIDE r11 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_HIGH_BITS_8BPP_WIDE r7 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_LOW_BITS_8BPP_WIDE r11 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_HIGH_BITS_8BPP_WIDE r10 // input in r8

WRITE_R5_R6_R7_R10

subs r1, r1, #2
bne loop_8bpp_mono6

pop {r0, pc}
preload_capture_line_ntsc_sixbits_8bpp_mono:
PRELOAD_BITCOUNT
SETUP_DUMMY_PARAMETERS
b capture_line_ntsc_sixbits_8bpp_mono

.ltorg


// *** 8 bit mono auto ***
.align 6
b preload_capture_line_ntsc_sixbits_8bpp_mono_auto
capture_line_ntsc_sixbits_8bpp_mono_auto:
orr r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detecting colour burst
b capture_line_ntsc_sixbits_8bpp_mono
preload_capture_line_ntsc_sixbits_8bpp_mono_auto:
orr r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detecting colour burst
// falls into
// *** 8 bit mono ***
b preload_capture_line_ntsc_sixbits_8bpp_mono
capture_line_ntsc_sixbits_8bpp_mono:
push {lr}
ldr r12, =ntsc_status
ldr r12, [r12]
SKIP_PSYNC_NO_OLD_CPLD_NTSC // returns r9 != 0 if burst detected
eor r11, r12, #NTSC_Y_INVERT // invert signal so tests can cascade
eor r8, r12, #NTSC_Y_INVERT // invert signal so tests can cascade
cmp r9, #0 //no burst?
biceq r3, #BITDUP_LINE_CONDITION_DETECTED
tsteq r11, #NTSC_Y_INVERT
tsteq r8, #NTSC_Y_INVERT
biceq r12, #NTSC_ARTIFACT // if no burst and inverted video then force mono mode irrespective of artifact setting
mov r11, #0
tst r12, #NTSC_ARTIFACT
beq no_ntsc_sixbits_8bpp_mono

beq no_ntsc_sixbits_8bpp_mono_auto
mov r11, #0
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
Expand All @@ -849,7 +920,7 @@ capture_line_ntsc_sixbits_8bpp_mono:
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE
loop_8bpp_mono6:
loop_8bpp_mono6_auto:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_8BPP_MONO_WIDE // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
Expand Down Expand Up @@ -879,10 +950,10 @@ loop_8bpp_mono6:
WRITE_R5_R6_R7_R10

subs r1, r1, #2
bne loop_8bpp_mono6
bne loop_8bpp_mono6_auto
pop {r0, pc}

no_ntsc_sixbits_8bpp_mono:
no_ntsc_sixbits_8bpp_mono_auto:
loop_8bpp_mono6_auto_noburst:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_LOW_BITS_8BPP_WIDE r11 // input in r8
Expand Down Expand Up @@ -912,10 +983,10 @@ loop_8bpp_mono6_auto_noburst:
bne loop_8bpp_mono6_auto_noburst

pop {r0, pc}
preload_capture_line_ntsc_sixbits_8bpp_mono:
preload_capture_line_ntsc_sixbits_8bpp_mono_auto:
PRELOAD_BITCOUNT
SETUP_DUMMY_PARAMETERS
b capture_line_ntsc_sixbits_8bpp_mono
b capture_line_ntsc_sixbits_8bpp_mono_auto

.ltorg

Expand Down
6 changes: 2 additions & 4 deletions src/rgb_to_hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2890,8 +2890,7 @@ void setup_profile(int profile_changed) {

geometry_set_mode(mode7);
capinfo->palette_control = paletteControl;
if ((capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_CGA && ntsccolour == 0)
|| (capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_BW && ntsccolour == 0)) {
if ((capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_CGA && ntsccolour == 0)) {
capinfo->palette_control = PALETTECONTROL_OFF;
}
log_debug("Loading sample points");
Expand Down Expand Up @@ -3272,8 +3271,7 @@ void rgb_to_hdmi_main() {
cpld->update_capture_info(capinfo);
geometry_get_fb_params(capinfo);
capinfo->palette_control = paletteControl;
if ((capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_CGA && ntsccolour == 0)
|| (capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_BW && ntsccolour == 0)) {
if ((capinfo->palette_control == PALETTECONTROL_NTSCARTIFACT_CGA && ntsccolour == 0)) {
capinfo->palette_control = PALETTECONTROL_OFF;
}

Expand Down

0 comments on commit 3eaff55

Please sign in to comment.