;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; SDLCFTX.ASM - SDLC FILE TRANSFER - USED WITH SDLCFRX.ASM ;; TRANSMITS FILE AS 1 FRAME USING POLLED PROCEDURES. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CODE SEGMENT ASSUME CS:CODE,DS:CODE 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,0C1H ;RX 8 BITS/CHARACTER, RX ENABLED DB 2,0 ;INTERRUPT VECTOR DB 5,69H ;TX ENABLE, TX 8 BITS/CHARACTER, TX CRC ENABLED DB 6,0 ;SYNC INFORMATION (NOT USED) DB 7,7EH ;SDLC FLAG DB 10,0 ;NRZ/FM/LOOP MODE (NOT USED) DB 11,16H ;RXCLK = RTXC PIN, TXCLK = TXC PIN = OUT DB 12,0FEH ;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,80H ;RESET CRC DB 0,30H ;RESET ERROR DB 0,90H ;RESET TX UNDERRUN, EXT/STATUS INTERRUPTS DB 0,90H ;AGAIN DB 1,00H ;NO DMA\ NO INTS INITE LABEL BYTE READF DB 'READING FILE$' TXMESS DB 'TRANSMITTING$' MMESS DB 'ERROR REQUESTING MEMORY$' ;ERROR MESSAGE FMESS DB 'ERROR OPENING FILE$' ;ERROR MESSAGE BUFF DB 512 DUP(?) ;FILE BUFFER FNAME DB 13 DUP(?) ;SPACE FOR FILENAME DPAGE DB 0 OFST DW 0 HANDLE DW 0 NUMRD DW 0 FLEN DW 0 BUFSEG DW 0 PGRAFS DW 0 COUNT DW 0 ;============================================================================= OVER: CALL CLS CALL INITIAL ;============================================================================== MOV AX,ZSEG ;DEALLOCATE EXCESS MEMORY ABOVE CODE MOV BX,AX ;RESIZE MEMORY BLOCK MOV AX,ES ;ES= SEGMENT BLOCK TO BE MODIFIED SUB BX,AX ;BX= DESIRED NEW BLOCK SIZE IN PARAGRAPGHS MOV AH,4AH ;FUNCTION 4A HEX INT 21H MOV DI,OFFSET FNAME MOV SI,82H ;PARSE FILENAME NXT: LODSB ;GET FILENAME OFF COMMAND LINE CMP AL,13 ;CR? JZ FDUN CMP AL,20H ;SPACE? JZ NXT MOV CS:[DI],AL ;STORE CHARACTER INC DI ;GET NEXT CHARACTER JMP NXT FDUN: PUSH DS XOR AL,AL ;ADD ZERO TO END OF FILENAME MOV CS:[DI],AL ;ASCIIZ DELIMITER APPENDED TO FILENAME MOV AH,3DH ;OPEN FILE MOV AL,0 ;READ ACCESS/COMPATIBILITY MODE/ MOV DX,SEG FNAME MOV DS,DX MOV DX,OFFSET FNAME INT 21H POP DS ;HANDLE RETURNED IN AX JNC FILE_OK ;FUNCTION SUCCESSFUL PUSH DS MOV DX,SEG FMESS MOV DS,DX MOV DX,OFFSET FMESS ;ERROR OPENING FILE CALL WRT_MESS ;PRINT ERROR MESSAGE POP DS JMP XIT ;EXIT FILE_OK: MOV HANDLE,AX ;SAVE FILE HANDLE MOV BX,AX MOV AH,42H ;GET FILE LENGTH (IN BYTES) MOV AL,2 ;SIGNED OFFSET FROM EOF XOR CX,CX XOR DX,DX ; INT 21H ;RETURNED IN AX MOV FLEN,AX ;SAVE IT MOV CL,4 SHR AX,CL ;GET # OF PARAGRAPHS MOV PGRAFS,AX ;SAVE IT INC PGRAFS ;ADD 1 PARAGRAPH FOR EXCESS BYTES MOV AH,42H ;SET FILE PTR TO BEGINNING OF FILE MOV AL,0 XOR CX,CX XOR DX,DX INT 21H MOV BX,PGRAFS ;REQUEST MEMORY BLOCK MOV AH,48H INT 21H JNC MEM_OK ;FUNCTION SUCCESSFUL PUSH DS MOV DX,SEG MMESS MOV DS,DX MOV DX,OFFSET MMESS ;ERROR REQUESTING MEMORY CALL WRT_MESS ;PRINT ERROR MESSAGE POP DS JMP XIT ;EXIT MEM_OK: MOV BUFSEG,AX ;SAVE SEGMENT (AX:0000) PUSH DS MOV AH,3FH ;READ FILE INTO BUFFER MOV BX,HANDLE MOV CX,FLEN ;FILESIZE IN BYTES MOV DX,BUFSEG MOV DS,DX XOR DX,DX INT 21H POP DS MOV NUMRD,AX ;NUMBER OF BYTES READ CALL WAIT_TX ;WAIT FOR TRANSMITTER EMPTY MOV AX,NUMRD ;TRANSMIT SIZE OF FILE MOV AL,AH MOV DX,238H ;SEND HIGH BYTE OUT DX,AL JMP $+2 JMP $+2 CALL WAIT_TX ;WAIT FOR TX EMPTY MOV AX,NUMRD MOV DX,238H OUT DX,AL ;SEND LOW BYTE JMP $+2 JMP $+2 CALL RTXUL ;RESET TX UNDERRUN LATCH - SEND INFO CALL WAIT_RX ;WAIT FOR RESPONCE FROM RX NODE PUSH DS MOV DX,SEG TXMESS MOV DS,DX MOV DX,OFFSET TXMESS ;"TRANSMITTING" CALL WRT_MESS POP DS MOV CX,NUMRD ;# OF BYTES TO XMIT MOV ES,BUFSEG XOR DI,DI L2: MOV AL,ES:[DI] ;GET CHAR INC DI CALL WAIT_TX ;WAIT FOR TX EMPTY MOV DX,238H OUT DX,AL ;SEND IT JMP $+2 JMP $+2 LOOP L2 CALL RTXUL ;RESET TX UNDERRUN LATCH MOV ES,BUFSEG ;DEALLOCATED MEMORY BLOCK MOV AH,49H INT 21H XIT: MOV AH,3EH ;CLOSE FILE MOV BX,HANDLE INT 21H MOV AX,4C00H ;TERMINATE PROGRAM INT 21H ;============================================================================= RTXUL PROC NEAR MOV DX,239H ;CONTROL PORT XOR AL,AL ;WR0 OUT DX,AL JMP $+2 JMP $+2 MOV AL,0C0H ;RESET TX UNDERRUN LATCH OUT DX,AL JMP $+2 JMP $+2 RET RTXUL ENDP WRT_MESS PROC NEAR PUSH DX MOV AH,2 ;SET CURSOR TO UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H POP DX MOV AH,9 ;WRITE MESSAGE 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 WAIT_TX PROC NEAR PUSH DX PUSH AX MOV DX,239H ;CONTROL PORT WTX1: XOR AL,AL ;RR0 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,4 ;TX EMPTY? JZ WTX1 ;NO - WAIT POP AX POP DX RET WAIT_TX ENDP WAIT_RX PROC NEAR PUSH DX PUSH AX MOV DX,239H ;CONTROL PORT WRX1: XOR AL,AL ;RR0 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,1 ;DATA AVAILABLE? JZ WRX1 ;NO - WAIT DEC DX IN AL,DX ;READ CHAR JMP $+2 JMP $+2 POP AX POP DX RET WAIT_RX ENDP INITIAL 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,239H ;CHANNEL (A) CONTROL PORT (BASE ADDRESS+1) 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 JMP $+2 INC BX ;INCREMENT TO PARAMETER MOV AL,CS:[BX] ;GET PARAMETER OUT DX,AL ;SEND TO 8530 CONTROL PORT JMP $+2 JMP $+2 INC BX ;INCREMENT TO REGISTER LOOP L1 ;LOOP UNTIL DONE RET INITIAL ENDP CLS PROC NEAR MOV AH,6 ;CLEAR SCREEN MOV CX,0 MOV DX,184FH MOV BH,7 MOV AL,0 INT 10H RET CLS ENDP CODE ENDS ZSEG SEGMENT ZSEG ENDS END START