The Commodore Maze Generator Program
I needed something “useful” to output from my Commodore VICE Lambda Custom Runtime that also didn’t require much input (if any) from the requester. Otherwise, I’d have to sanitize the input that is being passed to a shell script and potentially validate it if I didn’t want unpredictable behavior. I settled on a Commodore 128 version of the Commodore Maze Generator (the fast
and slow
will be unnecessary once we launch from the Lambda with the -warp
option on VICE, but I never changed the program so it’s left in here. The fast
and slow
and everything before line 50 is Commodore 128 BASIC 7.0-specific, but the Commodore 64 version just requires substitution of POKE
commands instead. (See vice-lambda repo on GitHub for latest version)
5 fast
10 scnclr
20 color 0,2
30 color 4,2
40 color 5,1
50 for y=1 to 25
60 for x=1 to 40
70 print chr$(205.5+rnd(1));
80 next x
90 next y
95 slow
100 goto 100
Making sure that the Lambda returns an image for Lambda
I want to be able to use Lambda Proxy Integration when setting up the API Gateway, so I need to return a format that maps the information properly. The response JSON
needs to have:
isBase64Encoded
set totrue
(necessary for the translation of thePNG
back frombase64
)headers
with"Content-type"
and"content-disposition"
set (image/png
andinline
for this example)statusCode
of200
(right now, if we have an error it’s either not caught or happens at the Lambda invocation level)body
containing thebase64
data. Note the-w 0
argument to turn off line breaks when wrapping… Lambda Proxy Integration doesn’t handle that well.
function handler() {
cd vice
SEED=$((0 - `od -An -N2 -i /dev/random`))
./x128 -silent -sound -keybuf "
3 i=rnd($SEED)
`cat ../maze.bas`
run
" -warp -limitcycles 20000000 -exitscreenshotvicii /tmp/$1.png 2>&1 >/dev/null
cd ..
RESPONSE="{\"isBase64Encoded\": true, \"headers\": {\"Content-type\": \"image/png\", \"content-disposition\":\"inline\"}, \"statusCode\":200, \"body\":\"`base64 -w 0 /tmp/$1.png`\"}"
echo $RESPONSE
}
Also note that we’re passing in a SEED
value because, otherwise, the Commodore 128 will generate the same maze every time.
Repackage the Lambda and upload as in the Commodore VICE Lambda Custom Runtime blog post.
Setting up the API Gateway
Go to API Gateway in the AWS Console and select [Create API]
Choose [Build] under “REST API” (we won’t be using OIDC/OAuth2/CORS…)
Choose REST, New API, and name your API:

Create a GET Method and check the checkmark
- Choose “Lambda Function” for your Integration Type
- Check “Use Lambda Proxy Integration”
- Type the name of the Lambda that you’ve calling and select it and [Save] and confirm that you want to add role/permission for the Lambda.
Deploy the API
Back on your API view, select the [Actions] dropdown and [Deploy API]

Just create a new dev stage… we’re not going to “production” with this experiment
and [Deploy]
It’s broken
If you click the Invoke URL presented, you will get a broken image
Since we’re only sending back PNG
files, we can just tell the API that */*
is a Binary Media Type by going to Settings on the left sidebar for the API and [(+) Add Binary Media Type]
Be sure to save the settings, redeploy the API and be sure to use the Invoke URL for the correct API! (I had two identical and was “fixing” the wrong one… hence the different API URL snapshots)
If you refresh, you should get a new maze from the Commodore maze generator program:
Some Troubleshooting
- Be sure to save your settings
- Test your API call to Lambda in the Method Execution view (Resources -> GET -> Test [lightning bolt])
- Be sure to redeploy your API after settings change.