notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
stupid sprite limit bug fixed
[picodrive.git]
/
Pico
/
PicoFrameHints.c
diff --git
a/Pico/PicoFrameHints.c
b/Pico/PicoFrameHints.c
index
fe2631c
..
cc77f5f
100644
(file)
--- a/
Pico/PicoFrameHints.c
+++ b/
Pico/PicoFrameHints.c
@@
-35,10
+35,10
@@
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
- int lines, y, lines_vis = 224, line_sample, skip;
+ int lines, y, lines_vis = 224, line_sample, skip
, vcnt_wrap
;
int hint; // Hint counter
int hint; // Hint counter
-
Pico.m.scanline=
0;
+
pv->v_counter = Pico.m.scanline =
0;
if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
// draw a frame just after vblank in alternative render mode
if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
// draw a frame just after vblank in alternative render mode
@@
-53,7
+53,7
@@
static int PicoFrameHints(void)
if (Pico.m.pal) {
line_sample = 68;
if (Pico.m.pal) {
line_sample = 68;
- if(pv->reg[1]&8) lines_vis = 240;
+ if
(pv->reg[1]&8) lines_vis = 240;
} else {
line_sample = 93;
}
} else {
line_sample = 93;
}
@@
-63,7
+63,6
@@
static int PicoFrameHints(void)
#ifdef PICO_CD
SekCyclesResetS68k();
#endif
#ifdef PICO_CD
SekCyclesResetS68k();
#endif
- timers_cycle();
PsndDacLine = 0;
pv->status&=~0x88; // clear V-Int, come out of vblank
PsndDacLine = 0;
pv->status&=~0x88; // clear V-Int, come out of vblank
@@
-74,9
+73,14
@@
static int PicoFrameHints(void)
// This is to make active scan longer (needed for Double Dragon 2, mainly)
CPUS_RUN(CYCLES_M68K_ASD, CYCLES_S68K_ASD);
// This is to make active scan longer (needed for Double Dragon 2, mainly)
CPUS_RUN(CYCLES_M68K_ASD, CYCLES_S68K_ASD);
- for (y
=0;y<lines_vis;
y++)
+ for (y
= 0; y < lines_vis;
y++)
{
{
- Pico.m.scanline=(short)y;
+ pv->v_counter = Pico.m.scanline = y;
+ if ((pv->reg[12]&6) == 6) { // interlace mode 2
+ pv->v_counter <<= 1;
+ pv->v_counter |= pv->v_counter >> 8;
+ pv->v_counter &= 0xff;
+ }
// VDP FIFO
pv->lwrite_cnt -= 12;
// VDP FIFO
pv->lwrite_cnt -= 12;
@@
-102,24
+106,15
@@
static int PicoFrameHints(void)
}
// decide if we draw this line
}
// decide if we draw this line
- if (!skip)
+ if (!skip
&& (PicoOpt & POPT_ALT_RENDERER)
)
{
{
- if (PicoOpt&POPT_ALT_RENDERER) {
- // find the right moment for fast renderer, when display is no longer blanked
- if ((pv->reg[1]&0x40) || y > 100) {
- PicoFrameFull();
+ // find the right moment for frame renderer, when display is no longer blanked
+ if ((pv->reg[1]&0x40) || y > 100) {
+ PicoFrameFull();
#ifdef DRAW_FINISH_FUNC
#ifdef DRAW_FINISH_FUNC
-
DRAW_FINISH_FUNC();
+ DRAW_FINISH_FUNC();
#endif
#endif
- skip = 1;
- }
- }
- else
- {
-#if !CAN_HANDLE_240_LINES
- if (y < 224)
-#endif
- PicoLine(y);
+ skip = 1;
}
}
}
}
@@
-129,7
+124,7
@@
static int PicoFrameHints(void)
emustatus &= ~1;
else if ((y == 224 || y == line_sample) && PsndOut)
{
emustatus &= ~1;
else if ((y == 224 || y == line_sample) && PsndOut)
{
- if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80))
+ if (Pico.m.z80Run &&
!Pico.m.z80_reset &&
(PicoOpt&POPT_EN_Z80))
PicoSyncZ80(SekCycleCnt);
if (ym2612.dacen && PsndDacLine <= y)
PsndDoDAC(y);
PicoSyncZ80(SekCycleCnt);
if (ym2612.dacen && PsndDacLine <= y)
PsndDoDAC(y);
@@
-144,22
+139,29
@@
static int PicoFrameHints(void)
#ifdef PICO_CD
update_chips();
#else
#ifdef PICO_CD
update_chips();
#else
- if (PicoLineHook) PicoLineHook(
1
);
+ if (PicoLineHook) PicoLineHook();
#endif
}
#endif
}
-#ifdef DRAW_FINISH_FUNC
if (!skip)
if (!skip)
+ {
+ if (DrawScanline < y)
+ PicoDrawSync(y - 1, 0);
+#ifdef DRAW_FINISH_FUNC
DRAW_FINISH_FUNC();
#endif
DRAW_FINISH_FUNC();
#endif
+ }
// V-int line (224 or 240)
// V-int line (224 or 240)
- Pico.m.scanline=(short)y;
+ Pico.m.scanline = y;
+ pv->v_counter = 0xe0; // bad for 240 mode
+ if ((pv->reg[12]&6) == 6) pv->v_counter = 0xc1;
// VDP FIFO
pv->lwrite_cnt=0;
Pico.video.status|=0x200;
// VDP FIFO
pv->lwrite_cnt=0;
Pico.video.status|=0x200;
+ memcpy(PicoPadInt, PicoPad, sizeof(PicoPadInt));
PAD_DELAY
#ifdef PICO_CD
check_cd_dma();
PAD_DELAY
#ifdef PICO_CD
check_cd_dma();
@@
-174,7
+176,6
@@
static int PicoFrameHints(void)
if (pv->reg[0]&0x10) SekInterrupt(4);
}
if (pv->reg[0]&0x10) SekInterrupt(4);
}
- // V-Interrupt:
pv->status|=0x08; // go into vblank
pv->pending_ints|=0x20;
pv->status|=0x08; // go into vblank
pv->pending_ints|=0x20;
@@
-188,7
+189,7
@@
static int PicoFrameHints(void)
elprintf(EL_INTS, "vint: @ %06x [%i]", SekPc, SekCycleCnt);
SekInterrupt(6);
}
elprintf(EL_INTS, "vint: @ %06x [%i]", SekPc, SekCycleCnt);
SekInterrupt(6);
}
- if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80)) {
+ if (Pico.m.z80Run &&
!Pico.m.z80_reset &&
(PicoOpt&POPT_EN_Z80)) {
PicoSyncZ80(SekCycleCnt);
elprintf(EL_INTS, "zint");
z80_int();
PicoSyncZ80(SekCycleCnt);
elprintf(EL_INTS, "zint");
z80_int();
@@
-213,15
+214,21
@@
static int PicoFrameHints(void)
#ifdef PICO_CD
update_chips();
#else
#ifdef PICO_CD
update_chips();
#else
- if (PicoLineHook) PicoLineHook(
1
);
+ if (PicoLineHook) PicoLineHook();
#endif
// PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
lines = Pico.m.pal ? 312 : 262;
#endif
// PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
lines = Pico.m.pal ? 312 : 262;
+ vcnt_wrap = Pico.m.pal ? 0x103 : 0xEB; // based on Gens
- for (y++;
y<lines;
y++)
+ for (y++;
y < lines;
y++)
{
{
- Pico.m.scanline=(short)y;
+ pv->v_counter = Pico.m.scanline = y;
+ if (y >= vcnt_wrap)
+ pv->v_counter -= Pico.m.pal ? 56 : 6;
+ if ((pv->reg[12]&6) == 6)
+ pv->v_counter = (pv->v_counter << 1) | 1;
+ pv->v_counter &= 0xff;
PAD_DELAY
#ifdef PICO_CD
PAD_DELAY
#ifdef PICO_CD
@@
-235,16
+242,18
@@
static int PicoFrameHints(void)
#ifdef PICO_CD
update_chips();
#else
#ifdef PICO_CD
update_chips();
#else
- if (PicoLineHook) PicoLineHook(
1
);
+ if (PicoLineHook) PicoLineHook();
#endif
}
// sync z80
#endif
}
// sync z80
- if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80))
- PicoSyncZ80(Pico.m.pal ? 151809 : 127671); // cycles adjusted for convert
o
r
+ if (Pico.m.z80Run &&
!Pico.m.z80_reset &&
(PicoOpt&POPT_EN_Z80))
+ PicoSyncZ80(Pico.m.pal ? 151809 : 127671); // cycles adjusted for convert
e
r
if (PsndOut && ym2612.dacen && PsndDacLine <= lines-1)
PsndDoDAC(lines-1);
if (PsndOut && ym2612.dacen && PsndDacLine <= lines-1)
PsndDoDAC(lines-1);
+ timers_cycle();
+
return 0;
}
return 0;
}