*****************************************************************************
*
*  Program:  Prefs.asm ©1990 by The Puzzle Factory
* Function:  Select serial preferences for ACIA's on I/O Expansion Board.
*
*   Author: Jeff Lavin
*  History: 08/21/89  V0.50 Created
*           09/10/90  V0.51 Updated code for M68
*                           Added another handshake gadget
*
* [To all: Please don't forget to bump the revision numbers if you do *any*
*          modifications at all.  -Jeff]
*
*****************************************************************************

;Set Tabs           |       |                 |

	exeobj
	objfile	'Prefs'
	include	'PRG:Exp/NewSER/NewSER.i'

*** Macros

sett	macro		;Set Text coords
	dw	\1,\2	;LeftEdge, BaseLine
	dl	\3	;TextPtr
	endm

*** Equates

TRUE	equ	1
FALSE	equ	0

*** Begin Mainline

Prefs	lea	(DT),a5	;BSS relative base
	lea	(BSS_Start-DT,a5),a0
	moveq	#(BSS_Len/4)-1,d1
	moveq	#0,d0
1$	move.l	d0,(a0)+	;Clear BSS area
	dbra	d1,1$

	lea	(DosName,pc),a1	;Open dos.library
	moveq	#33,d0	;V1.2 or later
	movea.l	(SysBase),a6
	SYS	OpenLibrary
	move.l	d0,(Dos_Base-DT,a5)
	beq.b	2$

	movea.l	d0,a6
	SYS	Output
	move.l	d0,(stdout)

	lea	(IntName,pc),a1	;Open intuition.library
	moveq	#33,d0	;V1.2 or later
	movea.l	(SysBase),a6
	SYS	OpenLibrary
	move.l	d0,(Int_Base-DT,a5)
2$	beq.b	Cleanup

	lea	(GfxName,pc),a1	;Open graphics.library
	moveq	#33,d0	;V1.2 or later
	SYS	OpenLibrary
	move.l	d0,(Gfx_Base-DT,a5)
	beq.b	Cleanup

	movea.l	(ThisTask,a6),a3	;Our process base
	tst.l	(pr_CLI,a3)	;From the CLI?
	bne.b	FromCLI

FromWBench	lea	(pr_MsgPort,a3),a0
	SYS	WaitPort	;Get a msg from WBench
	lea	(pr_MsgPort,a3),a0
	SYS	GetMsg
	move.l	d0,(WBenchMsg-DT,a5) ; and save for later return.

FromCLI	movea.l	(Int_Base-DT,a5),a6
	lea	(MyScreen-DT,a5),a0
	SYS	OpenScreen
	move.l	d0,(ScreenPtr-DT,a5) ;Save ptr to my picture screen
	beq.b	Cleanup	;Error while opening

	lea	(MyWindow-DT,a5),a0
	move.l	d0,(nw_Screen,a0)	;Point NewWindow to this screen
	SYS	OpenWindow
	move.l	d0,(WindowPtr-DT,a5) ;Save window pointer
	beq.b	Cleanup	;Error while opening

	movea.l	d0,a0
	move.l	(wd_UserPort,a0),(PortPtr-DT,a5)
	move.l	(wd_RPort,a0),(RastPtr-DT,a5)
	move.l	a0,(pr_WindowPtr,a3) ;Make requesters appear here
	bsr	SetupScreen	;Create display
	bsr.b	MainLoop	;When finished, we'll fall thru

************************************************
*             Termination section              *
************************************************

* It's time to quit, close everything and say good-night, Gracie.

Cleanup	movea.l (Int_Base-DT,a5),a6
	move.l	(WindowPtr-DT,a5),d0 ;Close Window
	beq.b	1$
	movea.l (SysBase),a3
	movea.l	(ThisTask,a3),a1
	clr.l	(pr_WindowPtr,a1)
	movea.l d0,a0
	SYS	CloseWindow

1$	move.l	(ScreenPtr-DT,a5),d0 ;Close Screen
	beq.b	2$
	movea.l d0,a0
	SYS	CloseScreen

2$	movea.l	a3,a6
	move.l	(WBenchMsg-DT,a5),d2
	beq.b	3$
	SYS	Forbid	;So WBench won't UnLoadSeg us
	movea.l d2,a1
	SYS	ReplyMsg	;Return msg to WBench

3$	moveq	#0,d0
	rts

************************************************
*              Main Execution Loop             *
************************************************

* Wait for a msg, execute appropriate routine.

MainLoop	tst.b	(CloseFlag-DT,a5)	;Flag set?
	beq.b	1$
	rts		;Exit

1$	movea.l (PortPtr-DT,a5),a0
	moveq	#0,d0
	moveq	#0,d1
	move.b	(MP_SIGBIT,a0),d1
	bset	d1,d0
	movea.l	(SysBase),a6
	SYS	Wait	;Now wait for a message

GetIMsg	movea.l (PortPtr-DT,a5),a0
	movea.l	(SysBase),a6
	SYS	GetMsg	;Did we get one?
	tst.l	d0
	beq.b	MainLoop	;No
	movea.l d0,a1
	move.l	(im_Class,a1),d2	;Yes, get info
	movea.l	(im_IAddress,a1),a2
	SYS	ReplyMsg	;Return msg

CheckGads	cmpi.w	#GADGETDOWN,d2	;Someone clicked on a gadget
	beq.b	1$
	cmpi.w	#GADGETUP,d2	;May be either type
	bne.b	2$
1$	lea	(FirstGadget-DT,a5),a1 ;Save some code for ME
	move.w	(gg_GadgetID,a2),d1
	movea.l	(gg_UserData,a2),a0 ;Get action address
	jsr	(a0)
2$	bra.b	GetIMsg	;Unknown class

BufUP01	move.w	(_BufSize01-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBuf01

BufDN01	move.w	(_BufSize01-DT,a5),d0
	subq.w	#1,d0
CkBuf01	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs, we just
	beq.b	DoBuf01	; need them for GADGHCOMP.
	rts

DoBuf01	andi.w	#%00000111,d0	;Modulo 8
	move.w	d0,(_BufSize01-DT,a5) ;Save new value
	moveq	#26,d1	;BaseLine for Text
	bra	BufStrings	;Clear old text & write new

BaudUP01	move.w	(_BaudRate01-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBaud01

BaudDN01	move.w	(_BaudRate01-DT,a5),d0
	subq.w	#1,d0
CkBaud01	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBaud01
	rts

DoBaud01	andi.w	#%00001111,d0	;Modulo 16
	move.w	d0,(_BaudRate01-DT,a5)
	moveq	#41,d1	;BaseLine for Text
	bra	BaudStrings

WordLen01	subq.w	#4,d1		 ;ID(thisGad)-ID(1stGad) =
	move.b	d1,(_WordLen01-DT,a5)	 ; SerialPref value.
	lea	(WordLen01.0_gad-DT,a5),a0 ;1st gadget in this group
	moveq	#4,d0		 ;# of gadgets in this group
	bsr	MutualExclude		 ;Hilite this gadget
	rts

StopBit01	subq.w	#8,d1
	move.b	d1,(_StopBits01-DT,a5)
	lea	(StopBit01.0_gad-DT,a5),a0
	moveq	#2,d0
	bsr	MutualExclude
	rts

Parity01	subi.w	#10,d1
	move.b	d1,(_Parity01-DT,a5)
	lea	(Parity01.0_gad-DT,a5),a0
	moveq	#5,d0
	bsr	MutualExclude
	rts

Shake01	subi.w	#15,d1
	move.b	d1,(_Shake01-DT,a5)
	lea	(Shake01.0_gad-DT,a5),a0
	moveq	#3,d0
	bsr	MutualExclude
	rts

BufUP02	move.w	(_BufSize02-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBuf02

BufDN02	move.w	(_BufSize02-DT,a5),d0
	subq.w	#1,d0
CkBuf02	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBuf02
	rts

DoBuf02	andi.w	#%00000111,d0	;Modulo 8
	move.w	d0,(_BufSize02-DT,a5)
	moveq	#66,d1	;BaseLine for Text
	bra	BufStrings

BaudUP02	move.w	(_BaudRate02-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBaud02

BaudDN02	move.w	(_BaudRate02-DT,a5),d0
	subq.w	#1,d0
CkBaud02	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBaud02
	rts

DoBaud02	andi.w	#%00001111,d0	;Modulo 16
	move.w	d0,(_BaudRate02-DT,a5)
	moveq	#81,d1	;BaseLine for Text
	bra	BaudStrings

WordLen02	subi.w	#20+4,d1
	move.b	d1,(_WordLen02-DT,a5)
	lea	(WordLen02.0_gad-DT,a5),a0
	moveq	#4,d0
	bsr	MutualExclude
	rts

StopBit02	subi.w	#20+8,d1
	move.b	d1,(_StopBits02-DT,a5)
	lea	(StopBit02.0_gad-DT,a5),a0
	moveq	#2,d0
	bsr	MutualExclude
	rts

Parity02	subi.w	#20+10,d1
	move.b	d1,(_Parity02-DT,a5)
	lea	(Parity02.0_gad-DT,a5),a0
	moveq	#5,d0
	bsr	MutualExclude
	rts

Shake02	subi.w	#20+15,d1
	move.b	d1,(_Shake02-DT,a5)
	lea	(Shake02.0_gad-DT,a5),a0
	moveq	#3,d0
	bsr	MutualExclude
	rts

BufUP11	move.w	(_BufSize11-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBuf11

BufDN11	move.w	(_BufSize11-DT,a5),d0
	subq.w	#1,d0
CkBuf11	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBuf11
	rts

DoBuf11	andi.w	#%00000111,d0	;Modulo 8
	move.w	d0,(_BufSize11-DT,a5)
	moveq	#106,d1	;BaseLine for Text
	bra	BufStrings

BaudUP11	move.w	(_BaudRate11-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBaud11

BaudDN11	move.w	(_BaudRate11-DT,a5),d0
	subq.w	#1,d0
CkBaud11	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBaud11
	rts

DoBaud11	andi.w	#%00001111,d0	;Modulo 16
	move.w	d0,(_BaudRate11-DT,a5)
	moveq	#121,d1	;BaseLine for Text
	bra	BaudStrings

WordLen11	subi.w	#40+4,d1
	move.b	d1,(_WordLen11-DT,a5)
	lea	(WordLen11.0_gad-DT,a5),a0
	moveq	#4,d0
	bsr	MutualExclude
	rts

StopBit11	subi.w	#40+8,d1
	move.b	d1,(_StopBits11-DT,a5)
	lea	(StopBit11.0_gad-DT,a5),a0
	moveq	#2,d0
	bsr	MutualExclude
	rts

Parity11	subi.w	#40+10,d1
	move.b	d1,(_Parity11-DT,a5)
	lea	(Parity11.0_gad-DT,a5),a0
	moveq	#5,d0
	bsr	MutualExclude
	rts

Shake11	subi.w	#40+15,d1
	move.b	d1,(_Shake11-DT,a5)
	lea	(Shake11.0_gad-DT,a5),a0
	moveq	#3,d0
	bsr	MutualExclude
	rts

BufUP12	move.w	(_BufSize12-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBuf12

BufDN12	move.w	(_BufSize12-DT,a5),d0
	subq.w	#1,d0
CkBuf12	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBuf12
	rts

DoBuf12	andi.w	#%00000111,d0	;Modulo 8
	move.w	d0,(_BufSize12-DT,a5)
	move.w	#146,d1	;BaseLine for Text

BufStrings	bsr	Clear	;Clear old text from area
	lea	(BufTxt.tbl,pc),a0
	bra.b	String_In

BaudUP12	move.w	(_BaudRate12-DT,a5),d0
	addq.w	#1,d0
	bra.b	CkBaud12

BaudDN12	move.w	(_BaudRate12-DT,a5),d0
	subq.w	#1,d0
CkBaud12	cmpi.w	#GADGETDOWN,d2	;Ignore GADGETUP msgs
	beq.b	DoBaud12
	rts

DoBaud12	andi.w	#%00001111,d0	;Modulo 16
	move.w	d0,(_BaudRate12-DT,a5)
	move.w	#161,d1	;BaseLine for Text

BaudStrings	bsr	Clear	;Clear old text from area
	lea	(BaudTxt.tbl,pc),a0
String_In	lsl.w	#2,d0	;LONG index
	movea.l	(0,a0,d0.w),a0	;Get new text based on index
	bsr	strlen
	lsl.w	#2,d0	;PixelLen=(strlen*charwidth)/2
	moveq	#111,d2	;Center of text space
	sub.w	d0,d2	;LeftEdge=Xcoord-(PixelLen/2)
	move.w	d2,d0
	bsr	Text	;Go write it
	rts

WordLen12	subi.w	#60+4,d1
	move.b	d1,(_WordLen12-DT,a5)
	lea	(WordLen12.0_gad-DT,a5),a0
	moveq	#4,d0
	bsr	MutualExclude
	rts

StopBit12	subi.w	#60+8,d1
	move.b	d1,(_StopBits12-DT,a5)
	lea	(StopBit12.0_gad-DT,a5),a0
	moveq	#2,d0
	bsr	MutualExclude
	rts

Parity12	subi.w	#60+10,d1
	move.b	d1,(_Parity12-DT,a5)
	lea	(Parity12.0_gad-DT,a5),a0
	moveq	#5,d0
	bsr	MutualExclude
	rts

Shake12	subi.w	#60+15,d1
	move.b	d1,(_Shake12-DT,a5)
	lea	(Shake12.0_gad-DT,a5),a0
	moveq	#3,d0
	bsr	MutualExclude
	rts

SaveGad	bsr	MakePointer
	bsr	PutFile	;Save file & fall thru
	bsr	RemPointer

CancelGad	bset	#0,(CloseFlag-DT,a5)
	rts

****************************************
*              SubRoutines             *
****************************************

*************************************************************************
* NAME:	GetFile()
* FUNCTION:	Read prefs file into memory.
* INPUTS:	None
* RETURN:	D0 = TRUE if success, else FALSE.
* SCRATCH:	D0-D5/A0-A2/A6
*************************************************************************

GetFile	movea.l (Dos_Base-DT,a5),a6
	lea	(FileName,pc),a2
	moveq	#SHARED_LOCK,d2	;Does file exist?
	move.l	a2,d1
	SYS	Lock
	move.l	d0,d5	;Lock
	beq.b	3$	;No, we'll create it later

	move.l	#MODE_OLDFILE,d2
	move.l	a2,d1	;Yes, use it
	SYS	Open
	move.l	d0,d4	;FileHandle
	bne.b	1$
	move.l	d5,d1	;Lock
	SYS	UnLock
	lea	(OpenErr.msg,pc),a0 ;Couldn't open file
	bra.b	2$

1$	moveq	#sp_Sizeof,d3	;Length
	lea	(MySerPrefs-DT,a5),a0
	move.l	a0,d2	;Buffer
	move.l	d4,d1	;FileHandle
	SYS	Read	;Finally, read it in
	move.l	d0,-(sp)
	move.l	d4,d1	;FileHandle
	SYS	Close	;Close the file
	move.l	d5,d1	;Lock
	SYS	UnLock	;Release the lock
	cmpi.l	#sp_Sizeof,(sp)+	;Read it all in?
	beq.b	4$	;Yes, read it all
	lea	(ReadErr.msg,pc),a0 ;No, couldn't reach eof

2$	bsr	strlen
	move.l	d0,d3	;Length
	move.l	a0,d2	;Buffer
	move.l	(stdout-DT,a5),d1	;FileHandle
	beq.b	3$
	SYS	Write
3$	moveq	#FALSE,d0
	bra.b	5$

4$	moveq	#TRUE,d0
5$	rts

FileName	PREFFILE

OpenErr.msg	cstr	'SerialPrefs: Error opening S:Serial-Preferences'
ReadErr.msg	cstr	'SerialPrefs: Error reading S:Serial-Preferences'
MakeErr.msg	cstr	'SerialPrefs: Error creating S:Serial-Preferences'
WritErr.msg	cstr	'SerialPrefs: Error writing S:Serial-Preferences'
	even

*************************************************************************
* NAME:	PutFile()
* FUNCTION:	Save prefs to file.
*	If file does not exist, it will be created.
* INPUTS:	None
* RETURN:	D0 = TRUE if success, else FALSE.
* SCRATCH:	D0-D5/A0-A2/A4/A6
*************************************************************************

PutFile	movea.l (Dos_Base-DT,a5),a6
	lea	(FileName,pc),a2
	moveq	#SHARED_LOCK,d2	;Does file exist?
	move.l	a2,d1
	SYS	Lock
	move.l	#MODE_OLDFILE,d2
	move.l	d0,d5	;Lock
	bne.b	1$	;Yes, use it

	move.l	#MODE_NEWFILE,d2	;No, create a new one
1$	move.l	a2,d1
	SYS	Open
	move.l	d0,d4	;FileHandle
	bne.b	2$
	move.l	d5,d1	;Lock
	SYS	UnLock
	lea	(MakeErr.msg,pc),a0 ;Couldn't create file
	bra.b	3$

2$	moveq	#sp_Sizeof,d3	;Length
	lea	(MySerPrefs-DT,a5),a0
	move.l	a0,d2	;Buffer
	move.l	d4,d1	;FileHandle
	SYS	Write	;Finally, write it out
	move.l	d0,-(sp)
	move.l	d4,d1	;FileHandle
	SYS	Close	;Close the file
	move.l	d5,d1	;Lock
	SYS	UnLock	;Release the lock
	cmpi.l	#sp_Sizeof,(sp)+	;Wrote it all out?
	beq.b	5$	;Yes, wrote it all
	lea	(WritErr.msg,pc),a0 ;No, error

3$	bsr	strlen
	move.l	d0,d3	;Length
	move.l	a0,d2	;Buffer
	move.l	(stdout-DT,a5),d1	;FileHandle
	beq.b	4$
	SYS	Write
4$	moveq	#FALSE,d0
	bra.b	6$

5$	moveq	#TRUE,d0
6$	rts

*************************************************************************
* Name:	MutualExclude()
* Function:	Perform mutual exclude function for gadgets.
*
* Cur  Cur | Comp   If the gadget is the current one AND it is already
* Gad  Col | Gad?   selected, don't change it.  If the gadget is not the
* ---------------   current one, AND it is NOT selected, don't change it.
*  0    0  |  0     In both other cases, complement it's current state.
*  0    1  |  1     D2 and D3 are TRUE or FALSE depending on these two
*  1    0  |  1     conditions.  EOR'ing them, gives our response:  If
*  1    1  |  0     TRUE, complement.  Else, don't.
*
* Input:	D0 = Number of gadgets in this group.
*	A0 = Ptr to 1st gadget in this group.
*	A2 = Ptr to gadget that was just selected.
* Results:	None
* Scratch:	D0-D1/A0-A1
*************************************************************************

MutualExclude	movem.l	d2-d4/a2-a6,-(sp)
	movea.l	(Gfx_Base-DT,a5),a6
	movea.l	(RastPtr-DT,a5),a3	;RastPort
	movea.l	a0,a4	;1st gadget in group
	move.w	d0,d4	;Numgads
	subq.w	#1,d4

	moveq	#1,d0
	movea.l	a3,a1
	SYS	SetAPen

	moveq	#RP_COMPLEMENT,d0
	movea.l	a3,a1
	SYS	SetDrMd

1$	move.w	(gg_GadgetID,a2),d0 ;ID of selected gadget
	cmp.w	(gg_GadgetID,a4),d0 ;Is this the current gadget?
	seq	d2	  ;D2 = 1 if TRUE
	move.w	(gg_LeftEdge,a4),d0
	move.w	(gg_TopEdge,a4),d1
	movea.l	a3,a1
	movem.w	d0-d1,-(sp)	;Save Left & Top
	SYS	ReadPixel
	cmpi.w	#3,d0	;This color means complemented
	seq	d3	;D3 = 1 if TRUE
	movem.w	(sp)+,d0-d1
	eor.b	d2,d3
	beq.b	2$

	move.w	d0,d2	;Xmin
	move.w	d1,d3	;Ymin
	add.w	(gg_Width,a4),d2
	subq.w	#2,d2	;Xmax
	add.w	(gg_Height,a4),d3
	subq.w	#1,d3	;Ymax
	movea.l	a3,a1
	SYS	RectFill

2$	moveq	#0,d2	;Clear for next gadget
	moveq	#0,d3
	movea.l	(gg_NextGadget,a4),a4
	dbra	d4,1$

	movem.l	(sp)+,d2-d4/a2-a6
	rts

*************************************************************************
* NAME:	MakePointer()
* FUNCTION:	Disallow any user selections.  Make a "sleepy" pointer
*	for the window.
* INPUTS:	None
* RETURN:	Modifies Pointer & IDCMP
* SCRATCH:	None
*************************************************************************

MakePointer	tst.b	(ZZZFlag-DT,a5)	;Already modified?
	bne.b	1$

	movem.l	d0-d3/a0-a1/a6,-(sp)
	movea.l (WindowPtr-DT,a5),a0
	move.l	a0,-(sp)
	moveq	#SIZEVERIFY,d0	;So we'll never get a message
	movea.l	(Int_Base-DT,a5),a6
	SYS	ModifyIDCMP	; while we/re busy.

	movea.l (sp)+,a0	;Window
	lea	(SpriteData),a1	;Already in CHIP mem
	moveq	#24,d0	;Height
	moveq	#16,d1	;Width
	moveq	#-8,d2	;XOffset
	moveq	#-8,d3	;YOffset
	SYS	SetPointer	;Change sprite into ZZZ pointer

	move.b	#1,(ZZZFlag-DT,a5)
	movem.l	(sp)+,d0-d3/a0-a1/a6
1$	rts

*************************************************************************
* NAME:	RemPointer()
* FUNCTION:	Restore normal pointer and user selections to window.
* INPUTS:	None
* RETURN:	Modifies Pointer & IDCMP
* SCRATCH:	None
*************************************************************************

RemPointer	tst.b	(ZZZFlag-DT,a5)	;Normal now?
	beq.b	1$

	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l (WindowPtr-DT,a5),a0 ;Change sprite back to normal
	move.l	a0,-(sp)
	movea.l	(Int_Base-DT,a5),a6
	SYS	ClearPointer

	movea.l (sp)+,a0
	moveq	#GADGETDOWN!GADGETUP,D0 ;Now we want messages again
	SYS	ModifyIDCMP

	clr.b	(ZZZFlag-DT,a5)
	movem.l	(sp)+,d0-d1/a0-a1/a6
1$	rts

*************************************************************************
* NAME:	SetupScreen()
* FUNCTION:	Create display.  Link gadgets to window.
* INPUTS:	None
* RETURN:	None
* SCRATCH:	D0-D4/A0-A2/A6
*************************************************************************

SetupScreen	movea.l	(Gfx_Base-DT,a5),a6
	movea.l (RastPtr-DT,a5),a2
	moveq	#2,d0	;Color background
	movea.l	a2,a1
	SYS	SetAPen

	moveq	#2,d0	;Xmin
	moveq	#1,d1	;Ymin
	move.w	#637,d2	;Xmax
	move.w	#188,d3	;Ymax
	movea.l	a2,a1
	SYS	RectFill

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	lea	(FirstGadget-DT,a5),a0
1$	move.w	(gg_LeftEdge,a0),d0
	subq.w	#2,d0
	move.w	(gg_TopEdge,a0),d1
	subq.w	#1,d1
	move.w	(gg_Width,a0),d2
	addq.w	#2,d2
	move.w	(gg_Height,a0),d3
	addq.w	#1,d3
	bsr	Box	;Draw gadget boxes
	move.l	(gg_NextGadget,a0),d0
	movea.l	d0,a0
	bne.b	1$

	lea	(TextCoords,pc),a0
	moveq	#8-1,d4
2$	move.w	(a0)+,d0
	move.w	(a0)+,d1
	move.w	(a0)+,d2
	move.w	(a0)+,d3
	bsr	Box	;Draw text boxes
	dbra	d4,2$

	lea	(Text.tbl,pc),a1
3$	move.w	(a1)+,d0
	beq.b	4$
	move.w	(a1)+,d1
	movea.l	(a1)+,a0
	bsr	Text	;Draw all the text
	bra.b	3$

4$	movea.l	(WindowPtr-DT,a5),a1
	movea.l	(wd_FirstGadget,a1),a0
	suba.l	a2,a2
	movea.l	(Int_Base-DT,a5),a6
	SYS	RefreshGadgets	;Redraw gadgets

	bsr	MakePointer
	bsr	GetFile	;Try to get our file
	bsr	RemPointer
	tst.l	d0	;If no file, or error
	bne.b	5$	; reading, set defaults

	moveq	#1,d0	;1024 byte default
	move.w	d0,(_BufSize01-DT,a5)
	move.w	d0,(_BufSize02-DT,a5)
	move.w	d0,(_BufSize11-DT,a5)
	move.w	d0,(_BufSize12-DT,a5)

	moveq	#6,d0	;1200 baud default
	move.w	d0,(_BaudRate01-DT,a5)
	move.w	d0,(_BaudRate02-DT,a5)
	move.w	d0,(_BaudRate11-DT,a5)
	move.w	d0,(_BaudRate12-DT,a5)

	moveq	#3,d0	;8 bits default
	move.b	d0,(_WordLen01-DT,a5)
	move.b	d0,(_WordLen02-DT,a5)
	move.b	d0,(_WordLen11-DT,a5)
	move.b	d0,(_WordLen12-DT,a5)

	moveq	#0,d0	;1 bit default
	move.b	d0,(_StopBits01-DT,a5)
	move.b	d0,(_StopBits02-DT,a5)
	move.b	d0,(_StopBits11-DT,a5)
	move.b	d0,(_StopBits12-DT,a5)

	moveq	#4,d0	;No parity default
	move.b	d0,(_Parity01-DT,a5)
	move.b	d0,(_Parity02-DT,a5)
	move.b	d0,(_Parity11-DT,a5)
	move.b	d0,(_Parity12-DT,a5)

	moveq	#0,d0	;RTS/CTS default
	move.b	d0,(_Shake01-DT,a5)
	move.b	d0,(_Shake02-DT,a5)
	move.b	d0,(_Shake11-DT,a5)
	move.b	d0,(_Shake12-DT,a5)

5$	move.w	(_BufSize01-DT,a5),d0 ;Whether by prefs file
	bsr	DoBuf01	    ;or by defaults, set strings.
	move.w	(_BufSize02-DT,a5),d0
	bsr	DoBuf02
	move.w	(_BufSize11-DT,a5),d0
	bsr	DoBuf11
	move.w	(_BufSize12-DT,a5),d0
	bsr	DoBuf12

	move.w	(_BaudRate01-DT,a5),d0
	bsr	DoBaud01
	move.w	(_BaudRate02-DT,a5),d0
	bsr	DoBaud02
	move.w	(_BaudRate11-DT,a5),d0
	bsr	DoBaud11
	move.w	(_BaudRate12-DT,a5),d0
	bsr	DoBaud12

	lea	(WordLen01.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_WordLen01-DT,a5),d0
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#4,d0
	bsr	MutualExclude

	lea	(StopBit01.0_gad-DT,a5),a0
	movea.l	a0,a2	 ;0 offset = 1 Bit
	tst.b	(_StopBits01-DT,a5)
	beq.b	9$
	lea	(gg_SIZEOF,a2),a2	;1 offset = 2 bits
9$	moveq	#2,d0
	bsr	MutualExclude

	lea	(Parity01.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Parity01-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#5,d0
	bsr	MutualExclude

	lea	(Shake01.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Shake01-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#3,d0
	bsr	MutualExclude

	lea	(WordLen02.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_WordLen02-DT,a5),d0
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#4,d0
	bsr	MutualExclude

	lea	(StopBit02.0_gad-DT,a5),a0
	movea.l	a0,a2	  ;0 offset = 1 Bit
	tst.b	(_StopBits02-DT,a5)
	beq.b	11$
	lea	(gg_SIZEOF,a2),a2	;1 offset = 2 bits
11$	moveq	#2,d0
	bsr	MutualExclude

	lea	(Parity02.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Parity02-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#5,d0
	bsr	MutualExclude

	lea	(Shake02.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Shake02-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#3,d0
	bsr	MutualExclude

	lea	(WordLen11.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_WordLen11-DT,a5),d0
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#4,d0
	bsr	MutualExclude

	lea	(StopBit11.0_gad-DT,a5),a0
	movea.l	a0,a2	  ;0 offset = 1 Bit
	tst.b	(_StopBits11-DT,a5)
	beq.b	13$
	lea	(gg_SIZEOF,a2),a2	;1 offset = 2 bits
13$	moveq	#2,d0
	bsr	MutualExclude

	lea	(Parity11.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Parity11-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#5,d0
	bsr	MutualExclude

	lea	(Shake11.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Shake11-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#3,d0
	bsr	MutualExclude

	lea	(WordLen12.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_WordLen12-DT,a5),d0
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#4,d0
	bsr	MutualExclude

	lea	(StopBit12.0_gad-DT,a5),a0
	movea.l	a0,a2	  ;0 offset = 1 Bit
	tst.b	(_StopBits12-DT,a5)
	beq.b	15$
	lea	(gg_SIZEOF,a2),a2	;1 offset = 2 bits
15$	moveq	#2,d0
	bsr	MutualExclude

	lea	(Parity12.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Parity12-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#5,d0
	bsr	MutualExclude

	lea	(Shake12.0_gad-DT,a5),a0
	moveq	#0,d0
	move.b	(_Shake12-DT,a5),d0 ;Value = offset
	mulu.w	#gg_SIZEOF,d0
	lea	(0,a0,d0.w),a2
	moveq	#3,d0
	bsr	MutualExclude
	rts

*************************************************************************
* NAME:	Box()
* FUNCTION:	Draws a box with double verticals for 640x200 mode.
* INPUTS:	D0:16 = LeftEdge, D1:16 = TopEdge
*	D2:16 = Width,    D3:16 = Height
* RETURN:	None
* SCRATCH:	None
*************************************************************************

Box	movem.l	d0-d3/a0-a2/a6,-(sp)
	movea.l	(Gfx_Base-DT,a5),a6
	movea.l (RastPtr-DT,a5),a2
	add.w	d0,d2	;LeftEdge + Width = Xmax
	add.w	d1,d3	;TopEdge + Height = Ymax
	movem.l d0-d3,-(sp)

	moveq	#1,d0	;Do outside rect w/color #1
	movea.l	a2,a1
	SYS	SetAPen

	movem.l (sp),d0-d3
	movea.l	a2,a1
	SYS	RectFill

	moveq	#0,d0	;Do inside rect w/color #0
	movea.l	a2,a1
	SYS	SetAPen

	movem.l (sp)+,d0-d3
	addq.w	#2,d0
	subq.w	#2,d2
	addq.w	#1,d1
	subq.w	#1,d3
	movea.l	a2,a1
	SYS	RectFill
	movem.l	(sp)+,d0-d3/a0-a2/a6
	rts

*************************************************************************
* NAME:	Clear()
* FUNCTION:	Clear BufSize or BaudRate text area.
* INPUTS:	D1:16 = BaseLine
* RETURN:	None
* SCRATCH:	D2-D3
*************************************************************************

Clear	movem.l	d0-d1/a0-a2/a6,-(sp)
	movea.l	(Gfx_Base-DT,a5),a6
	movea.l (RastPtr-DT,a5),a2
	moveq	#77,d0	;Xmin
	move.w	d0,d2
	addi.w	#68,d2	;Xmax
	move.w	d1,d3
	subq.w	#8,d1	;Ymin
	addq.w	#3,d3	;Ymax
	movem.l	d0-d1/a0,-(sp)

	movea.l	a2,a1
	SYS	Move

	moveq	#0,d0
	movea.l	a2,a1
	SYS	SetAPen

	moveq	#RP_JAM1,d0
	movea.l	a2,a1
	SYS	SetDrMd

	movem.l	(sp)+,d0-d1/a0
	movea.l	a2,a1
	SYS	RectFill
	movem.l	(sp)+,d0-d1/a0-a2/a6
	rts

*************************************************************************
* NAME:	Text()
* FUNCTION:	Writes text to the screen.
* INPUTS:	D0:16 = LeftEdge
*	D1:16 = TopEdge
*	A0    = Ptr to text.
* RETURN:	None
* SCRATCH:	None
*************************************************************************

Text	movem.l	d0-d1/a0-a2/a6,-(sp)
	movea.l	(Gfx_Base-DT,a5),a6
	movea.l (RastPtr-DT,a5),a2
	move.l	a0,-(sp)
		
	movea.l	a2,a1
	SYS	Move

	moveq	#1,d0
	movea.l	a2,a1
	SYS	SetAPen

	moveq	#RP_JAM1,d0
	movea.l	a2,a1
	SYS	SetDrMd

	movea.l	(sp)+,a0
	bsr.b	strlen
	movea.l	a2,a1
	SYS	Text
	movem.l	(sp)+,d0-d1/a0-a2/a6
	rts

strlen	move.l	a0,d0
1$	tst.b	(a0)+
	bne.b	1$
	exg	a0,d0
	sub.l	a0,d0
	subq.l	#1,d0
	rts

TextCoords	dw	75,16,72,15		;ACIA 0,UNIT 1:BufSize Box
	dw	75,31,72,15		;ACIA 0,UNIT 1:BaudRate Box

	dw	75,56,72,15		;ACIA 0,UNIT 1:BufSize Box
	dw	75,71,72,15		;ACIA 0,UNIT 1:BaudRate Box

	dw	75,96,72,15		;ACIA 0,UNIT 1:BufSize Box
	dw	75,111,72,15		;ACIA 0,UNIT 1:BaudRate Box

	dw	75,136,72,15		;ACIA 0,UNIT 1:BufSize Box
	dw	75,151,72,15		;ACIA 0,UNIT 1:BaudRate Box

Text.tbl	sett	82,12,BufSize.txt	;All window text coords & ptrs
	sett	87,176,BaudRate.txt
	sett	188,12,WordLen.txt
	sett	293,12,StopBits.txt
	sett	405,12,Parity.txt
	sett	531,12,Handshak.txt

	sett	12,34,UNIT1.txt
	sett	12,74,UNIT2.txt
	sett	12,114,UNIT3.txt
	sett	12,154,UNIT4.txt
	dw	0

BufTxt.tbl	dl	Buf512.txt	;Text ptrs for BufSize
	dl	Buf1024.txt
	dl	Buf2048.txt
	dl	Buf4096.txt
	dl	Buf8192.txt
	dl	Buf16384.txt
	dl	Buf32768.txt
	dl	Buf65536.txt

BaudTxt.tbl	dl	Baud50.txt	;Text ptrs for BaudRate
	dl	Baud110.txt
	dl	Baud134.txt
	dl	Baud150.txt
	dl	Baud300.txt
	dl	Baud600.txt
	dl	Baud1200.txt
	dl	Baud1800.txt
	dl	Baud2400.txt
	dl	Baud3600.txt
	dl	Baud4800.txt
	dl	Baud7200.txt
	dl	Baud9600.txt
	dl	Baud19200.txt
	dl	Baud38400.txt
	dl	BaudMIDI.txt

UNIT1.txt	cstr	'UNIT 1'	;All program text
UNIT2.txt	cstr	'UNIT 2'
UNIT3.txt	cstr	'UNIT 3'
UNIT4.txt	cstr	'UNIT 4'
BufSize.txt	cstr	'Buffer Size'
BaudRate.txt	cstr	'Baud Rate'
WordLen.txt	cstr	'Word Length'
StopBits.txt	cstr	'Stop Bits'
Parity.txt	cstr	'Parity'
Handshak.txt	cstr	'Handshaking'
Buf512.txt	cstr	'512'
Buf1024.txt	cstr	'1024'
Buf2048.txt	cstr	'2048'
Buf4096.txt	cstr	'4096'
Buf8192.txt	cstr	'8192'
Buf16384.txt	cstr	'16384'
Buf32768.txt	cstr	'32768'
Buf65536.txt	cstr	'65536'
Baud50.txt	cstr	'50'
Baud110.txt	cstr	'110'
Baud134.txt	cstr	'134'
Baud150.txt	cstr	'150'
Baud300.txt	cstr	'300'
Baud600.txt	cstr	'600'
Baud1200.txt	cstr	'1200'
Baud1800.txt	cstr	'1800'
Baud2400.txt	cstr	'2400'
Baud3600.txt	cstr	'3600'
Baud4800.txt	cstr	'4800'
Baud7200.txt	cstr	'7200'
Baud9600.txt	cstr	'9600'
Baud19200.txt	cstr	'19200'
Baud38400.txt	cstr	'38400'
BaudMIDI.txt	cstr	'MIDI'
Len5.txt	cstr	'5'
Len6.txt	cstr	'6'
Len7.txt	cstr	'7'
Len8.txt	cstr	'8'
Stop1.txt	cstr	'1'
Stop2.txt	cstr	'2'
ParEven.txt	cstr	'Even'
ParOdd.txt	cstr	'Odd'
ParMark.txt	cstr	'Mark'
ParSpace.txt	cstr	'Space'
ParNone.txt	cstr	'None'
RTS_CTS.txt	cstr	'RTS/CTS'
xON_xOFF.txt	cstr	'Xon/Xoff'
Save.txt	cstr	'Save'
Cancel.txt	cstr	'Cancel'

DosName	cstr	'dos.library'
IntName	cstr	'intuition.library'
GfxName	cstr	'graphics.library'
FontName	cstr	'topaz.font'
ScreenTtl	cstr	'SerialPrefs - ©1990 The Puzzle Factory'

	SECTION	sprite,DATA,CHIP

UpData	dw	%0000000000011100,%0000000000000000
	dw	%0000000001111111,%0000000000000000
	dw	%0000000111111111,%1100000000000000
	dw	%0000011111111111,%1111000000000000
	dw	%0001111111111111,%1111110000000000
	dw	%0000000000000000,%0000000000000000

DownData	dw	%0001111111111111,%1111110000000000
	dw	%0000011111111111,%1111000000000000
	dw	%0000000111111111,%1100000000000000
	dw	%0000000001111111,%0000000000000000
	dw	%0000000000011100,%0000000000000000
	dw	%0000000000000000,%0000000000000000

SpriteData	dw	0,0
	dw	%0000000000000000,%0000000000000000
	dw	%0000000000000000,%0000000000000000
	dw	%0000011100100000,%0000011100100000
	dw	%0000111111100000,%0000111111100000
	dw	%0011111111110000,%0011111111110000
	dw	%0111111111110000,%0110000111110000
	dw	%0111111111111000,%0111101111111000
	dw	%0111111111111100,%0111011111111100
	dw	%1111111111111100,%1110000111111100
	dw	%0011111111111110,%0011111111111110
	dw	%0111111111111111,%0111111100001111
	dw	%0011111111111110,%0011111111011110
	dw	%0111111111111110,%0111111110111110
	dw	%0011111111111100,%0011111100001100
	dw	%0001111111111000,%0001111111111000
	dw	%0000011111110000,%0000011111110000
	dw	%0000000111000000,%0000000111000000
	dw	%0000011100000000,%0000011100000000
	dw	%0000111111000000,%0000111111000000
	dw	%0000010110000000,%0000010110000000
	dw	%0000000000000000,%0000000000000000
	dw	%0000000011000000,%0000000011000000
	dw	%0000000011100000,%0000000011100000
	dw	%0000000001000000,%0000000001000000
	dw	0,0

	SECTION	vars,DATA
DT
MyTextAttr	dl	FontName	;Topaz 8 font
	dw	8
	db	FS_NORMAL
	db	FPF_ROMFONT

MyScreen	dw	0,0,640,200,2
	db	0,1
	dw	V_HIRES
	dw	CUSTOMSCREEN
	dl	MyTextAttr,ScreenTtl,0,0

MyWindow	dw	0,10,640,190
	db	0,1
	dl	GADGETDOWN!GADGETUP
	dl	SMART_REFRESH!NOCAREREFRESH!ACTIVATE
	dl	FirstGadget,0,0,0,0
	dw	0,0,0,0,CUSTOMSCREEN

FirstGadget:
BufUP01_gad	dl	BufDN01_gad
	dw	148,17,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	0
	dl	BufUP01	;00=ACIA 0,UNIT 1:BufSize/UP

BufDN01_gad	dl	BuadUP01_gad
	dw	148,24,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	1
	dl	BufDN01	;01=ACIA 0,UNIT 1:BufSize/DN

BuadUP01_gad	dl	BuadDN01_gad
	dw	148,32,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	2
	dl	BaudUP01	;02=ACIA 0,UNIT 1:BaudRate/UP

BuadDN01_gad	dl	WordLen01.0_gad
	dw	148,39,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	3
	dl	BaudDN01	;03=ACIA 0,UNIT 1:BaudRate/DN

WordLen01.0_gad	dl	WordLen01.1_gad
	dw	200,17,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len5.ITxt,0,0
	dw	4
	dl	WordLen01	;04=ACIA 0,UNIT 1:WordLen/5

WordLen01.1_gad	dl	WordLen01.2_gad
	dw	234,17,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len6.ITxt,0,0
	dw	5
	dl	WordLen01	;06=ACIA 0,UNIT 1:WordLen/6

WordLen01.2_gad	dl	WordLen01.3_gad
	dw	200,32,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len7.ITxt,0,0
	dw	6
	dl	WordLen01	;05=ACIA 0,UNIT 1:WordLen/7

WordLen01.3_gad	dl	StopBit01.0_gad
	dw	234,32,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len8.ITxt,0,0
	dw	7
	dl	WordLen01	;07=ACIA 0,UNIT 1:WordLen/8

StopBit01.0_gad	dl	StopBit01.1_gad
	dw	291,17,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop1.ITxt,0,0
	dw	8
	dl	StopBit01	;08=ACIA 0,UNIT 1:StopBit/1

StopBit01.1_gad	dl	Parity01.0_gad
	dw	291,32,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop2.ITxt,0,0
	dw	9
	dl	StopBit01	;09=ACIA 0,UNIT 1:StopBit/2

Parity01.0_gad	dl	Parity01.1_gad
	dw	457,17,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParEven.ITxt,0,0
	dw	10
	dl	Parity01	;13=ACIA 0,UNIT 1:Parity/O

Parity01.1_gad	dl	Parity01.2_gad
	dw	349,17,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParOdd.ITxt,0,0
	dw	11
	dl	Parity01	;10=ACIA 0,UNIT 1:Parity/E

Parity01.2_gad	dl	Parity01.3_gad
	dw	349,32,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParMark.ITxt,0,0
	dw	12
	dl	Parity01	;11=ACIA 0,UNIT 1:Parity/M

Parity01.3_gad	dl	Parity01.4_gad
	dw	457,32,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParSpace.ITxt,0,0
	dw	13
	dl	Parity01	;14=ACIA 0,UNIT 1:Parity/S

Parity01.4_gad	dl	Shake01.0_gad
	dw	403,17,53,29
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParNone.ITxt,0,0
	dw	14
	dl	Parity01	;12=ACIA 0,UNIT 1:Parity/N

Shake01.0_gad	dl	Shake01.1_gad
	dw	536,17,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,RTS_CTS.ITxt,0,0
	dw	15
	dl	Shake01	;15=ACIA 0,UNIT 1:RTS/CTS

Shake01.1_gad	dl	Shake01.2_gad
	dw	536,27,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,xON_xOFF.ITxt,0,0
	dw	16
	dl	Shake01	;16=ACIA 0,UNIT 1:xON/xOFF

Shake01.2_gad	dl	BufUP02_gad
	dw	536,37,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,NoShake.ITxt,0,0
	dw	17
	dl	Shake01	;16=ACIA 0,UNIT 1:None

BufUP02_gad	dl	BufDN02_gad
	dw	148,57,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	20
	dl	BufUP02	;17=ACIA 0,UNIT 2:BufSize/UP

BufDN02_gad	dl	BuadUP02_gad
	dw	148,64,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	21
	dl	BufDN02	;18=ACIA 0,UNIT 2:BufSize/DN

BuadUP02_gad	dl	BuadDN02_gad
	dw	148,72,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	22
	dl	BaudUP02	;19=ACIA 0,UNIT 2:BaudRate/UP

BuadDN02_gad	dl	WordLen02.0_gad
	dw	148,79,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	23
	dl	BaudDN02	;20=ACIA 0,UNIT 2:BaudRate/DN

WordLen02.0_gad	dl	WordLen02.1_gad
	dw	200,57,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len5.ITxt,0,0
	dw	24
	dl	WordLen02	;21=ACIA 0,UNIT 2:WordLen/5

WordLen02.1_gad	dl	WordLen02.2_gad
	dw	234,57,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len6.ITxt,0,0
	dw	25
	dl	WordLen02	;23=ACIA 0,UNIT 2:WordLen/6

WordLen02.2_gad	dl	WordLen02.3_gad
	dw	200,72,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len7.ITxt,0,0
	dw	26
	dl	WordLen02	;22=ACIA 0,UNIT 2:WordLen/7

WordLen02.3_gad	dl	StopBit02.0_gad
	dw	234,72,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len8.ITxt,0,0
	dw	27
	dl	WordLen02	;24=ACIA 0,UNIT 2:WordLen/8

StopBit02.0_gad	dl	StopBit02.1_gad
	dw	291,57,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop1.ITxt,0,0
	dw	28
	dl	StopBit02	;25=ACIA 0,UNIT 2:StopBit/1

StopBit02.1_gad	dl	Parity02.0_gad
	dw	291,72,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop2.ITxt,0,0
	dw	29
	dl	StopBit02	;26=ACIA 0,UNIT 2:StopBit/2

Parity02.0_gad	dl	Parity02.1_gad
	dw	457,57,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParEven.ITxt,0,0
	dw	30
	dl	Parity02	;30=ACIA 0,UNIT 2:Parity/O

Parity02.1_gad	dl	Parity02.2_gad
	dw	349,57,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParOdd.ITxt,0,0
	dw	31
	dl	Parity02	;27=ACIA 0,UNIT 2:Parity/E

Parity02.2_gad	dl	Parity02.3_gad
	dw	349,72,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParMark.ITxt,0,0
	dw	32
	dl	Parity02	;28=ACIA 0,UNIT 2:Parity/M

Parity02.3_gad	dl	Parity02.4_gad
	dw	457,72,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParSpace.ITxt,0,0
	dw	33
	dl	Parity02	;31=ACIA 0,UNIT 2:Parity/S

Parity02.4_gad	dl	Shake02.0_gad
	dw	403,57,53,29
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParNone.ITxt,0,0
	dw	34
	dl	Parity02	;29=ACIA 0,UNIT 2:Parity/N

Shake02.0_gad	dl	Shake02.1_gad
	dw	536,57,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,RTS_CTS.ITxt,0,0
	dw	35
	dl	Shake02	;32=ACIA 0,UNIT 2:RTS/CTS

Shake02.1_gad	dl	Shake02.2_gad
	dw	536,67,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,xON_xOFF.ITxt,0,0
	dw	36
	dl	Shake02	;33=ACIA 0,UNIT 2:xON/xOFF

Shake02.2_gad	dl	BufUP11_gad
	dw	536,77,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,NoShake.ITxt,0,0
	dw	37
	dl	Shake02	;16=ACIA 0,UNIT 2:None

BufUP11_gad	dl	BufDN11_gad
	dw	148,97,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	40
	dl	BufUP11	;34=ACIA 1,UNIT 1:BufSize/UP

BufDN11_gad	dl	BuadUP11_gad
	dw	148,104,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	41
	dl	BufDN11	;35=ACIA 1,UNIT 1:BufSize/DN

BuadUP11_gad	dl	BuadDN11_gad
	dw	148,112,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	42
	dl	BaudUP11	;36=ACIA 1,UNIT 1:BaudRate/UP

BuadDN11_gad	dl	WordLen11.0_gad
	dw	148,119,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	43
	dl	BaudDN11	;37=ACIA 1,UNIT 1:BaudRate/DN

WordLen11.0_gad	dl	WordLen11.1_gad
	dw	200,97,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len5.ITxt,0,0
	dw	44
	dl	WordLen11	;38=ACIA 1,UNIT 1:WordLen/5

WordLen11.1_gad	dl	WordLen11.2_gad
	dw	234,97,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len6.ITxt,0,0
	dw	45
	dl	WordLen11	;40=ACIA 1,UNIT 1:WordLen/6

WordLen11.2_gad	dl	WordLen11.3_gad
	dw	200,112,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len7.ITxt,0,0
	dw	46
	dl	WordLen11	;39=ACIA 1,UNIT 1:WordLen/7

WordLen11.3_gad	dl	StopBit11.0_gad
	dw	234,112,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len8.ITxt,0,0
	dw	47
	dl	WordLen11	;41=ACIA 1,UNIT 1:WordLen/8

StopBit11.0_gad	dl	StopBit11.1_gad
	dw	291,97,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop1.ITxt,0,0
	dw	48
	dl	StopBit11	;42=ACIA 1,UNIT 1:StopBit/1

StopBit11.1_gad	dl	Parity11.0_gad
	dw	291,112,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop2.ITxt,0,0
	dw	49
	dl	StopBit11	;43=ACIA 1,UNIT 1:StopBit/2

Parity11.0_gad	dl	Parity11.1_gad
	dw	457,97,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParEven.ITxt,0,0
	dw	50
	dl	Parity11	;47=ACIA 1,UNIT 1:Parity/O

Parity11.1_gad	dl	Parity11.2_gad
	dw	349,97,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParOdd.ITxt,0,0
	dw	51
	dl	Parity11	;44=ACIA 1,UNIT 1:Parity/E

Parity11.2_gad	dl	Parity11.3_gad
	dw	349,112,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParMark.ITxt,0,0
	dw	52
	dl	Parity11	;45=ACIA 1,UNIT 1:Parity/M

Parity11.3_gad	dl	Parity11.4_gad
	dw	457,112,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParSpace.ITxt,0,0
	dw	53
	dl	Parity11	;48=ACIA 1,UNIT 1:Parity/S

Parity11.4_gad	dl	Shake11.0_gad
	dw	403,97,53,29
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParNone.ITxt,0,0
	dw	54
	dl	Parity11	;46=ACIA 1,UNIT 1:Parity/N

Shake11.0_gad	dl	Shake11.1_gad
	dw	536,97,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,RTS_CTS.ITxt,0,0
	dw	55
	dl	Shake11	;49=ACIA 1,UNIT 1:RTS/CTS

Shake11.1_gad	dl	Shake11.2_gad
	dw	536,107,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,xON_xOFF.ITxt,0,0
	dw	56
	dl	Shake11	;50=ACIA 1,UNIT 1:xON/xOFF

Shake11.2_gad	dl	BufUP12_gad
	dw	536,117,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,NoShake.ITxt,0,0
	dw	57
	dl	Shake11	;16=ACIA 1,UNIT 1:None

BufUP12_gad	dl	BufDN12_gad
	dw	148,137,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	60
	dl	BufUP12	;51=ACIA 1,UNIT 2:BufSize/UP

BufDN12_gad	dl	BuadUP12_gad
	dw	148,144,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	61
	dl	BufDN12	;52=ACIA 1,UNIT 2:BufSize/DN

BuadUP12_gad	dl	BuadDN12_gad
	dw	148,152,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	UpImage,0,0,0,0
	dw	62
	dl	BaudUP12	;53=ACIA 1,UNIT 2:BaudRate/UP

BuadDN12_gad	dl	WordLen12.0_gad
	dw	148,159,26,7
	dw	GADGIMAGE!GADGHCOMP
	dw	GADGIMMEDIATE!RELVERIFY
	dw	BOOLGADGET
	dl	DownImage,0,0,0,0
	dw	63
	dl	BaudDN12	;54=ACIA 1,UNIT 2:BaudRate/DN

WordLen12.0_gad	dl	WordLen12.1_gad
	dw	200,137,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len5.ITxt,0,0
	dw	64
	dl	WordLen12	;55=ACIA 1,UNIT 2:WordLen/5

WordLen12.1_gad	dl	WordLen12.2_gad
	dw	234,137,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len6.ITxt,0,0
	dw	65
	dl	WordLen12	;57=ACIA 1,UNIT 2:WordLen/6

WordLen12.2_gad	dl	WordLen12.3_gad
	dw	200,152,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len7.ITxt,0,0
	dw	66
	dl	WordLen12	;56=ACIA 1,UNIT 2:WordLen/7

WordLen12.3_gad	dl	StopBit12.0_gad
	dw	234,152,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Len8.ITxt,0,0
	dw	67
	dl	WordLen12	;58=ACIA 1,UNIT 2:WordLen/8

StopBit12.0_gad	dl	StopBit12.1_gad
	dw	291,137,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop1.ITxt,0,0
	dw	68
	dl	StopBit12	;59=ACIA 1,UNIT 2:StopBit/1

StopBit12.1_gad	dl	Parity12.0_gad
	dw	291,152,33,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,Stop2.ITxt,0,0
	dw	69
	dl	StopBit12	;60=ACIA 1,UNIT 2:StopBit/2

Parity12.0_gad	dl	Parity12.1_gad
	dw	457,137,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParEven.ITxt,0,0
	dw	70
	dl	Parity12	;64=ACIA 1,UNIT 2:Parity/O

Parity12.1_gad	dl	Parity12.2_gad
	dw	349,137,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParOdd.ITxt,0,0
	dw	71
	dl	Parity12	;61=ACIA 1,UNIT 2:Parity/E

Parity12.2_gad	dl	Parity12.3_gad
	dw	349,152,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParMark.ITxt,0,0
	dw	72
	dl	Parity12	;62=ACIA 1,UNIT 2:Parity/M

Parity12.3_gad	dl	Parity12.4_gad
	dw	457,152,53,14
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParSpace.ITxt,0,0
	dw	73
	dl	Parity12	;65=ACIA 1,UNIT 2:Parity/S

Parity12.4_gad	dl	Shake12.0_gad
	dw	403,137,53,29
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,ParNone.ITxt,0,0
	dw	74
	dl	Parity12	;63=ACIA 1,UNIT 2:Parity/N

Shake12.0_gad	dl	Shake12.1_gad
	dw	536,137,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,RTS_CTS.ITxt,0,0
	dw	75
	dl	Shake12	;66=ACIA 1,UNIT 2:RTS/CTS

Shake12.1_gad	dl	Shake12.2_gad
	dw	536,147,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,xON_xOFF.ITxt,0,0
	dw	76
	dl	Shake12	;67=ACIA 1,UNIT 2:xON/xOFF

Shake12.2_gad	dl	Save_gad
	dw	536,157,78,9
	dw	GADGHNONE
	dw	GADGIMMEDIATE
	dw	BOOLGADGET
	dl	0,0,NoShake.ITxt,0,0
	dw	77
	dl	Shake12	;16=ACIA 1,UNIT 2:None

Save_gad	dl	Cancel_gad
	dw	200,173,180,12
	dw	GADGHCOMP
	dw	RELVERIFY
	dw	BOOLGADGET
	dl	0,0,Save.ITxt,0,0
	dw	80
	dl	SaveGad	;68=Save

Cancel_gad	dl	0
	dw	434,173,180,12
	dw	GADGHCOMP
	dw	RELVERIFY
	dw	BOOLGADGET
	dl	0,0,Cancel.ITxt,0,0
	dw	81
	dl	CancelGad	;69=Cancel

Len5.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Len5.txt,0

Len6.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Len6.txt,0

Len7.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Len7.txt,0

Len8.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Len8.txt,0

Stop1.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Stop1.txt,0

Stop2.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,Stop2.txt,0

ParEven.ITxt	db	1,0,RP_JAM1,0
	dw	10,4
	dl	MyTextAttr,ParEven.txt,0

ParOdd.ITxt	db	1,0,RP_JAM1,0
	dw	12,4
	dl	MyTextAttr,ParOdd.txt,0

ParMark.ITxt	db	1,0,RP_JAM1,0
	dw	10,4
	dl	MyTextAttr,ParMark.txt,0

ParSpace.ITxt	db	1,0,RP_JAM1,0
	dw	6,4
	dl	MyTextAttr,ParSpace.txt,0

ParNone.ITxt	db	1,0,RP_JAM1,0
	dw	8,11
	dl	MyTextAttr,ParNone.txt,0

RTS_CTS.ITxt	db	1,0,RP_JAM1,0
	dw	8,1
	dl	MyTextAttr,RTS_CTS.txt,0

xON_xOFF.ITxt	db	1,0,RP_JAM1,0
	dw	6,1
	dl	MyTextAttr,xON_xOFF.txt,0

NoShake.ITxt	db	1,0,RP_JAM1,0
	dw	22,1
	dl	MyTextAttr,ParNone.txt,0

Save.ITxt	db	1,0,RP_JAM1,0
	dw	72,2
	dl	MyTextAttr,Save.txt,0

Cancel.ITxt	db	1,0,RP_JAM1,0
	dw	66,2
	dl	MyTextAttr,Cancel.txt,0

UpImage	dw	0,1,25,6,1	;Left,Top,Width,Height,Depth
	dl	UpData	;*ImageData
	db	%0001,%0000	;PlanePick,PlaneOnOff
	dl	0	;*NextImage

DownImage	dw	0,1,25,6,1
	dl	DownData
	db	%0001,%0000
	dl	0

BSS_Start:
Dos_Base	dx.l	1	;Ptr to dos.library
stdout	dx.l	1	;FileHandle
Int_Base	dx.l	1	;Ptr to intuition.library
Gfx_Base	dx.l	1	;Ptr to graphics.library
WBenchMsg	dx.l	1	;Initial WBench msg
ScreenPtr	dx.l	1	;Ptr to Screen structure
WindowPtr	dx.l	1	;Ptr to Window structure
RastPtr	dx.l	1	;Ptr to Window's RastPort
PortPtr	dx.l	1	;Ptr to Window's UserPort

*** New SerialPrefs Structure ***

MySerPrefs			;For ACIA 0, Unit 1
_BufSize01	dx.w	1	;0-7
_BaudRate01	dx.w	1	;0-15
_WordLen01	dx.b	1	;0=5, 1=6, 2=7, 3=8
_StopBits01	dx.b	1	;0=1, 1=2
_Parity01	dx.b	1	;0=Odd, 1=Even, 2=Mark, 3=Space, 4=None
_Shake01	dx.b	1	;0=RTS/CTS, 1=xON/xOFF, 2=None

_BufSize02	dx.w	1	;Same for ACIA 0, Unit 2
_BaudRate02	dx.w	1
_WordLen02	dx.b	1
_StopBits02	dx.b	1
_Parity02	dx.b	1
_Shake02	dx.b	1

_BufSize11	dx.w	1	;Same for ACIA 1, Unit 1
_BaudRate11	dx.w	1
_WordLen11	dx.b	1
_StopBits11	dx.b	1
_Parity11	dx.b	1
_Shake11	dx.b	1

_BufSize12	dx.w	1	;Same for ACIA 1, Unit 2
_BaudRate12	dx.w	1
_WordLen12	dx.b	1
_StopBits12	dx.b	1
_Parity12	dx.b	1
_Shake12	dx.b	1

CloseFlag	dx.b	1	;0=OK, 1=Close program
ZZZFlag	dx.b	1	;1=Mouse ptr is currently a ZZZ cloud
BSS_Len	equ	*-BSS_Start

	end
