swapforth
1\ Send a buffer as a sequence of run/literal pairs
2\ a pair looks like:
3\ #-to-repeat #-to-insert <literals>
4\
5\ The initial value at the start of the run is 0
6\
7variable tx
8
9: send-length ( u -- )
102/ 2/
11begin
12dup 254 >
13while
14255 -
15$ff emit
16repeat
17emit
18;
19
20: flush ( mode a -- mode )
21over if
22tx @ 2dup - ( a tx u -- )
23dup send-length type
24else
25dup tx @ -
26send-length
27then
28tx !
29invert
30;
31
32: rlc
332dup + >r \ end-of-buffer
34over tx !
350 0 ( mode prev )
362swap
37bounds do
38i @ <> ( mode cmp )
39over xor ( mode ok )
40if
41i flush
42then
43i @ ( mode prev )
444 +loop
45drop
46r> flush
47if
480 send-length
49then
50;
51
52: send32
53pad !
54pad 4 type
55;
56
57hex
5800302010 ( 00102410 ) constant REG_SCREENSHOT_EN \ Set to enable screenshot mode
5900302014 ( 00102414 ) constant REG_SCREENSHOT_Y \ Y line register
6000302018 ( 00102418 ) constant REG_SCREENSHOT_START \ Screenshot start trigger
61003020e8 ( 001024d8 ) constant REG_SCREENSHOT_BUSY \ Screenshot ready flags
6200302174 ( 00102554 ) constant REG_SCREENSHOT_READ \ Set to enable readout
63003c2000 ( 001c2000 ) constant RAM_SCREENSHOT \ Screenshot readout buffer
64decimal
65
66: GD.screenshot
67GD.finish
681 REG_SCREENSHOT_EN GD.c!
69GD.REG_PCLK GD.@
700 GD.REG_PCLK GD.c!
71cr ." !screenshot"
72GD.REG_HSIZE GD.@ send32 GD.REG_VSIZE GD.@ send32
73GD.REG_VSIZE GD.@ 0 do
74i REG_SCREENSHOT_Y GD.!
751 REG_SCREENSHOT_START GD.c!
76begin
77REG_SCREENSHOT_BUSY dup GD.@
78swap cell+ GD.@ or 0=
79until
801 REG_SCREENSHOT_READ GD.c!
81pad GD.REG_HSIZE GD.@ cells RAM_SCREENSHOT GD.move
82pad GD.REG_HSIZE GD.@ 4 * rlc \ type
830 REG_SCREENSHOT_READ GD.c!
84loop
850 REG_SCREENSHOT_EN GD.!
86GD.REG_PCLK GD.c!
87\ key [char] k <> 100 and throw
88;
89