def sbc(cpu, opcode, logger): logger.info("SBC HL") regInd = (opcode & 0x30) >> 4 value = 0 if regInd == 0: value = cpu.BC elif regInd == 1: value = cpu.DE elif regInd == 2: value = cpu.HL elif regInd == 3: value = cpu.SP oldHL = cpu.HL logger.info("Old value of HL: " + str(oldHL)) cpu.HL = cpu.HL - value - (1 if cpu.CFlag else 0) logger.info("New value of HL: " + str(cpu.HL)) cpu.flags[SF] = Bits.signFlag(cpu.HL, bits=16) cpu.flags[ZF] = Bits.isZero(cpu.HL) cpu.flags[HF] = Bits.halfCarrySub16(oldHL, cpu.HL) cpu.flags[PVF] = Bits.overflow(Bits.twos_comp(oldHL, bits=16), Bits.twos_comp(cpu.HL, bits=16)) cpu.flags[NF] = True cpu.flags[CF] = Bits.borrow(cpu.HL, bits=16)
def jr_e(cpu, opcode, logger): pc = cpu.PC jumpOffset = Bits.twos_comp(cpu.ram[pc]) cpu.PC = pc + jumpOffset + 1 cpu.m_cycles, cpu.t_states = 3, 12 logger.info("JR {0:x}".format(jumpOffset))
def jpnc(cpu, opcode, logger): jumpOffset = Bits.twos_comp(cpu.rom.readMemory(cpu.PC)) - 2 if cpu.CFlag: return cpu.PC = cpu.PC + jumpOffset logger.info("JP NC {0:x}".format(jumpOffset))
def jpnz(cpu, opcode, logger): jumpOffset = cpu.rom.readMemory(cpu.PC) if cpu.ZFlag: return cpu.PC = cpu.PC + Bits.twos_comp(jumpOffset) logger.info("JPNZ {0:x}".format(jumpOffset))
def jrz(cpu, opcode, logger): jumpOffset = Bits.twos_comp(cpu.rom.readMemory(cpu.PC)) if cpu.ZFlag == False: return cpu.PC = cpu.PC + jumpOffset logger.info("JR Z {0:x}".format(jumpOffset))
def jr_c(cpu, opcode, logger): pc = cpu.PC + 1 jumpOffset = Bits.twos_comp(cpu.ram[pc]) - 2 no_jump = cpu.CFlag is False pc = pc + jumpOffset if not no_jump: cpu.PC = pc cpu.m_cycles, cpu.t_states = 1, 5 cpu.m_cycles, cpu.t_states = 2, 7 logger.info("JP C {0:04X}".format(pc))
def djnz(cpu, opcode, logger): pc = cpu.PC e = cpu.ram[pc] cpu.B = cpu.B - 1 pc = pc + Bits.twos_comp(e) + 1 if cpu.B != 0: cpu.m_cycles, cpu.t_states = 1, 5 cpu.PC = pc cpu.m_cycles, cpu.t_states = 2, 8 logger.info("DJNZ {:04X}".format(pc))
def inc8(cpu, opcode, logger): logger.info("INC r") index = ( opcode >> 3 ) & 7 oldValue = cpu.regs[index] cpu.regs[index] = (cpu.regs[index] + 1 ) & 0xFF cpu.NFlag = False cpu.ZFlag = Bits.isZero(cpu.regs[index]) cpu.HFlag = Bits.halfCarrySub(oldValue, cpu.regs[index]) cpu.PVFlag = True if oldValue == 0x7f else False cpu.SFlag = Bits.twos_comp(cpu.regs[index]) < 0
def jrz(cpu, opcode, logger): pc = cpu.PC jumpTo = pc + Bits.twos_comp(cpu.ram[pc]) + 1 no_jump = cpu.ZFlag is False if not no_jump: cpu.PC = jumpTo cpu.m_cycles, cpu.t_states = 1, 5 cpu.m_cycles, cpu.t_states = 2, 7 logger.info("JR Z, {:04X}".format(jumpTo))
def jpnc(cpu, opcode, logger): pc = cpu.PC jumpOffset = Bits.twos_comp(cpu.ram[pc]) no_jump = cpu.CFlag if not no_jump: cpu.PC = pc + jumpOffset+1 cpu.m_cycles, cpu.t_states = 1, 5 cpu.m_cycles, cpu.t_states = 2, 7 logger.info("JR NC, {0:04X}".format(pc+jumpOffset+1))