diff options
-rw-r--r-- | sys/src/games/gb/dat.h | 5 | ||||
-rw-r--r-- | sys/src/games/gb/gb.c | 2 | ||||
-rw-r--r-- | sys/src/games/gb/mem.c | 23 | ||||
-rw-r--r-- | sys/src/games/gb/ppu.c | 4 |
4 files changed, 21 insertions, 13 deletions
diff --git a/sys/src/games/gb/dat.h b/sys/src/games/gb/dat.h index 68c03372c..890856663 100644 --- a/sys/src/games/gb/dat.h +++ b/sys/src/games/gb/dat.h @@ -8,7 +8,7 @@ extern MBC3Timer timer; extern uchar vram[16384]; extern int nrom, nback, nbackbank; extern u32int pal[64]; -extern s8int dma; +extern u8int dma; extern u32int divclock; extern Event *elist; @@ -113,6 +113,9 @@ enum { FEATRAM = 1, FEATBAT = 2, FEATTIM = 4, + + DMAREADY = 1, + DMAHBLANK = 2, INIT = -1, SAVE = -2, diff --git a/sys/src/games/gb/gb.c b/sys/src/games/gb/gb.c index 5e038ddf4..0c1119bb1 100644 --- a/sys/src/games/gb/gb.c +++ b/sys/src/games/gb/gb.c @@ -308,7 +308,7 @@ threadmain(int argc, char **argv) qlock(&pauselock); qunlock(&pauselock); } - if(dma > 0) + if(dma & DMAREADY) t = dmastep(); else t = step(); diff --git a/sys/src/games/gb/mem.c b/sys/src/games/gb/mem.c index 9098dbe18..05e4754ea 100644 --- a/sys/src/games/gb/mem.c +++ b/sys/src/games/gb/mem.c @@ -15,7 +15,7 @@ int nrom, nback, nbackbank; u32int divclock; int prish; MBC3Timer timer, timerl; -s8int dma; +u8int dma; u32int white; u32int moncols[4]; @@ -175,7 +175,14 @@ regwrite(u8int a, u8int v) case HDMAC: if((mode & COL) == 0) goto ff; - dma = (v & 0x80) != 0 ? -1 : 1; + if(v & 0x80){ + v &= 0x7f; + dma = DMAHBLANK; + }else if(dma){ + v |= 0x80; + dma = 0; + }else + dma = DMAREADY; break; case NR10: v |= 0x80; goto snd; case NR14: case NR24: v |= 0x38; goto snd; @@ -534,6 +541,7 @@ meminit(void) reg[VBK] = 0xfe; reg[SVBK] = 0xf8; reg[IF] = 0xe0; + reg[HDMAC] = 0xff; } void @@ -572,7 +580,7 @@ dmastep(void) { int i; u16int sa, da; - + sa = (reg[HDMASL] | reg[HDMASH] << 8) & 0xfff0; da = (reg[HDMADL] | reg[HDMADH] << 8) & 0x1ff0 | 0x8000; for(i = 0; i < 16; i++) @@ -583,12 +591,9 @@ dmastep(void) reg[HDMADL] += 16; if((reg[HDMADL] & 0xf0) == 0) reg[HDMADH]++; - if((reg[HDMAC] & 0x7f) == 0) + if(--reg[HDMAC] == 0xff) dma = 0; - else{ - reg[HDMAC]--; - if((reg[HDMAC] & 0x80) != 0) - dma = 1; - } + else if(dma & DMAHBLANK) + dma &= ~DMAREADY; return 64; } diff --git a/sys/src/games/gb/ppu.c b/sys/src/games/gb/ppu.c index f24e9db81..9043420eb 100644 --- a/sys/src/games/gb/ppu.c +++ b/sys/src/games/gb/ppu.c @@ -338,8 +338,8 @@ hblanktick(void *) reg[IF] |= IRQLCDS; t = hblclock + 456 * 2 - clock; addevent(&evhblank, t < 0 ? 456 * 2 : t); - if(dma < 0) - dma = 1; + if(dma & DMAHBLANK) + dma |= DMAREADY; break; } } |