Category : Tutorials + Patches
Archive   : NAT_UART.ZIP
Filename : 451.ASM

 
Output of file : 451.ASM contained in archive : NAT_UART.ZIP
;***************************************************************************
;FILE NAME :451.ASM *
;VERSION :1.0 *
;DATE :APR. 25, 1989 *
;AUTHOR :Welson Lin *
;PURPOSE :THIS PROGRAM IS TO CHECKOUT THE FUNCTIONALITY OF 16C451 *
; PARALLEL PORT REGISTERS-- DATA, CONROL, AND STATUS REGISTERS, *
; AND THE INPUT AND OUTPUT PINS ASSOCIATED WITH THE DEVICE. *
;***************************************************************************
DISPMSG MACRO MSG
MOV DX,OFFSET MSG
MOV AX,SEG MSG
MOV DS,AX
MOV AH,9
INT 21H
ENDM
STAK SEGMENT
DW 64 DUP (?)
STAK ENDS
;
DATASEG SEGMENT
DATA DB 00H
EVN DB 00H
ODD DB 10H
MSBYTE DB ?
LSBYTE DB ?
SAVE DB ?
START_MSG DB 0AH,0DH,'*** Make sure the loopback connector is'
DB ' pluged in ***',0AH,0DH,0AH,0DH
DB ' Strike any key when ready ...$'
PRN_NO DB 0AH,0DH,0AH,0DH,' Select the parallel port to be tested :'
DB 0AH,0DH,0AH,0DH,' 1. LPT1 (3BCH-3BEH)',0AH,0DH
DB 0AH,0DH,' 2. LPT2 (378H-37AH)',0AH,0DH
DB 0AH,0DH,' 3. LPT3 (278H-27AH)',0AH,0DH,'$'
SLCT_MSG DB 0AH,0DH,' Select :$'
DTR DW 3BCH
STR DW ?
CTR DW ?
RDMSG DB 0AH,0DH,' READ $',0AH,0DH
WRMSG DB 0AH,0DH,' WRITE $',0AH,0DH
CTRMSG DB 0AH,0DH,' !! CTR RESERVE BIT ERROR !!','$',0AH,0DH
STRMSG DB 0AH,0DH,' !! STR RESERVE BIT ERROR !!','$',0AH,0DH
MSG1 DB 0AH,0DH,' !! DTR READ/WRITE ERROR !!','$',0AH,0DH
MSG2 DB 0AH,0DH,' !! CTR EVEN TEST ERROR !!','$',0AH,0DH
MSG3 DB 0AH,0DH,' !! CTR ODD TEST ERROR !!','$',0AH,0DH
IQ0 DB 0AH,0DH,' !! /IRQ=1 !!','$',0AH,0DH
IQ1 DB 0AH,0DH,' !! /IRQ=0 !!','$',0AH,0DH
MSG4 DB 0AH,0DH,' !! /BUSY=0 !!','$',0AH,0DH
MSG5 DB 0AH,0DH,' !! /ACK=1 !!','$',0AH,0DH
MSG6 DB 0AH,0DH,' !! /BUSY=1 !!','$',0AH,0DH
MSG7 DB 0AH,0DH,' !! /ACK=0 !!','$',0AH,0DH
MSG8 DB 0AH,0DH,' !! PE=0 !!','$',0AH,0DH
MSG9 DB 0AH,0DH,' !! PE=1 !!','$',0AH,0DH
MSG10 DB 0AH,0DH,' !! SLCT=1 !!','$',0AH,0DH
MSG11 DB 0AH,0DH,' !! SLCT=0 !!','$',0AH,0DH
MSG12 DB 0AH,0DH,' !! /ERROR=1 !!','$',0AH,0DH
MSG13 DB 0AH,0DH,' !! /ERROR=0 !!','$',0AH,0DH
MSG14 DB 0AH,0DH,'*** TEST DONE, NO ERRORS ***','$',0AH,0DH
AGAIN_MSG DB 0AH,0DH,' CONTINUE (Y/N) ?$'
DATASEG ENDS
;
PROG SEGMENT 'CODE'
ASSUME CS:PROG,DS:DATASEG,SS:STAK
;
CR EQU 0DH
COUNT EQU 255
CHAR1 EQU 0AAH
CHAR2 EQU 55H
CTR_MSK EQU 0EH
STR_MSK EQU 07H
CTR_RSV EQU 0E0H
STR_RSV EQU 07H
CTR_EVEN EQU 0EH
CTR_ODD EQU 0FH
STB_LOW EQU 11H
STB_HIGH EQU 10H
IRQ_MSK EQU 07H
SET_STB EQU 11H
RST_STB EQU 10H
IRQ_ON EQU 03H
IRQ_OFF EQU 07H
IRQ_DIS EQU 00H
BUSY_MSK EQU 80H
ACK_MSK EQU 40H
PE_MSK EQU 20H
SLCT_MSK EQU 01H
ERR_MSK EQU 08H
STB_1 EQU 0C5H
STB_0 EQU 0C4H
INIT_1 EQU 0CCH
INIT_0 EQU 0C8H
SLCT_1 EQU 0CCH
SLCT_0 EQU 0C4H
AFD_1 EQU 0CEH
AFD_0 EQU 0CCH
;
START:
PUSH DS ;INITIALIZATION
SUB AX,AX
PUSH AX
MOV AX,DATASEG
MOV DS,AX
;
DISPMSG START_MSG ;DISPLAY MSG AND WAIT FOR KEYBOARD
MOV AH,8 ;INPUT
INT 21H
;
NXT_TEST: DISPMSG PRN_NO ;WAIT FOR PRN PORT NO SELECTION
KEY_IN: DISPMSG SLCT_MSG
MOV AH,1
INT 21H
CMP AL,CR
JE GET_ADD ;CHECK IF DEFAULT SELECTION
;
CMP AL,'1'
JE GET_ADD
CMP AL,'2'
JNE LPT_3
MOV WORD PTR[DTR],378H
JMP SHORT GET_ADD
LPT_3: CMP AL,'3'
JNE KEY_IN
MOV WORD PTR[DTR],278H
JMP SHORT GET_ADD
;
GET_ADD: MOV DX,[DTR] ;GET STATUS AND CONTROL REG. ADDRESS
INC DX
MOV [STR],DX
INC DX
MOV [CTR],DX
;**********DATA REGISTER CHECK*************
;
MOV DX,DTR
MOV AL,CHAR1 ;WRITE TO DTR AND READ DTR
OUT DX,AL
;
IN AL,DX
CMP AL,CHAR1
JE NXT_DATA
;
DISPMSG MSG1 ;IF NOT SAME, DISPLAY ERROR MSG
JMP QUIT
;
NXT_DATA: MOV AL,CHAR2
OUT DX,AL
IN AL,DX
CMP AL,CHAR2
JE DTR_OK
DISPMSG MSG1
JMP QUIT
;
;********CONTROL AND STATUS REGISTER RESERVED BIT TEST*******
;
DTR_OK: MOV CL,COUNT
MOV BYTE PTR[DATA],0 ;CONTROL REGISTER RESERVED BIT CHECK
NXTONE: MOV AL,[DATA]
MOV DX,CTR
OUT DX,AL
IN AL,DX
AND AL,CTR_MSK
CMP AL,CTR_RSV
JNE CTRERR
;
MOV DX,STR ;STATUS REGISTER RESERVED BIT CHECK
IN AL,DX
AND AL,STR_MSK
CMP AL,STR_RSV
JNE STRERR
DEC CL
JZ RSV_OK
INC BYTE PTR[DATA]
JMP SHORT NXTONE
;
CTRERR: MOV DX,OFFSET CTRMSG ;ERROR MESSAGE FOR CTR READ/WRITE ERROR
MOV AH,9
INT 21H
JMP QUIT
;
STRERR: MOV DX,OFFSET STRMSG ;ERROR MESSAGE FOR STR READ/WRITE ERROR
MOV AH,9
INT 21H
JMP QUIT
;
;*********CONTROL REGISTER CHECK**************
;
RSV_OK: MOV CL,08 ;TEST CTR, EVEN NUMBER TEST
MOV CH,16
MOV DX,CTR
AGN: MOV AL,BYTE PTR[EVN]
MOV BL,AL
OR BL,CTR_EVEN
OUT DX,AL
IN AL,DX
CMP AL,BL ;CHECK IF EX
JE NXTTST
MOV BH,AL
;
DISPMSG WRMSG ;DISPLAY DATA WRITTEN TO CONTROL REG
;
MOV AL,[EVN] ;
CALL ASCODE
MOV DL,[MSBYTE]
MOV AH,2
INT 21H
MOV DL,[LSBYTE]
INT 21H
;
DISPMSG RDMSG ;DISPLAY DATA READ BACK
;
MOV AL,BH
CALL ASCODE
MOV DL,[MSBYTE]
MOV AH,2
INT 21H
MOV DL,[LSBYTE]
INT 21H
;
DISPMSG MSG2
JMP QUIT
;
NXTTST: DEC CH
JZ NXTEVN
INC BYTE PTR [EVN]
JMP SHORT AGN
NXTEVN: MOV CH,16
ADD BYTE PTR [EVN],11H
DEC CL
JNZ AGN
;
EVENOK: MOV CL,08 ;TEST CTR, ODD NUMBER TEST
MOV CH,16
MOV DX,CTR
NEXT: MOV AL,BYTE PTR[ODD]
MOV BL,AL
OR BL,CTR_ODD
OUT DX,AL
IN AL,DX
CMP AL,BL
JE TSTAGN
MOV BH,AL
;
DISPMSG WRMSG ;DISPLAY DATA WRITTEN TO CONTROL REG
;
MOV AL,BL ;
CALL ASCODE
MOV DL,[MSBYTE]
MOV AH,2
INT 21H
MOV DL,[LSBYTE]
INT 21H
;
DISPMSG RDMSG ;DISPLAY DATA READ
;
MOV AL,BH
CALL ASCODE
MOV DL,[MSBYTE]
MOV AH,2
INT 21H
MOV DL,[LSBYTE]
INT 21H
;
DISPMSG MSG3
JMP QUIT
;
TSTAGN: DEC CH
JZ NXTODD
INC BYTE PTR [ODD]
JMP SHORT NEXT
NXTODD: MOV CH,16
ADD BYTE PTR [ODD],11H
DEC CL
JNZ NEXT
;
IRQTST: MOV DX,CTR ;WRITE 1 TO INT ENABLE BIT
MOV AL,SET_STB ;AND CREAT A LOW TO HIGH ACK TRANSITION
OUT DX,AL
MOV AL,RST_STB
OUT DX,AL
MOV DX,STR
IN AL,DX
AND AL,IRQ_MSK
CMP AL,IRQ_ON
JE IRQ0OK
DISPMSG IQ0
JMP QUIT
;
IRQ0OK: MOV DX,CTR ;WRITE 1 TO INT ENABLE BIT
MOV AL,IRQ_DIS
OUT DX,AL
MOV DX,STR
IN AL,DX
AND AL,IRQ_MSK
CMP AL,IRQ_OFF
JE CTROK
DISPMSG IQ1
JMP QUIT
;
CTROK: MOV DX,CTR ;TEST /BUSY AND /ACK IN STR
MOV AL,STB_1 ;WRITE 1 TO STB
OUT DX,AL
MOV DX,STR ;READ STATUS
IN AL,DX ;SAVE READING
MOV BL,AL
AND AL,BUSY_MSK ;CHECK IF /BUSY=1
CMP AL,0
JNZ ACK0
;
DISPMSG MSG4 ;IF /BUSY=0, DISPLAY ERROR MSG
JMP QUIT
;
ACK0 : MOV AL,BL ;CHECK IF /ACK=0
AND AL,ACK_MSK
CMP AL,0
JZ BUSY0
;
DISPMSG MSG5 ;IF /ACK=1, DISPLAY ERROR MSG
JMP QUIT
;
BUSY0: MOV DX,CTR ;WRITE 0 TO STB IN CTR
MOV AL,STB_0
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
MOV BL,AL ;SAVE READING
AND AL,BUSY_MSK ;CHECK IF /BUSY=0
CMP AL,0 ;IF YES, CHECK /ACK
JZ ACK1
;
DISPMSG MSG6 ;IF /BUSY=1, DISPLAY ERROR MSG
JMP QUIT
;
ACK1: MOV AL,BL ;CHECK IF /ACK=1
AND AL,ACK_MSK ;IF YES, CHECK PE
CMP AL,0
JNZ PE1
;
DISPMSG MSG7 ;IF /ACK=0, DISPLAY ERROR MSG
JMP QUIT
;
PE1: MOV DX,CTR ;WRITE 1 TO /INIT BIT IN CTR
MOV AL,INIT_1
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,PE_MSK ;CHECK IF PE =1
CMP AL,0 ;IF YES, CONTINUE
JNZ PE0
;
DISPMSG MSG8 ;IF PE=0, DISPLAY ERROR MSG
JMP QUIT
;
PE0: MOV DX,CTR ;WRITE 0 TO /INIT IN CTR
MOV AL,INIT_0
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,PE_MSK ;CHECK IF PE=0
CMP AL,0 ;IF YES, CHECK SLCT
JZ SLCT0
;
DISPMSG MSG9 ;IF PE=1, DISPLAY ERROR MSG
JMP QUIT
;
SLCT0: MOV DX,CTR ;WRITE 1 TO SLCT IN BIT IN CTR
MOV AL,SLCT_1
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,SLCT_MSK ;CHECK IF SLCT=0
CMP AL,0 ;IF YES, CONTINUE
JZ SLCT1
;
DISPMSG MSG10 ;IF SLCT=1, DISPLAY ERROR MSG
JMP QUIT
;
SLCT1: MOV DX,CTR ;WRITE 0 TO SLCT IN BIT IN CTR
MOV AL,SLCT_0
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,SLCT_MSK ;CHECK IF SLCT=1
CMP AL,0 ;IF YES, CHECK /ERROR
JNZ ERROR0
;
DISPMSG MSG11 ;IF SLCT=0, DISPLAY ERROR MSG
JMP QUIT
;
ERROR0: MOV DX,CTR ;WRITE 1 TO AUTOXT FD IN CTR
MOV AL,AFD_1
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,ERR_MSK ;CHECK IF /ERROR=0
CMP AL,0 ;IF YES, CONTINUE
JZ ERROR1
;
DISPMSG MSG12 ;IF /ERROR=1, DISPLAY ERROR MSG
JMP QUIT
;
ERROR1: MOV DX,CTR ;WRITE 0 TO AUTOXT FD IN CTR
MOV AL,AFD_0
OUT DX,AL
MOV DX,STR
IN AL,DX ;READ STATUS REGISTER
AND AL,ERR_MSK ;CHECK IF /ERROR=1
CMP AL,0 ;IF YES, CONTINUE
JNZ STROK
;
DISPMSG MSG13 ;IF /ERROR=0, DISPLAY ERROR MSG
JMP QUIT
;
STROK: DISPMSG MSG14 ;IF NO ERROR, TEST DONE
QUIT: DISPMSG AGAIN_MSG
MOV AH,01H
INT 21H
CMP AL,'N'
JE GET_OUT
CMP AL,'Y'
JE ONE_MORE
CMP AL,'n'
JE GET_OUT
CMP AL,'y'
JNE QUIT
ONE_MORE: JMP NXT_TEST
GET_OUT: MOV AH,4CH
INT 21H
;**********************************************
; PROCEDURE : ASCODE --HEX TO ASCII CONVERSION
;**********************************************
ASCODE PROC NEAR
PUSH CX ;SAVE COUNTER
MOV CL,4 ;LOAD SHIFT COUNT
MOV [SAVE],AL ;SAVE INPUT DATA
AND AL,0F0H ;MASK OFF LSB
SHR AL,CL ;RIGHT SHIFT
POP CX ;RESTORE COUNTER
CMP AL,9 ;CHECK IF DATA IS BETWEEN 0-9
JA ATOFH
ADD AL,30H ;IF YES,CONVERT TO 30H-39H
MOV [MSBYTE],AL ;SAVE THE RESULT
LSB: MOV AL,[SAVE] ;LOAD ORIGINAL DATA
AND AL,0FH ;MASK OFF MSB
CMP AL,9 ;CHECK IF DATA IS BETWEEN 0-9
JA ATOFL
ADD AL,30H ;IF YES, CONVERT TO 30H-39H
MOV [LSBYTE],AL ;SAVE THE RESULT
RET
ATOFH: ADD AL,37H ;IF DATA IS BETWEEN A-F, CONVERT TO 41H-46H
MOV [MSBYTE],AL ;SAVE THE RESULT
JMP SHORT LSB
ATOFL: ADD AL,37H
MOV [LSBYTE],AL
RET
ASCODE ENDP
;
PROG ENDS
END START















  3 Responses to “Category : Tutorials + Patches
Archive   : NAT_UART.ZIP
Filename : 451.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/