retroforth/example/retro-generate-image-js.retro
crc 8a9c1ea6ed fix bugs in image.js caused by a missed dup.
FossilOrigin-Name: 9f8cfd4727dff8595712f45357d3274990de84184b5a15330dad58e868de6204
2020-09-03 17:37:40 +00:00

81 lines
1.5 KiB
Forth
Executable file

#!/usr/bin/env retro
This is a quick tool to generate an `image.js` from the ngaImage
for use with the JavaScript and Typescript implementations of
the VM.
First up, I need to load the image to a buffer, so I allocate
space for this now.
~~~
#65535 #4 * 'IMAGE-SIZE const
'Image d:create
IMAGE-SIZE allot
~~~
Next is reading in the file. This is slightly complicated by
the need to pack the individual bytes into the memory cells.
So, a variable to track the open file ID.
~~~
'FID var
~~~
Then read in a byte.
~~~
:read-byte (n-) @FID file:read #255 and ;
~~~
Reading in four bytes, I can shift and merge them back into
a single cell.
~~~
:read-cell (-n)
read-byte read-byte read-byte read-byte
#-8 shift + #-8 shift + #-8 shift + ;
~~~
The next step is a word to return the size of the file in
cells.
~~~
:size (-n) @FID file:size #4 / ;
~~~
And then, using the above, read in the data from the file
to the image buffer.
~~~
:load-image (s-)
file:R file:open !FID
&Image size [ read-cell over store n:inc ] times drop
@FID file:close ;
~~~
Read in the file.
~~~
'ngaImage load-image
~~~
The final part is to export the image as a C array. To keep
line length to a reasonible length, I have a counter and add
a newline after 18 values.
~~~
'Count var
:EOL? &Count v:inc @Count #18 eq? [ nl #0 !Count ] if ;
~~~
The rest is easy. Display the relevant header bits, then
the cells, then the needed footer.
~~~
'var_ngaImage_=_[ s:put nl
&Image dup #3 + fetch [ fetch-next n:put $, c:put EOL? ] times nl drop
']; s:put nl
~~~