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