/*************************************************************************** * __________ __ ___. * 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/ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * 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