OS change log
3.V.2019, rev. 2.40
- When opening the GR.0 fails during a warm reset, a cold restart will
be forced to avoid falling into an infinite loop.
- Fixed a bug in kmalloc() which resulted in corruption of the memory
allocation table when a block was requested for allocation with 64k
7.VIII.2017, rev. 2.39
- The ext RAM test will now not overwrite the area $0400-$04FF.
- kmalloc() will now not require anymore a "reset-proof" memory block to
be simultaneously "resident".
- On Rapidus accelerator, when the zero page is shadowed at
$010000-$0100FF, at cold restart the OS will automatically allocate that
area as "system RAM" (with attributes "reset-proof" and "resident" at the
16.VII.2016, rev. 2.38
- Color table separated from other data so that it could be freely
customized by binary-patching the ROM file (and fixing the CRC later with
the CKSFIX utility).
- CKSFIX.TXT added to the archive.
- CKSFIX.COM will now verify if the loaded file is really the ROM file
it is intended for. Also the default file name changed to XLOS816.ROM.
10.V.2016, rev. 2.37
- At cold start, in the presence of the Rapidus BIOS at $f00000, call
its memory initialization function to adjust the memory allocation
- Again, in the presence of the Rapidus BIOS, call its function to
request displaying a logo on the Black Screen of Death, when a critical
- Simplifications in the boot selector: since PBI devices can take over
serial transfers, the old method of telling if something is a parallel
storage of serial storage is not valid anymore.
- Bugfix in the printer routines: the printer close routine caused a
crash due to one missing instruction.
- Bugfix in the startup routines: pressing Reset while in Atari BASIC
was disabling the BASIC.
27.V.2015, rev. 2.36
- Given up most hardware references to F7 and Rapidus registers (a dedicated
PBI device will take care of that). The MCR will only get set when a cartridge
is detected during RAM sizing.
- A minor fix in the routine counting extended RAM banks.
- Given up automatic searching for a bootable disk when the selected one does
- Given up the pointers HITOP and HIBOT on the 2nd page; new location LOSEGM $024d
- ATRMSK is now $FF by default.
- Added sanity check for the high RAM allocation table to prevent problems with
warm start when the table got somehow destroyed or the high RAM is present, but
- Death screens moved to RAM (Rapidus Fast ROM is not visible to ANTIC).
- Ctrl/F2 will now swap DMACTLS and DMASAV (switching the ANTIC display off and
- The base RAM sizing routine now stops at $C000. This prevents flash ROMs
from being overwritten at startup, if the write-protection is not active by
- A fix in the SIO: CRC errors occurring occasionally in turbo
mode should be gone now.
- A fix in the fast RAM testing routines.
- Further corrections in the automatic SIO speed detection (related to LDW
- Release 2.22
- Small fixes in the routine initializing the first 64k of RAM.
- The fast RAM sizing routine (on Warp and F7 accelerators) now scans the
address space searching for the begin of the actual memory, as in the F7 the
fast RAM doesn't necessarily begin at $010000.
- At reset time, the F7 board is now configured by default so that it can
boot in "Fast" mode, and still be compatible with cartridges (such as
SpartaDOS X or Atari BASIC). Also HPU gets reset (if it exists).
- Fixes in the automatic SIO speed detection (LDW and CA-2001 had problems
when Synchromesh was not loaded).
- kfreeall() is removed.
- The fast RAM sizer skips the last 64k segment in the address space (in
the F7 and HyperSpeed accelerator boards there are I/O registers there), and
so on the Warp board, even if equipped with full 16 MB, the OS won't see the
- JMP LOADER, forgotten by Atari programmers, added to the jump table at
the address $E483. This makes the internal XL OS loader and relocator
available to user programs (trub's idea).
- Fixes in the routine initializing the RAM past the first 64k (HMS).
- Fixed the "last slot problem" in kmalloc(): when the last slot of the memory allocation table was being taken, the
information about all remaining memory was lost, thus even after all the memory was released, the OS was able to "see"
only the amount of memory that had been previously allocated.
- Fixed similar problem in kfree(): releasing a block of memory, when the last slot of the memory allocation table
was assigned to that block, caused garbage to be written into that slot instead of zeroing it. As a consequence, the
allocation table information got corrupt.
- A fix in the routine handling fatal errors: now the ROM CRC error causes the appropriate message to be displayed
- Bugfix in the memory initialization routine: the hibot pointer ($0296-$0298) was not initialized properly at warm
- The memory allocation table format changed. As a result the number of available slots (= blocks of memory possible
to allocate) increased to 64 on the same size of the table.
- The table moved to the top of the RAM detected past the first 64k.
- Release 2.10 along with the MultiBASIC v.0.3 (still being in a beta stage)
- The 24-bit SIO extension's internal operation changed so that DOS 2.0 works now; this makes work all software that
boots DOS 2.0, e.g. the game "Crusade in Europe".
- SETVBLV changed to operate in more conservative way (it doesn't now switch to the native mode and back).
- Fixed problems appearing under DOS 3.0 i 4.0.
- CLRSCR reverted to (almost) original XL OS code, and PAINT 256 works again.
- Two new error codes: -74 (can't alloc more memory with kmalloc) and -75
(attempt to kfree memory not previously allocated with kmalloc).
- The "N:" (null) device now accepts all XIO codes.
- minor changes in the RESET and SYSVBL service routines
- a bit of unused code in the Self-Test ROM commented out
- JMP JTESTROM (JMP $E471) now forces the CPU into emulation mode
- international charset (Charset 2) modified: last three character shapes
(ASCII 125, 126, 127) changed into tilde, left brace, right brace respectively.
- minor change in the FP routines (a JSR/RTS sequence changed to JMP)
- a fix in US SIO: the '?' command sent by user program will now always be transmitted at 19200 baud.
- the bootmenu now allows to manually switch off the fast serial
I/O that was enabled automatically.
- the loop that reads the keyboard data, instead of
looping infinitely and busy-waiting for keyboard input, stops the CPU for
that time; this modification has been made as an effect of a discuss done
on #atari8 about Atari 8-bit power consumption and possibilities of
supplying the power from batteries.
- the same thing is now done inside the loop that waits for Ctrl/1
- corrections in the screen editor code: an error occurring while
opening the editor now causes margins to be reset to default positions.
- an attempt to enable pixel mode in 32- or 48-column mode causes the
screen to switch automatically to 40 columns (an error occurred
- the "disk interface" routine now recognizes additional commands:
read/write PERCOM and IDENTIFY DRIVE.
- SIO extension which allows to read/write data directly to and from
the high-memory (past the first 64k).
- keyboard "scanning" mode implemented experimentally;
- the definition of the XIO functions for keyboard changed in
incompatible way; the way it works now will most probably go to
- fixes in kmemory routines
- slight modifications in the screen editor
- support for externally loaded cassette handler: jump table functions
JCASOPIN and JCASRDBL get converted into "C:" XIO 16 and XIO 17,
- added wrappers around most jumptable entries, which (the wrappers)
save the B and D registers on the stack, reset them before the actual
call, and restore upon exit.
- SIO i CIO saves the D register on the stack and zeroes it for
- at the occasion, an old Atari bug has been fixed: the PRPLNK
routine was called with JSR from within CIO, and it returned with
direct JMP - this in turn caused the CIORET routine to be called
twice at the return from CIO.
- calling RESET via the jump table causes the CPU to be explicitly
switched to the emulation mode;
- preliminary implementation of the fast SIO protocol used in
XF-551/CA-2001 and LDW 2000 Super/Indus GT disk drives.
- BOOT routine extension: if the drive's sector size is greater than
256 bytes, the bootsector size is assumed to be the same as in each other
sector of this drive; and traditionally 128 bytes otherwise.
- the serial routines set and reset registers AUDF3/4 and AUDC3/4 only
(the coupled register 3/4 is a frequency generator for serial I/O), and
the registers AUDF1/2 and AUDC1/2 are left unmodified.
- presence of additional 130XE-style memory banks is now tested on every
reset, the number of banks detected is stored at $00029F.
- depending on the value of this byte the keyboard interrupt treats the
PORTB register in different manner: on machines without a 130XE memory
expansion the PORTB register is assumed to control the console LEDs on
1200XL computer, so the keyboard interrupt routine toggles the PORTB bits
appropriate for each LED. On machines equipped with a 130XE-style memory
expansion the PORTB register controls the memory, so the keyboard
interrupt routine does not touch it. This solution allows to have F1-F4
function keys and 130XE memory without conflicts between these two.
- the boot menu now allows selections using cursor keys ("-" up, "="
down), and despite that, now it is not redrawn on every keypress (however,
it still uses "E:" device only);
- if the default or selected boot drive is not available during cold
reset, the system tries to find the first bootable drive and gives up not
sooner than after all possible drives are checked out and responded
- eventhough the cassette handler is removed, the cassette initiation
vector value must be used at reset time, because some programs start this
- the boot menu displays information whether the drive supports Ultra
- bugfixed release
- a fix in the US Doubler SIO, boot from floppy should always succeed
- boot menu opens now before cartridge initialization;
- a new bug made while optimizing E: routines, which resulted in
logical lines being calculated improperly, has been fixed;
- US SIO activated for drives 5-8 too, apart of the 1-4;
- an attempt to fix an old Atari bug: although the device handler
reports an error while opening a file, and the operating system returns
the error code to the calling program, nevertheless the IOCB remains
open then. The fix is to close the channel directly after the device
handler returns an error (even if programs contain workaround against
this and close such a channel, closing a closed channel doesn't hurt, so
this is not a problem).
- cleanup in "K:" XIO and the "@:" handler;
- the bug causing boot menu to report "DRIVE DOES NOT RESPOND" for
all drives has been fixed;
- the new channel lookup feature of the CIO was impossible to use,
fixed as well;
- OSS MAC/65 4.20 compatibility issue regarding FP routines has been
detected and fixed;
- Some changes imported from 1450XLD temporarily cancelled,
specifically the $D1CF and NEWINI registers handling.
- memory allocation development: a 64-k alignment can be requested for
- a menu added for boot disk selection;
- preliminary implementation of US Doubler SIO.
- SELF TEST removed; this releases a bit of place for test/config
- chaning cartridge at runtime causes some message to be displayed (to
avoid suggestion that the system crashes because of that, as I read
- "@:" device defined, tested and added;
- printer buffer moved to the place where there was the casette buffer
previously; this releases 40 bytes on page 3;
- fix of an old Atari bug: if a bad IOCB number is given to the CIO, the
system returns with error through the CIORET routine, which in this case
destroys a part of the memory in range $0340-$043F overwriting it with
rubbish. The fix is to replace the CIORET call with a simple RTS.
- a function added to CIO, which automatically searches for a free
(closed) IOCB channel and returns its number to the user; see specification
- ROM version number changed to BB 02.04 (because Atari's changes to the
system have been imported from their ROM version marked BB 02.03);
- IRQ source recognition code for a PBI device, imported yesterday from
the 1450XLD ROM, has been slightly optimized (now there are 3 instructions
instead of 6 and no temporary variable in RAM is engaged);
- slight shortenings here and there;
- cassette recorder handler removed (both CIO's "C:" and SIO's $60);
this releases quite a bit of ROM space and about 20 bytes of RAM;
- "C:" vectors in ROM (at $E440) replaced with "N:" vectors for
- added device "N:" operating similarly to the /dev/null, /dev/zero and
/dev/random in Unix;
Some routines have been changed according to Atari code picked up from
the XL OS version BB 02.03 (this is the Atari 1450XLD ROM dated
21.VI.1984., which was sent to me by voy). Changes are:
- the IRQ source recognition routine takes into account that the new
device can indicate an interrupt not only in $D1FF, but also
(alternatively) in $D1CF;
- some internal variables of the COP handler have been moved because of
that (the variables used by the 1450XLD code took the addresses over);
- new RAM location NEWINI $03ED, reserved to be the begin of the warm
initialization routine for a parallel device handler loaded previously;
- the RESET routine initializes the address;
- and the IOPORTINI takes an advantage of that;
- the same IOPORTINI now resets the parallel device selection register
PDVREG, which wasn't done before (calling RESET from within PBI device
driver used to cause ROM checksum error and executing the SELF TEST);
- RAM sizing routine assumes minimum amount of RAM to be 16kB (10kB
- the text "BOOT ERROR" has been changed to "Boot Error" ;-)
- the CIO should now accept device numbers in range 0-9 (for example
from "D0:" to "D9:") and not 1-9 like in 800XL.
- the CIO handler table shortened from 12 to 11 entries;
- the E: routine responsible for inserting lines made yet a bit faster;
- yet another part of specification converted to Polish;
- version number changed to BB 01.93;
- COP handler cleanup, the code has been simplified and shortened;
- correction in the Atari code: setting CRITIC to 1 in the SIO routine
is superfluous, as it has been already set by SIOINT;
- memory allocation routines added (written and tested separately);
- changes in specification;
- there was still one place where DUNIT was forced to 1 when booting
- no possibility to boot from Cassette Recorder anymore; however, the C:
handler remains for now;
- inserting a line in the E: should be somehow faster now;
- yet a part of specification translated to Polish;
- fixed possible bug in the main IRQ routine;
- the RAM area at $03EF-$03F4 and $03F9 must be free, it is reserved for
new devices; thus HIBOT and HITOP are now moved to $0296-$0298,
$0299-$029B respectively, and the CASFLG variable goes to $029F.
- specification partially translated into Polish;
- enlarging free ROM space;
- Polish translation of the changelog
- change in COMLOG cancelled;
- the ROM checksum at $FFDE removed, from now on there's only one
checksum at $C000;
- minor change in COMLOG (use stack for storing local variable instead
of using page 0 location)
- version number bumped to BB 01.92
- jump through VCOP0 vector in native mode and with 16-bit registers
(like all other VCOPx vectors), switch this in the routine pointed to.
- previously defined interrupt vectors defined anew; this renders
previous specifications obsolete; see details;
- COP #$00 handler needs to setup the I bit properly before calling the
- free ROM space "compressed", i.e. taken together to one area; this
involves moving most of the ROM routines to different addresses; illegal
OS calls won't work anymore;
- SELECT/RESET should now cause cold reboot;
- interrupt routines rewritten once again;
- defined new interrupt vectors, VNMIN and VIRQN, which catch NMI and IRQ
before the system routines are entered;
- define new memory pointers:
HIBOT $03EF i HITOP $03F2;
- move INTIM1 $030C-$030D to $022D-E;
- move CASFLG $030F to $03F9; both changes made to make place for future
- few routines used by E: and S: handlers (COMADR, CLRSCR and CONVRT
actually) rewritten in 16-bit code; this speedups screen operations a
little bit and saves some ROM space at the same time;
- speed improvement in OUTPLT;
- optimizations in SIO and CIO routines with new instructions and
- the COP #$00 handler now switches to emulation mode before calling the
- SIO does not use TSX/TXS anymore, TSC/TCS is used instead; this matters
if someone calls JSIOINT in native mode;
- speed improvement in OUTCH;
- OS version number changed to BB 01.91;
- fixed a bug in the COP handler;
- interrupt routines shifted a bit towards $C000;
- changing the cartridge state will now cause the STP instruction to be
- SETVBLV written anew; INTEMP $022D-$022E released;
- FMUL/FDIV routines speeded up a little bit;
- prepare the first ROM based version;
- public release
- OS version number changed to BB 01.90;
- completed the COP handler;
- fixed minor bug in NMIENBL; the NMI should not be enabled before
setting GINTLK ($03FA);
- setting the boot drive number moved from BOOT (after the PBI devices
initialization) to the DISKINIT (before the PBI devices initialization);
- slight optimizations in the NMI/SYSVBL/EXITVBL (ca 32 cycles gain);
- newly defined ABORT and COP vectors are now initialized at reset;
- slight size optimizations here and there across the OS code;
- wrote a large part of this document;
- added a routine that tests the availability of the additional RAM (taken
from the SI, with slight modifications);
- a call to this test inserted into SYSINIT;
- further optimizations in the interrupt routines;
- optimizations in the OUTPLT routine;
- optimizations in the C: handler;
- the P: handler optimized with new 65C816 instructions, so that the
native interrupt vectors could fit well at the end of the ROM. Serial
number etc. removed on the same purpose;
- implemented NMI and IRQ pre-handler for native mode;
- SYSVBL modified (stack access);
- wrote most of the COP handler;
- wrote most of this document;