Annotation of hatari/src/uae-cpu/memory.c, revision 1.1.1.15

1.1       root        1:  /*
1.1.1.4   root        2:   * UAE - The Un*x Amiga Emulator - CPU core
1.1       root        3:   *
                      4:   * Memory management
                      5:   *
                      6:   * (c) 1995 Bernd Schmidt
1.1.1.2   root        7:   *
                      8:   * Adaptation to Hatari by Thomas Huth
1.1.1.4   root        9:   *
                     10:   * This file is distributed under the GNU Public License, version 2 or at
                     11:   * your option any later version. Read the file gpl.txt for details.
1.1       root       12:   */
1.1.1.13  root       13: const char Memory_fileid[] = "Hatari memory.c : " __DATE__ " " __TIME__;
1.1       root       14: 
1.1.1.10  root       15: #include "config.h"
1.1       root       16: #include "sysdeps.h"
                     17: #include "hatari-glue.h"
                     18: #include "maccess.h"
                     19: #include "memory.h"
1.1.1.14  root       20: 
                     21: #include "main.h"
                     22: #include "tos.h"
                     23: #include "ide.h"
                     24: #include "ioMem.h"
                     25: #include "reset.h"
                     26: #include "stMemory.h"
                     27: #include "m68000.h"
                     28: 
1.1.1.5   root       29: #include "newcpu.h"
1.1       root       30: 
                     31: 
1.1.1.10  root       32: /* Set illegal_mem to 1 for debug output: */
                     33: #define illegal_mem 1
                     34: 
                     35: 
1.1.1.6   root       36: static uae_u32 STmem_size, TTmem_size = 0;
                     37: static uae_u32 TTmem_mask;
1.1       root       38: 
1.1.1.5   root       39: #define STmem_start  0x00000000
                     40: #define ROMmem_start 0x00E00000
1.1.1.10  root       41: #define IdeMem_start 0x00F00000
1.1.1.5   root       42: #define IOmem_start  0x00FF0000
                     43: #define TTmem_start  0x01000000
1.1       root       44: 
1.1.1.10  root       45: #define IdeMem_size  65536
1.1.1.5   root       46: #define IOmem_size  65536
                     47: #define ROMmem_size (0x00FF0000 - 0x00E00000)  /* So we cover both possible ROM regions + cartridge */
1.1       root       48: 
1.1.1.5   root       49: #define STmem_mask  0x00ffffff
                     50: #define ROMmem_mask 0x00ffffff
1.1.1.10  root       51: #define IdeMem_mask  (IdeMem_size - 1)
1.1.1.5   root       52: #define IOmem_mask  (IOmem_size - 1)
1.1       root       53: 
                     54: 
                     55: #ifdef SAVE_MEMORY_BANKS
                     56: addrbank *mem_banks[65536];
                     57: #else
                     58: addrbank mem_banks[65536];
                     59: #endif
                     60: 
                     61: #ifdef NO_INLINE_MEMORY_ACCESS
                     62: __inline__ uae_u32 longget (uaecptr addr)
                     63: {
                     64:     return call_mem_get_func (get_mem_bank (addr).lget, addr);
                     65: }
                     66: __inline__ uae_u32 wordget (uaecptr addr)
                     67: {
                     68:     return call_mem_get_func (get_mem_bank (addr).wget, addr);
                     69: }
                     70: __inline__ uae_u32 byteget (uaecptr addr)
                     71: {
                     72:     return call_mem_get_func (get_mem_bank (addr).bget, addr);
                     73: }
                     74: __inline__ void longput (uaecptr addr, uae_u32 l)
                     75: {
                     76:     call_mem_put_func (get_mem_bank (addr).lput, addr, l);
                     77: }
                     78: __inline__ void wordput (uaecptr addr, uae_u32 w)
                     79: {
                     80:     call_mem_put_func (get_mem_bank (addr).wput, addr, w);
                     81: }
                     82: __inline__ void byteput (uaecptr addr, uae_u32 b)
                     83: {
                     84:     call_mem_put_func (get_mem_bank (addr).bput, addr, b);
                     85: }
                     86: #endif
                     87: 
                     88: 
1.1.1.5   root       89: /* Some prototypes: */
1.1.1.11  root       90: extern void SDL_Quit(void);
1.1.1.5   root       91: static int STmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                     92: static uae_u8 *STmem_xlate (uaecptr addr) REGPARAM;
                     93: 
                     94: 
1.1       root       95: /* A dummy bank that only contains zeros */
                     96: 
1.1.1.6   root       97: static uae_u32 dummy_lget(uaecptr addr)
1.1       root       98: {
                     99:     if (illegal_mem)
1.1.1.3   root      100:        write_log ("Illegal lget at %08lx\n", (long)addr);
1.1       root      101: 
                    102:     return 0;
                    103: }
                    104: 
1.1.1.6   root      105: static uae_u32 dummy_wget(uaecptr addr)
1.1       root      106: {
                    107:     if (illegal_mem)
1.1.1.3   root      108:        write_log ("Illegal wget at %08lx\n", (long)addr);
1.1       root      109: 
                    110:     return 0;
                    111: }
                    112: 
1.1.1.6   root      113: static uae_u32 dummy_bget(uaecptr addr)
1.1       root      114: {
                    115:     if (illegal_mem)
1.1.1.3   root      116:        write_log ("Illegal bget at %08lx\n", (long)addr);
1.1       root      117: 
                    118:     return 0;
                    119: }
                    120: 
1.1.1.6   root      121: static void dummy_lput(uaecptr addr, uae_u32 l)
1.1       root      122: {
                    123:     if (illegal_mem)
1.1.1.3   root      124:        write_log ("Illegal lput at %08lx\n", (long)addr);
1.1       root      125: }
1.1.1.5   root      126: 
1.1.1.6   root      127: static void dummy_wput(uaecptr addr, uae_u32 w)
1.1       root      128: {
                    129:     if (illegal_mem)
1.1.1.3   root      130:        write_log ("Illegal wput at %08lx\n", (long)addr);
1.1       root      131: }
1.1.1.5   root      132: 
1.1.1.6   root      133: static void dummy_bput(uaecptr addr, uae_u32 b)
1.1       root      134: {
                    135:     if (illegal_mem)
1.1.1.3   root      136:        write_log ("Illegal bput at %08lx\n", (long)addr);
1.1       root      137: }
                    138: 
1.1.1.6   root      139: static int dummy_check(uaecptr addr, uae_u32 size)
1.1       root      140: {
                    141:     if (illegal_mem)
1.1.1.3   root      142:        write_log ("Illegal check at %08lx\n", (long)addr);
1.1       root      143: 
                    144:     return 0;
                    145: }
                    146: 
1.1.1.6   root      147: static uae_u8 *dummy_xlate(uaecptr addr)
1.1.1.5   root      148: {
                    149:     write_log("Your Atari program just did something terribly stupid:"
                    150:               " dummy_xlate($%x)\n", addr);
                    151:     /*Reset_Warm();*/
                    152:     return STmem_xlate(addr);  /* So we don't crash. */
                    153: }
1.1       root      154: 
                    155: 
1.1.1.5   root      156: /* **** This memory bank only generates bus errors **** */
1.1       root      157: 
1.1.1.6   root      158: static uae_u32 BusErrMem_lget(uaecptr addr)
1.1.1.5   root      159: {
                    160:     if (illegal_mem)
                    161:        write_log ("Bus error lget at %08lx\n", (long)addr);
                    162: 
1.1.1.15! root      163:     M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      164:     return 0;
                    165: }
                    166: 
1.1.1.6   root      167: static uae_u32 BusErrMem_wget(uaecptr addr)
1.1.1.5   root      168: {
                    169:     if (illegal_mem)
                    170:        write_log ("Bus error wget at %08lx\n", (long)addr);
                    171: 
1.1.1.15! root      172:     M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      173:     return 0;
                    174: }
                    175: 
1.1.1.6   root      176: static uae_u32 BusErrMem_bget(uaecptr addr)
1.1.1.5   root      177: {
                    178:     if (illegal_mem)
                    179:        write_log ("Bus error bget at %08lx\n", (long)addr);
                    180: 
1.1.1.15! root      181:     M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      182:     return 0;
                    183: }
                    184: 
1.1.1.6   root      185: static void BusErrMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5   root      186: {
                    187:     if (illegal_mem)
                    188:        write_log ("Bus error lput at %08lx\n", (long)addr);
                    189: 
1.1.1.15! root      190:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      191: }
                    192: 
1.1.1.6   root      193: static void BusErrMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5   root      194: {
                    195:     if (illegal_mem)
                    196:        write_log ("Bus error wput at %08lx\n", (long)addr);
                    197: 
1.1.1.15! root      198:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      199: }
                    200: 
1.1.1.6   root      201: static void BusErrMem_bput(uaecptr addr, uae_u32 b)
1.1.1.5   root      202: {
                    203:     if (illegal_mem)
                    204:        write_log ("Bus error bput at %08lx\n", (long)addr);
                    205: 
1.1.1.15! root      206:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      207: }
                    208: 
1.1.1.6   root      209: static int BusErrMem_check(uaecptr addr, uae_u32 size)
1.1.1.5   root      210: {
                    211:     if (illegal_mem)
                    212:        write_log ("Bus error check at %08lx\n", (long)addr);
                    213: 
                    214:     return 0;
                    215: }
                    216: 
1.1.1.6   root      217: static uae_u8 *BusErrMem_xlate (uaecptr addr)
1.1.1.5   root      218: {
                    219:     write_log("Your Atari program just did something terribly stupid:"
                    220:               " BusErrMem_xlate($%x)\n", addr);
                    221: 
                    222:     /*M68000_BusError(addr);*/
                    223:     return STmem_xlate(addr);  /* So we don't crash. */
                    224: }
                    225: 
                    226: 
                    227: /* **** ST RAM memory **** */
                    228: 
1.1.1.9   root      229: /*static uae_u8 *STmemory;*/
                    230: #define STmemory STRam
1.1       root      231: 
1.1.1.6   root      232: static uae_u32 STmem_lget(uaecptr addr)
1.1       root      233: {
                    234:     addr -= STmem_start & STmem_mask;
                    235:     addr &= STmem_mask;
1.1.1.7   root      236:     return do_get_mem_long(STmemory + addr);
1.1       root      237: }
                    238: 
1.1.1.6   root      239: static uae_u32 STmem_wget(uaecptr addr)
1.1       root      240: {
                    241:     addr -= STmem_start & STmem_mask;
                    242:     addr &= STmem_mask;
1.1.1.7   root      243:     return do_get_mem_word(STmemory + addr);
1.1       root      244: }
                    245: 
1.1.1.6   root      246: static uae_u32 STmem_bget(uaecptr addr)
1.1       root      247: {
                    248:     addr -= STmem_start & STmem_mask;
                    249:     addr &= STmem_mask;
                    250:     return STmemory[addr];
                    251: }
                    252: 
1.1.1.6   root      253: static void STmem_lput(uaecptr addr, uae_u32 l)
1.1       root      254: {
                    255:     addr -= STmem_start & STmem_mask;
                    256:     addr &= STmem_mask;
1.1.1.7   root      257:     do_put_mem_long(STmemory + addr, l);
1.1       root      258: }
                    259: 
1.1.1.6   root      260: static void STmem_wput(uaecptr addr, uae_u32 w)
1.1       root      261: {
                    262:     addr -= STmem_start & STmem_mask;
                    263:     addr &= STmem_mask;
1.1.1.7   root      264:     do_put_mem_word(STmemory + addr, w);
1.1       root      265: }
                    266: 
1.1.1.6   root      267: static void STmem_bput(uaecptr addr, uae_u32 b)
1.1       root      268: {
                    269:     addr -= STmem_start & STmem_mask;
                    270:     addr &= STmem_mask;
                    271:     STmemory[addr] = b;
                    272: }
                    273: 
1.1.1.6   root      274: static int STmem_check(uaecptr addr, uae_u32 size)
1.1       root      275: {
                    276:     addr -= STmem_start & STmem_mask;
                    277:     addr &= STmem_mask;
1.1.1.5   root      278:     return (addr + size) <= STmem_size;
1.1       root      279: }
                    280: 
1.1.1.6   root      281: static uae_u8 *STmem_xlate(uaecptr addr)
1.1       root      282: {
                    283:     addr -= STmem_start & STmem_mask;
                    284:     addr &= STmem_mask;
                    285:     return STmemory + addr;
                    286: }
                    287: 
                    288: 
1.1.1.5   root      289: /*
                    290:  * **** ST RAM system memory ****
                    291:  * We need a separate mem bank for this region since the first 0x800 bytes on
                    292:  * the ST can only be accessed in supervisor mode. Note that the very first
                    293:  * 8 bytes of the ST memory are also a mirror of the TOS ROM, so they are write
                    294:  * protected!
                    295:  */
1.1.1.6   root      296: static uae_u32 SysMem_lget(uaecptr addr)
1.1.1.5   root      297: {
                    298:     if(addr < 0x800 && !regs.s)
                    299:     {
1.1.1.15! root      300:       M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      301:       return 0;
                    302:     }
                    303: 
                    304:     addr -= STmem_start & STmem_mask;
                    305:     addr &= STmem_mask;
1.1.1.7   root      306: 
                    307:     return do_get_mem_long(STmemory + addr);
1.1.1.5   root      308: }
                    309: 
1.1.1.6   root      310: static uae_u32 SysMem_wget(uaecptr addr)
1.1.1.5   root      311: {
                    312:     if(addr < 0x800 && !regs.s)
                    313:     {
1.1.1.15! root      314:       M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      315:       return 0;
                    316:     }
                    317: 
                    318:     addr -= STmem_start & STmem_mask;
                    319:     addr &= STmem_mask;
1.1.1.7   root      320: 
                    321:     return do_get_mem_word(STmemory + addr);
1.1.1.5   root      322: }
                    323: 
1.1.1.6   root      324: static uae_u32 SysMem_bget(uaecptr addr)
1.1.1.5   root      325: {
                    326:     if(addr < 0x800 && !regs.s)
                    327:     {
1.1.1.15! root      328:       M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5   root      329:       return 0;
                    330:     }
                    331: 
                    332:     addr -= STmem_start & STmem_mask;
                    333:     addr &= STmem_mask;
                    334:     return STmemory[addr];
                    335: }
                    336: 
1.1.1.6   root      337: static void SysMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5   root      338: {
                    339:     if(addr < 0x8 || (addr < 0x800 && !regs.s))
                    340:     {
1.1.1.15! root      341:       M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      342:       return;
                    343:     }
                    344: 
                    345:     addr -= STmem_start & STmem_mask;
                    346:     addr &= STmem_mask;
1.1.1.7   root      347: 
                    348:     do_put_mem_long(STmemory + addr, l);
1.1.1.5   root      349: }
                    350: 
1.1.1.6   root      351: static void SysMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5   root      352: {
                    353:     if(addr < 0x8 || (addr < 0x800 && !regs.s))
                    354:     {
1.1.1.15! root      355:       M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      356:       return;
                    357:     }
                    358: 
                    359:     addr -= STmem_start & STmem_mask;
                    360:     addr &= STmem_mask;
1.1.1.7   root      361: 
                    362:     do_put_mem_word(STmemory + addr, w);
1.1.1.5   root      363: }
                    364: 
1.1.1.6   root      365: static void SysMem_bput(uaecptr addr, uae_u32 b)
1.1.1.5   root      366: {
                    367:     if(addr < 0x8 || (addr < 0x800 && !regs.s))
                    368:     {
1.1.1.15! root      369:       M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5   root      370:       return;
                    371:     }
                    372: 
                    373:     addr -= STmem_start & STmem_mask;
                    374:     addr &= STmem_mask;
                    375:     STmemory[addr] = b;
                    376: }
                    377: 
                    378: 
                    379: /*
                    380:  * **** Void memory ****
                    381:  * Between the ST-RAM end and the 4 MB barrier, there is a void memory space:
                    382:  * Reading always returns the same value and writing does nothing at all.
                    383:  */
                    384: 
1.1.1.6   root      385: static uae_u32 VoidMem_lget(uaecptr addr)
1.1.1.5   root      386: {
                    387:     return 0;
                    388: }
                    389: 
1.1.1.6   root      390: static uae_u32 VoidMem_wget(uaecptr addr)
1.1.1.5   root      391: {
                    392:     return 0;
                    393: }
                    394: 
1.1.1.6   root      395: static uae_u32 VoidMem_bget(uaecptr addr)
1.1.1.5   root      396: {
                    397:     return 0;
                    398: }
                    399: 
1.1.1.6   root      400: static void VoidMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5   root      401: {
                    402: }
                    403: 
1.1.1.6   root      404: static void VoidMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5   root      405: {
                    406: }
                    407: 
1.1.1.6   root      408: static void VoidMem_bput (uaecptr addr, uae_u32 b)
1.1.1.5   root      409: {
                    410: }
                    411: 
1.1.1.6   root      412: static int VoidMem_check(uaecptr addr, uae_u32 size)
1.1.1.5   root      413: {
                    414:     if (illegal_mem)
                    415:        write_log ("Void memory check at %08lx\n", (long)addr);
                    416: 
                    417:     return 0;
                    418: }
                    419: 
1.1.1.6   root      420: static uae_u8 *VoidMem_xlate (uaecptr addr)
1.1.1.5   root      421: {
                    422:     write_log("Your Atari program just did something terribly stupid:"
                    423:               " VoidMem_xlate($%x)\n", addr);
                    424: 
                    425:     return STmem_xlate(addr);  /* So we don't crash. */
                    426: }
                    427: 
                    428: 
                    429: /* **** TT fast memory (not yet supported) **** */
1.1       root      430: 
                    431: static uae_u8 *TTmemory;
                    432: 
1.1.1.6   root      433: static uae_u32 TTmem_lget(uaecptr addr)
1.1       root      434: {
                    435:     addr -= TTmem_start & TTmem_mask;
                    436:     addr &= TTmem_mask;
1.1.1.7   root      437:     return do_get_mem_long(TTmemory + addr);
1.1       root      438: }
                    439: 
1.1.1.6   root      440: static uae_u32 TTmem_wget(uaecptr addr)
1.1       root      441: {
                    442:     addr -= TTmem_start & TTmem_mask;
                    443:     addr &= TTmem_mask;
1.1.1.7   root      444:     return do_get_mem_word(TTmemory + addr);
1.1       root      445: }
                    446: 
1.1.1.6   root      447: static uae_u32 TTmem_bget(uaecptr addr)
1.1       root      448: {
                    449:     addr -= TTmem_start & TTmem_mask;
                    450:     addr &= TTmem_mask;
                    451:     return TTmemory[addr];
                    452: }
                    453: 
1.1.1.6   root      454: static void TTmem_lput(uaecptr addr, uae_u32 l)
1.1       root      455: {
                    456:     addr -= TTmem_start & TTmem_mask;
                    457:     addr &= TTmem_mask;
1.1.1.7   root      458:     do_put_mem_long(TTmemory + addr, l);
1.1       root      459: }
                    460: 
1.1.1.6   root      461: static void TTmem_wput(uaecptr addr, uae_u32 w)
1.1       root      462: {
                    463:     addr -= TTmem_start & TTmem_mask;
                    464:     addr &= TTmem_mask;
1.1.1.7   root      465:     do_put_mem_word(TTmemory + addr, w);
1.1       root      466: }
                    467: 
1.1.1.6   root      468: static void TTmem_bput(uaecptr addr, uae_u32 b)
1.1       root      469: {
                    470:     addr -= TTmem_start & TTmem_mask;
                    471:     addr &= TTmem_mask;
                    472:     TTmemory[addr] = b;
                    473: }
                    474: 
1.1.1.6   root      475: static int TTmem_check(uaecptr addr, uae_u32 size)
1.1       root      476: {
                    477:     addr -= TTmem_start & TTmem_mask;
                    478:     addr &= TTmem_mask;
1.1.1.5   root      479:     return (addr + size) <= TTmem_size;
1.1       root      480: }
                    481: 
1.1.1.6   root      482: static uae_u8 *TTmem_xlate(uaecptr addr)
1.1       root      483: {
                    484:     addr -= TTmem_start & TTmem_mask;
                    485:     addr &= TTmem_mask;
                    486:     return TTmemory + addr;
                    487: }
                    488: 
1.1.1.5   root      489: 
                    490: /* **** ROM memory **** */
1.1       root      491: 
1.1.1.10  root      492: uae_u8 *ROMmemory;
1.1       root      493: 
1.1.1.6   root      494: static uae_u32 ROMmem_lget(uaecptr addr)
1.1       root      495: {
                    496:     addr -= ROMmem_start & ROMmem_mask;
                    497:     addr &= ROMmem_mask;
1.1.1.7   root      498:     return do_get_mem_long(ROMmemory + addr);
1.1       root      499: }
                    500: 
1.1.1.6   root      501: static uae_u32 ROMmem_wget(uaecptr addr)
1.1       root      502: {
                    503:     addr -= ROMmem_start & ROMmem_mask;
                    504:     addr &= ROMmem_mask;
1.1.1.7   root      505:     return do_get_mem_word(ROMmemory + addr);
1.1       root      506: }
                    507: 
1.1.1.6   root      508: static uae_u32 ROMmem_bget(uaecptr addr)
1.1       root      509: {
                    510:     addr -= ROMmem_start & ROMmem_mask;
                    511:     addr &= ROMmem_mask;
                    512:     return ROMmemory[addr];
                    513: }
                    514: 
1.1.1.6   root      515: static void ROMmem_lput(uaecptr addr, uae_u32 b)
1.1       root      516: {
                    517:     if (illegal_mem)
1.1.1.3   root      518:        write_log ("Illegal ROMmem lput at %08lx\n", (long)addr);
1.1.1.5   root      519: 
1.1.1.15! root      520:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1       root      521: }
                    522: 
1.1.1.6   root      523: static void ROMmem_wput(uaecptr addr, uae_u32 b)
1.1       root      524: {
                    525:     if (illegal_mem)
1.1.1.3   root      526:        write_log ("Illegal ROMmem wput at %08lx\n", (long)addr);
1.1.1.5   root      527: 
1.1.1.15! root      528:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1       root      529: }
                    530: 
1.1.1.6   root      531: static void ROMmem_bput(uaecptr addr, uae_u32 b)
1.1       root      532: {
                    533:     if (illegal_mem)
1.1.1.5   root      534:        write_log ("Illegal ROMmem bput at %08lx\n", (long)addr);
                    535: 
1.1.1.15! root      536:     M68000_BusError(addr, BUS_ERROR_WRITE);
1.1       root      537: }
                    538: 
1.1.1.6   root      539: static int ROMmem_check(uaecptr addr, uae_u32 size)
1.1       root      540: {
                    541:     addr -= ROMmem_start & ROMmem_mask;
                    542:     addr &= ROMmem_mask;
                    543:     return (addr + size) <= ROMmem_size;
                    544: }
                    545: 
1.1.1.6   root      546: static uae_u8 *ROMmem_xlate(uaecptr addr)
1.1       root      547: {
                    548:     addr -= ROMmem_start & ROMmem_mask;
                    549:     addr &= ROMmem_mask;
                    550:     return ROMmemory + addr;
                    551: }
                    552: 
                    553: 
1.1.1.10  root      554: /* IDE controller IO memory */
                    555: /* see also ide.c */
                    556: 
                    557: static uae_u8 *IdeMemory;
                    558: 
                    559: static int IdeMem_check(uaecptr addr, uae_u32 size)
                    560: {
                    561:     addr -= IdeMem_start;
                    562:     addr &= IdeMem_mask;
                    563:     return (addr + size) <= IdeMem_size;
                    564: }
                    565: 
                    566: static uae_u8 *IdeMem_xlate(uaecptr addr)
                    567: {
                    568:     addr -= IdeMem_start;
                    569:     addr &= IdeMem_mask;
                    570:     return IdeMemory + addr;
                    571: }
                    572: 
                    573: 
1.1       root      574: /* Hardware IO memory */
1.1.1.10  root      575: /* see also ioMem.c */
1.1       root      576: 
1.1.1.10  root      577: uae_u8 *IOmemory;
1.1       root      578: 
1.1.1.6   root      579: static int IOmem_check(uaecptr addr, uae_u32 size)
1.1       root      580: {
1.1.1.5   root      581:     addr -= IOmem_start;
1.1       root      582:     addr &= IOmem_mask;
                    583:     return (addr + size) <= IOmem_size;
                    584: }
                    585: 
1.1.1.6   root      586: static uae_u8 *IOmem_xlate(uaecptr addr)
1.1       root      587: {
1.1.1.5   root      588:     addr -= IOmem_start;
1.1       root      589:     addr &= IOmem_mask;
                    590:     return IOmemory + addr;
                    591: }
                    592: 
                    593: 
                    594: 
1.1.1.5   root      595: /* **** Address banks **** */
1.1       root      596: 
1.1.1.6   root      597: static addrbank dummy_bank =
                    598: {
1.1       root      599:     dummy_lget, dummy_wget, dummy_bget,
                    600:     dummy_lput, dummy_wput, dummy_bput,
1.1.1.5   root      601:     dummy_xlate, dummy_check
                    602: };
                    603: 
1.1.1.6   root      604: static addrbank BusErrMem_bank =
                    605: {
1.1.1.5   root      606:     BusErrMem_lget, BusErrMem_wget, BusErrMem_bget,
                    607:     BusErrMem_lput, BusErrMem_wput, BusErrMem_bput,
                    608:     BusErrMem_xlate, BusErrMem_check
1.1       root      609: };
                    610: 
1.1.1.6   root      611: static addrbank STmem_bank =
                    612: {
1.1       root      613:     STmem_lget, STmem_wget, STmem_bget,
                    614:     STmem_lput, STmem_wput, STmem_bput,
                    615:     STmem_xlate, STmem_check
                    616: };
                    617: 
1.1.1.6   root      618: static addrbank SysMem_bank =
                    619: {
1.1.1.5   root      620:     SysMem_lget, SysMem_wget, SysMem_bget,
                    621:     SysMem_lput, SysMem_wput, SysMem_bput,
                    622:     STmem_xlate, STmem_check
                    623: };
                    624: 
1.1.1.6   root      625: static addrbank VoidMem_bank =
                    626: {
1.1.1.5   root      627:     VoidMem_lget, VoidMem_wget, VoidMem_bget,
                    628:     VoidMem_lput, VoidMem_wput, VoidMem_bput,
                    629:     VoidMem_xlate, VoidMem_check
                    630: };
                    631: 
1.1.1.6   root      632: static addrbank TTmem_bank =
                    633: {
1.1       root      634:     TTmem_lget, TTmem_wget, TTmem_bget,
                    635:     TTmem_lput, TTmem_wput, TTmem_bput,
                    636:     TTmem_xlate, TTmem_check
                    637: };
                    638: 
1.1.1.6   root      639: static addrbank ROMmem_bank =
                    640: {
1.1       root      641:     ROMmem_lget, ROMmem_wget, ROMmem_bget,
                    642:     ROMmem_lput, ROMmem_wput, ROMmem_bput,
                    643:     ROMmem_xlate, ROMmem_check
                    644: };
                    645: 
1.1.1.10  root      646: static addrbank IdeMem_bank =
                    647: {
                    648:     Ide_Mem_lget, Ide_Mem_wget, Ide_Mem_bget,
                    649:     Ide_Mem_lput, Ide_Mem_wput, Ide_Mem_bput,
                    650:     IdeMem_xlate, IdeMem_check
                    651: };
                    652: 
1.1.1.6   root      653: static addrbank IOmem_bank =
                    654: {
1.1.1.7   root      655:     IoMem_lget, IoMem_wget, IoMem_bget,
                    656:     IoMem_lput, IoMem_wput, IoMem_bput,
1.1       root      657:     IOmem_xlate, IOmem_check
                    658: };
                    659: 
                    660: 
1.1.1.5   root      661: 
1.1       root      662: static void init_mem_banks (void)
                    663: {
                    664:     int i;
                    665:     for (i = 0; i < 65536; i++)
                    666:        put_mem_bank (i<<16, &dummy_bank);
                    667: }
                    668: 
                    669: 
                    670: /*
1.1.1.5   root      671:  * Initialize the memory banks
                    672:  */
1.1.1.8   root      673: void memory_init(uae_u32 nNewSTMemSize, uae_u32 nNewTTMemSize, uae_u32 nNewRomMemStart)
1.1.1.5   root      674: {
1.1.1.8   root      675:     STmem_size = (nNewSTMemSize + 65535) & 0xFFFF0000;
                    676:     TTmem_size = (nNewTTMemSize + 65535) & 0xFFFF0000;
1.1.1.5   root      677: 
                    678:     /*write_log("memory_init: STmem_size=$%x, TTmem_size=$%x, ROM-Start=$%x,\n",
1.1.1.8   root      679:               STmem_size, TTmem_size, nNewRomMemStart);*/
1.1.1.5   root      680: 
1.1.1.10  root      681: #if ENABLE_SMALL_MEM
1.1.1.9   root      682: 
1.1.1.10  root      683:     /* Allocate memory for ROM areas and IO memory space (0xE00000 - 0xFFFFFF) */
                    684:     ROMmemory = malloc(2*1024*1024);
                    685:     if (!ROMmemory) {
                    686:        fprintf(stderr, "Out of memory (ROM/IO mem)!\n");
1.1.1.11  root      687:        SDL_Quit();
1.1.1.10  root      688:        exit(1);
                    689:     }
                    690:     IdeMemory = ROMmemory + 0x100000;
                    691:     IOmemory  = ROMmemory + 0x1f0000;
                    692: 
                    693:     /* Allocate memory for normal ST RAM */
                    694:     STmemory = malloc(STmem_size);
                    695:     while (!STmemory && STmem_size > 512*1024) {
1.1.1.5   root      696:        STmem_size >>= 1;
                    697:        STmemory = (uae_u8 *)malloc (STmem_size);
1.1       root      698:        if (STmemory)
1.1.1.10  root      699:            write_log ("Reducing STmem size to %dkb\n", STmem_size >> 10);
1.1       root      700:     }
1.1.1.10  root      701:     if (!STmemory) {
1.1       root      702:        write_log ("virtual memory exhausted (STmemory)!\n");
1.1.1.11  root      703:        SDL_Quit();
1.1.1.10  root      704:        exit(1);
1.1       root      705:     }
1.1.1.10  root      706: 
                    707: #else
                    708: 
                    709:     /* STmemory points to the 16 MiB STRam array, we just have to set up
                    710:      * the remaining pointers here: */
                    711:     ROMmemory = STRam + ROMmem_start;
                    712:     IdeMemory = STRam + IdeMem_start;
                    713:     IOmemory = STRam + IOmem_start;
                    714: 
                    715: #endif
1.1       root      716: 
1.1.1.5   root      717:     init_mem_banks();
1.1       root      718: 
1.1.1.8   root      719:     /* Map the ST system RAM: */
1.1.1.5   root      720:     map_banks(&SysMem_bank, 0x00, 1);
1.1.1.8   root      721:     /* Between STRamEnd and 4MB barrier, there is void space: */
                    722:     map_banks(&VoidMem_bank, 0x08, 0x38);
                    723:     /* Space between 4MB barrier and TOS ROM causes a bus error: */
                    724:     map_banks(&BusErrMem_bank, 0x400000 >> 16, 0xA0);
                    725:     /* Now map main ST RAM, overwriting the void and bus error regions if necessary: */
1.1.1.5   root      726:     map_banks(&STmem_bank, 0x01, (STmem_size >> 16) - 1);
                    727: 
                    728:     /* TT memory isn't really supported yet */
                    729:     if (TTmem_size > 0)
                    730:        TTmemory = (uae_u8 *)malloc (TTmem_size);
1.1       root      731:     if (TTmemory != 0)
1.1.1.5   root      732:        map_banks (&TTmem_bank, TTmem_start >> 16, TTmem_size >> 16);
                    733:     else
                    734:        TTmem_size = 0;
                    735:     TTmem_mask = TTmem_size - 1;
                    736: 
                    737:     /* ROM memory: */
                    738:     /* Depending on which ROM version we are using, the other ROM region is illegal! */
1.1.1.8   root      739:     if(nNewRomMemStart == 0xFC0000)
1.1.1.5   root      740:     {
                    741:         map_banks(&ROMmem_bank, 0xFC0000 >> 16, 0x3);
                    742:         map_banks(&BusErrMem_bank, 0xE00000 >> 16, 0x10);
                    743:     }
1.1.1.8   root      744:     else if(nNewRomMemStart == 0xE00000)
1.1.1.5   root      745:     {
                    746:         map_banks(&ROMmem_bank, 0xE00000 >> 16, 0x10);
                    747:         map_banks(&BusErrMem_bank, 0xFC0000 >> 16, 0x3);
                    748:     }
1.1       root      749:     else
1.1.1.5   root      750:     {
                    751:         write_log("Illegal ROM memory start!\n");
                    752:     }
1.1       root      753: 
1.1.1.5   root      754:     /* Cartridge memory: */
                    755:     map_banks(&ROMmem_bank, 0xFA0000 >> 16, 0x2);
1.1       root      756: 
1.1.1.5   root      757:     /* IO memory: */
                    758:     map_banks(&IOmem_bank, IOmem_start>>16, 0x1);
1.1       root      759: 
1.1.1.10  root      760:     /* IDE controller memory region: */
                    761:     map_banks(&IdeMem_bank, IdeMem_start >> 16, 0x1);  /* IDE controller on the Falcon */
                    762: 
1.1.1.5   root      763:     /* Illegal memory regions cause a bus error on the ST: */
1.1.1.10  root      764:     map_banks(&BusErrMem_bank, 0xF10000 >> 16, 0x9);
1.1       root      765: }
                    766: 
1.1.1.5   root      767: 
                    768: /*
                    769:  * Uninitialize the memory banks.
                    770:  */
                    771: void memory_uninit (void)
                    772: {
                    773:     /* Here, we free allocated memory from memory_init */
1.1.1.10  root      774:     if (TTmem_size > 0) {
                    775:        free(TTmemory);
                    776:        TTmemory = NULL;
                    777:     }
                    778: 
                    779: #if ENABLE_SMALL_MEM
                    780: 
                    781:     if (STmemory) {
                    782:        free(STmemory);
                    783:        STmemory = NULL;
                    784:     }
                    785: 
                    786:     if (ROMmemory) {
                    787:        free(ROMmemory);
                    788:        ROMmemory = NULL;
1.1.1.5   root      789:     }
1.1.1.10  root      790: 
                    791: #endif  /* ENABLE_SMALL_MEM */
1.1.1.5   root      792: }
                    793: 
                    794: 
1.1       root      795: void map_banks (addrbank *bank, int start, int size)
                    796: {
                    797:     int bnr;
                    798:     unsigned long int hioffs = 0, endhioffs = 0x100;
                    799: 
                    800:     if (start >= 0x100) {
                    801:        for (bnr = start; bnr < start + size; bnr++)
                    802:            put_mem_bank (bnr << 16, bank);
                    803:        return;
                    804:     }
                    805:     /* Some ROMs apparently require a 24 bit address space... */
1.1.1.10  root      806:     if (currprefs.address_space_24)
1.1       root      807:        endhioffs = 0x10000;
                    808:     for (hioffs = 0; hioffs < endhioffs; hioffs += 0x100)
                    809:        for (bnr = start; bnr < start+size; bnr++)
                    810:            put_mem_bank ((bnr + hioffs) << 16, bank);
                    811: }

unix.superglobalmegacorp.com

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