--- np2/i286a/i286a_mn.s 2003/12/18 19:14:08 1.8 +++ np2/i286a/i286a_mn.s 2005/03/16 03:53:45 1.27 @@ -3,30 +3,30 @@ INCLUDE i286aea.inc INCLUDE i286aalu.inc INCLUDE i286aop.inc - INCLUDE i286apic.inc + INCLUDE i286aio.inc - IMPORT i286core - IMPORT _szpcflag8 + IMPORT i286acore + IMPORT iflags IMPORT i286a_localint + IMPORT i286a_trapint + IMPORT i286a_selector IMPORT i286a_ea IMPORT i286a_lea IMPORT i286a_a - IMPORT i286_memoryread - IMPORT i286_memoryread_w - IMPORT i286_memorywrite - IMPORT i286_memorywrite_w + IMPORT i286a_memoryread + IMPORT i286a_memoryread_w + IMPORT i286a_memorywrite + IMPORT i286a_memorywrite_w IMPORT iocore_inp8 IMPORT iocore_inp16 IMPORT iocore_out8 IMPORT iocore_out16 + IMPORT dmax86 IMPORT biosfunc - IMPORT pic - IMPORT extirq_pop - IMPORT i286a_cts IMPORT i286aop80 @@ -46,6 +46,26 @@ IMPORT i286aopfe IMPORT i286aopff + IMPORT i286a_rep_insb + IMPORT i286a_rep_insw + IMPORT i286a_rep_outsb + IMPORT i286a_rep_outsw + IMPORT i286a_rep_movsb + IMPORT i286a_rep_movsw + IMPORT i286a_rep_lodsb + IMPORT i286a_rep_lodsw + IMPORT i286a_rep_stosb + IMPORT i286a_rep_stosw + IMPORT i286a_repe_cmpsb + IMPORT i286a_repe_cmpsw + IMPORT i286a_repne_cmpsb + IMPORT i286a_repne_cmpsw + IMPORT i286a_repe_scasb + IMPORT i286a_repe_scasw + IMPORT i286a_repne_scasb + IMPORT i286a_repne_scasw + + EXPORT i286a EXPORT i286a_step EXPORT optbl1 @@ -114,8 +134,8 @@ xor_ax_d16 OP_AX_D16 XOR16, #3 ; segprefix_ss ! ; aaa * -cmp_ea_r8 S_EA_R8 SUB8, #2, #7 -cmp_ea_r16 S_EA_R16 SUB16, #2, #7 +cmp_ea_r8 S_EA_R8 SUB8, #2, #6 +cmp_ea_r16 S_EA_R16 SUB16, #2, #6 cmp_r8_ea S_R8_EA SUB8, #2, #6 cmp_r16_ea S_R16_EA SUB16, #2, #6 cmp_al_d8 S_AL_D8 SUB8, #3 @@ -170,18 +190,18 @@ pop_di REGPOP #CPU_DI, #5 ; outsb * ; outsw * -jo_short JMPNE #O_FLAG, #2, #7 -jno_short JMPEQ #O_FLAG, #2, #7 -jc_short JMPNE #C_FLAG, #2, #7 -jnc_short JMPEQ #C_FLAG, #2, #7 -jz_short JMPNE #Z_FLAG, #2, #7 -jnz_short JMPEQ #Z_FLAG, #2, #7 -jna_short JMPNE #(Z_FLAG + C_FLAG), #2, #7 -ja_short JMPEQ #(Z_FLAG + C_FLAG), #2, #7 -js_short JMPNE #S_FLAG, #2, #7 -jns_short JMPEQ #S_FLAG, #2, #7 -jp_short JMPNE #P_FLAG, #2, #7 -jnp_short JMPEQ #P_FLAG, #2, #7 +jo_short JMPNE #O_FLAG, #3, #7 +jno_short JMPEQ #O_FLAG, #3, #7 +jc_short JMPNE #C_FLAG, #3, #7 +jnc_short JMPEQ #C_FLAG, #3, #7 +jz_short JMPNE #Z_FLAG, #3, #7 +jnz_short JMPEQ #Z_FLAG, #3, #7 +jna_short JMPNE #(Z_FLAG + C_FLAG), #3, #7 +ja_short JMPEQ #(Z_FLAG + C_FLAG), #3, #7 +js_short JMPNE #S_FLAG, #3, #7 +jns_short JMPEQ #S_FLAG, #3, #7 +jp_short JMPNE #P_FLAG, #3, #7 +jnp_short JMPEQ #P_FLAG, #3, #7 ; jl_short + ; jnl_short + ; jle_short + @@ -412,90 +432,90 @@ pusha ldrh r4, [r9, #CPU_SP] sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_AX] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_CX] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_DX] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_BX] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w mov r1, r6 sub r4, r4, #(2 << 16) add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_BP] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_SI] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w sub r4, r4, #(2 << 16) ldrh r1, [r9, #CPU_DI] add r0, r5, r4 lsr #16 - bl i286_memorywrite_w + bl i286a_memorywrite_w mov r0, r4 lsr #16 strh r0, [r9, #CPU_SP] mov pc, r11 -popa ldrh r4, [r9, #CPU_SP] +popa ldrh r1, [r9, #CPU_SP] ldr r5, [r9, #CPU_SS_BASE] CPUWORK #19 - add r0, r5, r4 - mov r4, r4 lsl #16 - bl i286_memoryread_w + mov r4, r1 lsl #16 + add r0, r5, r1 + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_DI] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_SI] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(4 << 16) strh r0, [r9, #CPU_BP] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_BX] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_DX] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_CX] add r0, r5, r4 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r4, #(2 << 16) strh r0, [r9, #CPU_AX] mov r0, r4 lsr #16 strh r0, [r9, #CPU_SP] mov pc, r11 -bound GETPC8 +bound GETPCF8 cmp r0, #&c0 bcs bndreg - CPUWORK #13 R16DST r0, r12 + CPUWORK #13 ldrh r5, [r12, #CPU_REG] bl i286a_a add r4, r0, #2 add r0, r0, r6 - bl i286_memoryread_w + bl i286a_memoryread_w cmp r5, r0 bcc bndout bic r4, r4, #(1 << 16) add r0, r4, r6 - bl i286_memoryread_w + bl i286a_memoryread_w cmp r5, r0 movls pc, r11 bndout mov r6, #5 @@ -514,9 +534,9 @@ push_d16 CPUWORK #3 strh r2, [r9, #CPU_SP] add r0, r2, r3 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w -imul_r_ea_d16 REG16EA r5, #21, #24 +imul_r_ea_d16 REG16EA r6, #21, #24 mov r4, r0, lsl #16 GETPC16 mov r0, r0, lsl #16 @@ -524,7 +544,7 @@ imul_r_ea_d16 REG16EA r5, #21, #24 mov r0, r0, asr #16 mul r1, r0, r4 add r12, r1, #&8000 - strh r1, [r5, #CPU_REG] + strh r1, [r6, #CPU_REG] movs r12, r12 lsr #16 biceq r8, r8, #O_FLAG biceq r8, r8, #C_FLAG @@ -533,7 +553,7 @@ imul_r_ea_d16 REG16EA r5, #21, #24 mov pc, r11 push_d8 CPUWORK #3 - GETPC8 + GETPCF8 ldrh r2, [r9, #CPU_SP] ldr r3, [r9, #CPU_SS_BASE] mov r0, r0 lsl #24 @@ -543,9 +563,9 @@ push_d8 CPUWORK #3 strh r2, [r9, #CPU_SP] add r0, r2, r3 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w -imul_r_ea_d8 REG16EA r5, #21, #24 +imul_r_ea_d8 REG16EA r6, #21, #24 mov r4, r0, lsl #16 GETPC8 mov r0, r0, lsl #24 @@ -553,7 +573,7 @@ imul_r_ea_d8 REG16EA r5, #21, #24 mov r0, r0, asr #24 mul r1, r0, r4 add r12, r1, #&8000 - strh r1, [r5, #CPU_REG] + strh r1, [r6, #CPU_REG] movs r12, r12 lsr #16 biceq r8, r8, #O_FLAG biceq r8, r8, #C_FLAG @@ -565,43 +585,43 @@ insb CPUWORK #5 ldrh r0, [r9, #CPU_DX] CPUSV bl iocore_inp8 - CPULD ldrh r2, [r9, #CPU_DI] ldr r3, [r9, #CPU_ES_BASE] + CPULD mov r1, r0 - add r0, r2, r3 + add r0, r3, r2 tst r8, #D_FLAG addeq r2, r2, #1 subne r2, r2, #1 mov lr, r11 strh r2, [r9, #CPU_DI] - b i286_memorywrite + b i286a_memorywrite insw CPUWORK #5 ldrh r0, [r9, #CPU_DX] CPUSV bl iocore_inp16 - CPULD ldrh r2, [r9, #CPU_DI] ldr r3, [r9, #CPU_ES_BASE] + CPULD mov r1, r0 - add r0, r2, r3 + add r0, r3, r2 tst r8, #D_FLAG addeq r2, r2, #2 subne r2, r2, #2 mov lr, r11 strh r2, [r9, #CPU_DI] - b i286_memorywrite_w + b i286a_memorywrite_w outsb CPUWORK #3 ldrh r1, [r9, #CPU_SI] ldr r2, [r9, #CPU_DS_FIX] - add r0, r1, r2 tst r8, #D_FLAG - addeq r1, r1, #1 - subne r1, r1, #1 - strh r1, [r9, #CPU_SI] - bl i286_memoryread + addeq r3, r1, #1 + subne r3, r1, #1 + add r0, r2, r1 + strh r3, [r9, #CPU_SI] + bl i286a_memoryread mov r1, r0 ldr r0, [r9, #CPU_DX] CPUSV @@ -612,12 +632,12 @@ outsb CPUWORK #3 outsw CPUWORK #3 ldrh r1, [r9, #CPU_SI] ldr r2, [r9, #CPU_DS_FIX] - add r0, r1, r2 tst r8, #D_FLAG - addeq r1, r1, #2 - subne r1, r1, #2 - strh r1, [r9, #CPU_SI] - bl i286_memoryread_w + addeq r3, r1, #2 + subne r3, r1, #2 + add r0, r2, r1 + strh r3, [r9, #CPU_SI] + bl i286a_memoryread_w mov r1, r0 ldr r0, [r9, #CPU_DX] CPUSV @@ -630,7 +650,7 @@ jle_short tst r8, #Z_FLAG jl_short eor r0, r8, r8 lsr #4 tst r0, #S_FLAG bne jmps -nojmps CPUWORK #2 +nojmps CPUWORK #3 add r8, r8, #(1 << 16) mov pc, r11 @@ -645,142 +665,149 @@ jmps JMPS #7 xchg_ea_r8 EAREG8 r6 cmp r0, #&c0 bcc xchgear8_1 - CPUWORK #3 - R8SRC r0, r5 + R8SRC r0, r2 ldrb r0, [r6, #CPU_REG] - ldrb r1, [r5, #CPU_REG] - strb r0, [r5, #CPU_REG] + ldrb r1, [r2, #CPU_REG] + CPUWORK #3 + strb r0, [r2, #CPU_REG] strb r1, [r6, #CPU_REG] mov pc, r11 -xchgear8_1 CPUWORK #5 - bl i286a_ea +xchgear8_1 bl i286a_ea cmp r0, #I286_MEMWRITEMAX bcs xchgear8_2 ldrb r1, [r6, #CPU_REG] ldrb r4, [r9, r0] + CPUWORK #5 strb r1, [r9, r0] strb r4, [r6, #CPU_REG] mov pc, r11 xchgear8_2 mov r5, r0 - bl i286_memoryread + bl i286a_memoryread ldrb r1, [r6, #CPU_REG] strb r0, [r6, #CPU_REG] + CPUWORK #5 mov r0, r5 mov lr, r11 - b i286_memorywrite + b i286a_memorywrite xchg_ea_r16 EAREG16 r6 cmp r0, #&c0 bcc xchgear16_1 - CPUWORK #3 - R16SRC r0, r5 + R16SRC r0, r2 ldrh r0, [r6, #CPU_REG] - ldrh r1, [r5, #CPU_REG] - strh r0, [r5, #CPU_REG] + ldrh r1, [r2, #CPU_REG] + CPUWORK #3 + strh r0, [r2, #CPU_REG] strh r1, [r6, #CPU_REG] mov pc, r11 -xchgear16_1 CPUWORK #5 - bl i286a_ea - tst r0, #1 - bne xchgear16_2 - cmp r0, #I286_MEMWRITEMAX - bcs xchgear16_2 +xchgear16_1 bl i286a_ea + ACCWORD r0, xchgear16_2 ldrh r1, [r6, #CPU_REG] ldrh r4, [r9, r0] + CPUWORK #5 strh r1, [r9, r0] strh r4, [r6, #CPU_REG] mov pc, r11 xchgear16_2 mov r5, r0 - bl i286_memoryread_w + bl i286a_memoryread_w ldrh r1, [r6, #CPU_REG] strh r0, [r6, #CPU_REG] + CPUWORK #5 mov r0, r5 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w mov_ea_r8 EAREG8 r6 cmp r0, #&c0 bcc movear8_1 + ldrb r1, [r6, #CPU_REG] + R8SRC r0, r2 CPUWORK #3 - R8SRC r0, r5 - ldrb r0, [r6, #CPU_REG] - strb r0, [r5, #CPU_REG] + strb r1, [r2, #CPU_REG] mov pc, r11 movear8_1 CPUWORK #5 bl i286a_ea ldrb r1, [r6, #CPU_REG] mov lr, r11 - b i286_memorywrite + b i286a_memorywrite mov_ea_r16 EAREG16 r6 cmp r0, #&c0 bcc movear16_1 + ldrh r1, [r6, #CPU_REG] + R16SRC r0, r2 CPUWORK #3 - R16SRC r0, r5 - ldrh r0, [r6, #CPU_REG] - strh r0, [r5, #CPU_REG] + strh r1, [r2, #CPU_REG] mov pc, r11 movear16_1 CPUWORK #5 bl i286a_ea ldrh r1, [r6, #CPU_REG] mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w -mov_r8_ea REG8EA r5, #2, #5 - strb r0, [r5, #CPU_REG] +mov_r8_ea REG8EA r6, #2, #5 + strb r0, [r6, #CPU_REG] mov pc, r11 -mov_r16_ea REG16EA r5, #2, #5 - strh r0, [r5, #CPU_REG] +mov_r16_ea REG16EA r6, #2, #5 + strh r0, [r6, #CPU_REG] mov pc, r11 -mov_ea_seg GETPC8 +mov_ea_seg GETPCF8 and r1, r0, #(3 << 3) add r1, r9, r1 lsr #2 - ldrh r5, [r1, #CPU_SEG] + ldrh r6, [r1, #CPU_SEG] cmp r0, #&c0 bcc measegm + R16SRC r0, r2 CPUWORK #2 - R16SRC r0, r4 - strh r5, [r4, #CPU_REG] + strh r6, [r2, #CPU_REG] mov pc, r11 measegm CPUWORK #3 bl i286a_ea - mov r1, r5 + mov r1, r6 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w lea_r16_ea CPUWORK #3 - GETPC8 + GETPCF8 cmp r0, #&c0 bcs leareg - R16DST r0, r5 + R16DST r0, r6 bl i286a_lea - strh r0, [r5, #CPU_REG] + strh r0, [r6, #CPU_REG] mov pc, r11 leareg mov r6, #6 sub r8, r8, #(2 << 16) b i286a_localint -mov_seg_ea GETPC8 - adr r6, msegea_tbl +mov_seg_ea ldrb r6, [r9, #CPU_MSW] + GETPCF8 + adr r2, msegea_tbl and r1, r0, #(3 << 3) - mov r5, r8 - ldr r6, [r6, r1 lsr #1] + tst r6, #MSW_PE + orrne r1, r1, #(4 << 3) + mov r6, r8 + ldr r2, [r2, r1 lsr #1] cmp r0, #&c0 bcc msegeam - CPUWORK #2 R16SRC r0, r4 + CPUWORK #2 ldrh r0, [r4, #CPU_REG] - mov pc, r6 -msegeam CPUWORK #5 + mov pc, r2 +msegeam str r2, [sp, #-4]! + CPUWORK #5 bl i286a_ea - bl i286_memoryread_w - mov pc, r6 + ldr lr, [sp], #4 + b i286a_memoryread_w msegea_tbl dcd msegea_es dcd msegea_cs dcd msegea_ss dcd msegea_ds + dcd msegea_es_p + dcd msegea_cs + dcd msegea_ss_p + dcd msegea_ds_p msegea_es mov r1, r0 lsl #4 strh r0, [r9, #CPU_ES] str r1, [r9, #CPU_ES_BASE] @@ -795,19 +822,36 @@ msegea_ss mov r1, r0 lsl #4 str r1, [r9, #CPU_SS_BASE] str r1, [r9, #CPU_SS_FIX] NEXT_OPCODE -msegea_cs sub r8, r5, #(2 << 16) + +msegea_es_p strh r0, [r9, #CPU_ES] + bl i286a_selector + str r0, [r9, #CPU_ES_BASE] + mov pc, r11 +msegea_ds_p strh r0, [r9, #CPU_DS] + bl i286a_selector + str r0, [r9, #CPU_DS_BASE] + str r0, [r9, #CPU_DS_FIX] + mov pc, r11 +msegea_ss_p strh r0, [r9, #CPU_SS] + bl i286a_selector + str r0, [r9, #CPU_SS_BASE] + str r0, [r9, #CPU_SS_FIX] + NEXT_OPCODE + +msegea_cs sub r8, r6, #(2 << 16) mov r6, #6 b i286a_localint + pop_ea POP #5 - mov r5, r0 - GETPC8 + mov r6, r0 + GETPCF8 cmp r0, #&c0 bcs popreg bl i286a_ea - mov r1, r5 + mov r1, r6 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w popreg R16SRC r0, r1 strh r4, [r1, #CPU_REG] mov pc, r11 @@ -815,7 +859,7 @@ popreg R16SRC r0, r1 nopandbios sub r0, r8, #(1 << 16) CPUWORK #3 - ; ldr r5, [r9, #CPU_CS_BASE] + ;; ldr r5, [r9, #CPU_CS_BASE] add r0, r5, r0 lsr #16 cmp r0, #&0f8000 movcc pc, r11 @@ -840,15 +884,15 @@ nopandbios sub r0, r8, #(1 << 16) str r3, [r9, #CPU_DS_FIX] mov pc, r11 -cbw CPUWORK #2 - ldrb r0, [r9, #CPU_AL] +cbw ldrb r0, [r9, #CPU_AL] + CPUWORK #2 mov r1, r0 lsl #24 mov r0, r1 asr #31 strb r0, [r9, #CPU_AH] mov pc, r11 -cwd CPUWORK #2 - ldrb r0, [r9, #CPU_AH] +cwd ldrb r0, [r9, #CPU_AH] + CPUWORK #2 mov r1, r0 lsl #24 mov r0, r1 asr #31 strh r0, [r9, #CPU_DX] @@ -861,24 +905,27 @@ call_far CPUWORK #13 mov r4, r4 lsl #16 sub r4, r4, #(2 << 16) add r0, r5, r4 lsr #16 - bl i286_memorywrite_w ; cs + bl i286a_memorywrite_w ; cs sub r4, r4, #(2 << 16) add r12, r8, #(4 << 16) mov r4, r4, lsr #16 mov r1, r12 lsr #16 add r0, r4, r5 - bl i286_memorywrite_w ; ip ldr r5, [r9, #CPU_CS_BASE] + bl i286a_memorywrite_w ; ip strh r4, [r9, #CPU_SP] add r0, r5, r8 lsr #16 - bl i286_memoryread_w ; newip + bl i286a_memoryread_w ; newip add r8, r8, #(2 << 16) mov r4, r0 lsl #16 add r0, r5, r8 lsr #16 - bl i286_memoryread_w - mov r1, r0 lsl #4 + ldrb r5, [r9, #CPU_MSW] + bl i286a_memoryread_w strh r0, [r9, #CPU_CS] - str r1, [r9, #CPU_CS_BASE] + tst r5, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_CS_BASE] mov r0, r8 lsl #16 orr r8, r4, r0 lsr #16 mov pc, r11 @@ -895,9 +942,17 @@ pushf CPUWORK #3 strh r3, [r9, #CPU_SP] add r0, r3, r2 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w popf POP #5 + if 1 + mov r8, r8 lsr #16 + bic r1, r0, #&f000 ; i286 + and r2, r0, #(I_FLAG + T_FLAG) + orr r8, r1, r8 lsl #16 + cmp r2, #(I_FLAG + T_FLAG) + beq popf_withirq + else mov r2, #3 mov r8, r8 lsr #16 and r2, r2, r0 lsr #8 @@ -906,18 +961,16 @@ popf POP #5 orr r8, r1, r8 lsl #16 strb r2, [r9, #CPU_TRAP] bne popf_withirq + endif ldr r0, popf_pic - tst r8, #I_FLAG - moveq pc, r11 - PICEXISTINTR - moveq pc, r11 + NOINTREXIT popf_withirq I286IRQCHECKTERM popf_pic dcd pic -sahf CPUWORK #2 - ldrb r0, [r9, #CPU_AH] +sahf ldrb r0, [r9, #CPU_AH] + CPUWORK #2 bic r8, r8, #&ff - orr r8, r0, r8 + orr r8, r8, r0 mov pc, r11 lahf CPUWORK #2 @@ -926,116 +979,112 @@ lahf CPUWORK #2 mov_al_m8 CPUWORK #5 - ldr r5, [r9, #CPU_DS_FIX] + ldr r6, [r9, #CPU_DS_FIX] GETPC16 - add r0, r5, r0 - bl i286_memoryread + add r0, r0, r6 + bl i286a_memoryread strb r0, [r9, #CPU_AL] mov pc, r11 mov_ax_m16 CPUWORK #5 - ldr r5, [r9, #CPU_DS_FIX] + ldr r6, [r9, #CPU_DS_FIX] GETPC16 - add r0, r5, r0 - bl i286_memoryread_w + add r0, r0, r6 + bl i286a_memoryread_w strh r0, [r9, #CPU_AX] mov pc, r11 mov_m8_al CPUWORK #5 - ldr r5, [r9, #CPU_DS_FIX] + ldr r6, [r9, #CPU_DS_FIX] GETPC16 ldrb r1, [r9, #CPU_AL] - add r0, r5, r0 + add r0, r0, r6 mov lr, r11 - b i286_memorywrite + b i286a_memorywrite mov_m16_ax CPUWORK #5 - ldr r5, [r9, #CPU_DS_FIX] + ldr r6, [r9, #CPU_DS_FIX] GETPC16 ldrh r1, [r9, #CPU_AX] - add r0, r5, r0 + add r0, r0, r6 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w movsb CPUWORK #5 - ldrh r5, [r9, #CPU_SI] + ldrh r6, [r9, #CPU_SI] ldr r0, [r9, #CPU_DS_FIX] tst r8, #D_FLAG moveq r4, #1 movne r4, #-1 - add r0, r5, r0 - bl i286_memoryread + add r0, r6, r0 + bl i286a_memoryread ldrh r3, [r9, #CPU_DI] ldr r2, [r9, #CPU_ES_BASE] - add r5, r5, r4 + add r6, r6, r4 mov r1, r0 add r0, r3, r2 add r3, r3, r4 - strh r5, [r9, #CPU_SI] + strh r6, [r9, #CPU_SI] strh r3, [r9, #CPU_DI] mov lr, r11 - b i286_memorywrite + b i286a_memorywrite movsw CPUWORK #5 - ldrh r5, [r9, #CPU_SI] + ldrh r6, [r9, #CPU_SI] ldr r0, [r9, #CPU_DS_FIX] tst r8, #D_FLAG moveq r4, #2 movne r4, #-2 - add r0, r5, r0 - bl i286_memoryread_w + add r0, r6, r0 + bl i286a_memoryread_w ldrh r3, [r9, #CPU_DI] ldr r2, [r9, #CPU_ES_BASE] - add r5, r5, r4 + add r6, r6, r4 mov r1, r0 add r0, r3, r2 add r3, r3, r4 - strh r5, [r9, #CPU_SI] + strh r6, [r9, #CPU_SI] strh r3, [r9, #CPU_DI] mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w -cmpsb CPUWORK #8 - ldrh r5, [r9, #CPU_SI] +cmpsb ldrh r5, [r9, #CPU_SI] ldr r0, [r9, #CPU_DS_FIX] - ; - ; - add r0, r5, r0 - bl i286_memoryread - ldr r2, [r9, #CPU_ES_BASE] + ldr r4, [r9, #CPU_ES_BASE] + CPUWORK #8 + add r0, r0, r5 + bl i286a_memoryread ldrh r3, [r9, #CPU_DI] mov r6, r0 and r12, r8, #D_FLAG mov r12, r12 lsr #(10 - 1) - add r0, r2, r3 + add r0, r3, r4 rsb r2, r12, #1 add r5, r2, r5 add r3, r2, r3 strh r5, [r9, #CPU_SI] strh r3, [r9, #CPU_DI] - bl i286_memoryread + bl i286a_memoryread SUB8 r6, r0 mov pc, r11 -cmpsw CPUWORK #8 - ldrh r5, [r9, #CPU_SI] +cmpsw ldrh r5, [r9, #CPU_SI] ldr r0, [r9, #CPU_DS_FIX] - ; - ; - add r0, r5, r0 - bl i286_memoryread_w - ldr r2, [r9, #CPU_ES_BASE] + ldr r4, [r9, #CPU_ES_BASE] + CPUWORK #8 + add r0, r0, r5 + bl i286a_memoryread_w ldrh r3, [r9, #CPU_DI] mov r6, r0 and r12, r8, #D_FLAG mov r12, r12 lsr #(10 - 2) - add r0, r2, r3 + add r0, r3, r4 rsb r2, r12, #2 add r5, r2, r5 add r3, r2, r3 strh r5, [r9, #CPU_SI] strh r3, [r9, #CPU_DI] - bl i286_memoryread_w + bl i286a_memoryread_w SUB16 r6, r0 mov pc, r11 @@ -1049,7 +1098,7 @@ stosb CPUWORK #3 add r0, r2, r0 strh r3, [r9, #CPU_DI] mov lr, r11 - b i286_memorywrite + b i286a_memorywrite stosw CPUWORK #3 ldrh r1, [r9, #CPU_AX] @@ -1061,7 +1110,7 @@ stosw CPUWORK #3 add r0, r2, r0 strh r3, [r9, #CPU_DI] mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w lodsb CPUWORK #5 ldrh r5, [r9, #CPU_SI] @@ -1070,7 +1119,7 @@ lodsb CPUWORK #5 addeq r6, r5, #1 subne r6, r5, #1 add r0, r5, r0 - bl i286_memoryread + bl i286a_memoryread strb r0, [r9, #CPU_AL] strh r6, [r9, #CPU_SI] mov pc, r11 @@ -1082,7 +1131,7 @@ lodsw CPUWORK #5 addeq r6, r5, #2 subne r6, r5, #2 add r0, r5, r0 - bl i286_memoryread_w + bl i286a_memoryread_w strh r0, [r9, #CPU_AX] strh r6, [r9, #CPU_SI] mov pc, r11 @@ -1094,7 +1143,7 @@ scasb CPUWORK #7 addeq r6, r5, #1 subne r6, r5, #1 add r0, r5, r0 - bl i286_memoryread + bl i286a_memoryread ldrb r5, [r9, #CPU_AL] strh r6, [r9, #CPU_DI] SUB8 r5, r0 @@ -1107,7 +1156,7 @@ scasw CPUWORK #7 addeq r6, r5, #2 subne r6, r5, #2 add r0, r5, r0 - bl i286_memoryread_w + bl i286a_memoryread_w ldrh r5, [r9, #CPU_AX] strh r6, [r9, #CPU_DI] SUB16 r5, r0 @@ -1122,7 +1171,7 @@ ret_near_d16 GETPC16 add r0, r1, r2 add r3, r3, #2 strh r3, [r9, #CPU_SP] - bl i286_memoryread_w + bl i286a_memoryread_w mov r8, r8 lsl #16 mov r8, r8 lsr #16 orr r8, r8, r0 lsl #16 @@ -1136,11 +1185,11 @@ ret_near CPUWORK #11 add r0, r1, r0 strh r2, [r9, #CPU_SP] mov r8, r8 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w orr r8, r8, r0 lsl #16 mov pc, r11 -les_r16_ea GETPC8 +les_r16_ea GETPCF8 cmp r0, #&c0 bcs lr16_r CPUWORK #3 @@ -1149,19 +1198,22 @@ les_r16_ea GETPC8 add r4, r0, #2 add r0, r0, r6 bic r4, r4, #(1 << 16) - bl i286_memoryread_w + bl i286a_memoryread_w strh r0, [r5, #CPU_REG] add r0, r4, r6 - bl i286_memoryread_w - mov r1, r0 lsl #4 + ldrb r4, [r9, #CPU_MSW] + bl i286a_memoryread_w strh r0, [r9, #CPU_ES] - str r1, [r9, #CPU_ES_BASE] + tst r4, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_ES_BASE] mov pc, r11 lr16_r mov r6, #6 sub r8, r8, #(2 << 16) b i286a_localint -lds_r16_ea GETPC8 +lds_r16_ea GETPCF8 cmp r0, #&c0 bcs lr16_r CPUWORK #3 @@ -1170,34 +1222,37 @@ lds_r16_ea GETPC8 add r4, r0, #2 add r0, r0, r6 bic r4, r4, #(1 << 16) - bl i286_memoryread_w + bl i286a_memoryread_w strh r0, [r5, #CPU_REG] add r0, r4, r6 - bl i286_memoryread_w - mov r1, r0 lsl #4 + ldrb r4, [r9, #CPU_MSW] + bl i286a_memoryread_w strh r0, [r9, #CPU_DS] - str r1, [r9, #CPU_DS_BASE] - str r1, [r9, #CPU_DS_FIX] + tst r4, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_DS_BASE] + str r0, [r9, #CPU_DS_FIX] mov pc, r11 -mov_ea8_d8 GETPC8 +mov_ea8_d8 GETPCF8 cmp r0, #&c0 bcs med8_r CPUWORK #3 bl i286a_ea mov r4, r0 - GETPC8 + GETPCF8 mov r1, r0 mov r0, r4 mov lr, r11 - b i286_memorywrite + b i286a_memorywrite med8_r CPUWORK #2 R8DST r0, r4 - GETPC8 + GETPCF8 strb r0, [r4, #CPU_REG] mov pc, r11 -mov_ea16_d16 GETPC8 +mov_ea16_d16 GETPCF8 cmp r0, #&c0 bcs med16_r CPUWORK #3 @@ -1207,7 +1262,7 @@ mov_ea16_d16 GETPC8 mov r1, r0 mov r0, r4 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w med16_r CPUWORK #2 R16DST r0, r4 GETPC16 @@ -1221,7 +1276,7 @@ enter ldrh r4, [r9, #CPU_SP] addcc r4, r4, #&10000 mov r1, r5 add r0, r4, r0 - bl i286_memorywrite_w + bl i286a_memorywrite_w GETPC16 mov r6, r0 GETPC8 @@ -1244,9 +1299,9 @@ enterlv1 cmp r0, #1 sub r2, r4, r6 mov lr, r11 strh r2, [r9, #CPU_SP] - bl i286_memorywrite_w + bl i286a_memorywrite_w enterlv2 mov r1, r0, lsl #2 - add r1, r1, #12 + add r1, r1, #(12 + 4) CPUWORK r1 strh r4, [r9, #CPU_BP] str r11, [sp, #-4]! @@ -1261,14 +1316,14 @@ enterlv2 mov r1, r0, lsl #2 mov r1, r5 mov r5, r5 lsl #16 add r0, r11, r2 - bl i286_memorywrite_w + bl i286a_memorywrite_w entlv2lp sub r5, r5, #(2 << 16) sub r4, r4, #(2 << 16) add r0, r11, r5 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w mov r1, r0 add r0, r11, r4 - bl i286_memorywrite_w + bl i286a_memorywrite_w subs r6, r6, #1 bne entlv2lp ldr pc, [sp], #4 @@ -1277,54 +1332,57 @@ leave ldrh r1, [r9, #CPU_BP] ldr r0, [r9, #CPU_SS_BASE] CPUWORK #5 add r4, r1, #2 - add r0, r1, r0 - bl i286_memoryread_w + add r0, r0, r1 + bl i286a_memoryread_w strh r4, [r9, #CPU_SP] strh r0, [r9, #CPU_BP] mov pc, r11 -ret_far_d16 CPUWORK #15 - GETPC16 - mov r6, r0 +ret_far_d16 GETPC16 ldrh r4, [r9, #CPU_SP] ldr r5, [r9, #CPU_SS_BASE] - ; - ; - add r0, r4, r5 + mov r6, r0 + CPUWORK #15 + add r0, r5, r4 add r4, r4, #2 - bl i286_memoryread_w + bl i286a_memoryread_w mov r8, r8 lsl #16 mov r8, r8 lsr #16 orr r8, r8, r0 lsl #16 bic r4, r4, #(1 << 16) add r0, r4, r5 add r4, r4, #2 - bl i286_memoryread_w + bl i286a_memoryread_w add r4, r6, r4 - mov r1, r0 lsl #4 + ldrb r1, [r9, #CPU_MSW] strh r4, [r9, #CPU_SP] strh r0, [r9, #CPU_CS] - str r1, [r9, #CPU_CS_BASE] + tst r1, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_CS_BASE] mov pc, r11 -ret_far CPUWORK #15 - ldrh r4, [r9, #CPU_SP] +ret_far ldrh r1, [r9, #CPU_SP] ldr r5, [r9, #CPU_SS_BASE] - ; - add r0, r4, r5 - add r4, r4, #2 - bl i286_memoryread_w + CPUWORK #15 + add r4, r1, #2 + add r0, r5, r1 + bl i286a_memoryread_w mov r8, r8 lsl #16 mov r8, r8 lsr #16 orr r8, r8, r0 lsl #16 bic r4, r4, #(1 << 16) add r0, r4, r5 add r4, r4, #2 - bl i286_memoryread_w - mov r1, r0 lsl #4 + bl i286a_memoryread_w + ldrb r1, [r9, #CPU_MSW] strh r4, [r9, #CPU_SP] strh r0, [r9, #CPU_CS] - str r1, [r9, #CPU_CS_BASE] + tst r1, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_CS_BASE] mov pc, r11 int_03 CPUWORK #3 @@ -1332,7 +1390,7 @@ int_03 CPUWORK #3 b i286a_localint int_d8 CPUWORK #3 - GETPC8 + GETPCF8 mov r6, r0 b i286a_localint @@ -1342,27 +1400,32 @@ into CPUWORK #4 mov r6, #4 b i286a_localint -iret bl extirq_pop - CPUWORK #31 - ldrh r1, [r9, #CPU_SP] +iret ldrh r1, [r9, #CPU_SP] ldr r5, [r9, #CPU_SS_BASE] - ; + CPUWORK #31 add r4, r1, #2 - add r0, r1, r5 - bl i286_memoryread_w + add r0, r5, r1 + bl i286a_memoryread_w bic r4, r4, #(1 << 16) mov r8, r0 lsl #16 add r0, r4, r5 add r4, r4, #2 - bl i286_memoryread_w + bl i286a_memoryread_w mov r1, r0 lsl #4 strh r0, [r9, #CPU_CS] str r1, [r9, #CPU_CS_BASE] bic r4, r4, #(1 << 16) add r0, r4, r5 add r4, r4, #2 - bl i286_memoryread_w + bl i286a_memoryread_w strh r4, [r9, #CPU_SP] + if 1 + bic r1, r0, #&f000 + and r2, r0, #(I_FLAG + T_FLAG) + orr r8, r1, r8 + cmp r2, #(I_FLAG + T_FLAG) + beq iret_withirq + else mov r2, #3 bic r1, r0, #&f000 ; i286 and r2, r2, r0 lsr #8 @@ -1370,18 +1433,16 @@ iret bl extirq_pop ands r2, r2, r2 lsr #1 strb r2, [r9, #CPU_TRAP] bne iret_withirq + endif ldr r0, iret_pic - tst r8, #I_FLAG - moveq pc, r11 - PICEXISTINTR - moveq pc, r11 + NOINTREXIT iret_withirq I286IRQCHECKTERM iret_pic dcd pic aam CPUWORK #16 - GETPC8 - movs r0, r0, lsl #7 + GETPCF8 + movs r0, r0 lsl #7 beq aamzero ldrb r1, [r9, #CPU_AL] mov r2, #&80 @@ -1389,6 +1450,7 @@ aam CPUWORK #16 aamlp cmp r1, r0 subcs r1, r1, r0 orrcs r3, r2, r3 + mov r0, r0 lsr #1 movs r2, r2 lsr #1 bne aamlp ldrb r2, [r10, r1] @@ -1405,19 +1467,15 @@ aamzero sub r8, r8, #(2 << 16) mov r6, #0 b i286a_localint -aad CPUWORK #14 - GETPC8 - ldrh r1, [r9, #CPU_AX] +aad ldrh r6, [r9, #CPU_AX] + GETPCF8 + mov r2, r6 lsr #8 + mla r3, r2, r0, r6 bic r8, r8, #(S_FLAG + Z_FLAG + P_FLAG) - ; - mov r2, r1 lsr #8 - mla r3, r2, r0, r1 - ; and r1, r3, #&ff - ; - ldrb r2, [r10, r1] + ldrb r2, [r1, r10] strh r1, [r9, #CPU_AX] - ; + CPUWORK #14 orr r8, r2, r8 mov pc, r11 @@ -1434,12 +1492,12 @@ xlat ldrb r0, [r9, #CPU_AL] add r0, r1, r0 bic r0, r0, #(1 << 16) add r0, r2, r0 - bl i286_memoryread + bl i286a_memoryread strb r0, [r9, #CPU_AL] mov pc, r11 esc CPUWORK #2 - GETPC8 + GETPCF8 cmp r0, #&c0 movcs pc, r11 mov lr, r11 @@ -1493,9 +1551,9 @@ jcxz ldrh r0, [r9, #CPU_CX] mov pc, r11 jcxzj JMPS #8 -in_al_d8 CPUWORK #5 - GETPC8 - add r3, r0, r8 lsr #16 +in_al_d8 GETPCF8 + CPUWORK #5 + add r3, r5, r8 lsr #16 CPUSV str r3, [r9, #CPU_INPUT] bl iocore_inp8 @@ -1506,7 +1564,7 @@ in_al_d8 CPUWORK #5 mov pc, r11 in_ax_d8 CPUWORK #5 - GETPC8 + GETPCF8 CPUSV bl iocore_inp16 CPULD @@ -1514,7 +1572,7 @@ in_ax_d8 CPUWORK #5 mov pc, r11 out_d8_al CPUWORK #3 - GETPC8 + GETPCF8 ldrb r1, [r9, #CPU_AL] CPUSV bl iocore_out8 @@ -1522,18 +1580,17 @@ out_d8_al CPUWORK #3 mov pc, r11 out_d8_ax CPUWORK #3 - GETPC8 + GETPCF8 ldrh r1, [r9, #CPU_AX] CPUSV bl iocore_out16 CPULD mov pc, r11 -call_near CPUWORK #7 - GETPC16 +call_near GETPC16 ldrh r2, [r9, #CPU_SP] ldr r3, [r9, #CPU_SS_BASE] - ; + CPUWORK #7 sub r1, r2, #2 mov r2, r1 lsl #16 strh r1, [r9, #CPU_SP] @@ -1541,13 +1598,13 @@ call_near CPUWORK #7 add r8, r8, r0 lsl #16 add r0, r3, r2 lsr #16 mov lr, r11 - b i286_memorywrite_w + b i286a_memorywrite_w jmp_near ldr r4, [r9, #CPU_CS_BASE] add r5, r8, #(2 << 16) CPUWORK #7 add r0, r4, r8 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w add r8, r5, r0 lsl #16 mov pc, r11 @@ -1556,14 +1613,17 @@ jmp_far CPUWORK #11 add r5, r8, #(2 << 16) mov r6, r8 lsl #16 add r0, r4, r8 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w mov r8, r0 lsl #16 add r0, r4, r5 lsr #16 - bl i286_memoryread_w + bl i286a_memoryread_w + ldrb r1, [r9, #CPU_MSW] add r8, r8, r6 lsr #16 - mov r1, r0 lsl #4 strh r0, [r9, #CPU_CS] - str r1, [r9, #CPU_CS_BASE] + tst r1, #MSW_PE + moveq r0, r0 lsl #4 + blne i286a_selector + str r0, [r9, #CPU_CS_BASE] mov pc, r11 in_al_dx CPUWORK #5 @@ -1619,20 +1679,30 @@ stc CPUWORK #2 mov pc, r11 cli CPUWORK #2 + if 1 + bic r8, r8, #I_FLAG + else mov r0, #0 bic r8, r8, #I_FLAG strb r0, [r9, #CPU_TRAP] + endif mov pc, r11 sti CPUWORK #2 tst r8, #I_FLAG bne sti_noirq sti_set orr r8, r8, #I_FLAG + if 1 + ldr r0, sti_pic + tst r8, #T_FLAG + bne sti_withirq + else mov r1, #(T_FLAG >> 8) ands r1, r1, r8 lsr #8 ldr r0, sti_pic strneb r1, [r9, #CPU_TRAP] bne sti_withirq + endif PICEXISTINTR bne sti_withirq sti_noirq NEXT_OPCODE @@ -1648,48 +1718,6 @@ std CPUWORK #2 mov pc, r11 - MACRO -$label SEGPREFIX $b -$label ldr r1, [r9, $b] - ldrb r6, [r9, #CPU_PREFIX] - add r0, r5, r8 lsr #16 - str r1, [r9, #CPU_SS_FIX] - str r1, [r9, #CPU_DS_FIX] - adr r2, removeprefix - cmp r2, r11 - strne r11, [sp, #-4]! - movne r11, r2 - add r6, r6, #1 - cmp r6, #MAX_PREFIX - bcs prefix_segfault - bl i286_memoryread - ldr r1, [r4, r0 lsl #2] - add r8, r8, #(1 << 16) - strb r6, [r9, #CPU_PREFIX] - mov pc, r1 - MEND - -segprefix_es SEGPREFIX #CPU_ES_BASE -segprefix_cs SEGPREFIX #CPU_CS_BASE -segprefix_ss SEGPREFIX #CPU_SS_BASE -segprefix_ds SEGPREFIX #CPU_DS_BASE - -prefix_fault adr r1, removeprefix - cmp r1, r11 - strne r11, [sp, #-4]! -prefix_segfault sub r8, r8, #(MAX_PREFIX << 16) - mov r6, #6 - mov r11, pc - b i286a_localint -removeprefix ldr r0, [r9, #CPU_SS_BASE] - ldr r1, [r9, #CPU_DS_BASE] - mov r2, #0 - str r0, [r9, #CPU_SS_FIX] - str r1, [r9, #CPU_DS_FIX] - strb r2, [r9, #CPU_PREFIX] - ldr pc, [sp], #4 - - ; ---- cpu execute i286a_step stmdb sp!, {r4 - r11, lr} @@ -1697,22 +1725,79 @@ i286a_step stmdb sp!, {r4 - r11, lr} ldr r10, ias_r10 ; ldr r5, [r9, #CPU_CS_BASE] - ; ldr r7, [r9, #CPU_REMAINCLOCK] - ldr r8, [r9, #CPU_FLAG] + CPULD adr r4, optbl1 add r0, r5, r8 lsr #16 - bl i286_memoryread + bl i286a_memoryread + ldr r1, [r4, r0 lsl #2] + add r8, r8, #(1 << 16) + mov r11, pc + mov pc, r1 + + bl dmax86 + CPUSV + ldmia sp!, {r4 - r11, pc} + + +i286a stmdb sp!, {r4 - r11, lr} + ldr r9, ias_r9 + ldr r2, ias_r1 + ldr r10, ias_r10 + CPULD + ldr r5, [r9, #CPU_CS_BASE] + ldrb r1, [r2, #DMAC_WORKING] + and r0, r8, #(I_FLAG + T_FLAG) + cmp r0, #(I_FLAG + T_FLAG) + beq i286awithtrap + cmp r1, #0 + bne i286awithdma +i286a_lp adr r4, optbl1 + add r0, r5, r8 lsr #16 + GETR0 ldr r1, [r4, r0 lsl #2] add r8, r8, #(1 << 16) mov r11, pc mov pc, r1 + CPUDBGL + cmp r7, #0 + ldrgt r5, [r9, #CPU_CS_BASE] + bgt i286a_lp + CPUSV + ldmia sp!, {r4 - r11, pc} - str r8, [r9, #CPU_FLAG] +ias_r9 dcd i286acore + CPU_SIZE +ias_r1 dcd dmac +ias_r10 dcd iflags + +i286awithdma adr r4, optbl1 + add r0, r5, r8 lsr #16 + GETR0 + ldr r1, [r4, r0 lsl #2] + add r8, r8, #(1 << 16) + mov r11, pc + mov pc, r1 + bl dmax86 + CPUDBGL + cmp r7, #0 + ldrgt r5, [r9, #CPU_CS_BASE] + bgt i286awithdma + CPUSV ldmia sp!, {r4 - r11, pc} -ias_r9 dcd i286core - CPU_REG -ias_r10 dcd _szpcflag8 +i286awithtrap adr r4, optbl1 + add r0, r5, r8 lsr #16 + GETR0 + ldr r1, [r4, r0 lsl #2] + add r8, r8, #(1 << 16) + mov r11, pc + mov pc, r1 + bl dmax86 + and r0, r8, #(I_FLAG + T_FLAG) + cmp r0, #(I_FLAG + T_FLAG) + bleq i286a_trapint + CPUSV + ldmia sp!, {r4 - r11, pc} optbl1 dcd add_ea_r8 ; 00 dcd add_ea_r16 @@ -1754,7 +1839,7 @@ optbl1 dcd add_ea_r8 ; 00 dcd and_r16_ea dcd and_al_d8 dcd and_ax_d16 - dcd 0 ; segprefix_es + dcd segprefix_es dcd daa dcd sub_ea_r8 dcd sub_ea_r16 @@ -1762,7 +1847,7 @@ optbl1 dcd add_ea_r8 ; 00 dcd sub_r16_ea dcd sub_al_d8 dcd sub_ax_d16 - dcd 0 ; segprefix_cs + dcd segprefix_cs dcd das dcd xor_ea_r8 ; 30 @@ -1771,7 +1856,7 @@ optbl1 dcd add_ea_r8 ; 00 dcd xor_r16_ea dcd xor_al_d8 dcd xor_ax_d16 - dcd 0 ; segprefix_ss + dcd segprefix_ss dcd aaa dcd cmp_ea_r8 dcd cmp_ea_r16 @@ -1779,7 +1864,7 @@ optbl1 dcd add_ea_r8 ; 00 dcd cmp_r16_ea dcd cmp_al_d8 dcd cmp_ax_d16 - dcd 0 ; segprefix_ds + dcd segprefix_ds dcd aas dcd inc_ax ; 40 @@ -1922,8 +2007,8 @@ optbl1 dcd add_ea_r8 ; 00 dcd i286asft16_d8 dcd ret_near_d16 dcd ret_near - dcd 0 ; les_r16_ea (now testing i286a_a) - dcd 0 ; lds_r16_ea (now testing i286a_a) + dcd les_r16_ea + dcd lds_r16_ea dcd mov_ea8_d8 dcd mov_ea16_d16 dcd enter @@ -1971,8 +2056,8 @@ optbl1 dcd add_ea_r8 ; 00 dcd lock ; f0 dcd lock - dcd 0 ; repne - dcd 0 ; repe + dcd repne + dcd repe dcd hlt dcd cmc dcd i286aopf6 @@ -1987,15 +2072,58 @@ optbl1 dcd add_ea_r8 ; 00 dcd i286aopff + MACRO +$label SEGPREFIX $b +$label ldr r1, [r9, $b] + ldrb r6, [r9, #CPU_PREFIX] + ;; ldr r5, [r9, #CPU_CS_BASE] + add r0, r5, r8 lsr #16 + str r1, [r9, #CPU_SS_FIX] + str r1, [r9, #CPU_DS_FIX] + cmp r6, #0 + streq r11, [sp, #-4]! + adreq r11, prefix1_remove + add r6, r6, #1 + cmp r6, #MAX_PREFIX + bcs prefix_fault + GETR0 + ldr r1, [r4, r0 lsl #2] + add r8, r8, #(1 << 16) + strb r6, [r9, #CPU_PREFIX] + mov pc, r1 + MEND + +segprefix_es SEGPREFIX #CPU_ES_BASE +segprefix_cs SEGPREFIX #CPU_CS_BASE +segprefix_ss SEGPREFIX #CPU_SS_BASE +segprefix_ds SEGPREFIX #CPU_DS_BASE + +prefix_fault sub r8, r8, #((MAX_PREFIX - 1) << 16) + mov r6, #6 + mov r11, pc + b i286a_localint +prefix1_remove ldr r0, [r9, #CPU_SS_BASE] + ldr r1, [r9, #CPU_DS_BASE] + mov r2, #0 + str r0, [r9, #CPU_SS_FIX] + str r1, [r9, #CPU_DS_FIX] + strb r2, [r9, #CPU_PREFIX] + ldr pc, [sp], #4 + + ; ---- repne repne ldrb r6, [r9, #CPU_PREFIX] adr r4, optblne + ;; ldr r5, [r9, #CPU_CS_BASE] add r0, r5, r8 lsr #16 + cmp r6, #0 + streq r11, [sp, #-4]! + adreq r11, prefix1_remove add r6, r6, #1 cmp r6, #MAX_PREFIX bcs prefix_fault - bl i286_memoryread + GETR0 ldr r1, [r4, r0 lsl #2] add r8, r8, #(1 << 16) strb r6, [r9, #CPU_PREFIX] @@ -2115,10 +2243,10 @@ optblne dcd add_ea_r8 ; 00 dcd imul_r_ea_d16 dcd push_d8 dcd imul_r_ea_d8 - dcd 0 ; i286a_rep_insb - dcd 0 ; i286a_rep_insw - dcd 0 ; i286a_rep_outsb - dcd 0 ; i286a_rep_outsw + dcd i286a_rep_insb + dcd i286a_rep_insw + dcd i286a_rep_outsb + dcd i286a_rep_outsw dcd jo_short ; 70 dcd jno_short @@ -2175,18 +2303,18 @@ optblne dcd add_ea_r8 ; 00 dcd mov_ax_m16 dcd mov_m8_al dcd mov_m16_ax - dcd 0 ; i286a_rep_movsb - dcd 0 ; i286a_rep_movsw - dcd 0 ; i286a_repne_cmpsb - dcd 0 ; i286a_repne_cmpsw + dcd i286a_rep_movsb + dcd i286a_rep_movsw + dcd i286a_repne_cmpsb + dcd i286a_repne_cmpsw dcd test_al_d8 dcd test_ax_d16 - dcd 0 ; i286a_rep_stosb - dcd 0 ; i286a_rep_stosw - dcd 0 ; i286a_rep_lodsb - dcd 0 ; i286a_rep_lodsw - dcd 0 ; i286a_repne_scasb - dcd 0 ; i286a_repne_scasw + dcd i286a_rep_stosb + dcd i286a_rep_stosw + dcd i286a_rep_lodsb + dcd i286a_rep_lodsw + dcd i286a_repne_scasb + dcd i286a_repne_scasw dcd mov_al_imm ; b0 dcd mov_cl_imm @@ -2277,16 +2405,28 @@ optblne dcd add_ea_r8 ; 00 repe ldrb r6, [r9, #CPU_PREFIX] adr r4, optble + ;; ldr r5, [r9, #CPU_CS_BASE] add r0, r5, r8 lsr #16 + cmp r6, #0 + streq r11, [sp, #-4]! + adreq r11, prefix2_remove add r6, r6, #1 cmp r6, #MAX_PREFIX bcs prefix_fault - bl i286_memoryread + GETR0 ldr r1, [r4, r0 lsl #2] add r8, r8, #(1 << 16) strb r6, [r9, #CPU_PREFIX] mov pc, r1 +prefix2_remove ldr r0, [r9, #CPU_SS_BASE] + ldr r1, [r9, #CPU_DS_BASE] + mov r2, #0 + str r0, [r9, #CPU_SS_FIX] + str r1, [r9, #CPU_DS_FIX] + strb r2, [r9, #CPU_PREFIX] + ldr pc, [sp], #4 + optble dcd add_ea_r8 ; 00 dcd add_ea_r16 dcd add_r8_ea @@ -2401,10 +2541,10 @@ optble dcd add_ea_r8 ; 00 dcd imul_r_ea_d16 dcd push_d8 dcd imul_r_ea_d8 - dcd 0 ; i286a_rep_insb - dcd 0 ; i286a_rep_insw - dcd 0 ; i286a_rep_outsb - dcd 0 ; i286a_rep_outsw + dcd i286a_rep_insb + dcd i286a_rep_insw + dcd i286a_rep_outsb + dcd i286a_rep_outsw dcd jo_short ; 70 dcd jno_short @@ -2461,18 +2601,18 @@ optble dcd add_ea_r8 ; 00 dcd mov_ax_m16 dcd mov_m8_al dcd mov_m16_ax - dcd 0 ; i286a_rep_movsb - dcd 0 ; i286a_rep_movsw - dcd 0 ; i286a_repe_cmpsb - dcd 0 ; i286a_repe_cmpsw + dcd i286a_rep_movsb + dcd i286a_rep_movsw + dcd i286a_repe_cmpsb + dcd i286a_repe_cmpsw dcd test_al_d8 dcd test_ax_d16 - dcd 0 ; i286a_rep_stosb - dcd 0 ; i286a_rep_stosw - dcd 0 ; i286a_rep_lodsb - dcd 0 ; i286a_rep_lodsw - dcd 0 ; i286a_repe_scasb - dcd 0 ; i286a_repe_scasw + dcd i286a_rep_stosb + dcd i286a_rep_stosw + dcd i286a_rep_lodsb + dcd i286a_rep_lodsw + dcd i286a_repe_scasb + dcd i286a_repe_scasw dcd mov_al_imm ; b0 dcd mov_cl_imm