;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; FDPXDMA.ASM ;; FULL DUPLEX DMA TRANSFER ;; [TX - CHANNEL 1] ;; [RX - CHANNEL 3] ;; ASYNCRONOUS FORMAT - 9600 BAUD ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .MODEL MEDIUM .CODE ORG 100H JMP OVER ;8530 INITIALIZATION VALUES - SEE 8530 DATA SHEET FOR DETAILS INIT DB 9,0C0H ;FORCE HARDWARE RESET DB 4,04 ;X16 MODE, 1 STOP BIT/CHARACTER DB 3,0C1H ;RX ENABLE, RX 8 BITS/CHARACTER DB 2,0 ;INTERRUPT VECTOR DB 5,68H ;TX ENABLE, 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 9600 DB 13,0 ;TIME CONSTANT - HIGH BYTE DB 14,7 ;BAUD RATE GENERATOR ENABLED/SOURCE - DTR/REQ 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]',10,10,13 DB 'TX...>',10,13,'RX...>$' BMESS DB 'BUFFER CONTENTS:',10,13,'$' TXBUFF DB 20 DUP('*** THIS IS A TEST OF THE ACB BOARD *** ') RXBUFF DB 640 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 L1A: MOV DX,0FH ;DMA MASK ALL REGISTER MOV AL,10 ;MASK CHANNEL 1,3 OUT DX,AL MOV DX,0BH ;SET MODE - CHANNEL 1 MOV AL,49H ;SELECT DMA CHANNEL 1 - MEMORY TO I/O TRANSFER OUT DX,AL MOV DX,0BH ;SET MODE - CHANNEL 3 MOV AL,47H ;SELECT DMA CHANNEL 3 - I/O TO MEMORY TRANSFER OUT DX,AL MOV AX,SEG TXBUFF ;GENERATE ADDRESS OF TX BUFFER MOV CX,16 MUL CX MOV BX,OFFSET TXBUFF 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,2 ;DMA CHANNEL 1 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,83H ;DMA PAGE REGISTER - CHANNEL 1 OUT DX,AL XOR DX,DX MOV AX,SEG RXBUFF ;GENERATE ADDRESS OF RX BUFFER MOV CX,16 MUL CX MOV BX,OFFSET RXBUFF 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 (# OF BYTES - 1) MOV DX,3 ;COUNT REGISTER - DMA CHANNEL 1 MOV AL,7FH ;LOW BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV AL,2 ;HIGH BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV DX,7 ;COUNT REGISTER - DMA CHANNEL 3 MOV AL,7FH ;LOW BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV AL,2 ;HIGH BYTE OF BYTE COUNT OUT DX,AL ;SEND TO DMA CONTROLLER MOV DX,020FH ;SET CURSOR POSITION MOV AH,2 MOV BH,0 INT 10H MOV DX,OFFSET MESS ;PRINT COUNT MESSAGE CALL WRT_MESS MOV DX,0FH ;DMA MASK ALL REGISTER MOV AL,0 ;CLEAR MASK - START DMA XFER OUT DX,AL L2: MOV AH,1 ;CHECK KEYBOARD INT 16H ;KEY PRESSED? JNZ BXIT ;YES MOV DX,239H IN AL,DX ;READ 8530 - DUMMY READ TO TEST ACCESS TIMING MOV DX,0CH ;CLEAR DMA FLIP/FLOP MOV AL,0 OUT DX,AL MOV DX,3 ;DMA COUNT REGISTER - CHANNEL 1 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,0507H ;SET CURSOR POSITION MOV AH,2 MOV BH,0 INT 10H POP AX ;RESTORE COUNT CALL WRT_DEC ;WRITE IT 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,0407H ;SET CURSOR POSITION MOV AH,2 MOV BH,0 INT 10H POP AX ;RESTORE COUNT CALL WRT_DEC ;WRITE IT MOV DX,8 ;DMA STATUS REGISTER IN AL,DX ;GET STATUS AND AL,2 ;CHANNEL 1 REACHED TERMINAL COUNT? JNZ XIT ;YES MOV DX,239H IN AL,DX ;DUMMY READ JMP L2 ;NOT DONE - GET COUNT BXIT: JMP EXIT XIT: NOP MOV DX,0FFFFH ;KILL SOME TIME XIT1: DEC DX JNZ XIT1 MOV DX,0FH ;DMA MASK ALL REGISTER MOV AL,10 ;MASK CHANNEL 1,3 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,640 ;COUNT MOV DI,OFFSET RXBUFF;READ BUFFER P1: MOV AL,CS:[DI] ;PRINT CHARACTER MOV AH,14 INT 10H INC DI LOOP P1 ;LOOP UNTIL DONE EXIT: MOV DX,0FH MOV AL,10 ;MASK OFF DMA 1,3 OUT DX,AL 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 ADD DX,100H MOV AH,9 INT 21H RET WRT_MESS ENDP CLR PROC NEAR MOV AH,6 MOV AL,0 MOV BH,7 MOV CX,0 MOV DX,184FH INT 10H XOR DX,DX MOV AH,2 MOV BH,0 INT 10H RET CLR ENDP END