Nearly a week into my December Adventure (happy Friday!) and it feels like I’ve a text file full of notes and ideas, and a downloads directory full of reference files and links. To ensure I can stay on top of things as the month progresses, I spent a little time on Thoughts, but also allowed myself to tie up some loose ends and work on some related side-quests (ROMs, psion.info, and OpoLua) lest they continue to bounce around my head.

Thoughts for EPOC

I took some time out to set up CI builds using GitHub Acitons and compile.lua from OpoLua. I hit up against a few teething troubles—compile.lua didn’t parse the MENU function correctly—but Tom kindly poked around and fixed a few things. With the fix in place, compiling Thoughts was a simple matter of ensuring my GitHub Actions runner had Lua installed and doing something like:

COMPILE_PATH="$SCRIPTS_DIRECTORY/opolua/src/compile.lua"

lua "$COMPILE_PATH" "$ROOT_DIRECTORY/Thoughts/Thoughts.opp" "$ROOT_DIRECTORY/Thoughts/Thoughts.opo"

I did encounter a small issue relating to my dependency on SystInfo.opx which seems worth noting here to aid others and for my own future reference. Specifically, the only downloadable version of SystInfo I’ve been able to find1 includes a .txh header file, not an .oxh and, while nOPL+ is more than happy for me to IMPORT "SystInfo.txh", compile.lua only has hard-coded support for SystInfo.oxh. I worked around this by creating my own SystInfo.oxh by importing the .txh into OPL on the Psion and saving the resulting file (.oxh files are in the EPOC32-native OPL format and .txh files are plaintext). This allows me to IMPORT "SysInfo.oxh" which works in both nOPL+ and GitHub Actions. Feels like something we need to improve on in the future.

I’m unsure how the CI will grow as I start to add more source files, resources, and ultimately package everything up as an installer, but it feels like a great start—perhaps one of the first times anyone’s had continuous integration for an OPL program?

With the administrative bits of build and continuous integration out of the way, I took a little time to add global hotkey support so I can quickly compose a new note whatever I’m doing. Fortunately, unlike modern pesky security conscious operating systems, System.opx provides an off-the-shelf way of doing this, in the form of CAPTUREKEY&:—calling this this ensures matching key events are always dispatched to our program’s waiting GETEVENT32:

REM Capture the global hotkey.
capture& = CAPTUREKEY&:(%t, KModifierFunc&, KModifierFunc&)

WHILE 1
    GETEVENT32 ev&()
    k& = ev&(1)
    IF k& = KKeyMenu% OR k& = KKeySidebarMenu%
        REM Menu button.
        menu:
    ELSEIF k& = %t AND ev&(4) = KKModFn%
        REM Global hotkey (Fn + T)
        new:
    ELSEIF k& < 32

      ...

    ENDIF
ENDWH

Hard coding the global hotkey to Fn + T feels a little ugly so I plan to allow users to customize this in the future but, for the moment, it works! 🎉

After the last few days, my energy for working on Thoughts was running low, but I did take a few moments to try it out on my Revo. That immediately reminded me that I need an installer as I didn’t have SystInfo.opx installed, and that I need to automatically create the directory notes are stored in if it doesn’t exist. Still, I was able to get it running after a little manual futzing.

Everything feels tiny on the Revo after the Series 7

Unfortunately, while Thoughts happily creates the new note on the file system and correctly writes the metadata, the call to RUNAPP&: seems to loose the path and Editor opens an empty file every time. A problem for another day.

ROMs

I finally got around to adding George’s recent Series 7 ROM dump to explit7/Psion-ROM.

Device EPOC32 Version ROM Version Language Filename MD5 Checksum
Psion Series 7 1.05 (254) (Build 754) English series71.05254build756.bin c78c3cf48d2fd7b8f0d5bc9cadd79159

It’s been really fun to watch efforts to get this ROM booting in emulation over the last week—clearly early days but exciting stuff!

psion.info

For the past couple of months, I’ve been slowly working on a Hugo-based version of the psion.info landing site that Alex put together. My goal is to be able to offer something up which is a little easier to maintain, that scales well to hosting the wealth of information the Discord community shares, and is easy for others to contribute to. Since I’ve been collecting quite a bit of Psion-related documentation on the course of this December Adventure, I thought it might be nice to pause and see how that might fit into this prototype site.

First up, the Hugo documentation provides a great guide on generating tables from CSV files which I was able to pair with DataTables to render out a sortable and searchable table of the ROMs I’ve been adding to GitHub this week:

With the appropriate templates and shortcodes added to the site theme, this ends up being a really simple page to create and edit that can hopefully be a helpful resource for people looking to dig into the details of the Psion handhelds and get started with emulation.

I also knocked up a proof-of-concept for publishing a folder of images, like this collection of Psion marketing images:

Even if we don’t end up using this new variant of the site, it’s proving a really interesting exercise to figuring out how to store and present many years of fairly involved information. I see why Alex is so drawn into the Psion Documentation Project.

OpoLua

On a roll, and with fresh and newly acquired knowledge of DataTables, I stepped over to OpoLua, our OPL runtime for iOS and macOS. I’ve been meaning to simplify how we track what programs do and don’t work for some time now as updating an HTML table for every new program is painfully slow. I’ve shifted this over to a CSV file stored in the source tree which we can hopefully add to more easily over time meaning the list will remain current (did I mention we accept PRs?). This should also make it much easier to use this as a source-of-truth when recommending programs to try out in OpoLua itself.


The list of possible directions for this December Adventure Random Walk seems to get longer-and-longer but hopefully I’ve managed to tidy things up a bit and I can focus a little more—there’s still lots to do to tidy up Thoughts and I’ve barely touched on my Psion emulation related ideas. 😮‍💨