Annotation of uae/autoconf.c, revision 1.1.1.2

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.