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