File:  [RetroPC.NET] / np2 / i286a / memoryd.s
Revision 1.6: download - view: text, annotated - select for diffs
Sat Dec 20 19:27:55 2003 JST (21 years, 10 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix i286a (T.Yui)


	INCLUDE	i286a.inc
	INCLUDE	i286amem.inc

	IMPORT	memfn
	IMPORT	i286core
	IMPORT	i286_nonram_r
	IMPORT	i286_nonram_rw

	EXPORT	i286_memoryread
	EXPORT	i286_memoryread_w
	EXPORT	i286_memorywrite
	EXPORT	i286_memorywrite_w

	EXPORT	i286a_memoryread
	EXPORT	i286a_memoryread_w
	EXPORT	i286a_memorywrite
	EXPORT	i286a_memorywrite_w

	AREA	.text, CODE, READONLY

i286_memoryread
i286a_memoryread
				ldr		r3, i2mr_cpu
				cmp		r0, #I286_MEMREADMAX
				bcs		i2mr_ext
				ldrb	r0, [r3, r0]
				mov		pc, lr
i2mr_cpu		dcd		i286core + CPU_SIZE
i2mr_ext		cmp		r0, #USE_HIMEM
				bcs		i2mr_himem
				stmdb	sp!, {r7, r9, lr}
				ldr		r2, i2mr_memfnrd8
				and		r12, r0, #(&1f << 15)
				mov		r9, r3						; cpu
				ldr		r2, [r2, r12 lsr #(15 - 2)]
				CPULDC
				mov		lr, pc
				mov		pc, r2
				CPUSVC
				ldmia	sp!, {r7, r9, pc}
i2mr_memfnrd8	dcd		memfn
i2mr_himem		ldr		r12, [r3, #CPU_EXTMEMSIZE]
				ldr		r2, [r3, #CPU_EXTMEM]
				sub		r1, r0, #&100000
				cmp		r1, r12
				bcs		i286_nonram_r
				ldrb	r0, [r2, r1]
				mov		pc, lr


i286_memoryread_w
i286a_memoryread_w
				ldr		r3, i2mrw_cpu
				tst		r0, #1
				bne		i2mro_main
				cmp		r0, #I286_MEMREADMAX
				bcs		i2mre_ext
				ldrh	r0, [r3, r0]
				mov		pc, lr
i2mrw_cpu		dcd		i286core + CPU_SIZE
i2mre_ext		cmp		r0, #USE_HIMEM
				bcs		i2mre_himem
i2mrw_ext		stmdb	sp!, {r7, r9, lr}
				ldr		r2, i2mre_memfnrd16
				and		r12, r0, #(&1f << 15)
				mov		r9, r3						; cpu
				ldr		r2, [r2, r12 lsr #(15 - 2)]
				CPULDC
				mov		lr, pc
				mov		pc, r2
				CPUSVC
				ldmia	sp!, {r7, r9, pc}
i2mre_memfnrd16	dcd		memfn + (32 * 4) * 2
i2mre_himem		ldr		r12, [r3, #CPU_EXTMEMSIZE]
				ldr		r12, [r3, #CPU_EXTMEM]
				sub		r1, r0, #&100000
				cmp		r1, r12
				bcs		i286_nonram_rw
				ldrh	r0, [r1, r2]
				mov		pc, lr
i2mro_main		add		r1, r0, #1
				cmp		r1, #I286_MEMREADMAX
				bcs		i2mro_ext
				add		r1, r3, r0
				ldrb	r0, [r3, r0]
				ldrb	r1, [r1, #1]
				add		r0, r0, r1 lsl #8
				mov		pc, lr
i2mro_ext		cmp		r1, #USE_HIMEM
				bcs		i2mro_himem
				movs	r1, r1, lsl #(32 - 15)
				bne		i2mrw_ext
				stmdb	sp!, {r4 - r7, r9, lr}		; ここチェックするように…
				ldr		r4, i2mro_memfnrd8
				mov		r9, r3
					and		r1, r0, #(&1f << 15)
				CPULDC
					ldr		r2, [r4, r1 lsr #(15 - 2)]
				add		r5, r0, #1
					mov		lr, pc
					mov		pc, r2
					and		r1, r5, #(&1f << 15)
				mov		r6, r0
					ldr		r2, [r4, r1, lsr #(15 - 2)]
				mov		r0, r5
					mov		lr, pc
					mov		pc, r2
				add		r0, r6, r0 lsl #8
				CPUSVC
				ldmia	sp!, {r4 - r7, r9, pc}
i2mro_memfnrd8	dcd		memfn
i2mro_himem		ldr		r2, [r3, #CPU_EXTMEM]
				ldr		r12, [r3, #CPU_EXTMEMSIZE]
				sub		r1, r1, #&100000
				add		r2, r1, r2
				beq		i2mro_10ffff			; = 10ffff
				cmp		r1, r12
				bcs		i2mro_himeml			; = over
				ldrb	r0, [r2, #-1]
				ldrb	r1, [r2]
				add		r0, r0, r1 lsl #8
				mov		pc, lr
i2mro_10ffff	ldrb	r0, [r3, r0]
				cmp		r1, r12
				bcs		i2mro_himemh
				ldrb	r1, [r2]
				add		r0, r0, r1 lsl #8
				mov		pc, lr
i2mro_himeml	ldreqb	r0, [r2, #-1]
				movne	r0, #&ff
i2mro_himemh	orr		r0, r0, #&ff00
				mov		pc, lr


i286_memorywrite
i286a_memorywrite
				ldr		r3, i2mw_cpu
				cmp		r0, #I286_MEMWRITEMAX
				bcs		i2mw_ext
				strb	r1, [r3, r0]
				mov		pc, lr
i2mw_cpu		dcd		i286core + CPU_SIZE						; !!
i2mw_ext		cmp		r0, #USE_HIMEM
				bcs		i2mw_himem
				stmdb	sp!, {r7, r9, lr}
				ldr		r2, i2mw_memfnwr8
				and		r12, r0, #(&1f << 15)
				mov		r9, r3
				ldr		r2, [r2, r12, lsr #(15 - 2)]
				CPULDC
				mov		lr, pc
				mov		pc, r2
				CPUSVC
				ldmia	sp!, {r7, r9, pc}
i2mw_memfnwr8	dcd		memfn + (32 * 4)
i2mw_himem		ldr		r12, [r3, #CPU_EXTMEMSIZE]
				ldr		r3, [r3, #CPU_EXTMEM]
				sub		r2, r0, #&100000
				cmp		r2, r12
				strccb	r1, [r3, r2]
				mov		pc, lr


i286_memorywrite_w
i286a_memorywrite_w
				ldr		r3, i2mww_cpu
				tst		r0, #1
				bne		i2mwo_main
				cmp		r0, #I286_MEMWRITEMAX
				bcs		i2mwe_ext
				strh	r1, [r3, r0]
				mov		pc, lr
i2mww_cpu		dcd		i286core + CPU_SIZE						; !!
i2mwe_ext		cmp		r0, #USE_HIMEM
				bcs		i2mwe_himem
i2mww_ext		stmdb	sp!, {r7, r9, lr}
				ldr		r2, i2mwe_memfnwr16
				and		r12, r0, #(&1f << 15)
				mov		r9, r3						; cpu
				ldr		r2, [r2, r12 lsr #(15 - 2)]
				CPULDC
				mov		lr, pc
				mov		pc, r2
				CPUSVC
				ldmia	sp!, {r7, r9, pc}
i2mwe_memfnwr16	dcd		memfn + (32 * 4) * 3
i2mwe_himem		ldr		r12, [r3, #CPU_EXTMEMSIZE]
				ldr		r3, [r3, #CPU_EXTMEM]
				sub		r2, r0, #&100000
				cmp		r2, r12
				strcch	r1, [r2, r3]
				mov		pc, lr

i2mwo_main		add		r2, r0, #1
				cmp		r2, #I286_MEMWRITEMAX
				bcs		i2mwo_ext
				add		r2, r3, r0
				mov		r12, r1 lsr #8
				strb	r1, [r3, r0]
				strb	r12, [r2, #1]
				mov		pc, lr

i2mwo_ext		cmp		r2, #USE_HIMEM
				bcs		i2mwo_himem
				movs	r2, r2, lsl #(32 - 15)
				bne		i2mww_ext

				stmdb	sp!, {r4 - r7, r9, lr}		; ここチェックするように…
				ldr		r4, i2mwo_memfnwr8
				mov		r9, r3
					and		r12, r0, #(&1f << 15)
				CPULDC
					ldr		r2, [r4, r12 lsr #(15 - 2)]
				add		r5, r0, #1
				mov		r6, r1 lsr #8
					mov		lr, pc
					mov		pc, r2
					and		r12, r5, #(&1f << 15)
				mov		r0, r5
					ldr		r2, [r4, r12, lsr #(15 - 2)]
				mov		r1, r6
					mov		lr, pc
					mov		pc, r2
				CPUSVC
				ldmia	sp!, {r4 - r7, r9, pc}
i2mwo_memfnwr8	dcd		memfn + (32 * 4)

i2mwo_himem		ldr		r12, [r3, #CPU_EXTMEM]
				ldr		r0, [r3, #CPU_EXTMEMSIZE]
				sub		r2, r2, #&100000
				add		r12, r2, r12
				beq		i2mwo_10ffff			; = 10ffff
				cmp		r2, r0
				mov		r2, r1 lsr #8
				strlsb	r1, [r12, #-1]
				strccb	r2, [r12]
				mov		pc, lr
i2mwo_10ffff	add		r3, r3, #USE_HIMEM
				mov		r2, r1 lsr #8
				strb	r1, [r3, #-1]
				cmp		r0, #0
				strneb	r1, [r12]
				mov		pc, lr

	END


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