--- np2/i286c/i286c_rp.c 2003/11/29 00:36:00 1.6 +++ np2/i286c/i286c_rp.c 2005/02/07 14:46:11 1.12 @@ -1,7 +1,6 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "i286c.h" -#include "memory.h" #include "pccore.h" #include "iocore.h" #include "i286c.mcr" @@ -47,7 +46,7 @@ I286EXT i286c_rep_outsb(void) { do { REG8 dat = i286_memoryread(I286_SI + DS_FIX); I286_SI += stp; - iocore_out8(I286_DX, (BYTE)dat); + iocore_out8(I286_DX, (UINT8)dat); I286_WORKCLOCK(4); } while(--I286_CX); } @@ -70,6 +69,75 @@ I286EXT i286c_rep_outsw(void) { // ---------------------------------------------------------------------- movs +#if 1 +I286EXT i286c_rep_movsb(void) { + + UINT16 r_cx; + int stp; + UINT16 r_si; + UINT16 r_di; + + I286_WORKCLOCK(5); + r_cx = I286_CX; + if (r_cx) { + stp = STRING_DIR; + r_si = I286_SI; + r_di = I286_DI; + while(1) { + REG8 dat = i286_memoryread(DS_FIX + r_si); + i286_memorywrite(ES_BASE + r_di, dat); + r_si += stp; + r_di += stp; + I286_WORKCLOCK(4); + r_cx--; + if (!r_cx) { + break; + } + if (I286_REMCLOCK <= 0) { + I286_IP -= I286_PREFIX + 1; + break; + } + } + I286_CX = r_cx; + I286_SI = r_si; + I286_DI = r_di; + } +} + +I286EXT i286c_rep_movsw(void) { + + UINT16 r_cx; + int stp; + UINT16 r_si; + UINT16 r_di; + + I286_WORKCLOCK(5); + r_cx = I286_CX; + if (r_cx) { + stp = STRING_DIRx2; + r_si = I286_SI; + r_di = I286_DI; + while(1) { + REG16 dat = i286_memoryread_w(DS_FIX + r_si); + i286_memorywrite_w(ES_BASE + r_di, dat); + r_si += stp; + r_di += stp; + I286_WORKCLOCK(4); + r_cx--; + if (!r_cx) { + break; + } + if (I286_REMCLOCK <= 0) { + I286_IP -= I286_PREFIX + 1; + break; + } + } + I286_CX = r_cx; + I286_SI = r_si; + I286_DI = r_di; + } +} +#else I286EXT i286c_rep_movsb(void) { I286_WORKCLOCK(5); @@ -86,7 +154,7 @@ I286EXT i286c_rep_movsb(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } @@ -109,12 +177,13 @@ I286EXT i286c_rep_movsw(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } } } +#endif // ---------------------------------------------------------------------- lods @@ -133,7 +202,7 @@ I286EXT i286c_rep_lodsb(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } @@ -154,7 +223,7 @@ I286EXT i286c_rep_lodsw(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } @@ -178,7 +247,7 @@ I286EXT i286c_rep_stosb(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } @@ -199,7 +268,7 @@ I286EXT i286c_rep_stosw(void) { break; } if (I286_REMCLOCK <= 0) { - I286_IP -= i286reg.prefix + 1; + I286_IP -= I286_PREFIX + 1; break; } } @@ -221,7 +290,7 @@ I286EXT i286c_repe_cmpsb(void) { I286_SI += stp; I286_DI += stp; I286_WORKCLOCK(9); - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_CX--; } while((I286_CX) && (I286_FLAGL & Z_FLAG)); } @@ -239,7 +308,7 @@ I286EXT i286c_repne_cmpsb(void) { I286_SI += stp; I286_DI += stp; I286_WORKCLOCK(9); - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_CX--; } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); } @@ -257,7 +326,7 @@ I286EXT i286c_repe_cmpsw(void) { I286_SI += stp; I286_DI += stp; I286_WORKCLOCK(9); - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_CX--; } while((I286_CX) && (I286_FLAGL & Z_FLAG)); } @@ -275,7 +344,7 @@ I286EXT i286c_repne_cmpsw(void) { I286_SI += stp; I286_DI += stp; I286_WORKCLOCK(9); - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_CX--; } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); } @@ -295,7 +364,7 @@ I286EXT i286c_repe_scasb(void) { UINT src = i286_memoryread(I286_DI + ES_BASE); I286_DI += stp; I286_WORKCLOCK(8); - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_CX--; } while((I286_CX) && (I286_FLAGL & Z_FLAG)); } @@ -312,7 +381,7 @@ I286EXT i286c_repne_scasb(void) { UINT src = i286_memoryread(I286_DI + ES_BASE); I286_DI += stp; I286_WORKCLOCK(8); - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_CX--; } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); } @@ -329,7 +398,7 @@ I286EXT i286c_repe_scasw(void) { UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_DI += stp; I286_WORKCLOCK(8); - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_CX--; } while((I286_CX) && (I286_FLAGL & Z_FLAG)); } @@ -346,7 +415,7 @@ I286EXT i286c_repne_scasw(void) { UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_DI += stp; I286_WORKCLOCK(8); - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_CX--; } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); }