Basic : add back floating numbers (double)

This commit is contained in:
ApfelTeeSaft
2024-10-08 15:23:48 +02:00
parent ae14caefd9
commit b6cab82bf7
3 changed files with 20 additions and 20 deletions
+8 -8
View File
@@ -5,31 +5,31 @@
double evaluateExpression(Z80Emulator& emulator, const std::string& expr) {
std::stringstream ss(expr);
double result = 0;
double num = 0;
double result = 0.0;
double num = 0.0;
char op = '+';
emulator.reset();
ss >> num;
emulator.executeArithmeticInstruction(1, static_cast<int>(num));
emulator.executeArithmeticInstruction(1, num);
while (ss >> op >> num) {
if (op == '+') {
emulator.executeArithmeticInstruction(1, static_cast<int>(num));
emulator.executeArithmeticInstruction(1, num);
}
else if (op == '-') {
emulator.executeArithmeticInstruction(2, static_cast<int>(num));
emulator.executeArithmeticInstruction(2, num);
}
else if (op == '*') {
emulator.executeArithmeticInstruction(3, static_cast<int>(num));
emulator.executeArithmeticInstruction(3, num);
}
else if (op == '/') {
emulator.executeArithmeticInstruction(4, static_cast<int>(num));
emulator.executeArithmeticInstruction(4, num);
}
}
result = emulator.getAccumulator(); // final result from the CPU
result = emulator.getAccumulator();
return result;
}
+7 -8
View File
@@ -6,12 +6,11 @@ Z80Emulator::Z80Emulator() {
}
// Poopy result
int Z80Emulator::getAccumulator() const {
double Z80Emulator::getAccumulator() const {
return regs.a;
}
// Load program into memory
void Z80Emulator::loadProgram(const std::vector<uint8_t>& program, uint16_t startAddress) {
for (size_t i = 0; i < program.size(); ++i) {
memory[startAddress + i] = program[i];
@@ -19,7 +18,6 @@ void Z80Emulator::loadProgram(const std::vector<uint8_t>& program, uint16_t star
regs.pc = startAddress;
}
// Run the emulator
void Z80Emulator::run() {
bool running = true;
while (running) {
@@ -38,7 +36,7 @@ void Z80Emulator::step() {
void Z80Emulator::displayRegisters() const {
std::cout << "PC: " << std::hex << regs.pc << "\n";
std::cout << "SP: " << std::hex << regs.sp << "\n";
std::cout << "A: " << std::hex << (int)regs.a << "\n";
std::cout << "A: " << regs.a << "\n";
std::cout << "B: " << std::hex << (int)regs.b << " C: " << std::hex << (int)regs.c << "\n";
std::cout << "D: " << std::hex << (int)regs.d << " E: " << std::hex << (int)regs.e << "\n";
std::cout << "H: " << std::hex << (int)regs.h << " L: " << std::hex << (int)regs.l << "\n";
@@ -49,12 +47,13 @@ void Z80Emulator::displayRegisters() const {
void Z80Emulator::reset() {
regs.pc = 0x0000;
regs.sp = 0xFFFF;
regs.a = regs.f = regs.b = regs.c = regs.d = regs.e = regs.h = regs.l = 0x00;
memory.resize(MEMORY_SIZE, 0); // Clear mem
regs.a = 0.0;
regs.f = regs.b = regs.c = regs.d = regs.e = regs.h = regs.l = 0x00;
memory.resize(MEMORY_SIZE, 0);
}
// arithmetic operations for the calculator
void Z80Emulator::executeArithmeticInstruction(int operation, int operand) {
void Z80Emulator::executeArithmeticInstruction(int operation, double operand) {
switch (operation) {
case 1: // Add
regs.a += operand;
@@ -102,7 +101,7 @@ void Z80Emulator::executeOpcode(uint8_t opcode) {
break;
case 0xAF: // XOR A (clear A)
regs.a ^= regs.a;
regs.a = 0.0;
break;
case 0xC3: // JP nn (JMP -> nn)
+5 -4
View File
@@ -11,7 +11,7 @@ const int MEMORY_SIZE = 0xFFFF; // 64 KB
struct Z80Registers {
uint16_t pc; // PC (program counter)
uint16_t sp; // Stack pointer
uint8_t a; // Accumulator
double a; // Accumulator
uint8_t f; // Flags
uint8_t b, c; // BC reg pair
uint8_t d, e; // DE reg pair
@@ -28,10 +28,11 @@ public:
void step();
void displayRegisters() const;
void reset();
int getAccumulator() const;
// handle instructions for calculator
void executeArithmeticInstruction(int operation, int operand);
void executeArithmeticInstruction(int operation, double operand);
// getter for accumulator
double getAccumulator() const;
private:
Z80Registers regs;