#ifndef _MDEP_H_ #define _MDEP_H_ FILE *debugf; #define CARRYBIT (1<<12) #define A0BIT 1 /* for Zonn translation :) */ #define SAR16(var,arg) ( ( (signed short int) var ) >> arg ) /* for setting/checking the A0 flag */ #define SETA0(var) ( RCacc_a0 = var ) #define GETA0() ( RCacc_a0 ) /* for setting/checking the Carry flag */ #define SETFC(val) ( RCflag_C = val ) #define GETFC() ( ( RCflag_C >> 8 ) & 0xFF ) /* Contorted sign-extend macro only evaluates its parameter once, and executes in two shifts. This is far more efficient that any other sign extend procedure I can think of, and relatively safe */ #define SEX(twelvebit) ((((int)twelvebit) << (int)((sizeof(int)*8)-12)) \ >> (int)((sizeof(int)*8)-12)) /* Mouse values currently sampled once per frame and set in WAI code. This is not ideal. */ /* Define new types for the c-cpu emulator */ #define SW_ABORT 0x100 /* for ioSwitches */ #define UINT32 unsigned int #define UINT16 unsigned short int #define UINT8 unsigned char #define INT32 signed int #define INT16 signed short int #define INT8 signed char static UINT8 bBailOut = FALSE; static UINT8 rom[0x2000] = #include "tailgunner-data.c" /* Preload whole eprom here */ static UINT8 ccpu_jmi_dip = 0; /* as set by cineSetJMI */ static UINT8 ccpu_msize = 0; /* as set by cineSetMSize */ static UINT8 ccpu_monitor = 0; /* as set by cineSetMonitor */ typedef short unsigned int RCCINEWORD; /* 12bits on the C-CPU */ typedef unsigned char RCCINEBYTE; /* 8 (or less) bits on the C-CPU */ typedef short signed int RCCINESWORD; /* 12bits on the C-CPU */ typedef signed char RCCINESBYTE; /* 8 (or less) bits on the C-CPU */ typedef enum { RCstate_A = 0, RCstate_AA, RCstate_B, RCstate_BB } RCCINESTATE; /* current RCstate */ /* C-CPU context information begins -- */ RCCINEWORD RCregister_PC = 0; /* C-CPU registers; program counter */ RCCINEWORD RCregister_A = 0; /* ; A-Register (accumulator) */ RCCINEWORD RCregister_B = 0; /* ; B-Register (accumulator) */ RCCINEBYTE RCregister_I = 0; /* ; I-Register (last access RAM location) */ RCCINEWORD RCregister_J = 0; /* ; J-Register (target address for JMP opcodes) */ RCCINEBYTE RCregister_P = 0; /* ; Page-Register (4 bits) */ RCCINEWORD RCFromX = 0; /* ; X-Register (start of a vector) */ RCCINEWORD RCFromY = 0; /* ; Y-Register (start of a vector) */ RCCINEWORD RCregister_T = 0; /* ; T-Register (vector draw length timer) */ RCCINEWORD RCflag_C = 0; /* C-CPU flags; carry. Is word sized, instead * of RCCINEBYTE, so we can do direct assignment * and then change to BYTE during inspection. */ RCCINEWORD RCcmp_old = 0; /* last accumulator value */ RCCINEWORD RCcmp_new = 0; /* new accumulator value */ RCCINEBYTE RCacc_a0 = 0; /* bit0 of A-reg at last accumulator access */ RCCINESTATE RCstate = RCstate_A; /* C-CPU RCstate machine current RCstate */ RCCINEWORD RCram [ 256 ]; /* C-CPU RCram (for all pages) */ RCCINEBYTE RCvgShiftLength = 0; /* number of shifts loaded into length reg */ /* -- Context information ends. */ UINT8 bFlipX; UINT8 bFlipY; UINT8 bSwapXY; /*UINT8 bOverlay;*/ volatile static UINT32 dwElapsedTicks = 0; UINT16 ioSwitches; UINT16 ioInputs; UINT8 ioOutputs = 0; /* Where are these used??? */ UINT16 RCvgColour = 0; INT16 JoyX; INT16 JoyY; UINT8 bNewFrame; INT32 sdwGameXSize; INT32 sdwGameYSize; INT32 sdwXOffset = 0; INT32 sdwYOffset = 0; /* Now the same information for Graham's machine */ /* Define new types for the c-cpu emulator */ typedef short unsigned int CINEWORD; /* 12bits on the C-CPU */ typedef unsigned char CINEBYTE; /* 8 (or less) bits on the C-CPU */ typedef short signed int CINESWORD; /* 12bits on the C-CPU */ typedef signed char CINESBYTE; /* 8 (or less) bits on the C-CPU */ typedef unsigned long int CINELONG; typedef enum { state_A = 0, state_AA, state_B, state_BB } CINESTATE; /* C-CPU context information begins -- */ CINEWORD register_PC = 0; /* C-CPU registers; program counter */ /*register*/ CINEWORD register_A = 0; /* A-Register (accumulator) */ /*register*/ CINEWORD register_B = 0; /* B-Register (accumulator) */ CINEWORD /*CINEBYTE*/ register_I = 0; /* I-Register (last access RAM location) */ CINEWORD register_J = 0; /* J-Register (target address for JMP opcodes) */ CINEWORD /*CINEBYTE*/ register_P = 0; /* Page-Register (4 bits, shifts to high short nibble for code, hight byte nibble for ram) */ CINEWORD FromX = 0; /* X-Register (start of a vector) */ CINEWORD FromY = 0; /* Y-Register (start of a vector) */ CINEWORD register_T = 0; /* T-Register (vector draw length timer) */ CINEWORD flag_C = 0; /* C-CPU flags; carry. Is word sized, instead * of CINEBYTE, so we can do direct assignment * and then change to BYTE during inspection. */ CINEWORD cmp_old = 0; /* last accumulator value */ CINEWORD cmp_new = 0; /* new accumulator value */ /*CINEBYTE*/CINEWORD acc_a0 = 0; /* bit0 of A-reg at last accumulator access */ CINESTATE state = state_A; /* C-CPU state machine current state */ CINEWORD ram[256]; /* C-CPU ram (for all pages) */ #ifdef NEVER int ccpu_jmi_dip = 0; /* as set by cineSetJMI Use EI, not MI */ int ccpu_msize = 0; /* as set by cineSetMSize */ int ccpu_monitor = 0; /* as set by cineSetMonitor */ int bNewFrame = 0; int bFlipX = 0; int bFlipY = 0; int bSwapXY = 0; int sdwGameXSize = 0; int sdwGameYSize = 0; int sdwXOffset = 0; int sdwYOffset = 0; #endif CINEWORD vgColour = 0; CINEBYTE vgShiftLength = 0; /* number of shifts loaded into length reg */ int bailOut = 0; int ccpu_ICount = 0; /* */ /* -- Context information ends. */ /* debug junk */ #ifdef DUALCPU int ccpudebug = 1; /* default is on */ #else int ccpudebug = 0; /* default is off */ #endif /*** const int xmousethresh = 2; const int ymousethresh = 2; static int mickeyx = 0; static int mickeyy = 0; static int mousecode = 0; ***/ static int Frames = 0; /* INP $8 ? */ #define IO_START 0x80 /* INP $7 ? */ #define IO_SHIELDS 0x40 #define IO_FIRE 0x20 #define IO_DOWN 0x10 #define IO_UP 0x08 #define IO_LEFT 0x04 #define IO_RIGHT 0x02 #define SW_QUARTERS_PER_GAME 0x01 #define IO_COIN 0x80 #define IO_KNOWNBITS (IO_START | IO_SHIELDS | IO_FIRE | IO_DOWN | IO_LEFT | IO_RIGHT) /* initial value of shields (on a DIP) */ #define SW_SHIELDS80 ((1<<1) | (1<<4) | (1<<5)) /* 000 */ #define SW_SHIELDS70 ((1<<1) | (0<<4) | (1<<5)) /* 010 */ #define SW_SHIELDS60 ((1<<1) | (1<<4) | (0<<5)) /* 001 */ #define SW_SHIELDS50 ((1<<1) | (0<<4) | (0<<5)) /* 011 */ #define SW_SHIELDS40 ((0<<1) | (1<<4) | (1<<5)) /* 100 */ #define SW_SHIELDS30 ((0<<1) | (0<<4) | (1<<5)) /* 110 */ #define SW_SHIELDS20 ((0<<1) | (1<<4) | (0<<5)) /* 101 */ #define SW_SHIELDS15 ((0<<1) | (0<<4) | (0<<5)) /* 111 */ #define SW_SHIELDS15 ((0<<1) | (0<<4) | (0<<5)) /* 111 */ #define SW_SHIELDS SW_SHIELDS80 #define SW_SHIELDMASK ((1<<1) | (1<<4) | (1<<5)) /* 000 */ static int startflag = IO_START; static int coinflag = 0; static int shieldsflag = IO_SHIELDS; /* Whether shields are up (mouse or key) */ static int fireflag = IO_FIRE; static int quarterflag = SW_QUARTERS_PER_GAME; /* 1 quarter per game */ /* RCstate setting macros to exit opcode handler */ #define jumpCineRet_A RCstate = RCstate_A; \ goto cineExecBottom; #define jumpCineRet_B RCstate = RCstate_B; \ goto cineExecBottom; #define jumpCineRet_AA RCstate = RCstate_AA; \ goto cineExecBottom; #define jumpCineRet_BB RCstate = RCstate_BB; \ goto cineExecBottom; #define jumpCineRet_WEIRD if (debugf) fprintf(debugf, "Didn't bother yet.\n" ); \ exit ( 0 ); #endif