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


I286_MEMREADMAX		equ		&a4000
I286_MEMWRITEMAX	equ		&a0000

USE_HIMEM			equ		&110000

; cpu_reg			equ		0
; cpu_remainclock	equ		28
; cpu_baseclock		equ		32
; cpu_clock			equ		36
; cpu_adrsmask		equ		40
; cpu_es_base		equ		44
; cpu_cs_base		equ		48
; cpu_ss_base		equ		52
; cpu_ds_base		equ		56
; cpu_ss_fix		equ		60
; cpu_ds_fix		equ		64
; cpu_prefix		equ		68
; cpu_trap			equ		70
; cpu_type			equ		71
; cpu_pf_semaphore	equ		72
; cpu_repbak		equ		76
; cpu_inport		equ		80
; cpu_ovflag		equ		84
; cpu_GDTR			equ		88
; cpu_IDTR			equ		94
; cpu_MSW			equ		100
; cpu_resetreq		equ		102
; cpu_itfbank		equ		103
CPU_EXTMEM			equ		104
CPU_EXTMEMSIZE		equ		108
CPU_MAINMEM			equ		112


;	IMPORT	mem
	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

	MACRO
$label	MEMADR	$offset
$label	dcd		(i286core + CPU_MAINMEM) $offset
	MEND

	AREA	.text, CODE, READONLY

i286_memoryread
i286a_memoryread
				cmp		r0, #I286_MEMREADMAX
				bcs		i2mr_ext
				ldr		r1, i2mr_mem
				ldrb	r0, [r0, r1]
				mov		pc, lr
i2mr_mem		MEMADR											; !!
i2mr_ext		cmp		r0, #USE_HIMEM
				bcs		i2mr_himem
				ldr		r3, i2mr_memfnrd8
				and		r1, r0, #(&1f << 15)
				ldr		pc, [r3, r1, lsr #(15 - 2)]
i2mr_memfnrd8	dcd		memfn
i2mr_himem		sub		r1, r0, #&100000
				ldr		r3, i2mr_cpu
				ldr		r12, [r3, #CPU_EXTMEMSIZE]
				cmp		r1, r12
				bcs		i286_nonram_r
				ldr		r12, [r3, #CPU_EXTMEM]
				ldrb	r0, [r1, r12]
				mov		pc, lr
i2mr_cpu		dcd		i286core								; !!


i286_memoryread_w
i286a_memoryread_w
				tst		r0, #1
				bne		i2mro_main
				cmp		r0, #I286_MEMREADMAX
				bcs		i2mre_ext
				ldr		r1, i2mrw_mem
				ldrh	r0, [r0, r1]
				mov		pc, lr
i2mrw_mem		MEMADR
i2mre_ext		cmp		r0, #USE_HIMEM
				bcs		i2mre_himem
i2mrw_ext		ldr		r3, i2mre_memfnrd16
				and		r1, r0, #(&1f << 15)
				ldr		pc, [r3, r1, lsr #(15 - 2)]
i2mre_memfnrd16	dcd		memfn + (32 * 4) * 2
i2mre_himem		sub		r1, r0, #&100000
				ldr		r3, i2mre_cpu
				ldr		r12, [r3, #CPU_EXTMEMSIZE]
				cmp		r1, r12
				bcs		i286_nonram_rw
				ldr		r12, [r3, #CPU_EXTMEM]
				ldrh	r0, [r1, r12]
				mov		pc, lr
i2mre_cpu		dcd		i286core								; !!
i2mro_main		add		r1, r0, #1
				cmp		r1, #I286_MEMREADMAX
				bcs		i2mro_ext
				ldr		r1, i2mrw_mem
				add		r1, r1, r0
				ldrb	r0, [r1]
				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 - r6, lr}			; ここチェックするように…
				ldr		r4, i2mro_memfnrd8
				add		r5, r0, #1
					and		r1, r0, #(&1f << 15)
					mov		lr, pc
					ldr		pc, [r4, r1, lsr #(15 - 2)]
				mov		r6, r0
				mov		r0, r5
					and		r1, r0, #(&1f << 15)
					mov		lr, pc
					ldr		pc, [r4, r1, lsr #(15 - 2)]
				add		r0, r6, r0 lsl #8
				ldmia	sp!, {r4 - r6, pc}
i2mro_memfnrd8	dcd		memfn
i2mro_himem		sub		r1, r1, #&100000
				ldr		r3, i2mro_cpu
				ldr		r2, [r3, #CPU_EXTMEM]
				ldr		r12, [r3, #CPU_EXTMEMSIZE]
				add		r2, r2, r1
				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	ldr		r0, i2mro_mem10ffff
				ldrb	r0, [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	add		r0, r0, #&ff00
				mov		pc, lr
i2mro_cpu		dcd		i286core								; !!
i2mro_mem10ffff	MEMADR	+ USE_HIMEM - 1


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


i286_memorywrite_w
i286a_memorywrite_w
				tst		r0, #1
				bne		i2mwo_main
				cmp		r0, #I286_MEMWRITEMAX
				bcs		i2mwe_ext
				ldr		r2, i2mww_mem
				strh	r1, [r0, r2]
				mov		pc, lr
i2mww_mem		MEMADR											; !!
i2mwe_ext		cmp		r0, #USE_HIMEM
				bcs		i2mwe_himem
i2mww_ext		ldr		r3, i2mwe_memfnwr16
				and		r2, r0, #(&1f << 15)
				ldr		pc, [r3, r2, lsr #(15 - 2)]
i2mwe_memfnwr16	dcd		memfn + (32 * 4) * 3
i2mwe_himem		sub		r2, r0, #&100000
				ldr		r3, i2mwe_cpu
				ldr		r12, [r3, #CPU_EXTMEMSIZE]
				ldr		r3, [r3, #CPU_EXTMEM]
				cmp		r2, r12
				strcch	r1, [r2, r3]
				mov		pc, lr
i2mwe_cpu		dcd		i286core								; !!

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

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

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

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

	END


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