140 lines
3.3 KiB
Tal
140 lines
3.3 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 }
|
|
%print { .Console/write 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
|
|
( get first 8 pixels )
|
|
#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
|
|
|
|
|
|
@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
|
|
|
|
@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
|
|
¬-found #01 JMP2r
|
|
&found #00 JMP2r
|
|
&pt $2
|
|
&x $1
|
|
&y $1
|
|
|
|
( @remove-offset )
|
|
|
|
|
|
@load-drawing
|
|
;/filename .File/name DEO2
|
|
;drawing-size .File/length DEO2
|
|
;drawing .File/read DEO2
|
|
JMP2r
|
|
&filename "footer.1line $1
|
|
|
|
@write-to-image ( val )
|
|
;img-pt LDA2 ( val pt* )
|
|
STA ( )
|
|
;img-pt LDA2 ( pt* )
|
|
#0001 ADD2 ( pt*+1 )
|
|
;img-pt STA2
|
|
JMP2r
|
|
|
|
@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
|