xref: /netbsd/sys/arch/mac68k/mac68k/macrom.h (revision bf9ec67e)
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