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