Skip to content

Instantly share code, notes, and snippets.

@pikhq
Created April 20, 2013 04:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pikhq/5424802 to your computer and use it in GitHub Desktop.
Save pikhq/5424802 to your computer and use it in GitHub Desktop.
A quick Chip8 disassembler using Octo mnemonics.
#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