# HG changeset patch # User Mike Pavone # Date 1370721563 25200 # Node ID 3f4f2b7318a1dfd78ae59a88c613b3bf7aa9d6e1 # Parent 561fe3ea3fc82abd4a2032b86d457090fdfd71a7 Check memory results in ztestgen diff -r 561fe3ea3fc8 -r 3f4f2b7318a1 ztestgen.c --- a/ztestgen.c Sat Jun 08 11:31:52 2013 -0700 +++ b/ztestgen.c Sat Jun 08 12:59:23 2013 -0700 @@ -20,6 +20,7 @@ #define PRE_IY 0xFD #define LD_IR16 0x01 #define LD_IR8 0x06 +#define LD_RR8 0x40 #define PUSH 0xC5 #define POP 0xC1 @@ -51,6 +52,22 @@ return dst; } +uint8_t * ld_rr8(uint8_t * dst, uint8_t src, uint8_t dstr) +{ + if (src <= Z80_H) { + src = (src - Z80_C) ^ 1; + } else { + src = 0x7; + } + if (dstr <= Z80_H) { + dstr = (dstr - Z80_C) ^ 1; + } else { + dstr = 0x7; + } + *(dst++) = LD_RR8 | (dstr << 3) | src; + return dst; +} + uint8_t * ld_amem(uint8_t * dst, uint16_t address) { *(dst++) = 0x32; @@ -59,6 +76,14 @@ return dst; } +uint8_t * ld_mema(uint8_t * dst, uint16_t address) +{ + *(dst++) = 0x3A; + *(dst++) = address & 0xFF; + *(dst++) = address >> 8; + return dst; +} + uint8_t * push(uint8_t * dst, uint8_t reg) { if (reg == Z80_IX) { @@ -97,7 +122,9 @@ { z80inst copy; uint16_t reg_values[Z80_UNUSED]; + uint8_t reg_usage[Z80_UNUSED]; memset(reg_values, 0, sizeof(reg_values)); + memset(reg_usage, 0, sizeof(reg_usage)); uint8_t addr_mode = inst->addr_mode & 0x1F; uint8_t word_sized = ((inst->reg != Z80_USE_IMMED && inst->reg != Z80_UNUSED && inst->reg >= Z80_BC) || (addr_mode == Z80_REG && inst->ea_reg >= Z80_BC)) ? 1 : 0; @@ -124,14 +151,18 @@ switch(addr_mode) { case Z80_REG: + reg_usage[inst->ea_reg] = 1; if (word_sized) { reg_values[inst->ea_reg] = rand() % 65536; reg_values[z80_high_reg(inst->ea_reg)] = reg_values[inst->ea_reg] >> 8; + reg_usage[z80_high_reg(inst->ea_reg)] = 1; reg_values[z80_low_reg(inst->ea_reg)] = reg_values[inst->ea_reg] & 0xFF; + reg_usage[z80_low_reg(inst->ea_reg)] = 1; } else { reg_values[inst->ea_reg] = rand() % 256; uint8_t word_reg = z80_word_reg(inst->ea_reg); if (word_reg != Z80_UNUSED) { + reg_usage[word_reg] = 1; reg_values[word_reg] = (reg_values[z80_high_reg(word_reg)] << 8) | (reg_values[z80_low_reg(word_reg)] & 0xFF); } } @@ -139,8 +170,11 @@ case Z80_REG_INDIRECT: is_mem = 1; reg_values[inst->ea_reg] = 0x1000 + (rand() % 256 - 128); + reg_usage[inst->ea_reg] = 1; address = reg_values[inst->ea_reg]; + reg_usage[z80_high_reg(inst->ea_reg)] = 1; reg_values[z80_high_reg(inst->ea_reg)] = reg_values[inst->ea_reg] >> 8; + reg_usage[z80_low_reg(inst->ea_reg)] = 1; reg_values[z80_low_reg(inst->ea_reg)] = reg_values[inst->ea_reg] & 0xFF; break; case Z80_IMMED_INDIRECT: @@ -149,8 +183,11 @@ break; case Z80_IX_DISPLACE: reg_values[Z80_IX] = 0x1000; + reg_usage[Z80_IX] = 1; reg_values[Z80_IXH] = 0x10; + reg_usage[Z80_IXH] = 1; reg_values[Z80_IXL] = 0; + reg_usage[Z80_IXL] = 1; is_mem = 1; offset = inst->ea_reg; if (offset > 0x7F) { @@ -160,8 +197,11 @@ break; case Z80_IY_DISPLACE: reg_values[Z80_IY] = 0x1000; + reg_usage[Z80_IY] = 1; reg_values[Z80_IYH] = 0x10; + reg_usage[Z80_IYH] = 1; reg_values[Z80_IYL] = 0; + reg_usage[Z80_IYL] = 1; is_mem = 1; offset = inst->ea_reg; if (offset > 0x7F) { @@ -171,14 +211,18 @@ break; } if (inst->reg != Z80_UNUSED && inst->reg != Z80_USE_IMMED) { + reg_usage[inst->reg] = 1; if (word_sized) { reg_values[inst->reg] = rand() % 65536; + reg_usage[z80_high_reg(inst->reg)] = 1; reg_values[z80_high_reg(inst->reg)] = reg_values[inst->reg] >> 8; + reg_usage[z80_low_reg(inst->reg)] = 1; reg_values[z80_low_reg(inst->reg)] = reg_values[inst->reg] & 0xFF; } else { reg_values[inst->reg] = rand() % 255; uint8_t word_reg = z80_word_reg(inst->reg); if (word_reg != Z80_UNUSED) { + reg_usage[word_reg] = 1; reg_values[word_reg] = (reg_values[z80_high_reg(word_reg)] << 8) | (reg_values[z80_low_reg(word_reg)] & 0xFF); } } @@ -190,7 +234,7 @@ } } char disbuf[80]; - z80_disasm(inst, disbuf); + z80_disasm(inst, disbuf, 0); puts(disbuf); char pathbuf[128]; sprintf(pathbuf, "ztests/%s", z80_mnemonics[inst->op]); @@ -258,6 +302,23 @@ *cur = '_'; } } + //save memory result + if (is_mem) { + if (reg_usage[Z80_A]) { + cur = push(cur, Z80_AF); + } + cur = ld_mema(cur, address); + if (reg_usage[Z80_A]) { + for (int reg = 0; reg < Z80_I; reg++) { + if (!reg_usage[reg]) { + cur = ld_rr8(cur, Z80_A, reg); + break; + } + } + cur = pop(cur, Z80_AF); + } + } + //halt *(cur++) = 0x76; sprintf(pathbuf + strlen(pathbuf), "/%s.bin", disbuf);