void tlcs870_device::do_LD_gbit_CF(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD g.b, CF 1110 1ggg 1100 1bbb 1 - - - 2 */ m_cycles = 2; uint8_t val = get_reg8(opbyte0 & 0x7); const uint8_t bitpos = opbyte1 & 0x7; const int bitused = (1 << bitpos); if (is_CF()) // if carry flag is set, set the bit in val { val |= bitused; } else // if carry flag isn't set, clear the bit in val { val &= ~bitused; } // for this optype of operation ( LD *.b, CF ) the Jump Flag always ends up being 1 set_JF(); set_reg8(opbyte0 & 0x7, val); }
void tlcs870_device::do_CLR_gbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles CLR g.b 1110 1ggg 0100 1bbb Z * - - 3 */ m_cycles = 3; uint8_t val = get_reg8(opbyte0 & 0x7); const uint8_t bitpos = opbyte1 & 0x7; const int bitused = (1 << bitpos); if (val & bitused) // Zero flag gets set based on original value of bit? { clear_ZF(); clear_JF(); // 'Z' (so copy Z flag?) } else { set_ZF(); set_JF(); // 'Z' } val &= ~bitused; set_reg8(opbyte0 & 0x7, val); }
void tlcs870_device::do_CPL_gbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles CPL g.b 1110 1ggg 1100 0bbb Z * - - 3 */ m_cycles = 3; uint8_t val = get_reg8(opbyte0 & 0x7); const uint8_t bitpos = opbyte1 & 0x7; const int bitused = (1 << bitpos); uint8_t bit = val & bitused; if (bit) // if the bit is set, clear the zero/jump flags and unset the bit { clear_ZF(); clear_JF(); val &= ~bitused; } else // if the bit isn't set, set the zero/jump flags and set the bit { set_ZF(); set_JF(); val |= bitused; } set_reg8(opbyte0 & 0x7, val); }
void tlcs870_device::do_LD_inpp_indirectbit_CF(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD (DE).g, CF 1110 1ggg 1001 1010 1 - - - 5 LD (HL).g, CF 1110 1ggg 1001 1011 1 - - - 5 */ m_cycles = 5; const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL uint8_t val = RM8(addr); if (is_CF()) // if carry flag is set, set the bit in val { val |= bitused; } else // if carry flag isn't set, clear the bit in val { val &= ~bitused; } // for this optype of operation ( LD *.b, CF ) the Jump Flag always ends up being 1 set_JF(); WM8(addr, val); }
IMPISD_BEGIN_NAMESPACE MultivariateFNormalSufficientSparse::MultivariateFNormalSufficientSparse( const MatrixXd& FX, double JF, const VectorXd& FM, const SparseMatrix<double>& Sigma, cholmod_common *c, double cutoff) : Object("Multivariate Normal distribution %1%") { c_ = c; W_=nullptr; Sigma_=nullptr; P_=nullptr; PW_=nullptr; epsilon_=nullptr; L_=nullptr; N_=FX.rows(); M_=FX.cols(); IMP_LOG(TERSE, "MVNsparse: direct init with N=" << N_ << " and M=" << M_ << std::endl); IMP_USAGE_CHECK( N_ > 0, "please provide at least one observation per dimension"); IMP_USAGE_CHECK( M_ > 0, "please provide at least one variable"); FM_=FM; set_FX(FX,cutoff); //also computes W, Fbar and epsilon. set_JF(JF); set_Sigma(Sigma); //computes the Cholesky decomp. }
void tlcs870_device::do_CPL_inpp_indirectbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles CPL (DE).g 1110 1ggg 1001 0010 Z * - - 5 CPL (HL).g 1110 1ggg 1001 0011 Z * - - 5 */ m_cycles = 5; const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(addr); uint8_t bit = val & bitused; if (bit) // if the bit is set, clear the zero/jump flags and unset the bit { clear_ZF(); clear_JF(); val &= ~bitused; } else // if the bit isn't set, set the zero/jump flags and set the bit { set_ZF(); set_JF(); val |= bitused; } WM8(addr, val); }
void tlcs870_device::do_CLR_inppbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles CLR (DE).g 1110 1ggg 1000 1010 Z * - - 5 CLR (HL).g 1110 1ggg 1000 1011 Z * - - 5 */ m_cycles = 5; const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(addr); if (val & bitused) // Zero flag gets set based on original value of bit? { clear_ZF(); clear_JF(); // 'Z' (so copy Z flag?) } else { set_ZF(); set_JF(); // 'Z' } val &= ~bitused; WM8(addr, val); }
void tlcs870_device::do_SET_inppbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles SET (DE).g 1110 1ggg 1000 0010 Z * - - 5 SET (HL).g 1110 1ggg 1000 0011 Z * - - 5 */ m_cycles = 5; const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL uint8_t val = RM8(addr); if (val & bitused) // Zero flag gets set based on original value of bit? { clear_ZF(); clear_JF(); // 'Z' (so copy Z flag?) } else { set_ZF(); set_JF(); // 'Z' } val |= bitused; WM8(addr, val); }
MultivariateFNormalSufficientSparse::MultivariateFNormalSufficientSparse( const VectorXd& Fbar, double JF, const VectorXd& FM, int Nobs, const SparseMatrix<double>& W, const SparseMatrix<double>& Sigma, cholmod_common *c) : Object("Multivariate Normal distribution %1%") { c_ = c; W_=nullptr; Sigma_=nullptr; P_=nullptr; PW_=nullptr; epsilon_=nullptr; L_=nullptr; N_=Nobs; M_=Fbar.rows(); IMP_LOG(TERSE, "MVNsparse: sufficient statistics init with N=" << N_ << " and M=" << M_ << std::endl); IMP_USAGE_CHECK( N_ > 0, "please provide at least one observation per dimension"); IMP_USAGE_CHECK( M_ > 0, "please provide at least one variable"); FM_=FM; set_Fbar(Fbar); //also computes epsilon set_W(W); set_JF(JF); set_Sigma(Sigma); }
void tlcs870_device::do_LD_gg_SP(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD gg, SP 1110 10gg 1111 1011 1 - - - 3 */ m_cycles = 3; set_reg16(opbyte0 & 0x3, m_sp.d); set_JF(); // no other flag changes for this type of LD }
void tlcs870_device::do_LD_rr_gg(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD rr, gg 1110 10gg 0001 00rr 1 - - - 2 */ m_cycles = 2; const uint16_t gg = get_reg16(opbyte0 & 0x3); set_reg16(opbyte1 & 0x3, gg); set_JF(); // no other flag changes for this type of LD }
void tlcs870_device::do_JP_gg(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles JP gg 1110 10gg 1111 1110 1 - - - 3 */ m_cycles = 3; const uint16_t val = get_reg16(opbyte0 & 3); m_addr = val; set_JF(); }
void tlcs870_device::do_LD_r_g(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD r, g 1110 1ggg 0101 1rrr 1 Z - - 2 */ m_cycles = 2; const uint8_t val = get_reg8(opbyte0 & 0x7); set_reg8(opbyte1 & 0x7, val); set_JF(); if (val == 0x00) set_ZF(); else clear_ZF(); }
void tlcs870_device::do_XCH_rr_gg(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles XCH rr, gg 1110 10gg 0001 01rr 1 - - - 3 */ m_cycles = 3; const uint16_t gg = get_reg16(opbyte0 & 0x3); const uint16_t rr = get_reg16(opbyte1 & 0x3); set_reg16(opbyte1 & 0x3, gg); set_reg16(opbyte0 & 0x3, rr); set_JF(); }
void tlcs870_device::do_XOR_CF_gbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles XOR CF, g.b 1110 1ggg 1101 0bbb ~C - * - 2 */ m_cycles = 2; const uint8_t bitpos = opbyte1 & 0x7; const uint8_t bitused = 1 << bitpos; const uint8_t g = get_reg8(opbyte0 & 0x7); const uint8_t bit = g & bitused; if (is_CF()) { if (bit) { clear_CF(); } else { set_CF(); } } else { if (bit) { set_CF(); } else { clear_CF(); } } // JF ends up being whatever the new value of CF is if (is_CF()) set_JF(); else clear_JF(); }
void tlcs870_device::do_XCH_r_g(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles XCG r, g 1110 1ggg 1010 1rrr 1 Z - - 3 */ m_cycles = 3; const uint8_t val = get_reg8(opbyte0 & 0x7); const uint8_t r = get_reg8(opbyte1 & 0x7); set_reg8(opbyte1 & 0x7, val); set_reg8(opbyte0 & 0x7, r); set_JF(); if (val == 0x00) set_ZF(); else clear_ZF(); }
void tlcs870_device::do_LD_CF_gbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD CF, g.b 1110 1ggg 1101 1bbb ~C - * - 2 aka TEST g.b */ m_cycles = 2; const uint8_t bitpos = opbyte1 & 0x7; const uint8_t bitused = 1 << bitpos; const uint8_t g = get_reg8(opbyte0 & 0x7); const uint8_t bit = g & bitused; bit ? set_CF() : clear_CF(); // for this optype of operation ( LD CF, *.b ) the Jump Flag always ends up the inverse of the Carry Flag bit ? clear_JF() : set_JF(); }
void tlcs870_device::do_LD_CF_inpp_indirectbit(const uint8_t opbyte0, const uint8_t opbyte1) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD CF, (DE).g 1110 1ggg 1001 1110 ~C - * - 4 LD CF, (HL).g 1110 1ggg 1001 1111 ~C - * - 4 aka aka TEST (pp).g */ m_cycles = 4; const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL const uint8_t val = RM8(addr); const uint8_t bit = val & bitused; bit ? set_CF() : clear_CF(); // for this optype of operation ( LD CF, *.b ) the Jump Flag always ends up the inverse of the Carry Flag bit ? clear_JF() : set_JF(); }
void tlcs870_device::do_LD_indst_r(const uint8_t opbyte0, const uint8_t opbyte1, const uint16_t dstaddr) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD (x), r 1111 0000 xxxx xxxx 0101 1rrr 1 - - - 4 LD (PC+A), r invalid encoding (all PC+A are invalid for dst) ? ? ? ? ? LD (DE), r 1111 0010 0101 1rrr 1 - - - 3 LD (HL), r 1111 0011 0101 1rrr 1 - - - 3 LD (HL+d), r 1111 0100 dddd dddd 0101 1rrr 1 - - - 5 LD (HL+C), r invalid encoding (all HL+C are invalid for dst) ? ? ? ? ? LD (HL+), r 1111 0110 0101 0rrr 1 - - - 4 (invalid if r is H or L) LD (-HL), r 1111 0111 0101 0rrr 1 - - - 4 aka LD (dst),r */ m_cycles += 3; const uint8_t reg = get_reg8(opbyte1 & 0x7); WM8(dstaddr, reg); set_JF(); }
void tlcs870_device::do_LD_indst_rr(const uint8_t opbyte0, const uint8_t opbyte1, const uint16_t dstaddr) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD (x), rr 1111 0000 xxxx xxxx 0001 00rr 1 - - - 5 LD (PC+A), rr invalid encoding (all PC+A are invalid for dst) ? ? ? ? ? LD (DE), rr 1111 0010 0001 00rr 1 - - - 4 LD (HL), rr 1111 0011 0001 00rr 1 - - - 4 LD (HL+d), rr 1111 0100 dddd dddd 0001 00rr 1 - - - 6 LD (HL+C), rr invalid encoding (all HL+C are invalid for dst) ? ? ? ? ? LD (HL+), rr not listed, invalid due to 16-bit op? ? ? ? ? ? LD (-HL), rr not listed, invalid due to 16-bit op? ? ? ? ? ? aka LD (dst),rr (dst) can only be (x) (pp) or (HL+d) ? not (HL+) or (-HL) ? */ m_cycles += 4; const uint16_t val = get_reg16(opbyte1 & 0x3); WM16(dstaddr, val); set_JF(); }
void tlcs870_device::do_LD_indst_n(const uint8_t opbyte0, const uint8_t opbyte1, const uint16_t dstaddr) { /* OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles LD (x), n not listed, redundant encoding? ? ? ? ? ? LD (PC+A), n invalid encoding (all PC+A are invalid for dst) ? ? ? ? ? LD (DE), n 1111 0010 0010 1100 nnnn nnnn 1 - - - 4 LD (HL), n not listed, redundant encoding? ? ? ? ? ? LD (HL+d), n 1111 0100 dddd dddd 0010 1100 nnnn nnnn 1 - - - 6 LD (HL+C), n invalid encoding (all HL+C are invalid for dst) ? ? ? ? ? LD (HL+), n 1111 0110 0010 1100 nnnn nnnn 1 - - - 5 LD (-HL), n 1111 0111 0010 1100 nnnn nnnn 1 - - - 5 aka (dst),n (dst) can only be (DE), (HL+), (-HL), or (HL+d) because (x) and (HL) are redundant encodings? */ m_cycles += 4; const uint16_t n = READ8(); WM8(dstaddr, n); set_JF(); }