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

1.1       root        1:  /* 
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   * 
                      4:   *  Expansion Slots
                      5:   *
                      6:   * (c) 1996 Stefan Reinauer
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include "config.h"
                     13: #include "options.h"
                     14: #include "memory.h"
                     15: #include "custom.h"
                     16: #include "newcpu.h"
                     17: #include "autoconf.h"
                     18: 
                     19: #define MAX_EXPANSION_BOARDS 5
                     20: 
                     21: /* 00 / 02 */
                     22: 
                     23: #define MEM_8MB    0x00        /* Size of Memory Block           */
                     24: #define MEM_4MB    0x07
                     25: #define MEM_2MB    0x06
                     26: #define MEM_1MB    0x05
                     27: #define MEM_512KB  0x04
                     28: #define MEM_256KB  0x03
                     29: #define MEM_128KB  0x02
                     30: #define MEM_64KB   0x01
                     31:  
                     32: #define same_slot  0x08     /* Next card is in the same Slot  */
                     33: #define rom_card   0x10     /* Card has valid ROM             */
                     34: #define add_memory 0x20     /* Add Memory to List of Free Ram */
                     35: 
                     36: #define generic    0xc0     /* Type of Expansion Card         */
                     37: #define future1    0x00
                     38: #define future2    0x40
                     39: #define future3    0x80
                     40: 
                     41: /* ********************************************************** */
                     42: 
                     43: /* Card Data - Where can I get a complete List of these ????  */
                     44: 
                     45: /* 04 - 06 & 10-16 */
                     46: #define commodore_g   513  /* Commodore Braunschweig (Germany) */
                     47: #define commodore     514  /* Commodore West Chester           */
                     48: #define gvp         2017  /* GVP */
                     49: #define hackers_id   2011
                     50: 
                     51: #define   commodore_a2091         3  /* A2091 / A590 Card from C=   */
                     52: #define   commodore_a2091_ram    10  /* A2091 / A590 Ram on HD-Card */
                     53: #define   commodore_a2232        70  /* A2232 Multiport Expansion   */
                     54: 
                     55: #define   gvp_series_2_scsi      11
                     56: #define   gvp_iv_24_gfx          32
                     57: 
                     58: /* ********************************************************** */
                     59: /* 08-0A */
                     60: 
                     61: #define no_shutup  64  /* Card cannot receive Shut_up_forever */
                     62: #define care_addr 128  /* Adress HAS to be $200000-$9fffff    */
                     63: 
                     64: /* ********************************************************** */
                     65: 
                     66: /* 40-42 */
                     67: #define enable_irq   1  /* enable Interrupt                   */ 
                     68: #define reset_card   4  /* Reset of Expansion Card            */
                     69: #define card_int2   16  /* READ ONLY: IRQ 2 occured           */
                     70: #define card_irq6   32  /* READ ONLY: IRQ 6 occured           */
                     71: #define card_irq7   64  /* READ ONLY: IRQ 7 occured           */
                     72: #define does_irq   128  /* READ ONLY: Karte loest ger. IRQ aus*/
                     73: 
                     74: /* ********************************************************** */
                     75: 
                     76: /* ROM defines */
                     77: 
                     78: #define rom_4bit    (0x00<<14) /* ROM width */
                     79: #define rom_8bit    (0x01<<14)
                     80: #define rom_16bit   (0x02<<14)
                     81: 
                     82: #define rom_never   (0x00<<12) /* Never run Boot Code       */
                     83: #define rom_install (0x01<<12) /* run code at install time  */
                     84: #define rom_binddrv (0x02<<12) /* run code with binddrivers */
                     85: 
                     86: CPTR ROM_filesys_resname = 0, ROM_filesys_resid = 0;
                     87: CPTR ROM_filesys_diagentry = 0;
                     88: CPTR ROM_hardfile_resname = 0, ROM_hardfile_resid = 0;
                     89: CPTR ROM_hardfile_init = 0;
                     90: 
                     91: /* ********************************************************** */
                     92: 
                     93: static void expamem_init_clear(void);
                     94: static void expamem_map_clear(void);
                     95: static void expamem_init_fastcard(void);
                     96: static void expamem_map_fastcard(void);
                     97: static void expamem_init_filesys(void);
                     98: static void expamem_map_filesys(void);
                     99: 
                    100: void (*card_init[MAX_EXPANSION_BOARDS])(void);
                    101: void (*card_map[MAX_EXPANSION_BOARDS])(void);
                    102: 
                    103: int ecard = 0;
                    104: 
                    105: /* **********************************************************
                    106:  *  Fast Memory
                    107:  * ********************************************************** */
                    108: 
                    109: static ULONG fastmem_mask;
                    110: 
                    111: static ULONG fastmem_alget(CPTR) REGPARAM;
                    112: static UWORD fastmem_awget(CPTR) REGPARAM;
                    113: static ULONG fastmem_lget(CPTR) REGPARAM;
                    114: static UWORD fastmem_wget(CPTR) REGPARAM;
                    115: static UBYTE fastmem_bget(CPTR) REGPARAM;
                    116: static void  fastmem_lput(CPTR, ULONG) REGPARAM;
                    117: static void  fastmem_wput(CPTR, UWORD) REGPARAM;
                    118: static void  fastmem_bput(CPTR, UBYTE) REGPARAM;
                    119: static int   fastmem_check(CPTR addr, ULONG size) REGPARAM;
                    120: static UBYTE *fastmem_xlate(CPTR addr) REGPARAM;
                    121: 
                    122: static ULONG fastmem_start; /* Determined by the OS */
                    123: static UBYTE *fastmemory = NULL;
                    124: 
                    125: ULONG fastmem_alget(CPTR addr)
                    126: {
                    127:     UBYTE *m;
                    128:     addr -= fastmem_start & fastmem_mask;
                    129:     addr &= fastmem_mask;
                    130:     m = fastmemory + addr;
                    131:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
                    132:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
                    133: }
                    134: 
                    135: UWORD fastmem_awget(CPTR addr)
                    136: {
                    137:     UBYTE *m;
                    138:     addr -= fastmem_start & fastmem_mask;
                    139:     addr &= fastmem_mask;
                    140:     m = fastmemory + addr;
                    141:     return ((UWORD)m[0] << 8) + m[1];
                    142: }
                    143: 
                    144: ULONG fastmem_lget(CPTR addr)
                    145: {
                    146:     UBYTE *m;
                    147:     addr -= fastmem_start & fastmem_mask;
                    148:     addr &= fastmem_mask;
                    149:     m = fastmemory + addr;
                    150:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
                    151:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
                    152: }
                    153: 
                    154: UWORD fastmem_wget(CPTR addr)
                    155: {
                    156:     UBYTE *m;
                    157:     addr -= fastmem_start & fastmem_mask;
                    158:     addr &= fastmem_mask;
                    159:     m = fastmemory + addr;
                    160:     return ((UWORD)m[0] << 8) + m[1];
                    161: }
                    162: 
                    163: UBYTE fastmem_bget(CPTR addr)
                    164: {
                    165:     addr -= fastmem_start & fastmem_mask;
                    166:     addr &= fastmem_mask;
                    167:     return fastmemory[addr];
                    168: }
                    169: 
                    170: void fastmem_lput(CPTR addr, ULONG l)
                    171: {
                    172:     UBYTE *m;
                    173:     addr -= fastmem_start & fastmem_mask;
                    174:     addr &= fastmem_mask;
                    175:     m = fastmemory + addr;
                    176:     m[0] = l >> 24;
                    177:     m[1] = l >> 16;
                    178:     m[2] = l >> 8;
                    179:     m[3] = l;
                    180: }
                    181: 
                    182: void fastmem_wput(CPTR addr, UWORD w)
                    183: {
                    184:     UBYTE *m;
                    185:     addr -= fastmem_start & fastmem_mask;
                    186:     addr &= fastmem_mask;
                    187:     m = fastmemory + addr;
                    188:     m[0] = w >> 8;
                    189:     m[1] = w;
                    190: }
                    191: 
                    192: void fastmem_bput(CPTR addr, UBYTE b)
                    193: {
                    194:     addr -= fastmem_start & fastmem_mask;
                    195:     addr &= fastmem_mask;
                    196:     fastmemory[addr] = b;
                    197: }
                    198: 
                    199: static int fastmem_check(CPTR addr, ULONG size)
                    200: {
                    201:     addr -= fastmem_start & fastmem_mask;
                    202:     addr &= fastmem_mask;
                    203:     return (addr + size) < fastmem_size;
                    204: }
                    205: 
                    206: static UBYTE *fastmem_xlate(CPTR addr)
                    207: {
                    208:     addr -= fastmem_start & fastmem_mask;
                    209:     addr &= fastmem_mask;
                    210:     return fastmemory + addr;
                    211: }
                    212: 
                    213: addrbank fastmem_bank = {
                    214:     fastmem_alget, fastmem_awget,
                    215:     fastmem_lget, fastmem_wget, fastmem_bget,
                    216:     fastmem_lput, fastmem_wput, fastmem_bput,
                    217:     fastmem_xlate, fastmem_check
                    218: };
                    219: 
                    220: 
                    221: /*
                    222:  * Filesystem device ROM
                    223:  * This is very simple, the Amiga shouldn't be doing things with it. No support
                    224:  * for 68020 unaligned addressing etc.
                    225:  */
                    226: 
                    227: static ULONG filesys_lget(CPTR) REGPARAM;
                    228: static UWORD filesys_wget(CPTR) REGPARAM;
                    229: static UBYTE filesys_bget(CPTR) REGPARAM;
                    230: static void  filesys_lput(CPTR, ULONG) REGPARAM;
                    231: static void  filesys_wput(CPTR, UWORD) REGPARAM;
                    232: static void  filesys_bput(CPTR, UBYTE) REGPARAM;
                    233: 
                    234: static ULONG filesys_start; /* Determined by the OS */
                    235: static UBYTE filesysory[65536];
                    236: 
                    237: ULONG filesys_lget(CPTR addr)
                    238: {
                    239:     UBYTE *m;
                    240:     addr -= filesys_start & 65535;
                    241:     addr &= 65535;
                    242:     m = filesysory + addr;
                    243:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
                    244:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
                    245: }
                    246: 
                    247: UWORD filesys_wget(CPTR addr)
                    248: {
                    249:     UBYTE *m;
                    250:     addr -= filesys_start & 65535;
                    251:     addr &= 65535;
                    252:     m = filesysory + addr;
                    253:     return ((UWORD)m[0] << 8) + m[1];
                    254: }
                    255: 
                    256: UBYTE filesys_bget(CPTR addr)
                    257: {
                    258:     addr -= filesys_start & 65535;
                    259:     addr &= 65535;
                    260:     return filesysory[addr];
                    261: }
                    262: 
                    263: static void filesys_lput(CPTR addr, ULONG l)
                    264: {
                    265:     fprintf(stderr, "filesys_lput called\n");
                    266: }
                    267: 
                    268: static void filesys_wput(CPTR addr, UWORD w)
                    269: {
                    270:     fprintf(stderr, "filesys_wput called\n");
                    271: }
                    272: 
                    273: static void filesys_bput(CPTR addr, UBYTE b)
                    274: {
                    275:     fprintf(stderr, "filesys_bput called\n");
                    276: }
                    277: 
                    278: addrbank filesys_bank = {
                    279:     default_alget, default_awget,
                    280:     filesys_lget, filesys_wget, filesys_bget,
                    281:     filesys_lput, filesys_wput, filesys_bput,
                    282:     default_xlate, default_check
                    283: };
                    284: 
                    285: 
                    286: /* ******************************************************* */
                    287: 
                    288: /* Autoconfig address space at 0xE80000 */
                    289: static UBYTE expamem[65536];
                    290: 
                    291: static UBYTE expamem_lo;
                    292: static UBYTE expamem_hi;
                    293: 
                    294: static ULONG expamem_lget(CPTR) REGPARAM;
                    295: static UWORD expamem_wget(CPTR) REGPARAM;
                    296: static UBYTE expamem_bget(CPTR) REGPARAM;
                    297: static void  expamem_lput(CPTR, ULONG) REGPARAM;
                    298: static void  expamem_wput(CPTR, UWORD) REGPARAM;
                    299: static void  expamem_bput(CPTR, UBYTE) REGPARAM;
                    300: 
                    301: addrbank expamem_bank = {
                    302:     expamem_lget, expamem_wget,
                    303:     expamem_lget, expamem_wget, expamem_bget,
                    304:     expamem_lput, expamem_wput, expamem_bput,
                    305:     default_xlate, default_check
                    306: };
                    307: 
                    308: static ULONG expamem_lget(CPTR addr)
                    309: {
                    310:     fprintf(stderr,"warning: READ.L from address $%lx \n",addr);
                    311:     return 0xffffffff;
                    312: }
                    313: 
                    314: static UWORD expamem_wget(CPTR addr)
                    315: {
                    316:     fprintf(stderr,"warning: READ.W from address $%lx \n",addr);
                    317:     return 0xffff;
                    318: }
                    319: 
                    320: static UBYTE expamem_bget(CPTR addr)
                    321: {
                    322:     UBYTE value;
                    323:     addr &= 0xFFFF;
                    324:     return expamem[addr];
                    325: }
                    326: 
                    327: static void  expamem_write(CPTR addr, UBYTE value)
                    328: {
                    329:     addr &= 0xffff;
                    330:     if (addr==00 || addr==02 || addr==0x40 || addr==0x42) {
                    331:        expamem[addr] = (value & 0xf0);
                    332:        expamem[addr+2] = (value & 0x0f) << 4;
                    333:     } else {
                    334:        expamem[addr] = ~(value & 0xf0);
                    335:        expamem[addr+2] = ~((value & 0x0f) << 4);
                    336:     }
                    337: }
                    338: 
                    339: static void expamem_lput(CPTR addr, ULONG value)
                    340: {
                    341:     fprintf(stderr,"warning: WRITE.L to address $%lx : value $%lx\n",addr,value);
                    342: }
                    343: 
                    344: static void expamem_wput(CPTR addr, UWORD value)
                    345: {
                    346:     fprintf(stderr,"warning: WRITE.W to address $%lx : value $%x\n",addr,value);
                    347: }
                    348: 
                    349: static void expamem_bput(CPTR addr, UBYTE value)
                    350: {
                    351:     switch (addr&0xff) {
                    352:      case 0x30:
                    353:      case 0x32:
                    354:        expamem_hi = 0;
                    355:        expamem_lo = 0;
                    356:        expamem_write (0x48, 0x00);
                    357:        break;
                    358: 
                    359:      case 0x48:    
                    360:        expamem_hi = value;
                    361:         (*card_map[ecard])();
                    362:         fprintf (stderr,"   Card %d done.\n",ecard+1);
                    363:         ++ecard;
                    364:         if (ecard <= MAX_EXPANSION_BOARDS)
                    365:            (*card_init[ecard])();
                    366:        else
                    367:            expamem_init_clear();
                    368:                break;
                    369:     
                    370:      case 0x4a:        
                    371:        expamem_lo = value;
                    372:        break;
                    373:        
                    374:      case 0x4c:
                    375:         fprintf (stderr,"   Card %d had no success.\n",ecard+1);
                    376:         ++ecard;
                    377:         if (ecard <= MAX_EXPANSION_BOARDS) 
                    378:            (*card_init[ecard])();
                    379:        else  
                    380:            expamem_init_clear();
                    381:         break;
                    382:     }
                    383: }
                    384: 
                    385: void expamem_reset()
                    386: {
                    387:     int cardno = 0;
                    388: 
                    389:     ecard = 0;
                    390:     
                    391:     if (fastmemory != NULL) {
                    392:        card_init[cardno] = expamem_init_fastcard;
                    393:        card_map[cardno++] = expamem_map_fastcard;
                    394:     }
                    395: 
                    396:     if (automount_uaedev && !ersatzkickfile) {
                    397:        card_init[cardno] = expamem_init_filesys;
                    398:        card_map[cardno++] = expamem_map_filesys;
                    399:     }
                    400: 
                    401:     while (cardno < MAX_EXPANSION_BOARDS) {
                    402:        card_init[cardno] = expamem_init_clear;
                    403:        card_map[cardno++] = expamem_map_clear;
                    404:     }
                    405:     
                    406:     (*card_init[0])();
                    407: }
                    408: 
                    409: void expansion_init(void)
                    410: {
                    411:     if (fastmem_size > 0) {
                    412:        fastmem_mask = fastmem_size - 1;
                    413:        fastmemory = (UBYTE *)calloc(fastmem_size,1);
                    414:        if (fastmemory == NULL) {
                    415:            fprintf (stderr,"Out of memory for fastmem card.\n");
                    416:        }
                    417:     }
                    418: }
                    419: 
                    420: /* ***************************************************************
                    421:  *     Expansion Card (ZORRO II) for 1/2/4/8 MB of Fast Memory
                    422:  * *************************************************************** */
                    423: 
                    424: void expamem_map_fastcard()
                    425: {
                    426:     fastmem_start = ((expamem_hi|(expamem_lo>>4)) << 16);
                    427:     map_banks (&fastmem_bank, fastmem_start >> 16, fastmem_size >> 16);
                    428:     fprintf (stderr,"Fastcard: mapped @$%lx: %dMB fast memory\n",fastmem_start, fastmem_size >>20);
                    429: }
                    430: 
                    431: void expamem_init_fastcard()
                    432: {
                    433:     expamem_init_clear();
                    434:     if (fastmem_size==0x100000)
                    435:        expamem_write (0x00, MEM_1MB+add_memory+generic);
                    436:     else if (fastmem_size==0x200000)
                    437:        expamem_write (0x00, MEM_2MB+add_memory+generic);
                    438:     else if (fastmem_size==0x400000)
                    439:        expamem_write (0x00, MEM_4MB+add_memory+generic);
                    440:     else if (fastmem_size==0x800000)
                    441:        expamem_write (0x00, MEM_8MB+add_memory+generic);
                    442: 
                    443:     expamem_write (0x08, care_addr);
                    444: 
                    445:     expamem_write (0x04, 1);
                    446:     expamem_write (0x10, hackers_id >> 8);
                    447:     expamem_write (0x14, hackers_id & 0x0f);
                    448: 
                    449:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    450:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    451:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    452:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    453: 
                    454:     expamem_write (0x28, 0x00); /* Rom-Offset hi  */
                    455:     expamem_write (0x2c, 0x00); /* ROM-Offset lo  */
                    456: 
                    457:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
                    458: }
                    459: 
                    460: /* 
                    461:  * Filesystem device
                    462:  */
                    463: 
                    464: void expamem_map_filesys()
                    465: {
                    466:     filesys_start=((expamem_hi | (expamem_lo >> 4)) << 16);
                    467:     map_banks(&filesys_bank, filesys_start >> 16, 1);
                    468: }
                    469: 
                    470: void expamem_init_filesys()
                    471: {
                    472:     UBYTE diagarea[] = { 0x90, 0x00, 0x01, 0x0C, 0x01, 0x00, 0x01, 0x06 };
                    473: 
                    474:     expamem_init_clear();
                    475:     expamem_write (0x00, MEM_64KB | rom_card | generic);
                    476: 
                    477:     expamem_write (0x08, care_addr | no_shutup);
                    478: 
                    479:     expamem_write (0x04, 2);
                    480:     expamem_write (0x10, hackers_id >> 8);
                    481:     expamem_write (0x14, hackers_id & 0x0f);
                    482: 
                    483:     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
                    484:     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
                    485:     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
                    486:     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
                    487: 
                    488:     expamem_write (0x28, 0x10); /* Rom-Offset hi  */
                    489:     expamem_write (0x2c, 0x00); /* ROM-Offset lo  */
                    490: 
                    491:     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
                    492: 
                    493:     /* Build a DiagArea */
                    494:     memcpy(expamem + 0x1000, diagarea, sizeof diagarea);
                    495:     
                    496:     /* Call DiagEntry */
                    497:     expamem[0x1100] = 0x4E;
                    498:     expamem[0x1101] = 0xF9; /* JMP */
                    499:     expamem[0x1102] = ROM_filesys_diagentry>>24;
                    500:     expamem[0x1103] = ROM_filesys_diagentry>>16;
                    501:     expamem[0x1104] = ROM_filesys_diagentry>>8;
                    502:     expamem[0x1105] = ROM_filesys_diagentry;
                    503:     
                    504:     /* What comes next is a plain bootblock */
                    505:     expamem[0x1106] = 0x4E;
                    506:     expamem[0x1107] = 0xF9; /* JMP */
                    507:     expamem[0x1108] = EXPANSION_bootcode>>24;
                    508:     expamem[0x1109] = EXPANSION_bootcode>>16;
                    509:     expamem[0x110A] = EXPANSION_bootcode>>8;
                    510:     expamem[0x110B] = EXPANSION_bootcode;
                    511:     memcpy(filesysory, expamem, 0x2000);
                    512: }
                    513: 
                    514: /* *********************************************************
                    515:  *  Dummy Entries to show that there's no card in a slot
                    516:  * ********************************************************* */
                    517: 
                    518: void expamem_map_clear()
                    519: {
                    520:     fprintf(stderr, "expamem_map_clear() got called. Shouldn't happen.\n");
                    521: }
                    522: 
                    523: void expamem_init_clear()
                    524: {
                    525:     memset (expamem,0xff,sizeof expamem);
                    526: }

unix.superglobalmegacorp.com

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