#!/usr/bin/env retro Many of the RETRO interface layers embed a copy of the image into the binary. This is done by converting the image into a C file that can be included or compiled and linked. The source includes a tool, `retro-embedimage`, for this. This implements the tool in RETRO. 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. ~~~ '#include_ s:put nl 'int32\_t_ngaImageCells_=_9139; s:format s:put nl 'int32\_t_ngaImage[]_=_{ s:format s:put nl &Image #3 + fetch [ fetch-next n:put $, c:put EOL? ] times '}; s:put nl ~~~