diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-31 10:39:20 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-31 10:39:20 +0200 |
commit | 4f745d03e1717120e1c7502a9033ee8b95ab462f (patch) | |
tree | 6af279dcc196805b70ecfd16e564ccd79da93b2c | |
parent | 66daaf81e953bc0d44cf0309f945f76c97d0ede4 (diff) | |
download | uxngba-4f745d03e1717120e1c7502a9033ee8b95ab462f.tar.gz uxngba-4f745d03e1717120e1c7502a9033ee8b95ab462f.zip |
Add new changes to screen deo function
-rw-r--r-- | src/devices.c | 42 |
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 | } |