# HG changeset patch # User Michael Pavone # Date 1419917052 28800 # Node ID abc834e4a52081271bb34edea7cf8c390a063410 # Parent 33ff0171301bb54d577c20176018c874a4c423d9 Added support for JPcc in Z80 test generator diff -r 33ff0171301b -r abc834e4a520 ztestgen.c --- a/ztestgen.c Mon Dec 29 20:56:05 2014 -0800 +++ b/ztestgen.c Mon Dec 29 21:24:12 2014 -0800 @@ -289,7 +289,7 @@ reg_usage[inst->reg] = 1; } uint8_t counter_reg = Z80_UNUSED; - if (inst->op == Z80_JP) { + if (inst->op == Z80_JP || inst->op == Z80_JPCC) { counter_reg = alloc_reg8(reg_usage, reg_values, 0); } puts("--------------"); @@ -331,12 +331,22 @@ //setup other regs for (uint8_t reg = Z80_BC; reg <= Z80_IY; reg++) { if (reg != Z80_AF && reg != Z80_SP && (inst->op != Z80_JP || addr_mode != Z80_REG_INDIRECT || inst->ea_reg != reg)) { - cur = ld_ir16(cur, reg, reg_values[reg]); + if (i == 1 && (z80_high_reg(reg) == counter_reg || z80_low_reg(reg) == counter_reg)) { + if (z80_high_reg(reg) == counter_reg) { + if (reg_usage[z80_low_reg(reg)]) { + cur = ld_ir8(cur, z80_low_reg(reg), reg_values[z80_low_reg(reg)]); + } + } else if (reg_usage[z80_high_reg(reg)]) { + cur = ld_ir8(cur, z80_high_reg(reg), reg_values[z80_high_reg(reg)]); + } + } else { + cur = ld_ir16(cur, reg, reg_values[reg]); + } } } if (inst->op == Z80_JP && addr_mode == Z80_REG_INDIRECT) { - uint16_t address = cur - prog + (inst->ea_reg == Z80_HL ? 3 : 4) + instlen + 1; + uint16_t address = cur - prog + (inst->ea_reg == Z80_HL ? 3 : 4) + instlen + 1 + i; cur = ld_ir16(cur, inst->ea_reg, address); } @@ -352,11 +362,10 @@ //immed/displacement byte(s) if (addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE) { *(cur++) = inst->ea_reg; - } else if (inst->op == Z80_JP && addr_mode == Z80_IMMED) { - uint16_t address = cur - prog + 5; //2 for immed address, 3 for instruction to skip + } else if ((inst->op == Z80_JP || inst->op == Z80_JPCC) && addr_mode == Z80_IMMED) { + uint16_t address = cur - prog + 3 + i; //2 for immed address, 1/2 for instruction(s) to skip *(cur++) = address; *(cur++) = address >> 8; - cur = ld_ir16(cur, Z80_HL, 0xDEAD); } else if (addr_mode == Z80_IMMED & inst->op != Z80_IM) { *(cur++) = inst->immed & 0xFF; if (word_sized) { @@ -372,8 +381,12 @@ if (instlen == 3) { *(cur++) = instbuf[2]; } - if (inst->op == Z80_JP && addr_mode == Z80_REG_INDIRECT) { + if (inst->op == Z80_JP || inst->op == Z80_JPCC) { cur = inc_r(cur, counter_reg); + if (i) { + //inc twice on second iteration so we can differentiate the two + cur = inc_r(cur, counter_reg); + } } if (!i) { //Save AF from first run @@ -449,7 +462,7 @@ uint8_t should_skip(z80inst * inst) { - return inst->op >= Z80_JPCC || (inst->op >= Z80_LDI && inst->op <= Z80_CPDR) || inst->op == Z80_HALT + return inst->op >= Z80_JR || (inst->op >= Z80_LDI && inst->op <= Z80_CPDR) || inst->op == Z80_HALT || inst->op == Z80_DAA || inst->op == Z80_RLD || inst->op == Z80_RRD || inst->op == Z80_NOP || inst->op == Z80_DI || inst->op == Z80_EI; }