| ... | ... |
@@ -93,22 +93,13 @@ ppu_2bpp(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, U |
| 93 | 93 |
/* output */ |
| 94 | 94 |
|
| 95 | 95 |
int |
| 96 |
-ppu_init(Ppu *p, Uint8 hor, Uint8 ver) |
|
| 96 |
+ppu_set_size(Ppu *p, Uint16 width, Uint16 height) |
|
| 97 | 97 |
{
|
| 98 |
- p->width = 8 * hor; |
|
| 99 |
- p->height = 8 * ver; |
|
| 100 |
- p->bg = calloc(1, p->width / 4 * p->height * sizeof(Uint8)); |
|
| 101 |
- p->fg = calloc(1, p->width / 4 * p->height * sizeof(Uint8)); |
|
| 102 |
- ppu_clear(p); |
|
| 103 |
- return p->bg && p->fg; |
|
| 104 |
-} |
|
| 105 |
- |
|
| 106 |
-int |
|
| 107 |
-ppu_resize(Ppu *p, Uint8 hor, Uint8 ver) |
|
| 108 |
-{
|
|
| 109 |
- ppu_clear(p); |
|
| 110 |
- p->width = 8 * hor; |
|
| 111 |
- p->height = 8 * ver; |
|
| 98 |
+ /* round width and height up to nearest multiple of 8 */ |
|
| 99 |
+ width = ((width - 1) | 0x7) + 1; |
|
| 100 |
+ height = ((height - 1) | 0x7) + 1; |
|
| 101 |
+ p->width = width; |
|
| 102 |
+ p->height = height; |
|
| 112 | 103 |
p->bg = realloc(p->bg, p->width / 4 * p->height * sizeof(Uint8)); |
| 113 | 104 |
p->fg = realloc(p->fg, p->width / 4 * p->height * sizeof(Uint8)); |
| 114 | 105 |
ppu_clear(p); |
| ... | ... |
@@ -22,8 +22,7 @@ typedef struct Ppu {
|
| 22 | 22 |
Uint8 *bg, *fg; |
| 23 | 23 |
} Ppu; |
| 24 | 24 |
|
| 25 |
-int ppu_init(Ppu *p, Uint8 hor, Uint8 ver); |
|
| 26 |
-int ppu_resize(Ppu *p, Uint8 hor, Uint8 ver); |
|
| 25 |
+int ppu_set_size(Ppu *p, Uint16 width, Uint16 height); |
|
| 27 | 26 |
int ppu_pixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color); |
| 28 | 27 |
int ppu_1bpp(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
| 29 | 28 |
int ppu_2bpp(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); |
| ... | ... |
@@ -185,9 +185,32 @@ quit(void) |
| 185 | 185 |
exit(0); |
| 186 | 186 |
} |
| 187 | 187 |
|
| 188 |
+static int |
|
| 189 |
+set_size(Uint16 width, Uint16 height, int is_resize) |
|
| 190 |
+{
|
|
| 191 |
+ ppu_set_size(&ppu, width, height); |
|
| 192 |
+ gRect.x = PAD; |
|
| 193 |
+ gRect.y = PAD; |
|
| 194 |
+ gRect.w = ppu.width; |
|
| 195 |
+ gRect.h = ppu.height; |
|
| 196 |
+ if(!(ppu_screen = realloc(ppu_screen, ppu.width * ppu.height * sizeof(Uint32)))) |
|
| 197 |
+ return error("ppu_screen", "Memory failure");
|
|
| 198 |
+ memset(ppu_screen, 0, ppu.width * ppu.height * sizeof(Uint32)); |
|
| 199 |
+ if(gTexture != NULL) SDL_DestroyTexture(gTexture); |
|
| 200 |
+ SDL_RenderSetLogicalSize(gRenderer, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 201 |
+ gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 202 |
+ if(gTexture == NULL || SDL_SetTextureBlendMode(gTexture, SDL_BLENDMODE_NONE)) |
|
| 203 |
+ return error("sdl_texture", SDL_GetError());
|
|
| 204 |
+ SDL_UpdateTexture(gTexture, NULL, ppu_screen, sizeof(Uint32)); |
|
| 205 |
+ if(is_resize) SDL_SetWindowSize(gWindow, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom); |
|
| 206 |
+ reqdraw = 1; |
|
| 207 |
+ return 1; |
|
| 208 |
+} |
|
| 209 |
+ |
|
| 188 | 210 |
static int |
| 189 | 211 |
init(void) |
| 190 | 212 |
{
|
| 213 |
+ const Uint16 width = 64 * 8, height = 40 * 8; |
|
| 191 | 214 |
SDL_AudioSpec as; |
| 192 | 215 |
SDL_zero(as); |
| 193 | 216 |
as.freq = SAMPLE_FREQUENCY; |
| ... | ... |
@@ -196,8 +219,6 @@ init(void) |
| 196 | 219 |
as.callback = audio_callback; |
| 197 | 220 |
as.samples = 512; |
| 198 | 221 |
as.userdata = NULL; |
| 199 |
- if(!ppu_init(&ppu, 64, 40)) |
|
| 200 |
- return error("ppu", "Init failure");
|
|
| 201 | 222 |
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
|
| 202 | 223 |
error("sdl", SDL_GetError());
|
| 203 | 224 |
if(SDL_Init(SDL_INIT_VIDEO) < 0) |
| ... | ... |
@@ -207,25 +228,16 @@ init(void) |
| 207 | 228 |
if(!audio_id) |
| 208 | 229 |
error("sdl_audio", SDL_GetError());
|
| 209 | 230 |
} |
| 210 |
- gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom, SDL_WINDOW_SHOWN);
|
|
| 231 |
+ gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (width + PAD * 2) * zoom, (height + PAD * 2) * zoom, SDL_WINDOW_SHOWN);
|
|
| 211 | 232 |
if(gWindow == NULL) |
| 212 | 233 |
return error("sdl_window", SDL_GetError());
|
| 213 | 234 |
gRenderer = SDL_CreateRenderer(gWindow, -1, 0); |
| 214 | 235 |
if(gRenderer == NULL) |
| 215 | 236 |
return error("sdl_renderer", SDL_GetError());
|
| 216 |
- SDL_RenderSetLogicalSize(gRenderer, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 217 |
- gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 218 |
- if(gTexture == NULL || SDL_SetTextureBlendMode(gTexture, SDL_BLENDMODE_NONE)) |
|
| 219 |
- return error("sdl_texture", SDL_GetError());
|
|
| 220 |
- if(!(ppu_screen = calloc(1, ppu.width * ppu.height * sizeof(Uint32)))) |
|
| 237 |
+ if(!set_size(width, height, 0)) |
|
| 221 | 238 |
return 0; |
| 222 |
- SDL_UpdateTexture(gTexture, NULL, ppu_screen, sizeof(Uint32)); |
|
| 223 | 239 |
SDL_StartTextInput(); |
| 224 | 240 |
SDL_ShowCursor(SDL_DISABLE); |
| 225 |
- gRect.x = PAD; |
|
| 226 |
- gRect.y = PAD; |
|
| 227 |
- gRect.w = ppu.width; |
|
| 228 |
- gRect.h = ppu.height; |
|
| 229 | 241 |
return 1; |
| 230 | 242 |
} |
| 231 | 243 |
|
| ... | ... |
@@ -296,21 +308,6 @@ update_palette(Uint8 *addr) |
| 296 | 308 |
reqdraw = 1; |
| 297 | 309 |
} |
| 298 | 310 |
|
| 299 |
-void |
|
| 300 |
-set_size(Uint16 width, Uint16 height) |
|
| 301 |
-{
|
|
| 302 |
- ppu_resize(&ppu, width / 8, height / 8); |
|
| 303 |
- gRect.w = ppu.width; |
|
| 304 |
- gRect.h = ppu.height; |
|
| 305 |
- if(!(ppu_screen = realloc(ppu_screen, ppu.width * ppu.height * sizeof(Uint32)))) |
|
| 306 |
- return; |
|
| 307 |
- SDL_DestroyTexture(gTexture); |
|
| 308 |
- SDL_RenderSetLogicalSize(gRenderer, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 309 |
- gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, ppu.width + PAD * 2, ppu.height + PAD * 2); |
|
| 310 |
- SDL_SetWindowSize(gWindow, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom); |
|
| 311 |
- reqdraw = 1; |
|
| 312 |
-} |
|
| 313 |
- |
|
| 314 | 311 |
#pragma mark - Devices |
| 315 | 312 |
|
| 316 | 313 |
static int |
| ... | ... |
@@ -353,7 +350,7 @@ screen_talk(Device *d, Uint8 b0, Uint8 w) |
| 353 | 350 |
else |
| 354 | 351 |
switch(b0) {
|
| 355 | 352 |
case 0x5: |
| 356 |
- if(!FIXED_SIZE) set_size(peek16(d->dat, 0x2), peek16(d->dat, 0x4)); |
|
| 353 |
+ if(!FIXED_SIZE) return set_size(peek16(d->dat, 0x2), peek16(d->dat, 0x4), 1); |
|
| 357 | 354 |
break; |
| 358 | 355 |
case 0xe: {
|
| 359 | 356 |
Uint16 x = peek16(d->dat, 0x8); |