yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
addressing.cc
Go to the documentation of this file.
2
3namespace yaze {
4namespace emu {
5
6// adressing modes
7
8uint16_t Spc700::ind() {
9 read(PC);
10 return X | (PSW.P << 8);
11}
12
13uint16_t Spc700::idx() {
14 uint8_t pointer = ReadOpcode();
15 callbacks_.idle(false);
16 return read_word(((pointer + X) & 0xff) | (PSW.P << 8));
17}
18
19uint16_t Spc700::dpx() {
20 uint16_t res = ((ReadOpcode() + X) & 0xff) | (PSW.P << 8);
21 callbacks_.idle(false);
22 return res;
23}
24
25uint16_t Spc700::dp_y() {
26 uint16_t res = ((ReadOpcode() + Y) & 0xff) | (PSW.P << 8);
27 callbacks_.idle(false);
28 return res;
29}
30
31uint16_t Spc700::abs_x() {
32 uint16_t res = (ReadOpcodeWord() + X) & 0xffff;
33 callbacks_.idle(false);
34 return res;
35}
36
37uint16_t Spc700::abs_y() {
38 uint16_t res = (ReadOpcodeWord() + Y) & 0xffff;
39 callbacks_.idle(false);
40 return res;
41}
42
43uint16_t Spc700::idy() {
44 uint8_t pointer = ReadOpcode();
45 uint16_t adr = read_word(pointer | (PSW.P << 8));
46 callbacks_.idle(false);
47 return (adr + Y) & 0xffff;
48}
49
50uint16_t Spc700::dp_imm(uint8_t* srcVal) {
51 *srcVal = ReadOpcode();
52 return ReadOpcode() | (PSW.P << 8);
53}
54
55uint16_t Spc700::ind_ind(uint8_t* srcVal) {
56 read(PC);
57 *srcVal = read(Y | (PSW.P << 8));
58 return X | (PSW.P << 8);
59}
60
61uint8_t Spc700::abs_bit(uint16_t* adr) {
62 uint16_t adrBit = ReadOpcodeWord();
63 *adr = adrBit & 0x1fff;
64 return adrBit >> 13;
65}
66
67uint16_t Spc700::dp_word(uint16_t* low) {
68 uint8_t adr = ReadOpcode();
69 *low = adr | (PSW.P << 8);
70 return ((adr + 1) & 0xff) | (PSW.P << 8);
71}
72
73uint16_t Spc700::ind_p() {
74 read(PC);
75 return X++ | (PSW.P << 8);
76}
77
78// Immediate
79uint16_t Spc700::imm() {
80 return PC++;
81}
82
83// Direct page
84uint8_t Spc700::dp() {
85 return ReadOpcode() | (PSW.P << 8);
86}
87
88// Direct page indexed by X
90 PC++;
91 uint8_t offset = read(PC);
92 return read((PSW.P << 8) + offset + X);
93}
94
95// Direct page indexed by Y
97 PC++;
98 uint8_t offset = read(PC);
99 return read((PSW.P << 8) + offset + Y);
100}
101
102// Indexed indirect (add index before 16-bit lookup).
104 PC++;
105 uint16_t addr = read_word(PC + X);
106 return addr;
107}
108
109// Indirect indexed (add index after 16-bit lookup).
111 PC++;
112 uint16_t offset = read_word(PC);
113 return offset + Y;
114}
115
116uint16_t Spc700::dp_dp(uint8_t* src) {
117 *src = read(ReadOpcode() | (PSW.P << 8));
118 return ReadOpcode() | (PSW.P << 8);
119}
120
121uint16_t Spc700::abs() {
122 return ReadOpcodeWord();
123}
124
125int8_t Spc700::rel() {
126 PC++;
127 return static_cast<int8_t>(read(PC));
128}
129
130uint8_t Spc700::i() {
131 return read((PSW.P << 8) + X);
132}
133
135 uint8_t value = read((PSW.P << 8) + X);
136 X++;
137 return value;
138}
139
141 PC++;
142 uint16_t addr = read(PC) | (read(PC) << 8);
143 return read(addr) + X;
144}
145
147 PC++;
148 uint16_t addr = read(PC) | (read(PC) << 8);
149 addr += X;
150 return read(addr) | (read(addr + 1) << 8);
151}
152
153} // namespace emu
154} // namespace yaze
uint8_t read(uint16_t address)
Definition spc700.h:157
uint8_t dp_plus_x()
Definition addressing.cc:89
uint16_t ind_p()
Definition addressing.cc:73
uint16_t adr
Definition spc700.h:80
uint16_t dp_y()
Definition addressing.cc:25
uint8_t abs_bit(uint16_t *adr)
Definition addressing.cc:61
uint16_t dp_indirect_plus_y()
uint16_t addr_plus_i_indexed()
uint16_t ind_ind(uint8_t *srcVal)
Definition addressing.cc:55
uint8_t i_postinc()
uint16_t dp_plus_x_indirect()
uint16_t addr_plus_i()
uint8_t dp_plus_y()
Definition addressing.cc:96
uint16_t abs_y()
Definition addressing.cc:37
uint16_t dp_imm(uint8_t *srcVal)
Definition addressing.cc:50
uint16_t ReadOpcodeWord()
Definition spc700.h:171
uint16_t dp_dp(uint8_t *src)
uint16_t abs_x()
Definition addressing.cc:31
uint16_t dp_word(uint16_t *low)
Definition addressing.cc:67
uint16_t read_word(uint16_t address)
Definition spc700.h:159
uint16_t PC
Definition spc700.h:106
ApuCallbacks callbacks_
Definition spc700.h:71
uint16_t ind()
Definition addressing.cc:8
uint8_t ReadOpcode()
Definition spc700.h:166
std::function< void(bool)> idle
Definition spc700.h:55