; slcml.asm
; SLC Machine language assist

; L. Stewart, August 24, 1982  1:07 PM
; L. Stewart, February 20, 1983  5:23 PM, init mode bytes
; L. Stewart, February 26, 1983  3:43 PM, interrupts off on reset

; interrupt data

slrcmd		EQU	020H
slrccbhi	EQU	021H
slrccblo		EQU	022H
sltcmd		EQU	024H
sltccbhi	EQU	025H
sltccblo		EQU	026H
stoffset		EQU	004H
ctoffset		EQU	003H
adoffset	EQU	001H
cmoffset	EQU	000H

C←CODE SEGMENT

C←DATA	SEGMENT

eneta	DB	?
←lccb	DB	5 DUP(?)
sltmode	DB	000H
slrmode	DB	000H

C←DATA	ENDS


ASSUME CS:C←CODE, DS:C←DATA

; start slt, address of ccb in BX
←SLTStart	PROC	NEAR
	XOR	AL,AL
	MOV	[stoffset+BX],AL
	MOV	AL,BL
	OUT	sltccblo,AL
	MOV	AL,BH
	OUT	sltccbhi,AL
	MOV	AL,0CH
	OUT	sltcmd,AL
	RET
←SLTStart	ENDP

; start slr, address of ccb in BX
←SLRStart	PROC	NEAR
	XOR	AL,AL
	MOV	[stoffset+BX],AL
	MOV	AL,BL
	OUT	slrccblo,AL
	MOV	AL,BH
	OUT	slrccbhi,AL
	MOV	AL,0CH
	OUT	slrcmd,AL
	RET
←SLRStart	ENDP

; initialize SLR
←SLRInit	PROC	NEAR
	MOV	slrmode,0
; reset SLR
	MOV	AL,0FH
	OUT	slrcmd,AL
; interrupts off
	MOV	AL,008H
	OUT	slrcmd,AL
; set modes and address
	MOV	BX,OFFSET ←lccb
	MOV	BYTE PTR [cmoffset+BX],0E0H
	MOV	WORD PTR [adoffset+BX],OFFSET slrmode
	MOV	BYTE PTR [ctoffset+BX],0FFH
	CALL  ←SLRStart
	CALL  ←WaitCCB
	MOV	BYTE PTR [cmoffset+BX],0C0H
	MOV	WORD PTR [adoffset+BX],OFFSET eneta
	MOV	BYTE PTR [ctoffset+BX],0FFH
	CALL  ←SLRStart
	CALL  ←WaitCCB
	RET
←SLRInit	ENDP

; initialize SLT
←SLTInit	PROC	NEAR
	MOV	sltmode,0
; reset SLT
	MOV	AL,00FH
	OUT	sltcmd,AL
; interrupts off
	MOV	AL,008H
	OUT	sltcmd,AL
; set modes and address
	MOV	BX,OFFSET ←lccb
	MOV	BYTE PTR [cmoffset+BX],0E0H
	MOV	WORD PTR [adoffset+BX],OFFSET sltmode
	MOV	BYTE PTR [ctoffset+BX],001H
	CALL  ←SLTStart
	CALL  ←WaitCCB
	RET
←SLTInit	ENDP

; initialize SLC.  address in BL
←SLCInit	PROC	NEAR
; save address
	MOV	eneta,BL
	CALL  ←SLRInit
	CALL  ←SLTInit
	RET
←SLCInit	ENDP

; wait for completion of ccb in BX
←WaitCCB	PROC	NEAR
wsl:	MOV	AL,[stoffset+BX]
	AND	AL,080H
	JZ	 wsl
	RET
←WaitCCB	ENDP

; return SLR status in BL
←SLRStat	PROC	NEAR
	XOR	AH,AH
	IN	AL,slrcmd
	MOV	BX,AX
	RET
←SLRStat	ENDP

; return SLT status in BL
←SLTStat	PROC	NEAR
	XOR	AH,AH
	IN	AL,sltcmd
	MOV	BX,AX
	RET
←SLTStat	ENDP

PUBLIC  ←SLRStart
PUBLIC  ←SLTStart
PUBLIC  ←SLCInit
PUBLIC  ←SLRInit
PUBLIC  ←SLTInit
PUBLIC  ←WaitCCB
PUBLIC  ←SLRStat
PUBLIC  ←SLTStat

C←CODE ENDS
	END