| ... | ... |
@@ -23,22 +23,22 @@ static void |
| 23 | 23 |
ppu_clear(Ppu *p) |
| 24 | 24 |
{
|
| 25 | 25 |
int i; |
| 26 |
- for(i = 0; i < p->width / 2 * p->height; ++i) |
|
| 26 |
+ for(i = 0; i < p->stride * p->height; ++i) |
|
| 27 | 27 |
p->dat[i] = 0; |
| 28 | 28 |
} |
| 29 | 29 |
|
| 30 |
-int |
|
| 30 |
+unsigned int |
|
| 31 | 31 |
ppu_pixel(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 color) |
| 32 | 32 |
{
|
| 33 |
- unsigned int i = (x + y * p->width) / 2, shift = (x % 2) * 4; |
|
| 34 |
- int ret = p->dat[i]; |
|
| 33 |
+ unsigned int i = x / PPW + y * p->stride, shift = x % PPW * 4; |
|
| 34 |
+ unsigned int ret = p->dat[i]; |
|
| 35 | 35 |
if(fg) shift += 2; |
| 36 | 36 |
p->dat[i] &= ~(3 << shift); |
| 37 | 37 |
p->dat[i] |= color << shift; |
| 38 | 38 |
return ret ^ p->dat[i]; |
| 39 | 39 |
} |
| 40 | 40 |
|
| 41 |
-int |
|
| 41 |
+unsigned int |
|
| 42 | 42 |
ppu_1bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy) |
| 43 | 43 |
{
|
| 44 | 44 |
Uint16 v, h; |
| ... | ... |
@@ -56,7 +56,7 @@ ppu_1bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 f |
| 56 | 56 |
return ret; |
| 57 | 57 |
} |
| 58 | 58 |
|
| 59 |
-int |
|
| 59 |
+unsigned int |
|
| 60 | 60 |
ppu_2bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy) |
| 61 | 61 |
{
|
| 62 | 62 |
Uint16 v, h; |
| ... | ... |
@@ -81,11 +81,10 @@ ppu_2bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 f |
| 81 | 81 |
int |
| 82 | 82 |
ppu_set_size(Ppu *p, Uint16 width, Uint16 height) |
| 83 | 83 |
{
|
| 84 |
- /* round width up to nearest multiple of 2 */ |
|
| 85 |
- width += width % 2; |
|
| 86 | 84 |
p->width = width; |
| 85 |
+ p->stride = (width + PPW - 1) / PPW; |
|
| 87 | 86 |
p->height = height; |
| 88 |
- p->dat = realloc(p->dat, p->width / 2 * p->height); |
|
| 87 |
+ p->dat = realloc(p->dat, p->stride * p->height * sizeof(unsigned int)); |
|
| 89 | 88 |
if(p->dat == NULL) return 0; |
| 90 | 89 |
ppu_clear(p); |
| 91 | 90 |
return 1; |
| ... | ... |
@@ -13,16 +13,20 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 13 | 13 |
WITH REGARD TO THIS SOFTWARE. |
| 14 | 14 |
*/ |
| 15 | 15 |
|
| 16 |
+/* pixels per word in ppu.dat */ |
|
| 17 |
+ |
|
| 18 |
+#define PPW (sizeof(unsigned int) * 2) |
|
| 19 |
+ |
|
| 16 | 20 |
typedef unsigned char Uint8; |
| 17 | 21 |
typedef unsigned short Uint16; |
| 18 | 22 |
typedef unsigned int Uint32; |
| 19 | 23 |
|
| 20 | 24 |
typedef struct Ppu {
|
| 21 | 25 |
Uint16 width, height; |
| 22 |
- Uint8 *dat; |
|
| 26 |
+ unsigned int *dat, stride; |
|
| 23 | 27 |
} Ppu; |
| 24 | 28 |
|
| 25 | 29 |
int ppu_set_size(Ppu *p, Uint16 width, Uint16 height); |
| 26 |
-int ppu_pixel(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 color); |
|
| 27 |
-int ppu_1bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
|
| 28 |
-int ppu_2bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
|
| 30 |
+unsigned int ppu_pixel(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 color); |
|
| 31 |
+unsigned int ppu_1bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
|
| 32 |
+unsigned int ppu_2bpp(Ppu *p, int fg, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
| ... | ... |
@@ -38,7 +38,8 @@ static Apu apu[POLYPHONY]; |
| 38 | 38 |
static Device *devsystem, *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; |
| 39 | 39 |
static Uint32 *ppu_screen, stdin_event, audio0_event, palette[4]; |
| 40 | 40 |
|
| 41 |
-static Uint8 zoom = 1, reqdraw = 0; |
|
| 41 |
+static Uint8 zoom = 1; |
|
| 42 |
+static unsigned int reqdraw = 0; |
|
| 42 | 43 |
|
| 43 | 44 |
static Uint8 font[][8] = {
|
| 44 | 45 |
{0x00, 0x7c, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7c},
|
| ... | ... |
@@ -114,7 +115,7 @@ inspect(Ppu *p, Uint8 *stack, Uint8 wptr, Uint8 rptr, Uint8 *memory) |
| 114 | 115 |
static Uint8 |
| 115 | 116 |
get_pixel(int x, int y) |
| 116 | 117 |
{
|
| 117 |
- unsigned int i = (x + y * ppu.width) / 2, shift = (x % 2) * 4; |
|
| 118 |
+ unsigned int i = x / PPW + y * ppu.stride, shift = x % PPW * 4; |
|
| 118 | 119 |
return (ppu.dat[i] >> shift) & 0xf; |
| 119 | 120 |
} |
| 120 | 121 |
|