uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit 7b33cf3d9554bbca8bd8fb4f5a1b0976a5b8a6dd
parent 2a9fc00441e4f3363ae1822236db7d56b41ac9ce
Author: neauoire <aliceffekt@gmail.com>
Date:   Tue, 28 Dec 2021 13:37:26 -0800

Renamed PPU to Screen

Diffstat:
Mbuild.sh | 6+++---
Mmkfile | 6+++---
Dsrc/devices/ppu.c | 153-------------------------------------------------------------------------------
Dsrc/devices/ppu.h | 37-------------------------------------
Asrc/devices/screen.c | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/devices/screen.h | 38++++++++++++++++++++++++++++++++++++++
Msrc/uxnemu.c | 82+++++++++++++++++++------------------------------------------------------------
7 files changed, 266 insertions(+), 259 deletions(-)

diff --git a/build.sh b/build.sh @@ -14,8 +14,8 @@ then echo "Formatting.." clang-format -i src/uxn.h clang-format -i src/uxn.c - clang-format -i src/devices/ppu.h - clang-format -i src/devices/ppu.c + clang-format -i src/devices/screen.h + clang-format -i src/devices/screen.c clang-format -i src/devices/apu.h clang-format -i src/devices/apu.c clang-format -i src/devices/file.h @@ -62,7 +62,7 @@ fi echo "Building.." ${CC} ${CFLAGS} src/uxnasm.c -o bin/uxnasm -${CC} ${CFLAGS} ${CORE} src/devices/file.c src/devices/mouse.c src/devices/controller.c src/devices/ppu.c src/devices/apu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu +${CC} ${CFLAGS} ${CORE} src/devices/file.c src/devices/mouse.c src/devices/controller.c src/devices/screen.c src/devices/apu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu ${CC} ${CFLAGS} ${CORE} src/devices/file.c src/uxncli.c -o bin/uxncli if [ -d "$HOME/bin" ] diff --git a/mkfile b/mkfile @@ -8,7 +8,7 @@ HFILES=\ /sys/include/npe/stdio.h\ src/devices/apu.h\ src/devices/file.h\ - src/devices/ppu.h\ + src/devices/screen.h\ src/uxn.h\ CLEANFILES=$TARG $ROM @@ -35,13 +35,13 @@ bin/uxncli: file.$O uxncli.$O uxn.$O bin/uxnasm: uxnasm.$O $LD $LDFLAGS -o $target $prereq -bin/uxnemu: uxnemu.$O apu.$O file.$O ppu.$O uxn.$O +bin/uxnemu: uxnemu.$O apu.$O file.$O screen.$O uxn.$O $LD $LDFLAGS -o $target $prereq (uxnasm|uxncli|uxnemu|uxn)\.$O:R: src/\1.c $CC $CFLAGS -Isrc -o $target src/$stem1.c -(apu|file|ppu)\.$O:R: src/devices/\1.c +(apu|file|screen)\.$O:R: src/devices/\1.c $CC $CFLAGS -Isrc -o $target src/devices/$stem1.c nuke:V: clean diff --git a/src/devices/ppu.c b/src/devices/ppu.c @@ -1,153 +0,0 @@ -#include "ppu.h" - -/* -Copyright (c) 2021 Devine Lu Linvega -Copyright (c) 2021 Andrew Alderwick - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE. -*/ - -static Uint8 blending[5][16] = { - {0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0}, - {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}, - {1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1}, - {2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}, - {1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}}; - -static Uint8 font[][8] = { - {0x00, 0x7c, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7c}, - {0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, - {0x00, 0x7c, 0x82, 0x02, 0x7c, 0x80, 0x80, 0xfe}, - {0x00, 0x7c, 0x82, 0x02, 0x1c, 0x02, 0x82, 0x7c}, - {0x00, 0x0c, 0x14, 0x24, 0x44, 0x84, 0xfe, 0x04}, - {0x00, 0xfe, 0x80, 0x80, 0x7c, 0x02, 0x82, 0x7c}, - {0x00, 0x7c, 0x82, 0x80, 0xfc, 0x82, 0x82, 0x7c}, - {0x00, 0x7c, 0x82, 0x02, 0x1e, 0x02, 0x02, 0x02}, - {0x00, 0x7c, 0x82, 0x82, 0x7c, 0x82, 0x82, 0x7c}, - {0x00, 0x7c, 0x82, 0x82, 0x7e, 0x02, 0x82, 0x7c}, - {0x00, 0x7c, 0x82, 0x02, 0x7e, 0x82, 0x82, 0x7e}, - {0x00, 0xfc, 0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc}, - {0x00, 0x7c, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7c}, - {0x00, 0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc}, - {0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x82, 0x7c}, - {0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80}}; - -void -ppu_palette(Ppu *p, Uint8 *addr) -{ - int i, shift; - for(i = 0, shift = 4; i < 4; ++i, shift ^= 4) { - Uint8 - r = (addr[0 + i / 2] >> shift) & 0x0f, - g = (addr[2 + i / 2] >> shift) & 0x0f, - b = (addr[4 + i / 2] >> shift) & 0x0f; - p->palette[i] = 0x0f000000 | r << 16 | g << 8 | b; - p->palette[i] |= p->palette[i] << 4; - } - p->fg.changed = p->bg.changed = 1; -} - -void -ppu_resize(Ppu *p, Uint16 width, Uint16 height) -{ - Uint8 - *bg = realloc(p->bg.pixels, width * height), - *fg = realloc(p->fg.pixels, width * height); - Uint32 - *screen = realloc(p->screen, width * height * sizeof(Uint32)); - if(bg) p->bg.pixels = bg; - if(fg) p->fg.pixels = fg; - if(screen) p->screen = screen; - if(bg && fg && screen) { - p->width = width; - p->height = height; - p->screen = screen; - ppu_clear(p, &p->bg); - ppu_clear(p, &p->fg); - } -} - -void -ppu_clear(Ppu *p, Layer *layer) -{ - Uint32 i, size = p->width * p->height; - for(i = 0; i < size; ++i) - layer->pixels[i] = 0x00; - layer->changed = 1; -} - -void -ppu_redraw(Ppu *p, Uint32 *screen) -{ - Uint32 i, size = p->width * p->height, palette[16]; - for(i = 0; i < 16; ++i) - palette[i] = p->palette[(i >> 2) ? (i >> 2) : (i & 3)]; - for(i = 0; i < size; ++i) - screen[i] = palette[p->fg.pixels[i] << 2 | p->bg.pixels[i]]; - p->fg.changed = p->bg.changed = 0; -} - -void -ppu_write(Ppu *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color) -{ - if(x < p->width && y < p->height) { - Uint32 i = x + y * p->width; - Uint8 prev = layer->pixels[i]; - if(color != prev) { - layer->pixels[i] = color; - layer->changed = 1; - } - } -} - -void -ppu_blit(Ppu *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp) -{ - int v, h, opaque = blending[4][color]; - for(v = 0; v < 8; ++v) { - Uint16 c = sprite[v] | (twobpp ? sprite[v + 8] : 0) << 8; - for(h = 7; h >= 0; --h, c >>= 1) { - Uint8 ch = (c & 1) | ((c >> 7) & 2); - if(opaque || ch) - ppu_write(p, - layer, - x + (flipx ? 7 - h : h), - y + (flipy ? 7 - v : v), - blending[ch][color]); - } - } -} - -void -ppu_debug(Ppu *p, Uint8 *stack, Uint8 wptr, Uint8 rptr, Uint8 *memory) -{ - Uint8 i, x, y, b; - for(i = 0; i < 0x20; ++i) { - x = ((i % 8) * 3 + 1) * 8, y = (i / 8 + 1) * 8, b = stack[i]; - /* working stack */ - ppu_blit(p, &p->fg, x, y, font[(b >> 4) & 0xf], 1 + (wptr == i) * 0x7, 0, 0, 0); - ppu_blit(p, &p->fg, x + 8, y, font[b & 0xf], 1 + (wptr == i) * 0x7, 0, 0, 0); - y = 0x28 + (i / 8 + 1) * 8; - b = memory[i]; - /* return stack */ - ppu_blit(p, &p->fg, x, y, font[(b >> 4) & 0xf], 3, 0, 0, 0); - ppu_blit(p, &p->fg, x + 8, y, font[b & 0xf], 3, 0, 0, 0); - } - /* return pointer */ - ppu_blit(p, &p->fg, 0x8, y + 0x10, font[(rptr >> 4) & 0xf], 0x2, 0, 0, 0); - ppu_blit(p, &p->fg, 0x10, y + 0x10, font[rptr & 0xf], 0x2, 0, 0, 0); - /* guides */ - for(x = 0; x < 0x10; ++x) { - ppu_write(p, &p->fg, x, p->height / 2, 2); - ppu_write(p, &p->fg, p->width - x, p->height / 2, 2); - ppu_write(p, &p->fg, p->width / 2, p->height - x, 2); - ppu_write(p, &p->fg, p->width / 2, x, 2); - ppu_write(p, &p->fg, p->width / 2 - 0x10 / 2 + x, p->height / 2, 2); - ppu_write(p, &p->fg, p->width / 2, p->height / 2 - 0x10 / 2 + x, 2); - } -} diff --git a/src/devices/ppu.h b/src/devices/ppu.h @@ -1,37 +0,0 @@ -#include <stdlib.h> - -/* -Copyright (c) 2021 Devine Lu Linvega -Copyright (c) 2021 Andrew Alderwick - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE. -*/ - -typedef unsigned char Uint8; -typedef unsigned short Uint16; -typedef unsigned int Uint32; - -typedef struct Layer { - Uint8 *pixels; - Uint8 changed; -} Layer; - -typedef struct Ppu { - Uint32 palette[4], *screen; - Uint16 width, height; - Layer fg, bg; -} Ppu; - -void ppu_palette(Ppu *p, Uint8 *addr); -void ppu_resize(Ppu *p, Uint16 width, Uint16 height); -void ppu_clear(Ppu *p, Layer *layer); -void ppu_redraw(Ppu *p, Uint32 *screen); - -void ppu_write(Ppu *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color); -void ppu_blit(Ppu *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp); -void ppu_debug(Ppu *p, Uint8 *stack, Uint8 wptr, Uint8 rptr, Uint8 *memory); diff --git a/src/devices/screen.c b/src/devices/screen.c @@ -0,0 +1,202 @@ +#include "../uxn.h" +#include "screen.h" + +/* +Copyright (c) 2021 Devine Lu Linvega +Copyright (c) 2021 Andrew Alderwick + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE. +*/ + +Screen screen; + +static Uint8 blending[5][16] = { + {0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0}, + {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}, + {1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1}, + {2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}, + {1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}}; + +static Uint8 font[][8] = { + {0x00, 0x7c, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7c}, + {0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, + {0x00, 0x7c, 0x82, 0x02, 0x7c, 0x80, 0x80, 0xfe}, + {0x00, 0x7c, 0x82, 0x02, 0x1c, 0x02, 0x82, 0x7c}, + {0x00, 0x0c, 0x14, 0x24, 0x44, 0x84, 0xfe, 0x04}, + {0x00, 0xfe, 0x80, 0x80, 0x7c, 0x02, 0x82, 0x7c}, + {0x00, 0x7c, 0x82, 0x80, 0xfc, 0x82, 0x82, 0x7c}, + {0x00, 0x7c, 0x82, 0x02, 0x1e, 0x02, 0x02, 0x02}, + {0x00, 0x7c, 0x82, 0x82, 0x7c, 0x82, 0x82, 0x7c}, + {0x00, 0x7c, 0x82, 0x82, 0x7e, 0x02, 0x82, 0x7c}, + {0x00, 0x7c, 0x82, 0x02, 0x7e, 0x82, 0x82, 0x7e}, + {0x00, 0xfc, 0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc}, + {0x00, 0x7c, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7c}, + {0x00, 0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc}, + {0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x82, 0x7c}, + {0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80}}; + +static void +screen_write(Screen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color) +{ + if(x < p->width && y < p->height) { + Uint32 i = x + y * p->width; + Uint8 prev = layer->pixels[i]; + if(color != prev) { + layer->pixels[i] = color; + layer->changed = 1; + } + } +} + +static void +screen_blit(Screen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp) +{ + int v, h, opaque = blending[4][color]; + for(v = 0; v < 8; ++v) { + Uint16 c = sprite[v] | (twobpp ? sprite[v + 8] : 0) << 8; + for(h = 7; h >= 0; --h, c >>= 1) { + Uint8 ch = (c & 1) | ((c >> 7) & 2); + if(opaque || ch) + screen_write(p, + layer, + x + (flipx ? 7 - h : h), + y + (flipy ? 7 - v : v), + blending[ch][color]); + } + } +} + +void +screen_palette(Screen *p, Uint8 *addr) +{ + int i, shift; + for(i = 0, shift = 4; i < 4; ++i, shift ^= 4) { + Uint8 + r = (addr[0 + i / 2] >> shift) & 0x0f, + g = (addr[2 + i / 2] >> shift) & 0x0f, + b = (addr[4 + i / 2] >> shift) & 0x0f; + p->palette[i] = 0x0f000000 | r << 16 | g << 8 | b; + p->palette[i] |= p->palette[i] << 4; + } + p->fg.changed = p->bg.changed = 1; +} + +void +screen_resize(Screen *p, Uint16 width, Uint16 height) +{ + Uint8 + *bg = realloc(p->bg.pixels, width * height), + *fg = realloc(p->fg.pixels, width * height); + Uint32 + *pixels = realloc(p->pixels, width * height * sizeof(Uint32)); + if(bg) p->bg.pixels = bg; + if(fg) p->fg.pixels = fg; + if(pixels) p->pixels = pixels; + if(bg && fg && pixels) { + p->width = width; + p->height = height; + p->pixels = pixels; + screen_clear(p, &p->bg); + screen_clear(p, &p->fg); + } +} + +void +screen_clear(Screen *p, Layer *layer) +{ + Uint32 i, size = p->width * p->height; + for(i = 0; i < size; ++i) + layer->pixels[i] = 0x00; + layer->changed = 1; +} + +void +screen_redraw(Screen *p, Uint32 *pixels) +{ + Uint32 i, size = p->width * p->height, palette[16]; + for(i = 0; i < 16; ++i) + palette[i] = p->palette[(i >> 2) ? (i >> 2) : (i & 3)]; + for(i = 0; i < size; ++i) + pixels[i] = palette[p->fg.pixels[i] << 2 | p->bg.pixels[i]]; + p->fg.changed = p->bg.changed = 0; +} + +void +screen_debug(Screen *p, Uint8 *stack, Uint8 wptr, Uint8 rptr, Uint8 *memory) +{ + Uint8 i, x, y, b; + for(i = 0; i < 0x20; ++i) { + x = ((i % 8) * 3 + 1) * 8, y = (i / 8 + 1) * 8, b = stack[i]; + /* working stack */ + screen_blit(p, &p->fg, x, y, font[(b >> 4) & 0xf], 1 + (wptr == i) * 0x7, 0, 0, 0); + screen_blit(p, &p->fg, x + 8, y, font[b & 0xf], 1 + (wptr == i) * 0x7, 0, 0, 0); + y = 0x28 + (i / 8 + 1) * 8; + b = memory[i]; + /* return stack */ + screen_blit(p, &p->fg, x, y, font[(b >> 4) & 0xf], 3, 0, 0, 0); + screen_blit(p, &p->fg, x + 8, y, font[b & 0xf], 3, 0, 0, 0); + } + /* return pointer */ + screen_blit(p, &p->fg, 0x8, y + 0x10, font[(rptr >> 4) & 0xf], 0x2, 0, 0, 0); + screen_blit(p, &p->fg, 0x10, y + 0x10, font[rptr & 0xf], 0x2, 0, 0, 0); + /* guides */ + for(x = 0; x < 0x10; ++x) { + screen_write(p, &p->fg, x, p->height / 2, 2); + screen_write(p, &p->fg, p->width - x, p->height / 2, 2); + screen_write(p, &p->fg, p->width / 2, p->height - x, 2); + screen_write(p, &p->fg, p->width / 2, x, 2); + screen_write(p, &p->fg, p->width / 2 - 0x10 / 2 + x, p->height / 2, 2); + screen_write(p, &p->fg, p->width / 2, p->height / 2 - 0x10 / 2 + x, 2); + } +} + +/* APIs */ + +Uint8 +screen_dei(Device *d, Uint8 port) +{ + switch(port) { + case 0x2: return screen.width >> 8; + case 0x3: return screen.width; + case 0x4: return screen.height >> 8; + case 0x5: return screen.height; + default: return d->dat[port]; + } +} + +void +screen_deo(Device *d, Uint8 port) +{ + switch(port) { + case 0x1: d->vector = peek16(d->dat, 0x0); break; + case 0x5: + /* TODO: if(!FIXED_SIZE) set_size(peek16(d->dat, 0x2), peek16(d->dat, 0x4), 1); */ + break; + case 0xe: { + Uint16 x = peek16(d->dat, 0x8); + Uint16 y = peek16(d->dat, 0xa); + Uint8 layer = d->dat[0xe] & 0x40; + screen_write(&screen, layer ? &screen.fg : &screen.bg, x, y, d->dat[0xe] & 0x3); + if(d->dat[0x6] & 0x01) poke16(d->dat, 0x8, x + 1); /* auto x+1 */ + if(d->dat[0x6] & 0x02) poke16(d->dat, 0xa, y + 1); /* auto y+1 */ + break; + } + case 0xf: { + Uint16 x = peek16(d->dat, 0x8); + Uint16 y = peek16(d->dat, 0xa); + Layer *layer = (d->dat[0xf] & 0x40) ? &screen.fg : &screen.bg; + Uint8 *addr = &d->mem[peek16(d->dat, 0xc)]; + Uint8 twobpp = !!(d->dat[0xf] & 0x80); + screen_blit(&screen, layer, x, y, addr, d->dat[0xf] & 0xf, d->dat[0xf] & 0x10, d->dat[0xf] & 0x20, twobpp); + if(d->dat[0x6] & 0x04) poke16(d->dat, 0xc, peek16(d->dat, 0xc) + 8 + twobpp * 8); /* auto addr+8 / auto addr+16 */ + if(d->dat[0x6] & 0x01) poke16(d->dat, 0x8, x + 8); /* auto x+8 */ + if(d->dat[0x6] & 0x02) poke16(d->dat, 0xa, y + 8); /* auto y+8 */ + break; + } + } +} +\ No newline at end of file diff --git a/src/devices/screen.h b/src/devices/screen.h @@ -0,0 +1,37 @@ +#include <stdlib.h> + +/* +Copyright (c) 2021 Devine Lu Linvega +Copyright (c) 2021 Andrew Alderwick + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE. +*/ + +#define FIXED_SIZE 0 + +typedef struct Layer { + Uint8 *pixels; + Uint8 changed; +} Layer; + +typedef struct Screen { + Uint32 palette[4], *pixels; + Uint16 width, height; + Layer fg, bg; +} Screen; + +extern Screen screen; + +void screen_palette(Screen *p, Uint8 *addr); +void screen_resize(Screen *p, Uint16 width, Uint16 height); +void screen_clear(Screen *p, Layer *layer); +void screen_redraw(Screen *p, Uint32 *pixels); +void screen_debug(Screen *p, Uint8 *stack, Uint8 wptr, Uint8 rptr, Uint8 *memory); + +Uint8 screen_dei(Device *d, Uint8 port); +void screen_deo(Device *d, Uint8 port); +\ No newline at end of file diff --git a/src/uxnemu.c b/src/uxnemu.c @@ -8,7 +8,7 @@ #pragma GCC diagnostic ignored "-Wpedantic" #pragma clang diagnostic ignored "-Wtypedef-redefinition" #include <SDL.h> -#include "devices/ppu.h" +#include "devices/screen.h" #include "devices/apu.h" #include "devices/file.h" #include "devices/controller.h" @@ -30,7 +30,6 @@ WITH REGARD TO THIS SOFTWARE. #define WIDTH 64 * 8 #define HEIGHT 40 * 8 #define PAD 4 -#define FIXED_SIZE 0 #define POLYPHONY 4 #define BENCH 0 @@ -39,8 +38,9 @@ static SDL_Texture *gTexture; static SDL_Renderer *gRenderer; static SDL_AudioDeviceID audio_id; static SDL_Rect gRect; + /* devices */ -static Ppu ppu; + static Apu apu[POLYPHONY]; static Device *devsystem, *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; static Uint8 zoom = 1; @@ -106,20 +106,20 @@ set_window_size(SDL_Window *window, int w, int h) static int set_size(Uint16 width, Uint16 height, int is_resize) { - ppu_resize(&ppu, width, height); + screen_resize(&screen, width, height); gRect.x = PAD; gRect.y = PAD; - gRect.w = ppu.width; - gRect.h = ppu.height; + gRect.w = screen.width; + gRect.h = screen.height; if(gTexture != NULL) SDL_DestroyTexture(gTexture); - SDL_RenderSetLogicalSize(gRenderer, ppu.width + PAD * 2, ppu.height + PAD * 2); - gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, ppu.width + PAD * 2, ppu.height + PAD * 2); + SDL_RenderSetLogicalSize(gRenderer, screen.width + PAD * 2, screen.height + PAD * 2); + gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, screen.width + PAD * 2, screen.height + PAD * 2); if(gTexture == NULL || SDL_SetTextureBlendMode(gTexture, SDL_BLENDMODE_NONE)) return error("gTexture", SDL_GetError()); - if(SDL_UpdateTexture(gTexture, NULL, ppu.screen, sizeof(Uint32)) != 0) + if(SDL_UpdateTexture(gTexture, NULL, screen.pixels, sizeof(Uint32)) != 0) return error("SDL_UpdateTexture", SDL_GetError()); if(is_resize) - set_window_size(gWindow, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom); + set_window_size(gWindow, (screen.width + PAD * 2) * zoom, (screen.height + PAD * 2) * zoom); return 1; } @@ -127,9 +127,9 @@ static void redraw(Uxn *u) { if(devsystem->dat[0xe]) - ppu_debug(&ppu, u->wst.dat, u->wst.ptr, u->rst.ptr, u->ram.dat); - ppu_redraw(&ppu, ppu.screen); - if(SDL_UpdateTexture(gTexture, &gRect, ppu.screen, ppu.width * sizeof(Uint32)) != 0) + screen_debug(&screen, u->wst.dat, u->wst.ptr, u->rst.ptr, u->ram.dat); + screen_redraw(&screen, screen.pixels); + if(SDL_UpdateTexture(gTexture, &gRect, screen.pixels, screen.width * sizeof(Uint32)) != 0) error("SDL_UpdateTexture", SDL_GetError()); SDL_RenderClear(gRenderer); SDL_RenderCopy(gRenderer, gTexture, NULL, NULL); @@ -197,7 +197,7 @@ system_deo(Device *d, Uint8 port) case 0x3: d->u->rst.ptr = d->dat[port]; break; } if(port > 0x7 && port < 0xe) - ppu_palette(&ppu, &d->dat[0x8]); + screen_palette(&screen, &d->dat[0x8]); } static void @@ -210,50 +210,6 @@ console_deo(Device *d, Uint8 port) } static Uint8 -screen_dei(Device *d, Uint8 port) -{ - switch(port) { - case 0x2: return ppu.width >> 8; - case 0x3: return ppu.width; - case 0x4: return ppu.height >> 8; - case 0x5: return ppu.height; - default: return d->dat[port]; - } -} - -static void -screen_deo(Device *d, Uint8 port) -{ - switch(port) { - case 0x1: d->vector = peek16(d->dat, 0x0); break; - case 0x5: - if(!FIXED_SIZE) set_size(peek16(d->dat, 0x2), peek16(d->dat, 0x4), 1); - break; - case 0xe: { - Uint16 x = peek16(d->dat, 0x8); - Uint16 y = peek16(d->dat, 0xa); - Uint8 layer = d->dat[0xe] & 0x40; - ppu_write(&ppu, layer ? &ppu.fg : &ppu.bg, x, y, d->dat[0xe] & 0x3); - if(d->dat[0x6] & 0x01) poke16(d->dat, 0x8, x + 1); /* auto x+1 */ - if(d->dat[0x6] & 0x02) poke16(d->dat, 0xa, y + 1); /* auto y+1 */ - break; - } - case 0xf: { - Uint16 x = peek16(d->dat, 0x8); - Uint16 y = peek16(d->dat, 0xa); - Layer *layer = (d->dat[0xf] & 0x40) ? &ppu.fg : &ppu.bg; - Uint8 *addr = &d->mem[peek16(d->dat, 0xc)]; - Uint8 twobpp = !!(d->dat[0xf] & 0x80); - ppu_blit(&ppu, layer, x, y, addr, d->dat[0xf] & 0xf, d->dat[0xf] & 0x10, d->dat[0xf] & 0x20, twobpp); - if(d->dat[0x6] & 0x04) poke16(d->dat, 0xc, peek16(d->dat, 0xc) + 8 + twobpp * 8); /* auto addr+8 / auto addr+16 */ - if(d->dat[0x6] & 0x01) poke16(d->dat, 0x8, x + 8); /* auto x+8 */ - if(d->dat[0x6] & 0x02) poke16(d->dat, 0xa, y + 8); /* auto y+8 */ - break; - } - } -} - -static Uint8 audio_dei(Device *d, Uint8 port) { Apu *c = &apu[d - devaudio0]; @@ -370,14 +326,14 @@ static void set_zoom(Uint8 scale) { zoom = clamp(scale, 1, 3); - set_window_size(gWindow, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom); + set_window_size(gWindow, (screen.width + PAD * 2) * zoom, (screen.height + PAD * 2) * zoom); } static void toggle_debugger(void) { devsystem->dat[0xe] = !devsystem->dat[0xe]; - ppu_clear(&ppu, &ppu.fg); + screen_clear(&screen, &screen.fg); } static void @@ -502,8 +458,8 @@ run(Uxn *u) /* Mouse */ else if(event.type == SDL_MOUSEMOTION) mouse_pos(devmouse, - clamp(event.motion.x - PAD, 0, ppu.width - 1), - clamp(event.motion.y - PAD, 0, ppu.height - 1)); + clamp(event.motion.x - PAD, 0, screen.width - 1), + clamp(event.motion.y - PAD, 0, screen.height - 1)); else if(event.type == SDL_MOUSEBUTTONUP) mouse_up(devmouse, 0x1 << (event.button.button - 1)); else if(event.type == SDL_MOUSEBUTTONDOWN) @@ -537,7 +493,7 @@ run(Uxn *u) console_input(u, event.cbutton.button); } uxn_eval(u, devscreen->vector); - if(ppu.fg.changed || ppu.bg.changed || devsystem->dat[0xe]) + if(screen.fg.changed || screen.bg.changed || devsystem->dat[0xe]) redraw(u); if(!BENCH) { elapsed = (SDL_GetPerformanceCounter() - begin) / (double)SDL_GetPerformanceFrequency() * 1000.0f;