Compiling the ideas for this year’s December Adventure, I found myself coming up with a seemingly infinite list of possibilities1. I also noticed that many of them were relatively small and self-contained—tasks that push forward my projects in meaningful ways, but not ones that will take the full month. With that in mind, I’ve decided to do something a little more like an advent calendar this year, and select a random idea from a list each day.

Of course, it wouldn’t be a Psion-themed December adventure without involving at least one of these wonderful portable computers. With that in mind, I’ve decided to start getting to grips with my new Organiser II LZ64 by writing a small OPL program that will generate random selections for me.

The LZ64 came with a small but incredibly comprehensive manual2 which, combined with my past experience of OPL, was enough to get me started. Given there’s language-level support for ‘databases’ in OPL, it makes sense to store my list of ideas in a data file and then randomly select and display a row. It’s a very long time since I’ve worked with data files, so I enjoyed diving into the programming manual over a cup of coffee3.

To avoid needing to first write a top-level menu and editor, I started by creating a new data file each time, programmatically populating it with some sample data, and then exercising the code for random selection. Typing things on the LZ64’s quirky A-Z keyboard (which also lacks a traditional shift key, forcing you to always use caps lock) was slow going, but I was able to get something going.

For the curious, the code (transcribed) looks something like this4:

RANDOM:

LOCAL c,p%,k%

CREATE "C:IDEAS",A,t$

A.t$="Add Im feeling lucky to the Software Index"
APPEND

A.t$="Software Index UID table"
APPEND

A.t$="Psion webring"
APPEND

c=COUNT

DO
  p%=INT(RND*c)
  POSITION p%+1

  PRINT A.t$  
  PRINT "TRY AGAIN (Y/n)"
  k%=GET

  CLS

UNTIL k%=%N OR k%=%n OR k%=1

PRINT "Quitting..."

CLOSE
DELETE "C:IDEAS"

The LZ64 helpfully tells me this takes a whopping 604 bytes. Everything counts when all you’ve got is 64k total memory.

With a proof-of-concept in place, I set about adding support for paging through, and managing entries. Refactoring the code proved significantly more tiresome than I’d expected as the LZ64 doesn’t appear to have any kind of copy-and-paste support, and this generation of OPL requires each procedure to be in a separate file. Not having any desire to manage files using the Organiser’s somewhat cumbersome menus, I opted for the lesser of two evils: a combination of labels and GOTO statements 🤷. Happily, it does provide conveniences like the MENU function, so I was able to put something together relatively easily:

RANDOM:

LOCAL c,p%,k%,m%

GOTO init::

menu::
WHILE 1
  k%=GET
  IF k%=1
    GOTO quit::
  ELSEIF k%=2
    m%=MENU("Random,New,Delete,Quit")
    IF m%=1
      GOTO rand::
    ELSEIF m%=2
      GOTO add::
    ELSEIF m%=3
      GOTO delete::
    ELSEIF m%=4
      GOTO quit::
    ENDIF
  ELSEIF k%=5
    GOTO prev::
  ELSEIF k%=6
    GOTO next::
  ELSEIF k%=13
    GOTO rand::
  ELSEIF k%=32
    GOTO add::
  ENDIF
ENDWH

init::
IF NOT EXIST("C:IDEAS")
  CREATE "C:IDEAS",A,t$
ELSE
  OPEN "C:IDEAS",A,t$
ENDIF
GOTO show::

show::
CLS
PRINT POS,"/",COUNT
IF COUNT<1
  PRINT "No items"
ELSE
  PRINT A.t$
ENDIF
GOTO menu::

prev::
p%=POS-1
IF p%<1
  p%=COUNT
ENDIF
POSITION p%
GOTO show::

next::
p%=POS+1
IF p%>COUNT
  p%=0
ENDIF
POSITION p%
GOTO show::

rand::
c=COUNT
p%=INT(RND*c)
POSITION p%+1
GOTO show::

delete::
ERASE
IF POS>COUNT
  POSITION COUNT
ENDIF
GOTO show::

quit::
PRINT "Quit..."
CLOSE
STOP

add::
CLS
PRINT "New"
INPUT A.t$
APPEND
GOTO show::

Clocking in at 1310 bytes, this now gives me the tools I need to (very slowly) enter my list of ideas for the coming days, select a random one each day, and append new ideas as the month progresses. Perhaps unsurprisingly, I’m going to call it ‘Ideas’.

That list of ideas currently looks something like this (see this year’s introduction for background to some of these).

Psion ideas:

  • Improve the Ideas UX
  • Learn about the Organiser Comms Link
  • Keyboard support for the LZ64
  • Psion webring
  • Software Index UID listing
  • Software Index ‘I’m Feeling Lucky’ button
  • Software Index CLI for Linux
  • Software Index spelunking
  • PsiBoard documentation and write-up
  • PsiBoard finishing touches
  • PsiBoard charging status LED
  • Ship Thoughts for EPOC32
  • Minimal Psion USB-C cable
  • Backups in Reconnect
  • Organiser connectivity in Reconnect
  • Write about RMRSoft preservation
  • Ship OpoLua 2.0 for iOS
  • Ship OpoLua Qt
  • Series 3a hinge reinforcement
  • Archive Palmtop magazine scans
  • Write about MAME emulation
  • Web-based Psion emulation
  • OPL support for highlight.js
  • Archive more Psion ROMs
  • Add guides to psion.community
  • Add manuals to psion.community

Non-Psion ideas:

  • Support attachments in Thoughts
  • Thoughts for iOS
  • Print feet for Anytime x Nixie
  • Try out GlobalTalk
  • Write up my read later strategy
  • Time zone logger
  • Little Luggable keyboard improvements
  • Write up MiSTer x PVM
  • Show filenames in Folders
  • Support filtering in Folders
  • Remove Libretto 50CT batteries
  • Write about model-viewer
  • Write about my 3D printed brackets

Since I’m selecting things at random, I’ve intentionally let this list grow to include many wishlist and quality-of-life improvement items. I plan to let myself re-roll if ideas don’t speak to me on a given day, but I’ll note down the ones I skipped for folks following along.


In spite of it’s quirks, the Organiser is already proving a very enjoyable device to use—it’s fascinating to see how many of the UX patterns in SIBO and beyond have their roots in these text-only devices.


  1. This might very well be a side effect of having spent most of November traveling, instead of working on projects. 

  2. There’s a digial version on Jaap’s Psion II Page but I can’t find a scan of the paper version on the Internet Archive. Another project for when I finally acquire a book scanner. 

  3. It was actually matcha, but ‘coffee’ seems the de rigueur hot drink for such narratives. 🍵 

  4. And there’s yet another idea to add to the list: OPL syntax highlighting for highlight.js 🙃.