File:  [Atari MiNT] / MiNT / src / cpu.spp
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:57:15 2018 UTC (8 years, 1 month ago) by root
Branches: mint, MAIN
CVS tags: mint112, mint110, mint108, HEAD
MiNT 1.08

;

; CPU tricks (mostly having to do with the MMU)

;

;

; set_mmu(crp,tc): called once, the first time a page table is built, to 

; switch away from the MMU setup that came from the ROM and into the setup 

; that we just built.  The CRP is actually on the stack, and it's 8 bytes.

; The TC is four bytes at sp@(0xc).  "Nulls" is here because we need to

; shove zeros into a few places.

;

	DATA

nulltc:	dc.l	0



	TEXT

	XDEF	_set_mmu

_set_mmu:

	pmove	(nulltc).l,tc		; turn off mmu

	dc.l	$f0390800,nulltc	; pmove nulltc,tt0

	dc.l	$f0390c00,nulltc	; pmove nulltc,tt1

	pmove	4(sp),crp		; caution: crp is 8 bytes

	pmove	$c(sp),tc

	rts

;

; save_mmu, restr_mmu: save and restore the MMU setup that came from ROM

;

	DATA

oldcrp:	dc.l	0

	dc.l	0

oldtc:	dc.l	0

oldtt0:	dc.l	0

oldtt1:	dc.l	0



	TEXT

	XDEF	_save_mmu

_save_mmu:

	pmove	tc,oldtc

	dc.l	$f0390a00,oldtt0	; pmove	tt0,oldtt0

	dc.l	$f0390e00,oldtt1	; pmove	tt1,oldtt1

	pmove	crp,oldcrp

	rts



	XDEF	_restr_mmu

_restr_mmu:

	pmove	(nulltc).l,tc

	dc.l	$f0390800,oldtt0	; pmove	oldtt0,tt0

	dc.l	$f0390c00,oldtt1	; pmove	oldtt1,tt1

	pmove	oldcrp,crp

	pmove	oldtc,tc

	rts

;

; Cache tricks

;

	XDEF	_cpush

	XREF	_mcpu		; in main.c

;

; cpush(void *base, long length):

; flush both caches from base over a distance of length. If length is -1

; then the entire cache is flushed

;

_cpush:

	movem.l	4(a7),d0/a0	; get parameters

	exg	a0,d0		; and in the right order

	move.l	_mcpu,d1	; start checking the CPU type

	cmp.l	#20,d1

	bcs.s	noc

	cmp.l	#40,d1

	bne.s	is030

	

	addq.l	#1,d0		; if was -1

	beq.s	abc040		; then flush everything

	add.l	#14,d0		; round up to line boundary

	lsr.l	#4,d0		; convert to number of lines

	cmp.l	#256,d0

	bcs.s	fls040		; not too many lines, so dump only some



abc040:	dc.w	$F4F8		; this is "cpusha bc" if your asm knows '040

	bra.s	noc

	

; run through d0+1 times (since a0 may not be on a line boundary)

fls040:	moveq	#16,d1

do040:	dc.w	$F4E8		; this is "cpushl bc,(a0)" for the '040

	add.w	d1,a0

	dbf	d0,do040

	bra.s	noc



is030:

	movec	cacr,d1

	move.l	d1,-(a7)

	addq.l	#1,d0		; if was -1

	beq.s	abc030		; then flush everything

	addq.l	#2,d0		; round up to long boundary

	lsr.l	#2,d0		; convert to number of longs

	cmp.l	#64,d0

	bcs.s	fls030		; dump selectively

	

abc030:	or.w	#$808,d1

	movec	d1,cacr

	bra.s	rescacr



fls030:	or.w	#$404,d1	; clear DC/IC entries

; run through d0+1 times (since a0 may not be on a long boundary)

do030:	movec	a0,caar

	movec	d1,cacr

	addq.w	#4,a0

	dbf	d0,do030

rescacr:

	move.l	(a7)+,d0

	movec	d0,cacr

noc:	rts



;

; Set the stack pointer to a new value

; Called when we're starting GEM from the exec_os vector



	XDEF	_setstack

_setstack:

	move.l	(sp)+,a0	; pop return address

	move.l	(sp)+,sp	; set stack pointer

	jmp	(a0)		; return



;

; PMMU stuff

;

	XDEF	_flush_pmmu

_flush_pmmu:

	pflusha

	rts

	END


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.