NTSC output

This commit is contained in:
2026-04-01 13:56:21 +02:00
parent 4a4a4a6692
commit a894efd799
4 changed files with 117 additions and 98 deletions

View File

@@ -4,78 +4,53 @@
; - SM1: sync timing + line start IRQ
; - SM0: pixel output during active video
;
; Based on the same timing structure as alanpreed/pico-composite-video:
; 4us hsync, 6us back porch, 52us active video, 2us front porch,
; 288 active lines per field, interlaced fields.
; NTSC-compatible progressive timing using the same coarse 2us timing grid as
; the original PAL implementation:
; - 64us line period
; - 4us hsync
; - 6us back porch
; - 52us active video + front porch tail
; - 240 active lines, 262 total lines per frame (~59.64Hz)
.define DATA_DELAY 4
.define LINE_IRQ 0
.define DMA_IRQ 1
.define PUBLIC CLOCKS_PER_BIT DATA_DELAY + 2
.program cvsync
.side_set 1
; OSR = lines_per_field - 1
; Y = field flag: 0 = even field, !0 = odd field
; OSR = active_lines_per_frame - 1
.wrap_target
vsync_start:
; First set of short pulses:
; even field: 6
; odd field : 5
jmp !y set_even_counter side 0
set x, 3 side 1
jmp vsync_short_pulse side 1 [13]
set_even_counter:
set x, 4 side 1 [14]
vsync_short_pulse:
nop side 0
jmp x-- vsync_short_pulse [14] side 1
; Long sync pulses: always 5
set x, 4 side 0 [13]
vsync_long_start:
jmp !x vsync_long_end [1] side 1
jmp x-- vsync_long_start [13] side 0
vsync_long_end:
; Second set of short pulses:
; even field: 5
; odd field : 4
jmp !y set_even_counter_2 side 0
frame_start:
; 3 lines of broad vertical sync.
set x, 2 side 1
jmp flip_field_flag side 1 [12]
set_even_counter_2:
set x, 3 side 1 [13]
flip_field_flag:
mov y, !y side 1
vsync_short_pulse_2:
vsync_lines:
nop side 0 [14]
nop side 0
jmp x-- vsync_short_pulse_2 [14] side 1
; 17 blank lines
set x, 16 side 0 [1]
hsync_blank_start:
nop side 1 [14]
jmp !x hsync_blank_end side 1 [14]
jmp x-- hsync_blank_start side 0 [1]
hsync_blank_end:
jmp x-- vsync_lines side 1
; 288 active video lines
mov x, osr side 0 [1]
; 19 blank lines before active video.
set x, 18 side 1
hsync_video:
nop side 1 [2] ; 6us back porch
irq set LINE_IRQ side 1 [13] ; 52us active video
jmp !x vsync_start side 1 [12] ; 2us front porch (+ tail of active)
jmp x-- hsync_video side 0 [1] ; 4us hsync pulse
blank_lines:
irq set DMA_IRQ side 0 [1]
nop side 1 [14]
jmp x-- blank_lines side 1 [14]
; 240 active video lines.
mov x, osr side 1
active_lines:
irq set DMA_IRQ side 0 [1] ; 4us hsync, ask CPU to arm DMA
nop side 1 [2] ; 6us back porch
irq set LINE_IRQ side 1 [13] ; 28us visible video
jmp x-- active_lines side 1 [12]
jmp frame_start side 1 [12]
.wrap
@@ -92,8 +67,34 @@ hsync_video:
set pins, 0
mov y, x
wait 1 irq LINE_IRQ
irq clear LINE_IRQ
data_out:
out pins, 1 [DATA_DELAY]
jmp y-- data_out
.wrap
.wrap
.program cvdata_diag
; Diagnostic program:
; waits for each active line, then emits wide black/white bars without DMA.
; This isolates the analog output path from the framebuffer/DMA path.
.wrap_target
wait 1 irq LINE_IRQ
irq clear LINE_IRQ
set x, 3
diag_bars:
set pins, 1 [15]
nop [15]
nop [15]
set pins, 0 [15]
nop [15]
nop [15]
jmp x-- diag_bars [15]
set pins, 0
.wrap