;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; SDLCFRX2.ASM - FILE RECEPTION - SDLC FORMAT. ;; RECEIVES FILE AS MULTIPLE 128 BYTE FRAMES ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 WMESS DB 'WAITING FOR FILE SIZE$' RXMESS DB 'RECEIVING FRAME # $' MMESS DB 'ERROR ALLOCATING MEMORY - TRANSFER ABORTED$' FMESS DB 'ERROR OPENING FILE$' FNAME DB 13 DUP(0) FRMNUM DB 1 ;ASSORTED VARIABLES RESP DB 0 HANDLE DW 0 FLEN DW 0 BUFSEG DW 0 PGRAFS DW 0 COUNT DW 0 INDEX DW 0 ;============================================================================= OVER: CALL CLS CALL INITIAL MOV AH,2 ;SET CURSOR AT UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H PUSH DS ;PRINT "WAITING" MOV DX,SEG WMESS MOV DS,DX MOV DX,OFFSET WMESS CALL WRT_MESS POP DS ;============================================================================= ;============================================================================== 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 MOV AH,3CH ;OPEN AND TRUNCATE FILE XOR CX,CX MOV DX,SEG FNAME MOV DS,DX MOV DX,OFFSET FNAME INT 21H JNC FILE_OK ;FUNCTION SUCCESSFUL MOV DX,SEG FMESS MOV DS,DX MOV DX,OFFSET FMESS ;ERROR OPENING FILE CALL WRT_MESS ;PRINT ERROR MESSAGE JMP XIT ;EXIT FILE_OK: MOV HANDLE,AX ;SAVE FILE HANDLE CALL WAIT_RX ;GET FILE SIZE MOV BL,AL ;HIGH BYTE PUSH BX CALL WAIT_RX ;LOW BYTE XOR AH,AH POP BX XOR BH,BH MOV CL,8 ;ADJUST HIGH BYTE SHL BX,CL ADD BX,AX MOV FLEN,BX ;EXPECTED FILE LENGTH (IN BYTES) MOV CL,4 SHR BX,CL ;GET # OF PARAGRAPHS MOV PGRAFS,BX ;SAVE IT INC PGRAFS ;ADD 1 PARAGRAPH FOR EXCESS BYTES MOV BX,PGRAFS ;REQUEST MEMORY BLOCK ADD BX,2 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 = AX:0000 MOV ES,AX ;ES POINTS TO BUFFER XOR DI,DI ;BUFFER POINTER MOV AH,2 ;SET CURSOR AT UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H PUSH DS MOV DX,SEG RXMESS MOV DS,DX MOV DX,OFFSET RXMESS CALL WRT_MESS POP DS MOV RESP,13 AGAIN: CALL WRT_DEC ;PRINT FRAME # XOR SI,SI ;CHARACTER COUNT MOV INDEX,DI ;SAVE INDEX MOV AL,RESP ;RESPONCE - ACK/NACK CALL SND_FRAME ;SEND "READY" TO TX NODE NOT_EOF: MOV BL,1 ;MASK FOR DATA READY XOR AL,AL ;RR0 CALL WAIT_ ;WAIT FOR A CHAR MOV DX,238H ;DATA PORT IN AL,DX ;READ CHAR JMP $+2 JMP $+2 MOV ES:[DI],AL ;SAVE IT INC DI ;INC POINTER INC SI ;INC COUNT 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? JZ NOT_EOF ;NO SUB DI,2 ;CRC - LAST 2 BYTES NOT WANTED 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,60H ;ANY ERRORS? JZ NO_ERR ;NO MOV DI,INDEX MOV RESP,32 JMP AGAIN NO_ERR: INC FRMNUM CMP SI,128 ;PARTIAL READ? JL XIT ;YES JMP AGAIN XIT: MOV AL,13 CALL SND_FRAME ;SEND "READY" TO TX NODE PUSH DS ;WRITE TO DISK MOV AH,40H MOV BX,HANDLE MOV DS,BUFSEG MOV CX,DI MOV DX,0 INT 21H POP DS XIT2: MOV AH,3EH ;CLOSE FILE MOV BX,HANDLE INT 21H MOV AH,49H ;RELEASE MEMORY INT 21H MOV AX,4C00H ;TERMINATE PROGRAM INT 21H ;============================================================================= SND_FRAME PROC NEAR PUSH AX ;SAVE CHAR XOR AL,AL ;RR0 MOV BL,40H ;MASK FOR TX UNDERRUN LATCH CALL WAIT_ XOR AL,AL ;RR0 MOV BL,4 ;MASK FOR TX EMPTY CALL WAIT_ POP AX ;RESTORE CHAR MOV DX,238H ;DATA PORT OUT DX,AL ;SEND IT JMP $+2 JMP $+2 CALL RTXUL RET SND_FRAME ENDP 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 MOV AL,0 ;RR0 MOV BL,4 ;MASK FOR TX EMPTY CALL WAIT_ ;WAIT FOR CRC TO BE TRANSMITTED RET RTXUL ENDP 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 MOV AH,2 ;SET CURSOR MOV BH,0 MOV DX,0015H INT 10H MOV AL,FRMNUM XOR AH,AH 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 RET WRT_DEC ENDP WAIT_ PROC NEAR PUSH CX MOV CL,AL ;SAVE PORT MOV DX,239H WAIT1: OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,BL ;MASK SATISFIED? JNZ WAIT2 ;YES MOV AL,CL ;RESTORE PORT JMP WAIT1 ;TRY AGAIN WAIT2: POP CX RET WAIT_ ENDP WAIT_RX PROC NEAR ;RECEIVES A 1 BYTE FRAME XOR AL,AL MOV BL,1 CALL WAIT_ ;WAIT FOR CHAR MOV DX,238H IN AL,DX ;READ CHAR JMP $+2 JMP $+2 PUSH AX WRX1: XOR AL,AL ;CLEAR BUFFER - GET CRC AND E.O.F. MOV BL,1 CALL WAIT_ ;WAIT FOR CHAR MOV DX,238H IN AL,DX ;READ CHAR JMP $+2 JMP $+2 MOV DX,239H MOV AL,1 ;RR1 OUT DX,AL JMP $+2 JMP $+2 IN AL,DX JMP $+2 JMP $+2 TEST AL,80H ;END OF FRAME? JZ WRX1 ;NO POP AX ;RESTORE CHAR 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) ;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 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