Finally hit a bug where my computer doesn’t hang but it DOES corrupt the system state enough that when it crashes, subsequent runs stop working quite right and only a reboot clears it up
So, that’s fun
Finally hit a bug where my computer doesn’t hang but it DOES corrupt the system state enough that when it crashes, subsequent runs stop working quite right and only a reboot clears it up
So, that’s fun
Oof! Got it. Two bugs conspired to cause a stack overflow:
* if a task was set to have its output ignored, it was leaving each character on the parameter stack. So the silent loading of the base definitions would leave a bunch of junk on the stack if there was any output. Usually there isn’t, so I didn’t notice.
* I added a definition that contained a comment before I defined the word that interprets comments, so the interpreter dumped a bunch of errors on the stack trying to figure THAT out
went to implement simple text drawing yesterday but ended up writing Jorth code to do animation lerps
managed to successfully write a word that takes five parameters on the stack, so I assume I'll be receiving some sort of Forth Programmer Certificate of Achievement in the mail soon
(Jorth still has no words that can touch anything on the stack beyond the top three values)
Tried to implement text drawing but something is fucked and it only draws garbage
It _should_ be a very simple BIOS call to fetch a pointer to the built-in 8x8 EGA font and just use it, I’m clearly missing something fundamental
Getting tired of those patterns so I implemented map editing
PERSISTING map edits will have to wait for another day though
I implemented map saving and loading in Jorth and MAN was it slow, almost 5 seconds to load a 100x100 tilemap. So I implemented words to bulk read/write and now it’s very fast. (I am streaming off a compact flash disk, it should be!)
I’ve been noticing startup was slow, as all my Jorth source got loaded and compiled, and assumed it was the interpreter’s fault. But now I realize it’s probably actually because I’m doing unbuffered byte-at-a-time reads. Ooops.
Implemented map resizing at the Jorth console, so I can design spaces that aren’t 100x100. Unexpected side benefit of integrating a live scripting language over the serial port: I don’t have to code a UI for anything in my map editor if I don’t want to. As soon as I implement the word to do the thing, I can just type it into the console.
I also drew a few new tiles.
Uhhhhh my map loading code is slightly broken because there appears to be a weird corner case where it’s reading two bytes at the beginning of the file but then it increments the stream by three bytes? Both fread and fgetc are doing this??
Ohhh I’m not specifying the “b” flag in fopen, and the map height happened to be the carriage return character :/
Today I implemented tile walkability and looping sprite animations. Note that the guy can go places the car can’t.
It is spooky to me how quickly this has started coming together after two months of tech fiddling. It... paid off? I’m not used to this.
Project has suddenly started immediately terminating on startup, like, before my code even runs??
It looks like maybe the 512-byte cache I just added somehow exceeded my 64kb RAM budget and Turbo C++ just doesn't tell you when you're over??
so remember when I was like “oh the source of all my startup performance problems is definitely byte-at-a-time unbuffered file reads”? https://mastodon.social/@SpindleyQ/101648207901180365
So I implemented a file cache and startup speed stayed pretty much the same. Turns out the problem is actually that tight Jorth loops over thousands of items are Not Fast :/
Hmm, interestingly the interpreter I defined in C is no faster at compiling all my Jorth code than my bootstrapped interpreter written in Jorth, which I guess makes sense given how little code it is
So it’s really the general VM overhead that’s killing me, and to solve that I’ve really only got two options:
* start rewriting the VM in assembly
* precompile code into an image that can be directly loaded into memory
Implemented traveling between areas! Each area unloads its code before loading the next, which should allow me to ensure that I don't run out of RAM to hold text. (I think I've got about 6kb left which _should_ be plenty, I hope...)
Definitely need to design a little helper DSL for defining reactions to the player bumping into areas without sprites, that code is already getting ugly...
Built my DSL - all my player collision code is much cleaner now.
Basically I have N things I need to check before I move the player - is it bumping into an object? Is the terrain walkable? Am I leaving the bounds of the map? - and if one of those questions is true, it needs to optionally perform an action and bail early on the rest. "else if" is not really a workable concept in Forth, so I needed to find another way to simplify this.
Oh no I have completely run out of fun tech to build and now I have to make maps and write and draw stuff. Haaaaaaalp
I’ve made some progress with this but I don’t wanna post a constant stream of screenshots of everything I map out because then y’all won’t have any surprises when you eventually play the game.
Slowly realized that the speed of Jorth’s interpreter is likely bottlenecked by symbol lookup. Implemented an easy standard optimization I hadn’t bothered with (don’t do a string comparison if the lengths don’t match!) and suddenly cold startup goes from almost 30 seconds to 20 seconds.
Still glad I built precompiled image support but that’s a significant win
So my game loop was calling "tick" and "draw" by looking up the words in the dictionary every frame. Decided to cache the lookup; not as a serious optimization, just as a little cleanup.
Did I mention symbol lookup is by far the slowest thing in my Jorth interpreter? HOLY SHIT the game runs SO much smoother now. I couldn't believe it, I just started wandering around in-game, marvelling at how the animation wasn't stuttering, with a huge grin on my face.
aaah I came up with a cool idea that fixes a bunch of story problems I was having. I wrote a _bunch_ of new stuff for the game today (in comparison to... literally any other time I've worked on the story)
might actually finish this thing someday after all
Remember when I started this project in December? Today is when I finally have access to a working serial mouse.
Out of all the retro hardware I have had to scavenge I did NOT expect a serial mouse to be this much work!
"Hey Jeremy why are you writing your own sprite editor" I mean, besides the obvious "building everything myself the hard way" reason, see this toot from February? https://mastodon.social/@SpindleyQ/101661425411468111
I realized that I was trying fruitlessly to design the finished game without drawing any more tiles or sprites because my NeoPaint workflow was so miserable. And that's ridiculous because I enjoy drawing _way_ more than writing and there were a bunch of elements I wanted to put in that I haven't drawn yet!
Saving and loading wooooorks
My sprites are now stored only in my custom format (which is just a straight memory dump) instead of TIF, and I don't have any code to SAVE TIF files, so, goodbye forever NeoPaint I guess, I hope I don't need flood fill and that I never irreversibly corrupt my sprite file
Adding background tile editing to my in-game sprite editor and man EGA graphics engine glitches are FUN
(Video: a mouse cursor acts as a flashlight illuminating a square of correctly rendered tiles while most of the rest of the screen is either black or random tiled garbage, in the vague shape of the starting map)
I made a boat
It’s a good boat
I also added a bunch of features to my in-game sprite editor to make making the boat go more smoothly
Like, copy/paste of tiles & sprites, horizontal flip, nudge up/down
It’s SO much nicer than NeoPaint now
@SpindleyQ I had no idea I wanted an easyball, but woah
are these things robust (as in "can survive an interactive exhibition with a lot of kids" robust)? I've been looking for weird controllers for arduino synths and that might be just the thing