142 lines
4.7 KiB
C
142 lines
4.7 KiB
C
|
/***************************************************************************
|
||
|
* __________ __ ___.
|
||
|
* 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 _HARDWARE_H
|
||
|
#define _HARDWARE_H
|
||
|
|
||
|
extern unsigned char ram_[20*1024]; // ROM (16K) and RAM (4K)
|
||
|
extern unsigned char charset_rom_[4*1024]; // Character set ROM (4K)
|
||
|
extern unsigned char spriteset_rom_[4*1024]; // Sprite set ROM (4K)
|
||
|
extern unsigned char dirty_[1024];
|
||
|
extern unsigned char video_mem_[1024]; // Video memory (1K)
|
||
|
extern unsigned char color_mem_[1024]; // Color memory (1K)
|
||
|
extern unsigned char charmap_[256*8*8]; /* Character data for 256 8x8 characters */
|
||
|
extern unsigned char spritemap_[64*16*16]; /* Sprite data for 64 16x16 sprites */
|
||
|
extern unsigned char output_devices_; /* Output flip-flops set by the game program */
|
||
|
extern unsigned char interrupt_vector_;
|
||
|
extern unsigned coin_counter_;
|
||
|
extern unsigned char port1_;
|
||
|
extern unsigned char port2_;
|
||
|
extern unsigned char dip_switches_;
|
||
|
|
||
|
/* Output flip-flops */
|
||
|
enum {
|
||
|
FlipScreen = 0x01,
|
||
|
PlayerOneLight = 0x02,
|
||
|
PlayerTwoLight = 0x04,
|
||
|
InterruptEnabled = 0x08,
|
||
|
SoundEnabled = 0x10,
|
||
|
CoinLockout = 0x20,
|
||
|
CoinMeter = 0x40,
|
||
|
AuxBoardEnabled = 0x80
|
||
|
};
|
||
|
|
||
|
struct PacmanSprite
|
||
|
{
|
||
|
int mode; /** Display mode (normal or flipped) */
|
||
|
int x; /** X coordinate */
|
||
|
int y; /** Y coordinate */
|
||
|
int n; /** Shape (from 0 to 63) */
|
||
|
int color; /** Base color (0=not visible) */
|
||
|
};
|
||
|
|
||
|
/* Internal tables and structures for faster access to data */
|
||
|
extern struct PacmanSprite sprites_[8]; /* Sprites */
|
||
|
extern short vchar_to_i_[1024];
|
||
|
|
||
|
void writeByte(unsigned addr, unsigned char b);
|
||
|
unsigned char readPort( unsigned port );
|
||
|
void writePort( unsigned addr, unsigned char b );
|
||
|
void setOutputFlipFlop( unsigned char bit, unsigned char value );
|
||
|
|
||
|
/*
|
||
|
For Z80 Environment: read a byte from high memory addresses (i.e. the
|
||
|
memory-mapped registers)
|
||
|
*/
|
||
|
static inline unsigned char readByte( unsigned addr )
|
||
|
{
|
||
|
addr &= 0xFFFF;
|
||
|
|
||
|
if (addr < sizeof(ram_))
|
||
|
return ram_[addr];
|
||
|
|
||
|
// Address is not in RAM, check to see if it's a memory mapped register
|
||
|
switch( addr & 0xFFC0 ) {
|
||
|
// IN0
|
||
|
case 0x5000:
|
||
|
// bit 0 : up
|
||
|
// bit 1 : left
|
||
|
// bit 2 : right
|
||
|
// bit 3 : down
|
||
|
// bit 4 : switch: advance to next level
|
||
|
// bit 5 : coin 1
|
||
|
// bit 6 : coin 2
|
||
|
// bit 7 : credit (same as coin but coin counter is not incremented)
|
||
|
return port1_;
|
||
|
// IN1
|
||
|
case 0x5040:
|
||
|
// bit 0 : up (2nd player)
|
||
|
// bit 1 : left (2nd player)
|
||
|
// bit 2 : right (2nd player)
|
||
|
// bit 3 : down (2nd player)
|
||
|
// bit 4 : switch: rack test -> 0x10=off, 0=on
|
||
|
// bit 5 : start 1
|
||
|
// bit 6 : start 2
|
||
|
// bit 7 : cabinet -> 0x80=upright, 0x00=table
|
||
|
return port2_;
|
||
|
// DSW1
|
||
|
case 0x5080:
|
||
|
// bits 0,1 : coinage -> 0=free play, 1=1 coin/play, 2=1 coin/2 play, 3=2 coin/1 play
|
||
|
// bits 2,3 : lives -> 0x0=1, 0x4=2, 0x8=3, 0xC=5
|
||
|
// bits 4,5 : bonus life -> 0=10000, 0x10=15000, 0x20=20000, 0x30=none
|
||
|
// bit 6 : jumper pad: difficulty -> 0x40=normal, 0=hard
|
||
|
// bit 7 : jumper pad: ghost name -> 0x80=normal, 0=alternate
|
||
|
return dip_switches_;
|
||
|
// Watchdog reset
|
||
|
case 0x50C0:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0xFF;
|
||
|
}
|
||
|
|
||
|
/* Reads a 16 bit word from memory at the specified address. */
|
||
|
static inline unsigned readWord( unsigned addr ) {
|
||
|
addr &= 0xFFFF;
|
||
|
|
||
|
if (addr < (sizeof(ram_)-1)) {
|
||
|
return ram_[addr] | ((ram_[addr+1]) << 8);
|
||
|
} else {
|
||
|
return readByte(addr) | (((unsigned)readByte(addr+1)) << 8);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Writes a 16 bit word to memory at the specified address. */
|
||
|
static inline void writeWord( unsigned addr, unsigned value ) {
|
||
|
writeByte( addr, value & 0xFF );
|
||
|
writeByte( addr+1, (value >> 8) & 0xFF );
|
||
|
}
|
||
|
|
||
|
#endif
|