Annotation of uae/src/expansion.c, revision 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.