APPENDIX TWELVE
The XL/XE Memory Map
Most of the information in the first edition of Mapping the Atari ap-
plies equally well to the XL and XE lines of computers; only those
locations below represent known changes. Atari made several
changes to RAM locations, and the OS was almost entirely rewritten
in the newer models.
The information here pertains to the 600XL, 800XL, 1200XL, 65XE, and
130XE. Except for the 1200XL, the XL and XE models are virtually
identical to each other. There have been changes in the BASIC
ROMs, but I have no official word on any changes in the OS. al-
though I have reason to believe there have been some.
For those owners of XL computers who have difficulty using older 800
software, Atari (and several other companies) makes a Translator
disk which loads an 800 operating system on top of the XL OS, allow-
ing you to run almost all 800 programs. Ask your local Atari dealer
for this disk if you don't already have it. Side A of the Translator disk
permits you to press RESET and usually remain within the older OS;
side B doesn't have this code patch. so it reboots the XL OS when RE-
SET is pressed. A public domain translator called FIXXL is also avail-
able on CompuServe. A hardware solution is available: the XL BOSS
chip from Allen MacroWare.
The DDT subprogram in OSS's MAC/65 assembler is an excellent tool
for examining memory, especially since it gives you the option of
ASCII display and disassembly of visible memory. It allows you to
write directly to memory or jump to any location. I used it constantly
while writing this chapter.
Unless otherwise noted, this material pertains to all XL and XE models
(as does much of the earlier section of the book). RAM locations and
interrupt and OS vectors will remain the same in all systems; how-
ever, the locations and contents of routines they point to may differ
among computers. Not all of the OS ROM locations described here
will be the same in the 1200XL. Some of the changes here are to vec
tors, not to functions. References to function keys (Fl to F4) and LEDs
are for 1200XL users only. My original 1200XL memory map ap-
peared in COMPUTE!'s Third Book of Atari.
Most RAM and hardware locations belonging to the GTIA, ANTIC,
POKEY, and PIA chips (53248-55295; $D000-$D7FF except for PORTB)
have generally not changed. The floating-point package remains at
55296-57343 ($D800-$DFFF), but routines have been altered within it.
The major change in the OS was the shifting of interrupt handlers
from high ROM into the area previously unused between 49152 and
52223 ($C000-$CBFF) and the addition of the international character
set at 52224-53247 ($CC00-$CFFF).
Atari promises the XE series will maintain 100 percent compatibility
with the XL series--as long as the software obeys the "rules" and
sticks to official, published vectors and entry points and doesn't try to
take advantage of some ROM routine to save a few bytes (see 62026
and 62128 below). The OS in the XE series is the same as that in the
800XL, at least at the time of this writing. When the ROM routine gets
moved--the software crashes. Don't blame Atari; they've published
this material since day one. If developers don't pay attention, it's not
Atari's fault.
Deleted Registers
The following registers have been completely deleted from the
XL/XE, and other uses have been found for the location (previous
400/800 locations given):
PTEMP (31; $1F)
LINBUF (583-622; $247-$26E)
CSTAT (648; $288)
TMPX1 (668; $29C)
HOLD5 (701; $2BD)
ADDCOR (782; $30E).
00          	00          	LNFLG
 
-      Used by the Atari in-house debugging programs and OS on
     power-up.
01          	01          	NGFLAG
 
-      Used during power-up routines for self-testing; checks for bad
     memory bytes; zero means memory failure.
07          	07          	CMCMD
 
-      Command flag for 835 and 1030 modems set to any nonzero
     number to pass commands to the modem. Used to be TSTDAT.
10,11          	A,B          	DOSVEC
 
-      Points to 6047 ($179F).
12,13          	C,D          	DOSINI
 
-      Points to 5440 ($1540).
28-31          	1C-1F          	ABUFPT
 
-      Intended OS use as buffer pointers; currently unused.
54,55          	36,37          	LTEMP
 
-      Temporary buffers for the general-purpose peripheral handler
     loader routines. The general-purpose handler routines help the
     OS deal with new handlers and peripherals which load their
     own handlers. All locations marked as being used by the
     peripheral handler or loader are tar OS use only; do not use
     them.
74,75          	4A,4B          	ZCHAIN
 
-      Temporary storage registers for general-purpose peripheral
     handler loader.
96,97          	60,61          	FKDEF
 
-      The 1200XL has four redefinable function keys. FKDEF points
     (LSB/MSB) to their definition table--an eight-byte table for keys
     F1 to F4 and then SHIFT-F1 to SHIFT-F4. Each byte is assigned a
     value corresponding to an internal (not ASCII) code. The keys
     themselves are values 138-141 ($8A-$8D), but you must not as-
     sign a key its own value since it generates an endless loop. Ini-
     tially points to 64529 ($FC11).
     The function keys perform the following activities:
     Key Combination     Function
     F1                  Cursor up (ATASCII 28; $1C)
     F2                  Cursor down (29; $1D)
     F3                  Cursor left (30; $1E)
     F4                  Cursor right (31; $1F)
     With SHIFT
     F1           Home (cursor to upper left, 28; $1C)
     F2           Cursor to lower-left corner (29; $1D)
     F3           Cursor to start of physical line (30; $1E)
     F4           Cursor to right end of physical line (31;
                  $1F)
     With CTRL
     F1           Keyboard enable/disable toggle (not con-
                  sole keys)
     F2           Screen display enable/disable
     F3           Key click sound enable/disable
     F4           Domestic/international character set
                  toggle
     Function keys are ignored with both a SHIFT and CTRL
     combination. You cannot redefine CTRL-function key definitions.
98          	62          	PALNTS
 
-      Flag to determine PAL or NTSC version of the display handler,
     previously at 53268 ($D014). Zero means North American
     standard.
121,122          	79,7A          	KEYDEF
 
-      Pointer (LSB/MSB) to the keyboard definition table, initialized to
     64337 ($FB51), where the system keyboard table resides. You
     can redefine the keyboard by writing a 192-byte table and
     POKEing its address here. The table consists of three 64-byte
     portions: lowercase keys, SHIFTed keys, and CTRL keys. The sys-
     tem table has the following assignments:
     Byte    Key              Byte   Key
     00      1                32     ,
     01      j                33     Space
     02      ;                34     .
     03      F1 (1200XL)      35     n
     04      F2 (1200XL)      36     (128)
     05      k                37     m
     06      +                38     /
     07      *                39     Inverse key (114)
     08      o                40     r
     09      (128; see below) 41     (128)
     10      p                42     e
     11      u                43     y
     12      RETURN           44     TAB
     13      i                45     t
     14      -                46     w
     15      =                47     q
     16      v                48     9
     17      HELP (128)       49     (128)
     18      c                50     0
     19      F3 (1200XL)      51     7
     20      F4 (1200XL)      52     BACKSPACE
     21      b                53     8
     22      x                54     <
     23      z                55     >
     24      4                56     f
     25      (128)            57     h
     26      3                58     d
     27      6                59     (128)
     28      ESC              60     CAPS (130)
     29      5                61     g
     30      2                62     s
     31      1                63     a
     The next 64 bytes contain the shifted characters (for example, a
     shifted is A, 5 shifted is %; look at the upper characters on your
     keyboard). The following 64 are CTRL key characters (many
     graphics characters), You have to create a table for all 192
     bytes, although you need change key assignments only for a
     specific few. Use the ATASCII values when writing the table.
     Several values have specific meaning to the keyboard decoder
     on the XL:
     Dec/Hex         Use
     128/80          Not used; invalid combination
     129/81          Inverse output
     130/82          Upper/lowercase toggle
     131/83          CAPS lock
     132/84          CTRL key lock
     133/85          End of file (EOF)
     137/89          Keyboard click toggle
     138-141/8A-8D   Function keys F1-F4 (1200XL only) or:
                     cursor up (ATASCII 28; $1C)
                     cursor down (ATASCII 30; $1D)
                     cursor left (ATASCII 31; $1E)
                     cursor right (ATASCII 32; $1F)
     142/8E          Cursor home (upper-left screen corner)
     143/8F          Cursor to bottom-left corner
     144/90          Cursor to left margin (1200)
     145/91          Cursor to right margin (1200)
     You can't redefine BREAK, SHIFT, CTRL, or the console keys (nor
     the CTRL-function key assignments on the 1200XL). The 1200XL
     Addenda gives a Dvorak keyboard assignment easily written
     into memory, The system table address is returned to RAM on
     power-up or RESET.
128,129          	80,8          	1 LOMEM
 
-      Points to 7676 ($$1DFC).
512-551          	200-227          	Interrupt vectors
 
-      The locations of the vectors and their functions remain the
     same, but they now point to different locations in the OS
     memory:
     Vector      Hex         Label      Points to
     512,513     200,201     VDSLST     49358 ($C0CE)
     514,515     202,203     VPRCED     49357 ($C0CD)
     516,517     204,205     VINTER     49357 ($C0CD)
     518,519     206,207     VBREAK     49357 ($C0CD)
     520,521     208,209     VKEYBD     64537 ($FC19)
     522,523     20A,20B     VSERIN     6691 ($1A23)
     524,525     20C,20D     VSEROR     6630 ($19E6)
     526,527     20E,20F     VSEROC     60140 ($EAEC)
     528,529     210,211     VTIMR1     49357 ($C0CD)
     530,531     212,213     VTIMR2     49357 ($C0CD)
     532,533     214,215     VTIMR3     49357 ($C0CD)
     534,535     216,217     VIMIRQ     49200 ($C030)
     546,547     222,223     VVBLKI     49378 ($C0E2)
     548,549     224,225     VVBLKD     49802 ($C28A)
     550,551     226,227     CDTMA1     60433 ($EC11)
     The OS was rewritten in the XL/XE models, moving the interrupt
     handlers down into the previously unused region 49152-53247
     ($C000-$CFFF).
563          	233          	LCOUNT
 
-      Temporary counter for peripheral handler loader.
566,567          	236,237          	BRKKY
 
-      Now points to 49298 ($C092).
568,569          	238,239          	RELADR(1200XL) VPIRQ (All XL/XEs except 1200XL)
 
-      Previously spare bytes, now the address of the relocatable
     loader routine in the 1200XL and vector for parallel bus inter-
     rupt requests on all XL/XEs except 1200XL (where it points to a
     routine at 51566; $C96E)--the vector for any initialized generic
     parallel device.
581          	245          	RECLEN
 
-      Relocatable loader routine variable for record length.
583-618        $247-$26A      ....
     Reserved (unused) on the 1200XL.
583          	247          	PDVMSK
 
-      Shadow mask for the device selection register at 53759 ($D1FF;
     active only when the OS deselects the floating-point ROM by
     writing to that address). You can run up to eight parallel de-
     vices through the bus; each bit in this register corresponds to
     one device. The mask must be set for the proper device before
     the OS will allow an IRQ to be sent to that device.
584          	248          	SHPDVS
 
-      Shadow for parallel bus register; each bit represents one of
     eight parallel devices. Allows the OS to service VBIs while run-
     ning the device masked by this bit.
585          	249          	PDMSK
 
-      Parallel bus interrupt mask; allows OS to service IRQs from the
     device masked by the bit in this register. See above.
586,587          	24A,24B          	RELADR
 
-      Relocatable loader relative address.
588,589          	24C,24D          	PPTMPA,PPTMPX
 
-      One-byte temporary storage registers for relocatable loader.
590-618          	24E-26A          	....
 
-      Spare bytes, reserved for future use.
619          	26B          	CHSALT
 
-      Alternate character set pointer for the 1200XL, initialized to 204
     ($CC) to point to the international character set as the next set
     to display on the CTRL-F4 toggle. The XL has two internal
     character sets, one at 52224 ($CC00) and the other at 57344
     ($E000).
620          	26C          	VSFLAG
 
-      Fine-scroll temporary register.
621          	26D          	KEYDIS
 
-      Keyboard disable. POKE with 255 to disable the keyboard, 0 to
     reenable. You have to press RESET (all XL/XEs except 1200XL) to
     get control back if you are locked out; 1200XL users can press
     CTRL-F1 (toggles it on and off; LED 1 is on when the keyboard is
     disabled).
622          	26E          	FINE
 
-      Fine-scroll enable for graphics mode 0 (text); POKE with 0 for
     coarse scrolling (the default) and 255 ($FF) for fine scrolling.
     Follow the POKE with GR.0 or an OPEN for device E:. Try listing
     a long program--it's slow and smooth! The display list for fine
     scrolling is one byte longer than for coarse scrolling. The OS
     places the address (64708; $FCC4) of a Display List Interrupt
     (DLI) at 512, 513 ($200,201), replacing any you might have
     placed there. The color register at 53271 ($D017) is altered for
     the last visible screen line.
     If you enable fine scrolling and go immediately to DOS, you'll
     see that it's still enabled when you do a copy to screen or disk
     directory. Jerry White wrote an article demonstrating fine
     scrolling and other XL features in Analog, February 1984.
628-631          	272-277          	PADDL4-7
 
-      The XL has only two ports, so only paddles 0-3 are active.
634-635          	27A-27B          	STICK2-3
 
-      No longer in use since there are ports only for sticks 0 and 1.
     The OS VBLANK process now copies the PORTA joystick (0-1)
     and paddle (0-3) values into the shadow registers for PORTB so
     that STICK0 affects both STICK0 and STICK2, STICK1 affects
     STICK1 and STICK3, PADDL0 affects PADDLE0 and PADDL4, and
     so on.
640-643          	280-283          	PTRIG4-7
 
-      No longer in use (see PADDL4-7).
646-647          	286-287          	STRIG2-3
 
-      No longer in use (see STICK2-3).
648          	288          	HIBYTE
 
-      High-byte register for relocatable loader routine.
651          	28B          	IMASK
 
-      Unused.
652          	28C          	JVECK
 
-      Temporary jump vector; unused.
654,655          	28E,28F          	NEWADR
 
-      Used by relocatable loader; new address vector.
668          	29C          	CRETRY
 
-      Number of command retries; moved from 54 ($36) in the
     400/800.
701          	2BD          	DRETRY
 
-      Number of device retries; moved from 55 ($37) in the 400/800.
713,714          	2C9,2CA          	RUNADR
 
-      Run address register for relocatable loader routine.
715,716          	2CB,2CC          	HIUSED
 
-      Used by relocatable loader routines.
717,718          	2CD,2CE          	ZHIUSE
 
-      Used by relocatable loader routines.
719,720          	2CF,2D0          	GBYTEA
 
-      Used by relocatable loader routines.
721,722          	2D1,2D2          	LOADAD
 
-      Used by relocatable loader routines.
723,724          	2D3,2D4          	ZLOADA
 
-      Used by relocatable loader routines.
725,726          	2D5,2D6          	DSCTLN
 
-      Disk sector size register; default of 128 ($80) bytes, but can be
     altered to a length from 0 to 65535 ($FFFF). Your drive may not
     support other sizes, however.
717,728          	2D7,2D8          	ACMISR
 
-      Interrupt service routine address; unused.
729          	2D9          	KRPDEL
 
-      Auto-delay rate; the time elapsed before keyboard repeat be-
     gins. Initially set at 48 ($30; $28 for PAL machines) for 0.8 sec-
     onds; you can POKE it with the number of VBLANK intervals
     (1/60 second each) before repeat begins. A value of 60 would
     be a one-second delay. A value of 0 means no repeat.
730          	2DA          	KEYREP
 
-      The rate of the repeat; default is 6, which means ten characters
     per second (one each six VBLANK intervals after the delay
     above). POKE with the number of VBLANK intervals between
     repeats; with a value of 1, you get 60 characters per second (50
     on PAL systems)! A value of 0 provides one key repeat only per
     press.
731          	2DB          	NOCLIK
 
-      This is the keyboard click disable register; POKE with any non-
     zero number to disable the annoying keyboard sound pro-
     duced through your TV. POKE again with 0 to enable the sound.
     On the 1200XL, CTRL-F3 toggles the sound as well.
732          	2DC          	HELPFG
 
-      Register to hold the HELP key status; 17 is HELP has been
     pressed alone, 81 means it has been pressed with SHIFT, and
     145 with CTRL. This register can be cleared under program
     control only by POKEing it with 0. The OS ignores it otherwise.
733          	2DD          	DMASAV
 
-      This saves the DMA value from 559 ($22F) on the 1200XL when
     CTRL-F2 is pressed to disable the screen. On all XL/XEs except
     the 1200XL, if you POKE 559,0 to turn off the screen, the value is
     not saved in 733. However, if you POKE 733 with the DMA value
     (usually 34) at the next keystroke, the screen will automatically
     be activated again.
734          	2DE          	PBPNT
 
-      Print buffer pointer; moved from 29 ($1D) on the 400/800.
735          	2DF          	PBUFSZ
 
-      Print buffer size; moved from 30 ($1E) on the 400/800.
745          	2E9          	HNDLOD
 
-      Relocatable loader routine handler flag.
746-749          	2EA-2ED          	DVSTAT
 
-      Additional device status registers to contain information re-
     turned to the computer by the peripheral after the new type 3
     and 4 polls. The bytes contain:
     746/747   LSB/MSB of the handler size (must be an even
               number)
     748       Device SIO address to be used for loading
     749       Peripheral revision number
     The new poll types are fully explained in the 1200XL operating
     system manual; earlier poll types are described in the 400/800
     hardware manual. Basically, type 3 is an "are you there?" poll
     (device address $4F, command byte $40, AUX1 $4F, AUX2 $4F,
     checksum normal), and poll 4 is a null poll (values $4F, $40, $4E
     and $4E, respectively; checksum normal).
756          	2F4          	CHBAS
 
-      Character set select; default of 224. The international set can be
     selected by POKE 756,204 ($CC). On the 1200XL, the value in
     CHBAS is switched with that in CHSALT (619; $26B) whenever
     CTRL-F4 is used to toggle the alternate character set. The val-
     ues in the two registers are swapped and LED 2 is lit.
757          	2F5          	NEWROW
 
-      Moved from 96 ($60) in the 400/800.
758,759          	2F6,2F7          	NEWCOL
 
-      Moved from 97,98 ($61,$62) in the 400/800.
760          	2F8          	ROWINC
 
-      Moved from 121 ($79) in the 400/800.
761          	2F9          	COLINC
 
-      Moved from 122 ($7A) in the 400/800.
782          	30E          	JMPERS
 
-      Storage for hardware option jumpers on the 1200XL, intended to
     tell the OS how the system is configured; if bit 0 (POT 4) is not set
     (0), then the self-test will run. Bits 1-7 are unused. Used only in
     the 1200XL.
787          	313          	TEMP2
 
-      One-byte temporary storage register.
788          	314          	PTIMOT
 
-      Moved from 28 ($1C) in the 400/800. Same initial value (30).
829-831          	33D-33F          	PUPBT1-3
 
-      Power-up and reset validation registers 1-3. Used on warm start
     to verify the integrity of memory. The OS initializes these loca-
     tions to 92 ($5C), 147 ($93), and 37 ($25), respectively. When RE-
     SET is pressed, these bytes are checked, and it they are the
     same as initialized, a warm start is done; otherwise, a cold start
     occurs.
838,839          	346,347          	IOCB0
 
-      To send your output to the printer, POKE 838,202 and POKE
     839,254. To turn off the printer and send everything back to the
     screen, POKE 838,175 and POKE 839,242. This program from
     Matt Ratcliff allows you to toggle output between printer and
     screen by pressing SELECT (it works equally well on the
     400/800):
     10 DIM A$(1):CONSOL=53279:GRAPHICS 0:IOCB0E
        =838
     20 PHDLR=58422
     30 EHDLR=58374
     40 PL=PEEK(PHDLR):PH=PEEK(PHDLR+1)
     50 EL=PEEK(EHDLR):EH=PEEK(EHDLR+1)
     60 PRINT "Text will print continuously."
     70 PRINT "Press SELECT to toggle output"
     80 PRINT "between printer and screen.":?
     90 PRINT "Get printer ready and press RETUR
        N"
     100 INPUT A$:I=1:DIR=0
     110 PRINT I;" Press select to change output
         .":I=I+1
     120 IF PEEK(CONSOL)<>5 THEN 110
     130 IF DIR THEN POKE IOCB0E,EL:POKE IOCB0E+
         1,EH
     140 IF NOT DIR THEN POKE IOCB0E,PL:POKE IO
         CB0E+1,PH
     150 DIR= NOT DIR
     160 IF PEEK(CONSOL)<>7 THEN 160
     170 GOTO 110
     
     DOWNLOAD TOGGLE.BAS
1000          	3E8          	SUPERF
 
-      Screen editor register; cleared on entry to the "put byte" rou-
     tine, the editor changes keycodes 142-145 ($8E-$91) to 28-31
     ($1C-$1F; see 121; $79) and sets SUPERF to nonzero.
1001          	3E9          	CKEY
 
-      Moved from 74 ($4A) in the 400/800.
1002          	3EA          	CASSBT
 
-      Moved from 75 ($4B) in the 400/800.
1003          	3EB          	CARTCK
 
-      Cartridge checksum. A checksum of page one of the cartridge.
     The checksum is recalculated each VBLANK and checked
     against this register. If not the same, the OS assumes the car-
     tridge isn't there any more (was pulled out) and does a cold
     start; 1200XL only.
1004          	3EC          	DERRF
 
-      Screen open error flag; if zero, then no error, if nonzero, then OS
     can't initialize the screen editor.
1005-1015          	3ED-3F7          	ACMVAR
 
-      Reserved for OS variables; on power-up or cold start, all vari-
     ables between 1005 and 1023 ($3ED-$3FF), inclusive, are set to
     zero, but are left unchanged on warm start.
1016          	3F8          	BASICF
 
-      Shadow of current status of BASIC. Zero means ROM BASIC is
     enabled; nonzero means it's not. Must be in sync with disabling
     of ROM BASIC. To disable BASIC, set BASICF to nonzero, then do
     a warm start (press RESET); DOS will load and tell you there is
     no cartridge present when you try to return to BASIC.
1017          	3F9          	MINTLK
 
-      Unused.
1018          	3FA          	GINTLK
 
-      Cartridge interlock register; the complement of BASICF, above.
     It reads 1 when an external cartridge is installed, 0 when not
     (or ROM BASIC is in use). The value of TRIG3 (53267; $D103) is
     loaded here by the OS initialization routine. If at any time, the
     external cartridge is pulled, the system will crash.
1019,1020          	3FB,3FC          	CHLINK
 
-      Relocatable handler chain use; allows chaining of portions of
     handler routines.
1792-7419          	700-1CFB          	....
 
-      Used by DOS when loaded; otherwise available as free RAM.
3889          	F31          	DOS 3
 
-      If you PEEK here and get 76 ($4C), you have an early version of
     DOS 3 (the later version will read 78). To correct some errors in
     the earlier FMS files, type this in:
     10 FOR N=1 TO 9:READ A,B:POKE A,B:NEXT N
     20 DATA 3889,78,3923,78,3943,78,3929,76,389
        5,76
     30 DATA 3901,77,3935,77,3955,77,2117,240
     Better yet, get DOS 2.5 from Atari (supports double-density and
     the 130XE RAMdisk). DOS 3.0 saves in blocks, not sectors--of a
     minimum 1000 bytes per block. If you write a program 1001
     bytes long, it saves 2000 bytes, wasting 999 bytes on your disk.
20480-22527    $5000-$57FF    Self-test ROM
 
-      Self-test ROM when enabled, controlled by bit 7 of PORTB
     (54017; $D301). The self-test code is in a special ROM area
     underneath the GTIA, POKEY, ANTIC chips area (starting at
     53248; $D3000) and is moved (remapped) here when you type
     BYE in BASIC or when you POKE PORTB with the right value and
     JMP (or USR) to the initialization vector (see 58481; $E471 and
     58496-58499, $E480-$E483). RAM when self-test isn't enabled.
39967-40959          	9C1F-9FFF          	....
 
-      Display list and screen RAM, moved into lower memory if a
     cartridge is 16K (using RAM from 32767 to 49151 as well).
43234          	A8E2          	BASIC ROM
 
-      If you PEEK here and get 96 ($60), you have the BASIC Revision
     B ROMs. What you need is Revision C. B stands for Bugs! See
     Appendix 13 on enhancements and bugs. If you get 234 ($EA),
     you have Revision C. From Matt Ratcliff.
     You can turn BASIC off when you go to DOS by POKEing 1016
     ($3F8), then pressing RESET. The problem is to turn it back on
     again from DOS rather than rebooting the system. There is a
     public domain program by Matt Ratcliff on the Gateway BBS
     which does this for you.
Introduction to the OS ROM
 
- Atari modified the new XL/XE ROMs since Revision B. Atari main-
tained the handler and interrupt vectors, although the routines they
point to changed between versions.
Atari did produce a listed source code for the XL OS, although for
some reason it was never published for public sale as it was in-
tended. It may be available now through Atari--write and ask for it.
It is an excellent 500+ page resource document.
49152-52223          	C000-CBFF          	Interrupt handlers
 
-      Os ROM. In the 400/800, the block between 49152 and 53247
     was unused; now the area holds many of the interrupt handlers
     (vectored here from page two). Some 400/800 software checks
     for certain values in these locations and won't run if the value is
     not found. Use the Translator disk in that case (with the 400/800
     OS installed; the area between $C000 and $CEFF becomes user-
     accessible RAM). The area between 52069 ($CB65) and 52223
     ($CBFF) is empty (all zeros).
     A lot of interrupts are set to jump to 49357 or 49358 ($C0CD or
     $C0CE). The former contains a PLA statement followed by an
     RTI. The net result is a simple return back into the program
     without any other activity taking place.
     Bytes 49152-49163 ($C000-$C00B) are used to identify the com-
     puter and the ROM in the $C000-$DFFF block:
     Byte              Use
     49152-3/C000-1    Checksum (LSB/MSB) of all the bytes
                       in ROM except the checksum bytes
                       themselves.
     49154/C002        Revision date, stored in the form
                       DDMMYY. This is DD, day, usually $10.
     49155/C003        Revision date, month; usually $05.
     49156/C004        Revision date, year; usually $83.
     49157/C005        Reserved option byte; reads zero for
                       the 1200, 800XL, and 130XE.
     49158/C006        Part number in the form AANNNNNN;
                       AA is an ASCII character and
                       NNNNNN is a four-bit BCD digit. This is
                       byte A1.
     49159-62/C007-A   Part number, bytes A2, N1-N6 (each
                       byte has two N values of four bits
                       each).
     49163/C00B        Revision number. My 800XL and
                       130XE say 2.
     49164/C00C        Interrupt handler initialization
     49176/C018        NMI intitialization
     Interrupt handlers and other routines in the $C000 block:
     Entry        Handler or Use
     49196/C02C   IRQ processor
     49298/C092   BREAK key IRQ
     49312/C0A0   Continue IRQ processing
     49359/C0CF   Table of IRQ types and offsets (16 bytes)
     49378/C0E2   Immediate VBLANK NMI processing
     49743/C24F   Process countdown timer 1 expiration
     49890/C2E2   Process countdown timer 2 expiration
     49749/C255   Decrement countdown timer
     49778/C272   Set VBLANK parameters
     49802/C28A   Process deferred VBLANK NMI
     49808/C290   Perform warm start
     49834/C2AA   Process RESET
     49864/C2C8   Perform cold start
     49866/C2CA   Preset memory (cold and warm start
                  continuation)
     50217/C429   Initialize cartridge software
     50220/C42C   Process ACMI interrupt
     50237/C43D   BOOT ERROR message
     50248/C448   Screen editor specification (E:)
     50251/C44B   Table of interrupt handler vectors (same or-
                  der as RAM vectors at 512-549 ($200-$225)
     50289/C471   Miscellaneous initialization routines: OP-
                  TION key status checked at 50330 ($C49A);
                  BASIC enabled at 50337 ($C4A1)
     50394/C4DA   Hardware initialization
     50485/C535   Software and RAM variable initialization
     50571/C58B   Attempt disk boot
     50619/C5BB   Boot and initialize disk
     50633/C5C9   Complete boot and initialize
     50729/C629   Execute boot loader
     50747/C63B   Initialize booted software
     50750/C63E   Display BOOT ERROR message
     50777/C659   Get next sector routine
     50798/C66E   Attempt cassette boot
     50851/C6A3   Initialize DIO (disk I/O)
     50867/C6B3   Disk I/O (DIO)
     51002/C73A   Set buffer address
     51013/C745   Relocate relocatable routine to new
                  address
     51093/C795   Handle end record type
     51l5l/C7CF   Get byte
     51154/C7D2   Execute run at address
     51157/C7D5   Handle text record
     51281/C851   Relocate text into memory
     51309/C86D   Handle word reference record type
     51346/C892   Handle low-byte and one-byte record type
     51452/C8FC   Select and execute self-test
     51468/C90C   Initialize generic parallel device
     51507/C933   PIO--parallel device I/O; PIO vector tables
                  (see 58368, $E400) begin at 51601 ($C991)
     51631/C9AF   Select next parallel device
     51658/C9CA   Invoke parallel device handler
     51753/CA29   Load and initialize peripheral handler
     51799/CA57   Start of self-test offsets and text (uses hard-
                  ware values for character display)
     52054/CB56   Checksum linkage table
52224-53247          	CC00-CFFF          	CHARSET2
 
-      International character set, assembled in the same manner as
     the standard character set at 57344 ($E000). There are two
     character sets in the XL series, and you can switch between
     them by POKE 756,224 (standard) or POKE 756,204
     (international).
53279          	D01F          	CONSOL
 
-      If you hold down the OPTION key when booting an application
     on the XL, you disable BASIC (but no other cartridge), allowing
     the memory space to be used for applications, You generally
     need to keep the key held down only for the first few seconds of
     the boot.
53504-53759          	D100-D1FF          	....
 
-      Unused in both the 400/800 and XL models by the OS, this area
     is switched out when an external device connected to the
     expansion bus is selected and the device memory switched in.
     The situation is reversed when the device I/O is completed.
     Locations     Hex         Use
     53504-53758   D100-D1FE   Device registers
     53504         D100        Hardware get and put register
                               (HWGET, HWPUT); data from
                               the device on the bus is stored
                               here.
     53505         D101        Hardware reset and status reg-
                               ister (HWRSET for write--this re-
                               sets the get/put register;
                               HWSTAT for read).
     53759         D1FF        Hardware select register, shad-
                               owed by byte 583 ($247). Bit 0
                               is device 0, bit 1 device 1, and
                               so on. Writing to this byte de-
                               selects the FP ROM and selects
                               the device ROM (try looking at
                               it and subsequent locations
                               with MAC/65's DDT or a similar
                               tool while altering $D1FF).
54017          	D301          	PORTB
 
-      Since the XL and XE series no longer have a PORT B (on the
     400/800 this controls joystick ports 3 and 4), this register is used
     for LED control (1200XL only) and memory management.
     You can disable the ROM between 49152-53247 ($C000-$CFFF)
     and 55296-65535 ($D800-$FFFF) by setting bit 0 to 0 (the ROM
     area becomes RAM; note that the area between $D000 and
     $D7FF remains intact). However, unless another OS has been
     provided, the system will crash at the next interrupt (1/60 sec-
     ond later!), so you need to disable the interrupts first.
     Bit 1 controls BASIC; if 0, BASIC is enabled, if 1, it is disabled
     and the 8K RAM space enabled for program use. If you disable
     BASIC within a BASIC program, you lock up. Disable BASIC dur-
     ing a boot operation by holding down the OPTION key.
     Bits 2 and 3 control the 1200XL LEDs; 0 means on, 1 means off.
     LED 1 means the keyboard is disabled; LED 2 means the inter-
     national character set is selected. In the 130XE, these bits are
     used for bank switching 16K blocks of RAM. The 130XE allows
     you to use the extra memory as video memory or program/
     data memory. See the section on memory management in the
     13OXE at the end of this chapter.
     Bits 4-6 are reserved (unused) in the XL and 65XE. Bits 4 and 5
     in the 13OXE are used to enable bank switching (see below).
     Bit 7 controls the RAM region 20480-22527 ($5000-$57FF), nor-
     mally enabled 1). When disabled 0), the OS ROM in that area is
     enabled and access provided to the self-test code moved from
     53248-55295 ($D000-$D7FF).
     Try this: POKE 54017,PEEK(54017)-128 to enable the self-test
     ROM. Now type X=USR(20480). The self-test screen appears. The
     RAM is reset on power-up or warm start. Of course, you can al-
     ways simply type BYE to enter the test routines as well.
     Here's a program from Joe Miller of Koala Technologies which
     copies portions (skips the $D000-$D7FF block) of the OS into
     RAM, disables the ROM, then moves the copied portion back:
     100 REM RAMROM - Install RAMübased
     110 REM OS in an XL computer
     120 REM by Joe Miller
     130 REM March 23, 1985
     190 PRINT "MOVING OS INTO RAM"
     200 FOR I=1536 TO 1635
     210 READ B:POKE I,B:NEXT I
     220 B=USR(1536)
     230 PRINT CHR$(125)
     240 PRINT "RAM OS INSTALLED"
     250 PRINT "PRESS RETURN TO TEST IT"
     260 PRINT :PRINT :PRINT
     270 PRINT "POKE 57344,1"
     275 PRINT "{5 SPACES}$E000=1":PRINT
     280 PRINT "POKE 57344,0"
     290 POSITION 1,4
     300 DATA 169,0,133,203,133,205,169
     310 DATA 192,133,204,169,64,133,206
     320 DATA 160,0,177,203,145,205,200
     330 DATA 208,249,230,206,230,204,240
     340 DATA 12,165,204,201,208,208,237
     350 DATA 169,216,133,204,208,231,8
     360 DATA 120,173,14,212,72,169,0
     370 DATA 141,14,212,173,1,211,41
     380 DATA 254,141,1,211,169,192,133
     390 DATA 206,169,64,133,204,177,203
     400 DATA 145,205,200,208,249,230,204
     410 DATA 230,206,240,12,165,206,201
     420 DATA 208,208,237,169,216,133,206
     430 DATA 208,231,104,141,14,212,40
     440 DATA 104,96
     
     DOWNLOAD RAMROM.BAS
     You can make this into a machine language AUTORUN.SYS file
     by changing the loop to 1634, removing the number 104 in line
     440, and deleting the USR call in line 220. Go to DOS and do a
     binary save (option K) at addresses $600-$662, with a run ad-
     dress of $600. This will change your ROM OS into a RAM OS ev-
     ery time you boot up that disk. Pressing RESET switches the OS
     back to ROM. The machine language source code for this short
     program (also by Joe Miller) is included here because I felt it
     important for machine language programmers to see how this
     is done:
     ;Move XL OS ROM into RAM
     ;
     ;RAMROM--Installs the XL ROM-based
     ;  OS in RAM at the same address
     ;  space. This is useful for
     ;  making small patches to the
     ;  OS or for experimenting with
     ;  new design concepts, such as
     ;  multitasking, window
     ;  management, etc.
     ;
     ;    By Joe Miller.
     ;
     ;This version is configured
     ;as an AUTORUN.SYS file.
     ;
     SOURCE  EQU     $CB             ;zero page usage
     DEST    EQU     SOURCE+2
     START   EQU     $0600           ;START address
     OSROM   EQU     $C000           ;address of OS ROM start
     OSRAM   EQU     $4000           ;address of ROM
                                     destination
     NMIEN   EQU     $D40E           ;NMI enable register
     PORTB   EQU     $D301           ;memory mgt control
                                     latch
             ORG     START
             LDA     #low OSROM
             STA     SOURCE
             STA     DEST            ;initialize copy addrs
             LDA     #high OSROM
             STA     SOURCE+1
             LDA     #high OSRAM
             STA     DEST+l
             LDY     #0
                                     ;Repeat
     Pass1   LDA     (SOURCE),Y      ;copy ROM to RAM
             STA     (DEST),Y
             INY
             BNE     Pass1 
             INC     DEST+1
             INC     SOURCE+1
             BEQ     Swap            ;If done
             LDA     SOURCE+l
             CMP     #$D0
             BNE     Pass1           ;skip 2K block at $D000
             LDA     #$D8
             STA     SOURCE+1
             BNE     Pass1           ;Until SOURCE = $0000
     Swap    PHP                     ;save processor status
             SEI                     ;disable IRQs
             LDA     NMIEN
             PHA                     ;save NMIEN
             LDA     #0
             STA     NMIEN           ;disable NMIs
             LDA     PORTB
             AND     #$FE            ;turn off ROMs
             STA     PORTB           ;(leaving BASIC
                                     unchanged!)
             LDA     #high OSROM
             STA     DEST+1          ;set up block copy
             LDA     #high OSRAM
             STA     SOURCE+1
                                     ;Repeat
     Pass2   LDA     (SOURCE),Y      ;move RAM OS to proper
                                     address
             STA     (DEST),Y
             INY
             BNE     Pass2
             INC     SOURCE+1        ;move to next page
             INC     DEST+1
             BEQ     Enable          ;If complete
             LDA     DEST+1 
             CMP     #$D0
             BNE     Pass2           ;skip block at $D000
             LDA     #$D8
             STA     DEST+1
             BNE     Pass2           ;Until DEST = $000
     Enable  PLA
             STA     NMIEN           ;reestablish NMI mask
             PLP                     ;reenable IRQs
             RTS
             END     START
             
     DOWNLOAD RAMROM.ASM
     A sophisticated program called "RamMaster," by Matt Ratcliff,
     is available free through the Gateway BBS in St. Louis, Missouri.
     It not only creates a RAM OS, but it has a trap to keep the OS as
     RAM even when you press RESET. It also allows you to switch
     BASIC in and out from DOS. Probably the most elegant solution
     is the XL BOSS board which allows you to switch in a RAM OS,
     the older 800 OS, and the XL OS, as well as turn BASIC on or off
     with a few keypresses. It's available from Allen MacroWare in
     Redondo Beach, California.
     When you change the OS ROM into RAM, you can change all
     but a small portion of the OS at 53248-55295 ($D000-$D7FF),
     since it's RAM. You could always write an OS, load it into RAM,
     disable the ROM, and load yours in. You can change the
     character sets in their original locations rather than having to
     move them and use more memory. You could rewrite the han-
     dlers, interrupts, and other routines--almost anything.
     This is exactly what the Translator disk does when it writes the
     800 OS into the XL. Boot the Translator and place a regular DOS
     disk in at the prompt so that BASIC READY comes up. Now type:
     10 FOR N=57344 TO 57351
     20 READ A:POKE N,A:NEXT N
     30 DATA 255,1,1,1,1,1,1,1
     You'll see a "graph pad" screen: You've POKEd directly into
     the character set at $E000, altering the first character (space).
     This also means that the area from 49152 to 52991 ($C000 to
     $CEFF) isn't used--almost 4K of free RAM for player missiles,
     machine language routines, anything you need it for. Be care-
     ful not to run over into the interrupt handlers at 52992 ($CF00).
54019          	D303          	PBCTL
 
-      The PORT B controller on the 400/800; not used since there isn't
     one on the XL/XE series.
54528-54783          	D500-D5FF          	....
 
-      Unused in both XL and 400/800 models. Any access read or
     write to this area enables the cartridge control line CCNTL as in
     the cartridge interface in the 400/800.
55296-57343          	D800-DFFF          	FP
 
-      Floating-point package; although corrected, the entry point re-
     mains the same as in the 400/800. You now get an error if you
     try to get a LOG or LOG 10 of 0. This area becomes addressable
     by the device when the OS switches out ROM to perform I/O on
     a device connected to the expansion slot.
     There are several tables built into the FP package:
     Address      Table
     56909/DE4D   Power of 10 coefficients
     57202/DF72   Logarithm coefficients
     57262/DFAE   Arctangent coefficients (unused?)
     The OS switches the floating point out and switches in the par-
     allel bus interface (PBI) ROM when an external device attached
     through the bus is selected, switching it back when the I/O is
     completed. This means an external device can't use floating
     point or any software which does (such as BASIC).
     The first 26 bytes of the hardware ROM vector area (when OS
     ROM is deselected) are:
     Byte          Hex         Use
     55296/55297   D800/D801   ROM checksum LSB/MSB
                               (optional)
     55298         D802        ROM revision number
                               (optional)
     55299         D803        ID number (128; $80)
     55300         D804        Device type (optional)
     55301         D805        JMP instruction ($4C)
     55302/55303   D806/D807   I/O vector LSB/MSB
     55304         D808        JMP
     55305/55306   D809/D80A   Interrupt vector LSB/MSB
     55307         D80B        ID number (145; $91)
     55308         D80C        Device name in ASCII
                               (optional)
     55309/55310   D80D/D80E   Open vector LSB-1/MSB
     55311/55312   D80F/D810   Close vector LSB-1/MSB
     55313/55314   D811/D812   Get byte LSB-1/MSB
     55315/55316   D813/D814   Put byte LSB-1/MSB
     55317/55318   D815/D816   Status vector LSB-1/MSB
     55319/55320   D817/D818   Special vector LSB-1/MSB
     55321         D819        JMP
     55322/55323   D81A/D81B   Init vector LSB/MSB
     55324         D81C        Unused
     On a cold start, the OS polls for parallel devices, and if it finds
     one, JMPs (through 55321; $D819) to the INIT routine at
     55322/55323 ($D81A, $D81B) which places the address of the ge-
     neric parallel device handler into the handler tables with the
     device name.
57344-58367          	E000-E3FF          	CHARSET1
 
-      Standard (domestic) character set; default on power-up or RE-
     SET; pointed to by 756 (S2F4).
58368-65535          	E400-FFFF          	OS
 
-      The OS has been considerably rewritten and changed since the
     400/800. The ANTIC, PIA, and POKEY chips are the same, but
     many OS routines have been moved. The vectors in RAM have
     remained in place for the most part, so software which avails it-
     self of these locations can run on all machines, Always use the
     vectors when writing software to use OS routines, never the ac-
     tual routines themselves; they may change, while the vectors
     will not.
     Locations 58368-58495 ($E400-$E47F) still contain the vector ta-
     bles. but point to different locations than the 400/800 (for more
     information, refer back to the 400/800 section). The vectors (ex-
     cept JMP) all point to the address of the routine minus 1:
     Device & Loc      Open    Close  Get    Put    Status Special JMP to
     E:  58368 $E400   EF93    F2D2   F249   F2AF   F21D   F2C2    EF6E
     S:  58384 $E410   EF8D    F2D2   F17F   F1A3   F21D   F9AE    EF6E
     K:  58400 SE420   F21D    F21D   F2FC   F22C   F21D   F22C    EF6E
     P:  58416 $E430   FEC1    FF06   FEC0   FECA   FEA2   FEC0    FE99
     C:  58432 $E440   FCE5    FDCE   FD79   FDB3   FDCB   FCE4    FCDB
     The JMP vectors in locations 58448-58583 ($E450-$E4D7) remain
     the same, but point to new vector addresses:
     Label     Loc    JMP to
     DISKIV    E450   C6A3
     DISKINV   E453   C6B3
     CIOV      E456   E4DF
     SIOV      E459   C933
     SETBV     E45C   C272
     SYSBV     E45F   C0E2
     XITBV     E462   C28A
     SIOINV    E465   E95C
     SENDEV    E468   EC17
     INTINV    E46B   C00C
     CIOINV    E46E   E4C1
     SELFSV    E471   F223 (used to be BLKBVD)
     WARMSV    E474   C290
     COLDSV    E477   C2C8
     RBLOKV    E47A   FD8D
     CSOPIV    E47D   FCF7
     Several of these locations themselves are JMP locations to other
     routines, done to maintain compatibility with the older 800 OS.
     Some new fixed entry point vectors have been added:
     58496/E480   PUPDIV: Entry to power-on display (self-test
                  mode in all XL/XEs except 1200XL; Atari
                  logo screen display in the 1200XL). Try
                  X=USR(58496). Points to 61987 ($F223).
     58499/E483   SLFTSV: 1200XL only: entry to self-test mode.
                  Points to 20480 ($5000) (see PORTB above).
     58502/E486   PENTV: Entry to the handler uploaded from
                  peripheral or disk. Points to 61116 ($EEBC).
     58505/E489   PHUNLV: Entry to uploaded handler unlink.
                  Points to 59669 ($E915).
     58508/E48C   PHINIV: Entry to uploaded handler initializa-
                  tion. Points to 59544 ($E898).
58481          	E471          	SELFTST
 
-      Entry into the self-test mode by typing BYE in BASIC or X =
     USR(58481). This used to be the blackboard (Memo Pad)
     mode--a feature parents used to entertain their children, while
     keeping them from actually tinkering with the system or pro-
     grams. In the 1200XL, this is the location of the logo screen. I
     miss the blackboard mode myself; the self-test isn't really all
     that useful. There is no equivalent mode to blackboard in the
     XL/XE system.
58511          	E48F          	GPDVV
 
-      Generic parallel device handler general-purpose vector. You
     can use this to talk to any expansion port device; move this ad-
     dress into HATABS (794-831; $31A-$33F) along with an appro-
     priate device name such as V: or T:. See the appendix on the
     expansion bus. There are seven vectors in this table,
     corresponding to the vector tables at 58348 ($E400).
58528-58560          	E4A0-E4C0          	....
 
-      Blank area (all zeros).
58561          	E4C1          	ICIO
 
-      Initialize CIO.
58588          	E4DC          	IIN
 
-      IOCB not OPEN error routine.
58591          	E4DF          	CIO
 
-      The CIO area includes the following routines:
     Address        Routine
     58640/E510     Nonexistent device error
     58645/E515     Load peripheral handler for OPEN
     58650/E51A     Perform CIO command
     58687/E53F     Execute OPEN command
     58716/E55C     Initialize IOCB for OPEN
     58742/E576     Poll peripheral for OPEN
     58748/E57C     Execute CLOSE command
     58775/E597     Execute STATUS and SPECIAL commands
     58802/E5B2     Execute GET command
     58910/E610     Execute PUT command
     58992/E670     Set status
     58994/E672     Complete CIO operation
     59029/E695     Compute handler entry point
     59067/E6BB     Decrement buffer length
     59080/E6C8     Decrement buffer pointer
     59089/E6D1     Increment buffer pointer
     59096/E6D8     Set final buffer length
     59114/E6EA     Execute handler command
     59124/E6F4     Invoke device handler
     59135/E6FF     Search handler table
     59158/E716     Find device handler
59193          	E739          	PHR
 
-      Peripheral handler loader. Includes the following routines:
     Address        Routine
     59193/E739     Initialization
     59326/E7BE     Perform poll
     59358/E7DE     Load handler
     59414/E816     Get byte routine
     59443/E833     Get next load block
     59485/E85D     Search handler chain
     59540/E894     Handler warm start initialization
     59544/E898     Warm start initialization with chaining
     59550/E89E     Cold start initialization
     59584/E8C0     Initialize handler and update MEMLO
     59648/E900     Initialize handler
     59669/E915     Handler unlinking
59740          	E95C          	SIO
 
-      The SIO section includes the following routines:
     Address        Routine
     59740/E95C     Initialization
     59761/E971     SIO main routine
     59946/EA2A     Complete SIO operation
     59959/EA37     Wait for completion or ACK
     60040/EA88     Send buffer to serial bus
     60077/EAAD     Process serial output ready IRQ
     60140/EAEC     Process serial output complete
     60157/EAFD     Receive
     60199/EB27     Indicate timeout
     60204/EB2C     Process serial input ready IRQ
     60295/EB87     Set buffer pointers
     60317/EB9D     Process cassette I/O
     60433/EC11     Timer expiration
     60439/EC17     Enable SIO send
     60480/EC40     Enable SIO receive
     60502/EC56     Set for send or receive
     60548/EC84     Disable send or receive
     60570/EC9A     Get device timeout
     60585/ECA9     Table of SIO interrupt handlers (six bytes)
     60591/ECAF     Send to intelligent device
     60608/ECC0     Set timer and wait
     60616/ECC8     Compute baud rate
     60718/ED2E     Adjust VCOUNT value
     60733/ED3D     Set initial baud rate
     60871/EDC7     Process BREAK key
     60898/EDE2     Set SIO VBLANK parameters
60921          	EDF9          	TPFV
 
-      Table of POKEY frequency values (24 bytes).
60945          	EE11          	NTSC/PAL
 
-      Table of constant values.
60957          	EE1D          	Tables
 
-      Screen memory and display list tables.
     Address        Table
     60957/EE1D     Screen memory allocation
     60973/EE2D     Display list entry counts
     61005/EE4D     ANTIC graphics modes
     61021/EE5D     Display list vulnerability
     61037/EE6D     Left shift columns
     61053/EE7D     Mode column counts
     61069/EE8D     Mode row counts
     61085/EE9D     Right shift counts
     61101/EEAD     Display masks
61116          	EEBC          	PHE
 
-      Peripheral handler entry, includes the following routines:
     Address        Routine
     61177/EEF9     PH poll at OPEN
     61222/EF26     Put-byte routine for provisionally open IOCB
61294          	EF6E          	SIN
 
-      Initialize screen routine. Includes other screen handler routines:
     Address        Routine
     61326/EF8E     Perform screen OPEN
     61332/EF94     Perform editor OPEN
     61340/EF9C     Complete OPEN command
     61824/F180     Screen get-byte routine
     61839/F18F     Get data under cursor
     61860/F184     Screen put-byte routine
     61828/F184     Check end of line
     61898/F1CA     Plot point
     61929/F1E9     Display
     61960/F208     Set exit conditions
     61982/F21E     Screen STATUS
     61997/F22D     Screen editor SPECIAL (just RTS)
     61998/F22E     Screen editor CLOSE
     62026/F24A     Editor get-byte (see below)
     62128/F2B0     Editor put-byte (see below)
     62142/F2BE     Process character
62026          	F24A          	GETCHAR
 
-      New location for the "get character" routine (used to be at
     63038). If you use the routines for screen display in Machine
     Language for Beginners, you'll have to change this address for
     proper XL operation.
62128          	F2B0          	OUTCHAR
 
-      New location for the "put character" routine. See the note in
     62026. Several programs make use of an illegal call to the "get
     character" and "put character" routines, previously at 63038
     and 63140 ($F63E and F6A4), now at locations 62026 and 62128
     ($F24A and $F2B0), respectively. You may be able to correct
     some problems in your software by searching for and replac-
     ing the older vectors with the new locations.
62200          	F2F8          	IGN
 
-      Ignore character and do keyboard get-byte.
62205          	F2FD          	KGB
 
-      Keyboard GET-BYTE routine. The keyboard handler follows and
     includes the following routines:
     Address        Routine
     62432/F3E0     Escape character handler
     62438/F3E6     Move cursor up
     62451/F3F3     Move cursor down
     62464/F400     Move cursor left
     62474/F40A     Move cursor to right margin
     62476/F40C     Set cursor column
     62481/F411     Move cursor point
     62491/F41B     Move cursor to left margin
     62496/F420     Clear screen
     62528/F440     Move cursor home (upper-left corner)
     62586/F47A     Tab character handler
     62613/F495     Set tab
     62618/F49A     Clear tab
     62623/F49F     Insert character
     62677/F4D5     Delete character
     62732/F50C     Insert line
     62752/F52D     Delete line
     62806/F556     Sound bell
     62815/F55F     Cursor to bottom
     62821/F565     Double-byte double decrement
     62825/F569     Store data for fine scrolling
     62840/F578     Double-byte single decrement
     62880/F5A0     Set scrolling display list entry
     62892/F5AC     Convert cursor row/column to address
     62986/F60A     Advance cursor routines
     63073/F661     Return with scrolling
     63077/F665     Return
     63150/F6AE     Subtract end point
     63164/F6BC     Check cursor range routines
     63256/F718     Restore old data under cursor
63267          	F723          	BMI
 
-      Bitmap routines for the editor and screen handler.
63479          	F7F7          	SCR
 
-      Screen scroll routines.
63665          	F8B1          	CBC
 
-      Buffer count computation routines; various keyboard, editor,
     and screen follow, including:
     Address        Routine
     63768/F918     Delete line
     63804/F93C     Check for control character
     63820/F94C     Save row and column values
     63831/F957     Restore row and column
     63842/F962     Swap cursor with regular cursor position
     63875/F983     Sound key click
     63895/F997     Set cursor at left edge
     63910/F9A6     Set memory scan counter address
     63919/F9AF     Perform screen SPECIAL command
64260          	FB04          	TMSK
 
-      Various screen and keyboard tables begin here:
     Address        Table
     64260/FB04     Bit masks
     64264/FB08     Default screen colors (PF0-3, BAK)
     64269/FB0D     Control character routines (each entry is
                    three bytes; control character and two-byte
                    address of processing routine)
     64317/FB3D     Shifted function key routines (1200XL)
     64329/FB49     ATASCII to internal conversion constants
     64333/FB4D     Internal to ATASCII conversion constants
     64337/FB51     Keyboard definition (see below)
     64529/FC11     Function key definitions
64337          	FB51          	....
 
-      Start of the 192-byte keyboard definition table; see location 121,
     122 ($79, $7A).
64537          	FC19          	KIR
 
-      Keyboard IRQ processing routines; check and process charac-
     ter, CONTROL-1, HELP key, CONTROL and function keys (1200XL;
     although the code for function keys remains in the 800XL and
     XE series)
64708          FCC4	      FDL
     Process display list interrupt for fine scrolling.
64728          	FCD8          	CIN
 
-      Cassette initialization routine, followed by cassette I/O routines
     and table of NTSC/PAL constants for file leader length and
     beep duration.
65177          	FE99          	PIN
 
-      Printer initialization and I/O routines including:
Address        Routine
     65218/FEC2     Printer OPEN
     65227/FECB     Printer put-byte
     65261/FEED     Fill printer buffer
     65270/FEF6     Perform printer put
     65287/FF07     Printer CLOSE
     65300/FF17     Set up DCB for printer
     65348/FF44     Printer timeout from STATUS
     65355/FF4B     Process print mode
65395          	FF73          	VFR
 
-      ROM checksum verify routines for first 8K bank.
65426          	FF92          	VSR
 
-      Verify routines for ROM checksum, second 8K bank, including
     routines to examine checksum region and table of addresses to
     verify.
65518-65529          	FFEE-FFF9          	....
 
-      Checksum and identification data for the ROM area
     57344-65535 ($E000-$FFFF--see 49152, $C000 for more
     information):
     Byte              Use
     65518/FFEE        Revision date D1 and D2 (four-bit BCD)
     65519/FFEF        Revision date M1 and M2
     65520/FFF0        Revision date Y1 and Y2
     65521/FFF1        Option byte; should read 1 for the
                       1200XL (my 800XL reads 2)
     65522-26/FFF2-6   Part number in the form AANNNNNN
     65527/FFF7        Revision number (again, mine reads 2)
     65528-9/FFF8-9    Checksum, bytes (LSB/MSB)
     65527 and 65528 should read 221 ($DD) and 87 ($57) for the
     400/800 revision A ROMS; 243 ($F3) and 230 ($E6) for the B
     ROMS. PAL versions read 214/87 ($D6/$57) and 34/88 ($22/$58),
     respectively. The 1200XL should read 10 at 65527 for revision A
     and 11 for revision B. The 600XL should read 1 at 65527, and the
     800XL, 2. For the 1200XL, 64728 ($FCD8) should not read 162
     ($A2).
65530-65535          	FFFA-FFFF          	Machine vectors
 
-      Contain NMI, RESET (power-up), and IRQ service vectors, initial-
     ized to 49176 ($C0l8), 49834 ($C2AA), and 49196 ($C02C),
     respectively.
                                                                                                                       
Return to Table of Contents
| Previous Chapter
| Next Chapter