þ a‹R þ d þ w ÿÿÿÿÿÿÿÿÿÿþ m^9     þ hý	 oP    þ nSystem-wide;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	ASSEMBLY PROCEDURES FOR SPEEDING UP INTERRUPT MODE		;
;	IsrGetSendChar							;
;	IsrRcvChar							;
;	IsrDoCrc							;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


		NAME		PHYMODULE2
CGROUP		GROUP		CODE
DGROUP		GROUP		DATA

STACK		SEGMENT STACK	'STACK'
STACK		ENDS

		ASSUME		CS:CGROUP, DS:DGROUP, SS:STACK

; Constants for assembly routines

; Mailbox structure

MailboxStruc	STRUC
		fiActivity	DB ?
		fiCompletion	DB ?
		fiRequestLength	DW ?
		fiBufferAddr	DD ?
		unused1		DB 9 DUP (?)
		fiBldState	DB ?
		fiBldLength	DW ?
		fiBldCrc	DW ?
		unused2		DB 4 DUP (?)
		foActivity	DB ?
		foCompletion	DB ?
		foRequestLength	DW ?
		foBufferAddr	DD ?
		unused3		DB 9 DUP (?)
		foBldState	DB ?
		foBldLength	DW ?
		foBldCrc	DW ?
		unused4		DB 4 DUP (?)
MailboxStruc	ENDS

; Character constants

DLE		EQU		10H
STX		EQU		02H
ETX		EQU		03H

; Frame assembly states for send

foIgnore	EQU		0
foSendFirstDle	EQU		1
foSendStx	EQU		2
foSendChar	EQU		3
foSendDle	EQU		4
foSendLastDle	EQU		5
foSendEtx	EQU		6
foSendCrc1	EQU		7
foSendCrc2	EQU		8
foWaitLast	EQU		9

; Frame assembly states for receive

fiIgnore	EQU		0
fiDleSearch	EQU		1
fiStxSearch	EQU		2
fiRecvChar	EQU		3
fiRecvEtx	EQU		4
fiRecvCrc1	EQU		5
fiRecvCrc2	EQU		6

; Frame I/O completion request constants

foCompleted	EQU		2
fiInProgress	EQU		3
fiCompleted	EQU		4

; Frame I/O completion status constants

fiCmpGood	EQU		0
foCmpGood	EQU		0
fiCmpBadCrc	EQU		3
fiCmpLongI	EQU		6



DATA		SEGMENT PUBLIC	'DATA'

; Global variables for ISR

		EXTRN	pIsrMailbox: DWORD, isrChar: BYTE


; Crc table

crcTab0		DW	0
		DW	0C0C1H
		DW	0C181H
		DW	0140H
		DW	0C301H
		DW	03C0H
		DW	0280H
		DW	0C241H
		DW	0C601H
		DW	06C0H
		DW	0780H
		DW	0C741H
		DW	0500H
		DW	0C5C1H
		DW	0C481H
		DW	0440H

crcTab1		DW	0
		DW	0CC01H
		DW	0D801H
		DW	1400H
		DW	0F001H
		DW	03C00H
		DW	02800H
		DW	0E401H
		DW	0A001H
		DW	06C00H
		DW	07800H
		DW	0B401H
		DW	05000H
		DW	09C01H
		DW	08801H
		DW	04400H

DATA		ENDS


CODE		SEGMENT	PUBLIC 'CODE'


; Jump table for send fsm

foCase		DW	fo0
		DW	fo1
		DW	fo2
		DW	fo3
		DW	fo4
		DW	fo5
		DW	fo6
		DW	fo7
		DW	fo8
		DW	fo9

; Jump table for receive fsm

fiCase		DW	fi0
		DW	fi1
		DW	fi2
		DW	fi3
		DW	fi4
		DW	fi5
		DW	fi6



; Procedure IsrDoCrc
; On Entry: 		DS:DI = @mailbox, CL = isrChar, BX = crc
; Registers Destroyed:	AX, BX, DX, SI
; Returned value:	CRC in AX

IsrDoCrc	PROC	NEAR

		MOV	DX, BX
		XOR	BH, BH
		XOR	BL, CL
		MOV	SI, BX
		AND	BL, 0FH
		SHL	BL, 1
		MOV	AX, crcTab0[BX]
		MOV	BX, SI
		SHR	BL, 1
		SHR	BL, 1
		SHR	BL, 1
		SHR	BL, 1
		SHL	BX, 1
		XOR	AX, crcTab1[BX]
		XOR	AL, DH
		RET

IsrDoCrc	ENDP



; Procedure IsrGetSendChar

		PUBLIC	IsrGetSendChar
IsrGetSendChar	PROC	NEAR


		MOV	DI, WORD PTR pIsrMailbox
		XOR	BH, BH
		MOV	BL, [DI].foBldState
		SHL	BX, 1
		JMP	WORD PTR foCase[BX]

fo0:		XOR	AL, AL				; foIgnore
		RET

fo1:		MOV	isrChar, DLE			; foSendFirstDle
		MOV	[DI].foBldState, foSendStx
		XOR	AL, AL
		RET

fo2:		MOV	isrChar, STX			; foSendStx
		MOV	[DI].foBldState, foSendChar
		XOR	AL, AL
		RET

fo3:		MOV	SI, [DI].foBldLength		; foSendChar
		LES	BX, [DI].foBufferAddr
		MOV	CL, BYTE PTR ES:[BX][SI]
		MOV	isrChar, CL
		INC	SI
		MOV	[DI].foBldLength, SI
		MOV	BX, [DI].foBldCrc
		MOV	ES, SI
		CALL	IsrDoCrc
		MOV	SI, ES
		MOV	[DI].foBldCrc, AX
		CMP	CL, DLE
		JNE	fo31
		MOV	[DI].foBldState, foSendDle
		XOR	AL, AL
		RET
	fo31:	CMP	SI, [DI].foRequestLength
		JL	fo32
		MOV	[DI].foBldState, foSendLastDle
	fo32:	XOR	AL, AL
		RET

fo4:		MOV	isrChar, DLE			;  foSendDle
		MOV	DX, [DI].foBldLength
		CMP	DX, [DI].foRequestLength
		JL	fo41
		MOV	[DI].foBldState, foSendLastDle
		XOR	AL, AL
		RET
	fo41:	MOV	[DI].foBldState, foSendchar
		XOR	AL, AL
		RET

fo5:		MOV	isrChar, DLE			; foSendLastDle
		MOV	[DI].foBldState, foSendEtx
		XOR	AL, AL
		RET

fo6:		MOV	isrChar, ETX			; foSendEtx
		MOV	[DI].foBldState, foSendCrc1
		XOR	AL, Al
		RET

fo7:		MOV	AX, [DI].foBldCrc		; foSendCrc1
		MOV	isrChar, AL
		MOV	[DI].foBldState, foSendCrc2
		XOR	AL, AL
		RET

fo8:		MOV	AX, [DI].foBldCrc		; foSendCrc2
		MOV	isrChar, AH
		MOV	[DI].foBldState, foWaitLast
		XOR	AL, AL
		RET

fo9:		MOV	[DI].foActivity, foCompleted	;foWaitLast
		MOV	[DI].foCompletion, foCmpGood
		STC
		SBB	AL, AL
		RET

IsrGetSendChar	ENDP



; Procedure IsrRcvChar

		PUBLIC	IsrRcvChar
IsrRcvChar	PROC	NEAR


		MOV	DI, WORD PTR pIsrMailbox
		MOV	CL, isrChar
		XOR	BH, BH
		MOV	BL, [DI].fiBldState
		SHL	BX, 1
		JMP	WORD PTR fiCase[BX]

fi0:		XOR	AL, AL			; fiIgnore
		RET

fi1:		CMP	CL, DLE			; fiDleSearch
		JNE	fi11
		MOV	[DI].fiBldState, fiStxSearch
	fi11:	XOR	AL, AL
		RET

fi2:		XOR	AX, AX			; fiStxSearch
		CMP	CL, STX
		JNE	fi21
		MOV	[DI].fiBldState, fiRecvChar
		MOV	[DI].fiActivity, fiInProgress
		MOV	[DI].fiBldLength, AX
		MOV	[DI].fiBldCrc, AX
		RET
	fi21:	CMP	CL, DLE
		JE	fi22
		MOV	[DI].fiBldState, fiDleSearch
	fi22:	RET

fi3:		CMP	CL, DLE			;fiRecvChar
		JNE	fi31
		MOV	[DI].fiBldState, fiRecvEtx
		XOR	AL, AL
		RET
	fi31:	MOV	BX, [DI].fiBldCrc
        	CALL	IsrDoCrc
		MOV	[DI].fiBldCrc, AX
	fi32:	MOV	SI, [DI].fiBldLength
		LES	BX, [DI].fiBufferAddr
		MOV	ES:[BX][SI], CL
		INC	SI
		MOV	[DI].fiBldLength, SI
		CMP	SI, [DI].fiRequestLength
		JLE	fi33
		MOV	[DI].fiCompletion, fiCmpLongI
		STC
		SBB	AL, AL
		RET
	fi33:	XOR	AL, AL
		RET

fi4:		CMP	CL, ETX			; fiRecvEtx
		JNE	fi41
		MOV	[DI].fiBldState, fiRecvCrc1
		XOR	AL, AL
		RET
	fi41:	CMP	CL, STX
		JNE	fi42
		XOR	AX, AX
		MOV	[DI].fiBldState, fiRecvChar
		MOV	[DI].fiBldLength, AX
		MOV	[DI].fiBldCrc, AX
		RET
	fi42:	MOV	[DI].fiBldState, fiRecvChar
		JMP	fi31


fi5:		MOV	[DI].fiBldState, fiRecvCrc2	; fiRecvCrc1
		JMP	fi32

fi6:		MOV	SI, [DI].fiBldLength		; fiRecvCrc2
		LES	BX, [DI].fiBufferAddr
		MOV	BYTE PTR ES:[BX][SI], CL
		DEC	SI
		MOV	AX, WORD PTR ES:[BX][SI]
		INC	SI
		INC	SI
		MOV	[DI].fiBldLength, SI
		MOV	[DI].fiRequestLength, SI
		MOV	[DI].fiActivity, fiCompleted
		CMP	[DI].fiBldCrc, AX
		JE	fi61
		MOV	[DI].fiCompletion, fiCmpBadCrc
		STC
		SBB	AL, AL
		RET
	fi61:	MOV	[DI].fiCompletion, fiCmpGood
		STC
		SBB	AL, AL
		RET

IsrRcvChar	ENDP

CODE		ENDS

		END
