|
|
1.1 root 1: #include "main.h"
2: #include "configuration.h"
3: #include "m68000.h"
4: #include "dimension.h"
5: #include "sysdeps.h"
6: #include "sysReg.h"
7: #include "nd_nbic.h"
8: #include "i860cfg.h"
9:
10: #if ENABLE_DIMENSION
11:
12: /* NeXTdimention NBIC */
13: #define ND_NBIC_ID 0xC0000001
14: #define ND_NBIC_INTR 0x80
15:
16: static
17: #if ENABLE_I860_THREAD
18: volatile
19: #endif
20: struct {
21: Uint32 control;
22: Uint32 id;
23: Uint8 intstatus;
24: Uint8 intmask;
25: } nd_nbic;
26:
27:
28: Uint8 nd_nbic_control_read0(Uint32 addr) {
29: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Control (byte 0) read at %08X",addr);
30: return (nd_nbic.control>>24);
31: }
32: Uint8 nd_nbic_control_read1(Uint32 addr) {
33: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Control (byte 1) read at %08X",addr);
34: return (nd_nbic.control>>16);
35: }
36: Uint8 nd_nbic_control_read2(Uint32 addr) {
37: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Control (byte 2) read at %08X",addr);
38: return (nd_nbic.control>>8);
39: }
40: Uint8 nd_nbic_control_read3(Uint32 addr) {
41: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Control (byte 3) read at %08X",addr);
42: return nd_nbic.control;
43: }
44:
45: void nd_nbic_control_write0(Uint32 addr, Uint8 val) {
46: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC Control (byte 0) write %02X at %08X",val,addr);
47: nd_nbic.control &= 0x00FFFFFF;
48: nd_nbic.control |= (val&0xFF)<<24;
49: }
50: void nd_nbic_control_write1(Uint32 addr, Uint8 val) {
51: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC Control (byte 1) write %02X at %08X",val,addr);
52: nd_nbic.control &= 0xFF00FFFF;
53: nd_nbic.control |= (val&0xFF)<<16;
54: }
55: void nd_nbic_control_write2(Uint32 addr, Uint8 val) {
56: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC Control (byte 2) write %02X at %08X",val,addr);
57: nd_nbic.control &= 0xFFFF00FF;
58: nd_nbic.control |= (val&0xFF)<<8;
59: }
60: void nd_nbic_control_write3(Uint32 addr, Uint8 val) {
61: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC Control (byte 3) write %02X at %08X",val,addr);
62: nd_nbic.control &= 0xFFFFFF00;
63: nd_nbic.control |= val&0xFF;
64: }
65:
66:
67: Uint8 nd_nbic_id_read0(Uint32 addr) {
68: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC ID (byte 0) read at %08X",addr);
69: return (nd_nbic.id>>24);
70: }
71: Uint8 nd_nbic_id_read1(Uint32 addr) {
72: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC ID (byte 1) read at %08X",addr);
73: return (nd_nbic.id>>16);
74: }
75: Uint8 nd_nbic_id_read2(Uint32 addr) {
76: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC ID (byte 2) read at %08X",addr);
77: return (nd_nbic.id>>8);
78: }
79: Uint8 nd_nbic_id_read3(Uint32 addr) {
80: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC ID (byte 3) read at %08X",addr);
81: return nd_nbic.id;
82: }
83:
84: void nd_nbic_id_write0(Uint32 addr, Uint8 val) {
85: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC ID (byte 0) write %02X at %08X",val,addr);
86: nd_nbic.id &= 0x00FFFFFF;
87: nd_nbic.id |= (val&0xFF)<<24;
88: }
89: void nd_nbic_id_write1(Uint32 addr, Uint8 val) {
90: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC ID (byte 1) write %02X at %08X",val,addr);
91: nd_nbic.id &= 0xFF00FFFF;
92: nd_nbic.id |= (val&0xFF)<<16;
93: }
94: void nd_nbic_id_write2(Uint32 addr, Uint8 val) {
95: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC ID (byte 2) write %02X at %08X",val,addr);
96: nd_nbic.id &= 0xFFFF00FF;
97: nd_nbic.id |= (val&0xFF)<<8;
98: }
99: void nd_nbic_id_write3(Uint32 addr, Uint8 val) {
100: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC ID (byte 3) write %02X at %08X",val,addr);
101: nd_nbic.id &= 0xFFFFFF00;
102: nd_nbic.id |= val&0xFF;
103: }
104:
105: Uint8 nd_nbic_intstatus_read(Uint32 addr) {
106: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Interrupt status read at %08X",addr);
107: return nd_nbic.intstatus;
108: }
109:
110: Uint8 nd_nbic_intmask_read(Uint32 addr) {
111: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC Interrupt mask read at %08X",addr);
112: return nd_nbic.intmask;
113: }
114: void nd_nbic_intmask_write(Uint32 addr, Uint8 val) {
115: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC Interrupt mask write %02X at %08X",val,addr);
116: nd_nbic.intmask = val;
117: }
118:
119: Uint8 nd_nbic_zero_read(Uint32 addr) {
120: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC zero read at %08X",addr);
121: return 0;
122: }
123: void nd_nbic_zero_write(Uint32 addr, Uint8 val) {
124: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC zero write %02X at %08X",val,addr);
125: }
126:
127: Uint8 nd_nbic_bus_error_read(Uint32 addr) {
128: Log_Printf(ND_LOG_IO_RD, "[ND] NBIC bus error read at %08X",addr);
129: M68000_BusError(addr, 1);
130: return 0;
131: }
132: void nd_nbic_bus_error_write(Uint32 addr, Uint8 val) {
133: Log_Printf(ND_LOG_IO_WR, "[ND] NBIC bus error write at %08X",addr);
134: M68000_BusError(addr, 0);
135: }
136:
137: static Uint8 (*nd_nbic_read[32])(Uint32) = {
138: nd_nbic_bus_error_read, nd_nbic_bus_error_read, nd_nbic_bus_error_read, nd_nbic_bus_error_read,
139: nd_nbic_bus_error_read, nd_nbic_bus_error_read, nd_nbic_bus_error_read, nd_nbic_bus_error_read,
140: nd_nbic_intstatus_read, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
141: nd_nbic_intmask_read, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
142:
143: nd_nbic_id_read0, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
144: nd_nbic_id_read1, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
145: nd_nbic_id_read2, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
146: nd_nbic_id_read3, nd_nbic_zero_read, nd_nbic_zero_read, nd_nbic_zero_read,
147: };
148:
149: static void (*nd_nbic_write[32])(Uint32, Uint8) = {
150: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
151: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
152: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
153: nd_nbic_intmask_write, nd_nbic_zero_write, nd_nbic_zero_write, nd_nbic_zero_write,
154:
155: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
156: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
157: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write,
158: nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write, nd_nbic_bus_error_write
159: };
160:
161:
162: /* NeXTdimension NBIC access */
163: Uint32 nd_nbic_lget(Uint32 addr) {
164: Uint32 val = 0;
165:
166: if (addr&3) {
167: Log_Printf(LOG_WARN, "[ND] NBIC Unaligned access at %08X.",addr);
168: abort();
169: }
170: val = nd_nbic_read[addr&0x1F](addr)<<24;
171: val |= nd_nbic_read[(addr&0x1F)+1](addr+1)<<16;
172: val |= nd_nbic_read[(addr&0x1F)+2](addr+2)<<8;
173: val |= nd_nbic_read[(addr&0x1F)+3](addr+3);
174:
175: return val;
176: }
177:
178: Uint16 nd_nbic_wget(Uint32 addr) {
179: Uint32 val = 0;
180:
181: if (addr&1) {
182: Log_Printf(LOG_WARN, "[ND] NBIC Unaligned access at %08X.",addr);
183: abort();
184: }
185: val = nd_nbic_read[addr&0x1F](addr)<<8;
186: val |= nd_nbic_read[(addr&0x1F)+1](addr+1)<<16;
187:
188: return val;
189: }
190:
191: Uint8 nd_nbic_bget(Uint32 addr) {
192: return nd_nbic_read[addr&0x1F](addr);
193: }
194:
195: void nd_nbic_lput(Uint32 addr, Uint32 l) {
196: if (addr&3) {
197: Log_Printf(LOG_WARN, "[ND] NBIC Unaligned access at %08X.",addr);
198: abort();
199: }
200: nd_nbic_write[addr&0x1F](addr,l>>24);
201: nd_nbic_write[(addr&0x1F)+1](addr,l>>16);
202: nd_nbic_write[(addr&0x1F)+2](addr,l>>8);
203: nd_nbic_write[(addr&0x1F)+3](addr,l);
204: }
205:
206: void nd_nbic_wput(Uint32 addr, Uint16 w) {
207: if (addr&1) {
208: Log_Printf(LOG_WARN, "[ND] NBIC Unaligned access at %08X.",addr);
209: abort();
210: }
211: nd_nbic_write[addr&0x1F](addr,w>>8);
212: nd_nbic_write[(addr&0x1F)+1](addr,w);
213: }
214:
215: void nd_nbic_bput(Uint32 addr, Uint8 b) {
216: nd_nbic_write[addr&0x1F](addr,b);
217: }
218:
219: /* Interrupt functions */
220: void nd_nbic_interrupt(void) {
221: if (nd_nbic.intmask&nd_nbic.intstatus&ND_NBIC_INTR) {
222: set_interrupt(INT_REMOTE, SET_INT);
223: } else {
224: set_interrupt(INT_REMOTE, RELEASE_INT);
225: }
226: }
227:
228: void nd_nbic_set_intstatus(bool set) {
229: if (set) {
230: nd_nbic.intstatus |= ND_NBIC_INTR;
231: } else {
232: nd_nbic.intstatus &= ~ND_NBIC_INTR;
233: }
234: }
235:
236:
237: /* Reset function */
238:
239: void nd_nbic_init(void) {
240: nd_nbic.id = ND_NBIC_ID;
241: /* Release any interrupt that may be pending */
242: nd_nbic.intmask = 0;
243: nd_nbic.intstatus = 0;
244: set_interrupt(INT_REMOTE, RELEASE_INT);
245: }
246:
247: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.