Last update:
3 VII 2024

== CPU boards ==
* Information
* Downloads
== ELSA ==
* Information
* Change log
* Downloads
== 65C816 XL OS ==
* Information
* Change log
* Compatibility list
* Download
== Fixes ==
* Downloads
== IDE Plus ==
* Information
* Download
== Other stuff ==
* Downloads
== SysInfo ==
* Information
* Download
== Let's Emu! ==
* Information
* Downloads
== U-BASIC ==
* Information
* Downloads
== CP/Emu ==
* Information
* Downloads
== MultiBASIC ==
* Information
* Change log
* Download


OS change log

17 I 2024, rev. 2.45

  • keyboard: improved noclik $02db handling (following the relevant discussion on AAge)
  • COP #$00 handler: when the stack was relocated, reset it to $01FF before switching to the 6502 emulation mode (and, of course, restore it back before returning)
  • COP #$00 handler: fixed a bug which in certain circumstances resulted in calling the target procedure with wrong P register contents.

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
  • 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 own routines.
  • 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 of RAM.
  • kmalloc(): the code for the KM_CLR attribute does not use static memory variables anymore.
  • 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, fixed now.
  • 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 alignment.

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 same time).

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 information.
  • 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 error occurs.
  • 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 not respond.
  • 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 malfunctioning.
  • 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 on, respectively).

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 accident.

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 drive alone).
  • 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 last 64k.
  • 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 properly.
  • Bugfix in the memory initialization routine: the hibot pointer ($0296-$0298) was not initialized properly at warm start.
  • 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

  • Release 2.09.

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 (start/stop display).

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 previously).
  • the "disk interface" routine now recognizes additional commands: read/write PERCOM and IDENTIFY DRIVE.

10 III 2005

  • release.

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 final version;

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, respectively.
  • 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 internal use;
  • 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

  • release.

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 negatively.

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 way;

29 I 2005

26 I 2005

  • the boot menu displays information whether the drive supports Ultra Speed
  • bugfixed release

24 I 2005

  • a fix in the US Doubler SIO, boot from floppy should always succeed now.

21 I 2005

  • bugfixed release

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.
  • release

15 XII 2004

  • memory allocation development: a 64-k alignment can be requested for allocated block;

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 program;
  • chaning cartridge at runtime causes some message to be displayed (to avoid suggestion that the system crashes because of that, as I read somewhere);
  • "@:" 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 compatibility ;-)

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 previously);
  • 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

  • release

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 from disk;
  • 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

  • release

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 system;

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 DCB extensions;
  • 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 addressing modes;
  • the COP #$00 handler now switches to emulation mode before calling the specified address;
  • 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 executed;
  • 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; © KMK
free counters