[comp.sys.atari.st] Desk accessories and Sozobon C

steve@bungia.mn.org (Steve Yelvington) (07/13/89)

References: <458@medusa.informatik.uni-erlangen.de>

Here is a complete desk accessory kit for the Sozobon C compiler.
Well, almost complete. You need GEM bindings, such as GEMFAST or
GEMQ, to make it work.

The first file (dastart.s) is a general desk accessory startup module.

The second (reboot.c) is a C program demonstrating how to write 
a desk accessory. The example lets you point and click to reboot the system.

jas dastart.s 
cc -Oc reboot.c
ld -o reboot.acc dastart.o reboot.o \lib\aes???.a \lib\dlibs.a
                                             ^
                        use the name of your | GEM AES bindings

This code is in the public domain.

		-- Steve Yelvington

             0/
====cut here 0\====================================================

*********************************************************
* dastart.s -- desk accessory startup code for Atari ST *
* public domain -- July 1989 by Steve Yelvington        *
* written for Sozobon C and jas.ttp assembler           *
*********************************************************

	.bss
	.even
stackbottom:
	.ds.b 	1024	* Set up a small stack
initstack:
	.ds.l	1	* and a top for it
saveret:
	.ds.l	1	* A place to store PC during OS traps

	.text			* Watch closely; this won't last long!
begin_acc:			* We start
	move.l	#initstack,sp	* by loading the stack pointer
	jsr _main		* jump to main() of the desk accessory
	clr.w	(sp)		* Shouldn't get here! Put a zero on the stack
	trap	#1		* and terminate (Pterm0)

	**********************************************************
	* That's all there is to it. The rest of this file       *
	* provides gemdos, xbios and bios hooks on the assumption*
	* that your DA might actually do something. :-)          *
	* Note: I'm not checking the stack here. See DSTART.S by *
	* Dale Schumacher if you want to do that sort of thing   *
	**********************************************************
	.globl	_gemdos
_gemdos:
	move.l	(sp)+,saveret	* save return address
	trap	#1		* hand off to the operating system
	move.l	saveret,-(sp)	* restore the natural order of things
	rts

	.globl	_bios
_bios:
	move.l	(sp)+,saveret
	trap	#13		
	move.l	saveret,-(sp)
	rts

	.globl	_xbios
_xbios:
	move.l	(sp)+,saveret	
	trap	#14		
	move.l	saveret,-(sp)
	rts

	.globl _crystal
	* NOTICE: this is an AES binding needed with the GEMQ library...
	* just comment it out if you use only GEMFAST.
_crystal:
	move.l	4(sp),d1	* load aes parameter block ptr into d1
	move.w	#$C8,d0		* load magic number into d0
	trap	#2		* kick AES into action
	rts


             0/
====cut here 0\====================================================



/*
 * reboot.c
 * desk accessory to reboot the system
 * Public domain 1989 by Steve Yelvington
 * link dastart.o, then this module, then the GEM bindings, then dlibs.
 * Note the inline assembler ... it probably will need massaging
 * for compilers other than the Sozobon package. Be sure to
 * #define (or -D) GEMFAST to avoid the AES arrays if you have that
 * bindings library.
 */

#include <osbind.h>
#define MENU_ID	" Reboot system "
#define AC_OPEN	40

#ifndef GEMFAST
	/* these arrays aren't needed for GEMFAST, but GEMQ requires them */
int	contrl[12], intin[128], intout[128], ptsin[128], ptsout[128];
#endif

main()
	{

	int apid, menuid, msgbuf[8];
	apid = appl_init();	/* say hello to the AES */
	menuid = menu_register(apid, MENU_ID);	/* add me to the Desk menu */

	while (1)	/* loop forever */
		{
		evnt_mesag(msgbuf);
		if ( (msgbuf[0] == AC_OPEN) && (msgbuf[4] == menuid) )
			wakeup();
		}

	appl_exit();	/* you'll never get here -- supposedly */
	}



wakeup()
/*
 * This is where the desk accessory becomes active.
 */
	{
	int retval;
	retval = form_alert(1,
		"[3][?|Really reboot the system|?][No!|Warm boot|Cold boot]");
	if (retval-1)			/* button 1 is no	*/
		reboot(retval-2);	/* button 2 is warm boot */
	}


reboot(cold)	
	int cold;
/*
 *	Force the Atari ST to reset itself. If cold is TRUE, the
 *	system will do a cold reboot, otherwise a warm boot.
 *	Based on assembler code by apratt@atari.UUCP (Allan Pratt).
 *	This function never returns, natch.
 */
	{
	Super(0L);			/* go into supervisor mode */
	if (cold)
		asm("clr.l	$420");
	asm("move.l	$4f2,a0");	/* a0 -> OS header */
	asm("move.l	4(a0),a1"); 	/* a1 -> reset handler */
	asm("jmp	(a1)");		/*  jump there.  That's a reset. */
	}



             0/
====cut here 0\====================================================



#define steve@thelake.UUCP      pwcs!stag!thelake!steve
#define steve@thelake.citadel   the_land!class68!thelake!steve