8 #define lohi(L, H) (((u16int)L) | (((u16int)H) << 8))
17 sysfatal("invalid instruction %.2x (pc = %.4x)", memread(curpc), curpc);
31 r = lohi(memread(pc), memread(pc+1));
45 memwrite(--sp, n >> 8);
74 if(a == rHL && b == rHL){
79 val = memread(lohi(R[rL], R[rH]));
85 memwrite(lohi(R[rL], R[rH]), val);
101 memwrite(lohi(R[rL], R[rH]), val);
116 a = (op & 0x30) >> 4;
144 a = (op & 0x30) >> 4;
147 val1 = lohi(R[rC], R[rB]);
150 val1 = lohi(R[rE], R[rD]);
153 val1 = lohi(R[rL], R[rH]);
159 val2 = lohi(R[rL], R[rH]);
160 val32 = (u32int)(val1) + (u32int)(val2);
163 if(((val1&0xFFF)+(val2&0xFFF)) > 0xFFF)
177 addr = lohi(R[rC], R[rB]);
180 addr = lohi(R[rE], R[rD]);
183 addr = lohi(R[rL], R[rH]);
186 R[rA] = memread(addr);
188 memwrite(addr, R[rA]);
207 a = (op & 0x38) >> 3;
210 val = lohi(R[rC], R[rB]);
213 val = lohi(R[rE], R[rD]);
216 val = lohi(R[rL], R[rH]);
250 a = (op & 0x38) >> 3;
252 val = memread(lohi(R[rL], R[rH]));
259 memwrite(lohi(R[rL], R[rH]), val+1);
266 if((val & 0xF) == 0xF)
277 a = (op & 0x38) >> 3;
279 val = memread(lohi(R[rL], R[rH]));
286 memwrite(lohi(R[rL], R[rH]), val - 1);
290 Fl = (Fl & FLAGC) | FLAGN;
301 u8int val4, val8, a, b;
306 b = (op & 0x38) >> 3;
311 val8 = memread(lohi(R[rL], R[rH]));
320 val16 = (ushort)(R[rA]) + (ushort)(val8);
321 val4 = (R[rA] & 0xF) + (val8 & 0xF);
322 if(b == 1 && (Fl & FLAGC)){
336 val16 = (ushort)R[rA];
337 val16 -= (ushort)val8;
339 if(b == 3 && (Fl & FLAGC)){
347 if(val4 > (R[rA] & 0xF))
376 a = (op & 0x38) >> 3;
383 memwrite(addr + 1, sp >> 8);
386 step = (short)(schar)fetch8();
395 if((Fl & FLAGZ) == 0)
403 if((Fl & FLAGC) == 0)
417 switch((op & 0x38) >> 3){
423 if((Fl & FLAGZ) == 0)
431 if((Fl & FLAGC) == 0)
447 switch((op & 0x38) >> 3){
453 if((Fl & FLAGZ) == 0)
461 if((Fl & FLAGC) == 0)
485 if(op != 0xC9 && op!= 0xD9){
486 switch((op & 0x38) >> 3){
492 if((Fl & FLAGZ) == 0)
500 if((Fl & FLAGC) == 0)
516 a = (op & 0x38) >> 4;
543 a = (op & 0x38) >> 4;
565 shift(u8int op, int cb)
571 a = (op & 0x38) >> 3;
574 val = memread(lohi(R[rL], R[rH]));
585 val = (val << 1) | (val >> 7);
591 val = (val >> 1) | (val << 7);
619 val = (val >> 1) | (val & 0x80);
622 val = (val << 4) | (val >> 4);
631 if((val & 0xFF) == 0)
634 memwrite(lohi(R[rL], R[rH]), val);
648 a = (op & 0x38) >> 3;
651 val = memread(lohi(R[rL], R[rH])),
657 Fl = (Fl & FLAGC) | FLAGH;
658 if((val & (1<<a)) == 0)
669 a = (op & 0x38) >> 3;
672 val = memread(lohi(R[rL], R[rH]));
683 memwrite(lohi(R[rL], R[rH]), val);
697 if((op & 0xC0) == 0x40)
717 if(mem[IF] & mem[IE])
722 if(IME && (mem[IF] & mem[IE]))
723 for(i = 0; i < 5; i++)
724 if(mem[IF] & mem[IE] & (1<<i)){
735 print("%.4x A %.2x B %.2x C %.2x D %.2x E %.2x HL %.2x%.2x SP %.4x F %.2x ", curpc, R[rA], R[rB], R[rC], R[rD], R[rE], R[rH], R[rL], sp, Fl);
738 if((op & 0xC7) == 0x00)
740 if((op & 0xCF) == 0x01)
742 if((op & 0xCF) == 0x09)
744 if((op & 0xC7) == 0x02)
746 if((op & 0xC7) == 0x03)
748 if((op & 0xC7) == 0x04)
750 if((op & 0xC7) == 0x05)
752 if((op & 0xC7) == 0x06)
754 if((op & 0xE7) == 0x07)
756 if((op & 0xC0) == 0x40)
758 if((op & 0xC0) == 0x80 || (op & 0xC7) == 0xC6)
760 if((op & 0xE7) == 0xC0 || op == 0xC9 || op == 0xD9)
762 if((op & 0xCF) == 0xC1)
764 if((op & 0xE7) == 0xC2 || op == 0xC3)
766 if((op & 0xE7) == 0xC4 || op == 0xCD)
768 if((op & 0xCF) == 0xC5)
770 if((op & 0xC7) == 0xC7)
774 i = (((int)R[rA]) + (((int)Fl) * 16)) * 2;
783 Fl = (Fl & FLAGZ) | FLAGC;
790 memwrite(lohi(fetch8(), 0xFF), R[rA]);
793 memwrite(lohi(R[rC], 0xFF), R[rA]);
796 val = (short)(schar)fetch8();
797 val32 = (uint)sp + (uint)val;
799 if(((sp & 0xFF) + (val & 0xFF)) > 0xFF)
801 if(((sp & 0xF) + (val & 0xF)) > 0xF)
806 pc = lohi(R[rL], R[rH]);
809 memwrite(fetch16(), R[rA]);
812 R[rA] = memread(lohi(fetch8(), 0xFF));
815 R[rA] = memread(fetch16());
818 R[rA] = memread(lohi(R[rC], 0xFF));
826 val = (short)(schar)fetch8();
827 val32 = (uint)sp + (uint)val;
829 if(((sp & 0xFF) + (val & 0xFF)) > 0xFF)
831 if(((sp & 0xF) + (val & 0xF)) > 0xF)
837 sp = lohi(R[rL], R[rH]);