;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; ACBTERM.ASM - TERMINAL EMULATION PROGRAM USING THE ACB-II CARD. ;; ASYNCRONOUS FORMAT, ;; 9600 BAUD, NO PARITY, 8 STOP BITS, 1 STOP BIT. ;; POLLED PROGRAM ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .MODEL SMALL .DOSSEG .STACK .DATA ESC_SCAN EQU 1BH F1_SCAN EQU 3BH F2_SCAN EQU 3CH F3_SCAN EQU 3DH DATA_A EQU 2F8H CONT_A EQU 2F9H ;8530 INITIALIZATION VALUES - SEE 8530 DATA SHEET FOR DETAILS INIT DB 9,0C0H ;FORCE HARDWARE RESET DB 4,00H ;X1 MODE, 8 BIT SYNC DB 10,0H ;0 NRZ CRC PRESET TO ZERO DB 6,0AAH ;SYNC DB 7,0AAH ;SYNC DB 11,16H ;TX CLOCK/TRxC= B.R. GENERATOR RC=RTxC PIN DB 12,0FEH ;TIME CONSTANT - LOW BYTE - 9600 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 5,064H DB 3,0C3H DB 0,0D0H ;RESET TX UNDERRUN - RESET EXT/STATUS INTERRUPTS DB 1,00H ;NO DMA - NO INTS DB 5,6AH INITE LABEL BYTE CHAR DW 0 P_FLAG DB 1 ;1=HEX MODE 0=ASCII MODE MESS DB '[Press F1 for ASCII, F2 for HEX, or ESC to exit]$' ;================================================================== .CODE START: MOV AX,@DATA MOV DS,AX CALL INTRO CALL INIT_SCC MOV DX,0 ;INITIAL CURSOR POSITION T3: MOV AH,2 ;SET CURSOR POSITION MOV BH,0 INT 10H TOP: MOV AH,1 ;CHECK KEYBOARD INT 16H ;KEY PRESSED? JZ NOKEY ;NO - CHECK RECEIVE PORT MOV AH,0 ;GET KEY INT 16H CMP AL,ESC_SCAN ;YES - IS IT ESCAPE? JZ XIT ;YES - EXIT CMP AH,F1_SCAN JNZ NEXT_CK CALL CH_ASCII NEXT_CK: CMP AH,F2_SCAN JNZ NEXT_C2 CALL CH_HEX NEXT_C2: CMP AH,F3_SCAN JNZ NEXT_C3 CALL RE_SYNC NEXT_C3: MOV CHAR,AX ;NO - SAVE CHARACTER T4: MOV DX,CONT_A ;SEND IT - CHANNEL (A) CONTROL PORT MOV AL,0 ;CHECK READ REGISTER 0 - STATUS INFORMATION OUT DX,AL JMP $+2 ;DELAY FOR 8530 RECOVERY TIME IN AL,DX ;READ STATUS AND AL,4 ;TX BUFFER EMPTY? JZ TOP ;NO - WAIT MOV AX,CHAR ;YES - SEND CHARACTER MOV DX,DATA_A ;CHANNEL (A) DATA PORT (23A HEX FOR CHANNEL B) OUT DX,AL ;SEND IT NOKEY: MOV DX,CONT_A ;CHANNEL (A) CONTROL PORT MOV AL,0 ;CHECK READ REGISTER 0 - STATUS INFORMATION OUT DX,AL JMP $+2 ;DELAY FOR 8530 RECOVERY TIME IN AL,DX ;READ STATUS AND AL,1 ;DATA READY? JZ TOP ;NO - CHECK KEYBOARD ;YES - GET CHARACTER MOV DX,DATA_A ;CHANNEL (A) DATA PORT IN AL,DX ;READ CHARACTER CALL PRINT OVER_T: JMP TOP ;START OVER XIT: MOV AX,4C00H ;TERMINATE PROGRAM INT 21H ;========================= CH_ASCII PROC NEAR MOV P_FLAG,1 RET CH_ASCII ENDP CH_HEX PROC NEAR MOV P_FLAG,0 RET CH_HEX ENDP ;======================== RE_SYNC PROC NEAR PUSH AX PUSH DX MOV DX,CONT_A MOV AL,3 OUT DX,AL JMP $+2 JMP $+2 MOV AL,0D3H JMP $+2 JMP $+2 POP DX POP AX RET RE_SYNC ENDP PRINT PROC NEAR CMP P_FLAG,0 ;0=ASCII 1=HEX JNZ HEX_MODE CALL WRT JMP OUT_P HEX_MODE: CALL WRT_HEX OUT_P: RET PRINT ENDP ;==================== WRT PROC NEAR MOV AH,14 ;PRINT IT IN ASCII MOV BH,0 INT 10H RET WRT ENDP ;====================== ;------------------------- WRT_HEX PROC NEAR ;WRITE BYTE AS TWO ASCII DIGITS PUSH DX MOV DL,AL ;HIGH NIBBLE MOV CX,4 SHR AL,CL CALL HEX_ASCII CALL WRT MOV AL,DL AND AL,0FH ;LOW NOBBLE CALL HEX_ASCII CALL WRT POP DX RET WRT_HEX ENDP ;------------------------------------------------ HEX_ASCII PROC NEAR CMP AL,9 ;1='1' ETC JG LETTER ADD AL,30H JMP THRU LETTER: ADD AL,37H THRU: RET HEX_ASCII ENDP ;------------------------------------------------ ;========================= INTRO PROC NEAR MOV AH,6 ;CLEAR SCREEN MOV CX,0 MOV DX,184FH MOV BH,7 MOV AL,0 INT 10H MOV DX,1800H ;SET CURSOR MOV AH,2 MOV BH,0 INT 10H MOV DX,OFFSET MESS ;PRINT MESSAGE MOV AH,9 INT 21H RET INTRO ENDP ;==================== INIT_SCC PROC NEAR ;SETS UP 8530 - WRITES REGISTER NUMBER AND IT'S ASSOCIATED VALUE TO DATA PORT ; - NOTE: THIS IS A TWO STEP PROCESS MOV DX,CONT_A ;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,[BX] ;GET REGISTER OUT DX,AL ;SEND TO 8530 CONTROL PORT INC BX ;INCREMENT TO PARAMETER MOV AL,[BX] ;GET PARAMETER OUT DX,AL ;SEND TO 8530 CONTROL PORT INC BX ;INCREMENT TO REGISTER LOOP L1 ;LOOP UNTIL DONE RET INIT_SCC ENDP ;===================== END START