use pkg-config for raylib detection

This commit is contained in:
2026-02-28 16:19:48 +01:00
parent a334740040
commit a92f02ed38
4 changed files with 61 additions and 33 deletions

View File

@@ -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:

View File

@@ -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
View File

@@ -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);

View File

@@ -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);