File:  [RetroPC.NET] / np2 / i286a / i286a_i.s
Revision 1.11: download - view: text, annotated - select for diffs
Wed Jan 7 21:51:29 2004 JST (21 years, 9 months ago) by yui
Branches: MAIN
CVS tags: VER_0_82_x64, VER_0_82, VER_0_81A, VER_0_81, VER_0_80, VER_0_79, VER_0_78, VER_0_77, VER_0_76, VER_0_75, VER_0_74, VER_0_73, HEAD
fix i286a (T.Yui)


	INCLUDE		i286a.inc

	IMPORT		i286acore
	IMPORT		i286a_memoryread
	IMPORT		i286a_memorywrite_w
	EXPORT		i286a_localint
	EXPORT		i286a_trapint
;;	IMPORT		i286a_trapintr
;;	EXPORT		i286c_interrupt
	EXPORT		i286a_interrupt

	AREA	.text, CODE, READONLY

				; r6 - num / r8 - IP / r11 - ret
i286a_localint	ldrh	r4, [r9, #CPU_SP]
				ldr		r5, [r9, #CPU_SS_BASE]
				CPUWORK	#20
				mov		r4, r4 lsl #16
				sub		r4, r4, #(2 << 16)
				mov		r1, r8
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				ldrh	r1, [r9, #CPU_CS]
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				mov		r1, r8 lsr #16
				mov		r4, r4 lsr #16
				sub		r8, r8, r1 lsl #16
				add		r0, r4, r5
				strh	r4, [r9, #CPU_SP]
				bl		i286a_memorywrite_w
			;;	mov		r0, #0
				ldr		r1, [r9, r6 lsl #2]
			;;	strb	r0, [r9, #CPU_TRAP]
				bic		r8, r8, #(T_FLAG + I_FLAG)
				mov		r0, r1 lsr #16
				orr		r8, r8, r1 lsl #16
				mov		r2, r0 lsl #4
				strh	r0, [r9, #CPU_CS]
				str		r2, [r9, #CPU_CS_BASE]
				mov		pc, r11

i286a_trapint	mov		r6, lr
				ldrh	r4, [r9, #CPU_SP]
				ldr		r5, [r9, #CPU_SS_BASE]
				CPUWORK	#20
				mov		r4, r4 lsl #16
				sub		r4, r4, #(2 << 16)
				mov		r1, r8
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				ldrh	r1, [r9, #CPU_CS]
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				mov		r1, r8 lsr #16
				mov		r4, r4 lsr #16
				sub		r8, r8, r1 lsl #16
				add		r0, r4, r5
				strh	r4, [r9, #CPU_SP]
				bl		i286a_memorywrite_w
			;;	mov		r0, #0
				ldr		r1, [r9, #4]
			;;	strb	r0, [r9, #CPU_TRAP]
				bic		r8, r8, #(T_FLAG + I_FLAG)
				mov		r0, r1 lsr #16
				orr		r8, r8, r1 lsl #16
				mov		r2, r0 lsl #4
				strh	r0, [r9, #CPU_CS]
				str		r2, [r9, #CPU_CS_BASE]
				mov		pc, r6

;; i286c_interrupt
i286a_interrupt	ldr		r1, iai_r9
				stmdb	sp!, {r4 - r9, lr}
				mov		r9, r1
				mov		r6, r0
				CPULD
				ldr		r5, [r9, #CPU_CS_BASE]
				ldrh	r4, [r9, #CPU_SP]
				CPUWORK	#20
				add		r0, r5, r8 lsr #16
				ldr		r5, [r9, #CPU_SS_BASE]
				bl		i286a_memoryread
				mov		r4, r4 lsl #16
				cmp		r0, #&f4
				addeq	r8, r8, #(1 << 16)
				sub		r4, r4, #(2 << 16)
				mov		r1, r8
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				ldrh	r1, [r9, #CPU_CS]
				add		r0, r5, r4 lsr #16
				bl		i286a_memorywrite_w
				sub		r4, r4, #(2 << 16)
				mov		r1, r8 lsr #16
				mov		r4, r4 lsr #16
				sub		r8, r8, r1 lsl #16
				add		r0, r4, r5
				strh	r4, [r9, #CPU_SP]
				bl		i286a_memorywrite_w
			;;	mov		r0, #0
				ldr		r1, [r9, r6 lsl #2]
			;;	strb	r0, [r9, #CPU_TRAP]
				bic		r8, r8, #(T_FLAG + I_FLAG)
				mov		r0, r1 lsr #16
				orr		r8, r8, r1 lsl #16
				mov		r2, r0 lsl #4
				strh	r0, [r9, #CPU_CS]
				str		r2, [r9, #CPU_CS_BASE]
				CPUSV
				ldmia	sp!, {r4 - r9, pc}
iai_r9			dcd		i286acore + CPU_SIZE

	END


RetroPC.NET-CVS <cvs@retropc.net>