--- /dev/null
+cmake_minimum_required(VERSION 3.28)
+include(${PICO_SDK_PATH}/external/pico_sdk_import.cmake)
+project(rp2350-tga C CXX ASM)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
+pico_sdk_init()
+
+add_executable(tga tga.c)
+
+pico_generate_pio_header(tga ../tga.pio)
+
+target_link_libraries(tga pico_stdlib hardware_pio)
+
+pico_add_extra_outputs(tga)
--- /dev/null
+#include "pico/stdlib.h"
+#include "hardware/pio.h"
+#include "hardware/clocks.h"
+
+#include "tga.pio.h"
+
+int main() {
+ PIO pio;
+ int hsync_offset, vsync_offset;
+
+ pio = pio0;
+ hsync_offset = pio_add_program(pio, &hsync_rgb_program);
+ vsync_offset = pio_add_program(pio, &vsync_i_program);
+
+ vsync_i_program_init(pio, 3, vsync_offset);
+ hsync_rgb_program_init(pio, 0, hsync_offset, RED);
+ hsync_rgb_program_init(pio, 1, hsync_offset, GREEN);
+ hsync_rgb_program_init(pio, 2, hsync_offset, BLUE);
+
+ while (true) {
+ pio_sm_put(pio, 0, -1);
+ pio_sm_put(pio, 1, 0);
+ pio_sm_put(pio, 2, 0);
+ pio_sm_put(pio, 3, -1);
+ }
+}
--- /dev/null
+.program hsync_rgb
+.side_set 1
+
+ wait 1 gpio 5 side 0 ; INTENSITY pin
+
+ set x 20 side 0 [13]
+wait_outer:
+ set y 18 side 0
+wait_inner:
+ jmp y-- wait_inner side 0
+ jmp x-- wait_outer side 0
+
+ nop side 0 [15]
+ nop side 0 [15]
+ nop side 0 [15]
+ nop side 1 [15]
+ nop side 1 [15]
+ nop side 0 [15]
+ nop side 0 [15]
+ nop side 0 [15]
+
+ set x 9 side 0 [7]
+outer:
+ out pins 1 side 0
+ set y 13 side 0
+inner:
+ out pins 1 side 0
+ jmp y-- inner side 0
+ out pins 1 side 0
+ jmp x-- outer side 0
+
+% c-sdk {
+enum {
+ HSYNC,
+ VSYNC,
+ RED,
+ GREEN,
+ BLUE,
+ INTENSITY,
+};
+
+static inline void hsync_rgb_program_init(PIO pio, uint sm, uint offset, uint out_pin) {
+ pio_sm_config c;
+ float div;
+
+ pio_gpio_init(pio, out_pin);
+ if (out_pin == RED) pio_gpio_init(pio, HSYNC);
+
+ c = hsync_rgb_program_get_default_config(offset);
+ sm_config_set_out_pins(&c, out_pin, 1);
+ sm_config_set_out_shift(&c, false, true, 32);
+ if (out_pin == RED) sm_config_set_sideset_pins(&c, HSYNC);
+
+ div = clock_get_hz(clk_sys) / 7159157.0f;
+ sm_config_set_clkdiv(&c, div);
+
+ pio_sm_init(pio, sm, offset, &c);
+ pio_sm_set_enabled(pio, sm, true);
+}
+%}
+
+.program vsync_i
+.side_set 1
+
+ set pins 0 side 0 [8]
+ nop side 1 [2]
+ nop side 0 [15]
+ nop side 0 [6]
+
+ set pins 1 side 0
+ set x 14 side 0
+outer:
+ set y 12 side 0
+inner:
+ jmp y-- inner side 0
+ jmp x-- outer side 0
+
+% c-sdk {
+static inline void vsync_i_program_init(PIO pio, uint sm, uint offset) {
+ pio_sm_config c;
+ float div;
+
+ pio_gpio_init(pio, INTENSITY);
+ pio_gpio_init(pio, VSYNC);
+
+ c = hsync_rgb_program_get_default_config(offset);
+ sm_config_set_out_pins(&c, INTENSITY, 1);
+ sm_config_set_sideset_pins(&c, VSYNC);
+
+ div = clock_get_hz(clk_sys) / 15701.0f;
+ sm_config_set_clkdiv(&c, div);
+
+ pio_sm_init(pio, sm, offset, &c);
+ pio_sm_set_enabled(pio, sm, true);
+}
+%}