OS change log
24 V 2023, rev. 2.44
- startup: bugfix in the banked RAM sizing routine, one instruction was missing (?).
- COP #$00 handler: removed superfluous SEP #$30 instruction after returning from the emulation mode (emulator users: this will cause crashes in Altirra, update
it to a version where this bug was fixed).
- SIO: set daux1/2 to $0003 while asking for the high speed index ('?').
- SIO: silence all channels after I/O (like Atari OS), but only when iosnden<>0.
- SIO: iosnden $41 now set to $08 by default, and OR'ed with $a0 to get the value of AUDC4 for SIO comfort noise. Thus, changing the iosnden value now enables
you to control the volume of the said noise.
6 IX 2021, rev. 2.43
- kmem: RAM blocks with KM_RPR set but KM_RES cleared should not get merged.
- kmem: added kmalloc(-2) = return size of largest free block.
- added kmscan.com
- kmem: while initializing the memory pool it was assumed that the total amount
of High RAM is equal to the highest segment number minus 1, which may be not true
if that RAM begins at address e.g. $020000.
11 III 2021, rev. 2.42
- minor size-optimizations.
- startup: ask Rapidus BIOS (if present) about High RAM size instead of
sizing it using own procedure.
- COP #$xx handler (thanks, Andy Werner, for getting my attention to that):
limited the number of memory writes, also nothing is held anymore in static
variables across the legacy call being invoked.
- COP #$00 handler: upon return preserve bits I and D of the CPU status
as received from the caller.
- execute CLD on entry to most system calls.
- kmem subsystem: added function number 3, kmgetblk(), which accepts block
number on the stack and returns its size in A and attributes in X. This allows
a softloaded driver to inherit the kmem allocation pool before replacing it with
- kmalloc(): bugfix, an error was being returned, when attribute KM_EXE was
set and the requested size was greater than 64k.
- kmalloc(): added KM_TOP ($0010) attribute, requesting allocation at the top
- kmalloc(): the code for the KM_CLR attribute does not use static memory
- kmalloc()/kfree(): added garbage collector being called after each kmalloc()
and kfree() call to merge blocks which are meeting the needed criteria (free
with free, resident with resident etc.)
- kmem subsystem: general cleanups.
- startup: the halt screen appearing when there was nothing to boot now
explains the cause of its appearing.
- startup: also, when there is nothing to boot, try to enable internal BASIC
and boot this, if present, even when the user did not request that.
31 I 2020, rev. 2.41
- minor optimization in kmalloc(): replaced two AND #$xx instructions
with BIT #$xx to avoid restoring the accumulator after either one.
- people keep flashing this OS into U1MB ROM slots, then forgetting
that it is 65C816-only, so I now have added a message which appears when
someone starts this system in the 6502 mode.
- NEWCOL $02EE/$02EF and all the support code removed (commented out):
it is useless and only makes display routines slower. For 32/48/80
columns please use external screen drivers. As a result, 40-column
plot/print/scroll became averagely 6% faster.
- the SIO entry $E459 is now slightly faster when it comes to select
and call a PBI device.
- on JMP $E474 force all CPU registers to be 8-bit.
- with no storage attached it was not possible to boot into BASIC,
- backward compatibility corrections to the boot procedure and to the
SIO code; SpartaDOS 3.3 boots now.
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
20 III 2007
- 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
3 III 2007
- A fix in the SIO: CRC errors occurring occasionally in turbo
mode should be gone now.
28 II 2007
- A fix in the fast RAM testing routines.
- Further corrections in the automatic SIO speed detection (related to LDW
- Release 2.22
26 II 2007
- 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).
5 VI 2006
29-30 V 2006
- 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.
13 V 2006
- Release 2.10 along with the MultiBASIC v.0.3 (still being in a beta stage)
2 III 2006
- 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).
21 II 2006
- Fixed problems appearing under DOS 3.0 i 4.0.
12 II 2006
- CLRSCR reverted to (almost) original XL OS code, and PAINT 256 works again.
29 I 2006
- Two new error codes: -74 (can't alloc more memory with kmalloc) and -75
(attempt to kfree memory not previously allocated with kmalloc).
21 XII 2005
- The "N:" (null) device now accepts all XIO codes.
1 XII 2005
- 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.
25 IX 2005
- 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.
8 IV 2005
6 IV 2005
- the bootmenu now allows to manually switch off the fast serial
I/O that was enabled automatically.
27 III 2005
- 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
12 III 2005
- 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.
10 III 2005
8 III 2005
- SIO extension which allows to read/write data directly to and from
the high-memory (past the first 64k).
7 III 2005
- 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
6 III 2005
- fixes in kmemory routines
- slight modifications in the screen editor
4 III 2005
- 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.
1 III 2005
- 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;
20 II 2005
- 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.
17 II 2005
7 II 2005
- 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.
6 II 2005
- 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);
5 II 2005
- 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
31 I 2005
- eventhough the cassette handler is removed, the cassette initiation
vector value must be used at reset time, because some programs start this
29 I 2005
26 I 2005
- the boot menu displays information whether the drive supports Ultra
- bugfixed release
24 I 2005
- a fix in the US Doubler SIO, boot from floppy should always succeed
21 I 2005
19 I 2005
- boot menu opens now before cartridge initialization;
11 I 2005
- 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;
10 I 2005
- 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;
7 I 2005
- Some changes imported from 1450XLD temporarily cancelled,
specifically the $D1CF and NEWINI registers handling.
15 XII 2004
- memory allocation development: a 64-k alignment can be requested for
13 XII 2004
- a menu added for boot disk selection;
- preliminary implementation of US Doubler SIO.
12 XII 2004
- 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;
11 XII 2004
- 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
8 XII 2004
- 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
7 XII 2004
- 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;
6 XII 2004
- the E: routine responsible for inserting lines made yet a bit faster;
- yet another part of specification converted to Polish;
4 XII 2004
- 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;
3 XII 2004
30 XI 2004
- memory allocation routines added (written and tested separately);
- changes in specification;
29 XI 2004
- 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;
27 XI 2004
- 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.
26 XI 2004
- specification partially translated into Polish;
- enlarging free ROM space;
25 XI 2004
- Polish translation of the changelog
23 XI 2004
- change in COMLOG cancelled;
22 XI 2004
- 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)
20 XI 2004
- 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.
19 XI 2004
18 XI 2004
- 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
17 XI 2004
- 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;
16 XI 2004
- 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;
15 XI 2004
- 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;
14 XI 2004
- speed improvement in OUTCH;
13 XI 2004
- 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;
12 XI 2004
- FMUL/FDIV routines speeded up a little bit;
- prepare the first ROM based version;
- public release
11 XI 2004
- 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;
10 XI 2004
- 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;