| ... | ... |
@@ -13,8 +13,9 @@ WITH REGARD TO THIS SOFTWARE. |
| 13 | 13 |
*/ |
| 14 | 14 |
|
| 15 | 15 |
/* |
| 16 |
- fgbg fgbg |
|
| 17 |
-byte [0000 0000] |
|
| 16 |
+pixel 0001 0002 |
|
| 17 |
+layer fgbg fgbg |
|
| 18 |
+byte 1010 1010 |
|
| 18 | 19 |
*/ |
| 19 | 20 |
|
| 20 | 21 |
static Uint8 blending[5][16] = {
|
| ... | ... |
@@ -27,42 +28,25 @@ static Uint8 blending[5][16] = {
|
| 27 | 28 |
static void |
| 28 | 29 |
ppu_clear(Ppu *p) |
| 29 | 30 |
{
|
| 30 |
- int x, y; |
|
| 31 |
- for(y = 0; y < p->height; ++y) {
|
|
| 32 |
- for(x = 0; x < p->width; ++x) {
|
|
| 33 |
- ppu_write(p, 0, x, y, 0); |
|
| 34 |
- ppu_write(p, 1, x, y, 0); |
|
| 35 |
- } |
|
| 36 |
- } |
|
| 31 |
+ int row; |
|
| 32 |
+ for(row = 0; row < p->height * p->width / 2; ++row) |
|
| 33 |
+ p->pixels[row] = 0; |
|
| 37 | 34 |
} |
| 38 | 35 |
|
| 39 | 36 |
Uint8 |
| 40 | 37 |
ppu_read(Ppu *p, Uint16 x, Uint16 y) |
| 41 | 38 |
{
|
| 42 | 39 |
int row = (x + y * p->width) / 0x2; |
| 43 |
- |
|
| 44 |
- if(x % 2) {
|
|
| 45 |
- if(p->pixels[row] & 0x0c) {
|
|
| 46 |
- return (p->pixels[row] >> 0x2) & 0x3; |
|
| 47 |
- } else {
|
|
| 48 |
- return (p->pixels[row] >> 0x0) & 0x3; |
|
| 49 |
- } |
|
| 50 |
- } else {
|
|
| 51 |
- if(p->pixels[row] & 0xc0) {
|
|
| 52 |
- return (p->pixels[row] >> 0x6) & 0x3; |
|
| 53 |
- } else {
|
|
| 54 |
- return (p->pixels[row] >> 0x4) & 0x3; |
|
| 55 |
- } |
|
| 56 |
- } |
|
| 57 |
- |
|
| 58 |
- return 0; |
|
| 40 |
+ Uint8 seg = !(x & 0x1) << 2; |
|
| 41 |
+ Uint8 byte = p->pixels[row] >> seg; |
|
| 42 |
+ return (byte & 0x0c ? (byte >> 2) : byte) & 0x3; |
|
| 59 | 43 |
} |
| 60 | 44 |
|
| 61 | 45 |
void |
| 62 | 46 |
ppu_write(Ppu *p, Uint8 layer, Uint16 x, Uint16 y, Uint8 color) |
| 63 | 47 |
{
|
| 64 | 48 |
int row = (x + y * p->width) / 0x2; |
| 65 |
- int original = p->pixels[row]; |
|
| 49 |
+ Uint8 original = p->pixels[row]; |
|
| 66 | 50 |
Uint8 next = 0x0; |
| 67 | 51 |
if(x % 2) {
|
| 68 | 52 |
if(layer) {
|
| ... | ... |
@@ -82,7 +66,8 @@ ppu_write(Ppu *p, Uint8 layer, Uint16 x, Uint16 y, Uint8 color) |
| 82 | 66 |
} |
| 83 | 67 |
} |
| 84 | 68 |
p->pixels[row] = next; |
| 85 |
- p->reqdraw = 1; |
|
| 69 |
+ if(original != next) |
|
| 70 |
+ p->reqdraw = 1; |
|
| 86 | 71 |
} |
| 87 | 72 |
|
| 88 | 73 |
void |
| ... | ... |
@@ -127,9 +112,7 @@ ppu_set_size(Ppu *p, Uint16 width, Uint16 height) |
| 127 | 112 |
ppu_clear(p); |
| 128 | 113 |
p->width = width; |
| 129 | 114 |
p->height = height; |
| 130 |
- p->pixels = realloc(p->bg, p->width * p->height * sizeof(Uint8) * 2); |
|
| 131 |
- p->bg = p->pixels; |
|
| 132 |
- p->fg = p->pixels + (p->width * p->height * sizeof(Uint8)); |
|
| 115 |
+ p->pixels = realloc(p->pixels, p->width * p->height * sizeof(Uint8) / 2); |
|
| 133 | 116 |
ppu_clear(p); |
| 134 |
- return p->bg && p->fg; |
|
| 117 |
+ return !!p->pixels; |
|
| 135 | 118 |
} |