use pkg-config for raylib detection
This commit is contained in:
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
BSD 2-Clause License
|
BSD 2-Clause License
|
||||||
|
|
||||||
Copyright (c) 2025, Antoni Piasecki
|
Copyright (c) 2025-2026, Antoni Piasecki
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions are met:
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|||||||
19
build.sh
19
build.sh
@@ -1,6 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -xe
|
set -euo pipefail
|
||||||
|
|
||||||
CFLAGS="-Wall -Wextra -Wpedantic -std=c99 -O3"
|
CFLAGS="-Wall -Wextra -Wpedantic -std=c99 -O3"
|
||||||
|
|
||||||
cc $CFLAGS -o chip8 chip8.c -L/usr/local/lib/libraylib.a -lraylib -lm
|
echo "building mos6502..."
|
||||||
cc $CFLAGS -o mos6502 mos6502.c
|
cc $CFLAGS -o mos6502 mos6502.c
|
||||||
|
|
||||||
|
if command -v pkg-config >/dev/null; then
|
||||||
|
RAYLIB_FLAGS=$(pkg-config --cflags --libs raylib 2>/dev/null)
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "building chip8..."
|
||||||
|
cc $CFLAGS -o chip8 chip8.c $RAYLIB_FLAGS
|
||||||
|
else
|
||||||
|
echo "raylib not found - skipping chip8..."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "pkg-config not found - skipping chip8..."
|
||||||
|
fi
|
||||||
25
chip8.c
25
chip8.c
@@ -10,10 +10,10 @@
|
|||||||
uint8_t high = c->memory[c->pc++]; \
|
uint8_t high = c->memory[c->pc++]; \
|
||||||
uint16_t ins = (low << 8) | high; \
|
uint16_t ins = (low << 8) | high; \
|
||||||
uint16_t nnn = ins & 0x0FFF; \
|
uint16_t nnn = ins & 0x0FFF; \
|
||||||
|
uint8_t kk = ins & 0x00FF; \
|
||||||
uint8_t n = ins & 0x000F; \
|
uint8_t n = ins & 0x000F; \
|
||||||
uint8_t x = (ins >> 8) & 0x0F; \
|
uint8_t x = (ins >> 8) & 0x0F; \
|
||||||
uint8_t y = (ins >> 4) & 0x0F; \
|
uint8_t y = (ins >> 4) & 0x0F
|
||||||
uint8_t kk = ins & 0x00FF
|
|
||||||
|
|
||||||
#define BAD_INS() \
|
#define BAD_INS() \
|
||||||
fprintf(stderr, "unrecognized instruction\n"); \
|
fprintf(stderr, "unrecognized instruction\n"); \
|
||||||
@@ -396,15 +396,25 @@ void chip8_free(CHIP8 c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
if (argc < 2) {
|
const char *path = NULL;
|
||||||
fprintf(stderr, "Usage: %s <path>\n", argv[0]);
|
uint8_t disassemble = 0;
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "-d") == 0) {
|
||||||
|
disassemble = 1;
|
||||||
|
} else {
|
||||||
|
path = argv[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path == NULL) {
|
||||||
|
fprintf(stderr, "Usage: %s [-d] <path>\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHIP8 c = chip8_create();
|
CHIP8 c = chip8_create();
|
||||||
|
|
||||||
uint8_t buffer[4000];
|
uint8_t buffer[4000];
|
||||||
FILE *f = fopen(argv[1], "rb");
|
FILE *f = fopen(path, "rb");
|
||||||
size_t n = fread(buffer, 1, 4000, f);
|
size_t n = fread(buffer, 1, 4000, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
@@ -412,6 +422,11 @@ int main(int argc, char *argv[]) {
|
|||||||
c.memory[0x200 + i] = buffer[i];
|
c.memory[0x200 + i] = buffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (disassemble) {
|
||||||
|
chip8_disassemble(&c, n / 2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
InitWindow(640, 320, "CHIP-8");
|
InitWindow(640, 320, "CHIP-8");
|
||||||
SetTargetFPS(60);
|
SetTargetFPS(60);
|
||||||
|
|
||||||
|
|||||||
48
mos6502.c
48
mos6502.c
@@ -911,10 +911,10 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("ORA ($%02X,X)", READ_U8());
|
printf("ORA ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x05: {
|
case 0x05: {
|
||||||
printf("ORA $%02X", READ_U8());
|
printf("ORA $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x06: {
|
case 0x06: {
|
||||||
printf("ASL $%02X", READ_U8());
|
printf("ASL $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x08: {
|
case 0x08: {
|
||||||
printf("PHP\t");
|
printf("PHP\t");
|
||||||
@@ -923,7 +923,7 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("ORA #$%02X\t", READ_U8());
|
printf("ORA #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x0A: {
|
case 0x0A: {
|
||||||
printf("ASL A");
|
printf("ASL A\t");
|
||||||
} break;
|
} break;
|
||||||
case 0x0D: {
|
case 0x0D: {
|
||||||
printf("ORA $%04X", READ_U16());
|
printf("ORA $%04X", READ_U16());
|
||||||
@@ -963,13 +963,13 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("AND ($%02X,X)", READ_U8());
|
printf("AND ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x24: {
|
case 0x24: {
|
||||||
printf("BIT $%02X", READ_U8());
|
printf("BIT $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x25: {
|
case 0x25: {
|
||||||
printf("AND $%02X", READ_U8());
|
printf("AND $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x26: {
|
case 0x26: {
|
||||||
printf("ROL $%02X", READ_U8());
|
printf("ROL $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x28: {
|
case 0x28: {
|
||||||
printf("PLP\t");
|
printf("PLP\t");
|
||||||
@@ -978,7 +978,7 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("AND #$%02X\t", READ_U8());
|
printf("AND #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x2A: {
|
case 0x2A: {
|
||||||
printf("ROL A");
|
printf("ROL A\t");
|
||||||
} break;
|
} break;
|
||||||
case 0x2C: {
|
case 0x2C: {
|
||||||
printf("BIT $%04X", READ_U16());
|
printf("BIT $%04X", READ_U16());
|
||||||
@@ -1021,10 +1021,10 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("EOR ($%02X,X)", READ_U8());
|
printf("EOR ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x45: {
|
case 0x45: {
|
||||||
printf("EOR $%02X", READ_U8());
|
printf("EOR $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x46: {
|
case 0x46: {
|
||||||
printf("LSR $%02X", READ_U8());
|
printf("LSR $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x48: {
|
case 0x48: {
|
||||||
printf("PHA\t");
|
printf("PHA\t");
|
||||||
@@ -1076,10 +1076,10 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("ADC ($%02X,X)", READ_U8());
|
printf("ADC ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x65: {
|
case 0x65: {
|
||||||
printf("ADC $%02X", READ_U8());
|
printf("ADC $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x66: {
|
case 0x66: {
|
||||||
printf("ROR $%02X", READ_U8());
|
printf("ROR $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x68: {
|
case 0x68: {
|
||||||
printf("PLA\t");
|
printf("PLA\t");
|
||||||
@@ -1088,7 +1088,7 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("ADC #$%02X\t", READ_U8());
|
printf("ADC #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0x6A: {
|
case 0x6A: {
|
||||||
printf("ROR A");
|
printf("ROR A\t");
|
||||||
} break;
|
} break;
|
||||||
case 0x6C: {
|
case 0x6C: {
|
||||||
printf("JMP ($%04X)", READ_U16());
|
printf("JMP ($%04X)", READ_U16());
|
||||||
@@ -1189,13 +1189,13 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("LDX #$%02X\t", READ_U8());
|
printf("LDX #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xA4: {
|
case 0xA4: {
|
||||||
printf("LDY $%02X", READ_U8());
|
printf("LDY $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xA5: {
|
case 0xA5: {
|
||||||
printf("LDA $%02X", READ_U8());
|
printf("LDA $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xA6: {
|
case 0xA6: {
|
||||||
printf("LDX $%02X", READ_U8());
|
printf("LDX $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xA8: {
|
case 0xA8: {
|
||||||
printf("TAY\t");
|
printf("TAY\t");
|
||||||
@@ -1250,19 +1250,19 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("LDX $%04X,Y", READ_U16());
|
printf("LDX $%04X,Y", READ_U16());
|
||||||
} break;
|
} break;
|
||||||
case 0xC0: {
|
case 0xC0: {
|
||||||
printf("CPY #$%02X", READ_U8());
|
printf("CPY #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xC1: {
|
case 0xC1: {
|
||||||
printf("CMP ($%02X,X)", READ_U8());
|
printf("CMP ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xC4: {
|
case 0xC4: {
|
||||||
printf("CPY $%02X", READ_U8());
|
printf("CPY $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xC5: {
|
case 0xC5: {
|
||||||
printf("CMP $%02X", READ_U8());
|
printf("CMP $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xC6: {
|
case 0xC6: {
|
||||||
printf("DEC $%02X", READ_U8());
|
printf("DEC $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xC8: {
|
case 0xC8: {
|
||||||
printf("INY\t");
|
printf("INY\t");
|
||||||
@@ -1308,19 +1308,19 @@ void mos6502_disassemble(MOS6502 *m) {
|
|||||||
printf("DEC $%04X,X", READ_U16());
|
printf("DEC $%04X,X", READ_U16());
|
||||||
} break;
|
} break;
|
||||||
case 0xE0: {
|
case 0xE0: {
|
||||||
printf("CPX #$%02X", READ_U8());
|
printf("CPX #$%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xE1: {
|
case 0xE1: {
|
||||||
printf("SBC ($%02X,X)", READ_U8());
|
printf("SBC ($%02X,X)", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xE4: {
|
case 0xE4: {
|
||||||
printf("CPX $%02X", READ_U8());
|
printf("CPX $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xE5: {
|
case 0xE5: {
|
||||||
printf("SBC $%02X", READ_U8());
|
printf("SBC $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xE6: {
|
case 0xE6: {
|
||||||
printf("INC $%02X", READ_U8());
|
printf("INC $%02X\t", READ_U8());
|
||||||
} break;
|
} break;
|
||||||
case 0xE8: {
|
case 0xE8: {
|
||||||
printf("INX\t");
|
printf("INX\t");
|
||||||
@@ -1415,7 +1415,7 @@ int main(int argc, char *argv[]) {
|
|||||||
uint16_t old_pc = m.pc;
|
uint16_t old_pc = m.pc;
|
||||||
mos6502_disassemble(&m);
|
mos6502_disassemble(&m);
|
||||||
m.pc = old_pc;
|
m.pc = old_pc;
|
||||||
printf("\tA: %02X X: %02X Y: %02X\n", m.A, m.X, m.Y);
|
printf("\tA: $%02X X: $%02X Y: $%02X SP: $%02X\n", m.A, m.X, m.Y, m.SP);
|
||||||
}
|
}
|
||||||
|
|
||||||
mos6502_step(&m);
|
mos6502_step(&m);
|
||||||
|
|||||||
Reference in New Issue
Block a user