|
|
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: * Adaptation to Previous by Andreas Grabher
10: *
11: * This file is distributed under the GNU Public License, version 2 or at
12: * your option any later version. Read the file gpl.txt for details.
13: */
14: const char Memory_fileid[] = "Previous memory.c : " __DATE__ " " __TIME__;
15:
16: #include "config.h"
17: #include "sysdeps.h"
18: #include "hatari-glue.h"
19: #include "maccess.h"
20: #include "memory.h"
21:
22: #include "main.h"
23: #include "ioMem.h"
24: #include "bmap.h"
25: #include "tmc.h"
26: #include "nbic.h"
27: #include "reset.h"
28: #include "nextMemory.h"
29: #include "m68000.h"
30: #include "configuration.h"
31: #include "NextBus.hpp"
32:
33: #include "newcpu.h"
34:
35:
36: /* Set illegal_mem to 1 for debug output: */
37: #define illegal_mem 1
38:
39: #define illegal_trace(s) {static int count=0; if (count++<50) { s; }}
40:
41: /*
42: * NeXT memory map (example for 68030 NeXT Computer)
43: *
44: * Local bus:
45: * 0x00000000 - 0x0001FFFF: ROM
46: * 0x01000000 - 0x0101FFFF: ROM mirror
47: *
48: * 0x02000000 - 0x020FFFFF: Device space
49: *
50: * 0x04000000 - 0x04FFFFFF: RAM bank 0
51: * 0x05000000 - 0x05FFFFFF: RAM bank 1
52: * 0x06000000 - 0x06FFFFFF: RAM bank 2
53: * 0x07000000 - 0x07FFFFFF: RAM bank 3
54: *
55: * 0x0B000000 - 0x0B03FFFF: VRAM
56: *
57: * 0x0C000000 - 0x0C03FFFF: VRAM mirror for MWF0
58: * 0x0D000000 - 0x0D03FFFF: VRAM mirror for MWF1
59: * 0x0E000000 - 0x0E03FFFF: VRAM mirror for MWF2
60: * 0x0F000000 - 0x0F03FFFF: VRAM mirror for MWF3
61: *
62: * 0x10000000 - 0x13FFFFFF: RAM mirror for MWF0
63: * 0x14000000 - 0x17FFFFFF: RAM mirror for MWF1
64: * 0x18000000 - 0x1BFFFFFF: RAM mirror for MWF2
65: * 0x1C000000 - 0x1FFFFFFF: RAM mirror for MWF3
66: *
67: * NeXTbus: (Note: Boards can be configured to occupy 2 slots)
68: * 0x00000000 - 0x1FFFFFFF: NeXTbus board space for slot 0
69: * 0x20000000 - 0x3FFFFFFF: NeXTbus board space for slot 2
70: * 0x40000000 - 0x5FFFFFFF: NeXTbus board space for slot 4
71: * 0x60000000 - 0x7FFFFFFF: NeXTbus board space for slot 6
72: *
73: * 0xF0000000 - 0xF0FFFFFF: NeXTbus slot space for slot 0
74: * 0xF2000000 - 0xF2FFFFFF: NeXTbus slot space for slot 2
75: * 0xF4000000 - 0xF4FFFFFF: NeXTbus slot space for slot 4
76: * 0xF6000000 - 0xF6FFFFFF: NeXTbus slot space for slot 6
77: */
78:
79:
80: /* ROM */
81: #define NEXT_EPROM_START 0x00000000
82: #define NEXT_EPROM_DIAG_START 0x01000000
83: #define NEXT_EPROM_BMAP_START 0x01000000
84: #define NEXT_EPROM_SIZE 0x00020000
85: #define NEXT_EPROM_MASK 0x0001FFFF
86:
87: /* Main memory */
88: #define NEXT_RAM_START 0x04000000
89:
90: #define N_BANKS 4
91: #define NEXT_RAM_BANK_MAX 0x01000000
92: #define NEXT_RAM_BANK_MAX_C 0x00800000
93: #define NEXT_RAM_BANK_MAX_T 0x02000000
94:
95: #define NEXT_RAM_BANK_SEL 0x03000000
96: #define NEXT_RAM_BANK_SEL_C 0x01800000
97: #define NEXT_RAM_BANK_SEL_T 0x06000000
98:
99: uae_u32 NEXT_ram_bank_size;
100: uae_u32 NEXT_ram_bank_mask;
101: uae_u32 NEXT_ram_bank0_mask;
102: uae_u32 NEXT_ram_bank1_mask;
103: uae_u32 NEXT_ram_bank2_mask;
104: uae_u32 NEXT_ram_bank3_mask;
105:
106: /* Main memory with memory write functions */
107: #define NEXT_RAM_MWF0_START 0x10000000
108: #define NEXT_RAM_MWF1_START 0x14000000
109: #define NEXT_RAM_MWF2_START 0x18000000
110: #define NEXT_RAM_MWF3_START 0x1C000000
111:
112: /* VRAM monochrome */
113: #define NEXT_VRAM_START 0x0B000000
114: #define NEXT_VRAM_SIZE 0x00040000
115: #define NEXT_VRAM_MASK 0x0003FFFF
116:
117: /* VRAM monochrome with memory write functions */
118: #define NEXT_VRAM_MWF0_START 0x0C000000
119: #define NEXT_VRAM_MWF1_START 0x0D000000
120: #define NEXT_VRAM_MWF2_START 0x0E000000
121: #define NEXT_VRAM_MWF3_START 0x0F000000
122:
123: /* VRAM color */
124: #define NEXT_VRAM_COLOR_START 0x2C000000
125: #define NEXT_VRAM_COLOR_SIZE 0x00200000
126: #define NEXT_VRAM_COLOR_MASK 0x001FFFFF
127:
128: /* VRAM turbo monochrome and color */
129: #define NEXT_VRAM_TURBO_START 0x0C000000
130:
131: /* IO memory */
132: #define NEXT_IO_START 0x02000000
133: #define NEXT_IO_BMAP_START 0x02100000
134: #define NEXT_IO_TMC_START 0x02200000
135: #define NEXT_IO_SIZE 0x00020000
136: #define NEXT_IO_MASK 0x0001FFFF
137:
138: #define NEXT_BMAP_START 0x020C0000
139: #define NEXT_BMAP_SIZE 0x00000040
140: #define NEXT_BMAP_MASK 0x0000003F
141:
142: #define NEXT_BMAP_MAP_SIZE 0x00010000
143:
144: #define NEXT_NBIC_START 0x02020000
145: #define NEXT_NBIC_SIZE 0x00000008
146: #define NEXT_NBIC_MASK 0x00000007
147:
148: #define NEXT_NBIC_MAP_SIZE 0x00010000
149:
150: /* Cache memory for nitro systems */
151: #define NEXT_CACHE_TAG_START 0x03E00000
152: #define NEXT_CACHE_TAG_SIZE 0x00100000
153: #define NEXT_CACHE_TAG_MASK 0x000FFFFF
154:
155: #define NEXT_CACHE_START 0x03F00000
156: #define NEXT_CACHE_SIZE 0x00100000
157: #define NEXT_CACHE_MASK 0x000FFFFF
158:
159: /* NeXTbus slot memory space */
160: #define NEXTBUS_SLOT_START(x) (0xF0000000|((x)<<24))
161: #define NEXTBUS_SLOT_SIZE 0x01000000
162: #define NEXTBUS_SLOT_MASK 0x00FFFFFF
163:
164: /* NeXTbus board memory space */
165: #define NEXTBUS_BOARD_START(x) ((x)<<28)
166: #define NEXTBUS_BOARD_SIZE 0x10000000
167: #define NEXTBUS_BOARD_MASK 0x0FFFFFFF
168:
169:
170: uae_u8 NEXTVideo[256*1024];
171:
172: uae_u8 NEXTColorVideo[2*1024*1024];
173:
174:
175: #ifdef SAVE_MEMORY_BANKS
176: addrbank *mem_banks[65536];
177: #else
178: addrbank mem_banks[65536];
179: #endif
180:
181: #ifdef NO_INLINE_MEMORY_ACCESS
182: __inline__ uae_u32 longget (uaecptr addr)
183: {
184: return call_mem_get_func (get_mem_bank (addr).lget, addr);
185: }
186: __inline__ uae_u32 wordget (uaecptr addr)
187: {
188: return call_mem_get_func (get_mem_bank (addr).wget, addr);
189: }
190: __inline__ uae_u32 byteget (uaecptr addr)
191: {
192: return call_mem_get_func (get_mem_bank (addr).bget, addr);
193: }
194: __inline__ void longput (uaecptr addr, uae_u32 l)
195: {
196: call_mem_put_func (get_mem_bank (addr).lput, addr, l);
197: }
198: __inline__ void wordput (uaecptr addr, uae_u32 w)
199: {
200: call_mem_put_func (get_mem_bank (addr).wput, addr, w);
201: }
202: __inline__ void byteput (uaecptr addr, uae_u32 b)
203: {
204: call_mem_put_func (get_mem_bank (addr).bput, addr, b);
205: }
206: #endif
207:
208:
209: /* Some prototypes: */
210: void SDL_Quit(void);
211:
212: uae_u8 ce_cachable[65536];
213:
214:
215: /* **** A dummy bank that only contains zeros **** */
216:
217: static uae_u32 dummy_lget(uaecptr addr)
218: {
219: illegal_trace(write_log ("Illegal lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
220: return 0;
221: }
222:
223: static uae_u32 dummy_wget(uaecptr addr)
224: {
225: illegal_trace(write_log ("Illegal wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
226: return 0;
227: }
228:
229: static uae_u32 dummy_bget(uaecptr addr)
230: {
231: illegal_trace(write_log ("Illegal bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
232: return 0;
233: }
234:
235: static void dummy_lput(uaecptr addr, uae_u32 l)
236: {
237: illegal_trace(write_log ("Illegal lput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
238: }
239:
240: static void dummy_wput(uaecptr addr, uae_u32 w)
241: {
242: illegal_trace(write_log ("Illegal wput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
243: }
244:
245: static void dummy_bput(uaecptr addr, uae_u32 b)
246: {
247: illegal_trace(write_log ("Illegal bput at %08lx PC=%08x\n", (long)addr,m68k_getpc()));
248: }
249:
250:
251: /* **** This memory bank only generates bus errors **** */
252:
253: static uae_u32 BusErrMem_lget(uaecptr addr)
254: {
255: if (illegal_mem)
256: write_log ("Bus error lget at %08lx\n", (long)addr);
257:
258: M68000_BusError(addr, 1);
259: return 0;
260: }
261:
262: static uae_u32 BusErrMem_wget(uaecptr addr)
263: {
264: if (illegal_mem)
265: write_log ("Bus error wget at %08lx\n", (long)addr);
266:
267: M68000_BusError(addr, 1);
268: return 0;
269: }
270:
271: static uae_u32 BusErrMem_bget(uaecptr addr)
272: {
273: if (illegal_mem)
274: write_log ("Bus error bget at %08lx\n", (long)addr);
275:
276: M68000_BusError(addr, 1);
277: return 0;
278: }
279:
280: static void BusErrMem_lput(uaecptr addr, uae_u32 l)
281: {
282: if (illegal_mem)
283: write_log ("Bus error lput at %08lx\n", (long)addr);
284:
285: M68000_BusError(addr, 0);
286: }
287:
288: static void BusErrMem_wput(uaecptr addr, uae_u32 w)
289: {
290: if (illegal_mem)
291: write_log ("Bus error wput at %08lx\n", (long)addr);
292:
293: M68000_BusError(addr, 0);
294: }
295:
296: static void BusErrMem_bput(uaecptr addr, uae_u32 b)
297: {
298: if (illegal_mem)
299: write_log ("Bus error bput at %08lx\n", (long)addr);
300:
301: M68000_BusError(addr, 0);
302: }
303:
304:
305: /* **** ROM memory **** */
306:
307: extern int SCR_ROM_overlay;
308:
309: uae_u8 *ROMmemory;
310:
311: static uae_u32 mem_rom_lget(uaecptr addr)
312: {
313: // if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_long(NEXTRam + 0x03FFE000 +addr);}
314: addr &= NEXT_EPROM_MASK;
315: return do_get_mem_long(ROMmemory + addr);
316: }
317:
318: static uae_u32 mem_rom_wget(uaecptr addr)
319: {
320: // if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_word(NEXTRam + 0x03FFE000 +addr);}
321: addr &= NEXT_EPROM_MASK;
322: return do_get_mem_word(ROMmemory + addr);
323:
324: }
325:
326: static uae_u32 mem_rom_bget(uaecptr addr)
327: {
328: // if ((addr<0x2000) && (SCR_ROM_overlay)) {return NEXTRam[0x03FFE000 +addr];}
329: addr &= NEXT_EPROM_MASK;
330: return ROMmemory[addr];
331: }
332:
333: static void mem_rom_lput(uaecptr addr, uae_u32 b)
334: {
335: illegal_trace(write_log ("Illegal ROMmem lput at %08lx\n", (long)addr));
336: M68000_BusError(addr, 0);
337: }
338:
339: static void mem_rom_wput(uaecptr addr, uae_u32 b)
340: {
341: illegal_trace(write_log ("Illegal ROMmem wput at %08lx\n", (long)addr));
342: M68000_BusError(addr, 0);
343: }
344:
345: static void mem_rom_bput(uaecptr addr, uae_u32 b)
346: {
347: illegal_trace(write_log ("Illegal ROMmem bput at %08lx\n", (long)addr));
348: M68000_BusError(addr, 0);
349: }
350:
351:
352: /* **** NEXT RAM memory **** */
353:
354: static uae_u32 mem_ram_bank0_lget(uaecptr addr)
355: {
356: addr &= NEXT_ram_bank0_mask;
357: return do_get_mem_long(NEXTRam + addr);
358: }
359:
360: static uae_u32 mem_ram_bank0_wget(uaecptr addr)
361: {
362: addr &= NEXT_ram_bank0_mask;
363: return do_get_mem_word(NEXTRam + addr);
364: }
365:
366: static uae_u32 mem_ram_bank0_bget(uaecptr addr)
367: {
368: addr &= NEXT_ram_bank0_mask;
369: return NEXTRam[addr];
370: }
371:
372: static void mem_ram_bank0_lput(uaecptr addr, uae_u32 l)
373: {
374: addr &= NEXT_ram_bank0_mask;
375: do_put_mem_long(NEXTRam + addr, l);
376: }
377:
378: static void mem_ram_bank0_wput(uaecptr addr, uae_u32 w)
379: {
380: addr &= NEXT_ram_bank0_mask;
381: do_put_mem_word(NEXTRam + addr, w);
382: }
383:
384: static void mem_ram_bank0_bput(uaecptr addr, uae_u32 b)
385: {
386: addr &= NEXT_ram_bank0_mask;
387: NEXTRam[addr] = b;
388: }
389:
390:
391: static uae_u32 mem_ram_bank1_lget(uaecptr addr)
392: {
393: addr &= NEXT_ram_bank1_mask;
394: return do_get_mem_long(NEXTRam + addr);
395: }
396:
397: static uae_u32 mem_ram_bank1_wget(uaecptr addr)
398: {
399: addr &= NEXT_ram_bank1_mask;
400: return do_get_mem_word(NEXTRam + addr);
401: }
402:
403: static uae_u32 mem_ram_bank1_bget(uaecptr addr)
404: {
405: addr &= NEXT_ram_bank1_mask;
406: return NEXTRam[addr];
407: }
408:
409: static void mem_ram_bank1_lput(uaecptr addr, uae_u32 l)
410: {
411: addr &= NEXT_ram_bank1_mask;
412: do_put_mem_long(NEXTRam + addr, l);
413: }
414:
415: static void mem_ram_bank1_wput(uaecptr addr, uae_u32 w)
416: {
417: addr &= NEXT_ram_bank1_mask;
418: do_put_mem_word(NEXTRam + addr, w);
419: }
420:
421: static void mem_ram_bank1_bput(uaecptr addr, uae_u32 b)
422: {
423: addr &= NEXT_ram_bank1_mask;
424: NEXTRam[addr] = b;
425: }
426:
427:
428: static uae_u32 mem_ram_bank2_lget(uaecptr addr)
429: {
430: addr &= NEXT_ram_bank2_mask;
431: return do_get_mem_long(NEXTRam + addr);
432: }
433:
434: static uae_u32 mem_ram_bank2_wget(uaecptr addr)
435: {
436: addr &= NEXT_ram_bank2_mask;
437: return do_get_mem_word(NEXTRam + addr);
438: }
439:
440: static uae_u32 mem_ram_bank2_bget(uaecptr addr)
441: {
442: addr &= NEXT_ram_bank2_mask;
443: return NEXTRam[addr];
444: }
445:
446: static void mem_ram_bank2_lput(uaecptr addr, uae_u32 l)
447: {
448: addr &= NEXT_ram_bank2_mask;
449: do_put_mem_long(NEXTRam + addr, l);
450: }
451:
452: static void mem_ram_bank2_wput(uaecptr addr, uae_u32 w)
453: {
454: addr &= NEXT_ram_bank2_mask;
455: do_put_mem_word(NEXTRam + addr, w);
456: }
457:
458: static void mem_ram_bank2_bput(uaecptr addr, uae_u32 b)
459: {
460: addr &= NEXT_ram_bank2_mask;
461: NEXTRam[addr] = b;
462: }
463:
464:
465: static uae_u32 mem_ram_bank3_lget(uaecptr addr)
466: {
467: addr &= NEXT_ram_bank3_mask;
468: return do_get_mem_long(NEXTRam + addr);
469: }
470:
471: static uae_u32 mem_ram_bank3_wget(uaecptr addr)
472: {
473: addr &= NEXT_ram_bank3_mask;
474: return do_get_mem_word(NEXTRam + addr);
475: }
476:
477: static uae_u32 mem_ram_bank3_bget(uaecptr addr)
478: {
479: addr &= NEXT_ram_bank3_mask;
480: return NEXTRam[addr];
481: }
482:
483: static void mem_ram_bank3_lput(uaecptr addr, uae_u32 l)
484: {
485: addr &= NEXT_ram_bank3_mask;
486: do_put_mem_long(NEXTRam + addr, l);
487: }
488:
489: static void mem_ram_bank3_wput(uaecptr addr, uae_u32 w)
490: {
491: addr &= NEXT_ram_bank3_mask;
492: do_put_mem_word(NEXTRam + addr, w);
493: }
494:
495: static void mem_ram_bank3_bput(uaecptr addr, uae_u32 b)
496: {
497: addr &= NEXT_ram_bank3_mask;
498: NEXTRam[addr] = b;
499: }
500:
501: /* **** NEXT RAM empty areas **** */
502:
503: static uae_u32 mem_ram_empty_lget(uaecptr addr)
504: {
505: if (illegal_mem)
506: write_log ("Empty mem area lget at %08lx\n", (long)addr);
507:
508: return addr;
509: }
510:
511: static uae_u32 mem_ram_empty_wget(uaecptr addr)
512: {
513: if (illegal_mem)
514: write_log ("Empty mem area wget at %08lx\n", (long)addr);
515:
516: return addr;
517: }
518:
519: static uae_u32 mem_ram_empty_bget(uaecptr addr)
520: {
521: if (illegal_mem)
522: write_log ("Empty mem area bget at %08lx\n", (long)addr);
523:
524: return addr;
525: }
526:
527: static void mem_ram_empty_lput(uaecptr addr, uae_u32 l)
528: {
529: if (illegal_mem)
530: write_log ("Empty mem area lput at %08lx\n", (long)addr);
531: }
532:
533: static void mem_ram_empty_wput(uaecptr addr, uae_u32 w)
534: {
535: if (illegal_mem)
536: write_log ("Empty mem area wput at %08lx\n", (long)addr);
537: }
538:
539: static void mem_ram_empty_bput(uaecptr addr, uae_u32 b)
540: {
541: if (illegal_mem)
542: write_log ("Empty mem area bput at %08lx\n", (long)addr);
543: }
544:
545:
546: /* **** NEXT VRAM memory for monochrome systems **** */
547:
548: static uae_u32 mem_video_lget(uaecptr addr)
549: {
550: addr &= NEXT_VRAM_MASK;
551: return do_get_mem_long(NEXTVideo + addr);
552: }
553:
554: static uae_u32 mem_video_wget(uaecptr addr)
555: {
556: addr &= NEXT_VRAM_MASK;
557: return do_get_mem_word(NEXTVideo + addr);
558: }
559:
560: static uae_u32 mem_video_bget(uaecptr addr)
561: {
562: addr &= NEXT_VRAM_MASK;
563: return NEXTVideo[addr];
564: }
565:
566: static void mem_video_lput(uaecptr addr, uae_u32 l)
567: {
568: addr &= NEXT_VRAM_MASK;
569: do_put_mem_long(NEXTVideo + addr, l);
570: }
571:
572: static void mem_video_wput(uaecptr addr, uae_u32 w)
573: {
574: addr &= NEXT_VRAM_MASK;
575: do_put_mem_word(NEXTVideo + addr, w);
576: }
577:
578: static void mem_video_bput(uaecptr addr, uae_u32 b)
579: {
580: addr &= NEXT_VRAM_MASK;
581: NEXTVideo[addr] = b;
582: }
583:
584:
585: /* **** NEXT memory banks with write functions **** */
586:
587: static uae_u8 mwf0[4][4] = { /* AB */
588: { 0, 0, 0, 0 },
589: { 0, 0, 1, 1 },
590: { 0, 1, 1, 2 },
591: { 0, 1, 2, 3 }
592: };
593:
594: static uae_u8 mwf1[4][4] = { /* ceil(A+B) */
595: { 0, 1, 2, 3 },
596: { 1, 2, 3, 3 },
597: { 2, 3, 3, 3 },
598: { 3, 3, 3, 3 }
599: };
600:
601: static uae_u8 mwf2[4][4] = { /* (1-A)B */
602: { 0, 0, 0, 0 },
603: { 1, 1, 0, 0 },
604: { 2, 1, 1, 0 },
605: { 3, 2, 1, 0 }
606: };
607:
608: static uae_u8 mwf3[4][4] = { /* A+B-AB */
609: { 0, 1, 2, 3 },
610: { 1, 2, 2, 3 },
611: { 2, 2, 3, 3 },
612: { 3, 3, 3, 3 }
613: };
614:
615: static uae_u32 memory_write_func(uae_u32 old, uae_u32 new, int function, int size)
616: {
617: int a,b,i;
618: uae_u32 v=0;
619: #if 0
620: write_log("[MWF] Function%i: size=%i, old=%08X, new=%08X\n",function,size,old,new);
621: #endif
622:
623: switch (function) {
624: case 0:
625: for (i=0; i<(size*4); i++) {
626: a=old>>(i*2)&3;
627: b=new>>(i*2)&3;
628: v|=mwf0[a][b]<<(i*2);
629: }
630: return v;
631: case 1:
632: for (i=0; i<(size*4); i++) {
633: a=old>>(i*2)&3;
634: b=new>>(i*2)&3;
635: v|=mwf1[a][b]<<(i*2);
636: }
637: return v;
638: case 2:
639: for (i=0; i<(size*4); i++) {
640: a=old>>(i*2)&3;
641: b=new>>(i*2)&3;
642: v|=mwf2[a][b]<<(i*2);
643: }
644: return v;
645: case 3:
646: for (i=0; i<(size*4); i++) {
647: a=old>>(i*2)&3;
648: b=new>>(i*2)&3;
649: v|=mwf3[a][b]<<(i*2);
650: }
651: return v;
652:
653: default:
654: write_log("Unknown memory write function!\n");
655: abort();
656: }
657: }
658:
659: static uae_u32 mem_ram_mwf_lget(uaecptr addr)
660: {
661: int function = (addr>>26)&0x3;
662: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
663:
664: return function==0?0xFFFFFFFF:0;
665: }
666:
667: static uae_u32 mem_ram_mwf_wget(uaecptr addr)
668: {
669: int function = (addr>>26)&0x3;
670: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
671:
672: return function==0?0xFFFF:0;
673: }
674:
675: static uae_u32 mem_ram_mwf_bget(uaecptr addr)
676: {
677: int function = (addr>>26)&0x3;
678: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
679:
680: return function==0?0xFF:0;
681: }
682:
683: static void mem_ram_mwf_lput(uaecptr addr, uae_u32 l)
684: {
685: int function = (addr>>26)&0x3;
686: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
687:
688: uae_u32 old = longget(addr);
689: uae_u32 val = memory_write_func(old, l, function, 4);
690:
691: longput(addr, val);
692: }
693:
694: static void mem_ram_mwf_wput(uaecptr addr, uae_u32 w)
695: {
696: int function = (addr>>26)&0x3;
697: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
698:
699: uae_u32 old = wordget(addr);
700: uae_u32 val = memory_write_func(old, w, function, 2);
701:
702: wordput(addr, val);
703: }
704:
705: static void mem_ram_mwf_bput(uaecptr addr, uae_u32 b)
706: {
707: int function = (addr>>26)&0x3;
708: addr = NEXT_RAM_START|(addr&0x03FFFFFF);
709:
710: uae_u32 old = byteget(addr);
711: uae_u32 val = memory_write_func(old, b, function, 1);
712:
713: byteput(addr, val);
714: }
715:
716:
717: static uae_u32 mem_video_mwf_lget(uaecptr addr)
718: {
719: int function = (addr>>24)&0x3;
720: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
721:
722: return function==0?0xFFFFFFFF:0;
723: }
724:
725: static uae_u32 mem_video_mwf_wget(uaecptr addr)
726: {
727: int function = (addr>>24)&0x3;
728: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
729:
730: return function==0?0xFFFF:0;
731: }
732:
733: static uae_u32 mem_video_mwf_bget(uaecptr addr)
734: {
735: int function = (addr>>24)&0x3;
736: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
737:
738: return function==0?0xFF:0;
739: }
740:
741: static void mem_video_mwf_lput(uaecptr addr, uae_u32 l)
742: {
743: int function = (addr>>24)&0x3;
744: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
745:
746: uae_u32 old = longget(addr);
747: uae_u32 val = memory_write_func(old, l, function, 4);
748:
749: longput(addr, val);
750: }
751:
752: static void mem_video_mwf_wput(uaecptr addr, uae_u32 w)
753: {
754: int function = (addr>>24)&0x3;
755: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
756:
757: uae_u32 old = wordget(addr);
758: uae_u32 val = memory_write_func(old, w, function, 2);
759:
760: wordput(addr, val);
761: }
762:
763: static void mem_video_mwf_bput(uaecptr addr, uae_u32 b)
764: {
765: int function = (addr>>24)&0x3;
766: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK);
767:
768: uae_u32 old = byteget(addr);
769: uae_u32 val = memory_write_func(old, b, function, 1);
770:
771: byteput(addr, val);
772: }
773:
774:
775: /* **** NEXT VRAM memory for color systems **** */
776:
777: static uae_u32 mem_color_video_lget(uaecptr addr)
778: {
779: addr &= NEXT_VRAM_COLOR_MASK;
780: return do_get_mem_long(NEXTColorVideo + addr);
781: }
782:
783: static uae_u32 mem_color_video_wget(uaecptr addr)
784: {
785: addr &= NEXT_VRAM_COLOR_MASK;
786: return do_get_mem_word(NEXTColorVideo + addr);
787: }
788:
789: static uae_u32 mem_color_video_bget(uaecptr addr)
790: {
791: addr &= NEXT_VRAM_COLOR_MASK;
792: return NEXTColorVideo[addr];
793: }
794:
795: static void mem_color_video_lput(uaecptr addr, uae_u32 l)
796: {
797: addr &= NEXT_VRAM_COLOR_MASK;
798: do_put_mem_long(NEXTColorVideo + addr, l);
799: }
800:
801: static void mem_color_video_wput(uaecptr addr, uae_u32 w)
802: {
803: addr &= NEXT_VRAM_COLOR_MASK;
804: do_put_mem_word(NEXTColorVideo + addr, w);
805: }
806:
807: static void mem_color_video_bput(uaecptr addr, uae_u32 b)
808: {
809: addr &= NEXT_VRAM_COLOR_MASK;
810: NEXTColorVideo[addr] = b;
811: }
812:
813:
814: /* Hardware IO memory */
815: /* --> see ioMem.c */
816: uae_u8 *IOmemory;
817:
818:
819: /* **** NEXT BMAP memory **** */
820:
821: static uae_u32 mem_bmap_lget(uaecptr addr)
822: {
823: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
824: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
825: M68000_BusError(addr, 0);
826: return 0;
827: }
828: //write_log ("bmap lget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
829: addr &= NEXT_BMAP_MASK;
830: return bmap_lget(addr);
831: }
832:
833: static uae_u32 mem_bmap_wget(uaecptr addr)
834: {
835: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
836: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
837: M68000_BusError(addr, 0);
838: return 0;
839: }
840: //write_log ("bmap wget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
841: addr &= NEXT_BMAP_MASK;
842: return bmap_wget(addr);
843: }
844:
845: static uae_u32 mem_bmap_bget(uaecptr addr)
846: {
847: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
848: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
849: M68000_BusError(addr, 0);
850: return 0;
851: }
852: //write_log ("bmap bget at %08lx PC=%08x\n", (long)addr,m68k_getpc());
853: addr &= NEXT_BMAP_MASK;
854: return bmap_bget(addr);
855: }
856:
857: static void mem_bmap_lput(uaecptr addr, uae_u32 l)
858: {
859: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
860: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
861: M68000_BusError(addr, 0);
862: }
863: //write_log ("bmap lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc());
864: addr &= NEXT_BMAP_MASK;
865: bmap_lput(addr, l);
866: }
867:
868: static void mem_bmap_wput(uaecptr addr, uae_u32 w)
869: {
870: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
871: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
872: M68000_BusError(addr, 0);
873: }
874: //write_log ("bmap wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc());
875: addr &= NEXT_BMAP_MASK;
876: bmap_wput(addr, w);
877: }
878:
879: static void mem_bmap_bput(uaecptr addr, uae_u32 b)
880: {
881: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) {
882: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc());
883: M68000_BusError(addr, 0);
884: }
885: //write_log ("bmap bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc());
886: addr &= NEXT_BMAP_MASK;
887: bmap_bput(addr, b);
888: }
889:
890:
891:
892: /* **** Address banks **** */
893:
894: static addrbank dummy_bank =
895: {
896: dummy_lget, dummy_wget, dummy_bget,
897: dummy_lput, dummy_wput, dummy_bput,
898: dummy_lget, dummy_wget, ABFLAG_NONE
899: };
900:
901: static addrbank BusErrMem_bank =
902: {
903: BusErrMem_lget, BusErrMem_wget, BusErrMem_bget,
904: BusErrMem_lput, BusErrMem_wput, BusErrMem_bput,
905: BusErrMem_lget, BusErrMem_wget, ABFLAG_NONE
906: };
907:
908: static addrbank ROM_bank =
909: {
910: mem_rom_lget, mem_rom_wget, mem_rom_bget,
911: mem_rom_lput, mem_rom_wput, mem_rom_bput,
912: mem_rom_lget, mem_rom_wget, ABFLAG_ROM
913: };
914:
915: static addrbank RAM_bank0 =
916: {
917: mem_ram_bank0_lget, mem_ram_bank0_wget, mem_ram_bank0_bget,
918: mem_ram_bank0_lput, mem_ram_bank0_wput, mem_ram_bank0_bput,
919: mem_ram_bank0_lget, mem_ram_bank0_wget, ABFLAG_RAM
920:
921: };
922:
923: static addrbank RAM_bank1 =
924: {
925: mem_ram_bank1_lget, mem_ram_bank1_wget, mem_ram_bank1_bget,
926: mem_ram_bank1_lput, mem_ram_bank1_wput, mem_ram_bank1_bput,
927: mem_ram_bank1_lget, mem_ram_bank1_wget, ABFLAG_RAM
928:
929: };
930:
931: static addrbank RAM_bank2 =
932: {
933: mem_ram_bank2_lget, mem_ram_bank2_wget, mem_ram_bank2_bget,
934: mem_ram_bank2_lput, mem_ram_bank2_wput, mem_ram_bank2_bput,
935: mem_ram_bank2_lget, mem_ram_bank2_wget, ABFLAG_RAM
936:
937: };
938:
939: static addrbank RAM_bank3 =
940: {
941: mem_ram_bank3_lget, mem_ram_bank3_wget, mem_ram_bank3_bget,
942: mem_ram_bank3_lput, mem_ram_bank3_wput, mem_ram_bank3_bput,
943: mem_ram_bank3_lget, mem_ram_bank3_wget, ABFLAG_RAM
944:
945: };
946:
947: static addrbank RAM_empty_bank =
948: {
949: mem_ram_empty_lget, mem_ram_empty_wget, mem_ram_empty_bget,
950: mem_ram_empty_lput, mem_ram_empty_wput, mem_ram_empty_bput,
951: mem_ram_empty_lget, mem_ram_empty_wget, ABFLAG_RAM
952: };
953:
954: static addrbank RAM_mwf_bank =
955: {
956: mem_ram_mwf_lget, mem_ram_mwf_wget, mem_ram_mwf_bget,
957: mem_ram_mwf_lput, mem_ram_mwf_wput, mem_ram_mwf_bput,
958: mem_ram_mwf_lget, mem_ram_mwf_wget, ABFLAG_RAM
959: };
960:
961: static addrbank VRAM_bank =
962: {
963: mem_video_lget, mem_video_wget, mem_video_bget,
964: mem_video_lput, mem_video_wput, mem_video_bput,
965: mem_video_lget, mem_video_wget, ABFLAG_RAM
966: };
967:
968: static addrbank VRAM_mwf_bank =
969: {
970: mem_video_mwf_lget, mem_video_mwf_wget, mem_video_mwf_bget,
971: mem_video_mwf_lput, mem_video_mwf_wput, mem_video_mwf_bput,
972: mem_video_mwf_lget, mem_video_mwf_wget, ABFLAG_RAM
973: };
974:
975: static addrbank VRAM_color_bank =
976: {
977: mem_color_video_lget, mem_color_video_wget, mem_color_video_bget,
978: mem_color_video_lput, mem_color_video_wput, mem_color_video_bput,
979: mem_color_video_lget, mem_color_video_wget, ABFLAG_RAM
980: };
981:
982: static addrbank IO_bank =
983: {
984: IoMem_lget, IoMem_wget, IoMem_bget,
985: IoMem_lput, IoMem_wput, IoMem_bput,
986: IoMem_lget, IoMem_wget, ABFLAG_IO
987: };
988:
989: static addrbank BMAP_bank =
990: {
991: mem_bmap_lget, mem_bmap_wget, mem_bmap_bget,
992: mem_bmap_lput, mem_bmap_wput, mem_bmap_bput,
993: mem_bmap_lget, mem_bmap_wget, ABFLAG_IO
994: };
995:
996: static addrbank TMC_bank =
997: {
998: tmc_lget, tmc_wget, tmc_bget,
999: tmc_lput, tmc_wput, tmc_bput,
1000: tmc_lget, tmc_wget, ABFLAG_IO
1001: };
1002:
1003: static addrbank NBIC_bank =
1004: {
1005: nbic_reg_lget, nbic_reg_wget, nbic_reg_bget,
1006: nbic_reg_lput, nbic_reg_wput, nbic_reg_bput,
1007: nbic_reg_lget, nbic_reg_wget, ABFLAG_IO
1008: };
1009:
1010: static addrbank NEXTBUS_slot_bank =
1011: {
1012: nextbus_slot_lget, nextbus_slot_wget, nextbus_slot_bget,
1013: nextbus_slot_lput, nextbus_slot_wput, nextbus_slot_bput,
1014: nextbus_slot_lget, nextbus_slot_wget, ABFLAG_IO
1015: };
1016:
1017: static addrbank NEXTBUS_board_bank =
1018: {
1019: nextbus_board_lget, nextbus_board_wget, nextbus_board_bget,
1020: nextbus_board_lput, nextbus_board_wput, nextbus_board_bput,
1021: nextbus_board_lget, nextbus_board_wget, ABFLAG_IO
1022: };
1023:
1024:
1025:
1026: static void init_mem_banks (void)
1027: {
1028: int i;
1029: for (i = 0; i < 65536; i++)
1030: put_mem_bank (i<<16, &BusErrMem_bank);
1031: }
1032:
1033:
1034: /*
1035: * Initialize the memory banks
1036: */
1037: const char* memory_init(int *nNewNEXTMemSize)
1038: {
1039: int i;
1040: uae_u32 bankstart[4];
1041:
1042: /* Set machine dependent variables */
1043: if (ConfigureParams.System.bTurbo) {
1044: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX_T;
1045: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL_T;
1046: } else if (ConfigureParams.System.bColor) {
1047: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX_C;
1048: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL_C;
1049: } else {
1050: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX;
1051: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL;
1052: }
1053:
1054: write_log("Memory init: Memory size: %iMB\n", Configuration_CheckMemory(nNewNEXTMemSize));
1055:
1056: /* Convert values from MB to byte */
1057: for (i=0; i<N_BANKS; i++) {
1058: bankstart[i] = NEXT_RAM_START + (NEXT_ram_bank_size * i);
1059: }
1060:
1061: /* Fill every 65536 bank with dummy */
1062: init_mem_banks();
1063:
1064: /* Map ROM */
1065: map_banks(&ROM_bank, NEXT_EPROM_START >> 16, NEXT_EPROM_SIZE>>16);
1066: write_log("Mapping ROM at $%08x: %ikB\n", NEXT_EPROM_START, NEXT_EPROM_SIZE/1024);
1067: if (ConfigureParams.System.nMachineType != NEXT_CUBE030) {
1068: map_banks(&ROM_bank, NEXT_EPROM_BMAP_START >> 16, NEXT_EPROM_SIZE>>16);
1069: write_log("Mapping ROM trough BMAP at $%08x: %ikB\n", NEXT_EPROM_BMAP_START, NEXT_EPROM_SIZE/1024);
1070: }
1071:
1072: /* Map main memory */
1073: if (nNewNEXTMemSize[0]) {
1074: NEXT_ram_bank0_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[0]<<20)-1);
1075: map_banks(&RAM_bank0, bankstart[0]>>16, NEXT_ram_bank_size >> 16);
1076: write_log("Mapping main memory bank0 at $%08x: %iMB\n", bankstart[0], nNewNEXTMemSize[0]);
1077: } else {
1078: NEXT_ram_bank0_mask = 0;
1079: map_banks(&RAM_empty_bank, bankstart[0]>>16, NEXT_ram_bank_size >> 16);
1080: write_log("Mapping main memory bank0 at $%08x: empty\n", bankstart[0]);
1081: }
1082:
1083: if (nNewNEXTMemSize[1]) {
1084: NEXT_ram_bank1_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[1]<<20)-1);
1085: map_banks(&RAM_bank1, bankstart[1]>>16, NEXT_ram_bank_size >> 16);
1086: write_log("Mapping main memory bank1 at $%08x: %iMB\n", bankstart[1], nNewNEXTMemSize[1]);
1087: } else {
1088: NEXT_ram_bank1_mask = 0;
1089: map_banks(&RAM_empty_bank, bankstart[1]>>16, NEXT_ram_bank_size >> 16);
1090: write_log("Mapping main memory bank1 at $%08x: empty\n", bankstart[1]);
1091: }
1092:
1093: if (nNewNEXTMemSize[2]) {
1094: NEXT_ram_bank2_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[2]<<20)-1);
1095: map_banks(&RAM_bank2, bankstart[2]>>16, NEXT_ram_bank_size >> 16);
1096: write_log("Mapping main memory bank2 at $%08x: %iMB\n", bankstart[2], nNewNEXTMemSize[2]);
1097: } else {
1098: NEXT_ram_bank2_mask = 0;
1099: map_banks(&RAM_empty_bank, bankstart[2]>>16, NEXT_ram_bank_size >> 16);
1100: write_log("Mapping main memory bank2 at $%08x: empty\n", bankstart[2]);
1101: }
1102:
1103: if (nNewNEXTMemSize[3]) {
1104: NEXT_ram_bank3_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[3]<<20)-1);
1105: map_banks(&RAM_bank3, bankstart[3]>>16, NEXT_ram_bank_size >> 16);
1106: write_log("Mapping main memory bank3 at $%08x: %iMB\n", bankstart[3], nNewNEXTMemSize[3]);
1107: } else {
1108: NEXT_ram_bank3_mask = 0;
1109: map_banks(&RAM_empty_bank, bankstart[3]>>16, NEXT_ram_bank_size >> 16);
1110: write_log("Mapping main memory bank3 at $%08x: empty\n", bankstart[3]);
1111: }
1112:
1113: /* Map mirrors of main memory for memory write functions */
1114: if (!ConfigureParams.System.bColor && !ConfigureParams.System.bTurbo) {
1115: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF0_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16);
1116: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF1_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16);
1117: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF2_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16);
1118: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF3_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16);
1119: write_log("Mapping mirrors of main memory for memory write functions:\n");
1120: for (i = 0; i<4; i++)
1121: write_log("Function%i at $%08X\n",i,0x10000000+0x04000000*i);
1122: }
1123:
1124: /* Map video memory */
1125: if (ConfigureParams.System.bTurbo && ConfigureParams.System.bColor) {
1126: map_banks(&VRAM_color_bank, NEXT_VRAM_TURBO_START>>16, NEXT_VRAM_COLOR_SIZE >> 16);
1127: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_TURBO_START, NEXT_VRAM_COLOR_SIZE/1024);
1128: } else if (ConfigureParams.System.bTurbo) {
1129: map_banks(&VRAM_bank, NEXT_VRAM_TURBO_START>>16, NEXT_VRAM_SIZE >> 16);
1130: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_TURBO_START, NEXT_VRAM_SIZE/1024);
1131: } else if (ConfigureParams.System.bColor) {
1132: map_banks(&VRAM_color_bank, NEXT_VRAM_COLOR_START>>16, NEXT_VRAM_COLOR_SIZE >> 16);
1133: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_COLOR_START, NEXT_VRAM_COLOR_SIZE/1024);
1134: } else {
1135: map_banks(&VRAM_bank, NEXT_VRAM_START>>16, NEXT_VRAM_SIZE >> 16);
1136: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_START, NEXT_VRAM_SIZE/1024);
1137:
1138: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF0_START>>16, NEXT_VRAM_SIZE >> 16);
1139: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF1_START>>16, NEXT_VRAM_SIZE >> 16);
1140: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF2_START>>16, NEXT_VRAM_SIZE >> 16);
1141: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF3_START>>16, NEXT_VRAM_SIZE >> 16);
1142: write_log("Mapping mirrors of video memory for memory write functions:\n");
1143: for (i = 0; i<4; i++)
1144: write_log("Function%i at $%08X\n",i,0x0C000000+0x01000000*i);
1145: }
1146:
1147: /* Map device space */
1148: map_banks(&IO_bank, NEXT_IO_START >> 16, NEXT_IO_SIZE>>16);
1149: write_log("Mapping device space at $%08X\n", NEXT_IO_START);
1150:
1151: if (ConfigureParams.System.nMachineType != NEXT_CUBE030) {
1152: map_banks(&IO_bank, NEXT_IO_BMAP_START >> 16, NEXT_IO_SIZE>>16);
1153: if (!ConfigureParams.System.bTurbo) {
1154: map_banks(&BMAP_bank, NEXT_BMAP_START >> 16, NEXT_BMAP_MAP_SIZE>>16);
1155: map_banks(&BMAP_bank, (0x80000000|NEXT_BMAP_START) >> 16, NEXT_BMAP_MAP_SIZE>>16);
1156: write_log("Mapping BMAP device space at $%08X\n", NEXT_IO_BMAP_START);
1157: } else {
1158: write_log("Mapping device space at $%08X\n", NEXT_IO_BMAP_START);
1159: }
1160: }
1161: bmap_init();
1162:
1163: if (ConfigureParams.System.bTurbo) {
1164: map_banks(&TMC_bank, NEXT_IO_TMC_START >> 16, NEXT_IO_SIZE>>16);
1165: write_log("Mapping TMC device space at $%08X\n", NEXT_IO_TMC_START);
1166:
1167: if (ConfigureParams.System.nCpuFreq==40) {
1168: map_banks(&dummy_bank, NEXT_CACHE_START>>16, NEXT_CACHE_SIZE>>16);
1169: write_log("Mapping cache memory at $%08x: %ikB\n", NEXT_CACHE_START, NEXT_CACHE_SIZE/1024);
1170: map_banks(&dummy_bank, NEXT_CACHE_TAG_START>>16, NEXT_CACHE_TAG_SIZE>>16);
1171: write_log("Mapping cache tag memory at $%08x: %ikB\n", NEXT_CACHE_TAG_START, NEXT_CACHE_TAG_SIZE/1024);
1172: }
1173: }
1174:
1175: /* Map NBIC and board spaces via NextBus */
1176: if (ConfigureParams.System.nMachineType!=NEXT_STATION && ConfigureParams.System.bNBIC) {
1177: if (!ConfigureParams.System.bTurbo) {
1178: map_banks(&NBIC_bank, NEXT_NBIC_START>>16, NEXT_NBIC_MAP_SIZE>>16);
1179: write_log("Mapping NextBus interface chip at $%08x\n", NEXT_NBIC_START);
1180: }
1181: for (i = 2; i < 8; i++) {
1182: if (i==8 && ConfigureParams.System.nMachineType!=NEXT_CUBE030 && !ConfigureParams.System.bTurbo) {
1183: /* FIXME: conflict with BMAP. Implement: only SCR2 ROM_OVERLAY enables NBIC */
1184: continue;
1185: }
1186: map_banks(&NEXTBUS_board_bank, NEXTBUS_BOARD_START(i)>>16, NEXTBUS_BOARD_SIZE>>16);
1187: write_log("Mapping NextBus board memory for slot %i at $%08x\n", i, NEXTBUS_BOARD_START(i));
1188: }
1189: for (i = 0; i < 16; i++) {
1190: map_banks(&NEXTBUS_slot_bank, NEXTBUS_SLOT_START(i)>>16, NEXTBUS_SLOT_SIZE>>16);
1191: }
1192: write_log("Mapping NextBus slot memory at $%08x\n", NEXTBUS_SLOT_START(i));
1193: }
1194: nextbus_init();
1195:
1196: ROMmemory=NEXTRom;
1197: IOmemory=NEXTIo;
1198:
1199: {
1200: FILE* fin;
1201: int ret;
1202: /* Loading ROM depending on emulated system */
1203: if(ConfigureParams.System.nMachineType == NEXT_CUBE030)
1204: fin=fopen(ConfigureParams.Rom.szRom030FileName,"rb");
1205: else if(ConfigureParams.System.bTurbo == true)
1206: fin=fopen(ConfigureParams.Rom.szRomTurboFileName,"rb");
1207: else
1208: fin=fopen(ConfigureParams.Rom.szRom040FileName, "rb");
1209:
1210: if (fin==NULL) {
1211: return "Cannot open ROM file";
1212: }
1213:
1214: ret=fread(ROMmemory,1,0x20000,fin);
1215:
1216: write_log("Read ROM %d\n",ret);
1217: fclose(fin);
1218: }
1219:
1220: {
1221: int i;
1222: for (i=0;i<sizeof(NEXTVideo);i++) NEXTVideo[i]=0;
1223: for (i=0;i<sizeof(NEXTRam);i++) NEXTRam[i]=0;
1224: for (i=0;i<sizeof(NEXTIo);i++) NEXTIo[i]=0;
1225: }
1226:
1227: IoMem_Init();
1228:
1229: return NULL;
1230: }
1231:
1232:
1233: /*
1234: * Uninitialize the memory banks.
1235: */
1236: void memory_uninit (void)
1237: {
1238: }
1239:
1240:
1241: void map_banks (addrbank *bank, int start, int size)
1242: {
1243: int bnr;
1244:
1245: for (bnr = start; bnr < start + size; bnr++)
1246: put_mem_bank (bnr << 16, bank);
1247: return;
1248: }
1249:
1250: void memory_hardreset (void)
1251: {
1252: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.