diff options
author | aiju <devnull@localhost> | 2014-09-28 19:41:52 +0200 |
---|---|---|
committer | aiju <devnull@localhost> | 2014-09-28 19:41:52 +0200 |
commit | 752841fcc1831444ba96dc4ff72c58d66b77f958 (patch) | |
tree | 8ef8ab5f18c59a15ac7d0b24c4f04b7fe2eca490 /sys/src/games | |
parent | 15afb9d00b50c5d362ffcb387d7e6e4054192eff (diff) |
games/gba: small fixes
Diffstat (limited to 'sys/src/games')
-rw-r--r-- | sys/src/games/gba/cpu.c | 10 | ||||
-rw-r--r-- | sys/src/games/gba/gba.c | 1 | ||||
-rw-r--r-- | sys/src/games/gba/mem.c | 22 |
3 files changed, 16 insertions, 17 deletions
diff --git a/sys/src/games/gba/cpu.c b/sys/src/games/gba/cpu.c index eb861ab55..3c575abe6 100644 --- a/sys/src/games/gba/cpu.c +++ b/sys/src/games/gba/cpu.c @@ -238,7 +238,7 @@ armextra(u32int instr) addr = r[Rn]; if((instr & 0x0ffffff0) == 0x012fff10){ r[14] = r[15] - 4; - r[15] = r[Rm]; + r[15] = r[Rm] & ~1; setcpsr(cpsr | FLAGT); pipeflush(); }else if((instr & BYTE) != 0){ @@ -253,7 +253,7 @@ armextra(u32int instr) sh = (addr & 3) << 2; val = val >> sh | val << 32 - sh; } - memwrite(addr, r[Rm], 4); + memwrite(addr & ~3, r[Rm], 4); r[Rd] = val; } }else{ @@ -935,7 +935,7 @@ thalu(u16int instr) if(b != 0){ if(b < 32){ c = v >> b - 1; - v >>= b; + v = (int)v >> b; }else c = v = -((int)v < 0); cpsr = cpsr & ~FLAGC | c << 29 & FLAGC; @@ -1084,7 +1084,7 @@ thldst(u16int instr) off += r[Rb]; if(load){ io(); - v = memread(off & ~(size - 1), size, 0); + v = memread(off & -size, size, 0); if(sx) if(size == 2) v = ((int)(v << 16)) >> 16; @@ -1096,7 +1096,7 @@ thldst(u16int instr) } r[Rd] = v; }else - memwrite(off, r[Rd], size); + memwrite(off & -size, r[Rd], size); } static void diff --git a/sys/src/games/gba/gba.c b/sys/src/games/gba/gba.c index f4b187c07..dd417f432 100644 --- a/sys/src/games/gba/gba.c +++ b/sys/src/games/gba/gba.c @@ -283,6 +283,7 @@ keyproc(void *) break; } } + k &= ~(k << 1 & 0xa0 | k >> 1 & 0x50); keys = k; } diff --git a/sys/src/games/gba/mem.c b/sys/src/games/gba/mem.c index f4c95f559..9f06414b8 100644 --- a/sys/src/games/gba/mem.c +++ b/sys/src/games/gba/mem.c @@ -128,6 +128,10 @@ regwrite16(u32int a, u16int v) *p &= ~v; setif(0); return; + case IME*2: case IE*2: + *p = v; + setif(0); + return; case BLDALPHA*2: blda = v & 0x1f; if(blda > 16) @@ -142,8 +146,8 @@ regwrite16(u32int a, u16int v) bldy = 16; break; case DMA0CNTH*2: case DMA1CNTH*2: case DMA2CNTH*2: case DMA3CNTH*2: - if((*p & DMAEN) == 0 && (v & DMAEN) != 0){ - i = (a - DMA0CNTH*2) / 12; + i = (a - DMA0CNTH*2) / 12; + if((v & DMAEN) != 0){ if((v >> DMAWHEN & 3) == 0) dmaact |= 1<<i; if(i == 3 && (v >> DMAWHEN & 3) == 3) @@ -151,15 +155,13 @@ regwrite16(u32int a, u16int v) dmar[4*i + DMASRC] = p[-5] | p[-4] << 16; dmar[4*i + DMADST] = p[-3] | p[-2] << 16; dmar[4*i + DMACNT] = p[-1]; - } + }else + dmaact &= ~1<<i; break; case 0x102: case 0x106: case 0x10a: case 0x10e: if((*p & 1<<7) == 0 && (v & 1<<7) != 0) tim[(a-0x102)/4] = p[-1]; break; - case IME*2: case IE*2: - setif(0); - break; case WAITCNT*2: waitst[3] = waitst[7] = ws0[v & 3]; waitst[0] = ws0[v >> 2 & 3]; @@ -196,13 +198,9 @@ regwrite(u32int a, u32int v, int n) regwrite16(a, w); break; default: - if((a & 1) != 0) - sysfatal("unaligned register access"); regwrite16(a, v); break; case 4: - if((a & 1) != 0) - sysfatal("unaligned register access"); regwrite16(a, v); regwrite16(a + 2, v >> 16); break; @@ -277,7 +275,7 @@ memread(u32int a, int n, int seq) return 0; default: fault: - sysfatal("read from %#.8ux (pc=%#.8ux)", a, curpc); + print("read from %#.8ux (pc=%#.8ux)\n", a, curpc); return 0; } } @@ -346,7 +344,7 @@ memwrite(u32int a, u32int v, int n) return; default: fault: - sysfatal("write to %#.8ux, value %#.8ux (pc=%#.8ux)", a, v, curpc); + print("write to %#.8ux, value %#.8ux (pc=%#.8ux)\n", a, v, curpc); } } |