Hello everyone, it's been a while!
I'm very happy to share that a new version of G.R.O.G. has been released!
We are jumping straight to v3.5 because of the number and depth of upgrades packed into this new version.
I recently got my hands on a NuXT board and started experimenting with it, which naturally included testing G.R.O.G. on real hardware. Picture below for attention!
Running it on the NuXT, I quickly realized that hard-limiting the string size of game titles in the 16-bit version wasn't ideal. Sure, "The Secret of Monkey Island" fits fine, but "Where in the World is Carmen Sandiego - Enhanced Edition" gets cut off, which looked pretty lame.
That sparked the development of a more dynamic engine. Instead of reserving a static chunk of RAM based on a specific title length, the engine needed to adapt to whatever is actually in your database. The challenge with dynamic allocation is the "Swiss cheese" memory fragmentation effect. If you aren't careful, memory gets fragmented quickly when navigating deep menus, leading to stack collisions and violent crashes.
My first approach to solving this conundrum was to try a FAR memory version. Instead of being confined to the 64KB DGROUP of the small memory model, it could reach out into conventional RAM. This meant holding more games and ignoring title length caps entirely.
I knew it would be slower than the NEAR version (which stays strictly within the 64KB DGROUP boundaries), but I didn't expect it to be quite that slow. Ultimately, I decided not to pursue that route for the main build. While the FAR version's source is stored in the `BODEGA` directory in the Codeberg repository, and its compiled binary is available in this v3.5 release, there are no plans to maintain it further.
The final solution was to rebuild the memory manager. It now reserves just enough RAM for the program to function and has several defensive mechanisms to free RAM in a very controlled way. Also, it turns whatever is left into a "Master Arena”. G.R.O.G. sizes your game list before loading it into this space. No more game title caps, and no more memory fragmentation.
Speaking of RAM allocation, a /TEST parameter was added to both the 16-bit and 32-bit versions. It analyzes your GAMES.CSV file and tells you if it will fit in memory. If it doesn't, it will encourage you to split your collection into volumes. This way, you can load a dedicated, lightweight volume for your 286 instead of trying to cram your entire 7,000-game library into it.
I also noticed my poor NuXT took quite a while chewing (tokenizing) the CSV file on boot. To address this, the 16-bit engine now compiles your library into a fast .idx binary cache, reducing load times.
Other major 16-bit adjustments include a move to pure BASH-style TAB autocomplete, which eliminates the XT keyboard buffer overflow issues we had with the old passive background scanning. Also, adding a new title now takes fractions of a second because it simply appends to the end of the file rather than rebuilding the entire CSV.
As for the 32-bit DPMI version, it learnt a few tricks from its 16-bit sibling. While it's a totally different beast, it dynamically grows to fit your database now, pulling in chunks of memory safely as needed.
There are many other internal updates across the board. For instance, the 32-bit version now features advanced multi-volume exports. If you have one volume defined for your XT and another for your 286, you can now tag them both and safely combine them into a single CSV directly from G.R.O.G.'s interface.
As usual, here are the full release notes, downloads, and documentation:
Download: https://codeberg.org/jjmarcos/grog/releases
Source/Docs: https://codeberg.org/jjmarcos/grog
The attachment nuxt.jpg is no longer available
Have fun!