|
27 | 27 |
|
28 | 28 | #include "z80.inc"
|
29 | 29 |
|
30 |
| -static bool tables_initialised = false; |
31 |
| -std::unique_ptr<u8[]> z80_device::SZ = std::make_unique<u8[]>(0x100); // zero and sign flags |
32 |
| -std::unique_ptr<u8[]> z80_device::SZ_BIT = std::make_unique<u8[]>(0x100); // zero, sign and parity/overflow (=zero) flags for BIT opcode |
33 |
| -std::unique_ptr<u8[]> z80_device::SZP = std::make_unique<u8[]>(0x100); // zero, sign and parity flags |
34 |
| -std::unique_ptr<u8[]> z80_device::SZHV_inc = std::make_unique<u8[]>(0x100); // zero, sign, half carry and overflow flags INC r8 |
35 |
| -std::unique_ptr<u8[]> z80_device::SZHV_dec = std::make_unique<u8[]>(0x100); // zero, sign, half carry and overflow flags DEC r8 |
36 |
| - |
37 |
| -std::unique_ptr<u8[]> z80_device::SZHVC_add = std::make_unique<u8[]>(2 * 0x100 * 0x100); |
38 |
| -std::unique_ptr<u8[]> z80_device::SZHVC_sub = std::make_unique<u8[]>(2 * 0x100 * 0x100); |
| 30 | +bool z80_device::tables_initialised = false; |
| 31 | +u8 z80_device::SZ[] = {}; // zero and sign flags |
| 32 | +u8 z80_device::SZ_BIT[] = {}; // zero, sign and parity/overflow (=zero) flags for BIT opcode |
| 33 | +u8 z80_device::SZP[] = {}; // zero, sign and parity flags |
| 34 | +u8 z80_device::SZHV_inc[] = {}; // zero, sign, half carry and overflow flags INC r8 |
| 35 | +u8 z80_device::SZHV_dec[] = {}; // zero, sign, half carry and overflow flags DEC r8 |
| 36 | +u8 z80_device::SZHVC_add[] = {}; |
| 37 | +u8 z80_device::SZHVC_sub[] = {}; |
39 | 38 |
|
40 | 39 |
|
41 | 40 | /***************************************************************
|
@@ -501,62 +500,56 @@ void z80_device::device_start()
|
501 | 500 | int val = newval - oldval;
|
502 | 501 | *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
|
503 | 502 | *padd |= (newval & (YF | XF)); // undocumented flag bits 5+3
|
504 |
| - if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF; |
505 |
| - if( newval < oldval ) *padd |= CF; |
506 |
| - if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF; |
| 503 | + if ((newval & 0x0f) < (oldval & 0x0f)) *padd |= HF; |
| 504 | + if (newval < oldval) *padd |= CF; |
| 505 | + if ((val^oldval^0x80) & (val^newval) & 0x80) *padd |= VF; |
507 | 506 | padd++;
|
508 | 507 |
|
509 | 508 | // adc with carry set
|
510 | 509 | val = newval - oldval - 1;
|
511 | 510 | *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
|
512 | 511 | *padc |= (newval & (YF | XF)); // undocumented flag bits 5+3
|
513 |
| - if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF; |
514 |
| - if( newval <= oldval ) *padc |= CF; |
515 |
| - if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF; |
| 512 | + if ((newval & 0x0f) <= (oldval & 0x0f)) *padc |= HF; |
| 513 | + if (newval <= oldval) *padc |= CF; |
| 514 | + if ((val^oldval^0x80) & (val^newval) & 0x80) *padc |= VF; |
516 | 515 | padc++;
|
517 | 516 |
|
518 | 517 | // cp, sub or sbc w/o carry set
|
519 | 518 | val = oldval - newval;
|
520 | 519 | *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
|
521 | 520 | *psub |= (newval & (YF | XF)); // undocumented flag bits 5+3
|
522 |
| - if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF; |
523 |
| - if( newval > oldval ) *psub |= CF; |
524 |
| - if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF; |
| 521 | + if ((newval & 0x0f) > (oldval & 0x0f)) *psub |= HF; |
| 522 | + if (newval > oldval) *psub |= CF; |
| 523 | + if ((val^oldval) & (oldval^newval) & 0x80) *psub |= VF; |
525 | 524 | psub++;
|
526 | 525 |
|
527 | 526 | // sbc with carry set
|
528 | 527 | val = oldval - newval - 1;
|
529 | 528 | *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
|
530 | 529 | *psbc |= (newval & (YF | XF)); // undocumented flag bits 5+3
|
531 |
| - if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF; |
532 |
| - if( newval >= oldval ) *psbc |= CF; |
533 |
| - if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF; |
| 530 | + if ((newval & 0x0f) >= (oldval & 0x0f)) *psbc |= HF; |
| 531 | + if (newval >= oldval) *psbc |= CF; |
| 532 | + if ((val^oldval) & (oldval^newval) & 0x80) *psbc |= VF; |
534 | 533 | psbc++;
|
535 | 534 | }
|
536 | 535 | }
|
537 | 536 |
|
538 | 537 | for (int i = 0; i < 256; i++)
|
539 | 538 | {
|
540 | 539 | int p = 0;
|
541 |
| - if( i&0x01 ) ++p; |
542 |
| - if( i&0x02 ) ++p; |
543 |
| - if( i&0x04 ) ++p; |
544 |
| - if( i&0x08 ) ++p; |
545 |
| - if( i&0x10 ) ++p; |
546 |
| - if( i&0x20 ) ++p; |
547 |
| - if( i&0x40 ) ++p; |
548 |
| - if( i&0x80 ) ++p; |
| 540 | + for (int b = 0; b < 8; b++) |
| 541 | + p += BIT(i, b); |
549 | 542 | SZ[i] = i ? i & SF : ZF;
|
550 | 543 | SZ[i] |= (i & (YF | XF)); // undocumented flag bits 5+3
|
551 | 544 | SZ_BIT[i] = i ? i & SF : ZF | PF;
|
552 | 545 | SZ_BIT[i] |= (i & (YF | XF)); // undocumented flag bits 5+3
|
553 | 546 | SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
|
554 | 547 | SZHV_inc[i] = SZ[i];
|
555 |
| - if( i == 0x80 ) SZHV_inc[i] |= VF; |
556 |
| - if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF; |
| 548 | + if (i == 0x80) SZHV_inc[i] |= VF; |
| 549 | + if ((i & 0x0f) == 0x00) SZHV_inc[i] |= HF; |
557 | 550 | SZHV_dec[i] = SZ[i] | NF;
|
558 |
| - if( i == 0x7f ) SZHV_dec[i] |= VF; |
559 |
| - if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF; |
| 551 | + if (i == 0x7f) SZHV_dec[i] |= VF; |
| 552 | + if ((i & 0x0f) == 0x0f) SZHV_dec[i] |= HF; |
560 | 553 | }
|
561 | 554 |
|
562 | 555 | tables_initialised = true;
|
|
0 commit comments