Annotation of previous/src/cpu/memory.c, revision 1.1.1.3

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator - CPU core
                      3:   *
                      4:   * Memory management
                      5:   *
                      6:   * (c) 1995 Bernd Schmidt
                      7:   *
                      8:   * Adaptation to Hatari by Thomas Huth
                      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.
                     12:   */
                     13: const char Memory_fileid[] = "Hatari memory.c : " __DATE__ " " __TIME__;
                     14: 
                     15: #include "config.h"
                     16: #include "sysdeps.h"
                     17: #include "hatari-glue.h"
                     18: #include "maccess.h"
                     19: #include "memory.h"
                     20: 
                     21: #include "main.h"
                     22: #include "ioMem.h"
                     23: #include "reset.h"
                     24: #include "nextMemory.h"
                     25: #include "m68000.h"
                     26: #include "configuration.h"
                     27: 
                     28: #include "newcpu.h"
                     29: 
                     30: 
                     31: /* Set illegal_mem to 1 for debug output: */
                     32: #define illegal_mem 1
                     33: 
1.1.1.2   root       34: #define illegal_trace(s) {static int count=0; if (count++<50) { s; }}
1.1       root       35: 
                     36: /*
                     37:  approximative next memory map (source netbsd/next68k file cpu.h)
                     38:  
                     39:  EPROM 128k (>cube 040)
                     40:  0x00000000-0x0001FFFF
                     41:  mirrored at
                     42:  0x01000000-0x0101FFFF
                     43:  
                     44:  RAM (16x4=64Mb max)
                     45:  0x04000000-0x07FFFFFF (0x047FFFFF for 8Mb)
                     46:  
                     47:  device
                     48:  0x02000000-0x0201BFFF
                     49:  mirrored at
                     50:  0x02100000-0x0211BFFF
                     51:  
                     52:  SCREEN
                     53:  0x0B000000-0x0B03A7FF
                     54:  
                     55:  */
                     56: #define NEXT_EPROM_START       0x00000000
                     57: #define NEXT_EPROM2_START      0x01000000
                     58: #define ROMmem_mask                    0x0001FFFF
                     59: #define        ROMmem_size                     0x00020000
                     60: #define NEXT_EPROM_SIZE                0x00020000
                     61: 
                     62: // ram is flat?
1.1.1.2   root       63: /* Main memory */
                     64: /* Main memory constants */
1.1       root       65: #define NEXT_RAM_START         0x04000000
                     66: #define NEXT_RAM_SPACE         0x40000000
1.1.1.2   root       67: #define N_BANKS             4
1.1       root       68: 
1.1.1.2   root       69: /* Main memory variables (machine dependent) */
                     70: uae_u32 NEXT_RAM_SIZE; //              0x04000000
1.1       root       71: uae_u32        NEXTmem_size; // unused
1.1.1.2   root       72: uae_u32 NEXTmem_mask; //               0x03FFFFFF
                     73: uae_u8 bankshift;
                     74: 
                     75: /* Video memory for monochrome systems */
1.1       root       76: #define NEXT_SCREEN                    0x0B000000
1.1.1.3 ! root       77: #define NEXT_SCREEN_TURBO                      0x0C000000
1.1       root       78: #define NEXT_SCREEN_SIZE       0x00040000
                     79: #define NEXTvideo_size NEXT_SCREEN_SIZE
                     80: #define NEXTvideo_mask         0x0003FFFF
                     81: uae_u8  NEXTVideo[256*1024];
                     82: 
1.1.1.2   root       83: /* Video memory for color systems */
                     84: #define NEXT_COLORSCREEN    0x2C000000
                     85: #define NEXT_COLORSCREEN_SIZE 0x00200000
                     86: #define NEXTcolorvideo_size NEXT_COLORSCREEN_SIZE
                     87: #define NEXTcolorvideo_mask 0x001FFFFF
                     88: uae_u8 NEXTColorVideo[2*1024*1024];
1.1       root       89: 
                     90: 
                     91: #define IOmem_mask                     0x0001FFFF
                     92: #define        IOmem_size                      0x0001C000
1.1.1.2   root       93: #define NEXT_IO_START          0x02000000  /* IO for 68030 based NeXT Computer */
                     94: #define NEXT_IO2_START         0x02100000  /* additional IO for 68040 based systems */
                     95: #define NEXT_IO3_START      0x02200000  /* additional IO for turbo systems */
1.1       root       96: #define NEXT_IO_SIZE           0x00020000
                     97: 
                     98: #define NEXT_BMAP_START                0x020C0000
1.1.1.3 ! root       99: #define NEXT_BMAP2_START    0x820C0000
1.1       root      100: #define NEXT_BMAP_SIZE         0x10000
                    101: #define        NEXTbmap_size           NEXT_BMAP_SIZE
                    102: #define        NEXTbmap_mask           0x0000FFFF
                    103: uae_u8  NEXTbmap[NEXT_BMAP_SIZE];
                    104: 
                    105: #define NEXT_X06_START         0x06000000
                    106: #define NEXT_X06_SIZE          0x10000
                    107: #define        NEXTx06_size            NEXT_X06_SIZE
                    108: #define        NEXTx06_mask            0x0000FFFF
                    109: uae_u8  NEXTx06[NEXT_X06_SIZE];
                    110: 
                    111: 
                    112: #ifdef SAVE_MEMORY_BANKS
                    113: addrbank *mem_banks[65536];
                    114: #else
                    115: addrbank mem_banks[65536];
                    116: #endif
                    117: 
                    118: #ifdef NO_INLINE_MEMORY_ACCESS
                    119: __inline__ uae_u32 longget (uaecptr addr)
                    120: {
                    121:     return call_mem_get_func (get_mem_bank (addr).lget, addr);
                    122: }
                    123: __inline__ uae_u32 wordget (uaecptr addr)
                    124: {
                    125:     return call_mem_get_func (get_mem_bank (addr).wget, addr);
                    126: }
                    127: __inline__ uae_u32 byteget (uaecptr addr)
                    128: {
                    129:     return call_mem_get_func (get_mem_bank (addr).bget, addr);
                    130: }
                    131: __inline__ void longput (uaecptr addr, uae_u32 l)
                    132: {
                    133:     call_mem_put_func (get_mem_bank (addr).lput, addr, l);
                    134: }
                    135: __inline__ void wordput (uaecptr addr, uae_u32 w)
                    136: {
                    137:     call_mem_put_func (get_mem_bank (addr).wput, addr, w);
                    138: }
                    139: __inline__ void byteput (uaecptr addr, uae_u32 b)
                    140: {
                    141:     call_mem_put_func (get_mem_bank (addr).bput, addr, b);
                    142: }
                    143: #endif
                    144: 
                    145: 
                    146: /* Some prototypes: */
                    147: extern void SDL_Quit(void);
                    148: static int NEXTmem_check (uaecptr addr, uae_u32 size) REGPARAM;
                    149: static uae_u8 *NEXTmem_xlate (uaecptr addr) REGPARAM;
                    150: 
                    151: uae_u8 ce_banktype[65536];
                    152: uae_u8 ce_cachable[65536];
                    153: 
                    154: 
                    155: /* A dummy bank that only contains zeros */
                    156: 
                    157: static uae_u32 dummy_lget(uaecptr addr)
                    158: {
1.1.1.2   root      159:     illegal_trace(write_log ("Illegal lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      160:     return 0;
                    161: }
                    162: 
                    163: static uae_u32 dummy_wget(uaecptr addr)
                    164: {
1.1.1.2   root      165:     illegal_trace(write_log ("Illegal wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      166:     return 0;
                    167: }
                    168: 
                    169: static uae_u32 dummy_bget(uaecptr addr)
                    170: {
1.1.1.2   root      171:     illegal_trace(write_log ("Illegal bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      172:     return 0;
                    173: }
                    174: 
                    175: static void dummy_lput(uaecptr addr, uae_u32 l)
                    176: {
1.1.1.2   root      177:     illegal_trace(write_log ("Illegal lput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      178: }
                    179: 
                    180: static void dummy_wput(uaecptr addr, uae_u32 w)
                    181: {
1.1.1.2   root      182:     illegal_trace(write_log ("Illegal wput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      183: }
                    184: 
                    185: static void dummy_bput(uaecptr addr, uae_u32 b)
                    186: {
1.1.1.2   root      187:     illegal_trace(write_log ("Illegal bput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
1.1       root      188: }
                    189: 
                    190: static int dummy_check(uaecptr addr, uae_u32 size)
                    191: {
                    192:     return 0;
                    193: }
                    194: 
                    195: static uae_u8 *dummy_xlate(uaecptr addr)
                    196: {
1.1.1.2   root      197:     write_log("Your program just did something terribly stupid:"
1.1       root      198:               " dummy_xlate($%x)\n", addr);
1.1.1.2   root      199:     abort();
1.1       root      200: }
                    201: 
                    202: 
                    203: /* **** This memory bank only generates bus errors **** */
                    204: 
                    205: static uae_u32 BusErrMem_lget(uaecptr addr)
                    206: {
                    207:     if (illegal_mem)
                    208:        write_log ("Bus error lget at %08lx\n", (long)addr);
                    209: 
                    210:     M68000_BusError(addr, 1);
                    211:     return 0;
                    212: }
                    213: 
                    214: static uae_u32 BusErrMem_wget(uaecptr addr)
                    215: {
                    216:     if (illegal_mem)
                    217:        write_log ("Bus error wget at %08lx\n", (long)addr);
                    218: 
                    219:     M68000_BusError(addr, 1);
                    220:     return 0;
                    221: }
                    222: 
                    223: static uae_u32 BusErrMem_bget(uaecptr addr)
                    224: {
                    225:     if (illegal_mem)
                    226:        write_log ("Bus error bget at %08lx\n", (long)addr);
                    227: 
                    228:     M68000_BusError(addr, 1);
                    229:     return 0;
                    230: }
                    231: 
                    232: static void BusErrMem_lput(uaecptr addr, uae_u32 l)
                    233: {
                    234:     if (illegal_mem)
                    235:        write_log ("Bus error lput at %08lx\n", (long)addr);
                    236: 
                    237:     M68000_BusError(addr, 0);
                    238: }
                    239: 
                    240: static void BusErrMem_wput(uaecptr addr, uae_u32 w)
                    241: {
                    242:     if (illegal_mem)
                    243:        write_log ("Bus error wput at %08lx\n", (long)addr);
                    244: 
                    245:     M68000_BusError(addr, 0);
                    246: }
                    247: 
                    248: static void BusErrMem_bput(uaecptr addr, uae_u32 b)
                    249: {
                    250:     if (illegal_mem)
                    251:        write_log ("Bus error bput at %08lx\n", (long)addr);
                    252: 
                    253:     M68000_BusError(addr, 0);
                    254: }
                    255: 
                    256: static int BusErrMem_check(uaecptr addr, uae_u32 size)
                    257: {
                    258:     if (illegal_mem)
                    259:        write_log ("Bus error check at %08lx\n", (long)addr);
                    260: 
                    261:     return 0;
                    262: }
                    263: 
                    264: static uae_u8 *BusErrMem_xlate (uaecptr addr)
                    265: {
                    266:     write_log("Your NeXT program just did something terribly stupid:"
                    267:               " BusErrMem_xlate($%x)\n", addr);
                    268: 
1.1.1.2   root      269:     abort();
                    270:     M68000_BusError(addr,0);
1.1       root      271:     return NEXTmem_xlate(addr);  /* So we don't crash. */
                    272: }
                    273: 
                    274: 
                    275: /* **** NEXT RAM memory **** */
                    276: 
                    277: static uae_u32 NEXTmem_lget(uaecptr addr)
                    278: {
                    279:     addr &= NEXTmem_mask;
                    280:     return do_get_mem_long(NEXTRam + addr);
                    281: }
                    282: 
                    283: static uae_u32 NEXTmem_wget(uaecptr addr)
                    284: {
                    285:     addr &= NEXTmem_mask;
                    286:     return do_get_mem_word(NEXTRam + addr);
                    287: }
                    288: 
                    289: static uae_u32 NEXTmem_bget(uaecptr addr)
                    290: {
                    291:     addr &= NEXTmem_mask;
                    292:     return NEXTRam[addr];
                    293: }
                    294: 
                    295: static void NEXTmem_lput(uaecptr addr, uae_u32 l)
                    296: {
                    297:     addr &= NEXTmem_mask;
                    298:     do_put_mem_long(NEXTRam + addr, l);
                    299: }
                    300: 
                    301: static void NEXTmem_wput(uaecptr addr, uae_u32 w)
                    302: {
                    303:     addr &= NEXTmem_mask;
                    304:     do_put_mem_word(NEXTRam + addr, w);
                    305: }
                    306: 
                    307: static void NEXTmem_bput(uaecptr addr, uae_u32 b)
                    308: {
                    309:     addr &= NEXTmem_mask;
                    310:     NEXTRam[addr] = b;
                    311: }
                    312: 
                    313: static int NEXTmem_check(uaecptr addr, uae_u32 size)
                    314: {
1.1.1.2   root      315:     return (size) < NEXT_RAM_SIZE;
1.1       root      316: }
                    317: 
                    318: static uae_u8 *NEXTmem_xlate(uaecptr addr)
                    319: {
                    320:     addr &= NEXTmem_mask;
                    321:     return NEXTRam + addr;
                    322: }
                    323: 
1.1.1.2   root      324: 
                    325: /* **** NEXT RAM empty areas **** NEED TO CHECK: really do bus errors ??? **** */
                    326: 
                    327: static uae_u32 NEXTempty_lget(uaecptr addr)
                    328: {
                    329:     if (illegal_mem)
                    330:         write_log ("Empty mem area lget at %08lx\n", (long)addr);
                    331:     
1.1.1.3 ! root      332: //    M68000_BusError(addr, 1);
1.1.1.2   root      333:     return addr;
                    334: }
                    335: 
                    336: static uae_u32 NEXTempty_wget(uaecptr addr)
                    337: {
                    338:     if (illegal_mem)
                    339:         write_log ("Empty mem area wget at %08lx\n", (long)addr);
                    340:     
                    341:     M68000_BusError(addr, 1);
                    342:     return 0;
                    343: }
                    344: 
                    345: static uae_u32 NEXTempty_bget(uaecptr addr)
                    346: {
                    347:     if (illegal_mem)
                    348:         write_log ("Empty mem area bget at %08lx\n", (long)addr);
                    349:     
                    350:     M68000_BusError(addr, 1);
                    351:     return 0;
                    352: }
                    353: /*------------------- this part is experimental ---------------------*/
                    354: 
                    355: static void NEXTempty_lput(uaecptr addr, uae_u32 l)
                    356: {
                    357:     if (illegal_mem)
                    358:         write_log ("Empty mem area lput at %08lx\n", (long)addr);
1.1.1.3 ! root      359:         
1.1.1.2   root      360:     uae_u8 bank = ((addr-NEXT_RAM_START)>>bankshift)&0x3;
                    361:     
                    362:     if (MemBank_Size[bank]) {
                    363:         addr = (((addr%MemBank_Size[bank])+(bank<<bankshift))+NEXT_RAM_START)&NEXTmem_mask;
                    364:         do_put_mem_long(NEXTRam + addr, l);
                    365:     }
                    366: 
1.1.1.3 ! root      367: //    M68000_BusError(oldaddr, 0);
1.1.1.2   root      368: }
                    369: /*-------------------- end of experimental code ----------------------*/
                    370: 
                    371: static void NEXTempty_wput(uaecptr addr, uae_u32 w)
                    372: {
                    373:     if (illegal_mem)
                    374:         write_log ("Empty mem area wput at %08lx\n", (long)addr);
                    375:     
                    376:     M68000_BusError(addr, 0);
                    377: }
                    378: 
                    379: static void NEXTempty_bput(uaecptr addr, uae_u32 b)
                    380: {
                    381:     if (illegal_mem)
                    382:         write_log ("Empty mem area bput at %08lx\n", (long)addr);
                    383:     
                    384:     M68000_BusError(addr, 0);
                    385: }
                    386: 
                    387: static int NEXTempty_check(uaecptr addr, uae_u32 size)
                    388: {
                    389:     if (illegal_mem)
                    390:         write_log ("Empty mem area check at %08lx\n", (long)addr);
                    391:     
                    392:     return 0;
                    393: }
                    394: 
                    395: static uae_u8 *NEXTempty_xlate (uaecptr addr)
                    396: {
                    397:     write_log("Your NeXT program just did something terribly stupid:"
                    398:               " BusErrMem_xlate($%x)\n", addr);
                    399:     
                    400:     abort();
                    401:     M68000_BusError(addr,0);
                    402:     return NEXTmem_xlate(addr);  /* So we don't crash. */
                    403: }
                    404: 
                    405: 
1.1       root      406: /* bank2 */
                    407: 
                    408: static uae_u32 NEXTmem2_lget(uaecptr addr)
                    409: {
                    410:     addr &= NEXTmem_mask;
                    411:     return do_get_mem_long(NEXTRam + 0x00400000 + addr);
                    412: }
                    413: 
                    414: static uae_u32 NEXTmem2_wget(uaecptr addr)
                    415: {
                    416:     addr &= NEXTmem_mask;
                    417:     return do_get_mem_word(NEXTRam + 0x00400000 + addr);
                    418: }
                    419: 
                    420: static uae_u32 NEXTmem2_bget(uaecptr addr)
                    421: {
                    422:     addr &= NEXTmem_mask;
                    423:     return NEXTRam[addr+0x00400000];
                    424: }
                    425: 
                    426: static void NEXTmem2_lput(uaecptr addr, uae_u32 l)
                    427: {
                    428:     addr &= NEXTmem_mask;
                    429:     do_put_mem_long(NEXTRam + addr + 0x00400000, l);
                    430: }
                    431: 
                    432: static void NEXTmem2_wput(uaecptr addr, uae_u32 w)
                    433: {
                    434:     addr &= NEXTmem_mask;
                    435:     do_put_mem_word(NEXTRam + addr + 0x00400000, w);
                    436: }
                    437: 
                    438: static void NEXTmem2_bput(uaecptr addr, uae_u32 b)
                    439: {
                    440:     addr &= NEXTmem_mask;
                    441:     NEXTRam[addr+0x00400000] = b;
                    442: }
                    443: 
                    444: static int NEXTmem2_check(uaecptr addr, uae_u32 size)
                    445: {
                    446:     addr &= NEXTmem_mask;
                    447:     return (addr + size) <= 0x003FFFFF;
                    448: }
                    449: 
                    450: static uae_u8 *NEXTmem2_xlate(uaecptr addr)
                    451: {
                    452:     addr &= NEXTmem_mask;
                    453:     return NEXTRam + addr + 0x00400000;
                    454: }
                    455: 
                    456: 
1.1.1.2   root      457: /* **** NEXT VRAM memory for monochrome systems **** */
1.1       root      458: 
                    459: static uae_u32 NEXTvideo_lget(uaecptr addr)
                    460: {
                    461:     addr &= NEXTvideo_mask;
                    462:     return do_get_mem_long(NEXTVideo + addr);
                    463: }
                    464: 
                    465: static uae_u32 NEXTvideo_wget(uaecptr addr)
                    466: {
                    467:     addr &= NEXTvideo_mask;
                    468:     return do_get_mem_word(NEXTVideo + addr);
                    469: }
                    470: 
                    471: static uae_u32 NEXTvideo_bget(uaecptr addr)
                    472: {
                    473:     addr &= NEXTvideo_mask;
                    474:     return NEXTVideo[addr];
                    475: }
                    476: 
                    477: static void NEXTvideo_lput(uaecptr addr, uae_u32 l)
                    478: {
                    479:     addr &= NEXTvideo_mask;
                    480:     do_put_mem_long(NEXTVideo + addr, l);
                    481: }
                    482: 
                    483: static void NEXTvideo_wput(uaecptr addr, uae_u32 w)
                    484: {
                    485:     addr &= NEXTvideo_mask;
                    486:     do_put_mem_word(NEXTVideo + addr, w);
                    487: }
                    488: 
                    489: static void NEXTvideo_bput(uaecptr addr, uae_u32 b)
                    490: {
                    491:     addr &= NEXTvideo_mask;
                    492:     NEXTVideo[addr] = b;
                    493: }
                    494: 
                    495: static int NEXTvideo_check(uaecptr addr, uae_u32 size)
                    496: {
                    497:     addr &= NEXTvideo_mask;
                    498:     return (addr + size) <= NEXTvideo_size;
                    499: }
                    500: 
                    501: static uae_u8 *NEXTvideo_xlate(uaecptr addr)
                    502: {
                    503:     addr &= NEXTvideo_mask;
                    504:     return (uae_u8*)NEXTVideo + addr;
                    505: }
                    506: 
1.1.1.2   root      507: 
                    508: /* **** NEXT VRAM memory for color systems **** */
                    509: 
                    510: static uae_u32 NEXTcolorvideo_lget(uaecptr addr)
                    511: {
                    512:     addr &= NEXTcolorvideo_mask;
                    513:     return do_get_mem_long(NEXTColorVideo + addr);
                    514: }
                    515: 
                    516: static uae_u32 NEXTcolorvideo_wget(uaecptr addr)
                    517: {
                    518:     addr &= NEXTcolorvideo_mask;
                    519:     return do_get_mem_word(NEXTColorVideo + addr);
                    520: }
                    521: 
                    522: static uae_u32 NEXTcolorvideo_bget(uaecptr addr)
                    523: {
                    524:     addr &= NEXTcolorvideo_mask;
                    525:     return NEXTColorVideo[addr];
                    526: }
                    527: 
                    528: static void NEXTcolorvideo_lput(uaecptr addr, uae_u32 l)
                    529: {
                    530:     addr &= NEXTcolorvideo_mask;
                    531:     do_put_mem_long(NEXTColorVideo + addr, l);
                    532: }
                    533: 
                    534: static void NEXTcolorvideo_wput(uaecptr addr, uae_u32 w)
                    535: {
                    536:     addr &= NEXTcolorvideo_mask;
                    537:     do_put_mem_word(NEXTColorVideo + addr, w);
                    538: }
                    539: 
                    540: static void NEXTcolorvideo_bput(uaecptr addr, uae_u32 b)
                    541: {
                    542:     addr &= NEXTcolorvideo_mask;
                    543:     NEXTColorVideo[addr] = b;
                    544: }
                    545: 
                    546: static int NEXTcolorvideo_check(uaecptr addr, uae_u32 size)
                    547: {
                    548:     addr &= NEXTcolorvideo_mask;
                    549:     return (addr + size) <= NEXTcolorvideo_size;
                    550: }
                    551: 
                    552: static uae_u8 *NEXTcolorvideo_xlate(uaecptr addr)
                    553: {
                    554:     addr &= NEXTcolorvideo_mask;
                    555:     return (uae_u8*)NEXTColorVideo + addr;
                    556: }
                    557: 
                    558: 
1.1       root      559: /* **** NEXT BMAP memory **** */
                    560: 
                    561: static uae_u32 NEXTbmap_lget(uaecptr addr)
                    562: {
                    563:        write_log ("bmap lget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    564:     addr &= NEXTbmap_mask;
                    565:     return do_get_mem_long(NEXTbmap + addr);
                    566: }
                    567: 
                    568: static uae_u32 NEXTbmap_wget(uaecptr addr)
                    569: {
                    570:        write_log ("bmap wget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    571:     addr &= NEXTbmap_mask;
                    572:     return do_get_mem_word(NEXTbmap + addr);
                    573: }
                    574: 
                    575: static uae_u32 NEXTbmap_bget(uaecptr addr)
                    576: {
                    577:        write_log ("bmap bget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    578:     addr &= NEXTbmap_mask;
                    579:     return NEXTbmap[addr];
                    580: }
                    581: 
                    582: static void NEXTbmap_lput(uaecptr addr, uae_u32 l)
                    583: {
                    584:        write_log ("bmap lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc());
                    585:     addr &= NEXTbmap_mask;
                    586:     do_put_mem_long(NEXTbmap + addr, l);
                    587: }
                    588: 
                    589: static void NEXTbmap_wput(uaecptr addr, uae_u32 w)
                    590: {
                    591:        write_log ("bmap wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc());
                    592:     addr &= NEXTbmap_mask;
                    593:     do_put_mem_word(NEXTbmap + addr, w);
                    594: }
                    595: 
                    596: static void NEXTbmap_bput(uaecptr addr, uae_u32 b)
                    597: {
                    598:        write_log ("bmap bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc());
                    599:     addr &= NEXTbmap_mask;
                    600:     NEXTbmap[addr] = b;
                    601: }
                    602: 
                    603: static int NEXTbmap_check(uaecptr addr, uae_u32 size)
                    604: {
                    605:     addr &= NEXTbmap_mask;
                    606:     return (addr + size) <= NEXTbmap_size;
                    607: }
                    608: 
                    609: static uae_u8 *NEXTbmap_xlate(uaecptr addr)
                    610: {
                    611:     addr &= NEXTbmap_mask;
                    612:     return (uae_u8*)NEXTbmap + addr;
                    613: }
                    614: 
                    615: /* **** NEXT x06 memory **** */
                    616: 
                    617: static uae_u32 NEXTx06_lget(uaecptr addr)
                    618: {
                    619:        write_log ("x06 lget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    620:     addr &= NEXTx06_mask;
                    621:     //    return do_get_mem_long(NEXTx06 + addr);
                    622:        return 0xFFFFFFFF;
                    623: }
                    624: 
                    625: static uae_u32 NEXTx06_wget(uaecptr addr)
                    626: {
                    627:        write_log ("x06 wget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    628:     addr &= NEXTx06_mask;
                    629:     //    return do_get_mem_word(NEXTx06 + addr);
                    630:        return 0xFFFF;
                    631: }
                    632: 
                    633: static uae_u32 NEXTx06_bget(uaecptr addr)
                    634: {
                    635:        write_log ("x06 bget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
                    636:     addr &= NEXTx06_mask;
                    637:     //    return NEXTx06[addr];
                    638:        return 0xFF;
                    639: }
                    640: 
                    641: static void NEXTx06_lput(uaecptr addr, uae_u32 l)
                    642: {
                    643:        write_log ("x06 lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc());
                    644:     addr &= NEXTx06_mask;
                    645:     do_put_mem_long(NEXTx06 + addr, l);
                    646: }
                    647: 
                    648: static void NEXTx06_wput(uaecptr addr, uae_u32 w)
                    649: {
                    650:        write_log ("x06 wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc());
                    651:     addr &= NEXTx06_mask;
                    652:     do_put_mem_word(NEXTx06 + addr, w);
                    653: }
                    654: 
                    655: static void NEXTx06_bput(uaecptr addr, uae_u32 b)
                    656: {
                    657:        write_log ("x06 bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc());
                    658:     addr &= NEXTx06_mask;
                    659:     NEXTx06[addr] = b;
                    660: }
                    661: 
                    662: static int NEXTx06_check(uaecptr addr, uae_u32 size)
                    663: {
                    664:     addr &= NEXTx06_mask;
                    665:     return (addr + size) <= NEXTx06_size;
                    666: }
                    667: 
                    668: static uae_u8 *NEXTx06_xlate(uaecptr addr)
                    669: {
                    670:     addr &= NEXTx06_mask;
                    671:     return (uae_u8*)NEXTx06 + addr;
                    672: }
                    673: 
                    674: 
                    675: /*
                    676:  * **** Void memory ****
                    677:  * lots of free space in next's full 32bits memory map
                    678:  * Reading always returns the same value and writing does nothing at all.
                    679:  */
                    680: 
                    681: static uae_u32 VoidMem_lget(uaecptr addr)
                    682: {
                    683:     return 0;
                    684: }
                    685: 
                    686: static uae_u32 VoidMem_wget(uaecptr addr)
                    687: {
                    688:     return 0;
                    689: }
                    690: 
                    691: static uae_u32 VoidMem_bget(uaecptr addr)
                    692: {
                    693:     return 0;
                    694: }
                    695: 
                    696: static void VoidMem_lput(uaecptr addr, uae_u32 l)
                    697: {
                    698: }
                    699: 
                    700: static void VoidMem_wput(uaecptr addr, uae_u32 w)
                    701: {
                    702: }
                    703: 
                    704: static void VoidMem_bput (uaecptr addr, uae_u32 b)
                    705: {
                    706: }
                    707: 
                    708: static int VoidMem_check(uaecptr addr, uae_u32 size)
                    709: {
                    710:     if (illegal_mem)
                    711:         write_log ("Void memory check at %08lx\n", (long)addr);
                    712:     
                    713:     return 0;
                    714: }
                    715: 
                    716: static uae_u8 *VoidMem_xlate (uaecptr addr)
                    717: {
                    718:     write_log("Your Next program just did something terribly stupid:"
                    719:               " VoidMem_xlate($%x)\n", addr);
                    720:     
                    721:     return NEXTmem_xlate(addr);  /* So we don't crash. */
                    722: }
                    723: 
                    724: 
                    725: /* **** ROM memory **** */
                    726: 
1.1.1.2   root      727: extern int SCR_ROM_overlay;
                    728: 
1.1       root      729: uae_u8 *ROMmemory;
                    730: 
                    731: static uae_u32 ROMmem_lget(uaecptr addr)
                    732: {
1.1.1.2   root      733:     if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_long(NEXTRam + 0x03FFE000 +addr);}
1.1       root      734:     addr &= ROMmem_mask;
                    735:     return do_get_mem_long(ROMmemory + addr);
                    736: }
                    737: 
                    738: static uae_u32 ROMmem_wget(uaecptr addr)
                    739: {
1.1.1.2   root      740:     if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_word(NEXTRam + 0x03FFE000 +addr);}
1.1       root      741:     addr &= ROMmem_mask;
1.1.1.2   root      742:     return do_get_mem_word(ROMmemory + addr);   
                    743: 
1.1       root      744: }
                    745: 
                    746: static uae_u32 ROMmem_bget(uaecptr addr)
                    747: {
1.1.1.2   root      748:     if ((addr<0x2000) && (SCR_ROM_overlay)) {return NEXTRam[0x03FFE000 +addr];}
1.1       root      749:     addr &= ROMmem_mask;
                    750:     return ROMmemory[addr];
                    751: }
                    752: 
                    753: static void ROMmem_lput(uaecptr addr, uae_u32 b)
                    754: {
1.1.1.2   root      755:     illegal_trace(write_log ("Illegal ROMmem lput at %08lx\n", (long)addr));
1.1.1.3 ! root      756: //    M68000_BusError(addr, 0);
1.1       root      757: }
                    758: 
                    759: static void ROMmem_wput(uaecptr addr, uae_u32 b)
                    760: {
1.1.1.2   root      761:     illegal_trace(write_log ("Illegal ROMmem wput at %08lx\n", (long)addr));
1.1.1.3 ! root      762: //    M68000_BusError(addr, 0);
1.1       root      763: }
                    764: 
                    765: static void ROMmem_bput(uaecptr addr, uae_u32 b)
                    766: {
1.1.1.2   root      767:     illegal_trace(write_log ("Illegal ROMmem bput at %08lx\n", (long)addr));
1.1.1.3 ! root      768: //    M68000_BusError(addr, 0);
1.1       root      769: }
                    770: 
                    771: static int ROMmem_check(uaecptr addr, uae_u32 size)
                    772: {
                    773:     addr &= ROMmem_mask;
                    774:     return (addr + size) <= ROMmem_size;
                    775: }
                    776: 
                    777: static uae_u8 *ROMmem_xlate(uaecptr addr)
                    778: {
                    779:     addr &= ROMmem_mask;
                    780:     return ROMmemory + addr;
                    781: }
                    782: 
                    783: /* Hardware IO memory */
                    784: /* see also ioMem.c */
                    785: 
                    786: uae_u8 *IOmemory;
                    787: 
                    788: static int IOmem_check(uaecptr addr, uae_u32 size)
                    789: {
1.1.1.2   root      790:     return 0;
1.1       root      791: }
                    792: 
                    793: static uae_u8 *IOmem_xlate(uaecptr addr)
                    794: {
                    795:     addr &= IOmem_mask;
                    796:     return IOmemory + addr;
                    797: }
                    798: 
                    799: 
                    800: 
                    801: /* **** Address banks **** */
                    802: 
                    803: static addrbank dummy_bank =
                    804: {
                    805:     dummy_lget, dummy_wget, dummy_bget,
                    806:     dummy_lput, dummy_wput, dummy_bput,
                    807:     dummy_xlate, dummy_check, NULL, NULL,
                    808:     dummy_lget, dummy_wget, ABFLAG_NONE
                    809: //     dummy_lgeti, dummy_wgeti, ABFLAG_NONE
                    810: };
                    811: 
                    812: static addrbank BusErrMem_bank =
                    813: {
                    814:     BusErrMem_lget, BusErrMem_wget, BusErrMem_bget,
                    815:     BusErrMem_lput, BusErrMem_wput, BusErrMem_bput,
1.1.1.2   root      816:     BusErrMem_xlate, BusErrMem_check, NULL, (char*)"BusError memory",
1.1       root      817:     BusErrMem_lget, BusErrMem_wget, ABFLAG_NONE
                    818: };
                    819: 
                    820: static addrbank NEXTmem_bank =
                    821: {
                    822:     NEXTmem_lget, NEXTmem_wget, NEXTmem_bget,
                    823:     NEXTmem_lput, NEXTmem_wput, NEXTmem_bput,
1.1.1.2   root      824:     NEXTmem_xlate, NEXTmem_check, NULL, (char*)"NEXT memory",
1.1       root      825:     NEXTmem_lget, NEXTmem_wget, ABFLAG_RAM
                    826: 
                    827: };
                    828: 
1.1.1.2   root      829: static addrbank NEXTempty_bank =
                    830: {
                    831:     NEXTempty_lget, NEXTempty_wget, NEXTempty_bget,
                    832:     NEXTempty_lput, NEXTempty_wput, NEXTempty_bput,
                    833:     NEXTempty_xlate, NEXTempty_check, NULL, (char*)"Empty memory",
                    834:     NEXTempty_lget, NEXTempty_wget, ABFLAG_RAM
                    835: };
                    836: 
1.1       root      837: static addrbank NEXTmem_bank2 =
                    838: {
                    839:     NEXTmem2_lget, NEXTmem2_wget, NEXTmem2_bget,
                    840:     NEXTmem2_lput, NEXTmem2_wput, NEXTmem2_bput,
1.1.1.2   root      841:     NEXTmem2_xlate, NEXTmem2_check, NULL, (char*)"NEXT memory",
1.1       root      842:     NEXTmem2_lget, NEXTmem2_wget, ABFLAG_RAM
                    843: };
                    844: 
                    845: static addrbank VoidMem_bank =
                    846: {
                    847:     VoidMem_lget, VoidMem_wget, VoidMem_bget,
                    848:     VoidMem_lput, VoidMem_wput, VoidMem_bput,
1.1.1.2   root      849:     VoidMem_xlate, VoidMem_check, NULL, (char*)"Void memory",
1.1       root      850:     VoidMem_lget, VoidMem_wget, ABFLAG_NONE
                    851: };
                    852: 
                    853: static addrbank Video_bank =
                    854: {
                    855:     NEXTvideo_lget, NEXTvideo_wget, NEXTvideo_bget,
                    856:     NEXTvideo_lput, NEXTvideo_wput, NEXTvideo_bput,
1.1.1.2   root      857:     NEXTvideo_xlate, NEXTvideo_check, NULL, (char*)"Video memory",
1.1       root      858:     NEXTvideo_lget, NEXTvideo_wget, ABFLAG_RAM
                    859: };
                    860: 
1.1.1.2   root      861: static addrbank ColorVideo_bank =
                    862: {
                    863:     NEXTcolorvideo_lget, NEXTcolorvideo_wget, NEXTcolorvideo_bget,
                    864:     NEXTcolorvideo_lput, NEXTcolorvideo_wput, NEXTcolorvideo_bput,
                    865:     NEXTcolorvideo_xlate, NEXTcolorvideo_check, NULL, (char*)"Color Video memory",
                    866:     NEXTcolorvideo_lget, NEXTcolorvideo_wget, ABFLAG_RAM
                    867: };
                    868: 
1.1       root      869: static addrbank bmap_bank =
                    870: {
                    871:     NEXTbmap_lget, NEXTbmap_wget, NEXTbmap_bget,
                    872:     NEXTbmap_lput, NEXTbmap_wput, NEXTbmap_bput,
1.1.1.2   root      873:     NEXTbmap_xlate, NEXTbmap_check, NULL, (char*)"bmap memory",
1.1       root      874:     NEXTbmap_lget, NEXTbmap_wget, ABFLAG_RAM
                    875: };
                    876: 
                    877: static addrbank x06_bank =
                    878: {
                    879:     NEXTx06_lget, NEXTx06_wget, NEXTx06_bget,
                    880:     NEXTx06_lput, NEXTx06_wput, NEXTx06_bput,
1.1.1.2   root      881:     NEXTx06_xlate, NEXTx06_check, NULL, (char*)"x06 memory",
1.1       root      882:     NEXTx06_lget, NEXTx06_wget, ABFLAG_RAM
                    883: };
                    884: 
                    885: static addrbank ROMmem_bank =
                    886: {
                    887:     ROMmem_lget, ROMmem_wget, ROMmem_bget,
                    888:     ROMmem_lput, ROMmem_wput, ROMmem_bput,
1.1.1.2   root      889:     ROMmem_xlate, ROMmem_check, NULL, (char*)"ROM memory",
1.1       root      890:     ROMmem_lget, ROMmem_wget, ABFLAG_ROM
                    891: };
                    892: 
                    893: static addrbank IOmem_bank =
                    894: {
                    895:     IoMem_lget, IoMem_wget, IoMem_bget,
                    896:     IoMem_lput, IoMem_wput, IoMem_bput,
1.1.1.2   root      897:     IOmem_xlate, IOmem_check, NULL, (char*)"IO memory",
1.1       root      898:     IoMem_lget, IoMem_wget, ABFLAG_RAM
                    899: };
                    900: 
                    901: 
                    902: 
                    903: static void init_mem_banks (void)
                    904: {
                    905:     int i;
                    906:     for (i = 0; i < 65536; i++)
1.1.1.2   root      907:         put_mem_bank (i<<16, &BusErrMem_bank);
1.1       root      908: }
                    909: 
                    910: 
                    911: /*
                    912:  * Initialize the memory banks
                    913:  */
1.1.1.2   root      914: const char* memory_init(int *nNewNEXTMemSize)
1.1       root      915: {
1.1.1.2   root      916:     int i;
                    917:     uae_u32 bankstart;
                    918:     uae_u32 bankmaxsize;
                    919:     
                    920:     /* Set machine dependent variables */
                    921:     if (ConfigureParams.System.bTurbo) {
                    922:         NEXT_RAM_SIZE = 0x08000000;
                    923:         NEXTmem_mask = 0x07FFFFFF;
                    924:         bankshift = 25;
                    925:     } else if (ConfigureParams.System.bColor) {
                    926:         NEXT_RAM_SIZE = 0x02000000;
                    927:         NEXTmem_mask = 0x01FFFFFF;
                    928:         bankshift = 23;
                    929:     } else {
                    930:         NEXT_RAM_SIZE = 0x04000000;
                    931:         NEXTmem_mask = 0x03FFFFFF;
                    932:         bankshift = 24;
                    933:     }
                    934: 
                    935:     write_log("Memory init: Memory size: %iMB\n", Configuration_CheckMemory(nNewNEXTMemSize));
1.1       root      936:     
1.1.1.2   root      937:     /* Convert values from MB to byte */
                    938:     for (i=0; i<N_BANKS; i++) {
                    939:         MemBank_Size[i] = nNewNEXTMemSize[i]<<20;
                    940:     }
1.1       root      941:     
                    942:        /* fill every 65536 bank with dummy */
                    943:     init_mem_banks(); 
                    944:     
                    945:     
1.1.1.2   root      946: #define MEM_HARDCODE 0
                    947: #if MEM_HARDCODE
                    948:     /* Memory banks can be hardcoded here */
                    949:     MemBank_Size[0] = 0x400000; // 4 MB
                    950:     MemBank_Size[1] = 0x1000000; // 16 MB
                    951:     MemBank_Size[2] = 0x400000; // 4 MB
                    952:     MemBank_Size[3] = 0; // empty
                    953: #endif
                    954: 
                    955:     /* Map memory banks and fill empty area of memory bank with special banks */
                    956:     for (i = 0; i<N_BANKS; i++) {
                    957:         bankstart = NEXT_RAM_START+(i<<bankshift);
                    958:         bankmaxsize = NEXT_RAM_SIZE/N_BANKS;
                    959:         map_banks(&NEXTmem_bank, bankstart>>16, MemBank_Size[i] >> 16);
                    960:         map_banks(&NEXTempty_bank, (bankstart+MemBank_Size[i])>>16, (bankmaxsize-MemBank_Size[i]) >> 16);
                    961:         write_log("Mapping Bank%i at $%08x: %iMB\n", i, bankstart, MemBank_Size[i]/(1024*1024));
                    962:     }
1.1       root      963:     
1.1.1.2   root      964: //    map_banks(&NEXTmem_bank, NEXT_RAM_START>>16, NEXT_RAM_SIZE >> 16);
                    965: 
                    966: //    map_banks(&NEXTmem_bank, 0x04000000>>16, MemBank_Size[0] >> 16);
                    967: //    map_banks(&NEXTmem_bank, 0x04800000>>16, MemBank_Size[1] >> 16);
                    968: //    map_banks(&NEXTmem_bank, 0x05000000>>16, MemBank_Size[2] >> 16);
                    969: //    map_banks(&NEXTmem_bank, 0x05800000>>16, MemBank_Size[3] >> 16);
                    970:         
                    971:     // also map here... need to check address for function (weird?)
                    972:     /*
                    973:     map_banks(&NEXTmem_bank, 0x10000000>>16, NEXT_RAM_SIZE >> 16);
                    974:     map_banks(&NEXTmem_bank, 0x14000000>>16, NEXT_RAM_SIZE >> 16);
                    975:     map_banks(&NEXTmem_bank, 0x18000000>>16, NEXT_RAM_SIZE >> 16);
                    976:     map_banks(&NEXTmem_bank, 0x1C000000>>16, NEXT_RAM_SIZE >> 16);
                    977:     */
                    978: 
1.1       root      979:     // map_banks(&NEXTmem_bank2, NEXT_RAM_START2>>16, NEXT_RAM_SIZE2 >> 16);
                    980:     
1.1.1.2   root      981:     if (ConfigureParams.System.bColor) {
                    982:         map_banks(&ColorVideo_bank, NEXT_COLORSCREEN>>16, NEXT_COLORSCREEN_SIZE >> 16);
                    983:         map_banks(&ColorVideo_bank, NEXT_COLORSCREEN>>16, NEXT_COLORSCREEN_SIZE >> 16);
                    984:         map_banks(&ColorVideo_bank, NEXT_COLORSCREEN>>16, NEXT_COLORSCREEN_SIZE >> 16);
                    985:         map_banks(&ColorVideo_bank, NEXT_COLORSCREEN>>16, NEXT_COLORSCREEN_SIZE >> 16);
                    986:         write_log("Mapping Video Memory at $%08x: %ikB\n", NEXT_COLORSCREEN, NEXT_COLORSCREEN_SIZE/1024);
                    987:     } else {
1.1.1.3 ! root      988:     if (ConfigureParams.System.bTurbo) {
        !           989:                map_banks(&Video_bank, NEXT_SCREEN_TURBO>>16, NEXT_SCREEN_SIZE >> 16);
        !           990:                map_banks(&Video_bank, NEXT_SCREEN_TURBO>>16, NEXT_SCREEN_SIZE >> 16);
        !           991:                map_banks(&Video_bank, NEXT_SCREEN_TURBO>>16, NEXT_SCREEN_SIZE >> 16);
        !           992:                map_banks(&Video_bank, NEXT_SCREEN_TURBO>>16, NEXT_SCREEN_SIZE >> 16);
        !           993:                write_log("Mapping Video Memory at $%08x: %ikB\n", NEXT_SCREEN, NEXT_SCREEN_SIZE/1024);
        !           994:        } else {
        !           995:                map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16);
        !           996:                map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16);
        !           997:                map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16);
        !           998:                map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16);
        !           999:                write_log("Mapping Video Memory at $%08x: %ikB\n", NEXT_SCREEN, NEXT_SCREEN_SIZE/1024);
        !          1000:        }
1.1.1.2   root     1001:     }
                   1002:         
1.1       root     1003:     map_banks(&ROMmem_bank, NEXT_EPROM_START >> 16, NEXT_EPROM_SIZE>>16);
                   1004:     map_banks(&ROMmem_bank, NEXT_EPROM2_START >> 16, NEXT_EPROM_SIZE>>16);
                   1005:     
                   1006:     map_banks(&IOmem_bank, NEXT_IO_START >> 16, NEXT_IO_SIZE>>16);
1.1.1.2   root     1007:     
                   1008:     if (ConfigureParams.System.nMachineType != NEXT_CUBE030)
                   1009:         map_banks(&IOmem_bank, NEXT_IO2_START >> 16, NEXT_IO_SIZE>>16);
                   1010: 
                   1011:     if (ConfigureParams.System.bTurbo)
                   1012:         map_banks(&IOmem_bank, NEXT_IO3_START >> 16, NEXT_IO_SIZE>>16);
1.1.1.3 ! root     1013: 
        !          1014: // turbo rom makes test here... both read and write    
1.1       root     1015:     map_banks(&bmap_bank, NEXT_BMAP_START >> 16, NEXT_BMAP_SIZE>>16);
1.1.1.3 ! root     1016:     map_banks(&bmap_bank, NEXT_BMAP2_START >> 16, NEXT_BMAP_SIZE>>16);
1.1.1.2   root     1017: 
1.1       root     1018:     
                   1019:        ROMmemory=NEXTRom;
                   1020:        IOmemory=NEXTIo;
                   1021:        {
                   1022:                FILE* fin;
                   1023:                int ret;
1.1.1.2   root     1024:        /* Loading ROM depending on emulated system */
                   1025:         if(ConfigureParams.System.nMachineType == NEXT_CUBE030)
                   1026:             fin=fopen(ConfigureParams.Rom.szRom030FileName,"rb");
                   1027:         else if(ConfigureParams.System.bTurbo == true)
                   1028:             fin=fopen(ConfigureParams.Rom.szRomTurboFileName,"rb");
1.1       root     1029:         else
1.1.1.2   root     1030:             fin=fopen(ConfigureParams.Rom.szRom040FileName, "rb");
                   1031: 
                   1032:        if (fin==NULL) {
                   1033:                return "Cannot open ROM file";
                   1034:        }
                   1035: 
1.1       root     1036:                ret=fread(ROMmemory,1,0x20000,fin);
                   1037:         
                   1038:                write_log("Read ROM %d\n",ret);
                   1039:                fclose(fin);
                   1040:        }
                   1041:        
                   1042:        {
                   1043:                int i;
                   1044:                for (i=0;i<sizeof(NEXTVideo);i++) NEXTVideo[i]=0xAA;
                   1045:                for (i=0;i<sizeof(NEXTRam);i++) NEXTRam[i]=0xAA;
                   1046:        }
                   1047:     
1.1.1.2   root     1048:        return NULL;
1.1       root     1049: }
                   1050: 
                   1051: 
                   1052: /*
                   1053:  * Uninitialize the memory banks.
                   1054:  */
                   1055: void memory_uninit (void)
                   1056: {
                   1057: }
                   1058: 
                   1059: 
                   1060: void map_banks (addrbank *bank, int start, int size)
                   1061: {
                   1062:     int bnr;
                   1063:     unsigned long int hioffs = 0, endhioffs = 0x100;
                   1064:     
                   1065:        for (bnr = start; bnr < start + size; bnr++)
                   1066:            put_mem_bank (bnr << 16, bank);
                   1067:        return;
                   1068: }
                   1069: 
                   1070: void memory_hardreset (void)
                   1071: {
1.1.1.2   root     1072: }

unix.superglobalmegacorp.com

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