/	STeve's automatic desktop selector
/	By STeve Reed	(16-MAR-86)
/
/	This program is meant to be placed in the auto folder.
/	It intercepts the first gemdos open call that tries to open
/	desktop.inf, and instead opens either highdesk.inf, meddesk.inf
/	or lowdesk.inf	depending on the type of monitor and if a key was
/	pressed (if color monitor and keypress, then lowres)
/
/	This was writen for the assembler supplied with Mark Williams C.
/	To assemble:
/		as -o autodesk.o autodesk.s
/		gemfix autodesk.o autodesk.prg
/		strip autodesk.prg
/

gemdos=		1
xbios=		14
trap1vector=	0x84

	.shri
start:
	lea	endofprog(pc),a0
	move.l	4(a7),(a0)		/ for figuring how long program is 

	pea	msg(pc)			/ print "STeve's auto..."
	move.w	$0x09,-(a7)
	trap	$gemdos
	addq.w	$6,a7

	pea	install(pc)		/ print "installing "
	move.w	$0x09,-(a7)
	trap	$gemdos
	addq.w	$6,a7

	move.w	$0x04,-(a7)
	trap	$xbios			/ get current resolution
	addq.w	$2,a7

	cmpi	$0x02,d0		/ is high rez?
	beq	highrez

	move.w	$0x0b,-(a7)		/ no it's a color monitor
	trap	$gemdos			/ if keypress use lowrez
	addq.w	$2,a7
	cmpi	$0x00,d0
	beq	medrez

	lea	lowdesk(pc),a0		/ desktop name =  lowdesk.inf
	lea	newdesk(pc),a1
	move.l	a0,(a1)	
	pea	low(pc)	
	bra	letsgo
	
medrez:
	lea	meddesk(pc),a0		/ desktop name =  meddesk.inf
	lea	newdesk(pc),a1
	move.l	a0,(a1)	
	pea	medium(pc)	
	bra	letsgo
	
highrez:
	lea	highdesk(pc),a0		/ desktop name =  highdesk.inf
	lea	newdesk(pc),a1
	move.l	a0,(a1)	
	pea	high(pc)	
		
letsgo:
	move.w	$0x09,-(a7)		/ print resolution
	trap	$gemdos
	addq.l	$6,a7

	pea	desk(pc)		/ print " resolution desktop."
	move.w	$0x09,-(a7)
	trap	$gemdos
	addq.l	$6,a7

	clr.l	-(a7)
	move.w	$0x20,-(a7)		
	trap	$gemdos			/ super mode
	addq.w	$6,a7
	
	movea.l	trap1vector,a0
	lea	oldtrap1(pc),a1
	move.l	a0,(a1)			/ save oldtrap vector

	lea	mytrap1(pc),a0
	move.l	a0,trap1vector		/ hook in my trap routine 
	
	move.l	d0,-(a7)		/ d0 still has old super sp
	move.w	$0x20,-(a7)
	trap	$gemdos
	addq.w	$6,a7


	lea	endofprog(pc),a0
	suba.l	endofprog(pc),a0
	clr.w	-(a7)
	move.l	a0,-(a7)
	move.w	$0x31,-(a7)
	trap	$gemdos			/ terminate and stay resident


mytrap1:
	move.w	6(a7),d0
	cmp	$0x3d,d0
	bne	dotrap
	movea.l	8(a7),a0
	lea	olddesk(pc),a1
loop:	cmpm.b	(a1)+,(a0)+		/ see if they are opening desktop.inf
	bne	dotrap			
	cmpi.b	$0x00,(a1)		/ are we done?
	bne	loop

	move.l	oldtrap1(pc),trap1vector / restore original trap1
	
	movea.l	newdesk(pc),a0		/ make substitution
	move.l	a0,8(a7)		/ subst filename for what they wanted

dotrap:
	movea.l	oldtrap1(pc),a0		/ call real trap routine
	jmp	(a0)


	.prvd

oldtrap1:
	.blkl	1

newdesk:
	.blkl	1	

olddesk:
	.ascii	"DESKTOP.INF"
	.byte 0
	.even

meddesk:	
	.ascii "MEDDESK.INF"
	.byte 0
	.even

lowdesk:	
	.ascii "LOWDESK.INF"
	.byte 0
	.even

highdesk:
	.ascii "HIGHDESK.INF"
	.byte 0
	.even

msg:
	.ascii "\n\rSTeve's auto desktop selector.\n\r"
	.byte 0
	.even

install:
	.ascii "Installing "
	.byte 0
	.even

high:	
	.ascii "high"
	.byte 0
	.even

medium:	
	.ascii "medium"
	.byte 0
	.even

low:	
	.ascii "low"
	.byte 0
	.even

desk:	
	.ascii " resolution desktop.\r\n\n"
	.byte 0
	.even

endofprog:
	.blkl	1			/ used for calculating length of prog
