|
|
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 root 20:
21: /* Commonly used autoconfig strings */
22:
1.1.1.3 root 23: uaecptr EXPANSION_explibname, EXPANSION_doslibname, EXPANSION_uaeversion;
24: uaecptr EXPANSION_uaedevname, EXPANSION_explibbase = 0, EXPANSION_haveV36;
25: uaecptr EXPANSION_bootcode, EXPANSION_nullfunc;
1.1.1.10 root 26: uaecptr EXPANSION_cddevice;
1.1 root 27:
28: /* ROM tag area memory access */
29:
1.1.1.13! root 30: uae_u8 *rtarea;
1.1 root 31:
1.1.1.4 root 32: static uae_u32 rtarea_lget (uaecptr) REGPARAM;
33: static uae_u32 rtarea_wget (uaecptr) REGPARAM;
34: static uae_u32 rtarea_bget (uaecptr) REGPARAM;
35: static void rtarea_lput (uaecptr, uae_u32) REGPARAM;
36: static void rtarea_wput (uaecptr, uae_u32) REGPARAM;
37: static void rtarea_bput (uaecptr, uae_u32) REGPARAM;
38: static uae_u8 *rtarea_xlate (uaecptr) REGPARAM;
1.1 root 39:
1.1.1.13! root 40: static uae_u8 REGPARAM2 *rtarea_xlate (uaecptr addr)
1.1 root 41: {
42: addr &= 0xFFFF;
43: return rtarea + addr;
44: }
45:
1.1.1.13! root 46: static uae_u32 REGPARAM2 rtarea_lget (uaecptr addr)
1.1 root 47: {
48: addr &= 0xFFFF;
1.1.1.4 root 49: return (uae_u32)(rtarea_wget (addr) << 16) + rtarea_wget (addr+2);
1.1 root 50: }
51:
1.1.1.13! root 52: static uae_u32 REGPARAM2 rtarea_wget (uaecptr addr)
1.1 root 53: {
54: addr &= 0xFFFF;
55: return (rtarea[addr]<<8) + rtarea[addr+1];
56: }
57:
1.1.1.13! root 58: static uae_u32 REGPARAM2 rtarea_bget (uaecptr addr)
1.1 root 59: {
60: addr &= 0xFFFF;
61: return rtarea[addr];
62: }
63:
1.1.1.13! root 64: static void REGPARAM2 rtarea_lput (uaecptr addr, uae_u32 value)
1.1.1.7 root 65: {
66: }
67:
1.1.1.13! root 68: static void REGPARAM2 rtarea_wput (uaecptr addr, uae_u32 value)
1.1.1.7 root 69: {
70: }
71:
1.1.1.13! root 72: static void REGPARAM2 rtarea_bput (uaecptr addr, uae_u32 value)
1.1.1.7 root 73: {
74: }
1.1 root 75:
1.1.1.13! root 76: addrbank rtarea_bank = {
! 77: rtarea_lget, rtarea_wget, rtarea_bget,
! 78: rtarea_lput, rtarea_wput, rtarea_bput,
! 79: rtarea_xlate, default_check, NULL, "UAE Boot ROM"
! 80: };
! 81:
1.1 root 82: /* some quick & dirty code to fill in the rt area and save me a lot of
83: * scratch paper
84: */
85:
86: static int rt_addr = 0;
87: static int rt_straddr = 0xFF00 - 2;
88:
1.1.1.4 root 89: uae_u32 addr (int ptr)
1.1 root 90: {
1.1.1.10 root 91: return (uae_u32)ptr + RTAREA_BASE;
1.1 root 92: }
93:
1.1.1.4 root 94: void db (uae_u8 data)
1.1.1.3 root 95: {
96: rtarea[rt_addr++] = data;
97: }
98:
1.1.1.4 root 99: void dw (uae_u16 data)
1.1 root 100: {
101: rtarea[rt_addr++] = data >> 8;
102: rtarea[rt_addr++] = data;
103: }
104:
1.1.1.4 root 105: void dl (uae_u32 data)
1.1 root 106: {
107: rtarea[rt_addr++] = data >> 24;
108: rtarea[rt_addr++] = data >> 16;
109: rtarea[rt_addr++] = data >> 8;
110: rtarea[rt_addr++] = data;
111: }
112:
113: /* store strings starting at the end of the rt area and working
114: * backward. store pointer at current address
115: */
116:
1.1.1.4 root 117: uae_u32 ds (char *str)
1.1 root 118: {
1.1.1.4 root 119: int len = strlen (str) + 1;
1.1 root 120:
121: rt_straddr -= len;
1.1.1.4 root 122: strcpy ((char *)rtarea + rt_straddr, str);
1.1.1.3 root 123:
1.1.1.4 root 124: return addr (rt_straddr);
1.1 root 125: }
126:
1.1.1.4 root 127: void calltrap (uae_u32 n)
1.1 root 128: {
1.1.1.4 root 129: dw (0xA000 + n);
1.1 root 130: }
131:
1.1.1.4 root 132: void org (uae_u32 a)
1.1 root 133: {
1.1.1.10 root 134: rt_addr = a - RTAREA_BASE;
1.1 root 135: }
136:
1.1.1.4 root 137: uae_u32 here (void)
1.1 root 138: {
1.1.1.4 root 139: return addr (rt_addr);
1.1 root 140: }
141:
1.1.1.4 root 142: void align (int b)
1.1 root 143: {
1.1.1.4 root 144: rt_addr = (rt_addr + b - 1) & ~(b - 1);
1.1 root 145: }
146:
1.1.1.13! root 147: static uae_u32 nullfunc (TrapContext *dummy)
1.1 root 148: {
1.1.1.10 root 149: write_log ("Null function called\n");
1.1.1.3 root 150: return 0;
1.1.1.2 root 151: }
152:
1.1.1.13! root 153: static uae_u32 getchipmemsize (TrapContext *dummy)
1.1.1.2 root 154: {
1.1.1.4 root 155: return allocated_chipmem;
1.1 root 156: }
157:
1.1.1.13! root 158: static uae_u32 uae_puts (TrapContext *dummy)
1.1.1.8 root 159: {
160: puts (get_real_address (m68k_areg (regs, 0)));
161: return 0;
162: }
163:
1.1.1.13! root 164: /* Used to keep the m68k emulation sane when we hit a call to
! 165: * default_xlate. */
! 166: static void m68k_infinite_loop (void)
! 167: {
! 168: m68k_setpc (0xF0FFC0);
! 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.13! root 181:
1.1.1.4 root 182: void rtarea_init (void)
1.1 root 183: {
1.1.1.3 root 184: uae_u32 a;
1.1 root 185: char uaever[100];
1.1.1.9 root 186:
187: rtarea_init_mem ();
188:
1.1.1.12 root 189: sprintf (uaever, "uae-%s", PACKAGE_VERSION);
1.1 root 190:
1.1.1.4 root 191: EXPANSION_uaeversion = ds (uaever);
192: EXPANSION_explibname = ds ("expansion.library");
193: EXPANSION_doslibname = ds ("dos.library");
194: EXPANSION_uaedevname = ds ("uae.device");
1.1 root 195:
1.1.1.4 root 196: deftrap (NULL); /* Generic emulator trap */
1.1 root 197:
1.1.1.4 root 198: EXPANSION_nullfunc = here ();
199: calltrap (deftrap (nullfunc));
200: dw (RTS);
1.1.1.3 root 201:
1.1.1.2 root 202: a = here();
1.1.1.13! root 203: /* Dummy trap - removing this breaks the filesys emulation. */
1.1.1.10 root 204: org (RTAREA_BASE + 0xFF00);
1.1.1.13! root 205: calltrap (deftrap2 (nullfunc, TRAPFLAG_NO_RETVAL, ""));
1.1.1.3 root 206:
1.1.1.10 root 207: org (RTAREA_BASE + 0xFF80);
1.1.1.3 root 208: calltrap (deftrap2 (getchipmemsize, TRAPFLAG_DORET, ""));
1.1.1.8 root 209:
1.1.1.10 root 210: org (RTAREA_BASE + 0xFF10);
1.1.1.8 root 211: calltrap (deftrap2 (uae_puts, TRAPFLAG_NO_RETVAL, ""));
212: dw (RTS);
213:
1.1.1.13! root 214: org (RTAREA_BASE + 0xFFC0);
! 215: calltrap (deftrap2 (m68k_infinite_loop, TRAPFLAG_NO_RETVAL, ""));
! 216:
1.1.1.4 root 217: org (a);
1.1.1.2 root 218:
1.1.1.3 root 219: filesys_install_code ();
1.1.1.13! root 220:
! 221: uae_boot_rom_size = here() - RTAREA_BASE;
! 222: init_extended_traps ();
1.1.1.3 root 223: }
1.1.1.2 root 224:
1.1.1.3 root 225: volatile int uae_int_requested = 0;
1.1.1.2 root 226:
1.1.1.3 root 227: void set_uae_int_flag (void)
228: {
229: rtarea[0xFFFB] = uae_int_requested;
1.1.1.2 root 230: }
231:
1.1.1.13! root 232: void rtarea_setup (void)
1.1.1.2 root 233: {
234: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.