Skip to main content
? Erik 'ES of TEX' Simon, 1989

UNDOCUMENTED VARIABLES by Richard Karsmakers

Several months back,  Frank and myself already went digging  into 
the ST's ROM and came up with some interesting  things.  Now,  we 
have done some more investigating and again want to offer you  an 
even larger list of undocumented system variables.

Warning:  Since  Atari has made significant changes to the OS  of 
the new MEGA ST (stupid,  stupid),  many of these locations  will 
probably  have changed now.  The MEGA ST is not very much  enough 
compatible  and all entertainment software will still be  written 
for  the ST,  so I advise you only to use these system  variables 
when necessary (and if possible not in programs that also need to 
work on MEGA ST).

$502           Hardcopy (hardcopy routine vector)      L
$506           listin (parallel port status routine)   L
$50A           Lstout/Prt_vec
               (output char. to parallel port routine) L
$50E           Auxostat (RS-232 output status routine) L
$512           Auxout (RS-232 output routine)          L

$840*          Pathname buffer
$93A           Return address of the auto files        L
$93E           Pathname address (/auto/*.prg)          L
$942           Filename address (/*.prg)               L
$946           DMA address                             L
$964*          Filename in autofolder buffer
$972*          Whole name buffer
 
HARDCOPY ROUTINE VARIABLES

$992           Buffer for "_v_bas_ad" when hardcopy    L
$996           Offset                                  W
$998           Screen width                            W
$99A           Screen height                           W
$99C           Left margin                             W
$99E           Right margin                            W
$9A0           Buffer for "sshiftmd"                   W
$9A2           Quality mode                            W
$9A4           Color palette address                   L
$9A8           Printer table                           W
$9AA           Parallel/serial mode flag               W
$9AC           Mask pointer                            W
MEMORY USED BY THE FLOPPIES

$9B0           Retrycnt (Retry count)                  W
$9B2           Write protect status                    W
$9B4           Wplatch (Status unsure?)                W
$9B6           Acctim (Access time)                    L
$9BE           Motor on flag                           B
$9C0           Deslflg (Deselect flag)                 W
$9C2           Cdev (Device number)                    W
$9C4           Ctrack (Track number)                   W
$9C6           Csect (Sector number)                   W
$9C8           Cside (Side number)                     W
$9CA           Ccount (Sector number)                  W
$9CC           CDMA (DMA buffer for bad sector list)   B
$9CD           DMA high                                B
$9CE           DMA mid                                 B
$9CF           DMA low                                 B
$9D0           Edma (End of DMA address)               L
$9D4           Spt (Sectors per Track for format)      W

$9D6           Interlv (Interleave factor for format)  W
$9D8           Virgin (Default fill value for format)  W
$9DB           DMA Address                             B
$9DC           DMA Address                             B
$9DD           DMA Address                             B
$9DE           Default error                           W
$9E0           Currerr (Disk Drive TOS error number)   W

$A06           Address DSB0 (Drive A)                  L
$A0A           Address DSB1 (Drive B)                  L

BUFFERS

$A0E*          RS-232 input buffer

$B0E*          RS-232 output buffer

$C0E*          Keyboard buffer

$D0E*          MIDI buffer

$D8E           Iorec for RS232                         L
$DB0           Iorec for Keyboard                      L
$DBE           Iorec for MIDI                          L
$DCC           Keyboard/MIDI table                     L
$DD0           Pointer to Keyboard error routine       L
$DD4           Pointer to MIDI error routine           L
$DD8           Statvec (IKBD Status package)           L
$DDC           Mousevec (Mouse action)                 L
$DE0           Jdostime (Time vector)                  L
$DE4           Joyvec (Joystick action)                L
$DE8           MIDI sys-vector                         L
$DEC           IKBD sys-vector                         L
$DF0           Keyboard status                         B
$DF1           IKBD index                              B
$DFE           Mouse position                          B

$E01           Pointer to clock time buffer            L
$E07           Joystick data                           B
$E0A           New time                                L
$E0E           Time to be converted                    L
$E18           Pointer to end of time buffer/mouse
                emulator buffer                        L
$E1B           Shift status                            B
$E20           Pointer to shifted keyboard table       L
$E28           Mouse buffer
$E39           Repeat flag                             B
$E3C           Keyboard delay #1                       B
$E3D           Keyboard delay #2                       B
$E3E           Last time                               L

$E44           Music data pointer (for Xbios 32 )      L
$E48           Temporary storage register (Xbios 32)   L

$E4A           RS232 printer check flag                B
$E4C           Handshake flag                          B

$167A - $1879  Sector buffer (boot buffer)/also used as
                internal PTSIN array

$16A2          Horizontal Alignment                    W
$16A4          Vertical Alignment                      W

MEMORY USED FOR TEXT OUPUT WITH VDI FUNCTIONS 8 AND 11

$16A6          Text width in pixels                    W
$16A8          Text heigth in pixels                   W
$16AA          X-difference for inter-word spacing     W
$16AC          Y-difference for inter-word spacing     W
$16AE          Rest counter for inter-word spacing     W
$16B0          X-rest for inter-word spacing           W
$16B2          Y-rest for inter-word spacing           W
$16B4          X-diference for inter-character spacing W
$16B6          Y-difference for inter-character spac.  W
$16B8          Rest counter for inter-character spac.  W
$16BA          X-rest for inter-character spacing      W
$16BC          Y-rest for inter-character spacing      W

$16BE          ???                                     W

$197A - $1A7A  Internal copy of PTSIN Array         128W

$25AE          Start angle                             W
$25B0          Current font address                    L
$25B4          Part of circle length                   W
$25BC          End angle                               W
$25BE          Counter                                 W
$25C0          Y-maximum for filled area               W
$25C2          Y-minimum for filled area               W
$25C4                                                  W

$25C8          Begin style                             W
$25CA          End style                               W
$25CC          Color index for polygon fill            W
$25CE          Fill perimeter visibility               W

$25D8          X-coördinate of circle middle           W
$25DA          Radius x                                W
$25DE          Y-coördinate of circle middle           W
$25E0          Radius y                                W

SPRITE DEFINITION BLOCK

$25E2          X-offset action point                   W
$25E4          Y-offset action point                   W
$25E6          Format flag (XOR/VDI)                   W
$25E8          Background color                        W
$25EA          Foreground color                        W
$25EC          Background pattern 0                    W
$25EE          Foreground pattern 0                    W
$25F0          Background pattern 1                    W
$25F2          Foreground pattern 1                    W
$25F4          Background pattern 2                    W
$25F6          Foreground pattern 2                    W
$25F8          Background pattern 3                    W
$25FA          Foreground pattern 3                    W
$25FC          Background pattern 4                    W
$25FE          Foreground pattern 4                    W
$2600          Background pattern 5                    W
$2602          Foreground pattern 5                    W
$2604          Background pattern 6                    W
$2606          Foreground pattern 6                    W
$2608          Background pattern 7                    W
$260A          Foreground pattern 7                    W
$260C          Background pattern 8                    W
$260E          Foreground pattern 8                    W
$2610          Background pattern 9                    W
$2612          Foreground pattern 9                    W
$2614          Background pattern 10                   W
$2616          Foreground pattern 10                   W
$2618          Background pattern 11                   W
$261A          Foreground pattern 11                   W
$261C          Background pattern 12                   W
$261E          Foreground pattern 12                   W
$2620          Background pattern 13                   W
$2622          Foreground pattern 13                   W
$2624          Background pattern 14                   W
$2626          Foreground pattern 14                   W
$2628          Background pattern 15                   W
$262A          Foreground pattern 15                   W

EXTENDED WORKSTATION INFORMATION

$262C          Screen type                             W
$262E          Number of background colors in colpal   W
$2630          Supported text effects                  W
$2632          Raster scaling                          W
$2634          Number of bit planes                    W
$2636          Lookup table support                    W
$2638          Performance factor                      W
$263A          Contour fill possibility                W
$263C          Text rotation possibility               W
$263E          Number of writing modes                 W
$2640          Level input possibility                 W

$2642          Text alignment possibility              W
$2644          Inking possibility                      W
$2646          Rubberbanding possibility               W
$2648          Maximal number of coördinates for
                polyline, polymarker and fill          W
$264A          Maximal size of INTIN                   W
$264C          Number of mouse buttons                 W
$264E          Style for wide lines                    W
$2650          Writing modes for wide lines            W
$2652 - $2684  Reserved                              26W

WORKSTATION INFORMATION

$2686          Screen width in pixels                  W
$2688          Screen height in pixels                 W
$268A          Exact scaling possibility               W
$268C          Width of a pixel in micrometer          W
$268E          Height of a pixel in micrometer         W
$2690          Number of characters heights            W
$2692          Number of line types                    W
$2694          Number of line widths                   W
$2696          Number of marker types                  W
$2698          Number of marker sizes                  W
$269A          Number of textfaces                     W
$299C          Number of patterns                      W
$299E          Number of hatch styles                  W
$26A0          Number of predefined colors             W
$26A2          Number of GDPs                          W
$26A4          GDP 1 - Rectangle                       W
$26A6          GDP 2 - Part of circle                  W
$26A8          GDP 3 - Piece of pie                    W
$26AA          GDP 4 - Circle                          W
$26AC          GDP 5 - Ellipse                         W
$26AE          GDP 6 - Part of ellipse                 W
$26B0          GDP 7 - Part of elliptical pie          W
$26B2          GDP 8 - Rounded rectangle               W
$26B4          GDP 9 - Filled rounded rectangle        W
$26B6          GDP 10 - Specified graphics text        W
$26B8          GDP 1 attribute                         W
$26BA          GDP 2 attribute                         W
$26BC          GDP 3 attribute                         W
$26BE          GDP 4 attribute                         W
$26C0          GDP 5 attribute                         W
$26C2          GDP 6 attribute                         W
$26C4          GDP 7 attribute                         W
$26C6          GDP 8 attribute                         W
$26C8          GDP 9 attribute                         W
$26CA          GDP 10 attribute                        W
$26CC          Color possibility                       W
$26CE          Text rotation possibility               W
$26D0          Area fill possibility                   W

$26D2          Cell array possibility                  W
$26D4          Number of colors obtainable             W

$26D6          Number of locator devices               W
$26D8          Number of valuator devices              W
$26DA          Number oh choice devices                W
$26DC          Number of string devices                W
$26DE          Workstation type                        W

MOUSE DATA

$26E0          Mouse X-position                        W
$26E2          Mouse Y-position                        W
$26E4          Mouse show/hide flag                    W
$26E6          Mouse button status                     W

RGB INTENSITIES FOR COLORS 0-15

$26E8          Red 0                                   W
$26EA          Green 0                                 W
$26EC          Blue 0                                  W
$26EF          Red 1                                   W
$26F0          Green 1                                 W
$26F2          Blue 1                                  W
$26F4          Red 2                                   W
$26F6          Green 2                                 W
$26F8          Blue 2                                  W
$26FA          Red 3                                   W
$26FC          Green 3                                 W
$26FE          Blue 3                                  W
$2700          Red 4                                   W
$2702          Green 4                                 W
$2704          Blue 4                                  W
$2706          Red 5                                   W
$2708          Green 5                                 W
$270A          Blue 5                                  W
$270C          Red 6                                   W
$270E          Green 6                                 W
$2710          Blue 6                                  W
$2712          Red 7                                   W
$2714          Green 7                                 W
$2716          Blue 7                                  W
$2718          Red 8                                   W
$271A          Green 8                                 W
$271C          Blue 8                                  W
$271E          Red 9                                   W
$2720          Green 9                                 W
$2722          Blue 9                                  W
$2724          Red 10                                  W
$2726          Green 10                                W
$2728          Blue 10                                 W
$272A          Red 11                                  W
$272C          Green 11                                W
$272E          Blue 11                                 W
$2730          Red 12                                  W
$2732          Green 12                                W
$2734          Blue 12                                 W
$2736          Red 13                                  W
$2738          Green 13                                W
$273A          Blue 13                                 W
$273C          Red 14                                  W
$273E          Green 14                                W
$2740          Blue 14                                 W
$2742          Red 15                                  W
$2744          Green 15                                W
$2746          Blue 15                                 W
WORKSTRATION PTSOUT INFO

$2748          Minimal character width                 W
$274A          Minimal character heigth                W
$274C          Maximal character width                 W
$274E          Maximal character heigth                W
$2750          Minimal line width                      W
$2752          0                                       W
$2754          Maximal line width                      W
$2756          0                                       W
$2758          Minimal marker width                    W
$275A          Minimal marker height                   W
$275C          Maximal marker width                    W
$275E          Maximal marker height                   W

$2766          ASCII-and scan code of pressed key      W
$2768          Input mode, choice                      W
$276A          Virtual workstation parameter address   L
$276E          Fontaddress of default system font face
                table                                  L
$2772          Address of 6*6 font in RAM              L
$2776          Address of 8*8 font in RAM              L
$277A          Font address of loaded font             L
$277E          Font address                            L
$2782          Number of (system) text faces           W

$2786          Input mode, locator                     W

$27DA          Input mode, string                      W
$27DC          Input mode, valuator                    W
$27DE          Mouse flag (mousebutton pressed, mouse
                move)                                  W
$27E0          Cursor on flag                          W
$27E2          Address of mouse coördinates            L

$27E7          Mouse update flag                       B
$27E8          Return address of GEMDOS call           L
$27EC          Address of save area for cursor pos.    L

SPRITE SAVE BUFFER

$28F8          Timer Interrupt                         L
$28FC          Old vector timer interrupt              L
$2900          Button change vector (from mouse)       L
$2904          Cursor change vector                    L
$2908          Mouse movement vector                   L

VDI ESC_VARIABLES

$290C          Character height                        W
$290E          Maximal cursor column                   W
$2910          Maximal cursor line                     W
$2912          Bytes per character line                W
$2914          Background color                        W
$2916          Character color                         W
$2918          Screen address of cursor                L
$291C          Offset in bytes                         W
$291E          Current cursor column                   W
$2920          Current cursor line                     W
$2922          Load cursor flash rate flag             B
$2923          Cursor flash counter                    B
$2924          Pointer to font data                    L
$2928          Largest ASCII code in font              W
$292A          Lowest ASCII code in font               W
$292C          Form_width (width of a font)            W
$292E          Screen width in bits                    W
$2930          Pointer to font offset data             L
$2934          Cursor flag                             B
                Bit 0 = cursor flash on/off
                Bit 1 = cursor phase
                Bit 2 = Cursor on/off
                Bit 3 = line wrap on/off
                Bit 4 = reverse on/off
                Bit 5 = position saved yes/no
                Bit 6 = update flag
$2936          Screen height in bits                   W
$2938          Bytes per screen line                   W

LINE A VARIABLES (This might be the notorious VDIBASE)

$293A          V_planes (Number of bit planes)         W
$293C          V_lin_wr (Bytes per screen line)        W
$293E          Address of CONTRL array                 L
$2942          Address of INTIN array                  L
$2946          Address of PTSIN array                  L
$294A          Address of INTOUT array                 L
$294E          Address of PSTOUT array                 L
$2952          _Fg_bp_1                                W
$2954          _Fg_bp_2                                W
$2956          _Fg_bp_3                                W
$2958          _Fg_bp_4                                W
$295A          _Lst_lin                                W
$295C          _Ln_mask (VDI line style)               W
$295E          _Wrt_mode (writing mode)                W
$2960          _X1                                     W
$2962          _Y1                                     W
$2964          _X2                                     W
$2966          _Y2                                     W
$2968          _Patptr (pointer to fill pattern)       L
$296C          _Patmsk (fill pattern mask)             W
$296E          _Multifill (multi-plane fill flag)      W
$2970          _Clip (clipping flag)                   W
$2972          _Xmn_clip                               W
$2974          _Ymn_clip                               W
$2976          _Xmx_clip                               W
$2978          _Ymx_clip                               W
$297A          _Xacc_dda                               W
$297C          _Dda_inc                                W
$297E          _T_sclsts                               W
$2980          _Mono_status                            W
$2982          _Sourcex                                W
$2984          _Sourcey                                W
$2986          _Destx                                  W
$2988          _Desty                                  W
$298A          _Delx                                   W
$298C          _Dely                                   W
$298E          _Fbase                                  L
$2992          _Fwidth                                 W
$2994          _Style                                  W
$2996          _Litemask                               W
$2998          _Skewmask                               W
$299A          _Weight                                 W
$299C          _R_off                                  W
$299E          _L_off                                  W
$29A0          _Scale                                  W
$29A2          _Chup                                   W
$29A4          _Text_fg                                W
$29A6          _Scrtchp                                L
$29AA          _Scrpt2                                 W
$29AC          _Text_bg                                W
$29AE          _Copytran                               W
$29B0          Address of a routine for contour fill   L

$29B4          Maximum access time (*20 Ms)            L
$29B8          Last random number                      L

USED WITH HARDCOPY

$29BC          Printer port flag                       B
$29BE          P_blkptr (Pointer to buffer memory for
                hardcopy)                              L
$29C2          P_offset                                W
$29C4          P_width                                 W
$29C6          P_height                                W
$29C8          P_left                                  W

$29CA          P_write                                 W
$29CC          P_srcres (Screen resolution)            W
$29CE          P_destres (Printer resolution)          W
$29D0          P_colpal (pointer to color palette)     L
$29D4          P_type                                  W
$29D6          P_port                                  W
$29D8          P_masks (default mask)                  L

$4150          Blue level for color printer (hardcopy) W
$415C - $4147  8*8 font header
$4DB8          Address of BPB                          L
$4DBA          ????
$5220*         Directory buffer

$5622          Mark diskette number                    W
$5624          Red level for color printer (hardcopy)  W

$575E          Atari Color Matrix Printer flag         B

$5780          Epson B/W Matrix Printer flag           B
$578C*         Workstation Parameter buffer
$5FE4          Medium resolution indicator (f. hardcop)B
$5FE6          High resolution indicator (for hardcopy)B
$5FE8          Green level for color printer (hardcopy)W
$5FFE          Quality mode flag (for hardcopy)        B

$6032 - $6079  8*16 System Font header
$609A          Low resolution indicator (for hardcopy) B

$609C          Atari Daisywheel Printer flag           B

The  following conventions were used in this  table:  First,  the 
address  is given in hexadecimal notation.  When a '*'  is  added 
after the address,  this means that it is no numeric variable but 
a piece of memory (often used to store a lot of numeric variables 
or  strings).  In  the middle column,  you'll find a  very  brief 
description.  The  rightmost column beholds the  variable  length 
character: B means byte, W means word and L means longword.

The  information  displayed  in this article was  taken  from  ST 
Intern  and Atari ST Gem,  both from Data Becker,  as well as  my 
personal digging in the operating system (sometime together  with 
Frank).

Now  for  some practical use of some  of  these  variables.  When 
checking the variables that are used by the floppies,  is is very 
handy  to  use $9C2 to $9C8.  If you can  check  these  variables 
constantly  (using an interrupt routine) you can always  keep  an 
eye on which drive,  side, track and sector the drive is working. 

In your own programs,  you might just want to check if the  write 
protect  notch is closed or not (so that you can or cannot  write 
on a disk).  These are the possible values of the WP Status  flag 
at $9B2 (which is a word):

 %0000000000000000          Write on A as well as B
 %1111111100000000          Write possible only on B
 %0000000011111111          Write possible only on A
 %1111111111111111          No writing possible at all

This is a 'read-only' variable. You cannot simply POKE a value in 
it  so that you can write on write-protected disks,  for  example 
(that would have been nice, wouldn't it?). This variable is handy 
to use in a copy program or something like that.

When you're writing a game, you'll undoubtedly want to know where 
to get joystick data.  On location 3593 (decimal),  you'll find a 
byte with the following bits:

 %00000000
      ^^^^
      ||||
      |||¯¯¯¯¯¯¯¯¯¯¯¯¯ Up
      ||¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Down
      |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Left
      ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Right

Combinations  are also possible - in that case several bits  will 
be  set.  The  firebutton  data can be fetched  from  0  of  3582 
(decimal). That location will give the following values:

 %11111000             No buttons pressed
 %11111001             Joystick port 1 button pressed
 %11111010             Joystick port 0/mouse button pressed

These  methods only work to read joystick port 1 (the back  one). 
Do not use this variable to check the mouse key!
We were talking about the mouse, weren't we? Somewhere in memory, 
you  can easily PEEK the values of the mouse  position,  and  the 
nice thing is: These variables are READ and WRITE variables (that 
means  that  you can also change the mouse  position  using  this 
piece of memory!).

The interesting locations are:

 $26E0                 Mouse X position (word)
 $26E2                 Mouse Y position (word)
 $26E6                 Mouse button status (word)

As these locations are old a word long,  you'll have to use DPEEK 
in  GfA  Basic or PEEK in ST Basic (PEEK in GfA always  works  on 
only  one byte,  which unfortunately happens to be no  more  than 
half a word).

This   following  small  GfA  Basic  programs  demonstrates   the 
possibilities of these POKEs and PEEKs.  It simply prints all the 
contents of the appropriate mouse addresses,  and when you hit  a 
key it puts the mouse in the right top corner.

Do
  Print At(10,12);Dpeek(&H26E0)
  Print At(10,14);Dpeek(&H26E2)
  Print At(10,18);Dpeek(&H26E6)
  If Inp?(2)
    Dpoke (&H26E0),0
    Dpoke (&H26E2),0
    A=Inp(2)
  Endif
Loop

There  are  also two locations that contain the line  and  column 
that the cursor is on (also possible to READ as well as WRITE):

 $291E                 Cursor Column
 $2920                 Cursor Line

These  are  both  words (16 bits) and you can  PEEK  the  current 
cursor position as well as POKEing is somewhere on the screen.

Then  there's a last useful location:  The shift status  byte  at 
$E1B  (which is actually present at $E61 in the MEGA  ST!).  This 
location  is also used by GfA Basic to check if  the  ALT-CONTRL-
SHIFT keys are pressed. This doesn't work on the MEGA ST anymore, 
but if you run the following program with your GfA Basic disk  in 
the drive,  it will modify the GfA Basic (only version 2.0!!). It 
was found out and written originally by Claud Brod and  published 
in September's "ST Computer" magazine.

Open "U",#1,"\GFABASIC.PRG"
Seek #1,&H63AD
Out #1,&H61
Close #1

And what about the actual values that this variable can get?  The 
individual  bits  in  this  byte each  have  their  own  specific 
meaning:
 Bit 0                 Right Shift                     (1)
 Bit 1                 Left Shift                      (2)
 Bit 2                 Control                         (4)
 Bit 3                 Alternate                       (8)
 Bit 4                 Caps Lock                       (16)
If  you'd  PEEK this address and you'd get a value  of  31,  this 
would mean that all the special keys are pressed.

Disclaimer
The text of the articles is identical to the originals like they appeared in old ST NEWS issues. Please take into consideration that the author(s) was (were) a lot younger and less responsible back then. So bad jokes, bad English, youthful arrogance, insults, bravura, over-crediting and tastelessness should be taken with at least a grain of salt. Any contact and/or payment information, as well as deadlines/release dates of any kind should be regarded as outdated. Due to the fact that these pages are not actually contained in an Atari executable here, references to scroll texts, featured demo screens and hidden articles may also be irrelevant.