Fix issues with auto ntsc artifact detection with Tandy CoCo

pull/229/head
IanSB 2021-06-15 16:23:20 +01:00
rodzic ad2fa8a287
commit 77d14491b4
2 zmienionych plików z 180 dodań i 91 usunięć

Wyświetl plik

@ -152,8 +152,8 @@ skip_psync_loop_no_old\@:
eor r9, r8, r8, lsr #3
tst r9, #(0x05 << PIXEL_BASE)
tsteq r9, #(0x05 << (PIXEL_BASE + 6))
biceq r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detect if any U/V content
tstne r9, #(0x05 << (PIXEL_BASE + 6))
orreq r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detect if any U/V content
and r9, r8, #(0x12 << PIXEL_BASE)
and r14, r8, #(0x12 << (PIXEL_BASE + 6))
@ -175,8 +175,8 @@ skip_psync_loop_no_old\@:
eor r9, r8, r8, lsr #3
tst r9, #(0x05 << PIXEL_BASE)
tsteq r9, #(0x05 << (PIXEL_BASE + 6))
biceq r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detect if any U/V content
tstne r9, #(0x05 << (PIXEL_BASE + 6))
orreq r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detect if any U/V content
and r9, r8, #(0x3f << PIXEL_BASE)
and r14, r8, #(0x3f << (PIXEL_BASE + 6))
@ -1211,15 +1211,7 @@ full_loop_8bpp_mono6_auto:
.align 6
// *** 8 bit mono double auto ***
b preload_capture_line_ntsc_sixbits_double_8bpp_mono_auto
capture_line_ntsc_sixbits_double_8bpp_mono_auto:
orr r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detecting UV non monochrome
b capture_line_ntsc_sixbits_double_8bpp_mono
preload_capture_line_ntsc_sixbits_double_8bpp_mono_auto:
orr r3, r3, #BITDUP_LINE_CONDITION_DETECTED //detecting UV non monochrome
// falls into
// *** 8 bit mono double***
// *** 8 bit mono double ***
b preload_capture_line_ntsc_sixbits_double_8bpp_mono
capture_line_ntsc_sixbits_double_8bpp_mono:
push {lr}
@ -1233,6 +1225,93 @@ capture_line_ntsc_sixbits_double_8bpp_mono:
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE
loop_8bppndm:
WAIT_FOR_PSYNC_EDGE // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE // input in r8
mov r11, r11, lsr #1
NTSC_DECODE r5
NTSC_DECODE_FINAL r5
mov r11, r11, lsl #1
WAIT_FOR_PSYNC_EDGE // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE // input in r8
mov r11, r11, lsr #1
NTSC_DECODE r6
NTSC_DECODE_FINAL r6
mov r11, r11, lsl #1
WRITE_R5_R6_IF_LAST
cmp r1, #1
bic r3, r3, #BITDUP_LINE_CONDITION_DETECTED
popeq {r0, pc}
WAIT_FOR_PSYNC_EDGE // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE // input in r8
mov r11, r11, lsr #1
NTSC_DECODE r7
NTSC_DECODE_FINAL r7
mov r11, r11, lsl #1
WAIT_FOR_PSYNC_EDGE // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE // input in r8
mov r11, r11, lsr #1
NTSC_DECODE r10
NTSC_DECODE_FINAL r10
mov r11, r11, lsl #1
WRITE_R5_R6_R7_R10
subs r1, r1, #2
bne loop_8bppndm
bic r3, r3, #BITDUP_LINE_CONDITION_DETECTED
pop {r0, pc}
preload_capture_line_ntsc_sixbits_double_8bpp_mono:
PRELOAD_BITCOUNT
SETUP_DUMMY_PARAMETERS
b capture_line_ntsc_sixbits_double_8bpp_mono
no_ntsc_sixbits_double_8bpp_mono:
SKIP_PSYNC_NO_OLD_CPLD_NTSC // returns with ntsc_status in r12
loop_8bppdm:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_WIDE r11 r5 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_WIDE r11 r6 // input in r8
WRITE_R5_R6_IF_LAST
cmp r1, #1
bic r3, r3, #BITDUP_LINE_CONDITION_DETECTED
popeq {r0, pc}
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_WIDE r11 r7 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_WIDE r11 r10 // input in r8
WRITE_R5_R6_R7_R10
subs r1, r1, #2
bne loop_8bppdm
bic r3, r3, #BITDUP_LINE_CONDITION_DETECTED
pop {r0, pc}
.ltorg
.align 6
// *** 8 bit mono double auto ***
b preload_capture_line_ntsc_sixbits_double_8bpp_mono_auto
capture_line_ntsc_sixbits_double_8bpp_mono_auto:
push {lr}
ldr r12, =ntsc_status
ldr r12, [r12]
tst r12, #NTSC_ARTIFACT
beq no_ntsc_sixbits_double_8bpp_mono_auto
SKIP_PSYNC_NO_OLD_CPLD_NTSC // returns with ntsc_status in r12
mov r11, #0
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE
WAIT_FOR_PSYNC_EDGE_FAST
NTSC_CAPTURE_BITS_DOUBLE_8BPP_MONO_WIDE
loop_8bppnd_auto:
WAIT_FOR_PSYNC_EDGE // expects GPLEV0 in r4, result in r8
@ -1269,17 +1348,16 @@ loop_8bppnd_auto:
subs r1, r1, #2
bne loop_8bppnd_auto
pop {r0, pc}
preload_capture_line_ntsc_sixbits_double_8bpp_mono:
preload_capture_line_ntsc_sixbits_double_8bpp_mono_auto:
PRELOAD_BITCOUNT
SETUP_DUMMY_PARAMETERS
b capture_line_ntsc_sixbits_double_8bpp_mono
b capture_line_ntsc_sixbits_double_8bpp_mono_auto
no_ntsc_sixbits_double_8bpp_mono:
no_ntsc_sixbits_double_8bpp_mono_auto:
SKIP_PSYNC_NO_OLD_CPLD_NTSC // returns with ntsc_status in r12
loop_8bppd:
loop_8bppd_auto:
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
NTSC_CAPTURE_BITS_DOUBLE_8BPP_WIDE r11 r5 // input in r8
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
@ -1297,8 +1375,7 @@ loop_8bppd:
WRITE_R5_R6_R7_R10
subs r1, r1, #2
bne loop_8bppd
bne loop_8bppd_auto
pop {r0, pc}
.ltorg

Wyświetl plik

@ -93,73 +93,9 @@ rgb_to_fb:
push {r4-r12, lr}
// Save the capture_info_t parameters to absolute addresses
ldr r2, [r0, #O_FB_PITCH]
str r2, param_fb_pitch
ldr r2, [r0, #O_FB_WIDTH]
str r2, param_fb_width
ldr r2, [r0, #O_FB_HEIGHT]
str r2, param_fb_height
ldr r2, [r0, #O_FB_SIZEX2]
str r2, param_fb_sizex2
ldr r2, [r0, #O_FB_BPP]
str r2, param_fb_bpp
ldr r2, [r0, #O_CHARS_PER_LINE]
str r2, param_chars_per_line
ldr r2, [r0, #O_NLINES]
str r2, param_nlines
ldr r2, [r0, #O_H_OFFSET]
str r2, param_h_offset
ldr r2, [r0, #O_V_OFFSET]
str r2, param_v_offset
ldr r2, [r0, #O_NCAPTURE]
str r2, param_ncapture
ldr r2, [r0, #O_CAPTURE_LINE]
str r2, param_capture_line
ldr r2, [r0, #O_PALETTE_CONTROL]
str r2, param_palette_control
ldr r2, [r0, #O_SAMPLE_WIDTH]
str r2, param_sample_width
ldr r2, [r0, #O_H_ADJUST]
str r2, param_h_adjust
ldr r2, [r0, #O_V_ADJUST]
str r2, param_v_adjust
ldr r2, [r0, #O_SYNCTYPE]
str r2, param_sync_type
ldr r3, [r0, #O_DETSYNCTYPE]
str r3, param_detected_sync_type
ldr r2, [r0, #O_VSYNCTYPE]
str r2, param_vsync_type
ldr r2, [r0, #O_VIDEOTYPE]
str r2, param_video_type
bic r1, r1, #BIT_INTERLACED_VIDEO
cmp r2, #0 //VIDEO_PROGRESSIVE;
tstne r3, #SYNC_BIT_INTERLACED
orrne r1, r1, #BIT_INTERLACED_VIDEO
ldr r2, [r0, #O_NTSCPHASE]
str r2, param_ntscphase
ldr r2, [r0, #O_BORDER]
str r2, param_border
ldr r2, [r0, #O_DELAY]
str r2, param_delay
ldr r2, [r0, #O_INTENSITY]
and r2, r2, #0x0f
eor r2, r2, #0x0f
mov r2, r2, lsl #12
orr r2, r2, lsl #16
str r2, param_intensity
ldr r2, [r0, #O_AUTOSWITCH]
str r2, param_autoswitch
ldr r2, [r0, #O_TIMINGSET]
str r2, param_timingset
ldr r2, [r0, #O_FB_BASE]
str r2, param_framebuffer0
bl get_params
ldr r9, ntsc_status
and r9, #NTSC_ARTIFACT_REQUIRED // last detected burst state
ldr r8, param_ntscphase // 3 bits phase + 1 bit artifact on/off + 1 bit Y invert
orr r9, r9, r8
str r9, ntsc_status
// Sanity check chars_per_line <= fb_pitch
ldr r3, param_fb_pitch
@ -859,10 +795,10 @@ skip_all_lines:
cmp r9, #PALETTECONTROL_NTSCARTIFACT_BW_AUTO
bne check_dpms
ldr r8, param_fb_sizex2
tst r8, #SIZEX2_DOUBLE_WIDTH
ldr r6, param_fb_sizex2
tst r6, #SIZEX2_DOUBLE_WIDTH
moveq r8, #ARTIFACT_DETECTED_LINE_COUNT
movne r8, #(ARTIFACT_DETECTED_LINE_COUNT << 1)
movne r8, #1
ldr r9, ntsc_status
mov r11, r9
@ -870,6 +806,9 @@ skip_all_lines:
bic r9, r9, #NTSC_ARTIFACT_REQUIRED
orrge r9, r9, #NTSC_ARTIFACT_REQUIRED
tst r6, #SIZEX2_DOUBLE_WIDTH
eorne r9, r9, #NTSC_ARTIFACT_REQUIRED
eor r11, r11, r9
tst r11, #NTSC_ARTIFACT_REQUIRED
mov r11, r9, lsr #NTSC_ARTIFACT_REQUIRED_SHIFT
@ -1331,8 +1270,7 @@ frame_minimum:
.word 10000000
line_minimum:
.word 20000
frame_timeout:
.word 24000000
hsync_scroll:
.word (4000 - 224) | ((4000 + 224) << 16)
line_timeout:
@ -1344,6 +1282,76 @@ dpmsframecount:
dpms_state:
.word 0
get_params:
// Save the capture_info_t parameters to absolute addresses
ldr r2, [r0, #O_FB_PITCH]
str r2, param_fb_pitch
ldr r2, [r0, #O_FB_WIDTH]
str r2, param_fb_width
ldr r2, [r0, #O_FB_HEIGHT]
str r2, param_fb_height
ldr r2, [r0, #O_FB_SIZEX2]
str r2, param_fb_sizex2
ldr r2, [r0, #O_FB_BPP]
str r2, param_fb_bpp
ldr r2, [r0, #O_CHARS_PER_LINE]
str r2, param_chars_per_line
ldr r2, [r0, #O_NLINES]
str r2, param_nlines
ldr r2, [r0, #O_H_OFFSET]
str r2, param_h_offset
ldr r2, [r0, #O_V_OFFSET]
str r2, param_v_offset
ldr r2, [r0, #O_NCAPTURE]
str r2, param_ncapture
ldr r2, [r0, #O_CAPTURE_LINE]
str r2, param_capture_line
ldr r2, [r0, #O_PALETTE_CONTROL]
str r2, param_palette_control
ldr r2, [r0, #O_SAMPLE_WIDTH]
str r2, param_sample_width
ldr r2, [r0, #O_H_ADJUST]
str r2, param_h_adjust
ldr r2, [r0, #O_V_ADJUST]
str r2, param_v_adjust
ldr r2, [r0, #O_SYNCTYPE]
str r2, param_sync_type
ldr r3, [r0, #O_DETSYNCTYPE]
str r3, param_detected_sync_type
ldr r2, [r0, #O_VSYNCTYPE]
str r2, param_vsync_type
ldr r2, [r0, #O_VIDEOTYPE]
str r2, param_video_type
bic r1, r1, #BIT_INTERLACED_VIDEO
cmp r2, #0 //VIDEO_PROGRESSIVE;
tstne r3, #SYNC_BIT_INTERLACED
orrne r1, r1, #BIT_INTERLACED_VIDEO
ldr r2, [r0, #O_NTSCPHASE]
str r2, param_ntscphase
ldr r2, [r0, #O_BORDER]
str r2, param_border
ldr r2, [r0, #O_DELAY]
str r2, param_delay
ldr r2, [r0, #O_INTENSITY]
and r2, r2, #0x0f
eor r2, r2, #0x0f
mov r2, r2, lsl #12
orr r2, r2, lsl #16
str r2, param_intensity
ldr r2, [r0, #O_AUTOSWITCH]
str r2, param_autoswitch
ldr r2, [r0, #O_TIMINGSET]
str r2, param_timingset
ldr r2, [r0, #O_FB_BASE]
str r2, param_framebuffer0
ldr r9, ntsc_status
and r9, #NTSC_ARTIFACT_REQUIRED // last detected burst state
ldr r8, param_ntscphase // 3 bits phase + 1 bit artifact on/off + 1 bit Y invert
orr r9, r9, r8
str r9, ntsc_status
mov pc, r14
key_press_reset:
push {r4-r12, lr}
@ -1359,6 +1367,10 @@ key_press_reset:
pop {r4-r12, lr}
mov pc, lr
frame_timeout:
.word 24000000
// ======================================================================
// WAIT_FOR_VSYNC
// ======================================================================