; AMOS.M68 - AlphaFIX/L overlay to allow temporary exit to AMOS
;          Written at Castle Computer Group, Inc.
;               By David Greene, Winter 1985
;      Copyright (C) 1985  Castle Computer Group, Inc.
;

; This is an AlphaFIX/L overlay.  When in an FIX overlay all registers
; should be preseved, along with all JCB items that are used by FIX.
; (e.g.  JOBBRK,JOBERC,JOBEXI,JOBTRC  etc...)

; This overlay creates the AMOS command.  Usage is as follows
;
;  >AMOS command<CR>		; Executes the 'command' and returns
;
;  >AMOS<CR>			; This mode pretends that it is at monitor
;				; level by typing the normal prompt '.' 				
;				; and executing commands via the AMOS
;				; monitor call.  This mode is terminated
;				; when you hit CTRL-C at the dot.


;  Edit History  ******************************************
; 
;  100 - Created /DJG
;  101 - Made it work, by clearing DAT mode on entry /Cary Fitch
;	(Maybe it worked before, but it wouldn't work under 1.3 for me. )
;	Also changed object to AMOS.FXO to correspond to common "AMOS" use.
;  102 - Made it recognize both lower and upper case "fix" as command to
;		return to FIX program. 
;  103 - Put "FIX   " in JOBPRG when returning from overlay
;  104 - Make monitor simulator much better.  Make command files work nice.
;        Ajust CHKFIX routine.  /Dave Greene

;Define version equates
VMAJOR	=	1
VMINOR	=	0
VSUB	=	0
VEDIT	=	104. ;[101]
VWHO	=	0


	SEARCH	SYS			; Search system libraries
	SEARCH	SYSSYM
	SEARCH	TRM

	OBJNAM	AMOS.FXO		; designate FIX overlay


	PHDR	-1,0,PH$REU		; Program header (reusable)

;Start of overlay

 	SAVE	A0,D1,D5		; Save work registers
 	JOBIDX	A0			; Index my JCB 
	MOV 	JOBTRM(A0),A6		; index my terminal status
;was	ANDW	#^C<T$IMI!T$ECS!T$ILC>,@A6; clear image and noecho modes	
	ANDW	#^C<T$IMI!T$ECS!T$DAT>,@A6; [101] clear image and noecho modes	

	CLR	D5			; clear work register
 	PUSH	JOBEXI(A0)		; push amos exit SP onto stack
	MOV	#<-1_8.+10.>,D1		; erase to end of screen
	TCRT
	LIN				; is there a command already there ?	
	BNE	20$			; yes - then execute what is on
					;     command line and return to FIX
	SET	D5			; no - set AMOS imitation mode
 

; This routine pretends its the monitor.  It types a dot;
; accepts a command; and executes just like AMOS.

10$:
	TSTW	JOBCMZ(A0)		; did we invoke a command file?
	BEQ	15$			;  no - ok
	ORW	#C.MON,JOBCMS(A0)	; yes - KBD needs to think we are
					;  at the monitor to handle ':' cmds
	MOV	JOBCMS(A0),D1		; get command file status word
	ANDW	#C.SIL,D1		; are we in :S
	BNE	17$			;  yes - don't display prompt
15$:
	TTYL	JOBPRM(A0)		; pretend we're AMOS
17$:
	ANDW	#^C<J.CCA>,JOBSTS(A0)	; clear any pending control-c's
	KBD	40$			; get AMOS command
	CALL	CHKFIX			; check to see if he wants to return
	JEQ	40$			;  yes - end routine
	BYP				; bypass spaces
	LIN				; anything there ?
	BEQ	10$			;  no - continue
20$:
	SAVE	A0-A5,D0-D5		; yes - save all registers
	AMOS				; execute command
	REST	A0-A5,D0-D5		; restore all registers

	ANDW	#^C<C.MON>,JOBCMS(A0)	; tell KBD back in program
	TSTW	JOBCMZ(A0)		; any command file active ?
	BEQ	25$			;  no - ok
	ANDW	#^C<C.SIL>,JOBCMS(A0)	;  yes - make sure C.SIL is clear
25$:
	TST	D5			; are we in 'AMOS pretend' mode ?
	BNE	10$			;  yes - go back and get more commands

; This routine is executed when mode 1 is used.
; It prevents return to AlphaFIX before the user
; can appreciate the results

	MOV 	JOBTRM(A0),A6		; not index terminal attribute word
	ORW	#<T$IMI!T$ECS>,@A6	; and reset image and noecho mode
	CRLF				; a little asthetics
	CRLF
	MOV	#<-1_8.+11.>,D1		; lower intensity
	TCRT
	TYPE	<Press >			
	MOV	#<-1_8.+12.>,D1		; higher intensity
	TCRT
	TYPE	<Any Key >
	MOV	#<-1_8.+11.>,D1		; back to lower
	TCRT
	TYPE	<to Return to >		; back to higher
	MOV	#<-1_8.+12.>,D1
	TCRT
	TYPE	<AlphaFIX: >
30$:
	ANDW	#^C<J.CCA>,JOBSTS(A0)	; clear any pending ctrlcs
	TIN				; get a character
 	CMPB	D1,#3.			; is this a CTRLC
 	BEQ	30$			; yes clear it and get a real 
					;   character
;This routine is either fallen through to or, when in 'AMOS pretend'
;mode a Ctrl-C is hit.
40$:
	MOV 	JOBTRM(A0),A6		; index terminal attribute word
	ORW	#<T$IMI!T$ECS>,@A6	; set image and noecho mode
					; in order to redisplay the
					; AlphaFIX menu, we need to 
	ORW	#J.CCA,JOBSTS(A0)	; simulate a CTRLC 
	JOBIDX				; [103 cf]
	MOVW	#[FIX],JOBPRG(A6)	; [103 cf]
	MOVW	#[   ],JOBPRG+2(A6)	; [103 cf]
 	POP	JOBEXI(A0)		; restore exit trap SP
 	REST	A0,D1,D5		; restore work registers
	RTN				; and return to AlphaFIX/L

;  This routine checks to see if you want back into FIX.  A valid request
;  is 'FIX<CR>'.  FIX610 will not cut it.
CHKFIX:
	PUSH	A2
	BYP				; skip spaces
	MOVB	(A2),D1			; get first byte of string
	UCS				; upper case
	CMPB	D1,#'F			; 'f' ?
	BNE	10$			;  no - not 'Fix'
2$:	INC	A2			; get next bye
	MOVB	@A2,D1			; 
	UCS				; fold
	CMPB	D1,#'I			; is it 'I' ?
	BNE	10$			;   no - can't be 'fIx'
4$:	INC	A2			; get next byte
	MOVB	@A2,D1			; 
	UCS				; fold
	CMPB	D1,#'X			; is it 'X'
	BNE	10$			;   no - not 'fiX'
	INC	A2			;  yes - check to see if FIX is part
	BYP				;        of something; like 'FIXCRC'
	LIN
	BNE	10$
	POP	A2			; restore A2 for posterity
	LCC	#4			; set success flag
	RTN				; and return
10$:
	POP	A2			; A2 back to real command
	LCC	#0			; no this is not a request for FIX
	RTN				; return

	END				; End Of Source