******************************************
*					 *
* Xoper 2.6 Copyright (C) Werner GÜnther *
*    (68881 code by Lothar English)      *
*(Kick 2.0+ enhancements by Gunther Nikl)*
*					 *
******************************************
*  Written for the A68k V2.71 Assembler	 *
* by Charlie Gibbs and Brian R. Anderson *
*					 *
* Do not use Smallcode/Smalldata when	 *
*		linking			 *
******************************************

;DEBUG SET 1

; revison control...

VERSION		macro
		dc.b	'Xoper 2.6 (17.11.95)',0
		endm

; include stuff

		include	exec/types.i
		include	lvo13/dos_lib.i
		include	lvo13/exec_lib.i
		include	lvo13/console_lib.i
		include	lvo13/graphics_lib.i
		include	lvo13/diskfont_lib.i
		include	lvo13/intuition_lib.i

; >=V36 functions

_LVOColdReboot		equ	-726		; exec
_LVOFindDisplayInfo	equ	-726		; graphics
_LVOGetDisplayInfoData	equ	-756
_LVOGetVPModeID		equ	-792
_LVOQueryOverscan	equ	-474		; intuition
_LVOLockPubScreen	equ	-510
_LVOUnlockPubScreen	equ	-516
_LVOLockPubScreenList	equ	-522
_LVOUnlockPubScreenList	equ	-528
_LVOPubScreenStatus	equ	-552
_LVOReadEClock		equ	-60		; timer
_LVOAddAppIcon		equ	-60		; workbench
_LVORemoveAppIcon	equ	-66
_LVOCreateCxObj		equ	-30		; commodity
_LVOCxBroker		equ	-36
_LVOActivateCxObj	equ	-42
_LVODeleteCxObjAll	equ	-54
_LVOCxObjError		equ	-66
_LVOAttachCxObj		equ	-84
_LVOSetFilter		equ	-120
_LVOCxMsgType		equ	-138
_LVOCxMsgID		equ	-150

; macro stuff

CALL		MACRO
		move.l	\2,a6
		jsr	_LVO\1(a6)
		ENDM

RECALL		MACRO
		jsr	_LVO\1(a6)
		ENDM

ADDCMD		MACRO
cmdnum		set	cmdnum+1
		dc.b	\1,0
		ENDM

; global stuff

	STRUCTURE Globals,0

	  ULONG  sysbase
	  ULONG  dosbase
	  ULONG  intuibase
	  ULONG  gfxbase
	  ULONG  wbbase
	  ULONG  cxbase
	  ULONG  condev
	  ULONG  wbmsg
	  ULONG  wblock
	  ULONG  savesp
	  ULONG  idletask
	  ULONG  node
	  ULONG  parmtxt
	  ULONG  ptr
	  ULONG  auxsig
	  ULONG  mysignal			; init with $20000
	  ULONG  trapsig
	  ULONG  trapmask
	  ULONG  tasksigs
	  ULONG  cancelmask
	  ULONG  broker
	  ULONG  filter
	  ULONG  inputport
 	  ULONG  inputio
	  ULONG  startmess
	  ULONG  savedat
	  ULONG  wnptr
	  ULONG  ownfont
	  ULONG  topazfont
	  ULONG  aliaslist
	  ULONG  screenptr
	  ULONG  intuimsg
	  ULONG  mytask
	  ULONG  oldprwin
	  ULONG  pointer
	  ULONG  replyport
	  ULONG  finfoptr
	  ULONG  dispatches
	  ULONG  maxdisp
	  ULONG  oldswitches
	  ULONG  remembr
	  ULONG  remembr2
	  ULONG  snoopport
	  ULONG  captask
	  ULONG  capiscli
	  ULONG  capseg
	  ULONG  blanks
	  ULONG  hidestart
	  ULONG  iocount
	  ULONG  rastport
	  ULONG  outchain
	  ULONG  firstline
	  ULONG  oldfirstline
	  ULONG  numlines
	  ULONG  oldnumlines
	  ULONG  timeoutm
	  ULONG  gothline
	  ULONG  lastprinted
	  ULONG  oldlastprinted
	  ULONG  maxlines			; init with 500
	  ULONG  oldpageend
	  ULONG  secs
	  ULONG  mics
	  ULONG  time10
	  ULONG  tsecs
	  ULONG  tmics
	  ULONG  devicelock
	  ULONG  timerticks
	  ULONG  excpterror
	  ULONG  excpttask
	  ULONG  excptaddr
	  ULONG  excptpc
	  ULONG  lasttime
	  STRUCT newtime,4*2
	  STRUCT osecs,4*4
	  STRUCT tdtasks,4*4

	  ULONG  OldSwitch
	  ULONG  OldAddTask
	  ULONG  OldAllocMem
	  ULONG  OldFreeMem
	  ULONG  OldTrap
	  ULONG  OldProcTrap
	  ULONG  div32

	  UWORD  txheight
	  UWORD  txwidth
	  UWORD  firstpos
	  UWORD  colms
	  UWORD  timersig
	  UWORD  cxsig
	  UWORD  intuisig
	  UWORD  ibufferlen
	  UWORD  oldibuflen
	  UWORD  cposy
	  UWORD  curpos
	  UWORD  oldpos
	  UWORD  bottomin
	  UWORD  ipos
	  UWORD  hnum
	  UWORD  minnumchars			; init with 2
	  UWORD  maxhlines			; init with 10
	  UWORD  qualifier
	  UWORD  rows
	  UWORD  maxllength
	  UWORD  loffset
	  UWORD  repeatlen
	  UWORD  edline
	  UWORD  cmdptr
	  UWORD  currenty
	  UWORD  cmdcompnr
	  UWORD  cmdcomplen
	  UWORD  cmdcplen
	  UWORD  numtaskstimed
	  UWORD  tasksnum
	  UWORD  procnum

	  STRUCT hexarea,10
	  STRUCT binarea,12
	  STRUCT minus,2
	  STRUCT decimal,6

	  UBYTE  entries
	  UBYTE  timeout			; init with 5
	  UBYTE  newpri
	  UBYTE  tasktyp
	  UBYTE  getanswer
	  UBYTE  printed
	  UBYTE  useageon
	  UBYTE  tports
	  UBYTE  hideon				; init with
	  UBYTE  headon
	  UBYTE  tinfo
	  UBYTE  cmdcli				;    |
	  UBYTE  sorton				;    |
	  UBYTE  cxstate			;    |
	  UBYTE  iconifyon			;    V
	  UBYTE  propgadon
	  UBYTE  propupdate
	  UBYTE  finfopen			; -1 !!!!
	  UBYTE  patchmode
	  UBYTE  timerstate
	  UBYTE  cbreak
	  UBYTE  bool
	  UBYTE  wanttraps
	  UBYTE  addlines
	  UBYTE  gotguru
	  UBYTE  ownscreen
	  UBYTE  topaz
	  UBYTE  insmode
	  UBYTE  repeat
	  UBYTE  capgone
	  UBYTE  capwaiting
	  UBYTE  cliexec
	  UBYTE  appicn
	  UBYTE  pcheck
	  UBYTE  snoopon
	  UBYTE  msnoop
	  UBYTE  newtab
	  UBYTE  oldtab
	  UBYTE  bleft
	  UBYTE  waitexit
	  UBYTE  wantexit
	  UBYTE  wanthold
	  UBYTE  wantwindow
	  UBYTE  noscript
	  UBYTE  post_V34
	  UBYTE  post_V38
	  UBYTE  fromfile
	  UBYTE  keepio
	  UBYTE  timerdev1
	  UBYTE  timerdev2
	  UBYTE  inputdev
	  UBYTE  newlock
	  UBYTE  execpatch
	  UBYTE  cancelsig
	  UWORD  pad1

; make sure that mypacket is *ALWAYS* longword aligned !!!
	  STRUCT mypacket,68
; don't change argument order below !!!
	  STRUCT buffer,2800
	  STRUCT out,100+100
	  STRUCT dummy,80+40
	  STRUCT in,80+40
	  STRUCT cputime,1000
	  STRUCT taskstampid,128*4
	  STRUCT taskstamps,128*4
	  STRUCT usedtime,128*4
	  STRUCT ievent,32
	  STRUCT outevent,20
	  STRUCT inputbuffer,88+40
	  STRUCT timerio,40
	  STRUCT sampleio,40
	  STRUCT repeatbuffer,84+40
	  STRUCT hotkeybuf,42
	  STRUCT winkeybuf,110

	LABEL gb_SIZEOF

; some defines

mysigbit	equ	17
maxarg		equ	20

		SECTION	Xoper,CODE

start		lea	dataarea(pc),a4
		tst.w	detached(a4)		; already detached ?
		beq	mainprg
		move.l	d0,d2			; save possible arguments
		move.l	a0,a2
		move.l	a4,a1
		move.w	#(gb_SIZEOF>>2)-1,d1
1$		clr.l	(a1)+			; clear bss area
		dbra	d1,1$
		move.l	4,a6
		move.l	a6,sysbase(a4)
		move.l	276(a6),a3
		tst.l	172(a3)
		bne.s	initprg			; CLI started
		lea	92(a3),a0
		RECALL	WaitPort
		lea	92(a3),a0
		RECALL	GetMsg
		move.l	d0,wbmsg(a4)
		bsr.s	initprg
		RECALL	Forbid
		move.l	wbmsg(a4),a1
		jmp	_LVOReplyMsg(a6)	; no rc for wb

; some default values (before zero!)

initprg		addq.w	#2,mysignal(a4)		; mask := $20000
		move.w	#500,maxlines+2(a4)
		addq.w	#1,bottomin(a4)
		addq.w	#2,minnumchars(a4)
		move.w	#10,maxhlines(a4)
		move.w	#999,edline(a4)
		addq.b	#5,timeout(a4)
		subq.l	#1,hideon(a4)		; +headon+tinfo+cmdcli
		subq.l	#1,sorton(a4)		; +cxstate+iconifyon+propgadon
		subq.w	#1,propupdate(a4)	; +finfopen

; get arguments and detach program (if started from CLI)

		lea	378(a6),a0
		lea	dosname(a4),a1
		RECALL	FindName		; `open' dos
		move.l	d0,dosbase(a4)
		beq	1$
		move.l	wbmsg(a4),d0
		beq.s	9$			; not wb start
		bsr	GetToolTypes		; make cmdline for wb
9$		bsr	ParseCLI
		CALL	Forbid,sysbase(a4)
		lea	xopcon(a4),a1
		RECALL	FindPort
		move.l	d0,a5
		move.l	a5,d0
		beq.s	4$			; not found
		move.l	16(a5),a1
		move.l	mysignal(a4),d0
	IFND DEBUG				; kill for full version only !
		tst.b	bool(a4)
		beq.s	5$			; wakeup Xoper

; This code tries to remove Xoper from the System in case Xoper 'freezes'
; or crashes. It works as follows:
; Xoper leaves the address of its cleanup routine in the UserData field of
; its Task structure. EXEC's context-restore code leaves the current PC of
; a task in the first longword of the tasks stack. All we have to do is to
; copy the address of Xoper's cleanup routine to its stack and to reschedule
; Xoper (using Signal() in this case).

		move.l	54(a1),a0
		btst	#4,297(a6)		; AttnFlags FPU
		beq.s	6$			; no FPU
		moveq	#0,d0
		move.b	(a0),d1			; NULL frame ?
		beq.s	7$
		move.w	(a0),d1			; frame flag / format word
		lea	110+2(a0),a0		; offset to fpu regs
		addq.w	#1,d1			; -1 ?
		beq.s	8$
		lea	12(a0),a0		; add 3 longs
8$		move.b	1(a0),d0		; frame size
7$		lea	4(a0,d0.w),a0
6$		move.l	88(a1),d0
		beq.s	4$			; exit already started
		move.l	d0,0(a0)
		moveq	#-1,d0
	ENDC
5$		RECALL	Signal
4$		RECALL	Permit
		move.l	a5,d0
		bne.s	1$
		tst.b	bool(a4)		; kill request only !
		bne.s	1$
		move.l	dosbase(a4),d6
		exg	d6,a6
		lea	wblock(a4),a2
		moveq	#_LVODupLock,d0
		move.l	0(a2),d1
		bne.s	3$
		moveq	#-2,d2
		move.l	a2,d1
		moveq	#_LVOLock,d0
3$		jsr	0(a6,d0.w)		; Lock() or DupLock()
		move.l	d0,0(a2)
		exg	d6,a6
		beq.s	1$
	IFND DEBUG
		tst.l	wbmsg(a4)
		bne.s	2$
		tst.b	wanthold(a4)
		beq.s	0$
		exg	d6,a6			; show program name
		RECALL	Output
		move.l	d0,d4
		move.l	d4,d1
		lea	verstring(a4),a2
		move.l	a2,d2
		moveq	#10,d3			; name only
		RECALL	Write
		move.l	d4,d1
		lea	cr(a4),a2
		move.l	a2,d2
		moveq	#1,d3
		RECALL	Write
		exg	d6,a6
0$		tst.b	keepio(a4)
		beq.s	detach
	ENDC
2$		bsr	mainprg
1$		moveq	#0,d0
		rts

	IFND DEBUG
detach		move.l	276(a6),a3		; detach process from CLI
		move.l	172(a3),a3		; pr_CLI
		adda.l	a3,a3
		adda.l	a3,a3
		lea	60(a3),a3		; cli_Module
		moveq	#24,d5
		move.l	0(a3),a0
5$		adda.l	a0,a0			; count segments
		adda.l	a0,a0
		addq.l	#8,d5
		move.l	0(a0),d0
		move.l	d0,a0
		bne.s	5$
		move.l	d5,d0			; get memory for seglist
		moveq	#1,d1
		swap	d1
		RECALL	AllocMem
		move.l	d0,a2
		move.l	a2,d0
		beq.s	2$			; no memory !
		lea	16(a2),a1
		move.l	0(a3),a0
4$		adda.l	a0,a0			; setup memlist
		adda.l	a0,a0
		move.l	-(a0),d0
		move.l	a0,(a1)+		; hunk address
		move.l	d0,(a1)+		; hunk length
		addq.w	#1,14(a2)		; one new entry
		move.l	4(a0),d0
		move.l	d0,a0
		bne.s	4$
		RECALL	Forbid			; create process
		exg	d6,a6
		lea	newname(a4),a1
		move.l	a1,d1
		moveq	#0,d2
		move.l	0(a3),d3
		moveq	#(4096>>6),d4
		lsl.w	#6,d4
		RECALL	CreateProc
		move.l	d0,a5
		move.l	a5,d0
		exg	d6,a6
		beq.s	3$			; failed !
		lea	-92+74(a5),a0
		move.l	a2,a1			; add memlist to tc_MemEntry
		RECALL	AddTail
		clr.l	0(a3)			; no unloading by the shell
3$		pea	_LVOPermit(a6)
		move.l	a5,d0
		bne.s	1$			; all ok
		move.l	a2,a1
		move.l	d5,d0
		RECALL	FreeMem			; free memory
2$		exg	d6,a6
		move.l	wblock(a4),d1
		RECALL	UnLock
		exg	d6,a6
1$		clr.w	detached(a4)		; indicate detaching
		moveq	#0,d0
		rts				; drop into Permit() :-)
	ENDC

; d0 - wbmsg

_LVOGetDiskObject	equ	-78
_LVOFreeDiskObject	equ	-90

GetToolTypes	move.l	d0,a0
		lea	buffer+100(a4),a2
		move.l	36(a0),a3		; sm_ArgList
		move.l	28(a0),d0
		subq.l	#1,d0			; sm_NumArgs == 1 ?
		beq.s	7$
		addq.w	#8,a3			; project icon
7$		move.l	0(a3),wblock(a4)
		lea	icnname(a4),a1
		moveq	#33,d0
		RECALL	OpenLibrary
		move.l	d0,d6
		beq.s	1$			; no icon library ?!
		move.l	(a3)+,d1
		CALL	CurrentDir,dosbase(a4)	; set wa_Lock
		move.l	d0,d5
		move.l	0(a3),a0
		CALL	GetDiskObject,d6
		move.l	d0,d4
		beq.s	2$			; no icon !?
		move.l	d4,a3
		move.l	54(a3),a3		; do_ToolTypes
		move.l	0(a3),d0
		beq.s	3$
6$		move.l	d0,a0
		cmp.b	#'A',(a0)
		bcs.s	4$			; skip < A
		cmp.b	#'z'+1,(a0)
		bcc.s	4$			; skip > z
		cmp.b	#'Z'+1,(a0)
		bcs.s	5$			; ok < Z
		cmp.b	#'a',(a0)
		bcs.s	4$			; skip < a
5$		move.b	(a0)+,(a2)+		; copy value
		bne.s	5$
		move.b	#' ',-1(a2)
4$		move.l	(a3)+,d0
		bne.s	6$
3$		move.l	d4,a0
		RECALL	FreeDiskObject		; free icon
2$		move.l	d5,d1
		CALL	CurrentDir,dosbase(a4)	; set old lock
		move.l	d6,a1
		CALL	CloseLibrary,sysbase(a4) ; close icon lib
1$		move.b	#10,(a2)+
		move.l	a2,d2
		lea	buffer+100(a4),a2
		sub.l	a2,d2
		rts

ParseCLI	lea	buffer(a4),a1
		subq.w	#1,d2
		move.l	a1,a0
1$		move.b	(a2)+,(a0)+		; copy line to a `safe' place
		dbra	d2,1$
		clr.b	-(a0)
		lea	out(a4),a2
		moveq	#0,d2

; a1 - pointer into command line
; d2 - argc
; a2 - argv

ParseArg	bsr.s	GetNext			; search argument
		bmi.s	doquote			; quotation sign
		beq.s	dosemi			; commentary stops all
		bcs.s	ParseArg		; separation sign
		lea	-1(a1),a0		; argument start
		bsr.s	BumpArgV		; argc+1 & ptr to argv
build_2		bsr.s	GetNext			; search separation sign
		beq.s	dosemi			; commentary stops all
		bcc.s	build_2			; no separation sign
		clr.b	-1(a1)			; mark end
		bra.s	ParseArg		; continue search

doquote		move.l	a1,a0			; argument start
		bsr.s	BumpArgV		; argc+1 & ptr to argv
quote_2		bsr.s	GetNext			; search quotation sign
		bpl.s	quote_2			; no quotation sign
		clr.b	-1(a1)			; mark end
quote_3		bsr.s	GetNext			; search sepaartion sign
		beq.s	dosemi			; commentary stops all
		bcc.s	quote_3			; no separation sign
		bra.s	ParseArg		; continue search

dosemi		clr.b	-(a1)			; delete semicolon
		bra.s	ParseArg		; go on

BumpArgV	cmp.w	#maxarg,d2		; max argc reached ?
		bcc.s	1$
		move.l	a0,(a2)+		; store argptr
		addq.w	#1,d2			; increment argc
1$		rts

GetNext		move.b	(a1)+,d0		; test character
		beq.s	BuildRdy
		moveq	#-3,d1			; N=1,Z=0,C=0 -> quotation
		cmp.b	#'"',d0
		beq.s	1$
		moveq	#-2,d1			; N=0,Z=1,C=1 -> semicolon
		cmp.b	#';',d0
		beq.s	1$
		moveq	#-1,d1			; N=0,Z=0,C=1 -> separation
		cmp.b	#'=',d0
		beq.s	1$
		cmp.b	#' ',d0
		beq.s	1$
		cmp.b	#9,d0
		beq.s	1$
		moveq	#0,d1			; N=0,Z=0,C=0 -> others
1$		addq.l	#2,d1			; set flags ( see above )
		rts

; evalute argument vector

BuildRdy	addq.w	#4,sp			; set correct return address
		move.b	d2,entries(a4)
		tst.l	wbmsg(a4)		; workbench ?
		bne.s	8$
		lea	arghelp(a4),a0		; help ?
		bsr	findarg
		bne.s	8$
		CALL	Output,dosbase(a4)
		move.l	d0,d1
		lea	template(a4),a2
		move.l	a2,d2
		moveq	#argcmd-template-1,d3
		RECALL	Write
		RECALL	Input
		move.l	d0,d1
		lea	buffer+100(a4),a2
		move.l	a2,d2
		moveq	#80,d3
		RECALL	Read
		move.l	d0,d2
		bne	ParseCLI		; check input

8$		lea	argcxpop(a4),a0		; popup ?
		bsr	findarg
		bne.s	7$
		bsr	nextarg
		beq.s	7$
		lea	argcxyes(a4),a0
		bsr	strcmp
		sne	wanthold(a4)

7$		lea	argcxkey(a4),a0		; new popkey ?
		bsr.s	findarg
		bne.s	6$
		bsr.s	nextarg
		bne.s	5$
6$		lea	defhotkey(a4),a1
5$		lea	hotkeybuf(a4),a0
		moveq	#39,d0
4$		move.b	(a1)+,(a0)+		; copy hotkey description
		dbeq	d0,4$
		clr.b	(a0)

		lea	argcxpri(a4),a0
		bsr.s	findarg
		bne.s	3$
		bsr.s	nextarg
		beq.s	3$
		move.l	a1,a0
		bsr	getnum
		move.b	d2,newbroker+18(a4)	; nb_Pri

3$		lea	argnoscript(a4),a0	; skip scriptfile ?
		bsr.s	findarg
		seq	noscript(a4)

		lea	argkeepio(a4),a0	; detach ?
		bsr.s	findarg
		seq	keepio(a4)

		lea	argcmd(a4),a0		; defaultcmd ?
		bsr.s	findarg
		bne.s	2$
		bsr.s	nextarg
		beq.s	2$
		move.b	(a1),d2			; first char
		lea	argkill(a4),a0
		bsr	strcmp
		bne.s	1$
		st	bool(a4)		; kill
2$		moveq	#'t',d2			; display default to tasks
1$		lsl.w	#8,d2
		or.w	#10,d2			; LF
		move.w	d2,in(a4)
		rts

findarg		move.b	entries(a4),d2		; search argument
		lea	out(a4),a2
2$		subq.b	#1,d2
		bcs.s	1$
		move.l	(a2)+,a1
		bsr	strcmp			; compare it
		bne.s	2$
1$		rts

nextarg		move.l	(a2),a1			; make sure ptr is valid
		move.l	a1,d1
		rts

; real main entry (wb and detached)

mainprg		move.l	sp,savesp(a4)
		move.l	sysbase(a4),a6
		move.w	20(a6),d0		; LIB_VERSION
		sub.w	#36,d0
		bcs.s	10$
		st	post_V34(a4)		; Kick2.0+
		subq.w	#3,d0
		scc	post_V38(a4)		; Kick3.0+
		move.w	#imagesize,d0
		move.l	image+10(a4),a0
11$		not.l	(a0)+			; reverse iconify image
		dbra	d0,11$
10$		move.l	304(a6),OldTrap(a4)	; original EXEC Trap-Handler
		move.l	276(a6),a0
		move.l	a0,mytask(a4)
		move.l	50(a0),OldProcTrap(a4)	; original AmigaDOS Trap-Handler
		lea	stopall(pc),a1
		move.l	a1,88(a0)		; leave a message for 'Kill Xoper'
		move.l	184(a0),oldprwin(a4)
		moveq	#-1,d0			; disable the 'please insert'
		move.l	d0,184(a0)		; requester

		lea	div68000(pc),a0		; set processor dependent
		btst	#1,297(a6)
		beq.s	9$
		lea	div68020(pc),a0
9$		move.l	a0,div32(a4)		; division function!

		lea	350(a6),a0		; necessary libs & devs
		lea	conname(a4),a1
		RECALL	FindName
		move.l	d0,condev(a4)
		lea	378(a6),a0
		lea	gfxname(a4),a1
		RECALL	FindName
		move.l	d0,gfxbase(a4)
		lea	378(a6),a0
		lea	intname(a4),a1
		RECALL	FindName
		move.l	d0,intuibase(a4)
		move.l	d0,a0
		move.l	56(a0),a0		; ib_ActiveScreen
		move.w	12(a0),d0		; sc_Width
		add.w	d0,window_l(a4)
		move.b	30(a0),d0		; sc_Barheight
		add.b	d0,window_l+3(a4)
		sub.b	d0,window_w+3(a4)

		bsr	gettdtasks

		bsr	OpenLibsV37		; kick 2.0+ libraries

		bsr	OpenDevs
		beq	stopall			; failure

;install a counter for PORT-Interrupts
		lea	iocounter(a4),a1
		move.l	a4,14(a1)
		moveq	#3,d0
		RECALL	AddIntServer

;install a counter to determine the amount of cpu-time each task uses.
		RECALL	Forbid
		moveq	#_LVOSwitch,d0
		lea	myswitch(pc),a0
		exg.l	d0,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	d0,OldSwitch(a4)
		lea	myaddtask(pc),a0
		move.l	a0,d0
		move.w	#_LVOAddTask,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	d0,OldAddTask(a4)
		RECALL	Permit
		st	execpatch(a4)

;create idle-killer
		moveq	#$40,d0
		lsl.w	#2,d0			; 256
		moveq	#-128,d1		; Pri
		lea	kidlename(a4),a0	; Name
		lea	killidle(pc),a1		; Code
		bsr	CreateTask
		move.l	d0,idletask(a4)
		beq	stopall

;prepare screen tags
		moveq	#-1,d0
		RECALL	AllocSignal
		move.b	d0,nspubsig+7(a4)
		blt	stopall

;install hotkeys
		moveq	#mysigbit,d0
		RECALL	AllocSignal
		bsr	installh
		beq	stopall

;set our `real' directory - remember old one
		move.l	wblock(a4),d1
		CALL	CurrentDir,dosbase(a4)
		move.l	d0,wblock(a4)
		st	newlock(a4)

		tst.b	noscript(a4)		; process script?
		bne	nostartup

;attempt to open a startup script
		lea	buffer+2400(a4),a5
		lea	startupname(a4),a0	; 'ENV:Xoper.Startup'
		move.l	a5,a1
6$		move.b	(a0)+,(a1)+		; copy string
		bne.s	6$
		moveq	#4,d1
		add.l	a5,d1
		move.l	#1005,d2
		RECALL	Open			; 'Xoper.startup'
		move.l	d0,d4
		bne.s	5$
		move.l	a5,d1
		RECALL	Open			; 'ENV:Xoper.Startup'
		move.l	d0,d4
		bne.s	5$
		moveq	#2,d1
		move.b	#'S',0(a5,d1.w)
		add.l	a5,d1
		RECALL	Open			; 'S:Xoper.startup'
		move.l	d0,d4
		beq.s	nostartup
5$		move.l	d4,d1
		move.l	a5,d2
		moveq	#(2400>>5),d3
		lsl.w	#5,d3
		RECALL	Read			; read file at once
		move.l	d0,d3
		move.l	d4,d1
		RECALL	Close			; close it
		move.l	d3,d0
		addq.l	#1,d0
		beq.s	nostartup		; read error !
		st	fromfile(a4)
4$		lea	dummy(a4),a0
		move.l	a0,a2
		lea	80+40-1(a0),a1
		moveq	#10,d1
3$		move.b	(a5)+,d0		; copy line to buffer
		move.b	d0,(a0)+
		beq.s	2$			; NUL
		sub.b	d1,d0
		beq.s	2$			; LF
		subq.b	#3,d0
		beq.s	2$			; CR
		cmpa.l	a1,a0
		bcs.s	3$			; buffer full ?
2$		move.l	a0,d0
		sub.l	a2,d0			; length of an input line
		sub.l	d0,d3
		move.l	a5,-(sp)
		move.l	d3,-(sp)
		bsr	cli 			; execute the script as if typed in
		move.l	(sp)+,d3
		move.l	(sp)+,a5
		bgt.s	4$			; still chars left !
		clr.b	fromfile(a4)

nostartup	tst.b	wanthold(a4)		; background task ?
		bne	instback

; This code just opens a Window. Position and size are
; taken from window_l,window_t,window_w,window_h.

restart		move.l	intuibase(a4),a6
		lea	setupwindow(pc),a0
		tst.b	ownscreen(a4)
		beq.s	1$
		clr.b	ownscreen(a4)
		lea	createscreen(pc),a0
1$		jsr	0(a0)			; screen and/or window
		move.l	mytask(a4),a0
		clr.l	26(a0)			; clear 'spurious' signals
		clr.l	ptr(a4)
		tst.b	gotguru(a4)
		beq.s	2$
		bsr	showguru
		clr.b	gotguru(a4)
2$		bra	processmsgs

gettdtasks	lea	350(a6),a0		; a6 - SysBase
		lea	tdname(a4),a1
		RECALL	FindName
		beq.s	1$
		move.l	d0,a0
		lea	36(a0),a0
		lea	tdtasks(a4),a1
		moveq	#3,d1
3$		move.l	(a0)+,d0
		beq.s	2$
		exg.l	d0,a1
		move.l	16(a1),a1
		exg.l	d0,a1
2$		move.l	d0,(a1)+
		dbra	d1,3$
1$		rts

OpenLibsV37	lea	wbname(a4),a1		; open 'workbench.library'
		moveq	#wbbase,d2
		bsr.s	1$
		lea	cxname(a4),a1		; open 'commodities.library'
		moveq	#cxbase,d2
1$		moveq	#37,d0
		RECALL	OpenLibrary
		move.l	d0,0(a4,d2.w)		; store libbase
r_t_s		rts

OpenDevs	moveq	#0,d2
		RECALL	Forbid
		lea	xopcon(a4),a1		; rendezvous port
		RECALL	FindPort
		cmp.l	d0,d2
		bne.s	4$			; port found!
;		moveq	#0,d0
		lea	xopcon(a4),a0
		bsr	CreatePort		; new port
		move.l	d0,d2
4$		RECALL	Permit
		move.l	d2,replyport(a4)
		beq.s	r_t_s			; no mem or already there
		moveq	#0,d0
		suba.l	a0,a0
		bsr	CreatePort
		move.l	d0,timerio+14(a4)
		beq.s	r_t_s
		move.l	d0,a0
		move.b	15(a0),timersig+1(a4)
		lea	timerio(a4),a1
		lea	timername(a4),a0
		moveq	#1,d0
		moveq	#0,d1
		RECALL	OpenDevice		; open 'timer.device'
		tst.b	d0
		bne.s	1$
		st	timerdev1(a4)
		tst.b	post_V34(a4)
		beq.s	3$
		lea	newtime(a4),a0
		CALL	ReadEClock,timerio+20(a4)
		move.l	newtime+4(a4),lasttime(a4)
		lsr.l	#8,d0
		bra.s	2$
3$		moveq	#0,d0
		suba.l	a0,a0    
		bsr	CreatePort
		move.l	d0,sampleio+14(a4)
		beq.s	1$
		lea	sampleio(a4),a1
		lea	timername(a4),a0
		moveq	#0,d0
		moveq	#0,d1
		RECALL	OpenDevice		; open 'timer.device'
		tst.b	d0
		bne.s	1$
		st	timerdev2(a4)
		lea	sampleio(a4),a1
		move.l	#3599999,32(a1)
		move.w	#9,28(a1)
		RECALL	SendIO
		move.l	#3906,d0
2$		move.l	d0,timerticks(a4)
		bsr.s	starttasktimer
		rts

1$		moveq	#0,d0			; return NULL
		rts

starttasktimer	lea	tsecs(a4),a0
		lea	tmics(a4),a1
		CALL	CurrentTime,intuibase(a4)
		bsr	getaskdat2		; returns SysBase in a6 !
		move.l	tsecs(a4),d0
		lea	taskstampid(a4),a0
		lea	taskstamps(a4),a1
		lea	usedtime(a4),a2
		moveq	#0,d1
2$		subq.b	#1,d5
		bcs.s	1$
		lea	-16(a5),a5
		move.l	0(a5),(a0)+
		move.l	d0,(a1)+
		clr.l	(a2)+
		addq.w	#1,d1
		cmp.w	#128,d1
		bcs.s	2$
1$		move.w	d1,numtaskstimed(a4)	; Z-Flag != 0
		rts

; exit program 

stopall		st	waitexit(a4)		; wait until pubscr freed
		tst.b	appicn(a4)
		beq.s	exitall
		move.l	wnptr(a4),a0		; remove appicon here
		CALL	RemoveAppIcon,wbbase(a4)
		clr.l	wnptr(a4)

exitall		tst.b	ownscreen(a4)
		beq.s	9$			; no screen == no pub screen !
		st	wantexit(a4)
		bsr	SetPubStatus
		beq.s	stopall-2		; pubscreen still used

9$		move.l	mytask(a4),a2
		clr.l	88(a2)			; disable killing !

		moveq	#1,d0
		bsr	CloseGUI		; close screen & window

		bsr	killpage
		bsr	freeblank
		bsr	killhistory
		bsr	freehidmem
		bsr	freealias
		bsr	clrfkeys

8$		move.l	stplist(a4),a3
		tst.l	0(a3)
		beq.s	7$
		move.l	a3,d0
		bsr	waok
		bra.s	8$

7$		bsr	remtraps

		move.l	dosbase(a4),a6
		move.l	wblock(a4),d1
		tst.b	newlock(a4)
		beq.s	62$
		RECALL	CurrentDir
		move.l	d0,d1
62$		RECALL	UnLock

		move.l	sysbase(a4),a6

		moveq	#0,d0
		move.b	nspubsig+7(a4),d0
		ble.s	61$
		RECALL	FreeSignal
61$		bsr	removeh
		moveq	#mysigbit,d0
		RECALL	FreeSignal

		move.l	idletask(a4),d0
		beq.s	6$
		move.l	d0,a1
		RECALL	RemTask

6$		tst.b	execpatch(a4)
		beq	0$			; not installed

		st	waitexit(a4)
		st	bool(a4)

5$		tst.b	bool(a4)
		beq.s	2$			; exec patches removed !
		RECALL	Forbid
		tst.b	patchmode(a4)
		beq.s	4$			; don't check vectors
		lea	myswitch(pc),a0
		cmp.l	_LVOSwitch+2(a6),a0
		bne.s	3$
		lea	myaddtask(pc),a0
		cmp.l	_LVOAddTask+2(a6),a0
		bne.s	3$
4$		move.l	OldSwitch(a4),d0
		move.w	#_LVOSwitch,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	OldAddTask(a4),d0
		move.w	#_LVOAddTask,a0
		move.l	a6,a1
		RECALL	SetFunction
		clr.b	bool(a4)
3$		RECALL	Permit

2$		bsr	snoopend		; mem trace
		bsr	traceend		; dos trace

		move.b	bool(a4),d0		; exec -> switch,addtask
		add.b	msnoop(a4),d0		; exec -> memory
		add.b	DosTable+5(a4),d0	; dos  -> open
		add.b	DosTable+25(a4),d0	; dos  -> lock
		beq.s	1$			; zero == all removed
		moveq	#0,d0
		move.l	mysignal(a4),d1
		CALL	SetSignal,sysbase(a4)
		st	pcheck(a4)		; enable checking ...
		move.l	mysignal(a4),d0
		RECALL	Wait			; wait for intr signal
		bra.s	5$			; try again ...

1$		lea	iocounter(a4),a1
		moveq	#3,d0
		RECALL	RemIntServer

0$		bsr	CloseDevs
		bsr	CloseLibsV37		; close Kick 2.0+ libraries

		move.l	mytask(a4),a2
		move.l	oldprwin(a4),184(a2)	; reset to old value

		move.l	savesp(a4),sp		; restore sp
		rts

CloseLibsV37	move.l	sysbase(a4),a6
		move.l	cxbase(a4),a1		; commodities base
		bsr.s	2$
		move.l	wbbase(a4),a1		; workbench base
2$		move.l	a1,d0
		beq.s	1$			; no lib
		RECALL	CloseLibrary
1$		rts

CloseDevs	tst.b	timerdev2(a4)		; free timer stuff
		beq.s	4$
		lea	sampleio(a4),a1
		CALL	AbortIO,sysbase(a4)
		lea	sampleio(a4),a1
		RECALL	CloseDevice
4$		move.l	sampleio+14(a4),d0
		bsr.s	2$			; free port
		tst.b	timerdev1(a4)
		beq.s	3$
		bsr	stoptimer
		lea 	timerio(a4),a1
		CALL	CloseDevice,sysbase(a4)
3$		move.l	timerio+14(a4),d0
		bsr	2$			; free port
		move.l	replyport(a4),d0
2$		beq.s	1$
		bsr	DeletePort
1$		rts

;show a list. The string entered from keyboard is stored
;in 'in'. Every character is interpreted as one command
;i.e. 'rip' means 'resources'+'interrupts'+'ports'.
;search the command to be executed. If none is found,
;show a help message

showwhat	tst.b	fromfile(a4)
		bne.s	nomore
		move.w	cmdptr(a4),d7

input		lea	in(a4),a0
		move.b	0(a0,d7.w),d0
		beq.s	endshow
		addq.w	#1,d7
		cmpi.b	#' ',d0
		bne.s	i1
		bsr.s	testifend
		beq.s	endshow
		move.w	d2,cmdptr(a4)
		bra.s	endshow2

i1		cmpi.b	#10,d0
		beq.s	endshow
		or.b	#32,d0
		cmpi.b	#'q',d0
		beq	quithold
		lea	params(a4),a0
		moveq	#parmnum-1,d1
i2		cmp.b	0(a0,d1.w),d0
		beq.s	foundp
		dbra	d1,i2
		move.w	#usetxt,d0
		bsr	putnamw
		bra.s	endshow

foundp		lea	subs(pc),a0
		lsl.w	#2,d1
		jsr	0(a0,d1.w)
		bsr.s	testifend
		beq.s	input
		bsr	newline
		bra.s	input

endshow		clr.w	cmdptr(a4)
endshow2	bsr	starttimer
nomore		tst.b	fromfile(a4)
		bne.s	1$
		clr.l	lastprinted(a4)
		bsr	blastout
1$		rts

testifend	lea	in(a4),a0
		lea	0(a0,d7.w),a0
		move.w	d7,d2
2$		move.b	(a0)+,d0
		beq.s	1$
		cmpi.b	#' ',d0
		bne.s	3$
		addq.w	#1,d2
		bra.s	2$
3$		cmpi.b	#10,d0
1$		rts

;get the string from inputbuffer; search and execute
;the command, if any.

cli		lea	dummy(a4),a0
		subq.w	#1,d0
cl2		subq.w	#1,d0
		bmi.s	cl1
		cmp.b	#' ',0(a0,d0.w)
		beq.s	cl2
cl1		addq.w	#1,d0
		move.b	#10,0(a0,d0.w)
		bsr	kllblnks		; remove trailing blanks ... !
		cmpi.b	#10,0(a0)
		beq	showwhat
		cmpi.b	#';',0(a0)
		beq.s	nomore

		bsr.s	findcmd
		tst.l	d2
		bpl.s	okcmd			; cmd found
		bsr.s	findalias
		tst.l	d2
		bmi.s	nm0			; no alias
okcmd		clr.w	procnum(a4)
		adda.w	d1,a0
		bsr	kllblnks
		lea	cmdaddr(pc),a1
		lsl.w	#2,d2
		jsr 	0(a1,d2.w)
		bra.s	nomore

nm0		moveq	#10,d1			; LineFeed
		lea	in(a4),a1
		lea	buffer(a4),a2
		movem.l	a1/a2,-(sp)		; store for later use
nm1		move.b	(a1),(a2)+		; in -> buffer
		cmp.b	(a1)+,d1		; LF ?
		bne.s	nm1
		move.l	(sp)+,a1
nm2		move.b	(a0),(a1)+		; cmd -> in
		cmp.b	(a0)+,d1		; LF ?
		bne.s	nm2
		move.l	(sp)+,a1
		lea	dummy(a4),a2
nm3		move.b	(a1),(a2)+		; buffer -> dummy
		cmp.b	(a1)+,d1		; LF ?
		bne.s	nm3
		clr.w	cmdptr(a4)
		bra	showwhat

findcmd		move.l	a0,-(sp)
		bsr	strbuf
		lea	commds(a4),a2
		moveq	#0,d2
1$		lea	buffer(a4),a0
		move.l	a2,a1
		bsr	strcmp
		beq.s	3$
2$		tst.b	(a2)+
		bne.s	2$
		addq.w	#1,d2
		cmp.w	#cmdnum,d2
		bne.s	1$
		moveq	#-1,d2
3$		move.l	(sp)+,a0
		rts

findalias	move.l	a0,-(sp)
		lea	aliaslist(a4),a2
1$		move.l	0(a2),d2
		move.l	d2,a2
		beq.s	3$
		lea	buffer(a4),a0
		lea	5(a2),a1
		move.b	4(a2),d2
		ext.w	d2
		ext.l	d2
		bsr	strcmp
		beq.s	4$
		bra.s	1$
3$		moveq	#-1,d2
4$		move.l	(sp)+,a0
		rts

subs		bra	showtask
		bra	showaddr
		bra	showdevs
		bra	showlibs
		bra	showres
		bra	showresi
		bra	showmem
		bra	showprt
		bra	showint
		bra	stack
		bra	clicomm
		bra	tasktime
		bra	semaphores
cmdaddr 	bra	settime
		bra	taskpri
		bra	info
		bra	pri
		bra	flush
		bra	freeze
		bra	warm
		bra	signal
		bra	break
		bra	alert
		bra	lastalert
		bra	instback
		bra	exitall
		bra	clear
		bra	cancel
		bra	taskports
		bra	hunks
		bra	devices
		bra	openlib
		bra	closelib
		bra	currentdir
		bra	cd
		bra	mypri
		bra	openfiles
		bra	locks
		bra	unlock
		bra	screens
		bra	windows
		bra	closescreen
		bra	closewindow
		bra	fonts
		bra	windowfonts
		bra	lockdrive
		bra	freedrive
		bra	capture
		bra	clrcold
		bra	clrcool
		bra	clrwarm
		bra	snoop
		bra	usage
		bra	inputhandler
		bra	nohead
		bra	sort
		bra	hide
		bra	hidden
		bra	setwindow
		bra	cancel
		bra	icongad
		bra	historylines
		bra	historylength
		bra	showhistory
		bra	repeatcmd
		bra	remresident
		bra	saveoutput
		bra	killhistory
		bra	iconbackdrp
		bra	myfont
		bra	setfont
		bra	trapguru
		bra	outputlines
		bra	usescreen
		bra	usewindow
		bra	usetopaz
		bra	grabtimerio
		bra	dchange
		bra	alias
		bra	remnode
		bra	setfkey
		bra	clicmd
		bra	taskinfo
		bra	coldreboot
		bra	reboot
		bra	zerotimer
		bra	propgad
		bra	iconpos
		bra	remport
		bra	remintserver
		bra	frags
		bra	tracefiles
		bra	tracelocks
		bra	cxhandler
		bra	cxpopkey
		bra	pubscreens
		bra	smartpatch
		bra	lowmemhandler

;------ Task-Structures-----

tasktime	moveq	#-1,d0
		bra.s	startask
showaddr	moveq	#0,d0
		bra.s	startask
showtask	moveq	#1,d0
startask	move.b	d0,tasktyp(a4)
		bsr	getdevhan
		tst.b	headon(a4)
		beq	noheader1
		move.w	#infoh1,d0
		bsr	putstrw
		move.l	sysbase(a4),a6
		move.w	296(a6),d1		; AttnFlags
		move.w	#cpu5,d0
		btst	#7,d1			; mc 68060 ?
		bne.s	cpupr
		subq.w	#cpu5-cpu4,d0
		btst	#3,d1			; mc 68040 ?
		bne.s	cpupr
		subq.w	#cpu4-cpu3,d0
		btst	#2,d1			; mc 68030 ?
		bne.s	cpupr
		subq.w	#cpu3-cpu2,d0
		btst	#1,d1			; mc 68020 ?
		bne.s	cpupr
		subq.w	#cpu2-cpu1,d0
		btst	#0,d1			; mc 68010 ?
		bne.s	cpupr
		subq.w	#cpu1-cpu0,d0		; mc 68000 !
cpupr		bsr	putstrw
		move.w	296(a6),d1
		btst	#3,d1			; mc 68040 ?
		beq.s	1$
		btst	#6,d1			; mc FPU40 ?
		beq.s	noFPU
		moveq	#fpu2-fpu1,d2
		and.w	#(1<<5)+(1<<4),d1
		cmp.w	#(1<<5)+(1<<4),d1	; 68040.library loaded ?
		sne	d1
		ext.w	d1
		and.w	d1,d2
		add.w	#fpu1,d2		; set FPU
		bra.s	fpupr
1$		move.w	#fpu1,d2
		btst	#5,d1			; mc 68882 ?
		bne.s	fpupr
		subq.w	#fpu1-fpu0,d2
		btst	#4,d1			; mc 68881 ?
		beq.s	noFPU
fpupr		move.w	d2,d0
		bsr	putstrw
noFPU		moveq	#20,d1
		bsr	tab
		move.w	#infoh3,d0
		bsr	putstrw

noheader1	moveq	#1,d5
		bsr	getaskdat
		move.l	a5,savedat(a4)
		bsr	getstdio

		lea	usedtime(a4),a0
		moveq	#0,d4
		moveq	#0,d3
		move.l	idletask(a4),d2
		moveq	#0,d1
		move.b	entries(a4),d1
		subq.w	#1,d1
1$		lea	-16(a5),a5
		move.l	12(a5),d5
		add.l	d5,d4
		move.l	0(a5),d0
		cmp.l	d0,d2
		bne.s	2$
		move.l	d5,d3
2$		bsr	gettimeentry
		add.l	d5,0(a0,d0.w)
		dbra	d1,1$
		move.l	d4,maxdisp(a4)
		sub.l	d3,d4
		move.l	d4,dispatches(a4)

		tst.b	headon(a4)
		beq.s	noheader2
		move.l	dispatches(a4),d0
		move.l	maxdisp(a4),d1
		bsr	prcent
		bsr	newline
		move.w	#infoh2,d0
		bsr	putstrw

noheader2	move.l	sysbase(a4),a0
		move.l	284(a0),d0		; DispCount
		move.l	oldswitches(a4),d1
		move.l	d0,oldswitches(a4)
		sub.l	d1,d0
		tst.b	headon(a4)
		beq.s	noheader3
		mulu	#100,d0
		move.l	d0,-(sp)
		lea	secs(a4),a0
		lea	mics(a4),a1
		CALL	CurrentTime,intuibase(a4)
		move.l	secs(a4),d3
		add.l	d3,d3
		move.l	d3,d1
		lsl.l	#2,d3
		add.l	d1,d3
		move.l	mics(a4),d0
		move.l	#100000,d1
		bsr	div
		add.l	d0,d3
		move.l	time10(a4),d1
		move.l	d3,time10(a4)
		sub.l	d1,d3
		move.l	(sp)+,d0
		move.l	d3,-(sp)
		move.l	d3,d1
		bsr	div
		moveq	#1,d5
		bsr	putfrac

		moveq	#20,d1
		bsr	tab
		move.w	#infoh7,d0
		bsr	putstrw
		move.l	iocount(a4),d0
		clr.l	iocount(a4)
		mulu	#100,d0
		move.l	(sp)+,d3
		move.l	d3,d1
		bsr	div
		moveq	#1,d5
		bsr	putfrac

		bsr	newline
		bsr	newline

noheader3	lea	t4header(a4),a0
		tst.b	tasktyp(a4)
		bmi.s	phedder
		lea	theader(a4),a0
		tst.b	tasktyp(a4)
		bne.s	phedder
		lea	t2header(a4),a0
		move.l	sysbase(a4),a6
		btst	#4,297(a6)		; AttnFlags FPU ?
		bne.s	phedder
		lea	t3header(a4),a0
phedder 	bsr	puthead
		move.l	savedat(a4),a5

pt1		tst.b	entries(a4)
		beq	pt2
		lea	-16(a5),a5
		bsr	hideit
		beq	ptend
		move.l	0(a5),a3
		cmp.l	idletask(a4),a3
		beq	ptend
		move.l	a3,node(a4)		; ID = task address
		move.l	a3,d0
		bsr	hexa
		tst.b	tasktyp(a4)
		ble.s	pt12
		moveq	#0,d0
		move.b	8(a3),d0
		bsr	gettype

pt12		moveq	#0,d0
		move.b	9(a5),d0
		subq.w	#1,d0
		mulu	#9,d0
		move.w	#status,d1
		add.w	d1,d0
		bsr	putstrw			; state
		tst.b	tasktyp(a4)
		beq.s	pt345
		bpl	pt13

		move.l	0(a5),d0		; for usage !
		bsr	gettimeentry
		lea	taskstamps(a4),a0
		lea	0(a0,d0.w),a0
		move.l	secs(a4),d0
		sub.l	0(a0),d0
		bsr	putstamp
		bsr	putblank
		move.l	usedtime-taskstamps(a0),d0
		move.l	timerticks(a4),d1
		bsr	div
		bsr	putstamp
		moveq	#'.',d0
		bsr	putchar
		move.l	d1,d0
		move.l	timerticks(a4),d1
		addq.w	#5,d1
		divu	#10,d1
		divu	d1,d0
		or.b	#'0',d0
		bsr	putchar
		bsr	putblank
		bra	pt346

pt345		move.l	18(a3),d0		; SigAlloc
		bsr	hexa
		move.w	#longnix,d0
		cmp.b	#4,9(a5)		; tc_state waiting ?
		beq.s	pt14
		bsr	putstrw
		bra.s	pt15

pt14		move.l	22(a3),d0		; SigWait
		bsr	hexa
pt15		move.l	26(a3),d0		; SigRecvd
		bsr	hexa

		move.w	#nofpu,d1		; assume no FPU
		move.l	sysbase(a4),a6
		btst	#4,297(a6)		; AttnFlags FPU ?
		beq.s	2$
		move.w	#nullstate,d1		; assume FPU null-state
2$		lea	2$(pc),a1
		move.l	a1,d0
		cmp.b	#2,9(a5)		; tc_state running ?
		beq.s	pt16			; can only be xoper itself

		move.l	54(a3),a1		; tc_SPReg
		move.l	0(a1),d0

		btst	#4,297(a6)		; AttnFlags FPU
		beq.s	pt16			; no FPU

		move.l	4(a1),d0
		tst.b	0(a1)			; NULL frame ?
		beq.s	pt16			; yes

		move.w	(a1),d0			; frame flag / format word
		lea	110+2(a1),a1		; offset for fpu regs
		addq.w	#1,d0
		beq.s	1$
		lea	12(a1),a1		; 3 more longs

1$		moveq	#0,d0
		move.b	1(a1),d0		; frame size
		move.l	4(a1,d0.w),d0		; pc

		move.w	#idle,d1
		cmp.b	#$18,1(a1)		; mc 68881 idle ?
		beq.s	pt16
		addq.w	#busy-idle,d1
		cmp.b	#$b4,1(a1)		; mc 68881 busy ?
		beq.s	pt16
		addq.w	#dontknow-busy,d1	; mc 68882 ??

pt16		bsr	hexa

		move.l	sysbase(a4),a6
		btst	#4,297(a6)		; AttnFlags FPU ?
		beq.s	pt4

		move.w	d1,d0			; fpu state
		bsr	putstrw
		bra.s	pt4

pt13		move.b	10(a5),d3		; tc_Pri
		bsr	plusmins

		move.l	12(a5),d0
		move.l	dispatches(a4),d1
		tst.b	useageon(a4)
		beq.s	pt37
		move.l	maxdisp(a4),d1
pt37		bsr	prcent

pt346		cmpi.b	#13,8(a5)		; num
		bne.s	noproc
		tst.l	172(a3)
		beq.s	noproc
		move.b	11(a5),d3
		bsr	bytedec
		bra.s	pt4
noproc		move.w	#nix,d0
		bsr	putstrw

pt4		bsr	gettaskname		; taskname

		tst.b	tinfo(a4)
		beq	pt223

		tst.b	cliexec(a4)		; display 'real' taskname if
		beq.s	10$ 			; it is a CLI
		bsr	putblank
		move.l	4(a5),d0
		bsr	putstr

10$		lea	tdtasks(a4),a1		; a trackdisk.device ?
		moveq	#3,d3
1$		cmp.l	(a1)+,a3
		dbeq	d3,1$
		bne.s	pt224

		eor.b	#'0'+3,d3		; print unit#
		move.b	d3,unitmsg+8(a4)
		move.w	#unitmsg,d0
		bsr	putstrw

pt224		moveq	#0,d3			; is it a device handler ?
		lea	buffer+2400(a4),a2
		lea	200(a2),a1

1$		move.l	(a2)+,d0
		beq.s	pt222
		move.l	(a1)+,d2
		cmp.l	0(a5),d0
		bne.s	1$

2$		move.l	#' {',d0		; print dos devicename
		bsr	putlongascii
		move.l	d2,d0
		bsr	putbcpl
		move.l	#':}',d0
		bsr	putlongascii

pt222		lea	buffer+2160(a4),a1	; is it a device handler for
		lea	160(a1),a2		; some CLI input/output ?
		moveq	#0,d5

3$		move.l	(a1)+,d0
		beq.s	4$
		move.w	(a2)+,d2
		cmp.l	0(a5),d0
		bne.s	3$

		tst.w	d5
		bne.s	5$
		move.l	#' (',d0		; print CLI#
		bsr	putlongascii
		bra.s	6$
5$		move.l	#'& ',d0
		bsr	putlongascii
6$		moveq	#1,d5
		moveq	#'<',d0
		tst.w	d2
		bmi.s	7$
		moveq	#'>',d0
7$		bsr	putchar
		move.l	#'CLI ',d0
		bsr	putlongascii
		moveq	#0,d0
		move.b	d2,d0
		moveq	#0,d3
		bsr	longdec
		bra.s	3$

4$		tst.w	d5
		beq.s	pt223
		subq.l	#1,ptr(a4)
		moveq	#')',d0
		bsr	putchar

pt223		bsr	newline

ptend		subq.b	#1,entries(a4)
		bra	pt1
pt2		rts

getdevhan	tst.b	tinfo(a4)
		beq.s	4$
		move.l	a3,-(sp)
		bsr	devinfo
		moveq	#49,d3
		lea	buffer+2400(a4),a2
		lea	200(a2),a3
1$		adda.l	a1,a1
		adda.l	a1,a1
		tst.l	4(a1)
		bne.s	3$
		move.l	8(a1),d0
		beq.s	3$
		moveq	#92,d1
		sub.l	d1,d0
		move.l	d0,(a2)+
		move.l	40(a1),(a3)+
		subq.w	#1,d3
		beq.s	2$
3$		move.l	0(a1),d0
		beq.s	2$
		move.l	d0,a1
		bra.s	1$
2$		clr.l	(a2)+
		move.l	(sp)+,a3
4$		rts

getstdio	tst.b	tinfo(a4)
		beq.s	4$
		move.l	a5,-(sp)
		lea	buffer+2160(a4),a0
		lea	160(a0),a1
		moveq	#0,d3
		move.b	entries(a4),d3
		subq.w	#1,d3
		moveq	#40,d4
3$		lea	-16(a5),a5
		cmpi.b	#13,8(a5)
		bne.s	1$
		RECALL	Forbid
		move.l	0(a5),a3
		move.l	140(a3),d2		; pr_TaskNum
		beq.s	6$
		move.l	172(a3),d0		; pr_CLI
		beq.s	6$
		move.l	160(a3),d0		; pr_COS
		beq.s	2$
		bsr.s	getstdio2
2$		or.w	#$8000,d2
		move.l	156(a3),d0		; pr_CIS
		beq.s	6$
		bsr.s	getstdio2
6$		RECALL	Permit
		tst.w	d4
		ble.s	7$
1$		dbra	d3,3$
7$		clr.l	(a0)+
		move.l	(sp)+,a5
4$		rts

getstdio2	lsl.l	#2,d0			; make APTR
		move.l	d0,a2
		and.b	#-4,d0
		cmp.l	a2,d0			; LW aligned?
		bne.s	1$
		move.l	8(a2),d0		; fh_Type
		ble.s	1$			; negative = plain file
		move.l	d0,a2
		move.l	16(a2),d0		; mp_SigTask
		beq.s	1$
		move.l	d0,(a0)+
		move.w	d2,(a1)+
		subq.w	#1,d4
1$		rts

getaskdat	move.l	d5,-(sp)
		bsr.s	getaskdat2
		move.b	d5,entries(a4)
		move.l	(sp)+,d5
		beq.s	1$
		clr.w	tasksnum(a4)
1$		moveq	#16,d2
		lea	-32(a5),a2
		bsr.s	sortlist
		rts

sortlist	tst.b	sorton(a4)
		beq.s	sort5
		lea	buffer(a4),a1
sort1		lea	0(a1,d2.w),a3
sort2		move.l	0(a1),d1
		cmp.l	0(a3),d1
		bge.s	sort3
		move.l	d2,d1
		subq.w	#1,d1
sort4		move.b	0(a3,d1.w),d0
		move.b	0(a1,d1.w),0(a3,d1.w)
		move.b	d0,0(a1,d1.w)
		dbra	d1,sort4
sort3		lea	0(a3,d2.w),a3
		cmp.l	a2,a3
		ble.s	sort2
		lea	0(a1,d2.w),a1
		cmp.l	a2,a1
		bne.s	sort1
sort5		rts

getaskdat2	move.l	sysbase(a4),a6
		lea	buffer(a4),a5
getaskdat3	moveq	#0,d5
		move.w	#$4000,$dff09a
		lea	stplist(a4),a3
		bsr.s	putlist
		lea	420(a6),a3		; SysBase->TaskWait
		bsr.s	putlist
		lea	406(a6),a3		; SysBase->TaskReady
		bsr.s	putlist
		move.l	276(a6),a3		; SysBase->ThisTask
		bsr.s	putdata
1$		move.w  #$C000,$dff09a
		rts

putlist		move.l	0(a3),a3
		tst.l	0(a3)
		beq.s	endlist
		bsr.s	putdata
		bra.s	putlist
endlist 	rts

putdata 	move.l	a3,(a5)+		;  +0 = task node
		move.l	10(a3),(a5)+		;  +4 = task->ln_Name
		move.b	8(a3),(a5)+		;  +8 = task->ln_Type
		move.b	15(a3),(a5)+		;  +9 = task->tc_State
		move.b	9(a3),(a5)+		; +10 = task->ln_Pri
		move.b	143(a3),(a5)+		; +11 = Process->pr_Tasknum
		move.w	tasksnum(a4),d0
		lea	cputime(a4),a0
		bra.s	pua2
pua3		move.l	500(a0),d1
		cmp.l	(a0)+,a3
		beq.s	pua1
pua2		dbra	d0,pua3
		moveq	#0,d1
pua1		move.l	d1,(a5)+		; +12 = task time
		addq.w	#1,d5
		rts

alloctaskbuf	moveq	#(2816>>5),d0
		lsl.w	#5,d0
		moveq	#0,d1
		CALL	AllocMem,sysbase(a4)
		move.l	d0,-(sp)
		beq.s	1$
		move.l	d0,a5
		bsr	getaskdat3
1$		move.l	(sp)+,d0
		rts

freetaskbuf	move.l	a5,a1
		moveq	#(2816>>5),d0
		lsl.w	#5,d0
		move.l	sysbase(a4),a6
		jmp	_LVOFreeMem(a6)

cleanuptimers	bsr.s	alloctaskbuf
		beq.s	2$
		moveq	#0,d1
		lea	taskstampid(a4),a1
1$		lea	-16(a5),a5
		move.l	0(a5),d0
		bsr.s	gettimeentry
		lea	taskstampid(a4),a3
		lea	0(a3,d0.w),a3
		move.l	0(a3),d2
		move.l	0(a1),0(a3)
		move.l	d2,(a1)
		move.l	taskstamps-taskstampid(a3),d2
		move.l	taskstamps-taskstampid(a1),taskstamps-taskstampid(a3)
		move.l	d2,taskstamps-taskstampid(a1)
		move.l	usedtime-taskstampid(a3),d2
		move.l	usedtime-taskstampid(a1),usedtime-taskstampid(a3)
		move.l	d2,usedtime-taskstampid(a1)
		addq.l	#4,a1
		addq.w	#1,d1
		subq.b	#1,d5
		bne.s	1$
		move.w	d1,numtaskstimed(a4)
		bsr.s	freetaskbuf
2$		rts

gettimeentry	movem.l	d1/a0/a1,-(sp)
		lea	taskstampid(a4),a1
		lea	4(a1),a0
		move.w	numtaskstimed(a4),d1
		subq.w 	#1,d1
1$		cmp.l	(a1)+,d0
		dbeq	d1,1$
		sub.l	a0,a1
		move.l	a1,d0
		movem.l	(sp)+,d1/a0/a1
		rts

getaskname2	movem.l	a3/a5,-(sp)
		link	a2,#-10
		move.l	sp,a5
		move.l	d0,a3
		tst.l	d0
		bne.s	2$
		bsr	putstr
		bra.s	1$
2$		move.b	8(a3),8(a5)
		move.l	10(a3),4(a5)
		bsr.s	gettaskname
1$		unlk	a2
		movem.l	(sp)+,a3/a5
		rts

gettaskname	movem.l	a1-a2,-(sp)
		clr.b	cliexec(a4)
		tst.b	cmdcli(a4)
		beq.s	2$
		cmpi.b	#13,8(a5)
		bne.s	2$

		CALL	Forbid,sysbase(a4)
		tst.l	140(a3)			; pr_TaskNum
		beq.s	1$
		move.l	172(a3),d0		; pr_CLI
		beq.s	1$
		lsl.l	#2,d0
		move.l	d0,a2
		tst.l	60(a2)			; cli_Module
		beq.s	1$
		move.l	16(a2),a1
		adda.l	a1,a1
		adda.l	a1,a1
		tst.b	0(a1)
		beq.s	1$
		move.w	#openbrak,d0
		bsr	putstrw
		move.l	16(a2),d0		; cli_CommandName
		bsr	putbcpl
		RECALL	Permit
		st	cliexec(a4)
		move.w	#closebrak,d0
		movem.l	(sp)+,a1-a2
		bra	putstrw

1$		RECALL	Permit			; a6 - still SysBase
2$		move.l	4(a5),d0
		movem.l	(sp)+,a1-a2
		bra	putstr

gettype		moveq	#$f,d1
		and.l	d1,d0
		mulu	#11,d0
		add.w	#type,d0
		bra	putstrw

*-------- mem-hunks ------------

showmem		lea	mheader(a4),a0
		bsr	puthead
		move.l	sysbase(a4),a5
		lea	322(a5),a5		; SysBase->MemList
		moveq	#0,d5
mem1		move.l	0(a5),a5		; MemList->ln_Next
		tst.l	0(a5)
		beq.s	mem2
		move.l	20(a5),d0		; MemHeader->mh_Lower
		bsr	hexa
		move.l	24(a5),d0		; MemHeader->mh_Upper
		bsr	hexa
		move.l	28(a5),d0		; MemHeader->mh_Free
		add.l	d0,d5
		moveq	#1,d3
		bsr	longdec
		move.w	14(a5),d0		; MemHeader->mh_Attributes
		bsr	gthex
		addq.l	#3,d0
		move.l	d0,a0
		move.b	#'$',(a0)
		bsr	putstr
		move.b	9(a5),d3		; MemHeader->ln_pri
		bsr	plusmins
		move.l	10(a5),d0		; MemHeader->ln_Name
		move.l	a5,node(a4)
		bsr	putnam
		bra.s	mem1
mem2		move.w	#infoh6,d0
		bsr	putstrw
		moveq	#18,d1
		bsr	tab
		move.l	d5,d0
		moveq	#1,d3
		bsr	longdec
		bra	newline

frags		move.l	sysbase(a4),a5
		lea	322(a5),a5		; SysBase->MemList
1$		move.l	0(a5),a5		; MemList->ln_Next
		tst.l	0(a5)
		bne.s	10$
		rts
10$		move.w	#memtyp,d0
		bsr	putstrw
		move.l	10(a5),d0
		bsr	putnam
		lea	fraghead(a4),a0
		bsr	puthead
		lea	buffer(a4),a1
		move.l	a1,a2
		moveq	#64,d0
9$		clr.l	(a2)+
		dbra	d0,9$
		lea	128(a1),a2
		lea	16(a5),a3		; MemHeader->mh_First

		CALL	Forbid,sysbase(a4)
2$		move.l	0(a3),d0
		beq.s	5$
		move.l	d0,a3
		move.l	4(a3),d0
		move.l	d0,d5
		moveq	#31,d1
3$		add.l	d0,d0
		btst.l	#31,d0
		dbne	d1,3$
		lsl.l	#2,d1
		addq.l	#1,0(a1,d1.w)
		cmp.l	0(a2,d1.w),d5
		ble.s	2$
		move.l	d5,0(a2,d1.w)
		bra.s	2$
5$		CALL	Permit,sysbase(a4)

		moveq	#0,d1
8$		move.l	(a2)+,d5
		move.l	(a1)+,d2
		beq.s	6$
		moveq	#0,d0
		bset.l	d1,d0
		lsr.l	#1,d0
		move.l	d0,d4
		bsr	hexa
		move.l	d4,d0
		moveq	#1,d3
		bsr	longdec
		move.l	d2,d0
		bsr	longdec
		move.l	d5,d0
		bsr	longdec
7$		bsr	newline
6$		addq.w	#1,d1
		cmp.w	#31,d1
		ble.s	8$
		bsr	newline
		bra	1$

*-------- Task-Stack ------------

stack		lea	stackhead(a4),a0
		bsr	puthead
		moveq	#0,d5
		bsr	getaskdat
		bra	sta4
sta1		lea	-16(a5),a5
		bsr	hideit
		beq.s	sta4
		move.l	0(a5),a1
		cmp.l	idletask(a4),a1
		beq.s	sta4
		move.l	a1,node(a4)
		moveq	#1,d3			; longdec right justified
		cmp.b	#13,8(a1)		; task->ln_Type
		bne.s	sta2
		move.l	172(a1),d0		; pr_CLI
		beq.s	sta2
		lsl.l	#2,d0
		move.l	d0,a0
		tst.l	60(a0)			; cli_Module
		beq.s	sta2
		move.l	176(a1),a0
		move.l	(a0)+,d4		; stacksize for this CLI-process
		move.l	a0,d0
		sub.l	d4,d0			; (pr_ReturnAddress+4)-stacksize
		bsr	hexa
		move.l	d4,d0			; stacksize
		bsr	longdec
		move.l	176(a1),d0		; pr_ReturnAddress
		addq.l	#4,d0
		bra.s	sta3

sta2		move.l	58(a1),d0		; tc_SPLower
		bsr	hexa
		move.l	62(a1),d4		; tc_SPUpper
		sub.l	58(a1),d4		; tc_SPLower
		move.l	d4,d0
		bsr	longdec
		move.l	62(a1),d0		; tc_SPUpper
sta3		sub.l	54(a1),d0		; tc_SPReg
		bcs.s	2$
		cmp.l	d4,d0
		ble.s	1$
2$		moveq	#-1,d0			; tc_SPReg outside ...
1$		bsr	longdec
		move.l	a1,a3
		bsr	gettaskname
		bsr	newline
sta4		subq.b	#1,entries(a4)
		bcc	sta1			; more entries
		rts

clicomm		lea	clicomhead(a4),a0
		bsr	puthead
		moveq	#0,d5
		bsr	getaskdat
		bra	clic0
clic1		lea	-16(a5),a5
		bsr	hideit
		beq	clic0
		move.l	0(a5),a2
		cmpi.b	#13,8(a2)		; ln_Type
		bne	clic0
		tst.l	172(a2)
		beq	clic0
		move.l	140(a2),d3		; pr_TaskNum
		beq 	clic0
		move.l	a2,d0
		move.l	d0,node(a4)
		bsr	hexa
		moveq 	#0,d0
		move.b	9(a5),d0
		subq.w	#1,d0
		mulu	#9,d0
		add.w	#status,d0
		bsr	putstrw
		move.l	172(a2),a3		; pr_CLI
		adda.l	a3,a3
		adda.l	a3,a3
		move.w	#script,d0
		tst.l	40(a3)			; cli_InterActive
		beq.s	clic5
		addq.w	#interact-script,d0
clic5		bsr	putstrw
		move.w	#backg,d0
		tst.l	44(a3)			; cli_Background
		bne.s	clic6
		addq.w	#foreg-backg,d0
clic6		bsr	putstrw
		bsr	bytedec
		move.l	4(a5),d0
		bsr	putstr
		moveq	#49,d1
		bsr	tab
		bsr	putblank
		move.l	128(a2),d0		; pr_SegList
		beq.s	noprogloadc
clic3		move.l	172(a2),d1		; pr_CLI
		bne.s	clic4
noprogloadc	move.w	#longnix,d0
		bsr 	putnamw
		bra.s	clic0
clic4		lsl.l	#2,d1
		move.l	d1,a2
		move.l	60(a2),d1		; cli_Module
		beq.s	noprogloadc
		move.l	16(a2),d0		; cli_CommandName
		bsr	putbcpl
		move.l	36(a2),d1		; cli_CommandFile
		beq.s	1$
		move.l	d1,d2
		lsl.l	#2,d1
		move.l	d1,a0
		tst.b	0(a0)
		beq.s	1$
		bsr 	putblank
		move.w	#openbrak,d0
		bsr	putstrw
		move.l	d2,d0
		bsr	putbcpl
		move.w	#closebrak,d0
		bsr	putstrw
1$		bsr	newline

clic0		subq.b	#1,entries(a4)
		bcc	clic1
clic8		rts

*--------- interrupts ------------

showint		lea	iheader(a4),a0
		bsr	puthead
		lea	intnames(a4),a5
		lea	inttyp(a4),a1
		moveq	#0,d6
findint		moveq	#0,d1
		lea	inttyp(a4),a1
		moveq	#15,d5
		move.l	sysbase(a4),a3
		lea	84(a3),a3		; SysBase->IntVects[16]
si0		tst.b	0(a1,d1.w)
		bne.s	si4
		move.l	8(a3),a2		; IntVector->iv_Node
		bra.s	si5
si4		move.l	0(a3),a2		; Interrupt->is_Node
si5		move.l	a2,d0
		beq	nxtint
		tst.b	0(a1,d1.w)
		beq.s	si1
si2		move.l	0(a2),a2		; is_Node->ln_Next
		tst.l	0(a2)
		beq	nxtint
si1		tst.w	d6
		beq.s	3$
		cmp.l	a2,d4
		bne.s	4$
		rts
3$		move.l	a2,node(a4)
		move.l	a2,d0
		bsr	hexa
		move.l	14(a2),d0		; Interrupt->is_Data
		bsr	hexan
		move.l	18(a2),d0		; Interrupt->is_Code
		bsr	hexan
		move.b	9(a2),d3		; Interrupt->ln_Pri
		movem.l	d6/a3,-(sp)
		bsr	plusmins
		move.w	#intserv,d0
		tst.b	0(a1,d1.w)
		bne.s	1$
		move.w	#inthand,d0
1$		bsr	putstrw
		move.w	#intdis,d0
		move.w	$dff01c,d3
		btst	d1,d3
		beq.s	2$
		move.w	#inten,d0
2$		bsr	putstrw
		movem.l	(sp)+,d6/a3
		move.l	a5,d0
		bsr	putstr
		move.l	10(a2),d0		; Interrupt->ln_Name
		bsr	putnam
		tst.b	0(a1,d1.w)
		bne	si2
4$		tst.l	0(a2)
		beq.s	nxtint
		move.l	0(a2),a2
		bra	si1
nxtint		addq.w	#1,d1
		lea	12(a5),a5
		lea	12(a3),a3
		dbra	d5,si0
		rts

*---------    resident ------------

showresi	lea	rheader(a4),a0
		bsr	puthead
		move.l	sysbase(a4),a5
		move.l	300(a5),a5		; SysBase->ResModules
r1		move.l	(a5)+,d0		; Resident->ln_Next
		beq.s	r2
		bpl.s	r3
		bclr	#31,d0
		movea.l	d0,a5
		bra.s	r1
r3		move.l	d0,node(a4)
		movea.l	d0,a3
		bsr	hexa
		move.b	13(a3),d3		; rt_Pri
		bsr	plusmins
		move.b	10(a3),d0		; rt_Flags
		bsr	bin
		move.b	11(a3),d3		; rt_Version
		bsr	bytedec
		move.b	12(a3),d0		; rt_Type
		bsr	gettype
		move.l	14(a3),d0		; rt_Name
		bsr	putnam
		bra.s	r1
r2		rts

*---------  ports  -------------

showprt		lea	pheader(a4),a0
		bsr	puthead
		moveq	#0,d5
		lea	buffer(a4),a5
		move.l	a5,-(sp)
		CALL	Forbid,sysbase(a4)
		move.w	#$4000,$dff09a
		bsr.s	getprts
		move.w	#$C000,$dff09a
		RECALL	Permit
		move.l	(sp)+,a5		; buffer
		bra.s	sp2
sp1		move.l	(a5)+,d0
		move.l	d0,node(a4)
		bsr	hexa
		move.l	(a5)+,d0
		bsr	putstr
		moveq	#25,d1
		bsr 	tab
		bsr	putblank
		moveq	#3,d0
		and.b	(a5)+,d0
		mulu	#9,d0
		add.w	#mp_flags,d0
		bsr	putstrw
		lea	bytedec(pc),a0
		move.b	(a5)+,d3
		jsr	0(a0)			; bytedec
		move.w	(a5)+,d3
		bpl.s	1$
		lea	putstrw(pc),a0
		move.w	#toomuch,d0
1$		jsr	0(a0)			; bytedec or putstrw
		move.l	(a5)+,d0
		bsr	getaskname2
		bsr	newline
sp2		subq.w	#1,d5
		bcc.s	sp1
		rts

getprts		lea	392(a6),a3		; SysBase->PortList
sp3		move.l	0(a3),a3		; mp_Node.ln_Next
		tst.l	0(a3)
		beq.s	sp4
		bsr.s	getpdata
		bra.s	sp3
sp4		tst.b	tports(a4)
		beq.s	sp6
		move.l	276(a6),a3		; SysBase->ThisTask
		lea 	92(a3),a3		; Process->pr_MsgPort
		bsr.s	getpdata
		lea	406(a6),a2		; SysBase->TaskReady
		bsr.s	sp5
		lea	420(a6),a2		; SysBase->TaskWait
sp5		move.l	0(a2),a2
		tst.l	0(a2)
		beq.s	sp6
		lea 	92(a2),a3		; pr_MsgPort
		cmp.b	#13,8(a2)		; ln_Type
		bne.s	sp5
		bsr.s	getpdata
		bra.s	sp5
sp6		rts

getpdata	move.l	a3,(a5)+
		move.l	10(a3),(a5)+		;  +4 = ln_Name
		move.b	14(a3),(a5)+		;  +8 = mp_Flags
		move.b	15(a3),(a5)+		;  +9 = mp_SigBit
		moveq	#0,d0
		suba.l	a0,a0
		movea.l	20(a3),a1		; mp_MsgList
sp7		movea.l	0(a1),a1
		cmpa.l	a0,a1
		beq.s	sp8
		addq.b	#1,d0
		bcc.s	sp7			; <256
		subq.w	#1,d0
sp8		move.w	d0,(a5)+		; +10 = msgcnt
		move.l	16(a3),(a5)+		; +12 = mp_SigTask
		addq.w	#1,d5
		rts

*-------- resources ------------

showres		lea	resnam(a4),a3
		move.w	#336,d3			; SysBase->ResourceList
		bra.s	show

*--------- devices  -------------

showdevs	lea	devnam(a4),a3
		move.w	#350,d3			; SysBase->DeviceList
		bra.s	show

*-------- libraries -------------

showlibs	lea	libnam(a4),a3
		move.w	#378,d3			; SysBase->LibList

show		lea	lheader(a4),a0
		bsr	puthead1
		move.l	a3,a0
		bsr	puthead2
		moveq	#0,d5
		lea	buffer(a4),a5
		move.l	a5,-(sp)
		CALL	Forbid,sysbase(a4)
		lea	0(a6,d3.w),a3
sl1		move.l	0(a3),a3		; lib_Node.ln_Next
		tst.l	0(a3)
		beq.s	sl2
		move.l	a3,(a5)+
		move.w	32(a3),(a5)+		;  +4 = lib_OpenCnt
		move.w	20(a3),(a5)+		;  +6 = lib_Version
		move.w	22(a3),(a5)+		;  +8 = lib_Revision
		clr.b	(a5)+
		move.b	14(a3),(a5)+		; +11 = lib_Flags
		move.l	10(a3),(a5)+		; +12 = ln_Name
		addq.w	#1,d5
		bra.s	sl1
sl2		RECALL	Permit
		move.l	(sp)+,a5		; buffer
		bra.s	sl4
sl3		move.l	(a5)+,d0
		move.l	d0,node(a4)
		bsr	hexa
		move.w	(a5)+,d3
		bsr	worddec
		move.w	(a5)+,d3
		bsr	worddec
		move.w	(a5)+,d3
		bsr	worddec
		move.w	(a5)+,d0
		bsr	bin
		move.l	(a5)+,d0
		bsr	putnam
sl4		subq.w	#1,d5
		bcc.s	sl3			; not ready
		rts

;--------- Semaphores ---------

semaphores	lea	semhead(a4),a0
		bsr	puthead
		move.l	sysbase(a4),a3
		lea	532(a3),a3
		bsr.s	sema
		tst.b	post_V34(a4)
		bne.s	sema6
		move.l	intuibase(a4),a3
		lea	1010(a3),a3
sema		moveq	#0,d5			; examine list
		lea	buffer(a4),a5
		move.l	a5,-(sp)
		move.w	#$4000,$dff09a
sema2		move.l	0(a3),a3
		tst.l	0(a3)
		beq.s	sema3
		move.l	a3,(a5)+
		move.l	$28(a3),(a5)+
		move.b	$2d(a3),(a5)+
		move.b	$f(a3),(a5)+
		move.l	10(a3),(a5)+
		addq.w	#1,d5
		bra.s 	sema2
sema3		move.w	#$C000,$dff09a
		move.l	(sp)+,a5		; buffer
		bra.s	sema5
sema4		move.l	(a5)+,d0
		bsr	hexa
		move.l	(a5)+,d0
		bsr	getaskname2
		moveq	#24,d1
		bsr	tab
		moveq	#1,d3
		add.b	(a5)+,d3
		bsr	plusmins
		move.b	(a5)+,d3
		bsr	plusmins
		move.l	(a5)+,d0
		bsr	putnam
sema5		subq.w	#1,d5
		bcc.s	sema4			; not ready
sema6		rts

; unlock a file

unlock		tst.b	fromfile(a4)
		bne.s	ul6
		bsr	readhex
		tst.b	d7
		beq	syntax
		move.l	d0,remembr(a4)
		move.l	d0,-(sp)
		moveq	#-1,d6
		bsr.s	of44
		tst.l	remembr(a4)
		beq.s 	ul1
		move.w	#unlerr,d0
		bsr	putnamw
		bra.s	ul4
ul1		bsr	allocfinfo
		bsr	ResumeOutput
		move.w	#unl1,d0
		bsr	putstrw
		move.l	0(sp),d0
		bsr	getpath
		move.w	#unltxt2,d0
		bsr	putstrw
		bsr	readline
		cmp.b	#'y',d0
		bne.s 	ul5
		move.l	0(sp),d1
		CALL	UnLock,dosbase(a4)
ul5		bsr	freefinfo
ul4		addq.l	#4,sp
ul6		rts

;---------- Show all Locks------------

locks		moveq	#0,d6
		bra.s	of33

;---------- Open Files-----------

openfiles	moveq	#1,d6
of33		lea	ofheader(a4),a0
		bsr	puthead
of44		bsr	allocfinfo
		bsr	devinfo			; get pointer to devicelist
		move.l	a1,a3
of1		move.l	a3,devicelock(a4)
		adda.l	a3,a3
		adda.l	a3,a3
		moveq	#2,d2 			; 2 = DLT_VOLUME
		cmp.l	4(a3),d2		; dol_Type 
		bne	of2
		lea	buffer(a4),a5
		move.l	a5,a1
		move.l	40(a3),a2		; dol_Name ('\0' terminated!)
		adda.l	a2,a2
		adda.l	a2,a2
		addq.w	#1,a2
of22		move.b	(a2)+,(a1)+
		bne.s	of22
		subq.w	#1,a1
		move.b  #':',(a1)+
		clr.b	0(a1)
		tst.b	post_V34(a4)
		bne.s	of5
		cmp.l	#'RAM ',0(a5)		; hack to access the 'RAM Disk'
		bne.s	of5
		cmp.l	#'Disk',4(a5)		; as 'RAM:' as the system may
		bne.s	of5
		move.l	#'M:'<<16,2(a5)		; GURU with KS 1.2
of5		move.l	a5,d1
		moveq	#-2,d2
		CALL	Lock,dosbase(a4)	; get a lock to the device
		move.l	d0,d2			; not mounted' if fails
		bne.s	of6
		move.l	a5,d0			; buffer points to device name
		bsr	putstr
		move.w	#nomount,d0
		bsr	putnamw
		bra	of2

of6		CALL	Forbid,sysbase(a4)
		move.l	d2,-(sp)		; d2 = FileLock
		lea	buffer+40(a4),a6	; where to store the locks we find
		move.l	d2,d0
of4		lsl.l	#2,d0
		move.l	d0,a5
		moveq	#50,d1
		move.l	0(a5),d0		; fl_Link
		cmp.l	d1,d0			; zero or bogus ?
		ble.s	1$			; exit loop
		movem.l	d0/d1/a0/a1/a6,-(sp)
		lsl.l	#2,d0
		move.l	d0,a1
		CALL	TypeOfMem,sysbase(a4)
		tst.l	d0			; valid ?
		movem.l	(sp)+,d0/d1/a0/a1/a6
		beq.s	1$
		move.l	d0,(a6)+		; put lock into buffer
		tst.l	d6			; searching for a lock ?
		bpl.s	of4			; no !
		cmp.l	remembr(a4),d0		; yes, compare them
		bne.s	of4
		clr.l	remembr(a4)
		CALL	Permit,sysbase(a4)
		move.l	(sp)+,d1
		CALL	UnLock,dosbase(a4)
		bra	of55			; exit if found

1$		clr.l	(a6)+			; end of buffer marker
		CALL	Permit,sysbase(a4)
		tst.l	d6			; just searching for a lock ?
		bmi	of3 			; skip printing out info

of45		lea	buffer+40(a4),a2	; a2-> array of locks
of46		move.l	(a2)+,d0		; get a lock
		beq	of3 			; end of list ?
		move.l	d0,d5
		lsl.l	#2,d0			; bptr -> aptr
		move.l	d0,a5
		move.l	8(a5),d4		; fl_Access
		move.l	d5,d0
		bsr	getfinfo		; get fileinfo
		move.l	finfoptr(a4),a5
		tst.l	d6
		beq.s	of8
		bmi.s	of8 			; looking for open files ?
		tst.l	4(a5)			; fib_DirEntryType
		bpl.s	of46			; not a file
of8		move.l	d5,d0
		move.l	d0,node(a4)
		bsr	hexa			; display lock
		move.w	#access,d0		; access mode
		cmp.w	#-2,d4
		beq.s	of7
		addq.w  #8,d0
of7		bsr	putstrw
		tst.l	4(a5)			; size
		bmi.s	of9
		move.w	#longlongnix,d0
		bsr	putstrw
		bra.s	of10
of9		move.l	124(a5),d0
		moveq	#1,d3
		bsr	longdec
of10		move.l	d5,d0			; path and filename
		bsr	getpath
		bra.s	of46

of3		move.l	(sp)+,d1
		CALL	UnLock,dosbase(a4)
of2		move.l	0(a3),d0
		move.l	d0,a3
		bne	of1
of55		bsr	freefinfo
		rts

;---------- Dos Devices ----------

devices		lea	ddheader(a4),a0
		bsr	puthead
		bsr	devinfo
dev1		adda.l	a1,a1
		adda.l	a1,a1
		tst.l	4(a1)
		bne	dev9
		moveq	#0,d6
		move.l	40(a1),d0
		bsr	putbcpl
		moveq	#10,d1
		bsr	tab
		move.w	#notfile,d0
		lea	putstrw(pc),a0
		moveq	#64,d1
		move.l	28(a1),a3
		cmp.l	d1,a3
		ble.s	dev3			; <=64
		adda.l	a3,a3
		adda.l	a3,a3
		move.l	8(a3),a2
		cmp.l	d1,a2
		ble.s	dev3			; <=64
		adda.l	a2,a2
		adda.l	a2,a2
		movem.l	d0/d1/a0/a1/a6,-(sp)
		move.l	a2,a1
		CALL	TypeOfMem,sysbase(a4)
		tst.l	d0			; valid ?
		movem.l	(sp)+,d0/d1/a0/a1/a6
		beq.s	dev3
		moveq	#1,d6
		move.l	12(a2),d3
		bsr	bytedec
		move.l	20(a2),d0
		moveq	#1,d3
		lea	longdec(pc),a0
		jsr	0(a0)			; longdec
		move.l	40(a2),d0
		beq.s	dev2
		addq.l	#1,d0
		sub.l	36(a2),d0
dev2		jsr	0(a0)			; longdec
		move.l	44(a2),d0
dev3		jsr	0(a0)			; putstrw or longdec
dev4		move.w	#devload,d0
		tst.l	8(a1)
		bne.s	dev5
		move.w	#devnload,d0
dev5		bsr	putstrw
		lea	putbcpl(pc),a0
		tst.w	d6
		beq.s	dev6
		move.l	4(a3),d0
		bne.s	dev7
dev6		move.l	16(a1),d0
		bne.s	dev7
		move.l	8(a1),d0
		beq.s	dev8
		move.l	d0,a3
		tst.b	14(a3)
		bne.s	dev8			; mp_SigTask not a task!
		move.l	16(a3),d0
		beq.s	dev8			; NULL!
		move.l	d0,a3
		lea	putstr(pc),a0
		move.l	10(a3),d0
dev7		jsr	0(a0)			; putbcpl or putstr
dev8		bsr	newline
dev9		move.l	(a1),d1
		move.l	d1,a1
		bne	dev1
		rts

; Re-assign a drive to dos

freedrive	moveq	#0,d2
		bra.s	ldr3

; Inhibit a disk drive

lockdrive	moveq	#1,d2
ldr3		bsr	getstr
		bsr	finddev
		lea	buffer(a4),a2
		bne.s	ldr1
ldr2		move.l	a2,d0			; buffer
		bsr	putstr
		move.w	#nomount,d0
		bsr	putstrw
		move.w	#dishelp,d0
		bra 	putnamw
ldr1		move.l	a2,d1			; buffer
		CALL	DeviceProc,dosbase(a4)
		move.l	d0,a0
		move.l	a0,d0
		beq.s	ldr2
		moveq	#31,d0
		move.l	d2,d1

; send a packet
; d0 = packet type
; d1 = arg1
; a0 = msgport

cons1		lea	mypacket(a4),a1
		lea	20(a1),a2
		move.l	a2,10(a1)		; sp_Pkt to sp_Msg->ln_Name
		move.l	a1,20(a1)		; sp_Msg to sp_Pkt->dp_Link
		move.l	replyport(a4),a2
		move.l	a2,24(a1)		; sp_Pkt->dp_Port
		move.l	d0,28(a1)		; sp_Pkt->dp_Type
		move.l	d1,40(a1)		; sp_Pkt->dp_Arg1
		CALL	PutMsg,sysbase(a4)
		move.l	a2,a0
		RECALL	WaitPort
		move.l	a2,a0
		jmp	_LVOGetMsg(a6)

;display the current directory of all processes,

currentdir	lea	cdheader(a4),a0
		bsr	puthead
		bsr	allocfinfo
		bsr	alloctaskbuf
		beq.s	cd7
		move.l	d0,a5
		move.b	d5,entries(a4)
		move.l	a5,-(sp)
		bra.s	cd6
cd2		cmp.b	#13,8(a5)
		bne.s	cd5
		move.l	0(a5),a3
		move.l	a5,-(sp)
		moveq	#-1,d6
		move.l	152(a3),remembr(a4)
		bsr	of44
		move.l	(sp)+,a5
		tst.l	remembr(a4)
		bne.s	cd5
		move.l	0(a5),a3
		move.l	a3,node(a4)
		bsr	gettaskname
		moveq	#21,d1
		bsr	tab
		move.l	152(a3),d0
		bsr	getpath
cd5		lea 	16(a5),a5
cd6		subq.b	#1,entries(a4)
		bcc.s	cd2			; not ready
		move.l	(sp)+,a5
		bsr	freetaskbuf
		bsr	freefinfo
cd7		rts

;Change the current directory setting of a process

cd		tst.b	fromfile(a4)
		bne.s	cd7
		bsr	getstr
		lea	buffer(a4),a1
		move.l	a1,d1
		moveq	#-2,d2
		move.l	a0,-(sp)
		CALL	Lock,dosbase(a4)
		move.l	(sp)+,a0
		tst.l	d0
		bne.s	cd16
		move.w	#dnotf,d0
		bra	putnamw
cd16		move.l	d0,remembr2(a4)
		move.l	a0,-(sp)
		bsr	allocfinfo
		move.l	remembr2(a4),d0
		bsr	getfinfo
		move.l	finfoptr(a4),a5
		move.l	(sp)+,a0
		tst.l	4(a5)
		bpl.s	cd11
		move.w	#notdir,d0
		bsr	putnamw
		bra.s	cd18
cd11		bsr	nodenam
		moveq	#2,d7
		lea	TRuNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	cd15
		move.l	d0,a5
		cmp.b	#13,8(a5)
		beq.s	cd15
		bsr	syntax
		bra.s	cd18
cd15		move.l	152(a5),d0
		beq.s	cd13
		move.l	a5,-(sp)
		moveq	#-1,d6
		move.l	d0,remembr(a4)
		bsr	of44
		move.l	(sp)+,a5
		tst.l	remembr(a4)
		bne.s	cd18
cd13		move.l	152(a5),d1
		move.l	remembr2(a4),152(a5)
		move.l	d1,remembr2(a4)
cd12		beq.s 	cd14
		bsr	ResumeOutput
		move.w	#unltxt,d0
		bsr	putstrw
		move.l	remembr2(a4),d0
		bsr	getpath
		move.w	#unltxt2,d0
		bsr	putstrw
		bsr	readline
		cmp.b 	#'y',d0
		bne.s	cd14
cd18		move.l	remembr2(a4),d1
		beq.s	cd14
		CALL	UnLock,dosbase(a4)
cd14		bsr	freefinfo
		rts

;find the first entry in the device-list
;returns a1 = pointer to first entry

devinfo		move.l	dosbase(a4),a1
		move.l	34(a1),a1		; dl_Root
		move.l	24(a1),a1		; RootNode->rn_Info
		adda.l	a1,a1
		adda.l	a1,a1
		move.l	4(a1),a1		; DosInfo->di_DevInfo
		rts

; Check if a named dos-device is mounted
; name in 'buffer'.
; Result: d0 = 0(false) anything else(true).

finddev		bsr.s	devinfo
fdev1		adda.l	a1,a1
		adda.l	a1,a1
		tst.l	4(a1)
		bne.s	fdev2
		move.l	40(a1),a2
		lea	buffer(a4),a0
		bsr.s	strbcmp
		tst.w	d0
		bne.s	fdev3
fdev2		move.l	0(a1),d0
		move.l	d0,a1
		bne.s	fdev1
fdev3		rts

; compare bcpl string with string
; a0 = pointer to string
; a2 = bcpl-pointer to bcpl-string
; returns d0 = true(0) false(1)

strbcmp		movem.l	d1/a0/a2,-(sp)
		moveq	#0,d0
		moveq	#0,d1
		adda.l	a2,a2
		adda.l	a2,a2
		move.b	(a2)+,d1
		beq.s	stb1
		subq.w	#1,d1
stb2		cmp.b	(a2)+,(a0)+
		bne.s	stb1
		dbra	d1,stb2
		moveq	#1,d0
stb1		movem.l	(sp)+,d1/a0/a2
		rts

;--------- low memory handlers --------

lowmemhandler	lea	inheader(a4),a0
		bsr	puthead
		tst.b	post_V38(a4)
		beq.s	inph1			; not Kick 3.0+
		move.l	sysbase(a4),a5
		lea	616(a5),a5
		bra.s	inph2			; show all handlers

;----------- input handlers -----------

inputhandler	lea	inheader(a4),a0
		bsr	puthead

		lea	ininterrupt(a4),a5
1$		move.l	0(a5),a5		; get list header
		tst.l	0(a5)
		bne.s	1$
		subq.l	#4,a5			; found it

inph2		move.l	0(a5),a5
		tst.l	0(a5)
		beq.s	inph1
		move.l	a5,d0
		move.l	d0,node(a4)
		bsr	hexa
		move.l	14(a5),d0
		bsr	hexa
		move.l	18(a5),d0
		bsr	hexa
		move.b	9(a5),d3
		bsr	plusmins
		move.l	10(a5),d0
		bsr	putnam
		bra.s	inph2
inph1		rts

;display list of public screens

pubscreens	lea	pscrheader(a4),a0
		bsr	puthead
		tst.b	post_V34(a4)
		beq.s	1$			; only Kick 2.0+
		CALL	LockPubScreenList,intuibase(a4)
		movea.l	d0,a5
		move.l	a5,d0
		beq.s	1$			; no list ???
5$		movea.l	0(a5),a5
		tst.l	0(a5)
		beq.s	2$			; end of list
		move.l	a5,d0
		move.l	d0,node(a4)
		bsr	hexa			; node
		move.l	10(a5),d0
		bsr	putstr			; name
		moveq	#25,d1
		bsr	tab
		move.w	#pscr_state,d0
		btst	#0,19(a5)		; public or private ?
		beq.s	4$
		add.w	#10,d0
4$		bsr	putstrw			; state
		lea	bytedec(pc),a0
		move.w	22(a5),d3		; visit count (locks & windows)
		jsr	0(a0)
		move.b	28(a5),d3
		bpl.s	3$			; valid signal
		move.w	#nix,d0
		lea	putstrw(pc),a0
3$		jsr	0(a0)
		move.l	24(a5),d0		; sigtask
		bsr	getaskname2
		bsr	newline
		bra.s	5$
2$		CALL	UnlockPubScreenList,intuibase(a4)
1$		rts

;get all screen pointers.
;result: d5=number of screens
;	 buffer+100 holds pointers.

getscr		lea	scrheader(a4),a0
		bsr	puthead
getscr2 	movem.l	d0/a0,-(sp)
		moveq	#0,d0
		CALL	LockIBase,intuibase(a4)
		lea	buffer+100(a4),a0
		move.l	60(a6),a1		; firstscreen
		moveq	#0,d5
sr1		addq.w	#1,d5
		move.l	a1,(a0)+
		move.l	0(a1),a1
		move.l	a1,d1
		bne.s	sr1
		subq.w	#1,d5
		move.l	d0,a0
		RECALL	UnlockIBase
		movem.l	(sp)+,d0/a0
		rts

;display screen infos

screens		bsr.s	getscr
		moveq	#1,d6
		lea	buffer+100(a4),a5
sr2		move.w	d6,d3
		bsr	bytedec			; number
		move.l	(a5)+,a2
		move.l	a2,node(a4)
		move.l	a2,d0
		bsr	hexa			; address
		move.w	12(a2),d0
		moveq 	#4,d3
		bsr	longdecn		; width
		moveq	#'X',d0
		bsr	putchar
		move.w	14(a2),d0
		bsr	longdecn		; height
		move.b	189(a2),d3
		bsr 	bytedec
		move.l	22(a2),d0		; depth
		bsr	putnam			; name
		tst.b	post_V34(a4)
		beq.s	sr5			; only kick 2.0+
		move.w	#monitorid,d0
		bsr	putstrw
		lea	44(a2),a0		; ViewPort
		CALL	GetVPModeID,gfxbase(a4)
		move.l	d0,-(sp)
		bsr	hexa			; DisplayID
		move.l	#'-> ',d0
		bsr	putlongascii
		move.l	(sp)+,d0
		RECALL	FindDisplayInfo
		move.l	d0,d2
		beq.s	sr3			; no handle
		move.l	d0,a0
		lea	-104(a5),a1
		moveq	#56,d0			; nif_SIZEOF
		move.l	#$80003000,d1		; DTAG_NAME
		moveq	#0,d2
		RECALL	GetDisplayInfoData
sr3		lea	-88(a5),a0		; NameInfo.Name
		cmp.l	d2,d0
		bne.s	sr4			; ok !
		move.l	#'???'<<8,(a0)
sr4		move.l	a0,d0
		bsr	putnam			; name + LF
sr5		addq.w	#1,d6			; next screen
		dbra	d5,sr2
		rts

;display windows and associated fonts
windowfonts	moveq	#1,d0
		bra.s	windows1

;display window addresses and titles
windows		moveq	#0,d0
windows1	move.b	d0,bool(a4)
		bsr	getscr2
		move.l	d5,-(sp)
		lea	wnheader(a4),a0
		bsr	puthead
		move.l	(sp)+,d5
		tst.b	bool(a4)
		beq.s	wn20
		move.l	d5,-(sp)
		lea	fohead(a4),a0
		bsr	puthead
		move.l	(sp)+,d5
wn20		lea	buffer+100(a4),a3
wn2		move.w	#onscr,d0
		bsr	putstrw
		move.l	(a3)+,a2
		move.l	22(a2),d0
		bsr	putnam
		lea	4(a2),a1
wn1		move.l	(a1),d0
		move.l	d0,a1
		beq.s	wn3
		move.l	d0,node(a4)
		bsr	hexa

		move.l	86(a1),d0		; wn->UserPort
		beq.s	1$
		move.l	d0,a0
		move.l	16(a0),d0		; SigTask
1$		bsr	getaskname2
		moveq	#20,d1
		bsr	tab
		bsr	putblank

		moveq	#4,d3
		moveq	#2,d2
		lea	4(a1),a0
2$		move.w	(a0)+,d0
		bsr	longdecn
		dbra	d2,2$
		moveq	#'X',d0
		bsr	putchar
		move.w	10(a1),d0
		bsr	longdecn

		move.l	32(a1),d0
		bsr	putnam

		tst.b	bool(a4)
		beq.s	wn21
		move.l	a1,-(sp)
		move.l	50(a1),a1
		move.l	52(a1),a1
		bsr	fontdata
		move.l	(sp)+,a1

wn21		bra.s	wn1
wn3		dbra	d5,wn2
		rts

;close a specified screen

closescreen	bsr	getscr2
		moveq	#1,d6
		cmp.b	#'$',0(a0)
		bne.s	cs1
		bsr	readhex
		tst.w	d7
		beq	syntax
		move.l	d0,d4
csin		moveq	#0,d6
cs1		lea	buffer+100(a4),a2
cs5		tst.w	d6
		bne.s	cs2
		cmp.l	(a2)+,d4
		beq.s	cs3
		bra.s	cs4
cs2		move.l	(a2)+,a1
		move.l	22(a1),a1
		bsr	strcmp
		beq.s	cs3
cs4		dbra	d5,cs5
		move.w	#scnofound,d0
		bra	putnamw
cs3		move.l	-(a2),a0
		cmp.l	screenptr(a4),a0	; own screen ?
		beq.s	cs8
		move.l	4(a0),d0		; Screen->FirstWindow
		beq.s	cs7
		move.l	a0,-(sp)
cs6		move.l	d0,a3
		move.l	(a3),-(sp)		; Window->NextWindow
		bsr.s	clw
		move.l	(sp)+,d0
		bne.s	cs6			; more windows !
		move.l	(sp)+,a0
cs7		CALL	CloseScreen,intuibase(a4)
cs8		rts

;close a specified window

closewindow	bsr.s	getwnptr		; get windowptr
clw		move.l	a3,d0			; close win in a3
		beq.s	cs8
		cmp.l	wnptr(a4),a3		; own window ?
		beq.s	cs8
		move.l	intuibase(a4),a6
cw1		move.l	36(a3),d0
		move.l	d0,a0
		beq.s	cw2
		move.w	#_LVOFreeSysRequest,d1
		move.w	28(a0),d0
		and.w	#$4000,d0
		bne.s	cw3
		move.l	a3,a1
		RECALL	EndRequest
		bra.s	cw1

cw2		move.w	#_LVOModifyIDCMP,d1	; d0 already zero !
		bsr.s	cw3
		move.w	#_LVOCloseWindow,d1
cw3		move.l	a3,a0
		jmp	0(a6,d1.w)		; CloseWin/FreeSysReq/ModIDCMP

getwnptr	bsr	getscr2
		moveq	#1,d6
		cmp.b	#'$',0(a0)
		bne.s	cw4
		bsr	readhex
		tst.w	d7
		bne.s	cwin
		bsr	syntax
		bra.s	cw10
cwin		move.l	d0,d4
		moveq	#0,d6
cw4		lea	buffer+100(a4),a2
cw5		move.l	(a2)+,a3
		move.l	4(a3),d0
		beq.s	cw9
cw6		move.l	d0,a3
		tst.w	d6
		bne.s	cw7
		cmp.l	a3,d4
		beq.s	cw11
		bra.s	cw8
cw7		move.l	32(a3),a1
		bsr	strcmp
		beq.s	cw11
cw8		move.l	0(a3),d0
		bne.s	cw6
cw9		dbra	d5,cw5
		move.w	#winnofound,d0
		bsr	putnamw
cw10		suba.l	a3,a3
cw11		rts

windowoff	movem.l	d1-d7/a0-a6,-(sp)
		bsr	getscr2
		bsr.s	cwin
		move.l	a3,d1
		beq.s	woff1
		bsr	clw
		move.l	-(a2),a0
		move.l	a0,d4
		tst.l	4(a0)
		bne.s	woff1
		bsr	getscr2
		bsr	csin
woff1		movem.l	(sp)+,d1-d7/a0-a6
		rts

closetskwin	movem.l	d1-d7/a0-a6,-(sp)
ctw0		bsr	getscr2
		lea	buffer+100(a4),a2
ctw1		move.l	(a2)+,a3
		addq.l	#4,a3
ctw6		move.l	(a3),d1
		move.l	d1,a3
		beq.s 	ctw4
		move.l	86(a3),a0
		move.l	16(a0),d1
		cmp.l	d0,d1
		bne.s 	ctw6
		move.l	d0,d1
		move.l	a3,d0
		bsr.s	windowoff
		move.l	d1,d0
		bra.s 	ctw0
ctw4		dbra	d5,ctw1
		movem.l	(sp)+,d1-d7/a0-a6
		rts

;Change the font for xopers window

myfont		moveq	#1,d5
		bra.s	setfon1

;Change the font of a specified Window

setfont		moveq	#0,d5

setfon1		bsr.s	openfont
		tst.b	d2
		beq.s	1$			; result not ok
		tst.w	d5
		bne.s	3$			; our window
		move.l	d0,-(sp)
		move.l	a3,a0
		bsr	kllblnks
		bsr	getwnptr
		move.l	(sp)+,d0
		move.l	gfxbase(a4),a6		; preload a6
		move.l	a3,d1
		beq.s	2$			; no window
		cmp.l	wnptr(a4),a3
		beq.s	3$			; xopers window
		move.l	d0,a0
		move.l	50(a3),a1
		RECALL	SetFont
		move.l	a3,a0
		CALL	RefreshWindowFrame,intuibase(a4)
		bra.s	1$
3$		move.l	ownfont(a4),-(sp)	; set font for Xoper
		move.l	d0,ownfont(a4)
		clr.b	topaz(a4)		; use this font !
		bsr	usetopaz2
		move.l	(sp)+,d0
		beq.s	1$			; no old font
2$		move.l	d0,a1
		RECALL	CloseFont		; no window or old xoper font
1$		rts

;Open a requested font

openfont	bsr	nodenam
		tst.b	0(a5)
		beq	3$			; error
		tst.w	d5
		beq.s	14$			; not myfont
		lea	deffont(a4),a0
		move.l	a5,a1
		bsr	strcmp			; use "default" ?
		beq.s	15$
		sub.b	#$20,d0
		bne.s	14$
15$		subq.w	#7,d1
		seq	d2			; set as flag
		beq	1$			; len was 7 !
14$		move.l	a5,a3
12$		cmp.b	#33,(a3)+
		bge.s	12$
		tst.b	-(a3)
		bne.s	11$			; ok
		tst.w	d5
		beq	3$			; error
11$		clr.b	(a3)+
		lea	-6(a3),a0		; check for '.font'
		lea	fontsuf(a4),a1
		bsr	strcmp
		beq.s	8$			; correct suffix
		move.l	a5,a0
		lea	dummy(a4),a5
		move.l	a5,a2
10$		move.b	(a0)+,(a2)+		; copy fontname
		bne.s	10$
		subq.w	#1,a2
9$		move.b	(a1)+,(a2)+		; copy suffix
		bne.s	9$
8$		lea	out-4(a4),a2
		move.l	a2,a0
		move.l	a5,(a0)+		; +0
		move.w	procnum(a4),d2
		cmp.w	#7,d2
		bcc.s	7$			; not smaller than 7 pixels !
		moveq	#7,d2
7$		move.w	d2,(a0)+		; +4
		clr.w	(a0)			; +6
		move.l	a2,a0			; TextAttr
		CALL	OpenFont,gfxbase(a4)
		move.l	d0,d4
		beq.s	6$
		move.l	d4,a0
		cmp.w	20(a0),d2		; tf_YSize == ta_YSize ?
		beq.s	4$
6$		lea 	diskfont(a4),a1
		CALL	OldOpenLibrary,sysbase(a4)
		move.l	d0,d6
		beq.s	4$
		move.l	a2,a0			; TextAttr
		CALL	OpenDiskFont,d6
		move.l	d0,d3
		beq.s	5$			; no disk font
		exg.l	d3,d4
		move.l	d3,a1
		move.l	a1,d3
		beq.s	5$
		CALL	CloseFont,gfxbase(a4)	; close font1
5$		move.l	d6,a1
		CALL	CloseLibrary,sysbase(a4)
4$		move.l	d4,d0			; return font
		sne	d2			; set as flag
		bne.s	1$
		move.w	#fonterr,d0		; arrgh, no font found
		bsr	putstrw
		move.l	0(a2),d0		; TextAttr->FontName
		bsr	putnam
		bra.s	1$
3$		bsr	syntax			; syntax error
1$		rts

;display loaded font names and definitions

fonts		lea	fohead(a4),a0
		bsr	puthead
		move.l	gfxbase(a4),a1
		lea	140(a1),a1		; system fontlist
fo1		move.l	0(a1),a1
		tst.l	0(a1)
		beq.s	fo3
		bsr.s	fontdata
		bra.s	fo1
fo3		rts

fontdata	move.l	a1,d0
		move.l	d0,node(a4)
		bsr	hexa
		move.w	30(a1),d3
		bsr	worddec
		move.w	20(a1),d3
		bsr	worddec
		move.w	24(a1),d3
		bsr	worddec
		move.w	#romfnt,d0
		btst	#1,23(a1)
		beq.s	fod1
		addq.w	#diskfnt-romfnt,d0
fod1		bsr	putstrw
		move.w	#ffixed,d0
		btst	#5,23(a1)
		beq.s	1$
		addq.w	#fprop-ffixed,d0
1$		bsr	putstrw
		move.b	32(a1),d3
		bsr	bytedec
		move.b	33(a1),d3
		bsr	bytedec
		move.l	10(a1),d0
		bra	putnam

;set update rate

settime		bsr	getfrac
		tst.b	d7
		bne.s	st1
		move.w	#whattime,d0
		bsr	putstrw
		move.l	timeoutm(a4),d0
		move.l	#100000,d1
		bsr	div
		moveq	#0,d1
		move.b	timeout(a4),d1
		mulu	#10,d1
		add.l	d1,d0
		bne.s	1$
		move.w	#timenotset,d0
		bra	putnamw
1$		bsr	putfrac
		bra	newline

st1		divs	#10,d2
		move.b	d2,timeout(a4)
		swap	d2
		ext.l	d2
		moveq	#0,d3
		subq.w	#1,d2
		bmi.s	1$
2$		add.l	#100000,d3
		dbra	d2,2$
1$		move.l	d3,timeoutm(a4)
		rts

zerotimer	bsr	nodenam
		moveq	#2,d7
		lea	TRuNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	1$
		bsr	gettimeentry
		lea	usedtime(a4),a0
		clr.l	0(a0,d0)
1$		rts

;cancel a task or a process. The theory is quite simple:
;(Process->ReturnAddr)-4 points to the return address on
;the stack. Task->SPReg points to the next instruction
;to be executed. We just need a
; *(Task->SPReg) = *(Process->ReturnAddr-4).
;If the process has been started from Dos (CLI) and
;the process is doing disk I/O, the CLI will respond with
;a GURU #87000004 (AsyncPKT=unexpected packed received).
;Thats why the calling CLI is also canceled.

cancel		tst.b	fromfile(a4)
		beq.s	cancel1
		rts
cancel1 	clr.l	remembr(a4)		; used for CLI stdio
		clr.l	remembr2(a4)
		clr.b	bool(a4)
		bsr	nodenam
testagain	moveq	#1,d7
		lea	TReNode(pc),a3
		bsr	findnam
		tst.b	d7
		bne.s	canok
cnerr		move.w	#stperr,d0
		bra	putnamw

canok		moveq	#0,d5
canok2		move.l	d0,pointer(a4)		; d0=task
		move.l	d0,a1
		cmp.b	#1,8(a1)		; TASK ?
		bne.s	isproc
		CALL	RemTask,sysbase(a4)
		move.l	pointer(a4),d0
		bsr	closetsports
		move.l	pointer(a4),d0
		bra	closetskwin

isproc		tst.w	d5
		bne.s	isproc2			; second try !
		movem.l	d0-d7/a0-a6,-(sp)
		moveq	#-1,d0			; needed for recursive killing tasks
		CALL	AllocSignal,sysbase(a4)
		move.b	d0,cancelsig(a4)
		moveq	#0,d1
		bset	d0,d1
		move.l	d1,cancelmask(a4)
		movem.l	(sp)+,d0-d7/a0-a6

isproc2		moveq	#0,d5
		tst.l	172(a1)			; pr_CLI
		beq.s	wascreproc
		move.l	$80(a1),a2		; Seglist
		adda.l	a2,a2
		adda.l	a2,a2
		move.l	12(a2),d1		; empty ?
		bne.s	wascreproc
		move.l	172(a1),a2		; CommandLineInterface
		adda.l	a2,a2
		adda.l	a2,a2
		move.l	60(a2),d5		; cli_Module
		tst.l	40(a2)			; IsInteractive
		beq	dosreturn
		move.l	28(a2),remembr(a4)	; yes,get Cli-Window locks
		move.l	56(a2),remembr2(a4)
		bra	dosreturn
wascreproc	tst.b	bool(a4)		; it is not a CLI, ask what to do
		bne.s	unload
		move.b	#3,bool(a4)
		bsr	ResumeOutput
		move.w	#canerr0,d0		; ask for Workbench
		bsr	putstrw
		bsr	readline
		cmp.b	#'y',d0
		beq.s	andagain
		move.b	#2,bool(a4)
		bsr	ResumeOutput
		move.w	#canerr1,d0		; ask for unload
		bsr	putstrw
		bsr	readline
		cmp.b	#'y',d0
		bne.s	andagain
		move.b	#1,bool(a4)
andagain	move.l	pointer(a4),d0
		moveq	#1,d7
		lea	TReNode(pc),a3
		bsr	tstnode
		tst.w	d5
		beq	cnerr
		bra	canok2

unload		move.l	128(a1),d0		; get Segmentlist
		beq.s	ulerr
		lsl.l	#2,d0
		move.l	d0,a3
		moveq	#2,d0
		cmp.l	0(a3),d0
		bgt.s	ulerr
		move.l	12(a3),d4
		bne.s	unl4
ulerr		move.w	#unloaderr,d0		; no Segments !?
		bra	putnamw

unl4		cmp.b	#3,bool(a4)		; Workbench Task
		bne.s	unl2
		move.l	a1,-(sp)
		moveq	#40,d0			; build a copy of the
		move.l	pubclr(a4),d1		; Workbench startup-message
		CALL	AllocMem,sysbase(a4)
		move.l	d0,startmess(a4)
		move.l	d0,a0
		move.l	a0,-(sp)
		move.b	#5,8(a0)
		move.w	#20,18(a0)
		move.l	d4,24(a0)
		moveq	#92,d0
		add.l	4(sp),d0
		move.l	d0,20(a0)
		lea	wbportnam(a4),a1
		RECALL	FindPort
		movem.l	(sp)+,a0/a1
		move.l	d0,14(a0)
		bne.s	unl2
		move.w	#noworkbench,d0
		bra	putnamw

unl2		cmp.b	#1,bool(a4)
		bne.s	dosreturn
		move.l	a1,-(sp)		; unload process manualy
		move.l	d4,d1
		CALL	UnLoadSeg,dosbase(a4)
		move.l	(sp)+,a1

dosreturn	move.l	140(a1),savedat(a4)	; Processnumber
dosret1		move.w	#$4000,$dff09a
		move.l	54(a1),a3
		lea	endtask(pc),a0
		move.l	a0,0(a3)
		tst.b	gotguru(a4)
		bne.s	1$
		tst.b	bool(a4)
		bne.s	1$
		move.b	#2,106(a1)		; ignore messages
1$		cmp.b	#4,15(a1)		; if waiting
		bne.s	doswait
		move.l	a1,d4
		CALL	Remove,sysbase(a4)
		move.l	d4,a1
		lea	406(a6),a0		; activate the task
		RECALL	AddHead
		move.l	d4,a1

doswait		move.w	#$C000,$dff09a

		tst.b	bool(a4)
		bne.s	endnodos
		tst.l	d5
		beq.s	endcanc

		move.l	172(a1),a2
		adda.l	a2,a2
		adda.l	a2,a2
dwa1		movem.l	d0-d7/a0-a6,-(sp)
		move.l	cancelmask(a4),d0
		CALL	Wait,sysbase(a4)
		movem.l	(sp)+,d0-d7/a0-a6
		tst.b	gotguru(a4)
		bne.s	endnodos
		moveq	#0,d5
		bra.s	dosret1

endcanc		move.l	a1,-(sp)
		move.l	dosbase(a4),a6
		move.l	remembr(a4),d1		; close CLI-Window
		beq.s	ecan1			; if any
		RECALL	Close
ecan1		move.l	remembr2(a4),d1
		beq.s	ecan2
		RECALL	Close
ecan2		move.l	(sp)+,a1

		move.l	savedat(a4),d0		; remove Task from
		move.l	dosbase(a4),a2		; TaskArray
		move.l	34(a2),a2
		move.l	0(a2),a2
		adda.l	a2,a2
		adda.l	a2,a2
		lsl.l	#2,d0
		clr.l	0(a2,d0)

endnodos	move.l	a1,d0
		bsr	closetskwin
		move.l	a1,d0
		bsr	closetsports
		moveq	#0,d0
		move.b	cancelsig(a4),d0	; remove our Signal
		CALL	FreeSignal,sysbase(a4)
		rts

;This Code is (hopefully) executed by the Process we want to kill

endtask		lea	dataarea(pc),a4
		move.l	sysbase(a4),a6
		move.l	276(a6),a1
		move.l	176(a1),a1		; Process_ReturnAddr
		lea	-4(a1),sp		; reset Process Stackptr
		tst.b	bool(a4)
		bne.s	et0
		movea.l	mytask(a4),a1
		move.l	cancelmask(a4),d0	; signal Xoper it
		RECALL	Signal			; died
et0		cmp.b	#3,bool(a4)		; Workbench Process ?
		bne.s	et1
		RECALL	Forbid
		move.l	startmess(a4),a1
		RECALL	ReplyMsg		; reply startup message
et1		rts

;Stop a task (just queue it on a special list)

freeze		bsr	nodenam
		moveq	#1,d7
		lea	TReNode(pc),a3
		bsr	findnam
		tst.b	d7
		bne.s	frok
frerr		move.w	#stperr,d0
		bra	putstrw
frok		move.l	d0,a1
		cmp.b	#13,8(a1)
		beq.s	1$
		cmp.b	#1,8(a1)
		bne.s	frerr
1$		move.w	#$4000,$dff09a
		CALL	Remove,sysbase(a4)
		move.w	#$C000,$dff09a
		move.l	d0,a1
		move.l	d0,a5
		lea 	stplist(a4),a0
		RECALL	AddHead
		add.b	#4,15(a5)
		rts

;put the task back on its list

warm		bsr	nodenam
		cmp.b	#'$',0(a5)
		bne.s	1$
		move.l	d7,d2
		move.l	a5,a0
		bsr	readhex
		tst.b	d7
		beq.s	1$
		move.l	stplist(a4),a3
3$		tst.l	0(a3)
		beq.s	2$
		cmp.l	a3,d0
		beq.s	waok
		move.l	0(a3),a3
		bra.s	3$
1$		lea	stplist(a4),a0
		movea.l	a5,a1
		moveq	#0,d7
		bsr	fn4
		tst.b	d7
		bne.s	waok
2$		move.w	#waerr,d0
		bra	putstrw
waok		move.w	#$4000,$dff09a
		move.l	d0,a1
		CALL	Remove,sysbase(a4)
		move.l	d0,a1
		move.l	d0,a5
		move.l	TReNode(pc),a0
		cmp.b	#8,15(a1)
		bne.s	2$
		move.l	TWaNode(pc),a0
2$		adda.l	a6,a0
		RECALL	AddTail
		move.l	d0,a1
		subq.b	#4,15(a5)
		move.w	#$C000,$dff09a
		move.l	18(a5),d0
		and.l	26(a5),d0
		beq.s	1$
		movea.l	a5,a1
		RECALL	Signal
1$		rts

;show the hunks of a process
hunks		bsr	nodenam
		moveq	#2,d7
		lea	TRuNode(pc),a3
		bsr	findnam
		tst.b	d7
		bne.s	hu1
		rts
hu1		move.l	d0,a5
		move.w	#noprocs,d0
		cmp.b	#13,8(a5)
		bne.s	hu4			; not a process
		move.w	#unloaderr,d7
		move.l	128(a5),d0		; pr_SegList
		move.l	172(a5),d1
		beq.s	hu2			; not a CLI
		lsl.l	#2,d1
		move.l	d1,a5
		move.l	60(a5),d1
		bne.s	hu5			; valid seglist
		moveq	#0,d7
hu2		move.l	d0,d1
		beq.s	hu3			; no segments
		lsl.l	#2,d1
		move.l	d1,a5
		moveq	#2,d1			; index >= 2 ?
		cmp.l	0(a5),d1
		bgt.s	hu3			; no segments
		move.l	12(a5),d1
		beq.s	hu3			; no segments
		move.w	#segloaded,d0
		bsr.s	hu4			; CreateProc()
		bra.s	hu6

hu3		move.w	d7,d0
		bne.s	hu4			; no seglist found
		move.w	#cliprocs,d0
		bsr	putnamw
		move.w	#notload,d0		; empty CLI
hu4		bra	putnamw

hu5		move.w	#cliprocs,d0
		bsr	putnamw
		move.w	#procloaded,d0
		bsr	putstrw
		move.l	16(a5),d0		; cli_CommandName
		bsr	putbcpl
		bsr	newline
hu6		lea	hunkheader(a4),a0
		bsr	puthead
		moveq	#0,d5
hu7		move.l	d5,d3
		bsr	bytedec
		addq.l	#1,d5
		move.l	d1,d0
		bsr	hexa
		lsl.l	#2,d1
		move.l	d1,a5
		moveq	#4,d0
		add.l	d1,d0
		bsr	hexa
		move.l	-4(a5),d0
		moveq	#1,d3
		bsr	longdec
		move.l	#'($',d0
		bsr	putlongascii
		move.l	-4(a5),d0
		bsr	hexa
		subq.l	#1,ptr(a4)
		moveq	#')',d0
		bsr	putchar
		bsr	newline
		move.l	0(a5),d1
		bne.s	hu7
		rts

;change the priority of a node

pri		bsr	getnum
		tst.b	d7
		beq	syntax
		move.b	d2,newpri(a4)
		bsr	nodenam2
		moveq	#8,d7
		lea	TRuNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	pi1
		move.l	d0,a1
		cmp.b	#13,8(a1)
		beq.s	tp2
		cmp.b	#1,8(a1)
		beq.s	tp2
		move.b	newpri(a4),9(a1)
		lea	SemNode(pc),a0
		cmp.l	a0,a3
		ble.s	pi2
		move.w	#listerr,d0
		bra	putnamw
pi2		CALL	Forbid,sysbase(a4)
		RECALL	Remove
		move.l	d0,a1
		movea.l	(a3),a0
		adda.l	a6,a0
		RECALL	Enqueue
		RECALL	Permit
pi1		rts

;set the priority of our task

mypri		bsr	getnum
		tst.b	d7
		beq	syntax
		move.l	sysbase(a4),a1
		move.l	276(a1),a1
		move.l	d2,d0
		bra.s	tp3

;modify a task's priority

taskpri		bsr	getnum
		tst.b	d7
		beq	syntax
		move.b	d2,newpri(a4)
		bsr	nodenam
		moveq	#2,d7
		lea	TRuNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	tp1
		move.l	d0,a1
tp2		move.b	newpri(a4),d0
tp3		CALL	SetTaskPri,sysbase(a4)
tp1		rts

;set all break signals of a task

break		move.l	#$f000,d0
		bra.s	setthem

signal		bsr	readhex
		tst.b	d7
		beq	syntax
setthem 	move.l	d0,savedat(a4)
		bsr	nodenam
		moveq	#2,d7
		lea	TReNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	1$
		move.l	d0,a1
		move.l	savedat(a4),d0
		and.l	18(a1),d0
		CALL	Signal,sysbase(a4)
1$		rts

;set up a list of tasknames which should't be displayed

hide		cmp.b	#10,0(a0)
		bne.s	hid5
		bra	syntax
hid5		lea	hidestart(a4),a2
		move.l	a2,d3
hid0		tst.l	0(a2)
		beq.s	hid1
		move.l	0(a2),a2
		lea	4(a2),a1
		bsr	strcmp
		beq.s	hid2
		move.l	a2,d3
		bra.s	hid0
hid1		move.l	a0,a3
		moveq	#10,d0
		bsr	strlen2
		addq.l	#5,d0
		moveq	#1,d1
		swap	d1
		CALL	AllocMem,sysbase(a4)
		move.l	d0,a1
		move.l	a1,d0
		beq.s 	hid4
		move.l	d0,0(a2)
		addq.l	#4,a1
hid3		cmp.b	#10,0(a3)
		beq.s	hid4
		move.b	(a3)+,(a1)+
		bra.s	hid3
hid4		rts
hid2		move.l	d3,a3
		move.l	0(a2),0(a3)
freehidden	lea	4(a2),a0
		bsr	strlen
		addq.l	#5,d0
		move.l	a2,a1
		move.l	sysbase(a4),a6
		jmp	_LVOFreeMem(a6)

freehidmem	move.l	hidestart(a4),d0
		beq.s	1$
2$		move.l	d0,a2
		move.l	0(a2),a3
		bsr.s	freehidden
		move.l	a3,d0
		bne.s	2$
1$		rts

hideit		tst.b	hideon(a4)
		beq.s	pt76
		lea	hidestart(a4),a3
		move.l	4(a5),a0
pt74		tst.l	0(a3)
		beq.s	pt76
		move.l	0(a3),a3
		lea	4(a3),a1
		bsr	strcmp
		bne.s	pt74
		rts
pt76	 	moveq	#1,d0
		rts

;set up an ALIAS list

alias		cmp.b	#10,0(a0)
		beq	showalias
		bsr	strbuf
		lea	buffer(a4),a3
		move.l	a0,a5
		move.l	a3,a0
		bsr	strlen
		tst.l	d0
		beq	syntax

		cmp.w	#1,d0
		bne.s	5$
		lea	params(a4),a0
		moveq	#parmnum-1,d1
		move.b	0(a3),d2
6$		cmp.b	(a0)+,d2
		dbeq	d1,6$
		bne.s	5$
		move.w 	#aliaserr,d0
		bsr	putstrw
		move.w	#params,d0
		bsr	putstrw
		move.w	#aliaserr2,d0
		bra	putnamw

5$		move.l	d0,d5
		bsr	findalias
		tst.l	d2
		bmi.s	7$			; no alias
		lea	aliaslist(a4),a0
		cmp.l	(a0),a2
10$		beq.s	9$
		move.l	(a0),a0
		bra.s	10$
9$		move.l	(a2),(a0)
		lea	5(a2),a0
8$		tst.b	(a0)+
		bne.s	8$
		move.l	a0,d0
		move.l	a2,a1
		sub.l	a1,d0
		CALL	FreeMem,sysbase(a4)
		cmp.b	#10,0(a5,d5.l)
		beq.s	1$			; was 'unalias'

7$		lea	0(a5,d5.l),a0
		bsr	kllblnks
		bsr	findcmd
		tst.l	d2
		bmi	syntax
		move.l	a5,a0
		bsr	strbuf

		addq.l	#6,d5
		move.l	d5,d0
		moveq	#1,d1
		swap	d1
		CALL	AllocMem,sysbase(a4)
		tst.l	d0
		beq.s	1$

		lea	aliaslist(a4),a0
2$		move.l	(a0),d1
		beq.s	3$
		move.l	d1,a0
		bra.s	2$
3$		move.l	d0,0(a0)

		move.l	d0,a0
		move.b	d2,4(a0)

		addq.w	#5,a0
4$		move.b	(a3)+,(a0)+
		bne.s	4$
1$		rts

showalias	lea	alhead(a4),a0
		bsr	puthead
		move.l	aliaslist(a4),d0
		beq.s	1$
2$		move.l	d0,a5
		addq.l	#5,d0
		bsr	putstr
		move.w	#15,d1
		bsr	tab
		move.w	#equal,d0
		bsr	putstrw
		move.b	4(a5),d0
		ext.w	d0
		bsr.s	getcmdptr
		bsr	putnam
		move.l	0(a5),d0
		bne.s	2$
1$		rts

freealias	move.l	aliaslist(a4),d0
		beq.s	1$
2$		move.l	d0,a2
		move.l	0(a2),a3
		lea	5(a2),a0
		bsr	strlen
		addq.l	#6,d0
		move.l	a2,a1
		CALL	FreeMem,sysbase(a4)
		move.l	a3,d0
		bne.s	2$
1$		rts

getcmdptr	move.l	a0,-(sp)
		lea	commds(a4),a0
2$		subq.w	#1,d0
		bcs.s	1$
3$		tst.b	(a0)+
		bne.s	3$
		bra.s	2$
1$		move.l	a0,d0
		move.l	(sp)+,a0
		rts

;add a fkey definition to the fkey list. Each entry
;looks like this: long Succ, long Pred, byte Key#, byte length,
;		  char text[]

showfkeys	lea	fkhead(a4),a0
		bsr	puthead
		lea	fkeys(a4),a1
1$		move.l	0(a1),a1
		tst.l	0(a1)
		beq.s	2$
		moveq	#'F',d0
		bsr	putchar
		moveq	#1,d3
		add.b	8(a1),d3
		bsr	bytedec
		move.b	9(a1),d1
		subq.b	#1,d1
		lea	10(a1),a2
3$		move.b	(a2)+,d0
		bsr	putchar
		subq.b	#1,d1
		bcc.s	3$			; dbra for bytes ...
		bsr	newline
		bra.s	1$
2$		rts

setfkey		bsr	nodenam
		move.w	procnum(a4),d5
		beq.s	showfkeys
		cmp.w	#21,d5
		bcc	syntax
		subq.w	#1,d5
		move.w	d5,procnum(a4)
		move.l	sysbase(a4),a6
		lea	fkeys(a4),a1
1$		move.l	0(a1),a1
		tst.l	0(a1)
		beq.s	2$
		cmp.b	8(a1),d5
		bne.s	1$
		move.l	a1,d3
		RECALL	Remove
		move.l	d3,a1
		bsr.s	removefkey
2$		tst.b	0(a5)
		beq.s	4$
		move.l	a5,a0
		bsr	strlen
		move.l	d0,d5
		add.w	#10,d0
		moveq	#0,d1
		RECALL	AllocMem
		move.l	d0,a1
		move.l	a1,d0
		beq.s	4$
		move.l	d0,a3
		move.b	procnum+1(a4),8(a1)
		move.b	d5,9(a1)
		lea	fkeys(a4),a0
		RECALL	AddHead
		lea	10(a3),a3
		subq.w	#1,d5
3$		move.b	(a5)+,(a3)+
		dbeq	d5,3$
4$		rts

clrfkeys	move.l	sysbase(a4),a6
2$		lea	fkeys(a4),a0
		RECALL	RemHead
		move.l	d0,a1
		move.l	a1,d0
		beq.s	1$
		bsr.s	removefkey
		bra.s	2$
1$		rts

removefkey	move.b	9(a1),d0		; length
		ext.w	d0
		ext.l	d0
		add.w	#10,d0
		jmp	_LVOFreeMem(a6)

;'flushlibs'

flush		moveq	#-1,d0
		moveq	#0,d1
		move.l	sysbase(a4),a6
		jmp	_LVOAllocMem(a6)

;display library->lib_IDString

info		bsr	nodenam2
		moveq	#2,d7
		lea	DevNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	removefkey-2		; hack !
		move.l	d0,a0
		move.l	24(a0),d0
		beq.s	if2
		move.l	d0,a0
		tst.b	(a0)
		bne.s	if1
if2		move.w	#noinfo,d0
		bsr	putstrw
		move.l	a5,d0
if1		bra	putnam

; reset vectors

capture		move.l	sysbase(a4),a1
		lea 	42(a1),a0
		moveq	#2,d6
		lea	coldtxt(a4),a3
cap0		move.l	a3,d0
		bsr	putstr
		move.l	(a0)+,d0
		bne.s	cap1
		move.w	#unset,d0
		bsr	putstrw
		bra.s	cap2
cap1		bsr	hexa
cap2		bsr	newline
		lea 	15(a3),a3
		dbra	d6,cap0
		move.w	#kicktxt,d0
		bsr	putstrw
		move.l	546(a1),d0
		bne.s	kickm3
		move.w	#unset,d0
		bra	putnamw
kickm3		move.l	d0,-(sp)
		bsr	newline
		lea	kickhead(a4),a0
		bsr	puthead
		move.l	(sp)+,a0
kickm0		move.l	a0,d0
		beq.s	kickm4
		bpl.s	kickm1
		bclr	#31,d0
		move.l	d0,a0
		bra.s	kickm0
kickm1		move.w	14(a0),d6
		subq.w	#1,d6
		lea	16(a0),a2
kickm2		move.l	0(a2),d0
		bsr	hexa
		move.l	(a2)+,d0
		move.l	(a2)+,d4
		add.l	d4,d0
		bsr	hexa
		move.l	d4,d0
		moveq	#0,d3
		bsr	longdec
		bsr	newline
		dbra	d6,kickm2
		move.l	0(a0),a0
		bra.s	kickm0
kickm4		rts

clrcold		moveq	#42,d0
		bra.s	chksum
clrcool		moveq	#46,d0
		bra.s	chksum
clrwarm		moveq	#50,d0

chksum		move.l	sysbase(a4),a0
		clr.l	0(a0,d0.w)
		lea	34(a0),a1
		moveq	#22,d0
addchk		add.w	(a1)+,d1
		dbra 	d0,addchk
		not.w	d1
		move.w	d1,82(a0)
		rts

;Save the command line to be repeated. If this line doesn't produce
;any output, don't repeat it at all
repeatcmd	not.b	repeat(a4)
		beq.s	3$
		move.w	repeatlen(a4),d0
		subq.w	#7,d0
		beq.s	4$
		move.w	d0,repeatlen(a4)
		lea	repeatbuffer(a4),a1
		lea	dummy(a4),a2
		move.w	d0,d1
1$		move.b	0(a0),(a1)+
		move.b	(a0)+,(a2)+
2$		dbra	d1,1$
		clr.l	lastprinted(a4)
		clr.b	printed(a4)
		bsr	cli
		tst.b	printed(a4)
		beq.s	4$
		bsr	starttimer
3$		rts
4$		clr.b	repeat(a4)
		bra.s	3$

;save the parameters from a 'window x y width height' call
setwindow	tst.b	fromfile(a4)
		bne.s	wiw1
wiw3		move.w	#wiwerr,d0
		bra	putnamw
wiw1		lea	window_l(a4),a3
		moveq	#3,d5
wiw0		bsr	getnum
		tst.w	d7
		beq.s	wiw2
		move.w	d2,(a3)+
		dbra	d5,wiw0
wiw2		rts

iconpos		bsr	getnum			; set icon position
		tst.w	d7
		beq.s	1$
		move.w	d2,-(sp)
		bsr	getnum
		swap	d2
		move.w	(sp)+,d2
		swap	d2			; X.w,Y.w
		tst.w	d7
		beq.s	1$
		move.l	d2,icnwindow(a4)	; store new pos
1$		rts

iconbackdrp	eor.w	#$100,icnwindow+16(a4)	; wn_Flags+2
		rts

;toggle patchmode (ignore cmd if a setfunction manager is installed)
smartpatch	lea	setmannam(a4),a1	; public manager port
		CALL	FindPort,sysbase(a4)
		tst.l	d0
		bne.s	smartpatch-2		; hack !
		lea	patchmode(a4),a2
		bra.s	onoff

;toggle commodity on/off
cxhandler	lea	cxstate(a4),a2
		bsr.s	onoff
		tst.b	fromfile(a4)
		bne.s	1$			; script !
		bsr	setwintitle
1$		rts

;toggle TaskInfo
taskinfo	lea	tinfo(a4),a2
		bra.s	onoff

;toggle CLI-Commands
clicmd		lea	cmdcli(a4),a2
		bra.s	onoff

;toggle task-header display
nohead		lea	headon(a4),a2
		bra.s	onoff

;toggle hide entries
hidden		lea	hideon(a4),a2
		bra.s	onoff

;toggle sort on/off
sort		lea	sorton(a4),a2
		bra.s	onoff

;toggle task-ports display
taskports	lea	tports(a4),a2
		bra.s	onoff

;toggle CPUSE task list
usage		lea	useageon(a4),a2

;test if 'on'(-1) or 'off'(0) was entered

onoff		bsr	kllblnks
		moveq	#0,d2
		lea	offstr(a4),a1
		bsr	strcmp
		beq.s	1$
		subq.b	#1,d2
		lea	onstr(a4),a1
		bsr	strcmp
		beq.s	1$
		eor.b	d2,0(a2)
		move.b	0(a2),d2
1$		move.b	d2,0(a2)
		rts

;toggle prop gadget on/off
propgad		moveq	#0,d7
		lea	propgadon(a4),a2
		lea	sbgadget(a4),a3
		bra.s	gadonoff

;toggle iconify gadget on/off
icongad		moveq	#1,d7
		lea	iconifyon(a4),a2
		lea	iconifgad(a4),a3

gadonoff	move.b	(a2),-(sp)		; save old state
		bsr.s	onoff
		move.b	(sp)+,d0
		tst.w	d7
		beq.s	3$			; not iconify gadget
		tst.b	ownscreen(a4)
		bne.s	1$			; only window valid
		tst.b	post_V34(a4)
		bne.s	1$			; only pre Kick2.0+
3$		tst.b	fromfile(a4)
		bne.s	1$			; from file
		cmp.b	(a2),d0
		beq.s	1$			; oldstate == newstate !
		move.l	intuibase(a4),a6
		move.w	#_LVORemoveGadget,d1
		tst.b	(a2)
		beq.s	2$
		move.w	#_LVOAddGadget,d1
2$		moveq	#0,d0			; top of list !
		move.l	wnptr(a4),a0
		move.l	a3,a1
		jsr	0(a6,d1.w)		; RemoveGadget or AddGadget
		bsr	setupscreen
1$		rts

;Open a library
openlib		bsr	nodenam2
		move.l	a5,a1
		moveq	#0,d0
		CALL	OpenLibrary,sysbase(a4)
		tst.l	d0
		beq	fn5
opli1		rts

;close it
closelib	bsr	nodenam2
		moveq	#0,d7
		lea	LibNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	clli1
		move.l	d0,a1
		CALL	CloseLibrary,sysbase(a4)
clli1		rts

remnode		bsr	nodenam2
		moveq	#7,d7
		lea	TReNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	1$
		move.l	d0,-(sp)
		CALL	Disable,sysbase(a4)
		move.l	(sp)+,a1
		RECALL	Remove
		RECALL	Enable
1$		rts

remport		bsr	nodenam2
		moveq	#0,d7
		lea	PorNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	1$
		move.l	d0,a1
		move.l	16(a1),d0
		cmp.l	mytask(a4),d0		; own port ?
		beq.s	1$
		move.b	#2,14(a1)
		CALL	RemPort,sysbase(a4)
1$		rts

closetsports	movem.l	d1-d6/a0-a6,-(sp)
		move.l	d0,d6
		move.l	sysbase(a4),a3
		lea	392(a3),a3
1$		move.l	0(a3),a3
		tst.l	0(a3)
		beq.s	2$
		cmp.l	16(a3),d6
		bne.s	1$
		move.b	#2,14(a3)
		move.l	a3,a1
		CALL	RemPort,sysbase(a4)
		bra.s	1$
2$		movem.l	(sp)+,d1-d6/a0-a6
		rts

remintserver	move.l	a0,-(sp)
		bsr	readhex
		move.l	(sp)+,a0
		tst.b	d7
		beq	syntax
		move.l	d0,d4
		moveq	#1,d6
		move.l	a0,-(sp)
		bsr	findint
		move.l	(sp)+,a5
		tst.w	d5
		bpl.s	1$
		bra	fn5
1$		tst.b	0(a3,d1.w)
		bne.s	2$
		move.w	#nintrserv,d0
		bra	putnamw
2$		lea	iocounter(a4),a1
		cmp.l	a1,d4
		beq.s	3$			; own server !
		move.l	d4,a1
		move.l	d1,d0
		CALL	RemIntServer,sysbase(a4)
3$		rts

;Remove a resident module from the list. Clears the rt_Matchword
;to avoid being found and reinserted during the next reset

remresident	bsr	nodenam2
		cmp.b	#'$',0(a5)
		bne.s	1$
		move.l	a5,a0
		bsr	readhex
		move.l	sysbase(a4),a6
		tst.b	d7
		bne.s	2$
1$		move.l	a5,a1
		RECALL	FindResident
		tst.l	d0
		beq	fn5

2$		move.l	300(a6),a3		; SysBase->ResModules
8$		move.l	(a3)+,d1
		beq	fn5
		bpl.s	3$
		bclr	#31,d1
		movea.l	d1,a3
		bra.s	8$

3$		cmp.l	d1,d0
		bne.s	8$

4$		move.l	a3,a5
5$		tst.l	(a5)+
		bgt.s	5$

6$		move.l	d0,a1
		clr.w	0(a1)			; rt_MatchTag
		clr.b	10(a1)			; rt_Flags
		clr.l	22(a1)			; rt_Init
		move.l	a5,d0
		sub.l	a3,d0
		lsr.w	#2,d0
		subq.w	#1,d0
		lea	-4(a3),a1
7$		move.l	(a3)+,(a1)+
		dbra	d0,7$
		rts

;end Xoper but stay in background
quithold	lea	dummy(a4),a0
		lea	in(a4),a1
qh1		move.b	(a0),(a1)+
		cmp.b	#10,(a0)+
		bne.s	qh1

instback	st	wanthold(a4)
		tst.b	fromfile(a4)
		bne.s	quithold-2		; defer hold
		moveq	#0,d0
		bsr	CloseGUI		; close screen & window
		beq.s	quithold-2		; hack ! (pubscreen used)
		tst.b	wantwindow(a4)
		beq.s	6$
		clr.b	wantwindow(a4)
		clr.b	ownscreen(a4)

6$		bsr	killpage
		bsr	freeblank

		tst.b	iconifyon(a4)
		beq.s	3$

; appicon (d7=2) or a window (d7=0) !

		moveq	#2,d7
		move.l	wbbase(a4),d0		; try appicon
		beq.s	5$
		move.l	a4,-(sp)
		move.l	d0,a6			; library base
		moveq	#0,d0			; id
		moveq	#0,d1			; userdata
		lea	noname(a4),a0		; name
		move.l	replyport(a4),a1	; port
		suba.l	a2,a2			; lock
		lea	appobj(a4),a3		; diskobj
		suba.l	a4,a4			; tagitems
		RECALL	AddAppIcon
		move.l	(sp)+,a4
		tst.l	d0
		bne.s	4$
5$		moveq	#0,d7
		lea	icnwindow(a4),a0	; try icon window
		CALL	OpenWindow,intuibase(a4)
4$		move.l	d0,wnptr(a4)
		move.b	d7,appicn(a4)
3$		bsr.s	handleiconify		; do iconify
		move.l	wnptr(a4),d0
		beq.s	1$
		move.l	d0,a0
		moveq	#_LVORemoveAppIcon,d0
		tst.w	d7
		bne.s	2$
		moveq	#_LVOCloseWindow,d0
2$		jsr	0(a6,d0.w)		; remove iconify stuff
		clr.l	wnptr(a4)
		clr.b	appicn(a4)

1$		clr.b	wanthold(a4)
		move.b	wantexit(a4),waitexit(a4)
		bne	exitall
		move.l	savesp(a4),sp
		bra	restart

; wait for wakeup

handleiconify	move.l	a6,-(sp)
		move.l	sysbase(a4),a6		; setup a6 to ExecBase

		move.l	mysignal(a4),d6		; build signal mask
		or.l	trapmask(a4),d6
		move.w	cxsig(a4),d0
		beq.s	3$			; no commodity
		bset	d0,d6
3$		move.l	replyport(a4),a2
		tst.w	d7
		bne.s	2$			; appicon
		move.l	wnptr(a4),d2
		beq.s	1$
		move.l	d2,a2
		move.l	86(a2),a2		; wn->UserPort
2$		move.b	15(a2),d0		; Port->SigBit
		bset	d0,d6
1$		or.w	#$1000,d6		; crtl-c

waitforcall	move.l	d6,d0			; complete wait-mask
		RECALL	Wait
		btst	#mysigbit,d0
		bne.s	icondone		; hotkey !!
		btst	#12,d0
		sne	wantexit(a4)
		bne.s	icondone		; ctrl-c
		move.l	trapmask(a4),d1
		and.l	d0,d1
		sne	gotguru(a4)
		bne.s	icondone		; guru !!
		bsr	ChkBroker		; check broker port

fromport	move.l	a2,a0			; wn->UserPort
		RECALL	GetMsg
		move.l	d0,a1
		move.l	a1,d0
		beq.s	waitforcall
		move.l	30(a1),-(sp)
		RECALL	ReplyMsg
		tst.w	d7			; app icon ?
		bne.s	1$
		move.l	a6,(sp)			; only flag
		bsr.s	chkpos
		bne.s	1$
		lea	osecs(a4),a3
		lea	8(a3),a0		; nsecs
		lea	12(a3),a1		; nmics
		move.l	a6,-(sp)
		CALL	CurrentTime,intuibase(a4)
		movem.l	0(a3),d0-d3
		RECALL	DoubleClick
		move.l	(sp)+,a6
		move.l	8(a3),(a3)+		; nsecs->osecs
		move.l	8(a3),(a3)+		; nmics->omics
		tst.l	d0
		beq.s	1$
		clr.l	(sp)			; clear value
1$		move.l	(sp)+,d0
		bne.s	fromport

icondone	move.l	(sp)+,a6
		tst.w	d7			; appicon or window ?
		bne.s	chkpos2

chkpos		move.l	wnptr(a4),d0		; window moved ?
		beq.s	chkpos2
		move.l	d0,a0
		move.l	4(a0),d0		; new pos
		move.l	icnwindow(a4),d1	; old pos
		move.l	d0,icnwindow(a4)
		sub.l	d1,d0			; zero == nothing changed !
chkpos2		rts

;fill all unused memory-chunks with a longword
clear		moveq	#0,d0
		cmp.b	#10,0(a0)
		beq.s	clr5
		bsr	readhex
		tst.b	d7
		beq	syntax
clr5		move.l	sysbase(a4),a0
		clr.l	parmtxt(a4)
		lea 	322(a0),a0
		move.w	#$4000,$dff09a
clr1		move.l	0(a0),a0
		tst.l	0(a0)
		beq.s	clr6
		move.l	16(a0),a1
clr2		tst.l	0(a1)
		beq.s	clr1
		addq.l	#1,parmtxt(a4)
		move.l	4(a1),d1
		subq.l	#8,d1
		ble.s	clr31
		lsr.l	#2,d1
		subq.l	#1,d1
		bmi.s	clr31
		lea 	8(a1),a2
clr3		move.l	d0,(a2)+
		dbra	d1,clr3
clr31		move.l	0(a1),a1
		bra.s	clr2
clr6		move.w	#$C000,$dff09a
		move.l	parmtxt(a4),d0
		moveq	#0,d3
		bsr	longdec
		move.w	#clrtxt,d0
		bra	putnamw

;change the number of maximum lines in the history buffer
historylines	bsr	getnum
		tst.b	d7
		beq	syntax
		move.w	d2,maxhlines(a4)
		move.w	hnum(a4),d0
1$		cmp.w	maxhlines(a4),d0
		ble.s	2$
		bsr	remhistline
		subq.w	#1,d0
		bra.s	1$
2$		move.l	history+8(a4),curhist(a4)
		move.w	d0,hnum(a4)
		rts

;set the minimum number of characters a input line
;must have to be added to the history buffer
historylength	bsr	getnum
		tst.b	d7
		beq	syntax
		tst.b	d2
		bne.s	1$
		addq.w	#1,d2
1$		move.w	d2,minnumchars(a4)
		rts

;display all lines in the history buffer
showhistory	lea	inputbuffer(a4),a3
		moveq	#1,d5
		move.l	history(a4),a5
1$		tst.l	0(a5)
		beq.s	2$
		move.l	d5,d3
		bsr	bytedec
		moveq	#0,d0
		move.w	8(a5),d0
		clr.b	0(a3,d0.w)
		lea	10(a5),a0
		move.l	a3,a1
		CALL	CopyMem,sysbase(a4)
		move.l	a3,d0
		bsr	putnam
		move.l	0(a5),a5
		addq.l	#1,d5
		bra.s	1$
2$		rts

;set the maximum lines the output buffer may hold
outputlines	bsr	getnum
		tst.b	d7
		beq	syntax
		moveq	#100,d3
		tst.l	d2
		bmi.s	2$
		cmp.l	d3,d2
		bge.s	1$
2$		move.l	d3,d2
1$		move.l	d2,maxlines(a4)
		rts

;find a named node
;d7 = number of lists to search through
;a3 = pointer to the first entry in the
;     list-offset-table
;a5 = pointer to name
;returns:
;d7 = TRUE(1) / FALSE (0)
;d0 = node
findnam		tst.b	0(a5)
		bne.s	1$
		move.w	#nameerr,d0
		bsr	putnamw
		bra	fnerr
1$		cmp.b	#'$',0(a5)
		bne.s	fn2
		move.l	d7,d2
		move.l	a5,a0
		bsr	readhex
		tst.b	d7
		beq.s	fn6
		move.l	d2,d7
		bsr.s	tstnode
		tst.w	d5
		bne.s	fn3
		bra	fn5
fn6		move.l	d2,d7
fn2		move.l	sysbase(a4),a0
		adda.l	0(a3),a0
		move.l	a5,a1
fn4		CALL	FindName,sysbase(a4)
		move.l	d0,a0
		move.l	a0,d0
		bne.s	fn1
fn41		addq.w	#4,a3
		dbra	d7,fn2
fn5		move.w	#namerr,d0
		bsr	putstrw
		move.l	a5,d0
		bsr	putnam
fnerr		moveq	#0,d7
		rts
fn1		move.w	procnum(a4),d2
		beq.s	fn3
		cmp.b	143(a0),d2
		bne.s	fn41
fn3		moveq	#1,d7
		rts

;list-offset-table
TRuNode		dc.l	276
TReNode		dc.l	406
TWaNode		dc.l	420
DevNode		dc.l	350
LibNode		dc.l	378
ResNode		dc.l	336
MemNode		dc.l	322
PorNode		dc.l	392
SemNode		dc.l	532

;Node has been entered in hex. Check if this node exsists
tstnode		tst.b	fromfile(a4)
		bne.s	illegalhex
		move.l	d0,d1
		btst	#0,d1
		beq.s	inrange
		move.w	#adrerr,d0
		bsr	putnamw
illegalhex	moveq	#0,d5
		rts
inrange		movem.l	d7/a3,-(sp)
		moveq	#1,d5
		lea	TRuNode(pc),a0
		cmp.l	a0,a3
		bne.s	1$
		move.l	sysbase(a4),a0
		cmp.l	276(a0),d0
		beq.s	nodefound
		subq.w	#1,d7
		addq.w	#4,a3
1$		move.w	#$4000,$dff09a
getlist		move.l	sysbase(a4),a0
		add.l	0(a3),a0
nxtnode		tst.l	0(a0)
		beq.s	nxtlist
		cmp.l	a0,d0
		beq.s	nodefound
		move.l	0(a0),a0
		bra.s	nxtnode
nxtlist		addq.w	#4,a3
		dbra	d7,getlist
		moveq	#0,d5
nodefound	move.w	#$C000,$dff09a
		movem.l	(sp)+,d7/a3
		rts

;allocate FileInfoBlock
allocfinfo	addq.b	#1,finfopen(a4)
		bne.s	1$
		moveq	#(264>>3),d0
		lsl.w	#3,d0
		moveq	#0,d1
		CALL	AllocMem,sysbase(a4)
		move.l	d0,finfoptr(a4)
1$		rts

;free FileInfoBlock
freefinfo	subq.b	#1,finfopen(a4)
		bpl.s	1$
		move.l	finfoptr(a4),d0
		beq.s	1$
		move.l	d0,a1
		moveq	#(264>>3),d0
		lsl.w	#3,d0
		CALL	FreeMem,sysbase(a4)
		clr.l	finfoptr(a4)
1$		rts

;Examine ,d0=Lock
getfinfo	move.l	d0,d1
		move.l	finfoptr(a4),d2
		CALL	Examine,dosbase(a4)
		rts

;construct a Pathname from a lock
;d0=Lock ,resulting string is written to window
getpath		movem.l	d1-d7/a0-a6,-(sp)
		move.l	d0,d1
		beq.s	1$
		CALL	DupLock,dosbase(a4)
1$		lea	out(a4),a3
		clr.b	-(a3)
gp0		move.l	d0,d5
		bsr.s	getfinfo
		move.l	finfoptr(a4),a0
		move.l	4(a0),d4
		addq.l	#8,a0
		bsr	strlen
		lea	-1(a3),a5
		tst.l	d4
		bmi.s	nodir
		move.b	#'/',-(a3)
nodir		subq.w	#1,d0
		bmi.s	nofnam
gp1		move.b	0(a0,d0.w),-(a3)
		dbra	d0,gp1
nofnam		move.l	d5,d1
		CALL	ParentDir,dosbase(a4)
		move.l	d0,d4
		move.l	d5,d1
		beq.s	2$
		CALL	UnLock,dosbase(a4)
2$		move.l	d4,d0
		bne.s	gp0
		cmp.b	#'/',0(a5)
		bne.s	gp2
		move.b	#':',0(a5)
gp2		move.l	a3,d0
		bsr	putnam
		movem.l	(sp)+,d1-d7/a0-a6
		rts

dchange		lea	dchead(a4),a0
		bsr	puthead
		tst.b	post_V34(a4)
		bne.s	dchange-2		; hack!
		move.l	sysbase(a4),a6
		lea	350(a6),a0
		lea	tdname(a4),a1
		RECALL	FindName
		move.l	d0,a2
		move.l	a2,d0
		beq	14$
		lea	36(a2),a2
		moveq	#0,d5
2$		move.l	(a2)+,d2
		beq	3$
		RECALL	Disable
		move.l	d2,a0
		lea	$18e(a0),a0
5$		tst.l	0(a0)
		beq.s	6$
		move.l	0(a0),a0
		bra.s	5$
6$		lea	-4(a0),a5
		lea	buffer+100(a4),a3
9$		move.l	0(a5),a5
		tst.l	0(a5)
		beq.s	11$
		move.l	a5,(a3)+
		bne.s	9$
11$		clr.l	(a3)+
		RECALL	Enable
		lea	buffer+100(a4),a3
7$		move.l	(a3)+,d0
		beq.s	3$
		move.l	d0,a5
		cmp.w	#20,28(a5)
		bne.s	7$
		move.l	40(a5),a3
		move.l	a3,d0
		move.l	d0,node(a4)
		bsr	hexan
		move.l	a3,d0
		beq.s	10$
		move.l	14(a3),d0
		bsr	hexan
		move.l	18(a3),d0
		bsr	hexan
10$		move.l	d5,d3
		or.b	#48,d3
		move.b	d3,tddrives+2(a4)
		move.w	#tddrives,d0
		bsr	putstrw
		move.l	14(a5),d0
		beq.s	8$
		move.l	d0,a0
		move.l	16(a0),d0
8$		bsr	getaskname2
		bsr	newline
		bra.s	7$
3$		addq.w	#1,d5
		cmp.w	#4,d5
		bcs	2$
14$		rts

snoop		lea	snoophead(a4),a2
		moveq	#0,d2
		bsr	InitSnoop
		beq.s	snoop-2

		tst.b	msnoop(a4)
		bne.s	1$			; already patched !
		RECALL	Forbid
		lea	capmalloc(pc),a0
		move.l	a0,d0
		move.w	#_LVOAllocMem,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	d0,OldAllocMem(a4)
		lea	capmfree(pc),a0
		move.l	a0,d0
		move.w	#_LVOFreeMem,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	d0,OldFreeMem(a4)
		st	msnoop(a4)
		RECALL	Permit

1$		st	snoopon(a4)		; enable snooping
		clr.b	bool(a4)
		clr.b	capgone(a4)
		clr.b	capwaiting(a4)
		clr.l	capiscli(a4)

		move.l	captask(a4),a1
		cmp.b	#13,8(a1)		; ln_Type
		bne.s	waitmem
		tst.l	140(a1)
		beq.s	waitmem
		move.l	172(a1),d0		; pr_CLI
		beq.s	waitmem
		lsl.l	#2,d0
		move.l	d0,a0
		lea 	60(a0),a0
		move.l	a0,capiscli(a4)
		move.l	0(a0),d0
		move.l	d0,capseg(a4)
		bne.s	waitmem
		move.w	#capwait,d0
		bsr	putnamw
		st	capwaiting(a4)

waitmem		bsr	processmsgs

tm7		move.l	snoopport(a4),a0
		CALL	GetMsg,sysbase(a4)
		move.l	d0,a3
		move.l	a3,d0
		bne.s	tm8
		tst.b	cbreak(a4)
		bne	snoopend
		tst.b	capgone(a4)
		bne	snoopend
		bra.s	waitmem

tm8		tst.b	capwaiting(a4)
		beq.s	tm15
		move.l	capiscli(a4),d7
		beq.s	tm15
		move.l	d7,a0
		move.l	0(a0),capseg(a4)
		beq	tm12
		clr.b	capwaiting(a4)

tm15		move.l	20(a3),d3
		tst.b	36(a3)			; free or alloc ?

		beq	freed
		move.w	#allok,d0
		bsr	putstrw
		lea	memname(pc),a2
		moveq	#9,d5
tm2		move.w	(a2)+,d1
		btst	d1,d3
		beq.s	tm1
		move.w	(a2),d0
		bsr	putstrw
tm1		addq.w	#2,a2
		dbra	d5,tm2
		moveq	#41,d1
		bsr	tab			; d0 - actual pos
		bsr	putblank
		move.l	24(a3),d0
		move.l	d0,d3
		bsr	hexa
		move.l	28(a3),d0
		bne.s	tm3
		move.w	#failed,d0
		bsr	putstrw
		moveq	#53,d1
		bsr	tab
		bra.s	tm4
tm3		bsr	hexa
		move.l	28(a3),d0
		add.l	d3,d0
		bsr	hexa
		bra.s	tm4

freed		move.w	#free,d0
		bsr	putstrw
		move.b	#'-',d0
		moveq	#34,d1
tm9		bsr	putchar
		dbra	d1,tm9
		bsr	putblank
		move.l	d3,d0
		bsr	hexa
		move.l	24(a3),d0
		bsr	hexa
		move.l	24(a3),d0
		add.l	d3,d0
		bsr	hexa

tm4		move.l	32(a3),d0
		bsr	hexa
		bsr	newline
tm12		bsr	freemsg
		move.l	captask(a4),a1
tm13		tst.b	capwaiting(a4)
		bne.s	tm10
		move.l	capiscli(a4),d0
		beq.s	1$
		move.l	d0,a0
		move.l	0(a0),d0
		cmp.l	capseg(a4),d0
		bne.s	tm11
1$		move.b	15(a1),d0
		cmp.b	#5,d0
		bge.s	tm11
		cmp.b	#2,d0
		bge.s	tm10
tm11		st	capgone(a4)
tm10		bra	tm7

snoopend	clr.b	snoopon(a4)		; snooping off
		tst.b	msnoop(a4)
		beq.s	1$			; nothing patched !
		CALL	Forbid,sysbase(a4)
		tst.b	patchmode(a4)
		beq.s	3$			; don't check vectors
		lea	capmalloc(pc),a0
		cmp.l	_LVOAllocMem+2(a6),a0
		bne.s	2$			; another patch !
		lea	capmfree(pc),a0
		cmp.l	_LVOFreeMem+2(a6),a0
		bne.s	2$			; another patch !
3$		move.l	OldFreeMem(a4),d0
		move.w	#_LVOFreeMem,a0
		move.l	a6,a1
		RECALL	SetFunction
		move.l	OldAllocMem(a4),d0
		move.w	#_LVOAllocMem,a0
		move.l	a6,a1
		RECALL	SetFunction
		clr.b	msnoop(a4)
2$		RECALL	Permit
1$		bra	ClrSnoop

memname		dc.w	31,memnoexp,18,memrev,17,memlarg,16,memclr,10,memkick
		dc.w	9,memdma,8,memloc,2,memfast,1,memchip,0,mempubl

capmalloc	movem.l	d0-d7/a0-a6,-(sp)	; a6 - SysBase !
		lea	dataarea(pc),a4
		tst.b	snoopon(a4)
		beq.s	capm1			; snooping disabled
		move.l	276(a6),d4
		cmp.l	captask(a4),d4
		bne.s	capm1
		tst.b	bool(a4)
		bne.s	capm1
		addq.b	#1,bool(a4)
		moveq	#40,d6
		bsr	allocmsg
		beq.s	capm2
		move.l	d1,20(a5)
		move.l	d0,24(a5)
		move.l	60(sp),32(a5)
		st	36(a5)			; is alloc msg
		move.l	a5,remembr(a4)
		movem.l	(sp)+,d0-d7/a0-a6
		bsr.s	memalloc
		movem.l	d0-d7/a0-a6,-(sp)
		lea	dataarea(pc),a4
		move.l	remembr(a4),a1
		move.l	d0,28(a1)
		move.l	snoopport(a4),a0
		move.b	#5,8(a1)
		RECALL	PutMsg
		clr.b	bool(a4)
		movem.l	(sp)+,d0-d7/a0-a6
		rts
capm2		clr.b	bool(a4)
capm1		movem.l	(sp)+,d0-d7/a0-a6
memalloc	move.l	OldAllocMem+dataarea(pc),-(sp)
		rts

capmfree	movem.l	d0-d7/a0-a6,-(sp)	; a6 - SysBase !
		lea	dataarea(pc),a4
		tst.b	snoopon(a4)
		beq.s	capf1			; snooping disabled
		move.l	276(a6),d4
		cmp.l	captask(a4),d4
		bne.s	capf1
		tst.b	bool(a4)
		bne.s	capf1
		addq.b	#1,bool(a4)
		moveq	#40,d6
		bsr.s	allocmsg
		beq.s	capf2
		move.l	d0,20(a5)
		move.l	a1,24(a5)
		move.l	60(sp),32(a5)
;		clr.b	36(a5)			; is free msg
		move.l	snoopport(a4),a0
		move.b	#5,8(a5)
		move.l	a5,a1
		RECALL	PutMsg
capf2		clr.b	bool(a4)
capf1		movem.l (sp)+,d0-d7/a0-a6
		move.l  OldFreeMem+dataarea(pc),-(sp)
		rts

allocmsg	movem.l	d0-d1/a0-a1,-(sp)	; a6 - SysBase
		move.l	d6,d0
		move.l	pubclr(a4),d1		; MEMF_CLEAR|MEMF_PUBLIC
		tst.b	msnoop(a4)		; memory snooping ?
		bne.s	1$
		RECALL	AllocMem
		bra.s	2$
1$		bsr.s	memalloc
2$		tst.l	d0
		beq.s	alm1
		move.l	d0,a5
		move.w	d6,18(a5)
alm1		movem.l	(sp)+,d0-d1/a0-a1
		rts

freemsg		moveq	#0,d0
		move.w	18(a3),d0
		move.l	a3,a1
		CALL	FreeMem,sysbase(a4)
		rts

tracelocks	pea	DosTable+20(a4)		; table entry for locks
		bra.s	tracedos

tracefiles	pea	DosTable+00(a4)		; table entry for open

tracedos	lea	fileshead(a4),a2
		moveq	#1,d2
		bsr	InitSnoop
		move.l	(sp)+,a2
		beq.s	tracelocks-2		; error

		RECALL	Forbid
		tst.b	5(a2)
		bne.s	9$			; already patched !
		move.w	0(a2),a0		; offset
		move.l	16(a2),d0		; myfunc
		move.l	dosbase(a4),a1
		tst.b	post_V34(a4)
		beq.s	10$
		RECALL	SetFunction
		move.l	d0,12(a2)		; OldFuncPtr
		bra.s	9$
10$		move.w	0(a1,a0.w),6(a2)	; OldVec1
		move.w	#$4ef9,0(a1,a0.w)
		move.l	2(a1,a0.w),8(a2)	; OldVec2
		move.l	d0,2(a1,a0.w)
		lea	78(a1),a1
		move.l	a1,12(a2)		; OldFuncPtr
9$		moveq	#-1,d0
		move.w	d0,4(a2)		; function patched & active
		RECALL	Permit

8$		bsr	processmsgs

7$		move.l	snoopport(a4),a0
		CALL	GetMsg,sysbase(a4)
		tst.l	d0
		bne.s	6$
		tst.b	cbreak(a4)
		bne.s	traceend
		bra.s	8$

6$		move.l	d0,a3
		move.l	20(a3),d0
		bsr	getaskname2
		moveq	#11,d1
		bsr	tab
		moveq	#' ',d0
		bsr	putchar
		move.l	24(a3),d0
		bne.s	5$
		move.w	#failed,d0
		bsr	putstrw
		moveq	#21,d1
		bsr	tab
		bra.s	4$

5$		bsr	hexa
4$		move.b	28(a3),d0
		bmi.s	3$
		cmp.b	#2,d0
		ble.s	2$
3$		move.w	#type,d0
		bsr	putstrw
		moveq	#28,d1
		bsr	tab
		bra.s	1$
2$		ext.w	d0
		lsl.w	#3,d0
		add.w	#fmode,d0
		bsr	putstrw
1$		moveq	#29,d0
		add.l	a3,d0
		bsr	putnam

		bsr	freemsg
		bra.s	7$

traceend	lea	DosTable+00(a4),a2
		bsr.s	remtrace		; for Open()
		lea	DosTable+20(a4),a2
		bsr.s	remtrace		; for Lock()
		bra	ClrSnoop

remtrace	CALL	Forbid,sysbase(a4)
		tst.b	5(a2)
		beq.s	2$			; nothing patched !
		move.w	0(a2),a0		; offset
		move.l	16(a2),d0		; myfunc
		move.l	dosbase(a4),a1
		move.b	post_V34(a4),d1
		beq.s	6$			; not pre Kick2.0+ !
		tst.b	patchmode(a4)
		beq.s	5$			; don't check vectors
6$		cmp.l	2(a1,a0.w),d0
		bne.s	2$			; someone else patched !
		tst.b	d1			; d1:=post_V34
		beq.s	4$
5$		move.l	12(a2),d0
		RECALL	SetFunction
		bra.s	3$
4$		move.w	6(a2),0(a1,a0.w)
		move.l	8(a2),2(a1,a0.w)
3$		clr.b	5(a2)
2$		clr.b	4(a2)			; deactivate
		RECALL	Permit
		rts

mylock		moveq	#20,d0			; trace Lock()
		bra.s	mytrace

myopen		moveq	#0,d0			; trace Open()

mytrace		movem.l	d3-d7/a0-a6,-(sp)
		lea	dataarea(pc),a4
		lea	DosTable(a4),a2
		add.w	d0,a2
		move.b	4(a2),d7
		beq.s	5$			; disabled
		move.l	sysbase(a4),a6
		movem.l	d1-d2,-(sp)
		move.l	d1,a0
		bsr	strlen
		moveq	#30,d6
		add.l	d0,d6
		bsr	allocmsg
		beq.s	2$
		addq.w	#3,d2			; lock
		move.w	2(a2),d3		; dosoffset
		addq.w	#1,d3
		bne.s	3$
		sub.w 	#1007,d2		; open
3$		move.b	d2,28(a5)
		move.l	276(a6),20(a5)
		lea	29(a5),a1
		move.l	d1,a0
		RECALL	CopyMem
2$		movem.l	(sp)+,d1-d2
5$		bsr.s	RealDosFunc
		tst.b	d7			; disabled
		beq.s	6$
		movem.l	d1-d2,-(sp)
		move.l	d0,d7
		move.l	a5,d0
		beq.s	1$
		move.b	#5,8(a5)
		move.l	d7,24(a5)
		move.l	snoopport(a4),a0
		move.l	a5,a1
		CALL	PutMsg,sysbase(a4)
1$		move.l	d7,d0
		movem.l	(sp)+,d1-d2
6$		movem.l	(sp)+,d3-d7/a0-a6
		rts

RealDosFunc	move.w	2(a2),d0		; dosoffset
		ext.l	d0
		move.l	dosbase(a4),a6
		move.l	12(a2),-(sp)		; OldFuncPtr
		rts

_DosTable	dc.w	_LVOOpen,-1		; patchwhat & dosoffset
		dc.w	0,0			; active,on/off & DosVec1
		dc.l	0,0			; DosVec2 & OldFunc
		dc.l	myopen			; myfunc
		dc.w	_LVOLock,-11		; patchwhat & dosoffset
		dc.w	0,0			; active,on/off & DosVec1
		dc.l	0,0			; DosVec2 & OldFunc
		dc.l	mylock			; myfunc

;prepare snooping for memory or dos
InitSnoop	bsr	cls			; clear screen
		tst.w	d2
		bne.s	2$			; files
		bsr	nodenam
		moveq	#1,d7
		lea	TReNode(pc),a3
		bsr	findnam
		tst.b	d7
		beq.s	3$			; task not found
		move.l	d0,captask(a4)
2$		moveq	#0,d0
		lea	memportname(a4),a0
		bsr	CreatePort
		move.l	d0,snoopport(a4)
		beq.s	1$			; no port
		move.l	d0,a0
		moveq	#0,d1
		move.b	15(a0),d0
		bset	d0,d1
		move.l	d1,auxsig(a4)
		clr.b	cbreak(a4)
		st	addlines(a4)
		move.l	a2,a0			; header
		bsr	puthead
		bsr	replyintui
		move.l	sysbase(a4),a6
		moveq	#1,d0
1$		rts
3$		move.w	#stperr,d0
		bsr	putnamw			; task not found
		moveq	#0,d0
		bra.s	1$

;end snooping for memory or dos
ClrSnoop	move.l	snoopport(a4),d0
		beq.s	3$
		bsr	DeletePort
3$		tst.b	waitexit(a4)
		bne.s	1$			; Xoper was killed
		move.w	#stopped,d0
		tst.b	cbreak(a4)
		bne.s	2$
		move.w	#capexited,d0
2$		bsr	putnamw
1$		clr.l	snoopport(a4)
		clr.b	addlines(a4)
		clr.l	auxsig(a4)
		rts

; function to determine cpu-time for each task
myswitch	movem.l	d0-d1/a0-a2/a4/a6,-(sp)
		lea	dataarea(pc),a4
		move.w	tasksnum(a4),d0
		move.l	sysbase(a4),a0
		move.l	276(a0),a0
		lea	cputime(a4),a2
		bra.s	sw1
sw0		cmp.l	(a2)+,a0
		beq.s	sw2
sw1		dbra	d0,sw0
		cmp.w	#125,tasksnum(a4)
		bcc.s	swgo2			; too much
		addq.w	#1,tasksnum(a4)
		move.l	a0,(a2)+		; new entry
		clr.l	496(a2)
sw2		tst.b	post_V34(a4)
		beq.s	sw3
		lea	newtime(a4),a0
		CALL	ReadEClock,timerio+20(a4)
		move.l	newtime+4(a4),d0
		move.l	lasttime(a4),d1
		move.l	d0,lasttime(a4)
		sub.l	d1,d0
		bra.s	sw4
sw3		move.l	#999999,d0
		move.l	d0,d1
		sub.l	sampleio+36(a4),d0
		move.l	d1,sampleio+36(a4)
sw4		lsr.l	#8,d0
		add.l	d0,496(a2)
swgo2		movem.l	(sp)+,d0-d1/a0-a2/a4/a6
		move.l	OldSwitch+dataarea(pc),-(sp)
		rts

myaddtask	movem.l	d0/a0/a4,-(sp)
		lea	dataarea(pc),a4
		tst.b	wanttraps(a4)
		beq.s	2$
		lea	mytrap(pc),a0		; trap for task
		move.l	50(a1),d0
		beq.s	1$
		cmp.l	OldTrap(a4),d0
		beq.s	1$
		lea	myproctrap(pc),a0	; trap for process
		cmp.l	OldProcTrap(a4),d0
		bne.s	2$
1$		move.l	a0,50(a1)
2$		movem.l	(sp)+,d0/a0/a4
		move.l	a1,-(sp)
		bsr.s	RealAddTask		; do original function
		move.l	(sp)+,d0
		movem.l	d1-d7/a0-a6,-(sp)
		lea	dataarea(pc),a4
		move.l	d0,d7
		lea	tsecs(a4),a0
		lea	tmics(a4),a1
		CALL	CurrentTime,intuibase(a4)
		CALL	Forbid,sysbase(a4)
		move.w	numtaskstimed(a4),d5
		lsl.w	#2,d5
		lea	taskstampid(a4),a5
		lea	0(a5,d5.w),a5
		move.l	d7,0(a5)
		move.l	tsecs(a4),d0
		move.l	d0,taskstamps-taskstampid(a5)
		clr.l	usedtime-taskstampid(a5)
		addq.w	#1,numtaskstimed(a4)
		bsr	cleanuptimers
		RECALL	Permit
		cmp.b	#5,timerio+8(a4)
		bne.s	3$
		moveq	#0,d0
		move.w	timersig(a4),d1
		bset	d1,d0
		move.l	mytask(a4),a1
		RECALL	Signal
3$		move.l	d7,d0
		movem.l	(sp)+,d1-d7/a0-a6
		rts
RealAddTask	move.l	OldAddTask+dataarea(pc),-(sp)
		rts

; install or remove traphandlers

trapguru	tst.b	fromfile(a4)
		bne.s	1$			; not during startup ...
		tst.b	wanttraps(a4)
		bne.s	remtraps
		moveq	#-1,d0			; addtraps
		CALL	AllocSignal,sysbase(a4)
		move.b	d0,trapsig+3(a4)
		blt.s	1$
		moveq	#0,d1
		bset	d0,d1
		move.l	d1,trapmask(a4)
		RECALL	Forbid			; change the trap handler of
		moveq	#0,d5			; aleady running tasks
		bsr	getaskdat		; get task stucture pointers
		bra.s	2$
4$		lea	-16(a5),a5
		move.l	0(a5),a3		; pointer to a task structure
		lea	myproctrap(pc),a0
		move.l	50(a3),d0		; Task->tc_TrapCode
		cmp.l	OldProcTrap(a4),d0	; AmigaDOS Handler ?
		beq.s	3$
		lea	mytrap(pc),a0		; EXEC Handler ?
		cmp.l	OldTrap(a4),d0
		bne.s	2$			; must be a custom one, skip it
3$		move.l	a0,50(a3)		; replace it
2$		subq.b	#1,entries(a4)
		bcc.s	4$
		RECALL	Permit
		st	wanttraps(a4)
1$		rts

remtraps	tst.b	wanttraps(a4)
		beq.s	1$
		CALL	Forbid,sysbase(a4)
		moveq	#0,d5
		bsr	getaskdat
		bra.s	2$
4$		lea	-16(a5),a5
		move.l	0(a5),a3
		lea	50(a3),a3
		move.l	OldProcTrap(a4),d0
		lea	myproctrap(pc),a0
		cmp.l	(a3),a0
		beq.s	3$
		move.l	OldTrap(a4),d0
		lea	mytrap(pc),a0
		cmp.l	(a3),a0
		bne.s	2$
3$		move.l	d0,(a3)
2$		subq.b	#1,entries(a4)
		bcc.s	4$
		RECALL	Permit
		move.l	trapsig(a4),d0
		RECALL	FreeSignal
		clr.l	trapsig(a4)
		clr.b	wanttraps(a4)
1$		rts

; execption handlers

myproctrap	bsr.s	traphandle
		move.l	OldProcTrap+dataarea(pc),-(sp)
		rts

mytrap		bsr.s	traphandle
		moveq	#0,d0
		CALL	Wait,sysbase+dataarea(pc)
		move.l	OldTrap+dataarea(pc),-(sp)
		rts

traphandle	movem.l	d0-d7/a0-a6,$180
		lea	dataarea(pc),a4
		move.l	sysbase(a4),a6
		move.l	276(a6),excpttask(a4)
		move.l	4(sp),d0
		moveq	#9,d1
		cmp.l	d1,d0
		beq.s	2$
		move.l	d0,excpterror(a4)
		moveq	#10,d2
		moveq	#3,d1
		cmp.l	d1,d0
		bne.s	1$
		move.l	0(sp,d2.w),excptaddr(a4)
		moveq	#18,d2
1$		move.l	0(sp,d2.w),excptpc(a4)
		move.l	mytask(a4),a1
		move.l	trapmask(a4),d0
		RECALL	Signal
2$		movem.l	$180,d0-d7/a0-a6
		rts

;display ExecBase->LastAlert

lastalert	movem.l	$100,d1-d2
		tst.l	d1
		bne.s	al1
		move.l	sysbase(a4),a0
		movem.l	514(a0),d1-d2
al1		move.w	#gurutxt,d0
		bsr	putstrw
		move.l	d1,d0
		bsr	hexa
		subq.l	#1,ptr(a4)
		moveq	#'.',d0
		bsr	putchar
		move.l	d2,d0
		bsr	hexa
		bra	newline

alert		move.l	excpttask(a4),d0
		bne.s	alert1
		move.w	#noguru,d0
		bra	putnamw
alert1		move.w	#softfail,d0
		bsr	putstrw
		move.l	excpttask(a4),d0
		bsr	getaskname2
		bsr	newline
		moveq	#3,d0
		cmp.l	excpterror(a4),d0
		bne.s	1$
		move.w	#addrserr,d0
		bsr	putstrw
		move.l	excptaddr(a4),d0
		bsr	hexa
		bsr	newline
1$		move.w	#procount,d0
		bsr	putstrw
		move.l	excptpc(a4),d0
		bsr	hexa
		bsr	newline
		move.w	#gurutxt,d0
		bsr	putstrw
		move.l	excpterror(a4),d0
		bsr	hexa
		lea 	out(a4),a0
		move.l	ptr(a4),d0
		move.b	#'.',-1(a0,d0.w)
		move.l	excpttask(a4),d0
		bsr	hexa
		bra	newline

showguru	bsr	stoptimer
		bsr	alert
		move.w	#_LVOScreenToFront,d0
		move.l	screenptr(a4),a0
		tst.b	ownscreen(a4)
		bne.s	5$
		move.w	#_LVOWindowToFront,d0
		move.l	wnptr(a4),a0
5$		move.l	intuibase(a4),a6
		jsr	0(a6,d0.w)		; Window or Screen ToFront()

		move.w	#whatnow,d0
		bsr	putnamw
		clr.l	oldpageend(a4)
2$		bsr	readline
		cmp.b	#'i',d0
		beq.s	4$
		cmp.b	#'k',d0
		bne.s	2$

		move.l	excpttask(a4),a1
		tst.l	22(a1)
		bne.s	3$
		CALL	RemTask,sysbase(a4)
		bra.s	4$
3$		move.l	a1,d0
		bsr	canok
4$		clr.l	lastprinted(a4)
		bsr	starttimer
		rts

coldreboot	move.w	#$4000,$dff09a
		move.l	sysbase(a4),a6
		neg.w	82(a6)			; kill ChkSum
		clr.l	4			; kill ExecBase Ptr
reboot		move.l	sysbase(a4),a6
		tst.b	post_V34(a4)
		beq.s	1$
		jmp	_LVOColdReboot(a6)

1$		lea	$01000004,a2		; reboot manually
		suba.l	24(a2),a2
		movea.l	0(a2),a2
		subq.l	#2,a2
		lea	2$(pc),a5
		jmp	_LVOSupervisor(a6)
		cnop	0,4
2$		reset
		jmp	0(a2)

;save the contents of the output buffer
;to a file, append the output if the file allready exists
saveoutput	bsr	nodenam2
		tst.b	0(a5)
		beq	syntax
		move.l	a5,d1
		move.l	#1004,d2		; mode_readwrite
		CALL	Open,dosbase(a4)
		move.l	d0,d5
		beq.s	5$
		move.l	d5,d1
		moveq	#0,d2
		moveq	#1,d3
		RECALL	Seek
		bra.s	1$
5$		move.l	a5,d1
;		move.w	#1006,d2		; mode_newfile
		addq.w	#2,d2
		RECALL	Open
		move.l	d0,d5
		bne.s	1$
		move.w	#openerr,d0
		bsr	putstrw
		move.l	a5,d0
		bra	putnam
1$		move.l	outchain(a4),d0
		beq.s	3$
2$		move.l	d0,a5
		move.w	12(a5),d3
		beq.s	4$
		ext.l	d3
		lea	14(a5),a0
		move.l	a0,d2
		move.l	d5,d1
		RECALL	Write
		tst.l	d0
		ble.s	3$
4$		move.l	d5,d1
		lea 	cr(a4),a0
		move.l	a0,d2
		moveq	#1,d3
		RECALL	Write
		tst.l	d0
		ble.s	3$
		move.l	0(a5),d0
		bne.s	2$
3$		move.l	d5,d1
		RECALL	Close
		rts

grabtimerio	lea	tiohead(a4),a0
		bsr	puthead
		move.b	timeout(a4),d4
		st	timeout(a4)		; 255 !
		bsr	starttimer
		move.b  d4,timeout(a4)
		pea	dummy(a4)

		CALL	Disable,sysbase(a4)
		lea	timerio(a4),a5
6$		move.l	0(a5),a5
		tst.l	0(a5)			; not lh_Tail
		bne.s	6$
		subq.l	#4,a5			; now list header !
		RECALL	Enable

		bsr	stoptimer
		lea	buffer(a4),a3
		moveq	#1,d4			; VBlank
		bsr	gettrq

		moveq	#40,d0
		lea	timerio(a4),a0
		move.l	(sp),a1			; dummy
		RECALL	CopyMemQuick

		moveq	#0,d1
		moveq	#0,d0
		lea 	timername(a4),a0
		move.l	(sp),a1			; dummy
		RECALL	OpenDevice

		move.l	(sp),a1			; dummy
		move.l	#1<<30,32(a1)
		RECALL	SendIO

		RECALL	Disable
		move.l	(sp),a5			; dummy
5$		move.l	0(a5),a5
		tst.l	0(a5)
		bne.s	5$
		subq.l	#4,a5			; now list header !
		RECALL	Enable
		move.l	(sp),a1			; dummy
		bsr	stoptimer2
		moveq	#0,d4			; MicroHz
		bsr	gettrq

		move.l	(sp),a1			; dummy
		RECALL	CloseDevice

		clr.l	(a3)
		lea	-18(a3),a2
		moveq	#18,d2
		bsr	sortlist

		move.l	(sp)+,a0		; dummy

		tst.b	post_V34(a4)
		beq.s	3$			; "black magic" needed? ;-(

		CALL	ReadEClock,timerio+20(a4)
		move.l	dummy+4(a4),d2
		move.l	d0,d3			; EClock
		lea	buffer(a4),a2
4$		move.l	0(a2),d0
		beq.s	3$
		move.l	10(a2),d0
		sub.l	d2,d0
		scc	d1
		ext.w	d1
		ext.l	d1
		and.l	d1,d0
		move.l	d3,d1
		bsr	div
		movem.l	d0/d1,6(a2)
		lea	18(a2),a2
		bra.s	4$

3$		lea	buffer(a4),a5
2$		move.l	(a5)+,d0
		beq.s	1$
		bsr	hexa
		move.w	(a5)+,d0
		ext.l	d0
		mulu	#9,d0
		add.w 	#timerunits,d0
		bsr	putstrw
		move.l	(a5)+,d0
		bsr	putstamp
		moveq	#'.',d0
		bsr	putchar
		move.l	(a5)+,d0
		move.l	#100000,d1
		bsr	div
		or.b	#'0',d0
		bsr	putchar
		bsr	putblank
		move.l	(a5)+,d0
		bsr	getaskname2
		bsr	newline
		bra.s	2$
1$		rts

gettrq		RECALL	Disable			; a6 - SysBase
3$		move.l	0(a5),a5
		tst.l	0(a5)
		beq.s	4$
		move.l	a5,(a3)+
		move.w	d4,(a3)+
		move.l	32(a5),(a3)+
		move.l	36(a5),(a3)+
		move.l	14(a5),a1
		move.l	16(a1),(a3)+
		bra.s	3$
4$		RECALL	Enable
		rts

; check if the timer is runnig, start it if not
starttimer	lea	timerio(a4),a1
		cmp.b	#5,8(a1)
		beq.s	1$
		moveq	#0,d0
		move.b	timeout(a4),d0
		bne.s	2$
		tst.l	timeoutm(a4)
		beq.s	1$
2$		move.l	d0,32(a1)
		move.l	timeoutm(a4),36(a1)
		move.w	#9,28(a1)
		CALL	SendIO,sysbase(a4)
1$		rts

; Abort a timer request, if pending
stoptimer	move.l	sysbase(a4),a6
		lea	timerio(a4),a1
		cmp.b	#5,8(a1)
		bne.s	stptim
stoptimer2	move.l	a1,-(sp)
		RECALL	AbortIO
		move.l	(sp)+,a1
		RECALL	WaitIO
stptim		move.w	timersig(a4),d0
		moveq	#0,d1
		bset	d0,d1
		moveq	#0,d0
		jmp	_LVOSetSignal(a6)	; clr signal

;install as commodity and/or a input-handler
installh	move.l	cxbase(a4),d0		; commodity possible ?
		beq	1$
		lea	broker(a4),a3
		lea	hotkeybuf(a4),a5
		move.l	d0,a6			; cxbase
		moveq	#0,d0
		suba.l	a0,a0
		bsr	CreatePort
		move.l	d0,newbroker+20(a4)
		beq	1$
		move.l	d0,a0
		move.b	15(a0),cxsig+1(a4)
		moveq	#0,d0
		lea	newbroker(a4),a0
		RECALL	CxBroker
		move.l	d0,0(a3)
		beq.s	1$			; no broker !
		moveq	#1,d0			; CX_Filter
		move.l	a5,a0
		suba.l	a1,a1
		RECALL	CreateCxObj
		move.l	d0,filter(a4)
		beq.s	3$
		move.l	d0,a2
		move.l	d0,a0
		RECALL	CxObjError
		tst.l	d0
		beq.s	4$			; hotkey definition ok !
		move.l	a5,a1
		lea	defhotkey(a4),a0
5$		move.b	(a0)+,(a5)+		; copy string
		bne.s	5$
		move.l	a2,a0
		RECALL	SetFilter		; try our default
4$		moveq	#4,d0			; CX_Signal
		move.l	mytask(a4),a0
		move.w	#mysigbit,a1
		RECALL	CreateCxObj
		move.l	d0,a1			; Signal -> Filter
		move.l	a2,a0
		RECALL	AttachCxObj
		moveq	#5,d0			; CX_Translate
		suba.l	a0,a0
		suba.l	a1,a1
		RECALL	CreateCxObj
		move.l	d0,a1			; Translate -> Filter
		move.l	a2,a0
		RECALL	AttachCxObj
		move.l	a2,a1			; Filter -> Broker
		move.l	0(a3),a0
		RECALL	AttachCxObj
3$		move.l	0(a3),a0		; broker
		RECALL	CxObjError
		tst.l	d0
		beq.s	2$			; no error
		move.l	0(a3),a0
		RECALL	DeleteCxObjAll
		clr.l	0(a3)			; clear ptr
2$		move.l	0(a3),d0
		beq.s	1$
		move.l	d0,a0
		moveq	#1,d0
		RECALL	ActivateCxObj

1$		moveq	#0,d0
		suba.l	a0,a0
		bsr	CreatePort
		move.l	d0,inputport(a4)
		beq.s	6$
		bsr	CreateStdIO
		move.l	d0,inputio(a4)
		beq.s	6$
		move.l	d0,a1
		lea	inputname(a4),a0
		moveq	#0,d0
		moveq	#0,d1
		CALL	OpenDevice,sysbase(a4)
		tst.b	d0
		bne.s	6$
		st	inputdev(a4)
		lea	ininterrupt(a4),a0
		move.l	a4,14(a0)
		movea.l	inputio(a4),a1
		move.w	#9,28(a1)
		move.l	a0,40(a1)
		RECALL	DoIO
		moveq	#1,d0
		rts

6$		moveq	#0,d0
		rts

;change our commodity popkey
cxpopkey	bsr	nodenam2
		lea	hotkeybuf(a4),a3
		move.l	filter(a4),a2
		move.b	fromfile(a4),d7
		bne.s	3$			; script
		tst.l	broker(a4)
		beq.s	1$			; no broker - ignore
		move.l	a2,a0
		move.l	a5,a1
		CALL	SetFilter,cxbase(a4)	; set new popkey
		move.l	a2,a0
		RECALL	CxObjError
		tst.l	d0
		beq.s	3$			; no error
		move.l	a2,a0
		move.l	a3,a1
		RECALL	SetFilter		; set old popkey
		move.l	a3,a5
3$		moveq	#39,d0
2$		move.b	(a5)+,(a3)+
		dbeq	d0,2$
		clr.b	(a3)
		tst.b	d7			; script ?
		bne.s	1$
		bsr	setwintitle		; show popkey
1$		rts

;remove commodity and/or handler
removeh		move.l	broker(a4),d2
		beq.s	5$			; no commodity !
		move.l	d2,a0
		moveq	#0,d0			; disable
		CALL	ActivateCxObj,cxbase(a4)
		move.l	d2,a0
		RECALL	DeleteCxObjAll
5$		move.l	newbroker+20(a4),d0
		bsr.s	2$
		move.l	inputio(a4),d0
		beq.s	3$
		move.l	d0,a2
		tst.b	inputdev(a4)
		beq.s	4$
		move.l	a2,a1
		move.w	#10,28(a1)
		lea	ininterrupt(a4),a0
		move.l	a0,40(a1)
		CALL	DoIO,sysbase(a4)
		move.l	a2,a1
		RECALL	CloseDevice
4$		move.l	a2,d0
		bsr	DeleteStdIO
3$		move.l	inputport(a4),d0
2$		beq.s	1$
		bsr	DeletePort
1$		rts

;check broker port for messages from master control 'Exchange'
ChkBroker	move.l	a2,-(sp)
		tst.l	broker(a4)
		beq.s	1$
5$		move.l	newbroker+20(a4),a0
		CALL	GetMsg,sysbase(a4)
		move.l	d0,a2
		move.l	a2,d0
		beq.s	1$
		move.l	a2,a0
		CALL	CxMsgType,cxbase(a4)
		cmp.w	#$40,d0			; CXM_COMMAND
		bne.s	2$
		move.l	a2,a0
		RECALL	CxMsgID
		move.l	mysignal(a4),d1
		cmp.w	#25,d0			; CXCMD_UNIQUE
		beq.s	3$
		cmp.w	#23,d0			; CXCMD_KILL
		seq	wantexit(a4)
		beq.s	4$
		cmp.w	#19,d0			; CXCMD_APPEAR
		beq.s	3$
		moveq	#0,d1
		cmp.w	#21,d0			; CXCMD_DISAPPEAR
		bne.s	3$
		st	wanthold(a4)
4$		st	cbreak(a4)		; end snooping (if necessary)
		move.w	nspubsig+6(a4),d0
		bset	d0,d1
3$		move.l	d1,d0
		CALL	SetSignal,sysbase(a4)	; set new signals
2$		move.l	a2,a1
		CALL	ReplyMsg,sysbase(a4)
		bra.s	5$
1$		move.l	(sp)+,a2
		rts

;this is the handler, it checks if amiga-amiga-x
;has been pressed and signals it to our task
keyhandler	move.l	a0,-(sp)
		tst.l	broker(a1)
		beq.s	2$		; not running as commodity !
		tst.b	cxstate(a1)
		bne.s	1$		; handler is off
2$		cmp.b	#1,4(a0)
		bne.s	1$
		move.w	8(a0),d0
		andi.w	#$c0,d0
		cmpi.w	#$c0,d0
		bne.s	1$
		cmp.w	#$32,6(a0)
		bne.s	1$
		clr.b	4(a0)		; nop event
		bsr.s	wakeup
1$		move.l	(sp)+,d0	; return event
		rts

;wakeup Xoper
wakeup		move.l	mysignal(a1),d0
		move.l	sysbase(a1),a6
		movea.l	mytask(a1),a1
		jmp	_LVOSignal(a6)

;ports-handler
countio		addq.l	#1,iocount(a1)
		tst.b	pcheck(a1)
		beq.s	1$			; check not requested
		bsr.s	checkit
		tst.b	d1
		beq.s	1$
		clr.b	pcheck(a1)		; disable checking ...
		bsr.s	wakeup
1$		moveq	#0,d0
		rts

checkit		moveq	#0,d1			; check all patched functions
		move.l	sysbase(a1),a6		; exec library
		tst.b	bool(a1)
		beq.s	5$
		lea	myswitch(pc),a5
		move.w	#_LVOSwitch,d0
		bsr.s	2$
		lea	myaddtask(pc),a5
		move.w	#_LVOAddTask,d0
		bsr.s	2$
5$		tst.b	msnoop(a1)
		beq.s	4$
		lea	capmalloc(pc),a5
		move.w	#_LVOAllocMem,d0
		bsr.s	2$
		lea	capmfree(pc),a5
		move.w	#_LVOFreeMem,d0
		bsr.s	2$
4$		move.l	dosbase(a1),a6		; dos library
		tst.b	DosTable+05(a1)
		beq.s	3$
		move.l	DosTable+16(a1),a5
		move.w	DosTable+00(a1),d0
		bsr.s	2$
3$		tst.b	DosTable+25(a1)
		beq.s	1$
		move.l	DosTable+36(a1),a5
		move.w	DosTable+20(a1),d0
2$		cmp.l	2(a6,d0.w),a5		; check library function
		seq	d1
1$		rts

;compare strings
; -> a0/a1 = pointers to string
; <- d0 = true(0) false(1), d1 = length

strcmp		movem.l	d2/a0/a1,-(sp)
		moveq	#0,d0
		moveq	#0,d1
src2		move.b	(a0)+,d0
		beq.s	src1
		cmp.b	#10,d0
		beq.s	src1
		bsr.s	src4
		move.b	d0,d2
		move.b	(a1)+,d0
		bsr.s	src4
		cmp.b	d2,d0
		bne.s	src3
		addq.w	#1,d1
		bra.s	src2
src1		move.b	0(a1),d0
src3		movem.l	(sp)+,d2/a0/a1
		rts

src4		cmp.b	#'z'+1,d0		; convert to upper case
		bcc.s	1$
		cmp.b	#'a',d0
		bcs.s	1$
		add.b	#$e0,d0
1$		rts

strbuf		movem.l	d0/a1-a2,-(sp)
		move.l	a0,a1
		lea	buffer(a4),a2
1$		move.b	(a1)+,d0
		cmp.b	#10,d0
		beq.s	2$
		cmp.b	#' ',d0
		beq.s	2$
		or.b	#' ',d0
		beq.s	2$
		move.b	d0,(a2)+
		bra.s	1$
2$		clr.b	(a2)+
		movem.l	(sp)+,d0/a1-a2
		rts

tolower		movem.l	d0-d1/a0,-(sp)
		subq.w	#1,d0
		bmi.s	3$
1$		move.b	0(a0),d1
		cmp.b	#'A',d1
		blt.s	2$
		cmp.b	#'Z',d1
		bgt.s	2$
		or.b	#' ',d1
2$		move.b	d1,(a0)+
		dbra	d0,1$
3$		clr.b	(a0)
		movem.l	(sp)+,d0-d1/a0
		rts

div		tst.l	d1
		beq.s	1$
		move.l	div32(a4),-(sp)
1$		rts

; 32-bit division d0 / d1
; <- d0 - result
;    d1 - remainder

div68020	dc.w	$4c41,$0001		; divul.l d1,d1:d0
		rts

div68000	move.l	d3,-(sp)
		move.l	d2,-(sp)
		move.l	d1,d3
		swap	d1
		tst.w	d1
		bne.s	4$
		move.w	d0,d2
		clr.w	d0
		swap	d0
		divu.w	d3,d0
		move.l	d0,d1
		swap	d0
		move.w	d2,d1
		divu.w	d3,d1
		move.w	d1,d0
		clr.w	d1
		swap	d1
		bra.s	1$
4$		move.l	d0,d1
		swap	d0
		clr.w	d0
		clr.w	d1
		swap	d1
		moveq	#16-1,d2
3$		add.l	d0,d0
		addx.l	d1,d1
		cmp.l	d1,d3
		bhi.s	2$
		sub.l	d3,d1
		addq.w	#1,d0
2$		dbra	d2,3$
1$		move.l	(sp)+,d2
		move.l	(sp)+,d3
		rts

;copy a string from input to 'buffer'
; -> a0 = pointer to string
getstr		lea	buffer(a4),a5
1$		cmp.b	#' ',0(a0)
		beq.s	2$
		cmp.b	#10,0(a0)
		beq.s	2$
		move.b	(a0)+,(a5)+
		bra.s	1$
2$		clr.b 	0(a5)

;skip blanks
; -> a0 pointer to text
; <- a0 = new pointer position
kllblnks	cmpi.b	#' ',(a0)+
		beq.s	kllblnks
		subq.w	#1,a0
		rts

;read in a nodename or a processname
nodenam		bsr.s	isdec
		move.w	d2,procnum(a4)
nodenam2	bsr.s	kllblnks
		move.l	a0,a5
gno1		cmp.b	#10,(a0)+
		bne.s	gno1
		clr.b	-1(a0)
		rts

getfrac		bsr.s	isdec
		moveq	#0,d0
		cmp.b	#'.',(a0)
		bne.s	1$
		addq.w	#1,a0
		cmp.b	#10,(a0)
		beq.s	1$
		move.b	(a0)+,d0
		and.b	#$0f,d0
		moveq	#1,d7
1$		muls	#10,d2
		add.l	d0,d2
		rts

;convert ascii to byte
; -> a0 = pointer to text
; <- d0 = byte
getnum		bsr.s	kllblnks
		cmp.b	#'$',0(a0)
		bne.s	isdec
		bsr.s	readhex
		move.l	d0,d2
		rts
isdec		moveq	#0,d2
		moveq	#0,d3
		moveq	#0,d6
		moveq	#0,d7
		cmp.b	#'-',0(a0)
		bne.s	gn1
		addq.w	#1,a0
		moveq	#1,d6
gn1		move.b	(a0)+,d3
		cmp.b	#'9',d3
		bhi.s	gn2
		cmp.b	#'0',d3
		bcs.s	gn2
		moveq 	#1,d7
		and.b	#$f,d3
		muls	#10,d2
		add.l	d3,d2
		bra.s	gn1
gn2		tst.b	d6
		beq.s	gn3
		neg.l	d2
gn3		subq.w	#1,a0
		rts

;convert hex to longword
; -> a0 = pointer to text
; <- d0=value, d7 = ok(1) error(0)
readhex		movem.l	d1-d6/a1-a5,-(sp)
		moveq	#1,d7
		cmp.b	#'$',0(a0)
		bne.s	rh3
		addq.l	#1,a0
rh3		moveq	#0,d0
		cmpi.b	#10,0(a0)
		beq.s	rherr
		lea	hextab(a4),a1
rh0		move.b	(a0)+,d3
		moveq.l	#15,d2
rh1		cmp.b	0(a1,d2.w),d3
		beq.s	rh2
		dbra	d2,rh1
		bra.s	rhend
rh2		lsl.l	#4,d0
		or.b	d2,d0
		bra.s	rh0
rhend		tst.b	d3
		beq.s	rhok
		cmpi.b	#10,d3
		beq.s	rhok
		cmpi.b	#' ',d3
		beq.s	rhok
rherr		moveq	#0,d7
rhok		movem.l	(sp)+,d1-d6/a1-a5
		rts

longdecn	move.l	d3,-(sp)
		moveq	#3,d3
		bsr.s	longdec
		move.l	(sp)+,d3
		move.w	#binarea+9,d0
		sub.w	d3,d0
		bra	putstrw

;convert long to decimal
; -> d0 = value
;    d3 bit 0 = left/right justified
;       bit 1 = write/leave
; returns string in 'buffer'
longdec		movem.l	d1-d2/a1-a2,-(sp)
		tst.l	d0
		bmi.s	2$
		cmp.l	#999999999,d0
		ble.s	1$
2$		move.w	#longlongnix,d0
		bra.s	ld6
1$		lea	binarea(a4),a1
		move.l	#'    ',(a1)+
		move.l	#'    ',(a1)+
		move.w	#'  ',(a1)+
		clr.b	0(a1)
		subq.w	#1,a1
		cmp.w	#2,d3
		bne.s	ld5
		clr.b	0(a1)
ld5		moveq	#1,d2
ld2		addq.w	#1,d2
		moveq	#10,d1
		bsr	div
		addi.b	#'0',d1
		move.b	d1,-(a1)
		tst.l	d0
		bne.s	ld2
		btst	#0,d3
		bne.s	ld1
		lea	binarea(a4),a2
		cmpa.l	a2,a1
		bne.s	ld3
		subq.l	#1,ptr(a4)
		bra.s	ld1
ld3		move.b	0(a1),(a2)+
		move.b	#' ',(a1)+
		dbra	d2,ld3
ld1		move.w	#binarea,d0
ld6		btst	#1,d3
		bne.s	ld4
		bsr	putstrw
ld4		movem.l	(sp)+,d1-d2/a1-a2
		rts

putlongascii	movem.l	d1/d2,-(sp)
		moveq	#3,d2
		move.l	d0,d1
2$		rol.l	#8,d1
		move.b	d1,d0
		beq.s	1$
		bsr	putchar
1$		dbra	d2,2$
		movem.l	(sp)+,d1/d2
		rts

putstamp	movem.l	d0/d1,-(sp)
		move.l	#3600,d1
		bsr	div
		moveq	#3,d3
		bsr	longdec
		move.l	binarea+6(a4),d0
		lsr.l	#8,d0
		bsr.s	putlongascii
		moveq	#':',d0
		bsr	putchar
		move.l	d1,d0
		moveq	#60,d1
		bsr	div
		bsr.s	write2digs
		moveq	#':',d0
		bsr	putchar
		move.l	d1,d0
		bsr.s	write2digs
		movem.l (sp)+,d0/d1
		rts

write2digs	movem.l	d0/d1,-(sp)
		divu	#10,d0
		move.l	d0,d1
		or.b	#'0',d0
		bsr	putchar
		swap	d1
		or.b	#'0',d1
		move.b	d1,d0
		bsr	putchar
		movem.l	(sp)+,d0/d1
		rts

;print a bcpl-string
; -> d0 = bcpl-pointer to bcpl-string
putbcpl		movem.l	d3/a0-a1,-(sp)
		tst.l	d0
		beq.s	1$
		lsl.l	#2,d0
		move.l	d0,a1
		moveq	#0,d3
		move.b	(a1)+,d3
		subq.w	#1,d3
		bmi.s	1$
2$		move.b	(a1)+,d0
		beq.s	1$
		bsr	putchar
		dbra	d3,2$
1$		move.l	ptr(a4),d0
		movem.l	(sp)+,d3/a0-a1
		rts

;write unsigned word
; -> d3 = value
worddec		bsr.s	dec2
		move.w	#minus+1,d0
		bra	putstrw

;write unsigned byte
; -> d3 = value
bytedec		bsr.s	dec1
		move.w	#decimal,d0
		bra	putstrw

;write signed byte
; -> d3 = value
plusmins	movem.l	d5/a3,-(sp)
		move.w	#$2020,minus(a4)
		move.b	d3,d5
		bpl.s	2$
		neg.b	d3
2$		bsr.s	dec1
		tst.b	d5
		bpl.s	1$
		move.l	d0,a3
		move.b	#'-',-(a3)
1$		movem.l	(sp)+,d5/a3
		move.w	#minus+1,d0
		bra	putstrw

dec2		movem.l	d3/a2/a3,-(sp)		; convert word
		and.l	#$ffff,d3
		lea	minus(a4),a3
		move.w	#$2020,(a3)+
		bra.s	dec

dec1		movem.l	d3/a2/a3,-(sp)		; convert byte
		and.l	#$ff,d3
		lea	decimal(a4),a3

dec		move.l	#$20203020,(a3)+
		subq.l	#1,a3
		move.l	a3,a2
		moveq	#'0',d0
3$		tst.b	d3
		beq.s	2$
		divu	#10,d3
		swap	d3
		or.b	d0,d3
		move.b	d3,-(a3)
		clr.w	d3
		swap	d3
		bra.s	3$
2$		cmpa.l	a2,a3
		bcs.s	1$
		move.b	d0,-(a3)
1$		move.l	a3,d0
		movem.l	(sp)+,d3/a2/a3
		rts

prcent		lsl.l	#3,d0			; 1000x=1024x-24x
		move.l	d0,d2
		add.l	d0,d0
		add.l	d0,d2
		lsl.l	#6,d0
		sub.l	d2,d0
		bsr	div
		moveq	#0,d5
		bsr.s	putfrac
		move.w	#infoh4,d0
		bra	putstrw

putfrac		divu	#10,d0
		move	d0,d3
		swap	d0
		move	d0,d1
		tst.w	d5
		bne.s	1$
		cmp.w	#100,d3
		ble.s	1$
		move.w	#whatsthis,d0
		bra	putstrw
1$		bsr	bytedec
		lea	out(a4),a0
		move.b	#'.',-1(a0,d0)
		or.b	#'0',d1
		move	d1,d0
		bra	putchar

;Write pointer, display '-------' if empty
hexan		tst.l	d0
		beq.s	hexa2

;Write 8 byte hex value
; -> d0 = value
hexa		bsr.s	gthex
hexa2		bra	putstr

gthex		movem.l	d1-d2/a1-a2,-(sp)
		lea	hexarea+9(a4),a2
		move.b	#' ',-(a2)
		lea	hextab(a4),a1
		moveq	#7,d2
hexloop 	moveq	#$0f,d1
		and.b	d0,d1
		move.b	0(a1,d1.w),-(a2)
		lsr.l	#4,d0
		dbra	d2,hexloop
		move.l	a2,d0
		movem.l	(sp)+,d1-d2/a1-a2
		rts

;Convert/write byte into binary string
; -> d0 = value
bin		movem.l	d1-d7/a0-a6,-(sp)
		lea	binarea(a4),a0
		move.l	#$2020<<16,8(a0)
		moveq	#7,d4
binloop		moveq	#'0'/2,d1
		roxr.b	#1,d0
		roxl.b	#1,d1
		move.b	d1,0(a0,d4.w)
		dbra	d4,binloop
		move.l	a0,d0
		movem.l	(sp)+,d1-d7/a0-a6
		bra	putstr

;look for NUL-Byte
strlen		moveq	#0,d0

;look for character in d0
strlen2		move.l	a0,-(sp)
1$		cmp.b	(a0)+,d0
		bne.s	1$
		move.l	a0,d0
		move.l	(sp)+,a0
		sub.l	a0,d0
		subq.l	#1,d0
		rts

;write a title and underline
; -> a0 = pointer to text
puthead1	bsr.s	strlen
		move.l	d0,d5
		move.l	a0,d0
		bra	putstr

puthead2	bsr.s	strlen
		add.l	d0,d5
		bra.s	ph2

puthead		bsr.s	strlen
		move.l	d0,d5
ph2		move.l	a0,d0
		bsr.s	putnam
		lea	out(a4),a0
		move.l	a0,d0
ph1		move.b	#'-',(a0)+
		dbra	d5,ph1
		move.b	#10,(a0)+
		clr.b	0(a0)
		bra.s	putstr

syntax		move.w	#synerr,d0		; error

;write a string, move cursor into next line
; -> d0 = pointer to text
putnamw		bsr.s	putstrw
		bra.s	putnam1
putnam		bsr.s	putstr
putnam1		tst.b	d0
		beq.s	1$
		bsr.s	newline
1$		rts

newline		move.w	#cr,d0			; linefeed

;write a string, strings are only put into the output buffer
;when a LF is detected
; -> d0 = pointer to string
; <- d0 = cursor position

putstrw		ext.l	d0
		add.l	a4,d0			; dataarea
putstr		movem.l	d1-d7/a0-a6,-(sp)
		st	printed(a4)
		move.l	d0,a2
		lea	out(a4),a3
		move.l	ptr(a4),d0
		move.l	a2,d5
		bne.s	pst1
		lea	longnix(a4),a2

pst1		move.b	(a2)+,d1
		cmpi.b	#13,d1
		beq.s	pst1
		cmpi.b	#10,d1
		beq.s	lineend
		move.b	d1,0(a3,d0.w)
		beq	prend
		cmp.w	#100+100,d0
		bge.s	pst1
		addq.l	#1,d0
		bra.s	pst1

lineend		tst.b	fromfile(a4)
		beq.s	1$
		moveq	#0,d0
		bra	prend

1$		tst.l	lastprinted(a4)
		bne.s	2$
		bsr	killpage

2$		addq.w	#1,d0
		move.l	d0,-(sp)
		add.w	#14,d0
		moveq	#0,d1
		CALL	AllocMem,sysbase(a4)
		move.l	(sp)+,d1
		tst.l	d0
		beq	prend
		move.l	d0,a0
		move.w	d1,12(a0)
		cmp.w	maxllength(a4),d1
		ble.s	7$
		move.w	d1,maxllength(a4)
7$		move.l	node(a4),8(a0)
		clr.l	node(a4)
		clr.l	0(a0)
		move.l	lastprinted(a4),d0
		move.l	d0,4(a0)
		bne.s	3$
		move.l	a0,outchain(a4)
		bra.s	4$
3$		move.l	d0,a1
		move.l	a0,0(a1)
4$		move.l	a0,lastprinted(a4)
		lea	out(a4),a1
		lea	14(a0),a0
		move.b	#' ',(a0)+
		subq.w	#2,d1
		bmi.s	6$
5$		move.b	(a1)+,(a0)+
		dbra	d1,5$
6$		move.l	numlines(a4),d2
		cmp.l	maxlines(a4),d2
		ble.s	8$
		move.l	outchain(a4),a1		; maxlines reached !
		move.l	0(a1),a0
		move.l	a0,outchain(a4)
		clr.l	4(a0)
		moveq	#14,d0
		add.w	12(a1),d0
		CALL	FreeMem,sysbase(a4)
		bra.s	9$

8$		addq.l	#1,numlines(a4)
9$		moveq	#0,d0
		tst.b	addlines(a4)
		beq.s	10$
		bsr	addline
10$		bra	pst1
prend		move.l	d0,ptr(a4)
		movem.l	(sp)+,d1-d7/a0-a6
		rts

putblank	moveq	#' ',d0			; store one blank

;write one char 
; -> d0 = char
putchar		movem.l	d1/a1,-(sp)
		move.l	ptr(a4),d1
		lea	out(a4),a1
		move.b	d0,0(a1,d1.w)
		addq.l	#1,ptr(a4)
		movem.l	(sp)+,d1/a1
		rts

;move cursor to a column
; -> d0 = current position
;    d1 = column
tab		move.l	a3,-(sp)
		lea	out(a4),a3
1$		cmp.b	d1,d0
		bcc.s	2$
		move.b	#' ',0(a3,d0.w)
		addq.b	#1,d0
		bra.s	1$
2$		move.l	d1,ptr(a4)
		move.l	(sp)+,a3
		rts

; Xoper main loop, process all incoming messages
processmsgs	moveq	#0,d0
		move.w	cxsig(a4),d1
		beq.s	3$
		bset	d1,d0
3$		move.w	nspubsig+6(a4),d1
		bset	d1,d0
		move.w	intuisig(a4),d1
		bset	d1,d0
		move.w	timersig(a4),d1
		bset	d1,d0
		ori.w	#$1000,d0
		or.l	mysignal(a4),d0
		or.l	auxsig(a4),d0
		tst.l	auxsig(a4)
		bne.s	2$
		or.l	trapmask(a4),d0
2$		CALL	Wait,sysbase(a4)

		move.l	d0,tasksigs(a4)

		move.l	trapmask(a4),d1
		and.l	d0,d1
		beq.s	1$
		tst.b	gotguru(a4)
		bne.s	1$
		st	gotguru(a4)
		bsr	showguru
		clr.b	gotguru(a4)

1$		bsr	ChkBroker		; check broker port

ctrl_c		moveq	#12,d1
		bsr	testsig
		beq.s	pubscreen
		bsr	exitall			; exit requested (break)

pubscreen	move.w	nspubsig+6(a4),d1
		bsr	testsig
		beq.s	hotkey
		pea	hotkey(pc)		; return address (if necessary)
		tst.b	wantexit(a4)
		bne	exitall			; exit requested
		tst.b	wanthold(a4)
		bne	instback		; hold requested
		tst.b	wantwindow(a4)
		bne	usewindow		; window requested
		addq.w	#4,sp

hotkey		moveq	#mysigbit,d1
		bsr	testsig
		beq.s	timermsg
		move.l	intuibase(a4),a6	; Screen & window to front
		move.l	wnptr(a4),a2
		tst.b	ownscreen(a4)
		bne.s	1$			; for scr window only activate !
		move.l	a2,a0
		RECALL	WindowToFront
1$		move.l	a2,a0
		RECALL	ActivateWindow
		move.l	46(a2),a0		; Window->Screen frontmost ?
		cmp.l	60(a6),a0
		beq.s	timermsg		; yes, so skip !
		RECALL	ScreenToFront

timermsg	move.w	timersig(a4),d1
		bsr	testsig
		beq.s	intuimsgs
		btst	#8,propinfo(a4)
		bne.s	3$
		tst.b	repeat(a4)
		bne.s	1$
		bsr	showwhat
		bra.s	intuimsgs
1$		move.w	repeatlen(a4),d0
		lea	repeatbuffer(a4),a2
		lea	dummy(a4),a1
		move.w	d0,d1
2$		move.b	(a2)+,(a1)+
		dbra	d1,2$
		bsr	cli
3$		bsr	starttimer

intuimsgs	move.w	intuisig(a4),d1
		bsr	testsig
		beq	processnxtmsg
nextimsg	move.l	wnptr(a4),a0
		move.l	$56(a0),a0
		CALL	GetMsg,sysbase(a4)
		move.l	d0,intuimsg(a4)
		beq	processnxtmsg
		move.l	d0,a0
		move.l	20(a0),d0

		cmp.l	#$200,d0		; CloseWindow
		bne.s	1$
		tst.b	addlines(a4)
		beq	instback		; iconify !
		st	cbreak(a4)
		bra	intuiend

1$		moveq	#2,d1			; ResizeWindow
		cmp.l	d1,d0
		bne.s	1010$
		bsr	setupscreen
		bra	intuiend

1010$		moveq	#$10,d1			; mousemove
		cmp.l	d1,d0
		bne.s	2$
		btst	#8,propinfo(a4)
		bne.s	1004$
		bra.s	1002$

2$		moveq	#4,d1			; refresh
		cmp.l	d1,d0
		bne.s	22$
		bsr	putiline
		bsr	blastout
		bsr	UpdateIArea
		bra.s	1002$

22$		tst.b	addlines(a4)
		bne.s	3$
		moveq	#$20,d1			; gadgetdown
		cmp.l	d1,d0
		bne.s	1000$
		tst.b	getanswer(a4)
		bne.s	3$
		move.l	28(a0),a1
		cmp.w	#3,38(a1)		; Slidebar
		bne.s	1002$
		tst.b	propgadon(a4)
		beq.s	1002$
1004$		bsr	proppos
1002$		bra	intuiend

1000$		moveq	#$40,d1			; gadgetup
		cmp.l	d1,d0
		bne.s	3$
		move.l	28(a0),a1
		cmp.w	#3,38(a1)		; Slidebar ?
		bne.s	1003$
		bclr	#8,propinfo(a4)		; clear 'knop hit' bit
		bra.s	1002$

1003$		bsr	replyintui		; iconify
		bsr	stoptimer
		bra	instback

3$		cmp.l	#$400,d0		; RawKey
		bne	intuiend
		move.w	#$80,d0
		and.w	24(a0),d0
		bne	intuiend
		and.w	#$7f,24(a0)
		lea	ievent(a4),a1
		move.b	#1,4(a1)
		move.l	24(a0),6(a1)
		move.w	26(a0),qualifier(a4)
		move.l	a1,a0
		lea	outevent(a4),a1
		moveq	#20,d1
		suba.l	a2,a2
		CALL	RawKeyConvert,condev(a4)
		tst.l	d0
		beq	intuiend
		lea	inputbuffer(a4),a1
		lea	outevent(a4),a2
		move.w	curpos(a4),d4
		moveq	#0,d3
		tst.b	addlines(a4)
		bne	197$

		cmp.b	#$9b,0(a2)		; SI code
		bne	110$

		cmp.b	#'?',1(a2)		; help
		bne.s	399$
		tst.b	getanswer(a4)
		bne.s	399$
		bsr	stoptimer
		tst.w	bottomin(a4)
		bne.s	398$
		addq.w	#1,bottomin(a4)
		bsr	getcurpos
		clr.w	ibufferlen(a4)
		clr.w	curpos(a4)
		bsr	UpdateIArea
398$		move.w	#usetxt,d0
		bsr	putnamw
		clr.l	lastprinted(a4)
		bsr	blastout
		bra.s	420$

399$		cmp.b	#'C',1(a2)		; cursor right
		bne.s	400$
		cmp.w	ibufferlen(a4),d4
		bge.s	420$
		addq.w	#1,d4
421$		move.w	d4,curpos(a4)
420$		bra	100$

400$		cmp.b	#'D',1(a2)		; cursor left
		bne.s	401$
		subq.w	#1,d4
		bpl.s	421$
		bra.s	420$

401$		cmp.b	#' ',1(a2)
		bne.s	402$
		cmp.b	#'@',2(a2)		; shift right
		bne.s	403$

404$		cmp.w	ibufferlen(a4),d4
		bge.s	421$
		addq.w	#1,d4
		cmp.b	#' ',0(a1,d4.w)
		bne.s	404$
405$		cmp.w	ibufferlen(a4),d4
		bge.s	421$
		addq.w	#1,d4
		cmp.b	#' ',0(a1,d4.w)
		beq.s	405$
		bra.s	421$

403$		cmp.b	#'A',2(a2)		; shift left
		bne.s	420$
406$		tst.w	d4
		beq.s	421$
		subq.w	#1,d4
		cmp.b	#' ',0(a1,d4.w)
		beq.s	406$
407$		tst.w	d4
		beq.s	421$
		subq.w	#1,d4
		cmp.b	#' ',0(a1,d4.w)
		bne.s	407$
		addq.w	#1,d4
		bra.s	421$

402$		cmp.b	#'A',1(a2)		; cursor up
		bne.s	408$
		tst.w	bottomin(a4)
		bne.s	480$
		tst.w	curpos(a4)
		bne.s	480$

		clr.w	curpos(a4)
		clr.w	ibufferlen(a4)
		bsr	UpdateIArea
		bsr	clrcursor
		move.w	edline(a4),d3
		ext.l	d3
		tst.w	d3
		beq.s	481$
		subq.l	#1,d3
		cmp.l	firstline(a4),d3
		bge.s	481$
		move.l	d3,-(sp)
		subq.l	#1,firstline(a4)
		bsr	blastout
		move.l	(sp)+,d3
481$		move.w	d3,edline(a4)
		bsr	getcurpos
		bsr	putcursor
		bra	intuiend
480$		move.l	history(a4),a0
		tst.l	0(a0)
		beq.s	423$
		move.l	curhist(a4),a1
		cmp.l	a0,a1
		beq.s	409$
		move.l	4(a1),d0
		move.l	d0,curhist(a4)
409$		move.l	a1,gothline(a4)
		bsr	copyhistory
423$		bra	100$

408$		cmp.b	#'B',1(a2)		; cursor down
		bne	410$
		tst.w	bottomin(a4)
		bne.s	414$
		tst.w	curpos(a4)
		bne.s	414$

		clr.w	curpos(a4)
		clr.w	ibufferlen(a4)
		bsr	UpdateIArea
		bsr	clrcursor
		move.w	edline(a4),d3
		ext.l	d3
		move.l	numlines(a4),d4
		subq.l	#1,d4
		cmp.l	d4,d3
		beq.s	490$
		move.l	firstline(a4),d2
		add.w	rows(a4),d2
		subq.w	#1,d2
		addq.w	#1,d3
		cmp.w	d2,d3
		ble.s	490$
		move.l	d3,-(sp)
		addq.l	#1,firstline(a4)
		bsr	blastout
		move.l	(sp)+,d3
490$		bra	481$
414$		move.l	curhist(a4),d0
		beq.s	423$
		move.l	d0,a1
		move.l	0(a1),a1
		tst.l	0(a1)
		bne.s	411$
		clr.l	gothline(a4)
		clr.w	curpos(a4)
		clr.w	ibufferlen(a4)
		bra	423$
411$		move.l	a1,curhist(a4)
		bra	409$

410$		cmp.b	#'T',1(a2)		; shift up
		bne.s	412$
		tst.w	hnum(a4)
		beq 	423$
		move.l	history(a4),a1
		move.l	a1,curhist(a4)
		bra	409$

412$		cmp.b	#'S',1(a2)		; shift down
		bne.s	440$
		tst.w	hnum(a4)
		beq	423$
		move.l	history+8(a4),curhist(a4)
		bra.s	414$

440$		cmp.b	#'0',1(a2)		; function keys
		bmi	423$
		cmp.b	#'9',1(a2)
		bgt	423$
		lea	1(a2),a0
		bsr	getnum
		lea	fkeys(a4),a0
441$		move.l	0(a0),a0
		tst.l	0(a0)
		beq	100$
		cmp.b	8(a0),d2
		bne.s	441$
		moveq	#0,d3
		move.w	curpos(a4),d4
		move.b	9(a0),d5
		ext.w	d5
		subq.w	#1,d5
		lea	10(a0),a0
		lea	inputbuffer(a4),a2
		lea	0(a2,d4.w),a2
445$		move.b	(a0)+,d0
		cmp.b	#'^',d0
		bne.s	442$
		moveq	#1,d3
		bra.s	443$
442$		cmp.b	#'_',d0
		bne.s 	444$
		move.b	#' ',d0
444$		move.b	d0,(a2)+
		addq.w	#1,d4
443$		dbra	d5,445$
		move.w	d4,curpos(a4)
		cmp.w	ibufferlen(a4),d4
		ble.s	446$
		move.w	d4,ibufferlen(a4)
446$		tst.w	d3
		beq	100$
		bra	got_fkey

110$		moveq	#0,d3
101$		move.w	curpos(a4),d4
		tst.w	d0
		beq	100$
		cmp.b	#13,0(a2,d3.w)		; return
		beq	got_enter

		cmp.b	#27,0(a2,d3.w)		; esc
		bne	799$
		tst.b	getanswer(a4)
		bne	100$
		clr.b	insmode(a4)
		clr.w	ibufferlen(a4)
		move.w	#200,curpos(a4)
		bsr	UpdateIArea
		clr.w	curpos(a4)
		tst.w	bottomin(a4)
		bne.s	700$
		addq.w	#1,bottomin(a4)
		bsr	getcurpos
		cmp.b	#5,timerstate(a4)
		bne.s	765$
		bsr	starttimer
765$		bra	100$

700$		move.b	timerio+8(a4),timerstate(a4)
		bsr	stoptimer
		moveq	#0,d0
		move.w	edline(a4),d0
		move.l	firstline(a4),d4
		cmp.w	d4,d0
		bmi.s	701$
		move.w	d4,d5
		add.w	rows(a4),d5
		cmp.w	d5,d0
		bmi.s	702$
701$		move.w	rows(a4),d0
		lsr.w	#1,d0
		add.w	d4,d0
702$		move.l	numlines(a4),d3
		subq.w	#1,d3
		cmp.w	d3,d0
		ble.s	703$
		move.w	d3,d0
703$		move.w	d0,edline(a4)
		sub.w	d4,d0
		mulu	txheight(a4),d0
		add.w	firstpos(a4),d0		; BarHeight+FontHeight !
		move.w	d0,cposy(a4)
		clr.w	bottomin(a4)
		tst.w	loffset(a4)
		beq.s	704$
		clr.w	loffset(a4)
		bsr	blastout
704$		bra	100$

799$		cmp.b	#8,0(a2,d3.w)		; Backspace
		bne.s	114$
		tst.w	d4
		beq.s	179$
		bsr	delchar
		subq.w	#1,d4
		move.w	d4,curpos(a4)
		bra.s	179$

114$		cmp.b	#127,0(a2,d3.w)		; Del
		bne.s	150$
178$		cmp.w	ibufferlen(a4),d4
		bge.s	179$
		addq.w	#1,d4
		bsr	delchar
179$		bra	102$

150$		cmp.b	#9,0(a2,d3.w)		; Tab
		bne	197$
		move.w	oldpos(a4),d1
		lea	inputbuffer(a4),a2
		move.b	newtab(a4),oldtab(a4)
		beq.s	152$			; previous tab
		clr.b	newtab(a4)
		move.w	cmdcomplen(a4),d0
		add.w	d1,d0
		lea	0(a2,d0.w),a0
		move.w	cmdcplen(a4),d0
		lea	0(a0,d0.w),a1
151$		move.b	(a1)+,(a0)+		; restore old cmdline
		bne.s	151$
		sub.w	d0,ibufferlen(a4)
		tst.w	curpos(a4)
		beq.s	155$
		move.w	ibufferlen(a4),curpos(a4)
		bra.s	155$			; search next cmd

152$		move.w	ibufferlen(a4),d0
		move.l	a2,a0
		bsr	tolower			; ibuffer to lower case
		move.w	curpos(a4),d0
		move.w	d0,d1
		beq.s	1532$
153$		cmp.b	#' ',-1(a2,d1.w)	; search down
		beq.s	1531$
		subq.w	#1,d1
		bne.s	153$
1531$		move.w	d1,d0
1532$		cmp.b	#' ',0(a2,d0.w)		; search up
		beq.s	154$
		addq.w	#1,d0
		cmp.w	ibufferlen(a4),d0
		bcs.s	1532$
154$		sub.w	d1,d0
		move.w	d0,cmdcomplen(a4)	; chars to cmp
		move.w	d1,oldpos(a4)		; cmp pos (for next tab)
		clr.w	cmdcompnr(a4)
155$		lea	0(a2,d1.w),a2

156$		tst.b	newtab(a4)
		bne.s	169$			; found a cmd
		move.w	cmdcompnr(a4),d0
		bsr	getcmdptr
		move.l	d0,a0
		move.l	a2,a1
		move.w	cmdcomplen(a4),d1
		subq.w	#1,d1
157$		move.b	(a0)+,d0		; comp cmd <-> ibuffer
		beq.s	163$
		cmp.b	(a1)+,d0
		bne.s	163$
		dbra	d1,157$

		moveq	#-1,d0
158$		addq.w	#1,d0
		tst.b	0(a0,d0.w)
		bne.s	158$
		tst.w	d0
		beq.s	162$			; nothing to copy !
		move.l	a1,a2
159$		tst.b	(a2)+
		bne.s	159$
160$		move.b	-(a2),0(a2,d0.w)
		cmp.l	a2,a1
		bcs.s	160$
		move.w	d0,-(sp)
161$		move.b	-1(a0,d0.w),-1(a1,d0.w)
		subq.w	#1,d0
		bne.s	161$
		move.w	(sp)+,d0
		tst.w	curpos(a4)
		beq.s	162$			; was zero
		add.w	d0,curpos(a4)
162$		add.w	d0,ibufferlen(a4)
		move.w	ibufferlen(a4),oldibuflen(a4)
		move.w	d0,cmdcplen(a4)
		st	newtab(a4)

163$		addq.w	#1,cmdcompnr(a4)	; next cmd
		moveq	#cmdnum-1,d0
		sub.w	cmdcompnr(a4),d0
		bcc.s	156$			; not ready
		clr.w	cmdcompnr(a4)
		tst.b	oldtab(a4)
		bne.s	156$			; prev tab
169$		bra	100$			; end it

197$		cmp.b	#3,0(a2,d3.w)		; ctrl c
		bne.s	104$
		st	cbreak(a4)

104$		tst.b	addlines(a4)
		bne	rintui
		cmp.b	#$18,0(a2,d3.w)		; ctrl x
		bne.s	300$
		clr.w	ibufferlen(a4)
		clr.w	curpos(a4)
		bra.s	169$

300$		cmp.b	#$b,0(a2,d3.w)		; ctrl k
		bne.s	106$
		move.w	curpos(a4),ibufferlen(a4)
		bra.s	169$

106$		move.w	#$100,d5		; NumPad
		and.w	qualifier(a4),d5
		beq	105$
		move.l	firstline(a4),d5

		cmp.b	#'7',0(a2,d3.w)		; 'Home'
		bne.s	200$
		moveq	#0,d5
199$		cmp.l	firstline(a4),d5
		beq.s	196$
		move.l	d5,firstline(a4)
		bsr	blastout
		tst.w	bottomin(a4)
		bne.s	196$
		move.w	edline(a4),d0
		move.l	firstline(a4),d1
		cmp.w	d1,d0
		bmi.s	190$
		add.w	rows(a4),d1
		cmp.w	d1,d0
		bmi.s	192$
190$		clr.w	curpos(a4)
		clr.w	ibufferlen(a4)
		move.w	rows(a4),d0
		lsr.w	#1,d0
		ext.l	d0
		add.l	firstline(a4),d0
		cmp.l	numlines(a4),d0
		bmi.s	191$
		move.l	numlines(a4),d0
		subq.w	#1,d0
191$		move.w	d0,edline(a4)
192$		bsr	getcurpos
		bsr	UpdateIArea
196$		bra	100$

200$		cmp.b	#'8',0(a2,d3.w)		; 'up arrow'
		bne.s	201$
		tst.w	d5
		beq	100$
		subq.w	#1,d5
1990$		bra.s	199$

201$		cmp.b	#'9',0(a2,d3.w)		; 'PgUp'
		bne.s	203$
		sub.w	rows(a4),d5
		bpl.s	1990$
		moveq	#0,d5
		bra.s	1990$

203$		cmp.b	#'1',0(a2,d3.w)		; 'End'
		bne.s	205$
222$		move.l	numlines(a4),d5
		sub.w	rows(a4),d5
		bpl	199$
		moveq	#0,d5
204$		bra	199$

205$		cmp.b	#'2',0(a2,d3.w)		; 'down arrow'
		bne.s	206$
		move.l	d5,d2
		add.w	rows(a4),d2
		cmp.l	numlines(a4),d2
		bge	100$
		addq.w	#1,d5
		bra	199$

206$		cmp.b	#'3',0(a2,d3.w)		; 'PgDn'
		bne.s	500$
		add.w	rows(a4),d5
		move.l	d5,d2
		add.w	rows(a4),d2
		cmp.l	numlines(a4),d2
		bge.s	222$
		bra	199$

500$		cmp.b	#'4',0(a2,d3.w)		; left arrow
		bne.s	501$
		tst.w	bottomin(a4)
		beq	102$
		move.w	loffset(a4),d2
		sub.w	colms(a4),d2
		bpl.s	502$
		moveq	#0,d2
502$		move.w	d2,loffset(a4)
		bsr	blastout
		bra	100$

501$		cmp.b	#'6',0(a2,d3.w)		; right arrow
		bne.s	170$
		tst.w	bottomin(a4)
		beq.s	102$
		move.w	loffset(a4),d2
		add.w	colms(a4),d2
		bra.s	502$

170$		cmp.b	#'0',0(a2,d3.w)		; Ins
		bne.s	177$
		not.b	insmode(a4)
		bra.s	102$

177$		cmp.b	#'.',0(a2,d3.w)		; Del
		beq	178$
105$		tst.w	bottomin(a4)
		bne.s	777$
		tst.w	curpos(a4)
		bne.s	777$
		movem.l	d0/d1,-(sp)
		move.w	edline(a4),d0
		bsr	findline
		movem.l	(sp)+,d0/d1
		tst.l	8(a5)
		beq	intuiend
777$		move.w	curpos(a4),d5
		ext.l	d5
		moveq	#79+40,d2
		cmp.w	d2,d5
		bge.s	102$
		tst.b	insmode(a4)
		beq.s	172$
		cmp.w	ibufferlen(a4),d5
		bmi.s	171$
		bra.s	173$
172$		sub.w	d5,d2
		lea	80+40(a1),a5
		lea	79+40(a1),a3
103$		move.b	-(a3),-(a5)
		dbra	d2,103$
173$		addq.w	#1,ibufferlen(a4)
171$		move.b	0(a2,d3),0(a1,d5)
		addq.w	#1,curpos(a4)
102$		subq.w	#1,d0
		addq.w	#1,d3
		bra	101$

100$		bsr	UpdateIArea
		bra	intuiend

got_enter	bsr	puthist
got_fkey	bsr	stoptimer
		clr.b	insmode(a4)
		lea	dummy(a4),a1
		lea	inputbuffer(a4),a2
		move.w	ibufferlen(a4),d2
		beq.s	2$
		tst.w	bottomin(a4)
		bne.s	5$
		movem.l	a1/a2,-(sp)
		move.w	edline(a4),d0
		bsr	findline
		move.l	8(a5),d0
		bsr	gthex
		lea	hexarea(a4),a0
		lea	0(a2,d2.w),a1
		move.b	#' ',(a1)+
		move.b	#'$',(a1)+
		moveq	#8,d0
		CALL	CopyMem,sysbase(a4)
		moveq	#10,d2
		add.w	ibufferlen(a4),d2
		move.w	d2,ibufferlen(a4)
		movem.l	(sp)+,a1/a2
5$		subq.w	#1,d2
1$		move.b	(a2)+,(a1)+
		dbra	d2,1$
2$		move.b	#10,(a1)+
		move.w	ibufferlen(a4),d0
		addq.w	#1,d0
		move.w	d0,-(sp)
		clr.w	ibufferlen(a4)
		tst.w	bottomin(a4)
		bne.s	4$
		move.w	#100,curpos(a4)
		bsr	UpdateIArea
4$		clr.w	curpos(a4)
		move.w	#1,bottomin(a4)
		bsr	getcurpos
		bsr	UpdateIArea
		move.w	(sp)+,d0		; needed for cli
		move.w	d0,repeatlen(a4)
		clr.b	repeat(a4)
		clr.b	printed(a4)
		tst.b	getanswer(a4)
		bne.s	rintui
6$		bsr	cli
		tst.b	printed(a4)
		bne.s	intuiend
		bsr	starttimer
intuiend	bsr.s	replyintui
		move.w	ibufferlen(a4),d0
		cmp.w	oldibuflen(a4),d0
		beq.s	1$			; nothing changed
		clr.b	newtab(a4)
1$		bra	nextimsg

processnxtmsg	tst.b	addlines(a4)
		bne.s	rintui
		tst.b	propupdate(a4)
		beq.s	1$
		clr.b	propupdate(a4)
		tst.b	propgadon(a4)
		beq.s	1$
		bsr.s	setprop
1$		bra	processmsgs

replyintui	move.l	intuimsg(a4),d0
		beq.s	rintui
		move.l	d0,a1
		CALL	ReplyMsg,sysbase(a4)
		clr.l	intuimsg(a4)
rintui		rts

; propgadget code
setprop		btst	#8,propinfo(a4)		; update slider position and size
		bne.s	setprop-2
		moveq	#0,d0
		CALL	LockIBase,intuibase(a4)
		move.l	d0,a0
		move.l	wnptr(a4),a1		; see if the user hit the
						; scrollbar in the meantime
		move.l	86(a1),a1		; wn->UserPort
		lea	20(a1),a1		; Userport->MsgList
		moveq	#$20,d1
5$		move.l	0(a1),a1
		move.l	0(a1),d2		; more pending messages ?
		beq.s	6$
		cmp.l	20(a1),d1		; gadgetdown ?
		bne.s	5$
		move.l	28(a1),a2
		cmp.w	#3,38(a2)		; scrollbar ?
		bne.s	5$

6$		RECALL	UnlockIBase		; a0=ilock
		tst.l	d2			; used as flag (see above)!
		bne.s	4$

7$		move.l	numlines(a4),d5
		moveq	#-1,d4			; VertBody = rows*MAXBODY/numlines
		move.w	rows(a4),d3
		cmp.w	d5,d3
		bge.s	1$
		move.w	d3,d4
		mulu	#$ffff,d4
		divu	d5,d4

1$
;		moveq 	#0,d2			; VertPot = firstline*MAXPOT/(numlines-rows)
		sub.w	d3,d5
		ble.s	2$
		move.l	firstline(a4),d2
		mulu	#$ffff,d2
		divu	d5,d2

2$		cmp.w	propinfo+8(a4),d4	; did something change ?
		bne.s	3$
		cmp.w	propinfo+4(a4),d2
		beq.s	4$

3$		moveq	#1|4,d0
		moveq	#0,d1
		moveq	#-1,d3
		moveq	#1,d5
		lea	sbgadget(a4),a0
		move.l	wnptr(a4),a1
		suba.l	a2,a2
		RECALL	NewModifyProp
4$		rts

proppos		move.w	propinfo+4(a4),d0	; get slider position and
		move.l	numlines(a4),d1		; update window if necessary
		sub.w	rows(a4),d1
		ble.s	1$
		moveq	#0,d3			; firstline=VertPot/(MAXPOT/numlines-rows)
		not.w	d3
		divu	d1,d3
		divu	d3,d0
		ext.l	d0
		cmp.l	firstline(a4),d0
		beq.s	1$
		move.l	d0,firstline(a4)
		bsr	blastout		; update screem
1$		rts

;put an input line into the history buffer
puthist		move.w	ibufferlen(a4),d5
		move.l	d5,d0
		cmp.w	minnumchars(a4),d0
		bcs.s	1$
		move.l	gothline(a4),d1
		beq.s	5$
		move.l	d1,a2
		cmp.w	8(a2),d5
		bne.s	5$
		lea	10(a2),a2
		lea	inputbuffer(a4),a1
		subq.w	#1,d0
6$		cmp.b	(a2)+,(a1)+
		bne.s	5$
		dbra	d0,6$
		move.l  gothline(a4),curhist(a4)
		bra.s	1$

5$		moveq	#10,d0
		add.w	d5,d0
		ext.l	d0
		moveq	#1,d1
		swap	d1			; MEMF_CLEAR
		CALL	AllocMem,sysbase(a4)
		move.l	d0,a0
		move.l	a0,d0
		beq.s	1$
		move.w	d5,8(a0)
		lea	10(a0),a2
		subq.w	#1,d5
		lea	inputbuffer(a4),a1
2$		move.b	(a1)+,(a2)+
		dbra	d5,2$
		move.w	hnum(a4),d5
		cmp.w	maxhlines(a4),d5
		bmi.s	3$
		bsr	remhistline
		bra.s	4$
3$		addq.w	#1,d5
		move.w	d5,hnum(a4)
4$		move.l	d0,a1
		lea	history(a4),a0
		move.l	a1,curhist(a4)
		CALL	AddTail,sysbase(a4)
1$		clr.l	gothline(a4)
		rts

;copy a history line into the input buffer
copyhistory	lea	inputbuffer(a4),a0
		move.w	8(a1),d3
		ext.l	d3
		move.w	d3,curpos(a4)
		move.w	d3,ibufferlen(a4)
		subq.w	#1,d3
		lea	10(a1),a1
1$		move.b	(a1)+,(a0)+
		dbra	d3,1$
		rts

;remove one line from the history buffer (preserve d0!)
remhistline	move.l	d0,-(sp)
		lea 	history(a4),a0
		CALL	RemHead,sysbase(a4)
		move.l	d0,a1
		move.l	a1,d0
		beq.s	1$
		moveq	#10,d0
		add.w	8(a1),d0
		RECALL	FreeMem
1$		move.l	(sp)+,d0
		rts

;kill all history lines
killhistory	bsr.s	remhistline
		move.l	history(a4),a0
		tst.l	0(a0)
		bne.s	killhistory
2$		clr.w	hnum(a4)
		clr.l	curhist(a4)
		rts

;delete one char from the input line
delchar		lea	inputbuffer(a4),a3
		lea 	0(a3,d4.w),a3
		lea 	-1(a3),a5
		move.w	d4,d5
1$		cmp.w	#78+40,d5
		bge.s	2$
		move.b	(a3)+,(a5)+
		addq.w	#1,d5
		bra.s	1$
2$		subq.w	#1,ibufferlen(a4)
		rts

testsig		move.l	tasksigs(a4),d0
		btst	d1,d0
		rts

;Update the current position of the input line
getcurpos	moveq	#0,d3
		move.w	ipos(a4),d3
		tst.w	bottomin(a4)
		bne.s	1$
		move.w	edline(a4),d3
		sub.l	firstline(a4),d3
		mulu	txheight(a4),d3
		add.w	firstpos(a4),d3		; BarHeight+FontHeight !
1$		move.w	d3,cposy(a4)
		rts

;rebuild the window from scratch
setupscreen	move.l	rastport(a4),a1
		moveq	#0,d0
		CALL	SetRast,gfxbase(a4)
		move.l	intuibase(a4),a6
		moveq	#1,d0
		bsr	setnewprop		; does a RefreshWindowFrame()
		bsr	getwindowsize
		tst.w	bottomin(a4)
		bne.s	1$
		move.w	edline(a4),d0
		move.l	firstline(a4),d1
		move.w	rows(a4),d2
		move.w	d2,d4
		move.w	numlines(a4),d3
		add.w	d1,d2
		cmp.w	d2,d0
		bmi.s	2$
		lsr.w	#1,d4
		sub.w	d4,d0
		ext.l	d0
		move.l	d0,firstline(a4)
2$		bsr	tstfirstlin
1$		bsr.s	getcurpos
		bsr	putiline
		bsr	blastout
		bsr.s	UpdateIArea
		move.w	rows(a4),currenty(a4)
		rts

;refresh the input area
UpdateIArea	movem.l	a2/a6,-(sp)		; to change !
		move.l	rastport(a4),a2
		move.l	gfxbase(a4),a6
		moveq	#1,d0
		move.l	a2,a1
		RECALL	SetAPen
		moveq	#1,d0
		move.l	a2,a1
		RECALL	SetDrMd
		moveq	#2,d0
		add.b	bleft(a4),d0
		move.w	cposy(a4),d1
		move.l	a2,a1
		RECALL	Move
		lea	inputbuffer(a4),a0
		move.w	ibufferlen(a4),d0
		ext.l	d0
		move.w	colms(a4),d1
		sub.w	bottomin(a4),d1
		cmp.w	d1,d0
		bmi.s	1$
		move.w	d1,d0
1$		move.w	d0,d2
		move.l	a2,a1
		RECALL	Text
		tst.w	bottomin(a4)
		bne.s	3$
		move.w	edline(a4),d0
		bsr	findline
		move.w	12(a5),d3
		sub.w	d2,d3
		bmi.s	3$
		move.w	colms(a4),d1
		sub.w	d2,d1
		bmi.s	2$
		cmp.w	d1,d3
		ble.s	4$
		move.w	d1,d3
4$		move.w	d3,d0
		lea	14(a5,d2.w),a0
		move.l	a2,a1
		RECALL	Text
		add.w	ibufferlen(a4),d3
		move.w	d3,d2
3$		move.w	colms(a4),d0
		sub.w	bottomin(a4),d0
		move.l	blanks(a4),a0
		ext.l	d0
		sub.w	d2,d0
		bmi.s	2$
		lea	0(a0,d2.w),a0
		move.l	a2,a1
		RECALL	Text
2$		bsr.s	putcursor
		movem.l	(sp)+,a2/a6
		rts

clrcursor	moveq	#1,d7
		bra.s	ptc1
putcursor	moveq	#1+2+4,d7
ptc1		move.w	colms(a4),d0
		sub.w	bottomin(a4),d0
		subq.w	#1,d0
		cmp.w	curpos(a4),d0
		bmi.s	1$
		move.l	d7,d0
		move.l	rastport(a4),a1
		CALL	SetDrMd,gfxbase(a4)
		moveq	#0,d0
		move.w	curpos(a4),d0
		mulu	txwidth(a4),d0
		moveq	#2,d1
		add.b	bleft(a4),d1
		add.w	d1,d0
		move.w	cposy(a4),d1
		move.l	rastport(a4),a1
		RECALL	Move
		moveq	#1,d0
		lea	oneblank(a4),a0
		move.l	rastport(a4),a1
		RECALL	Text
1$		rts

putiline	movem.l	d2/d3/a2,-(sp)
		move.l	rastport(a4),a2
		move.l	wnptr(a4),a5
		move.l	gfxbase(a4),a6
		moveq	#1,d0
		move.l	a2,a1
		RECALL	SetDrMd
		moveq	#1,d0
		move.w	ipos(a4),d2
		sub.w	txheight(a4),d2
		moveq	#0,d3			; counter
		tst.b	ownscreen(a4)
		bne.s	2$
		tst.b	post_V34(a4)
		beq.s	2$
		moveq	#1,d3			; counter
2$		move.l	a2,a1
		RECALL	SetAPen
		moveq	#0,d0
		add.b	54(a5),d0
		move.w	d2,d1
		move.l	a2,a1
		RECALL	Move
		move.w	8(a5),d0
		tst.b	post_V34(a4)
		beq.s	1$			; to the end
		moveq	#0,d1
		move.b	56(a5),d1
		sub.w	d1,d0
1$		move.w	d2,d1
		move.l	a2,a1
		RECALL	Draw
		subq.w	#1,d2
		moveq	#2,d0
		dbra	d3,2$
		movem.l	(sp)+,d2/d3/a2
		rts

readline	moveq	#'n',d0
		tst.b	fromfile(a4)
		bne.s	1$
		move.l	#31000,firstline(a4)
		bsr	blastout
		st	getanswer(a4)
		bsr	replyintui
5$		bsr	processmsgs
		move.w	d0,d5
		bsr	replyintui
		subq.w	#1,d5
		beq.s	5$
		clr.b	getanswer(a4)
		bsr.s	RestoreOutput
		moveq	#$20,d0
		or.b	inputbuffer(a4),d0		; lower case
1$		rts

ResumeOutput	move.l	outchain(a4),d0
		move.l	d0,a1
		beq.s	2$
		move.l	numlines(a4),oldnumlines(a4)
		move.l	firstline(a4),oldfirstline(a4)
4$		tst.l	0(a1)
		beq.s	3$
		move.l	0(a1),a1
		bra.s	4$
3$		move.l	a1,lastprinted(a4)
2$		move.l	a1,oldpageend(a4)
		rts

RestoreOutput	move.l	oldpageend(a4),d3
		beq.s	1$
		move.l	oldnumlines(a4),numlines(a4)
		move.l	oldfirstline(a4),firstline(a4)
		move.l	oldlastprinted(a4),lastprinted(a4)
		move.l	d3,a1
		move.l	0(a1),a1
		bsr	killlines
		move.l	d3,a1
		clr.l	0(a1)
		bsr.s	blastout
1$		rts

;kill the remainder of the output buffer
killlines	move.l	sysbase(a4),a6
1$		move.l	0(a1),-(sp)
		moveq	#14,d0
		add.w	12(a1),d0
		RECALL	FreeMem
		move.l	(sp)+,d1
		move.l	d1,a1
		bne.s	1$
		rts

;Kill output buffer
killpage	movem.l	d0-d7/a0-a6,-(sp)
		move.l	outchain(a4),d1
		beq.s	1$
		move.l	d1,a1
		bsr.s	killlines
		clr.l	outchain(a4)
		clr.l	lastprinted(a4)
		clr.l	numlines(a4)
		clr.w	maxllength(a4)
1$		movem.l	(sp)+,d0-d7/a0-a6
		rts

;write a portion of the output buffer to the screen
blastout	move.l	rastport(a4),a1
		moveq	#1,d0
		CALL	SetAPen,gfxbase(a4)
		move.l	rastport(a4),a1
		moveq	#1,d0
		CALL	SetDrMd,gfxbase(a4)
		moveq	#0,d7

		move.w	loffset(a4),d2
		beq.s	7$
		move.w	colms(a4),d4
		add.w	d4,d2
		move.w	maxllength(a4),d3
		cmp.w	d3,d2
		ble.s	7$
		move.w	d3,d2
		sub.w	d4,d2
		bpl.s	8$
		moveq	#0,d2
8$		move.w	d2,loffset(a4)

7$		bsr.s	tstfirstlin

1$		tst.l	outchain(a4)
		beq.s	3$
		bsr.s	findline

2$		move.w	colms(a4),d5
		ext.l	d5
		move.w	loffset(a4),d4
		ext.l	d4
		move.w	firstpos(a4),d6		; BarHeight+FontHeight !

6$		lea	14(a5,d4.w),a0
		move.w	12(a5),d3
		ext.l	d3
		bsr.s	blastline
		blt.s	9$
		move.w	rows(a4),currenty(a4)
		bra.s	5$
9$		tst.l	0(a5)
		beq.s	5$
		move.l	0(a5),a5
		bra.s	6$
5$		cmp.w	rows(a4),d7
		bcc.s	3$
10$		moveq	#0,d3
		bsr.s	blastline
		bcs.s	10$
3$		st	propupdate(a4)
		rts

;get a pointer to a line  (line # in d0)
findline	move.l	outchain(a4),d1
		beq.s	2$
		move.l	d1,a5
1$		tst.w	d0
		beq.s	2$
		tst.l	0(a5)
		beq.s	2$
		move.l	0(a5),a5
		dbra	d0,1$
2$		rts

;check if the display is as 'full' as possible
tstfirstlin	move.l	firstline(a4),d0
		move.l	d0,d2
		add.w	rows(a4),d2
		cmp.l	numlines(a4),d2
		bmi.s	1$
		move.l	numlines(a4),d2
		sub.w	rows(a4),d2
		bpl.s	4$
		moveq	#0,d2
4$		move.l	d2,d0
		move.l	d2,firstline(a4)
1$		rts

;display one line, fill the gap between the end of the line and
;the end of the window with spaces.
;d6=ypos, d5=colms, d3=linelength, d7=line # in window, a0=text

blastline	move.l	gfxbase(a4),a6
		moveq	#2,d0
		add.b	bleft(a4),d0
		move.w	d6,d1
		move.l	rastport(a4),a1
		RECALL	Move
		sub.w	d4,d3
		bpl.s	7$
		moveq	#0,d3
		bra.s	6$
7$		cmp.w	d5,d3
		bmi.s	4$
		move.w	d5,d3
4$		move.l	d3,d0
		beq.s	6$
		move.l	rastport(a4),a1
		RECALL	Text
6$		move.l	d5,d0
		sub.l	d3,d0
		ble.s	5$
		move.l	blanks(a4),a0
		move.l	rastport(a4),a1
		RECALL	Text
5$		add.w	txheight(a4),d6
		addq.w	#1,d7
		cmp.w	rows(a4),d7
		rts

addline		movem.l	d0-d6/a0-a3,-(sp)
		move.l	gfxbase(a4),a6
		move.l	rastport(a4),a1
		moveq	#1,d0
		RECALL	SetAPen
		move.l	rastport(a4),a1
		moveq	#1,d0
		RECALL	SetDrMd
		move.w	currenty(a4),d6
		cmp.w	rows(a4),d6
		bmi.s	1$
		bsr.s	cls
1$		moveq	#0,d7
		move.w	currenty(a4),d7
		move.l	d7,d6
		mulu	txheight(a4),d6
		add.w	firstpos(a4),d6		; BarHeight+FontHeight !
		move.w	colms(a4),d5
		moveq	#0,d4
		move.l	lastprinted(a4),a0
		move.w	12(a0),d3
		lea	14(a0),a0
		bsr	blastline
		addq.w	#1,currenty(a4)
		move.l	#31000,firstline(a4)
		movem.l	(sp)+,d0-d6/a0-a3
		rts

cls		movem.l d0-d6/a0-a3,-(sp)
		move.l	gfxbase(a4),a6
		moveq	#1,d0
		move.l	rastport(a4),a1
		RECALL	SetAPen
		moveq	#1,d0
		move.l	rastport(a4),a1
		RECALL	SetDrMd
		move.w	colms(a4),d5
		moveq	#0,d2
1$		move.w	d5,d7
		move.l	d2,d6
		mulu	txheight(a4),d6
		add.w	firstpos(a4),d6		; BarHeight+FontHeight !
		moveq	#0,d3
		move.l	blanks(a4),a0
		bsr	blastline
		addq.w	#1,d2
		cmp.w	rows(a4),d2
		bcs.s	1$
		clr.w	currenty(a4)
		movem.l	(sp)+,d0-d6/a0-a3
		rts

createscreen	lea	buffer(a4),a2
		moveq	#80,d0
		moveq	#1,d1
		move.l	a2,a0
		sub.l	a1,a1
		RECALL	GetScreenData
		move.w	12(a2),newscreen+4(a4)	; width
		move.w	76(a2),newscreen+12(a4)	; viewmode
		tst.b	post_V34(a4)
		beq.s	1$
		suba.l	a0,a0			; examine default pubscreen
		RECALL	LockPubScreen
		move.l	d0,a2
		move.l	a2,d0
		beq.s	1$
		move.l	a6,-(sp)
		lea	44(a2),a0
		CALL	GetVPModeID,gfxbase(a4)	; for DisplayID !
		move.l	(sp)+,a6
		move.l	d0,nsdisplay+4(a4)
		suba.l	a0,a0
		move.l	a2,a1
		RECALL	UnlockPubScreen
1$		lea	newscreen(a4),a0	; Kick 2.0+ with ens_Extension
		RECALL	OpenScreen
		move.l	d0,screenptr(a4)
		move.l	d0,nwscreen(a4)
		beq.s	setupwindow
		move.l	d0,a0
		clr.l	newwindow(a4)
		move.l	12(a0),newwindow+4(a4)	; width+height
		move.w	#$474,nwflgs+2(a4)	; IDCMP
		move.l	#$11940,nwflgs+4(a4)	; Flags
		move.w	#$f,nwtype(a4)
		st	ownscreen(a4)
		tst.b	post_V34(a4)
		beq.s	setupwindow
		moveq	#0,d0
		RECALL	PubScreenStatus		; make screen public

setupwindow	tst.b	ownscreen(a4)
		bne.s	3$			; don't setup wb window values
		move.l	window_l(a4),newwindow(a4)
		move.l	window_w(a4),newwindow+4(a4)
		move.w	#$676,nwflgs+2(a4)	; IDCMP
		move.l	#$5104f,nwflgs+4(a4)	; $40000 - WFLG_NW_EXTENDED
		move.w	#1,nwtype(a4)
3$		lea	newwindow(a4),a0
		RECALL	OpenWindow		; Kick 2.0+ with enw_Extension
		move.l	d0,wnptr(a4)
		beq	stopall			; no window !!!
		move.l	d0,a0
		move.l	50(a0),rastport(a4)	; wn->RPort
		move.l	86(a0),a1		; wn->UserPort
		moveq	#0,d1
		move.b	15(a1),d1		; MsgPort->SigBit
		move.w	d1,intuisig(a4)

		tst.b	ownscreen(a4)
		bne.s	2$
		tst.b	iconifyon(a4)
		beq.s	2$
		tst.b	post_V34(a4)
		bne.s	2$
		lea	iconifgad(a4),a1	; a0 - still wnptr !
		moveq	#0,d0
		RECALL	AddGadget

2$		bsr	setwintitle
		bsr	setreqfont		; set requested font
		moveq	#0,d0
		bsr.s	setnewprop

		move.l	wnptr(a4),a0
		move.l	46(a0),a0		; our scr ptr
		cmp.l	60(a6),a0		; ib_FirstScreen
		beq.s	1$			; our screen is frontmost
		RECALL	ScreenToFront

1$		bsr	getcurpos
		bsr	putiline
		bsr	UpdateIArea
		bsr	starttimer
		bsr	showwhat
		rts

setnewprop	tst.b	propgadon(a4)		; resize propgadget !
		beq.s	1$
		move.l	wnptr(a4),a0
		lea	sbgadget(a4),a1
		tst.w	d0
		beq.s	3$			; no gadget !
		movem.l	a0/a1,-(sp)
		RECALL	RemoveGadget		; remove gadget from window
		movem.l	(sp)+,a0/a1
3$		move.w	txheight(a4),d0
		move.w	firstpos(a4),d1 
		sub.w	d0,d1			; barheight:=firstpos-txheight
		addq.w	#1,d1
		move.w	d1,6(a1)		; topedge
		add.w	d0,d1
		lsr.w	#1,d0
		add.b	57(a0),d0
		add.w	d0,d1			; +FontHeight*1.5
		neg.w	d1
		move.w	d1,10(a1)		; height
		moveq	#14,d1
		move.b	56(a0),d0
		beq.s	2$			; use default value
		move.b	d0,d1
2$		subq.w	#2,d1
		move.w	d1,8(a1)		; with
		neg.w	d1
		move.w	d1,4(a1)		; leftedge
		moveq	#0,d0
		RECALL	AddGadget
1$		move.l	wnptr(a4),a0
		jmp	_LVORefreshWindowFrame(a6)

setreqfont	move.l	a6,-(sp)
		move.l	gfxbase(a4),a6
		tst.b	topaz(a4)		; use 'old' system font ?
		beq.s	3$
		move.l	topazfont(a4),d0	; already open ?
		bne.s	2$
		lea	tattr(a4),a0		; try topaz/8
		RECALL	OpenFont
		move.l	d0,topazfont(a4)	; got ?
		bne.s	2$
3$		move.l	ownfont(a4),d0		; own 'my' font ?
		bne.s	2$
		move.l	154(a6),d0		; GfxBase->DefaultFont
2$		move.l	d0,a0
		move.l	rastport(a4),a1
		RECALL	SetFont
		move.l	wnptr(a4),a0
		move.l	46(a0),a1		; Window->Screen
		move.b	30(a1),d1		; Screen->BarHeight
		ext.w	d1
		move.b	54(a0),bleft(a4)
		move.l	50(a0),a1		; Window->RastPort
		move.w	58(a1),txheight(a4)
		move.w	60(a1),txwidth(a4)
		add.w	txheight(a4),d1
		move.w	d1,firstpos(a4)
		bsr.s	getwindowsize
1$		move.l	(sp)+,a6
		rts

getwindowsize	bsr.s	freeblank

		move.l	wnptr(a4),a0

		move.w	txheight(a4),d0
		lsr.w	#1,d0			; FontHeight*0.5
		add.b	57(a0),d0
		neg.w	d0
		add.w	10(a0),d0
		move.w	d0,ipos(a4)		; input area position

		moveq	#0,d6
		move.w	txheight(a4),d6
		lsr.w	#1,d6
		add.w	firstpos(a4),d6
		neg.w	d6
		add.w	d0,d6			; rows=(ipos-firstpos-0.5*txheight)/txheight
		divu	txheight(a4),d6
		move.w	d6,rows(a4)

		moveq	#0,d6
		move.b	54(a0),d6
		add.b	56(a0),d6
		bne.s	3$
		tst.b	propgadon(a4)
		beq.s	3$
		move.w	sbgadget+8(a4),d6
3$		addq.w	#4,d6
		neg.w	d6
		add.w	8(a0),d6
		divu	txwidth(a4),d6		; colms=(width-lborder-rborder)/txwidth
		move.w	d6,colms(a4)

		moveq	#0,d0
		move.w	d6,d0
		moveq	#0,d1
		CALL	AllocMem,sysbase(a4)
		move.l	d0,blanks(a4)
		move.l	d0,a0
		moveq	#' ',d0
		bra.s	1$
2$		move.b	d0,(a0)+
1$		dbra	d6,2$
		rts

freeblank	move.l	blanks(a4),d0
		beq.s	1$
		move.l	d0,a1
		moveq	#0,d0
		move.w	colms(a4),d0
		CALL	FreeMem,sysbase(a4)
		clr.l	blanks(a4)
1$		rts

setwintitle	lea	winkeybuf(a4),a3	; show hotkey in window title
		lea	defhotkey(a4),a2
		move.l	broker(a4),d0
		beq.s	2$			; no commodity !
		move.l	d0,a0
		moveq	#0,d0
		tst.b	cxstate(a4)
		beq.s	4$			; commodity off
		moveq	#1,d0
		lea	hotkeybuf(a4),a2
4$		CALL	ActivateCxObj,cxbase(a4)
3$		move.l	(a2),d1
		and.l	#$dfdfdfdf,d1
		cmp.l	#'RAWK',d1
		bne.s	2$			; not rawkey as ieclass
		addq.w	#7,a2			; skip ieclass (hopefully)
2$		move.l	a2,-(sp)
		pea	copyright(a4)
		pea	verstring(a4)
		move.l	sp,a1
		lea	namefmt(a4),a0
		lea	sc_put(pc),a2
		CALL	RawDoFmt,sysbase(a4)	; fill buffer
		lea	12(sp),sp
		move.l	wnptr(a4),a0
		move.l	a3,a1
		movea.w	#-1,a2
		tst.b	ownscreen(a4)
		beq.s	1$			; don't change scr title
		suba.l	a1,a1
		move.l	a3,a2
1$		move.l	intuibase(a4),a6
		jmp	_LVOSetWindowTitles(a6)	; leave with intuibase in a6 !

sc_put		move.b	d0,(a3)+		; for RawDoFmt()
		rts

usetopaz	lea	topaz(a4),a2
		bsr	onoff
usetopaz2	tst.b	fromfile(a4)
		bne.s	usetopaz-2		; hack !
		bsr	setreqfont
		bra	setupscreen		; rebuild all

usescreen	tst.b	ownscreen(a4)
		bne.s	1$
		tst.b	fromfile(a4)
		bne.s	2$
		moveq	#0,d0
		bsr.s	CloseGUI		; close window
		bra	createscreen
2$		st	ownscreen(a4)
1$		rts

usewindow	tst.b	ownscreen(a4)
		beq.s	1$
		tst.b	fromfile(a4)
		bne.s	2$
		st	wantwindow(a4)
		moveq	#0,d0
		bsr.s	CloseGUI		; close window & screen
		beq.s	1$			; pubscreen still used
		clr.b	wantwindow(a4)
2$		clr.b	ownscreen(a4)
		tst.b	fromfile(a4)
		bne.s	1$
		bsr	setupwindow		; open our window
1$		rts

CloseGUI	move.l	d0,d2
		bsr	replyintui		; answer msg
		move.l	intuibase(a4),a6
		tst.b	ownscreen(a4)
		beq.s	8$
		bsr.s	SetPubStatus
		beq.s	1$			; pubscreen still used
8$		move.l	wnptr(a4),d0
		beq.s	6$
		move.l	d0,a0
		tst.b	ownscreen(a4)
		bne.s	7$
		move.l	4(a0),window_l(a4)
		move.l	8(a0),window_w(a4)
7$		RECALL	CloseWindow
		clr.l	wnptr(a4)
6$		move.l	screenptr(a4),d0
		beq.s	5$
		move.l	d0,a0
		RECALL	CloseScreen
		clr.l	screenptr(a4)
5$		move.l	d2,d0
		beq.s	2$			; don't close fonts
		move.l	ownfont(a4),a1
		bsr.s	3$			; close font
		move.l	topazfont(a4),a1
3$		move.l	a1,d1
		beq.s	2$			; oops, no font
		move.l	a6,-(sp)
		CALL	CloseFont,gfxbase(a4)
		move.l	(sp)+,a6
2$		moveq	#1,d0
1$		rts

SetPubStatus	moveq	#1,d0
		tst.b	post_V34(a4)		; no Kick 2.0+
		beq.s	1$
		move.l	screenptr(a4),d1
		beq.s	1$
		move.l	d1,a0			; d0 - already one !!!
		move.l	intuibase(a4),a6
		RECALL	PubScreenStatus		; make screen private
		tst.l	d0
		bne.s	1$
		tst.b	waitexit(a4)
		beq.s	1$			; don't wait
		moveq	#0,d0
		move.w	nspubsig+6(a4),d1
		bset	d1,d0
		CALL	Wait,sysbase(a4)	; wait until last win closed
		bra.s	SetPubStatus
1$		tst.l	d0
		rts

; support functions

CreatePort	movem.l	d2-d4/a2/a3/a6,-(sp)
		suba.l	a2,a2
		move.l	d0,d2			; port-pri
		move.l	a0,d3			; portname
		moveq	#-1,d0
		CALL	AllocSignal,sysbase(a4)
		moveq	#0,d4
		move.b	d0,d4
		blt.s	1$
		moveq	#34,d0
		move.l	pubclr(a4),d1		; MEMF_CLEAR|MEMF_PUBLIC
		RECALL	AllocMem
		movea.l	d0,a2
		move.l	a2,d0
		bne.s	2$
		move.l	d4,d0
		RECALL	FreeSignal
		bra.s	1$
2$		lea	8(a2),a3
		move.b	#4,(a3)+		; mp_Node.ln_Type=NT_MSGPORT
		move.b	d2,(a3)+		; mp_Node.ln_Pri
		move.l	d3,(a3)+		; mp_Node.ln_Name
		move.w	d4,(a3)+		; mp_Flags && mp_SigBit
		move.l	mytask(a4),(a3)+	; mp_SigTask
		move.l	a3,8(a3)		; mp_MsgList.Node.ln_Pred
		addq.w	#4,a3
		move.l	a3,-(a3)		; mp_MsgList.Node.ln_Head
		tst.l	d3
		beq.s	1$
		movea.l	a2,a1
		RECALL	AddPort
1$		move.l	a2,d0			; MsgPort
		movem.l	(sp)+,d2-d4/a2/a3/a6
		rts

DeletePort	move.l	a2,-(sp)
		move.l	sysbase(a4),a6
		movea.l	d0,a2			; port
		tst.l	10(a2)
		beq.s	1$
		movea.l	a2,a1
		RECALL	RemPort
1$		moveq	#-1,d0			; Port unbrauchbar
		move.b	d0,8(a2)		; machen
		move.l	d0,20(a2)
		moveq	#0,d0
		move.b	15(a2),d0
		RECALL	FreeSignal
		movea.l	a2,a1
		moveq	#34,d0
		RECALL	FreeMem
		move.l	(sp)+,a2
		rts

CreateStdIO	move.l	d2,-(sp)
		move.l	d0,d2			; reply-port
		beq.s	1$
		moveq	#48,d0
		move.l	pubclr(a4),d1		; MEMF_CLEAR|MEMF_PUBLIC
		CALL	AllocMem,sysbase(a4)
		movea.l	d0,a0
		move.l	a0,d0
		beq.s	1$
		move.b	#5,8(a0)		; NT_MESSAGE
		move.l	d2,14(a0)		; ReplyPort
1$		move.l	(sp)+,d2
		rts

DeleteStdIO	movea.l	d0,a1			; io-block
		moveq	#-1,d0
		move.b	d0,8(a1)
		move.l	d0,20(a1)
		move.l	d0,24(a1)
		moveq	#48,d0
		move.l	sysbase(a4),a6
		jmp	_LVOFreeMem(a6)

CreateTask	movem.l	d2-d5/a2/a3/a6,-(sp)
		addq.l	#3,d0
		moveq	#-4,d2
		and.l	d0,d2			; stack adjusted
		move.l	d1,d3			; pri
		move.l	a0,d4			; name
		move.l	a1,d5			; code
		move.l	d2,-(sp)
		lea	MemList+7*4(pc),a0
		moveq	#6,d0
3$		move.l	-(a0),-(sp)		; copy memlist
		dbra	d0,3$
		move.l	sp,a0
		CALL	AllocEntry,sysbase(a4)	; alloc memory
		movea.l	d0,a2
		move.l	a2,d0
		lea	8*4(sp),sp
		blt.s	2$			; no mem !
		move.l	16(a2),a3
		move.b	#1,8(a3)		; ln_Type
		move.b	d3,9(a3)		; ln_Pri
		move.l	d4,10(a3)		; ln_Name
		move.l	24(a2),d0
		add.l	d0,d2
		move.l	d2,54(a3)		; tc_SPReg
		move.l	d0,58(a3)		; tc_SPLower
		move.l	d2,62(a3)		; tc_SPUpper
		lea	74(a3),a0		; tc_MemList
		move.l	a0,8(a0)
		addq.w	#4,a0
		move.l	a0,-(a0)
		move.l	a2,a1
		RECALL	AddHead			; store memlist
		move.l	a3,a1
		move.l	a1,d3
		exg.l	d5,a2
		suba.l	a3,a3
		RECALL	AddTask			; start task
		cmp.w	#37,20(a6)
		bcs.s	1$			; kick 2.0+ ?
		tst.l	d0
		bne.s	1$			; task created
		move.l	d5,a0
		RECALL	FreeEntry		; free memory
2$		moveq	#0,d3
1$		move.l	d3,d0			; task
		movem.l	(sp)+,d2-d5/a2/a3/a6
		rts

		cnop	0,4

MemList		dc.l	0,0			; Succ,Pred
		dc.b	0,0			; Pri,Type
		dc.l	0			; Name
		dc.w	2			; NumEntries
PubClr		dc.l	$10001			; MemType
		dc.l	92			; Length
		dc.l	$10000			; MemType
;		dc.l	0			; Length

killidle	bra.s	killidle

; data area

Detached	dc.w	1			; flag for background process

StpList		dc.l	*+4			; frozen tasks list
		dc.l	0
		dc.l	StpList

FKeys		dc.l	*+4			; function keys list
		dc.l	0
		dc.l	FKeys

History		dc.l	*+4			; history lines list
		dc.l	0
		dc.l	History
CurHist		dc.l	0

NewBroker	dc.b	5,0			; nb_Version, pad
		dc.l	NewName			; nb_Name
		dc.l	VerString		; nb_Title
		dc.l	Description		; nb_Descr
		dc.w	1+2			; nb_Unique = NBU_UNIQUE!NBU_NOTIFY
		dc.w	4			; nb_Flags = COF_SHOW_HIDE
		dc.b	0,0 			; nb_Pri, pad
		dc.l	0			; nb_Port
		dc.w	0			; nb_ReservedChannel

InInterrupt	dc.l	0			; ln_Succ
		dc.l	0			; ln_Pred
		dc.b	2			; ln_Type
		dc.b	60			; ln_Pri
		dc.l	XopSleep		; ln_Name
		dc.l	0			; is_Data
		dc.l	keyhandler		; is_Code()

IoCounter	dc.l	0			; ln_Succ
		dc.l	0			; ln_Pred
		dc.b	2			; ln_Type
		dc.b	-1			; ln_Pri
		dc.l	IOcntName		; ln_Name
		dc.l	0			; is_Data
		dc.l	countio			; is_Code()

TAttr		dc.l	FontName
		dc.w	8
		dc.b	0,0

Window_l	dc.w	-550,1			; initial window position
Window_w	dc.w	550,199

NewWindow	dc.w	0,0,0,0
		dc.b	0,1
NwFlgs		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0			; title
NwScreen	dc.l	0
		dc.l	0
		dc.w	110,50
		dc.w	-1,-1
NwType		dc.w	0
		dc.l	NewWinTags		; APTR enw_Extension

NewWinTags	dc.l	$80000090,1		; WA_AutoAdjust,TRUE
		dc.l	0

NewScreen	dc.w	0,0
		dc.w	0,-1			; ???,STDSCREENHEIGHT
		dc.w	1
		dc.b	0
		dc.b	1
		dc.w	0
		dc.w	$101f			; $1000 - NS_EXTENDED
		dc.l	0
		dc.l	0			; title
		dc.l	0,0
		dc.l	NewScrTags		; APTR ens_Extension

NewScrTags	dc.l	$80000023,-1		; SA_Width,STDSCREENWIDTH
		dc.l	$80000039,-1		; SA_AutoScroll,TRUE
NsDisplay	dc.l	$80000032,0		; SA_DisplayID
NsPubName	dc.l	$8000002f,NewName	; SA_PubName
NsPubSig	dc.l	$80000030,0		; SA_PubSig
	 	dc.l	0			; TAG_DONE

IcnWindow	dc.w	40,170,72,28		; sleep window
		dc.b	0,1
		dc.l	$20,$10800
		dc.l	Gadget,0,0,0,0
		dc.w	72,28,72,28
		dc.w	1

AppObj		dc.w	0,0			; contains gadget

Gadget		dc.l	0
		dc.w	0,0,72,28,4,2,$20
		dc.l	Image
		dc.l	0,0,0,0
		dc.w	0
		dc.l	0

		dc.w	0
		dc.l	0,0
		dc.l	$80000000,$80000000
		dc.l	0,0,0

Image		dc.w	0,0,72,28
		dc.w	2
		dc.l	ImageData
		dc.b	3,0
		dc.l	0

IconifGad	dc.l	0			; zip gadget for Kick 1.3
		dc.w	-83,0
		dc.w	31,10
		dc.w	$14,$41,1
		dc.l	IconImg
		dc.l	0,0,0,0
		dc.w	0
		dc.l	0
IconImg		dc.w	0,0,31,10
		dc.w	2
		dc.l	IconifData
		dc.b	3,0
		dc.l	0

SBGadget	dc.l	0			; prop gadget
		dc.w	-14,11
		dc.w	14,-22
		dc.w	$10|$40
		dc.w	1|2|8|16
		dc.w	3
		dc.l	SBData,0,0,0,PropInfo
		dc.w	3
		dc.l	0
PropInfo	dc.w	1|4
		dc.w	0,0
		dc.w	-1,-1
		dc.w	0,0,0,0,0,0
SBData		dc.l	0,0,0,0

HexTab		dc.b	'0123456789abcdef'

Params		dc.b	'tfdlrempiscua'
parmnum		equ	*-Params
.parmnum	dc.b	0

cmdnum		set	0
Commds	 	ADDCMD	'time'			; all commands we know
		ADDCMD	'taskpri'
		ADDCMD	'info'
		ADDCMD	'pri'
		ADDCMD	'flush'
		ADDCMD	'freeze'
		ADDCMD	'warm'
		ADDCMD	'signal'
		ADDCMD	'break'
		ADDCMD	'alert'
		ADDCMD	'lastalert'
		ADDCMD	'hold'
		ADDCMD	'exit'
		ADDCMD	'clear'
		ADDCMD	'cancel'
		ADDCMD	'taskports'
		ADDCMD	'hunks'
		ADDCMD	'devices'
		ADDCMD	'openlib'
		ADDCMD	'closelib'
		ADDCMD	'currentdir'
		ADDCMD	'cd'
		ADDCMD	'mypri'
		ADDCMD	'files'
		ADDCMD	'locks'
		ADDCMD	'unlock'
		ADDCMD	'screens'
		ADDCMD	'windows'
		ADDCMD	'closescreen'
		ADDCMD	'closewindow'
		ADDCMD	'fonts'
		ADDCMD	'windowfonts'
		ADDCMD	'lockdrive'
		ADDCMD	'freedrive'
		ADDCMD	'capture'
		ADDCMD	'clrcold'
		ADDCMD	'clrcool'
		ADDCMD	'clrwarm'
		ADDCMD	'snoopmem'
		ADDCMD	'usage'
		ADDCMD	'inputhandler'
		ADDCMD	'header'
		ADDCMD	'sort'
		ADDCMD	'hide'
		ADDCMD	'hidden'
		ADDCMD	'window'
		ADDCMD	'kill'
		ADDCMD	'iconify'
		ADDCMD	'historylines'
		ADDCMD	'minimumchars'
		ADDCMD	'showhistory'
		ADDCMD	'repeat'
		ADDCMD	'remresident'
		ADDCMD	'saveoutput'
		ADDCMD	'killhistory'
		ADDCMD	'backdropicon'
		ADDCMD	'myfont'
		ADDCMD	'setfont'
		ADDCMD	'trapguru'
		ADDCMD	'outputlines'
		ADDCMD	'usescreen'
		ADDCMD	'usewindow'
		ADDCMD	'usetopaz'
		ADDCMD	'timerio'
		ADDCMD	'diskchange'
		ADDCMD	'alias'
		ADDCMD	'remnode'
		ADDCMD	'setfkey'
		ADDCMD	'clicmd'
		ADDCMD	'taskinfo'
		ADDCMD	'coldreboot'
		ADDCMD	'reboot'
		ADDCMD	'zerotimer'
		ADDCMD	'propgad'
		ADDCMD	'iconpos'
		ADDCMD	'remport'
		ADDCMD	'remintserver'
		ADDCMD	'frags'
		ADDCMD	'traceopen'
		ADDCMD	'tracelock'
		ADDCMD	'cxhandler'
		ADDCMD	'popkey'
		ADDCMD	'pubscreens'
		ADDCMD	'smartpatch'
		ADDCMD	'lowmemhandler'

		IFNE	((tasktime-cmdaddr)/4)-cmdnum
		ERROR	!! COMMAND NAME OR JUMP VECTOR MISSING !!
		ENDC

NewName		dc.b	'Xoper'
NoName		dc.b	0
XopCon		dc.b	'XopPackets',0
XopSleep	dc.b	'Xop-A-A-x',0
MemPortName	dc.b	'SnoopPort',0
IOcntName	dc.b	'Xop-I/O-Counter',0
KidleName	dc.b	'Xop-Idle-Killer',0
NameFmt		dc.b	'%s %s - <PopKey=%s>',0
		even				; important for mc68000 !
DefHotkey	dc.b	'lcommand rcommand x',0
		dc.b	'$VER: '
VerString	VERSION
Copyright	dc.b	'© 1988/95 by W.Günther and G.Nikl',0
Description	dc.b	'A very powerful system monitor',0

T2Header	dc.b	'   ID     STATE  SIGALLOC SIGWAIT  SIGRECVD    PC    FPU  TASKNAME',0
T3Header	dc.b	'   ID     STATE  SIGALLOC SIGWAIT  SIGRECVD    PC    TASKNAME',0
T4Header	dc.b	'   ID     STATE    RUNNING    ACTIVE   NUM TASKNAME',0
THeader		dc.b	'   ID     TYPE      STATE   PRI  CPUSE NUM TASKNAME',0
LHeader		dc.b	'  NODE    CNT  VER  REV  FLAGS    ',0
LibNam		dc.b	'LIBRARY NAME',0
DevNam		dc.b	'DEVICE NAME',0
ResNam		dc.b	'RESOURCE NAME',0
MHeader		dc.b	' LOWER    UPPER       FREE   ATTR  PRI HUNK NAME',0
IHeader		dc.b	'  NODE     DATA     CODE    PRI T S   TYPE     INTERRUPT NAME',0
InHeader	dc.b	'  NODE     DATA     CODE    PRI NAME',0
RHeader		dc.b	'  ADDR    PRI  FLAGS    VER   TYPE    RESIDENT NAME',0
PHeader		dc.b	'  NODE   PORTNAME         FLAGS SIGBT NUM SIGTASK',0
HunkHeader	dc.b	' NUM  BCPL    DATA       LENGTH',0
DDHeader	dc.b	'DEVICE    HDS   SECTORS    TRACKS   BUFFERS STATE    HANDLER',0
CDHeader	dc.b	'PROCESSNAME          CURRENT DIRECTORY',0
OFHeader	dc.b	'  LOCK   ACCESS      SIZE PATH/FILENAME',0
ScrHeader	dc.b	'NUM   ADDR      SIZE   DPTH TITLE',0
MonitorID	dc.b	'    MonitorID: $',0
PScrHeader	dc.b	'  NODE   SCREENNAME         STATE CNT SBT SIGTASK',0
WnHeader	dc.b	' ADDR    OWNERTASK     X    Y     SIZE    TITLE',0
FoHead		dc.b	'  NODE    CNT   Y    X  TYPE        LO  HI NAME',0
KickHead	dc.b	'START    END      LENGTH',0
SnoopHead	dc.b	'ACTION          REQUIREMENTS               LENGTH    FROM      TO     CALLER',0
StackHead	dc.b	'SPLower       SIZE      USED TASKNAME',0
CliComHead	dc.b	'   ID     STATE   TYPE MODE NUM PROCESSNAME       COMMAND',0
TioHead		dc.b	'IORQUEST  UNIT       SECS    REQUESTING TASK',0
DCHead		dc.b	'  NODE     DATA     CODE   UNIT TASK',0
ALHead		dc.b	'ALIAS NAME        COMMAND',0
SemHead		dc.b	'  NODE   OWNER         QUEUE NEST NAME',0
FragHead	dc.b	'HEX    SIZE    DEC     COUNT   LARGEST',0
FKHead		dc.b	'KEY  STRING',0
FilesHead	dc.b	'   TASK      HANDLE   MODE  FILENAME',0
TDDrives	dc.b	'DF : ',0
UnitMsg		dc.b	' (Unit # )',0
TimerUnits	dc.b	'MicroHz ',0
		dc.b	'VBlank  ',0
FMode		dc.b	'  R/W  ',0
Access		dc.b	' Read  ',0
		dc.b	' Write ',0
RomFnt		dc.b	'Rom  ',0
DiskFnt		dc.b	'Disk ',0
FFixed		dc.b	'Fixed ',0
FProp		dc.b	'Propl ',0
Status		dc.b	'Added   ',0
		dc.b	'Running ',0
		dc.b	'Ready   ',0
		dc.b	'Waiting ',0
		dc.b	'Exeption',0
		dc.b	'Removed ',0
		dc.b	'Frozen  ',0
		dc.b	'Frozen  ',0
Type		dc.b	'Unknown   ',0
TaskType	dc.b	'Task      ',0
		dc.b	'Interrupt ',0
		dc.b	'Device    ',0
		dc.b	'Msgport   ',0
		dc.b	'Message   ',0
		dc.b	'Freemsg   ',0
		dc.b	'Replymsg  ',0
		dc.b	'Resource  ',0
		dc.b	'Library   ',0
		dc.b	'Memory    ',0
SoftIntType	dc.b	'Softint   ',0
		dc.b	'Font      ',0
ProcType	dc.b	'Process   ',0
		dc.b	'Semaphore ',0
Mp_Flags	dc.b	'Signal  ',0
		dc.b	'Softint ',0
		dc.b	'Ignore  ',0
PScr_State	dc.b	'  Public ',0
		dc.b	' Private ',0
Infoh2		dc.b	'Dispat/Sec:',0
Infoh1		dc.b	'CPU:',0
Infoh3		dc.b	'CPU activity: ',0
Infoh6		dc.b	'Total:',0
Infoh4		dc.b	'% ',0
Infoh7		dc.b	'I/O Ints/Sec: ',0
CPU0		dc.b	'68000',0
CPU1		dc.b	'68010',0
CPU2		dc.b	'68020',0
CPU3		dc.b	'68030',0
CPU4		dc.b	'68040',0
CPU5		dc.b	'68060',0
FPU0		dc.b	'/68881',0
FPU1		dc.b	'/68882',0
FPU2		dc.b	'/FPU40',0
NoFPU		dc.b	'---- ',0
NullState	dc.b	'NULL ',0
Idle		dc.b	'IDLE ',0
Busy		dc.b	'BUSY ',0
DontKnow	dc.b	'???? ',0
DevLoad		dc.b	'loaded   ',0
DevnLoad	dc.b	'unloaded ',0
IntEn		dc.b	'E ',0
IntDis	 	dc.b	'D ',0
IntServ		dc.b	'S ',0
IntHand		dc.b	'H ',0
NotFile		dc.b	'--- --------- --------- --------- ',0
LongLongNix	dc.b	'-'
LongNix		dc.b	'-----'
Nix		dc.b	'--- ',0
NoInfo		dc.b	'No Info on'
OneBlank	dc.b	' ',0
Equal		dc.b	'=  ',0
OpenBrak	dc.b	'[ ',0
CloseBrak	dc.b	' ]',0
NamErr		dc.b	'Unable to find ',0
FontErr		dc.b	"Can't open ",0
AdrErr		dc.b	'Address Error!',0
AliasErr	dc.b	'Single character alias names using "',0
AliasErr2	dc.b	'"',10,'are not allowed.',0
NoWorkbench	dc.b	"Workbench isn't active !",0
OpenErr		dc.b	'Could not open file ',0
ListErr		dc.b	'Unable to find ListHeader. Sort aborted.',0
WiwErr		dc.b	'Script file only',0
GuruTxt		dc.b	'Guru Meditation #',0
ClrTxt		dc.b	'Memory Hunks cleared.',0
CanErr0		dc.b	'Process is not a CLI-task',10
		dc.b	'Has it been started from Workbench ? (Y/N)',10,0
CanErr1		dc.b	'Process was created by CreateProc()',10
		dc.b	'Shall I UnLoad() ? (Y/N)',10,0
UnloadErr	dc.b	"Arrrgh.. can't find segments, aborting",0
NoProcs		dc.b	'Not a Process.',0
NotLoad		dc.b	'No program loaded.',0
CliProcs	dc.b	'CLI-Process',0
ProcLoaded	dc.b	'Loaded as a command: ',0
SegLoaded	dc.b	'Created by CreateProc()',0
ColdTxt		dc.b	'Cold Capture: ',0
CoolTxt		dc.b	'Cool Capture: ',0
WarmTxt		dc.b	'Warm Capture: ',0
KickTxt		dc.b	'KickMem     : ',0
Unset		dc.b	'unset',0
IntNames	dc.b	'Serial Out ',0
		dc.b	'Disk Block ',0
		dc.b	'SoftInt    ',0
		dc.b	'Ports      ',0
		dc.b	'Coper      ',0
		dc.b	'Vert.Blank ',0
		dc.b	'Blitter    ',0
		dc.b	'Audio Ch.0 ',0
		dc.b	'Audio Ch.1 ',0
		dc.b	'Audio Ch.2 ',0
		dc.b	'Audio Ch.3 ',0
		dc.b	'Serial In  ',0
		dc.b	'Disk Sync  ',0
		dc.b	'External   ',0
		dc.b	'SoftInt    ',0
		dc.b	'NMI        ',0
IntTyp		dc.b	0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1
MemNoExp	dc.b	'NOEXP ',0
MemRev		dc.b	'REV ',0
MemLarg		dc.b	'LARGEST ',0
MemClr		dc.b	'CLEAR ',0
MemKick		dc.b	'KICK ',0
MemDMA		dc.b	'24BIT ',0
MemLoc		dc.b	'LOCAL ',0
MemFast		dc.b	'FAST ',0
MemChip		dc.b	'CHIP ',0
MemPubl		dc.b	'PUBLIC ',0
Failed		dc.b	'Failed !',0
AllOk		dc.b	'ALLOC: ',0
Free		dc.b	'FREE: ',0
Backg		dc.b	'Bckg ',0
Foreg		dc.b	'Frgr ',0
Script		dc.b	'Batch ',0
Interact	dc.b	'Intct ',0
NameErr		dc.b	'Name or address is missing.',10
SynErr		dc.b	'Syntax Error, type "?" for help'
CR		dc.b	10,0
Dnotf		dc.b	'Directory not found',0
NotDir		dc.b	'Not a directory',0
NoMount		dc.b	' not mounted.',0
DisHelp		dc.b	10,'Names are case sensitive and followed by a ":"',0
UnlErr		dc.b	'Lock not found',0
Unl1		dc.b	'Lock is on ',0
UnlTxt		dc.b	'Old lock was: ',0
UnlTxt2		dc.b	'Unlock ? (Y/N)',10,0
ScNoFound	dc.b	'Screen not found.',0
WinNoFound	dc.b	'Window not found.',0
StpErr		dc.b	'Task must be "READY" or "WAITING"',10,0
WaErr		dc.b	'Task must be "FROZEN"',10,0
WhatsThis	dc.b	'???.?',0
TooMuch		dc.b	'??? ',0
TimeNotSet	dc.b	' disabled.',0
WhatTime	dc.b	'Refresh time in secs:',0
Stopped		dc.b	'<Break>',0
CapExited	dc.b	'Task ended',0
CapWait		dc.b	'Waiting for startup...',0
OnScr		dc.b	'On Screen: ',0
WhatNow		dc.b	'Kill, ignore (K/I)?',0
NoGuru		dc.b	'None found.',0
SoftFail	dc.b	'Software failure!',10,'Task: ',0
AddrsErr	dc.b	'Bad aligned address was: ',0
ProCount	dc.b	'PC: ',0
MemTyp		dc.b	'Memory type: ',0
NintrServ	dc.b	"Not a server. Can't restore vectors",0
OnStr		dc.b	'on',0
OffStr		dc.b	'off',0
UseTxt		dc.b	'DISPLAY:',10
		dc.b	'[T]asks    task[F]lags [L]ibraries  [D]evices    [R]esources',10
		dc.b	'r[E]sident [M]emory    [P]orts      [I]nterrupts [S]tack',10
		dc.b	'[C]litasks task[U]sage sem[A]phores [Q]uit',10,10
		dc.b	'OTHER SYSTEM LISTS:',10
		dc.b	'Windows  Screens  PubScreens  WindowFonts   Fonts',10
		dc.b	'Capture  TimerIO  DiskChange  InputHandler  Devices',10
		dc.b	'Locks    Files    CurrentDir  LowMemHandler Frags',10,10
		dc.b	'COMMANDS:',10
		dc.b	'Time         <secs>',10
		dc.b	'Mypri        <priority>',10
		dc.b	'Taskpri      <priority>  [processnum] <taskname>',10
		dc.b	'Signal       <mask(hex)> [processnum] <taskname>',10
		dc.b	'Break        [processnum] <taskname>',10
		dc.b	'Freeze|Warm  [processnum] <taskname>',10
		dc.b	'Kill/Cancel  [processnum] <taskname>',10
		dc.b	'SnoopMem     [processnum] <taskname>',10
		dc.b	'TraceOpen/TraceLock',10
		dc.b	'ZeroTimer    [processnum] <taskname>',10
		dc.b	'Hide         <taskname>',10
		dc.b	'Pri          <priority> <nodename>',10
		dc.b	'Info         <name>',10
		dc.b	'RemNode      <node address>',10
		dc.b	'RemPort      <port address>',10
		dc.b	'RemResident  <resident module name>',10
		dc.b	'RemIntServer <interrupt address>',10
		dc.b	'Clear        <longword(hex)>',10
		dc.b	'Hunks        [processnum] <procname>',10
		dc.b	'CD           <directory> [processnum] <procname>',10
		dc.b	'UnLock       <lock>',10
		dc.b	'OpenLib    | Closelib <libraryname>',10
		dc.b	'CloseWindow| Closescreen <title>',10
		dc.b	'MyFont       [size] <fontname> | '
DefFont		dc.b	'default',10
		dc.b	'SetFont      [size] <fontname> <windowtitle>',10
		dc.b	'LockDrive  | Freedrive   <drivename:>',10
		dc.b	'Window       <leftedge topedge width height> (scriptfile only) ',10
		dc.b	'IconPos      <leftedge topedge>',10
		dc.b	'OutputLines  <maximum # of lines>',10
		dc.b	'HistoryLines <maximum # of lines>',10
		dc.b	'MinimumChars <minimum # of characters>',10
		dc.b	'SaveOutput   <filename>',10
		dc.b	'PopKey       <description>',10
		dc.b	'Repeat       <Command line>',10
		dc.b	'SetFKey      <number> <string>',10
		dc.b	'Alias        [<aliasname> <commandname>]',10,10
		dc.b	'COMMANDS WITHOUT PARAMETERS:',10
		dc.b	'Alert      LastAlert ClrCool       ClrCold      ClrWarm',10
		dc.b	'TrapGuru   Flush     ShowHistory   KillHistory  ColdReboot',10
		dc.b	'Reboot     Hold      Exit',10,10
		dc.b	'OPTIONS:',10
		dc.b	'Sort       CLICmd    TaskInfo      TaskPorts    Hidden',10
		dc.b	'Usage      Header    UseScreen     UseWindow    UseTopaz',10
		dc.b	'PropGad    Iconify   BackDropIcon  SmartPatch   CxHandler',0

Template	dc.b	'CMD/K,KEEPIO/S,NOSCRIPT/S,CX_POPUP/K,CX_POPKEY/K,CX_PRIORITY/K/N: ',0
ArgCmd		dc.b	'CMD',0
ArgKill		dc.b	'KILL',0
ArgKeepIO	dc.b	'KEEPIO',0
ArgNoScript	dc.b	'NOSCRIPT',0
ArgCxPop	dc.b	'CX_POPUP',0
ArgCxKey	dc.b	'CX_POPKEY',0
ArgCxPri	dc.b	'CX_PRIORITY',0
ArgCxYes	dc.b	'YES',0
ArgHelp		dc.b	'?',0
DosName		dc.b	'dos.library',0
IcnName		dc.b	'icon.library',0
GfxName		dc.b	'graphics.library',0
IntName		dc.b	'intuition.library',0
CxName		dc.b	'commodities.library',0
WbName		dc.b	'workbench.library',0
DiskFont	dc.b	'diskfont.library',0
TdName		dc.b	'trackdisk.device',0
ConName		dc.b	'console.device',0
InputName	dc.b	'input.device',0
TimerName	dc.b	'timer.device',0
FontName	dc.b	'topaz.font',0
WbPortNam	dc.b	'Workbench',0
SetManNam	dc.b	'SetMan',0
StartupName
	IFND DEBUG
		dc.b	'ENV:Xoper.Startup',0
	ENDC
	IFD DEBUG
		dc.b	'ENV:Test.Startup',0
	ENDC

		cnop	0,4

dataarea	ds.b	gb_SIZEOF

DosTable	equ	_DosTable-dataarea

pubclr		equ	PubClr-dataarea
detached	equ	Detached-dataarea

stplist		equ	StpList-dataarea
fkeys		equ	FKeys-dataarea
history		equ	History-dataarea
curhist		equ	CurHist-dataarea

newbroker	equ	NewBroker-dataarea
ininterrupt	equ	InInterrupt-dataarea
iocounter	equ	IoCounter-dataarea
tattr		equ	TAttr-dataarea
window_l	equ	Window_l-dataarea
window_w	equ	Window_w-dataarea
newwindow	equ	NewWindow-dataarea
nwflgs		equ	NwFlgs-dataarea
nwscreen	equ	NwScreen-dataarea
nwtype		equ	NwType-dataarea
newscreen	equ	NewScreen-dataarea
newscrtags	equ	NewScrTags-dataarea
nsdisplay	equ	NsDisplay-dataarea
nspubname	equ	NsPubName-dataarea
nspubsig	equ	NsPubSig-dataarea

icnwindow	equ	IcnWindow-dataarea
appobj		equ	AppObj-dataarea
gadget		equ	Gadget-dataarea
image		equ	Image-dataarea
iconifgad	equ	IconifGad-dataarea
iconimg		equ	IconImg-dataarea

sbgadget	equ	SBGadget-dataarea
propinfo	equ	PropInfo-dataarea
sbdata		equ	SBData-dataarea

hextab		equ	HexTab-dataarea

params		equ	Params-dataarea

commds		equ	Commds-dataarea
newname		equ	NewName-dataarea
noname		equ	NoName-dataarea
xopcon		equ	XopCon-dataarea
xopsleep	equ	XopSleep-dataarea
memportname	equ	MemPortName-dataarea
IOcntname	equ	IOcntName-dataarea
kidlename	equ	KidleName-dataarea
namefmt		equ	NameFmt-dataarea
defhotkey	equ	DefHotkey-dataarea
verstring	equ	VerString-dataarea
copyright	equ	Copyright-dataarea
description	equ	Description-dataarea

t2header	equ	T2Header-dataarea
t3header	equ	T3Header-dataarea
t4header	equ	T4Header-dataarea
theader		equ	THeader-dataarea
lheader		equ	LHeader-dataarea
libnam		equ	LibNam-dataarea
devnam		equ	DevNam-dataarea
resnam		equ	ResNam-dataarea
mheader		equ	MHeader-dataarea
iheader		equ	IHeader-dataarea
inheader	equ	InHeader-dataarea
rheader		equ	RHeader-dataarea
pheader		equ	PHeader-dataarea
hunkheader	equ	HunkHeader-dataarea
ddheader	equ	DDHeader-dataarea
cdheader	equ	CDHeader-dataarea
ofheader	equ	OFHeader-dataarea
scrheader	equ	ScrHeader-dataarea
monitorid	equ	MonitorID-dataarea
pscrheader	equ	PScrHeader-dataarea
wnheader	equ	WnHeader-dataarea
fohead		equ	FoHead-dataarea
kickhead	equ	KickHead-dataarea
snoophead	equ	SnoopHead-dataarea
stackhead	equ	StackHead-dataarea
clicomhead	equ	CliComHead-dataarea
tiohead		equ	TioHead-dataarea
dchead		equ	DCHead-dataarea
alhead		equ	ALHead-dataarea
semhead		equ	SemHead-dataarea
fraghead	equ	FragHead-dataarea
fkhead		equ	FKHead-dataarea
fileshead	equ	FilesHead-dataarea
tddrives	equ	TDDrives-dataarea
unitmsg		equ	UnitMsg-dataarea
timerunits	equ	TimerUnits-dataarea
fmode		equ	FMode-dataarea
access		equ	Access-dataarea
romfnt		equ	RomFnt-dataarea
diskfnt		equ	DiskFnt-dataarea
ffixed		equ	FFixed-dataarea
fprop		equ	FProp-dataarea
status		equ	Status-dataarea
type		equ	Type-dataarea
tasktype	equ	TaskType-dataarea
softinttype	equ	SoftIntType-dataarea
proctype	equ	ProcType-dataarea
mp_flags	equ	Mp_Flags-dataarea
pscr_state	equ	PScr_State-dataarea
infoh2		equ	Infoh2-dataarea
infoh1		equ	Infoh1-dataarea
infoh3		equ	Infoh3-dataarea
infoh6		equ	Infoh6-dataarea
infoh4		equ	Infoh4-dataarea
infoh7		equ	Infoh7-dataarea
cpu0		equ	CPU0-dataarea
cpu1		equ	CPU1-dataarea
cpu2		equ	CPU2-dataarea
cpu3		equ	CPU3-dataarea
cpu4		equ	CPU4-dataarea
cpu5		equ	CPU5-dataarea
fpu0		equ	FPU0-dataarea
fpu1		equ	FPU1-dataarea
fpu2		equ	FPU2-dataarea
nofpu		equ	NoFPU-dataarea
nullstate	equ	NullState-dataarea
idle		equ	Idle-dataarea
busy		equ	Busy-dataarea
dontknow	equ	DontKnow-dataarea
devload		equ	DevLoad-dataarea
devnload	equ	DevnLoad-dataarea
inten		equ	IntEn-dataarea
intdis		equ	IntDis-dataarea
intserv		equ	IntServ-dataarea
inthand		equ	IntHand-dataarea
notfile		equ	NotFile-dataarea
longlongnix	equ	LongLongNix-dataarea
longnix		equ	LongNix-dataarea
nix		equ	Nix-dataarea
noinfo		equ	NoInfo-dataarea
oneblank	equ	OneBlank-dataarea
equal		equ	Equal-dataarea
openbrak	equ	OpenBrak-dataarea
closebrak	equ	CloseBrak-dataarea
namerr		equ	NameErr-dataarea
fonterr		equ	FontErr-dataarea
adrerr		equ	AdrErr-dataarea
aliaserr	equ	AliasErr-dataarea
aliaserr2	equ	AliasErr2-dataarea
noworkbench	equ	NoWorkbench-dataarea
openerr		equ	OpenErr-dataarea
listerr		equ	ListErr-dataarea
wiwerr		equ	WiwErr-dataarea
gurutxt		equ	GuruTxt-dataarea
clrtxt		equ	ClrTxt-dataarea
canerr0		equ	CanErr0-dataarea
canerr1		equ	CanErr1-dataarea
unloaderr	equ	UnloadErr-dataarea
noprocs		equ	NoProcs-dataarea
notload		equ	NotLoad-dataarea
cliprocs	equ	CliProcs-dataarea
procloaded	equ	ProcLoaded-dataarea
segloaded	equ	SegLoaded-dataarea
coldtxt		equ	ColdTxt-dataarea
cooltxt		equ	CoolTxt-dataarea
warmtxt		equ	WarmTxt-dataarea
kicktxt		equ	KickTxt-dataarea
unset		equ	Unset-dataarea
intnames	equ	IntNames-dataarea
inttyp		equ	IntTyp-dataarea

memnoexp	equ	MemNoExp-dataarea
memrev		equ	MemRev-dataarea
memlarg		equ	MemLarg-dataarea
memclr		equ	MemClr-dataarea
memkick		equ	MemKick-dataarea
memdma		equ	MemDMA-dataarea
memloc		equ	MemLoc-dataarea
memfast		equ	MemFast-dataarea
memchip		equ	MemChip-dataarea
mempubl		equ	MemPubl-dataarea

failed		equ	Failed-dataarea
allok		equ	AllOk-dataarea
free		equ	Free-dataarea
backg		equ	Backg-dataarea
foreg		equ	Foreg-dataarea
script		equ	Script-dataarea
interact	equ	Interact-dataarea
nameerr		equ	NameErr-dataarea
synerr		equ	SynErr-dataarea
cr		equ	CR-dataarea
dnotf		equ	Dnotf-dataarea
notdir		equ	NotDir-dataarea
nomount		equ	NoMount-dataarea
dishelp		equ	DisHelp-dataarea
unlerr		equ	UnlErr-dataarea
unl1		equ	Unl1-dataarea
unltxt		equ	UnlTxt-dataarea
unltxt2		equ	UnlTxt2-dataarea
scnofound	equ	ScNoFound-dataarea
winnofound	equ	WinNoFound-dataarea
stperr		equ	StpErr-dataarea
waerr		equ	WaErr-dataarea
whatsthis	equ	WhatsThis-dataarea
toomuch		equ	TooMuch-dataarea
timenotset	equ	TimeNotSet-dataarea
whattime	equ	WhatTime-dataarea
stopped		equ	Stopped-dataarea
capexited	equ	CapExited-dataarea
capwait		equ	CapWait-dataarea
onscr		equ	OnScr-dataarea
whatnow		equ	WhatNow-dataarea
noguru		equ	NoGuru-dataarea
softfail	equ	SoftFail-dataarea
addrserr	equ	AddrsErr-dataarea
procount	equ	ProCount-dataarea
memtyp		equ	MemTyp-dataarea
nintrserv	equ	NintrServ-dataarea
onstr		equ	OnStr-dataarea
offstr		equ	OffStr-dataarea
usetxt		equ	UseTxt-dataarea
template	equ	Template-dataarea
argcmd		equ	ArgCmd-dataarea
argkill		equ	ArgKill-dataarea
argkeepio	equ	ArgKeepIO-dataarea
argnoscript	equ	ArgNoScript-dataarea
argcxpop	equ	ArgCxPop-dataarea
argcxkey	equ	ArgCxKey-dataarea
argcxpri	equ	ArgCxPri-dataarea
argcxyes	equ	ArgCxYes-dataarea
arghelp		equ	ArgHelp-dataarea
dosname		equ	DosName-dataarea
icnname		equ	IcnName-dataarea
gfxname		equ	GfxName-dataarea
intname		equ	IntName-dataarea
cxname		equ	CxName-dataarea
wbname		equ	WbName-dataarea
diskfont	equ	DiskFont-dataarea
tdname		equ	TdName-dataarea
conname		equ	ConName-dataarea
inputname	equ	InputName-dataarea
timername	equ	TimerName-dataarea
fontname	equ	FontName-dataarea
fontsuf		equ	fontname+5
wbportnam	equ	WbPortNam-dataarea
setmannam	equ	SetManNam-dataarea
deffont		equ	DefFont-dataarea
startupname	equ	StartupName-dataarea

		SECTION Images,DATA,CHIP

IconifData	dc.w	$7FFF,$FFFC,$601F,$FFFC,$6000,$000C,$607F,$FFCC
		dc.w	$6060,$00CC,$6067,$FCCC,$7E60,$00CC,$7E7F,$FFCC
		dc.w	$7E00,$000C,$7FFF,$FFFC,$0000,$0000,$1FE0,$0000
		dc.w	$1FFF,$FFF0,$1F80,$0030,$1F9F,$FF30,$1F98,$0330
		dc.w	$019F,$FF30,$0180,$0030,$01FF,$FFF0,$0000,$0000

ImageData	dc.w	$000F,$FFFF,$FFFF,$FFF8,$0000,$001F,$FFFF,$FFFF
		dc.w	$FFFC,$0000,$001F,$0000,$0000,$007C,$0000,$001F
		dc.w	$7FFF,$FFFF,$FF7C,$0000,$001F,$4A46,$0244,$557C
		dc.w	$0000,$001F,$5108,$D411,$817C,$0000,$001F,$7FFF
		dc.w	$FFFF,$FF7C,$0000,$001F,$0000,$0000,$007C,$0000
		dc.w	$001F,$30C0,$0000,$007C,$0000,$001F,$1980,$0000
		dc.w	$007C,$0000,$001F,$0F0F,$1F0F,$1F7C,$0000,$001F
		dc.w	$0619,$9999,$997C,$0000,$001F,$0F19,$999F,$987C
		dc.w	$0000,$001F,$1999,$9F18,$187C,$0000,$001F,$30CF
		dc.w	$180F,$187C,$0000,$001F,$0000,$1800,$007C,$0000
		dc.w	$001F,$0000,$0000,$007C,$0000,$001F,$FFFF,$FFFF
		dc.w	$FFFC,$0000,$000F,$FFFF,$FFFF,$FF18,$0000,$0000
		dc.w	$0000,$0000,$0000,$0000,$3FFF,$FFFF,$FFFF,$FFFF
		dc.w	$FC00,$FDFF,$FFFF,$FFFF,$FFFF,$FF00,$EBFF,$FFFF
		dc.w	$FFFF,$FFFF,$FF00,$F7FF,$FFFF,$FFFF,$F800,$0700
		dc.w	$FFFF,$FFFF,$FFFF,$FFFF,$FF00,$FFFF,$FFFF,$FFFF
		dc.w	$FFFF,$FF00,$FFFF,$FFFF,$FFFF,$FFFF,$FF00,$3FFF
		dc.w	$FFFF,$FFFF,$FFFF,$FC00,$0000,$0000,$0000,$0000
		dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$FFFF
		dc.w	$FFFF,$FF80,$0000,$0000,$FFFF,$FFFF,$FF80,$0000
		dc.w	$0000,$FFFF,$FFFF,$FF80,$0000,$0000,$FFFF,$FFFF
		dc.w	$FF80,$0000,$0000,$FFFF,$FFFF,$FF80,$0000,$0000
		dc.w	$FFFF,$FFFF,$FF80,$0000,$0000,$8000,$0000,$0080
		dc.w	$0000,$0000,$8000,$0000,$0080,$0000,$0000,$8000
		dc.w	$0000,$0080,$0000,$0000,$8000,$0000,$0080,$0000
		dc.w	$0000,$8000,$0000,$0080,$0000,$0000,$8000,$0000
		dc.w	$0080,$0000,$0000,$8000,$0000,$0080,$0000,$0000
		dc.w	$8000,$0000,$0080,$0000,$0000,$FFFF,$FFFF,$FF80
		dc.w	$0000,$0000,$0000,$0000,$00E0,$0000,$0000,$0000
		dc.w	$0000,$00E0,$0000,$0000,$1FFF,$FFFF,$F800,$0000
		dc.w	$0000,$0080,$0040,$0000,$0000,$0200,$0080,$0040
		dc.w	$0000,$0000,$1400,$0080,$0040,$003F,$0000,$0800
		dc.w	$0080,$0040,$07FF,$F800,$0000,$0080,$0040,$003F
		dc.w	$0000,$0000,$0080,$0040,$0000,$3800,$FFFF,$FFFF
		dc.w	$FFFF,$FFFF,$FE00,$0000,$0080,$0040,$0000,$0000

imagesize	equ	(((*-ImageData)>>2)-1)

		end
