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