MCUME/MCUME_pico/display/picovga.pio

69 wiersze
2.5 KiB
Plaintext

; ============================================================================
; VGA output - base layer (15 instructions)
;
; file derived from the PicoVGA project
; https://github.com/Panda381/PicoVGA
; by Miroslav Nemecek
;
; ============================================================================
; Control word of "dark" command (left shift):
; - bit 0..7 (8 bits) output color (set to 0 if not used)
; - bit 8..26 (19 bits) loop counter N
; - bit 27..31 (5 bits) jump address
; Control word of other commands (left shift):
; - bit 0..27 (27 bits) loop counter N
; - bit 27..31 (5 bits) jump address
; Clocks per pixel: minimum 2, maximum 17.
.program vga
.side_set 1 ; SYNC output (no opt, wait can be max. 15)
.origin 17 ; must load at offset 17 (BASE_OFF)
; ===== [3 instructions] SYNC pulse, N=delay in clock cycles - 3
public sync:
out x,27 side 1 ; [1] get length of SYNC pulse - 3, start of SYNC pulse
sync_loop:
jmp x--,sync_loop side 1 ; [N+1] loop
public entry:
out pc,5 side 1 ; [1] get next control word and jump to function
; ===== [4 instructions] DARK (or color) pulse, N=delay in clock cycles - 4
; Sets color output at time +1
public dark:
out x,19 side 0 ; [1] get length of delay pulse - 4, start of delay pulse
out pins,8 side 0 ; [1] dark output (or color)
dark_loop:
jmp x--,dark_loop side 0 ; [N+1] loop
out pc,5 side 0 ; [1] get next control word and jump to function
; ===== [4 instructions] layer synchronisation (delay 9 clock cycles)
; Output first pixel at time +9 after IRQ
public irqset:
irq clear 4 side 0 ; [1] clear IRQ4 flag
out null,27 side 0 ; [1] destroy command parameter
irq set 4 side 0 [5] ; [6] set IRQ flag
.wrap_target
out pc,5 side 0 ; [1] get next control word and jump to function
; ===== [4 instructions] output pixels at CPP clock, N=number of pixels-2 (number of pixels must be multiple of 4)
; Output first pixel at time +1
; Missing 2 clock cycles after last pixel
public output:
out x,27 side 0 ; [1] get number of pixels-2
output_loop:
public extra1:
out pins,8 side 0 [0] ; [1+CPP-2] output pixels (set extra wait CPP-2)
jmp x--,output_loop side 0 ; [1] loop
public extra2:
out pins,8 side 0 [0] ; [1+CPP-2] output pixels (set extra wait CPP-2)
; missing 1 extra clock cycles - add it to front porch
; wrap jump to instruction out pc,5
.wrap