notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
some support for 128k mode
[picodrive.git]
/
pico
/
videoport.c
diff --git
a/pico/videoport.c
b/pico/videoport.c
index
3f26d58
..
b14e70f
100644
(file)
--- a/
pico/videoport.c
+++ b/
pico/videoport.c
@@
-29,6
+29,13
@@
static __inline void AutoIncrement(void)
Pico.video.addr=(unsigned short)(Pico.video.addr+Pico.video.reg[0xf]);
\r
}
\r
\r
Pico.video.addr=(unsigned short)(Pico.video.addr+Pico.video.reg[0xf]);
\r
}
\r
\r
+static NOINLINE void VideoWrite128(u32 a, u16 d)
\r
+{
\r
+ // nasty
\r
+ a = ((a & 2) >> 1) | ((a & 0x400) >> 9) | (a & 0x3FC) | ((a & 0x1F800) >> 1);
\r
+ ((u8 *)Pico.vram)[a] = d;
\r
+}
\r
+
\r
static void VideoWrite(u16 d)
\r
{
\r
unsigned int a=Pico.video.addr;
\r
static void VideoWrite(u16 d)
\r
{
\r
unsigned int a=Pico.video.addr;
\r
@@
-43,6
+50,10
@@
static void VideoWrite(u16 d)
case 3: Pico.m.dirtyPal = 1;
\r
Pico.cram [(a>>1)&0x003f]=d; break; // wraps (Desert Strike)
\r
case 5: Pico.vsram[(a>>1)&0x003f]=d; break;
\r
case 3: Pico.m.dirtyPal = 1;
\r
Pico.cram [(a>>1)&0x003f]=d; break; // wraps (Desert Strike)
\r
case 5: Pico.vsram[(a>>1)&0x003f]=d; break;
\r
+ case 0x81:
\r
+ a |= Pico.video.addr_u << 16;
\r
+ VideoWrite128(a, d);
\r
+ break;
\r
//default:elprintf(EL_ANOMALY, "VDP write %04x with bad type %i", d, Pico.video.type); break;
\r
}
\r
\r
//default:elprintf(EL_ANOMALY, "VDP write %04x with bad type %i", d, Pico.video.type); break;
\r
}
\r
\r
@@
-186,6
+197,17
@@
static void DmaSlow(int len, unsigned int source)
}
\r
break;
\r
\r
}
\r
break;
\r
\r
+ case 0x81: // vram 128k
\r
+ a |= Pico.video.addr_u << 16;
\r
+ for(; len; len--)
\r
+ {
\r
+ VideoWrite128(a, base[source++ & mask]);
\r
+ // AutoIncrement
\r
+ a = (a + inc) & 0x1ffff;
\r
+ }
\r
+ Pico.video.addr_u = a >> 16;
\r
+ break;
\r
+
\r
default:
\r
if (Pico.video.type != 0 || (EL_LOGMASK & EL_VDPDMA))
\r
elprintf(EL_VDPDMA|EL_ANOMALY, "DMA with bad type %i", Pico.video.type);
\r
default:
\r
if (Pico.video.type != 0 || (EL_LOGMASK & EL_VDPDMA))
\r
elprintf(EL_VDPDMA|EL_ANOMALY, "DMA with bad type %i", Pico.video.type);
\r
@@
-303,20
+325,23
@@
static NOINLINE void CommandDma(void)
Pico.video.reg[0x16] = source >> 8;
\r
}
\r
\r
Pico.video.reg[0x16] = source >> 8;
\r
}
\r
\r
-static void CommandChange(void)
\r
+static
NOINLINE
void CommandChange(void)
\r
{
\r
{
\r
- struct PicoVideo *pvid
=
&Pico.video;
\r
- unsigned int cmd
=0,addr=0
;
\r
+ struct PicoVideo *pvid
=
&Pico.video;
\r
+ unsigned int cmd
, addr
;
\r
\r
\r
- cmd
=
pvid->command;
\r
+ cmd
=
pvid->command;
\r
\r
// Get type of transfer 0xc0000030 (v/c/vsram read/write)
\r
\r
// Get type of transfer 0xc0000030 (v/c/vsram read/write)
\r
- pvid->type=(unsigned char)(((cmd>>2)&0xc)|(cmd>>30));
\r
+ pvid->type = (u8)(((cmd >> 2) & 0xc) | (cmd >> 30));
\r
+ if (pvid->type == 1) // vram
\r
+ pvid->type |= pvid->reg[1] & 0x80; // 128k
\r
\r
// Get address 0x3fff0003
\r
\r
// Get address 0x3fff0003
\r
- addr =(cmd>>16)&0x3fff;
\r
- addr|=(cmd<<14)&0xc000;
\r
- pvid->addr=(unsigned short)addr;
\r
+ addr = (cmd >> 16) & 0x3fff;
\r
+ addr |= (cmd << 14) & 0xc000;
\r
+ pvid->addr = (u16)addr;
\r
+ pvid->addr_u = (u8)((cmd >> 2) & 1);
\r
}
\r
\r
static void DrawSync(int blank_on)
\r
}
\r
\r
static void DrawSync(int blank_on)
\r