aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-31 10:39:20 +0200
committerBad Diode <bd@badd10de.dev>2023-08-31 10:39:20 +0200
commit4f745d03e1717120e1c7502a9033ee8b95ab462f (patch)
tree6af279dcc196805b70ecfd16e564ccd79da93b2c
parent66daaf81e953bc0d44cf0309f945f76c97d0ede4 (diff)
downloaduxngba-4f745d03e1717120e1c7502a9033ee8b95ab462f.tar.gz
uxngba-4f745d03e1717120e1c7502a9033ee8b95ab462f.zip
Add new changes to screen deo function
-rw-r--r--src/devices.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/src/devices.c b/src/devices.c
index 49fc4ac..6c7f281 100644
--- a/src/devices.c
+++ b/src/devices.c
@@ -63,43 +63,39 @@ deo_screen(u8 *dev, u8 port) {
63 break; 63 break;
64 } 64 }
65 case 0xf: { 65 case 0xf: {
66 u16 x, y, dx, dy, addr; 66 u8 ctrl = dev[0xf];
67 u8 n, twobpp = !!(dev[0xf] & 0x80); 67 u8 move = dev[0x6];
68 x = PEEK2(dev + 0x8); 68 u8 length = move >> 4;
69 y = PEEK2(dev + 0xa); 69 u8 twobpp = !!(ctrl & 0x80);
70 addr = PEEK2(dev + 0xc);
71 n = dev[0x6] >> 4;
72 dx = (dev[0x6] & 0x01) << 3;
73 dy = (dev[0x6] & 0x02) << 2;
74 if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) {
75 return;
76 }
77 u8 *layer = (dev[0xf] & 0x40) ? FG_BACK : BG_BACK; 70 u8 *layer = (dev[0xf] & 0x40) ? FG_BACK : BG_BACK;
78 u8 color = dev[0xf] & 0xf; 71 u8 color = ctrl & 0xf;
79 u8 flipx = dev[0xf] & 0x10; 72 u16 x = PEEK2(dev + 0x8), dx = (move & 0x1) << 3;
80 u8 flipy = dev[0xf] & 0x20; 73 u16 y = PEEK2(dev + 0xa), dy = (move & 0x2) << 2;
81 for(size_t i = 0; i <= n; i++) { 74 u16 addr = PEEK2(dev + 0xc), addr_incr = (move & 0x4) << (1 + twobpp);
75 int flipx = (ctrl & 0x10), fx = flipx ? -1 : 1;
76 int flipy = (ctrl & 0x20), fy = flipy ? -1 : 1;
77 for(size_t i = 0; i <= length; i++) {
82 u8 *sprite = &uxn_ram[addr]; 78 u8 *sprite = &uxn_ram[addr];
83 if (twobpp) { 79 if (twobpp) {
84 PROF(ppu_2bpp(layer, 80 PROF(ppu_2bpp(layer,
85 x + dy * i, 81 x + dy * i * fx,
86 y + dx * i, 82 y + dx * i * fy,
87 sprite, 83 sprite,
88 color, 84 color,
89 flipx, flipy), ppu_chr_cycles); 85 flipx, flipy), ppu_chr_cycles);
90 } else { 86 } else {
91 PROF(ppu_1bpp(layer, 87 PROF(ppu_1bpp(layer,
92 x + dy * i, 88 x + dy * i * fx,
93 y + dx * i, 89 y + dx * i * fy,
94 sprite, 90 sprite,
95 color, 91 color,
96 flipx, flipy), ppu_icn_cycles); 92 flipx, flipy), ppu_icn_cycles);
97 } 93 }
98 addr += (dev[0x6] & 0x04) << (1 + twobpp); 94 addr += addr_incr;
99 } 95 }
100 POKE2(dev + 0xc, addr); /* auto addr+length */ 96 if(move & 0x1) POKE2(dev + 0x8, x + dx * fx); /* auto x+8 */
101 POKE2(dev + 0x8, x + dx); /* auto x+8 */ 97 if(move & 0x2) POKE2(dev + 0xa, y + dy * fy); /* auto y+8 */
102 POKE2(dev + 0xa, y + dy); /* auto y+8 */ 98 if(move & 0x4) POKE2(dev + 0xc, addr); /* auto addr+length */
103 break; 99 break;
104 } 100 }
105 } 101 }