]> git.sur5r.net Git - cc65/blob - include/_atarios.h
Access Atari OS variables by structure.
[cc65] / include / _atarios.h
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                  _atarios.h                                               */
4 /*                                                                           */
5 /*            Internal include file, do not use directly                     */
6 /*                                                                           */
7 /*                                                                           */
8 /* This software is provided 'as-is', without any expressed or implied       */
9 /* warranty.  In no event will the authors be held liable for any damages    */
10 /* arising from the use of this software.                                    */
11 /*                                                                           */
12 /* Permission is granted to anyone to use this software for any purpose,     */
13 /* including commercial applications, and to alter it and redistribute it    */
14 /* freely, subject to the following restrictions:                            */
15 /*                                                                           */
16 /* 1. The origin of this software must not be misrepresented; you must not   */
17 /*    claim that you wrote the original software. If you use this software   */
18 /*    in a product, an acknowledgment in the product documentation would be  */
19 /*    appreciated but is not required.                                       */
20 /* 2. Altered source versions must be plainly marked as such, and must not   */
21 /*    be misrepresented as being the original software.                      */
22 /* 3. This notice may not be removed or altered from any source              */
23 /*    distribution.                                                          */
24 /*                                                                           */
25 /*****************************************************************************/
26
27 #ifndef __ATARIOS_H
28 #define __ATARIOS_H
29
30
31 /* IOCB Command Codes */
32
33 #define IOCB_OPEN        0x03  /* open */
34 #define IOCB_GETREC      0x05  /* get record */
35 #define IOCB_GETCHR      0x07  /* get character(s) */
36 #define IOCB_PUTREC      0x09  /* put record */
37 #define IOCB_PUTCHR      0x0B  /* put character(s) */
38 #define IOCB_CLOSE       0x0C  /* close */
39 #define IOCB_STATIS      0x0D  /* status */
40 #define IOCB_SPECIL      0x0E  /* special */
41 #define IOCB_DRAWLN      0x11  /* draw line */
42 #define IOCB_FILLIN      0x12  /* draw line with right fill */
43 #define IOCB_RENAME      0x20  /* rename disk file */
44 #define IOCB_DELETE      0x21  /* delete disk file */
45 #define IOCB_LOCKFL      0x23  /* lock file (set to read-only) */
46 #define IOCB_UNLOCK      0x24  /* unlock file */
47 #define IOCB_POINT       0x25  /* point sector */
48 #define IOCB_NOTE        0x26  /* note sector */
49 #define IOCB_GETFL       0x27  /* get file length */
50 #define IOCB_CHDIR_MYDOS 0x29  /* change directory (MyDOS) */
51 #define IOCB_MKDIR       0x2A  /* make directory (MyDOS/SpartaDOS) */
52 #define IOCB_RMDIR       0x2B  /* remove directory (SpartaDOS) */
53 #define IOCB_CHDIR_SPDOS 0x2C  /* change directory (SpartaDOS) */
54 #define IOCB_GETCWD      0x30  /* get current directory (MyDOS/SpartaDOS) */
55 #define IOCB_FORMAT      0xFE  /* format */
56
57
58 /* I/O control block */
59
60 typedef struct {
61     unsigned char   handler;    /* handler index number (0xff free) */
62     unsigned char   drive;      /* device number (drive) */
63     unsigned char   command;    /* command */
64     unsigned char   status;     /* status of last operation */
65     void*           buffer;     /* pointer to buffer */
66     void*           put_byte;   /* pointer to device's PUT BYTE routine */
67     unsigned int    buflen;     /* length of buffer */
68     unsigned char   aux1;       /* 1st auxiliary byte */
69     unsigned char   aux2;       /* 2nd auxiliary byte */
70     unsigned char   aux3;       /* 3rd auxiliary byte */
71     unsigned char   aux4;       /* 4th auxiliary byte */
72     unsigned char   aux5;       /* 5th auxiliary byte */
73     unsigned char   spare;      /* spare byte */
74 } IOCB;
75
76
77 /* DOS 2.x zeropage variables */
78
79 typedef struct {
80     unsigned char*  zbufp;      /* points to user filename */
81     unsigned char*  zdrva;      /* points to serveral buffers (mostly VTOC) */
82     unsigned char*  zsba;       /* points to sector buffer */
83     unsigned char   errno;      /* number of occured error */
84 } DOS2X;
85
86
87 /* A single device handler formed by it's routines */
88
89 typedef struct {
90     void *open;                 /* address of OPEN routine -1 */
91     void *close;                /* address of CLOSE routine -1 */
92     void *get;                  /* address of GET BYTE routine -1 */
93     void *put;                  /* address of PUT BYTE routine -1 */
94     void *status;               /* address of GET STATUS routine -1 */
95     void *special;              /* address od SPECIAL routine -1 */
96     void (*init)(void);         /* init routine (JMP INIT) */
97     void *reserved;             /* unused */
98 } DEVHDL;
99
100
101 /* List of device handlers, as managed in HATABS */
102
103 typedef struct {
104     unsigned char   id;         /* ATASCII code of handler e.g. 'C','D','E','K','P','S','R' */
105     DEVHDL*         devhdl;     /* Pointer to routines of device */
106 } HATABS;
107
108 /* Floating point register */
109
110 typedef struct {
111 #ifdef OS_REV2
112     unsigned char fr;
113     unsigned char frm[5];       /* 5-byte register mantissa */
114 #else
115     unsigned char fr[6];        /* 6 bytes for single register */
116 #endif
117 } FPREG;
118
119 enum {                          /* enum for access of floating point registers */
120     R0 = 0,                     /* (to use as index) */
121     RE = 1,
122     R1 = 2,
123     R2 = 3
124 } FPIDX;
125
126
127 /* Define a structure with atari os register offsets */
128
129 struct __os {
130
131     // --- Zero-Page ---
132
133 #ifdef OSA
134     unsigned char*  linzbs;                 // = $00/$01        LINBUG RAM (WILL BE REPLACED BY MONITOR RAM)
135 #else           
136     unsigned char   linflg;                 // = $00            LNBUG FLAG (0 = NOT LNBUG)
137     unsigned char   ngflag;                 // = $01            MEMORY STATUS (0 = FAILURE)
138 #endif          
139     unsigned char*  casini;                 // = $02/$03        CASSETTE INIT LOCATION
140     unsigned char*  ramlo;                  // = $04/$05        RAM POINTER FOR MEMORY TEST
141                 
142 #ifdef OSA           
143     unsigned char   tramsz;                 // = $06            FLAG FOR LEFT CARTRIDGE
144     unsigned char   tstdat;                 // = $07            FLAG FOR RIGHT CARTRIDGE
145 #else           
146     unsigned char   trnsmz;                 // = $06            TEMPORARY REGISTER FOR RAM SIZE
147     unsigned char   tstdat;                 // = $07            UNUSED (NOT TOUCHED DURING RESET/COLD START)
148 #endif
149             
150     // Cleared upon Coldstart only                
151                     
152     unsigned char   warmst;                 // = $08            WARM START FLAG
153     unsigned char   bootq;                  // = $09            SUCCESSFUL BOOT FLAG   
154     void (*dosvec)(void);                   // = $0A/$0B        DISK SOFTWARE START VECTOR
155     void (*dosini)(void);                   // = $0C/$0D        DISK SOFTWARE INIT ADDRESS
156     unsigned char*  appmhi;                 // = $0E/$0F        APPLICATIONS MEMORY HI LIMIT    
157
158     // Cleared upon Coldstart or Warmstart
159
160     unsigned char   pokmsk;                 // = $10            SYSTEM MASK FOR POKEY IRQ ENABLE
161     unsigned char   brkkey;                 // = $11            BREAK KEY FLAG
162     unsigned char   rtclok[3];              // = $12-$14        REAL TIME CLOCK (IN 16 MSEC UNITS)
163     unsigned char*  bufadr;                 // = $15/$16        INDIRECT BUFFER ADDRESS REGISTER
164     unsigned char   iccomt;                 // = $17            COMMAND FOR VECTOR
165     unsigned char*  dskfms;                 // = $18/$19        DISK FILE MANAGER POINTER
166     unsigned char*  dskutl;                 // = $1A/$1B        DISK UTILITIES POINTER
167 #ifdef OSA   
168     unsigned char   ptimot;                 // = $1C            PRINTER TIME OUT REGISTER
169     unsigned char   pbpnt;                  // = $1D            PRINT BUFFER POINTER
170     unsigned char   pbufsz;                 // = $1E            PRINT BUFFER SIZE
171     unsigned char   ptemp;                  // = $1F            TEMPORARY REGISTER
172 #else               
173     unsigned char   abufpt[4];              // = $1C-$1F        ACMI BUFFER POINTER AREA
174 #endif              
175     IOCB            ziocb;                  // = $20-$2F        ZERO PAGE I/O CONTROL BLOCK
176                     
177     unsigned char   status;                 // = $30            INTERNAL STATUS STORAGE
178     unsigned char   chksum;                 // = $31            CHECKSUM (SINGLE BYTE SUM WITH CARRY)
179     unsigned char*  bufr;                   // = $32/$33        POINTER TO DATA BUFFER
180     unsigned char*  bfen;                   // = $34/$35        NEXT BYTE PAST END OF THE DATA BUFFER LO
181 #ifdef OSA                   
182     unsigned char   cretry;                 // = $36            NUMBER OF COMMAND FRAME RETRIES
183     unsigned char   dretry;                 // = $37            NUMBER OF DEVICE RETRIES
184 #else               
185     unsigned int    ltemp;                  // = $36/$37        LOADER TEMPORARY
186 #endif              
187     unsigned char   bufrfl;                 // = $38            DATA BUFFER FULL FLAG
188     unsigned char   recvdn;                 // = $39            RECEIVE DONE FLAG
189     unsigned char   xmtdon;                 // = $3A            TRANSMISSION DONE FLAG
190     unsigned char   chksnt;                 // = $3B            CHECKSUM SENT FLAG
191     unsigned char   nocksm;                 // = $3C            NO CHECKSUM FOLLOWS DATA FLAG
192     unsigned char   bptr;                   // = $3D            CASSETTE BUFFER POINTER
193     unsigned char   ftype;                  // = $3E            CASSETTE IRG TYPE
194     unsigned char   feof;                   // = $3F            CASSETTE EOF FLAG (0 // = QUIET)
195                     
196     unsigned char   freq;                   // = $40            CASSETTE BEEP COUNTER
197     unsigned char   soundr;                 // = $41            NOISY I/0 FLAG. (ZERO IS QUIET)
198     unsigned char   critic;                 // = $42            DEFINES CRITICAL SECTION (CRITICAL IF NON-Z)
199     DOS2X           fmszpg;                 // = $43-$49        DISK FILE MANAGER SYSTEM ZERO PAGE
200 #ifdef OSA                   
201     unsigned char   ckey;                   // = $4A            FLAG SET WHEN GAME START PRESSED
202     unsigned char   cassbt;                 // = $4B            CASSETTE BOOT FLAG
203 #else               
204     void*           zchain;                 // = $4A/$4B        HANDLER LINKAGE CHAIN POINTER
205 #endif              
206     unsigned char   dstat;                  // = $4C            DISPLAY STATUS
207     unsigned char   atract;                 // = $4D            ATRACT FLAG
208     unsigned char   drkmsk;                 // = $4E            DARK ATRACT MASK
209     unsigned char   colrsh;                 // = $4F            ATRACT COLOR SHIFTER (EOR'ED WITH PLAYFIELD
210                 
211     unsigned char   tmpchr;                 // = $50            TEMPORARY CHARACTER
212     unsigned char   hold1;                  // = $51            TEMPORARY
213     unsigned char   lmargn;                 // = $52            LEFT MARGIN (NORMALLY 2, CC65 C STARTUP CODE SETS IT TO 0)
214     unsigned char   rmargn;                 // = $53            RIGHT MARGIN (NORMALLY 39 IF NO XEP80 IS USED)
215     unsigned char   rowcrs;                 // = $54            1CURSOR ROW
216     unsigned int    colcrs;                 // = $55/$56        CURSOR COLUMN
217     unsigned char   dindex;                 // = $57            DISPLAY MODE
218     unsigned char*  savmsc;                 // = $58/$59        SAVED MEMORY SCAN COUNTER
219     unsigned char   oldrow;                 // = $5A            PRIOR ROW
220     unsigned int    oldcol;                 // = $5B/$5C        PRIOR COLUMN
221     unsigned char   oldchr;                 // = $5D            DATA UNDER CURSOR
222     unsigned char*  oldadr;                 // = $5E/$5F        SAVED CURSOR MEMORY ADDRESS
223     
224 #ifdef OSA 
225     unsigned char   newrow;                 // = $60            POINT DRAW GOES TO
226     unsigned int    newcol;                 // = $61/$62        COLUMN DRAW GOES TO
227 #else               
228     unsigned char*  fkdef;                  // = $60/$61        FUNCTION KEY DEFINITION TABLE
229     unsigned char   palnts;                 // = $62            PAL/NTSC INDICATOR (0 // = NTSC)
230 #endif          
231     unsigned char   logcol;                 // = $63            POINTS AT COLUMN IN LOGICAL LINE
232     unsigned char*  adress;                 // = $64/$65        TEMPORARY ADDRESS
233     unsigned int    mlttmp;                 // = $66/$67        TEMPORARY / FIRST BYTE IS USED IN OPEN AS TEMP          
234     unsigned int    savadr;                 // = $68/$69        SAVED ADDRESS        
235     unsigned char   ramtop;                 // = $6A            RAM SIZE DEFINED BY POWER ON LOGIC
236     unsigned char   bufcnt;                 // = $6B            BUFFER COUNT
237     unsigned char*  bufstr;                 // = $6C/$6D        EDITOR GETCH POINTER
238     unsigned char   bitmsk;                 // = $6E            BIT MASK
239     unsigned char   shfamt;                 // = $6F            SHIFT AMOUNT FOR PIXEL JUSTIFUCATION
240                 
241     unsigned int    rowac;                  // = $70/$71        DRAW WORKING ROW
242     unsigned int    colac;                  // = $72/$73        DRAW WORKING COLUMN
243     unsigned char*  endpt;                  // = $74/$75        END POINT
244     unsigned char   deltar;                 // = $76            ROW DIFFERENCE
245     unsigned int    deltac;                 // = $77/$78        COLUMN DIFFERENCE
246 #ifdef OSA               
247     unsigned char   rowinc;                 // = $79            ROWINC 
248     unsigned char   colinc;                 // = $7A            COLINC
249 #else           
250     unsigned char*  keydef;                 // = $79/$7A        2-BYTE KEY DEFINITION TABLE ADDRESS
251 #endif          
252     unsigned char   swpflg;                 // = $7B            NON-0 1F TXT AND REGULAR RAM IS SWAPPED
253     unsigned char   holdch;                 // = $7C            CH IS MOVED HERE IN KGETCH BEFORE CNTL & SH
254     unsigned char   insdat;                 // = $7D            1-BYTE TEMPORARY
255     unsigned int    countr;                 // = $7E/$7F        2-BYTE DRAW ITERATION COUNT
256     
257     unsigned char   _free_1[0xD4-0x7F-1];   // USER SPACE
258     
259                                             // Floating Point Package Page Zero Address Equates
260     FPREG           fpreg[4];               // = $D4-$EB        4 REGSITERS, ACCCESS LIKE "fpreg[R0].fr"        
261     unsigned char   frx;                    // = $EC            1-BYTE TEMPORARY   
262     unsigned char   eexp;                   // = $ED            VALUE OF EXP
263 #ifdef OS_REV2          
264     unsigned char   frsign;                 // = $EE            ##REV2## 1-BYTE FLOATING POINT SIGN
265     unsigned char   plycnt;                 // = $EF            ##REV2## 1-BYTE POLYNOMIAL DEGREE
266     unsigned char   sgnflg;                 // = $F0            ##REV2## 1-BYTE SIGN FLAG
267     unsigned char   xfmflg;                 // = $F1            ##REV2## 1-BYTE TRANSFORM FLAG
268 #else           
269     unsigned char   nsign;                  // = $EE            SIGN OF #
270     unsigned char   esign;                  // = $EF            SIGN OF EXPONENT
271     unsigned char   fchrflg;                // = $F0            1ST CHAR FLAG
272     unsigned char   digrt;                  // = $F1            # OF DIGITS RIGHT OF DECIMAL
273 #endif          
274     unsigned char   cix;                    // = $F2            CURRENT INPUT INDEX
275     unsigned char*  inbuff;                 // = $F3/$F4        POINTS TO USER'S LINE INPUT BUFFER                           
276     unsigned int    ztemp1;                 // = $F5/$F6        2-BYTE TEMPORARY
277     unsigned int    ztemp4;                 // = $F7/$F8        2-BYTE TEMPORARY
278     unsigned int    ztemp3;                 // = $F9/$FA        2-BYTE TEMPORARY
279                 
280     union {         
281         unsigned char   degflg;             // = $FB            ##OLD## SAME AS RADFLG
282         unsigned char   radflg;             // = $FB            ##OLD## 0=RADIANS, 6=DEGREES
283     };
284             
285     FPREG*          flptr;                  // = $FC/$FD        2-BYTE FLOATING POINT NUMBER POINTER
286     FPREG*          fptr2;                  // = $FE/$FF        2-BYTE FLOATING POINT NUMBER POINTER
287
288     // --- Page 1 ---
289
290     unsigned char   stack[0x100];           // STACK
291
292     // --- Page 2 ---
293
294     void (*vdslst)(void);                   // = $0200/$0201    DISPLAY LIST NMI VECTOR
295     void (*vprced)(void);                   // = $0202/$0203    PROCEED LINE IRQ VECTOR
296     void (*vinter)(void);                   // = $0204/$0205    INTERRUPT LINE IRQ VECTOR
297     void (*vbreak)(void);                   // = $0206/$0207    SOFTWARE BREAK (00) INSTRUCTION IRQ VECTOR
298     void (*vkeybd)(void);                   // = $0208/$0209    POKEY KEYBOARD IRQ VECTOR
299     void (*vserin)(void);                   // = $020A/$020B    POKEY SERIAL INPUT READY IRQ
300     void (*vseror)(void);                   // = $020C/$020D    POKEY SERIAL OUTPUT READY IRQ
301     void (*vseroc)(void);                   // = $020E/$020F    POKEY SERIAL OUTPUT COMPLETE IRQ
302     void (*vtimr1)(void);                   // = $0210/$0201    POKEY TIMER 1 IRQ
303     void (*vtimr2)(void);                   // = $0212/$0203    POKEY TIMER 2 IRQ
304     void (*vtimr4)(void);                   // = $0214/$0205    POKEY TIMER 4 IRQ
305     void (*vimirq)(void);                   // = $0216/$0207    IMMEDIATE IRQ VECTOR
306     unsigned int cdtmv1;                    // = $0218/$0210    COUNT DOWN TIMER 1
307     unsigned int cdtmv2;                    // = $021A/$021B    COUNT DOWN TIMER 2
308     unsigned int cdtmv3;                    // = $021C/$021D    COUNT DOWN TIMER 3
309     unsigned int cdtmv4;                    // = $021E/$021F    COUNT DOWN TIMER 4
310     unsigned int cdtmv5;                    // = $0220/$0221    COUNT DOWN TIMER 5
311     void (*vvblki)(void);                   // = $0222/$0223    IMMEDIATE VERTICAL BLANK NMI VECTOR
312     void (*vvblkd)(void);                   // = $0224/$0224    DEFERRED VERTICAL BLANK NMI VECTOR
313     void (*cdtma1)(void);                   // = $0226/$0227    COUNT DOWN TIMER 1 JSR ADDRESS
314     void (*cdtma2)(void);                   // = $0228/$0229    COUNT DOWN TIMER 2 JSR ADDRESS
315     unsigned char cdtmf3;                   // = $022A          COUNT DOWN TIMER 3 FLAG
316     unsigned char srtimr;                   // = $022B          SOFTWARE REPEAT TIMER
317     unsigned char cdtmf4;                   // = $022C          COUNT DOWN TIMER 4 FLAG
318     unsigned char intemp;                   // = $022D          IAN'S TEMP
319     unsigned char cdtmf5;                   // = $022E          COUNT DOWN TIMER FLAG 5
320     unsigned char sdmctl;                   // = $022F          SAVE DMACTL REGISTER
321     union {
322         struct {
323             unsigned char sdlstl;           // = $0230          SAVE DISPLAY LIST LOW BYTE
324             unsigned char sdlsth;           // = $0231          SAVE DISPLAY LIST HI BYTE     
325         };
326         void*   sdlst;                      // = $0230/$0231    (same as above as pointer)
327     };
328     unsigned char sskctl;                   // = $0232          SKCTL REGISTER RAM
329 #ifdef OSA 
330     unsigned char _spare_1;                 // = $0233          No OS use.
331 #else
332     unsigned char lcount;                   // = $0233          ##1200xl## 1-byte relocating loader record
333 #endif          
334     unsigned char lpenh;                    // = $0234          LIGHT PEN HORIZONTAL VALUE
335     unsigned char lpenv;                    // = $0235          LIGHT PEN VERTICAL VALUE
336     void (*brkky)(void);                    // = $0236/$0237    BREAK KEY VECTOR
337 #ifdef OSA           
338     unsigned char spare2[2];                // = $0238/$0239    No OS use.
339 #else           
340     void (*vpirq)(void);                    // = $0238/$0239    ##rev2## 2-byte parallel device IRQ vector
341 #endif          
342     unsigned char cdevic;                   // = $023A          COMMAND FRAME BUFFER - DEVICE
343     unsigned char ccomnd;                   // = $023B          COMMAND
344     union {
345         struct {    
346             unsigned char caux1;            // = $023C          COMMAND AUX BYTE 1
347             unsigned char caux2;            // = $023D          COMMAND AUX BYTE 2
348         };
349         unsigned caux;                      // = $023C/$023D    (same as above as word)
350     };
351     unsigned char temp;                     // = $023E          TEMPORARY RAM CELL
352     unsigned char errflg;                   // = $023F          ERROR FLAG - ANY DEVICE ERROR EXCEPT TIME OUT
353     unsigned char dflags;                   // = $0240          DISK FLAGS FROM SECTOR ONE
354     unsigned char dbsect;                   // = $0241          NUMBER OF DISK BOOT SECTORS
355     unsigned char* bootad;                  // = $0242/$0243    ADDRESS WHERE DISK BOOT LOADER WILL BE PUT
356     unsigned char coldst;                   // = $0244          COLDSTART FLAG (1=IN MIDDLE OF COLDSTART>
357 #ifdef OSA           
358     unsigned char spare3;                   // = $0245          No OS use.
359 #else           
360     unsigned char reclen;                   // = $0245          ##1200xl## 1-byte relocating loader record length
361 #endif              
362     unsigned char dsktim;                   // = $0246          DISK TIME OUT REGISTER
363 #ifdef OSA               
364     unsigned char linbuf[40];               // = $0247-$026E    ##old## CHAR LINE BUFFER
365 #else           
366     unsigned char pdvmsk;                   // = $0247          ##rev2## 1-byte parallel device selection mask
367     unsigned char shpdvs;                   // = $0248          ##rev2## 1-byte PDVS (parallel device select)
368     unsigned char pdimsk;                   // = $0249          ##rev2## 1-byte parallel device IRQ selection
369     unsigned reladr;                        // = $024A/$024B    ##rev2## 2-byte relocating loader relative adr.
370     unsigned char pptmpa;                   // = $024C          ##rev2## 1-byte parallel device handler temporary
371     unsigned char pptmpx;                   // = $024D          ##rev2## 1-byte parallel device handler temporary
372     unsigned char _reserved_1[29];          // = $024E-$026A    RESERVED
373     unsigned char chsalt;                   // = $026B          ##1200xl## 1-byte character set alternate
374     unsigned char vsflag;                   // = $026C          ##1200xl## 1-byte fine vertical scroll count
375     unsigned char keydis;                   // = $026D          ##1200xl## 1-byte keyboard disable
376     unsigned char fine;                     // = $026E          ##1200xl## 1-byte fine scrolling mode
377 #endif              
378     unsigned char gprior;                   // = $026F          GLOBAL PRIORITY CELL
379     unsigned char paddl0;                   // = $0270          1-BYTE POTENTIOMETER 0
380     unsigned char paddl1;                   // = $0271          1-BYTE POTENTIOMETER 1
381     unsigned char paddl2;                   // = $0272          1-BYTE POTENTIOMETER 2
382     unsigned char paddl3;                   // = $0273          1-BYTE POTENTIOMETER 3
383     unsigned char paddl4;                   // = $0274          1-BYTE POTENTIOMETER 4
384     unsigned char paddl5;                   // = $0275          1-BYTE POTENTIOMETER 5
385     unsigned char paddl6;                   // = $0276          1-BYTE POTENTIOMETER 6
386     unsigned char paddl7;                   // = $0277          1-BYTE POTENTIOMETER 7
387     unsigned char stick0;                   // = $0278          1-byte joystick 0
388     unsigned char stick1;                   // = $0279          1-byte joystick 1
389     unsigned char stick2;                   // = $027A          1-byte joystick 2
390     unsigned char stick3;                   // = $027B          1-byte joystick 3
391     unsigned char ptrig0;                   // = $027C          1-BYTE PADDLE TRIGGER 0
392     unsigned char ptrig1;                   // = $027D          1-BYTE PADDLE TRIGGER 1
393     unsigned char ptrig2;                   // = $027E          1-BYTE PADDLE TRIGGER 2
394     unsigned char ptrig3;                   // = $027F          1-BYTE PADDLE TRIGGER 3
395     unsigned char ptrig4;                   // = $0280          1-BYTE PADDLE TRIGGER 4
396     unsigned char ptrig5;                   // = $0281          1-BYTE PADDLE TRIGGER 5
397     unsigned char ptrig6;                   // = $0281          1-BYTE PADDLE TRIGGER 6
398     unsigned char ptrig7;                   // = $0283          1-BYTE PADDLE TRIGGER 7
399     unsigned char strig0;                   // = $0284          1-BYTE JOYSTICK TRIGGER 0
400     unsigned char strig1;                   // = $0285          1-BYTE JOYSTICK TRIGGER 1
401     unsigned char strig2;                   // = $0286          1-BYTE JOYSTICK TRIGGER 2
402     unsigned char strig3;                   // = $0287          1-BYTE JOYSTICK TRIGGER 3
403 #ifdef OSA           
404     unsigned char cstat;                    // = $0288          ##old## cassette status register
405 #else           
406     unsigned char hibyte;                   // = $0288          ##1200xl## 1-byte relocating loader high byte
407 #endif          
408     unsigned char wmode;                    // = $0289          1-byte cassette WRITE mode
409     unsigned char blim;                     // = $028A          1-byte cassette buffer limit
410 #ifdef OSA
411     unsigned char _reserved_2[5];           // = $028B-$028F    RESERVED
412 #else    
413     unsigned char imask;                    // = $028B          ##rev2## (not used)
414     void (*jveck)(void);                    // = $028C/$028D    2-byte jump vector
415     unsigned newadr;                        // = $028E/028F     ##1200xl## 2-byte relocating address
416 #endif              
417     unsigned char txtrow;                   // = $0290          TEXT ROWCRS
418     unsigned txtcol;                        // = $0291/$0292    TEXT COLCRS
419     unsigned char tindex;                   // = $0293          TEXT INDEX
420     unsigned char* txtmsc;                  // = $0294/$0295    FOOLS CONVRT INTO NEW MSC
421     unsigned char txtold[6];                // = $0296-$029B    OLDROW & OLDCOL FOR TEXT (AND THEN SOME)
422 #ifdef OSA               
423     unsigned char tmpx1;                    // = $029C          ##old## 1--byte temporary register
424 #else           
425     unsigned char cretry;                   // = $029C          ##1200xl## 1-byte number of command frame retries
426 #endif              
427     unsigned char hold3;                    // = $029D          1-byte temporary
428     unsigned char subtmp;                   // = $029E          1-byte temporary
429     unsigned char hold2;                    // = $029F          1-byte (not used)
430     unsigned char dmask;                    // = $02A0          1-byte display (pixel location) mask
431     unsigned char tmplbt;                   // = $02A1          1-byte (not used)
432     unsigned char escflg;                   // = $02A2          ESCAPE FLAG
433     unsigned char tabmap[15];               // = $02A3-$02B1    15-byte (120 bit) tab stop bit map
434     unsigned char logmap[4];                // = $02B2-$02B5    LOGICAL LINE START BIT MAP
435     unsigned char invflg;                   // = $02B6          INVERSE VIDEO FLAG (TOGGLED BY ATARI KEY)
436     unsigned char filflg;                   // = $02B7          RIGHT FILL FLAG FOR DRAW
437     unsigned char tmprow;                   // = $02B8          1-byte temporary row
438     unsigned tmpcol;                        // = $02B9/$02BA    2-byte temporary column
439     unsigned char scrflg;                   // = $02BB          SET IF SCROLL OCCURS
440     unsigned char hold4;                    // = $02BC          TEMP CELL USED IN DRAW ONLY
441 #ifdef OSA           
442     unsigned char hold5;                    // = $02BD          ##old## DITTO
443 #else           
444     unsigned char dretry;                   // = $02BD          ##1200xl## 1-byte number of device retries
445 #endif              
446     unsigned char shflok;                   // = $02BE          1-byte shift/control lock flags
447     unsigned char botscr;                   // = $02BF          BOTTOM OF SCREEN   24 NORM 4 SPLIT
448     unsigned char pcolr0;                   // = $02C0          1-byte player-missile 0 color/luminance
449     unsigned char pcolr1;                   // = $02C1          1-byte player-missile 1 color/luminance
450     unsigned char pcolr2;                   // = $02C2          1-byte player-missile 2 color/luminance
451     unsigned char pcolr3;                   // = $02C3          1-byte player-missile 3 color/luminance 
452     unsigned char color0;                   // = $02C4          1-byte playfield 0 color/luminance
453     unsigned char color1;                   // = $02C5          1-byte playfield 1 color/luminance
454     unsigned char color2;                   // = $02C6          1-byte playfield 2 color/luminance
455     unsigned char color3;                   // = $02C7          1-byte playfield 3 color/luminance
456     unsigned char color4;                   // = $02C8          1-byte background color/luminance
457 #ifdef OSA 
458     unsigned char _spare_2[23];             // = $02C9-$02DF    No OS use.
459 #else
460     union {
461         unsigned char parmbl[6];            // = $02C9          ##rev2## 6-byte relocating loader parameter
462         struct {        
463             void (*runadr)(void);           // = $02C9          ##1200xl## 2-byte run address
464             unsigned int hiused;            // = $02CB          ##1200xl## 2-byte highest non-zero page address
465             unsigned int zhiuse;            // = $02CD          ##1200xl## 2-byte highest zero page address
466         };       
467     };       
468     union {     
469         unsigned char oldpar[6];            // = $02CF          ##rev2## 6-byte relocating loader parameter
470         struct {        
471             void (*gbytea)(void);           // = $02CF          ##1200xl## 2-byte GET-BYTE routine address
472             unsigned int loadad;            // = $02D1          ##1200xl## 2-byte non-zero page load address
473             unsigned int zloada;            // = $02D3          ##1200xl## 2-byte zero page load address
474         };       
475     };       
476     unsigned int dsctln;                    // = $02D5          ##1200xl## 2-byte disk sector length
477     unsigned int acmisr;                    // = $02D7          ##1200xl## 2-byte ACMI interrupt service routine
478     unsigned char krpdel;                   // = $02D9          ##1200xl## 1-byte auto-repeat delay
479     unsigned char keyrep;                   // = $02DA          ##1200xl## 1-byte auto-repeat rate
480     unsigned char noclik;                   // = $02DB          ##1200xl## 1-byte key click disable
481     unsigned char helpfg;                   // = $02DC          ##1200xl## 1-byte HELP key flag (0 = no HELP)
482     unsigned char dmasav;                   // = $02DD          ##1200xl## 1-byte SDMCTL save/restore
483     unsigned char pbpnt;                    // = $02DE          ##1200xl## 1-byte printer buffer pointer
484     unsigned char pbufsz;                   // = $02DF          ##1200xl## 1-byte printer buffer size
485 #endif      
486     union {         
487         unsigned char glbabs[4];            // = $02E0-$02E3    byte global variables for non-DOS users
488         struct {        
489             void (*runad)(void);            // = $02E0          ##map## 2-byte binary file run address
490             void (*initad)(void);           // = $02E2          ##map## 2-byte binary file initialization address
491         };      
492     };    
493     unsigned char ramsiz;                   // = $02E4          RAM SIZE (HI BYTE ONLY)
494     void* memtop;                           // = $02E5          TOP OF AVAILABLE USER MEMORY
495     void* memlo;                            // = $02E7          BOTTOM OF AVAILABLE USER MEMORY
496 #ifdef OSA       
497     unsigned char _spare_3;                 // = $02E9          No OS use.
498 #else       
499     unsigned char hndlod;                   // = $02E9          ##1200xl## 1-byte user load flag
500 #endif      
501     unsigned char dvstat[4];                // = $02EA-$02ED    STATUS BUFFER
502     union {     
503         unsigned int cbaud;                 // = $02EE/$02EF    2-byte cassette baud rate
504         struct {        
505             unsigned char cbaudl;           // = $02EE          1-byte low cassette baud rate
506             unsigned char cbaudh;           // = $02EF          1-byte high cassette baud rate
507         };    
508     };  
509     unsigned char crsinh;                   // = $02F0          CURSOR INHIBIT (00 = CURSOR ON)
510     unsigned char keydel;                   // = $02F1          KEY DELAY
511     unsigned char ch1;                      // = $02F2          1-byte prior keyboard character
512     unsigned char chact;                    // = $02F3          CHACTL REGISTER RAM
513     unsigned char chbas;                    // = $02F4          CHBAS REGISTER RAM
514 #ifdef OSA       
515     unsigned char _spare_4[5];              // = $02F5-$02F9    No OS use.
516 #else           
517     unsigned char newrow;                   // = $02F5          ##1200xl## 1-byte draw destination row
518     unsigned int newcol;                    // = $02F6/$02F7    ##1200xl## 2-byte draw destination column
519     unsigned char rowinc;                   // = $02F8          ##1200xl## 1-byte draw row increment
520     unsigned char colinc;                   // = $02F9          ##1200xl## 1-byte draw column increment
521 #endif      
522     unsigned char char_;                    // = $02FA          1-byte internal character (naming changed due to do keyword conflict)
523     unsigned char atachr;                   // = $02FB          ATASCII CHARACTER
524     unsigned char ch;                       // = $02FC          GLOBAL VARIABLE FOR KEYBOARD
525     unsigned char fildat;                   // = $02FD          RIGHT FILL DATA <DRAW>
526     unsigned char dspflg;                   // = $02FE          DISPLAY FLAG   DISPLAY CNTLS IF NON-ZERO
527     unsigned char ssflag;                   // = $02FF          START/STOP FLAG FOR PAGING (CNTL 1). CLEARE
528         
529     // --- Page 3 ---
530
531     union {     
532         unsigned char dcb[0x40];            // = $0300-$03XX    DEVICE CONTROL BLOCK
533         struct {        
534             unsigned char ddevic;           // = $0300          PERIPHERAL UNIT 1 BUS I.D. NUMBER
535             unsigned char dunit;            // = $0301          UNIT NUMBER
536             unsigned char dcomnd;           // = $0302          BUS COMMAND
537             unsigned char dstats;           // = $0303          COMMAND TYPE/STATUS RETURN
538             union {
539                 void* dbuf;                 // = $0304/$0305    data buffer address
540                 struct {
541                     unsigned char dbuflo;   // = $0304          1-byte low data buffer address
542                     unsigned char dbufhi;   // = $0305          1-byte high data buffer address
543                 };
544             };
545             unsigned char dtimlo;           // = $0306          DEVICE TIME OUT IN 1 SECOND UNITS
546             unsigned char dunuse;           // = $0307          UNUSED BYTE
547             union {
548                 unsigned int dbyt;          // = $0308/$0309    number of bytes to transfer
549                 struct {
550                     unsigned char dbytlo;   // = $0308          1-byte low number of bytes to transfer
551                     unsigned char dbythi;   // = $0309          1-byte high number of bytes to transfer
552                 };
553             };
554             union {
555                 unsigned int daux;          // = $030A/$030B    first and second auxiliary
556                 struct {
557                     unsigned char daux1;    // = $030A          1-byte first command auxiliary
558                     unsigned char daux2;    // = $030B          1-byte second command auxiliary
559                 };
560             };
561             unsigned int timer1;            // = $030C/$030D    INITIAL TIMER VALUE
562 #ifdef OSA           
563             unsigned char addcor;           // = $030E          ##old## ADDITION CORRECTION
564 #else           
565             unsigned char jmpers;           // = $030E          ##1200xl## 1-byte jumper options
566 #endif
567             unsigned char casflg;           // = $030F          CASSETTE MODE WHEN SET
568             unsigned char timer2;           // = $0310/$0311    2-byte final baud rate timer value
569             unsigned char temp1;            // = $0312          TEMPORARY STORAGE REGISTER
570 #ifdef OSA       
571             unsigned char _spare_5;         // = $0313          unused
572             unsigned char temp2;            // = $0314          ##old## TEMPORARY STORAGE REGISTER
573 #else                   
574             unsigned char temp2;            // = $0313          ##1200xl## 1-byte temporary
575             unsigned char ptimot;           // = $0314          ##1200xl## 1-byte printer timeout
576 #endif      
577             unsigned char temp3;            // = $0315          TEMPORARY STORAGE REGISTER
578             unsigned char savio;            // = $0316          SAVE SERIAL IN DATA PORT
579             unsigned char timflg;           // = $0317          TIME OUT FLAG FOR BAUD RATE CORRECTION
580             unsigned char stackp;           // = $0318          SIO STACK POINTER SAVE CELL
581             unsigned char tstat;            // = $0319          TEMPORARY STATUS HOLDER
582 #ifdef OSA   
583             HATABS hatabs[12];              // = $031A-$033D    handler address table
584             unsigned int zeropad;           // = $033E/$033F    zero padding
585 #else
586             HATABS hatabs[11];              // = $031A-$033A    handler address table
587             unsigned int zeropad;           // = $033B/$033C    zero padding
588             unsigned char pupbt1;           // = $033D          ##1200xl## 1-byte power-up validation byte 1
589             unsigned char pupbt2;           // = $033E          ##1200xl## 1-byte power-up validation byte 2
590             unsigned char pupbt3;           // = $033F          ##1200xl## 1-byte power-up validation byte 3
591 #endif
592         };
593     };
594     IOCB    iocb[8];                        // = $0340-$03BF    8 I/O Control Blocks
595     unsigned char prnbuf[40];               // = $03C0-$3E7     PRINTER BUFFER
596 #ifdef OSA           
597     unsigned char _spare_6[151];            // = $03E8-$047F    unused
598 #else               
599     unsigned char superf;                   // = $03E8          ##1200xl## 1-byte editor super function flag
600     unsigned char ckey;                     // = $03E9          ##1200xl## 1-byte cassette boot request flag
601     unsigned char cassbt;                   // = $03EA          ##1200xl## 1-byte cassette boot flag
602     unsigned char cartck;                   // = $03EB          ##1200xl## 1-byte cartridge equivalence check
603     unsigned char derrf;                    // = $03EC          ##rev2## 1-byte screen OPEN error flag
604     unsigned char acmvar[11];               // = $03ED-$03F7    ##1200xl## reserved for ACMI, not cleared upon reset
605     unsigned char basicf;                   // = $03F8          ##rev2## 1-byte BASIC switch flag
606     unsigned char mintlk;                   // = $03F9          ##1200xl## 1-byte ACMI module interlock
607     unsigned char gintlk;                   // = $03FA          ##1200xl## 1-byte cartridge interlock
608     void* chlink;                           // = $03FB/$03FC    ##1200xl## 2-byte loaded handler chain link
609     unsigned char casbuf[131];              // = $03FD-$047F    CASSETTE BUFFER
610 #endif
611
612     // --- Page 4 ---
613
614     unsigned char usarea[128];              // = $0480          128 bytes reserved for application
615
616     // --- Page 5 ---
617
618     unsigned char _spare_7[126];            // = $0500-$057D    reserved for FP package / unused
619     unsigned char lbpr1;                    // = $057E          LBUFF PREFIX 1
620     unsigned char lbpr2;                    // = $057F          LBUFF PREFIX 2
621     unsigned char lbuff[128];               // = $0580-$05FF    128-byte line buffer
622 };
623
624
625 /* Define a structure with the zero page atari basic register offsets */
626
627 struct __basic {
628     void*  lowmem;                          // = $80/$81        POINTER TO BASIC'S LOW MEMORY
629     void*  vntp;                            // = $82/$83        BEGINNING ADDRESS OF THE VARIABLE NAME TABLE
630     void*  vntd;                            // = $84/$85        POINTER TO THE ENDING ADDRESS OF THE VARIABLE NAME TABLE PLUS ONE
631     void*  vvtp;                            // = $86/$87        ADDRESS FOR THE VARIABLE VALUE TABLE
632     void*  stmtab;                          // = $88/$89        ADDRESS OF THE STATEMENT TABLE
633     void*  stmcur;                          // = $8A/$8B        CURRENT BASIC STATEMENT POINTER
634     void*  starp;                           // = $8C/$8D        ADDRESS FOR THE STRING AND ARRAY TABLE
635     void*  runstk;                          // = $8E/$8F        ADDRESS OF THE RUNTIME STACK
636     void*  memtop;                          // = $90/$91        POINTER TO THE TOP OF BASIC MEMORY
637     
638     unsigned char   _internal_1[0xBA-0x91-1];  // INTERNAL DATA
639
640     unsigned int    stopln;                 // = $BA/$BB        LINE WHERE A PROGRAM WAS STOPPED
641
642     unsigned char   _internal_2[0xC3-0xBB-1];   // INTERNAL DATA
643
644     unsigned char   errsav;                 // = $C3            NUMBER OF THE ERROR CODE
645
646     unsigned char   _internal_3[0xC9-0xC3-1];   // INTERNAL DATA
647
648     unsigned char   ptabw;                  // = $C9            NUMBER OF COLUMNS BETWEEN TAB STOPS
649     unsigned char   loadflg;                // = $CA            LIST PROTECTION
650
651     unsigned char   _internal_4[0xD4-0xCA-1];   // INTERNAL DATA
652
653     unsigned int    binint;                 // = $D4/$D5        USR-CALL RETURN VALUE
654 };
655