/* * take the device OFFLINE and remove its dev_info node */ int devctl_device_remove(devctl_hdl_t dcp) { int rv; if (dcp == NULL || DCP(dcp)->hdltype != DEVCTL_DEVICE) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_DEVICE_REMOVE, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_device_remove: %d\n", rv); return (rv); }
/* * set flag to fail DDI_SUSPEND */ int devctl_pm_failsuspend(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_FAIL_SUSPEND, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_failsuspend: %d\n", rv); return (rv); }
/* * issue prom_printf() call */ int devctl_pm_device_promprintf(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_PROM_PRINTF, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_device_promprintf: %d\n", rv); return (rv); }
/* * mark component 0 busy */ int devctl_pm_busycomponent(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_BUSY_COMP, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_busycomponent: %d\n", rv); return (rv); }
/* * Power up component 0, to level MAXPWR, via a pm_raise_power() call */ int devctl_pm_raisepower(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_RAISE_PWR, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_raisepower: %d\n", rv); return (rv); }
/* * set flag to power up the device via * pm_power_has_changed() calls vs. * pm_raise_power(), during DDI_RESUME */ int devctl_pm_device_changeonresume(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_PWR_HAS_CHANGED_ON_RESUME, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_device_changeonresume: %d\n", rv); return (rv); }
/* * Power down component 0, to level 0, via a pm_change_power() call */ int devctl_pm_changepowerlow(devctl_hdl_t dcp) { int rv; if (dcp == NULL || (DCP(dcp)->hdltype != DEVCTL_PM_DEV && DCP(dcp)->hdltype != DEVCTL_PM_BUS)) { errno = EINVAL; return (-1); } rv = dc_cmd(DEVCTL_PM_CHANGE_PWR_LOW, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_pm_changepowerlow: %d\n", rv); return (rv); }
/* * execute the IOCTL request */ static int dc_cmd(uint_t cmd, uint_t flags, struct devctl_hdl *dcp, nvlist_t *ulp, void *retinfo) { struct devctl_iocdata iocdata; int rv = 0; if (_libdevice_debug) (void) printf("dc_cmd: %x dcp %p ulp %p flags %x rv %p\n", cmd, (void *)dcp, (void *)ulp, flags, retinfo); if ((dcp == NULL) || (DCP(dcp)->fd == -1)) { errno = EINVAL; return (-1); } (void) memset(&iocdata, 0, sizeof (struct devctl_iocdata)); /* * if there was any user supplied data in the form of a nvlist, * pack the list prior to copyin. */ if (ulp != NULL) { if (rv = nvlist_pack(ulp, (char **)&iocdata.nvl_user, &iocdata.nvl_usersz, NV_ENCODE_NATIVE, 0)) { /* * exit with errno set by nvlist_pack() */ goto exit; } } else { iocdata.nvl_user = NULL; iocdata.nvl_usersz = 0; } /* * finish initalizing the request and execute the IOCTL */ iocdata.cmd = cmd; iocdata.flags = flags; iocdata.c_nodename = dcp->nodename; iocdata.c_unitaddr = dcp->unitaddr; iocdata.cpyout_buf = retinfo; rv = ioctl(dcp->fd, cmd, &iocdata); if (rv < 0 && _libdevice_debug) { (void) printf("dc_cmd: exited with rv %d, errno(%d):%s\n", rv, errno, strerror(errno)); } exit: if (iocdata.nvl_user != NULL) free(iocdata.nvl_user); return (rv); }
/* * return the pathname which was used to acquire the handle */ char * devctl_get_pathname(devctl_hdl_t dcp, char *pathbuf, size_t bufsz) { if (dcp == NULL || pathbuf == NULL || bufsz == 0) { errno = EINVAL; return (NULL); } (void) snprintf(pathbuf, bufsz, "%s", DCP(dcp)->opath); return (pathbuf); }
int devctl_ap_disconnect(devctl_hdl_t dcp, nvlist_t *ap_data) { int rv; rv = dc_cmd(DEVCTL_AP_DISCONNECT, 0, DCP(dcp), ap_data, NULL); if (_libdevice_debug) (void) printf("devctl_ap_disconnect: %d\n", rv); return (rv); }
int devctl_ap_unconfigure(devctl_hdl_t dcp, nvlist_t *ap_data) { int rv; rv = dc_cmd(DEVCTL_AP_UNCONFIGURE, 0, DCP(dcp), ap_data, NULL); if (_libdevice_debug) (void) printf("devctl_ap_unconfigure: %d\n", rv); return (rv); }
int devctl_ap_remove(devctl_hdl_t dcp, nvlist_t *ap_data) { int rv; rv = dc_cmd(DEVCTL_AP_REMOVE, 0, DCP(dcp), ap_data, NULL); if (_libdevice_debug) (void) printf("devctl_ap_remove: %d\n", rv); return (rv); }
int devctl_ap_insert(devctl_hdl_t dcp, nvlist_t *ap_data) { int rv; rv = dc_cmd(DEVCTL_AP_INSERT, 0, DCP(dcp), ap_data, NULL); if (_libdevice_debug) (void) printf("devctl_ap_insert: %d\n", rv); return (rv); }
int devctl_bus_unconfigure(devctl_hdl_t dcp) { int rv; rv = dc_cmd(DEVCTL_BUS_UNCONFIGURE, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_bus_unconfigure: %d\n", rv); return (rv); }
int devctl_device_reset(devctl_hdl_t dcp) { int rv; rv = dc_cmd(DEVCTL_DEVICE_RESET, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_device_reset: %d\n", rv); return (rv); }
int devctl_bus_resetall(devctl_hdl_t dcp) { int rv; rv = dc_cmd(DEVCTL_BUS_RESETALL, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_bus_resetall: %d\n", rv); return (rv); }
int devctl_bus_unquiesce(devctl_hdl_t dcp) { int rv; rv = dc_cmd(DEVCTL_BUS_UNQUIESCE, 0, DCP(dcp), NULL, NULL); if (_libdevice_debug) (void) printf("devctl_bus_unquiesce: %d\n", rv); return (rv); }
int devctl_ap_getstate(devctl_hdl_t dcp, nvlist_t *ap_data, devctl_ap_state_t *apstate) { int rv; devctl_ap_state_t ap_state; rv = dc_cmd(DEVCTL_AP_GETSTATE, 0, DCP(dcp), ap_data, (void *)&ap_state); if (rv == -1) (void) memset(apstate, 0, sizeof (struct devctl_ap_state)); else *apstate = ap_state; if (_libdevice_debug) (void) printf("devctl_ap_getstate: %d\n", rv); return (rv); }
/* * release a devctl_hdl structure */ void devctl_release(devctl_hdl_t hdl) { if (_libdevice_debug) (void) printf("devctl_release: %p\n", (void *)hdl); if (hdl == NULL) return; if (DCP(hdl)->fd != -1) (void) close(DCP(hdl)->fd); if (DCP(hdl)->opath != NULL) free(DCP(hdl)->opath); if (DCP(hdl)->nodename != NULL) free(DCP(hdl)->nodename); if (DCP(hdl)->unitaddr != NULL) free(DCP(hdl)->unitaddr); free(hdl); }
// // 柦椷幚峴 // INT CPU::EXEC( INT request_cycles ) { BYTE opcode; // 僆儁僐乕僪 INT OLD_cycles = TOTAL_cycles; INT exec_cycles; BYTE nmi_request, irq_request; BOOL bClockProcess = m_bClockProcess; // TEMP register WORD EA; register WORD ET; register WORD WT; register BYTE DT; while( request_cycles > 0 ) { exec_cycles = 0; if( DMA_cycles ) { if( request_cycles <= DMA_cycles ) { DMA_cycles -= request_cycles; TOTAL_cycles += request_cycles; // 僋儘僢僋摨婜張棟 mapper->Clock( request_cycles ); #if DPCM_SYNCCLOCK apu->SyncDPCM( request_cycles ); #endif if( bClockProcess ) { nes->Clock( request_cycles ); } // nes->Clock( request_cycles ); goto _execute_exit; } else { exec_cycles += DMA_cycles; // request_cycles -= DMA_cycles; DMA_cycles = 0; } } nmi_request = irq_request = 0; opcode = OP6502( R.PC++ ); if( R.INT_pending ) { if( R.INT_pending & NMI_FLAG ) { nmi_request = 0xFF; R.INT_pending &= ~NMI_FLAG; } else if( R.INT_pending & IRQ_MASK ) { R.INT_pending &= ~IRQ_TRIGGER2; if( !(R.P & I_FLAG) && opcode != 0x40 ) { irq_request = 0xFF; R.INT_pending &= ~IRQ_TRIGGER; } } } //增加指令预测忽略功能 //opcode BYTE iInstructionLen =1; switch (TraceAddrMode[opcode]) { case IND: case ADR: case ABS: case ABX: case ABY: iInstructionLen = 3; break; case IMM: case ZPG: case ZPX: case ZPY: case INX: case INY: iInstructionLen = 2; break; case IMP:case ACC:case ERR: break; case REL:iInstructionLen = 2;break; } if( ((TraceArr[opcode][0]=='*') || (TraceArr[opcode][1]=='?'))&& (!Config.emulator.bIllegalOp) ) { //这里可以优化输出信息 //char str[111]; //DecodeInstruction (R.PC-1, str); //DEBUGOUT( "Bad Instruction:%s\n",str); R.PC=(R.PC-1)+iInstructionLen; ADD_CYCLE(iInstructionLen*2); goto end_is; } // switch( opcode ) { case 0x69: // ADC #$?? MR_IM(); ADC(); ADD_CYCLE(2); break; case 0x65: // ADC $?? MR_ZP(); ADC(); ADD_CYCLE(3); break; case 0x75: // ADC $??,X MR_ZX(); ADC(); ADD_CYCLE(4); break; case 0x6D: // ADC $???? MR_AB(); ADC(); ADD_CYCLE(4); break; case 0x7D: // ADC $????,X MR_AX(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0x79: // ADC $????,Y MR_AY(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0x61: // ADC ($??,X) MR_IX(); ADC(); ADD_CYCLE(6); break; case 0x71: // ADC ($??),Y MR_IY(); ADC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xE9: // SBC #$?? MR_IM(); SBC(); ADD_CYCLE(2); break; case 0xE5: // SBC $?? MR_ZP(); SBC(); ADD_CYCLE(3); break; case 0xF5: // SBC $??,X MR_ZX(); SBC(); ADD_CYCLE(4); break; case 0xED: // SBC $???? MR_AB(); SBC(); ADD_CYCLE(4); break; case 0xFD: // SBC $????,X MR_AX(); SBC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xF9: // SBC $????,Y MR_AY(); SBC(); CHECK_EA(); ADD_CYCLE(4); break; case 0xE1: // SBC ($??,X) MR_IX(); SBC(); ADD_CYCLE(6); break; case 0xF1: // SBC ($??),Y MR_IY(); SBC(); CHECK_EA(); ADD_CYCLE(5); break; case 0xC6: // DEC $?? MR_ZP(); DEC(); MW_ZP(); ADD_CYCLE(5); break; case 0xD6: // DEC $??,X MR_ZX(); DEC(); MW_ZP(); ADD_CYCLE(6); break; case 0xCE: // DEC $???? MR_AB(); DEC(); MW_EA(); ADD_CYCLE(6); break; case 0xDE: // DEC $????,X MR_AX(); DEC(); MW_EA(); ADD_CYCLE(7); break; case 0xCA: // DEX DEX(); ADD_CYCLE(2); break; case 0x88: // DEY DEY(); ADD_CYCLE(2); break; case 0xE6: // INC $?? MR_ZP(); INC(); MW_ZP(); ADD_CYCLE(5); break; case 0xF6: // INC $??,X MR_ZX(); INC(); MW_ZP(); ADD_CYCLE(6); break; case 0xEE: // INC $???? MR_AB(); INC(); MW_EA(); ADD_CYCLE(6); break; case 0xFE: // INC $????,X MR_AX(); INC(); MW_EA(); ADD_CYCLE(7); break; case 0xE8: // INX INX(); ADD_CYCLE(2); break; case 0xC8: // INY INY(); ADD_CYCLE(2); break; case 0x29: // AND #$?? MR_IM(); AND(); ADD_CYCLE(2); break; case 0x25: // AND $?? MR_ZP(); AND(); ADD_CYCLE(3); break; case 0x35: // AND $??,X MR_ZX(); AND(); ADD_CYCLE(4); break; case 0x2D: // AND $???? MR_AB(); AND(); ADD_CYCLE(4); break; case 0x3D: // AND $????,X MR_AX(); AND(); CHECK_EA(); ADD_CYCLE(4); break; case 0x39: // AND $????,Y MR_AY(); AND(); CHECK_EA(); ADD_CYCLE(4); break; case 0x21: // AND ($??,X) MR_IX(); AND(); ADD_CYCLE(6); break; case 0x31: // AND ($??),Y MR_IY(); AND(); CHECK_EA(); ADD_CYCLE(5); break; case 0x0A: // ASL A ASL_A(); ADD_CYCLE(2); break; case 0x06: // ASL $?? MR_ZP(); ASL(); MW_ZP(); ADD_CYCLE(5); break; case 0x16: // ASL $??,X MR_ZX(); ASL(); MW_ZP(); ADD_CYCLE(6); break; case 0x0E: // ASL $???? MR_AB(); ASL(); MW_EA(); ADD_CYCLE(6); break; case 0x1E: // ASL $????,X MR_AX(); ASL(); MW_EA(); ADD_CYCLE(7); break; case 0x24: // BIT $?? MR_ZP(); BIT(); ADD_CYCLE(3); break; case 0x2C: // BIT $???? MR_AB(); BIT(); ADD_CYCLE(4); break; case 0x49: // EOR #$?? MR_IM(); EOR(); ADD_CYCLE(2); break; case 0x45: // EOR $?? MR_ZP(); EOR(); ADD_CYCLE(3); break; case 0x55: // EOR $??,X MR_ZX(); EOR(); ADD_CYCLE(4); break; case 0x4D: // EOR $???? MR_AB(); EOR(); ADD_CYCLE(4); break; case 0x5D: // EOR $????,X MR_AX(); EOR(); CHECK_EA(); ADD_CYCLE(4); break; case 0x59: // EOR $????,Y MR_AY(); EOR(); CHECK_EA(); ADD_CYCLE(4); break; case 0x41: // EOR ($??,X) MR_IX(); EOR(); ADD_CYCLE(6); break; case 0x51: // EOR ($??),Y MR_IY(); EOR(); CHECK_EA(); ADD_CYCLE(5); break; case 0x4A: // LSR A LSR_A(); ADD_CYCLE(2); break; case 0x46: // LSR $?? MR_ZP(); LSR(); MW_ZP(); ADD_CYCLE(5); break; case 0x56: // LSR $??,X MR_ZX(); LSR(); MW_ZP(); ADD_CYCLE(6); break; case 0x4E: // LSR $???? MR_AB(); LSR(); MW_EA(); ADD_CYCLE(6); break; case 0x5E: // LSR $????,X MR_AX(); LSR(); MW_EA(); ADD_CYCLE(7); break; case 0x09: // ORA #$?? MR_IM(); ORA(); ADD_CYCLE(2); break; case 0x05: // ORA $?? MR_ZP(); ORA(); ADD_CYCLE(3); break; case 0x15: // ORA $??,X MR_ZX(); ORA(); ADD_CYCLE(4); break; case 0x0D: // ORA $???? MR_AB(); ORA(); ADD_CYCLE(4); break; case 0x1D: // ORA $????,X MR_AX(); ORA(); CHECK_EA(); ADD_CYCLE(4); break; case 0x19: // ORA $????,Y MR_AY(); ORA(); CHECK_EA(); ADD_CYCLE(4); break; case 0x01: // ORA ($??,X) MR_IX(); ORA(); ADD_CYCLE(6); break; case 0x11: // ORA ($??),Y MR_IY(); ORA(); CHECK_EA(); ADD_CYCLE(5); break; case 0x2A: // ROL A ROL_A(); ADD_CYCLE(2); break; case 0x26: // ROL $?? MR_ZP(); ROL(); MW_ZP(); ADD_CYCLE(5); break; case 0x36: // ROL $??,X MR_ZX(); ROL(); MW_ZP(); ADD_CYCLE(6); break; case 0x2E: // ROL $???? MR_AB(); ROL(); MW_EA(); ADD_CYCLE(6); break; case 0x3E: // ROL $????,X MR_AX(); ROL(); MW_EA(); ADD_CYCLE(7); break; case 0x6A: // ROR A ROR_A(); ADD_CYCLE(2); break; case 0x66: // ROR $?? MR_ZP(); ROR(); MW_ZP(); ADD_CYCLE(5); break; case 0x76: // ROR $??,X MR_ZX(); ROR(); MW_ZP(); ADD_CYCLE(6); break; case 0x6E: // ROR $???? MR_AB(); ROR(); MW_EA(); ADD_CYCLE(6); break; case 0x7E: // ROR $????,X MR_AX(); ROR(); MW_EA(); ADD_CYCLE(7); break; case 0xA9: // LDA #$?? MR_IM(); LDA(); ADD_CYCLE(2); break; case 0xA5: // LDA $?? MR_ZP(); LDA(); ADD_CYCLE(3); break; case 0xB5: // LDA $??,X MR_ZX(); LDA(); ADD_CYCLE(4); break; case 0xAD: // LDA $???? MR_AB(); LDA(); ADD_CYCLE(4); break; case 0xBD: // LDA $????,X MR_AX(); LDA(); CHECK_EA(); ADD_CYCLE(4); break; case 0xB9: // LDA $????,Y MR_AY(); LDA(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA1: // LDA ($??,X) MR_IX(); LDA(); ADD_CYCLE(6); break; case 0xB1: // LDA ($??),Y MR_IY(); LDA(); CHECK_EA(); ADD_CYCLE(5); break; case 0xA2: // LDX #$?? MR_IM(); LDX(); ADD_CYCLE(2); break; case 0xA6: // LDX $?? MR_ZP(); LDX(); ADD_CYCLE(3); break; case 0xB6: // LDX $??,Y MR_ZY(); LDX(); ADD_CYCLE(4); break; case 0xAE: // LDX $???? MR_AB(); LDX(); ADD_CYCLE(4); break; case 0xBE: // LDX $????,Y MR_AY(); LDX(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA0: // LDY #$?? MR_IM(); LDY(); ADD_CYCLE(2); break; case 0xA4: // LDY $?? MR_ZP(); LDY(); ADD_CYCLE(3); break; case 0xB4: // LDY $??,X MR_ZX(); LDY(); ADD_CYCLE(4); break; case 0xAC: // LDY $???? MR_AB(); LDY(); ADD_CYCLE(4); break; case 0xBC: // LDY $????,X MR_AX(); LDY(); CHECK_EA(); ADD_CYCLE(4); break; case 0x85: // STA $?? EA_ZP(); STA(); MW_ZP(); ADD_CYCLE(3); break; case 0x95: // STA $??,X EA_ZX(); STA(); MW_ZP(); ADD_CYCLE(4); break; case 0x8D: // STA $???? EA_AB(); STA(); MW_EA(); ADD_CYCLE(4); break; case 0x9D: // STA $????,X EA_AX(); STA(); MW_EA(); ADD_CYCLE(5); break; case 0x99: // STA $????,Y EA_AY(); STA(); MW_EA(); ADD_CYCLE(5); break; case 0x81: // STA ($??,X) EA_IX(); STA(); MW_EA(); ADD_CYCLE(6); break; case 0x91: // STA ($??),Y EA_IY(); STA(); MW_EA(); ADD_CYCLE(6); break; case 0x86: // STX $?? EA_ZP(); STX(); MW_ZP(); ADD_CYCLE(3); break; case 0x96: // STX $??,Y EA_ZY(); STX(); MW_ZP(); ADD_CYCLE(4); break; case 0x8E: // STX $???? EA_AB(); STX(); MW_EA(); ADD_CYCLE(4); break; case 0x84: // STY $?? EA_ZP(); STY(); MW_ZP(); ADD_CYCLE(3); break; case 0x94: // STY $??,X EA_ZX(); STY(); MW_ZP(); ADD_CYCLE(4); break; case 0x8C: // STY $???? EA_AB(); STY(); MW_EA(); ADD_CYCLE(4); break; case 0xAA: // TAX TAX(); ADD_CYCLE(2); break; case 0x8A: // TXA TXA(); ADD_CYCLE(2); break; case 0xA8: // TAY TAY(); ADD_CYCLE(2); break; case 0x98: // TYA TYA(); ADD_CYCLE(2); break; case 0xBA: // TSX TSX(); ADD_CYCLE(2); break; case 0x9A: // TXS TXS(); ADD_CYCLE(2); break; case 0xC9: // CMP #$?? MR_IM(); CMP_(); ADD_CYCLE(2); break; case 0xC5: // CMP $?? MR_ZP(); CMP_(); ADD_CYCLE(3); break; case 0xD5: // CMP $??,X MR_ZX(); CMP_(); ADD_CYCLE(4); break; case 0xCD: // CMP $???? MR_AB(); CMP_(); ADD_CYCLE(4); break; case 0xDD: // CMP $????,X MR_AX(); CMP_(); CHECK_EA(); ADD_CYCLE(4); break; case 0xD9: // CMP $????,Y MR_AY(); CMP_(); CHECK_EA(); ADD_CYCLE(4); break; case 0xC1: // CMP ($??,X) MR_IX(); CMP_(); ADD_CYCLE(6); break; case 0xD1: // CMP ($??),Y MR_IY(); CMP_(); CHECK_EA(); ADD_CYCLE(5); break; case 0xE0: // CPX #$?? MR_IM(); CPX(); ADD_CYCLE(2); break; case 0xE4: // CPX $?? MR_ZP(); CPX(); ADD_CYCLE(3); break; case 0xEC: // CPX $???? MR_AB(); CPX(); ADD_CYCLE(4); break; case 0xC0: // CPY #$?? MR_IM(); CPY(); ADD_CYCLE(2); break; case 0xC4: // CPY $?? MR_ZP(); CPY(); ADD_CYCLE(3); break; case 0xCC: // CPY $???? MR_AB(); CPY(); ADD_CYCLE(4); break; case 0x90: // BCC MR_IM(); BCC(); ADD_CYCLE(2); break; case 0xB0: // BCS MR_IM(); BCS(); ADD_CYCLE(2); break; case 0xF0: // BEQ MR_IM(); BEQ(); ADD_CYCLE(2); break; case 0x30: // BMI MR_IM(); BMI(); ADD_CYCLE(2); break; case 0xD0: // BNE MR_IM(); BNE(); ADD_CYCLE(2); break; case 0x10: // BPL MR_IM(); BPL(); ADD_CYCLE(2); break; case 0x50: // BVC MR_IM(); BVC(); ADD_CYCLE(2); break; case 0x70: // BVS MR_IM(); BVS(); ADD_CYCLE(2); break; case 0x4C: // JMP $???? JMP(); ADD_CYCLE(3); break; case 0x6C: // JMP ($????) JMP_ID(); ADD_CYCLE(5); break; case 0x20: // JSR JSR(); ADD_CYCLE(6); break; case 0x40: // RTI RTI(); ADD_CYCLE(6); break; case 0x60: // RTS RTS(); ADD_CYCLE(6); break; // 僼儔僌惂屼宯 case 0x18: // CLC CLC(); ADD_CYCLE(2); break; case 0xD8: // CLD CLD(); ADD_CYCLE(2); break; case 0x58: // CLI CLI(); ADD_CYCLE(2); break; case 0xB8: // CLV CLV(); ADD_CYCLE(2); break; case 0x38: // SEC SEC(); ADD_CYCLE(2); break; case 0xF8: // SED SED(); ADD_CYCLE(2); break; case 0x78: // SEI SEI(); ADD_CYCLE(2); break; // 僗僞僢僋宯 case 0x48: // PHA PUSH( R.A ); ADD_CYCLE(3); break; case 0x08: // PHP PUSH( R.P | B_FLAG ); ADD_CYCLE(3); break; case 0x68: // PLA (N-----Z-) R.A = POP(); SET_ZN_FLAG(R.A); ADD_CYCLE(4); break; case 0x28: // PLP R.P = POP() | R_FLAG; ADD_CYCLE(4); break; // 偦偺懠 case 0x00: // BRK BRK(); ADD_CYCLE(7); break; case 0xEA: // NOP ADD_CYCLE(2); break; // 枹岞奐柦椷孮 case 0x0B: // ANC #$?? case 0x2B: // ANC #$?? MR_IM(); ANC(); ADD_CYCLE(2); break; case 0x8B: // ANE #$?? MR_IM(); ANE(); ADD_CYCLE(2); break; case 0x6B: // ARR #$?? MR_IM(); ARR(); ADD_CYCLE(2); break; case 0x4B: // ASR #$?? MR_IM(); ASR(); ADD_CYCLE(2); break; case 0xC7: // DCP $?? MR_ZP(); DCP(); MW_ZP(); ADD_CYCLE(5); break; case 0xD7: // DCP $??,X MR_ZX(); DCP(); MW_ZP(); ADD_CYCLE(6); break; case 0xCF: // DCP $???? MR_AB(); DCP(); MW_EA(); ADD_CYCLE(6); break; case 0xDF: // DCP $????,X MR_AX(); DCP(); MW_EA(); ADD_CYCLE(7); break; case 0xDB: // DCP $????,Y MR_AY(); DCP(); MW_EA(); ADD_CYCLE(7); break; case 0xC3: // DCP ($??,X) MR_IX(); DCP(); MW_EA(); ADD_CYCLE(8); break; case 0xD3: // DCP ($??),Y MR_IY(); DCP(); MW_EA(); ADD_CYCLE(8); break; case 0xE7: // ISB $?? MR_ZP(); ISB(); MW_ZP(); ADD_CYCLE(5); break; case 0xF7: // ISB $??,X MR_ZX(); ISB(); MW_ZP(); ADD_CYCLE(5); break; case 0xEF: // ISB $???? MR_AB(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xFF: // ISB $????,X MR_AX(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xFB: // ISB $????,Y MR_AY(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xE3: // ISB ($??,X) MR_IX(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xF3: // ISB ($??),Y MR_IY(); ISB(); MW_EA(); ADD_CYCLE(5); break; case 0xBB: // LAS $????,Y MR_AY(); LAS(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA7: // LAX $?? MR_ZP(); LAX(); ADD_CYCLE(3); break; case 0xB7: // LAX $??,Y MR_ZY(); LAX(); ADD_CYCLE(4); break; case 0xAF: // LAX $???? MR_AB(); LAX(); ADD_CYCLE(4); break; case 0xBF: // LAX $????,Y MR_AY(); LAX(); CHECK_EA(); ADD_CYCLE(4); break; case 0xA3: // LAX ($??,X) MR_IX(); LAX(); ADD_CYCLE(6); break; case 0xB3: // LAX ($??),Y MR_IY(); LAX(); CHECK_EA(); ADD_CYCLE(5); break; case 0xAB: // LXA #$?? MR_IM(); LXA(); ADD_CYCLE(2); break; case 0x27: // RLA $?? MR_ZP(); RLA(); MW_ZP(); ADD_CYCLE(5); break; case 0x37: // RLA $??,X MR_ZX(); RLA(); MW_ZP(); ADD_CYCLE(6); break; case 0x2F: // RLA $???? MR_AB(); RLA(); MW_EA(); ADD_CYCLE(6); break; case 0x3F: // RLA $????,X MR_AX(); RLA(); MW_EA(); ADD_CYCLE(7); break; case 0x3B: // RLA $????,Y MR_AY(); RLA(); MW_EA(); ADD_CYCLE(7); break; case 0x23: // RLA ($??,X) MR_IX(); RLA(); MW_EA(); ADD_CYCLE(8); break; case 0x33: // RLA ($??),Y MR_IY(); RLA(); MW_EA(); ADD_CYCLE(8); break; case 0x67: // RRA $?? MR_ZP(); RRA(); MW_ZP(); ADD_CYCLE(5); break; case 0x77: // RRA $??,X MR_ZX(); RRA(); MW_ZP(); ADD_CYCLE(6); break; case 0x6F: // RRA $???? MR_AB(); RRA(); MW_EA(); ADD_CYCLE(6); break; case 0x7F: // RRA $????,X MR_AX(); RRA(); MW_EA(); ADD_CYCLE(7); break; case 0x7B: // RRA $????,Y MR_AY(); RRA(); MW_EA(); ADD_CYCLE(7); break; case 0x63: // RRA ($??,X) MR_IX(); RRA(); MW_EA(); ADD_CYCLE(8); break; case 0x73: // RRA ($??),Y MR_IY(); RRA(); MW_EA(); ADD_CYCLE(8); break; case 0x87: // SAX $?? MR_ZP(); SAX(); MW_ZP(); ADD_CYCLE(3); break; case 0x97: // SAX $??,Y MR_ZY(); SAX(); MW_ZP(); ADD_CYCLE(4); break; case 0x8F: // SAX $???? MR_AB(); SAX(); MW_EA(); ADD_CYCLE(4); break; case 0x83: // SAX ($??,X) MR_IX(); SAX(); MW_EA(); ADD_CYCLE(6); break; case 0xCB: // SBX #$?? MR_IM(); SBX(); ADD_CYCLE(2); break; case 0x9F: // SHA $????,Y MR_AY(); SHA(); MW_EA(); ADD_CYCLE(5); break; case 0x93: // SHA ($??),Y MR_IY(); SHA(); MW_EA(); ADD_CYCLE(6); break; case 0x9B: // SHS $????,Y MR_AY(); SHS(); MW_EA(); ADD_CYCLE(5); break; case 0x9E: // SHX $????,Y MR_AY(); SHX(); MW_EA(); ADD_CYCLE(5); break; case 0x9C: // SHY $????,X MR_AX(); SHY(); MW_EA(); ADD_CYCLE(5); break; case 0x07: // SLO $?? MR_ZP(); SLO(); MW_ZP(); ADD_CYCLE(5); break; case 0x17: // SLO $??,X MR_ZX(); SLO(); MW_ZP(); ADD_CYCLE(6); break; case 0x0F: // SLO $???? MR_AB(); SLO(); MW_EA(); ADD_CYCLE(6); break; case 0x1F: // SLO $????,X MR_AX(); SLO(); MW_EA(); ADD_CYCLE(7); break; case 0x1B: // SLO $????,Y MR_AY(); SLO(); MW_EA(); ADD_CYCLE(7); break; case 0x03: // SLO ($??,X) MR_IX(); SLO(); MW_EA(); ADD_CYCLE(8); break; case 0x13: // SLO ($??),Y MR_IY(); SLO(); MW_EA(); ADD_CYCLE(8); break; case 0x47: // SRE $?? MR_ZP(); SRE(); MW_ZP(); ADD_CYCLE(5); break; case 0x57: // SRE $??,X MR_ZX(); SRE(); MW_ZP(); ADD_CYCLE(6); break; case 0x4F: // SRE $???? MR_AB(); SRE(); MW_EA(); ADD_CYCLE(6); break; case 0x5F: // SRE $????,X MR_AX(); SRE(); MW_EA(); ADD_CYCLE(7); break; case 0x5B: // SRE $????,Y MR_AY(); SRE(); MW_EA(); ADD_CYCLE(7); break; case 0x43: // SRE ($??,X) MR_IX(); SRE(); MW_EA(); ADD_CYCLE(8); break; case 0x53: // SRE ($??),Y MR_IY(); SRE(); MW_EA(); ADD_CYCLE(8); break; case 0xEB: // SBC #$?? (Unofficial) MR_IM(); SBC(); ADD_CYCLE(2); break; case 0x1A: // NOP (Unofficial) case 0x3A: // NOP (Unofficial) case 0x5A: // NOP (Unofficial) case 0x7A: // NOP (Unofficial) case 0xDA: // NOP (Unofficial) case 0xFA: // NOP (Unofficial) ADD_CYCLE(2); break; case 0x80: // DOP (CYCLES 2) case 0x82: // DOP (CYCLES 2) case 0x89: // DOP (CYCLES 2) case 0xC2: // DOP (CYCLES 2) case 0xE2: // DOP (CYCLES 2) R.PC++; ADD_CYCLE(2); break; case 0x04: // DOP (CYCLES 3) case 0x44: // DOP (CYCLES 3) case 0x64: // DOP (CYCLES 3) R.PC++; ADD_CYCLE(3); break; case 0x14: // DOP (CYCLES 4) case 0x34: // DOP (CYCLES 4) case 0x54: // DOP (CYCLES 4) case 0x74: // DOP (CYCLES 4) case 0xD4: // DOP (CYCLES 4) case 0xF4: // DOP (CYCLES 4) R.PC++; ADD_CYCLE(4); break; case 0x0C: // TOP case 0x1C: // TOP case 0x3C: // TOP case 0x5C: // TOP case 0x7C: // TOP case 0xDC: // TOP case 0xFC: // TOP R.PC+=2; ADD_CYCLE(4); break; case 0x02: /* JAM */ case 0x12: /* JAM */ case 0x22: /* JAM */ case 0x32: /* JAM */ case 0x42: /* JAM */ case 0x52: /* JAM */ case 0x62: /* JAM */ case 0x72: /* JAM */ case 0x92: /* JAM */ case 0xB2: /* JAM */ case 0xD2: /* JAM */ case 0xF2: /* JAM */ default: if( !Config.emulator.bIllegalOp ) { throw CApp::GetErrorString( IDS_ERROR_ILLEGALOPCODE ); goto _execute_exit; } else { R.PC--; ADD_CYCLE(4); } break; // default: // __assume(0); } end_is: __asm nop; if( nmi_request ) { _NMI(); } else if( irq_request ) { _IRQ(); } request_cycles -= exec_cycles; TOTAL_cycles += exec_cycles; // 僋儘僢僋摨婜張棟 mapper->Clock( exec_cycles ); #if DPCM_SYNCCLOCK apu->SyncDPCM( exec_cycles ); #endif if( bClockProcess ) { nes->Clock( exec_cycles ); } // nes->Clock( exec_cycles ); } _execute_exit: #if !DPCM_SYNCCLOCK apu->SyncDPCM( TOTAL_cycles - OLD_cycles ); #endif return TOTAL_cycles - OLD_cycles; }
/* * allocate and initalize the devctl_hdl structure for the * particular handle type. */ static devctl_hdl_t dc_mkhndl(dc_type_t type, char *path, uint_t oflags, devctl_hdl_t pc) { struct devctl_hdl *dcp; struct stat sb; char iocpath[MAXPATHLEN]; char *nodename, *unitsep, *minorsep, *chop; char *minorname; size_t strlcpy_size; char *iocpath_dup; char *tok; if ((path == NULL) || (strlen(path) > MAXPATHLEN - 1)) { errno = EINVAL; return (NULL); } /* * allocate handle and make a copy of the original path */ if ((dcp = calloc(1, sizeof (*dcp))) == NULL) { errno = ENOMEM; return (NULL); } if ((dcp->opath = strdup(path)) == NULL) { devctl_release((devctl_hdl_t)dcp); errno = ENOMEM; return (NULL); } (void) strcpy(iocpath, path); dcp->hdltype = type; dcp->fd = -1; /* * break apart the pathname according to the type handle */ switch (type) { case DEVCTL_PM_BUS: /* * chop off any minor name and concatenate the * ":devctl" minor node name string. */ if ((chop = strrchr(iocpath, ':')) != NULL) *chop = '\0'; if (strlcat(iocpath, devctl_minorname, MAXPATHLEN) >= MAXPATHLEN) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } else if (_libdevice_debug) { (void) printf("DEVCTL_PM_BUS: iocpath %s\n", iocpath); } break; case DEVCTL_PM_DEV: /* * Chop up the last device component in the pathname. * Concatenate either the device name itself, or the * "a,raw" string, as the minor node name, to the iocpath. */ if ((iocpath_dup = strdup(iocpath)) == NULL) { devctl_release((devctl_hdl_t)dcp); errno = ENOMEM; return (NULL); } if ((chop = strrchr(iocpath_dup, '/')) == NULL) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } *chop = '\0'; nodename = chop + 1; /* * remove the "@0,0" string */ tok = strtok(nodename, "@"); if ((minorname = malloc(strlen(tok) +1)) == NULL) { if (_libdevice_debug) (void) printf("DEVCTL_PM_DEV: failed malloc for" " minorname\n"); devctl_release((devctl_hdl_t)dcp); errno = ENOMEM; return (NULL); } (void) strcpy(minorname, tok); if (_libdevice_debug) { (void) printf("DEVCTL_PM_DEV: minorname %s\n", minorname); } /* * construct the name of the ioctl device * by concatenating either ":a,raw" or ":"minorname */ (void) strlcat(iocpath, ":", MAXPATHLEN); if (strcmp(minorname, "disk_chan") == 0 || strcmp(minorname, "disk_wwn") == 0 || strcmp(minorname, "disk_cdrom") == 0) { strlcpy_size = strlcat(iocpath, devctl_target_raw, MAXPATHLEN); } else { strlcpy_size = strlcat(iocpath, minorname, MAXPATHLEN); } if (strlcpy_size >= MAXPATHLEN) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } else if (_libdevice_debug) { (void) printf("DEVCTL_PM_DEV: iocpath %s\n", iocpath); } break; case DEVCTL_AP: /* * take the pathname as provided. */ break; case DEVCTL_BUS: /* * chop off any minor name and concatenate the * ":devctl" minor node name string. */ if ((chop = strrchr(iocpath, ':')) != NULL) *chop = '\0'; if (strlcat(iocpath, devctl_minorname, MAXPATHLEN) >= MAXPATHLEN) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } break; case DEVCTL_CLONE: /* * create a device handle for a new device created * from a call to devctl_bus_dev_create() */ dcp->hdltype = DEVCTL_DEVICE; /* FALLTHRU */ case DEVCTL_DEVICE: /* * Chop up the last device component in the pathname. * The componets are passed as nodename and unitaddr * in the IOCTL data for DEVCTL ops on devices. */ if ((chop = strrchr(iocpath, '/')) == NULL) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } *chop = '\0'; nodename = chop + 1; unitsep = strchr(nodename, '@'); minorsep = strchr(nodename, ':'); if (unitsep == NULL) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } /* * copy the nodename and unit address */ if (((dcp->nodename = malloc(MAXNAMELEN)) == NULL) || ((dcp->unitaddr = malloc(MAXNAMELEN)) == NULL)) { devctl_release((devctl_hdl_t)dcp); errno = ENOMEM; return (NULL); } *unitsep = '\0'; if (minorsep != NULL) *minorsep = '\0'; (void) snprintf(dcp->nodename, MAXNAMELEN, "%s", nodename); (void) snprintf(dcp->unitaddr, MAXNAMELEN, "%s", unitsep+1); /* * construct the name of the ioctl device */ if (strlcat(iocpath, devctl_minorname, MAXPATHLEN) >= MAXPATHLEN) { devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } break; default: devctl_release((devctl_hdl_t)dcp); errno = EINVAL; return (NULL); } if (_libdevice_debug) (void) printf("dc_mkhndl: iocpath %s ", iocpath); /* * verify the devctl or ap device exists and is a * character device interface. */ if (stat(iocpath, &sb) == 0) { if ((sb.st_mode & S_IFMT) != S_IFCHR) { if (_libdevice_debug) (void) printf(" - not character device\n"); errno = ENODEV; devctl_release((devctl_hdl_t)dcp); return (NULL); } } else { /* * return failure with errno value set by stat */ if (_libdevice_debug) (void) printf(" - stat failed\n"); devctl_release((devctl_hdl_t)dcp); return (NULL); } /* * if this was a new device, dup the parents handle, otherwise * just open the device. */ if (type == DEVCTL_CLONE) dcp->fd = dup(DCP(pc)->fd); else dcp->fd = open(iocpath, oflags); if (dcp->fd == -1) { if (_libdevice_debug) (void) printf(" - open/dup failed %d\n", errno); /* * leave errno as set by open/dup */ devctl_release((devctl_hdl_t)dcp); return (NULL); } if (_libdevice_debug) (void) printf(" - open success\n"); return ((devctl_hdl_t)dcp); }