New dma layout
This commit is contained in:
115
video_dma.pio
115
video_dma.pio
@@ -4,53 +4,79 @@
|
||||
; - SM1: sync timing + line start IRQ
|
||||
; - SM0: pixel output during active video
|
||||
;
|
||||
; 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)
|
||||
; 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.
|
||||
|
||||
.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 = active_lines_per_frame - 1
|
||||
; OSR = lines_per_field - 1
|
||||
; Y = field flag: 0 = even field, !0 = odd field
|
||||
|
||||
.wrap_target
|
||||
frame_start:
|
||||
; 3 lines of broad vertical sync.
|
||||
set x, 2 side 1
|
||||
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]
|
||||
|
||||
vsync_lines:
|
||||
nop side 0 [14]
|
||||
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
|
||||
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:
|
||||
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-- vsync_lines side 1
|
||||
jmp !x hsync_blank_end side 1 [14]
|
||||
jmp x-- hsync_blank_start side 0 [1]
|
||||
hsync_blank_end:
|
||||
|
||||
; 19 blank lines before active video.
|
||||
set x, 18 side 1
|
||||
; 288 active video lines
|
||||
mov x, osr side 0 [1]
|
||||
|
||||
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]
|
||||
hsync_video:
|
||||
in null, 32 side 1 ; 2us back porch, prepare CPU token
|
||||
push noblock side 1 [1] ; 4us more back porch, notify CPU early
|
||||
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
|
||||
.wrap
|
||||
|
||||
|
||||
@@ -73,28 +99,3 @@ data_out:
|
||||
out pins, 1 [DATA_DELAY]
|
||||
jmp y-- data_out
|
||||
.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
|
||||
|
||||
Reference in New Issue
Block a user