forked from len0rd/rockbox
pacbox - a Pacman arcade machine emulator. Currently working for all colour targets and the iriver H1x0. Requires the Pacman arcade machine ROMs in /.rockbox/pacman/
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9001 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1246668a78
commit
a814584c87
13 changed files with 11079 additions and 1 deletions
199
apps/plugins/pacbox/arcade.h
Normal file
199
apps/plugins/pacbox/arcade.h
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Pacbox - a Pacman Emulator for Rockbox
|
||||
*
|
||||
* Based on PIE - Pacman Instructional Emulator
|
||||
*
|
||||
* Copyright (c) 1997-2003,2004 Alessandro Scotti
|
||||
* http://www.ascotti.org/
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ARCADE_H_
|
||||
#define ARCADE_H_
|
||||
|
||||
#include "plugin.h"
|
||||
#include "z80.h"
|
||||
#include "hardware.h"
|
||||
|
||||
extern fb_data palette[256]; /* Color palette in native Rockbox format */
|
||||
|
||||
/**
|
||||
Pacman sprite properties.
|
||||
|
||||
This information is only needed by applications that want to do their own
|
||||
sprite rendering, as the renderVideo() function already draws the sprites.
|
||||
|
||||
@see PacmanMachine::renderVideo
|
||||
*/
|
||||
|
||||
/** Machine hardware data */
|
||||
enum {
|
||||
ScreenWidth = 224,
|
||||
ScreenHeight = 288,
|
||||
ScreenWidthChars = 28,
|
||||
ScreenHeightChars = 36,
|
||||
CharWidth = 8,
|
||||
CharHeight = 8,
|
||||
VideoFrequency = 60,
|
||||
CpuClock = 3072000,
|
||||
SoundClock = 96000, // CPU clock divided by 32
|
||||
CpuCyclesPerFrame = CpuClock / VideoFrequency
|
||||
};
|
||||
|
||||
/** Input devices and switches */
|
||||
enum InputDevice {
|
||||
Joy1_Up = 0,
|
||||
Joy1_Left,
|
||||
Joy1_Right,
|
||||
Joy1_Down,
|
||||
Switch_RackAdvance,
|
||||
CoinSlot_1,
|
||||
CoinSlot_2,
|
||||
Switch_AddCredit,
|
||||
Joy2_Up,
|
||||
Joy2_Left,
|
||||
Joy2_Right,
|
||||
Joy2_Down,
|
||||
Switch_Test,
|
||||
Key_OnePlayer,
|
||||
Key_TwoPlayers,
|
||||
Switch_CocktailMode
|
||||
};
|
||||
|
||||
/** Input device mode */
|
||||
enum InputDeviceMode {
|
||||
DeviceOn,
|
||||
DevicePushed = DeviceOn,
|
||||
DeviceOff,
|
||||
DeviceReleased = DeviceOff,
|
||||
DeviceToggle
|
||||
};
|
||||
|
||||
/** DIP switches */
|
||||
enum {
|
||||
DipPlay_Free = 0x00, // Coins per play
|
||||
DipPlay_OneCoinOneGame = 0x01,
|
||||
DipPlay_OneCoinTwoGames = 0x02,
|
||||
DipPlay_TwoCoinsOneGame = 0x03,
|
||||
DipPlay_Mask = 0x03,
|
||||
DipLives_1 = 0x00, // Lives per game
|
||||
DipLives_2 = 0x04,
|
||||
DipLives_3 = 0x08,
|
||||
DipLives_5 = 0x0C,
|
||||
DipLives_Mask = 0x0C,
|
||||
DipBonus_10000 = 0x00, // Bonus life
|
||||
DipBonus_15000 = 0x10,
|
||||
DipBonus_20000 = 0x20,
|
||||
DipBonus_None = 0x30,
|
||||
DipBonus_Mask = 0x30,
|
||||
DipDifficulty_Normal = 0x40, // Difficulty
|
||||
DipDifficulty_Hard = 0x00,
|
||||
DipDifficulty_Mask = 0x40,
|
||||
DipGhostNames_Normal = 0x80, // Ghost names
|
||||
DipGhostNames_Alternate = 0x00,
|
||||
DipGhostNames_Mask = 0x80,
|
||||
DipMode_Play = 0x0000, // Play/test mode
|
||||
DipMode_Test = 0x0100,
|
||||
DipMode_Mask = 0x0100,
|
||||
DipCabinet_Upright = 0x0000, // Cabinet upright/cocktail
|
||||
DipCabinet_Cocktail = 0x0200,
|
||||
DipCabinet_Mask = 0x0200,
|
||||
DipRackAdvance_Off = 0x0000, // Automatic level advance
|
||||
DipRackAdvance_Auto = 0x0400,
|
||||
DipRackAdvance_Mask = 0x0400
|
||||
};
|
||||
|
||||
void init_PacmanMachine(int dip);
|
||||
int run(void);
|
||||
void reset_PacmanMachine(void);
|
||||
void decodeROMs(void);
|
||||
|
||||
/**
|
||||
Tells the emulator that the status of an input device has changed.
|
||||
*/
|
||||
void setDeviceMode( enum InputDevice device, enum InputDeviceMode mode );
|
||||
|
||||
/**
|
||||
Returns the value of the DIP switches.
|
||||
*/
|
||||
unsigned getDipSwitches(void);
|
||||
|
||||
/**
|
||||
Sets the value of the DIP switches that control several game settings
|
||||
(see the Dip... constants above).
|
||||
|
||||
Most of the DIP switches are read at program startup and take effect
|
||||
only after a machine reset.
|
||||
*/
|
||||
void setDipSwitches( unsigned value );
|
||||
|
||||
/**
|
||||
Draws the current video into the specified buffer.
|
||||
|
||||
The buffer must be at least 224*288 bytes long. Pixels are stored in
|
||||
left-to-right/top-to-bottom order starting from the upper left corner.
|
||||
There is one byte per pixel, containing an index into the color palette
|
||||
returned by getPalette().
|
||||
|
||||
It's up to the application to display the buffer to the user. The
|
||||
code might look like this:
|
||||
<BLOCKQUOTE>
|
||||
<PRE>
|
||||
@@ unsigned char video_buffer[ PacmanMachine::ScreenWidth * PacmanMachine::ScreenHeight ];
|
||||
@@ unsigned char * vbuf = video_buffer;
|
||||
@@ const unsigned * palette = arcade.getPalette();
|
||||
@@
|
||||
@@ arcade.renderVideo( vbuf );
|
||||
@@
|
||||
@@ for( int y=0; y<PacmanMachine::ScreenHeight; y++ ) {
|
||||
@@ for( int x=0; x<PacmanMachine::ScreenWidth; x++ ) {
|
||||
@@ unsigned color = palette[ *vbuf++ ];
|
||||
@@ unsigned char red = color & 0xFF;
|
||||
@@ unsigned char green = (color >> 8) & 0xFF;
|
||||
@@ unsigned char blue = (color >> 16) & 0xFF;
|
||||
@@
|
||||
@@ setPixel( x, y, red, green, blue );
|
||||
@@ }
|
||||
@@ }
|
||||
</PRE>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
*/
|
||||
bool renderBackground( unsigned char * buffer );
|
||||
void renderSprites( unsigned char * buffer );
|
||||
|
||||
/**
|
||||
Enables/disables a common speed hack that allows Pacman to
|
||||
move four times faster than the ghosts.
|
||||
|
||||
@param enabled true to enabled the hack, false to disable
|
||||
|
||||
@return 0 if successful, otherwise the patch could not be applied
|
||||
(probably because the loaded ROM set does not support it)
|
||||
*/
|
||||
int setSpeedHack( int enabled );
|
||||
|
||||
/* Implementation of the Z80 Environment interface */
|
||||
unsigned char readByteHigh( unsigned addr );
|
||||
|
||||
void writeByte( unsigned, unsigned char );
|
||||
|
||||
unsigned char readPort( unsigned port );
|
||||
|
||||
void writePort( unsigned, unsigned char );
|
||||
|
||||
#endif // ARCADE_H_
|
||||
Loading…
Add table
Add a link
Reference in a new issue