Annotation of uae/src/expansion.c, revision 1.1.1.9

1.1       root        1:  /* 
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
1.1.1.3   root        4:   * AutoConfig (tm) Expansions (ZorroII/III)
                      5:   *
                      6:   * Copyright 1996,1997 Stefan Reinauer <[email protected]>
                      7:   * Copyright 1997 Brian King <[email protected]>
                      8:   *   - added gfxcard code
                      9:   *
1.1       root       10:   */
                     11: 
                     12: #include "sysconfig.h"
                     13: #include "sysdeps.h"
                     14: 
                     15: #include "config.h"
                     16: #include "options.h"
1.1.1.3   root       17: #include "uae.h"
1.1       root       18: #include "memory.h"
                     19: #include "autoconf.h"
1.1.1.3   root       20: #include "picasso96.h"
1.1.1.8   root       21: #include "savestate.h"
1.1       root       22: 
1.1.1.3   root       23: #define MAX_EXPANSION_BOARDS   8
1.1       root       24: 
1.1.1.3   root       25: /* ********************************************************** */
1.1       root       26: /* 00 / 02 */
1.1.1.3   root       27: /* er_Type */
                     28: 
                     29: #define Z2_MEM_8MB     0x00 /* Size of Memory Block */
                     30: #define Z2_MEM_4MB     0x07
                     31: #define Z2_MEM_2MB     0x06
                     32: #define Z2_MEM_1MB     0x05
                     33: #define Z2_MEM_512KB   0x04
                     34: #define Z2_MEM_256KB   0x03
                     35: #define Z2_MEM_128KB   0x02
                     36: #define Z2_MEM_64KB    0x01
                     37: /* extended definitions */
                     38: #define Z2_MEM_16MB    0x00
                     39: #define Z2_MEM_32MB    0x01
                     40: #define Z2_MEM_64MB    0x02
                     41: #define Z2_MEM_128MB   0x03
                     42: #define Z2_MEM_256MB   0x04
                     43: #define Z2_MEM_512MB   0x05
                     44: #define Z2_MEM_1GB     0x06
                     45: 
                     46: #define chainedconfig  0x08 /* Next config is part of the same card */
                     47: #define rom_card       0x10 /* ROM vector is valid */
                     48: #define add_memory     0x20 /* Link RAM into free memory list */
1.1       root       49: 
1.1.1.3   root       50: #define zorroII                0xc0 /* Type of Expansion Card */
                     51: #define zorroIII       0x80
1.1       root       52: 
                     53: /* ********************************************************** */
1.1.1.3   root       54: /* 04 - 06 & 10-16 */
1.1       root       55: 
1.1.1.3   root       56: /* Manufacturer */
                     57: #define commodore_g     513 /* Commodore Braunschweig (Germany) */
                     58: #define commodore       514 /* Commodore West Chester */
                     59: #define gvp            2017 /* GVP */
                     60: #define ass            2102 /* Advanced Systems & Software */
                     61: #define hackers_id     2011 /* Special ID for test cards */
                     62: 
                     63: /* Card Type */
                     64: #define commodore_a2091             3 /* A2091 / A590 Card from C= */
                     65: #define commodore_a2091_ram 10 /* A2091 / A590 Ram on HD-Card */
                     66: #define commodore_a2232            70 /* A2232 Multiport Expansion */
                     67: #define ass_nexus_scsi      1 /* Nexus SCSI Controller */
1.1       root       68: 
1.1.1.3   root       69: #define gvp_series_2_scsi   11
                     70: #define gvp_iv_24_gfx      32
1.1       root       71: 
1.1.1.3   root       72: /* ********************************************************** */
                     73: /* 08 - 0A  */
                     74: /* er_Flags */
                     75: #define Z3_MEM_64KB    0x02
                     76: #define Z3_MEM_128KB   0x03
                     77: #define Z3_MEM_256KB   0x04
                     78: #define Z3_MEM_512KB   0x05
                     79: #define Z3_MEM_1MB     0x06 /* Zorro III card subsize */
                     80: #define Z3_MEM_2MB     0x07
                     81: #define Z3_MEM_4MB     0x08
                     82: #define Z3_MEM_6MB     0x09
                     83: #define Z3_MEM_8MB     0x0a
                     84: #define Z3_MEM_10MB    0x0b
                     85: #define Z3_MEM_12MB    0x0c
                     86: #define Z3_MEM_14MB    0x0d
                     87: #define Z3_MEM_16MB    0x00
                     88: #define Z3_MEM_AUTO    0x01
                     89: #define Z3_MEM_defunct1        0x0e
                     90: #define Z3_MEM_defunct2        0x0f
                     91: 
                     92: #define force_z3       0x10 /* *MUST* be set if card is Z3 */
                     93: #define ext_size       0x20 /* Use extended size table for bits 0-2 of er_Type */
                     94: #define no_shutup      0x40 /* Card cannot receive Shut_up_forever */
                     95: #define care_addr      0x80 /* Adress HAS to be $200000-$9fffff */
1.1       root       96: 
                     97: /* ********************************************************** */
1.1.1.3   root       98: /* 40-42 */
                     99: /* ec_interrupt (unused) */
1.1       root      100: 
1.1.1.3   root      101: #define enable_irq     0x01 /* enable Interrupt */
                    102: #define reset_card     0x04 /* Reset of Expansion Card - must be 0 */
                    103: #define card_int2      0x10 /* READ ONLY: IRQ 2 active */
                    104: #define card_irq6      0x20 /* READ ONLY: IRQ 6 active */
                    105: #define card_irq7      0x40 /* READ ONLY: IRQ 7 active */
                    106: #define does_irq       0x80 /* READ ONLY: Card currently throws IRQ */
1.1       root      107: 
                    108: /* ********************************************************** */
                    109: 
1.1.1.3   root      110: /* ROM defines (DiagVec) */
                    111: 
                    112: #define rom_4bit       (0x00<<14) /* ROM width */
                    113: #define rom_8bit       (0x01<<14)
                    114: #define rom_16bit      (0x02<<14)
                    115: 
                    116: #define rom_never      (0x00<<12) /* Never run Boot Code */
                    117: #define rom_install    (0x01<<12) /* run code at install time */
                    118: #define rom_binddrv    (0x02<<12) /* run code with binddrivers */
                    119: 
                    120: uaecptr ROM_filesys_resname = 0, ROM_filesys_resid = 0;
                    121: uaecptr ROM_filesys_diagentry = 0;
                    122: uaecptr ROM_hardfile_resname = 0, ROM_hardfile_resid = 0;
                    123: uaecptr ROM_hardfile_init = 0;
1.1       root      124: 
                    125: /* ********************************************************** */
                    126: 
1.1.1.3   root      127: static void (*card_init[MAX_EXPANSION_BOARDS]) (void);
                    128: static void (*card_map[MAX_EXPANSION_BOARDS]) (void);
1.1       root      129: 
1.1.1.3   root      130: static int ecard = 0;
1.1       root      131: 
                    132: /* ********************************************************** */
                    133: 
1.1.1.3   root      134: /* Please note: ZorroIII implementation seems to work different
                    135:  * than described in the HRM. This claims that ZorroIII config
                    136:  * address is 0xff000000 while the ZorroII config space starts
                    137:  * at 0x00e80000. In reality, both, Z2 and Z3 cards are 
                    138:  * configured in the ZorroII config space. Kickstart 3.1 doesn't
                    139:  * even do a single read or write access to the ZorroIII space.
                    140:  * The original Amiga include files tell the same as the HRM.
                    141:  * ZorroIII: If you set ext_size in er_Flags and give a Z2-size
                    142:  * in er_Type you can very likely add some ZorroII address space
                    143:  * to a ZorroIII card on a real Amiga. This is not implemented
                    144:  * yet.
                    145:  *  -- Stefan
                    146:  * 
                    147:  * Surprising that 0xFF000000 isn't used. Maybe it depends on the
                    148:  * ROM. Anyway, the HRM says that Z3 cards may appear in Z2 config
                    149:  * space, so what we are doing here is correct.
                    150:  *  -- Bernd
                    151:  */
1.1       root      152: 
1.1.1.3   root      153: /* Autoconfig address space at 0xE80000 */
                    154: static uae_u8 expamem[65536];
1.1       root      155: 
1.1.1.3   root      156: static uae_u8 expamem_lo;
                    157: static uae_u16 expamem_hi;
1.1       root      158: 
1.1.1.2   root      159: /*
1.1.1.3   root      160:  *  Dummy entries to show that there's no card in a slot
1.1.1.2   root      161:  */
1.1       root      162: 
1.1.1.3   root      163: static void expamem_map_clear (void)
                    164: {
                    165:     fprintf (stderr, "expamem_map_clear() got called. Shouldn't happen.\n");
                    166: }
                    167: 
                    168: static void expamem_init_clear (void)
                    169: {
                    170:     memset (expamem, 0xff, sizeof expamem);
                    171: }
1.1       root      172: 
1.1.1.4   root      173: static uae_u32 expamem_lget (uaecptr) REGPARAM;
                    174: static uae_u32 expamem_wget (uaecptr) REGPARAM;
                    175: static uae_u32 expamem_bget (uaecptr) REGPARAM;
                    176: static void expamem_lput (uaecptr, uae_u32) REGPARAM;
                    177: static void expamem_wput (uaecptr, uae_u32) REGPARAM;
                    178: static void expamem_bput (uaecptr, uae_u32) REGPARAM;
1.1       root      179: 
1.1.1.3   root      180: addrbank expamem_bank = {
                    181:     expamem_lget, expamem_wget, expamem_bget,
                    182:     expamem_lput, expamem_wput, expamem_bput,
1.1.1.8   root      183:     default_xlate, default_check, NULL
1.1.1.3   root      184: };
1.1       root      185: 
1.1.1.4   root      186: static uae_u32 REGPARAM2 expamem_lget (uaecptr addr)
1.1       root      187: {
1.1.1.7   root      188:     special_mem |= S_READ;
1.1.1.4   root      189:     write_log ("warning: READ.L from address $%lx \n", addr);
1.1.1.3   root      190:     return 0xfffffffful;
1.1       root      191: }
                    192: 
1.1.1.4   root      193: static uae_u32 REGPARAM2 expamem_wget (uaecptr addr)
1.1       root      194: {
1.1.1.7   root      195:     special_mem |= S_READ;
1.1.1.4   root      196:     write_log ("warning: READ.W from address $%lx \n", addr);
1.1.1.3   root      197:     return 0xffff;
                    198: }
                    199: 
1.1.1.4   root      200: static uae_u32 REGPARAM2 expamem_bget (uaecptr addr)
1.1.1.3   root      201: {
1.1.1.7   root      202:     special_mem |= S_READ;
1.1.1.3   root      203:     addr &= 0xFFFF;
                    204:     return expamem[addr];
1.1       root      205: }
                    206: 
1.1.1.3   root      207: static void REGPARAM2 expamem_write (uaecptr addr, uae_u32 value)
1.1       root      208: {
1.1.1.7   root      209:     special_mem |= S_WRITE;
1.1.1.3   root      210:     addr &= 0xffff;
                    211:     if (addr == 00 || addr == 02 || addr == 0x40 || addr == 0x42) {
                    212:        expamem[addr] = (value & 0xf0);
                    213:        expamem[addr + 2] = (value & 0x0f) << 4;
                    214:     } else {
                    215:        expamem[addr] = ~(value & 0xf0);
                    216:        expamem[addr + 2] = ~((value & 0x0f) << 4);
                    217:     }
                    218: }
                    219: 
1.1.1.4   root      220: static int REGPARAM2 expamem_type (void)
1.1.1.3   root      221: {
                    222:     return ((expamem[0] | expamem[2] >> 4) & 0xc0);
                    223: }
                    224: 
1.1.1.4   root      225: static void REGPARAM2 expamem_lput (uaecptr addr, uae_u32 value)
1.1.1.3   root      226: {
1.1.1.7   root      227:     special_mem |= S_WRITE;
1.1.1.4   root      228:     write_log ("warning: WRITE.L to address $%lx : value $%lx\n", addr, value);
1.1.1.3   root      229: }
                    230: 
1.1.1.4   root      231: static void REGPARAM2 expamem_wput (uaecptr addr, uae_u32 value)
1.1.1.3   root      232: {
1.1.1.7   root      233:     special_mem |= S_WRITE;
1.1.1.3   root      234:     if (expamem_type() != zorroIII)
1.1.1.4   root      235:        write_log ("warning: WRITE.W to address $%lx : value $%x\n", addr, value);
1.1.1.3   root      236:     else {
                    237:        switch (addr & 0xff) {
                    238:         case 0x44:
                    239:            if (expamem_type() == zorroIII) {
                    240:                expamem_hi = value;
                    241:                (*card_map[ecard]) ();
1.1.1.4   root      242:                write_log ("   Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
1.1.1.3   root      243:                ++ecard;
1.1.1.6   root      244:                if (ecard < MAX_EXPANSION_BOARDS)
1.1.1.3   root      245:                    (*card_init[ecard]) ();
                    246:                else
                    247:                    expamem_init_clear ();
                    248:            }
                    249:            break;
                    250:        }
                    251:     }
                    252: }
                    253: 
1.1.1.4   root      254: static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
1.1.1.3   root      255: {
1.1.1.7   root      256:     special_mem |= S_WRITE;
1.1.1.3   root      257:     switch (addr & 0xff) {
                    258:      case 0x30:
                    259:      case 0x32:
                    260:        expamem_hi = 0;
                    261:        expamem_lo = 0;
                    262:        expamem_write (0x48, 0x00);
                    263:        break;
                    264: 
                    265:      case 0x48:
                    266:        if (expamem_type () == zorroII) {
                    267:            expamem_hi = value & 0xFF;
                    268:            (*card_map[ecard]) ();
1.1.1.4   root      269:            write_log ("   Card %d (Zorro%s) done.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
1.1.1.3   root      270:            ++ecard;
1.1.1.6   root      271:            if (ecard < MAX_EXPANSION_BOARDS)
1.1.1.3   root      272:                (*card_init[ecard]) ();
                    273:            else
                    274:                expamem_init_clear ();
                    275:        } else if (expamem_type() == zorroIII)
                    276:            expamem_lo = value;
                    277:        break;
                    278: 
                    279:      case 0x4a:
                    280:        if (expamem_type () == zorroII)
                    281:            expamem_lo = value;
                    282:        break;
                    283: 
                    284:      case 0x4c:
1.1.1.4   root      285:        write_log ("   Card %d (Zorro %s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
1.1.1.3   root      286:        ++ecard;
1.1.1.6   root      287:        if (ecard < MAX_EXPANSION_BOARDS)
1.1.1.3   root      288:            (*card_init[ecard]) ();
                    289:        else
                    290:            expamem_init_clear ();
                    291:        break;
                    292:     }
                    293: }
                    294: 
                    295: /* ********************************************************** */
                    296: 
                    297: /*
                    298:  *  Fast Memory
                    299:  */
                    300: 
                    301: static uae_u32 fastmem_mask;
                    302: 
1.1.1.4   root      303: static uae_u32 fastmem_lget (uaecptr) REGPARAM;
                    304: static uae_u32 fastmem_wget (uaecptr) REGPARAM;
                    305: static uae_u32 fastmem_bget (uaecptr) REGPARAM;
                    306: static void fastmem_lput (uaecptr, uae_u32) REGPARAM;
                    307: static void fastmem_wput (uaecptr, uae_u32) REGPARAM;
                    308: static void fastmem_bput (uaecptr, uae_u32) REGPARAM;
                    309: static int fastmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    310: static uae_u8 *fastmem_xlate (uaecptr addr) REGPARAM;
1.1.1.3   root      311: 
                    312: static uae_u32 fastmem_start; /* Determined by the OS */
                    313: static uae_u8 *fastmemory = NULL;
                    314: 
1.1.1.4   root      315: uae_u32 REGPARAM2 fastmem_lget (uaecptr addr)
1.1.1.3   root      316: {
                    317:     uae_u8 *m;
1.1       root      318:     addr -= fastmem_start & fastmem_mask;
                    319:     addr &= fastmem_mask;
                    320:     m = fastmemory + addr;
1.1.1.3   root      321:     return do_get_mem_long ((uae_u32 *)m);
1.1       root      322: }
                    323: 
1.1.1.4   root      324: uae_u32 REGPARAM2 fastmem_wget (uaecptr addr)
1.1       root      325: {
1.1.1.3   root      326:     uae_u8 *m;
1.1       root      327:     addr -= fastmem_start & fastmem_mask;
                    328:     addr &= fastmem_mask;
                    329:     m = fastmemory + addr;
1.1.1.3   root      330:     return do_get_mem_word ((uae_u16 *)m);
1.1       root      331: }
                    332: 
1.1.1.4   root      333: uae_u32 REGPARAM2 fastmem_bget (uaecptr addr)
1.1       root      334: {
                    335:     addr -= fastmem_start & fastmem_mask;
                    336:     addr &= fastmem_mask;
                    337:     return fastmemory[addr];
                    338: }
                    339: 
1.1.1.4   root      340: void REGPARAM2 fastmem_lput (uaecptr addr, uae_u32 l)
1.1       root      341: {
1.1.1.3   root      342:     uae_u8 *m;
1.1       root      343:     addr -= fastmem_start & fastmem_mask;
                    344:     addr &= fastmem_mask;
                    345:     m = fastmemory + addr;
1.1.1.3   root      346:     do_put_mem_long ((uae_u32 *)m, l);
1.1       root      347: }
                    348: 
1.1.1.4   root      349: void REGPARAM2 fastmem_wput (uaecptr addr, uae_u32 w)
1.1       root      350: {
1.1.1.3   root      351:     uae_u8 *m;
1.1       root      352:     addr -= fastmem_start & fastmem_mask;
                    353:     addr &= fastmem_mask;
                    354:     m = fastmemory + addr;
1.1.1.3   root      355:     do_put_mem_word ((uae_u16 *)m, w);
1.1       root      356: }
                    357: 
1.1.1.4   root      358: void REGPARAM2 fastmem_bput (uaecptr addr, uae_u32 b)
1.1       root      359: {
                    360:     addr -= fastmem_start & fastmem_mask;
                    361:     addr &= fastmem_mask;
                    362:     fastmemory[addr] = b;
                    363: }
                    364: 
1.1.1.4   root      365: static int REGPARAM2 fastmem_check (uaecptr addr, uae_u32 size)
1.1       root      366: {
                    367:     addr -= fastmem_start & fastmem_mask;
                    368:     addr &= fastmem_mask;
1.1.1.4   root      369:     return (addr + size) <= allocated_fastmem;
1.1       root      370: }
                    371: 
1.1.1.4   root      372: static uae_u8 REGPARAM2 *fastmem_xlate (uaecptr addr)
1.1       root      373: {
                    374:     addr -= fastmem_start & fastmem_mask;
                    375:     addr &= fastmem_mask;
                    376:     return fastmemory + addr;
                    377: }
                    378: 
                    379: addrbank fastmem_bank = {
                    380:     fastmem_lget, fastmem_wget, fastmem_bget,
                    381:     fastmem_lput, fastmem_wput, fastmem_bput,
1.1.1.8   root      382:     fastmem_xlate, fastmem_check, NULL
1.1       root      383: };
                    384: 
                    385: 
                    386: /*
                    387:  * Filesystem device ROM
1.1.1.3   root      388:  * This is very simple, the Amiga shouldn't be doing things with it.
1.1       root      389:  */
                    390: 
1.1.1.4   root      391: static uae_u32 filesys_lget (uaecptr) REGPARAM;
                    392: static uae_u32 filesys_wget (uaecptr) REGPARAM;
                    393: static uae_u32 filesys_bget (uaecptr) REGPARAM;
                    394: static void filesys_lput (uaecptr, uae_u32) REGPARAM;
                    395: static void filesys_wput (uaecptr, uae_u32) REGPARAM;
                    396: static void filesys_bput (uaecptr, uae_u32) REGPARAM;
1.1       root      397: 
1.1.1.3   root      398: static uae_u32 filesys_start; /* Determined by the OS */
1.1.1.8   root      399: uae_u8 *filesysory;
1.1       root      400: 
1.1.1.4   root      401: uae_u32 REGPARAM2 filesys_lget (uaecptr addr)
1.1       root      402: {
1.1.1.3   root      403:     uae_u8 *m;
1.1.1.7   root      404:     special_mem |= S_READ;
1.1       root      405:     addr -= filesys_start & 65535;
                    406:     addr &= 65535;
                    407:     m = filesysory + addr;
1.1.1.3   root      408:     return do_get_mem_long ((uae_u32 *)m);
1.1       root      409: }
                    410: 
1.1.1.4   root      411: uae_u32 REGPARAM2 filesys_wget (uaecptr addr)
1.1       root      412: {
1.1.1.3   root      413:     uae_u8 *m;
1.1.1.7   root      414:     special_mem |= S_READ;
1.1       root      415:     addr -= filesys_start & 65535;
                    416:     addr &= 65535;
                    417:     m = filesysory + addr;
1.1.1.3   root      418:     return do_get_mem_word ((uae_u16 *)m);
1.1       root      419: }
                    420: 
1.1.1.4   root      421: uae_u32 REGPARAM2 filesys_bget (uaecptr addr)
1.1       root      422: {
1.1.1.7   root      423:     special_mem |= S_READ;
1.1       root      424:     addr -= filesys_start & 65535;
                    425:     addr &= 65535;
                    426:     return filesysory[addr];
                    427: }
                    428: 
1.1.1.4   root      429: static void REGPARAM2 filesys_lput (uaecptr addr, uae_u32 l)
1.1       root      430: {
1.1.1.7   root      431:     special_mem |= S_WRITE;
1.1.1.3   root      432:     write_log ("filesys_lput called\n");
1.1       root      433: }
                    434: 
1.1.1.4   root      435: static void REGPARAM2 filesys_wput (uaecptr addr, uae_u32 w)
1.1       root      436: {
1.1.1.7   root      437:     special_mem |= S_WRITE;
1.1.1.3   root      438:     write_log ("filesys_wput called\n");
1.1       root      439: }
                    440: 
1.1.1.4   root      441: static void REGPARAM2 filesys_bput (uaecptr addr, uae_u32 b)
1.1       root      442: {
1.1.1.7   root      443:     special_mem |= S_WRITE;
1.1.1.3   root      444:     fprintf (stderr, "filesys_bput called. This usually means that you are using\n");
                    445:     fprintf (stderr, "Kickstart 1.2. Please give UAE the \"-a\" option next time\n");
                    446:     fprintf (stderr, "you start it. If you are _not_ using Kickstart 1.2, then\n");
                    447:     fprintf (stderr, "there's a bug somewhere.\n");
                    448:     fprintf (stderr, "Exiting...\n");
                    449:     uae_quit ();
1.1       root      450: }
                    451: 
                    452: addrbank filesys_bank = {
                    453:     filesys_lget, filesys_wget, filesys_bget,
                    454:     filesys_lput, filesys_wput, filesys_bput,
1.1.1.8   root      455:     default_xlate, default_check, NULL
1.1       root      456: };
                    457: 
1.1.1.3   root      458: /*
                    459:  *  Z3fastmem Memory
                    460:  */
1.1       root      461: 
                    462: 
1.1.1.3   root      463: static uae_u32 z3fastmem_mask;
1.1       root      464: 
1.1.1.4   root      465: static uae_u32 z3fastmem_lget (uaecptr) REGPARAM;
                    466: static uae_u32 z3fastmem_wget (uaecptr) REGPARAM;
                    467: static uae_u32 z3fastmem_bget (uaecptr) REGPARAM;
                    468: static void z3fastmem_lput (uaecptr, uae_u32) REGPARAM;
                    469: static void z3fastmem_wput (uaecptr, uae_u32) REGPARAM;
                    470: static void z3fastmem_bput (uaecptr, uae_u32) REGPARAM;
                    471: static int z3fastmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    472: static uae_u8 *z3fastmem_xlate (uaecptr addr) REGPARAM;
1.1.1.3   root      473: 
                    474: static uae_u32 z3fastmem_start; /* Determined by the OS */
                    475: static uae_u8 *z3fastmem = NULL;
1.1       root      476: 
1.1.1.4   root      477: uae_u32 REGPARAM2 z3fastmem_lget (uaecptr addr)
1.1       root      478: {
1.1.1.3   root      479:     uae_u8 *m;
                    480:     addr -= z3fastmem_start & z3fastmem_mask;
                    481:     addr &= z3fastmem_mask;
                    482:     m = z3fastmem + addr;
                    483:     return do_get_mem_long ((uae_u32 *)m);
1.1       root      484: }
                    485: 
1.1.1.4   root      486: uae_u32 REGPARAM2 z3fastmem_wget (uaecptr addr)
1.1       root      487: {
1.1.1.3   root      488:     uae_u8 *m;
                    489:     addr -= z3fastmem_start & z3fastmem_mask;
                    490:     addr &= z3fastmem_mask;
                    491:     m = z3fastmem + addr;
                    492:     return do_get_mem_word ((uae_u16 *)m);
1.1       root      493: }
                    494: 
1.1.1.4   root      495: uae_u32 REGPARAM2 z3fastmem_bget (uaecptr addr)
1.1       root      496: {
1.1.1.3   root      497:     addr -= z3fastmem_start & z3fastmem_mask;
                    498:     addr &= z3fastmem_mask;
                    499:     return z3fastmem[addr];
1.1       root      500: }
                    501: 
1.1.1.4   root      502: void REGPARAM2 z3fastmem_lput (uaecptr addr, uae_u32 l)
1.1       root      503: {
1.1.1.3   root      504:     uae_u8 *m;
                    505:     addr -= z3fastmem_start & z3fastmem_mask;
                    506:     addr &= z3fastmem_mask;
                    507:     m = z3fastmem + addr;
                    508:     do_put_mem_long ((uae_u32 *)m, l);
1.1       root      509: }
                    510: 
1.1.1.4   root      511: void REGPARAM2 z3fastmem_wput (uaecptr addr, uae_u32 w)
1.1       root      512: {
1.1.1.3   root      513:     uae_u8 *m;
                    514:     addr -= z3fastmem_start & z3fastmem_mask;
                    515:     addr &= z3fastmem_mask;
                    516:     m = z3fastmem + addr;
                    517:     do_put_mem_word ((uae_u16 *)m, w);
1.1       root      518: }
                    519: 
1.1.1.4   root      520: void REGPARAM2 z3fastmem_bput (uaecptr addr, uae_u32 b)
1.1       root      521: {
1.1.1.3   root      522:     addr -= z3fastmem_start & z3fastmem_mask;
                    523:     addr &= z3fastmem_mask;
                    524:     z3fastmem[addr] = b;
1.1       root      525: }
                    526: 
1.1.1.4   root      527: static int REGPARAM2 z3fastmem_check (uaecptr addr, uae_u32 size)
1.1       root      528: {
1.1.1.3   root      529:     addr -= z3fastmem_start & z3fastmem_mask;
                    530:     addr &= z3fastmem_mask;
1.1.1.4   root      531:     return (addr + size) <= allocated_z3fastmem;
1.1       root      532: }
                    533: 
1.1.1.4   root      534: static uae_u8 REGPARAM2 *z3fastmem_xlate (uaecptr addr)
1.1       root      535: {
1.1.1.3   root      536:     addr -= z3fastmem_start & z3fastmem_mask;
                    537:     addr &= z3fastmem_mask;
                    538:     return z3fastmem + addr;
                    539: }
1.1       root      540: 
1.1.1.3   root      541: addrbank z3fastmem_bank = {
                    542:     z3fastmem_lget, z3fastmem_wget, z3fastmem_bget,
                    543:     z3fastmem_lput, z3fastmem_wput, z3fastmem_bput,
1.1.1.8   root      544:     z3fastmem_xlate, z3fastmem_check, NULL
1.1.1.3   root      545: };
1.1       root      546: 
1.1.1.3   root      547: /* Z3-based UAEGFX-card */
                    548: uae_u32 gfxmem_mask; /* for memory.c */
                    549: uae_u8 *gfxmemory;
                    550: uae_u32 gfxmem_start;
1.1       root      551: 
1.1.1.3   root      552: /* ********************************************************** */
1.1       root      553: 
1.1.1.2   root      554: /*
1.1       root      555:  *     Expansion Card (ZORRO II) for 1/2/4/8 MB of Fast Memory
1.1.1.2   root      556:  */
1.1       root      557: 
1.1.1.3   root      558: static void expamem_map_fastcard (void)
1.1       root      559: {
1.1.1.3   root      560:     fastmem_start = ((expamem_hi | (expamem_lo >> 4)) << 16);
1.1.1.8   root      561:     map_banks (&fastmem_bank, fastmem_start >> 16, allocated_fastmem >> 16, allocated_fastmem);
1.1.1.4   root      562:     write_log ("Fastcard: mapped @$%lx: %dMB fast memory\n", fastmem_start, allocated_fastmem >> 20);
1.1       root      563: }
                    564: 
1.1.1.3   root      565: static void expamem_init_fastcard (void)
1.1       root      566: {
                    567:     expamem_init_clear();
1.1.1.4   root      568:     if (allocated_fastmem == 0x100000)
1.1.1.3   root      569:        expamem_write (0x00, Z2_MEM_1MB + add_memory + zorroII);
1.1.1.4   root      570:     else if (allocated_fastmem == 0x200000)
1.1.1.3   root      571:        expamem_write (0x00, Z2_MEM_2MB + add_memory + zorroII);
1.1.1.4   root      572:     else if (allocated_fastmem == 0x400000)
1.1.1.3   root      573:        expamem_write (0x00, Z2_MEM_4MB + add_memory + zorroII);
1.1.1.4   root      574:     else if (allocated_fastmem == 0x800000)
1.1.1.3   root      575:        expamem_write (0x00, Z2_MEM_8MB + add_memory + zorroII);
1.1       root      576: 
                    577:     expamem_write (0x08, care_addr);
                    578: 
                    579:     expamem_write (0x04, 1);
1.1.1.3   root      580: 
1.1       root      581:     expamem_write (0x10, hackers_id >> 8);
1.1.1.3   root      582:     expamem_write (0x14, hackers_id & 0xff);
1.1       root      583: 
                    584:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    585:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    586:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    587:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    588: 
1.1.1.3   root      589:     expamem_write (0x28, 0x00); /* Rom-Offset hi */
                    590:     expamem_write (0x2c, 0x00); /* ROM-Offset lo */
1.1       root      591: 
                    592:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
                    593: }
                    594: 
1.1.1.3   root      595: /* ********************************************************** */
                    596: 
1.1       root      597: /* 
                    598:  * Filesystem device
                    599:  */
                    600: 
1.1.1.3   root      601: static void expamem_map_filesys (void)
1.1       root      602: {
1.1.1.3   root      603:     uaecptr a;
                    604: 
                    605:     filesys_start = ((expamem_hi | (expamem_lo >> 4)) << 16);
1.1.1.8   root      606:     map_banks (&filesys_bank, filesys_start >> 16, 1, 0);
1.1.1.5   root      607:     write_log ("Filesystem: mapped memory @$%lx.\n", filesys_start);
1.1.1.3   root      608:     /* 68k code needs to know this. */
                    609:     a = here ();
                    610:     org (0xF0FFFC);
                    611:     dl (filesys_start + 0x2000);
                    612:     org (a);
1.1       root      613: }
                    614: 
1.1.1.3   root      615: static void expamem_init_filesys (void)
1.1       root      616: {
1.1.1.5   root      617:     /* struct DiagArea - the size has to be large enough to store several device ROMTags */
                    618:     uae_u8 diagarea[] = { 0x90, 0x00, /* da_Config, da_Flags */
                    619:                           0x02, 0x00, /* da_Size */
                    620:                           0x01, 0x00, /* da_DiagPoint */
                    621:                           0x01, 0x06  /* da_BootPoint */
                    622:     };
1.1       root      623: 
                    624:     expamem_init_clear();
1.1.1.3   root      625:     expamem_write (0x00, Z2_MEM_64KB | rom_card | zorroII);
1.1       root      626: 
1.1.1.3   root      627:     expamem_write (0x08, no_shutup);
1.1       root      628: 
                    629:     expamem_write (0x04, 2);
                    630:     expamem_write (0x10, hackers_id >> 8);
1.1.1.3   root      631:     expamem_write (0x14, hackers_id & 0xff);
1.1       root      632: 
                    633:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    634:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    635:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    636:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    637: 
1.1.1.5   root      638:     /* er_InitDiagVec */
1.1.1.3   root      639:     expamem_write (0x28, 0x10); /* Rom-Offset hi */
                    640:     expamem_write (0x2c, 0x00); /* ROM-Offset lo */
1.1       root      641: 
                    642:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
                    643: 
                    644:     /* Build a DiagArea */
1.1.1.3   root      645:     memcpy (expamem + 0x1000, diagarea, sizeof diagarea);
                    646: 
1.1       root      647:     /* Call DiagEntry */
1.1.1.3   root      648:     do_put_mem_word ((uae_u16 *)(expamem + 0x1100), 0x4EF9); /* JMP */
                    649:     do_put_mem_long ((uae_u32 *)(expamem + 0x1102), ROM_filesys_diagentry);
                    650: 
1.1       root      651:     /* What comes next is a plain bootblock */
1.1.1.3   root      652:     do_put_mem_word ((uae_u16 *)(expamem + 0x1106), 0x4EF9); /* JMP */
                    653:     do_put_mem_long ((uae_u32 *)(expamem + 0x1108), EXPANSION_bootcode);
                    654: 
                    655:     memcpy (filesysory, expamem, 0x3000);
1.1       root      656: }
                    657: 
1.1.1.2   root      658: /*
1.1.1.3   root      659:  * Zorro III expansion memory
1.1.1.2   root      660:  */
1.1       root      661: 
1.1.1.3   root      662: static void expamem_map_z3fastmem (void)
1.1       root      663: {
1.1.1.3   root      664:     z3fastmem_start = ((expamem_hi | (expamem_lo >> 4)) << 16);
1.1.1.8   root      665:     map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
                    666:               allocated_z3fastmem);
1.1.1.3   root      667: 
1.1.1.4   root      668:     write_log ("Fastmem (32bit): mapped @$%lx: %d MB Zorro III fast memory \n",
                    669:               z3fastmem_start, allocated_z3fastmem / 0x100000);
1.1.1.3   root      670: }
                    671: 
                    672: static void expamem_init_z3fastmem (void)
                    673: {
1.1.1.4   root      674:     int code = (allocated_z3fastmem == 0x100000 ? Z2_MEM_1MB
                    675:                : allocated_z3fastmem == 0x200000 ? Z2_MEM_2MB
                    676:                : allocated_z3fastmem == 0x400000 ? Z2_MEM_4MB
                    677:                : allocated_z3fastmem == 0x800000 ? Z2_MEM_8MB
                    678:                : allocated_z3fastmem == 0x1000000 ? Z2_MEM_16MB
                    679:                : allocated_z3fastmem == 0x2000000 ? Z2_MEM_32MB
                    680:                : allocated_z3fastmem == 0x4000000 ? Z2_MEM_64MB
                    681:                : allocated_z3fastmem == 0x8000000 ? Z2_MEM_128MB
                    682:                : allocated_z3fastmem == 0x10000000 ? Z2_MEM_256MB
                    683:                : allocated_z3fastmem == 0x20000000 ? Z2_MEM_512MB
1.1.1.3   root      684:                : Z2_MEM_1GB);
                    685:     expamem_init_clear();
                    686:     expamem_write (0x00, add_memory | zorroIII | code);
                    687: 
1.1.1.4   root      688:     expamem_write (0x08, no_shutup | force_z3 | (allocated_z3fastmem > 0x800000 ? ext_size : Z3_MEM_AUTO));
1.1.1.3   root      689: 
                    690:     expamem_write (0x04, 3);
                    691: 
                    692:     expamem_write (0x10, hackers_id >> 8);
                    693:     expamem_write (0x14, hackers_id & 0xff);
                    694: 
                    695:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    696:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    697:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    698:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    699: 
                    700:     expamem_write (0x28, 0x00); /* Rom-Offset hi */
                    701:     expamem_write (0x2c, 0x00); /* ROM-Offset lo */
                    702: 
                    703:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
1.1       root      704: }
                    705: 
1.1.1.3   root      706: #ifdef PICASSO96
                    707: /*
                    708:  *  Fake Graphics Card (ZORRO III) - BDK
                    709:  */
                    710: 
                    711: static void expamem_map_gfxcard (void)
1.1       root      712: {
1.1.1.3   root      713:     gfxmem_start = ((expamem_hi | (expamem_lo >> 4)) << 16);
1.1.1.8   root      714:     map_banks (&gfxmem_bank, gfxmem_start >> 16, allocated_gfxmem >> 16, allocated_gfxmem);
1.1.1.4   root      715:     write_log ("UAEGFX-card: mapped @$%lx \n", gfxmem_start);
1.1       root      716: }
1.1.1.3   root      717: 
                    718: static void expamem_init_gfxcard (void)
                    719: {
                    720:     expamem_init_clear();
                    721:     expamem_write (0x00, zorroIII);
                    722: 
1.1.1.4   root      723:     switch (allocated_gfxmem) {
1.1.1.3   root      724:      case 0x00100000:
                    725:        expamem_write (0x08, no_shutup | force_z3 | Z3_MEM_1MB);
                    726:        break;
                    727:      case 0x00200000:
                    728:        expamem_write (0x08, no_shutup | force_z3 | Z3_MEM_2MB);
                    729:        break;
                    730:      case 0x00400000:
                    731:        expamem_write (0x08, no_shutup | force_z3 | Z3_MEM_4MB);
                    732:        break;
                    733:      case 0x00800000:
                    734:        expamem_write (0x08, no_shutup | force_z3 | Z3_MEM_8MB);
                    735:        break;
                    736:     }
                    737: 
                    738:     expamem_write (0x04, 96);
                    739: 
                    740:     expamem_write (0x10, hackers_id >> 8);
                    741:     expamem_write (0x14, hackers_id & 0xff);
                    742: 
                    743:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    744:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    745:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    746:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    747: 
                    748:     expamem_write (0x28, 0x00); /* Rom-Offset hi */
                    749:     expamem_write (0x2c, 0x00); /* ROM-Offset lo */
                    750: 
                    751:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
                    752: }
                    753: #endif
                    754: 
1.1.1.8   root      755: static long fast_filepos, z3_filepos;
                    756: 
                    757: static void allocate_expamem (void)
                    758: {
                    759:     currprefs.fastmem_size = changed_prefs.fastmem_size;
                    760:     currprefs.z3fastmem_size = changed_prefs.z3fastmem_size;
                    761:     currprefs.gfxmem_size = changed_prefs.gfxmem_size;
                    762: 
                    763:     if (allocated_fastmem != currprefs.fastmem_size) {
                    764:        if (fastmemory)
1.1.1.9 ! root      765:            mapped_free (fastmemory);
1.1.1.8   root      766:        fastmemory = 0;
                    767:        allocated_fastmem = currprefs.fastmem_size;
                    768:        fastmem_mask = allocated_fastmem - 1;
                    769: 
                    770:        if (allocated_fastmem) {
                    771:            fastmemory = mapped_malloc (allocated_fastmem, "fast");
                    772:            if (fastmemory == 0) {
                    773:                write_log ("Out of memory for fastmem card.\n");
                    774:                allocated_fastmem = 0;
                    775:            }
                    776:        }
                    777:     }
                    778:     if (allocated_z3fastmem != currprefs.z3fastmem_size) {
                    779:        if (z3fastmem)
1.1.1.9 ! root      780:            mapped_free (z3fastmem);
1.1.1.8   root      781:        z3fastmem = 0;
                    782: 
                    783:        allocated_z3fastmem = currprefs.z3fastmem_size;
                    784:        z3fastmem_mask = allocated_z3fastmem - 1;
                    785: 
                    786:        if (allocated_z3fastmem) {
                    787:            z3fastmem = mapped_malloc (allocated_z3fastmem, "z3");
                    788:            if (z3fastmem == 0) {
                    789:                write_log ("Out of memory for 32 bit fast memory.\n");
                    790:                allocated_z3fastmem = 0;
                    791:            }
                    792:        }
                    793:     }
                    794:     if (allocated_gfxmem != currprefs.gfxmem_size) {
                    795:        if (gfxmemory)
1.1.1.9 ! root      796:            mapped_free (gfxmemory);
1.1.1.8   root      797:        gfxmemory = 0;
                    798: 
                    799:        allocated_gfxmem = currprefs.gfxmem_size;
                    800:        gfxmem_mask = allocated_gfxmem - 1;
                    801: 
                    802:        if (allocated_gfxmem) {
                    803:            gfxmemory = mapped_malloc (allocated_gfxmem, "gfx");
                    804:            if (gfxmemory == 0) {
                    805:                write_log ("Out of memory for graphics card memory\n");
                    806:                allocated_gfxmem = 0;
                    807:            }
                    808:        }
                    809:     }
                    810: 
                    811:     z3fastmem_bank.baseaddr = z3fastmem;
                    812:     fastmem_bank.baseaddr = fastmemory;
                    813: 
                    814:     if (savestate_state == STATE_RESTORE) {
                    815:        if (allocated_fastmem > 0) {
                    816:            fseek (savestate_file, fast_filepos, SEEK_SET);
                    817:            fread (fastmemory, 1, allocated_fastmem, savestate_file);
                    818:            map_banks (&fastmem_bank, fastmem_start >> 16, currprefs.fastmem_size >> 16,
                    819:                       allocated_fastmem);
                    820:        }
                    821:        if (allocated_z3fastmem > 0) {
                    822:            fseek (savestate_file, z3_filepos, SEEK_SET);
                    823:            fread (z3fastmem, 1, allocated_z3fastmem, savestate_file);
                    824:            map_banks (&z3fastmem_bank, z3fastmem_start >> 16, currprefs.z3fastmem_size >> 16,
                    825:                       allocated_z3fastmem);
                    826:        }
                    827:     }
                    828: }
                    829: 
                    830: void expamem_reset (void)
1.1.1.3   root      831: {
1.1.1.8   root      832:     int do_mount = 1;
1.1.1.3   root      833:     int cardno = 0;
                    834:     ecard = 0;
                    835: 
1.1.1.8   root      836:     allocate_expamem ();
                    837: 
                    838:     /* check if Kickstart version is below 1.3 */
                    839:     if (! ersatzkickfile
                    840:        && (/* Kickstart 1.0 & 1.1! */
                    841:            get_word (0xF8000C) == 0xFFFF
                    842:            /* Kickstart < 1.3 */
                    843:            || get_word (0xF8000C) < 34))
                    844:     {
                    845:        /* warn user */
                    846:        write_log ("Kickstart version is below 1.3!  Disabling autoconfig devices.\n");
                    847:        do_mount = 0;
                    848:     }
                    849: 
1.1.1.3   root      850:     if (fastmemory != NULL) {
                    851:        card_init[cardno] = expamem_init_fastcard;
                    852:        card_map[cardno++] = expamem_map_fastcard;
                    853:     }
                    854:     if (z3fastmem != NULL) {
                    855:        card_init[cardno] = expamem_init_z3fastmem;
                    856:        card_map[cardno++] = expamem_map_z3fastmem;
                    857:     }
                    858: #ifdef PICASSO96
                    859:     if (gfxmemory != NULL) {
                    860:        card_init[cardno] = expamem_init_gfxcard;
                    861:        card_map[cardno++] = expamem_map_gfxcard;
                    862:     }
                    863: #endif
1.1.1.8   root      864:     if (do_mount && ! ersatzkickfile) {
1.1.1.3   root      865:        card_init[cardno] = expamem_init_filesys;
                    866:        card_map[cardno++] = expamem_map_filesys;
                    867:     }
                    868:     while (cardno < MAX_EXPANSION_BOARDS) {
                    869:        card_init[cardno] = expamem_init_clear;
                    870:        card_map[cardno++] = expamem_map_clear;
                    871:     }
                    872: 
                    873:     (*card_init[0]) ();
                    874: }
                    875: 
1.1.1.4   root      876: void expansion_init (void)
1.1.1.3   root      877: {
1.1.1.8   root      878:     z3fastmem = 0;
                    879:     gfxmemory = 0;
                    880:     fastmemory = 0;
                    881:     allocated_z3fastmem = 0;
                    882:     allocated_gfxmem = 0;
                    883:     allocated_fastmem = 0;
                    884: 
                    885:     allocate_expamem ();
                    886: 
                    887:     filesysory = (uae_u8 *) mapped_malloc (0x10000, "filesys");
                    888:     if (!filesysory) {
                    889:        write_log ("virtual memory exhausted (filesysory)!\n");
                    890:        exit (0);
1.1.1.3   root      891:     }
1.1.1.8   root      892:     filesys_bank.baseaddr = (uae_u8*)filesysory;
                    893: 
1.1.1.3   root      894: }
                    895: 
1.1.1.9 ! root      896: void expansion_cleanup (void)
        !           897: {
        !           898:     if (fastmemory)
        !           899:        mapped_free (fastmemory);
        !           900:     if (z3fastmem)
        !           901:        mapped_free (z3fastmem);
        !           902:     if (gfxmemory)
        !           903:        mapped_free (gfxmemory);
        !           904:     if (filesysory)
        !           905:        mapped_free (filesysory);
        !           906:     fastmemory = 0;
        !           907:     z3fastmem = 0;
        !           908:     gfxmemory = 0;
        !           909:     filesysory = 0;
        !           910: }
        !           911: 
1.1.1.8   root      912: /* State save/restore code.  */
                    913: 
                    914: uae_u8 *save_fram (int *len)
                    915: {
                    916:     *len = allocated_fastmem;
                    917:     return fastmemory;
                    918: }
                    919: 
                    920: uae_u8 *save_zram (int *len)
                    921: {
                    922:     *len = allocated_z3fastmem;
                    923:     return z3fastmem;
                    924: }
                    925: 
                    926: void restore_fram (int len, long filepos)
                    927: {
                    928:     fast_filepos = filepos;
                    929:     changed_prefs.fastmem_size = len;
                    930: }
                    931: 
                    932: void restore_zram (int len, long filepos)
                    933: {
                    934:     z3_filepos = filepos;
                    935:     changed_prefs.z3fastmem_size = len;
                    936: }
                    937: 
                    938: uae_u8 *save_expansion (int *len)
                    939: {
                    940:     static uae_u8 t[20], *dst = t;
                    941:     save_u32 (fastmem_start);
                    942:     save_u32 (z3fastmem_start);
                    943:     *len = 8;
                    944:     return dst;
                    945: }
                    946: 
                    947: uae_u8 *restore_expansion (uae_u8 *src)
                    948: {
                    949:     fastmem_start = restore_u32 ();
                    950:     z3fastmem_start = restore_u32 ();
                    951:     return src;
                    952: }

unix.superglobalmegacorp.com

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