Advertisement
chocolateimage

chip8 problem

Dec 9th, 2022
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.85 KB | None | 0 0
  1. #include <iostream>
  2. #include "raylib.h"
  3. #include <fstream>
  4.  
  5. const unsigned char FONT[80] = {
  6.     0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
  7.     0x20, 0x60, 0x20, 0x20, 0x70, // 1
  8.     0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
  9.     0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
  10.     0x90, 0x90, 0xF0, 0x10, 0x10, // 4
  11.     0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
  12.     0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
  13.     0xF0, 0x10, 0x20, 0x40, 0x40, // 7
  14.     0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
  15.     0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
  16.     0xF0, 0x90, 0xF0, 0x90, 0x90, // A
  17.     0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
  18.     0xF0, 0x80, 0x80, 0x80, 0xF0, // C
  19.     0xE0, 0x90, 0x90, 0x90, 0xE0, // D
  20.     0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
  21.     0xF0, 0x80, 0xF0, 0x80, 0x80  // F
  22. };
  23.  
  24. bool IsBitSet(unsigned char byte,unsigned char bit) {
  25.     return (byte >> bit) & 1;
  26. }
  27.  
  28. class Chip8 {
  29.     public:
  30.         unsigned char RAM[4096];
  31.         bool Display[64][32];
  32.         int WindowScale = 8;
  33.         unsigned short PC = 512;
  34.         unsigned short IndexRegister = 0;
  35.         unsigned short Stack[128];
  36.         unsigned char DelayTimer = 0;
  37.         unsigned char Sound = 0;
  38.         unsigned char VariableRegisters[16];
  39.         void Init() {
  40.             SetTraceLogLevel(LOG_INFO | LOG_WARNING | LOG_ERROR | LOG_FATAL);
  41.             InitWindow(64 * WindowScale, 32 * WindowScale, "chip8");
  42.             SetTargetFPS(60);
  43.             for (int i = 0; i < 5*16; i++) {
  44.                 int address = i + 0x50;
  45.                 RAM[address] = FONT[i];
  46.             }
  47.         }
  48.         bool LoadROM(std::string filename) {
  49.             std::ifstream romfile;
  50.             romfile.open(filename);
  51.             if (!romfile)
  52.                 return false;
  53.             int index = 0;
  54.             while (!romfile.eof()) {
  55.                 RAM[index + 512] = romfile.get();
  56.                 //printf("%02X ",RAM[index]);
  57.                 index += 1;
  58.             }
  59.             romfile.close();
  60.             return true;
  61.         }
  62.         void FetchDecodeExecute() {
  63.             unsigned char fb = RAM[PC]; // first byte
  64.             unsigned char KIND = ((fb >> 4) & 0xF);
  65.             unsigned char X = ((fb >> 0) & 0xF);
  66.             unsigned char NN = RAM[PC + 1]; // second byte
  67.             unsigned char Y = ((NN >> 4) & 0xF);
  68.             unsigned char N = ((NN >> 0) & 0xF);
  69.             unsigned short instruction = (((unsigned short)fb) << 8) | NN; // opcode
  70.             unsigned short NNN = instruction & 0xFFF;
  71.             std::cout << std::hex << PC;
  72.             std::cout << " (" << std::to_string(PC) << ")";
  73.             std::cout << " | ";
  74.             std::cout << std::hex << IndexRegister;
  75.             std::cout << " (" << std::to_string(IndexRegister) << ")";
  76.             std::cout << " | ";
  77.             std::cout << std::hex << instruction;
  78.             std::cout << " ";
  79.             std::cout << std::hex << (ushort)KIND;
  80.             std::cout << std::hex << (ushort)X;
  81.             std::cout << std::hex << (ushort)Y;
  82.             std::cout << std::hex << (ushort)N;
  83.             std::cout << " ";
  84.             std::cout << std::hex << (ushort)NN;
  85.             std::cout << " ";
  86.             std::cout << std::hex << (ushort)NNN;
  87.             std::cout << std::endl;
  88.             PC += 2;
  89.  
  90.             if (instruction == 0x00E0) {
  91.                 std::cout << "CLEAR GONE 0x00E0" << std::endl;
  92.                 for (int i = 0; i < 64; i++) {
  93.                     for (int j = 0; j < 32; j++) {
  94.                         Display[i][j] = false;
  95.                     }
  96.                 }
  97.                 DrawScreen();
  98.             } else if (KIND == 0x1) {
  99.                 PC = NNN;
  100.             } else if (KIND == 0x6) {
  101.                 VariableRegisters[X] = NN;
  102.             } else if (KIND == 0x7) {
  103.                 VariableRegisters[X] += NN;
  104.             } else if (KIND == 0xA) {
  105.                 IndexRegister = NNN;
  106.             } else if (KIND == 0xD) {
  107.                 unsigned char x = VariableRegisters[X] & 63;
  108.                 unsigned char y = VariableRegisters[Y] & 31;
  109.                 VariableRegisters[X] = x;
  110.                 VariableRegisters[Y] = y;
  111.                 VariableRegisters[0xF] = 0;
  112.                 for (ushort i = 0; i < N; i++) {
  113.                     x = VariableRegisters[X];
  114.                     unsigned char row = RAM[IndexRegister + i];
  115.                     std::cout << "row ";
  116.                     for (int j = 0; j < 8; j++) {
  117.                         if (IsBitSet(row,j)) {
  118.                             std::cout << "1";
  119.                             if (Display[x][y]) {
  120.                                 Display[x][y] = false;
  121.                                 VariableRegisters[0xF] = 1;
  122.                             } else {
  123.                                 Display[x][y] = true;
  124.                             }
  125.                         } else {
  126.                             std::cout << "0";
  127.                         }
  128.                         x += 1;
  129.                         if (x == 63)
  130.                             break;
  131.                     }
  132.                     std::cout << std::endl;
  133.                     y += 1;
  134.                     if (y == 31)
  135.                         break;
  136.                 }
  137.                 DrawScreen();
  138.                 std::cin.get();
  139.             } else if (KIND == 0x3) {
  140.                 if (VariableRegisters[X] == NN) {
  141.                     PC += 2;
  142.                 }
  143.             } else if (KIND == 0x4) {
  144.                 if (VariableRegisters[X] != NN) {
  145.                     PC += 2;
  146.                 }
  147.             } else if (KIND == 0x5) {
  148.                 if (VariableRegisters[X] == VariableRegisters[Y]) {
  149.                     PC += 2;
  150.                 }
  151.             } else if (KIND == 0x9) {
  152.                 if (VariableRegisters[X] != VariableRegisters[Y]) {
  153.                     PC += 2;
  154.                 }
  155.             } else {
  156.                 std::cout << "INVALID!!!" << std::endl;
  157.             }
  158.         }
  159.         void DrawScreen() {
  160.             BeginDrawing();
  161.             ClearBackground(BLACK);
  162.             for (int i = 0; i < 64; i++) {
  163.                 for (int j = 0; j < 32; j++) {
  164.                     if (Display[i][j]) {
  165.                         DrawRectangle(i * WindowScale,j * WindowScale,WindowScale,WindowScale,WHITE);
  166.                     }
  167.                 }
  168.             }
  169.             EndDrawing();
  170.         }
  171.         bool Update() {
  172.             FetchDecodeExecute();
  173.             BeginDrawing();
  174.             EndDrawing();
  175.             return !WindowShouldClose();
  176.         }
  177.         ~Chip8() {
  178.             CloseWindow();
  179.         }
  180. };
  181.  
  182. int main() {
  183.     std::cout << std::endl;
  184.     std::cout << "CHIP 8 Emulator" << std::endl;
  185.     Chip8* chip = new Chip8();
  186.     chip->Init();
  187.     chip->LoadROM("bin/IBM Logo.ch8");
  188.     while (chip->Update()) {
  189.  
  190.     }
  191.     std::cout << std::endl;
  192.     std::cout << "Stopping" << std::endl;
  193.     delete chip;
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement