/** VGB: portable GameBoy emulator ***************************/
/**                                                         **/
/**                           GB.h                          **/
/**                                                         **/
/** This file contains definitions for the GameBoy hardware **/
/** emulation.                                              **/
/**                                                         **/
/** Copyright (C) Marat Fayzullin 1995                      **/
/**     You are not allowed to distribute this software     **/
/**     commercially. Please, notify me, if you make any    **/   
/**     changes to this file.                               **/
/*************************************************************/

#include "Z80.h"            /* CPU emulation declarations    */

/* #define UNIX  */         /* Compile iNES for for Unix/X   */
/* #define MSDOS */         /* Compile iNES for MSDOS/VGA    */
/* #define MITSHM */        /* Use MIT SHM extensions for X  */

#ifndef UNIX
#undef MITSHM
#endif

#define NORAM     0x00      /* Byte to be returned from      */
                            /* non-existing pages and ports  */
#define MAXCHEAT  256       /* Maximal number of GG cheats   */

#define VBL_IFLAG 0x01
#define LCD_IFLAG 0x02
#define TIM_IFLAG 0x04
#define SIO_IFLAG 0x08
#define EXT_IFLAG 0x10
 
#define JOYPAD  RAM[0xFF00] /* Joystick: 1.1.P15.P14.P13.P12.P11.P10      */
#define SIODATA RAM[0xFF01] /* Serial IO data buffer                      */
#define SIOCONT RAM[0xFF02] /* Serial IO control register                 */
#define DIVREG  RAM[0xFF04] /* Divider register (???)                     */
#define TIMECNT RAM[0xFF05] /* Timer counter. Gen. int. when it overflows */
#define TIMEMOD RAM[0xFF06] /* New value of TimeCount after it overflows  */
#define TIMEFRQ RAM[0xFF07] /* Timer frequency and start/stop switch      */
#define IFLAGS  RAM[0xFF0F] /* Interrupt flags: 0.0.0.JST.SIO.TIM.LCD.VBL */
#define ISWITCH RAM[0xFFFF] /* Switches to enable/disable interrupts      */
#define LCDCONT RAM[0xFF40] /* LCD control register                       */
#define LCDSTAT RAM[0xFF41] /* LCD status register                        */
#define SCROLLY RAM[0xFF42] /* Starting Y position of the background      */
#define SCROLLX RAM[0xFF43] /* Starting X position of the background      */
#define CURLINE RAM[0xFF44] /* Current screen line being scanned          */
#define CMPLINE RAM[0xFF45] /* Gen. int. when scan reaches this line      */
#define BGRDPAL RAM[0xFF47] /* Background palette                         */
#define SPR0PAL RAM[0xFF48] /* Sprite palette #0                          */
#define SPR1PAL RAM[0xFF49] /* Sprite palette #1                          */
#define WNDPOSY RAM[0xFF4A] /* Window Y position                          */
#define WNDPOSX RAM[0xFF4B] /* Window X position                          */


extern byte Verbose;          /* Verboseness level                        */
 
extern byte *RAM;             /* Pointer to Z80 address space (64kB)      */
 
extern byte UPeriod;          /* Number of VBlanks per screen update      */
extern int  VPeriod;          /* Number of Z80 cycles between VBlanks     */

extern byte LineDelay;        /* When 1, CMPLINE interrupts are delayed   */
extern byte CheckCRC;         /* When 1, check cartridge CRC on loading   */
extern byte AutoA,AutoB;      /* When 1, autofire emulation for A,B       */

extern char *SndName;         /* Name for the soundtrack log file         */

extern int CheatCount;        /* Current number of cheats in the list     */

extern byte BPal[4];          /* Background palette                       */
extern byte SPal0[4],SPal1[4];/* Sprite palettes                          */

extern byte *ChrGen;          /* Character generator                      */
extern byte *BgdTab,*WndTab;  /* Background and window character tables   */

extern byte IMask;            /* A mask to reset a bit in IFLAGS          */

/****************************************************************/
/*** Initialize and start GameBoy emulation. This function    ***/
/*** returns 0 in the case of failure.                        ***/
/****************************************************************/
int StartGB(char *CartName);

/****************************************************************/
/*** Free resources allocated by StartGB().                   ***/
/****************************************************************/
void TrashGB(void);

/****************************************************************/
/*** Add a cheat to the cheat list [call before StartGB()].   ***/
/****************************************************************/
int AddCheat(char *Cheat);

/****************************************************************/
/*** Allocate resources needed by the machine-dependent code. ***/
/************************************** TO BE WRITTEN BY USER ***/
int InitMachine(void);
 
/****************************************************************/
/*** Deallocate all resources taken by InitMachine().         ***/
/************************************** TO BE WRITTEN BY USER ***/
void TrashMachine(void);

/****************************************************************/
/*** Refresh screen.                                          ***/
/************************************** TO BE WRITTEN BY USER ***/
void RefreshScreen(void);

/****************************************************************/
/*** Refresh line Y [0-143].                                  ***/
/************************************** TO BE WRITTEN BY USER ***/
void RefreshLine(byte Y);

/****************************************************************/
/*** Refresh sprites.                                         ***/
/************************************** TO BE WRITTEN BY USER ***/
void RefreshSprites(void);

/****************************************************************/
/*** Get joystick state: START.SELECT.B.A.D.U.L.R.            ***/
/************************************** TO BE WRITTEN BY USER ***/
byte Joystick(void);

/****************************************************************/
/*** Write value into sound chip register (Reg #0 at FF10h).  ***/
/************************************** TO BE WRITTEN BY USER ***/
void Sound(byte R,byte V);

/****************************************************************/
/*** Send a byte onto the serial line. Returns 1 on success,  ***/
/*** 0 otherwise.                                             ***/
/************************************** TO BE WRITTEN BY USER ***/
byte SIOSend(byte V);

/****************************************************************/
/*** Receive a byte from the serial line. Returns 1 on        ***/
/*** success, 0 otherwise.                                    ***/
/************************************** TO BE WRITTEN BY USER ***/
byte SIOReceive(byte *V);
