Skip to content

Commit

Permalink
make pattern sampling safer & more debuggable
Browse files Browse the repository at this point in the history
  • Loading branch information
erisdev committed Jan 2, 2017
1 parent e05bd15 commit 08d8f95
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 16 deletions.
19 changes: 15 additions & 4 deletions memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <stdbool.h>
#include <stdlib.h>

static const char JUNK[] = "DUMPSTERDIVEMOTHER666";

// COMMON

void origin_mem_fin(OriginMemSlot *slot) {
Expand Down Expand Up @@ -40,6 +42,15 @@ uint16_t origin_mem_size(OriginMemSlot *slot) {
return 0;
}

uint8_t origin_mem_read(OriginMemSlot *slot, uint16_t addr) {
return slot->read(slot, addr);
}

void origin_mem_write(OriginMemSlot *slot, uint16_t addr, uint8_t data) {
if (slot->write)
slot->write(slot, addr, data);
}

// FIXED

static uint8_t _read_fixed(OriginMemSlot *slot, uint16_t addr) {
Expand Down Expand Up @@ -81,7 +92,7 @@ static uint8_t _read_banked(OriginMemSlot *slot, uint16_t addr) {
if (offset < slot->banked.bank->size)
return slot->banked.bank->bytes[offset];
}
return 0xFF;
return JUNK[addr & sizeof(JUNK)];
}

static void _write_banked(OriginMemSlot *slot, uint16_t addr, uint8_t data) {
Expand Down Expand Up @@ -146,7 +157,7 @@ uint8_t origin_read8(Origin *emu, uint16_t addr) {
if (slot)
return slot->read(slot, addr);
else
return 0xFF;
return JUNK[addr & sizeof(JUNK)];
}

void origin_write8(Origin *emu, uint16_t addr, uint8_t data) {
Expand All @@ -163,7 +174,7 @@ uint16_t origin_read16(Origin *emu, uint16_t addr) {
if (slot)
l = slot->read(slot, addr);
else
l = 0xFF;
l = JUNK[addr & sizeof(JUNK)];

++addr;
if (!_inrange(addr, slot))
Expand All @@ -172,7 +183,7 @@ uint16_t origin_read16(Origin *emu, uint16_t addr) {
if (slot)
h = slot->read(slot, addr);
else
h = 0xFF;
h = JUNK[addr & sizeof(JUNK)];

return (h << 8) | l;
}
Expand Down
2 changes: 2 additions & 0 deletions vg8m.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ void origin_mem_init_ram(OriginMemSlot *slot, uint16_t addr, uint16_t size);
void origin_mem_init_rom(OriginMemSlot *slot, uint16_t addr, uint16_t size);
void origin_mem_init_banked(OriginMemSlot *slot, uint16_t addr, uint16_t size);

uint8_t origin_mem_read(OriginMemSlot *slot, uint16_t addr);
void origin_mem_write(OriginMemSlot *slot, uint16_t addr, uint8_t data);
bool origin_mem_set_bank(OriginMemSlot *slot, OriginMemBank *bank);

void origin_bank_init(OriginMemBank *bank, uint16_t size, bool writable);
Expand Down
24 changes: 12 additions & 12 deletions video.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,39 +52,39 @@ struct sprite {
uint16_t pat_name;
};

static inline uint8_t sample_1bpp(uint8_t *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
static inline uint8_t sample_1bpp(OriginMemSlot *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
if (!flip_x) x = 7 - x;
if ( flip_y) y = 7 - y;

uint8_t b0 = pat[addr + y];
uint8_t b0 = origin_mem_read(pat, addr + y);

return b0 >> x & 1;
}

static inline uint8_t sample_2bpp(uint8_t *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
static inline uint8_t sample_2bpp(OriginMemSlot *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
if (!flip_x) x = 7 - x;
if ( flip_y) y = 7 - y;

uint8_t b0 = pat[addr + y * 2];
uint8_t b1 = pat[addr + y * 2 + 1];
uint8_t b0 = origin_mem_read(pat, addr + y * 2);
uint8_t b1 = origin_mem_read(pat, addr + y * 2 + 1);

return (b0 >> x & 1) | (b1 << 1 >> x & 2);
}

static inline uint8_t sample_3bpp(uint8_t *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
static inline uint8_t sample_3bpp(OriginMemSlot *pat, uint16_t addr, bool flip_x, bool flip_y, uint8_t x, uint8_t y) {
if (!flip_x) x = 7 - x;
if ( flip_y) y = 7 - y;

uint8_t b0 = pat[addr + y * 2];
uint8_t b1 = pat[addr + y * 2 + 1];
uint8_t b2 = pat[addr + y + 16];
uint8_t b0 = origin_mem_read(pat, addr + y * 2);
uint8_t b1 = origin_mem_read(pat, addr + y * 2 + 1);
uint8_t b2 = origin_mem_read(pat, addr + y + 16);

return (b0 >> x & 1) | (b1 << 1 >> x & 2) | (b2 << 2 >> x & 4);
}

static inline void scan_map(Origin *emu, int y, uint32_t *pixels) {
OriginRegisters *regs = &emu->hwregs;
uint8_t *pat = origin_mem_bytes(&emu->pat_bg);
OriginMemSlot *pat = &emu->pat_bg;

if (!pat) return;

Expand Down Expand Up @@ -112,7 +112,7 @@ static inline void scan_map(Origin *emu, int y, uint32_t *pixels) {

static inline void scan_spr(Origin *emu, int y, uint32_t *pixels) {
OriginRegisters *regs = &emu->hwregs;
uint8_t *pat = origin_mem_bytes(&emu->pat_spr);
OriginMemSlot *pat = &emu->pat_spr;

if (!pat) return;

Expand Down Expand Up @@ -177,7 +177,7 @@ static inline void scan_spr(Origin *emu, int y, uint32_t *pixels) {

void scan_txt(Origin *emu, int y, uint32_t *pixels) {
OriginRegisters *regs = &emu->hwregs;
uint8_t *pat = origin_mem_bytes(&emu->pat_txt);
OriginMemSlot *pat = &emu->pat_txt;

if (!pat) return;

Expand Down

0 comments on commit 08d8f95

Please sign in to comment.