[ucsim] Update email and file info, fix stm8 flash controller
[sdcc.git] / sdcc / sim / ucsim / src / sims / rxk.src / rxkcl.h
blob9f8877089d209b60ef24cf684d3090c202252005
1 /*
2 * Simulator of microcontrollers (rxkcl.h)
4 * Copyright (C) 2020 Drotos Daniel
5 *
6 * To contact author send email to dr.dkdb@gmail.com
8 */
10 /* This file is part of microcontroller simulator: ucsim.
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 02111-1307, USA. */
26 /*@1@*/
28 #ifndef RXKCL_HEADER
29 #define RXKCL_HEADER
31 #include "uccl.h"
32 #include "rmemcl.h"
33 #include "decode.h"
34 #include "dp0m3.h"
35 #include "dpedm3.h"
36 #include "dpddm3.h"
40 * Base of RXK processor
44 #define rA (AF.r.A)
45 #define rF (AF.r.F)
46 #define rAF (AF.AF)
47 #define rXPC (mem->get_xpc())
48 #define cXPC (*XPC)
50 #define rBCDE (BCDE.BCDE)
51 #define rBC (BCDE.r32.r16h.BC)
52 #define rDE (BCDE.r32.r16l.DE)
53 #define rB (BCDE.r32.r16h.r.B)
54 #define rC (BCDE.r32.r16h.r.C)
55 #define rD (BCDE.r32.r16l.r.D)
56 #define rE (BCDE.r32.r16l.r.E)
58 #define rJKHL (JKHL.JKHL)
59 #define rJK (JKHL.r32.r16h.JK)
60 #define rHL (JKHL.r32.r16l.HL)
61 #define rJ (JKHL.r32.r16h.r.J)
62 #define rK (JKHL.r32.r16h.r.K)
63 #define rH (JKHL.r32.r16l.r.H)
64 #define rL (JKHL.r32.r16l.r.L)
66 #define raA (aAF.r.A)
67 #define raF (aAF.r.F)
68 #define raAF (aAF.AF)
70 #define raBCDE (aBCDE.BCDE)
71 #define raBC (aBCDE.r32.r16h.BC)
72 #define raDE (aBCDE.r32.r16l.DE)
73 #define raB (aBCDE.r32.r16h.r.B)
74 #define raC (aBCDE.r32.r16h.r.C)
75 #define raD (aBCDE.r32.r16l.r.D)
76 #define raE (aBCDE.r32.r16l.r.E)
78 #define raJKHL (aJKHL.JKHL)
79 #define raJK (aJKHL.r32.r16h.JK)
80 #define raHL (aJKHL.r32.r16l.HL)
81 #define raJ (aJKHL.r32.r16h.r.J)
82 #define raK (aJKHL.r32.r16h.r.K)
83 #define raH (aJKHL.r32.r16l.r.H)
84 #define raL (aJKHL.r32.r16l.r.L)
86 enum {
87 flagS = 0x80,
88 flagZ = 0x40,
89 flagL = 0x04,
90 flagV = 0x04,
91 flagC = 0x01,
92 flagAll = flagS|flagZ|flagL|flagC,
93 flagsAll= flagS|flagZ|flagL|flagC,
94 allFlag = flagS|flagZ|flagL|flagC,
95 allFlags= flagS|flagZ|flagL|flagC
98 #define cond_GT(f) ( !(( ((f) ^ ((f)<<5)) | ((f)<<1)) & 0x80) )
99 #define cond_GTU(f) ( !((f)&flagC) && !((f)&flagZ) )
100 #define cond_LT(f) ( ((f) ^ ((f)<<5)) & 0x80 )
101 #define cond_LTU(f) ( (f)&flagC )
102 #define cond_V(f) ( (f)&flagV )
104 #define CPU ((class cl_rxk_cpu *)cpu)
107 class cl_rxk_base: public cl_uc
109 public:
110 cl_rxk_base(class cl_sim *asim);
111 #include "r4kcl_instructions.h"
112 #include "dd_instructions.h"
113 #include "ed_instructions.h"
116 class cl_rxk: public cl_rxk_base
118 public:
119 RP(AF,AF,A,F);
120 RP(aAF,AF,A,F);
121 RP(aBC,BC,B,C);
122 RP(aDE,DE,D,E);
123 RP(aHL,HL,H,L);
124 R32(BCDE,BCDE,BC,DE,B,C,D,E);
125 R32(JKHL,JKHL,JK,HL,J,K,H,L);
126 R32(aBCDE,BCDE,BC,DE,B,C,D,E);
127 R32(aJKHL,JKHL,JK,HL,J,K,H,L);
128 class cl_cell32 cBCDE, caBCDE;
129 u8_t rIP, rIIR, rEIR;
130 u16_t rIX, rIY, rSP;
131 class cl_cell8 cIP, cIIR, cEIR;
132 class cl_cell8 cA, cF, cB, cC, cD, cE, cH, cL;
133 class cl_cell8 caA, caF, caB, caC, caD, caE, caH, caL;
134 class cl_cell8 *cRtab[8], *caRtab[8];
135 class cl_cell16 cAF, cBC, cDE, cHL, cIX, cIY, cSP;
136 class cl_cell16 caAF, caBC, caDE, caHL;
137 class cl_cell16 *cIR;
138 class cl_memory_cell *XPC;
139 class cl_ras *mem;
140 class cl_address_space *ioi, *ioe;
141 class cl_address_space *rwas;
142 bool prefix, altd, atomic;
143 public:
144 cl_rxk(class cl_sim *asim);
145 virtual int init(void);
146 virtual const char *id_string(void);
147 virtual void reset(void);
148 virtual void set_PC(t_addr addr);
150 virtual void mk_hw_elements(void);
151 virtual void make_cpu_hw(void);
152 virtual void make_memories(void);
153 virtual t_addr chip_size() { return 0x100000; }
155 virtual double def_xtal(void) { return 1000000; }
156 virtual int clock_per_cycle(void) { return 1; }
157 //virtual struct dis_entry *dis_tbl(void);
158 virtual struct dis_entry *dis_entry(t_addr addr);
159 virtual char *disassc(t_addr addr, chars *comment= NULL);
160 virtual char *disassc_cb(t_addr addr, chars *comment= NULL);
161 virtual char *disassc_dd_cb(t_addr addr, chars *comment= NULL);
162 virtual int inst_length(t_addr addr);
163 virtual int longest_inst(void) { return 4; }
164 virtual void disass_irr(chars *work, bool dd) {}
165 virtual void disass_irrl(chars *work, bool dd) {}
167 virtual void save_hist();
168 virtual void print_regs(class cl_console_base *con);
170 virtual class cl_cell8 *cR(u8_t z);
171 virtual class cl_cell8 *destR(u8_t z);
172 virtual u8_t rR(u8_t z);
173 virtual int exec_inst(void);
174 virtual int inst_unknown(t_mem code);
175 virtual void tick5p1(int n) { tick(n); }
176 virtual void tick5p2(int n) { tick(n); }
177 virtual void tick5p3(int n) { tick(n); }
178 virtual void tick5p9(int n) { tick(n); }
179 virtual void tick5p12(int n) { tick(n); }
180 virtual void tick5m1(int n) { tick(n+2); }
181 virtual void tick5m2(int n) { tick(n+2); }
182 virtual void select_IRR(bool dd) {}
184 class cl_cell16 &destAF(void) { return altd?caAF:cAF; }
185 class cl_cell16 &destBC(void) { return altd?caBC:cBC; }
186 class cl_cell16 &destDE(void) { return altd?caDE:cDE; }
187 class cl_cell16 &destHL(void) { return altd?caHL:cHL; }
188 class cl_cell8 &destA(void) { return altd?caA:cA; }
189 class cl_cell8 &destF(void) { return altd?caF:cF; }
190 class cl_cell8 &destB(void) { return altd?caB:cB; }
191 class cl_cell8 &destC(void) { return altd?caC:cC; }
192 class cl_cell8 &destD(void) { return altd?caD:cD; }
193 class cl_cell8 &destE(void) { return altd?caE:cE; }
194 class cl_cell8 &destH(void) { return altd?caH:cH; }
195 class cl_cell8 &destL(void) { return altd?caL:cL; }
196 class cl_cell8 &dest8iBC(void) { return *((cl_cell8*)rwas->get_cell(rBC)); }
197 class cl_cell8 &dest8iDE(void) { return *((cl_cell8*)rwas->get_cell(rDE)); }
198 class cl_cell8 &dest8iHL(void) { return *((cl_cell8*)rwas->get_cell(rHL)); }
199 class cl_cell8 &dest8imn(void) { u8_t l, h;
200 l= fetch(); h= fetch();
201 return *((cl_cell8*)rwas->get_cell(h*256+l));
203 class cl_cell8 &dest8iIRd(i8_t d) { return *((cl_cell8*)rwas->get_cell(cIR->get()+d)); }
205 u8_t op8_BC(void);
206 u8_t op8_DE(void);
207 u8_t op8_HL(void);
208 u16_t op16_BC(void);
209 u16_t op16_DE(void);
210 u16_t op16_HL(void);
211 void write8(u16_t a, u8_t v) { vc.wr++; rom->write(a, v); }
212 void write8io(u16_t a, u8_t v) { vc.wr++; rwas->write(a, v); }
213 void write16(u16_t a, u16_t v) { vc.wr+=2;
214 rom->write(a, v); rom->write(a+1, v>>8);
216 void write16io(u16_t a, u16_t v) { vc.wr+=2;
217 rwas->write(a, v); rwas->write(a+1, v>>8);
219 u8_t read8(u16_t a) { vc.rd++; return rom->read(a); }
220 u8_t read8io(u16_t a) { vc.rd++; return rwas->read(a); }
221 u16_t read16(u16_t a) { u8_t l, h; vc.rd+=2;
222 l= rom->read(a); h= rom->read(a+1);
223 return h*256+l;
225 u16_t read16io(u16_t a) { u8_t l, h; vc.rd+=2;
226 l= rwas->read(a); h= rwas->read(a+1);
227 return h*256+l;
229 u32_t read32(u16_t a) { u16_t l, h; vc.rd+=4;
230 l= read16(a); h= read16(a+2);
231 return (h<<16)+l;
233 u32_t read32io(u16_t a) { u16_t l, h; vc.rd+=4;
234 l= read16io(a); h= read16io(a+2);
235 return (h<<16)+l;
237 u16_t fetch16(void) { u8_t l, h;
238 l= fetch(); h= fetch();
239 return h*256 + l;
242 virtual int ipset(u8_t n); // 0f,4t,0r,0w
244 virtual int ld_dd_mn(class cl_cell16 &dd); // 2f,6t,0r,0w
245 virtual int ld_r_n(class cl_cell8 &r); // 1f,4t,0r,0w
246 virtual int ld_ihl_r(u8_t op); // 0f,6t,0r,1w
247 virtual int ld_r_ihl(class cl_cell8 &destr); // 0f,5t,1r,0w
248 virtual int ld_r_g(class cl_cell8 &dest, u8_t op); // 0f,2t,0r,0w
249 virtual int pop_zz(class cl_cell16 &dest); // 0f,6t,2r,0w
250 virtual int push_zz(u16_t op); // 0f,9t,0r,2w
251 virtual int ld_d_i(int dif); // 0f,10t,1r,1w
252 virtual int LDxR(int dif); // 0f,6t,1r,1w
253 virtual int ld_iIRd_r(u8_t op); // 1f,10t,0r,1w
254 virtual int ld_r_iIRd(class cl_cell8 &op); // 1f,9t,1r,0w
255 virtual int ld_hl_op(u16_t op); // 0f,2t,0r,0w
256 virtual int ld_dd_imn(class cl_cell16 &dest); // 2f,13t,2r,0w
257 virtual int ld_add_BC_DE(class cl_cell16 &dest, u16_t src); // 0f,4t,0r,0w
258 virtual int ld_imn_ss(u16_t src); // 2f,15t,0r,2w
259 virtual int ldp_irp_rp(u16_t addr, u16_t src); // 0f,12t,0r,2w
260 virtual int ldp_rp_irp(class cl_cell16 &dest, u16_t addr); // 0f,10t,2r,0w
262 virtual int inc_ss(class cl_cell16 &rp, u16_t op);
263 virtual int inc_r(class cl_cell8 &cr, u8_t op);
264 virtual int dec_ss(class cl_cell16 &rp, u16_t op);
265 virtual int dec_r(class cl_cell8 &cr, u8_t op);
266 virtual int rot8left(class cl_cell8 &dest, u8_t op); // 0f,1t,0r,0w
267 virtual int rlc(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
268 virtual int rot16left(class cl_cell16 &dest, u16_t op); // 0f,1t,0r,0w
269 virtual int rot32left(class cl_cell32 &dest, u32_t op, int nr);//0f,4t,0r,0w
270 virtual int rot9left(class cl_cell8 &dest, u8_t op); // 0f,1t,0r,0w
271 virtual int rl(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
272 virtual int rot17left(class cl_cell16 &dest, u16_t op); // 0f,1t,0r,0w
273 virtual int rot33left(class cl_cell32 &dest, u32_t op, int nr);//0f,4t,0r,0w
274 virtual int rot8right(class cl_cell8 &dest, u8_t op); // 0f,1t,0r,0w
275 virtual int rot16right(class cl_cell16 &dest, u16_t op); // 0f,1t,0r,0w
276 virtual int rot32right(class cl_cell32 &dest, u32_t op,int nr);//0f,4t,0r,0w
277 virtual int rrc(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
278 virtual int rot9right(class cl_cell8 &dest, u8_t op); // 0f,1t,0r,0w
279 virtual int rr(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
280 virtual int rot17right(class cl_cell16 &dest, u16_t op); // 0f,1t,0r,0w
281 virtual int rot33right(class cl_cell32 &dest, u32_t op,int nr);//0f,4t,0r,0w
282 virtual int sla8(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
283 virtual int sla32(class cl_cell32 &dest, u32_t op, int nr); // 0f,4t,0r,0w
284 virtual int sra8(class cl_cell8 &dest, i8_t op); // 0f,4t,0r,0w
285 virtual int sra32(class cl_cell32 &dest, i32_t op, int nr); // 0f,4t,0r,0w
286 virtual int srl8(class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
287 virtual int srl32(class cl_cell32 &dest, u32_t op, int nr); // 0f,4t,0r,0w
288 virtual int bit_r(u8_t b, u8_t op); // 0f,4t,0r,0w
289 virtual int bit_iHL(u8_t b); // 0f,7t,1r,0w
290 virtual int bit_iIRd(u8_t b, i8_t d); // 0f,10t,1r,0w
291 virtual int res_r(u8_t b, class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
292 virtual int res_iHL(u8_t b); // 0f,10t,1r,1w
293 virtual int res_iIRd(u8_t b, i8_t d); // 0f,13t,1r,1w
294 virtual int set_r(u8_t b, class cl_cell8 &dest, u8_t op); // 0f,4t,0r,0w
295 virtual int set_iHL(u8_t b); // 0f,10t,1r,1w
296 virtual int set_iIRd(u8_t b, i8_t d); // 0f,12t,1r,1w
298 virtual int add_hl_ss(u16_t op);
299 virtual int adc_hl_ss(u16_t op);
300 virtual int add8(u8_t op2, bool cy); // 0f,4t,0r,0w
301 virtual int sub8(u8_t op2, bool cy); // 0f,4t,0r,0w
302 virtual int sub16(u16_t op2, bool cy); // 0f,4t,0r,0w
303 virtual int sub32(u32_t op1, u32_t op2, class cl_cell32 &cRes, bool cy);
305 virtual int inc_i8(t_addr addr);
306 virtual int dec_i8(t_addr addr);
307 virtual int add_ir_xy(u16_t op); // 0f,4t,0r,0r
308 virtual int xor8(class cl_cell8 &dest, u8_t op1, u8_t op2); // 0f,1t,0r,0w
309 virtual int xor16(class cl_cell16 &dest, u16_t op1,u16_t op2);// 0f,4t,0r,0w
310 virtual int or8(class cl_cell8 &dest, u8_t op1, u8_t op2); // 0f,1t,0r,0w
311 virtual int or16(class cl_cell16 &dest,
312 u16_t op1, u16_t op2); // 0f,1t,0r,0w
313 virtual int and8(class cl_cell8 &dest, u8_t op1, u8_t op2); // 0f,1t,0r,0w
314 virtual int and16(class cl_cell16 &dest,
315 u16_t op1, u16_t op2); // 0f,1t,0r,0w
316 virtual int cp8(u8_t op1, u8_t op2); // 0f,3t,0r,0w
317 virtual int cp16(u16_t op1, u16_t op2); // 0f,4t,0r,0w
318 virtual int cp32(u32_t op1, u32_t op2); // 0f,4t,0r,0w
320 virtual int jr_cc(bool cond);
321 virtual int ret_f(bool f); // 0f,7t,2r,0w
322 virtual int jp_f_mn(bool f); // 2f,6t,2r,0w
323 virtual int rst_v(t_mem code); // 0f,7t,0r,2w
325 virtual int ALTD(t_mem code);
326 virtual int IOI(t_mem code);
327 virtual int IOE(t_mem code);
329 virtual int NOP(t_mem code);
330 virtual int LD_BC_mn(t_mem code) { return ld_dd_mn(destBC()); }
331 virtual int LD_DE_mn(t_mem code) { return ld_dd_mn(destDE()); }
332 virtual int LD_HL_mn(t_mem code) { return ld_dd_mn(destHL()); }
333 virtual int LD_SP_mn(t_mem code) { return ld_dd_mn(cSP ); }
334 virtual int LD_imn_HL(t_mem code);
335 virtual int LD_HL_imn(t_mem code);
336 virtual int INC_BC(t_mem code) { return inc_ss(destBC(), rBC); }
337 virtual int INC_DE(t_mem code) { return inc_ss(destDE(), rDE); }
338 virtual int INC_HL(t_mem code) { return inc_ss(destHL(), rHL); }
339 virtual int INC_SP(t_mem code) { return inc_ss(cSP , rSP); }
340 virtual int INC_A(t_mem code) { return inc_r(destA(), rA); }
341 virtual int INC_B(t_mem code) { return inc_r(destB(), rB); }
342 virtual int INC_C(t_mem code) { return inc_r(destC(), rC); }
343 virtual int INC_D(t_mem code) { return inc_r(destD(), rD); }
344 virtual int INC_E(t_mem code) { return inc_r(destE(), rE); }
345 virtual int INC_H(t_mem code) { return inc_r(destH(), rH); }
346 virtual int INC_L(t_mem code) { return inc_r(destL(), rL); }
347 virtual int DEC_BC(t_mem code) { return dec_ss(destBC(), rBC); }
348 virtual int DEC_DE(t_mem code) { return dec_ss(destDE(), rDE); }
349 virtual int DEC_HL(t_mem code) { return dec_ss(destHL(), rHL); }
350 virtual int DEC_SP(t_mem code) { return dec_ss(cSP , rSP); }
351 virtual int DEC_A(t_mem code) { return dec_r(destA(), rA); }
352 virtual int DEC_B(t_mem code) { return dec_r(destB(), rB); }
353 virtual int DEC_C(t_mem code) { return dec_r(destC(), rC); }
354 virtual int DEC_D(t_mem code) { return dec_r(destD(), rD); }
355 virtual int DEC_E(t_mem code) { return dec_r(destE(), rE); }
356 virtual int DEC_H(t_mem code) { return dec_r(destH(), rH); }
357 virtual int DEC_L(t_mem code) { return dec_r(destL(), rL); }
358 virtual int LD_A_n(t_mem code) { return ld_r_n(destA()); }
359 virtual int LD_B_n(t_mem code) { return ld_r_n(destB()); }
360 virtual int LD_C_n(t_mem code) { return ld_r_n(destC()); }
361 virtual int LD_D_n(t_mem code) { return ld_r_n(destD()); }
362 virtual int LD_E_n(t_mem code) { return ld_r_n(destE()); }
363 virtual int LD_H_n(t_mem code) { return ld_r_n(destH()); }
364 virtual int LD_L_n(t_mem code) { return ld_r_n(destL()); }
365 virtual int RLCA(t_mem code) { return rot8left(destA(), rA); }
366 virtual int RLA(t_mem code) { return rot9left(destA(), rA); }
367 virtual int RRCA(t_mem code) { return rot8right(destA(), rA); }
368 virtual int RRA(t_mem code) { return rot9right(destA(), rA); }
369 virtual int LD_iBC_A(t_mem code);
370 virtual int LD_iDE_A(t_mem code);
371 virtual int LD_iHL_A(t_mem code) { return ld_ihl_r(rA); }
372 virtual int LD_iHL_B(t_mem code) { return ld_ihl_r(rB); }
373 virtual int LD_iHL_C(t_mem code) { return ld_ihl_r(rC); }
374 virtual int LD_iHL_D(t_mem code) { return ld_ihl_r(rD); }
375 virtual int LD_iHL_E(t_mem code) { return ld_ihl_r(rE); }
376 virtual int LD_iHL_H(t_mem code) { return ld_ihl_r(rH); }
377 virtual int LD_iHL_L(t_mem code) { return ld_ihl_r(rL); }
378 virtual int LD_iMN_A(t_mem code);
379 virtual int LD_A_iBC(t_mem code);
380 virtual int LD_A_iDE(t_mem code);
381 virtual int LD_A_iMN(t_mem code);
382 virtual int LD_A_iHL(t_mem code) { return ld_r_ihl(destA()); }
383 virtual int LD_B_iHL(t_mem code) { return ld_r_ihl(destB()); }
384 virtual int LD_C_iHL(t_mem code) { return ld_r_ihl(destC()); }
385 virtual int LD_D_iHL(t_mem code) { return ld_r_ihl(destD()); }
386 virtual int LD_E_iHL(t_mem code) { return ld_r_ihl(destE()); }
387 virtual int LD_H_iHL(t_mem code) { return ld_r_ihl(destH()); }
388 virtual int LD_L_iHL(t_mem code) { return ld_r_ihl(destL()); }
389 virtual int SCF(t_mem code);
390 virtual int CPL(t_mem code);
391 virtual int CCF(t_mem code);
392 virtual int EX_AF_aAF(t_mem code);
393 virtual int ADD_HL_BC(t_mem code) { return add_hl_ss(rBC); }
394 virtual int ADD_HL_DE(t_mem code) { return add_hl_ss(rDE); }
395 virtual int ADD_HL_HL(t_mem code) { return add_hl_ss(rHL); }
396 virtual int ADD_HL_SP(t_mem code) { return add_hl_ss(rSP); }
397 virtual int DJNZ(t_mem code);
398 virtual int JR(t_mem code);
399 virtual int JR_NZ(t_mem code) { return jr_cc(!(rF&flagZ)); }
400 virtual int JR_Z (t_mem code) { return jr_cc( (rF&flagZ)); }
401 virtual int JR_NC(t_mem code) { return jr_cc(!(rF&flagC)); }
402 virtual int JR_C (t_mem code) { return jr_cc( (rF&flagC)); }
403 virtual int ADD_SP_d(t_mem code);
404 virtual int INC_iHL(t_mem code) { return inc_i8(rHL); }
405 virtual int DEC_iHL(t_mem code) { return dec_i8(rHL); }
406 virtual int LD_iHL_n(t_mem code) { tick(6);write8io(rHL, fetch());return resGO; }
407 virtual int LD_B_A(t_mem code) { return ld_r_g(destB(), rA); }
408 virtual int LD_C_A(t_mem code) { return ld_r_g(destC(), rA); }
409 virtual int LD_D_A(t_mem code) { return ld_r_g(destD(), rA); }
410 virtual int LD_E_E(t_mem code) { return ld_r_g(destE(), rE); }
411 virtual int LD_E_A(t_mem code) { return ld_r_g(destE(), rA); }
412 virtual int LD_L_A(t_mem code) { return ld_r_g(destL(), rA); }
413 virtual int LD_H_A(t_mem code) { return ld_r_g(destH(), rA); }
414 virtual int LD_A_B(t_mem code) { return ld_r_g(destA(), rB); }
415 virtual int LD_A_C(t_mem code) { return ld_r_g(destA(), rC); }
416 virtual int LD_A_D(t_mem code) { return ld_r_g(destA(), rD); }
417 virtual int LD_A_E(t_mem code) { return ld_r_g(destA(), rE); }
418 virtual int LD_A_H(t_mem code) { return ld_r_g(destA(), rH); }
419 virtual int LD_A_L(t_mem code) { return ld_r_g(destA(), rL); }
420 virtual int XOR_A(t_mem code) { return xor8(destA(), rA, rA); }
421 virtual int OR_A(t_mem code) { return or8(destA(), rA, rA); }
422 virtual int RET_NZ(t_mem code) { return ret_f(!(rF&flagZ)); }
423 virtual int RET_Z (t_mem code) { return ret_f( (rF&flagZ)); }
424 virtual int RET (t_mem code) { return ret_f( (true )); }
425 virtual int RET_NC(t_mem code) { return ret_f(!(rF&flagC)); }
426 virtual int RET_C (t_mem code) { return ret_f( (rF&flagC)); }
427 virtual int RET_LZ(t_mem code) { return ret_f(!(rF&flagV)); } // NV
428 virtual int RET_LO(t_mem code) { return ret_f( (rF&flagV)); } // V
429 virtual int RET_P (t_mem code) { return ret_f(!(rF&flagS)); }
430 virtual int RET_M (t_mem code) { return ret_f( (rF&flagS)); }
431 virtual int POP_AF(t_mem code) { return pop_zz(destAF()); }
432 virtual int POP_BC(t_mem code) { return pop_zz(destBC()); }
433 virtual int POP_DE(t_mem code) { return pop_zz(destDE()); }
434 virtual int POP_HL(t_mem code) { return pop_zz(destHL()); }
435 virtual int JP_NZ_mn(t_mem code) { return jp_f_mn(!(rF&flagZ)); }
436 virtual int JP_Z_mn (t_mem code) { return jp_f_mn( (rF&flagZ)); }
437 virtual int JP_NC_mn(t_mem code) { return jp_f_mn(!(rF&flagC)); }
438 virtual int JP_C_mn (t_mem code) { return jp_f_mn( (rF&flagC)); }
439 virtual int JP_LZ_mn(t_mem code) { return jp_f_mn(!(rF&flagV)); }
440 virtual int JP_LO_mn(t_mem code) { return jp_f_mn( (rF&flagV)); }
441 virtual int JP_P_mn (t_mem code) { return jp_f_mn(!(rF&flagS)); }
442 virtual int JP_M_mn (t_mem code) { return jp_f_mn( (rF&flagS)); }
443 virtual int JP_mn (t_mem code) { return jp_f_mn( (true )); }
444 virtual int LD_HL_iSPn(t_mem code);
445 virtual int PUSH_AF(t_mem code) { return push_zz(rAF); }
446 virtual int PUSH_BC(t_mem code) { return push_zz(rBC); }
447 virtual int PUSH_DE(t_mem code) { return push_zz(rDE); }
448 virtual int PUSH_HL(t_mem code) { return push_zz(rHL); }
449 virtual int ADD_A_n(t_mem code) { return add8(fetch(), false); }
450 virtual int LJP(t_mem code);
451 virtual int BOOL_HL(t_mem code);
452 virtual int CALL_mn(t_mem code);
453 virtual int ADC_A_n(t_mem code) { return add8(fetch(), true); }
454 virtual int LCALL_lmn(t_mem code);
455 virtual int LD_iSPn_HL(t_mem code);
456 virtual int SUB_A_n(t_mem code) { return sub8(fetch(), false); }
457 virtual int RST_10(t_mem code) { return rst_v(code); }
458 virtual int RST_18(t_mem code) { return rst_v(code); }
459 virtual int RST_20(t_mem code) { return rst_v(code); }
460 virtual int RST_28(t_mem code) { return rst_v(code); }
461 virtual int RST_38(t_mem code) { return rst_v(code); }
462 virtual int EXX(t_mem code);
463 virtual int AND_HL_DE(t_mem code) { return and16(destHL(), rHL, rDE); }
464 virtual int OR_HL_DE (t_mem code) { return or16 (destHL(), rHL, rDE); }
465 virtual int SBC_A_n(t_mem code) { return sub8(fetch(), true); }
466 virtual int EX_aDE_HL(t_mem code);
467 virtual int EX_DE_HL(t_mem code);
468 virtual int LD_HL_iIXd(t_mem code);
469 virtual int LD_iIXd_HL(t_mem code);
470 virtual int AND_n(t_mem code) { tick(2); return and8(destA(), rA, fetch()); }
471 virtual int JP_HL(t_mem code) { tick(3); PC= rHL; return resGO; }
472 virtual int XOR_n(t_mem code) { tick(3); return xor8(destA(), rA, fetch()); }
473 virtual int RL_DE(t_mem code) { return rot17left(destDE(), rDE); }
474 virtual int OR_n(t_mem code) { tick(3); return or8(destA(), rA, fetch()); }
475 virtual int MUL(t_mem code);
476 virtual int LD_SP_HL(t_mem code) { tick(1); cSP.W(rHL); return resGO; }
477 virtual int RR_DE(t_mem code) { return rot17right(destDE(), rDE); }
478 virtual int RR_HL(t_mem code) { return rot17right(destHL(), rHL); }
479 virtual int CP_n(t_mem code) { return cp8(rA, fetch()); }
481 // Page0, mode 3k only, invalid in 4k mode
482 virtual int LD_B_B(t_mem code) { return ld_r_g(destB(), rB); }
483 virtual int LD_B_C(t_mem code) { return ld_r_g(destB(), rC); }
484 virtual int LD_B_E(t_mem code) { return ld_r_g(destB(), rE); }
485 virtual int LD_B_H(t_mem code) { return ld_r_g(destB(), rH); }
486 virtual int LD_C_C(t_mem code) { return ld_r_g(destC(), rC); }
487 virtual int LD_C_D(t_mem code) { return ld_r_g(destC(), rD); }
488 virtual int LD_C_E(t_mem code) { return ld_r_g(destC(), rE); }
490 virtual int LD_D_D(t_mem code) { return ld_r_g(destD(), rD); }
491 virtual int LD_D_E(t_mem code) { return ld_r_g(destD(), rE); }
492 virtual int LD_E_B(t_mem code) { return ld_r_g(destE(), rB); }
493 virtual int LD_E_C(t_mem code) { return ld_r_g(destE(), rC); }
494 virtual int LD_E_D(t_mem code) { return ld_r_g(destE(), rD); }
495 virtual int LD_E_H(t_mem code) { return ld_r_g(destE(), rH); }
496 virtual int LD_E_L(t_mem code) { return ld_r_g(destE(), rL); }
498 virtual int LD_H_H(t_mem code) { return ld_r_g(destH(), rH); }
499 virtual int LD_L_B(t_mem code) { return ld_r_g(destL(), rB); }
500 virtual int LD_L_C(t_mem code) { return ld_r_g(destL(), rC); }
501 virtual int LD_L_D(t_mem code) { return ld_r_g(destL(), rD); }
502 virtual int LD_L_E(t_mem code) { return ld_r_g(destL(), rE); }
503 virtual int LD_L_H(t_mem code) { return ld_r_g(destL(), rH); }
505 virtual int ADD_A_B(t_mem code) { return add8(rB, false); }
506 virtual int ADC_A_B(t_mem code) { return add8(rB, true ); }
508 virtual int SUB_A_B(t_mem code) { return sub8(rB, false); }
510 virtual int LD_B_D(t_mem code) { return ld_r_g(destB(), rD); }
511 virtual int LD_B_L(t_mem code) { return ld_r_g(destB(), rL); }
512 virtual int LD_C_B(t_mem code) { return ld_r_g(destC(), rB); }
513 virtual int LD_C_H(t_mem code) { return ld_r_g(destC(), rH); }
514 virtual int LD_C_L(t_mem code) { return ld_r_g(destC(), rL); }
516 virtual int LD_D_B(t_mem code) { return ld_r_g(destD(), rB); }
517 virtual int LD_D_C(t_mem code) { return ld_r_g(destD(), rC); }
518 virtual int LD_D_H(t_mem code) { return ld_r_g(destD(), rH); }
519 virtual int LD_D_L(t_mem code) { return ld_r_g(destD(), rL); }
521 virtual int LD_H_B(t_mem code) { return ld_r_g(destH(), rB); }
522 virtual int LD_H_C(t_mem code) { return ld_r_g(destH(), rC); }
523 virtual int LD_H_D(t_mem code) { return ld_r_g(destH(), rD); }
524 virtual int LD_H_E(t_mem code) { return ld_r_g(destH(), rE); }
525 virtual int LD_H_L(t_mem code) { return ld_r_g(destH(), rL); }
526 virtual int LD_L_L(t_mem code) { return ld_r_g(destL(), rL); }
528 virtual int LD_A_A(t_mem code) { return ld_r_g(destA(), rA); }
530 virtual int ADD_A_C(t_mem code) { return add8(rC, false); }
531 virtual int ADD_A_D(t_mem code) { return add8(rD, false); }
532 virtual int ADD_A_E(t_mem code) { return add8(rE, false); }
533 virtual int ADD_A_H(t_mem code) { return add8(rH, false); }
534 virtual int ADD_A_L(t_mem code) { return add8(rL, false); }
535 virtual int ADD_A_iHL(t_mem code) { tick(3); return add8(read8io(rHL), false); }
536 virtual int ADD_A_A(t_mem code) { return add8(rA, false); }
537 virtual int ADC_A_C(t_mem code) { return add8(rC, true); }
538 virtual int ADC_A_D(t_mem code) { return add8(rD, true); }
539 virtual int ADC_A_E(t_mem code) { return add8(rE, true); }
540 virtual int ADC_A_H(t_mem code) { return add8(rH, true); }
541 virtual int ADC_A_L(t_mem code) { return add8(rL, true); }
542 virtual int ADC_A_iHL(t_mem code) { tick(3); return add8(read8io(rHL), true); }
543 virtual int ADC_A_A(t_mem code) { return add8(rA, true); }
545 virtual int SUB_A_C(t_mem code) { return sub8(rC, false); }
546 virtual int SUB_A_D(t_mem code) { return sub8(rD, false); }
547 virtual int SUB_A_E(t_mem code) { return sub8(rE, false); }
548 virtual int SUB_A_H(t_mem code) { return sub8(rH, false); }
549 virtual int SUB_A_L(t_mem code) { return sub8(rL, false); }
550 virtual int SUB_A_iHL(t_mem code) { tick(3); return sub8(read8io(rHL), false); }
551 virtual int SUB_A_A(t_mem code) { return sub8(rA, false); }
552 virtual int SBC_A_B(t_mem code) { return sub8(rB, true); }
553 virtual int SBC_A_C(t_mem code) { return sub8(rC, true); }
554 virtual int SBC_A_D(t_mem code) { return sub8(rD, true); }
555 virtual int SBC_A_E(t_mem code) { return sub8(rE, true); }
556 virtual int SBC_A_H(t_mem code) { return sub8(rH, true); }
557 virtual int SBC_A_L(t_mem code) { return sub8(rL, true); }
558 virtual int SBC_A_iHL(t_mem code) { tick(3); return sub8(read8io(rHL), true); }
559 virtual int SBC_A_A(t_mem code) { return sub8(rA, true); }
561 virtual int AND_A_B(t_mem code) { return and8(destA(), rA, rB); }
562 virtual int AND_A_C(t_mem code) { return and8(destA(), rA, rC); }
563 virtual int AND_A_D(t_mem code) { return and8(destA(), rA, rD); }
564 virtual int AND_A_E(t_mem code) { return and8(destA(), rA, rE); }
565 virtual int AND_A_H(t_mem code) { return and8(destA(), rA, rH); }
566 virtual int AND_A_L(t_mem code) { return and8(destA(), rA, rL); }
567 virtual int AND_A_iHL(t_mem code) { tick(3); return and8(destA(), rA, read8io(rHL)); }
568 virtual int AND_A_A(t_mem code) { return and8(destA(), rA, rA); }
569 virtual int XOR_A_B(t_mem code) { return xor8(destA(), rA, rB); }
570 virtual int XOR_A_C(t_mem code) { return xor8(destA(), rA, rC); }
571 virtual int XOR_A_D(t_mem code) { return xor8(destA(), rA, rD); }
572 virtual int XOR_A_E(t_mem code) { return xor8(destA(), rA, rE); }
573 virtual int XOR_A_H(t_mem code) { return xor8(destA(), rA, rH); }
574 virtual int XOR_A_L(t_mem code) { return xor8(destA(), rA, rL); }
575 virtual int XOR_A_iHL(t_mem code) { tick(3); return xor8(destA(), rA, read8io(rHL)); }
577 virtual int OR_A_B(t_mem code) { return or8(destA(), rA, rB); }
578 virtual int OR_A_C(t_mem code) { return or8(destA(), rA, rC); }
579 virtual int OR_A_D(t_mem code) { return or8(destA(), rA, rD); }
580 virtual int OR_A_E(t_mem code) { return or8(destA(), rA, rE); }
581 virtual int OR_A_H(t_mem code) { return or8(destA(), rA, rH); }
582 virtual int OR_A_L(t_mem code) { return or8(destA(), rA, rL); }
583 virtual int OR_A_iHL(t_mem code) { tick(3); return or8(destA(), rA, read8io(rHL)); }
584 virtual int CP_A_B(t_mem code) { return cp8(rA, rB); }
585 virtual int CP_A_C(t_mem code) { return cp8(rA, rC); }
586 virtual int CP_A_D(t_mem code) { return cp8(rA, rD); }
587 virtual int CP_A_E(t_mem code) { return cp8(rA, rE); }
588 virtual int CP_A_H(t_mem code) { return cp8(rA, rH); }
589 virtual int CP_A_L(t_mem code) { return cp8(rA, rL); }
590 virtual int CP_A_iHL(t_mem code) { tick(3); return cp8(rA, read8io(rHL)); }
591 virtual int CP_A_A(t_mem code) { return cp8(rA, rA); }
593 virtual int PAGE_CB(t_mem code);
595 // Page ED, 3k mode
596 virtual int LD_EIR_A(t_mem code);
597 virtual int LD_IIR_A(t_mem code);
598 virtual int LD_A_EIR(t_mem code);
599 virtual int LD_A_IIR(t_mem code);
600 virtual int LDD(t_mem code) { return ld_d_i(-1); }
601 virtual int LDI(t_mem code) { return ld_d_i(+1); }
602 virtual int LDDR(t_mem code) { return LDxR(-1); }
603 virtual int LDIR(t_mem code) { return LDxR(+1); }
604 virtual int EXX_iSP_HL(t_mem code);
605 virtual int LD_BC_imn(t_mem code) { return ld_dd_imn(destBC()); }
606 virtual int LD_DE_imn(t_mem code) { return ld_dd_imn(destDE()); }
607 virtual int LD_HL_imn_ped(t_mem code) { return ld_dd_imn(destHL()); }
608 virtual int LD_SP_imn(t_mem code) { return ld_dd_imn(cSP); }
609 virtual int SBC_HL_BC(t_mem code) { return sub16(rBC, true); }
610 virtual int SBC_HL_DE(t_mem code) { return sub16(rDE, true); }
611 virtual int SBC_HL_HL(t_mem code) { return sub16(rHL, true); }
612 virtual int SBC_HL_SP(t_mem code) { return sub16(rSP, true); }
613 virtual int ADC_HL_BC(t_mem code) { return adc_hl_ss(rBC); }
614 virtual int ADC_HL_DE(t_mem code) { return adc_hl_ss(rDE); }
615 virtual int ADC_HL_HL(t_mem code) { return adc_hl_ss(rHL); }
616 virtual int ADC_HL_SP(t_mem code) { return adc_hl_ss(rSP); }
617 virtual int LD_aBC_BC(t_mem code) { return ld_add_BC_DE(caBC, rBC); }
618 virtual int LD_aDE_BC(t_mem code) { return ld_add_BC_DE(caDE, rBC); }
619 virtual int LD_aHL_BC(t_mem code) { return ld_add_BC_DE(caHL, rBC); }
620 virtual int LD_aBC_DE(t_mem code) { return ld_add_BC_DE(caBC, rDE); }
621 virtual int LD_aDE_DE(t_mem code) { return ld_add_BC_DE(caDE, rDE); }
622 virtual int LD_aHL_DE(t_mem code) { return ld_add_BC_DE(caHL, rDE); }
623 virtual int LD_imn_BC(t_mem code) { return ld_imn_ss(rBC); }
624 virtual int LD_imn_DE(t_mem code) { return ld_imn_ss(rDE); }
625 virtual int LD_imn_HL_ed(t_mem code) { return ld_imn_ss(rHL); }
626 virtual int LD_imn_SP(t_mem code) { return ld_imn_ss(rSP); }
627 virtual int NEG(t_mem code);
628 virtual int LRET(t_mem code);
629 virtual int IPSET_0(t_mem code) { return ipset(0); }
630 virtual int IPSET_1(t_mem code) { return ipset(1); }
631 virtual int IPSET_2(t_mem code) { return ipset(2); }
632 virtual int IPSET_3(t_mem code) { return ipset(3); }
633 virtual int RETI(t_mem code);
634 virtual int IPRES(t_mem code);
635 virtual int LDP_iHL_HL(t_mem code) { return ldp_irp_rp(rHL, rHL); }
636 virtual int LDP_imn_HL(t_mem code) { tick(3); return ldp_irp_rp(fetch16(), rHL); }
637 virtual int LDP_HL_iHL(t_mem code) { return ldp_rp_irp(cHL, rHL); }
638 virtual int LDP_HL_imn(t_mem code) { tick(3); return ldp_rp_irp(cHL, fetch16()); }
639 virtual int LD_XPC_A(t_mem code);
640 virtual int LD_A_XPC(t_mem code);
641 virtual int PUSH_IP(t_mem code);
642 virtual int POP_IP(t_mem code);
644 // Page DD/FD, 3k mode
645 virtual int LD_IR_mn(t_mem code);
646 virtual int ADD_IR_BC(t_mem code) { return add_ir_xy(rBC); }
647 virtual int ADD_IR_DE(t_mem code) { return add_ir_xy(rDE); }
648 virtual int ADD_IR_IR(t_mem code) { return add_ir_xy(cIR->get()); }
649 virtual int ADD_IR_SP(t_mem code) { return add_ir_xy(rSP); }
650 virtual int INC_iIRd(t_mem code);
651 virtual int DEC_iIRd(t_mem code);
652 virtual int CP_A_iIRd(t_mem code) { tick5p1(7); vc.rd++; return cp8(rA, dest8iIRd(fetch()).R()); }
653 virtual int SBC_A_iIRd(t_mem code) { tick5p1(5); vc.rd++; return sub8(dest8iIRd(fetch()).R(), true); }
654 virtual int SUB_A_iIRd(t_mem code) { tick5p1(5); vc.rd++; return sub8(dest8iIRd(fetch()).R(), false); }
655 virtual int ADD_A_iIRd(t_mem code) { tick5p1(5); vc.rd++; return add8(dest8iIRd(fetch()).R(), false); }
656 virtual int ADC_A_iIRd(t_mem code) { tick5p1(5); vc.rd++; return add8(dest8iIRd(fetch()).R(), true); }
657 virtual int INC_IR(t_mem code);
658 virtual int DEC_IR(t_mem code);
659 virtual int RR_IR(t_mem code) { tick(2); return rot17right(*cIR, cIR->get()); }
660 virtual int XOR_A_iIRd(t_mem code);
661 virtual int OR_A_iIRd(t_mem code);
662 virtual int AND_A_iIRd(t_mem code);
663 virtual int BOOL_IR(t_mem code);
664 virtual int AND_IR_DE(t_mem code);
665 virtual int OR_IR_DE(t_mem code);
666 virtual int POP_IR(t_mem code);
667 virtual int PUSH_IR(t_mem code);
668 virtual int EX_iSP_IR(t_mem code);
669 virtual int LD_iIRd_A(t_mem code) { return ld_iIRd_r(rA); }
670 virtual int LD_iIRd_B(t_mem code) { return ld_iIRd_r(rB); }
671 virtual int LD_iIRd_C(t_mem code) { return ld_iIRd_r(rC); }
672 virtual int LD_iIRd_D(t_mem code) { return ld_iIRd_r(rD); }
673 virtual int LD_iIRd_E(t_mem code) { return ld_iIRd_r(rE); }
674 virtual int LD_iIRd_H(t_mem code) { return ld_iIRd_r(rH); }
675 virtual int LD_iIRd_L(t_mem code) { return ld_iIRd_r(rL); }
676 virtual int LD_A_iIRd(t_mem code) { return ld_r_iIRd(destA()); }
677 virtual int LD_B_iIRd(t_mem code) { return ld_r_iIRd(destB()); }
678 virtual int LD_C_iIRd(t_mem code) { return ld_r_iIRd(destC()); }
679 virtual int LD_D_iIRd(t_mem code) { return ld_r_iIRd(destD()); }
680 virtual int LD_E_iIRd(t_mem code) { return ld_r_iIRd(destE()); }
681 virtual int LD_H_iIRd(t_mem code) { return ld_r_iIRd(destH()); }
682 virtual int LD_L_iIRd(t_mem code) { return ld_r_iIRd(destL()); }
683 virtual int LD_SP_IR(t_mem code);
684 virtual int LD_IR_iSPn(t_mem code);
685 virtual int LD_iSPn_IR(t_mem code);
686 virtual int LD_HL_iIRd(t_mem code);
687 virtual int LD_iIRd_n(t_mem code);
688 virtual int LD_imn_IR(t_mem code);
689 virtual int LD_IR_imn(t_mem code);
690 virtual int LD_HL_IR(t_mem code);
691 virtual int LD_IR_HL(t_mem code);
692 virtual int LD_iHLd_HL(t_mem code);
693 virtual int LDP_iIR_HL(t_mem code) { return ldp_irp_rp(cIR->get(), rHL); }
694 virtual int LDP_imn_IR(t_mem code) { tick(3); return ldp_irp_rp(fetch16(), cIR->get()); }
695 virtual int LDP_HL_iIR(t_mem code) { return ldp_rp_irp(cHL, cIR->get()); }
696 virtual int LDP_IR_imn(t_mem code) { tick(3); return ldp_rp_irp(*cIR, fetch16()); }
697 virtual int JP_IR(t_mem code) { tick(5); PC= cIR->get(); return resGO; }
698 virtual int PAGE_DD_CB(t_mem code);
702 enum rxkcpu_cfg {
703 //rxk_cpu_xpc = 0,
705 rxk_cpu_nuof = 0
708 class cl_rxk_cpu: public cl_hw
710 protected:
711 class cl_rxk *ruc;
712 class cl_memory_cell *segsize, *dataseg, *stackseg;
713 public:
714 cl_rxk_cpu(class cl_uc *auc);
715 virtual int init(void);
716 //virtual unsigned int cfg_size() { return rxk_cpu_nuof; }
717 virtual const char *cfg_help(t_addr addr);
719 virtual void write(class cl_memory_cell *cell, t_mem *val);
720 //virtual t_mem conf_op(cl_memory_cell *cell, t_addr addr, t_mem *val);
722 virtual void print_info(class cl_console_base *con);
726 #endif
728 /* End of rxk.src/rxk.cc */