	.IF	LISTD
	.LIST
	.PAGE
	.ELSE
	.NOLIST
	.ENDC
;****************************************************************************
;
;	Event Handler (for p_System events)
;
;	File:	SAGE.BIOSD.TEXT
;	Date:	17-Jan-84
;	Issue:	2B
;
;
;	COPYRIGHT (c) 1982, 1983, 1984 SAGE Computer Technology
;	All Rights Reserved
;
;****************************************************************************
;
;	History:
;
;	1     13-Jun-82 Initial release.
;	1A    20-Jul-82 Set BRKOUT flag when Break detected.
;	1B    14-Aug-82 Implemented ATTACH & Event Handler.
;	1C    24-Aug-82 Revised Event Handler.	Added scheduled events.
;			Added Break event.
;	1D     5-Jan-83 Added clear of 131 to Stop system.
;	2     23-Mar-83 Initial SAGE IV release.
;	2A    31-May-83 Added indirect call to SIGEVENT.
;	2B    17-Jan-84 Check if Foreground already enabled in LB_ENAB.
;			Changed INCH131 to RDCH131.
;			Added sleep command option to WTCH131.
;			Fixed Event on Break.
;
;****************************************************************************




.PAGE
;****************************************************************************
;
;	QUIET Handler
;
;****************************************************************************

LB_QUIE
	MOVE.B	#1,DISABLE	;Disable events
	RTS


;****************************************************************************
;
;	ENABLE Handler
;
;****************************************************************************

LB_ENAB
	BSET	#7,P8259+2	;Prevent foreground interrupts
	MOVE	SR,-(SP)	;Save condition codes
	CLR.B	DISABLE		;Allow events
	BSR.S	CHKEVNTS	;Check for Events
	MOVE	(SP)+,CCR
	BNE.S	$10		;Don't re-enable if was already disabled
	BCLR	#7,P8259+2	;Allow foreground interrupts again
$10	RTS
	
	
;****************************************************************************
;
;	ATTACH Handler
;
;	A0 is address of Attach Information.
;
;	  Offset 0: Event number (word)
;	  Offset 2: flag (0 = de-attach, 1 = attach) (byte)
;
;****************************************************************************

LB_ATCH
	MOVE.W	(A0),D0
	CMPI.W	#63.,D0
	BGT.S	$10		;Event number out of range
	MOVE.L	A1,-(A7)
	LEA	ATCHTBL,A1
	MOVE.B	2(A0),0(A1,D0.W) ;Store attach status in table
	MOVEA.L (A7)+,A1
$10	RTS


;****************************************************************************
;
;	EVENT Address setup
;
;	A0 is address of event routine.
;
;****************************************************************************

LB_EVNT
	MOVE.L	A0,EVENTA
	RTS


;****************************************************************************
;
;	Foreground dispatcher for events.
;
;****************************************************************************

EVNTHAND
	BCLR	#FGEVNT_B,FGTASKS+1 ;Clear foreground request bit
	TST.B	DISABLE
	BNE	FGEXIT		;Events are disabled
	BSR.S	CHKEVNTS	;Check for events
	BRA	FGEXIT


;	Check for events
CHKEVNTS
	TST.W	EVENTC		;Check Master Event count
	BEQ	CHKBRKE		;No events found
	MOVEM.L D0/A0-A1,-(SP)
	MOVE.W	EVENTL,D0	;Get last event number
	LEA	EVNTCTR,A1
	LEA	0(A1,D0.W),A1	;Get event address
	TST.B	(A1)
	BNE.S	$70		;Found last event

;	Isolate an unidentified event
$10	LEA	EVNTCTR+64.,A1
	MOVE.L	-(A1),D0	;60 - 63
	BNE.S	$30
	MOVE.L	-(A1),D0	;56 - 59
	BNE.S	$30
	MOVE.L	-(A1),D0	;52 - 55
	BNE.S	$30
	MOVE.L	-(A1),D0	;48 - 51
	BNE.S	$30
	MOVE.L	-(A1),D0	;44 - 47
	BNE.S	$30
	MOVE.L	-(A1),D0	;40 - 43
	BNE.S	$30
	MOVE.L	-(A1),D0	;36 - 39
	BNE.S	$30
	MOVE.L	-(A1),D0	;32 - 35
	BNE.S	$30
	MOVE.L	-(A1),D0	;28 - 31
	BNE.S	$30
	MOVE.L	-(A1),D0	;24 - 27
	BNE.S	$30
	MOVE.L	-(A1),D0	;20 - 23
	BNE.S	$30
	MOVE.L	-(A1),D0	;16 - 19
	BNE.S	$30
	MOVE.L	-(A1),D0	;12 - 15
	BNE.S	$30
	MOVE.L	-(A1),D0	; 8 - 11
	BNE.S	$30
	MOVE.L	-(A1),D0	; 4 -  7
	BNE.S	$30
	MOVE.L	-(A1),D0	; 0 -  3
	BNE.S	$30
	SUBQ.W	#1,EVENTC	;Coundn't find event, shorten count
	MOVEM.L (SP)+,D0/A0-A1
	BRA	CHKEVNTS	;  and try again

;	Isolate event in Longword
$30	TST.W	D0
	BNE.S	$40		;Found entry in low word
	SWAP	D0
	TST.B	D0
	BEQ.S	$60		;Not in Byte 1, Must be in Byte 0
	ADDQ.L	#1,A1		;Set up for Byte 1
	BRA	$60

$40	TST.B	D0
	BEQ.S	$50		;Not in Byte 3, Must be in Byte 2
	ADDQ.L	#3,A1		;Set up for Byte 3
	BRA	$60

$50	ADDQ.L	#2,A1		;Set up for Byte 2

$60	MOVE.L	A1,D0
	LEA	EVNTCTR,A0
	SUB.L	A0,D0		;Form event number

;	Process general events
$70	MOVEA.L EVENTA,A0
	JSR	(A0)		;Call event routine
	SUBQ.W	#1,EVENTC	;Decrement the master count
	SUBQ.B	#1,(A1)		;Decrement the event count
	BNE	$70		;Not done with this type of event
	TST.W	EVENTC		;Check count
	BNE	$10		;Look for more events
	MOVEM.L (SP)+,D0/A0-A1
;	Fall into check for Keyboard break


;	Check for Keyboard break
CHKBRKE TST.B	KEYBREAK
	BNE.S	$10		;Had keyboard break
	RTS

$10	CLR.B	KEYBREAK
	MOVEM.L D0/A0,-(A7)
	MOVEA.L NOBREAKP,A0	;Check if breaks are being accepted
	BTST	#NOBREAKF,(A0)
	BNE.S	$20		;No Break flag was set, ignore break process
	ST	BRKOUT		;Set up for breaking out of BIOS drivers
	MOVE.B	ATCHTBL+62.,D0	;Check if Break is attached
	BNE.S	$30		;Found attachment
	BCLR	#TRM_FLSH,TRMFLGS ;Clear the Flush flag
	BCLR	#TRM_STOP,TRMFLGS ;Clear the Stop flag
	MOVEA.L BREAKV,A0
	JSR	(A0)		;Call the Break routine
	BSET	#0,TRMCMD	;Check if transmit flag is off
	BNE.S	$20		;Transmit was already on
	MOVE.B	TRMCMD,TERM_C	;Enable transmit
$20	MOVEM.L (A7)+,D0/A0
	RTS

;	Signal the Break
$30	MOVEQ	#62.,D0
	JSR	SIGEVENT	;Call event routine
	BRA	$20


;	Routine to signal events from the BIOS
;	D0 contains the event number.
SIGNAL
	MOVE.L	A0,-(A7)
	BSET	#FGEVNT_B,FGTASKS+1 ;Set foreground flag
	ADDQ.W	#1,EVENTC	;Advance the master event count
	LEA	EVNTCTR,A0
	ADDQ.B	#1,0(A0,D0.W)	;Count the event
	MOVE.W	D0,EVENTL	;Set up last event
	MOVE.B	#5,SI8255	;Set up the foreground interrupt
	MOVEA.L (A7)+,A0
	RTS


;	Set up scheduled events
WTCH131
	MOVEM.L A0-A2,-(A7)
	MOVEA.L A0,A1		;A0 is used by scheduler
	MOVEA.L 8(A1),A2	;Get address of time data
	MOVE.W	12(A1),D0	;Get attachment number

;	Isolate attachment number
	CMP.W	#36.,D0
	BNE.S	$10
	LEA	SCHEV36,A0
	PEA	EVTO36
	BRA.S	$50
	
$10	CMP.W	#37.,D0
	BNE.S	$20
	LEA	SCHEV37,A0
	PEA	EVTO37
	BRA.S	$50
	
$20	CMP.W	#38.,D0
	BNE.S	$30
	LEA	SCHEV38,A0
	PEA	EVTO38
	BRA.S	$50

$30	CMP.W	#39.,D0
	BNE.S	$40
	LEA	SCHEV39,A0
	PEA	EVTO39
	BRA.S	$50

$40	CMP.W	#63.,D0
	BNE.S	$100
	LEA	SCHEV63,A0
	PEA	EVTO63
	
;	Set up schedule
$50	MOVE.L	(A7)+,4(A0)	;Set up routine address
	BSET	#7,P8259+2	;Disable foreground interrupts
	BSR	CSCHED		;Cancel any previous schedule
	BTST	#0,15(A1)	;Check for just cancelation
	BNE.S	$60		;Found cancelation
	MOVE.L	(A2),12(A0)	;Set up interval
	MOVE.L	(A2),8(A0)	;Set up new schedule
	MOVE.B	15(A1),16(A0)	;Set up control flag
	BSR	ESCHED		;Enter new schedule
	BTST	#2,15(A1)	;Check for Sleep request
	BNE.S	$80		;Found sleep request
$60	BCLR	#7,P8259+2	;Enable foreground interrupts
       
$70	MOVEM.L (A7)+,A0-A2
	RTS

;	Sleep processing
$80	BCLR	#7,P8259+2	;Re-enable foreground
	MOVE	#2100H,SR	;Disable interrupts
	BTST	#2,16(A0)	;Check completion flag
	BEQ.S	$90		;Found completion
	CLR.B	BRKOUT		;Clear break flag
	STOP	#2000H		;Hang and wait
	TST.B	BRKOUT		;Check break flag
	BEQ	$80		;Try again
	BRA	$70		;Broke out
	
$90	MOVE	#2000H,SR	;Re-enable interrupts
	BRA	$70		;Done
	

$100	MOVE.W	#-14.,2(A1)	;Set up error code
	BRA	$70
	

;	Event timeouts
EVTO36	MOVEQ	#36.,D0
	BRA.S	EVTOX

EVTO37	MOVEQ	#37.,D0
	BRA.S	EVTOX
	
EVTO38	MOVEQ	#38.,D0
	BRA.S	EVTOX
	
EVTO39	MOVEQ	#39.,D0
	BRA.S	EVTOX

EVTO63	MOVEQ	#63.,D0

EVTOX	MOVEA.L A2,A0
	BTST	#2,16(A0)	;Check for Sleep request
	BNE.S	$15		;Found Sleep request
	LEA	ATCHTBL,A1
	MOVE.B	0(A1,D0.W),D1
	BEQ.S	$10		;Nothing attached
	JSR	SIGEVENT	;Signal the event
$10	BTST	#1,16(A0)	;Check if cycled
	BEQ.S	$20		;Not cycled
	MOVEM.L D0-D2/A1/A2,-(A7) ;Prepare for direct entry to ESCHED
	MOVE.L	12.(A0),D1	;Set up time interval as clock
				;Note: last clock timeout value is already
				;      in 8(A0) so the interval is passed
				;      in D1.
	JMP	ESCHED1		;Enter the next schedule
				;  ESCHED will do the return

$15	BCLR	#2,16(A0)	;Indicate completion
$20	RTS


;	Stop System until next Event
RDCH131
	MOVE	#2700H,SR	;Disable all interrupts for test
	TST.W	EVENTC
	BNE.S	$10		;Found Event pending
	TST.B	KEYBREAK
	BNE.S	$10		;Found Break pending
	STOP	#2000H		;Hang here
	BRA	RDCH131		;Try again

$10	MOVE	#2000H,SR	;Re-enable interrupts
	RTS

                              