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

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

unix.superglobalmegacorp.com

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