notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
timer adjustments based on Nem's new info
[picodrive.git]
/
Pico
/
PicoInt.h
diff --git
a/Pico/PicoInt.h
b/Pico/PicoInt.h
index
06f4c64
..
c9aa1aa
100644
(file)
--- a/
Pico/PicoInt.h
+++ b/
Pico/PicoInt.h
@@
-237,7
+237,8
@@
struct PicoVideo
int status; // Status bits
\r
unsigned char pending_ints; // pending interrupts: ??VH????
\r
signed char lwrite_cnt; // VDP write count during active display line
\r
int status; // Status bits
\r
unsigned char pending_ints; // pending interrupts: ??VH????
\r
signed char lwrite_cnt; // VDP write count during active display line
\r
- unsigned char pad[0x12];
\r
+ unsigned short v_counter; // V-counter
\r
+ unsigned char pad[0x10];
\r
};
\r
\r
struct PicoMisc
\r
};
\r
\r
struct PicoMisc
\r
@@
-245,7
+246,7
@@
struct PicoMisc
unsigned char rotate;
\r
unsigned char z80Run;
\r
unsigned char padTHPhase[2]; // 02 phase of gamepad TH switches
\r
unsigned char rotate;
\r
unsigned char z80Run;
\r
unsigned char padTHPhase[2]; // 02 phase of gamepad TH switches
\r
- short scanline; // 04 0 to 261||311; -1 in fast mode
\r
+ unsigned short scanline; // 04 0 to 261||311
\r
char dirtyPal; // 06 Is the palette dirty (1 - change @ this frame, 2 - some time before)
\r
unsigned char hardware; // 07 Hardware value for country
\r
unsigned char pal; // 08 1=PAL 0=NTSC
\r
char dirtyPal; // 06 Is the palette dirty (1 - change @ this frame, 2 - some time before)
\r
unsigned char hardware; // 07 Hardware value for country
\r
unsigned char pal; // 08 1=PAL 0=NTSC
\r
@@
-259,9
+260,9
@@
struct PicoMisc
unsigned char eeprom_cycle; // EEPROM SRAM cycle number
\r
unsigned char eeprom_slave; // EEPROM slave word for X24C02 and better SRAMs
\r
unsigned char prot_bytes[2]; // simple protection faking
\r
unsigned char eeprom_cycle; // EEPROM SRAM cycle number
\r
unsigned char eeprom_slave; // EEPROM slave word for X24C02 and better SRAMs
\r
unsigned char prot_bytes[2]; // simple protection faking
\r
- unsigned short dma_xfers;
\r
+ unsigned short dma_xfers;
// 18
\r
unsigned char pad[2];
\r
unsigned char pad[2];
\r
- unsigned int frame_count;
// mainly for movies
\r
+ unsigned int frame_count;
// 1c for movies and idle det
\r
};
\r
\r
// some assembly stuff depend on these, do not touch!
\r
};
\r
\r
// some assembly stuff depend on these, do not touch!
\r
@@
-371,8
+372,8
@@
typedef struct
\r
\r
// Area.c
\r
\r
\r
// Area.c
\r
-PICO_INTERNAL
int
PicoAreaPackCpu(unsigned char *cpu, int is_sub);
\r
-PICO_INTERNAL
int
PicoAreaUnpackCpu(unsigned char *cpu, int is_sub);
\r
+PICO_INTERNAL
void
PicoAreaPackCpu(unsigned char *cpu, int is_sub);
\r
+PICO_INTERNAL
void
PicoAreaUnpackCpu(unsigned char *cpu, int is_sub);
\r
extern void (*PicoLoadStateHook)(void);
\r
\r
// cd/Area.c
\r
extern void (*PicoLoadStateHook)(void);
\r
\r
// cd/Area.c
\r
@@
-394,14
+395,15
@@
extern void (*PicoCartUnloadHook)(void);
int CM_compareRun(int cyc, int is_sub);
\r
\r
// Draw.c
\r
int CM_compareRun(int cyc, int is_sub);
\r
\r
// Draw.c
\r
-PICO_INTERNAL int PicoLine(int scan);
\r
PICO_INTERNAL void PicoFrameStart(void);
\r
PICO_INTERNAL void PicoFrameStart(void);
\r
+void PicoDrawSync(int to, int blank_last_line);
\r
+extern int DrawScanline;
\r
\r
// Draw2.c
\r
PICO_INTERNAL void PicoFrameFull();
\r
\r
// Memory.c
\r
\r
// Draw2.c
\r
PICO_INTERNAL void PicoFrameFull();
\r
\r
// Memory.c
\r
-PICO_INTERNAL
int
PicoInitPc(unsigned int pc);
\r
+PICO_INTERNAL
void
PicoInitPc(unsigned int pc);
\r
PICO_INTERNAL unsigned int PicoCheckPc(unsigned int pc);
\r
PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a);
\r
PICO_INTERNAL void PicoMemSetup(void);
\r
PICO_INTERNAL unsigned int PicoCheckPc(unsigned int pc);
\r
PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a);
\r
PICO_INTERNAL void PicoMemSetup(void);
\r
@@
-441,14
+443,14
@@
PICO_INTERNAL void PicoDetectRegion(void);
PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done);
\r
\r
// cd/Pico.c
\r
PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done);
\r
\r
// cd/Pico.c
\r
-PICO_INTERNAL
int
PicoInitMCD(void);
\r
+PICO_INTERNAL
void
PicoInitMCD(void);
\r
PICO_INTERNAL void PicoExitMCD(void);
\r
PICO_INTERNAL void PicoPowerMCD(void);
\r
PICO_INTERNAL void PicoExitMCD(void);
\r
PICO_INTERNAL void PicoPowerMCD(void);
\r
-PICO_INTERNAL int PicoResetMCD(void);
\r
-PICO_INTERNAL
int
PicoFrameMCD(void);
\r
+PICO_INTERNAL int
PicoResetMCD(void);
\r
+PICO_INTERNAL
void
PicoFrameMCD(void);
\r
\r
// Pico/Pico.c
\r
\r
// Pico/Pico.c
\r
-PICO_INTERNAL
int
PicoInitPico(void);
\r
+PICO_INTERNAL
void
PicoInitPico(void);
\r
PICO_INTERNAL void PicoReratePico(void);
\r
\r
// Pico/xpcm.c
\r
PICO_INTERNAL void PicoReratePico(void);
\r
\r
// Pico/xpcm.c
\r
@@
-457,44
+459,53
@@
PICO_INTERNAL void PicoPicoPCMReset(void);
PICO_INTERNAL void PicoPicoPCMRerate(int xpcm_rate);
\r
\r
// Sek.c
\r
PICO_INTERNAL void PicoPicoPCMRerate(int xpcm_rate);
\r
\r
// Sek.c
\r
-PICO_INTERNAL
int
SekInit(void);
\r
-PICO_INTERNAL int SekReset(void);
\r
+PICO_INTERNAL
void
SekInit(void);
\r
+PICO_INTERNAL int
SekReset(void);
\r
PICO_INTERNAL void SekState(int *data);
\r
PICO_INTERNAL void SekSetRealTAS(int use_real);
\r
PICO_INTERNAL void SekState(int *data);
\r
PICO_INTERNAL void SekSetRealTAS(int use_real);
\r
+void SekInitIdleDet(void);
\r
+void SekFinishIdleDet(void);
\r
\r
// cd/Sek.c
\r
\r
// cd/Sek.c
\r
-PICO_INTERNAL
int
SekInitS68k(void);
\r
-PICO_INTERNAL int SekResetS68k(void);
\r
-PICO_INTERNAL int SekInterruptS68k(int irq);
\r
+PICO_INTERNAL
void
SekInitS68k(void);
\r
+PICO_INTERNAL int
SekResetS68k(void);
\r
+PICO_INTERNAL int
SekInterruptS68k(int irq);
\r
\r
// sound/sound.c
\r
PICO_INTERNAL void cdda_start_play();
\r
extern short cdda_out_buffer[2*1152];
\r
extern int PsndLen_exc_cnt;
\r
extern int PsndLen_exc_add;
\r
\r
// sound/sound.c
\r
PICO_INTERNAL void cdda_start_play();
\r
extern short cdda_out_buffer[2*1152];
\r
extern int PsndLen_exc_cnt;
\r
extern int PsndLen_exc_add;
\r
-extern int timer_a_next_oflow, timer_a_step
, timer_a_offset
; // in z80 cycles
\r
-extern int timer_b_next_oflow, timer_b_step
, timer_b_offset
;
\r
+extern int timer_a_next_oflow, timer_a_step; // in z80 cycles
\r
+extern int timer_b_next_oflow, timer_b_step;
\r
\r
void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new);
\r
void ym2612_pack_state(void);
\r
void ym2612_unpack_state(void);
\r
\r
\r
void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new);
\r
void ym2612_pack_state(void);
\r
void ym2612_unpack_state(void);
\r
\r
+#define TIMER_NO_OFLOW 0x70000000
\r
+// tA = 72 * (1024 - NA) / M
\r
+#define TIMER_A_TICK_ZCYCLES 17203
\r
+// tB = 1152 * (256 - NA) / M
\r
+#define TIMER_B_TICK_ZCYCLES 262800 // 275251 broken, see Dai Makaimura
\r
+
\r
#define timers_cycle() \
\r
#define timers_cycle() \
\r
- if (timer_a_next_oflow > 0 && timer_a_next_oflow <
0x70000000
) \
\r
+ if (timer_a_next_oflow > 0 && timer_a_next_oflow <
TIMER_NO_OFLOW
) \
\r
timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \
\r
timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \
\r
- if (timer_b_next_oflow > 0 && timer_b_next_oflow <
0x70000000
) \
\r
+ if (timer_b_next_oflow > 0 && timer_b_next_oflow <
TIMER_NO_OFLOW
) \
\r
timer_b_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \
\r
ym2612_sync_timers(0, ym2612.OPN.ST.mode, ym2612.OPN.ST.mode);
\r
\r
#define timers_reset() \
\r
timer_b_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \
\r
ym2612_sync_timers(0, ym2612.OPN.ST.mode, ym2612.OPN.ST.mode);
\r
\r
#define timers_reset() \
\r
- timer_a_next_oflow = timer_b_next_oflow =
0x70000000
; \
\r
- timer_a_step =
timer_a_offset = 16495
* 1024; \
\r
- timer_b_step =
timer_b_offset = 263912
* 256;
\r
+ timer_a_next_oflow = timer_b_next_oflow =
TIMER_NO_OFLOW
; \
\r
+ timer_a_step =
TIMER_A_TICK_ZCYCLES
* 1024; \
\r
+ timer_b_step =
TIMER_B_TICK_ZCYCLES
* 256;
\r
\r
\r
// VideoPort.c
\r
PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d);
\r
PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a);
\r
\r
\r
// VideoPort.c
\r
PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d);
\r
PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a);
\r
+PICO_INTERNAL_ASM unsigned int PicoVideoRead8(unsigned int a);
\r
extern int (*PicoDmaHook)(unsigned int source, int len, unsigned short **srcp, unsigned short **limitp);
\r
\r
// Misc.c
\r
extern int (*PicoDmaHook)(unsigned int source, int len, unsigned short **srcp, unsigned short **limitp);
\r
\r
// Misc.c
\r
@@
-551,6
+562,7
@@
extern int PsndDacLine;
#define EL_CDPOLL 0x00002000 /* MCD: log poll detection */
\r
#define EL_SVP 0x00004000 /* SVP stuff */
\r
#define EL_PICOHW 0x00008000 /* Pico stuff */
\r
#define EL_CDPOLL 0x00002000 /* MCD: log poll detection */
\r
#define EL_SVP 0x00004000 /* SVP stuff */
\r
#define EL_PICOHW 0x00008000 /* Pico stuff */
\r
+#define EL_IDLE 0x00010000 /* idle loop det. */
\r
\r
#define EL_STATUS 0x40000000 /* status messages */
\r
#define EL_ANOMALY 0x80000000 /* some unexpected conditions (during emulation) */
\r
\r
#define EL_STATUS 0x40000000 /* status messages */
\r
#define EL_ANOMALY 0x80000000 /* some unexpected conditions (during emulation) */
\r