#ifndef _NPX_H_ #define _NPX_H_ void emu_install(); extern int modrm; extern unsigned eax; extern unsigned ebx; extern unsigned ecx; extern unsigned edx; extern unsigned esi; extern unsigned edi; extern unsigned ebp; extern unsigned esp; extern unsigned char *eip; struct reg { char sign; char tag; short exp; unsigned sigl; unsigned sigh; }; #define EXP_BIAS 16383 #define EXP_MAX 32767 #define SIGN_POS 0 #define SIGN_NEG 1 #define TW_V 0 // valid #define TW_Z 1 // zero #define TW_S 2 // special #define TW_E 3 // empty #define EX_SO 0x02C1 // stack overflow #define EX_SU 0x00C1 // stack underflow #define EX_P 0x00A0 // loss of precision #define EX_U 0x0090 // underflow #define EX_O 0x0088 // overflow #define EX_Z 0x0084 // divide by zero #define EX_D 0x0082 // denormalized operand #define EX_I 0x0081 // invalid operation #define SW_B 0x8000 // backward compatibility (=ES) #define SW_C3 0x4000 // condition bit 3 #define SW_TOP 0x3800 // top of stack #define SW_TOPS 0x0800 // scale for TOS #define SW_C2 0x0400 // condition bit 2 #define SW_C1 0x0200 // condition bit 1 #define SW_C0 0x0100 // condition bit 0 #define SW_ES 0x0080 // exception summary #define SW_SF 0x0040 // stack fault #define SW_PE 0x0020 // loss of precision #define SW_UE 0x0010 // underflow #define SW_OE 0x0008 // overflow #define SW_ZE 0x0004 // divide by zero #define SW_DE 0x0002 // denormalized operand #define SW_IE 0x0001 // invalid operation #define CW_RC 0x0C00 // rounding control #define CW_PC 0x0300 // precision control #define CW_PM 0x0020 // precision mask #define CW_UM 0x0010 // underflow mask #define CW_OM 0x0008 // overflow mask #define CW_ZM 0x0004 // divide by zero mask #define CW_DM 0x0002 // denormalized operand mask #define CW_IM 0x0001 // invalid operation mask #define CW_EXM 0x007f // all masks #define RC_RND 0x0000 #define RC_DOWN 0x0400 #define RC_UP 0x0800 #define RC_CHOP 0x0C00 /* ** THE NPX ENVIRONMENT */ extern int status_word; extern int control_word; extern reg regs[8]; extern int top; /* ** UTILITY FUNCTIONS */ extern void *get_modrm(); inline reg& st(int which=0) { return regs[(top+which)&7]; } extern void emu_printall(); extern void exception(int which); // returns 1 if unmasked extern void setcc(int cc); extern int full(); // returns 1 if exception, handles exception extern int empty(int i=0); // returns 1 if exception, handles exception typedef void (*FUNC)(); void emu_bad(); void r_add(reg& a, reg& b, reg& s); // a + b -> s void r_sub(reg& a, reg& b, reg& d); // a - b -> d void r_mul(reg& a, reg& b, reg& p); // a * b -> p void r_div(reg& a, reg& b, reg& q); // a / b -> q void r_mov(reg& s, reg& d); int val_same(reg& a, reg& b); int mag_same(reg& a, reg& b); void emu_00(); void emu_01(); void emu_02(); void emu_03(); void emu_04(); void emu_05(); void emu_06(); void emu_07(); void emu_10(); void emu_11(); void emu_12(); void emu_13(); void emu_14(); void emu_15(); void emu_16(); void emu_17(); void emu_20(); void emu_21(); void emu_22(); void emu_23(); void emu_24(); void emu_25(); void emu_26(); void emu_27(); void emu_30(); void emu_31(); void emu_32(); void emu_33(); void emu_34(); void emu_35(); void emu_36(); void emu_37(); void emu_40(); void emu_41(); void emu_42(); void emu_43(); void emu_44(); void emu_45(); void emu_46(); void emu_47(); void emu_50(); void emu_51(); void emu_52(); void emu_53(); void emu_54(); void emu_55(); void emu_56(); void emu_57(); void emu_60(); void emu_61(); void emu_62(); void emu_63(); void emu_64(); void emu_65(); void emu_66(); void emu_67(); void emu_70(); void emu_71(); void emu_72(); void emu_73(); void emu_74(); void emu_75(); void emu_76(); void emu_77(); #endif