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()