Annotation of previous_trunk/src/dimension/dimension.cpp, revision 1.1.1.1

1.1       root        1: #include "configuration.h"
                      2: #include "m68000.h"
                      3: #include "dimension.hpp"
                      4: #include "nd_nbic.hpp"
                      5: #include "nd_mem.hpp"
                      6: #include "nd_sdl.hpp"
                      7: 
                      8: NextDimension::NextDimension(int slot) :
                      9:     NextBusBoard(slot),
                     10:     sdl(slot, (Uint32*)vram),
                     11:     i860(this),
                     12:     nbic(slot, ND_NBIC_ID),
                     13:     mc(this),
                     14:     dp(this),
                     15:     dmcd(this),
                     16:     dcsc0(this, 0),
                     17:     dcsc1(this, 1),
                     18:     rom_command(0),
                     19:     rom_last_addr(0)
                     20: {
                     21:     i860.uninit();
                     22:     nbic.init();
                     23:     mc.init();
                     24:     dp.init();
                     25:     mem_init();
                     26:     i860.init();
                     27:     sdl.init();
                     28: }
                     29: 
                     30: NextDimension::~NextDimension() {
                     31:     i860.uninit();
                     32:     sdl.destroy();
                     33: }
                     34: 
                     35: void NextDimension::reset(void) {
                     36:     i860.set_run_func();
                     37:     sdl.start_interrupts();
                     38: }
                     39: 
                     40: void NextDimension::pause(bool pause) {
                     41:     i860.pause(pause);
                     42:     sdl.pause(pause);
                     43: }
                     44: 
                     45: /* NeXTdimension board memory access (m68k) */
                     46: 
                     47:  Uint32 NextDimension::board_lget(Uint32 addr) {
                     48:     addr |= ND_BOARD_BITS;
                     49:     Uint32 result = nd68k_longget(addr);
                     50:     // (SC) delay m68k read on csr0 while in ROM (CS8=1)to give ND some time to start up.
                     51:     if(addr == 0xFF800000 && (result & 0x02))
                     52:         M68000_AddCycles(ConfigureParams.System.nCpuFreq * 100);
                     53:     return result;
                     54: }
                     55: 
                     56:  Uint16 NextDimension::board_wget(Uint32 addr) {
                     57:     addr |= ND_BOARD_BITS;
                     58:     return nd68k_wordget(addr);
                     59: }
                     60: 
                     61:  Uint8 NextDimension::board_bget(Uint32 addr) {
                     62:     addr |= ND_BOARD_BITS;
                     63:     return nd68k_byteget(addr);
                     64: }
                     65: 
                     66:  void NextDimension::board_lput(Uint32 addr, Uint32 l) {
                     67:     addr |= ND_BOARD_BITS;
                     68:     nd68k_longput(addr, l);
                     69: }
                     70: 
                     71:  void NextDimension::board_wput(Uint32 addr, Uint16 w) {
                     72:     addr |= ND_BOARD_BITS;
                     73:     nd68k_wordput(addr, w);
                     74: }
                     75: 
                     76:  void NextDimension::board_bput(Uint32 addr, Uint8 b) {
                     77:     addr |= ND_BOARD_BITS;
                     78:     nd68k_byteput(addr, b);
                     79: }
                     80: 
                     81: /* NeXTdimension slot memory access */
                     82: Uint32 NextDimension::slot_lget(Uint32 addr) {
                     83:     addr |= ND_SLOT_BITS;
                     84:     
                     85:     if (addr<ND_NBIC_SPACE) {
                     86:         return nd68k_longget(addr);
                     87:     } else {
                     88:         return nbic.lget(addr);
                     89:     }
                     90: }
                     91: 
                     92: Uint16 NextDimension::slot_wget(Uint32 addr) {
                     93:     addr |= ND_SLOT_BITS;
                     94:     
                     95:     if (addr<ND_NBIC_SPACE) {
                     96:         return nd68k_wordget(addr);
                     97:     } else {
                     98:         return nbic.wget(addr);
                     99:     }
                    100: }
                    101: 
                    102: Uint8 NextDimension::slot_bget(Uint32 addr) {
                    103:     addr |= ND_SLOT_BITS;
                    104:     
                    105:     if (addr<ND_NBIC_SPACE) {
                    106:         return nd68k_byteget(addr);
                    107:     } else {
                    108:         return nbic.bget(addr);
                    109:     }
                    110: }
                    111: 
                    112: void NextDimension::slot_lput(Uint32 addr, Uint32 l) {
                    113:     addr |= ND_SLOT_BITS;
                    114:     
                    115:     if (addr<ND_NBIC_SPACE) {
                    116:         nd68k_longput(addr, l);
                    117:     } else {
                    118:         nbic.lput(addr, l);
                    119:     }
                    120: }
                    121: 
                    122: void NextDimension::slot_wput(Uint32 addr, Uint16 w) {
                    123:     addr |= ND_SLOT_BITS;
                    124:     
                    125:     if (addr<ND_NBIC_SPACE) {
                    126:         nd68k_wordput(addr, w);
                    127:     } else {
                    128:         nbic.wput(addr, w);
                    129:     }
                    130: }
                    131: 
                    132: void NextDimension::slot_bput(Uint32 addr, Uint8 b) {
                    133:     addr |= ND_SLOT_BITS;
                    134:     
                    135:     if (addr<ND_NBIC_SPACE) {
                    136:         nd68k_byteput(addr, b);
                    137:     } else {
                    138:         nbic.bput(addr, b);
                    139:     }
                    140: }
                    141: 
                    142: void NextDimension::send_msg(int msg) {
                    143:     host_lock(&m_port_lock);
                    144:     m_port |= msg;
                    145:     host_unlock(&m_port_lock);
                    146: }
                    147: 
                    148: /* NeXTdimension board memory access (i860) */
                    149: 
                    150: Uint8  NextDimension::i860_cs8get(NextDimension* nd, Uint32 addr) {
                    151:     addr |= ND_BOARD_BITS;
                    152:     return nd_cs8get(addr);
                    153: }
                    154: 
                    155: void   NextDimension::i860_rd8_be(NextDimension* nd, Uint32 addr, Uint32* val) {
                    156:     addr  |= ND_BOARD_BITS;
                    157:     *((Uint8*)val) = nd_byteget(addr);
                    158: }
                    159: 
                    160: void   NextDimension::i860_rd16_be(NextDimension* nd, Uint32 addr, Uint32* val) {
                    161:     addr |= ND_BOARD_BITS;
                    162:     *((Uint16*)val) = nd_wordget(addr);
                    163: }
                    164: 
                    165: void   NextDimension::i860_rd32_be(NextDimension* nd, Uint32 addr, Uint32* val) {
                    166:     addr  |= ND_BOARD_BITS;
                    167:     val[0] = nd_longget(addr);
                    168: }
                    169: 
                    170: void   NextDimension::i860_rd64_be(NextDimension* nd, Uint32 addr, Uint32* val) {
                    171:     addr  |= ND_BOARD_BITS;
                    172:     val[0] = nd_longget(addr+4);
                    173:     val[1] = nd_longget(addr+0);
                    174: }
                    175: 
                    176: void   NextDimension::i860_rd128_be(NextDimension* nd, Uint32 addr, Uint32* val) {
                    177:     addr   |= ND_BOARD_BITS;
                    178:     val[0]  = nd_longget(addr+4);
                    179:     val[1]  = nd_longget(addr+0);
                    180:     val[2]  = nd_longget(addr+12);
                    181:     val[3]  = nd_longget(addr+8);
                    182: }
                    183: 
                    184: void   NextDimension::i860_wr8_be(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    185:     addr |= ND_BOARD_BITS;
                    186:     nd_byteput(addr, *((const Uint8*)val));
                    187: }
                    188: 
                    189: void   NextDimension::i860_wr16_be(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    190:     addr |= ND_BOARD_BITS;
                    191:     nd_wordput(addr, *((const Uint16*)val));
                    192: }
                    193: 
                    194: void   NextDimension::i860_wr32_be(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    195:     addr |= ND_BOARD_BITS;
                    196:     nd_longput(addr, val[0]);
                    197: }
                    198: 
                    199: void   NextDimension::i860_wr64_be(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    200:     addr |= ND_BOARD_BITS;
                    201:     nd_longput(addr+4, val[0]);
                    202:     nd_longput(addr+0, val[1]);
                    203: }
                    204: 
                    205: void   NextDimension::i860_wr128_be(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    206:     addr |= ND_BOARD_BITS;
                    207:     nd_longput(addr+4,  val[0]);
                    208:     nd_longput(addr+0,  val[1]);
                    209:     nd_longput(addr+12, val[2]);
                    210:     nd_longput(addr+8,  val[3]);
                    211: }
                    212: 
                    213: void   NextDimension::i860_rd8_le(NextDimension* nd, Uint32 addr, Uint32* val) {
                    214:     addr  |= ND_BOARD_BITS;
                    215:     *((Uint8*)val) = nd_byteget(addr^7);
                    216: }
                    217: 
                    218: void   NextDimension::i860_rd16_le(NextDimension* nd, Uint32 addr, Uint32* val) {
                    219:     addr |= ND_BOARD_BITS;
                    220:     *((Uint16*)val) = nd_wordget(addr^6);
                    221: }
                    222: 
                    223: void   NextDimension::i860_rd32_le(NextDimension* nd, Uint32 addr, Uint32* val) {
                    224:     addr  |= ND_BOARD_BITS;
                    225:     val[0] = nd_longget(addr^4);
                    226: }
                    227: 
                    228: void   NextDimension::i860_rd64_le(NextDimension* nd, Uint32 addr, Uint32* val) {
                    229:     addr  |= ND_BOARD_BITS;
                    230:     val[0] = nd_longget(addr+0);
                    231:     val[1] = nd_longget(addr+4);
                    232: }
                    233: 
                    234: void   NextDimension::i860_rd128_le(NextDimension* nd, Uint32 addr, Uint32* val) {
                    235:     addr   |= ND_BOARD_BITS;
                    236:     val[0]  = nd_longget(addr+0);
                    237:     val[1]  = nd_longget(addr+4);
                    238:     val[2]  = nd_longget(addr+8);
                    239:     val[3]  = nd_longget(addr+12);
                    240: }
                    241: 
                    242: void   NextDimension::i860_wr8_le(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    243:     addr |= ND_BOARD_BITS;
                    244:     nd_byteput(addr^7, *((const Uint8*)val));
                    245: }
                    246: 
                    247: void   NextDimension::i860_wr16_le(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    248:     addr |= ND_BOARD_BITS;
                    249:     nd_wordput(addr^6, *((const Uint16*)val));
                    250: }
                    251: 
                    252: void   NextDimension::i860_wr32_le(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    253:     addr |= ND_BOARD_BITS;
                    254:     nd_longput(addr^4, val[0]);
                    255: }
                    256: 
                    257: void   NextDimension::i860_wr64_le(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    258:     addr |= ND_BOARD_BITS;
                    259:     nd_longput(addr+0, val[0]);
                    260:     nd_longput(addr+4, val[1]);
                    261: }
                    262: 
                    263: void   NextDimension::i860_wr128_le(NextDimension* nd, Uint32 addr, const Uint32* val) {
                    264:     addr |= ND_BOARD_BITS;
                    265:     nd_longput(addr+0,  val[0]);
                    266:     nd_longput(addr+4,  val[1]);
                    267:     nd_longput(addr+8,  val[2]);
                    268:     nd_longput(addr+12, val[3]);
                    269: }
                    270: 
                    271: /* Message disaptcher - executed on i860 thread, safe to call i860 methods */
                    272: bool NextDimension::handle_msgs(void) {
                    273:     host_lock(&m_port_lock);
                    274:     int msg = m_port;
                    275:     m_port = 0;
                    276:     host_unlock(&m_port_lock);
                    277:     
                    278:     if(msg & MSG_DISPLAY_BLANK)
                    279:         set_blank_state(ND_DISPLAY, host_blank_state(slot, ND_DISPLAY));
                    280:     if(msg & MSG_VIDEO_BLANK)
                    281:         set_blank_state(ND_VIDEO, host_blank_state(slot, ND_VIDEO));
                    282: 
                    283:     return i860.handle_msgs(msg);
                    284: }
                    285: 
                    286: void nd_start_debugger(void) {
                    287:     FOR_EACH_SLOT(slot) {
                    288:         IF_NEXT_DIMENSION(slot, nd) {
                    289:             nd->send_msg(MSG_DBG_BREAK);
                    290:         }
                    291:     }
                    292: }
                    293: 
                    294: extern "C" {
                    295:     void nd_display_blank(int slot) {
                    296:         ((NextDimension*)nextbus[slot])->send_msg(MSG_DISPLAY_BLANK);
                    297:     }
                    298: 
                    299:     void nd_video_blank(int slot) {
                    300:         ((NextDimension*)nextbus[slot])->send_msg(MSG_VIDEO_BLANK);
                    301:     }
                    302: 
                    303:     const char* nd_reports(int slot, double realTime, double hostTime) {
                    304:         return ((NextDimension*)nextbus[slot])->i860.reports(realTime, hostTime);
                    305:     }
                    306:     
                    307:     Uint32* nd_vram_for_slot(int slot) {
                    308:         IF_NEXT_DIMENSION(slot, nd)
                    309:             return (Uint32*)nd->vram;
                    310:         else
                    311:             return NULL;
                    312:     }
                    313: }
                    314: 
                    315: 
                    316: 

unix.superglobalmegacorp.com

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