Annotation of uae/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: 
        !            18: /* 00 / 02 */
        !            19: 
        !            20: #define MEM_8MB    0x00        /* Size of Memory Block           */
        !            21: #define MEM_4MB    0x07
        !            22: #define MEM_2MB    0x06
        !            23: #define MEM_1MB    0x05
        !            24: #define MEM_512KB  0x04
        !            25: #define MEM_256KB  0x03
        !            26: #define MEM_128KB  0x02
        !            27: #define MEM_64KB   0x01
        !            28:  
        !            29: #define same_slot  0x08     /* Next card is in the same Slot  */
        !            30: #define rom_card   0x10     /* Card has valid ROM             */
        !            31: #define add_memory 0x20     /* Add Memory to List of Free Ram */
        !            32: 
        !            33: #define generic    0xc0     /* Type of Expansion Card         */
        !            34: #define future1    0x00
        !            35: #define future2    0x40
        !            36: #define future3    0x80
        !            37: 
        !            38: /* ********************************************************** */
        !            39: 
        !            40: /* Card Data - Where can I get a complete List of these ????  */
        !            41: 
        !            42: /* 04 - 06 & 10-16 */
        !            43: #define commodore_g   513  /* Commodore Braunschweig (Germany) */
        !            44: #define commodore     514  /* Commodore West Chester           */
        !            45: #define gvp         2017  /* GVP */
        !            46: 
        !            47: #define   commodore_a2091         3  /* A2091 / A590 Card from C=   */
        !            48: #define   commodore_a2091_ram    10  /* A2091 / A590 Ram on HD-Card */
        !            49: #define   commodore_a2232        70  /* A2232 Multiport Expansion   */
        !            50: 
        !            51: #define   gvp_series_2_scsi      11
        !            52: #define   gvp_iv_24_gfx          32
        !            53: 
        !            54: /* ********************************************************** */
        !            55: /* 08-0A */
        !            56: 
        !            57: #define no_shutup  64  /* Card cannot receive Shut_up_forever */
        !            58: #define care_addr 128  /* Adress HAS to be $200000-$9fffff    */
        !            59: 
        !            60: /* ********************************************************** */
        !            61: 
        !            62: /* 40-42 */
        !            63: #define enable_irq   1  /* enable Interrupt                   */ 
        !            64: #define reset_card   4  /* Reset of Expansion Card            */
        !            65: #define card_int2   16  /* READ ONLY: IRQ 2 occured           */
        !            66: #define card_irq6   32  /* READ ONLY: IRQ 6 occured           */
        !            67: #define card_irq7   64  /* READ ONLY: IRQ 7 occured           */
        !            68: #define does_irq   128  /* READ ONLY: Karte loest ger. IRQ aus*/
        !            69: 
        !            70: /* ********************************************************** */
        !            71: 
        !            72: /* ROM defines */
        !            73: 
        !            74: #define rom_4bit    (0x00<<14) /* ROM width */
        !            75: #define rom_8bit    (0x01<<14)
        !            76: #define rom_16bit   (0x02<<14)
        !            77: 
        !            78: #define rom_never   (0x00<<12) /* Never run Boot Code       */
        !            79: #define rom_install (0x01<<12) /* run code at install time  */
        !            80: #define rom_binddrv (0x02<<12) /* run code with binddrivers */
        !            81: 
        !            82: /* ********************************************************** */
        !            83: 
        !            84: static void expamem_init_clear(void);
        !            85: static void expamem_init_fastcard(void);
        !            86: static void expamem_map_clear(void);
        !            87: static void expamem_map_fastcard(void);
        !            88: 
        !            89: void (*card_init[5])(void) = {
        !            90:  expamem_init_fastcard,
        !            91:  expamem_init_clear,
        !            92:  expamem_init_clear,
        !            93:  expamem_init_clear,
        !            94:  expamem_init_clear
        !            95: };
        !            96: 
        !            97: void (*card_map[5])(void) = {
        !            98:  expamem_map_fastcard,
        !            99:  expamem_map_clear,
        !           100:  expamem_map_clear,
        !           101:  expamem_map_clear,
        !           102:  expamem_map_clear
        !           103: };
        !           104: 
        !           105: int card = 0;
        !           106: 
        !           107: /* **********************************************************
        !           108:  *  Fast Memory
        !           109:  * ********************************************************** */
        !           110: 
        !           111: static ULONG fastmem_start; /* Determined by the OS */
        !           112: static UWORD *fastmemory = NULL;
        !           113: 
        !           114: static ULONG fastmem_lget(CPTR) REGPARAM;
        !           115: static UWORD fastmem_wget(CPTR) REGPARAM;
        !           116: static UBYTE fastmem_bget(CPTR) REGPARAM;
        !           117: static void  fastmem_lput(CPTR, ULONG) REGPARAM;
        !           118: static void  fastmem_wput(CPTR, UWORD) REGPARAM;
        !           119: static void  fastmem_bput(CPTR, UBYTE) REGPARAM;
        !           120: static int   fastmem_check(CPTR addr, ULONG size) REGPARAM;
        !           121: static UWORD *fastmem_xlate(CPTR addr) REGPARAM;
        !           122: 
        !           123: addrbank fastmem_bank = {
        !           124:     fastmem_lget, fastmem_wget, fastmem_bget,
        !           125:     fastmem_lput, fastmem_wput, fastmem_bput,
        !           126:     fastmem_xlate, fastmem_check
        !           127: };
        !           128: 
        !           129: static ULONG fastmem_lget(CPTR addr)
        !           130: {
        !           131:     addr -= fastmem_start & (fastmem_size-1);
        !           132:     addr &= fastmem_size-1;
        !           133:     return ((ULONG)fastmemory[addr >> 1] << 16) | fastmemory[(addr >> 1)+1];
        !           134: }
        !           135: 
        !           136: static UWORD fastmem_wget(CPTR addr)
        !           137: {
        !           138:     addr -= fastmem_start & (fastmem_size-1);
        !           139:     addr &= fastmem_size-1;
        !           140:     return fastmemory[addr >> 1];
        !           141: }
        !           142: 
        !           143: static UBYTE fastmem_bget(CPTR addr)
        !           144: {
        !           145:     UWORD data;
        !           146:     addr -= fastmem_start & (fastmem_size-1);
        !           147: 
        !           148:     addr &= fastmem_size-1;
        !           149:     data = fastmemory[addr >> 1];
        !           150:     return addr & 1 ? data : data >> 8;
        !           151: }
        !           152: 
        !           153: static void fastmem_lput(CPTR addr, ULONG l)
        !           154: {
        !           155:     addr -= fastmem_start & (fastmem_size-1);
        !           156:     addr &= fastmem_size-1;
        !           157:     fastmemory[addr >> 1] = l >> 16;
        !           158:     fastmemory[(addr >> 1)+1] = (UWORD)l;
        !           159: }
        !           160: 
        !           161: static void fastmem_wput(CPTR addr, UWORD w)
        !           162: {
        !           163:     addr -= fastmem_start & (fastmem_size-1);
        !           164:     addr &= fastmem_size-1;
        !           165:     fastmemory[addr >> 1] = w;
        !           166: 
        !           167: }
        !           168: 
        !           169: static void fastmem_bput(CPTR addr, UBYTE b)
        !           170: {
        !           171:     addr -= fastmem_start & (fastmem_size-1);
        !           172:     addr &= fastmem_size-1;
        !           173:     if (!(addr & 1)) {
        !           174:         fastmemory[addr>>1] = (fastmemory[addr>>1] & 0xff) | (((UWORD)b) << 8);
        !           175:     } else {
        !           176:         fastmemory[addr>>1] = (fastmemory[addr>>1] & 0xff00) | b;
        !           177:     }
        !           178: 
        !           179: }
        !           180: 
        !           181: static int fastmem_check(CPTR addr, ULONG size)
        !           182: {
        !           183:     addr -= fastmem_start & (fastmem_size-1);
        !           184:     addr &= fastmem_size-1;
        !           185:     return (addr + size) < fastmem_size;
        !           186: }
        !           187: 
        !           188: static UWORD *fastmem_xlate(CPTR addr)
        !           189: {
        !           190:     addr -= fastmem_start & (fastmem_size-1);
        !           191:     addr &= fastmem_size-1;
        !           192:     return fastmemory + (addr >> 1);
        !           193: }
        !           194: /* ******************************************************* */
        !           195: 
        !           196: /* Autoconfig address space at 0xE80000 */
        !           197: static UWORD expamem[0x8000];
        !           198: 
        !           199: static UBYTE expamem_lo;
        !           200: static UBYTE expamem_hi;
        !           201: 
        !           202: static ULONG expamem_lget(CPTR) REGPARAM;
        !           203: static UWORD expamem_wget(CPTR) REGPARAM;
        !           204: static UBYTE expamem_bget(CPTR) REGPARAM;
        !           205: static void  expamem_lput(CPTR, ULONG) REGPARAM;
        !           206: static void  expamem_wput(CPTR, UWORD) REGPARAM;
        !           207: static void  expamem_bput(CPTR, UBYTE) REGPARAM;
        !           208: 
        !           209: static void  expamem_write(CPTR addr, UBYTE value)
        !           210: {
        !           211:     addr &= 0xffff;
        !           212:     expamem[(addr >> 1)] = (value & 0xf0) << 8;
        !           213:     expamem[(addr >> 1)+1] = (value & 0x0f) << 12;
        !           214: }
        !           215: 
        !           216: addrbank expamem_bank = {
        !           217:     expamem_lget, expamem_wget, expamem_bget,
        !           218:     expamem_lput, expamem_wput, expamem_bput,
        !           219:     default_xlate, default_check
        !           220: };
        !           221: 
        !           222: static ULONG expamem_lget(CPTR addr)
        !           223: {
        !           224:     fprintf(stderr,"warning: READ.L from address $%lx \n",addr);
        !           225:     return 0xffffffff;
        !           226: }
        !           227: 
        !           228: static UWORD expamem_wget(CPTR addr)
        !           229: {
        !           230:     fprintf(stderr,"warning: READ.W from address $%lx \n",addr);
        !           231:     return 0xffff;
        !           232: }
        !           233: 
        !           234: static UBYTE expamem_bget(CPTR addr)
        !           235: {
        !           236:     UBYTE value;
        !           237:     addr &= 0xFFFF;
        !           238:     value = (expamem[addr >> 1] >> (addr & 1 ? 0 : 8));
        !           239:     if (addr==00 || addr==02 || addr==0x40 || addr==0x42)
        !           240:        return value;
        !           241:     return ~value;
        !           242: }
        !           243: 
        !           244: static void expamem_lput(CPTR addr, ULONG value)
        !           245: {
        !           246:   fprintf(stderr,"warning: WRITE.L to address $%lx : value $%lx\n",addr,value);
        !           247: }
        !           248: 
        !           249: static void expamem_wput(CPTR addr, UWORD value)
        !           250: {
        !           251:   fprintf(stderr,"warning: WRITE.W to address $%lx : value $%x\n",addr,value);
        !           252: }
        !           253: 
        !           254: static void expamem_bput(CPTR addr, UBYTE value)
        !           255: {
        !           256:     switch (addr&0xff) {
        !           257:      case 0x30:
        !           258:      case 0x32:
        !           259:        expamem_hi = 0;
        !           260:        expamem_lo = 0;
        !           261:        expamem_write (0x48, 0x00);
        !           262:        break;
        !           263: 
        !           264:      case 0x48:    
        !           265:        expamem_hi = value;
        !           266:         (*card_map[card])();
        !           267:         fprintf (stderr,"   Card %d done.\n",card+1);
        !           268:         ++card;
        !           269:         if (card<=5) (*card_init[card])();
        !           270:            else      expamem_init_clear();
        !           271:                break;
        !           272:     
        !           273:      case 0x4a:        
        !           274:        expamem_lo = value;
        !           275:        break;
        !           276:        
        !           277:      case 0x4c:
        !           278:         fprintf (stderr,"   Card %d had no success.\n",card+1);
        !           279:         ++card;
        !           280:         if (card<=5) (*card_init[card])();
        !           281:            else      expamem_init_clear();
        !           282:         break;
        !           283:     }
        !           284: }
        !           285: 
        !           286: void expamem_reset()
        !           287: {
        !           288:     card = 0;
        !           289:     (*card_init[card])();
        !           290: }
        !           291: 
        !           292: /* ***************************************************************
        !           293:  *     Expansion Card (ZORRO II) for 1/2/4/8 MB of Fast Memory
        !           294:  * *************************************************************** */
        !           295: 
        !           296: void expamem_map_fastcard()
        !           297: {
        !           298:   if (fastmemory == NULL)
        !           299:       fastmemory = (UWORD *)malloc(fastmem_size);
        !           300:   fastmem_start=((expamem_hi|(expamem_lo>>4))<<16);
        !           301:   map_banks(fastmem_bank,fastmem_start>>16,fastmem_size>>16);
        !           302:   fprintf (stderr,"Fastcard: mapped @$%lx: %dMB fast memory\n",fastmem_start, fastmem_size >>20);
        !           303: }
        !           304: 
        !           305: void expamem_init_fastcard()
        !           306: {
        !           307:   if (fastmem_size == 0) {
        !           308:      ++card;
        !           309:      if (card<=5) (*card_init[card])();
        !           310:         else      expamem_init_clear();
        !           311:      return;
        !           312:   }
        !           313:   expamem_init_clear();
        !           314:   if (fastmem_size==0x100000)
        !           315:     expamem_write (0x00, MEM_1MB+add_memory+generic);
        !           316:   else if (fastmem_size==0x200000)
        !           317:     expamem_write (0x00, MEM_2MB+add_memory+generic);
        !           318:   else if (fastmem_size==0x400000)
        !           319:     expamem_write (0x00, MEM_4MB+add_memory+generic);
        !           320:   else if (fastmem_size==0x800000)
        !           321:     expamem_write (0x00, MEM_8MB+add_memory+generic);
        !           322: 
        !           323:   expamem_write (0x08, care_addr);
        !           324: 
        !           325:   expamem_write (0x04, commodore_a2091_ram);
        !           326:   expamem_write (0x10, commodore>>8);
        !           327:   expamem_write (0x14, commodore & 0x0f);
        !           328: 
        !           329:   expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
        !           330:   expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
        !           331:   expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
        !           332:   expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
        !           333: 
        !           334:   expamem_write (0x28, 0x00); /* Rom-Offset hi  */
        !           335:   expamem_write (0x2c, 0x00); /* ROM-Offset lo  */
        !           336: 
        !           337:   expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
        !           338: }
        !           339: 
        !           340: /* *********************************************************
        !           341:  *  Dummy Entries to show that there's no card in a slot
        !           342:  * ********************************************************* */
        !           343: 
        !           344: void expamem_map_clear()
        !           345: {
        !           346:   /* nothing to do here */
        !           347: }
        !           348: 
        !           349: void expamem_init_clear()
        !           350: {
        !           351:   memset (expamem,0,sizeof expamem);
        !           352: }

unix.superglobalmegacorp.com

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