Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Author: Jan Klimaszewski (17026846)
- * Created: 05/02/2019
- * Revised: 20/02/2019 - added comments
- * Description: Program that emulates the Chimera-2016-I Processor
- * User advice: none
- */
- #include "stdafx.h"
- #include <winsock2.h>
- #pragma comment(lib, "wsock32.lib")
- #define STUDENT_NUMBER "17026846"
- #define IP_ADDRESS_SERVER "127.0.0.1"
- #define PORT_SERVER 0x1984 // We define a port that we are going to use.
- #define PORT_CLIENT 0x1985 // We define a port that we are going to use.
- #define WORD unsigned short
- #define DWORD unsigned long
- #define BYTE unsigned char
- #define MAX_FILENAME_SIZE 500
- #define MAX_BUFFER_SIZE 500
- SOCKADDR_IN server_addr;
- SOCKADDR_IN client_addr;
- SOCKET sock; // This is our socket, it is the handle to the IO address to read/write packets
- WSADATA data;
- char InputBuffer[MAX_BUFFER_SIZE];
- char hex_file[MAX_BUFFER_SIZE];
- char trc_file[MAX_BUFFER_SIZE];
- //////////////////////////
- // Registers //
- //////////////////////////
- #define FLAG_Z 0x80
- #define FLAG_I 0x20
- #define FLAG_N 0x08
- #define FLAG_C 0x01
- #define REGISTER_M 5
- #define REGISTER_A 4
- #define REGISTER_H 3
- #define REGISTER_L 2
- #define REGISTER_C 1
- #define REGISTER_B 0
- #define REGISTER_X 0
- #define REGISTER_Y 1
- BYTE Index_Registers[2];
- BYTE Registers[6];
- BYTE Flags;
- WORD ProgramCounter;
- WORD StackPointer;
- ////////////
- // Memory //
- ////////////
- #define MEMORY_SIZE 65536
- BYTE Memory[MEMORY_SIZE];
- #define TEST_ADDRESS_1 0x01FA
- #define TEST_ADDRESS_2 0x01FB
- #define TEST_ADDRESS_3 0x01FC
- #define TEST_ADDRESS_4 0x01FD
- #define TEST_ADDRESS_5 0x01FE
- #define TEST_ADDRESS_6 0x01FF
- #define TEST_ADDRESS_7 0x0200
- #define TEST_ADDRESS_8 0x0201
- #define TEST_ADDRESS_9 0x0202
- #define TEST_ADDRESS_10 0x0203
- #define TEST_ADDRESS_11 0x0204
- #define TEST_ADDRESS_12 0x0205
- ///////////////////////
- // Control variables //
- ///////////////////////
- bool memory_in_range = true;
- bool halt = false;
- ///////////////////////
- // Disassembly table //
- ///////////////////////
- char opcode_mneumonics[][14] =
- {
- "ILLEGAL ",
- "ILLEGAL ",
- "SWI impl ",
- "RTI impl ",
- "STO abs ",
- "STOX abs ",
- "STOY abs ",
- "JMPR abs ",
- "CCC abs ",
- "CCS abs ",
- "CNE abs ",
- "CEQ abs ",
- "CMI abs ",
- "CPL abs ",
- "ILLEGAL ",
- "STOS abs ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "STO abs,X ",
- "STOX abs,X ",
- "STOY abs,X ",
- "NOP impl ",
- "WAI impl ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ADI # ",
- "CPI # ",
- "ANI # ",
- "STOS abs,X ",
- "LODS # ",
- "LDX # ",
- "LODY # ",
- "RT impl ",
- "STO abs,Y ",
- "STOX abs,Y ",
- "STOY abs,Y ",
- "MVR #,B ",
- "MVR #,C ",
- "MVR #,L ",
- "MVR #,H ",
- "TAY impl ",
- "TYA impl ",
- "MSA impl ",
- "ILLEGAL ",
- "STOS abs,Y ",
- "LODS abs ",
- "LDX abs ",
- "LODY abs ",
- "ILLEGAL ",
- "STO abs,XY ",
- "STOX abs,XY ",
- "STOY abs,XY ",
- "ILLEGAL ",
- "JUMP abs ",
- "JCC abs ",
- "JCS abs ",
- "JNE abs ",
- "JEQ abs ",
- "JMI abs ",
- "JPL abs ",
- "STOS abs,XY ",
- "LODS abs,X ",
- "LDX abs,X ",
- "LODY abs,X ",
- "LD # ",
- "STO zpg ",
- "STOX zpg ",
- "STOY zpg ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "DEX impl ",
- "INX impl ",
- "DEY impl ",
- "INY impl ",
- "ILLEGAL ",
- "STOS zpg ",
- "LODS abs,Y ",
- "LDX abs,Y ",
- "LODY abs,Y ",
- "LD abs ",
- "TEST abs ",
- "INC abs ",
- "DEC abs ",
- "RR abs ",
- "RCL abs ",
- "SAL abs ",
- "SHR abs ",
- "COM abs ",
- "NEG abs ",
- "RAL abs ",
- "ROR abs ",
- "CLR abs ",
- "LODS abs,XY ",
- "LDX abs,XY ",
- "LODY abs,XY ",
- "LD abs,X ",
- "TEST abs,X ",
- "INC abs,X ",
- "DEC abs,X ",
- "RR abs,X ",
- "RCL abs,X ",
- "SAL abs,X ",
- "SHR abs,X ",
- "COM abs,X ",
- "NEG abs,X ",
- "RAL abs,X ",
- "ROR abs,X ",
- "CLR abs,X ",
- "LODS zpg ",
- "LDX zpg ",
- "LODY zpg ",
- "LD abs,Y ",
- "TEST abs,Y ",
- "INC abs,Y ",
- "DEC abs,Y ",
- "RR abs,Y ",
- "RCL abs,Y ",
- "SAL abs,Y ",
- "SHR abs,Y ",
- "COM abs,Y ",
- "NEG abs,Y ",
- "RAL abs,Y ",
- "ROR abs,Y ",
- "CLR abs,Y ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "LD abs,XY ",
- "TEST abs,XY ",
- "INC abs,XY ",
- "DEC abs,XY ",
- "RR abs,XY ",
- "RCL abs,XY ",
- "SAL abs,XY ",
- "SHR abs,XY ",
- "COM abs,XY ",
- "NEG abs,XY ",
- "RAL abs,XY ",
- "ROR abs,XY ",
- "CLR abs,XY ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "LD zpg ",
- "TESTA A,A ",
- "INCA A,A ",
- "DECA A,A ",
- "RRA A,A ",
- "RCLA A,A ",
- "SALA A,A ",
- "SHRA A,A ",
- "COMA A,A ",
- "NEGA A,0 ",
- "RALA A,A ",
- "RORA A,A ",
- "CLRA A,0 ",
- "MV A,A ",
- "MV B,A ",
- "MV C,A ",
- "MV L,A ",
- "MV H,A ",
- "MV M,A ",
- "CLC impl ",
- "SEC impl ",
- "CLI impl ",
- "SEI impl ",
- "CMC impl ",
- "ILLEGAL ",
- "ILLEGAL ",
- "ILLEGAL ",
- "PUSH ,A ",
- "POP A, ",
- "MV A,B ",
- "MV B,B ",
- "MV C,B ",
- "MV L,B ",
- "MV H,B ",
- "MV M,B ",
- "ADC A,B ",
- "SBC A,B ",
- "ADD A,B ",
- "SUB A,B ",
- "CMP A,B ",
- "OR A,B ",
- "AND A,B ",
- "XOR A,B ",
- "PUSH ,s ",
- "POP s, ",
- "MV A,C ",
- "MV B,C ",
- "MV C,C ",
- "MV L,C ",
- "MV H,C ",
- "MV M,C ",
- "ADC A,C ",
- "SBC A,C ",
- "ADD A,C ",
- "SUB A,C ",
- "CMP A,C ",
- "OR A,C ",
- "AND A,C ",
- "XOR A,C ",
- "PUSH ,B ",
- "POP B, ",
- "MV A,L ",
- "MV B,L ",
- "MV C,L ",
- "MV L,L ",
- "MV H,L ",
- "MV M,L ",
- "ADC A,L ",
- "SBC A,L ",
- "ADD A,L ",
- "SUB A,L ",
- "CMP A,L ",
- "OR A,L ",
- "AND A,L ",
- "XOR A,L ",
- "PUSH ,C ",
- "POP C, ",
- "MV A,H ",
- "MV B,H ",
- "MV C,H ",
- "MV L,H ",
- "MV H,H ",
- "MV M,H ",
- "ADC A,H ",
- "SBC A,H ",
- "ADD A,H ",
- "SUB A,H ",
- "CMP A,H ",
- "OR A,H ",
- "AND A,H ",
- "XOR A,H ",
- "PUSH ,L ",
- "POP L, ",
- "MV A,M ",
- "MV B,M ",
- "MV C,M ",
- "MV L,M ",
- "MV H,M ",
- "MV -,- ",
- "ADC A,M ",
- "SBC A,M ",
- "ADD A,M ",
- "SUB A,M ",
- "CMP A,M ",
- "OR A,M ",
- "AND A,M ",
- "XOR A,M ",
- "PUSH ,H ",
- "POP H, ",
- };
- ////////////////////////////////////////////////////////////////////////////////
- // Simulator/Emulator (Start) //
- ////////////////////////////////////////////////////////////////////////////////
- BYTE fetch()
- {
- BYTE byte = 0;
- if ((ProgramCounter >= 0) && (ProgramCounter <= MEMORY_SIZE))
- {
- memory_in_range = true;
- byte = Memory[ProgramCounter];
- ProgramCounter++;
- }
- else
- {
- memory_in_range = false;
- }
- return byte;
- }
- /*
- * Function: set_flag_n
- * Description: Set n flag depending on the value in a given register
- * Parameters inReg(BYTE) - the register that will be used to set the flags
- * Returns: none (void)
- * Warnings: none
- */
- void set_flag_n(BYTE inReg) {
- BYTE reg;
- reg = inReg;
- if ((reg & 0x80) != 0) // msbit set
- {
- Flags = Flags | FLAG_N;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_N);
- }
- }
- void set_flag_n16(WORD inReg) {
- WORD reg;
- reg = inReg;
- if ((reg & 0x8000) != 0) // msbit set
- {
- Flags = Flags | FLAG_N;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_N);
- }
- }
- /*
- * Function: set_flag_z
- * Description: Set z flag depending on the value in a given register
- * Parameters inReg(BYTE) - the register that will be used to set the flags
- * Returns: none (void)
- * Warnings: none
- */
- void set_flag_z(BYTE inReg) {
- BYTE reg;
- reg = inReg;
- if (reg == 0) // msbit set
- {
- Flags = Flags | FLAG_Z;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_Z);
- }
- }
- void set_flag_z16(WORD inReg) {
- WORD reg;
- reg = inReg;
- if (reg == 0)
- {
- Flags = Flags | FLAG_Z;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_Z);
- }
- }
- void Group_1(BYTE opcode) {
- BYTE LB = 0;
- BYTE HB = 0;
- BYTE saved_flags = 0;
- WORD address = 0;
- WORD data = 0;
- WORD temp_word = 0;
- WORD param1 = 0;
- WORD param2 = 0;
- switch (opcode) {
- ////////////////////////////////////////////////////////////////////////////////
- // Load //
- ////////////////////////////////////////////////////////////////////////////////
- case 0x43: //LD Immediate - fetches and Loads data into register A
- data = fetch();
- Registers[REGISTER_A] = data;
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x53: //LD Absoulute - constructs address using LB and HB then loads into register A
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x63://LD Absoulte X - constructs address using LB and HB then loads from register X into register A
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x73://LD Absoulte Y - constructs address using LB and HB then loads from register Y into register A
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x83://LD Absoulte XY - constructs address using LB and HB then loads from registers X and Y into register A
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x93://LD zpg - the second byte is assigned to low order byte to form the address, address then loaded into register A
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Registers[REGISTER_A] = Memory[address];
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x21://LDX Immediate - fetches and Loads data into register X
- data = fetch();
- Index_Registers[REGISTER_X] = data;
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x31: //LDX Absoulute - constructs address using LB and HB then loads into register X
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_X] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x41://LDX Absoulte X - constructs address using LB and HB then loads from register X into register X
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_X] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x51://LDX Absoulte Y - constructs address using LB and HB then loads from register Y into register X
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_X] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x61://LDX Absoulte XY - constructs address using LB and HB then loads from register X and Y into register X
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_X] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x71://LDX zpg - the second byte is assigned to low order byte to form the address, address then loaded into register X
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_X] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x22://LODY Immediate - fetches and Loads data into register Y
- data = fetch();
- Index_Registers[REGISTER_Y] = data;
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x32: //LODY Absoulute - constructs address using LB and HB then loads into register Y
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_Y] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x42://LODY Absoulte X - constructs address using LB and HB then loads from register X into register Y
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_Y] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x52://LODY Absoulte Y - constructs address using LB and HB then loads from register Y into register Y
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_Y] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x62://LODY Absoulte XY - constructs address using LB and HB then loads from register X and Y into register Y
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_Y] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x72://LODY zpg - the second byte is assigned to low order byte to form the address, address then loaded into register Y
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Index_Registers[REGISTER_Y] = Memory[address];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x20://LODS Immediate - fetches and Loads data into stack pointer
- data = fetch();
- StackPointer = data;
- StackPointer += (WORD)fetch() << 8;
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x30://LODS Absoulte - constructs address using LB and HB then loads into stack pointer
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = Memory[address];
- StackPointer += (WORD)Memory[address + 1] << 8;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x40://LODS Absoulte X - constructs address using LB and HB then loads from register X into stack pointer
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = Memory[address];
- StackPointer += (WORD)Memory[address + 1] << 8;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x50://LODS Absoulte Y - constructs address using LB and HB then loads from register Y into stack pointer
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = Memory[address];
- StackPointer += (WORD)Memory[address + 1] << 8;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x60://LODS Absolute XY - constructs address using LB and HB then loads from register X and Y into stack pointer
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = Memory[address];
- StackPointer += (WORD)Memory[address + 1] << 8;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x70://LODS zpg - the second byte is assigned to low order byte to form the address, address then loaded into stack pointer
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- StackPointer = Memory[address];
- StackPointer += (WORD)Memory[address + 1] << 8;
- }
- set_flag_n((BYTE)StackPointer);
- set_flag_z((BYTE)StackPointer);
- break;
- ////////////////////////////////////////////////////////////////////////////////
- // Store //
- ////////////////////////////////////////////////////////////////////////////////
- case 0x04://STO Absolute - constructs the memory address from LB and HB, checks its within memory limits then stores register A at the address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x14://STO Absolute X - constructs the memory address from LB and HB in register X, checks its within memory limits then stores register A at the address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x24: //STO Absolute Y - constructs the memory address from LB and HB in register Y, checks its within memory limits then stores register A at the address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x34://STO Absolute XY - constructs the memory address from LB and HB in register X and Y, checks its within memory limits then stores register A at the address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x44://STO zpg - the second byte is assigned to low order byte to form the address, then stores register A at the address
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Registers[REGISTER_A];
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x0F://STOS Absoulte - constructs address from LB and HB, then creates new LB and HB from stack pointer then stores this in memory at the address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- HB = (BYTE)(StackPointer >> 8);
- LB = (BYTE)StackPointer;
- Memory[address] = LB;
- Memory[address + 1] = HB;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x1F://STOS Absoulte X - constructs address from LB and HB in register X, then creates new LB and HB from stack pointer then stores this in memory at the address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- HB = (BYTE)(StackPointer >> 8);
- LB = (BYTE)StackPointer;
- Memory[address] = LB;
- Memory[address + 1] = HB;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x2F://STOS Absoulte Y - constructs address from LB and HB in register Y, then creates new LB and HB from stack pointer then stores this in memory at the address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- HB = (BYTE)(StackPointer >> 8);
- LB = (BYTE)StackPointer;
- Memory[address] = LB;
- Memory[address + 1] = HB;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x3F://STOS Absolute XY - constructs address from LB and HB in register X and Y, then creates new LB and HB from stack pointer then stores this in memory at the address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- HB = (BYTE)(StackPointer >> 8);
- LB = (BYTE)StackPointer;
- Memory[address] = LB;
- Memory[address + 1] = HB;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x4F://STOS zpg - the second byte is assigned to low order byte to form the address, then creates a new LB and HB from the stack pointer and stores this at the address
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE - 1) {
- HB = (BYTE)(StackPointer >> 8);
- LB = (BYTE)StackPointer;
- Memory[address] = LB;
- Memory[address + 1] = HB;
- }
- set_flag_n16((WORD)StackPointer);
- set_flag_z16((WORD)StackPointer);
- break;
- case 0x05://STOX Absolute - address constructed from LB and HB, checks the address is within memory limits then stores register X at the address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_X];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x15://STOX Absolute X - address constructed from LB and HB in register X, checks the address is within memory limits then stores register X at the address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_X];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x25: //STOX Absolute Y - address constructed from LB and HB in register Y, checks the address is within memory limits then stores register X at the address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_X];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x35://STOX Absolute XY address constructed from LB and HB in register X and Y, checks the address is within memory limits then stores register X at the address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_X];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x45://STOX zpg - the second byte is assigned to low order byte to form the address, then stores register X at the address
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_X];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_X]);
- set_flag_z((BYTE)Index_Registers[REGISTER_X]);
- break;
- case 0x06://STOY Absolute - address constructed from LB and HB, checks the address is within memory limits then stores register Y at the address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_Y];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x16://STOY Absolute X - address constructed from LB and HB in register X, checks the address is within memory limits then stores register Y at the address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_Y];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x26: //STOY Absolute - Y address constructed from LB and HB in register Y, checks the address is within memory limits then stores register Y at the address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_Y];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x36://STOY Absolute XY Y address constructed from LB and HB in register X and Y, checks the address is within memory limits then stores register Y at the address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_Y];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x46://STOY zpg - the second byte is assigned to low order byte to form the address, then stores register Y at the address
- address += 0x0000 | (WORD)fetch();
- if (address >= 0 && address < MEMORY_SIZE) {
- Memory[address] = Index_Registers[REGISTER_Y];
- }
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x27://Register B MVR Intermediate - loads data into register B
- data = fetch();
- Registers[REGISTER_B] = data;
- set_flag_n((BYTE)Registers[REGISTER_B]);
- set_flag_z((BYTE)Registers[REGISTER_B]);
- break;
- case 0x28://Register C MVR Intermediate - loads data into register C
- data = fetch();
- Registers[REGISTER_C] = data;
- set_flag_n((BYTE)Registers[REGISTER_C]);
- set_flag_z((BYTE)Registers[REGISTER_C]);
- break;
- case 0x29://Register L MVR Intermediate - loads data into register L
- data = fetch();
- Registers[REGISTER_L] = data;
- set_flag_n((BYTE)Registers[REGISTER_L]);
- set_flag_z((BYTE)Registers[REGISTER_L]);
- break;
- case 0x2A://Register H MVR Intermediate - loads data into register H
- data = fetch();
- Registers[REGISTER_H] = data;
- set_flag_n((BYTE)Registers[REGISTER_H]);
- set_flag_z((BYTE)Registers[REGISTER_H]);
- break;
- case 0xB6://ADC A,B - adds register B to register A, checks for carry, adds one if carry flag true, checks if another carry needed, sets carry flag to true if it is
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (BYTE)temp_word;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- break;
- case 0xC6://ADC A,C - adds register C to register A, checks for carry, adds one if carry flag true, checks if another carry needed, sets carry flag to true if it is
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (BYTE)temp_word;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- break;
- case 0xD6://ADC A,L - adds register L to register A, checks for carry, adds one if carry flag true, checks if another carry needed, sets carry flag to true if it is
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (BYTE)temp_word;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- break;
- case 0xE6://ADC A,H - adds register H to register A, checks for carry, adds one if carry flag true, checks if another carry needed, sets carry flag to true if it is
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (BYTE)temp_word;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- break;
- case 0xF6://ADC A,M - adds register M to register A, checks for carry, adds one if carry flag true, checks if another carry needed, sets carry flag to true if it is
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- param1 = Registers[REGISTER_A];
- param2 = Memory[address];
- temp_word = (WORD)param1 + (WORD)param2;
- if ((Flags & FLAG_C) != 0)
- {
- temp_word++;
- }
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB8://ADD A,B - adds register B to A and checks if carry needed, if needed set carry flag to true, else clear
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_B];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC8://ADD A,C - adds register C to A and checks if carry needed, if needed set carry flag to true, else clear
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_C];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD8://ADD A,L - adds register L to A and checks if carry needed, if needed set carry flag to true, else clear
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_L];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE8://ADD A,H - adds register H to A and checks if carry needed, if needed set carry flag to true, else clear
- temp_word = (WORD)Registers[REGISTER_A] + (WORD)Registers[REGISTER_H];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF8://ADD A,M - adds register M to A and checks if carry needed, if needed set carry flag to true, else clear
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- param1 = Registers[REGISTER_A];
- param2 = Memory[address];
- temp_word = (WORD)param1 + (WORD)param2;
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB7: //SBC A,B - subtract register B from A, if carry active take away the carry, if another carry needed set the flag, else clear the flag
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC7: //SBC A,C - subtract register C from A, if carry active take away the carry, if another carry needed set the flag, else clear the flag
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD7: //SBC A,L - subtract register L from A, if carry active take away the carry, if another carry needed set the flag, else clear the flag
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE7: //SBC A,H - subtract register H from A, if carry active take away the carry, if another carry needed set the flag, else clear the flag
- 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;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF7: //SBC A,M - subtract register M from A, if carry active take away the carry, if another carry needed set the flag, else clear the flag
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- temp_word = (WORD)Registers[REGISTER_A] - Memory[address];
- 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);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xB9: //SUB A,B - subtract register B from A, if carry needed set carry flag, else clear flag
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_B];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xC9: //SUB A,C - subtract register C from A, if carry needed set carry flag, else clear flag
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_C];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xD9: //SUB A,L - subtract register L from A, if carry needed set carry flag, else clear flag
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_L];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xE9: //SUB A,H - subtract register H from A, if carry needed set carry flag, else clear flag
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_H];
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xF9: //SUB A,M - subtract register M from A, if carry needed set carry flag, else clear flag
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- temp_word = (WORD)Registers[REGISTER_A] - Memory[address];
- 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);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xBA://CMP A,B - Register B compared to register A, if carry flag needed set carry flag, if not clear it
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_B];
- 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);
- break;
- case 0xCA://CMP A,C - Register C compared to register A, if carry flag needed set carry flag, if not clear it
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_C];
- 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);
- break;
- case 0xDA://CMP A,L - Register L compared to register A, if carry flag needed set carry flag, if not clear it
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_L];
- 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);
- break;
- case 0xEA://CMP A,H - Register H compared to register A, if carry flag needed set carry flag, if not clear it
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_H];
- 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);
- break;
- case 0xFA://CMP A,M - Register M compared to register A, if carry flag needed set carry flag, if not clear it
- temp_word = (WORD)Registers[REGISTER_A] - (WORD)Registers[REGISTER_M];
- 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);
- break;
- case 0x2D://MSA - sets register A to Flags (status register)
- Registers[REGISTER_A] = Flags;
- break;
- case 0x2B://TAY - loads register A into index register Y
- Index_Registers[REGISTER_Y] = Registers[REGISTER_A];
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0x2C://TYA - loads index register Y into register A
- Registers[REGISTER_A] = Index_Registers[REGISTER_Y];
- set_flag_n((BYTE)Index_Registers[REGISTER_Y]);
- set_flag_z((BYTE)Index_Registers[REGISTER_Y]);
- break;
- case 0xA6://CLC - clears carry flag
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0xA7://SEC - sets carry flag
- Flags = Flags | FLAG_C;
- break;
- case 0xA8://CLI - clears interrupt flag
- Flags = Flags & (0xFF - FLAG_I);
- break;
- case 0xA9://SEI - sets interrupt flag
- Flags = Flags | FLAG_I;
- break;
- case 0xAA://CMC - compliment carry flag
- Flags = Flags ^ FLAG_C;
- break;
- case 0xAE://PUSH REGISTER A - checks stackpointer is within memory limits, sets stack pointer to register A
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_A];
- }
- break;
- case 0xBE://PUSH FLAGS - checks stackpointer is within memory limits, sets stack pointer to flags
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Flags;
- }
- break;
- case 0xCE://PUSH REGISTER B - checks stackpointer is within memory limits, sets stack pointer to register B
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_B];
- }
- break;
- case 0xDE://PUSH REGISTER C - checks stackpointer is within memory limits, sets stack pointer to register C
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_C];
- }
- break;
- case 0xEE://PUSH REGISTER L - checks stackpointer is within memory limits, sets stack pointer to register L
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_L];
- }
- break;
- case 0xFE://PUSH REGISTER H - checks stackpointer is within memory limits, sets stack pointer to register H
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_H];
- }
- break;
- case 0xAF://POP REGISTER A - checks stack pointer is within memory limits, loads stack pointer into register A, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_A] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0xBF://POP FLAGS checks stack pointer is within memory limits, loads stack pointer into Flags, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Flags = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0xCF://POP REGISTER B -checks stack pointer is within memory limits, loads stack pointer into register B, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_B] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0xDF://POP REGISTER C - checks stack pointer is within memory limits, loads stack pointer into register C, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_C] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0xEF://POP REGISTER L -checks stack pointer is within memory limits, loads stack pointer into register L, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_L] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0xFF://POP REGISTER M - checks stack pointer is within memory limits, loads stack pointer into register M, then adds one to stack pointer
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_H] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0x38: //JUMP - contructs address from LB and HB then sets PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- ProgramCounter = address;
- break;
- case 0x07://JMPR - contructs address from LB and HB, uses stack pointer to jump to a subroutine, then sets PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((StackPointer >= 2) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = (BYTE)((ProgramCounter >> 8) & 0xFF);
- StackPointer--;
- Memory[StackPointer] = (BYTE)(ProgramCounter & 0xFF);
- }
- ProgramCounter = address;
- break;
- case 0x23: //RT - bitwise shifts the stack pointer to get address to return from subroutine
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 2)) {
- LB = Memory[StackPointer];
- StackPointer++;
- HB = Memory[StackPointer];
- StackPointer++;
- ProgramCounter = ((WORD)HB << 8) + (WORD)LB;
- }
- break;
- case 0x39://JCC - constructs address from LB and HB, if the carry flag is clear jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_C) == 0)
- {
- ProgramCounter = address;
- }
- break;
- case 0x3A://JCS - constructs address from LB and HB, if the carry flag is set jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_C) == FLAG_C)
- {
- ProgramCounter = address;
- }
- break;
- case 0x3B://JNE - constructs address from LB and HB, if result not zero jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_Z) == 0)
- {
- ProgramCounter = address;
- }
- break;
- case 0x3C://JEQ - constructs address from LB and HB, if result is zero jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_Z) == FLAG_Z)
- {
- ProgramCounter = address;
- }
- break;
- case 0x3D://JMI - constructs address from LB and HB, if result is negative jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_N) == FLAG_N)
- {
- ProgramCounter = address;
- }
- break;
- case 0x3E://JPL - constructs address from LB and HB, if result is positive jump to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_N) == 0)
- {
- ProgramCounter = address;
- }
- break;
- case 0x08: //CCC - constructs address from LB and HB, if carry flag clear set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_C) == 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x09: //CCS - constructs address from LB and HB, if carry set, set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_C) != 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x0A: //CNE - constructs address from LB and HB, if zero flag clear set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_Z) == 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x0B: //CEQ - constructs address from LB and HB, if zero flag set, set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_Z) != 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x0C: //CMI - constructs address from LB and HB, if negative flag set, set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_N) != 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x0D: //CPL - constructs address from LB and HB, if negative flag clear set stackpointer to PC then reduce by one, then set PC to address
- LB = fetch();
- HB = fetch();
- address = ((WORD)HB << 8) + (WORD)LB;
- if ((Flags & FLAG_N) == 0) {
- Memory[StackPointer] = ProgramCounter;
- StackPointer--;
- ProgramCounter = address;
- }
- break;
- case 0x95: //INCA - increment register A
- ++Registers[REGISTER_A];
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x96: //DECA - decrement register A
- Registers[REGISTER_A]--;
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x9F: //CLRA - clear register A
- Registers[REGISTER_A] = 0;
- Flags = Flags | FLAG_Z;
- Flags = Flags & (0xFF - FLAG_N);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x55: // INC Absolute - constructs address from LB and HB then increment address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- ++Memory[address];
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x65: // INC Absolute X - constructs address from LB and HB in register X then increment address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- ++Memory[address];
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x75: // INC Absolute Y - constructs address from LB and HB in register Y then increment address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- ++Memory[address];
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x85: // INC Absolute X,Y - constructs address from LB and HB in register X and Y then increment address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- ++Memory[address];
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x5F: // CLR Absolute - constructs address from LB and HB then clear address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0;
- Flags = Flags | FLAG_Z;
- Flags = Flags & (0xFF - FLAG_N);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x6F: // CLR Absolute X - constructs address from LB and HB in register X then clear address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0;
- Flags = Flags | FLAG_Z;
- Flags = Flags & (0xFF - FLAG_N);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x7F: // CLR Absolute Y - constructs address from LB and HB in register Y then clear address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0;
- Flags = Flags | FLAG_Z;
- Flags = Flags & (0xFF - FLAG_N);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x8F: // CLR Absolute XY - constructs address from LB and HB in register X and Y then clear address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0;
- Flags = Flags | FLAG_Z;
- Flags = Flags & (0xFF - FLAG_N);
- Flags = Flags & (0xFF - FLAG_C);
- break;
- case 0x4A: // DEX - constructs address from LB and HB in register X then increment address
- Index_Registers[REGISTER_X]--;
- set_flag_z(Index_Registers[REGISTER_X]);
- break;
- case 0x4B: //INX - increment register X
- ++Index_Registers[REGISTER_X];
- set_flag_z(Index_Registers[REGISTER_X]);
- break;
- case 0x4C: //DEY - decrement register Y
- Index_Registers[REGISTER_Y]--;
- set_flag_z(Index_Registers[REGISTER_Y]);
- break;
- case 0x4D: //INY - increment register Y
- ++Index_Registers[REGISTER_Y];
- set_flag_z(Index_Registers[REGISTER_Y]);
- break;
- case 0xBC: // AND Register A,B - bitwise ANDs register A and B
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_B];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xCC: // AND Register A,C - bitwise ANDs register A and C
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_C];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xDC: // AND Register A,L - bitwise ANDs register A and L
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_L];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xEC: // AND Register A,H - bitwise ANDs register A and H
- temp_word = (WORD)Registers[REGISTER_A] & (WORD)Registers[REGISTER_H];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xFC: // AND Register A,M - bitwise ANDs register A and M
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- param1 = Registers[REGISTER_A];
- param2 = Memory[address];
- temp_word = (WORD)param1 & (WORD)param2;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xBB: //OR A,B - bitwise ORs A and B
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_B];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xCB: //OR A,C - bitwise ORs A and C
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_C];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xDB: //OR A,L - bitwise ORs A and L
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_L];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xEB: //OR A,H - bitwise ORs A and H
- temp_word = (WORD)Registers[REGISTER_A] | (WORD)Registers[REGISTER_H];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xFB: //OR A,M - bitwise ORs A and M
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- param1 = Registers[REGISTER_A];
- param2 = Memory[address];
- temp_word = (WORD)param1 | (WORD)param2;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xBD: //XOR A,B - bitwise XORs A and B
- temp_word = (WORD)Registers[REGISTER_A] ^ (WORD)Registers[REGISTER_B];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xCD: //XOR A,C - bitwise XORs A and C
- temp_word = (WORD)Registers[REGISTER_A] ^ (WORD)Registers[REGISTER_C];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xDD: //XOR A,L - bitwise XORs A and L
- temp_word = (WORD)Registers[REGISTER_A] ^ (WORD)Registers[REGISTER_L];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xED: //XOR A,H - bitwise XORs A and H
- temp_word = (WORD)Registers[REGISTER_A] ^ (WORD)Registers[REGISTER_H];
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0xFD: //XOR A,M - bitwise XORs A and M
- HB = Registers[REGISTER_H];
- LB = Registers[REGISTER_L];
- address = ((WORD)HB << 8) + LB;
- param1 = Registers[REGISTER_A];
- param2 = Memory[address];
- temp_word = (WORD)param1 ^ (WORD)param2;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0x56: //DEC Absolute - constructs address from LB and HB then decrements address
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address]--;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x66: //DEC Absolute X - constructs address from LB and HB in register X then decrements address
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- Memory[address]--;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x76: //DEC Absolute Y - constructs address from LB and HB in register Y then decrements address
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- Memory[address]--;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x86: //DEC Absolute X,Y - constructs address from LB and HB in register X and Y then decrements address
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- if (address >= 0 && address < MEMORY_SIZE)
- {
- Memory[address]--;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x59: //SAL Absolute - constructs address from LB and HB then checks if carry flag needs to be set, then bitwise shifts address left
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80)
- {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x69: //SAL Absolute X - constructs address from LB and HB in register X then checks if carry flag needs to be set, then bitwise shifts address left
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80)
- {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x79: //SAL Absolute Y - constructs address from LB and HB in register Y then checks if carry flag needs to be set, then bitwise shifts address left
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80)
- {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x89: //SAL Absolute X,Y - constructs address from LB and HB in register X and Y then checks if carry flag needs to be set, then bitwise shifts address left
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80)
- {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x5A: //SHR Absolute - constructs address from LB and HB then checks if carry flag needs to be set, then bitwise shifts address right
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- HB = Memory[address];
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((HB & 0x80) == 0x80) {
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x6A: //SHR Absolute X - constructs address from LB and HB in register X then checks if carry flag needs to be set, then bitwise shifts address right
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- HB = Memory[address];
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((HB & 0x80) == 0x80) {
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x7A: //SHR Absolute Y - constructs address from LB and HB in register Y then checks if carry flag needs to be set, then bitwise shifts address right
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- HB = Memory[address];
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((HB & 0x80) == 0x80) {
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x8A: //SHR Absolute X,Y - constructs address from LB and HB in register X and Y then checks if carry flag needs to be set, then bitwise shifts address right
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address = (WORD)((WORD)HB << 8) + LB;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- HB = Memory[address];
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((HB & 0x80) == 0x80) {
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x02: //SWI - checks stack pointer is within memory limits, decrements it, changes stack pointer to equal register A
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) {
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_A];
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal PC
- StackPointer--;
- Memory[StackPointer] = (BYTE)ProgramCounter;
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal PC bitwise shifted left
- StackPointer--;
- Memory[StackPointer] = (BYTE)(ProgramCounter >> 8);
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal Flags
- StackPointer--;
- Memory[StackPointer] = Flags;
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal register B
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_B];
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal register C
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_C];
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal register L
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_L];
- }
- if ((StackPointer >= 1) && (StackPointer < MEMORY_SIZE)) { // checks if stack pointer within memory limits, decrements it then changes stack pointer to equal register H
- StackPointer--;
- Memory[StackPointer] = Registers[REGISTER_H];
- }
- break;
- case 0x03: //RTI - checks stack pointer is within memory limits, upper limit -1, sets register H to equal stack pointer then increments stack pointer by one
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) {
- Registers[REGISTER_H] = Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets register L to equal stack pointer then increments stack pointer by one
- Registers[REGISTER_L] = Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets register C to equal stack pointer then increments stack pointer by one
- Registers[REGISTER_C] = Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets register B to equal stack pointer then increments stack pointer by one
- Registers[REGISTER_B] = Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets Flags to equal stack pointer then increments stack pointer by one
- Flags = Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets PC to equal stack pointer then increments stack pointer by one
- ProgramCounter = (WORD)(Memory[StackPointer] << 8);
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, then adds Stack pointer to PC and increments stack pointer by one
- ProgramCounter += Memory[StackPointer];
- StackPointer++;
- }
- if ((StackPointer >= 0) && (StackPointer < MEMORY_SIZE - 1)) { // checks stack pointer is within memory limits, upper limit -1, sets register A to equal stack pointer then increments stack pointer by one
- Registers[REGISTER_A] = Memory[StackPointer];
- StackPointer++;
- }
- break;
- case 0x98: //RCLA - saves the current flags as saved flags, checks if a carry is needed, sets if so, clears if not, bitwise shifts register A left then checks if carry flag set, if set add carry to A
- 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;
- }
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x1C: //ADI - adds fetched data to register A, checks if carry flag is set, if so add one to the sum, if a carry flag needed set flag, else clear flag
- data = fetch();
- temp_word = (WORD)Registers[REGISTER_A] + data;
- if ((Flags & FLAG_C) != 0)
- {
- temp_word++;
- }
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0x1D: //CPI - compares fetched data with register A, if fetched data is greater than, set the carry flag, else clear flag
- data = fetch();
- temp_word = (WORD)data - (WORD)Registers[REGISTER_A];
- if (temp_word >= 0x100) {
- Flags = Flags | FLAG_C; // Set carry flag
- }
- else {
- Flags = Flags & (0xFF - FLAG_C); // Clear carry flag
- }
- set_flag_z((BYTE)temp_word);
- set_flag_n((BYTE)temp_word);
- break;
- case 0x1E: //ANI - biwise ANDs fetched data with register A, if carry flag needed set carry flag, if not clear flag
- data = fetch();
- temp_word = (WORD)Registers[REGISTER_A] & data;
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (BYTE)temp_word;
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- break;
- case 0x54: //TEST Absolute - address is constructed from LB and HB, loads address into variable data
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- data = Memory[address];
- set_flag_n(data);
- set_flag_z(data);
- break;
- case 0x64: //TEST Absolute X - address is constructed from LB and HB in register X, loads address into variable data
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- data = Memory[address];
- set_flag_n(data);
- set_flag_z(data);
- break;
- case 0x74: //TEST Absolute Y - address is constructed from LB and HB in register Y, loads address into variable data
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- data = Memory[address];
- set_flag_n(data);
- set_flag_z(data);
- break;
- case 0x84: //TEST Absolute X,Y - address is constructed from LB and HB in X and Y, loads address into variable data
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- data = Memory[address];
- set_flag_n(data);
- set_flag_z(data);
- break;
- case 0x94: //TESTA - sets flags N and Z to register A
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x57: //RR Absolute - Constructs address from LB and HB, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory right
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if the carry was set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x67: //RR Absolute X - Constructs address from LB and HB in register X, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory right
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x77: //RR Absolute Y - Constructs address from LB and HB in register Y, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory right
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x87: //RR Absolute X,Y - Constructs address from LB and HBin register X and Y, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory right
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x97: //RRA - saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift register A right
- saved_flags = Flags;
- if ((Registers[REGISTER_A] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (Registers[REGISTER_A] >> 1) & 0x7F;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Registers[REGISTER_A] = Registers[REGISTER_A] | 0x80;
- }
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x58: //RCL Absolute - - Constructs address from LB and HB, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory left
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x01;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x68: //RCL Absolute X - - Constructs address from LB and HB in register X, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory left
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x01;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x78: //RCL Absolute Y - Constructs address from LB and HB in register Y, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory left
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x01;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x88: //RCL Absolute X,Y - - Constructs address from LB and HB in register X and Y, saves flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shift the address in memory left
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((saved_flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x01;
- }
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x99: //SALA - saves Flags in saved flags, checks if carry flag needed, if so set, if not clear, bitwise shifts register A left
- 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;
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x9A: //SHRA - checks if carry flag needed, if so set, if not clear, bitwise shifts register A right
- if ((Registers[REGISTER_A] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (Registers[REGISTER_A] >> 1) & 0x7F;
- if ((Flags & FLAG_N) == FLAG_N) { // if negative flag set, change register A to negative
- Registers[REGISTER_A] = Registers[REGISTER_A] | 0x80;
- }
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x5B: //COM Absolute - constructs address from LB and HB, negates address in memory, sets carry flag
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = Memory[address] ^ 0xFFFF;
- Flags = Flags | FLAG_C;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x6B: //COM Absolute X - constructs address from LB and HB in register X, negates address in memory, sets carry flag
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = Memory[address] ^ 0xFFFF;
- Flags = Flags | FLAG_C;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x7B: //COM Absolute Y - constructs address from LB and HB in register Y, negates address in memory, sets carry flag
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = Memory[address] ^ 0xFFFF;
- Flags = Flags | FLAG_C;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x8B: //COM Absolute X,Y - constructs address from LB and HB in register X and Y, negates address in memory, sets carry flag
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = Memory[address] ^ 0xFFFF;
- Flags = Flags | FLAG_C;
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x9B: //COMA - negates register A, checks if carry flag needed, if so set, if not clear
- temp_word = (WORD)Registers[REGISTER_A] ^ 0xFFFF;
- if (temp_word >= 0x100)
- {
- Flags = Flags | FLAG_C;
- }
- else
- {
- Flags = Flags & (0xFF - FLAG_C);
- }
- set_flag_n((BYTE)temp_word);
- set_flag_z((BYTE)temp_word);
- Registers[REGISTER_A] = (BYTE)temp_word;
- break;
- case 0x5C: //NEG Absolute - constructs address from LB and HB, clears address then takes itself away
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0 - Memory[address];
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x6C: //NEG Absolute X - constructs address from LB and HB in register X, clears address then takes itself away
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0 - Memory[address];
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x7C: //NEG Absolute Y - constructs address from LB and HB in register Y, clears address then takes itself away
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0 - Memory[address];
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x8C: //NEG Absolute X,Y - constructs address from LB and HB in register X and Y, clears address then takes itself away
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- Memory[address] = 0 - Memory[address];
- set_flag_n(Memory[address]);
- set_flag_z(Memory[address]);
- break;
- case 0x9C: //NEGA - converts register A into 2's compliments
- Registers[REGISTER_A] = Registers[REGISTER_A] ^ 0xFF;
- Registers[REGISTER_A]++;
- set_flag_n(Registers[REGISTER_A]);
- set_flag_z(Registers[REGISTER_A]);
- break;
- case 0x5D: //RAL Absolute - constructs address from LB and HB, saves flags to saved flags, checks if carry flag is needed, if so set, if not clear, bitwise shift address in memory left
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((Flags & FLAG_C) == FLAG_C) { // check if carry flag set, if so add it on, then sets flags to how they were
- Memory[address] = Memory[address] | 0x01;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x6D: //RAL Absolute X - constructs address from LB and HB in register X, saves flags to saved flags, checks if carry flag is needed, if so set, if not clear, bitwise shift address in memory left
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((Flags & FLAG_C) == FLAG_C) { // check if carry flag set, if so add it on, then sets flags to how they were
- Memory[address] = Memory[address] | 0x01;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x7D: //RAL Absolute Y - constructs address from LB and HB in register Y, saves flags to saved flags, checks if carry flag is needed, if so set, if not clear, bitwise shift address in memory left
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((Flags & FLAG_C) == FLAG_C) { // check if carry flag set, if so add it on, then sets flags to how they were
- Memory[address] = Memory[address] | 0x01;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x8D: //RAL Absolute X,Y - constructs address from LB and HB in register X and Y, saves flags to saved flags, checks if carry flag is needed, if so set, if not clear, bitwise shift address in memory left
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x80) == 0x80) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] << 1) & 0xFE;
- if ((Flags & FLAG_C) == FLAG_C) { // check if carry flag set, if so add it on, then sets flags to how they were
- Memory[address] = Memory[address] | 0x01;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x9D: //RALA - saves flags to saved flags, checks if carry flag is needed, if so set, if not clear, bitwise shift register A in memory left
- 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 ((Flags & FLAG_C) == FLAG_C) { // check if carry flag set, if so add it on, then sets flags to how they were
- Registers[REGISTER_A] = Registers[REGISTER_A] | 0x01;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- case 0x5E: //ROR Absolute - address is constructed with LB and HB, flags are saved to saved flags, checks if carry is needed, if so set, if not clear, bitwise shift address in memory right
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((Flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x6E: //ROR Absolute X - address is constructed with LB and HB in register X, flags are saved to saved flags, checks if carry is needed, if so set, if not clear, bitwise shift address in memory right
- address += Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((Flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x7E: //ROR Absolute Y - address is constructed with LB and HB in register Y, flags are saved to saved flags, checks if carry is needed, if so set, if not clear, bitwise shift address in memory right
- address += Index_Registers[REGISTER_Y];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((Flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x8E: //ROR Absolute X,Y - address is constructed with LB and HB in register X and Y, flags are saved to saved flags, checks if carry is needed, if so set, if not clear, bitwise shift address in memory right
- address += (WORD)((WORD)Index_Registers[REGISTER_Y] << 8) + Index_Registers[REGISTER_X];
- LB = fetch();
- HB = fetch();
- address += (WORD)((WORD)HB << 8) + LB;
- saved_flags = Flags;
- if ((Memory[address] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Memory[address] = (Memory[address] >> 1) & 0x7F;
- if ((Flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Memory[address] = Memory[address] | 0x80;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Memory[address]);
- set_flag_z((BYTE)Memory[address]);
- break;
- case 0x9E: //RORA - flags are saved to saved flags, checks if carry is needed, if so set, if not clear, bitwise shift register A right
- saved_flags = Flags;
- if ((Registers[REGISTER_A] & 0x01) == 0x01) {
- Flags = Flags | FLAG_C;
- }
- else {
- Flags = Flags & (0xFF - FLAG_C);
- }
- Registers[REGISTER_A] = (Registers[REGISTER_A] >> 1) & 0x7F;
- if ((Flags & FLAG_C) == FLAG_C) { // if carry flag set, add it on
- Registers[REGISTER_A] = Registers[REGISTER_A] | 0x80;
- }
- Flags = saved_flags;
- set_flag_n((BYTE)Registers[REGISTER_A]);
- set_flag_z((BYTE)Registers[REGISTER_A]);
- break;
- //No Operation
- case 0x17: //NOP
- break;
- case 0x18: //WAI - halts
- halt = true;
- break;
- }
- }
- void Group_2_Move(BYTE opcode)
- {
- BYTE source = opcode >> 4;
- BYTE destination = opcode & 0x0F;
- int destReg;
- int sourceReg;
- WORD address = 0;
- switch (destination) {
- case 0x00: // sets destination to register A
- destReg = REGISTER_A;
- break;
- case 0x01: // sets destination to register B
- destReg = REGISTER_B;
- break;
- case 0x02: // sets destination to register C
- destReg = REGISTER_C;
- break;
- case 0x03: // sets destination to register L
- destReg = REGISTER_L;
- break;
- case 0x04: // sets destination to register H
- destReg = REGISTER_H;
- break;
- case 0x05: // sets destination to register M
- destReg = REGISTER_M;
- break;
- }
- switch (source) {
- case 0x0A: // sets the source to register A
- sourceReg = REGISTER_A;
- break;
- case 0x0B: // sets the source to register B
- sourceReg = REGISTER_B;
- break;
- case 0x0C: // sets the source to register C
- sourceReg = REGISTER_C;
- break;
- case 0x0D: // sets the source to register L
- sourceReg = REGISTER_L;
- break;
- case 0x0E: // sets the source to register H
- sourceReg = REGISTER_H;
- break;
- case 0x0F: // sets the source to register M
- sourceReg = REGISTER_M;
- break;
- }
- if (sourceReg == REGISTER_M) { // creates register M, as it does not technically exist how the others do
- address = Registers[REGISTER_L];
- address += (WORD)Registers[REGISTER_H] << 8;
- if (address >= 0 && address <= MEMORY_SIZE) {
- Registers[REGISTER_M] = Memory[address];
- }
- }
- if (destReg == REGISTER_M) { // creates register M, as it does not technically exist how the others do
- address = Registers[REGISTER_L];
- address += (WORD)Registers[REGISTER_H] << 8;
- if (address >= 0 && address <= MEMORY_SIZE) {
- Memory[address] = Registers[sourceReg];
- }
- }
- else {
- Registers[destReg] = Registers[sourceReg];
- }
- }
- void execute(BYTE opcode)
- {
- BYTE source = opcode >> 4;
- BYTE destination = opcode & 0x0F;
- if (((source >= 0x0A) && (source <= 0x0F)) && ((destination >= 0x00) && (destination <= 0x05)))
- {
- Group_2_Move(opcode);
- }
- else
- {
- Group_1(opcode);
- }
- }
- void emulate()
- {
- BYTE opcode;
- int sanity;
- ProgramCounter = 0;
- halt = false;
- memory_in_range = true;
- sanity = 0;
- printf(" A B C L H X Y SP\n");
- while ((!halt) && (memory_in_range)) {
- printf("%04X ", ProgramCounter); // Print current address
- opcode = fetch();
- execute(opcode);
- printf("%s ", opcode_mneumonics[opcode]); // Print current opcode
- printf("%02X ", Registers[REGISTER_A]);
- printf("%02X ", Registers[REGISTER_B]);
- printf("%02X ", Registers[REGISTER_C]);
- printf("%02X ", Registers[REGISTER_L]);
- printf("%02X ", Registers[REGISTER_H]);
- printf("%02X ", Index_Registers[REGISTER_X]);
- printf("%02X ", Index_Registers[REGISTER_Y]);
- printf("%04X ", StackPointer); // Print Stack Pointer
- if ((Flags & FLAG_Z) == FLAG_Z)
- {
- printf("Z=1 ");
- }
- else
- {
- printf("Z=0 ");
- }
- if ((Flags & FLAG_I) == FLAG_I)
- {
- printf("I=1 ");
- }
- else
- {
- printf("I=0 ");
- }
- if ((Flags & FLAG_N) == FLAG_N)
- {
- printf("N=1 ");
- }
- else
- {
- printf("N=0 ");
- }
- if ((Flags & FLAG_C) == FLAG_C)
- {
- printf("C=1 ");
- }
- else
- {
- printf("C=0 ");
- }
- printf("\n"); // New line
- sanity++;
- if (sanity > 200) halt = true;
- }
- printf("\n"); // New line
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Simulator/Emulator (End) //
- ////////////////////////////////////////////////////////////////////////////////
- void initialise_filenames() {
- int i;
- for (i = 0; i < MAX_FILENAME_SIZE; i++) {
- hex_file[i] = '\0';
- trc_file[i] = '\0';
- }
- }
- int find_dot_position(char *filename) {
- int dot_position;
- int i;
- char chr;
- dot_position = 0;
- i = 0;
- chr = filename[i];
- while (chr != '\0') {
- if (chr == '.') {
- dot_position = i;
- }
- i++;
- chr = filename[i];
- }
- return (dot_position);
- }
- int find_end_position(char *filename) {
- int end_position;
- int i;
- char chr;
- end_position = 0;
- i = 0;
- chr = filename[i];
- while (chr != '\0') {
- end_position = i;
- i++;
- chr = filename[i];
- }
- return (end_position);
- }
- bool file_exists(char *filename) {
- bool exists;
- FILE *ifp;
- exists = false;
- if ((ifp = fopen(filename, "r")) != NULL) {
- exists = true;
- fclose(ifp);
- }
- return (exists);
- }
- void create_file(char *filename) {
- FILE *ofp;
- if ((ofp = fopen(filename, "w")) != NULL) {
- fclose(ofp);
- }
- }
- bool getline(FILE *fp, char *buffer) {
- bool rc;
- bool collect;
- char c;
- int i;
- rc = false;
- collect = true;
- i = 0;
- while (collect) {
- c = getc(fp);
- switch (c) {
- case EOF:
- if (i > 0) {
- rc = true;
- }
- collect = false;
- break;
- case '\n':
- if (i > 0) {
- rc = true;
- collect = false;
- buffer[i] = '\0';
- }
- break;
- default:
- buffer[i] = c;
- i++;
- break;
- }
- }
- return (rc);
- }
- void load_and_run(int args, _TCHAR** argv) {
- char chr;
- int ln;
- int dot_position;
- int end_position;
- long i;
- FILE *ifp;
- long address;
- long load_at;
- int code;
- // Prompt for the .hex file
- printf("\n");
- printf("Enter the hex filename (.hex): ");
- if (args == 2) {
- ln = 0;
- chr = argv[1][ln];
- while (chr != '\0')
- {
- if (ln < MAX_FILENAME_SIZE)
- {
- hex_file[ln] = chr;
- trc_file[ln] = chr;
- ln++;
- }
- chr = argv[1][ln];
- }
- }
- else {
- ln = 0;
- chr = '\0';
- while (chr != '\n') {
- chr = getchar();
- switch (chr) {
- case '\n':
- break;
- default:
- if (ln < MAX_FILENAME_SIZE) {
- hex_file[ln] = chr;
- trc_file[ln] = chr;
- ln++;
- }
- break;
- }
- }
- }
- // Tidy up the file names
- dot_position = find_dot_position(hex_file);
- if (dot_position == 0) {
- end_position = find_end_position(hex_file);
- hex_file[end_position + 1] = '.';
- hex_file[end_position + 2] = 'h';
- hex_file[end_position + 3] = 'e';
- hex_file[end_position + 4] = 'x';
- hex_file[end_position + 5] = '\0';
- }
- else {
- hex_file[dot_position + 0] = '.';
- hex_file[dot_position + 1] = 'h';
- hex_file[dot_position + 2] = 'e';
- hex_file[dot_position + 3] = 'x';
- hex_file[dot_position + 4] = '\0';
- }
- dot_position = find_dot_position(trc_file);
- if (dot_position == 0) {
- end_position = find_end_position(trc_file);
- trc_file[end_position + 1] = '.';
- trc_file[end_position + 2] = 't';
- trc_file[end_position + 3] = 'r';
- trc_file[end_position + 4] = 'c';
- trc_file[end_position + 5] = '\0';
- }
- else {
- trc_file[dot_position + 0] = '.';
- trc_file[dot_position + 1] = 't';
- trc_file[dot_position + 2] = 'r';
- trc_file[dot_position + 3] = 'c';
- trc_file[dot_position + 4] = '\0';
- }
- if (file_exists(hex_file)) {
- // Clear Registers and Memory
- Registers[REGISTER_A] = 0;
- Registers[REGISTER_B] = 0;
- Registers[REGISTER_C] = 0;
- Registers[REGISTER_L] = 0;
- Registers[REGISTER_H] = 0;
- Index_Registers[REGISTER_X] = 0;
- Index_Registers[REGISTER_Y] = 0;
- Flags = 0;
- ProgramCounter = 0;
- StackPointer = 0;
- for (i = 0; i < MEMORY_SIZE; i++) {
- Memory[i] = 0x00;
- }
- // Load hex file
- if ((ifp = fopen(hex_file, "r")) != NULL) {
- printf("Loading file...\n\n");
- load_at = 0;
- while (getline(ifp, InputBuffer)) {
- if (sscanf(InputBuffer, "L=%x", &address) == 1) {
- load_at = address;
- }
- else if (sscanf(InputBuffer, "%x", &code) == 1) {
- if ((load_at >= 0) && (load_at <= MEMORY_SIZE)) {
- Memory[load_at] = (BYTE)code;
- }
- load_at++;
- }
- else {
- printf("ERROR> Failed to load instruction: %s \n", InputBuffer);
- }
- }
- fclose(ifp);
- }
- // Emulate
- emulate();
- }
- else {
- printf("\n");
- printf("ERROR> Input file %s does not exist!\n", hex_file);
- printf("\n");
- }
- }
- void building(int args, _TCHAR** argv) {
- char buffer[1024];
- load_and_run(args, argv);
- sprintf(buffer, "0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X",
- Memory[TEST_ADDRESS_1],
- Memory[TEST_ADDRESS_2],
- Memory[TEST_ADDRESS_3],
- Memory[TEST_ADDRESS_4],
- Memory[TEST_ADDRESS_5],
- Memory[TEST_ADDRESS_6],
- Memory[TEST_ADDRESS_7],
- Memory[TEST_ADDRESS_8],
- Memory[TEST_ADDRESS_9],
- Memory[TEST_ADDRESS_10],
- Memory[TEST_ADDRESS_11],
- Memory[TEST_ADDRESS_12]
- );
- sendto(sock, buffer, strlen(buffer), 0, (SOCKADDR *)&server_addr, sizeof(SOCKADDR));
- }
- void test_and_mark() {
- char buffer[1024];
- bool testing_complete;
- int len = sizeof(SOCKADDR);
- char chr;
- int i;
- int j;
- bool end_of_program;
- long address;
- long load_at;
- int code;
- int mark;
- int passed;
- printf("\n");
- printf("Automatic Testing and Marking\n");
- printf("\n");
- testing_complete = false;
- sprintf(buffer, "Test Student %s", STUDENT_NUMBER);
- sendto(sock, buffer, strlen(buffer), 0, (SOCKADDR *)&server_addr, sizeof(SOCKADDR));
- while (!testing_complete) {
- memset(buffer, '\0', sizeof(buffer));
- if (recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (SOCKADDR *)&client_addr, &len) != SOCKET_ERROR) {
- printf("Incoming Data: %s \n", buffer);
- //if (strcmp(buffer, "Testing complete") == 1)
- if (sscanf(buffer, "Testing complete %d", &mark) == 1) {
- testing_complete = true;
- printf("Current mark = %d\n", mark);
- }
- else if (sscanf(buffer, "Tests passed %d", &passed) == 1) {
- //testing_complete = true;
- printf("Passed = %d\n", passed);
- }
- else if (strcmp(buffer, "Error") == 0) {
- printf("ERROR> Testing abnormally terminated\n");
- testing_complete = true;
- }
- else {
- // Clear Registers and Memory
- Registers[REGISTER_A] = 0;
- Registers[REGISTER_B] = 0;
- Registers[REGISTER_C] = 0;
- Registers[REGISTER_L] = 0;
- Registers[REGISTER_H] = 0;
- Index_Registers[REGISTER_X] = 0;
- Index_Registers[REGISTER_Y] = 0;
- Flags = 0;
- ProgramCounter = 0;
- StackPointer = 0;
- for (i = 0; i < MEMORY_SIZE; i++) {
- Memory[i] = 0;
- }
- // Load hex file
- i = 0;
- j = 0;
- load_at = 0;
- end_of_program = false;
- FILE *ofp;
- fopen_s(&ofp, "branch.txt", "a");
- while (!end_of_program) {
- chr = buffer[i];
- switch (chr) {
- case '\0':
- end_of_program = true;
- case ',':
- if (sscanf(InputBuffer, "L=%x", &address) == 1) {
- load_at = address;
- }
- else if (sscanf(InputBuffer, "%x", &code) == 1) {
- if ((load_at >= 0) && (load_at <= MEMORY_SIZE)) {
- Memory[load_at] = (BYTE)code;
- fprintf(ofp, "%02X\n", (BYTE)code);
- }
- load_at++;
- }
- else {
- printf("ERROR> Failed to load instruction: %s \n", InputBuffer);
- }
- j = 0;
- break;
- default:
- InputBuffer[j] = chr;
- j++;
- break;
- }
- i++;
- }
- fclose(ofp);
- // Emulate
- if (load_at > 1) {
- emulate();
- // Send and store results
- sprintf(buffer, "%02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X",
- Memory[TEST_ADDRESS_1],
- Memory[TEST_ADDRESS_2],
- Memory[TEST_ADDRESS_3],
- Memory[TEST_ADDRESS_4],
- Memory[TEST_ADDRESS_5],
- Memory[TEST_ADDRESS_6],
- Memory[TEST_ADDRESS_7],
- Memory[TEST_ADDRESS_8],
- Memory[TEST_ADDRESS_9],
- Memory[TEST_ADDRESS_10],
- Memory[TEST_ADDRESS_11],
- Memory[TEST_ADDRESS_12]
- );
- sendto(sock, buffer, strlen(buffer), 0, (SOCKADDR *)&server_addr, sizeof(SOCKADDR));
- }
- }
- }
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char chr;
- char dummy;
- printf("\n");
- printf("Microprocessor Emulator\n");
- printf("UWE Computer and Network Systems Assignment 1\n");
- printf("\n");
- initialise_filenames();
- if (WSAStartup(MAKEWORD(2, 2), &data) != 0) return(0);
- sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Here we create our socket, which will be a UDP socket (SOCK_DGRAM).
- if (!sock) {
- // Creation failed!
- }
- memset(&server_addr, 0, sizeof(SOCKADDR_IN));
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = inet_addr(IP_ADDRESS_SERVER);
- server_addr.sin_port = htons(PORT_SERVER);
- memset(&client_addr, 0, sizeof(SOCKADDR_IN));
- client_addr.sin_family = AF_INET;
- client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- client_addr.sin_port = htons(PORT_CLIENT);
- chr = '\0';
- while ((chr != 'e') && (chr != 'E'))
- {
- printf("\n");
- printf("Please select option\n");
- printf("L - Load and run a hex file\n");
- printf("T - Have the server test and mark your emulator\n");
- printf("E - Exit\n");
- if (argc == 2) { building(argc, argv); exit(0); }
- printf("Enter option: ");
- chr = getchar();
- if (chr != 0x0A)
- {
- dummy = getchar(); // read in the <CR>
- }
- printf("\n");
- switch (chr)
- {
- case 'L':
- case 'l':
- load_and_run(argc, argv);
- break;
- case 'T':
- case 't':
- test_and_mark();
- break;
- default:
- break;
- }
- }
- closesocket(sock);
- WSACleanup();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement