From 9b004cd06bcb519332763ba3a78d82c7a8bff834 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 16:35:42 +0100 Subject: [PATCH 01/15] first alvin g implementation --- src/dmd_interface.h | 1 + src/dmd_interface_alving.pio | 40 ++++++++++++++++++++++++++++++++++++ src/dmdreader.cpp | 25 ++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 src/dmd_interface_alving.pio diff --git a/src/dmd_interface.h b/src/dmd_interface.h index cb8b0cb..4e60c5c 100644 --- a/src/dmd_interface.h +++ b/src/dmd_interface.h @@ -8,6 +8,7 @@ #include "dmd_interface_sam.pio.h" #include "dmd_interface_spike.pio.h" #endif +#include "dmd_interface_alving.pio.h" #include "dmd_interface_capcom.pio.h" #include "dmd_interface_capcom_hd.pio.h" #include "dmd_interface_desega.pio.h" diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio new file mode 100644 index 0000000..c8172cf --- /dev/null +++ b/src/dmd_interface_alving.pio @@ -0,0 +1,40 @@ +.define DE 7 +.define RDATA 6 +.define RCLK 5 +.define COLLAT 4 +.define DOTCLK 3 +.define SDATA 2 +.define FRAME_START_IRQ 5 + +.program dmd_reader_alving + ; initialize y with 16383, number of pixels (128x32x4) - 1 because counting starts at 0. + set x, 31 ; x = 31 (max 5-bit value) + in x, 5 ; shift in 5 bits, isr = 31 + set x, 31 ; x = 31 + in x, 5 ; shift in 5 bits, isr = 1023 + set x, 15 ; x = 15 + in x, 4 ; shift in 4 bits, isr = 16383 + mov y, isr ; y = 16383 + +.wrap_target + mov x, y ; load number of pixels + mov isr, null ; clear ISR and reset shift counter + + irq clear FRAME_START_IRQ + wait irq FRAME_START_IRQ + +dotloop: + wait 0 gpio DOTCLK ; falling edge + in null, 3 ; left padding with 3 zeros + wait 1 gpio DOTCLK ; raising edge + in pins 1 ; read pin data + jmp x-- dotloop +.wrap + +; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. +.program dmd_framedetect_alving +.wrap_target + wait 0 gpio RDATA + wait 1 gpio RDATA + irq FRAME_START_IRQ +.wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index ed430cb..227e72f 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -76,6 +76,7 @@ enum DmdType { DMD_DESEGA, DMD_SEGA_HD, DMD_GOTTLIEB, + DMD_ALVING, // CAPCOM need to be the last entries: DMD_CAPCOM, DMD_CAPCOM_HD, @@ -375,6 +376,11 @@ DmdType detect_dmd() { (de < 13100) && (rdata > 370) && (rdata < 410)) { return DMD_GOTTLIEB; + // Alvin G -> DOTCLK: 1117000 | DE: 8775 | RDATA: 68 + } else if ((dotclk > 1050000) && (dotclk < 1180000) && (de > 8550) && + (de < 9000) && (rdata > 60) && (rdata < 75)) { + return DMD_ALVING; + // Capcom -> DOTCLK: 4168000 | DE: 16280 | RDATA: 510 } else if ((dotclk > 4000000) && (dotclk < 4300000) && (de > 16000) && (de < 16500) && (rdata > 490) && (rdata < 530)) { @@ -849,6 +855,25 @@ void dmdreader_init() { break; } + case DMD_ALVING: { + uint input_pins[] = {RDATA}; + dmdreader_programs_init( + &dmd_reader_sam_program, dmd_reader_sam_program_get_default_config, + &dmd_framedetect_sam_program, + dmd_framedetect_sam_program_get_default_config, input_pins, 1, 0); + // the SAM reader can be used to process alvin g frames due to a very + // similar way of collecting pixel data + source_width = 128; + source_height = 32; + source_bitsperpixel = 4; + target_bitsperpixel = 4; + source_planesperframe = 1; // in SAM there is one plane + // with 4x line oversampling + source_lineoversampling = LINEOVERSAMPLING_4X; + source_mergeplanes = MERGEPLANES_NONE; + break; + } + case DMD_CAPCOM: { uint input_pins[] = {RDATA, RCLK}; dmdreader_programs_init(&dmd_reader_capcom_program, From 434f558d1d28a7b91e52e25fbeb0dcd8f83d5dc0 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 17:40:20 +0100 Subject: [PATCH 02/15] fixed alving autodetect --- src/dmdreader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 227e72f..19a3a3e 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -376,9 +376,9 @@ DmdType detect_dmd() { (de < 13100) && (rdata > 370) && (rdata < 410)) { return DMD_GOTTLIEB; - // Alvin G -> DOTCLK: 1117000 | DE: 8775 | RDATA: 68 - } else if ((dotclk > 1050000) && (dotclk < 1180000) && (de > 8550) && - (de < 9000) && (rdata > 60) && (rdata < 75)) { + // Alvin G -> DOTCLK: 1192000 | DE: 9400 | RDATA: 73 + } else if ((dotclk > 1150000) && (dotclk < 1250000) && (de > 9200) && + (de < 9600) && (rdata > 65) && (rdata < 80)) { return DMD_ALVING; // Capcom -> DOTCLK: 4168000 | DE: 16280 | RDATA: 510 From 8641136168b2a9a7d7ad84030b194ef9eca7c2e2 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 20:14:52 +0100 Subject: [PATCH 03/15] fix row start --- src/dmd_interface_alving.pio | 12 ++++++++++-- src/dmdreader.cpp | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index c8172cf..426904a 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -33,8 +33,16 @@ dotloop: ; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. .program dmd_framedetect_alving -.wrap_target wait 0 gpio RDATA wait 1 gpio RDATA - irq FRAME_START_IRQ +; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. +.wrap_target + set x, 31 ; 32 rows + +rclk_loop: + wait 1 gpio RCLK + wait 0 gpio RCLK + jmp x-- rclk_loop + nop [3] + irq PLANE_START_IRQ .wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 19a3a3e..dc3661f 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -858,16 +858,17 @@ void dmdreader_init() { case DMD_ALVING: { uint input_pins[] = {RDATA}; dmdreader_programs_init( - &dmd_reader_sam_program, dmd_reader_sam_program_get_default_config, - &dmd_framedetect_sam_program, - dmd_framedetect_sam_program_get_default_config, input_pins, 1, 0); + &dmd_reader_alving_program, + dmd_reader_alving_program_get_default_config, + &dmd_framedetect_alving_program, + dmd_framedetect_alving_program_get_default_config, input_pins, 1, 0); // the SAM reader can be used to process alvin g frames due to a very // similar way of collecting pixel data source_width = 128; source_height = 32; source_bitsperpixel = 4; target_bitsperpixel = 4; - source_planesperframe = 1; // in SAM there is one plane + source_planesperframe = 1; // in Alvin G there is one plane // with 4x line oversampling source_lineoversampling = LINEOVERSAMPLING_4X; source_mergeplanes = MERGEPLANES_NONE; From fc20a062583867c9479a4710bd29ed4d2e6c355d Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 20:16:52 +0100 Subject: [PATCH 04/15] add rclk, rename planestart to frame --- src/dmd_interface_alving.pio | 2 +- src/dmdreader.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 426904a..920bc28 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -44,5 +44,5 @@ rclk_loop: wait 0 gpio RCLK jmp x-- rclk_loop nop [3] - irq PLANE_START_IRQ + irq FRAME_START_IRQ .wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index dc3661f..8bf81a3 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -856,12 +856,12 @@ void dmdreader_init() { } case DMD_ALVING: { - uint input_pins[] = {RDATA}; + uint input_pins[] = {RDATA, RCLK}; dmdreader_programs_init( &dmd_reader_alving_program, dmd_reader_alving_program_get_default_config, &dmd_framedetect_alving_program, - dmd_framedetect_alving_program_get_default_config, input_pins, 1, 0); + dmd_framedetect_alving_program_get_default_config, input_pins, 2, 0); // the SAM reader can be used to process alvin g frames due to a very // similar way of collecting pixel data source_width = 128; From 2216bf5ef06ed0716df0241d861f23663e2c23fe Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 20:56:39 +0100 Subject: [PATCH 05/15] fixed pixel vals and adjusted row selection --- src/dmd_interface_alving.pio | 2 +- src/dmdreader.cpp | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 920bc28..c0b49c2 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -37,7 +37,7 @@ dotloop: wait 1 gpio RDATA ; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. .wrap_target - set x, 31 ; 32 rows + set x, 30 ; 32 rows rclk_loop: wait 1 gpio RCLK diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 8bf81a3..a17825b 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -634,17 +634,32 @@ void dmd_dma_handler() { src4 = src3 + source_dwordsperline; uint32_t v; - for (int l = 0; l < source_height; l++) { - for (int w = 0; w < source_dwordsperline; w++) { - // On SAM line order is really messed up :-( - v = src4[w] * 8 + src3[w] * 1 + src2[w] * 4 + src1[w] * 2; - dst[w] = v; + if (dmd_type == DMD_SAM) { + for (int l = 0; l < source_height; l++) { + for (int w = 0; w < source_dwordsperline; w++) { + // On SAM line order is really messed up :-( + v = src4[w] * 8 + src3[w] * 1 + src2[w] * 4 + src1[w] * 2; + dst[w] = v; + } + src1 += source_dwordsperline * 4; // source skips 4 lines forward + src2 += source_dwordsperline * 4; + src3 += source_dwordsperline * 4; + src4 += source_dwordsperline * 4; + dst += source_dwordsperline; // destination skips only one line + } + } else { // Alvin G + for (int l = 0; l < source_height; l++) { + for (int w = 0; w < source_dwordsperline; w++) { + // On SAM line order is really messed up :-( + v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; + dst[w] = v; + } + src1 += source_dwordsperline * 4; // source skips 4 lines forward + src2 += source_dwordsperline * 4; + src3 += source_dwordsperline * 4; + src4 += source_dwordsperline * 4; + dst += source_dwordsperline; // destination skips only one line } - src1 += source_dwordsperline * 4; // source skips 4 lines forward - src2 += source_dwordsperline * 4; - src3 += source_dwordsperline * 4; - src4 += source_dwordsperline * 4; - dst += source_dwordsperline; // destination skips only one line } } } From b467f9c829a643aefc9e48edef8b65c00ee5efe9 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 21:00:56 +0100 Subject: [PATCH 06/15] back to 31.. --- src/dmd_interface_alving.pio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index c0b49c2..920bc28 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -37,7 +37,7 @@ dotloop: wait 1 gpio RDATA ; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. .wrap_target - set x, 30 ; 32 rows + set x, 31 ; 32 rows rclk_loop: wait 1 gpio RCLK From f80c43544fd0ed0d9ae3a5cce3ca5ef02d24e134 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 21:19:19 +0100 Subject: [PATCH 07/15] adjust to max 4-3-4-3 --- src/dmdreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index a17825b..5721484 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -651,7 +651,7 @@ void dmd_dma_handler() { for (int l = 0; l < source_height; l++) { for (int w = 0; w < source_dwordsperline; w++) { // On SAM line order is really messed up :-( - v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; + v = src4[w] * 4 + src3[w] * 3 + src2[w] * 4 + src1[w] * 3; dst[w] = v; } src1 += source_dwordsperline * 4; // source skips 4 lines forward From 0958a82674eca2cc1864cab89733a47dd87dc894 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Tue, 23 Dec 2025 22:04:09 +0100 Subject: [PATCH 08/15] start when RDATA goes low?? --- src/dmd_interface_alving.pio | 13 +++---------- src/dmdreader.cpp | 2 +- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 920bc28..6473beb 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -33,16 +33,9 @@ dotloop: ; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. .program dmd_framedetect_alving - wait 0 gpio RDATA - wait 1 gpio RDATA -; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. .wrap_target - set x, 31 ; 32 rows - -rclk_loop: - wait 1 gpio RCLK - wait 0 gpio RCLK - jmp x-- rclk_loop - nop [3] + wait 1 gpio RDATA + wait 0 gpio RDATA irq FRAME_START_IRQ .wrap + diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 5721484..a17825b 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -651,7 +651,7 @@ void dmd_dma_handler() { for (int l = 0; l < source_height; l++) { for (int w = 0; w < source_dwordsperline; w++) { // On SAM line order is really messed up :-( - v = src4[w] * 4 + src3[w] * 3 + src2[w] * 4 + src1[w] * 3; + v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; dst[w] = v; } src1 += source_dwordsperline * 4; // source skips 4 lines forward From dc7788d3d0d10f60a4391b9118b9682cc0baa373 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 12:57:52 +0100 Subject: [PATCH 09/15] extra RCLK to skip a row --- src/dmd_interface_alving.pio | 1 + src/dmdreader.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 6473beb..ea48e61 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -36,6 +36,7 @@ dotloop: .wrap_target wait 1 gpio RDATA wait 0 gpio RDATA + wait 0 gpio RCLK irq FRAME_START_IRQ .wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index a17825b..2be1e1d 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -650,7 +650,7 @@ void dmd_dma_handler() { } else { // Alvin G for (int l = 0; l < source_height; l++) { for (int w = 0; w < source_dwordsperline; w++) { - // On SAM line order is really messed up :-( + // First row/plane captured counts as intensity level 3 <-- v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; dst[w] = v; } From cba2d12077d89fb4b51f0176173fa2f009f94dfe Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 13:05:43 +0100 Subject: [PATCH 10/15] alvin g added to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 27f8bde..45249e9 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Since not any consumer (especially the Raspberry Pi) can act as an SPI slave thi * Stern SPIKE 1 -> 128x32 * Capcom -> 128x32 * Gottlieb/Premier -> 128x32 +* Alvin G. & Co-> 128x32 ## Reading data From 6b779e8fb7a0cda47a3f7eca309f7d9642b54f16 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 14:10:20 +0100 Subject: [PATCH 11/15] change framedetect loop --- src/dmd_interface_alving.pio | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index ea48e61..7a6e5f4 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -33,10 +33,17 @@ dotloop: ; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. .program dmd_framedetect_alving -.wrap_target - wait 1 gpio RDATA wait 0 gpio RDATA + wait 1 gpio RDATA +; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. +.wrap_target + set x, 31 ; 32 rows + +rclk_loop: wait 0 gpio RCLK + wait 1 gpio RCLK + jmp x-- rclk_loop + nop [3] irq FRAME_START_IRQ .wrap From adea0261a999307b63764381f7b8f3176a7c0d0d Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 14:11:51 +0100 Subject: [PATCH 12/15] remove nop --- src/dmd_interface_alving.pio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 7a6e5f4..bcd0366 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -43,7 +43,7 @@ rclk_loop: wait 0 gpio RCLK wait 1 gpio RCLK jmp x-- rclk_loop - nop [3] + irq FRAME_START_IRQ .wrap From 6e6f4e1dc0eea94e8264926576e1bd5f122d2816 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 15:03:10 +0100 Subject: [PATCH 13/15] restart with reader --- src/dmd_interface_alving.pio | 10 +--------- src/dmdreader.cpp | 7 +++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index bcd0366..979d51b 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -33,17 +33,9 @@ dotloop: ; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. .program dmd_framedetect_alving +.wrap_target wait 0 gpio RDATA wait 1 gpio RDATA -; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. -.wrap_target - set x, 31 ; 32 rows - -rclk_loop: - wait 0 gpio RCLK - wait 1 gpio RCLK - jmp x-- rclk_loop - irq FRAME_START_IRQ .wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 2be1e1d..6953aba 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -650,8 +650,8 @@ void dmd_dma_handler() { } else { // Alvin G for (int l = 0; l < source_height; l++) { for (int w = 0; w < source_dwordsperline; w++) { - // First row/plane captured counts as intensity level 3 <-- - v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; + // First row captured counts as intensity level 3 <-- + v = src4[w] * 2 + src3[w] * 2 + src2[w] * 2 + src1[w] * 2; dst[w] = v; } src1 += source_dwordsperline * 4; // source skips 4 lines forward @@ -877,8 +877,7 @@ void dmdreader_init() { dmd_reader_alving_program_get_default_config, &dmd_framedetect_alving_program, dmd_framedetect_alving_program_get_default_config, input_pins, 2, 0); - // the SAM reader can be used to process alvin g frames due to a very - // similar way of collecting pixel data + source_width = 128; source_height = 32; source_bitsperpixel = 4; From 491a465d7866497296c16f624cd08783b64f7b12 Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 17:30:28 +0100 Subject: [PATCH 14/15] use row skipping and then skip a few collats --- README.md | 2 +- src/dmd_interface_alving.pio | 17 ++++++++++++++++- src/dmdreader.cpp | 6 +++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 45249e9..6f69d6e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Since not any consumer (especially the Raspberry Pi) can act as an SPI slave thi * Stern SPIKE 1 -> 128x32 * Capcom -> 128x32 * Gottlieb/Premier -> 128x32 -* Alvin G. & Co-> 128x32 +* Alvin G. & Co -> 128x32 ## Reading data diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 979d51b..7b92aaf 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -33,9 +33,24 @@ dotloop: ; Frame detection program runs in parallel to the reader program and signals the start of a new frame using an IRQ. .program dmd_framedetect_alving -.wrap_target wait 0 gpio RDATA wait 1 gpio RDATA +; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. +.wrap_target + set x, 31 ; 32 rows + +rclk_loop: + wait 0 gpio RCLK + wait 1 gpio RCLK + jmp x-- rclk_loop + + wait 0 gpio COLLAT + wait 1 gpio COLLAT + wait 0 gpio COLLAT + wait 1 gpio COLLAT + wait 0 gpio COLLAT + wait 1 gpio COLLAT + irq FRAME_START_IRQ .wrap diff --git a/src/dmdreader.cpp b/src/dmdreader.cpp index 6953aba..853e9bb 100644 --- a/src/dmdreader.cpp +++ b/src/dmdreader.cpp @@ -651,7 +651,7 @@ void dmd_dma_handler() { for (int l = 0; l < source_height; l++) { for (int w = 0; w < source_dwordsperline; w++) { // First row captured counts as intensity level 3 <-- - v = src4[w] * 2 + src3[w] * 2 + src2[w] * 2 + src1[w] * 2; + v = src4[w] * 4 + src3[w] * 4 + src2[w] * 4 + src1[w] * 3; dst[w] = v; } src1 += source_dwordsperline * 4; // source skips 4 lines forward @@ -871,7 +871,7 @@ void dmdreader_init() { } case DMD_ALVING: { - uint input_pins[] = {RDATA, RCLK}; + uint input_pins[] = {RDATA, RCLK, COLLAT}; dmdreader_programs_init( &dmd_reader_alving_program, dmd_reader_alving_program_get_default_config, @@ -895,7 +895,7 @@ void dmdreader_init() { dmd_reader_capcom_program_get_default_config, &dmd_framedetect_capcom_program, dmd_framedetect_capcom_program_get_default_config, - input_pins, 2, 0); + input_pins, 3, 0); source_width = 128; source_height = 32; From b5dffbbbe35aff81fc552ff3bb0bcc4fa9e783be Mon Sep 17 00:00:00 2001 From: Jan Vos Date: Wed, 24 Dec 2025 23:09:08 +0100 Subject: [PATCH 15/15] clean up code --- src/dmd_interface_alving.pio | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dmd_interface_alving.pio b/src/dmd_interface_alving.pio index 7b92aaf..48dd3f4 100644 --- a/src/dmd_interface_alving.pio +++ b/src/dmd_interface_alving.pio @@ -36,20 +36,20 @@ dotloop: wait 0 gpio RDATA wait 1 gpio RDATA ; When RDATA turned HIGH, we already missed the start of the first row, so we skip 32 end of rows before sending the first IRQ. +; Alvin G needs to skip 3 COLLAT edges right after for a correct starting point. .wrap_target set x, 31 ; 32 rows + set y, 2 ; 3 COLLAT edges rclk_loop: wait 0 gpio RCLK wait 1 gpio RCLK jmp x-- rclk_loop +collat_loop: wait 0 gpio COLLAT wait 1 gpio COLLAT - wait 0 gpio COLLAT - wait 1 gpio COLLAT - wait 0 gpio COLLAT - wait 1 gpio COLLAT + jmp y-- collat_loop irq FRAME_START_IRQ .wrap