;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; LINETERM.ASM - SENDS A STRING UP TO 80 CHARACTERS AS 1 FRAME. ;; - RECEIVES AND DISPLAYS INCOMING FRAMES. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CODE SEGMENT DATA DW 238H ;DATA PORT - CHANNEL A CONTROL DW 239H ;CONTROL PORT - CHANNEL A ASSUME CS:CODE,DS:CODE ORG 100H START: JMP OVER ;8530 INITIALIZATION VALUES - SEE 8530 DATA SHEET FOR DETAILS INIT DB 9,0C0H ;FORCE HARDWARE RESET DB 4,20H ;X1 MODE, SDLC MODE DB 3,0C0H ;RX 8 BITS/CHARACTER DB 2,0 ;INTERRUPT VECTOR DB 5,61H ;TX 8 BITS/CHARACTER, TX CRC ENABLED DB 6,0 ;ADDRESS DB 7,7EH ;SDLC FLAG DB 10,80H ;NRZ MODE - PRESET CRC TO 1 DB 11,16H ;TX CLOCK OUT = TRxC PIN, RX CLOCK = RTxC PIN DB 12,126 ;TIME CONSTANT - LOW BYTE - 19.2K BAUD DB 13,0 ;TIME CONSTANT - HIGH BYTE DB 14,3 ;BAUD RATE GENERATOR ENABLED/SOURCE DB 15,0 ;MISCELLANEOUS CONTROL BITS (NOT USED) DB 0,80H ;RESET CRC DB 0,30H ;ERROR RESET DB 0,90H ;RESET TX UNDERRUN - RESET EXT/STATUS INTERRUPTS DB 0,90H ;RESET TX UNDERRUN - RESET EXT/STATUS INTERRUPTS DB 1,0 ;NO INTERRUPTS, DMA DISABLED DB 3,0C1H ;RECEIVER ENABLED DB 5,69H ;TRANSMITTER ENABLED INITE LABEL BYTE MESS DB 'SDLC Line terminal - type a string followed by [ ENTER ] to transmit.' DB 10,13,'The string must be < 80 characters. Type [ ESC ] to exit.',10,10,13,'$' BUFF DB 85 DUP(0) ;TRANSMIT BUFFER RECBUFF DB 85 DUP(0) ;RECEIVE BUFFER COUNT DW 0 ;============================================================================== OVER: MOV AH,6 ;CLEAR THE SCREEN MOV CX,0 MOV DX,184FH MOV BH,7 MOV AL,0 INT 10H MOV AH,2 ;SET CURSOR AT UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H MOV DX,OFFSET MESS ;PRINT TITLE MOV AH,9 INT 21H ;============================================================================== ;SETS UP 8530 - WRITES REGISTER NUMBER AND IT'S ASSOCIATED VALUE TO DATA PORT ; - NOTE: THIS IS A TWO STEP PROCESS MOV DX,CONTROL ;CHANNEL (A) CONTROL PORT (BASE ADDRESS+1) ;CHANNEL (B) CONTROL PORT=23B HEX (BASE ADDRESS+3) MOV BX,OFFSET INIT ;LOCATION OF INITIALIZATION VALUES MOV CX,OFFSET INITE ;END OF DATA TABLE SUB CX,BX ;GET PARAMETER COUNT SAR CX,1 ;DIVIDE BY 2 L1: MOV AL,CS:[BX] ;GET REGISTER OUT DX,AL ;SEND TO 8530 CONTROL PORT JMP $+2 ;DELAY FOR THE 8530 RECOVERY TIME INC BX ;INCREMENT TO PARAMETER MOV AL,CS:[BX] ;GET PARAMETER OUT DX,AL ;SEND TO 8530 CONTROL PORT JMP $+2 ;DELAY FOR THE 8530 RECOVERY TIME INC BX ;INCREMENT TO REGISTER LOOP L1 ;LOOP UNTIL DONE ;============================================================================= MOV SI,OFFSET RECBUFF ;RECEIVE BUFFER POINTER MOV DI,OFFSET BUFF ;SET BUFFER INDEX MOV COUNT,0 ;CLEAR THE CHARACTER COUNT NO_CHAR: MOV DX,CONTROL ;CONTROL PORT XOR AL,AL ;RR0 OUT DX,AL JMP $+2 ;DELAY IN AL,DX TEST AL,1 ;DATA READY? JZ CX_KBRD ;NO - CHECK THE KEYBOARD GET_CHAR: MOV DX,DATA ;YES - DATA PORT IN AL,DX ;READ THE CHARACTER MOV CS:[SI],AL ;SAVE IT INC SI ;ADJUST CHARACTER COUNT MOV DX,CONTROL ;CONTROL PORT MOV AL,1 ;RR1 OUT DX,AL JMP $+2 ;DELAY IN AL,DX TEST AL,80H ;END OF FRAME? JZ NO_CHAR ;NOT YET MOV CX,SI ;END OF FRAME - GET RECEIVED CHAR COUNT MOV SI,OFFSET RECBUFF ;CHARACTER BUFFER SUB CX,SI ;GET THE FINAL COUNT SUB CX,2 ;DON'T PRINT 2 BYTES OF CRC WRT1: MOV AL,CS:[SI] ;GET CHARACTER FROM RECEIVE BUFFER INC SI ;ADJUST THE INDEX MOV AH,14 ;PRINT IT MOV BH,0 INT 10H LOOP WRT1 ;LOOP UNTIL DONE MOV SI,OFFSET RECBUFF ;RESET BUFFER POINTER CX_KBRD: MOV AH,1 ;CHECK KEYBOARD INT 16H ;ANY KEY PRESSED? JZ NO_CHAR ;NO - CHECK DATA PORT GET_KEY: MOV AH,0 ;GET CHAR INT 16H CMP AL,27 ;ESC? JZ XIT ;YES - EXIT CMP AL,13 ;CR? JZ WRT_LINE ;YES - TRANSMIT STRING MOV CS:[DI],AL ;NO - SAVE CHAR INC DI INC COUNT CMP COUNT,80 ;MAX # OF CHARACTERS JG WRT_LINE JMP CX_KBRD ;GO GET THE NEXT CHARACTER WRT_LINE: CMP COUNT,0 JZ NO_CHAR MOV DI,OFFSET BUFF ;START OF STRING BUFFER MOV CX,COUNT ;CHARACTER COUNT LP1: CALL WAIT_TX ;WAITS FOR TX EMPTY MOV AL,CS:[DI] ;GET CHAR MOV DX,DATA ;DATA PORT OUT DX,AL ;SEND IT INC DI ;ADJUST THE INDEX LOOP LP1 ;LOOP UNTIL DONE MOV DX,CONTROL ;CONTROL PORT XOR AL,AL ;WR0 OUT DX,AL JMP $+2 MOV AL,0C0H ;RESET TX UNDERRUN LATCH OUT DX,AL MOV DI,OFFSET BUFF ;SET BUFFER INDEX MOV COUNT,0 ;CHARACTER COUNT JMP NO_CHAR ;CHECK DATA PORT XIT: MOV AH,6 ;CLEAR SCREEN MOV CX,0 MOV DX,184FH MOV BH,7 MOV AL,0 INT 10H MOV AH,2 ;SET CURSOR AT UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H MOV AX,4C00H ;TERMINATE PROGRAM INT 21H WAIT_TX PROC NEAR MOV DX,CONTROL ;CONTROL PORT WT1: XOR AL,AL ;WR0 OUT DX,AL JMP $+2 IN AL,DX TEST AL,4 ;TX EMPTY? JZ WT1 ;NO - WAIT RET WAIT_TX ENDP CODE ENDS END START