mirror of
https://github.com/ApfelTeeSaft/Z80-Emu.git
synced 2026-08-26 19:43:28 +00:00
Basic : add back floating numbers (double)
This commit is contained in:
+8
-8
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user