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

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

unix.superglobalmegacorp.com

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