As an example consider the processing components and their relationships
illustrated in Fig. 6-10. The main program is to initialize the necessary
interrupt pointers and then begin its normal processing. As it is executing,
interrupt I/O is used to input a line of characters to a buffer that is pointed
to by BUFF_POINT.
INT_SEG SEGMENT
ASSUME CS:INT_SEG, DS:DATA_SEG ;PARAMETERS ARE ACCESSIBLE VIA DS
IN_BUF EQU 52H
OUT_BUF EQU 53H
CONTROL EQU 54H
ENABLE_OUT EQU 00000001B
INT_ROUT: PUSH AX ;SAVE REGISTERS
PUSH BX
IN AL, IN_BUF ;INPUT CHARACTER
MOV BX, BUFF_POINT ;AND STORE IN
MOV [BX], AL ;MEMORY BUFFER
INC BX ;INCREMENT BUFFER POINTER
INC COUNT ;AND COUNT
MOV BUFF_POINT, BX ;STORE BUFFER POINTER
CMP AL, 0DH ;CHECK FOR CARRIAGE
JNZ NO_CR ;RETURN AND
MOV BYTE PTR [BX+1], 0AH ;APPEND A LINE FEED
INC COUNT
MOV CODE, 2 ;SET CODE TO 2 SO MAIN ROUTINE
XOR AL, AL ;MAY CALL PROCEDURE LINE PROC
OUT CONTROL, AL ;ALSO DISABLE INPUT DEVICE
JMP CONT
NO_CR: CMP COUNT, 81 ;CHECK FOR OVERFLOW
JB CONT ;IF NO RETURN
MOV CODE, 1 ;OTHERWISE SET CODE TO 1
MOV MSGCOUNT, 0 ;ZERO MSGCOUNT
MOV AL, ENABLE_OUT ;DISABLE INPUT AND ENABLE
OUT CONTROL, AL ;OUTPUT
CONT: POP BX ;RESTORE REGISTERS
POP AX
IRET
;THE FOLLOWING INTERRUPT SERVICE ROUTINE OUTPUTS ONE CHARACTER
;FROM MESSAGE WHEN INTERRUPT FROM OUTPUT DEVICE OCCURS
OVERFLOW: PUSH AX ;SAVE REGISTERS
PUSH BX
MOV BX, MSGCOUNT
MOV AL, MESSAGE[BX] ;OUTPUT A CHARACTER
OUT OUT_BUF, AL
INC MSGCOUNT ;INCREMENT COUNTER
CMP AL, OAH ;LAST CHARACTER IN MESSAGE?
JNE RETURN ;NO, RETURN, OTHERWISE
XOR AL, AL ;DISABLE FURTHER INTERRUPT
OUT CONTROL, AL ;FROM OUTPUT
RETURN: POP BX ;RESTORE REGISTERS
POP AX
IRET
INT_SEG ENDS
Figure 6-11 Interrupt routine for inputing a line of characters
| PRETHODNA FOLIJA | SADRZAJ | SLEDECA FOLIJA |