|
|
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.