1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-10 12:29:01 +00:00

Further improved macros.

This commit is contained in:
Thomas Harte 2017-05-18 22:11:54 -04:00
parent 5d3ebcb35a
commit 99f2060fc1

View File

@ -92,8 +92,8 @@ struct MicroOp {
DecodeOperation, DecodeOperation,
MoveToNextProgram, MoveToNextProgram,
IncrementPC, Increment16,
IncrementAddress, Move16,
Jump, Jump,
None None
@ -130,9 +130,11 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
void decode_base_operation(uint8_t operation) { void decode_base_operation(uint8_t operation) {
#define XX {MicroOp::None} #define XX {MicroOp::None}
#define FETCH(x) {MicroOp::BusOperation, nullptr, nullptr, {ReadOpcode, &pc_.full, &x}} #define FETCH(x, y) {MicroOp::BusOperation, nullptr, nullptr, {ReadOpcode, &y.full, &x}}
#define FETCH_LOW() FETCH(address_.bytes.low) #define FETCH16(x, y) FETCH(x.bytes.low, y), {MicroOp::Increment16, &y.full}, FETCH(x.bytes.high, y), {MicroOp::Increment16, &y.full}
#define FETCH_HIGH() FETCH(address_.bytes.high) #define FETCH16L(x, y) FETCH(x.bytes.low, y), {MicroOp::Increment16, &y.full}, FETCH(x.bytes.high, y)
#define FETCH_LOW() FETCH(address_.bytes.low, pc_)
#define FETCH_HIGH() FETCH(address_.bytes.high, pc_)
#define Program(...) { __VA_ARGS__, {MicroOp::MoveToNextProgram} } #define Program(...) { __VA_ARGS__, {MicroOp::MoveToNextProgram} }
static const MicroOp base_program_table[256][10] = { static const MicroOp base_program_table[256][10] = {
@ -142,7 +144,7 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
XX, XX, XX, XX, XX, XX, XX, XX, // 0x18 XX, XX, XX, XX, XX, XX, XX, XX, // 0x18
XX, XX, XX, XX, XX, XX, XX, XX, // 0x20 XX, XX, XX, XX, XX, XX, XX, XX, // 0x20
XX, XX, // 0x28 XX, XX, // 0x28
Program(FETCH_LOW(), {MicroOp::IncrementPC}, FETCH_HIGH(), {MicroOp::IncrementPC}, FETCH(hl_.bytes.low), {MicroOp::IncrementAddress}, FETCH(hl_.bytes.high)), /* 0x2a LD HL, (nn) */ Program(FETCH16(address_, pc_), FETCH16L(hl_, address_)), /* 0x2a LD HL, (nn) */
XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
XX, XX, XX, XX, XX, XX, XX, XX, // 0x30 XX, XX, XX, XX, XX, XX, XX, XX, // 0x30
XX, XX, XX, XX, XX, XX, XX, XX, // 0x38 XX, XX, XX, XX, XX, XX, XX, XX, // 0x38
@ -165,7 +167,7 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
XX, /* 0xc0 */ XX, /* 0xc0 */
XX, /* 0xc1 */ XX, /* 0xc1 */
XX, /* 0xc2 */ XX, /* 0xc2 */
Program(FETCH_LOW(), {MicroOp::IncrementPC}, FETCH_HIGH(), {MicroOp::Jump}), /* 0xc3 JP nn */ Program(FETCH16L(address_, pc_), {MicroOp::Jump}), /* 0xc3 JP nn */
XX, /* 0xc4 */ XX, /* 0xc4 */
XX, /* 0xc5 */ XX, /* 0xc5 */
XX, /* 0xc6 */ XX, /* 0xc6 */
@ -176,7 +178,10 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
XX, XX, XX, XX, XX, XX, XX, XX, // 0xe0 XX, XX, XX, XX, XX, XX, XX, XX, // 0xe0
XX, XX, XX, XX, XX, XX, XX, XX, // 0xe8 XX, XX, XX, XX, XX, XX, XX, XX, // 0xe8
XX, XX, XX, XX, XX, XX, XX, XX, // 0xf0 XX, XX, XX, XX, XX, XX, XX, XX, // 0xf0
XX, XX, XX, XX, XX, XX, XX, XX, // 0xf8 XX,
XX,
// Progam(), /* 0xF9 LD SP, HL */
XX, XX, XX, XX, XX, XX, // 0xf8
}; };
if(base_program_table[operation][0].type == MicroOp::None) { if(base_program_table[operation][0].type == MicroOp::None) {
printf("Unknown Z80 operation %02x!!!\n", operation); printf("Unknown Z80 operation %02x!!!\n", operation);
@ -234,9 +239,8 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
decode_base_operation(operation_); decode_base_operation(operation_);
break; break;
case MicroOp::IncrementPC: pc_.full++; break; case MicroOp::Increment16: (*((uint16_t *)operation->source))++; break;
case MicroOp::IncrementAddress: address_.full++; break; case MicroOp::Jump: pc_ = address_; break;
case MicroOp::Jump: pc_ = address_; break;
default: default:
printf("Unhandled Z80 operation %d\n", operation->type); printf("Unhandled Z80 operation %d\n", operation->type);