uxn-notebook/one_line_gen.tal
2025-07-03 19:35:20 +02:00

141 lines
3.5 KiB
Tal

|00 @System &vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1
|10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1
|a0 @File/vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2
%dbug { #01 .System/debug DEO }
(
Portable BitMap
https://en.wikipedia.org/wiki/Netpbm#File_formats
P4
# This is an example binary format of the letter "J" with each byte in decimal notation
6 10
8 8 8 8 8 8 136 112 0 0
88x31 pixel image
row of 88px -> 11 bytes 8 bits per byte
31 rows -> 341 bytes
hexdump -C footer.pbm
)
|1550 @drawing-size
|15f @image-size ( header 9 + data 341 = 350 )
|0100
@on-reset
( set img-pt to start of img )
;img ;img-pt STA2
( file header )
LIT "P write-to-image
LIT "4 write-to-image
#0a write-to-image
LIT "8 write-to-image
LIT "8 write-to-image
#20 write-to-image
LIT "3 write-to-image
LIT "1 write-to-image
#0a write-to-image
( image data )
load-drawing
#1f ;/y STA
&y-loop
#58 ;/x STA
#01 ;/i STA
&row-loop
;/x LDA #07 ADD ;/y LDA get-pixel
;/x LDA #06 ADD ;/y LDA get-pixel
;/x LDA #05 ADD ;/y LDA get-pixel
;/x LDA #04 ADD ;/y LDA get-pixel
;/x LDA #03 ADD ;/y LDA get-pixel
;/x LDA #02 ADD ;/y LDA get-pixel
;/x LDA #01 ADD ;/y LDA get-pixel
;/x LDA ;/y LDA get-pixel
build-byte
write-to-image
;/x LDA #08 ADD ;/x STA
;/i LDA INC ;/i STA
;/i LDA #0c NEQ ?/row-loop ( run 11 times )
;/y LDA #01 ADD ;/y STA
;/y LDA #3e
NEQ ?/y-loop ( run 31 times )
save-file
BRK
&i $1
&y $1
&x $1
( take 8 01 / 00 off the stack and create a byte with them )
@build-byte ( p p p p p p p p )
LITr 00 ( p p p p p p p p | 00 )
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
LITr 10 SFTr
?{ LITr 01 ORAr }
STHr
JMP2r
( given a pixel x,y figure out if it is part of the drawing )
@get-pixel ( x y -> bool )
,/y STR ( x )
,/x STR ( )
;drawing ,/pt STR2
&loop
( looped through the entire drawing? )
,/pt LDR2 ( pt* )
;drawing ;drawing-size ADD2 ( pt* end-of-drawing* )
EQU2 ?/not-found
( check if current x y has already been visited )
,/pt LDR2 LDA2 ( x1 y1 )
,/x LDR ( x1 y1 x )
,/y LDR ( x1 y1 x y )
EQU2 ?/found
( incrment pointer and save it )
,/pt LDR2 ( pt* )
#0002 ADD2 ( pt+2* )
,/pt STR2
!/loop
&not-found #01 JMP2r
&found #00 JMP2r
&pt $2
&x $1
&y $1
( load .1line drawing file from disk to memory )
@load-drawing
;/filename .File/name DEO2
;drawing-size .File/length DEO2
;drawing .File/read DEO2
JMP2r
&filename "footer.1line $1
( write a single byte to the image buffer )
@write-to-image ( val )
;img-pt LDA2 ( val pt* )
STA ( )
;img-pt LDA2 ( pt* )
#0001 ADD2 ( pt*+1 )
;img-pt STA2
JMP2r
( save the image buffer to disk )
@save-file
;/filename .File/name DEO2
;image-size .File/length DEO2
;img .File/write DEO2
JMP2r
&filename "footer.pbm $1
@img-pt $2
@img $image-size
@drawing $drawing-size