kopia lustrzana https://github.com/hoglet67/RGBtoHDMI
Fix issues with auto ntsc artifact detection with Tandy CoCo
rodzic
ad2fa8a287
commit
77d14491b4
|
@ -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
|
154
src/rgb_to_fb.S
154
src/rgb_to_fb.S
|
@ -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
|
||||
// ======================================================================
|
||||
|
|
Ładowanie…
Reference in New Issue