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

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

unix.superglobalmegacorp.com

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