| ... | ... |
@@ -1,5 +1,4 @@ |
| 1 | 1 |
#include <stdlib.h> |
| 2 |
-#include <stdio.h> |
|
| 3 | 2 |
|
| 4 | 3 |
#include "../uxn.h" |
| 5 | 4 |
#include "screen.h" |
| ... | ... |
@@ -25,14 +24,6 @@ static Uint8 blending[4][16] = {
|
| 25 | 24 |
{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
|
| 26 | 25 |
{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
|
| 27 | 26 |
|
| 28 |
-static void |
|
| 29 |
-screen_pixel(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color) |
|
| 30 |
-{
|
|
| 31 |
- if(x >= p->width || y >= p->height) |
|
| 32 |
- return; |
|
| 33 |
- layer->pixels[x + y * p->width] = color; |
|
| 34 |
-} |
|
| 35 |
- |
|
| 36 | 27 |
static void |
| 37 | 28 |
screen_fill(UxnScreen *p, Layer *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, Uint8 color) |
| 38 | 29 |
{
|
| ... | ... |
@@ -50,15 +41,14 @@ screen_blit(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 |
| 50 | 41 |
Uint16 c = sprite[v] | (twobpp ? (sprite[v + 8] << 8) : 0); |
| 51 | 42 |
for(h = 7; h >= 0; --h, c >>= 1) {
|
| 52 | 43 |
Uint8 ch = (c & 1) | ((c >> 7) & 2); |
| 53 |
- if(opaque || ch) |
|
| 54 |
- screen_pixel(p, |
|
| 55 |
- layer, |
|
| 56 |
- x + (flipx ? 7 - h : h), |
|
| 57 |
- y + (flipy ? 7 - v : v), |
|
| 58 |
- blending[ch][color]); |
|
| 44 |
+ if(opaque || ch) {
|
|
| 45 |
+ Uint16 xx = x + (flipx ? 7 - h : h); |
|
| 46 |
+ Uint16 yy = y + (flipy ? 7 - v : v); |
|
| 47 |
+ if(xx < p->width && yy < p->height) |
|
| 48 |
+ layer->pixels[xx + yy * p->width] = blending[ch][color]; |
|
| 49 |
+ } |
|
| 59 | 50 |
} |
| 60 | 51 |
} |
| 61 |
- layer->changed = 1; |
|
| 62 | 52 |
} |
| 63 | 53 |
|
| 64 | 54 |
void |
| ... | ... |
@@ -158,29 +148,32 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port) |
| 158 | 148 |
break; |
| 159 | 149 |
} |
| 160 | 150 |
case 0xf: {
|
| 161 |
- Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg; |
|
| 151 |
+ Uint8 i; |
|
| 152 |
+ Uint8 ctrl = d[0xf]; |
|
| 153 |
+ Uint8 move = d[0x6]; |
|
| 154 |
+ Uint8 length = move >> 4; |
|
| 155 |
+ Uint8 twobpp = !!(ctrl & 0x80); |
|
| 162 | 156 |
Uint16 x = PEEK2(d + 0x8); |
| 163 | 157 |
Uint16 y = PEEK2(d + 0xa); |
| 164 | 158 |
Uint16 addr = PEEK2(d + 0xc); |
| 165 |
- Uint16 dx = (d[0x6] & 0x01) << 3; |
|
| 166 |
- Uint16 dy = (d[0x6] & 0x02) << 2; |
|
| 167 |
- Uint8 n = d[0x6] >> 4; |
|
| 168 |
- Uint8 twobpp = !!(d[0xf] & 0x80); |
|
| 169 |
- Uint8 i; |
|
| 170 |
- if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) |
|
| 159 |
+ Uint16 dx = (move & 0x1) << 3; |
|
| 160 |
+ Uint16 dy = (move & 0x2) << 2; |
|
| 161 |
+ Layer *layer = (ctrl & 0x40) ? &uxn_screen.fg : &uxn_screen.bg; |
|
| 162 |
+ if(addr > 0x10000 - ((length + 1) << (3 + twobpp))) |
|
| 171 | 163 |
return; |
| 172 |
- for(i = 0; i <= n; i++) {
|
|
| 173 |
- if(!(d[0xf] & 0xf)) {
|
|
| 164 |
+ for(i = 0; i <= length; i++) {
|
|
| 165 |
+ if(!(ctrl & 0xf)) {
|
|
| 174 | 166 |
Uint16 ex = x + dy * i, ey = y + dx * i; |
| 175 | 167 |
screen_fill(&uxn_screen, layer, ex, ey, ex + 8, ey + 8, 0); |
| 176 | 168 |
} else {
|
| 177 |
- screen_blit(&uxn_screen, layer, x + dy * i, y + dx * i, &ram[addr], d[0xf] & 0xf, d[0xf] & 0x10, d[0xf] & 0x20, twobpp); |
|
| 178 |
- addr += (d[0x6] & 0x04) << (1 + twobpp); |
|
| 169 |
+ screen_blit(&uxn_screen, layer, x + dy * i, y + dx * i, &ram[addr], ctrl & 0xf, ctrl & 0x10, ctrl & 0x20, twobpp); |
|
| 170 |
+ addr += (move & 0x04) << (1 + twobpp); |
|
| 179 | 171 |
} |
| 180 | 172 |
} |
| 181 |
- if(d[0x6] & 0x1) POKE2(d + 0x8, x + dx); /* auto x+8 */ |
|
| 182 |
- if(d[0x6] & 0x2) POKE2(d + 0xa, y + dy); /* auto y+8 */ |
|
| 183 |
- if(d[0x6] & 0x4) POKE2(d + 0xc, addr); /* auto addr+length */ |
|
| 173 |
+ layer->changed = 1; |
|
| 174 |
+ if(move & 0x1) POKE2(d + 0x8, x + dx); /* auto x+8 */ |
|
| 175 |
+ if(move & 0x2) POKE2(d + 0xa, y + dy); /* auto y+8 */ |
|
| 176 |
+ if(move & 0x4) POKE2(d + 0xc, addr); /* auto addr+length */ |
|
| 184 | 177 |
break; |
| 185 | 178 |
} |
| 186 | 179 |
} |