[comp.sys.atari.st] AUTOstart all GEM-PRGs !!!

inform@uklirb.UUCP (03/09/87)

# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
# Run the following text with /bin/sh to create:
#	STARTGEM.S
#	STARTGEM.UUE
#
# This archive created:  Mar 8, 1987 -- 23:31:48
# By:	a friendly ATARI ST hacker  (using that wonderful machine :-)
#
echo shar: extracting STARTGEM.S
sed 's/^XX//' << \SHAR_EOF > STARTGEM.S
XX/
XX/	STARTGEM.S	6-MAR-1987	by GHOST-Soft
XX/
XX/	This program is used to start GEM programs from within the AUTO folder.
XX/
XX/	The code is probably highly nonportable, as it heavily depends on the
XX/	internal organisation of code in TOS/GEM.
XX/	As this program works with ROM- as well as all disk-based versions
XX/	of German TOS, I'm pretty sure that this program works with foreign
XX/	versions of TOS, too.
XX/	All addresses given in square brackets apply to the German ROM-TOS.
XX/
XX/	Assemble with Mark Williams assembler:
XX/		as -o startgem.o startgem.s
XX/		gemfix startgem.o startgem.prg
XX/		strip startgem.prg
XX/
XX
XX
XXlinef=		0x2c
XXvbllist1=	0x4d2
XX
XXgemdos=		1
XXxbios=		14
XX
XX
XX	.shri
XX
XXstart:
XX	lea	basepage(pc),a0
XX	move.l	4(a7),(a0)	/ get basepage address
XX
XX	pea	msg(pc)
XX	move.w	$0x9,-(a7)	/ print line
XX	trap	$gemdos
XX	addq.w	$6,a7
XX
XX	moveq	$70,d2		/ wait 1 second = 71 vblanks
XX1:	move.w	$0x25,-(a7)	/ wait for vertical blank
XX	trap	$xbios
XX	addq.w	$2,a7
XX	dbra	d2,1b
XX
XX	clr.l	-(a7)
XX	move.w	$0x20,-(a7)	/ enter super mode
XX	trap	$gemdos
XX	addq.w	$6,a7		/ keep old super sp in d0
XX
XX	moveq	$-1,d2
XX	move.l	d2,linef	/ set line-f emulator trap
XX	lea	vblank(pc),a2
XX	move.l	a2,vbllist1	/ set vblank vector #1  {0..7}
XX
XX	move.l	d0,-(a7)
XX	move.w	$0x20,-(a7)	/ exit super mode
XX	trap	$gemdos
XX	addq.w	$6,a7
XX
XX	lea	basepage(pc),a0	/ compute number of bytes to keep
XX	suba.l	basepage(pc),a0
XX	clr.w	-(a7)		/ 0 = no error
XX	move.l	a0,-(a7)
XX	move.w	$0x31,-(a7)	/ terminate and stay resident
XX	trap	$gemdos		/ this call never returns
XX
XXvblank:
XX	moveq	$-1,d0
XX	cmp.l	linef,d0
XX	beq.s	1f
XX	clr.l	vbllist1	/ clear vblank vector #1
XX	movea.l	linef,a0
XX	lea	old_lf(pc),a1
XX	move.l	a0,(a1)		/ save old line-f vector (usually in low RAM)
XX	lea	new_lf(pc),a1
XX	move.l	a1,linef	/ install new one
XX
XX	/ find the address of the buffer that GEM uses for the
XX	/ name of the program that it is going to execute
XX	movea.l	0x16(a0),a0	/ get start of line-f table from instruction
XX	/ [a0 = fee8bc]		move.l $0xfee8bc,a0
XX	movea.l	0x7c8(a0),a0	/ get address of routine 'f7c8' from table
XX	/ [a0 = fd8fc4]
XX	movea.l	0xa(a0),a2	/ get address from instruction
XX	/ [a2 = 73e4]		move.l $0x73e4,a5
XX	adda.w	0x10(a0),a2	/ add offset 0x1f56 from instruction
XX	/ [a2 = 933a]		lea 0x1f56,a0
XX	lea	pointer(pc),a1
XX	move.l	a2,(a1)		/ save buffer address
XX1:	rts
XX
XXnew_lf:
XX	movea.l	2(a7),a0	/ get addr. of instr. that caused exception
XX	cmpi.w	$0xf08c,(a0)	/ 'f08c' is the line-f instr. we're looking for
XX	bne.w	exit
XX	move.l	old_lf(pc),linef	/ restore old line-f vector
XX
XX	movea.l	pointer(pc),a0
XX	lea	filename(pc),a1
XX1:	move.b	(a1)+,(a0)+	/ copy filename into GEM buffer space
XX	bne.s	1b
XX
XX	pea	dta
XX	move.w	$0x1a,-(a7)	/ set DTA
XX	trap	$gemdos
XX	addq.l	$6,a7
XX	move.w	$0x27,-(a7)	/ don't look at volumes and directories
XX	pea	filename(pc)
XX	move.w	$0x4e,-(a7)	/ search first
XX	trap	$gemdos
XX	addq.l	$8,a7
XX	tst	d0		/ status != 0 indicates error
XX	bne.s	exit
XX
XX	movea.l	2(a7),a0	/ get addr. of instr. that caused exception
XX	/ [a0 = fed188]
XX2:	cmpi.w	$0xf4b8,(a0)	/ look for line-f instruction 'f4b8'
XX	beq.s	doload
XX	addq.l	$2,a0
XX	cmpa.l	$0xfefffe,a0	/ test for ROM end
XX	beq.s	exit
XX	cmpa.l	$0x078000,a0	/ test for RAM end (on 512K machine)
XX	bne.s	2b		/ {RAM-TOS usually loads much lower}
XX
XXexit:
XX	movea.l	old_lf(pc),a0	/ resume execution of regular line-f handler
XX	jmp	(a0)
XX
XXdoload:
XX	/ [a0 = fe1de2]
XX	move.w	(a7)+,d2	/ pop status word
XX	addq.w	$4,a7		/ destroy addr. of instr. 'f08c'
XX	move.w	d2,sr		/ restore status register
XX	adda.w	$56,a7		/ destroy parameters of instr. 'f08c'
XX	jmp	(a0)		/ jump to instruction 'f4b8'
XX
XX
XX	.prvd
XX
XXdta:
XX	.blkb	44
XXold_lf:
XX	.blkl	1
XXpointer:
XX	.blkl	1
XX
XXmsg:
XX	.ascii	"\033\105Autostart of "
XXfilename:
XX	.ascii	"MSH.PRG"
XXnulls:
XX	.blkb	20		/ these nulls allow easy patching of code file
XX
XX	.even
XXbasepage:
XX	.ascii	"EOPA"		/ magic number indicates End Of Patch Area
XX
SHAR_EOF
if test 3758 -ne "`wc -c STARTGEM.S`"
then
echo shar: error transmitting STARTGEM.S '(should have been 3758 characters)'
fi
echo shar: extracting STARTGEM.UUE
sed 's/^XX//' << \SHAR_EOF > STARTGEM.UUE
XXbegin 777 startgem.prg
XXM8!H   $(    8@                       $'Z 60@KP $2'H!,C\\  E.x
XXM05Q/=$8_/  E3DY43U'*__9"IS\\ "!.05Q/=/\CP@   "Q%^@ D(\H   32x
XXM+P _/  @3D%<3T'Z 1R1^@$80F<O"#\\ #%.07#_L+D    L9S)"N0  !-(@x
XXM>0   "Q#^@#"(HA#^@ @(\D    L(&@ %B!H!\@D:  *U.@ $$/Z *8BBDYUx
XXM(&\  @Q0\(QF  !4(_H C@   "P@>@"*0_H F1#99OQ(>0   0@_/  :3D%<x
XXMCS\\ "=(>@!_/SP 3DY!4(]*0&8<(&\  @Q0]+AG&%2(L?P _O_^9PBQ_  'x
XXM@ !FZ"!Z #Q.T#0?6$]&PM[\ #A.T                               x
XXM                                       ;14%U=&]S=&%R="!O9B!-x
XXM4T@N4%)'                          !%3U!!    N@ ' 10!"@ P    x
XXF" $                  &(                            !x
XX x
XXend
SHAR_EOF
if test 652 -ne "`wc -c STARTGEM.UUE`"
then
echo shar: error transmitting STARTGEM.UUE '(should have been 652 characters)'
fi
# End of shell archive
exit 0