DATA_SEG SEGMENT
MESSAGE DB 'BUFFER OVERFLOW',0DH,0AH
.
.
.
DATA_SEG ENDS
COM_SEG SEGMENT COMMON
BUFFER DB 82 DUP(?) ;RESERVE BUFFER AREA
COUNT DW ? ;AND COUNT
COM_SEG ENDS
.
.
.
IN_BUFF EQU 52H ;ASSIGN NAMES TO
OUT_BUFF EQU 53H ;INTERFACE REGISTER
STATUS EQU 54H ;ADDRESS
RRDY EQU 00000010B ;AND READY BITS
TRDY EQU 00000001B ;IN STATUS REGISTER
.
.
.
ASSUME DS:DATA_SEG, ES:COM_SEG
MOV AX, DATA_SEG ;INITIALIZE THE DS
MOV DS, AX ;AND ES REGISTERS
MOV AX, COM_SEG
MOV ES, AX
.
.
.
MOV DI, OFFSET BUFFER ;INITIALIZATION NEEDED
MOV COUNT, DI
MOV CX, 81 ;FOR INPUT
CLD ;CLEAR DF FOR AUTOINCREMENT
NEXT_IN: IN AL, STATUS ;IDLE UNTIL CHARACTER
TEST AL, RRDY ;IS PUT IN INPUT
JZ NEXT_IN ;BUFFER REGISTER
IN AL, IN_BUFF ;INPUT CHARACTER
OR AL, 0 ;CHECK PARITY AND
JPE NO_ERROR ;BRANCH TO ERROR
JMP NEAR PTR ERROR ;IF PARITY IS ODD
NO_ERROR: AND AL, 7FH ;ELSE, CLEAR PARITY BIT
STOSB ;MOVE CHARACTER TO BUFFER
CMP AL, 0DH ;CHECK FOR CARRIAGE RETURN
LOOPNE NEXT_IN ;LOOP IF NO CR OR OVERFLOW
JNE OVERFLOW ;BRANCH ON OVERFLOW
MOV AL, 0AH ;APPEND LINE FEED
STOSB
SUB DI, COUNT
MOV COUNT, DI ;STORE NO. OF CHARACTERS
.
.
.
OVERFLOW: MOV SI, OFFSET MESSAGE ;INITIALIZATION NEEDED
MOV CX, 17 ;FOR OUTPUT
NEXT_OUT: IN AL, STATUS ;IDLE UNTIL OUTPUT
TEST AL,TRDY ;BUFFER REGISTER
JZ NEXT_OUT ;IS EMPTY
LODSB ;OUTPUT CHARACTER
OUT OUT_BUFF, AL
LOOP NEXT_OUT
.
.
.
Figure 6-6 Programmed I/O example
| PRETHODNA FOLIJA | SADRZAJ | SLEDECA FOLIJA |