|
|
1.1 root 1: #include "main.h"
2: #include "configuration.h"
3: #include "m68000.h"
4: #include "sysdeps.h"
5: #include "sysReg.h"
6: #include "nd_nbic.hpp"
7: #include "dimension.hpp"
8: #include "log.h"
9:
10: /* NeXTdimention NBIC */
11: #define ND_NBIC_INTR 0x80
12:
13: NBIC::NBIC(int slot, int id) : slot(slot), id(id) {}
14:
15: Uint8 NBIC::read(int addr) {
16: switch(addr&0x1F) {
17: case 0x00:
18: case 0x01:
19: case 0x02:
20: case 0x03:
21: case 0x04:
22: case 0x05:
23: case 0x06:
24: case 0x07:
25: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC bus error read at %08X", slot,addr);
26: M68000_BusError(addr, 1);
27: return 0;
28:
29: case 0x08:
30: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC Interrupt status read at %08X", slot,addr);
31: return intstatus;
32: case 0x0C:
33: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC Interrupt mask read at %08X", slot,addr);
34: return intmask;
35:
36: case 0x10:
37: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC ID (byte 0) read at %08X", slot, addr);
38: return (id>>24);
39: case 0x14:
40: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC ID (byte 1) read at %08X", slot,addr);
41: return (id>>16);
42: case 0x18:
43: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC ID (byte 2) read at %08X", slot,addr);
44: return (id>>8);
45: case 0x1C:
46: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC ID (byte 3) read at %08X", slot,addr);
47: return id;
48: default:
49: Log_Printf(ND_LOG_IO_RD, "[ND] Slot %i: NBIC zero read at %08X", slot,addr);
50: return 0;
51: }
52: }
53:
54: void NBIC::write(int addr, Uint8 val) {
55: switch(addr&0x1F) {
56: case 0x0C:
57: Log_Printf(ND_LOG_IO_WR, "[ND] Slot %i: NBIC Interrupt mask write %02X at %08X", slot,val,addr);
58: intmask = val;
59: if(val & ND_NBIC_INTR)
60: remInterMask |= 1 << slot;
61: else
62: remInterMask &= ~(1 << slot);
63: break;
64: case 0x0D:
65: case 0x0E:
66: case 0x0F:
67: Log_Printf(ND_LOG_IO_WR, "[ND] Slot %i: NBIC zero write %02X at %08X", slot,val,addr);
68: break;
69: default:
70: Log_Printf(ND_LOG_IO_WR, "[ND] Slot %i: NBIC bus error write at %08X", slot,addr);
71: M68000_BusError(addr, 0);
72: break;
73: }
74: }
75:
76: /* NeXTdimension NBIC access */
77: Uint32 NBIC::lget(Uint32 addr) {
78: Uint32 val = 0;
79:
80: if (addr&3) {
81: Log_Printf(LOG_WARN, "[ND] Slot %i: NBIC Unaligned access at %08X.", slot, addr);
82: abort();
83: }
84: val = read(addr)<<24;
85: val |= read(addr+1)<<16;
86: val |= read(addr+2)<<8;
87: val |= read(addr+3);
88:
89: return val;
90: }
91:
92: Uint16 NBIC::wget(Uint32 addr) {
93: Uint32 val = 0;
94:
95: if (addr&1) {
96: Log_Printf(LOG_WARN, "[ND] Slot %i: NBIC Unaligned access at %08X.", slot, addr);
97: abort();
98: }
99: val = read(addr)<<8;
100: val |= read(addr+1)<<16;
101:
102: return val;
103: }
104:
105: Uint8 NBIC::bget(Uint32 addr) {
106: return read(addr);
107: }
108:
109: void NBIC::lput(Uint32 addr, Uint32 l) {
110: if (addr&3) {
111: Log_Printf(LOG_WARN, "[ND] Slot %i: NBIC Unaligned access at %08X.", slot, addr);
112: abort();
113: }
114: write(addr+0,l>>24);
115: write(addr+1,l>>16);
116: write(addr+2,l>>8);
117: write(addr+2,l);
118: }
119:
120: void NBIC::wput(Uint32 addr, Uint16 w) {
121: if (addr&1) {
122: Log_Printf(LOG_WARN, "[ND] Slot %i: NBIC Unaligned access at %08X.", slot, addr);
123: abort();
124: }
125: write(addr+0,w>>8);
126: write(addr+1,w);
127: }
128:
129: void NBIC::bput(Uint32 addr, Uint8 b) {
130: write(addr,b);
131: }
132:
133: void NBIC::set_intstatus(bool set) {
134: if (set) {
135: intstatus |= ND_NBIC_INTR;
136: remInter |= 1 << slot;
137: } else {
138: intstatus &= ~ND_NBIC_INTR;
139: remInter &= ~(1 << slot);
140: }
141: }
142:
143:
144: /* Reset function */
145:
146: void NBIC::init(void) {
147: /* Release any interrupt that may be pending */
148: intmask = 0;
149: intstatus = 0;
150: remInter = 0;
151: remInterMask = 0;
152: set_interrupt(INT_REMOTE, RELEASE_INT);
153: }
154:
155: volatile Uint32 NBIC::remInter;
156: volatile Uint32 NBIC::remInterMask;
157:
158: /* Interrupt function, called from ,68k thread */
159: void nd_nbic_interrupt(void) {
160: if (NBIC::remInter&NBIC::remInterMask) {
161: set_interrupt(INT_REMOTE, SET_INT);
162: } else {
163: set_interrupt(INT_REMOTE, RELEASE_INT);
164: }
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.