File:  [RetroPC.NET] / np2 / i286a / i286a_i.s
Revision 1.10: download - view: text, annotated - select for diffs
Wed Jan 7 15:53:47 2004 JST (21 years, 9 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix cpu,rom (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	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]
				b		i286a_trapintr

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>