comparison z80inst.c @ 202:693ad04b965e

Distinguish between 1-byte and 2-byte NOPs
author Mike Pavone <pavone@retrodev.com>
date Mon, 21 Jan 2013 21:59:09 -0800
parents 2d2fa345e1fc
children 0ae589d4c3f9
comparison
equal deleted inserted replaced
201:2d2fa345e1fc 202:693ad04b965e
1 #include "z80inst.h" 1 #include "z80inst.h"
2 #include <string.h> 2 #include <string.h>
3 #include <stdio.h> 3 #include <stdio.h>
4 4
5 #define NOP {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0} 5 #define NOP {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 1}
6 #define NOP2 {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 2}
6 7
7 z80inst z80_tbl_a[256] = { 8 z80inst z80_tbl_a[256] = {
8 //0 9 //0
9 NOP, 10 NOP,
10 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0}, 11 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0},
337 {Z80_SBC, Z80_HL, Z80_REG, Z80_SP, 0}, 338 {Z80_SBC, Z80_HL, Z80_REG, Z80_SP, 0},
338 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, 339 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
339 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, 340 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
340 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 341 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
341 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1}, 342 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1},
342 NOP, 343 NOP2,
343 {Z80_IN, Z80_A, Z80_REG_INDIRECT, Z80_C, 0}, 344 {Z80_IN, Z80_A, Z80_REG_INDIRECT, Z80_C, 0},
344 {Z80_OUT, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0}, 345 {Z80_OUT, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
345 {Z80_ADC, Z80_HL, Z80_REG, Z80_SP, 0}, 346 {Z80_ADC, Z80_HL, Z80_REG, Z80_SP, 0},
346 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, 347 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
347 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, 348 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
348 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 349 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
349 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2}, 350 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2},
350 NOP, 351 NOP2,
351 //8 352 //8
352 NOP, 353 NOP2,
353 NOP, 354 NOP2,
354 NOP, 355 NOP2,
355 NOP, 356 NOP2,
356 NOP, 357 NOP2,
357 NOP, 358 NOP2,
358 NOP, 359 NOP2,
359 NOP, 360 NOP2,
360 NOP, 361 NOP2,
361 NOP, 362 NOP2,
362 NOP, 363 NOP2,
363 NOP, 364 NOP2,
364 NOP, 365 NOP2,
365 NOP, 366 NOP2,
366 NOP, 367 NOP2,
367 NOP, 368 NOP2,
368 //9 369 //9
369 NOP, 370 NOP2,
370 NOP, 371 NOP2,
371 NOP, 372 NOP2,
372 NOP, 373 NOP2,
373 NOP, 374 NOP2,
374 NOP, 375 NOP2,
375 NOP, 376 NOP2,
376 NOP, 377 NOP2,
377 NOP, 378 NOP2,
378 NOP, 379 NOP2,
379 NOP, 380 NOP2,
380 NOP, 381 NOP2,
381 NOP, 382 NOP2,
382 NOP, 383 NOP2,
383 NOP, 384 NOP2,
384 NOP, 385 NOP2,
385 //A 386 //A
386 {Z80_LDI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 387 {Z80_LDI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
387 {Z80_CPI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 388 {Z80_CPI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
388 {Z80_INI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 389 {Z80_INI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
389 {Z80_OUTI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 390 {Z80_OUTI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
390 NOP, 391 NOP2,
391 NOP, 392 NOP2,
392 NOP, 393 NOP2,
393 NOP, 394 NOP2,
394 {Z80_LDD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 395 {Z80_LDD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
395 {Z80_CPD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 396 {Z80_CPD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
396 {Z80_IND, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 397 {Z80_IND, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
397 {Z80_OUTD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 398 {Z80_OUTD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
398 NOP, 399 NOP2,
399 NOP, 400 NOP2,
400 NOP, 401 NOP2,
401 NOP, 402 NOP2,
402 //B 403 //B
403 {Z80_LDIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 404 {Z80_LDIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
404 {Z80_CPIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 405 {Z80_CPIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
405 {Z80_INIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 406 {Z80_INIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
406 {Z80_OTIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 407 {Z80_OTIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
407 NOP, 408 NOP2,
408 NOP, 409 NOP2,
409 NOP, 410 NOP2,
410 NOP, 411 NOP2,
411 {Z80_LDDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 412 {Z80_LDDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
412 {Z80_CPDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 413 {Z80_CPDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
413 {Z80_INDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 414 {Z80_INDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
414 {Z80_OTDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 415 {Z80_OTDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
415 NOP, 416 NOP2,
416 NOP, 417 NOP2,
417 NOP, 418 NOP2,
418 NOP 419 NOP2
419 }; 420 };
420 421
421 #define SHIFT_BLOCK(op) \ 422 #define SHIFT_BLOCK(op) \
422 {op, Z80_B, Z80_UNUSED, Z80_UNUSED, 0},\ 423 {op, Z80_B, Z80_UNUSED, Z80_UNUSED, 0},\
423 {op, Z80_C, Z80_UNUSED, Z80_UNUSED, 0},\ 424 {op, Z80_C, Z80_UNUSED, Z80_UNUSED, 0},\
486 BIT_BLOCK(Z80_SET, 5), 487 BIT_BLOCK(Z80_SET, 5),
487 //F 488 //F
488 BIT_BLOCK(Z80_SET, 6), 489 BIT_BLOCK(Z80_SET, 6),
489 BIT_BLOCK(Z80_SET, 7) 490 BIT_BLOCK(Z80_SET, 7)
490 }; 491 };
492
493 z80inst z80_tbl_ix[256
491 494
492 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) 495 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded)
493 { 496 {
494 if (*istream == 0xCB) { 497 if (*istream == 0xCB) {
495 istream++; 498 istream++;