Annotation of previous_trunk/src/dimension/nd_nbic.cpp, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.