|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 ¬-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