|
|
1.1.1.3 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.3 root 3: *
1.1 root 4: * AutoConfig devices
5: *
1.1.1.2 root 6: * Copyright 1995, 1996 Bernd Schmidt
7: * Copyright 1996 Ed Hanway
1.1 root 8: */
9:
10: #include "sysconfig.h"
11: #include "sysdeps.h"
12:
13: #include "options.h"
1.1.1.3 root 14: #include "uae.h"
1.1 root 15: #include "memory.h"
16: #include "custom.h"
17: #include "newcpu.h"
18: #include "autoconf.h"
1.1.1.12! root 19: #include "traps.h"
1.1.1.3 root 20: #include "osdep/exectasks.h"
1.1 root 21:
22: /* Commonly used autoconfig strings */
23:
1.1.1.3 root 24: uaecptr EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion;
25: uaecptr EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36;
26: uaecptr EXPANSION_bootcode, EXPANSION_nullfunc;
1.1.1.10 root 27: uaecptr EXPANSION_cddevice;
1.1 root 28:
29: /* ROM tag area memory access */
30:
1.1.1.9 root 31: static uae_u8 *rtarea;
1.1 root 32:
1.1.1.4 root 33: static uae_u32 rtarea_lget (uaecptr) REGPARAM;
34: static uae_u32 rtarea_wget (uaecptr) REGPARAM;
35: static uae_u32 rtarea_bget (uaecptr) REGPARAM;
36: static void rtarea_lput (uaecptr, uae_u32) REGPARAM;
37: static void rtarea_wput (uaecptr, uae_u32) REGPARAM;
38: static void rtarea_bput (uaecptr, uae_u32) REGPARAM;
39: static uae_u8 *rtarea_xlate (uaecptr) REGPARAM;
1.1 root 40:
41: addrbank rtarea_bank = {
42: rtarea_lget, rtarea_wget, rtarea_bget,
43: rtarea_lput, rtarea_wput, rtarea_bput,
1.1.1.9 root 44: rtarea_xlate, default_check, NULL
1.1 root 45: };
46:
1.1.1.4 root 47: uae_u8 REGPARAM2 *rtarea_xlate (uaecptr addr)
1.1 root 48: {
49: addr &= 0xFFFF;
50: return rtarea + addr;
51: }
52:
1.1.1.4 root 53: uae_u32 REGPARAM2 rtarea_lget (uaecptr addr)
1.1 root 54: {
1.1.1.7 root 55: special_mem |= S_READ;
1.1 root 56: addr &= 0xFFFF;
1.1.1.4 root 57: return (uae_u32)(rtarea_wget (addr) << 16) + rtarea_wget (addr+2);
1.1 root 58: }
59:
1.1.1.4 root 60: uae_u32 REGPARAM2 rtarea_wget (uaecptr addr)
1.1 root 61: {
1.1.1.7 root 62: special_mem |= S_READ;
1.1 root 63: addr &= 0xFFFF;
64: return (rtarea[addr]<<8) + rtarea[addr+1];
65: }
66:
1.1.1.4 root 67: uae_u32 REGPARAM2 rtarea_bget (uaecptr addr)
1.1 root 68: {
1.1.1.7 root 69: special_mem |= S_READ;
1.1 root 70: addr &= 0xFFFF;
71: return rtarea[addr];
72: }
73:
1.1.1.7 root 74: void REGPARAM2 rtarea_lput (uaecptr addr, uae_u32 value)
75: {
76: special_mem |= S_WRITE;
77: }
78:
79: void REGPARAM2 rtarea_wput (uaecptr addr, uae_u32 value)
80: {
81: special_mem |= S_WRITE;
82: }
83:
84: void REGPARAM2 rtarea_bput (uaecptr addr, uae_u32 value)
85: {
86: special_mem |= S_WRITE;
87: }
1.1 root 88:
89: /* some quick & dirty code to fill in the rt area and save me a lot of
90: * scratch paper
91: */
92:
93: static int rt_addr = 0;
94: static int rt_straddr = 0xFF00 - 2;
95:
1.1.1.4 root 96: uae_u32 addr (int ptr)
1.1 root 97: {
1.1.1.10 root 98: return (uae_u32)ptr + RTAREA_BASE;
1.1 root 99: }
100:
1.1.1.4 root 101: void db (uae_u8 data)
1.1.1.3 root 102: {
103: rtarea[rt_addr++] = data;
104: }
105:
1.1.1.4 root 106: void dw (uae_u16 data)
1.1 root 107: {
108: rtarea[rt_addr++] = data >> 8;
109: rtarea[rt_addr++] = data;
110: }
111:
1.1.1.4 root 112: void dl (uae_u32 data)
1.1 root 113: {
114: rtarea[rt_addr++] = data >> 24;
115: rtarea[rt_addr++] = data >> 16;
116: rtarea[rt_addr++] = data >> 8;
117: rtarea[rt_addr++] = data;
118: }
119:
120: /* store strings starting at the end of the rt area and working
121: * backward. store pointer at current address
122: */
123:
1.1.1.4 root 124: uae_u32 ds (char *str)
1.1 root 125: {
1.1.1.4 root 126: int len = strlen (str) + 1;
1.1 root 127:
128: rt_straddr -= len;
1.1.1.4 root 129: strcpy ((char *)rtarea + rt_straddr, str);
1.1.1.3 root 130:
1.1.1.4 root 131: return addr (rt_straddr);
1.1 root 132: }
133:
1.1.1.4 root 134: void calltrap (uae_u32 n)
1.1 root 135: {
1.1.1.4 root 136: dw (0xA000 + n);
1.1 root 137: }
138:
1.1.1.4 root 139: void org (uae_u32 a)
1.1 root 140: {
1.1.1.10 root 141: rt_addr = a - RTAREA_BASE;
1.1 root 142: }
143:
1.1.1.4 root 144: uae_u32 here (void)
1.1 root 145: {
1.1.1.4 root 146: return addr (rt_addr);
1.1 root 147: }
148:
1.1.1.4 root 149: void align (int b)
1.1 root 150: {
1.1.1.4 root 151: rt_addr = (rt_addr + b - 1) & ~(b - 1);
1.1 root 152: }
153:
1.1.1.3 root 154: static uae_u32 nullfunc(void)
1.1 root 155: {
1.1.1.10 root 156: write_log ("Null function called\n");
1.1.1.3 root 157: return 0;
1.1.1.2 root 158: }
159:
1.1.1.3 root 160: static uae_u32 getchipmemsize (void)
1.1.1.2 root 161: {
1.1.1.4 root 162: return allocated_chipmem;
1.1 root 163: }
164:
1.1.1.8 root 165: static uae_u32 uae_puts (void)
166: {
167: puts (get_real_address (m68k_areg (regs, 0)));
168: return 0;
169: }
170:
1.1.1.9 root 171: static void rtarea_init_mem (void)
172: {
173: rtarea = mapped_malloc (0x10000, "rtarea");
174: if (!rtarea) {
175: write_log ("virtual memory exhausted (rtarea)!\n");
176: abort ();
177: }
178: rtarea_bank.baseaddr = rtarea;
179: }
180:
1.1.1.4 root 181: void rtarea_init (void)
1.1 root 182: {
1.1.1.3 root 183: uae_u32 a;
1.1 root 184: char uaever[100];
1.1.1.9 root 185:
186: rtarea_init_mem ();
187:
1.1.1.12! root 188: sprintf (uaever, "uae-%s", PACKAGE_VERSION);
1.1 root 189:
1.1.1.4 root 190: EXPANSION_uaeversion = ds (uaever);
191: EXPANSION_explibname = ds ("expansion.library");
192: EXPANSION_doslibname = ds ("dos.library");
193: EXPANSION_uaedevname = ds ("uae.device");
1.1 root 194:
1.1.1.4 root 195: deftrap (NULL); /* Generic emulator trap */
1.1 root 196:
1.1.1.4 root 197: EXPANSION_nullfunc = here ();
198: calltrap (deftrap (nullfunc));
199: dw (RTS);
1.1.1.3 root 200:
1.1.1.2 root 201: a = here();
1.1 root 202: /* Standard "return from 68k mode" trap */
1.1.1.10 root 203: org (RTAREA_BASE + 0xFF00);
1.1.1.3 root 204: calltrap (deftrap2 (m68k_mode_return, TRAPFLAG_NO_RETVAL, ""));
205:
1.1.1.10 root 206: org (RTAREA_BASE + 0xFF80);
1.1.1.3 root 207: calltrap (deftrap2 (getchipmemsize, TRAPFLAG_DORET, ""));
1.1.1.8 root 208:
1.1.1.10 root 209: org (RTAREA_BASE + 0xFF10);
1.1.1.8 root 210: calltrap (deftrap2 (uae_puts, TRAPFLAG_NO_RETVAL, ""));
211: dw (RTS);
212:
1.1.1.4 root 213: org (a);
1.1.1.2 root 214:
1.1.1.3 root 215: filesys_install_code ();
216: }
1.1.1.2 root 217:
1.1.1.3 root 218: volatile int uae_int_requested = 0;
1.1.1.2 root 219:
1.1.1.3 root 220: void set_uae_int_flag (void)
221: {
222: rtarea[0xFFFB] = uae_int_requested;
1.1.1.2 root 223: }
224:
225: void rtarea_setup(void)
226: {
227: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.