ref: 756e800fc10c88e4f9b3b9dc31928714184a9ea0
parent: eb7b815c30cf34ef95bfc9480b66f0896a4d73d3
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Fri Jul 26 15:10:28 EDT 2024
Improve vdp bg + clean
--- a/dat.h
+++ b/dat.h
@@ -3,7 +3,6 @@
extern uint32_t irq;
extern uint8_t reg[16];
-extern uint8_t dma;
extern uint8_t z80bus, z80irq;
extern uint16_t pc, curpc;
@@ -29,29 +28,13 @@
PBNT = 0x04,
SPRTAB = 0x05,
BGCOL = 0x07,
+ HORSCR = 0x08,
+ VERSCR = 0x09,
HORCTR = 0x0a,
- MODE3 = 0x0b,
- MODE4 = 0x0c,
- HORSCR = 0x0d,
- AUTOINC = 0x0f,
- PLSIZ = 0x10,
- WINH = 0x11,
- WINV = 0x12,
- DMACL = 0x13,
- DMACH = 0x14,
- DMASRC0 = 0x15,
- DMASRC1 = 0x16,
- DMASRC2 = 0x17,
IE0 = 0x20,
IE1 = 0x10,
- DMAEN = 0x10,
- SHI = 0x08,
- WIDE = 0x01,
-
- STATDMA = 0x02,
- STATHBL = 0x04,
STATVBL = 0x08,
STATFR = 0x10,
STATCOLL= 0x20,
--- a/mem.c
+++ b/mem.c
@@ -18,7 +18,6 @@
};
uint8_t ctl[15];
-uint8_t dma;
uint8_t vdplatch;
uint8_t z80bus = 0;
--- a/sms.c
+++ b/sms.c
@@ -17,20 +17,15 @@
extern uint16_t pc, curpc, sp;
uint32_t asp, irq, stop;
int doflush = 0;
-// uint8_t header[0x7fff];
-// uint8_t *prg = NULL;
uint8_t *rom = NULL;
uint8_t *mem = NULL;
uint8_t *pic = NULL;
-
int vdpclock = 0;
+uint8_t keys[2];
void
loadrom(const uint8_t *data)
{- // memcpy(header, data, sizeof(header));
- // prg = malloc(0xC000);
- // memcpy(prg, data+sizeof(header), 0xC000);
pic = malloc(320 * 224 * 4);
rom = malloc(0x40000);
memcpy(rom, data, 0x40000);
@@ -86,15 +81,13 @@
return true;
}
-uint8_t keys[2];
-
static const int retro_bind[] = {- [RETRO_DEVICE_ID_JOYPAD_UP] = 0,
- [RETRO_DEVICE_ID_JOYPAD_DOWN] = 1<<1,
- [RETRO_DEVICE_ID_JOYPAD_LEFT] = 1<<2,
+ [RETRO_DEVICE_ID_JOYPAD_UP] = 0,
+ [RETRO_DEVICE_ID_JOYPAD_DOWN] = 1<<1,
+ [RETRO_DEVICE_ID_JOYPAD_LEFT] = 1<<2,
[RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1<<3,
- [RETRO_DEVICE_ID_JOYPAD_A] = 1<<4,
- [RETRO_DEVICE_ID_JOYPAD_B] = 1<<5,
+ [RETRO_DEVICE_ID_JOYPAD_A] = 1<<4,
+ [RETRO_DEVICE_ID_JOYPAD_B] = 1<<5,
[RETRO_DEVICE_ID_JOYPAD_START] = 1<<6,
};
--- a/vdp.c
+++ b/vdp.c
@@ -12,7 +12,6 @@
int first = 1;
uint16_t hctr;
static int xmax, xdisp;
-static int sx, snx, col, pri;
enum { ymax = 262, yvbl = 234 };void
@@ -20,7 +19,6 @@
{xmax = 320;
xdisp = 256;
- intla = (reg[MODE4] & 6) == 6;
}
static void
@@ -42,11 +40,14 @@
{uint16_t screenmap = (reg[PANT] & 0x0e) << 10;
- int ty = vdpy >> 3;
- int tyoff = vdpy & 7;
+ uint8_t y = vdpy + reg[VERSCR];
+ if (y >= 224) y -= 224;
+ int ty = y >> 3;
+ int tyoff = y & 7;
- int tx = vdpx >> 3;
- int txoff = vdpx & 7;
+ uint8_t x = vdpx - reg[HORSCR];
+ int tx = x >> 3;
+ int txoff = x & 7;
uint16_t taddr = screenmap + (((ty << 5) + tx) << 1);
int tidx = vram[taddr];
@@ -54,7 +55,7 @@
int hflip = (info & 1 << 1) != 0;
int vflip = (info & 1 << 2) != 0;
- int paloff = (info & 1 << 3) != 0 ? 0x20 : 0x00;
+ int paloff = (info & 1 << 3) != 0 ? 16 : 0;
int data = (tidx << 5) + ((vflip ? 7 - tyoff : tyoff) << 2);
int xx = 7 - txoff;
@@ -65,7 +66,7 @@
(((vram[data + 2] >> xx) & 1) << 2) +
(((vram[data + 3] >> xx) & 1) << 3);
- if(c > 0) pixeldraw(vdpx, vdpy, cramc[c + paloff]);
+ pixeldraw(vdpx, vdpy, cramc[c + paloff]);
}
int sprlst[64] = {-1};@@ -226,9 +227,8 @@
if(vdpx < 320 && vdpy < 192)
if(vdpx < xdisp){- col = reg[BGCOL] & 0x0f + 16;
- pri = 0;
- pixeldraw(vdpx, vdpy, col);
+ int c = (reg[BGCOL] & 0x0f) + 16;
+ pixeldraw(vdpx, vdpy, c);
planes();
sprites();
}else
--- a/z80.c
+++ b/z80.c
@@ -495,12 +495,12 @@
v = z80read(HL());
z80write(HL(), v >> 4 | s[rA] << 4);
s[rA] = s[rA] & 0xf0 | v & 0x0f;
- if(0){+#if 0
case 0x6f:
v = z80read(HL());
z80write(HL(), v << 4 | s[rA] & 0xf);
s[rA] = s[rA] & 0xf0 | v >> 4;
- }
+#endif
s[rF] &= FLAGC;
if(s[rA] == 0)
s[rF] |= FLAGZ;
--
⑨