libsidplayfp  1.2.2
c64.h
1 /*
2  * This file is part of libsidplayfp, a SID player engine.
3  *
4  * Copyright 2011-2013 Leandro Nini <drfiemost@users.sourceforge.net>
5  * Copyright 2007-2010 Antti Lankila
6  * Copyright 2000 Simon White
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef C64_H
24 #define C64_H
25 
26 #include <stdint.h>
27 #include <cstdio>
28 
29 #include "Banks/IOBank.h"
30 #include "Banks/ColorRAMBank.h"
31 #include "Banks/DisconnectedBusBank.h"
32 #include "Banks/SidBank.h"
33 #include "Banks/ExtraSidBank.h"
34 
35 #include "sidplayfp/EventScheduler.h"
36 
37 #include "sidplayfp/c64/c64env.h"
38 #include "sidplayfp/c64/c64cpu.h"
39 #include "sidplayfp/c64/c64cia.h"
40 #include "sidplayfp/c64/c64vic.h"
41 #include "sidplayfp/c64/mmu.h"
42 
43 #ifdef HAVE_CONFIG_H
44 # include "config.h"
45 #endif
46 
47 class c64sid;
48 class sidmemory;
49 
50 
51 #ifdef PC64_TESTSUITE
52 class testEnv
53 {
54 public:
55  virtual ~testEnv() {}
56  virtual void load(const char *) =0;
57 };
58 #endif
59 
71 class c64: private c64env
72 {
73 public:
75  static const unsigned int MAX_SIDS = 2;
76 
77 public:
78  typedef enum
79  {
80  PAL_B = 0
84  } model_t;
85 
86 private:
88  double m_cpuFreq;
89 
91  int irqCount;
92 
94  bool oldBAState;
95 
97  EventScheduler m_scheduler;
98 
100  c64cpu cpu;
101 
103  c64cia1 cia1;
104 
106  c64cia2 cia2;
107 
109  c64vic vic;
110 
112  ColorRAMBank colorRAMBank;
113 
115  SidBank sidBank;
116 
118  ExtraSidBank extraSidBank;
119 
121  DisconnectedBusBank disconnectedBusBank;
122 
124  IOBank ioBank;
125 
127  MMU mmu;
128 
129 private:
130  static double getCpuFreq(model_t model);
131 
132 private:
139  uint8_t cpuRead(uint_least16_t addr) { return mmu.cpuRead(addr); }
140 
147  void cpuWrite(uint_least16_t addr, uint8_t data) { mmu.cpuWrite(addr, data); }
148 
156  inline void interruptIRQ(bool state);
157 
163  inline void interruptNMI() { cpu.triggerNMI (); }
164 
168  inline void interruptRST() { cpu.triggerRST (); }
169 
177  inline void setBA(bool state);
178 
179  inline void lightpen() { vic.lightpen (); }
180 
181 #ifdef PC64_TESTSUITE
182  testEnv *m_env;
183 
184  void loadFile(const char *file)
185  {
186  m_env->load(file);
187  }
188 #endif
189 
190  void resetIoBank();
191 
192 public:
193  c64();
194  ~c64() {}
195 
196 #ifdef PC64_TESTSUITE
197  void setTestEnv(testEnv *env)
198  {
199  m_env = env;
200  }
201 #endif
202 
209  EventScheduler *getEventScheduler() { return &m_scheduler; }
210  const EventScheduler &getEventScheduler() const { return m_scheduler; }
212 
213  void debug(bool enable, FILE *out) { cpu.debug(enable, out); }
214 
215  void reset();
216  void resetCpu() { cpu.reset(); }
217 
221  void setModel(model_t model);
222 
223  void setRoms(const uint8_t* kernal, const uint8_t* basic, const uint8_t* character)
224  {
225  mmu.setRoms(kernal, basic, character);
226  }
227 
233  double getMainCpuSpeed() const { return m_cpuFreq; }
234 
241  void setSid(unsigned int i, c64sid *s);
242 
252  void setSecondSIDAddress(int sidChipBase2);
253 
258  const char* cpuCredits () const { return cpu.credits(); }
259  const char* ciaCredits () const { return cia1.credits(); }
260  const char* vicCredits () const { return vic.credits(); }
262 
263  sidmemory *getMemInterface() { return &mmu; }
264 
265  uint_least16_t getCia1TimerA() const { return cia1.getTimerA(); }
266 };
267 
268 void c64::interruptIRQ (bool state)
269 {
270  if (state)
271  {
272  if (irqCount == 0)
273  cpu.triggerIRQ ();
274 
275  irqCount ++;
276  }
277  else
278  {
279  irqCount --;
280  if (irqCount == 0)
281  cpu.clearIRQ ();
282  }
283 }
284 
285 void c64::setBA (bool state)
286 {
287  /* only react to changes in state */
288  if (state == oldBAState)
289  return;
290 
291  oldBAState = state;
292 
293  /* Signal changes in BA to interested parties */
294  cpu.setRDY (state);
295 }
296 
297 #endif // C64_H
const char * cpuCredits() const
Definition: c64.h:258
Definition: EventScheduler.h:55
Definition: SidBank.h:34
const char * vicCredits() const
Definition: c64.h:260
Definition: c64vic.h:38
void setSid(unsigned int i, c64sid *s)
Definition: c64.cpp:121
Definition: c64cia.h:39
Definition: ColorRAMBank.h:35
void setRDY(bool newRDY)
Definition: mos6510.cpp:156
virtual void reset()
Definition: mos6510.cpp:2215
Definition: DisconnectedBusBank.h:33
const EventScheduler & getEventScheduler() const
Definition: c64.h:210
double getMainCpuSpeed() const
Definition: c64.h:233
uint8_t cpuRead(uint_least16_t addr) const
Definition: mmu.h:121
Definition: c64sid.h:31
Old NTSC C64.
Definition: c64.h:82
static const unsigned int MAX_SIDS
Definition: c64.h:75
Definition: c64env.h:37
model_t
Definition: c64.h:78
void cpuWrite(uint_least16_t addr, uint8_t data)
Definition: mmu.h:129
Definition: c64.h:71
PAL C64.
Definition: c64.h:80
const char * ciaCredits() const
Definition: c64.h:259
void setModel(model_t model)
Definition: c64.cpp:111
void triggerNMI()
Definition: mos6510.cpp:225
Definition: mmu.h:42
NTSC C64.
Definition: c64.h:81
void triggerIRQ()
Definition: mos6510.cpp:239
void clearIRQ()
Definition: mos6510.cpp:253
Definition: ExtraSidBank.h:32
Definition: c64cia.h:99
Definition: sidmemory.h:30
void triggerRST()
Definition: mos6510.cpp:211
void setSecondSIDAddress(int sidChipBase2)
Definition: c64.cpp:136
Definition: IOBank.h:35
const char * credits() const
Definition: mos6526.h:260
EventScheduler * getEventScheduler()
Definition: c64.h:209
C64 Drean.
Definition: c64.h:83
Definition: c64cpu.h:31