VirtualC64 v5.0 beta
Commodore 64 Emulator
Loading...
Searching...
No Matches
PeddleMemory_cpp.h
1// -----------------------------------------------------------------------------
2// This file is part of Peddle - A MOS 65xx CPU emulator
3//
4// Copyright (C) Dirk W. Hoffmann. www.dirkwhoffmann.de
5// Published under the terms of the MIT License
6// -----------------------------------------------------------------------------
7
8#define CHECK_WATCHPOINT \
9if constexpr (PEDDLE_ENABLE_WATCHPOINTS) { \
10if ((flags & CPU_CHECK_WP) && debugger.watchpointMatches(addr)) { \
11watchpointReached(addr); \
12}}
13
14#if PEDDLE_SIMPLE_MEMORY_API == true
15
16template <CPURevision C> u8
17Peddle::read(u16 addr)
18{
19 CHECK_WATCHPOINT
20
21 if (hasProcessorPort<C>()) {
22
23 if (addr < 2) return addr ? readPort() : readPortDir();
24 }
25 return read(addr & addrMask<C>());
26}
27
28template <CPURevision C> u8
29Peddle::readZeroPage(u8 addr)
30{
31 CHECK_WATCHPOINT
32
33 if (hasProcessorPort<C>()) {
34
35 if (addr < 2) return addr ? readPort() : readPortDir();
36 }
37 return read(addr & addrMask<C>());
38}
39
40template <CPURevision C> u8
41Peddle::readStack(u8 addr)
42{
43 CHECK_WATCHPOINT
44 return read(u16(addr) + 0x100);
45}
46
47template <CPURevision C> void
48Peddle::readIdle(u16 addr)
49{
50 if (PEDDLE_EMULATE_IDLE_ACCESSES) {
51
52 CHECK_WATCHPOINT
53
54 if (hasProcessorPort<C>()) {
55
56 if (addr < 2) return addr ? (void)readPort() : (void)readPortDir();
57 }
58 (void)read(addr & addrMask<C>());
59 }
60}
61
62template <CPURevision C> void
63Peddle::readZeroPageIdle(u8 addr)
64{
65 if (PEDDLE_EMULATE_IDLE_ACCESSES) {
66
67 CHECK_WATCHPOINT
68
69 if (hasProcessorPort<C>()) {
70
71 if (addr < 2) return addr ? (void)readPort() : (void)readPortDir();
72 }
73 (void)read(u16(addr));
74 }
75}
76
77template <CPURevision C> void
78Peddle::readStackIdle(u8 addr)
79{
80 if (PEDDLE_EMULATE_IDLE_ACCESSES) {
81
82 CHECK_WATCHPOINT
83 (void)read(u16(addr) + 0x100);
84 }
85}
86
87template <CPURevision C> void
88Peddle::write(u16 addr, u8 val)
89{
90 CHECK_WATCHPOINT
91
92 if (hasProcessorPort<C>()) {
93
94 if (addr < 2) { addr ? writePort(val) : writePortDir(val); return; }
95 }
96 write(addr & addrMask<C>(), val);
97}
98
99template <CPURevision C> void
100Peddle::writeZeroPage(u8 addr, u8 val)
101{
102 CHECK_WATCHPOINT
103
104 if (hasProcessorPort<C>()) {
105
106 if (addr < 2) { addr ? writePort(val) : writePortDir(val); return; }
107 }
108 write(u16(addr), val);
109}
110
111template <CPURevision C> void
112Peddle::writeStack(u8 addr, u8 val)
113{
114 CHECK_WATCHPOINT
115 write(u16(addr) + 0x100, val);
116}
117
118/*
119template <CPURevision C> u16
120Peddle::readResetVector()
121{
122 u16 addr = 0xFFFC & addrMask<C>();
123 return u16(read<C>(addr) | read<C>(addr + 1) << 8);
124}
125*/
126
127#endif
128
129u16
130Peddle::readResetVector()
131{
132 u16 addr = 0xFFFC & addrMask();
133 return u16(read(addr) | read(addr + 1) << 8);
134}
135
136template <CPURevision C> u16
137Peddle::readDasm(u16 addr) const
138{
139 return readDasm(addr & addrMask<C>());
140}
141
142u8
143Peddle::readPort() const
144{
145 return (reg.pport.data & reg.pport.direction) | (externalPortBits() & ~reg.pport.direction);
146}