--- np2/i286c/i286c.mcr 2003/11/29 03:38:26 1.10 +++ np2/i286c/i286c.mcr 2003/11/30 12:38:15 1.13 @@ -1,9 +1,13 @@ +#if defined(ARM) && defined(BYTESEX_LITTLE) +#define INHIBIT_WORDP(m) (((m) & 1) || ((m) >= 0xa0000)) +#else #define INHIBIT_WORDP(m) (1) +#endif #define __CBW(src) (UINT16)((char)(src)) -#define __CBD(src) ((char)(src)) -#define WORD2LONG(src) ((short)(src)) +#define __CBD(src) ((SINT8)(src)) +#define WORD2LONG(src) ((SINT16)(src)) #define SEGMENTPTR(s) (((UINT16 *)&I286_SEGREG) + (s)) @@ -321,7 +325,7 @@ extern UINT calc_a(UINT op, UINT32 *seg) #define BYTE_IMUL(r, d, s) \ I286_FLAGL &= (Z_FLAG | S_FLAG | A_FLAG | P_FLAG); \ - (r) = (char)(d) * (char)(s); \ + (r) = (SINT8)(d) * (SINT8)(s); \ I286_OV = ((r) + 0x80) & 0xffffff00; \ if (I286_OV) { \ I286_FLAGL |= C_FLAG; \ @@ -329,7 +333,7 @@ extern UINT calc_a(UINT op, UINT32 *seg) #define WORD_IMUL(r, d, s) \ I286_FLAGL &= (Z_FLAG | S_FLAG | A_FLAG | P_FLAG); \ - (r) = (short)(d) * (short)(s); \ + (r) = (SINT16)(d) * (SINT16)(s); \ I286_OV = ((r) + 0x8000) & 0xffff0000; \ if (I286_OV) { \ I286_FLAGL |= C_FLAG; \ @@ -404,25 +408,51 @@ extern UINT calc_a(UINT op, UINT32 *seg) } -#define REGPUSH(reg, clock) { \ - I286_WORKCLOCK(clock); \ - I286_SP -= 2; \ - i286_memorywrite_w(I286_SP + SS_BASE, reg); \ - } - +// ---- stack #define REGPUSH0(reg) \ I286_SP -= 2; \ i286_memorywrite_w(I286_SP + SS_BASE, reg); +#define REGPOP0(reg) \ + reg = i286_memoryread_w(I286_SP + SS_BASE); \ + I286_SP += 2; -#define SP_PUSH(reg, clock) { \ - UINT16 sp = reg; \ +#if defined(ARM) && defined(BYTESEX_LITTLE) + +#define REGPUSH(reg, clock) { \ + UINT32 addr; \ + I286_WORKCLOCK(clock); \ I286_SP -= 2; \ - i286_memorywrite_w(I286_SP + SS_BASE, sp); \ + addr = I286_SP + SS_BASE; \ + if (INHIBIT_WORDP(addr)) { \ + i286_memorywrite_w(addr, reg); \ + } \ + else { \ + *(UINT16 *)(mem + addr) = (reg); \ + } \ + } + +#define REGPOP(reg, clock) { \ + UINT32 addr; \ I286_WORKCLOCK(clock); \ + addr = I286_SP + SS_BASE; \ + if (INHIBIT_WORDP(addr)) { \ + (reg) = i286_memoryread_w(addr); \ + } \ + else { \ + (reg) = *(UINT16 *)(mem + addr); \ + } \ + I286_SP += 2; \ } +#else + +#define REGPUSH(reg, clock) { \ + I286_WORKCLOCK(clock); \ + I286_SP -= 2; \ + i286_memorywrite_w(I286_SP + SS_BASE, reg); \ + } #define REGPOP(reg, clock) { \ I286_WORKCLOCK(clock); \ @@ -430,16 +460,19 @@ extern UINT calc_a(UINT op, UINT32 *seg) I286_SP += 2; \ } -#define SP_POP(reg, clock) { \ +#endif + +#define SP_PUSH(reg, clock) { \ + REG16 sp = (reg); \ + I286_SP -= 2; \ + i286_memorywrite_w(I286_SP + SS_BASE, sp); \ I286_WORKCLOCK(clock); \ - reg = i286_memoryread_w(I286_SP + SS_BASE); \ } - -#define REGPOP0(reg) \ +#define SP_POP(reg, clock) { \ + I286_WORKCLOCK(clock); \ reg = i286_memoryread_w(I286_SP + SS_BASE); \ - I286_SP += 2; - + } #define JMPSHORT(clock) { \