1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/***************************************************************************
* __________ __ ___.
* 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
|