;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; RXDMA.ASM - DMA I/O TO MEMORY TRANSFER - ASYNCRONOUS FORMAT. ;; READS CHARACTERS FROM TERMINAL ;; @ 9600 BAUD, NO PARITY, 8 BIT WORD, 1 STOP BIT. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CODE SEGMENT 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,44H ;X16 MODE, 1 STOP BIT/CHARACTER DB 3,0C1H ;RX ENABLE, RX 8 BITS/CHARACTER DB 2,0 ;INTERRUPT VECTOR DB 5,60H ;TX 8 BITS/CHARACTER DB 6,0 ;SYNC INFORMATION (NOT USED) DB 7,0 ;SYNC INFORMATION (NOT USED) DB 10,0 ;NRZ/FM/LOOP MODE (NOT USED) DB 11,56H ;RX CLOCK/TX CLOCK/TRxC OUT = B.R. GENERATOR DB 12,14 ;TIME CONSTANT - LOW BYTE 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,0D0H ;RESET TX UNDERRUN - RESET EXT/STATUS INTERRUPTS DB 1,0E0H ;READY/DMA REQUEST ENABLE - DMA REQUEST SELECTED INITE LABEL BYTE MESS DB 'BYTE COUNT...> [Press any key to exit]$' BMESS DB 'BUFFER CONTENTS...> $' CLR DB ' $' BUFF DB 20 DUP (0) OVER: MOV AH,6 ;CLEAR SCREEN MOV CX,0 MOV DX,184FH MOV BH,7 MOV AL,0 INT 10H ;SETS UP 8530 - WRITES REGISTER NUMBER AND IT'S ASSOCIATED VALUE TO DATA PORT ; - NOTE: THIS IS A TWO STEP PROCESS MOV DX,239H ;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 INC BX ;INCREMENT TO PARAMETER MOV AL,CS:[BX] ;GET PARAMETER OUT DX,AL ;SEND TO 8530 CONTROL PORT INC BX ;INCREMENT TO REGISTER LOOP L1 ;LOOP UNTIL DONE MOV DX,0AH ;DMA SINGLE BIT MASK MOV AL,7 ;SELECT CHANNEL 3 - SET MASK OUT DX,AL MOV DX,0BH ;SET MODE MOV AL,47H ;SELECT DMA CHANNEL 3 - I/O TO MEMORY TRANSFER OUT DX,AL MOV AX,DS ;GENERATE ADDRESS OF BUFFER MOV CX,16 MUL CX MOV BX,OFFSET BUFF ADD AX,BX ;LOWER 16 BITS - HIGH BYTE IN AH, LOW BYTE IN AL ADC DL,0 ;UPPER 4 BITS - DMA PAGE IN DL PUSH DX ;SAVE IT MOV DX,6 ;DMA CHANNEL 3 ADDRESS REGISTER OUT DX,AL ;SEND LOW BYTE MOV AL,AH ;RESTORE HIGH BYTE OUT DX,AL ;SEND HIGH BYTE POP DX ;RESTORE UPPER 4 BITS OF ADDRESS MOV AL,DL MOV DX,82H ;DMA PAGE REGISTER - CHANNEL 3 OUT DX,AL MOV DX,0CH ;RESET INTERNAL DMA FLIP/FLOP MOV AL,0 OUT DX,AL ;SET TRANSFER COUNT (# BYTES-1) MOV DX,7 ;COUNT REGISTER - DMA CHANNEL 3 MOV AL,19 ;LOW BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV AL,0 ;HIGH BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV DX,140FH ;SET CURSOR POSITION MOV AH,2 MOV BH,0 INT 10H MOV DX,OFFSET MESS ;PRINT COUNT MESSAGE CALL WRT_MESS MOV DX,0AH ;DMA SINGLE BIT MASK MOV AL,3 ;SELECT CHANNEL 3 - CLEAR MASK - START DMA XFER OUT DX,AL L2: MOV AH,1 ;CHECK KEYBOARD INT 16H ;KEY PRESSED? JNZ XIT ;YES MOV DX,OFFSET CLR ;CLEAR NUMBER MOV AH,9 INT 21H MOV DX,0CH ;CLEAR DMA FLIP/FLOP MOV AL,0 OUT DX,AL MOV DX,7 ;DMA COUNT REGISTER - CHANNEL 3 IN AL,DX ;GET COUNT - LOW BYTE MOV BL,AL ;SAVE IT MOV BH,0 IN AL,DX ;GET COUNT - HIGH BYTE MOV CL,AL MOV CH,0 MOV AX,256 ;ADJUST FOR HIGH BYTE MUL CX ADD AX,BX PUSH AX ;SAVE COUNT MOV DX,141EH ;SET CURSOR POSITION MOV AH,2 MOV BH,0 INT 10H POP AX ;RESTORE COUNT CALL WRT_DEC ;WRITE IT CMP AX,65535 ;TEST FOR END OF TRANSFER JZ XIT ;END OF TRANSFER - EXIT JMP L2 ;NOT DONE - GET COUNT XIT: MOV DX,0AH ;DMA SINGLE BIT MASK MOV AL,7 ;SELECT CHANNEL 3 - SET MASK OUT DX,AL MOV AH,2 ;POSITION CURSOR MOV BH,0 MOV DX,0A00H INT 10H MOV DX,OFFSET BMESS ;PRINT MESSAGE CALL WRT_MESS MOV CX,20 ;COUNT MOV DI,OFFSET BUFF ;READ BUFFER P1: MOV AL,CS:[DI] ;PRINT CHARACTER MOV AH,14 INT 10H INC DI LOOP P1 ;LOOP UNTIL DONE MOV AX,4C00H ;TERMINATE PROGRAM INT 21H WRT_DEC PROC NEAR ;WRITES CONTENTS OF AX IN HEX AT CURSOR PUSH AX MOV SI,10 XOR CX,CX NZ: XOR DX,DX DIV SI PUSH DX INC CX OR AX,AX JNE NZ WD: POP DX MOV AX,DX MOV AH,14 MOV BH,0 ADD AL,48 INT 10H LOOP WD POP AX RET WRT_DEC ENDP WRT_MESS PROC NEAR MOV AH,9 INT 21H RET WRT_MESS ENDP CODE ENDS END START