|
|
1.1 root 1: #include <stdio.h>
2: #include <limits.h>
3: #include <stdlib.h>
4:
5: #include "main.h"
6: #include "configuration.h"
7: #include "m68000.h"
8: #include "sysdeps.h"
9: #include "dimension.h"
10: #include "nd_devs.h"
11: #include "nd_nbic.h"
12: #include "i860cfg.h"
13: #include "nd_sdl.h"
14:
15: #if ENABLE_DIMENSION
16:
17: /* --------- NEXTDIMENSION DEVICES ---------- */
18:
19: /* Device registers */
20:
21: /* Memory controller */
22: #define ND_MC_CSR0 0xFF800000
23: #define ND_MC_CSR1 0xFF800010
24: #define ND_MC_CSR2 0xFF800020
25: #define ND_MC_SID 0xFF800030
26:
27: #define ND_MC_DMA_CSR 0xFF801000
28:
29: #define ND_MC_VRAM_TIMING 0xFF802000
30: #define ND_MC_DRAM_SIZE 0xFF803000
31:
32: /* CSR bits */
33: #define CSR0_i860PIN_RESET 0x00000001
34: #define CSR0_i860PIN_CS8 0x00000002
35: #define CSR0_i860_IMASK 0x00000004
36: #define CSR0_i860_INT 0x00000008
37: #define CSR0_BE_IMASK 0x00000010
38: #define CSR0_BE_INT 0x00000020
39: #define CSR0_VBL_IMASK 0x00000040
40: #define CSR0_VBL_INT 0x00000080
41: #define CSR0_VBLANK 0x00000100 /* ro */
42: #define CSR0_VIOVBL_IMASK 0x00000200
43: #define CSR0_VIOVBL_INT 0x00000400
44: #define CSR0_VIOBLANK 0x00000800 /* ro */
45: #define CSR0_i860_CACHE_EN 0x00001000
46:
47: #define CSR1_CPU_INT 0x00000001
48:
49: #define CSR2_GLOBAL_ACCESS 0x00000001
50:
51: #define CSRDMA_VISIBLE_EN 0x00000001
52: #define CSRDMA_BLANKED_EN 0x00000002
53: #define CSRDMA_READ_EN 0x00000004
54:
55: #define CSRVRAM_VBLANK 0x00000001
56: #define CSRVRAM_60HZ 0x00000002
57: #define CSRVRAM_EXT_SYNC 0x00000004
58:
59: #define CSRDRAM_4MBIT 0x00000001
60:
61: static
62: #if ENABLE_I860_THREAD
63: volatile
64: #endif
65: struct {
66: uae_u32 csr0;
67: uae_u32 csr1;
68: uae_u32 csr2;
69: uae_u32 sid;
70: uae_u32 dma_csr;
71: uae_u32 dma_start;
72: uae_u32 dma_width;
73: uae_u32 dma_pstart;
74: uae_u32 dma_pwidth;
75: uae_u32 dma_sstart;
76: uae_u32 dma_swidth;
77: uae_u32 dma_bsstart;
78: uae_u32 dma_bswidth;
79: uae_u32 dma_top;
80: uae_u32 dma_bottom;
81: uae_u32 dma_line_a;
82: uae_u32 dma_curr_a;
83: uae_u32 dma_scurr_a;
84: uae_u32 dma_out_a;
85: uae_u32 vram;
86: uae_u32 dram;
87: } nd_mc;
88: static lock_t nd_mc_lock;
89:
90: #define DP_IIC_MORE 0x20000000
91: #define DP_IIC_BUSY 0x80000000
92:
93: static struct {
94: uae_u8 iic_addr;
95: uae_u8 iic_msg[4096];
96: uae_u32 iic_msgsz;
97: int iic_busy;
98: uae_u32 doff; // (SC) wild guess - vram offset in pixels?
99: uae_u32 csr;
100: uae_u32 alpha;
101: uae_u32 dma;
102: uae_u32 cpu_x;
103: uae_u32 cpu_y;
104: uae_u32 dma_x;
105: uae_u32 dma_y;
106: uae_u32 iic_stat_addr;
107: uae_u32 iic_data;
108: } nd_dp;
109:
110: /* nd_display_blank_start is called from SDL. See nd_sdl.c */
111: void nd_display_blank_start() {
112: lock(&nd_mc_lock);
113: Uint32 csr0 = nd_mc.csr0;
114: csr0 |= CSR0_VBL_INT | CSR0_VBLANK;
115: nd_mc.csr0 = csr0;
116: unlock(&nd_mc_lock);
117: i860_tick((csr0 & CSR0_VBL_IMASK) != 0);
118: }
119:
120: /* nd_display_blank_start is called from SDL. See nd_sdl.c */
121: void nd_display_blank_end() {
122: lock(&nd_mc_lock);
123: nd_mc.csr0 &= ~CSR0_VBLANK;
124: unlock(&nd_mc_lock);
125: }
126:
127: /* nd_video_vbl is called from SDL. See nd_sdl.c */
128: Uint32 nd_video_vbl(Uint32 interval, void *param) {
129: lock(&nd_mc_lock);
130: Uint32 csr0 = nd_mc.csr0;
131: if(csr0 & CSR0_VIOBLANK) {
132: csr0 &= ~CSR0_VIOBLANK;
133: interval = VIDEO_VBL_MS-BLANK_MS;
134: } else {
135: csr0 |= CSR0_VIOVBL_INT | CSR0_VIOBLANK;
136: interval = BLANK_MS;
137: }
138: nd_mc.csr0 = csr0;
139: unlock(&nd_mc_lock);
140: i860_tick((csr0 & CSR0_VIOVBL_IMASK) != 0);
141: return interval;
142: }
143:
144: void nd_devs_init() {
145: nd_set_speed_hack(0);
146:
147: nd_mc.csr0 = 0;
148: nd_mc.csr1 = 0;
149: nd_mc.csr2 = 0;
150: nd_mc.sid = ND_SLOT;
151: nd_mc.dma_csr = 0;
152: nd_mc.dma_start = 0;
153: nd_mc.dma_width = 0;
154: nd_mc.dma_pstart = 0;
155: nd_mc.dma_pwidth = 0;
156: nd_mc.dma_sstart = 0;
157: nd_mc.dma_swidth = 0;
158: nd_mc.dma_bsstart = 0;
159: nd_mc.dma_bswidth = 0;
160: nd_mc.dma_top = 0;
161: nd_mc.dma_bottom = 0;
162: nd_mc.dma_line_a = 0;
163: nd_mc.dma_curr_a = 0;
164: nd_mc.dma_scurr_a = 0;
165: nd_mc.dma_out_a = 0;
166: nd_mc.vram = 0;
167: nd_mc.dram = 0;
168: nd_dp.iic_msgsz = 0;
169: nd_dp.iic_addr = 0;
170: nd_dp.csr = 0;
171: nd_dp.alpha = 0;
172: nd_dp.dma = 0;
173: nd_dp.cpu_x = 0xc;
174: nd_dp.cpu_y = 0xc;
175: nd_dp.dma_x = 0xd;
176: nd_dp.dma_y = 0xd;
177: nd_dp.iic_stat_addr = 0;
178: nd_dp.iic_data = 0;
179: }
180:
181:
182: static const char* ND_CSR0_BITS[] = {
183: "i860PIN_RESET", "i860PIN_CS8", "i860_IMASK", "i860_INT",
184: "BE_IMASK", "BE_INT", "VBL_IMASK", "VBL_INT",
185: "VBLANK", "VIOVBL_IMASK", "VIOVBL_INT", "VIOBLANK",
186: "i860_CACHE_EN", "00002000", "00004000", "00008000",
187: "00010000", "00020000", "00040000", "00080000",
188: "00100000", "00200000", "00400000", "00800000",
189: "01000000", "02000000", "04000000", "08000000",
190: "10000000", "20000000", "40000000", "80000000",
191: };
192:
193: static const char* ND_CSR1_BITS[] = {
194: "CPU_INT", "00000002", "00000004", "00000008",
195: "00000010", "00000020", "00000040", "00000080",
196: "00000100", "00000200", "00000400", "00000800",
197: "00001000", "00002000", "00004000", "00008000",
198: "00010000", "00020000", "00040000", "00080000",
199: "00100000", "00200000", "00400000", "00800000",
200: "01000000", "02000000", "04000000", "08000000",
201: "10000000", "20000000", "40000000", "80000000",
202: };
203:
204: static const char* ND_CSR2_BITS[] = {
205: "GLOBAL_ACCESS", "00000002", "00000004", "00000008",
206: "00000010", "00000020", "00000040", "00000080",
207: "00000100", "00000200", "00000400", "00000800",
208: "00001000", "00002000", "00004000", "00008000",
209: "00010000", "00020000", "00040000", "00080000",
210: "00100000", "00200000", "00400000", "00800000",
211: "01000000", "02000000", "04000000", "08000000",
212: "10000000", "20000000", "40000000", "80000000",
213: };
214:
215: static const char* ND_DMA_CSR_BITS[] = {
216: "VISIBLE_EN", "BLANKED_EN", "READ_EN", "00000008",
217: "00000010", "00000020", "00000040", "00000080",
218: "00000100", "00000200", "00000400", "00000800",
219: "00001000", "00002000", "00004000", "00008000",
220: "00010000", "00020000", "00040000", "00080000",
221: "00100000", "00200000", "00400000", "00800000",
222: "01000000", "02000000", "04000000", "08000000",
223: "10000000", "20000000", "40000000", "80000000",
224: };
225:
226: static const char* ND_VRAM_BITS[] = {
227: "VBLANK", "60HZ", "EXT_SYNC", "00000008",
228: "00000010", "00000020", "00000040", "00000080",
229: "00000100", "00000200", "00000400", "00000800",
230: "00001000", "00002000", "00004000", "00008000",
231: "00010000", "00020000", "00040000", "00080000",
232: "00100000", "00200000", "00400000", "00800000",
233: "01000000", "02000000", "04000000", "08000000",
234: "10000000", "20000000", "40000000", "80000000",
235: };
236:
237: static const char* ND_DRAM_BITS[] = {
238: "4MBIT", "00000002", "00000004", "00000008",
239: "00000010", "00000020", "00000040", "00000080",
240: "00000100", "00000200", "00000400", "00000800",
241: "00001000", "00002000", "00004000", "00008000",
242: "00010000", "00020000", "00040000", "00080000",
243: "00100000", "00200000", "00400000", "00800000",
244: "01000000", "02000000", "04000000", "08000000",
245: "10000000", "20000000", "40000000", "80000000",
246: };
247:
248: static const char* decodeBits(const char** bits, uae_u32 val) {
249: static char buffer[512];
250: char* result = buffer;
251:
252: if(bits) {
253: *result = 0;
254: for(int i = 0; i < 32; i++) {
255: if(val & (1 << i)) {
256: const char* str = bits[i];
257: while(*str) *result++ = *str++;
258: *result++ = '|';
259: }
260: }
261: if(result != buffer)
262: *--result = 0;
263: }
264: else
265: sprintf(buffer, "%08X", val);
266: return buffer;
267: }
268:
269: static const char* MC_RD_FORMAT = "[ND] Memory controller %s read %08X at %08X";
270: static const char* MC_RD_FORMAT_S = "[ND] Memory controller %s read (%s) at %08X";
271:
272: uae_u32 nd_mc_read_register(uaecptr addr) {
273: switch (addr&0x3FFF) {
274: case 0x0000:
275: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr0", decodeBits(ND_CSR0_BITS, nd_mc.csr0),addr);
276: return nd_mc.csr0;
277: case 0x0010:
278: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr1", decodeBits(ND_CSR1_BITS, nd_mc.csr1),addr);
279: return nd_mc.csr1;
280: case 0x0020:
281: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr2", decodeBits(ND_CSR2_BITS, nd_mc.csr2),addr);
282: return nd_mc.csr2;
283: case 0x0030:
284: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"sid", nd_mc.sid,addr);
285: return nd_mc.sid;
286: case 0x1000:
287: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"dma_csr", decodeBits(ND_DMA_CSR_BITS, nd_mc.dma_csr),addr);
288: return nd_mc.dma_csr;
289: case 0x1010:
290: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_start", nd_mc.dma_start,addr);
291: return nd_mc.dma_start;
292: case 0x1020:
293: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_width", nd_mc.dma_width,addr);
294: return nd_mc.dma_width;
295: case 0x1030:
296: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_pstart", nd_mc.dma_pstart,addr);
297: return nd_mc.dma_pstart;
298: case 0x1040:
299: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_pwidth", nd_mc.dma_pwidth,addr);
300: return nd_mc.dma_pwidth;
301: case 0x1050:
302: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_sstart", nd_mc.dma_sstart,addr);
303: return nd_mc.dma_sstart;
304: case 0x1060:
305: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_swidth", nd_mc.dma_swidth,addr);
306: return nd_mc.dma_swidth;
307: case 0x1070:
308: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bsstart", nd_mc.dma_bsstart,addr);
309: return nd_mc.dma_bsstart;
310: case 0x1080:
311: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bswidth", nd_mc.dma_bswidth,addr);
312: return nd_mc.dma_bswidth;
313: case 0x1090:
314: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_top", nd_mc.dma_top,addr);
315: return nd_mc.dma_top;
316: case 0x10A0:
317: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bottom", nd_mc.dma_bottom,addr);
318: return nd_mc.dma_bottom;
319: case 0x10B0:
320: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_line_a", nd_mc.dma_line_a,addr);
321: return nd_mc.dma_line_a;
322: case 0x10C0:
323: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_curr_a", nd_mc.dma_curr_a,addr);
324: return nd_mc.dma_curr_a;
325: case 0x10D0:
326: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_line_a", nd_mc.dma_line_a,addr);
327: return nd_mc.dma_line_a;
328: case 0x10E0:
329: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_scurr_a", nd_mc.dma_scurr_a,addr);
330: return nd_mc.dma_scurr_a;
331: case 0x10F0:
332: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_out_a", nd_mc.dma_out_a,addr);
333: return nd_mc.dma_out_a;
334: case 0x2000:
335: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"vram", decodeBits(ND_VRAM_BITS, nd_mc.vram),addr);
336: return nd_mc.vram;
337: case 0x3000:
338: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"dram", decodeBits(ND_DRAM_BITS, nd_mc.dram),addr);
339: return nd_mc.dram;
340: default:
341: Log_Printf(LOG_WARN, "[ND] Memory controller UNKNOWN read at %08X",addr);
342: break;
343: }
344: return 0;
345: }
346:
347: static const char* MC_WR_FORMAT = "[ND] Memory controller %s write %08X at %08X";
348: static const char* MC_WR_FORMAT_S = "[ND] Memory controller %s write (%s) at %08X";
349:
350: void nd_mc_write_register(uaecptr addr, uae_u32 val) {
351: lock(&nd_mc_lock);
352: switch (addr&0x3FFF) {
353: case 0x0000:
354: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr0", decodeBits(ND_CSR0_BITS, val), addr);
355: if(val & CSR0_i860PIN_RESET) {
356: i860_reset();
357: val &= ~CSR0_i860PIN_RESET;
358: }
359: if ((nd_mc.csr0 & CSR0_i860_INT) && (nd_mc.csr0 & CSR0_i860_IMASK))
360: i860_tick(true);
361:
362: if((nd_mc.csr0 & CSR0_BE_INT) && (nd_mc.csr0 & CSR0_BE_IMASK))
363: i860_tick(true);
364:
365: nd_set_speed_hack((val & 0x00008000) ? 0 : 1);
366: nd_mc.csr0 = val;
367: break;
368: case 0x0010:
369: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr1", decodeBits(ND_CSR1_BITS, val),addr);
370: nd_mc.csr1 = val;
371: if (nd_mc.csr1&CSR1_CPU_INT) {
372: nd_nbic_set_intstatus(true);
373: } else {
374: nd_nbic_set_intstatus(false);
375: }
376: break;
377: case 0x0020:
378: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr2", decodeBits(ND_CSR2_BITS, val),addr);
379: nd_mc.csr2 = val;
380: break;
381: case 0x0030:
382: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"sid", val,addr);
383: nd_mc.sid = val;
384: break;
385: case 0x1000:
386: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"dma_csr", decodeBits(ND_DMA_CSR_BITS, val),addr);
387: nd_mc.dma_csr = val;
388: break;
389: case 0x1010:
390: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_start", val,addr);
391: nd_mc.dma_start = val;
392: break;
393: case 0x1020:
394: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_width", val,addr);
395: nd_mc.dma_width = val;
396: break;
397: case 0x1030:
398: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_pstart", val,addr);
399: nd_mc.dma_pstart = val;
400: break;
401: case 0x1040:
402: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_pwidth", val,addr);
403: nd_mc.dma_pwidth = val;
404: break;
405: case 0x1050:
406: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_sstart", val,addr);
407: nd_mc.dma_sstart = val;
408: break;
409: case 0x1060:
410: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_swidth", val,addr);
411: nd_mc.dma_swidth = val;
412: break;
413: case 0x1070:
414: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bsstart", val,addr);
415: nd_mc.dma_bsstart = val;
416: break;
417: case 0x1080:
418: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bswidth", val,addr);
419: nd_mc.dma_bswidth = val;
420: break;
421: case 0x1090:
422: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_top", val,addr);
423: nd_mc.dma_top = val;
424: break;
425: case 0x10A0:
426: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bottom", val,addr);
427: nd_mc.dma_bottom = val;
428: break;
429: case 0x10B0:
430: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_line_a", val,addr);
431: nd_mc.dma_line_a = val;
432: break;
433: case 0x10C0:
434: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_curr_a", val,addr);
435: nd_mc.dma_curr_a = val;
436: break;
437: case 0x10D0:
438: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_line_a", val,addr);
439: nd_mc.dma_line_a = val;
440: break;
441: case 0x10E0:
442: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_scurr_a", val,addr);
443: nd_mc.dma_scurr_a = val;
444: break;
445: case 0x10F0:
446: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_out_a", val,addr);
447: nd_mc.dma_out_a = val;
448: break;
449: case 0x2000:
450: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"vram", decodeBits(ND_VRAM_BITS, val),addr);
451: nd_mc.vram = val;
452: break;
453: case 0x3000:
454: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"dram", decodeBits(ND_DRAM_BITS, val),addr);
455: nd_mc.dram = val;
456: break;
457: default:
458: Log_Printf(LOG_WARN, "[ND] Memory controller UNKNOWN write at %08X",addr);
459: break;
460: }
461: unlock(&nd_mc_lock);
462: }
463:
464: /* NeXTdimension device space */
465: inline uae_u32 nd_io_lget(uaecptr addr) {
466: return nd_mc_read_register(addr);
467: }
468:
469: inline uae_u32 nd_io_wget(uaecptr addr) {
470: return 0;
471: }
472:
473: inline uae_u32 nd_io_bget(uaecptr addr) {
474: return 0;
475: }
476:
477: inline void nd_io_lput(uaecptr addr, uae_u32 l) {
478: nd_mc_write_register(addr, l);
479: }
480:
481: inline void nd_io_wput(uaecptr addr, uae_u32 w) {
482:
483: }
484:
485: inline void nd_io_bput(uaecptr addr, uae_u32 b) {
486:
487: }
488:
489: /* NeXTdimension RAMDAC */
490:
491: static struct {
492: int addr;
493: int idx;
494: Uint8 regs[0x1000];
495: } nd_ramdac;
496:
497: static void nd_ramdac_autoinc() {
498: nd_ramdac.idx++;
499: if(nd_ramdac.idx == 3) {
500: nd_ramdac.idx = 0;
501: nd_ramdac.addr++;
502: }
503: }
504:
505: inline uae_u32 nd_ramdac_bget(uaecptr addr) {
506: uae_u32 result = 0;
507: switch(addr & 0xF) {
508: case 0:
509: return nd_ramdac.addr & 0xFF;
510: case 0x4:
511: return (nd_ramdac.addr >> 8) & 0xFF;
512: case 0x8:
513: result = nd_ramdac.regs[nd_ramdac.addr*3];
514: if(nd_ramdac.addr == 0x100 || nd_ramdac.addr == 0x101)
515: nd_ramdac_autoinc();
516: break;
517: case 0xC:
518: result = nd_ramdac.regs[nd_ramdac.addr*3+nd_ramdac.idx];
519: nd_ramdac_autoinc();
520: break;
521: }
522: return result;
523: }
524:
525: inline void nd_ramdac_bput(uaecptr addr, uae_u32 b) {
526: switch(addr & 0xF) {
527: case 0x0:
528: nd_ramdac.addr &= 0xFF00;
529: nd_ramdac.addr |= b & 0xFF;
530: nd_ramdac.idx = 0;
531: break;
532: case 0x4:
533: nd_ramdac.addr &= 0x000F;
534: nd_ramdac.addr |= (b & 0x0F) << 8;
535: nd_ramdac.idx = 0;
536: break;
537: case 0x8:
538: nd_ramdac.regs[nd_ramdac.addr*3] = b;
539: if(nd_ramdac.addr == 0x100 || nd_ramdac.addr == 0x101)
540: nd_ramdac_autoinc();
541: break;
542: case 0xC:
543: nd_ramdac.regs[nd_ramdac.addr*3+nd_ramdac.idx] = b;
544: nd_ramdac_autoinc();
545: break;
546: }
547: }
548:
549: /* NeXTdimension data path */
550:
551: static void nd_dp_iicmsg() {
552: Log_Printf(LOG_WARN, "[ND] data path IIC msg addr:%02X msg[%d]=%02X", nd_dp.iic_addr, nd_dp.iic_msgsz-1, nd_dp.iic_msg[nd_dp.iic_msgsz-1]);
553: }
554:
555: inline uae_u32 nd_dp_lget(uaecptr addr) {
556: switch(addr) {
557: case 0x300: case 0x304: case 0x308: case 0x30C:
558: case 0x310: case 0x314: case 0x318: case 0x31C:
559: case 0x320: case 0x324: case 0x328: case 0x32C:
560: case 0x330: case 0x334: case 0x338: case 0x33C:
561: return nd_dp.doff;
562: case 0x340:
563: return nd_dp.csr;
564: case 0x344:
565: return nd_dp.alpha;
566: case 0x348:
567: return nd_dp.dma;
568: case 0x350:
569: return nd_dp.cpu_x;
570: case 0x354:
571: return nd_dp.cpu_y;
572: case 0x358:
573: return nd_dp.dma_x;
574: case 0x35C:
575: return nd_dp.dma_y;
576: case 0x360:
577: if(nd_dp.iic_busy <= 0)
578: nd_dp.iic_stat_addr &= ~DP_IIC_BUSY;
579: else
580: nd_dp.iic_busy--;
581: return nd_dp.iic_stat_addr;
582: case 0x364:
583: return 0;
584: default:
585: Log_Printf(LOG_WARN, "[ND] data path UNKNOWN read at %08X",addr);
586: }
587: return 0;
588: }
589:
590: inline void nd_dp_lput(uaecptr addr, uae_u32 v) {
591: switch(addr) {
592: case 0x300: case 0x304: case 0x308: case 0x30C:
593: case 0x310: case 0x314: case 0x318: case 0x31C:
594: case 0x320: case 0x324: case 0x328: case 0x32C:
595: case 0x330: case 0x334: case 0x338: case 0x33C:
596: ND_vram_off = v * 4;
597: nd_dp.doff = v;
598: break;
599: case 0x340:
600: nd_dp.csr = v;
601: break;
602: case 0x344:
603: nd_dp.alpha = v;
604: break;
605: case 0x348:
606: nd_dp.dma = v;
607: break;
608: case 0x350:
609: nd_dp.cpu_x = v;
610: break;
611: case 0x354:
612: nd_dp.cpu_y = v;
613: break;
614: case 0x358:
615: nd_dp.dma_x = v;
616: break;
617: case 0x35C:
618: nd_dp.dma_y = v;
619: break;
620: case 0x360:
621: nd_dp.iic_msgsz = 0;
622: nd_dp.iic_addr = v >> 8;
623: nd_dp.iic_msg[nd_dp.iic_msgsz++] = v;
624: nd_dp.iic_stat_addr |= DP_IIC_BUSY;
625: nd_dp.iic_busy = 10;
626: nd_dp_iicmsg();
627: break;
628: case 0x364:
629: nd_dp.iic_msg[nd_dp.iic_msgsz++] = v;
630: nd_dp.iic_stat_addr |= DP_IIC_BUSY;
631: nd_dp.iic_busy = 10;
632: nd_dp_iicmsg();
633: break;
634: default:
635: Log_Printf(LOG_WARN, "[ND] data path UNKNOWN write at %08X %08X",addr,v);
636: }
637: }
638:
639: static const char* nd_dump_path = "nd_memory.bin";
640:
641: /* debugger stuff */
642: bool nd_dbg_cmd(const char* buf) {
643: if(!(buf)) {
644: fprintf(stderr,
645: " w: write NeXTdimension DRAM to file '%s'\n"
646: " n: dump NeXTdimension registers\n"
647: , nd_dump_path);
648: return false;
649: }
650:
651: switch(buf[0]) {
652: case 'w': {
653: char tmp[PATH_MAX];
654: FILE* fp = fopen(nd_dump_path, "wb");
655: size_t size = ConfigureParams.Dimension.nMemoryBankSize[0];
656: size += ConfigureParams.Dimension.nMemoryBankSize[1];
657: size += ConfigureParams.Dimension.nMemoryBankSize[2];
658: size += ConfigureParams.Dimension.nMemoryBankSize[3];
659: fprintf(stderr, "Writing %luMB to '%s'...", size, realpath(nd_dump_path, tmp));
660: size <<= 20;
661: fwrite(ND_ram, sizeof(Uint8), size, fp);
662: fclose(fp);
663: fprintf(stderr, "done.");
664: return true;
665: }
666: case 'n': {
667: fprintf(stderr, "csr0 (%s)\n", decodeBits(ND_CSR0_BITS, nd_mc.csr0));
668: fprintf(stderr, "csr1 (%s)\n", decodeBits(ND_CSR1_BITS, nd_mc.csr1));
669: fprintf(stderr, "csr2 (%s)\n", decodeBits(ND_CSR2_BITS, nd_mc.csr2));
670: fprintf(stderr, "sid (%s)\n", decodeBits(0, nd_mc.sid));
671: fprintf(stderr, "dma_csr (%s)\n", decodeBits(ND_DMA_CSR_BITS, nd_mc.dma_csr));
672: fprintf(stderr, "dma_start (%s)\n", decodeBits(0, nd_mc.dma_start));
673: fprintf(stderr, "dma_width (%s)\n", decodeBits(0, nd_mc.dma_width));
674: fprintf(stderr, "dma_pstart (%s)\n", decodeBits(0, nd_mc.dma_pstart));
675: fprintf(stderr, "dma_pwidth (%s)\n", decodeBits(0, nd_mc.dma_pwidth));
676: fprintf(stderr, "dma_sstart (%s)\n", decodeBits(0, nd_mc.dma_sstart));
677: fprintf(stderr, "dma_swidth (%s)\n", decodeBits(0, nd_mc.dma_swidth));
678: fprintf(stderr, "dma_bsstart (%s)\n", decodeBits(0, nd_mc.dma_bsstart));
679: fprintf(stderr, "dma_bswidth (%s)\n", decodeBits(0, nd_mc.dma_bswidth));
680: fprintf(stderr, "dma_top (%s)\n", decodeBits(0, nd_mc.dma_top));
681: fprintf(stderr, "dma_bottom (%s)\n", decodeBits(0, nd_mc.dma_bottom));
682: fprintf(stderr, "dma_line_a (%s)\n", decodeBits(0, nd_mc.dma_line_a));
683: fprintf(stderr, "dma_curr_a (%s)\n", decodeBits(0, nd_mc.dma_curr_a));
684: fprintf(stderr, "dma_scurr_a (%s)\n", decodeBits(0, nd_mc.dma_scurr_a));
685: fprintf(stderr, "dma_out_a (%s)\n", decodeBits(0, nd_mc.dma_out_a));
686: fprintf(stderr, "vram (%s)\n", decodeBits(ND_VRAM_BITS, nd_mc.vram));
687: fprintf(stderr, "dram (%s)\n", decodeBits(ND_DRAM_BITS, nd_mc.dram));
688: return true;
689: }
690: default:
691: return false;
692: }
693: }
694:
695: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.