; V3.3
; Startupcode by Raw Style / Complex 1990 - 1994 !!
;
; 03-11-94	bug fix: vbr reloc & nocache worked only if mincpu>0! V3.3
;
; FEATURES:
; - Switching off _all_ AGA features
; - Checking of CPU, FPU and ChipSet
; - Switching off caches
; - Several hunk combinations of code/data possible
; - 'noreturn' flag -> reducing of code
; - Possibility of calling another routine before actually starting
; - Workbench Startup Code (can be switched off of course)
; - Returns d7 from Main-Program --> Packmenu-Selection

		IFND	mincpu		;for Compatibility with older sources
mincpu		equ	0
		ENDC
		IFND	minfpu
minfpu		equ	0
		ENDC
		IFND	minchips
minchips	equ	0
		ENDC
		IFND	nocache
nocache		equ	0
		ENDC
		IFND	newheader
newheader	equ	0
		ENDC
		IFND	onehunk
onehunk		equ	0
		ENDC
		IFND	noreturn
noreturn	equ	0
		ENDC
		IFND	preroutine
preroutine	equ	0
		ENDC
		IFND	nowbstartup
nowbstartup	equ	0
		ENDC

bltcon0		equ	$40
bltcon1		equ	$42
bltafwm		equ	$44
bltalwm		equ	$46
bltcpt		equ	$48
bltbpt		equ	$4c
bltapt		equ	$50
bltdpt		equ	$54
bltsize		equ	$58
bltcmod		equ	$60
bltbmod		equ	$62
bltamod		equ	$64
bltdmod		equ	$66
bltadat		equ	$74
bltbdat		equ	$72
bltcdat		equ	$70
bltsizv		equ	$5c
bltsizh		equ	$5e

wblt		macro
.wblt\@		btst	#6,$2(a6)
		bne.s	.wblt\@
		endm

		section	startup,code_c

		IFEQ	nowbstartup
start		movem.l	d0/a0,-(sp)	;Startupcode
		moveq	#0,d7		;Amiga Sonderheft 2/93
		move.l	4.w,a6		;Seite 14
		move.l	276(a6),a0
		tst.l	172(a0)
		bne.s	.VomCLI
.VonWB		lea	92(a0),a0
		move.l	a0,a2
		jsr	-384(a6)
		move.l	a2,a0
		jsr	-372(a6)
		move.l	d0,d7
.VomCLI		movem.l	(sp)+,d0/a0
		move.l	d7,wbmessy
		bsr	j
		move.l	wbmessy(pc),d7
		beq.s	.exit
		move.l	4.w,a6
		jsr	-132(a6)
		move.l	d7,a1
		jsr	-378(a6)
.exit		moveq	#0,d0
		rts

wbmessy		dc.l	0
		ENDC

j
		ifne	preroutine
		jsr	prerout
		endc

		move.l	4.w,a6
		ifeq	noreturn
		lea	.data(pc),a4
		endc

		move.w	296(a6),d6

		ifgt	mincpu		;Test Processor
		btst	#mincpu-1,d6
		beq.w	.error_wrongcpu
		endc
		ifgt	minfpu
		btst	#minfpu+3,d6
		beq.w	.error_wrongfpu
		endc

		lea	.gfxname(pc),a1	;Test ChipSet
		jsr	-408(a6)
		move.l	d0,a3

		ifgt	minchips
		cmp.w	#36,20(a3)	;lib_Version
		bcs.s	.testchips
		move.b	236(a3),d0	;ChipRevBits0

		ifeq	minchips-1
		btst	#1,d0
		beq.w	.error_wrongchips
		endc

		ifeq	minchips-2
		btst	#1,d0
		beq.w	.error_wrongchips
		move.w	$dff07c,d0
		cmp.b	#$f9,d0
		bhi.w	.error_wrongchips
		endc

		bra.s	.cont0

.testchips	move.w	$dff07c,d0

		ifeq	minchips-1
		cmp.b	#$fd,d0
		bhi	.error_wrongchips
		endc

		ifeq	minchips-2
		cmp.b	#$f9,d0
		bhi	.error_wrongchips
		endc

		endc

.cont0
		ifeq	noreturn
		move.l	$22(a3),(a4)
		move.l	$26(a3),4(a4)
		move.l	$32(a3),8(a4)
		endc
		move.l	4.w,a6
		jsr	-120(a6)	;Disable
		sub.l	a1,a1
		move.l	a3,a6
		jsr	-222(a6)	;LoadView(NULL)
		lea	$dff000,a6
		lea	.emptycop(pc),a0
		move.l	a0,$80(a6)
		move.l	a0,$84(a6)
		ifeq	noreturn
		move.w	$1c(a6),12(a4)
		move.w	$2(a6),16(a4)
		move.w	$10(a6),20(a4)
		endc
		move.w	#$7fff,$9a(a6)
		wblt
		wblt
		move.w	#$7fff,$96(a6)
		move.w	#$7fff,$9c(a6)
		move.w	#$0020,$1dc(a6)	;PAL
		move.w	#$0c40,$106(a6)
		move.w	#$0200,$100(a6)
		move.w	#$0011,$10c(a6)
		lea	$120(a6),a6
		moveq	#$60/4-1,d0
		moveq	#0,d1
.clearspr	move.l	d1,(a6)+
		dbra	d0,.clearspr
		lea	.super1(pc),a5	;VBR auf 0 und Table kopieren !
		move.l	4.w,a6
		jsr	-30(a6)

		ifeq	noreturn
		movem.l	a4/a3/d6,-(sp)
		endc
		move.l	#MAIN,$80.w
		trap	#0
		ifeq	noreturn
		movem.l	(sp)+,a4/a3/d6

		lea	$dff000,a6
		move.w	#$7fff,$9a(a6)
		wblt
		move.w	#$7fff,$96(a6)
		move.l	#.super2,$80.w	;Table und VBR zurückkopieren
		trap	#0
		move.l	4(a4),$80(a6)
		move.l	8(a4),$84(a6)
		move.w	16(a4),d0
		or.w	#$8000,d0
		move.w	d0,$96(a6)		
		move.w	20(a4),d0
		or.w	#$8000,d0
		move.w	d0,$9e(a6)
		move.w	12(a4),d0
		or.w	#$c000,d0
		move.w	#$7fff,$9c(a6)
		move.w	d0,$9a(a6)
		move.w	d0,$88(a6)
		move.l	4.w,a6
		jsr	-126(a6)	;Enable
		move.l	(a4),a1
		move.l	a3,a6
		jsr	-222(a6)	;LoadView(OLD)

		move.l	4.w,a6
		bsr.s	.closegfx
.quit0		moveq	#0,d0
		rts
		endc

		ifgt	mincpu
.error_wrongcpu	lea	.mincputext(pc),a2
		move.b	#mincpu+48,17(a2)
		bsr	.alert
		endc
.quit20		moveq	#20,d0
		rts

		ifgt	minfpu
.error_wrongfpu	lea	.minfputext(pc),a2
		move.b	#minfpu+48,22(a2)
		bsr	.alert
		bra.s	.quit20
		endc

		ifgt	minchips
.error_wrongchips
		lea	.minchipstext(pc),a2
		bsr	.alert
		endc
.quitclosegfx20	bsr.s	.closegfx
		bra.s	.quit20

.closegfx	move.l	a3,a1
		move.l	4.w,a6
		jmp	-414(a6)

		ifgt	mincpu!minfpu!minchips
.alert		;Alerttext in a2, Rückgabewert in d2 !
		lea	.intname(pc),a1
		jsr	-408(a6)
		move.l	d0,a6
		move.l	a2,a0
		moveq	#0,d0
		moveq	#36,d1
		jsr	-90(a6)
		move.l	d0,d2
		move.l	a6,a1
		move.l	4.w,a6
		jmp	-414(a6)
		endc

.gfxname	dc.b	"graphics.library",0
		ifgt	mincpu!minfpu!minchips
.intname	dc.b	"intuition.library",0
		endc
		ifgt	mincpu
		even
.mincputext	dc.b	0,200,20,"You need an MC680x0",0,0
		endc
		ifgt	minfpu
		even
.minfputext	dc.b	0,180,20,"You need an FPU MC6888x",0,0
		endc
		ifgt	minchips
		even
.minchipstext	dc.b	0,220,20,"Insufficient ChipSet !",0,0
		endc
		even
		ifeq	noreturn
.data		dc.l	0	;oldview
		dc.l	0	;oldcop1
		dc.l	0	;oldcop2
		dc.l	0	;intena
		dc.l	0	;dmacon
		dc.l	0	;adkcon
		dc.l	0	;oldint
		dc.l	0	;oldVBR
		ifne	nocache
		dc.l	0	;oldCACR
		endc
		endc

.super1		; VBR- und Cachesteuerung
		ifeq	noreturn
		moveq	#0,d4
		btst	#0,d6
		beq.s	.noproc.1
		dc.w	$4e7a,$4801	; movec vbr,d4
.noproc.1	move.l	d4,28(a4)
		lea	vbrtable,a0
		lea	$0.w,a1
		move.w	#$400/4-1,d0
.loop.1		move.l	(a1)+,(a0)+
		dbra	d0,.loop.1
		endc
		btst	#0,d6
		beq.s	.noproc.11
		moveq	#0,d4
		dc.w	$4e7b,$4801	; movec d4,vbr
		ifne	nocache
		btst	#1,d6
		beq.s	.noproc.11
		ifeq	noreturn
		dc.w	$4e7a,$0002	;movec cacr,d0
		move.l	d0,32(a4)
		endc
		moveq	#0,d0
		dc.w	$4e7b,$0002	;movec d0,cacr
		endc
.noproc.11	rte

		ifeq	noreturn
.super2		; VBR und Caches resetten
		move.l	28(a4),a1
		move.l	a1,d4
		lea	vbrtable,a0
		move.w	#$400/4-1,d0
.loop.2		move.l	(a0)+,(a1)+
		dbra	d0,.loop.2
		btst	#0,d6
		beq.s	.noproc.2
		dc.w	$4e7b,$4801	; movec d4,vbr
		ifne	nocache
		move.l	32(a4),d0
		dc.w	$4e7b,$0002	;movec d0,cacr
		endc
.noproc.2	rte
		endc

.emptycop	dc.l	$01800000,$01000200,$fffffffe

		ifeq	noreturn
		ifeq	onehunk
		section	vbr,bss
		endc
vbrtable	ds.b	$400
		endc

		ifeq	onehunk
		ifeq	newheader
		section	maincode,code_c
		else
		section	maincode,code
		endc
		endc

*****************************************************************************
