;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; SDLCFRX.ASM - POLLED FILE TRANSFER PROCEDURE - RECEIVING NODE. ;; RECEIVES FILE AS 1 FRAME. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 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 ;SYNC INFORMATION (NOT USED) DB 10,0 ;NRZ/FM/LOOP MODE (NOT USED) DB 11,16H ;RX CLOCK/TX CLOCK/TRxC OUT = B.R. GENERATOR 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 ENABLE / NO INT INITE LABEL BYTE MMESS DB 'NOT ENOUGH MEMORY - TRANSFER ABORTED $' FMESS DB 'ERROR OPENING FILE $' ;ERROR MESSAGE RECMESS DB 'RECEIVING... ',10,13,'$' WMESS DB 'WAITING FOR FILE LENGTH$' ERMESS DB 'ERROR IN RECEPTION - FILE NOT WRITTEN TO DISK$' BUFF DB 512 DUP(65) ;FILE BUFFER FNAME DB 13 DUP(?) DPAGE DB 0 OFSET DW 0 HANDLE DW 0 NUMRD DW 0 FLEN DW 0 BUFSEG DW 0 PGRAFS DW 0 ;============================================================================= OVER: CALL CLS CALL INITIAL ;============================================================================== MOV AX,ZSEG ;DEALLOCATE EXCESS MEMORY ABOVE CODE MOV BX,AX MOV AX,ES SUB BX,AX MOV AH,4AH INT 21H 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 PUSH DS MOV AH,3CH ;OPEN AND TRUNCATE FILE XOR CX,CX MOV DX,SEG FNAME MOV DS,DX MOV DX,OFFSET FNAME INT 21H POP DS 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 PUSH DS MOV DX,SEG WMESS MOV DS,DX MOV DX,OFFSET WMESS CALL WRT_MESS POP DS CALL WAIT_RX ;WAITS FOR A CHAR - RETURNED IN AL MOV BL,AL ;GETS HIGH BYTE OF FILESIZE CALL WAIT_RX ;GETS LOW BYTE XOR AH,AH XOR BH,BH MOV CL,8 SHL BX,CL ;MULTIPLY BY 256 ADD BX,AX ;ADD HIGH AND LOW BYTES MOV FLEN,BX ;FILESIZE IN BYTES MOV AX,BX ;GET # OF PARAGRAPHS MOV CL,4 SHR AX,CL ;DIVIDE BY 16 MOV PGRAFS,AX ;SAVE IT INC PGRAFS ;ADD 1 PARAGRAPH FOR EXCESS BYTES CALL WAIT_RX ;READ 2 BYTES OF CRC CALL WAIT_RX MOV DX,239H ;RESET ERROR MOV AL,0 OUT DX,AL JMP $+2 JMP $+2 MOV AL,30H OUT DX,AL JMP $+2 JMP $+2 MOV BX,PGRAFS ;REQUEST MEMORY BLOCK MOV AH,48H INT 21H JNC MEM_OK ;FUNCTION SUCCESSFUL MOV DX,SEG MMESS MOV DS,DX MOV DX,OFFSET MMESS ;ERROR REQUESTING MEMORY CALL WRT_MESS ;PRINT ERROR MESSAGE JMP XIT ;EXIT MEM_OK: MOV BUFSEG,AX ;BUFFER SEGMENT MOV ES,AX ;SET ES TO BUFFER XOR DI,DI ;ZERO OFFSET PUSH DS MOV DX,SEG RECMESS MOV DS,DX MOV DX,OFFSET RECMESS CALL WRT_MESS POP DS CALL SEND ;SEND "READY" TO TX NODE WAYT: MOV AH,1 INT 16H JNZ XIT MOV DX,239H ;CONTROL PORT MOV AL,1 ;RR1 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,80H ;END OF FRAME? JNZ XIT ;YES MOV DX,239H ;CONTROL PORT MOV AL,0 ;RR0 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,1 ;DATA READY? JZ WAYT ;NOT YET DEC DX IN AL,DX JMP $+2 JMP $+2 MOV ES:[DI],AL ;PUT IT IN BUFFER INC DI JMP WAYT XIT: MOV DX,239H ;CONTROL PORT MOV AL,1 ;RR1 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 ;WAS 70 HEX *** TEST AL,60H ;ANY ERRORS? JZ NO_ERR ;NO - WRITE FILE AND EXIT PUSH DS MOV DX,SEG ERMESS MOV DS,DX MOV DX,OFFSET ERMESS CALL WRT_MESS POP DS JMP CL_FILE NO_ERR: PUSH DS MOV AH,40H ;WRITE BUFFER TO DISK MOV BX,HANDLE MOV CX,FLEN MOV DX,BUFSEG MOV DS,DX XOR DX,DX INT 21H POP DS CL_FILE: MOV AH,3EH ;CLOSE FILE MOV BX,HANDLE INT 21H MOV AX,BUFSEG ;DEALLOCATE MEMORY BLOCK MOV ES,AX MOV AH,49H INT 21H MOV AX,4C00H ;TERMINATE PROGRAM INT 21H ;============================================================================= SEND PROC NEAR MOV DX,238H ;DATA PORT MOV AL,55H ;SEND "READY" TO TX NODE OUT DX,AL JMP $+2 JMP $+2 INC DX XOR AL,AL OUT DX,AL JMP $+2 JMP $+2 MOV AL,0C0H ;RTXUL OUT DX,AL JMP $+2 JMP $+2 RET SEND ENDP WRT_MESS PROC NEAR PUSH DX XOR DX,DX ;SET CURSOR TO UPPER L.H. CORNER MOV AH,2 MOV BH,0 INT 10H POP DX 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 WAIT_RX PROC NEAR MOV DX,239H WRX1: XOR AL,AL ;RR0 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX ;READ STATUS JMP $+2 JMP $+2 TEST AL,1 ;DATA AVAILABLE? JZ WRX1 ;NO - WAIT DEC DX ;DATA PORT IN AL,DX ;READ CHARACTER JMP $+2 JMP $+2 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