The Psion Organiser Year 2000 Bug!
By Jaap Scherphuis & David Tarrant.
Unfortunately we Psion users are not unaffected by by the Y2k bug. If you are a LZ or LZ64 user then you do not have to worry, but if you own a CM, XP or POS 350 then using the built in calendar facility of these machines you will need to decide whether or not to use the following programme patch to get over the short comings of these Organiser models.
We can only imagine that the Psion Organiser design team never expected the CM, XP or POS 350 would still be in use 20 years after their creation, well, how wrong they were! Many of us still value these brilliant machines and I am sure, like Jaap and me, you want to continue using them for many years beyond the millennium.
A Solution is at Hand?
A fellow Psion user David Tarrant contacted Jaap regarding his concerns and a possible solution for the impending problem.
The Organiser II CM & XP are not year 2000 compliant in the following respects:
Although I use my XP on a daily basis (CALC, DBASE, SPREADSHEET, TIME, ALARM), I never use the DIARY. However, I frequently use TIME, so loss of this feature would be a problem.
Fortunately there is a simple solution based on the fact that the Gregorian Calendar repeats every 28 years (i.e. same day of week for given date). In practice, all that is necessary is to set the clock back 28 years and add 28 years to the date and time indicated.
David provided an example OPL programme to carry out the above requirements, Jaap used this as a basis for a much more compact and faster machine code solution.
So to overcome this problem Jaap has written a very compact patch. It is just 465 bytes in size so it should not effect the running of most programmes even in the CM, which has only 8Kb of memory.
As yet the program only partially fixes the year 2000 problem and it works with all 2-line Organisers!
It is a TSR (i.e. a Terminate and Stay Resident program), meaning that after the OPL programmes have finished a very small machine code program stays in memory, so that it can be called at any time.
Download the patch: y2000fix.zip
Usage Instructions taken from the y2000.zip package.
The ZIP-file contains the following procedures:
Installing the TSR:
Aftercare for the TSR:
After you have downloaded the y2000fix unzip and transfer all the above files to your Organiser, then edit and translate each file.
To activate the patch run TIMEINST.
Both TIMEINST and POKCNV% can now be removed from memory as they are no longer necessary.
Now that the TSR is loaded, it does not need any OPL programs any more, however the following programs may still come in useful.
Running the program TSRREMV will remove the TSR from memory, and reclaim the space it used. To be a bit more precise, this procedure actually removes the TSR that was loaded last, provided it satisfies the criteria set out in the 'notes' section of the text file included with the program.
Switching On and Off
If you run the program TIMEON, it will make the 'TIME' menu option point to the new TIME routine in RAM. If the menu option is not found, or if it has already been altered then nothing is done.
If you run the program TIMEOFF, it will restore the 'TIME' menu option back to the standard ROM routine. If the menu option is not found, or if it has already been restored then nothing is done.
When the patch is installed the main menu item TIME is redirected to the memory resident routine. This routine is identical to the normal one in ROM, except that it adds 84 to the year, making the range of the available years 1984 to 2083 instead of 1900 to 1999. This new range is chosen because these years have the same weekdays.
The alarms, and most of the diary functions, do not display the year and are therefore not affected. The only diary function that still shows the old years is the GOTO option, displaying a date that is still 84 years behind.
If the TIME menu option is pointing to the new routine, and the menu option is deleted and re-inserted, the program assumes it is still active even though the option points to the standard ROM routine. Thus running TIMEON will not work, unless TIMEOFF is run first.
On multi-lingual machines the month name is always in English, whatever the current language. The day name is however in the current language (because TM$DAYV is used).
Take care with the following time related functions:
All of these will return/use a year value that is 84 years less than the one shown in the new TIME routine.
The patch has been made as foolproof as possible by implementing various checks in them. We believe that the patch should work without problems on all 2 Line Organiser versions CM, XP & POS350 if used correctly, but we cannot be absolutely sure of this.
We will not be held responsible for any problems caused directly or indirectly from your use of this patch.
There are other programs which work on similar principles to this one, and these may be incompatible. For example, the CUT program which is part of Widget software's Autoscribe will not work in combination with this program, due to a bug in their installation routine.
The TIME routine and its programs should work correctly in conjunction with any further TSR's that I may write in the future. In general however, the OPL programs in this package do not work if you install a TSR afterwards that does not conform to the specifications outlined below.
Our thanks go to David Tarrant, who suggested the idea of simply re-calibrating the time clock. By doing so, this obviates the need to re-write the alarm routine, the diary routine, and the NMI handler.
Space is created for the TSR by lowering the language stack top ($2065). Note that after lowering it, the installation overwrites the existing values on the stack, including the return address and variable space of the TIMEINST procedure. Therefore a number of tricks had to be used in TIMEINST: The array Q%() is declared first so that other variables are not affected by the pokes. The program ends with the STOP command.
This is also a major flaw in the hexloader in Bill Aitken's Machine Code Book. If you use Bill's program, make sure you stop the program after you lower the stack top, or insert STOP at the end of his SPACE procedure.
Patch Version Information.
Version 1.0, Size 456 bytes. 20/8/1998 - First version made available.