adds more test roms

adds list of test roms and ability to load as desired
passes the Corax+ opcode test now
This commit is contained in:
tmerritt committed 2024-10-09 11:04:44 -04:00
1 parent 6fe644ef46
commit 067164c657
12 files changed
+273 -237

No files matched your search

+2 -2
View File
@@ -118,8 +118,8 @@
<body>
<div id="root"></div>
<script>
var data = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_constants.rs"],"content":"\npub const CHIP8_MEMORY_SIZE: u16 = 0x1000;\npub const CHIP8_MEMORY_SIZE_USIZE: usize = 0x1000;\n\npub const FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];\npub const FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];\npub const FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];\npub const FONT_3: [u8; 5] = [0xF0, 0x10, 0xF0, 0x10, 0xF0];\npub const FONT_4: [u8; 5] = [0x90, 0x90, 0xF0, 0x10, 0x10];\npub const FONT_5: [u8; 5] = [0xF0, 0x80, 0xF0, 0x10, 0xF0];\npub const FONT_6: [u8; 5] = [0xF0, 0x80, 0xF0, 0x90, 0xF0];\npub const FONT_7: [u8; 5] = [0xF0, 0x10, 0x20, 0x40, 0x40];\npub const FONT_8: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0xF0];\npub const FONT_9: [u8; 5] = [0xF0, 0x90, 0xF0, 0x10, 0xF0];\npub const FONT_A: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0x90];\npub const FONT_B: [u8; 5] = [0xE0, 0x90, 0xE0, 0x90, 0xE0];\npub const FONT_C: [u8; 5] = [0xF0, 0x80, 0x80, 0x80, 0xF0];\npub const FONT_D: [u8; 5] = [0xE0, 0x90, 0x90, 0x90, 0xE0];\npub const FONT_E: [u8; 5] = [0xF0, 0x80, 0xF0, 0x80, 0xF0];\npub const FONT_F: [u8; 5] = [0xF0, 0x80, 0xf0, 0x80, 0x80];\n\n","traces":[],"covered":0,"coverable":0},{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_mnemonics.rs"],"content":"use bitmask::bitmask;\n\nuse crate::{chip8_constants::CHIP8_MEMORY_SIZE, parts::Display::Chip8Display};\n\nenum Chip8StartOffset {\n STANDARD,\n ETI600,\n OTHER,\n}\n\nstruct Chip8Registers {\n V: [u8; 16],\n I: u16,\n DelayTimer: u16,\n SoundTimer: u16,\n StackPointer: u8,\n ProgramCounter: u16,\n}\n\nimpl Default for Chip8Registers {\n fn default() -\u003e Self {\n Chip8Registers {\n DelayTimer: 60,\n V: [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00,\n ],\n I: 0x00,\n SoundTimer: 60,\n StackPointer: 255,\n ProgramCounter: 0x200,\n }\n }\n}\n\nenum Chip8Instruction {\n SYS(u16),\n CLS,\n RET,\n JMP(u16),\n CALL(u16),\n SNEQ(u8, u16),\n SNNE(u8, u8),\n SNRE(u8, u8),\n STOR(u8, u16),\n ADD(u8, u16),\n MOV(u8, u8),\n OR(u8, u8),\n AND(u8, u8),\n XOR(u8, u8),\n ADC(u8, u8),\n SBC(u8, u8),\n RSR(u8, u8),\n LSR(u8, u8),\n SNE(u8, u8),\n STO(i16),\n JMPI(u16),\n RND(u8, u8),\n SETD(u8),\n SETT(u8),\n BCD(u8),\n}\n\nenum Chip8Keys {\n KEY0,\n KEY1,\n KEY2,\n KEY3,\n KEY4,\n KEY5,\n KEY6,\n KEY7,\n KEY8,\n KEY9,\n KEYA,\n KEYB,\n KEYC,\n KEYD,\n KEYE,\n KEYF,\n}\n\npub fn display_video_memory(system_memory: [u8; CHIP8_MEMORY_SIZE as usize]) {\n // Assumes memory addresses from\n}\n\nconst ZERO: u16 = 0b0000000000000000;\nconst BOTTOM_BYTE: u16 = 0b0000000011111111;\nconst TOP_BYTE: u16 = 0b1111111100000000;\nconst NIBBLE0: u16 = 0b1111000000000000;\nconst NIBBLE1: u16 = 0b0000111100000000;\nconst NIBBLE2: u16 = 0b0000000011110000;\nconst NIBBLE3: u16 = 0b0000000000001111;\nconst NIBBLE0_BALANCE: u16 = 0x0FFF;\nconst PMSK_0000: i16 = 0x0000;\nconst PMSK_00X0: i16 = 0x00F0;\nconst PMSK_0X00: i16 = 0x0F00;\nconst PMSK_0XXX: i16 = 0x0FFF;\n\n// AND against the possible operand to find which one we have\nbitmask! {\n mask Chip8Instructions: u16 where flags Chip8InstructionFlags {\n SYS = 0x00,\n CLR = 0b0000000011100000,\n RTS = 0b0000000011101110,\n JUMP = 0b0001000000000000,\n CALL = 0b0010000000000000,\n SKE = 0b0011000000000000,\n SKNE = 0b0100000000000000,\n SKRE = 0b0101000000000000,\n LOAD = 0b0110000000000000,\n ADD = 0b0111000000000000,\n MOVE = 0b1000000000000000,\n OR = 0b1000000000000001,\n AND = 0b1000000000000010,\n XOR = 0b1000000000000011,\n ADDR = 0b1000000000000100,\n SUB = 0b1000000000000101,\n SHR = 0b1000000000000110,\n SHL = 0b1000000000001110,\n SKRNE = 0b1001000000000000,\n LOADI = 0b1010000000000000,\n JUMPI = 0b1011000000000000,\n RAND = 0b1100000000000000,\n DRAW = 0b1101000000000000,\n SKPR = 0b1110000000001110,\n SKUP = 0b1111000010100001,\n MOVED = 0b1111000000000111, \n KEYD = 0b1111000000001010, \n LOADD = 0b1111000000010101, \n LOADS = 0b1111000000011000, \n ADDI = 0b1111000000011110, \n LDSPR = 0b1111000000101001, \n BCD = 0b1111000000110011, \n STOR = 0b1111000001010101, \n MEMCPY = 0b1111000001100101 \n }\n}\n\nenum Chip8Asm {\n SYS(u16),\n CLR(),\n RTS(),\n JUMP(u16),\n CALL(u16),\n SKE(Line truncated
var previousData = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_constants.rs"],"content":"\npub const CHIP8_MEMORY_SIZE: u16 = 0x1000;\npub const CHIP8_MEMORY_SIZE_USIZE: usize = 0x1000;\n\npub const FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];\npub const FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];\npub const FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];\npub const FONT_3: [u8; 5] = [0xF0, 0x10, 0xF0, 0x10, 0xF0];\npub const FONT_4: [u8; 5] = [0x90, 0x90, 0xF0, 0x10, 0x10];\npub const FONT_5: [u8; 5] = [0xF0, 0x80, 0xF0, 0x10, 0xF0];\npub const FONT_6: [u8; 5] = [0xF0, 0x80, 0xF0, 0x90, 0xF0];\npub const FONT_7: [u8; 5] = [0xF0, 0x10, 0x20, 0x40, 0x40];\npub const FONT_8: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0xF0];\npub const FONT_9: [u8; 5] = [0xF0, 0x90, 0xF0, 0x10, 0xF0];\npub const FONT_A: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0x90];\npub const FONT_B: [u8; 5] = [0xE0, 0x90, 0xE0, 0x90, 0xE0];\npub const FONT_C: [u8; 5] = [0xF0, 0x80, 0x80, 0x80, 0xF0];\npub const FONT_D: [u8; 5] = [0xE0, 0x90, 0x90, 0x90, 0xE0];\npub const FONT_E: [u8; 5] = [0xF0, 0x80, 0xF0, 0x80, 0xF0];\npub const FONT_F: [u8; 5] = [0xF0, 0x80, 0xf0, 0x80, 0x80];\n\n","traces":[],"covered":0,"coverable":0},{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_mnemonics.rs"],"content":"use bitmask::bitmask;\n\nuse crate::{chip8_constants::CHIP8_MEMORY_SIZE, parts::Display::Chip8Display};\n\nenum Chip8StartOffset {\n STANDARD,\n ETI600,\n OTHER,\n}\n\nstruct Chip8Registers {\n V: [u8; 16],\n I: u16,\n DelayTimer: u16,\n SoundTimer: u16,\n StackPointer: u8,\n ProgramCounter: u16,\n}\n\nimpl Default for Chip8Registers {\n fn default() -\u003e Self {\n Chip8Registers {\n DelayTimer: 60,\n V: [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00,\n ],\n I: 0x00,\n SoundTimer: 60,\n StackPointer: 255,\n ProgramCounter: 0x200,\n }\n }\n}\n\nenum Chip8Instruction {\n SYS(u16),\n CLS,\n RET,\n JMP(u16),\n CALL(u16),\n SNEQ(u8, u16),\n SNNE(u8, u8),\n SNRE(u8, u8),\n STOR(u8, u16),\n ADD(u8, u16),\n MOV(u8, u8),\n OR(u8, u8),\n AND(u8, u8),\n XOR(u8, u8),\n ADC(u8, u8),\n SBC(u8, u8),\n RSR(u8, u8),\n LSR(u8, u8),\n SNE(u8, u8),\n STO(i16),\n JMPI(u16),\n RND(u8, u8),\n SETD(u8),\n SETT(u8),\n BCD(u8),\n}\n\nenum Chip8Keys {\n KEY0,\n KEY1,\n KEY2,\n KEY3,\n KEY4,\n KEY5,\n KEY6,\n KEY7,\n KEY8,\n KEY9,\n KEYA,\n KEYB,\n KEYC,\n KEYD,\n KEYE,\n KEYF,\n}\n\npub fn display_video_memory(system_memory: [u8; CHIP8_MEMORY_SIZE as usize]) {\n // Assumes memory addresses from\n}\n\nconst ZERO: u16 = 0b0000000000000000;\nconst BOTTOM_BYTE: u16 = 0b0000000011111111;\nconst TOP_BYTE: u16 = 0b1111111100000000;\nconst NIBBLE0: u16 = 0b1111000000000000;\nconst NIBBLE1: u16 = 0b0000111100000000;\nconst NIBBLE2: u16 = 0b0000000011110000;\nconst NIBBLE3: u16 = 0b0000000000001111;\nconst NIBBLE0_BALANCE: u16 = 0x0FFF;\nconst PMSK_0000: i16 = 0x0000;\nconst PMSK_00X0: i16 = 0x00F0;\nconst PMSK_0X00: i16 = 0x0F00;\nconst PMSK_0XXX: i16 = 0x0FFF;\n\n// AND against the possible operand to find which one we have\nbitmask! {\n mask Chip8Instructions: u16 where flags Chip8InstructionFlags {\n SYS = 0x00,\n CLR = 0b0000000011100000,\n RTS = 0b0000000011101110,\n JUMP = 0b0001000000000000,\n CALL = 0b0010000000000000,\n SKE = 0b0011000000000000,\n SKNE = 0b0100000000000000,\n SKRE = 0b0101000000000000,\n LOAD = 0b0110000000000000,\n ADD = 0b0111000000000000,\n MOVE = 0b1000000000000000,\n OR = 0b1000000000000001,\n AND = 0b1000000000000010,\n XOR = 0b1000000000000011,\n ADDR = 0b1000000000000100,\n SUB = 0b1000000000000101,\n SHR = 0b1000000000000110,\n SHL = 0b1000000000001110,\n SKRNE = 0b1001000000000000,\n LOADI = 0b1010000000000000,\n JUMPI = 0b1011000000000000,\n RAND = 0b1100000000000000,\n DRAW = 0b1101000000000000,\n SKPR = 0b1110000000001110,\n SKUP = 0b1111000010100001,\n MOVED = 0b1111000000000111, \n KEYD = 0b1111000000001010, \n LOADD = 0b1111000000010101, \n LOADS = 0b1111000000011000, \n ADDI = 0b1111000000011110, \n LDSPR = 0b1111000000101001, \n BCD = 0b1111000000110011, \n STOR = 0b1111000001010101, \n MEMCPY = 0b1111000001100101 \n }\n}\n\nenum Chip8Asm {\n SYS(u16),\n CLR(),\n RTS(),\n JUMP(u16),\n CALL(u16),\nLine truncated
var data = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_constants.rs"],"content":"\npub const CHIP8_MEMORY_SIZE: u16 = 0x1000;\npub const CHIP8_MEMORY_SIZE_USIZE: usize = 0x1000;\n\npub const FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];\npub const FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];\npub const FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];\npub const FONT_3: [u8; 5] = [0xF0, 0x10, 0xF0, 0x10, 0xF0];\npub const FONT_4: [u8; 5] = [0x90, 0x90, 0xF0, 0x10, 0x10];\npub const FONT_5: [u8; 5] = [0xF0, 0x80, 0xF0, 0x10, 0xF0];\npub const FONT_6: [u8; 5] = [0xF0, 0x80, 0xF0, 0x90, 0xF0];\npub const FONT_7: [u8; 5] = [0xF0, 0x10, 0x20, 0x40, 0x40];\npub const FONT_8: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0xF0];\npub const FONT_9: [u8; 5] = [0xF0, 0x90, 0xF0, 0x10, 0xF0];\npub const FONT_A: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0x90];\npub const FONT_B: [u8; 5] = [0xE0, 0x90, 0xE0, 0x90, 0xE0];\npub const FONT_C: [u8; 5] = [0xF0, 0x80, 0x80, 0x80, 0xF0];\npub const FONT_D: [u8; 5] = [0xE0, 0x90, 0x90, 0x90, 0xE0];\npub const FONT_E: [u8; 5] = [0xF0, 0x80, 0xF0, 0x80, 0xF0];\npub const FONT_F: [u8; 5] = [0xF0, 0x80, 0xf0, 0x80, 0x80];\n\n","traces":[],"covered":0,"coverable":0},{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_mnemonics.rs"],"content":"use bitmask::bitmask;\n\nuse crate::{chip8_constants::CHIP8_MEMORY_SIZE, parts::Display::Chip8Display};\n\nenum Chip8StartOffset {\n STANDARD,\n ETI600,\n OTHER,\n}\n\nstruct Chip8Registers {\n V: [u8; 16],\n I: u16,\n DelayTimer: u16,\n SoundTimer: u16,\n StackPointer: u8,\n ProgramCounter: u16,\n}\n\nimpl Default for Chip8Registers {\n fn default() -\u003e Self {\n Chip8Registers {\n DelayTimer: 60,\n V: [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00,\n ],\n I: 0x00,\n SoundTimer: 60,\n StackPointer: 255,\n ProgramCounter: 0x200,\n }\n }\n}\n\nenum Chip8Instruction {\n SYS(u16),\n CLS,\n RET,\n JMP(u16),\n CALL(u16),\n SNEQ(u8, u16),\n SNNE(u8, u8),\n SNRE(u8, u8),\n STOR(u8, u16),\n ADD(u8, u16),\n MOV(u8, u8),\n OR(u8, u8),\n AND(u8, u8),\n XOR(u8, u8),\n ADC(u8, u8),\n SBC(u8, u8),\n RSR(u8, u8),\n LSR(u8, u8),\n SNE(u8, u8),\n STO(i16),\n JMPI(u16),\n RND(u8, u8),\n SETD(u8),\n SETT(u8),\n BCD(u8),\n}\n\nenum Chip8Keys {\n KEY0,\n KEY1,\n KEY2,\n KEY3,\n KEY4,\n KEY5,\n KEY6,\n KEY7,\n KEY8,\n KEY9,\n KEYA,\n KEYB,\n KEYC,\n KEYD,\n KEYE,\n KEYF,\n}\n\npub fn display_video_memory(system_memory: [u8; CHIP8_MEMORY_SIZE as usize]) {\n // Assumes memory addresses from\n}\n\nconst ZERO: u16 = 0b0000000000000000;\nconst BOTTOM_BYTE: u16 = 0b0000000011111111;\nconst TOP_BYTE: u16 = 0b1111111100000000;\nconst NIBBLE0: u16 = 0b1111000000000000;\nconst NIBBLE1: u16 = 0b0000111100000000;\nconst NIBBLE2: u16 = 0b0000000011110000;\nconst NIBBLE3: u16 = 0b0000000000001111;\nconst NIBBLE0_BALANCE: u16 = 0x0FFF;\nconst PMSK_0000: i16 = 0x0000;\nconst PMSK_00X0: i16 = 0x00F0;\nconst PMSK_0X00: i16 = 0x0F00;\nconst PMSK_0XXX: i16 = 0x0FFF;\n\n// AND against the possible operand to find which one we have\nbitmask! {\n mask Chip8Instructions: u16 where flags Chip8InstructionFlags {\n SYS = 0x00,\n CLR = 0b0000000011100000,\n RTS = 0b0000000011101110,\n JUMP = 0b0001000000000000,\n CALL = 0b0010000000000000,\n SKE = 0b0011000000000000,\n SKNE = 0b0100000000000000,\n SKRE = 0b0101000000000000,\n LOAD = 0b0110000000000000,\n ADD = 0b0111000000000000,\n MOVE = 0b1000000000000000,\n OR = 0b1000000000000001,\n AND = 0b1000000000000010,\n XOR = 0b1000000000000011,\n ADDR = 0b1000000000000100,\n SUB = 0b1000000000000101,\n SHR = 0b1000000000000110,\n SHL = 0b1000000000001110,\n SKRNE = 0b1001000000000000,\n LOADI = 0b1010000000000000,\n JUMPI = 0b1011000000000000,\n RAND = 0b1100000000000000,\n DRAW = 0b1101000000000000,\n SKPR = 0b1110000000001110,\n SKUP = 0b1111000010100001,\n MOVED = 0b1111000000000111, \n KEYD = 0b1111000000001010, \n LOADD = 0b1111000000010101, \n LOADS = 0b1111000000011000, \n ADDI = 0b1111000000011110, \n LDSPR = 0b1111000000101001, \n BCD = 0b1111000000110011, \n STOR = 0b1111000001010101, \n MEMCPY = 0b1111000001100101 \n }\n}\n\nenum Chip8Asm {\n SYS(u16),\n CLR(),\n RTS(),\n JUMP(u16),\n CALL(u16),\n SKE(Line truncated
var previousData = {"files":[{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_constants.rs"],"content":"\npub const CHIP8_MEMORY_SIZE: u16 = 0x1000;\npub const CHIP8_MEMORY_SIZE_USIZE: usize = 0x1000;\n\npub const FONT_0: [u8; 5] = [0xF0, 0x90, 0x90, 0x90, 0xF0];\npub const FONT_1: [u8; 5] = [0x20, 0x60, 0x20, 0x20, 0x70];\npub const FONT_2: [u8; 5] = [0xF0, 0x10, 0xF0, 0x80, 0xF0];\npub const FONT_3: [u8; 5] = [0xF0, 0x10, 0xF0, 0x10, 0xF0];\npub const FONT_4: [u8; 5] = [0x90, 0x90, 0xF0, 0x10, 0x10];\npub const FONT_5: [u8; 5] = [0xF0, 0x80, 0xF0, 0x10, 0xF0];\npub const FONT_6: [u8; 5] = [0xF0, 0x80, 0xF0, 0x90, 0xF0];\npub const FONT_7: [u8; 5] = [0xF0, 0x10, 0x20, 0x40, 0x40];\npub const FONT_8: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0xF0];\npub const FONT_9: [u8; 5] = [0xF0, 0x90, 0xF0, 0x10, 0xF0];\npub const FONT_A: [u8; 5] = [0xF0, 0x90, 0xF0, 0x90, 0x90];\npub const FONT_B: [u8; 5] = [0xE0, 0x90, 0xE0, 0x90, 0xE0];\npub const FONT_C: [u8; 5] = [0xF0, 0x80, 0x80, 0x80, 0xF0];\npub const FONT_D: [u8; 5] = [0xE0, 0x90, 0x90, 0x90, 0xE0];\npub const FONT_E: [u8; 5] = [0xF0, 0x80, 0xF0, 0x80, 0xF0];\npub const FONT_F: [u8; 5] = [0xF0, 0x80, 0xf0, 0x80, 0x80];\n\n","traces":[],"covered":0,"coverable":0},{"path":["/","home","tmerritt","Projects","chip8_toy","chip8_core","src","chip8_mnemonics.rs"],"content":"use bitmask::bitmask;\n\nuse crate::{chip8_constants::CHIP8_MEMORY_SIZE, parts::Display::Chip8Display};\n\nenum Chip8StartOffset {\n STANDARD,\n ETI600,\n OTHER,\n}\n\nstruct Chip8Registers {\n V: [u8; 16],\n I: u16,\n DelayTimer: u16,\n SoundTimer: u16,\n StackPointer: u8,\n ProgramCounter: u16,\n}\n\nimpl Default for Chip8Registers {\n fn default() -\u003e Self {\n Chip8Registers {\n DelayTimer: 60,\n V: [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00,\n ],\n I: 0x00,\n SoundTimer: 60,\n StackPointer: 255,\n ProgramCounter: 0x200,\n }\n }\n}\n\nenum Chip8Instruction {\n SYS(u16),\n CLS,\n RET,\n JMP(u16),\n CALL(u16),\n SNEQ(u8, u16),\n SNNE(u8, u8),\n SNRE(u8, u8),\n STOR(u8, u16),\n ADD(u8, u16),\n MOV(u8, u8),\n OR(u8, u8),\n AND(u8, u8),\n XOR(u8, u8),\n ADC(u8, u8),\n SBC(u8, u8),\n RSR(u8, u8),\n LSR(u8, u8),\n SNE(u8, u8),\n STO(i16),\n JMPI(u16),\n RND(u8, u8),\n SETD(u8),\n SETT(u8),\n BCD(u8),\n}\n\nenum Chip8Keys {\n KEY0,\n KEY1,\n KEY2,\n KEY3,\n KEY4,\n KEY5,\n KEY6,\n KEY7,\n KEY8,\n KEY9,\n KEYA,\n KEYB,\n KEYC,\n KEYD,\n KEYE,\n KEYF,\n}\n\npub fn display_video_memory(system_memory: [u8; CHIP8_MEMORY_SIZE as usize]) {\n // Assumes memory addresses from\n}\n\nconst ZERO: u16 = 0b0000000000000000;\nconst BOTTOM_BYTE: u16 = 0b0000000011111111;\nconst TOP_BYTE: u16 = 0b1111111100000000;\nconst NIBBLE0: u16 = 0b1111000000000000;\nconst NIBBLE1: u16 = 0b0000111100000000;\nconst NIBBLE2: u16 = 0b0000000011110000;\nconst NIBBLE3: u16 = 0b0000000000001111;\nconst NIBBLE0_BALANCE: u16 = 0x0FFF;\nconst PMSK_0000: i16 = 0x0000;\nconst PMSK_00X0: i16 = 0x00F0;\nconst PMSK_0X00: i16 = 0x0F00;\nconst PMSK_0XXX: i16 = 0x0FFF;\n\n// AND against the possible operand to find which one we have\nbitmask! {\n mask Chip8Instructions: u16 where flags Chip8InstructionFlags {\n SYS = 0x00,\n CLR = 0b0000000011100000,\n RTS = 0b0000000011101110,\n JUMP = 0b0001000000000000,\n CALL = 0b0010000000000000,\n SKE = 0b0011000000000000,\n SKNE = 0b0100000000000000,\n SKRE = 0b0101000000000000,\n LOAD = 0b0110000000000000,\n ADD = 0b0111000000000000,\n MOVE = 0b1000000000000000,\n OR = 0b1000000000000001,\n AND = 0b1000000000000010,\n XOR = 0b1000000000000011,\n ADDR = 0b1000000000000100,\n SUB = 0b1000000000000101,\n SHR = 0b1000000000000110,\n SHL = 0b1000000000001110,\n SKRNE = 0b1001000000000000,\n LOADI = 0b1010000000000000,\n JUMPI = 0b1011000000000000,\n RAND = 0b1100000000000000,\n DRAW = 0b1101000000000000,\n SKPR = 0b1110000000001110,\n SKUP = 0b1111000010100001,\n MOVED = 0b1111000000000111, \n KEYD = 0b1111000000001010, \n LOADD = 0b1111000000010101, \n LOADS = 0b1111000000011000, \n ADDI = 0b1111000000011110, \n LDSPR = 0b1111000000101001, \n BCD = 0b1111000000110011, \n STOR = 0b1111000001010101, \n MEMCPY = 0b1111000001100101 \n }\n}\n\nenum Chip8Asm {\n SYS(u16),\n CLR(),\n RTS(),\n JUMP(u16),\n CALL(u16),\nLine truncated
</script>
<script crossorigin>/** @license React v16.13.1
* react.production.min.js