;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; FDPXSDLC.ASM ;; FULL DUPLEX DMA TRANSFER ;; [TX - CHANNEL 3] ;; [RX - CHANNEL 1] ;; SDLC FORMAT - 38.4K BAUD ;; TRANSMITS 640 BYTES, ;; RECEIVES AND DISPLAYES 640 BYTES OF DATA ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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,20H ;X1 MODE, SDLC MODE DB 3,0C0H ;RX DISABLED, RX 8 BITS/CHARACTER DB 2,0 ;INTERRUPT VECTOR DB 5,61H ;TX DISABLED, TX CRC ENABLED, TX 8 BITS/CHARACTER DB 6,0 ;SYNC INFORMATION (NOT USED) DB 7,7EH ;SDLC FLAG DB 10,0 ;NRZ/FM/LOOP MODE (NOT USED) DB 11,16H ;RX CLK=RTC PIN, TX CLK=TXC PIN DB 12,0CH ;TIME CONSTANT - LOW BYTE DB 13,0 ;TIME CONSTANT - HIGH BYTE DB 14,17H ;B.R.G. ENABLED/SOURCE - LOOPBACK DB 15,0 ;MISCELLANEOUS CONTROL BITS (NOT USED) DB 0,10H ;RESET EXT/STATUS INTERRUPTS DB 0,80H ;RESET TX CRC GENERATOR DB 1,60H ;READY/DMA REQUEST SELECTED - DMA ON RX 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 80 DUP(83) ;S DB 80 DUP(69) ;E DB 80 DUP(65) ;A DB 80 DUP(76) ;L DB 80 DUP(69) ;E DB 80 DUP(86) ;V DB 80 DUP(69) ;E DB 80 DUP(76) ;L 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 JMP $+2 INC BX ;INCREMENT TO PARAMETER MOV AL,CS:[BX] ;GET PARAMETER OUT DX,AL ;SEND TO 8530 CONTROL PORT JMP $+2 INC BX ;INCREMENT TO REGISTER LOOP L1 ;LOOP UNTIL DONE ;=========================================================================== 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,45H ;SELECT DMA CHANNEL 1 - I/O TO MEMORY TRANSFER OUT DX,AL MOV DX,0BH ;SET MODE - CHANNEL 3 MOV AL,4BH ;SELECT DMA CHANNEL 3 - MEMORY TO I/O TRANSFER OUT DX,AL MOV AX,CS ;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,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,CS ;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,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 MOV DX,3 ;COUNT REGISTER - DMA CHANNEL 1 - RX 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,0CH ;RESET INTERNAL DMA FLIP/FLOP MOV AL,0 OUT DX,AL MOV DX,7 ;COUNT REGISTER - DMA CHANNEL 3 - TX 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,239H MOV AL,3 OUT DX,AL JMP $+2 MOV AL,0C1H ;RX ENABLED OUT DX,AL JMP $+2 MOV DX,239H MOV AL,5 OUT DX,AL JMP $+2 MOV AL,69H ;TX ENABLED OUT DX,AL JMP $+2 MOV DX,239H MOV AL,1 OUT DX,AL JMP $+2 MOV AL,0E0H ;READY ENABLED OUT DX,AL JMP $+2 MOV DX,0FH ;DMA MASK ALL REGISTER MOV AL,0 ;CLEAR MASK - START DMA XFER OUT DX,AL MOV DX,239H ;CONTROL PORT WAIT_TXE: XOR AL,AL ;RR0 OUT DX,AL JMP $+2 IN AL,DX TEST AL,4 ;TX BUFFER EMPTY? JNZ WAIT_TXE ;YES - WAIT MOV DX,239H ;CONTROL PORT XOR AL,AL ;WR0 OUT DX,AL JMP $+2 MOV AL,0C0H ;RESET TX UNDERRUN LATCH OUT DX,AL L2: MOV AH,1 ;CHECK KEYBOARD INT 16H ;KEY PRESSED? JNZ XIT ;YES MOV DX,0CH ;CLEAR DMA FLIP/FLOP MOV AL,0 OUT DX,AL ;====================== PRINT BYTE COUNT ==================================== MOV DX,7 ;DMA COUNT REGISTER - CHANNEL 3 - TX 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,3 ;DMA COUNT REGISTER - CHANNEL 1 - RX 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,8 ;DMA STATUS REGISTER IN AL,DX ;GET STATUS TEST AL,2 ;CHANNEL 1 TERMINAL COUNT? JNZ XIT ;YES JMP L2 ;NOT DONE - GET COUNT ;============================================================================== XIT: 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 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