|
|
| version 1.5, 2003/10/19 14:56:15 | version 1.9, 2003/12/08 00:55:31 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "i286c.h" | #include "i286c.h" |
| #include "memory.h" | #include "memory.h" |
| #include "pccore.h" | #include "pccore.h" |
| Line 13 I286EXT i286c_rep_insb(void) { | Line 13 I286EXT i286c_rep_insb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| do { | do { |
| BYTE dat = iocore_inp8(I286_DX); | REG8 dat = iocore_inp8(I286_DX); |
| i286_memorywrite(I286_DI + ES_BASE, dat); | i286_memorywrite(I286_DI + ES_BASE, dat); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| Line 27 I286EXT i286c_rep_insw(void) { | Line 27 I286EXT i286c_rep_insw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| do { | do { |
| UINT16 dat = iocore_inp16(I286_DX); | REG16 dat = iocore_inp16(I286_DX); |
| i286_memorywrite_w(I286_DI + ES_BASE, dat); | i286_memorywrite_w(I286_DI + ES_BASE, dat); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| Line 43 I286EXT i286c_rep_outsb(void) { | Line 43 I286EXT i286c_rep_outsb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| do { | do { |
| BYTE dat = i286_memoryread(I286_SI + DS_FIX); | REG8 dat = i286_memoryread(I286_SI + DS_FIX); |
| I286_SI += stp; | I286_SI += stp; |
| iocore_out8(I286_DX, dat); | iocore_out8(I286_DX, (BYTE)dat); |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| } while(--I286_CX); | } while(--I286_CX); |
| } | } |
| Line 57 I286EXT i286c_rep_outsw(void) { | Line 57 I286EXT i286c_rep_outsw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| do { | do { |
| UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); | REG16 dat = i286_memoryread_w(I286_SI + DS_FIX); |
| I286_SI += stp; | I286_SI += stp; |
| iocore_out16(I286_DX, dat); | iocore_out16(I286_DX, (UINT16)dat); |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| } while(--I286_CX); | } while(--I286_CX); |
| } | } |
| } | } |
| // ---------------------------------------------------------------------- movs | // ---------------------------------------------------------------------- movs |
| #if 1 | |
| I286EXT i286c_rep_movsb(void) { | I286EXT i286c_rep_movsb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| while(1) { | while(1) { |
| BYTE dat = i286_memoryread(I286_SI + DS_FIX); | REG8 dat = i286_memoryread(I286_SI + DS_FIX); |
| i286_memorywrite(I286_DI + ES_BASE, dat); | i286_memorywrite(I286_DI + ES_BASE, dat); |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| Line 86 I286EXT i286c_rep_movsb(void) { | Line 86 I286EXT i286c_rep_movsb(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| Line 97 I286EXT i286c_rep_movsw(void) { | Line 97 I286EXT i286c_rep_movsw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| while(1) { | while(1) { |
| UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); | REG16 dat = i286_memoryread_w(I286_SI + DS_FIX); |
| i286_memorywrite_w(I286_DI + ES_BASE, dat); | i286_memorywrite_w(I286_DI + ES_BASE, dat); |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| Line 109 I286EXT i286c_rep_movsw(void) { | Line 109 I286EXT i286c_rep_movsw(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| } | } |
| } | } |
| #else | |
| I286EXT i286c_rep_movsb(void) { | |
| I286_WORKCLOCK(5); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIR; | |
| do { | |
| BYTE dat = i286_memoryread(I286_SI + DS_FIX); | |
| i286_memorywrite(I286_DI + ES_BASE, dat); | |
| I286_SI += stp; | |
| I286_DI += stp; | |
| I286_WORKCLOCK(4); | |
| } while(--I286_CX); | |
| } | |
| } | |
| I286EXT i286c_rep_movsw(void) { | |
| I286_WORKCLOCK(5); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIRx2; | |
| do { | |
| UINT16 dat = i286_memoryread_w(I286_SI + DS_FIX); | |
| i286_memorywrite_w(I286_DI + ES_BASE, dat); | |
| I286_SI += stp; | |
| I286_DI += stp; | |
| I286_WORKCLOCK(4); | |
| } while(--I286_CX); | |
| } | |
| } | |
| #endif | |
| // ---------------------------------------------------------------------- lods | // ---------------------------------------------------------------------- lods |
| #if 1 | |
| I286EXT i286c_rep_lodsb(void) { | I286EXT i286c_rep_lodsb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| while(1) { | while(1) { |
| I286_AL = i286_memoryread(I286_SI + DS_FIX); | I286_AL = i286_memoryread(I286_SI + DS_FIX); |
| I286_SI += stp; | I286_SI += stp; |
| Line 164 I286EXT i286c_rep_lodsb(void) { | Line 133 I286EXT i286c_rep_lodsb(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| Line 175 I286EXT i286c_rep_lodsw(void) { | Line 144 I286EXT i286c_rep_lodsw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| while(1) { | while(1) { |
| I286_AX = i286_memoryread_w(I286_SI + DS_FIX); | I286_AX = i286_memoryread_w(I286_SI + DS_FIX); |
| I286_SI += stp; | I286_SI += stp; |
| Line 185 I286EXT i286c_rep_lodsw(void) { | Line 154 I286EXT i286c_rep_lodsw(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| } | } |
| } | } |
| #else | |
| I286EXT i286c_rep_lodsb(void) { | |
| I286_WORKCLOCK(5); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIR; | |
| do { | |
| I286_AL = i286_memoryread(I286_SI + DS_FIX); | |
| I286_SI += stp; | |
| I286_WORKCLOCK(4); | |
| } while(--I286_CX); | |
| } | |
| } | |
| I286EXT i286c_rep_lodsw(void) { | |
| I286_WORKCLOCK(5); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIRx2; | |
| do { | |
| I286_AX = i286_memoryread_w(I286_SI + DS_FIX); | |
| I286_SI += stp; | |
| I286_WORKCLOCK(4); | |
| } while(--I286_CX); | |
| } | |
| } | |
| #endif | |
| // ---------------------------------------------------------------------- stos | // ---------------------------------------------------------------------- stos |
| #if 1 | |
| I286EXT i286c_rep_stosb(void) { | I286EXT i286c_rep_stosb(void) { |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| while(1) { | while(1) { |
| i286_memorywrite(I286_DI + ES_BASE, I286_AL); | i286_memorywrite(I286_DI + ES_BASE, I286_AL); |
| I286_DI += stp; | I286_DI += stp; |
| Line 236 I286EXT i286c_rep_stosb(void) { | Line 178 I286EXT i286c_rep_stosb(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| Line 247 I286EXT i286c_rep_stosw(void) { | Line 189 I286EXT i286c_rep_stosw(void) { |
| I286_WORKCLOCK(4); | I286_WORKCLOCK(4); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| while(1) { | while(1) { |
| i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); | i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); |
| I286_DI += stp; | I286_DI += stp; |
| Line 257 I286EXT i286c_rep_stosw(void) { | Line 199 I286EXT i286c_rep_stosw(void) { |
| break; | break; |
| } | } |
| if (I286_REMCLOCK <= 0) { | if (I286_REMCLOCK <= 0) { |
| I286_IP -= i286reg.prefix + 1; | I286_IP -= I286_PREFIX + 1; |
| break; | break; |
| } | } |
| } | } |
| } | } |
| } | } |
| #else | |
| I286EXT i286c_rep_stosb(void) { | |
| I286_WORKCLOCK(4); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIR; | |
| do { | |
| i286_memorywrite(I286_DI + ES_BASE, I286_AL); | |
| I286_DI += stp; | |
| I286_WORKCLOCK(3); | |
| } while(--I286_CX); | |
| } | |
| } | |
| I286EXT i286c_rep_stosw(void) { | |
| I286_WORKCLOCK(4); | |
| if (I286_CX) { | |
| SINT16 stp = STRING_DIRx2; | |
| do { | |
| i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); | |
| I286_DI += stp; | |
| I286_WORKCLOCK(3); | |
| } while(--I286_CX); | |
| } | |
| } | |
| #endif | |
| // ---------------------------------------------------------------------- cmps | // ---------------------------------------------------------------------- cmps |
| Line 297 I286EXT i286c_repe_cmpsb(void) { | Line 213 I286EXT i286c_repe_cmpsb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| do { | do { |
| UINT res; | UINT res; |
| UINT dst = i286_memoryread(I286_SI + DS_FIX); | UINT dst = i286_memoryread(I286_SI + DS_FIX); |
| Line 305 I286EXT i286c_repe_cmpsb(void) { | Line 221 I286EXT i286c_repe_cmpsb(void) { |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(9); | I286_WORKCLOCK(9); |
| BYTE_SUB(res, dst, src) | SUBBYTE(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (I286_FLAGL & Z_FLAG)); | } while((I286_CX) && (I286_FLAGL & Z_FLAG)); |
| } | } |
| Line 315 I286EXT i286c_repne_cmpsb(void) { | Line 231 I286EXT i286c_repne_cmpsb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| do { | do { |
| UINT res; | UINT res; |
| UINT dst = i286_memoryread(I286_SI + DS_FIX); | UINT dst = i286_memoryread(I286_SI + DS_FIX); |
| Line 323 I286EXT i286c_repne_cmpsb(void) { | Line 239 I286EXT i286c_repne_cmpsb(void) { |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(9); | I286_WORKCLOCK(9); |
| BYTE_SUB(res, dst, src) | SUBBYTE(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); | } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); |
| } | } |
| Line 333 I286EXT i286c_repe_cmpsw(void) { | Line 249 I286EXT i286c_repe_cmpsw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| do { | do { |
| UINT32 res; | UINT32 res; |
| UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); | UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); |
| Line 341 I286EXT i286c_repe_cmpsw(void) { | Line 257 I286EXT i286c_repe_cmpsw(void) { |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(9); | I286_WORKCLOCK(9); |
| WORD_SUB(res, dst, src) | SUBWORD(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (I286_FLAGL & Z_FLAG)); | } while((I286_CX) && (I286_FLAGL & Z_FLAG)); |
| } | } |
| Line 351 I286EXT i286c_repne_cmpsw(void) { | Line 267 I286EXT i286c_repne_cmpsw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| do { | do { |
| UINT32 res; | UINT32 res; |
| UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); | UINT32 dst = i286_memoryread_w(I286_SI + DS_FIX); |
| Line 359 I286EXT i286c_repne_cmpsw(void) { | Line 275 I286EXT i286c_repne_cmpsw(void) { |
| I286_SI += stp; | I286_SI += stp; |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(9); | I286_WORKCLOCK(9); |
| WORD_SUB(res, dst, src) | SUBWORD(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); | } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); |
| } | } |
| } | } |
| // ---------------------------------------------------------------------- scas | // ---------------------------------------------------------------------- scas |
| I286EXT i286c_repe_scasb(void) { | I286EXT i286c_repe_scasb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| UINT dst = I286_AL; | UINT dst = I286_AL; |
| do { | do { |
| UINT res; | UINT res; |
| UINT src = i286_memoryread(I286_DI + ES_BASE); | UINT src = i286_memoryread(I286_DI + ES_BASE); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(8); | I286_WORKCLOCK(8); |
| BYTE_SUB(res, dst, src) | SUBBYTE(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (I286_FLAGL & Z_FLAG)); | } while((I286_CX) && (I286_FLAGL & Z_FLAG)); |
| } | } |
| Line 388 I286EXT i286c_repne_scasb(void) { | Line 305 I286EXT i286c_repne_scasb(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIR; | int stp = STRING_DIR; |
| UINT dst = I286_AL; | UINT dst = I286_AL; |
| do { | do { |
| UINT res; | UINT res; |
| UINT src = i286_memoryread(I286_DI + ES_BASE); | UINT src = i286_memoryread(I286_DI + ES_BASE); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(8); | I286_WORKCLOCK(8); |
| BYTE_SUB(res, dst, src) | SUBBYTE(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); | } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); |
| } | } |
| Line 405 I286EXT i286c_repe_scasw(void) { | Line 322 I286EXT i286c_repe_scasw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| UINT32 dst = I286_AX; | UINT32 dst = I286_AX; |
| do { | do { |
| UINT32 res; | UINT32 res; |
| UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); | UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(8); | I286_WORKCLOCK(8); |
| WORD_SUB(res, dst, src) | SUBWORD(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (I286_FLAGL & Z_FLAG)); | } while((I286_CX) && (I286_FLAGL & Z_FLAG)); |
| } | } |
| Line 422 I286EXT i286c_repne_scasw(void) { | Line 339 I286EXT i286c_repne_scasw(void) { |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| if (I286_CX) { | if (I286_CX) { |
| SINT16 stp = STRING_DIRx2; | int stp = STRING_DIRx2; |
| UINT32 dst = I286_AX; | UINT32 dst = I286_AX; |
| do { | do { |
| UINT32 res; | UINT32 res; |
| UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); | UINT32 src = i286_memoryread_w(I286_DI + ES_BASE); |
| I286_DI += stp; | I286_DI += stp; |
| I286_WORKCLOCK(8); | I286_WORKCLOCK(8); |
| WORD_SUB(res, dst, src) | SUBWORD(res, dst, src) |
| I286_CX--; | I286_CX--; |
| } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); | } while((I286_CX) && (!(I286_FLAGL & Z_FLAG))); |
| } | } |