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