#ifndef BASEPAGE_H #define BASEPAGE_H /* GemDos base page structure */ /* Alias psp */ /* The documented elements have been augmented by information gleaned from * disassembling the ROM based system */ typedef struct { long p_lowtpa; /* 0 Low transient program area */ long p_hitpa; /* 4 High transient program area */ long p_tbase; /* 8 Text segment base */ long p_tlen; /* C Text segment length */ long p_dbase; /* 10 Data length base */ long p_dlen; /* 14 Data length length */ long p_bbase; /* 18 Bss segment base */ long p_blen; /* 1C Bss segment length */ long p_fxx0; /* 20 Undocumented zero */ long p_parent; /* 24 Parent's basepage (undocumented) */ long p_fxx1; /* 28 Undocumented one */ long p_env; /* 2C Environment string pointer */ long p_fxx2; /* 30 Undoc */ long p_fxx3; /* 34 Undoc */ long p_fxx4; /* 38 Undoc */ long p_fxx5; /* 3C Undoc */ long p_fxx6; /* 40 Undoc */ long p_fxx7; /* 44 Undoc */ long p_fxx8; /* 48 Undoc */ long p_fxx9; /* 4C Undoc */ long p_fxx10; /* 50 Undoc */ long p_fxx11; /* 54 Undoc */ long p_fxx12; /* 58 Undoc */ long p_fxx13; /* 5C Undoc */ long p_fxx14; /* 60 Undoc */ long p_fxx15; /* 64 Undoc */ long p_saved0; /* 68 Undoc */ long p_savea3; /* 6C Undoc */ long p_savea4; /* 70 Undoc */ long p_savea5; /* 74 Undoc */ long p_savea6; /* 78 Undoc */ long p_saveusp; /* 7C Undoc */ char p_cmdlin[128]; /* Command line */ } BASEPAGE; extern BASEPAGE _start[]; #define BP (&_start[-1]) /* When handling a gemdos trap, the p_saveusp element points to a considerable * amount of saved context on the user's stack. The layout is as follows */ typedef struct { long p_savessp; /* The supervisor stack after clean up */ int p_savesr; /* The status register from the trap */ long p_savepc; /* The program counter from the trap */ long p_saved1; /* The saved user d1 */ long p_saved2; /* The saved user d2 */ long p_saved3; /* The saved user d3 */ long p_saved4; /* The saved user d4 */ long p_saved5; /* The saved user d5 */ long p_saved6; /* The saved user d6 */ long p_saved7; /* The saved user d7 */ long p_savea0; /* The saved user a0 */ long p_savea1; /* The saved user a1 */ long p_savea2; /* The saved user a2 */ /* That's 50 bytes of stack overflow you'll never see in user context */ /* Next are the gemdos opcode and parameters pushed by the user */ int p_op; /* gemdos operation requested */ /* ... */ } OVERFLOW; #endif