Annotation of uae/memory.c, revision 1.1.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 <stdio.h>
                     10: #include <string.h>
                     11: 
                     12: #include "config.h"
                     13: #include "amiga.h"
                     14: #include "options.h"
                     15: #include "memory.h"
                     16: #include "custom.h"
                     17: #include "cia.h"
                     18: #include "ersatz.h"
                     19: 
                     20: bool buserr;
                     21: 
                     22: const char romfile[] = "kick.rom"; 
                     23: 
                     24: lget_func do_lget[256];
                     25: wget_func do_wget[256];
                     26: bget_func do_bget[256];
                     27: lput_func do_lput[256];
                     28: wput_func do_wput[256];
                     29: bput_func do_bput[256];
                     30: xlate_func do_xlateaddr[256];
                     31: check_func do_check[256];
                     32: 
                     33: /* Default memory access functions */
                     34: 
                     35: bool default_check(CPTR a, ULONG b)
                     36: {
                     37:     return false;
                     38: }
                     39: 
                     40: UWORD *default_xlate(CPTR a)
                     41: {
                     42:     fprintf(stderr, "Your Amiga program just did something terribly stupid\n");
                     43:     return 0;
                     44: }
                     45: 
                     46: /* Chip memory */
                     47: 
                     48: static UWORD chipmemory[chipmem_size/2];
                     49: 
                     50: static ULONG chipmem_lget(CPTR) REGPARAM;
                     51: static UWORD chipmem_wget(CPTR) REGPARAM;
                     52: static UBYTE chipmem_bget(CPTR) REGPARAM;
                     53: static void  chipmem_lput(CPTR, ULONG) REGPARAM;
                     54: static void  chipmem_wput(CPTR, UWORD) REGPARAM;
                     55: static void  chipmem_bput(CPTR, UBYTE) REGPARAM;
                     56: static bool  chipmem_check(CPTR addr, ULONG size) REGPARAM;
                     57: static UWORD *chipmem_xlate(CPTR addr) REGPARAM;
                     58: 
                     59: ULONG chipmem_lget(CPTR addr)
                     60: {
                     61:     addr -= chipmem_start & (chipmem_size-1);
                     62:     addr &= chipmem_size-1;
                     63:     return ((ULONG)chipmemory[addr >> 1] << 16) | chipmemory[(addr >> 1)+1];
                     64: }
                     65: 
                     66: UWORD chipmem_wget(CPTR addr)
                     67: {
                     68:     addr -= chipmem_start & (chipmem_size-1);
                     69:     addr &= chipmem_size-1;
                     70:     return chipmemory[addr >> 1];
                     71: }
                     72: 
                     73: UBYTE chipmem_bget(CPTR addr)
                     74: {
                     75:     addr -= chipmem_start & (chipmem_size-1);
                     76:     addr &= chipmem_size-1;
                     77:     return chipmemory[addr >> 1] >> (addr & 1 ? 0 : 8);
                     78: }
                     79: 
                     80: void chipmem_lput(CPTR addr, ULONG l)
                     81: {
                     82:     addr -= chipmem_start & (chipmem_size-1);
                     83:     addr &= chipmem_size-1;
                     84:     chipmemory[addr >> 1] = l >> 16;
                     85:     chipmemory[(addr >> 1)+1] = (UWORD)l;
                     86: }
                     87: 
                     88: void chipmem_wput(CPTR addr, UWORD w)
                     89: {
                     90:     addr -= chipmem_start & (chipmem_size-1);
                     91:     addr &= chipmem_size-1;
                     92:     chipmemory[addr >> 1] = w;
                     93: }
                     94: 
                     95: void chipmem_bput(CPTR addr, UBYTE b)
                     96: {
                     97:     addr -= chipmem_start & (chipmem_size-1);
                     98:     addr &= chipmem_size-1;
                     99:     if (!(addr & 1)) {
                    100:        chipmemory[addr>>1] = (chipmemory[addr>>1] & 0xff) | (((UWORD)b) << 8);
                    101:     } else {
                    102:        chipmemory[addr>>1] = (chipmemory[addr>>1] & 0xff00) | b;
                    103:     }
                    104: }
                    105: 
                    106: bool chipmem_check(CPTR addr, ULONG size)
                    107: {
                    108:     addr -= chipmem_start & (chipmem_size-1);
                    109:     addr &= chipmem_size-1;
                    110:     return (addr + size) < chipmem_size;
                    111: }
                    112: 
                    113: UWORD *chipmem_xlate(CPTR addr)
                    114: {
                    115:     addr -= chipmem_start & (chipmem_size-1);
                    116:     addr &= chipmem_size-1;
                    117:     return chipmemory + (addr >> 1);
                    118: }
                    119: 
                    120: /* Slow memory */
                    121: 
                    122: static UWORD bogomemory[bogomem_size/2];
                    123: 
                    124: static ULONG bogomem_lget(CPTR) REGPARAM;
                    125: static UWORD bogomem_wget(CPTR) REGPARAM;
                    126: static UBYTE bogomem_bget(CPTR) REGPARAM;
                    127: static void  bogomem_lput(CPTR, ULONG) REGPARAM;
                    128: static void  bogomem_wput(CPTR, UWORD) REGPARAM;
                    129: static void  bogomem_bput(CPTR, UBYTE) REGPARAM;
                    130: static bool  bogomem_check(CPTR addr, ULONG size) REGPARAM;
                    131: static UWORD *bogomem_xlate(CPTR addr) REGPARAM;
                    132: 
                    133: ULONG bogomem_lget(CPTR addr)
                    134: {
                    135:     addr -= bogomem_start & (bogomem_size-1);
                    136:     addr &= bogomem_size-1;
                    137:     return ((ULONG)bogomemory[addr >> 1] << 16) | bogomemory[(addr >> 1)+1];
                    138: }
                    139: 
                    140: UWORD bogomem_wget(CPTR addr)
                    141: {
                    142:     addr -= bogomem_start & (bogomem_size-1);
                    143:     addr &= bogomem_size-1;
                    144:     return bogomemory[addr >> 1];
                    145: }
                    146: 
                    147: UBYTE bogomem_bget(CPTR addr)
                    148: {
                    149:     addr -= bogomem_start & (bogomem_size-1);
                    150:     addr &= bogomem_size-1;
                    151:     return bogomemory[addr >> 1] >> (addr & 1 ? 0 : 8);
                    152: }
                    153: 
                    154: void bogomem_lput(CPTR addr, ULONG l)
                    155: {
                    156:     addr -= bogomem_start & (bogomem_size-1);
                    157:     addr &= bogomem_size-1;
                    158:     bogomemory[addr >> 1] = l >> 16;
                    159:     bogomemory[(addr >> 1)+1] = (UWORD)l;
                    160: }
                    161: 
                    162: void bogomem_wput(CPTR addr, UWORD w)
                    163: {
                    164:     addr -= bogomem_start & (bogomem_size-1);
                    165:     addr &= bogomem_size-1;
                    166:     bogomemory[addr >> 1] = w;
                    167: }
                    168: 
                    169: void bogomem_bput(CPTR addr, UBYTE b)
                    170: {
                    171:     addr -= bogomem_start & (bogomem_size-1);
                    172:     addr &= bogomem_size-1;
                    173:     if (!(addr & 1)) {
                    174:        bogomemory[addr>>1] = (bogomemory[addr>>1] & 0xff) | (((UWORD)b) << 8);
                    175:     } else {
                    176:        bogomemory[addr>>1] = (bogomemory[addr>>1] & 0xff00) | b;
                    177:     }
                    178: }
                    179: 
                    180: bool bogomem_check(CPTR addr, ULONG size)
                    181: {
                    182:     addr -= bogomem_start & (bogomem_size-1);
                    183:     addr &= bogomem_size-1;
                    184:     return (addr + size) < bogomem_size;
                    185: }
                    186: 
                    187: UWORD *bogomem_xlate(CPTR addr)
                    188: {
                    189:     addr -= bogomem_start & (bogomem_size-1);
                    190:     addr &= bogomem_size-1;
                    191:     return bogomemory + (addr >> 1);
                    192: }
                    193: 
                    194: /* Kick memory */
                    195: 
                    196: static UWORD kickmemory[kickmem_size/2];
                    197: 
                    198: static ULONG kickmem_lget(CPTR) REGPARAM;
                    199: static UWORD kickmem_wget(CPTR) REGPARAM;
                    200: static UBYTE kickmem_bget(CPTR) REGPARAM;
                    201: static void  kickmem_lput(CPTR, ULONG) REGPARAM;
                    202: static void  kickmem_wput(CPTR, UWORD) REGPARAM;
                    203: static void  kickmem_bput(CPTR, UBYTE) REGPARAM;
                    204: static bool  kickmem_check(CPTR addr, ULONG size) REGPARAM;
                    205: static UWORD *kickmem_xlate(CPTR addr) REGPARAM;
                    206: 
                    207: ULONG kickmem_lget(CPTR addr)
                    208: {
                    209:     addr -= kickmem_start & (kickmem_size-1);
                    210:     addr &= kickmem_size-1;
                    211:     return ((ULONG)kickmemory[addr >> 1] << 16) | kickmemory[(addr >> 1)+1];
                    212: }
                    213: 
                    214: UWORD kickmem_wget(CPTR addr)
                    215: {
                    216:     addr -= kickmem_start & (kickmem_size-1);
                    217:     addr &= kickmem_size-1;
                    218:     return kickmemory[addr >> 1];
                    219: }
                    220: 
                    221: UBYTE kickmem_bget(CPTR addr)
                    222: {
                    223:     addr -= kickmem_start & (kickmem_size-1);
                    224:     addr &= kickmem_size-1;
                    225:     return kickmemory[addr >> 1] >> (addr & 1 ? 0 : 8);
                    226: }
                    227: 
                    228: void kickmem_lput(CPTR a, ULONG b)
                    229: {
                    230: }
                    231: 
                    232: void kickmem_wput(CPTR a, UWORD b)
                    233: {
                    234: }
                    235: 
                    236: void kickmem_bput(CPTR a, UBYTE b)
                    237: {
                    238: }
                    239: 
                    240: bool kickmem_check(CPTR addr, ULONG size)
                    241: {
                    242:     addr -= kickmem_start & (kickmem_size-1);
                    243:     addr &= kickmem_size-1;
                    244:     return (addr + size) < kickmem_size;
                    245: }
                    246: 
                    247: UWORD *kickmem_xlate(CPTR addr)
                    248: {
                    249:     addr -= kickmem_start & (kickmem_size-1);
                    250:     addr &= kickmem_size-1;
                    251:     return kickmemory + (addr >> 1);
                    252: }
                    253: 
                    254: static bool load_kickstart(void)
                    255: {
                    256:     int i;
                    257:     ULONG cksum = 0, prevck = 0;
                    258:     
                    259:     FILE *f = fopen(romfile, "rb");
                    260:     
                    261:     if (f == NULL) {   
                    262:        fprintf(stderr, "No Kickstart ROM found.\n");
                    263:        return false;
                    264:     }
                    265:     
                    266:     for(i = 0; i < kickmem_size/2; i++) {
                    267:        unsigned char buffer[2];
                    268:        if (fread(buffer, 1, 2, f) < 2) {
                    269:            if (feof(f) && i == kickmem_size/4) {
                    270:                fprintf(stderr, "Warning: Kickstart is only 256K.\n");
                    271: #ifndef __mac__
                    272:                memcpy (kickmemory + kickmem_size/4, kickmemory, kickmem_size/4);
                    273: #else
                    274:                memcpy (kickmemory + kickmem_size/4, kickmemory, kickmem_size/2);
                    275: #endif
                    276:                break;
                    277:            } else {
                    278:                fprintf(stderr, "Error while reading Kickstart.\n");
                    279:                return false;
                    280:            }
                    281:        }
                    282:        kickmemory[i] = buffer[0]*256 + buffer[1];
                    283:     }
                    284:     fclose (f);
                    285:     
                    286:     for (i = 0; i < kickmem_size/4; i++) {
                    287:        ULONG data = kickmemory[i*2]*65536 + kickmemory[i*2+1];
                    288:        cksum += data;
                    289:        if (cksum < prevck)
                    290:            cksum++;
                    291:        prevck = cksum;
                    292:     }
                    293:     if (cksum != 0xFFFFFFFF) {
                    294:        fprintf(stderr, "Warning: Kickstart checksum incorrect. You probably have a corrupted ROM image.\n");
                    295:     }
                    296:     return true;
                    297: }
                    298: 
                    299: /* Address banks */
                    300: 
                    301: addrbank chipmem_bank = {
                    302:     chipmem_lget, chipmem_wget, chipmem_bget,
                    303:     chipmem_lput, chipmem_wput, chipmem_bput,
                    304:     chipmem_xlate, chipmem_check
                    305: };
                    306: 
                    307: addrbank bogomem_bank = {
                    308:     bogomem_lget, bogomem_wget, bogomem_bget,
                    309:     bogomem_lput, bogomem_wput, bogomem_bput,
                    310:     bogomem_xlate, bogomem_check
                    311: };
                    312: 
                    313: addrbank kickmem_bank = {
                    314:     kickmem_lget, kickmem_wget, kickmem_bget,
                    315:     kickmem_lput, kickmem_wput, kickmem_bput,
                    316:     kickmem_xlate, kickmem_check
                    317: };
                    318: 
                    319: 
                    320: #ifdef DUALCPU
                    321: ULONG mempattern;
                    322: bool incpu;
                    323: struct memreads {
                    324:     CPTR addr;
                    325:     ULONG value;
                    326: } readlog[200];
                    327: 
                    328: int memlogptr = 0;
                    329: 
                    330: ULONG get_long(CPTR addr)
                    331: {
                    332:     ULONG result;
                    333:     mempattern ^= addr ^ 0x99999999;
                    334:     if (allowmem || !incpu) {
                    335:        result = longget(addr);
                    336:        if (incpu) {        
                    337:            readlog[memlogptr].addr = addr;
                    338:            readlog[memlogptr++].value = result;
                    339:        }
                    340:     } else {   
                    341:        for(int i=0;i<memlogptr;i++) {
                    342:            if (readlog[i].addr == addr) {
                    343:                result = readlog[i].value;
                    344:            }
                    345:        }
                    346:     }
                    347:     return result;
                    348: }
                    349: 
                    350: UWORD get_word(CPTR addr)
                    351: {
                    352:     UWORD result;
                    353:     mempattern ^= addr ^ 0xAAAAAAAA;
                    354:     if (allowmem || !incpu) {
                    355:        result = wordget(addr);
                    356:        if (incpu) {        
                    357:            readlog[memlogptr].addr = addr;
                    358:            readlog[memlogptr++].value = result;
                    359:        }
                    360:     } else {   
                    361:        for(int i=0;i<memlogptr;i++) {
                    362:            if (readlog[i].addr == addr) {
                    363:                result = readlog[i].value;
                    364:            }
                    365:        }
                    366:     }
                    367:     return result;
                    368: }
                    369: 
                    370: UBYTE get_byte(CPTR addr)
                    371: {
                    372:     UBYTE result;
                    373:     mempattern ^= addr ^ 0x55555555;
                    374:     if (allowmem || !incpu) {
                    375:        result = byteget(addr);
                    376:        if (incpu) {        
                    377:            readlog[memlogptr].addr = addr;
                    378:            readlog[memlogptr++].value = result;
                    379:        }
                    380:     } else {   
                    381:        for(int i=0;i<memlogptr;i++) {
                    382:            if (readlog[i].addr == addr) {
                    383:                result = readlog[i].value;
                    384:            }
                    385:        }
                    386:     }
                    387:     return result;
                    388: }
                    389: 
                    390: void put_long(CPTR addr, ULONG l)
                    391: {
                    392:     mempattern ^= addr ^ l ^ 0x09090909;
                    393:     longput(addr,l);
                    394: }
                    395: 
                    396: void put_word(CPTR addr, UWORD w)
                    397: {
                    398:     mempattern ^= addr ^ w ^ 0x0A0A0A0A;
                    399:     wordput(addr,w);
                    400: }
                    401: 
                    402: void put_byte(CPTR addr, UBYTE b)
                    403: {
                    404:     mempattern ^= addr ^ b ^ 0x05050505;
                    405:     byteput(addr,b);
                    406: }
                    407: 
                    408: #endif
                    409: 
                    410: void memory_init(void)
                    411: {
                    412: #ifdef DUALCPU
                    413:     allowmem = true;
                    414: #endif
                    415:     buserr = false;
                    416:     
                    417:     map_banks(chipmem_bank, 0, 256);
                    418:     
                    419:     map_banks(custom_bank, 0xC0, 0x20);    
                    420: 
                    421:     if (use_slow_mem && bogomem_size > 0) {
                    422:        map_banks(bogomem_bank, 0xC0, bogomem_size >> 16);
                    423:     }
                    424: #if 0
                    425:     if (fastmem_size > 0)
                    426:        map_banks(expmem_config_bank, 0xE8, 1);
                    427: #endif
                    428:     map_banks(kickmem_bank, 0xF8, 8);
                    429:     map_banks(rtarea_bank, 0xF0, 1); rtarea_init ();
                    430:     map_banks(cia_bank, 0xBF, 1);
                    431:     map_banks(clock_bank, 0xDC, 1);
                    432: 
                    433:     if (!load_kickstart()) {
                    434:        init_ersatz_rom(kickmemory);
                    435:     }
                    436: }
                    437: 
                    438: void map_banks(addrbank bank, int start, int size)
                    439: {
                    440:     int bnr;
                    441:     for(bnr=start; bnr < start+size; bnr++) {
                    442:        do_lget[bnr] = bank.lget;
                    443:        do_wget[bnr] = bank.wget;
                    444:        do_bget[bnr] = bank.bget;
                    445:        do_lput[bnr] = bank.lput;
                    446:        do_wput[bnr] = bank.wput;
                    447:        do_bput[bnr] = bank.bput;
                    448:        do_xlateaddr[bnr] = bank.xlateaddr;
                    449:        do_check[bnr] = bank.check;
                    450:     }
                    451: }

unix.superglobalmegacorp.com

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