*SOURCELISTING FOR DEVPAC ASSEMBLER
*
* PSTART, a startup-program for PageStream 1.8 / 2.0 / 2.1
*
* by GertJan 'Bugs' van Ratingen
*    P. Dijkmansstraat 1c
*    5611 RA  Eindhoven
*
* version 2.2, 12-aug-91
*
* CLI users:
* make the program 'PageStream' accessable from current dir, or C: !!!
*
*
* exec library calls
*
Forbid		equ -132
FindTask	equ -294
GetMsg		equ -372
ReplyMsg	equ -378
WaitPort	equ -384
OpenLibrary	equ -408
CloseLibrary	equ -414
*
* intuition library calls
*
LVO_CloseWindow	equ -72
OpenWindow	equ -204
PrintIText	equ -216
*
* dos library calls
*
CurrentDir	equ -126
Execute		equ -222
*
* constants
*
WINDOWDRAG	equ $2
WINDOWDEPTH	equ $4
WINDOWCLOSE	equ $8
ACTIVATE	equ $1000
NOCAREREFRESH	equ $20000

RP_JAM1		equ 0
RP_JAM2		equ 1

CLOSEWINDOW	equ $200
GADGETDOWN	equ $20
GADGETUP	equ $40
BOOLGADGET	equ $0001
RELVERIFY	equ $0001
GADGIMMEDIATE	equ $0002
*
* offsets for stack variables
*
class		equ	-4
iaddress	equ	class-4
msg		equ	iaddress-4
wb_msg		equ	msg-4
intbase		equ	wb_msg-4
gfxbase		equ	intbase-4
dosbase		equ	gfxbase-4
window		equ	dosbase-4
win_rport	equ	window-4
win_mport	equ	win_rport-4
colorflag	equ	win_mport-4
interlaceflag	equ	colorflag-1
execflag	equ	interlaceflag-1
var_size	equ	execflag

begin	link	a5,#var_size
	movem.l	d0/a0,-(sp)
	movea.l	$4.w,a6
	sub.l	a1,a1			;a1=0  =>  this task
	jsr	FindTask(a6)		;find it
	movea.l	d0,a4
	movem.l	(sp)+,d0/a0
	tst.l	172(a4)			;started from cli?
	bne.s	cli

w_b	lea	92(a4),a0		;messageport
	jsr	WaitPort(a6)		;wait for message
	lea	92(a4),a0
	jsr	GetMsg(a6)		;get it
	move.l	d0,wb_msg(a5)
	bsr.s	main			;execute main program
	movea.l	$4.w,a6
	jsr	Forbid(a6)		;forbid multitasking
	movea.l	wb_msg(a5),a1
	jsr	ReplyMsg(a6)		;reply message
	rts

cli	move.l	#0,wb_msg(a5)

main	move.b	#0,execflag(a5)
	movea.l	$4.w,a6			;Execbase
	lea	intname(pc),a1
	jsr	OpenLibrary(a6)		;open intuition library
	move.l	d0,intbase(a5)
	beq	closestuffexit
	lea	dosname(pc),a1
	jsr	OpenLibrary(a6)		;open dos library
	move.l	d0,dosbase(a5)
	beq	closeint

	move.l	wb_msg(a5),d0
	beq.s	opengfx
	movea.l	d0,a0
	move.l	$24(a0),d0		;pointer to sm_ArgList
	beq.s	opengfx
	movea.l	d0,a0
	move.l	(a0),d1			;lock
	movea.l	dosbase(a5),a6
	jsr	CurrentDir(a6)		;set current directory

opengfx	lea	gfxname(pc),a1
	movea.l	$4.w,a6
	jsr	OpenLibrary(a6)		;open graphics library
	move.l	d0,gfxbase(a5)
	beq	closedos

	movea.l	intbase(a5),a6
	lea	NewWindow(pc),a0
	jsr	OpenWindow(a6)		;open main window
	move.l	d0,window(a5)
	beq	closegfx
	movea.l	d0,a0
	move.l	50(a0),win_rport(a5)	;window's rastport
	move.l	86(a0),win_mport(a5)	;   ''    messageport

	move.b	#0,colorflag(a5)	;DEFAULT: 2 colors
	move.b	#1,interlaceflag(a5)	;DEFAULT: interlace on
	move.b	#1,execflag(a5)
	bra	printtekst

getm	movea.l	$4.w,a6			;execbase
	movea.l	win_mport(a5),a0	;Msgport
	jsr	WaitPort(a6)		;saves CPU-time!
	movea.l	win_mport(a5),a0	;Msgport
	jsr	GetMsg(a6)		;get the message
	move.l	d0,msg(a5)
	beq.s	getm			;still no message !?
	movea.l	d0,a1
	move.l	20(a1),class(a5)
	move.l	28(a1),iaddress(a5)
	jsr	ReplyMsg(a6)

	move.l	iaddress(a5),d0		;address of selected gadget
	move.l	class(a5),d1		;type of message
	cmpi.l	#CLOSEWINDOW,d1
	beq	cancel
	cmpi.l	#GADGETUP,d1
	beq.s	gadup
	cmpi.l	#GADGETDOWN,d1
	bne.s	getm

gaddown	cmpi.l	#InterlaceGadget,d0
	beq.s	interlace
	cmpi.l	#ColorGadget,d0
	beq.s	color
	bra.s	getm

gadup	cmpi.l	#NormalGadget,d0
	beq.s	normal
	cmpi.l	#OkGadget,d0
	beq	closestuff
	cmpi.l	#WBGadget,d0
	bne.s	getm

wb	move.l	#$2D770000,PSargs	;argument '-w'
	move.b	#2,execflag(a5)
	bra	closestuff
normal	move.b	#0,PSargs		;no args
	move.b	#2,execflag(a5)
	bra	closestuff

interlace
	move.b	interlaceflag(a5),d0	;get old interlace-status
	beq.s	interlaceon		;if OFF, switch it ON
interlaceoff				;else switch it OFF
	move.b	#0,interlaceflag(a5)
	move.l	#" OFF",iltxt
	bra.s	printtekst
interlaceon
	move.b	#1,interlaceflag(a5)
	move.l	#" ON ",iltxt
	bra.s	printtekst

color	move.b	colorflag(a5),d0	;get old color-status
	beq.s	colorfull		;if COLORS=2, set COLORS to 16
	subq.b	#1,colorflag(a5)	;else decrement color#
	bra.s	printtekst
colorfull
	move.b	#3,colorflag(a5)

printtekst
	moveq	#2,d1
	clr.l	d0
	move.b	colorflag(a5),d0
	lsl	d0,d1
	cmp.b	#16,d1
	blt.s	colnum1
	move.w	#"16",d2
	bra.s	coldispl
colnum1
	move.w	#"  ",d2
	add.l	#$30,d1			;make ascii
	move.b	d1,d2
coldispl
	move.w	d2,coltxt
	movea.l	intbase(a5),a6
	movea.l	win_rport(a5),a0	;rastport
	lea	tekst(pc),a1
	moveq	#0,d0			;start x
	moveq	#0,d1			;start y
	jsr	PrintIText(a6)		;print text
	bra	getm

tekst	dc.b 1,0,1,0
	dc.w 20,48
	dc.l 0,lbtxt,lbt1
lbtxt	dc.b '    Colors :'
coltxt	dc.b '  ',0
	even
lbt1	dc.b 1,0,1,0
	dc.w 20,30
	dc.l 0,lbtxt1,0
lbtxt1	dc.b ' Interlace :'
iltxt	dc.b ' ON ',0
;----------------------------------------------------------------------------
	even
cancel	move.b	#0,execflag(a5)
closestuff
	movea.l	intbase(a5),a6
	movea.l	window(a5),a0
	jsr	LVO_CloseWindow(a6)	;close window
closegfx
	movea.l	gfxbase(a5),a1
	movea.l	$4.w,a6
	jsr	CloseLibrary(a6)

	move.b	execflag(a5),d0
	beq.s	closedos
	cmp.b	#2,d0
	beq.s	psexecute

	lea	PSargs(pc),a0
psil	tst.b	interlaceflag(a5)	;interlace?
	bne.s	pscol			;then skip
	move.l	#" -n ",(a0)+		;argument -n
pscol	move.b	colorflag(a5),d0
	cmp.b	#1,d0			;default?
	beq.s	psdone			;then skip
	move.b	#"-",(a0)+
	moveq	#2,d1
	lsl	d0,d1
	cmp.b	#16,d1
	blt.s	pscol1
	move.b	#"1",(a0)+
	move.b	#"6",(a0)+
	bra.s	psdone
pscol1	add.l	#$30,d1			;make ascii
	move.b	d1,(a0)+
psdone	move.b	#0,(a0)
psexecute
	move.l	#PScommand,d1
	clr.l	d2
	clr.l	d3
	movea.l	dosbase(a5),a6
	jsr	Execute(a6)		;execute pagestream

	movea.l	$4.w,a6
	tst.b	execflag(a5)
	bne	opengfx			;display window again

closedos
	movea.l	dosbase(a5),a1
	jsr	CloseLibrary(a6)
closeint
	movea.l	intbase(a5),a1
	movea.l	$4.w,a6
	jsr	CloseLibrary(a6)
closestuffexit
	unlk	a5
	moveq	#0,d0
	rts
;----------------------------------------------------------------------------
PScommand	dc.b "PageStream  "
PSargs	dc.b "      ",0

intname	dc.b 'intuition.library',0
gfxname	dc.b 'graphics.library',0
dosname	dc.b 'dos.library',0
;----------------------------------------------------------------------------
	even
NewWindow	dc.w	130,35
	dc.w	390,133
	dc.b	1,2
	dc.l	GADGETDOWN+GADGETUP+CLOSEWINDOW
	dc.l	WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH
	dc.l	GadgetList1
	dc.l	0
	dc.l	NewWindowName1
	dc.l	0
	dc.l	0
	dc.w	5,5
	dc.w	-1,-1
	dc.w	1		;wbenchscreen
NewWindowName1
	dc.b 'PageStream Startup, version 2.1',0
	even
GadgetList1
InterlaceGadget
	dc.l	ColorGadget
	dc.w	159,27
	dc.w	67,12
	dc.w	0
	dc.w	3
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	0
	dc.l	IText1
	dc.l	0
	dc.l	0
	dc.w	0
	dc.l	0
Border1
	dc.w	-1,-1
	dc.b	3,0,RP_JAM1
	dc.b	5
	dc.l	BorderVectors1
	dc.l	0
BorderVectors1
	dc.w	0,0
	dc.w	68,0
	dc.w	68,13
	dc.w	0,13
	dc.w	0,0
IText1
	dc.b	1,0,RP_JAM2,0
	dc.w	9,2
	dc.l	0
	dc.l	ITextText1
	dc.l	0
ITextText1
	dc.b	'TOGGLE',0
	even
ColorGadget
	dc.l	OkGadget
	dc.w	159,45
	dc.w	67,12
	dc.w	0
	dc.w	3
	dc.w	BOOLGADGET
	dc.l	Border1
	dc.l	0
	dc.l	IText2
	dc.l	0
	dc.l	0
	dc.w	0
	dc.l	0
IText2
	dc.b	1,0,RP_JAM2,0
	dc.w	9,2
	dc.l	0
	dc.l	ITextText2
	dc.l	0
ITextText2
	dc.b	'CHANGE',0
	even
OkGadget
	dc.l	NormalGadget
	dc.w	18,65
	dc.w	351,28
	dc.w	0
	dc.w	RELVERIFY+GADGIMMEDIATE
	dc.w	BOOLGADGET
	dc.l	Border3
	dc.l	0
	dc.l	IText3
	dc.l	0
	dc.l	0
	dc.w	0
	dc.l	0
Border3
	dc.w	-1,-1
	dc.b	3,0,RP_JAM1
	dc.b	5
	dc.l	BorderVectors3
	dc.l	0
BorderVectors3
	dc.w	0,0
	dc.w	352,0
	dc.w	352,29
	dc.w	0,29
	dc.w	0,0
IText3
	dc.b	2,0,RP_JAM2,0
	dc.w	50,11
	dc.l	0
	dc.l	ITextText3
	dc.l	IText3b
ITextText3
	dc.b	'OK        OK        OK        OK',0
	even
IText3b
	dc.b	1,0,RP_JAM1,0
	dc.w	47,10
	dc.l	0
	dc.l	ITextText3
	dc.l	0
	even
NormalGadget
	dc.l	WBGadget
	dc.w	43,103
	dc.w	111,22
	dc.w	0
	dc.w	RELVERIFY+GADGIMMEDIATE
	dc.w	BOOLGADGET
	dc.l	Border4
	dc.l	0
	dc.l	IText4
	dc.l	0
	dc.l	0
	dc.w	0
	dc.l	0
Border4
	dc.w	-1,-1
	dc.b	3,0,RP_JAM1
	dc.b	5
	dc.l	BorderVectors4
	dc.l	0
BorderVectors4
	dc.w	0,0
	dc.w	112,0
	dc.w	112,23
	dc.w	0,23
	dc.w	0,0
IText4
	dc.b	1,0,RP_JAM2,0
	dc.w	26,7
	dc.l	0
	dc.l	ITextText4
	dc.l	0
ITextText4
	dc.b	'DEFAULT',0
	even
WBGadget
	dc.l	0
	dc.w	227,103
	dc.w	111,22
	dc.w	0
	dc.w	RELVERIFY+GADGIMMEDIATE
	dc.w	BOOLGADGET
	dc.l	Border4
	dc.l	0
	dc.l	IText5
	dc.l	0
	dc.l	0
	dc.w	0
	dc.l	0
IText5
	dc.b	1,0,RP_JAM2,0
	dc.w	8,3
	dc.l	0
	dc.l	ITextText5
	dc.l	IText5a
ITextText5
	dc.b	'ON WORKBENCH',0
	even
IText5a
	dc.b	1,0,RP_JAM2,0
	dc.w	32,12
	dc.l	0
	dc.l	ITextText5a
	dc.l	0
ITextText5a
	dc.b	'SCREEN',0
