--- np2/i286c/i286c_rp.c 2003/10/16 17:57:45 1.1.1.1 +++ np2/i286c/i286c_rp.c 2003/10/17 12:49:52 1.4 @@ -13,7 +13,7 @@ I286EXT i286c_rep_insb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; do { BYTE dat = iocore_inp8(I286_DX); i286_memorywrite(I286_DI + ES_BASE, dat); @@ -27,9 +27,9 @@ I286EXT i286c_rep_insw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { - WORD dat = iocore_inp16(I286_DX); + UINT16 dat = iocore_inp16(I286_DX); i286_memorywrite_w(I286_DI + ES_BASE, dat); I286_DI += stp; I286_CLOCK(4) @@ -43,7 +43,7 @@ I286EXT i286c_rep_outsb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; do { BYTE dat = i286_memoryread(I286_SI + DS_FIX); I286_SI += stp; @@ -57,9 +57,9 @@ I286EXT i286c_rep_outsw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { - WORD dat = i286_memoryread_w(I286_SI + DS_FIX); + UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); I286_SI += stp; iocore_out16(I286_DX, dat); I286_CLOCK(4) @@ -69,11 +69,58 @@ I286EXT i286c_rep_outsw(void) { // ---------------------------------------------------------------------- movs +#if 1 I286EXT i286c_rep_movsb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; + while(1) { + BYTE dat = i286_memoryread(I286_SI + DS_FIX); + i286_memorywrite(I286_DI + ES_BASE, dat); + I286_SI += stp; + I286_DI += stp; + I286_CLOCK(4) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} + +I286EXT i286c_rep_movsw(void) { + + I286_CLOCK(5) + if (I286_CX) { + SINT16 stp = STRING_DIRx2; + while(1) { + UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); + i286_memorywrite_w(I286_DI + ES_BASE, dat); + I286_SI += stp; + I286_DI += stp; + I286_CLOCK(4) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} +#else +I286EXT i286c_rep_movsb(void) { + + I286_CLOCK(5) + if (I286_CX) { + SINT16 stp = STRING_DIR; do { BYTE dat = i286_memoryread(I286_SI + DS_FIX); i286_memorywrite(I286_DI + ES_BASE, dat); @@ -88,9 +135,9 @@ I286EXT i286c_rep_movsw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { - WORD dat = i286_memoryread_w(I286_SI + DS_FIX); + UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); i286_memorywrite_w(I286_DI + ES_BASE, dat); I286_SI += stp; I286_DI += stp; @@ -98,14 +145,58 @@ I286EXT i286c_rep_movsw(void) { } while(--I286_CX); } } +#endif // ---------------------------------------------------------------------- lods +#if 1 I286EXT i286c_rep_lodsb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; + while(1) { + I286_AL = i286_memoryread(I286_SI + DS_FIX); + I286_SI += stp; + I286_CLOCK(4) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} + +I286EXT i286c_rep_lodsw(void) { + + I286_CLOCK(5) + if (I286_CX) { + SINT16 stp = STRING_DIRx2; + while(1) { + I286_AX = i286_memoryread_w(I286_SI + DS_FIX); + I286_SI += stp; + I286_CLOCK(4) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} +#else +I286EXT i286c_rep_lodsb(void) { + + I286_CLOCK(5) + if (I286_CX) { + SINT16 stp = STRING_DIR; do { I286_AL = i286_memoryread(I286_SI + DS_FIX); I286_SI += stp; @@ -118,7 +209,7 @@ I286EXT i286c_rep_lodsw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { I286_AX = i286_memoryread_w(I286_SI + DS_FIX); I286_SI += stp; @@ -126,14 +217,58 @@ I286EXT i286c_rep_lodsw(void) { } while(--I286_CX); } } +#endif // ---------------------------------------------------------------------- stos +#if 1 +I286EXT i286c_rep_stosb(void) { + + I286_CLOCK(4) + if (I286_CX) { + SINT16 stp = STRING_DIR; + while(1) { + i286_memorywrite(I286_DI + ES_BASE, I286_AL); + I286_DI += stp; + I286_CLOCK(3) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} + +I286EXT i286c_rep_stosw(void) { + + I286_CLOCK(4) + if (I286_CX) { + SINT16 stp = STRING_DIRx2; + while(1) { + i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); + I286_DI += stp; + I286_CLOCK(3) + I286_CX--; + if (!I286_CX) { + break; + } + if (nevent.remainclock <= 0) { + I286_IP -= i286reg.prefix + 1; + break; + } + } + } +} +#else I286EXT i286c_rep_stosb(void) { I286_CLOCK(4) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; do { i286_memorywrite(I286_DI + ES_BASE, I286_AL); I286_DI += stp; @@ -146,7 +281,7 @@ I286EXT i286c_rep_stosw(void) { I286_CLOCK(4) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); I286_DI += stp; @@ -154,6 +289,7 @@ I286EXT i286c_rep_stosw(void) { } while(--I286_CX); } } +#endif // ---------------------------------------------------------------------- cmps @@ -161,11 +297,11 @@ I286EXT i286c_repe_cmpsb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; do { - DWORD res; - DWORD dst = i286_memoryread(I286_SI + DS_FIX); - DWORD src = i286_memoryread(I286_DI + ES_BASE); + UINT res; + UINT dst = i286_memoryread(I286_SI + DS_FIX); + UINT src = i286_memoryread(I286_DI + ES_BASE); I286_SI += stp; I286_DI += stp; I286_CLOCK(9) @@ -179,11 +315,11 @@ I286EXT i286c_repne_cmpsb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; + SINT16 stp = STRING_DIR; do { - DWORD res; - DWORD dst = i286_memoryread(I286_SI + DS_FIX); - DWORD src = i286_memoryread(I286_DI + ES_BASE); + UINT res; + UINT dst = i286_memoryread(I286_SI + DS_FIX); + UINT src = i286_memoryread(I286_DI + ES_BASE); I286_SI += stp; I286_DI += stp; I286_CLOCK(9) @@ -197,11 +333,11 @@ I286EXT i286c_repe_cmpsw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { - DWORD res; - DWORD dst = i286_memoryread_w(I286_SI + DS_FIX); - DWORD src = i286_memoryread_w(I286_DI + ES_BASE); + UINT32 res; + UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); + UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_SI += stp; I286_DI += stp; I286_CLOCK(9) @@ -215,11 +351,11 @@ I286EXT i286c_repne_cmpsw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; + SINT16 stp = STRING_DIRx2; do { - DWORD res; - DWORD dst = i286_memoryread_w(I286_SI + DS_FIX); - DWORD src = i286_memoryread_w(I286_DI + ES_BASE); + UINT32 res; + UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); + UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_SI += stp; I286_DI += stp; I286_CLOCK(9) @@ -235,11 +371,11 @@ I286EXT i286c_repe_scasb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; - DWORD dst = I286_AL; + SINT16 stp = STRING_DIR; + UINT dst = I286_AL; do { - DWORD res; - DWORD src = i286_memoryread(I286_DI + ES_BASE); + UINT res; + UINT src = i286_memoryread(I286_DI + ES_BASE); I286_DI += stp; I286_CLOCK(8) BYTE_SUB(res, dst, src) @@ -252,11 +388,11 @@ I286EXT i286c_repne_scasb(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIR; - DWORD dst = I286_AL; + SINT16 stp = STRING_DIR; + UINT dst = I286_AL; do { - DWORD res; - DWORD src = i286_memoryread(I286_DI + ES_BASE); + UINT res; + UINT src = i286_memoryread(I286_DI + ES_BASE); I286_DI += stp; I286_CLOCK(8) BYTE_SUB(res, dst, src) @@ -269,11 +405,11 @@ I286EXT i286c_repe_scasw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; - DWORD dst = I286_AX; + SINT16 stp = STRING_DIRx2; + UINT32 dst = I286_AX; do { - DWORD res; - DWORD src = i286_memoryread_w(I286_DI + ES_BASE); + UINT32 res; + UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_DI += stp; I286_CLOCK(8) WORD_SUB(res, dst, src) @@ -286,11 +422,11 @@ I286EXT i286c_repne_scasw(void) { I286_CLOCK(5) if (I286_CX) { - WORD stp = STRING_DIRx2; - DWORD dst = I286_AX; + SINT16 stp = STRING_DIRx2; + UINT32 dst = I286_AX; do { - DWORD res; - DWORD src = i286_memoryread_w(I286_DI + ES_BASE); + UINT32 res; + UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); I286_DI += stp; I286_CLOCK(8) WORD_SUB(res, dst, src)