Annotation of previous_trunk/src/dimension/nd_nbic.cpp, revision 1.1.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.