Created
April 20, 2013 04:51
-
-
Save pikhq/5424802 to your computer and use it in GitHub Desktop.
A quick Chip8 disassembler using Octo mnemonics.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdint.h> | |
#include <stdio.h> | |
int main() | |
{ | |
int addr = 0x200; | |
while(!feof(stdin)) { | |
uint16_t opcode = (unsigned char)getchar() << 8; | |
opcode |= (unsigned char)getchar(); | |
if(feof(stdin)) { break; } | |
uint16_t lit = opcode & 0xfff; | |
uint8_t byte = opcode & 0xff; | |
uint8_t nib0 = (opcode & 0xF000) >> 12; | |
uint8_t nib1 = (opcode & 0x0F00) >> 8; | |
uint8_t nib2 = (opcode & 0xF0) >> 4; | |
uint8_t nib3 = opcode & 0xF; | |
printf("%04x\t%04x\t", addr, opcode); | |
switch(nib0) { | |
case 0x0: | |
switch(lit) { | |
case 0x00E0: | |
printf("cls\n"); break; | |
case 0x00EE: | |
printf("exit\n"); break; | |
default: | |
printf("syscall 0x%x\n", lit); break; | |
} | |
break; | |
case 0x1: | |
printf("jump 0x%x\n", lit); break; | |
case 0x2: | |
printf("call 0x%x\n", lit); break; | |
case 0x3: | |
printf("if v%x != %u then\n", nib1, byte); break; | |
case 0x4: | |
printf("if v%x == %u then\n", nib1, byte); break; | |
case 0x5: | |
if(nib3 == 0) { | |
printf("if v%x != v%x then\n", nib1, nib2); | |
} else { | |
printf("ill\n"); | |
} | |
break; | |
case 0x6: | |
printf("v%x := %u\n", nib1, byte); break; | |
case 0x7: | |
printf("v%x += %u\n", nib1, byte); break; | |
case 0x8: | |
switch(nib3) { | |
case 0x0: | |
printf("v%x := v%x\n", nib1, nib2); break; | |
case 0x1: | |
printf("v%x |= v%x\n", nib1, nib2); break; | |
case 0x2: | |
printf("v%x &= v%x\n", nib1, nib2); break; | |
case 0x3: | |
printf("v%x ^= v%x\n", nib1, nib2); break; | |
case 0x4: | |
printf("v%x += v%x\n", nib1, nib2); break; | |
case 0x5: | |
printf("v%x -= v%x\n", nib1, nib2); break; | |
case 0x6: | |
printf("v%x >> 1 (v%x)\n", nib1, nib2); break; | |
case 0x7: | |
printf("v%x := v%x - v%x\n", nib1, nib2, nib1); break; | |
case 0xE: | |
printf("v%x << 1 (v%x)\n", nib1, nib2); break; | |
default: | |
printf("ill\n"); | |
} | |
break; | |
case 0x9: | |
if(nib3 == 0) { | |
printf("if v%x == v%x then\n", nib1, nib2); | |
} else { | |
printf("ill\n"); | |
} | |
break; | |
case 0xA: | |
printf("a := 0x%x\n", lit); break; | |
case 0xB: | |
printf("jump0 %x\n", lit); break; | |
case 0xC: | |
printf("v%x := rand %x\n", nib1, byte); break; | |
case 0xD: | |
printf("draw v%x v%x %u\n", nib1, nib2, nib3); break; | |
case 0xE: | |
switch(byte) { | |
case 0x9E: | |
printf("if -key v%x then\n", nib1); break; | |
case 0xA1: | |
printf("if key v%x then\n", nib1); break; | |
default: | |
printf("ill\n"); | |
} | |
break; | |
case 0xF: | |
switch(byte) { | |
case 0x07: | |
printf("v%x := dt\n", nib1); break; | |
case 0x0A: | |
printf("v%x := key\n", nib1); break; | |
case 0x15: | |
printf("dt := v%x\n", nib1); break; | |
case 0x18: | |
printf("st := v%x\n", nib1); break; | |
case 0x1E: | |
printf("a += v%x\n", nib1); break; | |
case 0x29: | |
printf("a := hex v%x\n", nib1); break; | |
case 0x33: | |
printf("bcd v%x\n", nib1); break; | |
case 0x55: | |
printf("save v%x\n", nib1); break; | |
case 0x65: | |
printf("load v%x\n", nib1); break; | |
default: | |
printf("ill\n"); | |
} | |
break; | |
} | |
addr += 2; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment