|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * AutoConfig devices ! 5: * ! 6: * (c) 1995 Bernd Schmidt ! 7: * (c) 1996 Ed Hanway ! 8: */ ! 9: ! 10: #include <stdio.h> ! 11: #include <stdlib.h> ! 12: #include <string.h> ! 13: ! 14: #include "config.h" ! 15: #include "amiga.h" ! 16: #include "options.h" ! 17: #include "events.h" ! 18: #include "memory.h" ! 19: #include "custom.h" ! 20: #include "newcpu.h" ! 21: #include "disk.h" ! 22: #include "xwin.h" ! 23: #include "autoconf.h" ! 24: #include "filesys.h" ! 25: #include "hardfile.h" ! 26: ! 27: /* Commonly used autoconfig strings */ ! 28: ! 29: ULONG explibname; ! 30: ! 31: /* ROM tag area memory access */ ! 32: ! 33: static UWORD rtarea[32768]; ! 34: ! 35: static ULONG rtarea_lget(CPTR) REGPARAM; ! 36: static UWORD rtarea_wget(CPTR) REGPARAM; ! 37: static UBYTE rtarea_bget(CPTR) REGPARAM; ! 38: static void rtarea_lput(CPTR, ULONG) REGPARAM; ! 39: static void rtarea_wput(CPTR, UWORD) REGPARAM; ! 40: static void rtarea_bput(CPTR, UBYTE) REGPARAM; ! 41: static UWORD *rtarea_xlate(CPTR) REGPARAM; ! 42: ! 43: addrbank rtarea_bank = { ! 44: rtarea_lget, rtarea_wget, rtarea_bget, ! 45: rtarea_lput, rtarea_wput, rtarea_bput, ! 46: rtarea_xlate, default_check ! 47: }; ! 48: ! 49: UWORD *rtarea_xlate(CPTR addr) ! 50: { ! 51: addr &= 0xFFFF; ! 52: return rtarea + (addr >> 1); ! 53: } ! 54: ! 55: ULONG rtarea_lget(CPTR addr) ! 56: { ! 57: addr &= 0xFFFF; ! 58: return (ULONG)(rtarea_wget(addr) << 16) + rtarea_wget(addr+2); ! 59: } ! 60: ! 61: UWORD rtarea_wget(CPTR addr) ! 62: { ! 63: addr &= 0xFFFF; ! 64: return rtarea[addr >> 1]; ! 65: } ! 66: ! 67: UBYTE rtarea_bget(CPTR addr) ! 68: { ! 69: UWORD data; ! 70: addr &= 0xFFFF; ! 71: data = rtarea[addr >> 1]; ! 72: return addr & 1 ? data : data >> 8; ! 73: } ! 74: ! 75: void rtarea_lput(CPTR addr, ULONG value) { } ! 76: void rtarea_bput(CPTR addr, UBYTE value) { } ! 77: ! 78: /* Don't start at 0 -- can get bogus writes there. */ ! 79: static ULONG trap_base_addr = 0x00F00180; ! 80: ! 81: TrapFunction traps[256]; ! 82: static int max_trap = 0; ! 83: ! 84: void rtarea_wput(CPTR addr, UWORD value) ! 85: { ! 86: /* Save all registers */ ! 87: struct regstruct backup_regs = regs; ! 88: ULONG retval = 0; ! 89: ! 90: ULONG func = ((addr - trap_base_addr) & 0xFFFF) >> 1; ! 91: if(func < max_trap) { ! 92: retval = (*traps[func])(); ! 93: } else { ! 94: fprintf(stderr, "illegal emulator trap\n"); ! 95: } ! 96: regs = backup_regs; ! 97: regs.d[0] = retval; ! 98: } ! 99: ! 100: /* some quick & dirty code to fill in the rt area and save me a lot of ! 101: * scratch paper ! 102: */ ! 103: ! 104: static int rt_addr = 0; ! 105: static int rt_straddr = 0xF000/2 - 1; ! 106: ! 107: ULONG ! 108: addr(int ptr) ! 109: { ! 110: return ((ULONG)ptr << 1) + 0x00F00000; ! 111: } ! 112: ! 113: void ! 114: dw(UWORD data) ! 115: { ! 116: rtarea[rt_addr++] = data; ! 117: } ! 118: ! 119: void ! 120: dl(ULONG data) ! 121: { ! 122: rtarea[rt_addr++] = data >> 16; ! 123: rtarea[rt_addr++] = data; ! 124: } ! 125: ! 126: /* store strings starting at the end of the rt area and working ! 127: * backward. store pointer at current address ! 128: */ ! 129: ! 130: ULONG ! 131: ds(char *str) ! 132: { ! 133: UWORD data; ! 134: char c; ! 135: int start; ! 136: ! 137: int len = (strlen(str) + 1) >> 1; ! 138: rt_straddr -= len; ! 139: start = rt_straddr; ! 140: ! 141: do { ! 142: data = c = *str++; ! 143: if (c) { ! 144: data <<= 8; ! 145: c = *str++; ! 146: data |= c; ! 147: } ! 148: rtarea[start++] = data; ! 149: } while (c); ! 150: ! 151: return addr(rt_straddr--); ! 152: } ! 153: ! 154: void ! 155: calltrap(ULONG n) ! 156: { ! 157: dw(0x33C0); /* MOVE.W D0,abs32 */ ! 158: dl(n*2 + trap_base_addr); ! 159: } ! 160: ! 161: void ! 162: org(ULONG a) ! 163: { ! 164: rt_addr = (a - 0x00F00000) >> 1; ! 165: } ! 166: ! 167: ULONG ! 168: here(void) ! 169: { ! 170: return addr(rt_addr); ! 171: } ! 172: ! 173: int ! 174: deftrap(TrapFunction func) ! 175: { ! 176: int num = max_trap++; ! 177: traps[num] = func; ! 178: return num; ! 179: } ! 180: ! 181: void ! 182: align(int b) ! 183: { ! 184: rt_addr = (rt_addr + (b-1)) & ~(b-1); ! 185: } ! 186: ! 187: ULONG CallLib(CPTR base, WORD offset) ! 188: { ! 189: /* Make tracing through this possible */ ! 190: int oldspc = specialflags & SPCFLAG_BRK; ! 191: ! 192: CPTR olda6 = regs.a[6]; ! 193: CPTR oldpc = m68k_getpc(); ! 194: regs.a[6] = base; ! 195: regs.a[7] -= 4; ! 196: put_long (regs.a[7], 0xF0FFFE); ! 197: m68k_setpc (base + offset); ! 198: MC68000_skip (0xF0FFFE); ! 199: regs.a[6] = olda6; ! 200: m68k_setpc (oldpc); ! 201: specialflags |= oldspc; ! 202: return regs.d[0]; ! 203: } ! 204: ! 205: void ! 206: rtarea_init() ! 207: { ! 208: explibname = ds("expansion.library"); ! 209: ! 210: hardfile_install(); ! 211: // filesys_install(); Not Implemented in Mac yet. ! 212: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.