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

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * Memory management
                      5:   *
                      6:   * (c) 1995 Bernd Schmidt
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include "config.h"
                     13: #include "options.h"
1.1.1.3   root       14: #include "uae.h"
1.1       root       15: #include "memory.h"
                     16: #include "ersatz.h"
                     17: #include "zfile.h"
                     18: 
1.1.1.2   root       19: #ifdef USE_MAPPED_MEMORY
1.1       root       20: #include <sys/mman.h>
                     21: #endif
                     22: 
                     23: int ersatzkickfile = 0;
                     24: 
1.1.1.4   root       25: uae_u32 allocated_chipmem;
                     26: uae_u32 allocated_fastmem;
                     27: uae_u32 allocated_bogomem;
                     28: uae_u32 allocated_gfxmem;
                     29: uae_u32 allocated_z3fastmem;
                     30: uae_u32 allocated_a3000mem;
                     31: 
1.1.1.3   root       32: #ifdef SAVE_MEMORY_BANKS
                     33: addrbank *mem_banks[65536];
                     34: #else
                     35: addrbank mem_banks[65536];
                     36: #endif
1.1       root       37: 
1.1.1.2   root       38: #ifdef NO_INLINE_MEMORY_ACCESS
1.1.1.5   root       39: __inline__ uae_u32 longget (uaecptr addr)
1.1.1.2   root       40: {
1.1.1.5   root       41:     return call_mem_get_func (get_mem_bank (addr).lget, addr);
1.1.1.2   root       42: }
1.1.1.5   root       43: __inline__ uae_u32 wordget (uaecptr addr)
1.1.1.2   root       44: {
1.1.1.5   root       45:     return call_mem_get_func (get_mem_bank (addr).wget, addr);
1.1.1.2   root       46: }
1.1.1.5   root       47: __inline__ uae_u32 byteget (uaecptr addr)
1.1.1.2   root       48: {
1.1.1.5   root       49:     return call_mem_get_func (get_mem_bank (addr).bget, addr);
1.1.1.2   root       50: }
1.1.1.5   root       51: __inline__ void longput (uaecptr addr, uae_u32 l)
1.1.1.2   root       52: {
1.1.1.5   root       53:     call_mem_put_func (get_mem_bank (addr).lput, addr, l);
1.1.1.2   root       54: }
1.1.1.5   root       55: __inline__ void wordput (uaecptr addr, uae_u32 w)
1.1.1.2   root       56: {
1.1.1.5   root       57:     call_mem_put_func (get_mem_bank (addr).wput, addr, w);
1.1.1.2   root       58: }
1.1.1.5   root       59: __inline__ void byteput (uaecptr addr, uae_u32 b)
1.1.1.2   root       60: {
1.1.1.5   root       61:     call_mem_put_func (get_mem_bank (addr).bput, addr, b);
1.1.1.2   root       62: }
                     63: #endif
                     64: 
1.1.1.3   root       65: uae_u32 chipmem_mask, kickmem_mask, bogomem_mask, a3000mem_mask;
1.1       root       66: 
1.1.1.3   root       67: /* A dummy bank that only contains zeros */
                     68: 
1.1.1.4   root       69: static uae_u32 dummy_lget (uaecptr) REGPARAM;
                     70: static uae_u32 dummy_wget (uaecptr) REGPARAM;
                     71: static uae_u32 dummy_bget (uaecptr) REGPARAM;
                     72: static void dummy_lput (uaecptr, uae_u32) REGPARAM;
                     73: static void dummy_wput (uaecptr, uae_u32) REGPARAM;
                     74: static void dummy_bput (uaecptr, uae_u32) REGPARAM;
                     75: static int dummy_check (uaecptr addr, uae_u32 size) REGPARAM;
                     76: 
                     77: uae_u32 REGPARAM2 dummy_lget (uaecptr addr)
                     78: {
                     79:     if (currprefs.illegal_mem)
                     80:        write_log ("Illegal lget at %08lx\n", addr);
                     81: 
1.1       root       82:     return 0;
                     83: }
                     84: 
1.1.1.4   root       85: uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
1.1       root       86: {
1.1.1.4   root       87:     if (currprefs.illegal_mem)
                     88:        write_log ("Illegal wget at %08lx\n", addr);
                     89: 
1.1       root       90:     return 0;
                     91: }
                     92: 
1.1.1.4   root       93: uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
1.1       root       94: {
1.1.1.4   root       95:     if (currprefs.illegal_mem)
                     96:        write_log ("Illegal bget at %08lx\n", addr);
                     97: 
1.1       root       98:     return 0;
                     99: }
                    100: 
1.1.1.4   root      101: void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
1.1       root      102: {
1.1.1.4   root      103:     if (currprefs.illegal_mem)
                    104:        write_log ("Illegal lput at %08lx\n", addr);
1.1.1.3   root      105: }
1.1.1.4   root      106: void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
1.1.1.3   root      107: {
1.1.1.4   root      108:     if (currprefs.illegal_mem)
                    109:        write_log ("Illegal wput at %08lx\n", addr);
1.1.1.3   root      110: }
1.1.1.4   root      111: void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
1.1.1.3   root      112: {
1.1.1.4   root      113:     if (currprefs.illegal_mem)
                    114:        write_log ("Illegal bput at %08lx\n", addr);
1.1       root      115: }
                    116: 
1.1.1.4   root      117: int REGPARAM2 dummy_check (uaecptr addr, uae_u32 size)
1.1       root      118: {
1.1.1.4   root      119:     if (currprefs.illegal_mem)
                    120:        write_log ("Illegal check at %08lx\n", addr);
                    121: 
1.1       root      122:     return 0;
                    123: }
                    124: 
1.1.1.3   root      125: /* A3000 "motherboard resources" bank.  */
1.1.1.4   root      126: static uae_u32 mbres_lget (uaecptr) REGPARAM;
                    127: static uae_u32 mbres_wget (uaecptr) REGPARAM;
                    128: static uae_u32 mbres_bget (uaecptr) REGPARAM;
                    129: static void mbres_lput (uaecptr, uae_u32) REGPARAM;
                    130: static void mbres_wput (uaecptr, uae_u32) REGPARAM;
                    131: static void mbres_bput (uaecptr, uae_u32) REGPARAM;
                    132: static int mbres_check (uaecptr addr, uae_u32 size) REGPARAM;
1.1.1.3   root      133: 
                    134: static int mbres_val = 0;
                    135: 
1.1.1.4   root      136: uae_u32 REGPARAM2 mbres_lget (uaecptr addr)
1.1.1.3   root      137: {
1.1.1.4   root      138:     if (currprefs.illegal_mem)
                    139:        write_log ("Illegal lget at %08lx\n", addr);
                    140: 
1.1       root      141:     return 0;
                    142: }
                    143: 
1.1.1.4   root      144: uae_u32 REGPARAM2 mbres_wget (uaecptr addr)
1.1       root      145: {
1.1.1.4   root      146:     if (currprefs.illegal_mem)
                    147:        write_log ("Illegal wget at %08lx\n", addr);
                    148: 
1.1       root      149:     return 0;
                    150: }
                    151: 
1.1.1.4   root      152: uae_u32 REGPARAM2 mbres_bget (uaecptr addr)
1.1.1.3   root      153: {
1.1.1.4   root      154:     if (currprefs.illegal_mem)
                    155:        write_log ("Illegal bget at %08lx\n", addr);
                    156: 
1.1.1.3   root      157:     return (addr & 0xFFFF) == 3 ? mbres_val : 0;
                    158: }
                    159: 
1.1.1.4   root      160: void REGPARAM2 mbres_lput (uaecptr addr, uae_u32 l)
1.1       root      161: {
1.1.1.4   root      162:     if (currprefs.illegal_mem)
                    163:        write_log ("Illegal lput at %08lx\n", addr);
1.1       root      164: }
1.1.1.4   root      165: void REGPARAM2 mbres_wput (uaecptr addr, uae_u32 w)
1.1       root      166: {
1.1.1.4   root      167:     if (currprefs.illegal_mem)
                    168:        write_log ("Illegal wput at %08lx\n", addr);
1.1       root      169: }
1.1.1.4   root      170: void REGPARAM2 mbres_bput (uaecptr addr, uae_u32 b)
1.1       root      171: {
1.1.1.4   root      172:     if (currprefs.illegal_mem)
                    173:        write_log ("Illegal bput at %08lx\n", addr);
                    174: 
1.1.1.3   root      175:     if ((addr & 0xFFFF) == 3)
                    176:        mbres_val = b;
1.1       root      177: }
                    178: 
1.1.1.4   root      179: int REGPARAM2 mbres_check (uaecptr addr, uae_u32 size)
1.1       root      180: {
1.1.1.4   root      181:     if (currprefs.illegal_mem)
                    182:        write_log ("Illegal check at %08lx\n", addr);
                    183: 
1.1       root      184:     return 0;
                    185: }
                    186: 
                    187: /* Chip memory */
                    188: 
1.1.1.3   root      189: uae_u8 *chipmemory;
1.1       root      190: 
1.1.1.4   root      191: static int chipmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    192: static uae_u8 *chipmem_xlate (uaecptr addr) REGPARAM;
1.1       root      193: 
1.1.1.4   root      194: uae_u32 REGPARAM2 chipmem_lget (uaecptr addr)
1.1       root      195: {
1.1.1.3   root      196:     uae_u32 *m;
1.1       root      197:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      198:     addr &= chipmem_mask;
1.1.1.3   root      199:     m = (uae_u32 *)(chipmemory + addr);
1.1.1.5   root      200:     return do_get_mem_long (m);
1.1       root      201: }
                    202: 
1.1.1.4   root      203: uae_u32 REGPARAM2 chipmem_wget (uaecptr addr)
1.1       root      204: {
1.1.1.3   root      205:     uae_u16 *m;
1.1       root      206:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      207:     addr &= chipmem_mask;
1.1.1.3   root      208:     m = (uae_u16 *)(chipmemory + addr);
1.1.1.5   root      209:     return do_get_mem_word (m);
1.1       root      210: }
                    211: 
1.1.1.4   root      212: uae_u32 REGPARAM2 chipmem_bget (uaecptr addr)
1.1       root      213: {
                    214:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      215:     addr &= chipmem_mask;
1.1       root      216:     return chipmemory[addr];
                    217: }
                    218: 
1.1.1.4   root      219: void REGPARAM2 chipmem_lput (uaecptr addr, uae_u32 l)
1.1       root      220: {
1.1.1.3   root      221:     uae_u32 *m;
1.1       root      222:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      223:     addr &= chipmem_mask;
1.1.1.3   root      224:     m = (uae_u32 *)(chipmemory + addr);
1.1.1.5   root      225:     do_put_mem_long (m, l);
1.1       root      226: }
                    227: 
1.1.1.4   root      228: void REGPARAM2 chipmem_wput (uaecptr addr, uae_u32 w)
1.1       root      229: {
1.1.1.3   root      230:     uae_u16 *m;
1.1       root      231:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      232:     addr &= chipmem_mask;
1.1.1.3   root      233:     m = (uae_u16 *)(chipmemory + addr);
1.1.1.5   root      234:     do_put_mem_word (m, w);
1.1       root      235: }
                    236: 
1.1.1.4   root      237: void REGPARAM2 chipmem_bput (uaecptr addr, uae_u32 b)
1.1       root      238: {
                    239:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      240:     addr &= chipmem_mask;
1.1       root      241:     chipmemory[addr] = b;
                    242: }
                    243: 
1.1.1.4   root      244: int REGPARAM2 chipmem_check (uaecptr addr, uae_u32 size)
1.1       root      245: {
                    246:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      247:     addr &= chipmem_mask;
1.1.1.4   root      248:     return (addr + size) <= allocated_chipmem;
1.1       root      249: }
                    250: 
1.1.1.4   root      251: uae_u8 REGPARAM2 *chipmem_xlate (uaecptr addr)
1.1       root      252: {
                    253:     addr -= chipmem_start & chipmem_mask;
1.1.1.2   root      254:     addr &= chipmem_mask;
1.1       root      255:     return chipmemory + addr;
                    256: }
                    257: 
                    258: /* Slow memory */
                    259: 
1.1.1.3   root      260: static uae_u8 *bogomemory;
1.1       root      261: 
1.1.1.4   root      262: static uae_u32 bogomem_lget (uaecptr) REGPARAM;
                    263: static uae_u32 bogomem_wget (uaecptr) REGPARAM;
                    264: static uae_u32 bogomem_bget (uaecptr) REGPARAM;
                    265: static void bogomem_lput (uaecptr, uae_u32) REGPARAM;
                    266: static void bogomem_wput (uaecptr, uae_u32) REGPARAM;
                    267: static void bogomem_bput (uaecptr, uae_u32) REGPARAM;
                    268: static int bogomem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    269: static uae_u8 *bogomem_xlate (uaecptr addr) REGPARAM;
1.1       root      270: 
1.1.1.4   root      271: uae_u32 REGPARAM2 bogomem_lget (uaecptr addr)
1.1       root      272: {
1.1.1.3   root      273:     uae_u32 *m;
1.1       root      274:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      275:     addr &= bogomem_mask;
1.1.1.3   root      276:     m = (uae_u32 *)(bogomemory + addr);
1.1.1.5   root      277:     return do_get_mem_long (m);
1.1       root      278: }
                    279: 
1.1.1.4   root      280: uae_u32 REGPARAM2 bogomem_wget (uaecptr addr)
1.1       root      281: {
1.1.1.3   root      282:     uae_u16 *m;
1.1       root      283:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      284:     addr &= bogomem_mask;
1.1.1.3   root      285:     m = (uae_u16 *)(bogomemory + addr);
1.1.1.5   root      286:     return do_get_mem_word (m);
1.1       root      287: }
                    288: 
1.1.1.4   root      289: uae_u32 REGPARAM2 bogomem_bget (uaecptr addr)
1.1       root      290: {
                    291:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      292:     addr &= bogomem_mask;
1.1       root      293:     return bogomemory[addr];
                    294: }
                    295: 
1.1.1.4   root      296: void REGPARAM2 bogomem_lput (uaecptr addr, uae_u32 l)
1.1       root      297: {
1.1.1.3   root      298:     uae_u32 *m;
1.1       root      299:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      300:     addr &= bogomem_mask;
1.1.1.3   root      301:     m = (uae_u32 *)(bogomemory + addr);
1.1.1.5   root      302:     do_put_mem_long (m, l);
1.1       root      303: }
                    304: 
1.1.1.4   root      305: void REGPARAM2 bogomem_wput (uaecptr addr, uae_u32 w)
1.1       root      306: {
1.1.1.3   root      307:     uae_u16 *m;
1.1       root      308:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      309:     addr &= bogomem_mask;
1.1.1.3   root      310:     m = (uae_u16 *)(bogomemory + addr);
1.1.1.5   root      311:     do_put_mem_word (m, w);
1.1       root      312: }
                    313: 
1.1.1.4   root      314: void REGPARAM2 bogomem_bput (uaecptr addr, uae_u32 b)
1.1       root      315: {
                    316:     addr -= bogomem_start & bogomem_mask;
1.1.1.2   root      317:     addr &= bogomem_mask;
1.1       root      318:     bogomemory[addr] = b;
                    319: }
                    320: 
1.1.1.4   root      321: int REGPARAM2 bogomem_check (uaecptr addr, uae_u32 size)
1.1       root      322: {
1.1.1.2   root      323:     addr -= bogomem_start & bogomem_mask;
                    324:     addr &= bogomem_mask;
1.1.1.4   root      325:     return (addr + size) <= allocated_bogomem;
1.1       root      326: }
                    327: 
1.1.1.4   root      328: uae_u8 REGPARAM2 *bogomem_xlate (uaecptr addr)
1.1       root      329: {
1.1.1.2   root      330:     addr -= bogomem_start & bogomem_mask;
                    331:     addr &= bogomem_mask;
1.1       root      332:     return bogomemory + addr;
                    333: }
                    334: 
1.1.1.3   root      335: /* A3000 motherboard fast memory */
                    336: 
                    337: static uae_u8 *a3000memory;
1.1       root      338: 
1.1.1.4   root      339: static uae_u32 a3000mem_lget (uaecptr) REGPARAM;
                    340: static uae_u32 a3000mem_wget (uaecptr) REGPARAM;
                    341: static uae_u32 a3000mem_bget (uaecptr) REGPARAM;
                    342: static void a3000mem_lput (uaecptr, uae_u32) REGPARAM;
                    343: static void a3000mem_wput (uaecptr, uae_u32) REGPARAM;
                    344: static void a3000mem_bput (uaecptr, uae_u32) REGPARAM;
                    345: static int a3000mem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    346: static uae_u8 *a3000mem_xlate (uaecptr addr) REGPARAM;
1.1.1.3   root      347: 
1.1.1.4   root      348: uae_u32 REGPARAM2 a3000mem_lget (uaecptr addr)
1.1.1.3   root      349: {
                    350:     uae_u32 *m;
                    351:     addr -= a3000mem_start & a3000mem_mask;
                    352:     addr &= a3000mem_mask;
                    353:     m = (uae_u32 *)(a3000memory + addr);
1.1.1.5   root      354:     return do_get_mem_long (m);
1.1.1.3   root      355: }
1.1       root      356: 
1.1.1.4   root      357: uae_u32 REGPARAM2 a3000mem_wget (uaecptr addr)
1.1.1.3   root      358: {
                    359:     uae_u16 *m;
                    360:     addr -= a3000mem_start & a3000mem_mask;
                    361:     addr &= a3000mem_mask;
                    362:     m = (uae_u16 *)(a3000memory + addr);
1.1.1.5   root      363:     return do_get_mem_word (m);
1.1.1.3   root      364: }
1.1       root      365: 
1.1.1.4   root      366: uae_u32 REGPARAM2 a3000mem_bget (uaecptr addr)
1.1       root      367: {
1.1.1.3   root      368:     addr -= a3000mem_start & a3000mem_mask;
                    369:     addr &= a3000mem_mask;
                    370:     return a3000memory[addr];
1.1       root      371: }
                    372: 
1.1.1.4   root      373: void REGPARAM2 a3000mem_lput (uaecptr addr, uae_u32 l)
1.1       root      374: {
1.1.1.3   root      375:     uae_u32 *m;
                    376:     addr -= a3000mem_start & a3000mem_mask;
                    377:     addr &= a3000mem_mask;
                    378:     m = (uae_u32 *)(a3000memory + addr);
1.1.1.5   root      379:     do_put_mem_long (m, l);
1.1.1.3   root      380: }
                    381: 
1.1.1.4   root      382: void REGPARAM2 a3000mem_wput (uaecptr addr, uae_u32 w)
1.1.1.3   root      383: {
                    384:     uae_u16 *m;
                    385:     addr -= a3000mem_start & a3000mem_mask;
                    386:     addr &= a3000mem_mask;
                    387:     m = (uae_u16 *)(a3000memory + addr);
1.1.1.5   root      388:     do_put_mem_word (m, w);
1.1.1.3   root      389: }
                    390: 
1.1.1.4   root      391: void REGPARAM2 a3000mem_bput (uaecptr addr, uae_u32 b)
1.1.1.3   root      392: {
                    393:     addr -= a3000mem_start & a3000mem_mask;
                    394:     addr &= a3000mem_mask;
                    395:     a3000memory[addr] = b;
                    396: }
                    397: 
1.1.1.4   root      398: int REGPARAM2 a3000mem_check (uaecptr addr, uae_u32 size)
1.1.1.3   root      399: {
                    400:     addr -= a3000mem_start & a3000mem_mask;
                    401:     addr &= a3000mem_mask;
1.1.1.4   root      402:     return (addr + size) <= allocated_a3000mem;
1.1       root      403: }
                    404: 
1.1.1.3   root      405: uae_u8 REGPARAM2 *a3000mem_xlate(uaecptr addr)
                    406: {
                    407:     addr -= a3000mem_start & a3000mem_mask;
                    408:     addr &= a3000mem_mask;
                    409:     return a3000memory + addr;
                    410: }
                    411: 
                    412: /* Kick memory */
                    413: 
                    414: uae_u8 *kickmemory;
                    415: 
1.1.1.4   root      416: static uae_u32 kickmem_lget (uaecptr) REGPARAM;
                    417: static uae_u32 kickmem_wget (uaecptr) REGPARAM;
                    418: static uae_u32 kickmem_bget (uaecptr) REGPARAM;
                    419: static void  kickmem_lput (uaecptr, uae_u32) REGPARAM;
                    420: static void  kickmem_wput (uaecptr, uae_u32) REGPARAM;
                    421: static void  kickmem_bput (uaecptr, uae_u32) REGPARAM;
                    422: static int  kickmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    423: static uae_u8 *kickmem_xlate (uaecptr addr) REGPARAM;
1.1.1.3   root      424: 
1.1.1.4   root      425: uae_u32 REGPARAM2 kickmem_lget (uaecptr addr)
1.1       root      426: {
1.1.1.3   root      427:     uae_u32 *m;
1.1       root      428:     addr -= kickmem_start & kickmem_mask;
1.1.1.2   root      429:     addr &= kickmem_mask;
1.1.1.3   root      430:     m = (uae_u32 *)(kickmemory + addr);
1.1.1.5   root      431:     return do_get_mem_long (m);
1.1       root      432: }
                    433: 
1.1.1.4   root      434: uae_u32 REGPARAM2 kickmem_wget (uaecptr addr)
1.1       root      435: {
1.1.1.3   root      436:     uae_u16 *m;
1.1       root      437:     addr -= kickmem_start & kickmem_mask;
1.1.1.2   root      438:     addr &= kickmem_mask;
1.1.1.3   root      439:     m = (uae_u16 *)(kickmemory + addr);
1.1.1.5   root      440:     return do_get_mem_word (m);
1.1       root      441: }
                    442: 
1.1.1.4   root      443: uae_u32 REGPARAM2 kickmem_bget (uaecptr addr)
1.1       root      444: {
                    445:     addr -= kickmem_start & kickmem_mask;
1.1.1.2   root      446:     addr &= kickmem_mask;
1.1       root      447:     return kickmemory[addr];
                    448: }
                    449: 
1.1.1.4   root      450: void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b)
1.1       root      451: {
1.1.1.4   root      452:     if (currprefs.illegal_mem)
                    453:        write_log ("Illegal kickmem lput at %08lx\n", addr);
1.1       root      454: }
                    455: 
1.1.1.4   root      456: void REGPARAM2 kickmem_wput (uaecptr addr, uae_u32 b)
1.1       root      457: {
1.1.1.4   root      458:     if (currprefs.illegal_mem)
                    459:        write_log ("Illegal kickmem wput at %08lx\n", addr);
1.1       root      460: }
                    461: 
1.1.1.4   root      462: void REGPARAM2 kickmem_bput (uaecptr addr, uae_u32 b)
1.1       root      463: {
1.1.1.4   root      464:     if (currprefs.illegal_mem)
                    465:        write_log ("Illegal kickmem lput at %08lx\n", addr);
1.1       root      466: }
                    467: 
1.1.1.4   root      468: int REGPARAM2 kickmem_check (uaecptr addr, uae_u32 size)
1.1       root      469: {
1.1.1.2   root      470:     addr -= kickmem_start & kickmem_mask;
                    471:     addr &= kickmem_mask;
1.1.1.4   root      472:     return (addr + size) <= kickmem_size;
1.1       root      473: }
                    474: 
1.1.1.4   root      475: uae_u8 REGPARAM2 *kickmem_xlate (uaecptr addr)
1.1       root      476: {
1.1.1.2   root      477:     addr -= kickmem_start & kickmem_mask;
                    478:     addr &= kickmem_mask;
1.1       root      479:     return kickmemory + addr;
                    480: }
                    481: 
1.1.1.3   root      482: /* Default memory access functions */
                    483: 
1.1.1.4   root      484: int REGPARAM2 default_check (uaecptr a, uae_u32 b)
1.1.1.3   root      485: {
                    486:     return 0;
                    487: }
                    488: 
1.1.1.4   root      489: uae_u8 REGPARAM2 *default_xlate (uaecptr a)
1.1.1.3   root      490: {
                    491:     write_log ("Your Amiga program just did something terribly stupid\n");
                    492:     uae_reset();
                    493:     return kickmem_xlate (get_long (0xF80000)); /* So we don't crash. */
                    494: }
                    495: 
1.1.1.4   root      496: static int load_kickstart (void)
1.1       root      497: {
                    498:     int i;
1.1.1.3   root      499:     uae_u32 cksum = 0, prevck = 0;
                    500:     unsigned char buffer[20];
                    501: 
1.1.1.6   root      502:     FILE *f = zfile_open (currprefs.romfile, "rb");
1.1.1.3   root      503: 
                    504:     if (f == NULL) {
                    505:        write_log ("No Kickstart ROM found.\n");
1.1.1.6   root      506: #if defined AMIGA || defined __POS__
1.1.1.2   root      507: #define USE_UAE_ERSATZ "USE_UAE_ERSATZ"
1.1.1.6   root      508:        if (!getenv (USE_UAE_ERSATZ)) {
                    509:            fprintf (stderr, "Using current ROM. (create ENV:%s to "
                    510:                     "use uae's ROM replacement)\n", USE_UAE_ERSATZ);
                    511:            memcpy (kickmemory, (char*)0x1000000 - kickmem_size, kickmem_size);
1.1.1.2   root      512:            goto chk_sum;
                    513:        }
                    514: #endif
1.1       root      515:        return 0;
                    516:     }
1.1.1.3   root      517: 
                    518:     i = fread (buffer, 1, 11, f);
                    519:     if (strncmp ((char *)buffer, "AMIROMTYPE1", 11) != 0)
                    520:        fseek (f, 0, SEEK_SET);
                    521: 
                    522:     i = fread (kickmemory, 1, kickmem_size, f);
1.1       root      523:     if (i == kickmem_size/2) {
                    524:        memcpy (kickmemory + kickmem_size/2, kickmemory, kickmem_size/2);
                    525:     } else if (i != kickmem_size) {
1.1.1.3   root      526:        write_log ("Error while reading Kickstart.\n");
1.1       root      527:        return 0;
                    528:     }
                    529:     zfile_close (f);
1.1.1.3   root      530: 
                    531:     cloanto_rom = 0;
                    532:     if (strncmp ((char *)buffer, "AMIROMTYPE1", 11) == 0) {
                    533:        FILE *keyf;
                    534:        uae_u8 *p;
                    535:        long size, cnt, t;
                    536: 
                    537:        cloanto_rom = 1;
                    538:        write_log ("ROM image is an encrypted \"Amiga Forever\" ROM file.\n");
1.1.1.6   root      539:        if (strlen (currprefs.keyfile) == 0) {
1.1.1.3   root      540:            write_log ("No filename given for ROM key file.\n");
                    541:            return 0;
                    542:        }
1.1.1.6   root      543:        keyf = zfile_open (currprefs.keyfile, "rb");
1.1.1.3   root      544:        if (keyf == 0) {
                    545:            write_log ("Could not find ROM key file.\n");
                    546:            return 0;
                    547:        }
                    548:        p = (uae_u8 *)xmalloc (524288);
                    549:        size = fread (p, 1, 524288, keyf);
                    550: 
                    551:        for (t = cnt = 0; cnt < kickmem_size; cnt++, t = (t + 1) % size) {
                    552:            kickmemory[cnt] ^= p[t];
                    553:            if (i == cnt+1)
                    554:                t = size-1;
                    555:        }
                    556:        fclose (keyf);
                    557:        free (p);
                    558:     }
1.1.1.2   root      559: #if defined(AMIGA)
                    560:     chk_sum:
                    561: #endif
                    562: 
1.1       root      563:     for (i = 0; i < kickmem_size; i+=4) {
1.1.1.3   root      564:        uae_u32 data = kickmemory[i]*65536*256 + kickmemory[i+1]*65536 + kickmemory[i+2]*256 + kickmemory[i+3];
1.1       root      565:        cksum += data;
                    566:        if (cksum < prevck)
                    567:            cksum++;
                    568:        prevck = cksum;
                    569:     }
1.1.1.2   root      570:     if (cksum != 0xFFFFFFFFul) {
1.1.1.4   root      571:        write_log ("Kickstart checksum incorrect. You probably have a corrupted ROM image.\n");
1.1       root      572:     }
                    573:     return 1;
                    574: }
                    575: 
                    576: /* Address banks */
                    577: 
                    578: addrbank dummy_bank = {
                    579:     dummy_lget, dummy_wget, dummy_bget,
                    580:     dummy_lput, dummy_wput, dummy_bput,
                    581:     default_xlate, dummy_check
                    582: };
                    583: 
1.1.1.3   root      584: addrbank mbres_bank = {
                    585:     mbres_lget, mbres_wget, mbres_bget,
                    586:     mbres_lput, mbres_wput, mbres_bput,
                    587:     default_xlate, mbres_check
                    588: };
                    589: 
1.1       root      590: addrbank chipmem_bank = {
                    591:     chipmem_lget, chipmem_wget, chipmem_bget,
                    592:     chipmem_lput, chipmem_wput, chipmem_bput,
                    593:     chipmem_xlate, chipmem_check
                    594: };
                    595: 
                    596: addrbank bogomem_bank = {
                    597:     bogomem_lget, bogomem_wget, bogomem_bget,
                    598:     bogomem_lput, bogomem_wput, bogomem_bput,
                    599:     bogomem_xlate, bogomem_check
                    600: };
                    601: 
1.1.1.3   root      602: addrbank a3000mem_bank = {
                    603:     a3000mem_lget, a3000mem_wget, a3000mem_bget,
                    604:     a3000mem_lput, a3000mem_wput, a3000mem_bput,
                    605:     a3000mem_xlate, a3000mem_check
                    606: };
                    607: 
1.1       root      608: addrbank kickmem_bank = {
                    609:     kickmem_lget, kickmem_wget, kickmem_bget,
                    610:     kickmem_lput, kickmem_wput, kickmem_bput,
                    611:     kickmem_xlate, kickmem_check
                    612: };
                    613: 
                    614: char *address_space, *good_address_map;
                    615: int good_address_fd;
1.1.1.4   root      616: 
                    617: static void init_mem_banks (void)
                    618: {
                    619:     int i;
                    620:     for (i = 0; i < 65536; i++)
                    621:        put_mem_bank (i<<16, &dummy_bank);
                    622: }
                    623: 
1.1.1.2   root      624: #define MAKE_USER_PROGRAMS_BEHAVE 1
1.1.1.4   root      625: void memory_init (void)
1.1       root      626: {
                    627:     char buffer[4096];
                    628:     char *nam;
                    629:     int i, fd;
1.1.1.3   root      630:     int custom_start;
1.1       root      631: 
1.1.1.4   root      632:     allocated_chipmem = currprefs.chipmem_size;
                    633:     allocated_bogomem = currprefs.bogomem_size;
                    634:     allocated_a3000mem = currprefs.a3000mem_size;
1.1.1.3   root      635: 
1.1.1.2   root      636: #ifdef USE_MAPPED_MEMORY
1.1.1.4   root      637:     fd = open ("/dev/zero", O_RDWR);
                    638:     good_address_map = mmap (NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
1.1.1.2   root      639:     /* Don't believe USER_PROGRAMS_BEHAVE. Otherwise, we'd segfault as soon
                    640:      * as a decrunch routine tries to do color register hacks. */
1.1.1.4   root      641:     address_space = mmap (NULL, 1 << 24, PROT_READ | (USER_PROGRAMS_BEHAVE || MAKE_USER_PROGRAMS_BEHAVE? PROT_WRITE : 0), MAP_PRIVATE, fd, 0);
1.1.1.2   root      642:     if ((int)address_space < 0 || (int)good_address_map < 0) {
1.1.1.3   root      643:        write_log ("Your system does not have enough virtual memory - increase swap.\n");
1.1.1.4   root      644:        abort ();
1.1.1.2   root      645:     }
                    646: #ifdef MAKE_USER_PROGRAMS_BEHAVE
1.1.1.4   root      647:     memset (address_space + 0xDFF180, 0xFF, 32*2);
1.1.1.2   root      648: #else
                    649:     /* Likewise. This is mostly for mouse button checks. */
                    650:     if (USER_PROGRAMS_BEHAVE)
1.1.1.4   root      651:        memset (address_space + 0xA00000, 0xFF, 0xF00000 - 0xA00000);
1.1.1.2   root      652: #endif
1.1.1.4   root      653:     chipmemory = mmap (address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0);
                    654:     kickmemory = mmap (address_space + 0xF80000, 0x80000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0);
1.1       root      655: 
                    656:     close(fd);
                    657: 
1.1.1.4   root      658:     good_address_fd = open (nam = tmpnam (NULL), O_CREAT|O_RDWR, 0600);
1.1.1.3   root      659:     memset (buffer, 1, sizeof(buffer));
                    660:     write (good_address_fd, buffer, sizeof buffer);
                    661:     unlink (nam);
1.1       root      662: 
1.1.1.4   root      663:     for (i = 0; i < allocated_chipmem; i += 4096)
                    664:        mmap (good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE,
                    665:              good_address_fd, 0);
1.1       root      666:     for (i = 0; i < kickmem_size; i += 4096)
1.1.1.4   root      667:        mmap (good_address_map + i + 0x1000000 - kickmem_size, 4096, PROT_READ,
                    668:              MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
1.1       root      669: #else
1.1.1.4   root      670:     kickmemory = (uae_u8 *)xmalloc (kickmem_size);
                    671:     chipmemory = (uae_u8 *)malloc (allocated_chipmem);
1.1.1.3   root      672: 
1.1.1.4   root      673:     while (! chipmemory && allocated_chipmem > 512*1024) {
                    674:        allocated_chipmem >>= 1;
                    675:        chipmemory = (uae_u8 *)malloc (allocated_chipmem);
1.1.1.3   root      676:        if (chipmemory)
1.1.1.4   root      677:            fprintf (stderr, "Reducing chipmem size to %dkb\n", allocated_chipmem >> 10);
1.1.1.3   root      678:     }
1.1.1.4   root      679:     if (! chipmemory) {
1.1.1.3   root      680:        write_log ("virtual memory exhausted (chipmemory)!\n");
1.1.1.4   root      681:        abort ();
1.1.1.2   root      682:     }
1.1       root      683: #endif
1.1.1.6   root      684: 
                    685:     do_put_mem_long ((uae_u32 *)(chipmemory + 4), 0);
1.1.1.4   root      686:     init_mem_banks ();
1.1.1.3   root      687: 
1.1       root      688:     /* Map the chipmem into all of the lower 16MB */
1.1.1.3   root      689:     map_banks (&chipmem_bank, 0x00, 256);
                    690:     custom_start = 0xC0;
1.1       root      691: 
1.1.1.3   root      692:     map_banks (&custom_bank, custom_start, 0xE0-custom_start);
                    693:     map_banks (&cia_bank, 0xA0, 32);
                    694:     map_banks (&clock_bank, 0xDC, 1);
                    695: 
                    696:     /* @@@ Does anyone have a clue what should be in the 0x200000 - 0xA00000
                    697:      * range on an Amiga without expansion memory?  */
1.1.1.4   root      698:     custom_start = allocated_chipmem >> 16;
1.1.1.3   root      699:     if (custom_start < 0x20)
                    700:        custom_start = 0x20;
                    701:     map_banks (&dummy_bank, custom_start, 0xA0 - custom_start);
                    702:     /*map_banks (&mbres_bank, 0xDE, 1);*/
                    703: 
1.1.1.4   root      704:     if (allocated_bogomem > 0)
                    705:        bogomemory = (uae_u8 *)xmalloc (allocated_bogomem);
                    706:     if (bogomemory != 0)
                    707:        map_banks (&bogomem_bank, 0xC0, allocated_bogomem >> 16);
                    708:     else
                    709:        allocated_bogomem = 0;
                    710: 
                    711:     if (allocated_a3000mem > 0)
                    712:        a3000memory = (uae_u8 *)xmalloc (allocated_a3000mem);
                    713:     if (a3000memory != 0)
                    714:        map_banks (&a3000mem_bank, a3000mem_start >> 16, allocated_a3000mem >> 16);
                    715:     else
                    716:        allocated_a3000mem = 0;
1.1.1.3   root      717: 
                    718:     map_banks (&rtarea_bank, 0xF0, 1);
1.1.1.4   root      719:     if (! load_kickstart ()) {
1.1.1.3   root      720:        init_ersatz_rom (kickmemory);
1.1       root      721:        ersatzkickfile = 1;
                    722:     }
1.1.1.3   root      723:     map_banks (&kickmem_bank, 0xF8, 8);
                    724:     map_banks (&expamem_bank, 0xE8, 1);
                    725: 
                    726:     if (cloanto_rom)
                    727:        map_banks (&kickmem_bank, 0xE0, 8);
1.1.1.4   root      728: 
                    729:     chipmem_mask = allocated_chipmem- 1;
                    730:     kickmem_mask = kickmem_size - 1;
                    731:     bogomem_mask = allocated_bogomem - 1;
                    732:     a3000mem_mask = allocated_a3000mem - 1;
                    733: 
1.1       root      734: }
                    735: 
1.1.1.4   root      736: void map_banks (addrbank *bank, int start, int size)
1.1       root      737: {
                    738:     int bnr;
1.1.1.3   root      739:     unsigned long int hioffs = 0, endhioffs = 0x100;
                    740: 
                    741:     if (start >= 0x100) {
                    742:        for (bnr = start; bnr < start + size; bnr++)
                    743:            put_mem_bank (bnr << 16, bank);
                    744:        return;
                    745:     }
                    746:     /* Some '020 Kickstarts apparently require a 24 bit address space... */
                    747:     if (currprefs.address_space_24)
                    748:        endhioffs = 0x10000;
                    749:     for (hioffs = 0; hioffs < endhioffs; hioffs += 0x100)
                    750:        for (bnr = start; bnr < start+size; bnr++)
1.1.1.5   root      751:            put_mem_bank ((bnr + hioffs) << 16, bank);
1.1       root      752: }

unix.superglobalmegacorp.com

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