--- np2/i286a/i286a_mn.s 2004/01/07 06:53:47 1.21 +++ np2/i286a/i286a_mn.s 2005/02/08 10:34:30 1.26 @@ -9,7 +9,7 @@ IMPORT iflags IMPORT i286a_localint IMPORT i286a_trapint - EXPORT i286a_trapintr + IMPORT i286a_selector IMPORT i286a_ea IMPORT i286a_lea IMPORT i286a_a @@ -24,7 +24,7 @@ IMPORT iocore_out8 IMPORT iocore_out16 - IMPORT dmap_i286 + IMPORT dmax86 IMPORT biosfunc IMPORT i286a_cts @@ -701,7 +701,7 @@ xchg_ea_r16 EAREG16 r6 strh r1, [r6, #CPU_REG] mov pc, r11 xchgear16_1 bl i286a_ea - WORDACC r0, xchgear16_2 + ACCWORD r0, xchgear16_2 ldrh r1, [r6, #CPU_REG] ldrh r4, [r9, r0] CPUWORK #5 @@ -781,9 +781,12 @@ leareg mov r6, #6 sub r8, r8, #(2 << 16) b i286a_localint -mov_seg_ea GETPCF8 +mov_seg_ea ldrb r6, [r9, #CPU_MSW] + GETPCF8 adr r2, msegea_tbl and r1, r0, #(3 << 3) + tst r6, #MSW_PE + orrne r1, r1, #(4 << 3) mov r6, r8 ldr r2, [r2, r1 lsr #1] cmp r0, #&c0 @@ -801,6 +804,10 @@ 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] @@ -815,10 +822,27 @@ msegea_ss mov r1, r0 lsl #4 str r1, [r9, #CPU_SS_BASE] str r1, [r9, #CPU_SS_FIX] NEXT_OPCODE + +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 r6, r0 GETPCF8 @@ -895,10 +919,13 @@ call_far CPUWORK #13 add r8, r8, #(2 << 16) mov r4, r0 lsl #16 add r0, r5, r8 lsr #16 + ldrb r5, [r9, #CPU_MSW] bl i286a_memoryread_w - mov r1, r0 lsl #4 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 @@ -1174,10 +1201,13 @@ les_r16_ea GETPCF8 bl i286a_memoryread_w strh r0, [r5, #CPU_REG] add r0, r4, r6 + ldrb r4, [r9, #CPU_MSW] bl i286a_memoryread_w - mov r1, r0 lsl #4 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) @@ -1195,11 +1225,14 @@ lds_r16_ea GETPCF8 bl i286a_memoryread_w strh r0, [r5, #CPU_REG] add r0, r4, r6 + ldrb r4, [r9, #CPU_MSW] bl i286a_memoryread_w - mov r1, r0 lsl #4 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 GETPCF8 @@ -1321,10 +1354,13 @@ ret_far_d16 GETPC16 add r4, r4, #2 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 ldrh r1, [r9, #CPU_SP] @@ -1340,10 +1376,13 @@ ret_far ldrh r1, [r9, #CPU_SP] add r0, r4, r5 add r4, r4, #2 bl i286a_memoryread_w - 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 int_03 CPUWORK #3 @@ -1361,8 +1400,7 @@ into CPUWORK #4 mov r6, #4 b i286a_localint -iret bl extirq_pop - ldrh r1, [r9, #CPU_SP] +iret ldrh r1, [r9, #CPU_SP] ldr r5, [r9, #CPU_SS_BASE] CPUWORK #31 add r4, r1, #2 @@ -1579,10 +1617,13 @@ jmp_far CPUWORK #11 mov r8, r0 lsl #16 add r0, r4, r5 lsr #16 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 @@ -1662,7 +1703,7 @@ sti_set orr r8, r8, #I_FLAG strneb r1, [r9, #CPU_TRAP] bne sti_withirq endif - PICEXISTINTR sti_noirq + PICEXISTINTR bne sti_withirq sti_noirq NEXT_OPCODE sti_pic dcd pic @@ -1694,7 +1735,7 @@ i286a_step stmdb sp!, {r4 - r11, lr} mov r11, pc mov pc, r1 - bl dmap_i286 + bl dmax86 CPUSV ldmia sp!, {r4 - r11, pc} @@ -1736,7 +1777,7 @@ i286awithdma adr r4, optbl1 add r8, r8, #(1 << 16) mov r11, pc mov pc, r1 - bl dmap_i286 + bl dmax86 CPUDBGL cmp r7, #0 ldrgt r5, [r9, #CPU_CS_BASE] @@ -1751,11 +1792,11 @@ i286awithtrap adr r4, optbl1 add r8, r8, #(1 << 16) mov r11, pc mov pc, r1 - bl dmap_i286 + bl dmax86 and r0, r8, #(I_FLAG + T_FLAG) cmp r0, #(I_FLAG + T_FLAG) - beq i286a_trapint -i286a_trapintr CPUSV + bleq i286a_trapint + CPUSV ldmia sp!, {r4 - r11, pc} optbl1 dcd add_ea_r8 ; 00