2 * Simulator of microcontrollers (rxkcl.h)
4 * Copyright (C) 2020 Drotos Daniel
6 * To contact author send email to dr.dkdb@gmail.com
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
40 * Base of RXK processor
47 #define rXPC (mem->get_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)
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)
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
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
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
;
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
;
140 class cl_address_space
*ioi
, *ioe
;
141 class cl_address_space
*rwas
;
142 bool prefix
, altd
, atomic
;
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
)); }
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);
225 u16_t
read16io(u16_t a
) { u8_t l
, h
; vc
.rd
+=2;
226 l
= rwas
->read(a
); h
= rwas
->read(a
+1);
229 u32_t
read32(u16_t a
) { u16_t l
, h
; vc
.rd
+=4;
230 l
= read16(a
); h
= read16(a
+2);
233 u32_t
read32io(u16_t a
) { u16_t l
, h
; vc
.rd
+=4;
234 l
= read16io(a
); h
= read16io(a
+2);
237 u16_t
fetch16(void) { u8_t l
, h
;
238 l
= fetch(); h
= fetch();
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
);
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
);
708 class cl_rxk_cpu
: public cl_hw
712 class cl_memory_cell
*segsize
, *dataseg
, *stackseg
;
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
);
728 /* End of rxk.src/rxk.cc */