/*****************************************************************************/ /* */ /* */ /* CP/M emulator version 0.1 */ /* */ /* written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de) */ /* June-1994 */ /* */ /* This file is distributed under the GNU COPYRIGHT */ /* see COPYRIGHT.GNU for Copyright details */ /* */ /* */ /*****************************************************************************/ #include #include static const char *str[] = { "op", "op", "op", "op", "op", "op", "op", "op", "ix", "iy" }; static int off[] = { 0,1,2,3,4,5,6,7,6,6 }; static const char *fetch[] = { "", "", "", "", "", "", "", "", "GETIXOFF\n ", "GETIYOFF\n " }; #define CODE(i) printf(" opcode (0x%02x)\nop%02x:\n ", i, i) #define CODEIX(i) printf(" opcode (0x%02x)\nix%02x:\n ", i, i) #define CODEIY(i) printf(" opcode (0x%02x)\niy%02x:\n ", i, i) #define ZCODE(j,i) printf(" opcode (0x%02x)\n%s%02x:\n ", j+i, str[i], j+off[i]) static const char *fmt[] = { "%sandb $0xd5,%%ah\t/* ADD A,reg */\n addb %s,%%al\n jmp setaddadc\n", "%sandb $0xd5,%%ah\t/* ADC A,reg */\n sahf\n adcb %s,%%al\n jmp setaddadc\n", "%sorb $2,%%ah\t/* SUB reg */\n subb %s,%%al\n jmp setaddadc\n", "%sorb $2,%%ah\t/* SBC A,reg */\n sahf\n sbbb %s,%%al\n jmp setaddadc\n", "%sandb %s,%%al\t/* AND reg */\n lahf\n orb $0x10,%%ah\n andb $0xd4,%%ah\n dispatch\n", "%sxorb %s,%%al\t/* XOR reg */\n lahf\n andb $0xc4,%%ah\n dispatch\n", "%sorb %s,%%al\t/* OR reg */\n lahf\n andb $0xc4,%%ah\n dispatch\n", "%sorb $2,%%ah\t/* CP reg */\n cmpb %s,%%al\n jmp setaddadc\n" }; int main(void) { static const char *regs[] = { "%ch", "%cl", "%dh", "%dl", "%bh", "%bl", "(%ebx,%ebp)", "%al", "(%edi,%ebp)", "(%edi,%ebp)" }; static const char *cbregs[] = { "%ch", "%cl", "%dh", "%dl", "%bh", "%bl", "(%edi,%ebp)", "%al" }; static const char *z80cc[] = { "NZ", "Z", "NC", "C", "PO", "PE", "P", "M" }; static const char *i386cc[] = { "nz", "z", "nc", "c", "po", "pe", "ns", "s" }; int i; printf("/* loads.s: DO NOT EDIT! Automatically generated by makeloads */\n"); for (i = 0; i < 64; ++i) { if ((i & 7) != (i >> 3)) { CODE(0x40+i); printf("movb %s,%s\n dispatch\n", regs[i&7], regs[i>>3]); if ((i & 7) == 6) { /* do also ix, iy */ CODEIX(0x40+i); printf("GETIXOFF\n movb (%%edi,%%ebp),%s\n dispatch\n", regs[i>>3]); CODEIY(0x40+i); printf("GETIYOFF\n movb (%%edi,%%ebp),%s\n dispatch\n", regs[i>>3]); } else if ((i >> 3) == 6) { /* do also ix, iy */ CODEIX(0x40+i); printf("GETIXOFF\n movb %s,(%%edi,%%ebp)\n dispatch\n", regs[i&7]); CODEIY(0x40+i); printf("GETIYOFF\n movb %s,(%%edi,%%ebp)\n dispatch\n", regs[i&7]); } } } { int j; for (j = 0x80; j < 0xc0; j += 8) { for (i = 0; i < 10; ++i) { ZCODE(j,i); printf(fmt[(j-0x80)>>3], fetch[i], regs[i]); } } } /* RST (nn) */ for (i = 1; i < 8; ++i) { CODE(0xc7+8*i); printf("movl $%d,%%edi\t/* RST %02x */\n jmp docall_di\n", i*8, i*8); } /* JP cc,nnnn */ for (i = 0; i < 8; ++i) { CODE(0xc2+8*i); printf("sahf\t/* JP %s,nnnn */\n j%s opc3\n incl %%esi\n" " incl %%esi\n dispatch\n", z80cc[i], i386cc[i]); } /* RET cc */ for (i = 0; i < 8; ++i) { CODE(0xc0+8*i); printf("sahf\t/* RET %s */\n j%s opc9\n dispatch\n", z80cc[i], i386cc[i]); } /* CALL cc,nnnn */ for (i = 0; i < 8; ++i) { CODE(0xc4+8*i); printf("sahf\t/* CALL %s,nnnn */\n j%s opcd\n incl %%esi\n" " incl %%esi\n dispatch\n", z80cc[i], i386cc[i]); } /* Z80 extended commands with "cb" prefix */ for (i = 0; i < 64; ++i) { static const char *rotcmds[] = { "rolb", "rorb", "rclb", "rcrb", "shlb", "sarb", NULL, "shrb" }; if ((i >> 3) != 6) printf(" .align NALIGN,0x90\ncb%02x: sahf\n" " %s $1,%s\n movzbl %s,%%edi\n jmp set_SZV\n", i, rotcmds[i>>3], cbregs[i&7], cbregs[i&7]); } for (i = 0; i < 64; ++i) /* BIT n,r */ printf(" .align NALIGN,0x90\ncb%02x: testb $%d,%s\n jmp setbit\n", i+0x40, 1 << (i>>3), cbregs[i&7]); for (i = 0; i < 64; ++i) /* RES n,r */ printf(" .align NALIGN,0x90\ncb%02x: andb $%d,%s\n dispatch\n", i+0x80, 255-(1 << (i>>3)), cbregs[i&7]); for (i = 0; i < 64; ++i) /* SET n,r */ printf(" .align NALIGN,0x90\ncb%02x: orb $%d,%s\n dispatch\n", i+0xc0, 1 << (i>>3), cbregs[i&7]); return 0; }