1 /* $NetBSD: macrom.h,v 1.13 2001/12/09 19:07:01 briggs Exp $ */ 2 3 /*- 4 * Copyright (C) 1994 Bradley A. Grantham 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Bradley A. Grantham. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 34 #include <sys/types.h> 35 #include <machine/frame.h> 36 37 38 /* Low-memory Globals */ 39 extern caddr_t ROMBase; /* Base address of ROM space */ 40 extern caddr_t ADBBase; /* Base address of ADB scratch */ 41 extern caddr_t ADBYMM; /* Base address of yet more ADB mem */ 42 extern caddr_t ADBState; /* Base address of ADB scratch ? */ 43 extern void (*JADBProc) __P((void)); /* ADBReInit pre/post processing */ 44 extern void (*Lvl1DT[8]) __P((void)); /* VIA1 interrupt table by bit */ 45 extern void (*Lvl2DT[8]) __P((void)); /* VIA2 interrupt table by bit */ 46 extern void (*jADBOp) __P((void)); /* low memory pointer to ADBOp */ 47 extern void (*jUnimplTrap) __P((void)); /* Unimplemented trap */ 48 /* loglob(KbdLast, 0x218) * addr of last kbd to send */ 49 /* loglob(KbdType, 0x21E) * type of last kbd to send */ 50 extern void (*JKybdTask) __P((void)); /* Keyboard task ptr? */ 51 extern u_char CPUFlag; /* Type of CPU in this machine */ 52 extern void (*MacJmp) __P((void)); /* ??? */ 53 extern u_long Lo3Bytes; /* 0x00ffffff */ 54 extern u_long MinusOne; /* 0xffffffff */ 55 extern u_short MMU32Bit; /* MMU mode; short? */ 56 extern u_char Scratch8[8]; /* 8-byte scratch */ 57 extern u_char Scratch20[20]; /* 20-byte scratch */ 58 extern u_long Ticks; /* ticks since startup */ 59 extern u_long Time; /* ticks since startup */ 60 extern u_short TimeDBRA; /* DBRA's per milli */ 61 extern u_short ADBDelay; /* DBRAs per ADB loop, / 8 */ 62 extern u_char ToolScratch[8]; /* Yet another 8-byte scratch area */ 63 extern caddr_t VIA; /* VIA1 base address */ 64 extern caddr_t mrg_VIA2; /* VIA2 base address */ 65 extern caddr_t SCCRd; /* SCC read base address */ 66 extern u_char FinderName[20]; /* FinderName - Pascal string */ 67 extern void (*jSwapMMU) __P((void)); /* Pointer to MMU Swap routine */ 68 extern void (*jEgret) __P((void)); /* Pointer to MMU Swap routine */ 69 extern u_int16_t HwCfgFlags; /* Hardware config flags */ 70 extern u_int32_t HwCfgFlags2; /* more hardware config flags */ 71 extern u_int32_t HwCfgFlags3; /* more hardware config flags */ 72 extern u_int32_t ADBReInit_JTBL; /* pointer to patch table */ 73 extern void (*jClkNoMem) __P((void)); /* pointer to ClkNoMem */ 74 extern u_char SysParam[20]; /* Place where PRam data gets stored */ 75 extern caddr_t ExpandMem; /* pointer to Expanded Memory used by */ 76 /* newer ADB routines (since LCIII) */ 77 extern u_int16_t VBLQueue; /* Vertical blanking Queue, unused ? */ 78 extern caddr_t VBLQueue_head; /* Vertical blanking Queue, head */ 79 extern caddr_t VBLQueue_tail; /* Vertical blanking Queue, tail */ 80 extern caddr_t jDTInstall; /* Deferred task mgr trap handler */ 81 82 extern u_int32_t **InitEgretJTVec; /* pointer to a jump table for */ 83 /* InitEgret on AV machines */ 84 85 /* Types */ 86 87 typedef caddr_t Ptr; 88 typedef caddr_t *Handle; 89 90 /* ADB Manager */ 91 typedef struct { 92 Ptr siServiceRtPtr; 93 Ptr siDataAreaAddr; 94 } ADBSetInfoBlock; 95 typedef struct { 96 unsigned char devType; 97 unsigned char origADBAddr; 98 Ptr dbServiceRtPtr; 99 Ptr dbDataAreaAddr; 100 } ADBDataBlock; 101 102 103 /* Trap Flesh; these functions are C, not Pascal */ 104 105 /* trap tests */ 106 int MyOwnTrap __P((void)); 107 void KnownRTS __P((void)); 108 109 #ifdef MRG_ADB 110 /* 111 * These functions are defined in adb_direct.c if we are not using 112 * the MRG method of accessing the ADB/PRAM/RTC. 113 */ 114 /* ADB Manager */ 115 int SetADBInfo __P((ADBSetInfoBlock *info, int adbAddr)); 116 int CountADBs __P((void)); 117 int GetIndADB __P((ADBDataBlock *info, int index)); 118 int GetADBInfo __P((ADBDataBlock *info, int adbAddr)); 119 void ADBReInit __P((void)); 120 /* note different order of parameters */ 121 int ADBOp __P((Ptr buffer, Ptr compRout, Ptr data, short commandNum)); 122 void ADBAlternateInit __P((void)); 123 #endif 124 125 /* Memory Manager */ 126 Ptr NewPtr __P((int size)); 127 int DisposPtr __P((Ptr ptr)); 128 int GetPtrSize __P((Ptr ptr)); 129 int SetPtrSize __P((Ptr ptr, int newbytes)); 130 131 /* Resource Manager */ 132 Handle GetResource __P((u_int theType, short theID)); 133 short ResError __P((void)); 134 short mrg_CountResources __P((u_int32_t type)); 135 short Count_Resources __P((u_int32_t rsrc_type)); 136 caddr_t *mrg_GetIndResource __P((u_int16_t index, u_int32_t type)); 137 138 139 /* Mac ROM Glue globals for BSD kernel */ 140 extern caddr_t mrg_romadbintr; 141 extern caddr_t mrg_ADBIntrPtr; 142 extern u_char mrg_GetResource[]; /* type is almost a lie; 143 call it an array of bytes of code */ 144 extern u_char mrg_ResError[]; 145 146 147 /* MacOS Error Codes */ 148 #define noErr 0 149 #define memFullErr -108 150 #define memWZErr -111 151 #define resNotFound -192 152 153 154 /* Dump instruction trace */ 155 void dumptrace __P((void)); 156 157 158 /* Stuff for configuring ROM Glue */ 159 typedef struct rsrc_s { 160 u_int16_t unknown[4]; /* ???? */ 161 u_int32_t next; /* pointer to next resoure in list */ 162 u_int32_t body; /* pointer to resource body? */ 163 u_int32_t name; /* resource name */ 164 u_int16_t index; /* ???? */ 165 } rsrc_t; 166 167 typedef struct romvec_s { 168 char *romident; /* just to print it out */ 169 caddr_t adbintr; /* where is ADB interrupt */ 170 caddr_t pmintr; /* where is ADB/PM interrupt, on machines */ 171 /* that have it */ 172 caddr_t adb130intr; /* ADBBase[0x130] interrupt; don't know */ 173 /* what it is, but it's important. Don't */ 174 /* you love reverse engineering? */ 175 caddr_t CountADBs; 176 caddr_t GetIndADB; 177 caddr_t GetADBInfo; 178 caddr_t SetADBInfo; 179 caddr_t ADBReInit; 180 caddr_t ADBOp; 181 caddr_t PMgrOp; /* On machines that have it */ 182 caddr_t WriteParam; 183 caddr_t SetDateTime; 184 caddr_t InitUtil; 185 caddr_t ReadXPRam; 186 caddr_t WriteXPRam; 187 caddr_t jClkNoMem; 188 caddr_t ADBAlternateInit; /* more fundamental than ABDReInit */ 189 caddr_t Egret; 190 caddr_t InitEgret; /* Set up Buffer for Egret routines */ 191 caddr_t ADBReInit_JTBL; 192 caddr_t ROMResourceMap; /* Address of first Resource in linked list */ 193 caddr_t FixDiv; 194 caddr_t FixMul; 195 } romvec_t; 196 197 /* 198 * Function prototypes. 199 */ 200 201 /* macrom.c */ 202 void mrg_setvectors __P((romvec_t *rom_vectors)); 203 int mrg_romready __P((void)); 204 caddr_t *Get_Ind_Resource __P((u_int32_t, u_int16_t)); 205 void mrg_initadbintr __P((void)); 206 long mrg_adbintr __P((void)); 207 long mrg_pmintr __P((void)); 208 void mrg_fixupROMBase __P((caddr_t, caddr_t)); 209 int mrg_Delay __P((void)); 210 void mrg_DTInstall __P((void)); 211 void mrg_execute_deferred __P((void)); 212 void mrg_VBLQueue __P((void)); 213 void mrg_init_stub_1 __P((void)); 214 void mrg_init_stub_2 __P((void)); 215 void mrg_1sec_timer_tick __P((void)); 216 void mrg_lvl1dtpanic __P((void)); 217 void mrg_lvl2dtpanic __P((void)); 218 void mrg_jadbprocpanic __P((void)); 219 void mrg_jswapmmupanic __P((void)); 220 void mrg_jkybdtaskpanic __P((void)); 221 void mrg_notrap __P((void)); 222 int myowntrap __P((void)); 223 int mrg_NewPtr __P((void)); 224 int mrg_DisposPtr __P((void)); 225 int mrg_GetPtrSize __P((void)); 226 int mrg_SetPtrSize __P((void)); 227 int mrg_PostEvent __P((void)); 228 int mrg_SetTrapAddress __P((void)); 229 void mrg_StripAddress __P((void)); 230 void mrg_aline_super __P((struct frame *)); 231 void mrg_init __P((void)); 232 void mrg_FixDiv __P((void)); 233 void mrg_FixMul __P((void)); 234 235 /* machdep.c */ 236 int mach_cputype __P((void)); 237 238 /* Tracing aids */ 239 240 /* trace all instructions, not just flow changes. */ 241 #define tron() \ 242 asm("movw %%sr, %%d0 ; orw #0x8000, %%d0 ; movw %%d0, %%sr" : : : "d0") 243 #define troff() \ 244 asm("movw %%sr, %%d0 ; andw #0x3fff, %%d0 ; movw %%d0, %%sr" : : : "d0") 245