Mercurial > repos > blastem
comparison ztestgen.c @ 618:abc834e4a520
Added support for JPcc in Z80 test generator
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 29 Dec 2014 21:24:12 -0800 |
parents | 33ff0171301b |
children | 3072fb746601 |
comparison
equal
deleted
inserted
replaced
617:33ff0171301b | 618:abc834e4a520 |
---|---|
287 } | 287 } |
288 } | 288 } |
289 reg_usage[inst->reg] = 1; | 289 reg_usage[inst->reg] = 1; |
290 } | 290 } |
291 uint8_t counter_reg = Z80_UNUSED; | 291 uint8_t counter_reg = Z80_UNUSED; |
292 if (inst->op == Z80_JP) { | 292 if (inst->op == Z80_JP || inst->op == Z80_JPCC) { |
293 counter_reg = alloc_reg8(reg_usage, reg_values, 0); | 293 counter_reg = alloc_reg8(reg_usage, reg_values, 0); |
294 } | 294 } |
295 puts("--------------"); | 295 puts("--------------"); |
296 for (uint8_t reg = 0; reg < Z80_UNUSED; reg++) { | 296 for (uint8_t reg = 0; reg < Z80_UNUSED; reg++) { |
297 if (reg_values[reg]) { | 297 if (reg_values[reg]) { |
329 cur = pop(cur, Z80_AF); | 329 cur = pop(cur, Z80_AF); |
330 | 330 |
331 //setup other regs | 331 //setup other regs |
332 for (uint8_t reg = Z80_BC; reg <= Z80_IY; reg++) { | 332 for (uint8_t reg = Z80_BC; reg <= Z80_IY; reg++) { |
333 if (reg != Z80_AF && reg != Z80_SP && (inst->op != Z80_JP || addr_mode != Z80_REG_INDIRECT || inst->ea_reg != reg)) { | 333 if (reg != Z80_AF && reg != Z80_SP && (inst->op != Z80_JP || addr_mode != Z80_REG_INDIRECT || inst->ea_reg != reg)) { |
334 cur = ld_ir16(cur, reg, reg_values[reg]); | 334 if (i == 1 && (z80_high_reg(reg) == counter_reg || z80_low_reg(reg) == counter_reg)) { |
335 if (z80_high_reg(reg) == counter_reg) { | |
336 if (reg_usage[z80_low_reg(reg)]) { | |
337 cur = ld_ir8(cur, z80_low_reg(reg), reg_values[z80_low_reg(reg)]); | |
338 } | |
339 } else if (reg_usage[z80_high_reg(reg)]) { | |
340 cur = ld_ir8(cur, z80_high_reg(reg), reg_values[z80_high_reg(reg)]); | |
341 } | |
342 } else { | |
343 cur = ld_ir16(cur, reg, reg_values[reg]); | |
344 } | |
335 } | 345 } |
336 } | 346 } |
337 | 347 |
338 if (inst->op == Z80_JP && addr_mode == Z80_REG_INDIRECT) { | 348 if (inst->op == Z80_JP && addr_mode == Z80_REG_INDIRECT) { |
339 uint16_t address = cur - prog + (inst->ea_reg == Z80_HL ? 3 : 4) + instlen + 1; | 349 uint16_t address = cur - prog + (inst->ea_reg == Z80_HL ? 3 : 4) + instlen + 1 + i; |
340 cur = ld_ir16(cur, inst->ea_reg, address); | 350 cur = ld_ir16(cur, inst->ea_reg, address); |
341 } | 351 } |
342 | 352 |
343 //copy instruction | 353 //copy instruction |
344 if (instlen == 3) { | 354 if (instlen == 3) { |
350 } | 360 } |
351 | 361 |
352 //immed/displacement byte(s) | 362 //immed/displacement byte(s) |
353 if (addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE) { | 363 if (addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE) { |
354 *(cur++) = inst->ea_reg; | 364 *(cur++) = inst->ea_reg; |
355 } else if (inst->op == Z80_JP && addr_mode == Z80_IMMED) { | 365 } else if ((inst->op == Z80_JP || inst->op == Z80_JPCC) && addr_mode == Z80_IMMED) { |
356 uint16_t address = cur - prog + 5; //2 for immed address, 3 for instruction to skip | 366 uint16_t address = cur - prog + 3 + i; //2 for immed address, 1/2 for instruction(s) to skip |
357 *(cur++) = address; | 367 *(cur++) = address; |
358 *(cur++) = address >> 8; | 368 *(cur++) = address >> 8; |
359 cur = ld_ir16(cur, Z80_HL, 0xDEAD); | |
360 } else if (addr_mode == Z80_IMMED & inst->op != Z80_IM) { | 369 } else if (addr_mode == Z80_IMMED & inst->op != Z80_IM) { |
361 *(cur++) = inst->immed & 0xFF; | 370 *(cur++) = inst->immed & 0xFF; |
362 if (word_sized) { | 371 if (word_sized) { |
363 *(cur++) = inst->immed >> 8; | 372 *(cur++) = inst->immed >> 8; |
364 } | 373 } |
370 *(cur++) = inst->immed & 0xFF; | 379 *(cur++) = inst->immed & 0xFF; |
371 } | 380 } |
372 if (instlen == 3) { | 381 if (instlen == 3) { |
373 *(cur++) = instbuf[2]; | 382 *(cur++) = instbuf[2]; |
374 } | 383 } |
375 if (inst->op == Z80_JP && addr_mode == Z80_REG_INDIRECT) { | 384 if (inst->op == Z80_JP || inst->op == Z80_JPCC) { |
376 cur = inc_r(cur, counter_reg); | 385 cur = inc_r(cur, counter_reg); |
386 if (i) { | |
387 //inc twice on second iteration so we can differentiate the two | |
388 cur = inc_r(cur, counter_reg); | |
389 } | |
377 } | 390 } |
378 if (!i) { | 391 if (!i) { |
379 //Save AF from first run | 392 //Save AF from first run |
380 cur = push(cur, Z80_AF); | 393 cur = push(cur, Z80_AF); |
381 if (is_mem) { | 394 if (is_mem) { |
447 } | 460 } |
448 | 461 |
449 | 462 |
450 uint8_t should_skip(z80inst * inst) | 463 uint8_t should_skip(z80inst * inst) |
451 { | 464 { |
452 return inst->op >= Z80_JPCC || (inst->op >= Z80_LDI && inst->op <= Z80_CPDR) || inst->op == Z80_HALT | 465 return inst->op >= Z80_JR || (inst->op >= Z80_LDI && inst->op <= Z80_CPDR) || inst->op == Z80_HALT |
453 || inst->op == Z80_DAA || inst->op == Z80_RLD || inst->op == Z80_RRD || inst->op == Z80_NOP | 466 || inst->op == Z80_DAA || inst->op == Z80_RLD || inst->op == Z80_RRD || inst->op == Z80_NOP |
454 || inst->op == Z80_DI || inst->op == Z80_EI; | 467 || inst->op == Z80_DI || inst->op == Z80_EI; |
455 } | 468 } |
456 | 469 |
457 void z80_gen_all() | 470 void z80_gen_all() |