Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Group_1(BYTE opcode){
- BYTE LB = 0;
- BYTE HB = 0;
- WORD address = 0;
- WORD data = 0;
- WORD offset;
- switch(opcode) {
- //////////////////////////////LD CASE//////////////////////////////
- case 0xB7:
- data = fetch();
- Registers[REGISTER_A] = data;
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0xC7:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0xD7:
- address += IndexRegister;
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- //////////////////////////////ST CASE//////////////////////////////
- case 0x10:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- Flags = Flags & (0xFF - FLAG_C);
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x20:
- address += IndexRegister;
- HB = fetch(); LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- Flags = Flags & (0xFF - FLAG_C);
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- //////////////////////////////MVI CASE//////////////////////////////
- case 0x2A:
- data = fetch();
- Registers[REGISTER_B] = data;
- set_flag_n(Registers[REGISTER_B]);
- set_flag_z(Registers[REGISTER_B]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x2B:
- data = fetch();
- Registers[REGISTER_C] = data;
- set_flag_n(Registers[REGISTER_C]);
- set_flag_z(Registers[REGISTER_C]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x2C:
- data = fetch();
- Registers[REGISTER_D] = data;
- set_flag_n(Registers[REGISTER_D]);
- set_flag_z(Registers[REGISTER_D]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x2D:
- data = fetch();
- Registers[REGISTER_E] = data;
- set_flag_n(Registers[REGISTER_E]);
- set_flag_z(Registers[REGISTER_E]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x2E:
- data = fetch();
- Registers[REGISTER_L] = data;
- set_flag_n(Registers[REGISTER_L]);
- set_flag_z(Registers[REGISTER_L]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x2F:
- data = fetch();
- Registers[REGISTER_H] = data;
- set_flag_n(Registers[REGISTER_H]);
- set_flag_z(Registers[REGISTER_H]);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- //////////////////////////////TSA CASE//////////////////////////////
- case 0x75:
- Registers[REGISTER_A] = Flags;
- break;
- //////////////////////////////TAS CASE//////////////////////////////
- case 0x74:
- Flags = Registers[REGISTER_A];
- break;
- //////////////////////////////LODS CASE//////////////////////////////
- case 0x4F:
- data = fetch();
- StackPointer = data << 8;
- StackPointer += fetch();
- set_flag_n(StackPointer);
- set_flag_z(StackPointer);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x5F:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = (WORD)Memory[address] << 8; StackPointer += Memory[address + 1];
- }
- set_flag_n(StackPointer);
- set_flag_z(StackPointer);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x6F:
- address += IndexRegister;
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = (WORD)Memory[address] << 8;
- StackPointer += Memory[address + 1];
- }
- set_flag_n(StackPointer);
- set_flag_z(StackPointer);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- //////////////////////////////STOX CASE//////////////////////////////
- case 0x50:
- address += IndexRegister;
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = IndexRegister;
- }
- set_flag_n(IndexRegister);
- set_flag_z(IndexRegister);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x60:
- address += IndexRegister;
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = IndexRegister;
- }
- set_flag_n(IndexRegister);
- set_flag_z(IndexRegister);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- //////////////////////////////LDX CASE//////////////////////////////
- case 0x4E:
- data = fetch();
- IndexRegister = fetch();
- set_flag_n(IndexRegister);
- set_flag_z(IndexRegister);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x5E:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- IndexRegister = Memory[address];
- }
- set_flag_n(IndexRegister);
- set_flag_z(IndexRegister);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x6E:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n(IndexRegister);
- set_flag_z(IndexRegister);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- //////////////////////////////ADC FLAGS//////////////////////////////
- case 0x90:
- BYTE temp_word;
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_B];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else { Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_B, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xA0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_C];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_C, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_D];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_D, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_E];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_E, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_L];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_L, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_H];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_H, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF0:
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_M];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_M, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- //////////////////////////////CMP FLAGS//////////////////////////////
- case 0x92:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_B];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_B], (BYTE)temp_word);
- break;
- case 0xA2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_C];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_C], (BYTE)temp_word);
- break;
- case 0xB2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_D];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_D], (BYTE)temp_word);
- break;
- case 0xC2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_E];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_E], (BYTE)temp_word);
- break;
- case 0xD2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_L];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_L], (BYTE)temp_word);
- break;
- case 0xE2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_H];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_H], (BYTE)temp_word);
- break;
- case 0xF2:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_M];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(Registers[REGISTER_A], -Registers[REGISTER_M], (BYTE)temp_word);
- break;
- //////////////////////////////CLC FLAGS//////////////////////////////
- case 0x15:
- Flags = Flags & (0xFF - FLAG_C); // Clear carry ?ag
- break;
- //////////////////////////////CLI FLAGS//////////////////////////////
- case 0x16:
- Flags = Flags & (0xFF - FLAG_I); // Clear carry ?ag
- break;
- //////////////////////////////CLV FLAGS//////////////////////////////
- case 0x1A:
- Flags = Flags | (0xFF - FLAG_V);
- break;
- //////////////////////////////SEC FLAGS//////////////////////////////
- case 0x17:
- Flags = Flags & (0xFF - FLAG_C); // Clear carry ?ag
- break;
- //////////////////////////////STI FLAGS//////////////////////////////
- case 0x18:
- Flags = Flags | (0xFF - FLAG_I);
- break;
- //////////////////////////////SEV FLAGS//////////////////////////////
- case 0x19:
- Flags = Flags | (0xFF - FLAG_V);
- break;
- //////////////////////////////PSH STACKS//////////////////////////////
- case 0x11:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_A];
- StackPointer--;
- }
- break;
- case 0x21:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Flags; //Registers[REGISTER_FL];
- StackPointer--;
- }
- break;
- case 0x31:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_B];
- StackPointer--;
- }
- break;
- case 0x41:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_C];
- StackPointer--;
- }
- break;
- case 0x51:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_D];
- StackPointer--;
- }
- break;
- case 0x61:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_E];
- StackPointer--;
- }
- break;
- case 0x71:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_L];
- StackPointer--;
- }
- break;
- case 0x81:
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = Registers[REGISTER_H];
- StackPointer--;
- }
- break;
- //////////////////////////////POP STACKS//////////////////////////////
- case 0x12:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_A] = Memory[StackPointer];
- }
- break;
- case 0x22:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Flags = Memory[StackPointer]; //Registers[REGISTER_FL] = Memory[StackPointer];
- }
- break;
- case 0x32:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_B] = Memory[StackPointer];
- }
- break;
- case 0x42:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_C] = Memory[StackPointer];
- }
- break;
- case 0x52:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_D] = Memory[StackPointer];
- }
- break;
- case 0x62:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_E] = Memory[StackPointer];
- }
- break;
- case 0x72:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_L] = Memory[StackPointer];
- }
- break;
- case 0x82:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- StackPointer++;
- Registers[REGISTER_H] = Memory[StackPointer];
- }
- break;
- //////////////////////////////JMP STACKS//////////////////////////////
- case 0xFA:
- HB = fetch();
- LB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- ProgramCounter = address;
- break;
- //////////////////////////////JPR INSTRUCTION//////////////////////////////
- case 0x33:
- HB = fetch();
- LB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((StackPointer >= 2) && (StackPointer < MEMORY_SIZE)) {
- Memory[StackPointer] = (BYTE)(ProgramCounter & 0xFF);
- StackPointer--;
- Memory[StackPointer] = (BYTE)((ProgramCounter >> 8) & 0xFF);
- StackPointer--;
- }
- ProgramCounter = address;
- break;
- //////////////////////////////RTN OPCODE//////////////////////////////
- case 0x0E:
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 2)) {
- StackPointer++;
- HB = Memory[StackPointer];
- StackPointer++;
- LB = Memory[StackPointer];
- }
- ProgramCounter = ((WORD)HB << 8) + (WORD)LB;
- break;
- //////////////////////////////BRA OPCODE//////////////////////////////
- case 0x00:
- LB = fetch();
- offset = (WORD)LB;
- if((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- ProgramCounter = address;
- break;
- //////////////////////////////BCC OPCODE//////////////////////////////
- case 0x01:
- if ((Flags & FLAG_C) == 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BCS OPCODE//////////////////////////////
- case 0x02:
- LB = fetch();
- if ((Flags & FLAG_C) == FLAG_C) {
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) { // need to sign extend
- offset = offset + 0xFF00;
- } address = ProgramCounter + offset;
- ProgramCounter = address;
- }
- break;
- //////////////////////////////BNE OPCODE//////////////////////////////
- case 0x03:
- if ((Flags & FLAG_C) != 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BEQ OPCODE//////////////////////////////
- case 0x04:
- if ((Flags & FLAG_C) != 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BVC OPCODE//////////////////////////////
- case 0x05:
- if ((Flags & FLAG_C) == 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BVS OPCODE//////////////////////////////
- case 0x06:
- if (Flags & FLAG_V) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BMI OPCODE//////////////////////////////
- case 0x07:
- if ((Flags & FLAG_N) == 1) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BPL OPCODE//////////////////////////////
- case 0x08:
- if ((Flags & FLAG_N) == 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BGE OPCODE//////////////////////////////
- case 0x09:
- if ((Flags & FLAG_Z) <= 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////BLE OPCODE//////////////////////////////
- case 0x0A:
- if ((Flags & FLAG_Z) >= 0) {
- LB = fetch();
- offset = (WORD)LB;
- if ((offset & 0x80) != 0) {
- offset = offset + 0xFF00;
- }
- address = ProgramCounter + offset;
- }
- break;
- //////////////////////////////CVS OPCODE//////////////////////////////
- case 0x39: //CVS
- HB = fetch();
- LB = fetch();
- if ((Flags & FLAG_V) == FLAG_V) // Overflow flag set?
- {
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- // Push return address onto the stack
- if ((StackPointer >= 2) && (StackPointer < MEMORY_SIZE))
- {
- Memory[StackPointer] = (BYTE)(ProgramCounter & 0xFF);
- StackPointer--;
- Memory[StackPointer] = (BYTE)((ProgramCounter >> 8) & 0xFF);
- StackPointer--;
- }
- ProgramCounter = (WORD)address;
- }
- }
- break;
- /////////////////////////////INCA OPCODE//////////////////////////////
- case 0x64:
- ++Registers[REGISTER_A];
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- //////////////////////////////INX OPCODE//////////////////////////////
- case 0x1C:
- ++IndexRegister;
- set_flag_z(IndexRegister);
- break;
- //////////////////////////////AND OPCODE//////////////////////////////
- case 0x94:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_B];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xA4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_C];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_D];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_E];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_L];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_H];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF4:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_M];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- //////////////////////////////BT OPCODE//////////////////////////////
- case 0x96:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_B];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xA6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_C];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xB6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_D];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xC6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_E];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xD6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_L];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xE6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_H];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- case 0xF6:
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_M];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- break;
- //////////////////////////////INC OPCODE//////////////////////////////
- case 0x44:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- ++Registers[REGISTER_A];
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x54:
- HB = fetch();
- LB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = (WORD)Memory[address] << 8;
- StackPointer += Memory[address + 1];
- }
- ++Registers[REGISTER_A];
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- //////////////////////////////DEX OPCODE//////////////////////////////
- case 0x1B:
- ++IndexRegister;
- set_flag_z(IndexRegister);
- break;
- //////////////////////////////SBC OPCODE//////////////////////////////
- case 0x91:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_B];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_B, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xA1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_C];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_C, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_D];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_D, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_E];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_E, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_L];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_L, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_H];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_H, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF1:
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_M];
- if ((Flags & FLAG_C) != 0) {
- temp_word++;
- }
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry Flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carryFlag
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- set_flag_v(REGISTER_A, REGISTER_M, (BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- //////////////////////////////IOR CASE//////////////////////////////
- case 0x93:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_B];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xA3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_C];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_D];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_E];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_L];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_H];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF3:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_M];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- //////////////////////////////NOTA CASE//////////////////////////////
- case 0x6A: // Need an XOR offset of OxFF
- break;
- //////////////////////////////XOR CASE//////////////////////////////
- case 0x95:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_B];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xA5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_C];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_D];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_E];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_L];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_H];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF5:
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_M];
- Flags = Flags & (0xFF - FLAG_C); // Clear carry Flag
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Flags = Flags & (0xFF - FLAG_V);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- //////////////////////////////RCLA CASE//////////////////////////////
- case 0x67:
- BYTE saved_flags;
- saved_flags = Flags;
- if ((Registers[REGISTER_A] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (Registers[REGISTER_A] << 1) & 0xFE;
- if ((saved_flags & FLAG_C) == FLAG_C) {
- Registers[REGISTER_A] = Registers[REGISTER_A] | 0x01;
- }
- break;
- }
- }
- void Group_2_Move(BYTE opcode)
- {
- int destination;
- int source;
- int destReg;
- int sourceReg;
- WORD address;
- destination = opcode & 0x0F;
- switch (destination)
- {
- case 0x08:
- destReg = REGISTER_A;
- break;
- case 0x09:
- destReg = REGISTER_B;
- break;
- case 0x0A:
- destReg = REGISTER_C;
- break;
- case 0x0B:
- destReg = REGISTER_D;
- break;
- case 0x0C:
- destReg = REGISTER_E;
- break;
- case 0x0D:
- destReg = REGISTER_L;
- break;
- case 0x0E:
- destReg = REGISTER_H;
- break;
- case 0x0F:
- destReg = REGISTER_M;
- break;
- }
- source = (opcode >> 4) & 0x0F;
- switch (source)
- {
- case 0x07:
- sourceReg = REGISTER_A;
- break;
- case 0x08:
- sourceReg = REGISTER_B;
- break;
- case 0x09:
- sourceReg = REGISTER_C;
- break;
- case 0x0A:
- sourceReg = REGISTER_D;
- break;
- case 0x0B:
- sourceReg = REGISTER_E;
- break;
- case 0x0C:
- sourceReg = REGISTER_L;
- break;
- case 0x0D:
- sourceReg = REGISTER_H;
- break;
- case 0x0E:
- sourceReg = REGISTER_M;
- break;
- }
- if (sourceReg == REGISTER_M)
- {
- address = (WORD)Registers[REGISTER_H] << 8 + (WORD)Registers[REGISTER_L];
- Registers[REGISTER_M] = Memory[address];
- }
- Registers[destReg] = Registers[sourceReg];
- if (destReg == REGISTER_M)
- {
- address = (WORD)Registers[REGISTER_H] << 8 + (WORD)Registers[REGISTER_L];
- Memory[address] = Registers[REGISTER_M];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement