;-----------------------------------------------------------------------;
;		Mint_it/Mac_it - Spectre/MiNT booter			;
;		by Sean Gordon and Karl Anders ˛ygard			;
;-----------------------------------------------------------------------;

;spectre				; Unquote for spectre version

esc	EQU $1B

	movea.l	sp,a5
	movea.l	4(a5),a5
	move.l	$0C(a5),d0		; Text size
	add.l	$14(a5),d0		; Data size
	addi.l	#$0500,d0
	move.l	d0,d1
	add.l	a5,d1
	andi.l	#$FFFFFFFE,d1
	movea.l	d1,sp

	move.l	d0,-(sp)
	move.l	a5,-(sp)
	clr.w	-(sp)
	move.w	#$4A,-(sp)
	trap	#1			; Shrink memory
	lea	12(sp),sp

	pea	title(pc)
	move.w	#9,-(sp)
	trap	#1			; Write message
	addq.w	#6,sp

	move.w	#1,-(sp)
	move.w	#14,-(sp)
	trap	#14			; Get ptr to kbd buffer record
	addq.w	#4,sp
	movea.l d0,a1
	movea.l (a1),a0 		; Get ptr to kbd buffer
	adda.w	6(a1),a0		; Add head index
	move.w	2(a0),d4		; Read key
	beq	nochar
	IFD spectre
	cmp.w	#'s',d4			; Is it the hotkey?
	ELSE
	cmp.w	#'m',d4			; Is it the hotkey?
	ENDC
	bne	nochar

	clr.w	-(sp)
	pea	config(pc)
	move.w	#$3D,-(sp)
	trap	#1			; Open file
	addq.l	#8,sp
	tst.w	d0
	bmi	nocnf			; Error?
	move.w	d0,handle

	pea	buffer(pc)
	pea	255.w
	move.w	handle(pc),-(sp)
	move.w	#$3F,-(sp)
	trap	#1			; Read 255 bytes from file
	lea	12(sp),sp

	move.w	handle(pc),-(sp)
	move.w	#$3E,-(sp)
	trap	#1			; Close file
	addq.w	#4,sp

	lea	buffer(pc),a0
	lea	path(pc),a1
ploop	cmpi.b	#$0D,(a0)
	beq.s	mv_name
	move.b	(a0)+,(a1)+
	bra.s	ploop

mv_name	clr.b	(a1)
	addq.w	#2,a0
	lea	name(pc),a1
nloop	tst.b	(a0)
	beq.s	no_more
	cmpi.b	#$0D,(a0)
	beq.s	no_more
	move.b	(a0)+,(a1)+
	bra.s	nloop

no_more	clr.b	(a1)

	move.w	#4,-(sp)
	trap	#14			; Get resolution
	addq.w	#2,sp
	tst.w	d0
	bne.s	notlow			; Is it low res?

	move.w	#1,-(sp)
	pea	-1.w
	pea	-1.w
	move.w	#5,-(sp)
	trap	#14			; Set medium resolution
	lea	12(sp),sp

notlow	pea	bootmsg(pc)
	move.w	#9,-(sp)
	trap	#1			; Write 'bootmsg'-message
	addq.w	#6,sp

	lea	path(pc),a3
	addq.w	#1,a3
nocol	move.b	(a3)+,d0
	beq.s	nodrv
	cmp.b	#':',d0
	bne.s	nocol
	move.b	-2(a3),d0
	and.w	#$00df,d0
	sub.w	#'A',d0
	move.w	d0,-(sp)
	move.w	#14,-(sp)
	trap	#1			; Set default drive
	addq.w	#4,sp

	pea	(a3)
	move.w	#$3B,-(sp)
	trap	#1			; Change directory
	addq.w	#6,sp
	bra.s	okaydir

nodrv	pea	path(pc)
	move.w	#$3B,-(sp)
	trap	#1			; Change directory
	addq.w	#6,sp

okaydir	pea	palette(pc)
	move.w	#6,-(sp)
	trap	#14			; Set reasonable palette
	addq.w	#6,sp

	pea	env(pc)
	pea	com(pc)
	pea	name(pc)
	clr.w	-(sp)
	move.w	#$4B,-(sp)
	trap	#1			; Execute program
	lea	16(sp),sp

	pea	nofile1(pc)
	move.w	#9,-(sp)
	trap	#1			; 'Can't find...'
	addq.w	#6,sp

	pea	path(pc)
	move.w	#9,-(sp)
	trap	#1			; Write pathname
	addq.w	#6,sp

	pea	name(pc)
	move.w	#9,-(sp)
	trap	#1			; Write filename
	addq.w	#6,sp

	pea	nofile2(pc)
	move.w	#9,-(sp)
	trap	#1			; '- abort'
	addq.w	#6,sp

wait	pea	presany(pc)
	move.w	#9,-(sp)
	trap	#1			; 'Press any key...'
	addq.w	#6,sp

	move.w	#7,-(sp)
	trap	#1			; Wait for a key
	addq.w	#2,sp

nochar	pea	$4C0000
	trap	#1			; pterm

;---------------------------------------------- Couldn't find .cnf file --
nocnf	pea	nofile1(pc)
	move.w	#9,-(sp)
	trap	#1			; 'Can't find...'
	addq.w	#6,sp

	pea	config(pc)
	move.w	#9,-(sp)
	trap	#1			; config file
	addq.w	#6,sp

	pea	nofile2(pc)
	move.w	#9,-(sp)
	trap	#1			; '- abort'
	addq.w	#6,sp

	bra.s	wait

	IFD spectre
config	DC.B '\mac_it.cnf',0
title	DC.B esc,'p MAC_IT v1.1, 1992 ',esc,'q by WOF Inc and KA˛',$D,$A,$D,$A,0
bootmsg	DC.B esc,'p<<< Executing Spectre >>>',esc,'q',0
	ELSE
config	DC.B '\mint_it.cnf',0
title	DC.B esc,'p MiNT_IT v1.1, 1992 ',esc,'q by WOF Inc and KA˛',$D,$A,$D,$A,0
bootmsg	DC.B esc,'p<<< Executing MiNT >>>',esc,'q',0
	ENDC

nofile1	DC.B esc,'pCan''t find ',0
nofile2	DC.B ' - aborting load.',esc,'q',$0D,$0A,0
presany	DC.B 'Any key to continue.',$0D,$0A,$0D,$0A,0
palette	DC.W $777
	DS.W 15

path	DS.W 64
name	DS.W 7

	SECTION BSS

env	DS.B 1
com	DS.B 1
handle	DS.W 1
buffer	DS.W 128
