;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Advanced Communication Board Developers Toolkit ;; (c)Copyright 1993-1995, Sealevel Systems Incorporated ;; ;; SDLCFTX2.ASM - FILE TRANSFER - SDLC FORMAT. ;; SENDS 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 SELECTED INITE LABEL BYTE TXMESS DB 'TRANSMITTING FRAME #$' MMESS DB 'ERROR ALLOCATING MEMORY - TRANSFER ABORTED$' FMESS DB 'ERROR OPENING FILE$' ;ERROR MESSAGE AMESS DB ' >> ABORT RECEIVED - TRANSFER TERMINATED <<$' BUFF DB 512 DUP(?) ;FILE BUFFER FNAME DB 13 DUP(?) DPAGE DB 0 FRMNUM DB 1 OFST DW 0 HANDLE DW 0 NUMRD DW 0 FLEN DW 0 BUFSEG DW 0 PGRAFS DW 0 TXCOUNT DW 0 INDEX 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 AH,2 ;SET CURSOR AT UPPER L.H. CORNER MOV BH,0 XOR DX,DX INT 10H PUSH DS MOV DX,SEG TXMESS MOV DS,DX MOV DX,OFFSET TXMESS CALL WRT_MESS POP DS ;============================================================================= ;============================================================================== 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,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 MOV BX,AX MOV AH,42H ;GET FILE LENGTH (IN BYTES) MOV AL,2 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 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 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 TXCOUNT,AX ;TRANSFER COUNT - NUMBER OF BYTES READ PUSH AX ;SAVE FILE SIZE MOV AL,AH ;SEND HIGH BYTE CALL SND_FRAME POP AX ;SEND LOW BYTE CALL SND_FRAME XOR DI,DI ;FILE POINTER CALL WAIT_RX ;WAIT FOR RECEIVER READY ;============================================================================= ;============================================================================= XFER: CMP TXCOUNT,128 ;MORE THAN 128 BYTES LEFT TO TRANSFER? JL XFER2 ;NO MOV CX,128 ;YES - DEFAULT TRANSFER COUNT JMP XFER3 ;GO GET MORE XFER2: MOV CX,TXCOUNT ;SET COUNT TO # BYTES LEFT XFER3: CALL WRT_DEC ;PRINT FRAME # MOV INDEX,DI ;SAVE BUFFER INDEX ;SEND FIRST BYTE MOV AL,ES:[DI] ;GET CHAR FROM BUFFER INC DI ;MOVE BUFFER POINTER PUSH AX ;SAVE CHAR MOV BL,4 ;WAIT FOR TX EMPTY MOV AL,0 CALL WAIT_ POP AX ;RESTORE CHAR MOV DX,238H ;DATA PORT OUT DX,AL ;SEND IT JMP $+2 JMP $+2 CALL RTXUL ;RESET TX UNDERRUN LATCH DEC CX ;SEND REMAINDER OF FRAME SND1: MOV AL,ES:[DI] ;GET CHAR FROM BUFFER INC DI ;MOVE BUFFER POINTER PUSH AX ;SAVE CHAR MOV BL,4 ;WAIT FOR TX EMPTY MOV AL,0 CALL WAIT_ POP AX ;RESTORE CHAR MOV DX,238H ;DATA PORT OUT DX,AL ;SEND IT JMP $+2 JMP $+2 LOOP SND1 CALL WAIT_RX ;WAIT FOR ACK OR NACK CMP AL,13 ;ACK? JE ACK ;YES CMP AL,32 ;NACK? JNZ ABORT ;NO - ABORT MOV DI,INDEX JMP XFER ;RE-TRANSMIT FRAME ABORT: MOV DX,SEG AMESS MOV DS,DX MOV DX,OFFSET AMESS CALL WRT_MESS JMP XIT ;NO ACK: INC FRMNUM CMP TXCOUNT,128 ;LAST READ? JL XIT ;YES SUB TXCOUNT,128 ;DEC BUFFER COUNT JMP XFER XIT: MOV AH,49H ;RELEASE MEMORY MOV ES,BUFSEG INT 21H MOV AH,3EH ;CLOSE FILE MOV BX,HANDLE 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 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 PUSH CX 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 POP CX 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