;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; DMAFTX.ASM - DMA MEMORY TO I/O TRANSFER - ASYNCRONOUS FORMAT. ;; SENDS FILE TO 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,0C0H ;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 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,0C0H ;READY/DMA REQUEST ENABLE - DMA REQUEST SELECTED INITE LABEL BYTE FMESS DB 'ERROR OPENING FILE$' ;ERROR MESSAGE BUFF DB 512 DUP(?) ;FILE BUFFER FNAME DB 13 DUP(?) HANDLE DW 0 NUMRD DW 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 DI,OFFSET FNAME MOV SI,82H ;PARSE FILENAME NXT: LODSB CMP AL,13 ;CR JZ FDUN CMP AL,20H ;SPACE JZ NXT MOV CS:[DI],AL INC DI JMP NXT FDUN: XOR AL,AL MOV CS:[DI],AL ;ASCIIZ DELIMITER APPENDED TO FILENAME MOV AH,3DH ;OPEN FILE MOV AL,0 MOV DX,OFFSET FNAME INT 21H JNC FILE_OK ;FUNCTION SUCCESFULL MOV DX,OFFSET FMESS ;ERROR OPENING FILE CALL WRT_MESS ;PRINT ERROR MESSAGE JMP XIT ;EXIT FILE_OK: MOV HANDLE,AX ;SAVE FILE HANDLE MOV DX,10 ;DMA SINGLE BIT MASK MOV AL,5 ;MASK CHANNEL 1 OUT DX,AL MOV DX,11 ;DMA MODE PORT MOV AL,49H ;SINGLE TX, READ, AUTO INC OUT DX,AL RD_IN: MOV AH,3FH ;READ 512 BYTES FILE INTO BUFFER MOV BX,HANDLE MOV CX,512 MOV DX,OFFSET BUFF INT 21H MOV NUMRD,AX ;NUMBER OF BYTES READ MOV AX,DS ;GENERATE BUFFER ADDRESS MOV CX,10H MUL CX MOV BX,OFFSET BUFF ADD AX,BX ;LOWER 16 BITS IN AX ADC DL,0 ;DMA PAGE IN DL PUSH DX ;SAVE IT MOV DX,2 ;DMA CHNL1 ADDRESS REGISTER OUT DX,AL ;SEND LOW BYTE MOV AL,AH ;RESTORE HIGH BYTE OUT DX,AL ;SEND IT POP DX ;RESTORE PAGE MOV AL,DL MOV DX,83H ;DMA PAGE REGISTER - CHANNEL 1 OUT DX,AL MOV DX,0CH ;RESET INTERNAL F/F XOR AL,AL OUT DX,AL MOV DX,3 ;SET TRANSFER COUNT (# BYTES-1) MOV CX,NUMRD DEC CX MOV AL,CL ;LOW BYTE OF COUNT OUT DX,AL MOV AL,CH ;HIGH BYTE OF COUNT OUT DX,AL MOV DX,0AH ;DMA SINGLE BIT MASK MOV AL,1 ;CLEAR CHNL1 - START DMA TRANSFER OUT DX,AL WAYT: MOV DX,8 ;DMA STATUS REGISTER IN AL,DX TEST AL,2 ;CHNL1 TERMINAL COUNT REACHED? JZ WAYT ;NOT YET MOV DX,0AH ;DMA SINGLE BIT MASK MOV AL,5 ;MASK CHNL1 OUT DX,AL CMP NUMRD,512 ;LAST READ A PARTIAL READ? JL XIT ;YES - EXIT JMP RD_IN ;NO - GO GET MORE XIT: MOV AH,3EH ;CLOSE FILE MOV BX,HANDLE INT 21H MOV AX,4C00H ;TERMINATE PROGRAM INT 21H ;============================================================================= WRT_MESS PROC NEAR MOV AH,9 INT 21H RET WRT_MESS ENDP 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 CODE ENDS END START