seems to be working

This commit is contained in:
~d6 2023-10-28 23:57:48 -04:00
parent 0e85bd16c0
commit dd368c12ec
1 changed files with 59 additions and 45 deletions

View File

@ -1,8 +1,6 @@
( icn_to_bmp.tal ) ( icn_to_bmp.tal )
( ) ( )
( converts ICN to BMP ) ( converts ICN files to BMP files. )
( limited to 255x255 tiles, i.e. 2040x2040 pixels )
( for now uses black and white for colors 0 and 1. )
( ) ( )
( USAGE: icn_to_bmp.rom $tile-w $tile-h $in-file $out-file ) ( USAGE: icn_to_bmp.rom $tile-w $tile-h $in-file $out-file )
( ) ( )
@ -17,13 +15,14 @@
@tile-w $2 @tile-w $2
@adj-tile-w $2 @adj-tile-w $2
@tile-h $2 @tile-h $2
@icn-size $2
@in-file $2 @in-file $2
@out-file $2 @out-file $2
@row-size-bytes $2 @row-size-bytes $2
@adj-row-size-bytes $2 @adj-row-size-bytes $2
|0100 |0100
;after-args #0000 ( stdin: nop ) arg/init BRK ;after-args #0000 arg/init BRK
( load argument parsing ) ( load argument parsing )
~arg.tal ~arg.tal
@ -43,16 +42,20 @@
&bytes-to 20 "bytes 20 "to 20 00 &bytes-to 20 "bytes 20 "to 20 00
&invalid-width "Invalid 20 "tile 20 "width 00 &invalid-width "Invalid 20 "tile 20 "width 00
&invalid-height "Invalid 20 "tile 20 "height 00 &invalid-height "Invalid 20 "tile 20 "height 00
&read-error "Failed 20 "to 20 "read 20 "enough 20 "data 00 &invalid-size "Invalid 20 "size: 20 "ICN 20 "too 20 "large
&write-error "Failed 20 "to 20 "write 20 "data 00 &write-error "Failed 20 "to 20 "write 20 "data 00
&wrong-number-of-args "Wrong 20 "number 20 "of 20 "args; 20 "expected 20 "four 00
@usage ( reason* -> ) @usage ( reason* -> )
;usage/error emit emit ;usage/message emit !exit ;usage/error emit emit ;usage/message emit !exit
&error "ERROR 20 00 &error "ERROR: 20 00
&message &message
0a 0a "USAGE: 20 "icn_to_bmp.rom 20 "width 20 "height 20 "icn 20 "bmp 0a 0a 0a "USAGE: 20 "icn_to_bmp.rom 20 "WIDTH 20 "HEIGHT 20 "ICN 20 "BMP 0a
20 20 "width 20 "and 20 "height 20 "are 20 "given 20 "in 20 "tiles 20 "(each 20 "tile 20 "is 20 "8x8 20 "pixels) 0a 20 20 "WIDTH 20 "and 20 "HEIGHT 20 "are 20 "given 20 "in 20 "tiles 20 "(each 20 "tile 20 "is 20 "8x8 20 "pixels) 0a
20 20 "icn/bmp 20 "should 20 "be 20 "paths 20 "(that 20 "are 20 "readable/writable) 0a 0a 00 20 20 "maximum 20 "WIDTH/HEIGHT 20 "is 20 "255 20 "tiles 0a
20 20 "ICN/BMP 20 "should 20 "be 20 "paths 20 "(that 20 "are 20 "readable/writable) 0a
20 20 "maximum 20 "ICN 20 "size 20 "is 20 "49152 20 "bytes 0a
0a 00
@str-to-int ( s* -> n* ) @str-to-int ( s* -> n* )
LIT2r 0000 LIT2r 0000
@ -74,17 +77,18 @@
POPr JMP2r POPr JMP2r
@after-args ( -> ) @after-args ( -> )
;arg/count LDA #04 NEQ ?&bad ;arg/count LDA #04 EQU ?{ ;msg/wrong-number-of-args !usage }
#00 arg/read str-to-int .tile-w STZ2 #00 arg/read str-to-int .tile-w STZ2
#01 arg/read str-to-int .tile-h STZ2 #01 arg/read str-to-int .tile-h STZ2
#02 arg/read .in-file STZ2 #02 arg/read .in-file STZ2
#03 arg/read .out-file STZ2 #03 arg/read .out-file STZ2
.tile-w LDZ2 #30 SFT2 .row-size-bytes STZ2 .tile-w LDZ2 .tile-h LDZ2 MUL2 #30 SFT2 .icn-size STZ2
.tile-w LDZ2 #0008 MUL2 #001f ADD2 #0020 DIV2 #0004 MUL2 .adj-tile-w STZ2 .tile-w LDZ2 #30 SFT2 .row-size-bytes STZ2
.adj-tile-w LDZ2 #30 SFT2 .adj-row-size-bytes STZ2 .tile-w LDZ2 #0008 MUL2 #001f ADD2 #0020 DIV2 #0004 MUL2 .adj-tile-w STZ2
&bad .adj-tile-w LDZ2 #30 SFT2 .adj-row-size-bytes STZ2
validate validate
write-header write-header
read-icn
write-body write-body
;msg/wrote emit ;msg/wrote emit
;bmp-header/total-size LDA2 SWP emit-dec2 ;bmp-header/total-size LDA2 SWP emit-dec2
@ -92,17 +96,14 @@
#0a .Console/w DEO #0a .Console/w DEO
!exit !exit
@start-read ( -> ok^ ) @read-icn ( -> ok^ )
.in-file LDZ2 .File1/name DEO2 .in-file LDZ2 .File1/name DEO2
JMP2r .icn-size LDZ2 STH2k .File1/len DEO
;icn-dat .File1/r DEO2
@read-tile-row ( -> ok^ )
.row-size-bytes LDZ2 STH2k .File1/len DEO2
;icn-buf .File1/r DEO2
.File1/ok DEI2 STH2r EQU2 JMP2r .File1/ok DEI2 STH2r EQU2 JMP2r
@convert-tile-row ( -> ) @convert-tile-row ( src* -> )
;icn-buf .row-size-bytes LDZ2 ( src* size* ) .row-size-bytes LDZ2 ( src* size* )
OVR2 ADD2 SWP2 LIT2r =bmp-buf ( limit* src* [dst*] ) OVR2 ADD2 SWP2 LIT2r =bmp-buf ( limit* src* [dst*] )
&loop ( limit* src* [dst*] ) &loop ( limit* src* [dst*] )
DUP2 STH2kr convert-row ( limit* src* [dst*] ) DUP2 STH2kr convert-row ( limit* src* [dst*] )
@ -111,13 +112,12 @@
POP2 POP2 POP2r JMP2r ( ) POP2 POP2 POP2r JMP2r ( )
@convert-row ( src* dst* -> ) @convert-row ( src* dst* -> )
LITr -adj-tile-w LDZ2r STH2 #fff8 ( src* -8* [w* dst*] ) LITr -adj-tile-w LDZ2r STH2 ( src* [w* dst*] )
&loop ( src* i* [w* dst*] ) #0001 SUB2 DUP2 #0008 ADD2 ( lim* src+7* [w* dst*] )
SWP2 LDAk STH2kr #010e DEO STA ( i* src* [w* dst*] ; dst<-src ) &loop ( lim* pos* [w* dst*] )
OVR2r ADD2r ( i* src* [w* dst+w*] ) LDAk STH2kr STA OVR2r ADD2r ( src* pos* [w* dst+w*] ; dst<-pos )
INC2 SWP2 INC2 ( src+1* i+1* [w* dst+w*] ) #0001 SUB2 LTH2k ?&loop ( src* pos-1* [w* dst+w*] )
ORAk ?&loop ( src+1* i+1* [w* dst+w*] ) POP2 POP2 POP2r POP2r JMP2r ( )
POP2 POP2 POP2r POP2r JMP2r ( )
@write-tile-row ( -> ok^ ) @write-tile-row ( -> ok^ )
.adj-row-size-bytes LDZ2 STH2k .File2/len DEO2 .adj-row-size-bytes LDZ2 STH2k .File2/len DEO2
@ -127,14 +127,26 @@
@validate ( -> ) @validate ( -> )
.tile-w LDZ2 #0001 SUB2 #00ff LTH2 ?&tile-w-ok ;msg/invalid-width !usage &tile-w-ok .tile-w LDZ2 #0001 SUB2 #00ff LTH2 ?&tile-w-ok ;msg/invalid-width !usage &tile-w-ok
.tile-h LDZ2 #0001 SUB2 #00ff LTH2 ?&tile-h-ok ;msg/invalid-height !usage &tile-h-ok .tile-h LDZ2 #0001 SUB2 #00ff LTH2 ?&tile-h-ok ;msg/invalid-height !usage &tile-h-ok
.icn-size LDZ2 #c001 LTH2 ?&size-ok ;msg/invalid-size !usage &size-ok
JMP2r JMP2r
( colors are provided in RGB order, written to BMP header in reverse )
@write-color ( r^ g^ b^ addr* -> )
STH2k STA INC2r ( ; addr+0<-b )
STH2kr STA INC2r ( ; addr+1<-g )
STH2r STA JMP2r ( ; addr+2<-r )
@write-header ( -> ) @write-header ( -> )
.adj-tile-w LDZ2 .tile-h LDZ2 MUL2 ( aw*h ) .adj-tile-w LDZ2 .tile-h LDZ2 MUL2 ( aw*h )
#30 SFT2 #0020 ADD2 ( 32+aw*h*8 ) #30 SFT2 #0020 ADD2 ( 32+aw*h*8 )
SWP ;bmp-header/total-size STA2 SWP ;bmp-header/total-size STA2
.tile-h LDZ2 #30 SFT2 SWP ;bmp-header/pixel-h STA2 ( ) .tile-h LDZ2 #30 SFT2 SWP ;bmp-header/pixel-h STA2 ( )
.tile-w LDZ2 #30 SFT2 SWP ;bmp-header/pixel-w STA2 ( ) .tile-w LDZ2 #30 SFT2 SWP ;bmp-header/pixel-w STA2 ( )
( these colors are specified in RGB order )
#ff #ff #ff ;bmp-header/color0 write-color
#00 #00 #00 ;bmp-header/color1 write-color
.out-file LDZ2 .File2/name DEO2 .out-file LDZ2 .File2/name DEO2
#0020 .File2/len DEO2 #0020 .File2/len DEO2
;bmp-header .File2/w DEO2 ;bmp-header .File2/w DEO2
@ -142,28 +154,30 @@
&ok JMP2r &ok JMP2r
@write-body ( -> ) @write-body ( -> )
start-read #0000 .tile-h LDZ2 SUB2 ;icn-dat ( dat* )
.icn-size LDZ2 OVR2 ADD2 ( dat* dat+size* )
.row-size-bytes LDZ2 STH2k SUB2 ( dat* dat+size-row* [row*] )
&loop &loop
read-tile-row ?&ok1 ;msg/read-error !usage &ok1 DUP2 convert-tile-row
convert-tile-row
write-tile-row ?&ok2 ;msg/write-error !usage &ok2 write-tile-row ?&ok2 ;msg/write-error !usage &ok2
INC2 ORAk ?&loop STH2kr SUB2 GTH2k ?&done !&loop
JMP2r &done POP2r POP2 POP2 JMP2r
( fields marked "MOD" will be updated; others will stay the same )
@bmp-header @bmp-header
"BM ( 0: identify bitmap ) "BM ( 0: identify bitmap )
&total-size 00 00 00 00 ( 2: total file size in bytes, includes header, TODO ) &total-size 00 00 00 00 ( 2: total file size in bytes, includes header, MOD )
00 00 ( 6: reserved, zero ) 00 00 ( 6: reserved, zero )
00 00 ( 8: reserved, zero ) 00 00 ( 8: reserved, zero )
20 00 00 00 ( 10: pixel data offset, 32 bytes ) 20 00 00 00 ( 10: pixel data offset, 32 bytes )
0c 00 00 00 ( 14: header size, 12 bytes ) 0c 00 00 00 ( 14: header size, 12 bytes )
&pixel-w 00 00 ( 18: width in pixels, TODO ) &pixel-w 00 00 ( 18: width in pixels, MOD )
&pixel-h 00 00 ( 20: height in pixels, TODO ) &pixel-h 00 00 ( 20: height in pixels, MOD )
01 00 ( 22: color planes, 1 ) 01 00 ( 22: color planes, 1 )
01 00 ( 24: bits per pixel, 1 ) 01 00 ( 24: bits per pixel, 1 )
&color0 ff ff ff ( 26: color 0, rgb, TODO ) &color0 ff ff ff ( 26: color 0, blue/green/red MOD )
&color1 00 00 00 ( 29: color 1, rgb, TODO ) &color1 00 00 00 ( 29: color 1, blue/green/red MOD )
( 32: start of data, TODO ) ( 32: start of pixel data MOD )
@bmp-buf $7f8 @bmp-buf $7f8
@icn-buf $7f8 @icn-dat $c000 ( 48k )