C64 BASIC kinks
Next day of studying the VIC-II architecture and using BASIC to play around with it.
First, I managed to solve yesterday's problems - since the booklet I was reading from is, like I said, crappy quality, I tried peeking 53240 instead of 53248 ( 0xd000 ) for character ROM. Once I translated the values into hex, the mistake was easy to spot. Since each character consists of 8 bytes ( 8 lines of 8 bits ), the off-by-8 error caused each character to be off-by-one ( 0 instead of 1, A instead of B etc ).
After I fixed that, I managed to work on RAM character memory and create custom characters ( a smiley, to be precise ), and called it a day. Today I wanted to throw together a quick Mandelbrot renderer, start by putting character 81 ( a filled circle ) all around the screen and changing its color based on standard escape time algorithm. Unfortunately, I've been hitting a wall. Basically, I've been having problem with nested FOR loops. At first I thought that maybe something is off with the nesting depth, but I've figured out that C64 BASIC allows for up to 9 nested loops. Then I thought that maybe there's a problem with NEXT. Finally, I wrote incredibly simple test case:
10 FOR LCX = 0 TO 5 20 FOR LCY = 0 TO 5 30 PRINT "LCX";LCX;"LCY";LCY 40 NEXT LCY 50 NEXT LCX 60 END
The result, which caused massive wtf in my brain was:
LCX 0 LCY 0
LCX 1 LCY 1
LCX 2 LCY 2
LCX 3 LCY 3
LCX 4 LCY 4
LCX 5 LCY 5
?NEXT WITHOUT FOR ERROR IN 50
And then a friend told me to try 'lx' and 'ly'. And it worked. Apparently, C64 BASIC only uses first two letters of a variable as an identifier, even though the names can be over 100 chars long. After this obstacle was down, the results were following fast. And when I say 'fast' I mean, 'it took couple minutes for C64 to render it in character mode' ;). Without further ado, pics!
And now back to studying the architecture, instead of faffing about ;)