1 
2 /*
3  *   O2EM Free Odyssey2 / Videopac+ Emulator
4  *
5  *   Created by Daniel Boris <dboris@comcast.net>  (c) 1997,1998
6  *
7  **   Developed by Andre de la Rocha   <adlroc@users.sourceforge.net>
8  *             Arlindo M. de Oliveira <dgtec@users.sourceforge.net>
9  *
10  *   http://o2em.sourceforge.net
11  *
12  *
13  *
14  *   8048 microcontroller emulation
15  */
16 
17 
18 #include <stdio.h>
19 #include "types.h"
20 #include "vmachine.h"
21 #include "keyboard.h"
22 #include "voice.h"
23 #include "vdc.h"
24 #include "vpp.h"
25 #include "cpu.h"
26 
27 
28 Byte acc;		/* Accumulator */
29 ADDRESS pc;		/* Program counter */
30 long clk;		/* clock */
31 
32 Byte itimer;	/* Internal timer */
33 Byte reg_pnt;	/* pointer to register bank */
34 Byte timer_on;  /* 0=timer off/1=timer on */
35 Byte count_on;  /* 0=count off/1=count on */
36 Byte psw;		/* Processor status word */
37 Byte sp;		/* Stack pointer (part of psw) */
38 
39 Byte p1;		/* I/O port 1 */
40 Byte p2; 		/* I/O port 2 */
41 Byte xirq_pend; /* external IRQ pending */
42 Byte tirq_pend; /* timer IRQ pending */
43 Byte t_flag;	/* Timer flag */
44 
45 static ADDRESS lastpc;
46 static ADDRESS A11;		/* PC bit 11 */
47 static ADDRESS A11ff;
48 static Byte bs; 		/* Register Bank (part of psw) */
49 static Byte f0;			/* Flag Bit (part of psw) */
50 static Byte f1;			/* Flag Bit 1 */
51 static Byte ac;			/* Aux Carry (part of psw) */
52 static Byte cy;			/* Carry flag (part of psw) */
53 static Byte xirq_en;	/* external IRQ's enabled */
54 static Byte tirq_en;	/* Timer IRQ enabled */
55 static Byte irq_ex;		/* IRQ executing */
56 
57 static int master_count;
58 
59 
60 #define push(d) {intRAM[sp++] = (d); if (sp > 23) sp = 8;}
61 #define pull() (sp--, (sp < 8)?(sp=23):0, intRAM[sp])
62 #define make_psw() {psw = (cy << 7) | ac | f0 | bs | 0x08; psw = psw | ((sp - 8) >> 1);}
63 #define illegal(o) {}
64 #define undef(i) {printf("** unimplemented instruction %x, %x**\n",i,pc);}
65 #define ROM(adr) (rom[(adr) & 0xfff])
66 
67 
init_cpu(void)68 void init_cpu(void){
69 	pc=0;
70 	sp=8;
71 	bs=0;
72 	p1=p2=0xFF;
73 	ac=cy=f0=0;
74 	A11=A11ff=0;
75 	timer_on=0;
76 	count_on=0;
77 	reg_pnt=0;
78 	tirq_en=xirq_en=irq_ex=xirq_pend=tirq_pend=0;
79 }
80 
81 
ext_IRQ(void)82 void ext_IRQ(void){
83 	int_clk = 5; /* length of pulse on /INT */
84 	if (xirq_en && !irq_ex) {
85 		irq_ex=1;
86 		xirq_pend=0;
87 		clk+=2;
88 		make_psw();
89 		push(pc & 0xFF);
90 		push(((pc & 0xF00) >> 8) | (psw & 0xF0));
91 		pc = 0x03;
92 		A11ff=A11;
93 		A11=0;
94 	}
95 	if (pendirq && (!xirq_en)) xirq_pend=1;
96 }
97 
98 
tim_IRQ(void)99 void tim_IRQ(void){
100 	if (tirq_en && !irq_ex) {
101 		irq_ex=2;
102 		tirq_pend=0;
103 		clk+=2;
104 		make_psw();
105 		push(pc & 0xFF);
106 		push(((pc & 0xF00) >> 8) | (psw & 0xF0));
107 		pc = 0x07;
108 		A11ff=A11;
109 		A11=0;
110 	}
111 	if (pendirq && (!tirq_en)) tirq_pend=1;
112 }
113 
114 
make_psw_debug(void)115 void make_psw_debug(void){
116 	make_psw();
117 }
118 
119 
120 
cpu_exec(void)121 void cpu_exec(void) {
122 	Byte op;
123 	ADDRESS adr;
124 	Byte dat;
125 	int temp;
126 
127 	for (;;) {
128 
129 		clk=0;
130 
131 		lastpc=pc;
132 		op=ROM(pc++);
133 		switch (op) {
134 			case 0x00: /* NOP */
135 				clk++;
136 				break;
137 			case 0x01: /* ILL */
138 				illegal(op);
139 				clk++;
140 				break;
141 			case 0x02: /* OUTL BUS,A */
142 				clk+=2;
143 				undef(0x02);
144 				break;
145 			case 0x03: /* ADD A,#data */
146 				clk+=2;
147 				cy=ac=0;
148 				dat=ROM(pc++);
149 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
150 				temp=acc+dat;
151 				if (temp > 0xFF) cy=1;
152 				acc=(temp & 0xFF);
153 				break;
154 			case 0x04:	/* JMP */
155 				pc=ROM(pc) | A11;
156 				clk+=2;
157 				break;
158 			case 0x05: /* EN I */
159 				xirq_en=1;
160 				clk++;
161 				break;
162 			case 0x06: /* ILL */
163 				clk++;
164 				illegal(op);
165 				break;
166 			case 0x07: /* DEC A */
167 				acc--;
168 				clk++;
169 				break;
170 			case 0x08: /* INS A,BUS*/
171 				clk+=2;
172 				acc=in_bus();
173 				break;
174 			case 0x09: /* IN A,Pp */
175 				acc=p1;
176 				clk+=2;
177 				break;
178 			case 0x0A: /* IN A,Pp */
179 				acc=read_P2();
180 				clk+=2;
181 				break;
182 			case 0x0B: /* ILL */
183 				clk++;
184 				illegal(op);
185 				break;
186 			case 0x0C: /* MOVD A,P4 */
187 				clk+=2;
188 				acc=read_PB(0);
189 				break;
190 			case 0x0D: /* MOVD A,P5 */
191 				clk+=2;
192 				acc=read_PB(1);
193 				break;
194 			case 0x0E: /* MOVD A,P6 */
195 				clk+=2;
196 				acc=read_PB(2);
197 				break;
198 			case 0x0F: /* MOVD A,P7 */
199 				clk+=2;
200 				acc=read_PB(3);
201 				break;
202 			case 0x10: /* INC @Ri */
203 				intRAM[intRAM[reg_pnt] & 0x3F]++;
204 				clk++;
205 				break;
206 			case 0x11: /* INC @Ri */
207 				intRAM[intRAM[reg_pnt+1] & 0x3F]++;
208 				clk++;
209 				break;
210 			case 0x12: /* JBb address */
211 				clk+=2;
212 				dat = ROM(pc);
213 				if (acc & 0x01)
214 					pc=(pc & 0xF00) | dat;
215 				else
216 					pc++;
217 				break;
218 			case 0x13: /* ADDC A,#data */
219 				clk+=2;
220 				dat=ROM(pc++);
221 				ac=0;
222 				if (((acc & 0x0f) + (dat & 0x0f) + cy) > 0x0f) ac=0x40;
223 				temp=acc+dat+cy;
224 				cy=0;
225 				if (temp > 0xFF) cy=1;
226 				acc=(temp & 0xFF);
227 				break;
228 
229 			case 0x14: /* CALL */
230 				make_psw();
231 				adr = ROM(pc) | A11;
232 				pc++;
233 				clk+=2;
234 				push(pc & 0xFF);
235 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
236 				pc = adr;
237 				break;
238 			case 0x15: /* DIS I */
239 				xirq_en=0;
240 				clk++;
241 				break;
242 			case 0x16: /* JTF */
243 				clk+=2;
244 				dat = ROM(pc);
245 				if (t_flag)
246 					pc=(pc & 0xF00) | dat;
247 				else
248 					pc++;
249 				t_flag=0;
250 				break;
251 			case 0x17: /* INC A */
252 				acc++;
253 				clk++;
254 				break;
255 			case 0x18: /* INC Rr */
256 				intRAM[reg_pnt]++;
257 				clk++;
258 				break;
259 			case 0x19: /* INC Rr */
260 				intRAM[reg_pnt+1]++;
261 				clk++;
262 				break;
263 			case 0x1A: /* INC Rr */
264 				intRAM[reg_pnt+2]++;
265 				clk++;
266 				break;
267 			case 0x1B: /* INC Rr */
268 				intRAM[reg_pnt+3]++;
269 				clk++;
270 				break;
271 			case 0x1C: /* INC Rr */
272 				intRAM[reg_pnt+4]++;
273 				clk++;
274 				break;
275 			case 0x1D: /* INC Rr */
276 				intRAM[reg_pnt+5]++;
277 				clk++;
278 				break;
279 			case 0x1E: /* INC Rr */
280 				intRAM[reg_pnt+6]++;
281 				clk++;
282 				break;
283 			case 0x1F: /* INC Rr */
284 				intRAM[reg_pnt+7]++;
285 				clk++;
286 				break;
287 			case 0x20: /* XCH A,@Ri */
288 				clk++;
289 				dat=acc;
290 				acc=intRAM[intRAM[reg_pnt] & 0x3F];
291 				intRAM[intRAM[reg_pnt] & 0x3F] = dat;
292 				break;
293 			case 0x21: /* XCH A,@Ri */
294 				clk++;
295 				dat=acc;
296 				acc=intRAM[intRAM[reg_pnt+1] & 0x3F];
297 				intRAM[intRAM[reg_pnt+1] & 0x3F] = dat;
298 				break;
299 			case 0x22: /* ILL */
300 				clk++;
301 				illegal(op);
302 				break;
303 			case 0x23:  /* MOV a,#data */
304 				clk+=2;
305 				acc = ROM(pc++);
306 				break;
307 
308 			case 0x24:  /* JMP */
309 				pc=ROM(pc) | 0x100 | A11;
310 				clk+=2;
311 				break;
312 			case 0x25: /* EN TCNTI */
313 				tirq_en=1;
314 				clk++;
315 				break;
316 			case 0x26:  /* JNT0 */
317 				clk+=2;
318 				dat = ROM(pc);
319 				if (!get_voice_status())
320 					pc=(pc & 0xF00) | dat;
321 				else
322 					pc++;
323 				break;
324 			case 0x27:  /* CLR A */
325 				clk++;
326 				acc=0;
327 				break;
328 			case 0x28: /* XCH A,Rr */
329 				dat=acc;
330 				acc=intRAM[reg_pnt];
331 				intRAM[reg_pnt]=dat;
332 				clk++;
333 				break;
334 			case 0x29: /* XCH A,Rr */
335 				dat=acc;
336 				acc=intRAM[reg_pnt+1];
337 				intRAM[reg_pnt+1]=dat;
338 				clk++;
339 				break;
340 			case 0x2A: /* XCH A,Rr */
341 				dat=acc;
342 				acc=intRAM[reg_pnt+2];
343 				intRAM[reg_pnt+2]=dat;
344 				clk++;
345 				break;
346 			case 0x2B: /* XCH A,Rr */
347 				dat=acc;
348 				acc=intRAM[reg_pnt+3];
349 				intRAM[reg_pnt+3]=dat;
350 				clk++;
351 				break;
352 			case 0x2C: /* XCH A,Rr */
353 				dat=acc;
354 				acc=intRAM[reg_pnt+4];
355 				intRAM[reg_pnt+4]=dat;
356 				clk++;
357 				break;
358 			case 0x2D: /* XCH A,Rr */
359 				dat=acc;
360 				acc=intRAM[reg_pnt+5];
361 				intRAM[reg_pnt+5]=dat;
362 				clk++;
363 				break;
364 			case 0x2E: /* XCH A,Rr */
365 				dat=acc;
366 				acc=intRAM[reg_pnt+6];
367 				intRAM[reg_pnt+6]=dat;
368 				clk++;
369 				break;
370 			case 0x2F: /* XCH A,Rr */
371 				dat=acc;
372 				acc=intRAM[reg_pnt+7];
373 				intRAM[reg_pnt+7]=dat;
374 				clk++;
375 				break;
376 			case 0x30: /* XCHD A,@Ri */
377 				clk++;
378 				adr=intRAM[reg_pnt] & 0x3F;
379 				dat=acc & 0x0F;
380 				acc=acc & 0xF0;
381 				acc=acc | (intRAM[adr] & 0x0F);
382 				intRAM[adr] &= 0xF0;
383 				intRAM[adr] |= dat;
384 				break;
385 			case 0x31: /* XCHD A,@Ri */
386 				clk++;
387 				adr=intRAM[reg_pnt+1] & 0x3F;
388 				dat=acc & 0x0F;
389 				acc=acc & 0xF0;
390 				acc=acc | (intRAM[adr] & 0x0F);
391 				intRAM[adr] &= 0xF0;
392 				intRAM[adr] |= dat;
393 				break;
394 			case 0x32: /* JBb address */
395 				clk+=2;
396 				dat=ROM(pc);
397 				if (acc & 0x02)
398 					pc=(pc & 0xF00) | dat;
399 				else
400 					pc++;
401 				break;
402 			case 0x33: /* ILL */
403 				clk++;
404 				illegal(op);
405 				break;
406 			case 0x34: /* CALL */
407 				make_psw();
408 				adr = ROM(pc) | 0x100 | A11;
409 				pc++;
410 				clk+=2;
411 				push(pc & 0xFF);
412 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
413 				pc = adr;
414 				break;
415 			case 0x35: /* DIS TCNTI */
416 				tirq_en=0;
417 				tirq_pend=0;
418 				clk++;
419 				break;
420 			case 0x36: /* JT0 */
421 				clk+=2;
422 				dat=ROM(pc);
423 				if (get_voice_status())
424 					pc=(pc & 0xF00) | dat;
425 				else
426 					pc++;
427 				break;
428 			case 0x37: /* CPL A */
429 				acc = acc ^ 0xFF;
430 				clk++;
431 				break;
432 			case 0x38: /* ILL */
433 				clk++;
434 				illegal(op);
435 				break;
436 			case 0x39: /* OUTL P1,A */
437 				clk+=2;
438 				write_p1(acc);
439 				break;
440 			case 0x3A: /* OUTL P2,A */
441 				clk+=2;
442 				p2=acc;
443 				break;
444 			case 0x3B: /* ILL */
445 				clk++;
446 				illegal(op);
447 				break;
448 			case 0x3C: /* MOVD P4,A */
449 				clk+=2;
450 				write_PB(0,acc);
451 				break;
452 			case 0x3D: /* MOVD P5,A */
453 				clk+=2;
454 				write_PB(1,acc);
455 				break;
456 			case 0x3E: /* MOVD P6,A */
457 				clk+=2;
458 				write_PB(2,acc);
459 				break;
460 			case 0x3F: /* MOVD P7,A */
461 				clk+=2;
462 				write_PB(3,acc);
463 				break;
464 			case 0x40: /* ORL A,@Ri */
465 				clk++;
466 				acc = acc | intRAM[intRAM[reg_pnt] & 0x3F];
467 				break;
468 			case 0x41: /* ORL A,@Ri */
469 				clk++;
470 				acc = acc | intRAM[intRAM[reg_pnt+1] & 0x3F];
471 				break;
472 			case 0x42: /* MOV A,T */
473 				clk++;
474 				acc = itimer;
475 				break;
476 			case 0x43: /* ORL A,#data */
477 				clk+=2;
478 				acc = acc | ROM(pc++);
479 				break;
480 			case 0x44:  /* JMP */
481 				pc=ROM(pc) | 0x200 | A11;
482 				clk+=2;
483 				break;
484 			case 0x45: /* STRT CNT */
485 				/* printf("START: %d=%d\n",master_clk/22,itimer); */
486 				count_on=1;
487 				clk++;
488 				break;
489 			case 0x46:  /* JNT1 */
490 				clk+=2;
491 				dat = ROM(pc);
492 				if (!read_t1())
493 					pc=(pc & 0xF00) | dat;
494 				else
495 					pc++;
496 				break;
497 			case 0x47: /* SWAP A */
498 				clk++;
499 				dat=(acc & 0xF0) >> 4;
500 				acc = acc << 4;
501 				acc = acc | dat;
502 				break;
503 			case 0x48: /* ORL A,Rr */
504 				clk++;
505 				acc = acc | intRAM[reg_pnt];
506 				break;
507 			case 0x49: /* ORL A,Rr */
508 				clk++;
509 				acc = acc | intRAM[reg_pnt+1];
510 				break;
511 			case 0x4A: /* ORL A,Rr */
512 				clk++;
513 				acc = acc | intRAM[reg_pnt+2];
514 				break;
515 			case 0x4B: /* ORL A,Rr */
516 				clk++;
517 				acc = acc | intRAM[reg_pnt+3];
518 				break;
519 			case 0x4C: /* ORL A,Rr */
520 				clk++;
521 				acc = acc | intRAM[reg_pnt+4];
522 				break;
523 			case 0x4D: /* ORL A,Rr */
524 				clk++;
525 				acc = acc | intRAM[reg_pnt+5];
526 				break;
527 			case 0x4E: /* ORL A,Rr */
528 				clk++;
529 				acc = acc | intRAM[reg_pnt+6];
530 				break;
531 			case 0x4F: /* ORL A,Rr */
532 				clk++;
533 				acc = acc | intRAM[reg_pnt+7];
534 				break;
535 
536 			case 0x50:	/* ANL A,@Ri */
537 				acc = acc & intRAM[intRAM[reg_pnt] & 0x3F];
538 				clk++;
539 				break;
540 			case 0x51:	/* ANL A,@Ri */
541 				acc = acc & intRAM[intRAM[reg_pnt+1] & 0x3F];
542 				clk++;
543 				break;
544 			case 0x52: /* JBb address */
545 				clk+=2;
546 				dat=ROM(pc);
547 				if (acc & 0x04)
548 					pc=(pc & 0xF00) | dat;
549 				else
550 					pc++;
551 				break;
552 			case 0x53:  /* ANL A,#data */
553 				clk+=2;
554 				acc = acc & ROM(pc++);
555 				break;
556 			case 0x54: /* CALL */
557 				make_psw();
558 				adr = ROM(pc) | 0x200 | A11;
559 				pc++;
560 				clk+=2;
561 				push(pc & 0xFF);
562 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
563 				pc = adr;
564 				break;
565 			case 0x55: /* STRT T */
566 				timer_on=1;
567 				clk++;
568 				break;
569 			case 0x56: /* JT1 */
570 				clk+=2;
571 				dat = ROM(pc);
572 				if (read_t1())
573 					pc=(pc & 0xF00) | dat;
574 				else
575 					pc++;
576 				break;
577 			case 0x57: /* DA A */
578 				clk++;
579 				if (((acc & 0x0F) > 0x09) || ac) {
580 					if (acc>0xf9) cy=1;
581 					acc += 6;
582 				}
583 				dat = (acc & 0xF0) >> 4;
584 				if ((dat > 9) || cy) {
585 					dat+=6;
586 					cy=1;
587 				}
588 				acc = (acc & 0x0F) | (dat << 4);
589 				break;
590 			case 0x58: /* ANL A,Rr */
591 				clk++;
592 				acc = acc & intRAM[reg_pnt];
593 				break;
594 			case 0x59: /* ANL A,Rr */
595 				clk++;
596 				acc = acc & intRAM[reg_pnt+1];
597 				break;
598 			case 0x5A: /* ANL A,Rr */
599 				clk++;
600 				acc = acc & intRAM[reg_pnt+2];
601 				break;
602 			case 0x5B: /* ANL A,Rr */
603 				clk++;
604 				acc = acc & intRAM[reg_pnt+3];
605 				break;
606 			case 0x5C: /* ANL A,Rr */
607 				clk++;
608 				acc = acc & intRAM[reg_pnt+4];
609 				break;
610 			case 0x5D: /* ANL A,Rr */
611 				clk++;
612 				acc = acc & intRAM[reg_pnt+5];
613 				break;
614 			case 0x5E: /* ANL A,Rr */
615 				clk++;
616 				acc = acc & intRAM[reg_pnt+6];
617 				break;
618 			case 0x5F: /* ANL A,Rr */
619 				clk++;
620 				acc = acc & intRAM[reg_pnt+7];
621 				break;
622 
623 			case 0x60: /* ADD A,@Ri */
624 				clk++;
625 				cy=ac=0;
626 				dat=intRAM[intRAM[reg_pnt] & 0x3F];
627 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
628 				temp=acc+dat;
629 				if (temp > 0xFF) cy=1;
630 				acc=(temp & 0xFF);
631 				break;
632 			case 0x61: /* ADD A,@Ri */
633 				clk++;
634 				cy=ac=0;
635 				dat=intRAM[intRAM[reg_pnt+1] & 0x3F];
636 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
637 				temp=acc+dat;
638 				if (temp > 0xFF) cy=1;
639 				acc=(temp & 0xFF);
640 				break;
641 			case 0x62: /* MOV T,A */
642 				clk++;
643 				itimer=acc;
644 				break;
645 			case 0x63: /* ILL */
646 				clk++;
647 				illegal(op);
648 				break;
649 			case 0x64:  /* JMP */
650 				pc=ROM(pc) | 0x300 | A11;
651 				clk+=2;
652 				break;
653 			case 0x65: /* STOP TCNT */
654 				clk++;
655 				/* printf("STOP %d\n",master_clk/22); */
656 				count_on=timer_on=0;
657 				break;
658 			case 0x66: /* ILL */
659 				clk++;
660 				illegal(op);
661 				break;
662 			case 0x67: /* RRC A */
663 				dat=cy;
664 				cy=acc & 0x01;
665 				acc = acc >> 1;
666 				if (dat)
667 					acc = acc | 0x80;
668 				else
669 					acc = acc & 0x7F;
670 				clk++;
671 				break;
672 			case 0x68: /* ADD A,Rr */
673 				clk++;
674 				cy=ac=0;
675 				dat=intRAM[reg_pnt];
676 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
677 				temp=acc+dat;
678 				if (temp > 0xFF) cy=1;
679 				acc=(temp & 0xFF);
680 				break;
681 			case 0x69: /* ADD A,Rr */
682 				clk++;
683 				cy=ac=0;
684 				dat=intRAM[reg_pnt+1];
685 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
686 				temp=acc+dat;
687 				if (temp > 0xFF) cy=1;
688 				acc=(temp & 0xFF);
689 				break;
690 			case 0x6A: /* ADD A,Rr */
691 				clk++;
692 				cy=ac=0;
693 				dat=intRAM[reg_pnt+2];
694 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
695 				temp=acc+dat;
696 				if (temp > 0xFF) cy=1;
697 				acc=(temp & 0xFF);
698 				break;
699 			case 0x6B: /* ADD A,Rr */
700 				clk++;
701 				cy=ac=0;
702 				dat=intRAM[reg_pnt+3];
703 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
704 				temp=acc+dat;
705 				if (temp > 0xFF) cy=1;
706 				acc=(temp & 0xFF);
707 				break;
708 			case 0x6C: /* ADD A,Rr */
709 				clk++;
710 				cy=ac=0;
711 				dat=intRAM[reg_pnt+4];
712 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
713 				temp=acc+dat;
714 				if (temp > 0xFF) cy=1;
715 				acc=(temp & 0xFF);
716 				break;
717 			case 0x6D: /* ADD A,Rr */
718 				clk++;
719 				cy=ac=0;
720 				dat=intRAM[reg_pnt+5];
721 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
722 				temp=acc+dat;
723 				if (temp > 0xFF) cy=1;
724 				acc=(temp & 0xFF);
725 				break;
726 			case 0x6E: /* ADD A,Rr */
727 				clk++;
728 				cy=ac=0;
729 				dat=intRAM[reg_pnt+6];
730 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
731 				temp=acc+dat;
732 				if (temp > 0xFF) cy=1;
733 				acc=(temp & 0xFF);
734 				break;
735 			case 0x6F: /* ADD A,Rr */
736 				clk++;
737 				cy=ac=0;
738 				dat=intRAM[reg_pnt+7];
739 				if (((acc & 0x0f) + (dat & 0x0f)) > 0x0f) ac=0x40;
740 				temp=acc+dat;
741 				if (temp > 0xFF) cy=1;
742 				acc=(temp & 0xFF);
743 				break;
744 			case 0x70: /* ADDC A,@Ri */
745 				clk++;
746 				ac=0;
747 				dat=intRAM[intRAM[reg_pnt] & 0x3F];
748 				if (((acc & 0x0f) + (dat & 0x0f) + cy) > 0x0f) ac=0x40;
749 				temp=acc+dat+cy;
750 				cy=0;
751 				if (temp > 0xFF) cy=1;
752 				acc=(temp & 0xFF);
753 				break;
754 			case 0x71: /* ADDC A,@Ri */
755 				clk++;
756 				ac=0;
757 				dat=intRAM[intRAM[reg_pnt+1] & 0x3F];
758 				if (((acc & 0x0f) + (dat & 0x0f) + cy) > 0x0f) ac=0x40;
759 				temp=acc+dat+cy;
760 				cy=0;
761 				if (temp > 0xFF) cy=1;
762 				acc=(temp & 0xFF);
763 				break;
764 
765 			case 0x72: /* JBb address */
766 				clk+=2;
767 				dat=ROM(pc);
768 				if (acc & 0x08)
769 					pc=(pc & 0xF00) | dat;
770 				else
771 					pc++;
772 				break;
773 			case 0x73: /* ILL */
774 				clk++;
775 				illegal(op);
776 				break;
777 			case 0x74: /* CALL */
778 				make_psw();
779 				adr = ROM(pc) | 0x300 | A11;
780 				pc++;
781 				clk+=2;
782 				push(pc & 0xFF);
783 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
784 				pc = adr;
785 				break;
786 			case 0x75: /* EN CLK */
787 				clk++;
788 				undef(op);
789 				break;
790 			case 0x76: /* JF1 address */
791 				clk+=2;
792 				dat=ROM(pc);
793 				if (f1)
794 					pc=(pc & 0xF00) | dat;
795 				else
796 					pc++;
797 				break;
798 			case 0x77: /* RR A */
799 				clk++;
800 				dat=acc & 0x01;
801 				acc = acc >> 1;
802 				if (dat)
803 					acc = acc | 0x80;
804 				else
805 					acc = acc & 0x7f;
806 				break;
807 
808 			case 0x78: /* ADDC A,Rr */
809 				clk++;
810 				ac=0;
811 				dat=intRAM[reg_pnt];
812 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
813 				temp=acc+dat+cy;
814 				cy=0;
815 				if (temp > 0xFF) cy=1;
816 				acc=(temp & 0xFF);
817 				break;
818 			case 0x79: /* ADDC A,Rr */
819 				clk++;
820 				ac=0;
821 				dat=intRAM[reg_pnt+1];
822 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
823 				temp=acc+dat+cy;
824 				cy=0;
825 				if (temp > 0xFF) cy=1;
826 				acc=(temp & 0xFF);
827 				break;
828 			case 0x7A: /* ADDC A,Rr */
829 				clk++;
830 				ac=0;
831 				dat=intRAM[reg_pnt+2];
832 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
833 				temp=acc+dat+cy;
834 				cy=0;
835 				if (temp > 0xFF) cy=1;
836 				acc=(temp & 0xFF);
837 				break;
838 			case 0x7B: /* ADDC A,Rr */
839 				clk++;
840 				ac=0;
841 				dat=intRAM[reg_pnt+3];
842 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
843 				temp=acc+dat+cy;
844 				cy=0;
845 				if (temp > 0xFF) cy=1;
846 				acc=(temp & 0xFF);
847 				break;
848 			case 0x7C: /* ADDC A,Rr */
849 				clk++;
850 				ac=0;
851 				dat=intRAM[reg_pnt+4];
852 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
853 				temp=acc+dat+cy;
854 				cy=0;
855 				if (temp > 0xFF) cy=1;
856 				acc=(temp & 0xFF);
857 				break;
858 			case 0x7D: /* ADDC A,Rr */
859 				clk++;
860 				ac=0;
861 				dat=intRAM[reg_pnt+5];
862 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
863 				temp=acc+dat+cy;
864 				cy=0;
865 				if (temp > 0xFF) cy=1;
866 				acc=(temp & 0xFF);
867 				break;
868 			case 0x7E: /* ADDC A,Rr */
869 				clk++;
870 				ac=0;
871 				dat=intRAM[reg_pnt+6];
872 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
873 				temp=acc+dat+cy;
874 				cy=0;
875 				if (temp > 0xFF) cy=1;
876 				acc=(temp & 0xFF);
877 				break;
878 			case 0x7F: /* ADDC A,Rr */
879 				clk++;
880 				ac=0;
881 				dat=intRAM[reg_pnt+7];
882 				if (((acc & 0x0f) + (dat & 0x0f)+cy) > 0x0f) ac=0x40;
883 				temp=acc+dat+cy;
884 				cy=0;
885 				if (temp > 0xFF) cy=1;
886 				acc=(temp & 0xFF);
887 				break;
888 
889 			case 0x80:  /* MOVX  A,@Ri */
890 				acc=ext_read(intRAM[reg_pnt]);
891 				clk+=2;
892 				break;
893 			case 0x81:  /* MOVX A,@Ri */
894 				acc=ext_read(intRAM[reg_pnt+1]);
895 				clk+=2;
896 				break;
897 			case 0x82: /* ILL */
898 				clk++;
899 				illegal(op);
900 				break;
901 			case 0x83:  /* RET */
902 				clk+=2;
903 				pc = ((pull() & 0x0F) << 8);
904 				pc = pc | pull();
905 				break;
906 			case 0x84:  /* JMP */
907 				pc=ROM(pc) | 0x400 | A11;
908 				clk+=2;
909 				break;
910 			case 0x85: /* CLR F0 */
911 				clk++;
912 				f0=0;
913 				break;
914 			case 0x86: /* JNI address */
915 				clk+=2;
916 				dat=ROM(pc);
917 				if (int_clk > 0)
918 					pc=(pc & 0xF00) | dat;
919 				else
920 					pc++;
921 				break;
922 			case 0x87: /* ILL */
923 				illegal(op);
924 				clk++;
925 				break;
926 			case 0x88: /* BUS,#data */
927 				clk+=2;
928 				undef(op);
929 				break;
930 			case 0x89: /* ORL Pp,#data */
931 				write_p1(p1 | ROM(pc++));
932 				clk+=2;
933 				break;
934 			case 0x8A: /* ORL Pp,#data */
935 				p2 = p2 | ROM(pc++);
936 				clk+=2;
937 				break;
938 			case 0x8B: /* ILL */
939 				illegal(op);
940 				clk++;
941 				break;
942 			case 0x8C: /* ORLD P4,A */
943 				write_PB(0,read_PB(0)|acc);
944 				clk+=2;
945 				break;
946 			case 0x8D: /* ORLD P5,A */
947 				write_PB(1,read_PB(1)|acc);
948 				clk+=2;
949 				break;
950 			case 0x8E: /* ORLD P6,A */
951 				write_PB(2,read_PB(2)|acc);
952 				clk+=2;
953 				break;
954 			case 0x8F: /* ORLD P7,A */
955 				write_PB(3,read_PB(3)|acc);
956 				clk+=2;
957 				break;
958 			case 0x90:  /* MOVX @Ri,A */
959 				ext_write(acc,intRAM[reg_pnt]);
960 				clk+=2;
961 				break;
962 			case 0x91:  /* MOVX @Ri,A */
963 				ext_write(acc,intRAM[reg_pnt+1]);
964 				clk+=2;
965 				break;
966 			case 0x92: /* JBb address */
967 				clk+=2;
968 				dat=ROM(pc);
969 				if (acc & 0x10)
970 					pc=(pc & 0xF00) | dat;
971 				else
972 					pc++;
973 				break;
974 			case 0x93:  /* RETR*/
975 				/* printf("RETR %d\n",master_clk/22); */
976 				clk+=2;
977 				dat=pull();
978 				pc = (dat & 0x0F) << 8;
979 				cy = (dat & 0x80) >> 7;
980 				ac = dat & 0x40;
981 				f0 = dat & 0x20;
982 				bs = dat & 0x10;
983 				if (bs)
984 					reg_pnt=24;
985 				else
986 					reg_pnt=0;
987 				pc = pc | pull();
988 				irq_ex=0;
989 				A11=A11ff;
990 				break;
991 			case 0x94: /* CALL */
992 				make_psw();
993 				adr = ROM(pc) | 0x400 | A11;
994 				pc++;
995 				clk+=2;
996 				push(pc & 0xFF);
997 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
998 				pc = adr;
999 				break;
1000 			case 0x95: /* CPL F0 */
1001 				f0 = f0 ^ 0x20;
1002 				clk++;
1003 				break;
1004 			case 0x96: /* JNZ address */
1005 				clk+=2;
1006 				dat=ROM(pc);
1007 				if (acc != 0)
1008 					pc=(pc & 0xF00) | dat;
1009 				else
1010 					pc++;
1011 				break;
1012 			case 0x97: /* CLR C */
1013 				cy=0;
1014 				clk++;
1015 				break;
1016 			case 0x98: /* ANL BUS,#data */
1017 				clk+=2;
1018 				undef(op);
1019 				break;
1020 			case 0x99: /* ANL Pp,#data */
1021 				write_p1(p1 & ROM(pc++));
1022 				clk+=2;
1023 				break;
1024 			case 0x9A: /* ANL Pp,#data */
1025 				p2 = p2 & ROM(pc++);
1026 				clk+=2;
1027 				break;
1028 			case 0x9B: /* ILL */
1029 				illegal(op);
1030 				clk++;
1031 				break;
1032 			case 0x9C: /* ANLD P4,A */
1033 				write_PB(0,read_PB(0)&acc);
1034 				clk+=2;
1035 				break;
1036 			case 0x9D: /* ANLD P5,A */
1037 				write_PB(1,read_PB(1)&acc);
1038 				clk+=2;
1039 				break;
1040 			case 0x9E: /* ANLD P6,A */
1041 				write_PB(2,read_PB(2)&acc);
1042 				clk+=2;
1043 				break;
1044 			case 0x9F: /* ANLD P7,A */
1045 				write_PB(3,read_PB(3)&acc);
1046 				clk+=2;
1047 				break;
1048 			case 0xA0: /* MOV @Ri,A */
1049 				intRAM[intRAM[reg_pnt] & 0x3F]=acc;
1050 				clk++;
1051 				break;
1052 			case 0xA1: /* MOV @Ri,A */
1053 				intRAM[intRAM[reg_pnt+1] & 0x3F]=acc;
1054 				clk++;
1055 				break;
1056 			case 0xA2: /* ILL */
1057 				clk++;
1058 				illegal(op);
1059 				break;
1060 			case 0xA3: /* MOVP A,@A */
1061 				acc=ROM((pc & 0xF00) | acc);
1062 				clk+=2;
1063 				break;
1064 			case 0xA4:  /* JMP */
1065 				pc=ROM(pc) | 0x500 | A11;
1066 				clk+=2;
1067 				break;
1068 			case 0xA5:  /* CLR F1 */
1069 				clk++;
1070 				f1=0;
1071 				break;
1072 			case 0xA6: /* ILL */
1073 				illegal(op);
1074 				clk++;
1075 				break;
1076 			case 0xA7: /* CPL C */
1077 				cy = cy ^ 0x01;
1078 				clk++;
1079 				break;
1080 			case 0xA8: /* MOV Rr,A */
1081 				intRAM[reg_pnt] = acc;
1082 				clk++;
1083 				break;
1084 			case 0xA9: /* MOV Rr,A */
1085 				intRAM[reg_pnt+1] = acc;
1086 				clk++;
1087 				break;
1088 			case 0xAA: /* MOV Rr,A */
1089 				intRAM[reg_pnt+2] = acc;
1090 				clk++;
1091 				break;
1092 			case 0xAB: /* MOV Rr,A */
1093 				intRAM[reg_pnt+3] = acc;
1094 				clk++;
1095 				break;
1096 			case 0xAC: /* MOV Rr,A */
1097 				intRAM[reg_pnt+4] = acc;
1098 				clk++;
1099 				break;
1100 			case 0xAD: /* MOV Rr,A */
1101 				intRAM[reg_pnt+5] = acc;
1102 				clk++;
1103 				break;
1104 			case 0xAE: /* MOV Rr,A */
1105 				intRAM[reg_pnt+6] = acc;
1106 				clk++;
1107 				break;
1108 			case 0xAF: /* MOV Rr,A */
1109 				intRAM[reg_pnt+7] = acc;
1110 				clk++;
1111 				break;
1112 			case 0xB0: /* MOV @Ri,#data */
1113 				intRAM[intRAM[reg_pnt] & 0x3F]=ROM(pc++);
1114 				clk+=2;
1115 				break;
1116 			case 0xB1: /* MOV @Ri,#data */
1117 				intRAM[intRAM[reg_pnt+1] & 0x3F]=ROM(pc++);
1118 				clk+=2;
1119 				break;
1120 			case 0xB2: /* JBb address */
1121 				clk+=2;
1122 				dat=ROM(pc);
1123 				if (acc & 0x20)
1124 					pc=(pc & 0xF00) | dat;
1125 				else
1126 					pc++;
1127 				break;
1128 			case 0xB3: /* JMPP @A */
1129 				adr = (pc & 0xF00) | acc;
1130 				pc=(pc & 0xF00) | ROM(adr);
1131 				clk+=2;
1132 				break;
1133 			case 0xB4: /* CALL */
1134 				make_psw();
1135 				adr = ROM(pc) | 0x500 | A11;
1136 				pc++;
1137 				clk+=2;
1138 				push(pc & 0xFF);
1139 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
1140 				pc = adr;
1141 				break;
1142 			case 0xB5: /* CPL F1 */
1143 				f1 = f1 ^ 0x01;
1144 				clk++;
1145 				break;
1146 			case 0xB6: /* JF0 address */
1147 				clk+=2;
1148 				dat=ROM(pc);
1149 				if (f0)
1150 					pc=(pc & 0xF00) | dat;
1151 				else
1152 					pc++;
1153 				break;
1154 			case 0xB7: /* ILL */
1155 				clk++;
1156 				illegal(op);
1157 				break;
1158 			case 0xB8: /* MOV Rr,#data */
1159 				intRAM[reg_pnt]=ROM(pc++);
1160 				clk+=2;
1161 				break;
1162 			case 0xB9: /* MOV Rr,#data */
1163 				intRAM[reg_pnt+1]=ROM(pc++);
1164 				clk+=2;
1165 				break;
1166 			case 0xBA: /* MOV Rr,#data */
1167 				intRAM[reg_pnt+2]=ROM(pc++);
1168 				clk+=2;
1169 				break;
1170 			case 0xBB: /* MOV Rr,#data */
1171 				intRAM[reg_pnt+3]=ROM(pc++);
1172 				clk+=2;
1173 				break;
1174 			case 0xBC: /* MOV Rr,#data */
1175 				intRAM[reg_pnt+4]=ROM(pc++);
1176 				clk+=2;
1177 				break;
1178 			case 0xBD: /* MOV Rr,#data */
1179 				intRAM[reg_pnt+5]=ROM(pc++);
1180 				clk+=2;
1181 				break;
1182 			case 0xBE: /* MOV Rr,#data */
1183 				intRAM[reg_pnt+6]=ROM(pc++);
1184 				clk+=2;
1185 				break;
1186 			case 0xBF: /* MOV Rr,#data */
1187 				intRAM[reg_pnt+7]=ROM(pc++);
1188 				clk+=2;
1189 				break;
1190 			case 0xC0: /* ILL */
1191 				illegal(op);
1192 				clk++;
1193 				break;
1194 			case 0xC1: /* ILL */
1195 				illegal(op);
1196 				clk++;
1197 				break;
1198 			case 0xC2: /* ILL */
1199 				illegal(op);
1200 				clk++;
1201 				break;
1202 			case 0xC3: /* ILL */
1203 				illegal(op);
1204 				clk++;
1205 				break;
1206 			case 0xC4:  /* JMP */
1207 				pc=ROM(pc) | 0x600 | A11;
1208 				clk+=2;
1209 				break;
1210 			case 0xC5: /* SEL RB0 */
1211 				bs=reg_pnt=0;
1212 				clk++;
1213 				break;
1214 			case 0xC6: /* JZ address */
1215 				clk+=2;
1216 				dat=ROM(pc);
1217 				if (acc == 0)
1218 					pc=(pc & 0xF00) | dat;
1219 				else
1220 					pc++;
1221 				break;
1222 			case 0xC7: /* MOV A,PSW */
1223 			   clk++;
1224 			   make_psw();
1225 			   acc=psw;
1226 			   break;
1227 			case 0xC8: /* DEC Rr */
1228 				intRAM[reg_pnt]--;
1229 				clk++;
1230 				break;
1231 			case 0xC9: /* DEC Rr */
1232 				intRAM[reg_pnt+1]--;
1233 				clk++;
1234 				break;
1235 			case 0xCA: /* DEC Rr */
1236 				intRAM[reg_pnt+2]--;
1237 				clk++;
1238 				break;
1239 			case 0xCB: /* DEC Rr */
1240 				intRAM[reg_pnt+3]--;
1241 				clk++;
1242 				break;
1243 			case 0xCC: /* DEC Rr */
1244 				intRAM[reg_pnt+4]--;
1245 				clk++;
1246 				break;
1247 			case 0xCD: /* DEC Rr */
1248 				intRAM[reg_pnt+5]--;
1249 				clk++;
1250 				break;
1251 			case 0xCE: /* DEC Rr */
1252 				intRAM[reg_pnt+6]--;
1253 				clk++;
1254 				break;
1255 			case 0xCF: /* DEC Rr */
1256 				intRAM[reg_pnt+7]--;
1257 				clk++;
1258 				break;
1259 			case 0xD0:	/* XRL A,@Ri */
1260 				acc = acc ^ intRAM[intRAM[reg_pnt] & 0x3F];
1261 				clk++;
1262 				break;
1263 			case 0xD1:	/* XRL A,@Ri */
1264 				acc = acc ^ intRAM[intRAM[reg_pnt+1] & 0x3F];
1265 				clk++;
1266 				break;
1267 			case 0xD2: /* JBb address */
1268 				clk+=2;
1269 				dat = ROM(pc);
1270 				if (acc & 0x40)
1271 					pc=(pc & 0xF00) | dat;
1272 				else
1273 					pc++;
1274 				break;
1275 			case 0xD3: /* XRL A,#data */
1276 				clk+=2;
1277 				acc = acc ^ ROM(pc++);
1278 				break;
1279 			case 0xD4: /* CALL */
1280 				make_psw();
1281 				adr = ROM(pc) | 0x600 | A11;
1282 				pc++;
1283 				clk+=2;
1284 				push(pc & 0xFF);
1285 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
1286 				pc = adr;
1287 				break;
1288 			case 0xD5: /* SEL RB1 */
1289 				bs=0x10;
1290 				reg_pnt=24;
1291 				clk++;
1292 				break;
1293 			case 0xD6: /* ILL */
1294 				illegal(op);
1295 				clk++;
1296 				break;
1297 			case 0xD7: /* MOV PSW,A */
1298 				psw=acc;
1299 				clk++;
1300 				cy = (psw & 0x80) >> 7;
1301 				ac = psw & 0x40;
1302 				f0 = psw & 0x20;
1303 				bs = psw & 0x10;
1304 				if (bs)
1305 					reg_pnt = 24;
1306 				else
1307 					reg_pnt = 0;
1308 				sp = (psw & 0x07) << 1;
1309 				sp+=8;
1310 				break;
1311 			case 0xD8: /* XRL A,Rr */
1312 				acc = acc ^ intRAM[reg_pnt];
1313 				clk++;
1314 				break;
1315 			case 0xD9: /* XRL A,Rr */
1316 				acc = acc ^ intRAM[reg_pnt+1];
1317 				clk++;
1318 				break;
1319 			case 0xDA: /* XRL A,Rr */
1320 				acc = acc ^ intRAM[reg_pnt+2];
1321 				clk++;
1322 				break;
1323 			case 0xDB: /* XRL A,Rr */
1324 				acc = acc ^ intRAM[reg_pnt+3];
1325 				clk++;
1326 				break;
1327 			case 0xDC: /* XRL A,Rr */
1328 				acc = acc ^ intRAM[reg_pnt+4];
1329 				clk++;
1330 				break;
1331 			case 0xDD: /* XRL A,Rr */
1332 				acc = acc ^ intRAM[reg_pnt+5];
1333 				clk++;
1334 				break;
1335 			case 0xDE: /* XRL A,Rr */
1336 				acc = acc ^ intRAM[reg_pnt+6];
1337 				clk++;
1338 				break;
1339 			case 0xDF: /* XRL A,Rr */
1340 				acc = acc ^ intRAM[reg_pnt+7];
1341 				clk++;
1342 				break;
1343 			case 0xE0: /* ILL */
1344 				clk++;
1345 				illegal(op);
1346 				break;
1347 			case 0xE1: /* ILL */
1348 				clk++;
1349 				illegal(op);
1350 				break;
1351 			case 0xE2: /* ILL */
1352 				clk++;
1353 				illegal(op);
1354 				break;
1355 			case 0xE3: /* MOVP3 A,@A */
1356 
1357 				adr = 0x300 | acc;
1358 				acc=ROM(adr);
1359 				clk+=2;
1360 				break;
1361 			case 0xE4:  /* JMP */
1362 				pc=ROM(pc) | 0x700 | A11;
1363 				clk+=2;
1364 				break;
1365 			case 0xE5: /* SEL MB0 */
1366 				A11=0;
1367 				A11ff = 0;
1368 				clk++;
1369 				break;
1370 			case 0xE6: /* JNC address */
1371 				clk+=2;
1372 				dat=ROM(pc);
1373 				if (!cy)
1374 					pc=(pc & 0xF00) | dat;
1375 				else
1376 					pc++;
1377 				break;
1378 			case 0xE7: /* RL A */
1379 				clk++;
1380 				dat=acc & 0x80;
1381 				acc = acc << 1;
1382 				if (dat)
1383 					acc = acc | 0x01;
1384 				else
1385 					acc = acc & 0xFE;
1386 				break;
1387 			case 0xE8: /* DJNZ Rr,address */
1388 				clk+=2;
1389 				intRAM[reg_pnt]--;
1390 				dat=ROM(pc);
1391 				if (intRAM[reg_pnt] != 0) {
1392 					pc = pc & 0xF00;
1393 					pc = pc | dat;
1394 				} else pc++;
1395 				break;
1396 			case 0xE9: /* DJNZ Rr,address */
1397 				clk+=2;
1398 				intRAM[reg_pnt+1]--;
1399 				dat=ROM(pc);
1400 				if (intRAM[reg_pnt+1] != 0) {
1401 					pc = pc & 0xF00;
1402 					pc = pc | dat;
1403 				} else pc++;
1404 				break;
1405 			case 0xEA: /* DJNZ Rr,address */
1406 				clk+=2;
1407 				intRAM[reg_pnt+2]--;
1408 				dat=ROM(pc);
1409 				if (intRAM[reg_pnt+2] != 0) {
1410 					pc = pc & 0xF00;
1411 					pc = pc | dat;
1412 				} else pc++;
1413 				break;
1414 			case 0xEB: /* DJNZ Rr,address */
1415 				clk+=2;
1416 				intRAM[reg_pnt+3]--;
1417 				dat=ROM(pc);
1418 				if (intRAM[reg_pnt+3] != 0) {
1419 					pc = pc & 0xF00;
1420 					pc = pc | dat;
1421 				} else pc++;
1422 				break;
1423 			case 0xEC: /* DJNZ Rr,address */
1424 				clk+=2;
1425 				intRAM[reg_pnt+4]--;
1426 				dat=ROM(pc);
1427 				if (intRAM[reg_pnt+4] != 0) {
1428 					pc = pc & 0xF00;
1429 					pc = pc | dat;
1430 				} else pc++;
1431 				break;
1432 			case 0xED: /* DJNZ Rr,address */
1433 				clk+=2;
1434 				intRAM[reg_pnt+5]--;
1435 				dat=ROM(pc);
1436 				if (intRAM[reg_pnt+5] != 0) {
1437 					pc = pc & 0xF00;
1438 					pc = pc | dat;
1439 				} else pc++;
1440 				break;
1441 			case 0xEE: /* DJNZ Rr,address */
1442 				clk+=2;
1443 				intRAM[reg_pnt+6]--;
1444 				dat=ROM(pc);
1445 				if (intRAM[reg_pnt+6] != 0) {
1446 					pc = pc & 0xF00;
1447 					pc = pc | dat;
1448 				} else pc++;
1449 				break;
1450 			case 0xEF: /* DJNZ Rr,address */
1451 				clk+=2;
1452 				intRAM[reg_pnt+7]--;
1453 				dat=ROM(pc);
1454 				if (intRAM[reg_pnt+7] != 0) {
1455 					pc = pc & 0xF00;
1456 					pc = pc | dat;
1457 				} else pc++;
1458 				break;
1459 			case 0xF0: /* MOV A,@Ri */
1460 				clk++;
1461 				acc=intRAM[intRAM[reg_pnt] & 0x3F];
1462 				break;
1463 			case 0xF1: /* MOV A,@Ri */
1464 				clk++;
1465 				acc=intRAM[intRAM[reg_pnt + 1] & 0x3F];
1466 				break;
1467 			case 0xF2: /* JBb address */
1468 				clk+=2;
1469 				dat=ROM(pc);
1470 				if (acc & 0x80)
1471 					pc=(pc & 0xF00) | dat;
1472 				else
1473 					pc++;
1474 				break;
1475 			case 0xF3: /* ILL */
1476 				illegal(op);
1477 				clk++;
1478 				break;
1479 			case 0xF4: /* CALL */
1480 				clk+=2;
1481 				make_psw();
1482 				adr = ROM(pc) | 0x700 | A11;
1483 				pc++;
1484 				push(pc & 0xFF);
1485 				push(((pc & 0xF00) >> 8) | (psw & 0xF0));
1486 				pc = adr;
1487 				break;
1488 			case 0xF5: /* SEL MB1 */
1489 				if (irq_ex) {
1490 					A11ff = 0x800;
1491 				}
1492 				else
1493 				{
1494 					A11=0x800;
1495 					A11ff = 0x800;
1496 				}
1497 				clk++;
1498 				break;
1499 			case 0xF6: /* JC address */
1500 				clk+=2;
1501 				dat=ROM(pc);
1502 				if (cy)
1503 					pc=(pc & 0xF00) | dat;
1504 				else
1505 					pc++;
1506 				break;
1507 			case 0xF7: /* RLC A */
1508 				dat=cy;
1509 				cy=(acc & 0x80) >> 7;
1510 				acc = acc << 1;
1511 				if (dat)
1512 					acc = acc | 0x01;
1513 				else
1514 					acc = acc & 0xFE;
1515 				clk++;
1516 				break;
1517 			case 0xF8: /* MOV A,Rr */
1518 				clk++;
1519 				acc = intRAM[reg_pnt];
1520 				break;
1521 			case 0xF9: /* MOV A,Rr */
1522 				clk++;
1523 				acc = intRAM[reg_pnt + 1];
1524 				break;
1525 			case 0xFA: /* MOV A,Rr */
1526 				clk++;
1527 				acc = intRAM[reg_pnt + 2];
1528 				break;
1529 			case 0xFB: /* MOV A,Rr */
1530 				clk++;
1531 				acc = intRAM[reg_pnt + 3];
1532 				break;
1533 			case 0xFC: /* MOV A,Rr */
1534 				clk++;
1535 				acc = intRAM[reg_pnt + 4];
1536 				break;
1537 			case 0xFD: /* MOV A,Rr */
1538 				clk++;
1539 				acc = intRAM[reg_pnt + 5];
1540 				break;
1541 			case 0xFE: /* MOV A,Rr */
1542 				clk++;
1543 				acc = intRAM[reg_pnt + 6];
1544 				break;
1545 			case 0xFF: /* MOV A,Rr */
1546 				clk++;
1547 				acc = intRAM[reg_pnt + 7];
1548 				break;
1549 		}
1550 
1551 
1552 		master_clk+=clk;
1553 		h_clk+=clk;
1554 		clk_counter+=clk;
1555 
1556 		/* flag for JNI */
1557 		if (int_clk > clk)
1558 			int_clk -= clk;
1559 		else
1560 			int_clk = 0;
1561 
1562 		/* pending IRQs */
1563 		if (xirq_pend) ext_IRQ();
1564 		if (tirq_pend) tim_IRQ();
1565 
1566 		if (h_clk > LINECNT-1) {
1567 			h_clk-=LINECNT;
1568 			if (enahirq && (VDCwrite[0xA0] & 0x01)) ext_IRQ();
1569 			if (count_on && mstate == 0) {
1570 				itimer++;
1571 				if (itimer == 0) {
1572 					t_flag=1;
1573 					tim_IRQ();
1574 					draw_region();
1575 				}
1576 			}
1577 		}
1578 
1579 		if (timer_on) {
1580 			master_count+=clk;
1581 			if (master_count > 31) {
1582 				master_count-=31;
1583 				itimer++;
1584 				if (itimer == 0) {
1585 					t_flag=1;
1586 					tim_IRQ();
1587 				}
1588 			}
1589 		}
1590 
1591 		if ((mstate==0) && (master_clk > VBLCLK)) handle_vbl();
1592 
1593 		if ((mstate==1) && (master_clk > evblclk)) {
1594 
1595 			handle_evbl();
1596 			if (app_data.crc == 0xA7344D1F) handle_evbll(); /* Atlantis */
1597             break;
1598 		}
1599 
1600 		if (app_data.debug) break;
1601 	}
1602 
1603 }
1604 
1605