Annotation of uae/src/memory.c, revision 1.1

1.1     ! root        1:  /*
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   *
        !             4:   * Memory management
        !             5:   *
        !             6:   * (c) 1995 Bernd Schmidt
        !             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 "cia.h"
        !            17: #include "ersatz.h"
        !            18: #include "zfile.h"
        !            19: #include "events.h"
        !            20: #include "newcpu.h"
        !            21: #include "compiler.h"
        !            22: 
        !            23: #ifdef USE_COMPILER
        !            24: #include <sys/mman.h>
        !            25: #endif
        !            26: 
        !            27: int ersatzkickfile = 0;
        !            28: 
        !            29: int buserr;
        !            30: addrbank membanks[65536];
        !            31: 
        !            32: /* Default memory access functions */
        !            33: 
        !            34: int default_check(CPTR a, ULONG b)
        !            35: {
        !            36:     return 0;
        !            37: }
        !            38: 
        !            39: UBYTE *default_xlate(CPTR a)
        !            40: {
        !            41:     fprintf(stderr, "Your Amiga program just did something terribly stupid\n");
        !            42:     return 0;
        !            43: }
        !            44: 
        !            45: UWORD default_awget(CPTR addr)
        !            46: {
        !            47:     default_xlate(addr);
        !            48:     return 0;
        !            49: }
        !            50: 
        !            51: ULONG default_alget(CPTR addr)
        !            52: {
        !            53:     default_xlate(addr);
        !            54:     return 0;
        !            55: }
        !            56: 
        !            57: /* A dummy bank that only contains zeros */
        !            58: 
        !            59: static ULONG dummy_lget(CPTR) REGPARAM;
        !            60: static UWORD dummy_wget(CPTR) REGPARAM;
        !            61: static UBYTE dummy_bget(CPTR) REGPARAM;
        !            62: static void  dummy_lput(CPTR, ULONG) REGPARAM;
        !            63: static void  dummy_wput(CPTR, UWORD) REGPARAM;
        !            64: static void  dummy_bput(CPTR, UBYTE) REGPARAM;
        !            65: static int   dummy_check(CPTR addr, ULONG size) REGPARAM;
        !            66: 
        !            67: ULONG dummy_lget(CPTR addr)
        !            68: {
        !            69:     if (illegal_mem) printf("Illegal lget at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            70:     return 0;
        !            71: }
        !            72: 
        !            73: UWORD dummy_wget(CPTR addr)
        !            74: {
        !            75:     if (illegal_mem) printf("Illegal wget at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            76:     return 0;
        !            77: }
        !            78: 
        !            79: UBYTE dummy_bget(CPTR addr)
        !            80: {
        !            81:     if (illegal_mem) printf("Illegal bget at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            82:     return 0;
        !            83: }
        !            84: 
        !            85: void dummy_lput(CPTR addr, ULONG l)
        !            86: {
        !            87:     if (illegal_mem) printf("Illegal lput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            88: }
        !            89: void dummy_wput(CPTR addr, UWORD w)
        !            90: {
        !            91:     if (illegal_mem) printf("Illegal wput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            92: }
        !            93: void dummy_bput(CPTR addr, UBYTE b)
        !            94: {
        !            95:     if (illegal_mem) printf("Illegal bput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !            96: }
        !            97: 
        !            98: int dummy_check(CPTR addr, ULONG size)
        !            99: {
        !           100:     if (illegal_mem) printf("Illegal check at %08lx pc=%08lx\n",addr,m68k_getpc());
        !           101:     return 0;
        !           102: }
        !           103: 
        !           104: /* Chip memory */
        !           105: 
        !           106: ULONG chipmem_mask,kickmem_mask,bogomem_mask;
        !           107: 
        !           108: UBYTE *chipmemory;
        !           109: 
        !           110: static ULONG chipmem_alget(CPTR) REGPARAM;
        !           111: static UWORD chipmem_awget(CPTR) REGPARAM;
        !           112: 
        !           113: static ULONG chipmem_lget(CPTR) REGPARAM;
        !           114: static UWORD chipmem_wget(CPTR) REGPARAM;
        !           115: static UBYTE chipmem_bget(CPTR) REGPARAM;
        !           116: static void  chipmem_lput(CPTR, ULONG) REGPARAM;
        !           117: static void  chipmem_wput(CPTR, UWORD) REGPARAM;
        !           118: static void  chipmem_bput(CPTR, UBYTE) REGPARAM;
        !           119: 
        !           120: static int   chipmem_check(CPTR addr, ULONG size) REGPARAM;
        !           121: static UBYTE *chipmem_xlate(CPTR addr) REGPARAM;
        !           122: 
        !           123: ULONG chipmem_alget(CPTR addr)
        !           124: {
        !           125:     UBYTE *m;
        !           126:     addr -= chipmem_start & chipmem_mask;
        !           127:     addr &= chipmem_size-1;
        !           128:     m = chipmemory + addr;
        !           129:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           130:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           131: }
        !           132: 
        !           133: UWORD chipmem_awget(CPTR addr)
        !           134: {
        !           135:     UBYTE *m;
        !           136:     addr -= chipmem_start & chipmem_mask;
        !           137:     addr &= chipmem_size-1;
        !           138:     m = chipmemory + addr;
        !           139:     return ((UWORD)m[0] << 8) + m[1];
        !           140: }
        !           141: 
        !           142: ULONG chipmem_lget(CPTR addr)
        !           143: {
        !           144:     UBYTE *m;
        !           145:     addr -= chipmem_start & chipmem_mask;
        !           146:     addr &= chipmem_size-1;
        !           147:     m = chipmemory + addr;
        !           148:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           149:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           150: }
        !           151: 
        !           152: UWORD chipmem_wget(CPTR addr)
        !           153: {
        !           154:     UBYTE *m;
        !           155:     addr -= chipmem_start & chipmem_mask;
        !           156:     addr &= chipmem_size-1;
        !           157:     m = chipmemory + addr;
        !           158:     return ((UWORD)m[0] << 8) + m[1];
        !           159: }
        !           160: 
        !           161: UBYTE chipmem_bget(CPTR addr)
        !           162: {
        !           163:     addr -= chipmem_start & chipmem_mask;
        !           164:     addr &= chipmem_size-1;
        !           165:     return chipmemory[addr];
        !           166: }
        !           167: 
        !           168: void chipmem_lput(CPTR addr, ULONG l)
        !           169: {
        !           170:     UBYTE *m;
        !           171:     addr -= chipmem_start & chipmem_mask;
        !           172:     addr &= chipmem_size-1;
        !           173:     m = chipmemory + addr;
        !           174:     m[0] = l >> 24;
        !           175:     m[1] = l >> 16;
        !           176:     m[2] = l >> 8;
        !           177:     m[3] = l;
        !           178: }
        !           179: 
        !           180: void chipmem_wput(CPTR addr, UWORD w)
        !           181: {
        !           182:     UBYTE *m;
        !           183:     addr -= chipmem_start & chipmem_mask;
        !           184:     addr &= chipmem_size-1;
        !           185:     m = chipmemory + addr;
        !           186:     m[0] = w >> 8;
        !           187:     m[1] = w;
        !           188: }
        !           189: 
        !           190: void chipmem_bput(CPTR addr, UBYTE b)
        !           191: {
        !           192:     addr -= chipmem_start & chipmem_mask;
        !           193:     addr &= chipmem_size-1;
        !           194:     chipmemory[addr] = b;
        !           195: }
        !           196: 
        !           197: int chipmem_check(CPTR addr, ULONG size)
        !           198: {
        !           199:     addr -= chipmem_start & chipmem_mask;
        !           200:     addr &= chipmem_size-1;
        !           201:     return (addr + size) < chipmem_size;
        !           202: }
        !           203: 
        !           204: UBYTE *chipmem_xlate(CPTR addr)
        !           205: {
        !           206:     addr -= chipmem_start & chipmem_mask;
        !           207:     addr &= chipmem_size-1;
        !           208:     return chipmemory + addr;
        !           209: }
        !           210: 
        !           211: /* Slow memory */
        !           212: 
        !           213: static UBYTE *bogomemory;
        !           214: 
        !           215: static ULONG bogomem_alget(CPTR) REGPARAM;
        !           216: static UWORD bogomem_awget(CPTR) REGPARAM;
        !           217: static ULONG bogomem_lget(CPTR) REGPARAM;
        !           218: static UWORD bogomem_wget(CPTR) REGPARAM;
        !           219: static UBYTE bogomem_bget(CPTR) REGPARAM;
        !           220: static void  bogomem_lput(CPTR, ULONG) REGPARAM;
        !           221: static void  bogomem_wput(CPTR, UWORD) REGPARAM;
        !           222: static void  bogomem_bput(CPTR, UBYTE) REGPARAM;
        !           223: static int  bogomem_check(CPTR addr, ULONG size) REGPARAM;
        !           224: static UBYTE *bogomem_xlate(CPTR addr) REGPARAM;
        !           225: 
        !           226: ULONG bogomem_alget(CPTR addr)
        !           227: {
        !           228:     UBYTE *m;
        !           229:     addr -= bogomem_start & bogomem_mask;
        !           230:     addr &= bogomem_size-1;
        !           231:     m = bogomemory + addr;
        !           232:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           233:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           234: }
        !           235: 
        !           236: UWORD bogomem_awget(CPTR addr)
        !           237: {
        !           238:     UBYTE *m;
        !           239:     addr -= bogomem_start & bogomem_mask;
        !           240:     addr &= bogomem_size-1;
        !           241:     m = bogomemory + addr;
        !           242:     return ((UWORD)m[0] << 8) + m[1];
        !           243: }
        !           244: 
        !           245: ULONG bogomem_lget(CPTR addr)
        !           246: {
        !           247:     UBYTE *m;
        !           248:     addr -= bogomem_start & bogomem_mask;
        !           249:     addr &= bogomem_size-1;
        !           250:     m = bogomemory + addr;
        !           251:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           252:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           253: }
        !           254: 
        !           255: UWORD bogomem_wget(CPTR addr)
        !           256: {
        !           257:     UBYTE *m;
        !           258:     addr -= bogomem_start & bogomem_mask;
        !           259:     addr &= bogomem_size-1;
        !           260:     m = bogomemory + addr;
        !           261:     return ((UWORD)m[0] << 8) + m[1];
        !           262: }
        !           263: 
        !           264: UBYTE bogomem_bget(CPTR addr)
        !           265: {
        !           266:     addr -= bogomem_start & bogomem_mask;
        !           267:     addr &= bogomem_size-1;
        !           268:     return bogomemory[addr];
        !           269: }
        !           270: 
        !           271: void bogomem_lput(CPTR addr, ULONG l)
        !           272: {
        !           273:     UBYTE *m;
        !           274:     addr -= bogomem_start & bogomem_mask;
        !           275:     addr &= bogomem_size-1;
        !           276:     m = bogomemory + addr;
        !           277:     m[0] = l >> 24;
        !           278:     m[1] = l >> 16;
        !           279:     m[2] = l >> 8;
        !           280:     m[3] = l;
        !           281: }
        !           282: 
        !           283: void bogomem_wput(CPTR addr, UWORD w)
        !           284: {
        !           285:     UBYTE *m;
        !           286:     addr -= bogomem_start & bogomem_mask;
        !           287:     addr &= bogomem_size-1;
        !           288:     m = bogomemory + addr;
        !           289:     m[0] = w >> 8;
        !           290:     m[1] = w;
        !           291: }
        !           292: 
        !           293: void bogomem_bput(CPTR addr, UBYTE b)
        !           294: {
        !           295:     addr -= bogomem_start & bogomem_mask;
        !           296:     addr &= bogomem_size-1;
        !           297:     bogomemory[addr] = b;
        !           298: }
        !           299: 
        !           300: int bogomem_check(CPTR addr, ULONG size)
        !           301: {
        !           302:     addr -= bogomem_start & (bogomem_size-1);
        !           303:     addr &= bogomem_size-1;
        !           304:     return (addr + size) < bogomem_size;
        !           305: }
        !           306: 
        !           307: UBYTE *bogomem_xlate(CPTR addr)
        !           308: {
        !           309:     addr -= bogomem_start & (bogomem_size-1);
        !           310:     addr &= bogomem_size-1;
        !           311:     return bogomemory + addr;
        !           312: }
        !           313: 
        !           314: /* Kick memory */
        !           315: 
        !           316: static int zkickfile = 0;
        !           317: UBYTE *kickmemory;
        !           318: 
        !           319: static ULONG kickmem_alget(CPTR) REGPARAM;
        !           320: static UWORD kickmem_awget(CPTR) REGPARAM;
        !           321: static ULONG kickmem_lget(CPTR) REGPARAM;
        !           322: static UWORD kickmem_wget(CPTR) REGPARAM;
        !           323: static UBYTE kickmem_bget(CPTR) REGPARAM;
        !           324: static void  kickmem_lput(CPTR, ULONG) REGPARAM;
        !           325: static void  kickmem_wput(CPTR, UWORD) REGPARAM;
        !           326: static void  kickmem_bput(CPTR, UBYTE) REGPARAM;
        !           327: static int  kickmem_check(CPTR addr, ULONG size) REGPARAM;
        !           328: static UBYTE *kickmem_xlate(CPTR addr) REGPARAM;
        !           329: 
        !           330: ULONG kickmem_alget(CPTR addr)
        !           331: {
        !           332:     UBYTE *m;
        !           333:     addr -= kickmem_start & kickmem_mask;
        !           334:     addr &= kickmem_size-1;
        !           335:     m = kickmemory + addr;
        !           336:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           337:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           338: }
        !           339: 
        !           340: UWORD kickmem_awget(CPTR addr)
        !           341: {
        !           342:     UBYTE *m;
        !           343:     addr -= kickmem_start & kickmem_mask;
        !           344:     addr &= kickmem_size-1;
        !           345:     m = kickmemory + addr;
        !           346:     return ((UWORD)m[0] << 8) + m[1];
        !           347: }
        !           348: 
        !           349: ULONG kickmem_lget(CPTR addr)
        !           350: {
        !           351:     UBYTE *m;
        !           352:     addr -= kickmem_start & kickmem_mask;
        !           353:     addr &= kickmem_size-1;
        !           354:     m = kickmemory + addr;
        !           355:     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
        !           356:            + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
        !           357: }
        !           358: 
        !           359: UWORD kickmem_wget(CPTR addr)
        !           360: {
        !           361:     UBYTE *m;
        !           362:     addr -= kickmem_start & kickmem_mask;
        !           363:     addr &= kickmem_size-1;
        !           364:     m = kickmemory + addr;
        !           365:     return ((UWORD)m[0] << 8) + m[1];
        !           366: }
        !           367: 
        !           368: UBYTE kickmem_bget(CPTR addr)
        !           369: {
        !           370:     addr -= kickmem_start & kickmem_mask;
        !           371:     addr &= kickmem_size-1;
        !           372:     return kickmemory[addr];
        !           373: }
        !           374: 
        !           375: void kickmem_lput(CPTR addr, ULONG b)
        !           376: {
        !           377:     if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !           378: }
        !           379: 
        !           380: void kickmem_wput(CPTR addr, UWORD b)
        !           381: {
        !           382:     if (illegal_mem) printf("Illegal kickmem wput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !           383: }
        !           384: 
        !           385: void kickmem_bput(CPTR addr, UBYTE b)
        !           386: {
        !           387:     if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc());
        !           388: }
        !           389: 
        !           390: int kickmem_check(CPTR addr, ULONG size)
        !           391: {
        !           392:     addr -= kickmem_start & (kickmem_size-1);
        !           393:     addr &= kickmem_size-1;
        !           394:     return (addr + size) < kickmem_size;
        !           395: }
        !           396: 
        !           397: UBYTE *kickmem_xlate(CPTR addr)
        !           398: {
        !           399:     addr -= kickmem_start & (kickmem_size-1);
        !           400:     addr &= kickmem_size-1;
        !           401:     return kickmemory + addr;
        !           402: }
        !           403: 
        !           404: static int load_kickstart(void)
        !           405: {
        !           406:     int i;
        !           407:     ULONG cksum = 0, prevck = 0;
        !           408:     unsigned char buffer[8];
        !           409:     
        !           410:     FILE *f = zfile_open(romfile, "rb");
        !           411:     
        !           412:     if (f == NULL) {   
        !           413:        fprintf(stderr, "No Kickstart ROM found.\n");
        !           414:        return 0;
        !           415:     }
        !           416:     
        !           417:     fread(buffer, 1, 8, f);
        !           418:     if (buffer[4] == 0 && buffer[5] == 8 && buffer[6] == 0 && buffer[7] == 0) {
        !           419:        fprintf(stderr, "You seem to have a ZKick file there... You probably lose.\n");
        !           420:        zkickfile = 1;
        !           421:     } else 
        !           422:        fseek(f, 0, SEEK_SET);
        !           423:     
        !           424:     i = fread(kickmemory, 1, kickmem_size, f);
        !           425:     if (i == kickmem_size/2) {
        !           426:        fprintf(stderr, "Warning: Kickstart is only 256K.\n");
        !           427:        memcpy (kickmemory + kickmem_size/2, kickmemory, kickmem_size/2);
        !           428:     } else if (i != kickmem_size) {
        !           429:        fprintf(stderr, "Error while reading Kickstart.\n");
        !           430:        return 0;
        !           431:     }
        !           432:     zfile_close (f);
        !           433:     
        !           434:     for (i = 0; i < kickmem_size; i+=4) {
        !           435:        ULONG data = kickmemory[i]*65536*256 + kickmemory[i+1]*65536 + kickmemory[i+2]*256 + kickmemory[i+3];
        !           436:        cksum += data;
        !           437:        if (cksum < prevck)
        !           438:            cksum++;
        !           439:        prevck = cksum;
        !           440:     }
        !           441:     if (cksum != 0xFFFFFFFF) {
        !           442:        fprintf(stderr, "Warning: Kickstart checksum incorrect. You probably have a corrupted ROM image.\n");
        !           443:     }
        !           444:     return 1;
        !           445: }
        !           446: 
        !           447: /* Address banks */
        !           448: 
        !           449: addrbank dummy_bank = {
        !           450:     default_alget, default_awget,
        !           451:     dummy_lget, dummy_wget, dummy_bget,
        !           452:     dummy_lput, dummy_wput, dummy_bput,
        !           453:     default_xlate, dummy_check
        !           454: };
        !           455: 
        !           456: addrbank chipmem_bank = {
        !           457:     chipmem_alget, chipmem_awget,
        !           458:     chipmem_lget, chipmem_wget, chipmem_bget,
        !           459:     chipmem_lput, chipmem_wput, chipmem_bput,
        !           460:     chipmem_xlate, chipmem_check
        !           461: };
        !           462: 
        !           463: addrbank bogomem_bank = {
        !           464:     bogomem_alget, bogomem_awget,
        !           465:     bogomem_lget, bogomem_wget, bogomem_bget,
        !           466:     bogomem_lput, bogomem_wput, bogomem_bput,
        !           467:     bogomem_xlate, bogomem_check
        !           468: };
        !           469: 
        !           470: addrbank kickmem_bank = {
        !           471:     kickmem_alget, kickmem_awget,
        !           472:     kickmem_lget, kickmem_wget, kickmem_bget,
        !           473:     kickmem_lput, kickmem_wput, kickmem_bput,
        !           474:     kickmem_xlate, kickmem_check
        !           475: };
        !           476: 
        !           477: char *address_space, *good_address_map;
        !           478: int good_address_fd;
        !           479: 
        !           480: void memory_init(void)
        !           481: {
        !           482:     char buffer[4096];
        !           483:     char *nam;
        !           484:     int i, fd;
        !           485:     buserr = 0;
        !           486: 
        !           487:     chipmem_mask = chipmem_size - 1;
        !           488:     kickmem_mask = kickmem_size - 1;
        !           489:     bogomem_mask = bogomem_size - 1;
        !           490:     
        !           491: #ifdef USE_COMPILER
        !           492:     fd = open("/dev/zero", O_RDWR);
        !           493:     good_address_map = mmap(NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
        !           494:     address_space = mmap(NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
        !           495:     chipmemory = mmap(address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0);
        !           496:     kickmemory = mmap(address_space + 0xF80000, 0x80000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0);
        !           497: 
        !           498:     close(fd);
        !           499: 
        !           500:     good_address_fd = open(nam = tmpnam(NULL), O_CREAT|O_RDWR, 0600);
        !           501:     memset(buffer,1,sizeof(buffer));
        !           502:     write(good_address_fd, buffer,sizeof(buffer));
        !           503:     unlink(nam);
        !           504: 
        !           505:     for (i = 0; i < chipmem_size; i += 4096)
        !           506:        mmap(good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE,
        !           507:             good_address_fd, 0);
        !           508:     for (i = 0; i < kickmem_size; i += 4096)
        !           509:        mmap(good_address_map + i + 0x1000000 - kickmem_size, 4096, PROT_READ,
        !           510:             MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
        !           511: #else
        !           512:     chipmemory = (UBYTE *)malloc(chipmem_size);
        !           513:     kickmemory = (UBYTE *)malloc(kickmem_size);
        !           514: #endif
        !           515: 
        !           516:     for(i = 0; i < 65536; i++)
        !           517:        membanks[i] = dummy_bank;
        !           518:     
        !           519:     /* Map the chipmem into all of the lower 16MB */
        !           520:     map_banks(&chipmem_bank, 0x00, 256);
        !           521:     map_banks(&custom_bank, 0xC0, 0x20);
        !           522:     map_banks(&cia_bank, 0xA0, 32);
        !           523:     map_banks(&clock_bank, 0xDC, 1);
        !           524:     
        !           525:     if (bogomem_size > 0) {
        !           526:        bogomemory = (UBYTE *)malloc(bogomem_size);
        !           527:        map_banks(&bogomem_bank, 0xC0, bogomem_size >> 16);
        !           528:     }
        !           529: 
        !           530:     map_banks(&rtarea_bank, 0xF0, 1); 
        !           531:     if (!load_kickstart()) {
        !           532:        init_ersatz_rom(kickmemory);
        !           533:        ersatzkickfile = 1;
        !           534:     }
        !           535:     if (zkickfile)
        !           536:        map_banks(&kickmem_bank, 0x20, 8);
        !           537:     
        !           538:     map_banks(&kickmem_bank, 0xF8, 8);
        !           539:     if (!zkickfile)
        !           540:        map_banks(&expamem_bank, 0xE8, 1);
        !           541: }
        !           542: 
        !           543: void map_banks(addrbank *bank, int start, int size)
        !           544: {
        !           545:     int bnr;
        !           546:     int hioffs = 0;
        !           547: #if 0 && CPU_LEVEL < 2
        !           548:     for (hioffs = 0; hioffs < 256; hioffs++)
        !           549: #endif
        !           550:        for (bnr = start; bnr < start+size; bnr++) 
        !           551:            membanks[bnr + hioffs * 256] = *bank;
        !           552: }

unix.superglobalmegacorp.com

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