; $TITLE(' TRANSFER EIA DRIVERS - FLICKINGER - 06 JAN 81 23:49 ') ; VMSG: DB ' 06 JAN 81 23:49 ' DB KCR,KLF,KLF DB '$' ; .XLIST $INCLUDE HEADER.MAC .LIST ; PUBLIC RCVR ;RECEIVE AND WRITE FILE PUBLIC XMIT ;READ AND TRANSMIT FILE PUBLIC VMSG ;VERSION REFERENCE ; EXTRN SPCM ;LINE FEEDS EXTRN S2 ;EXIT EXTRN DMABUF ;DISK DATA BUFFER EXTRN DRCODE ;DISK FILE CONTROL BLOCK EXTRN OWRITE ;OPEN FILE FOR WRITE EXTRN OREAD ;OPEN FILE FOR READ EXTRN FCLOSE ;CLOSE FILE ; ;FILE RECEIVER ; RCVR: LXI D,SPCM MVI C,PRSTR CALL BDOS ;SPACE 2 DOWN ; CALL OWRITE ;OPEN RECEIVE FILE ; ;WAIT APPROX 20 SECONDS FOR: ; ; ENQ SEND APPROPRIATE STATUS ; STX START RECEIVE BUFFER ; EOF CLOSE FILE ; R0: LXI D,0FFFFH ;SHORT TIME CONSTANT MVI C,10H ;LONG TIME CONSTANT XRA A STA RDCHK ;ZERO READ CHECKSUM R1: IN ESTAT ;EIA #1 STATUS ANI ERMASK ;MASK FOR CHARACTER WAITING JNZ R2 DCX D MOV A,D ORA E JNZ R1 LXI D,0FFFFH DCR C JNZ R1 ; ;CLOSE FILE AND ABORT AT TIMEOUT ; RABORT: CALL FCLOSE LXI D,CMSG MVI C,PRSTR CALL BDOS RST 0 ;EXIT ; CMSG: DB KCR,KLF,KLF DB 'TIMEOUT/PROGRAM ABORTED' DB KCR,KLF,KLF DB '$' ; R2: PUSH H ;TIME DELAY POP H IN EDATA ;EIA #1 INPUT ANI ASCII CPI KENQ JZ RENQ ;ENQUIRY? CPI KSTX JZ RSTX ;START TRANSMISSION? CPI KEOF JZ S2 ;END OF FILE? JMP R1 ;TRY AGAIN ; ;SEND "ACK" OR "NAK" TO TRANSMITTER ; RENQ: IN ESTAT PUSH H ;TIME DELAY POP H ANI ETMASK JZ RENQ ;TX READY? LDA RFLAG ;LOAD STATUS OUT EDATA ;SEND STATUS JMP R1 ; ;INITIALIZE BUFFER POINTER AND COUNTER ; RSTX: LXI H,DMABUF ;ZERO DISK BUFFER POINTER MVI B,81H ;SET BUFFER LENGTH MVI A,KNAK ;PRESUME BUFFER RECEIVED IS BAD STA RFLAG ;SET FLAG TO "NAK" ; ;RECEIVE CHARACTERS AND LOAD BUFFER ; RSTX1: LXI D,0FFFFH ;SHORT TIME CONSTANT MVI C,0AH ;LONG TIME CONSTANT ; RSTX2: IN ESTAT ;EIA #1 STATUS ANI ERMASK JNZ RSTX3 ;CHARACTER WAITING? DCX D MOV A,D ORA E JNZ RSTX2 ;TRY STATUS AGAIN LXI D,0FFFFH ;RESET SHORT TIME DCR C JZ RABORT ;TIMEOUT? JMP RSTX2 ;TRY STATUS AGAIN ; RSTX3: PUSH H ;TIME DELAY POP H DCR B ;DECREMENT COUNTER FOR EOF IN EDATA ;EIA #1 INPUT CPI KEOF JZ REOF ;END OF FILE? CPI KETX JZ REOB ;WRITE BUFFER MOV M,A INX H ;INCREMENT BUFFER POINTER JMP RSTX1 ;NEXT CHARACTER ; ;WRITE BUFFER TO DISK AFTER ETX RECEIVED ; REOB: LXI D,DRCODE MVI C,WRITE CALL BDOS ;WRITE BUFFER TO DISK ; REOB1: IN ESTAT PUSH H POP H ANI ETMASK JZ REOB1 MVI A,KACK ;SEND "ACK" OUT EDATA JMP R0 ;NEXT BUFFER ; ;CLOSE BUFFER AND EXIT ; REOF: MVI M,KCTLZ ;EOF MARKER INX H ;INCREMENT BUFFER POINTER DCR B JNZ REOF ; LXI D,DRCODE MVI C,WRITE CALL BDOS JMP S2 ;CLOSE FILE AND EXIT ; ;FILE TRANSMITTER ; XMIT: LXI D,SPCM MVI C,PRSTR CALL BDOS ;DOWN 2 SPACES ; CALL OREAD ;OPEN FILE FOR READ ; ;SEND "ENQ" ; MVI A,KENQ OUT EDATA ; X0: LXI D,0FFFFH ;SHORT TIME CONSTANT MVI B,05H ;LONG TIME CONSTANT MVI C,03H ;LONG TIME CONSTANT XRA A STA WRCHK ;ZERO WRITE CHECKSUM ; ;WAIT ACKNOWLEDGEMENT (RESEND "ENQ" EVERY THREE SECONDS - FIVE TIMES) ; X1: IN ESTAT ANI ERMASK JNZ X2 ;CHARACTER WAITING DCX D MOV A,D ORA E JNZ X1 LXI D,0FFFFH ;RESET SHORT TIME CONSTANT DCR C JNZ X1 MVI A,KENQ OUT EDATA ;SEND "ENQ" MVI C,03H ;RESET LONG TIME CONSTANT LXI D,0FFFFH ;RESET SHORT TIME CONSTANT DCR B JNZ X1 JMP XABORT ;ABORT ON TIMEOUT ; X2: PUSH H ;TIME DELAY POP H IN EDATA CPI KACK JZ XSTX ;ACKNOWLEDGE (SEND NEW BLOCK)? CPI KNAK JZ XRSND ;REPEAT BLOCK TRANSMISSION? CPI KCTLZ JNZ X1 ;ABORT? ; ;ABORT AFTER TIMEOUT OR CTL-Z ; XABORT: CALL FCLOSE LXI D,CMSG MVI C,PRSTR CALL BDOS RST 0 ;WARM BOOT ; ;SEND START OF BLOCK ; XSTX: MVI A,0AH STA RETRY ;SET RETRIES XSTX1: IN ESTAT PUSH H ;TIME DELAY POP H ANI ETMASK ;TX EMPTY JZ XSTX1 MVI A,KSTX OUT EDATA LXI D,DRCODE MVI C,READ CALL BDOS ;READ DISK TO BUFFER ORA A JNZ XEOF ;END OF FILE? ; XSND: LXI H,DMABUF ;BUFFER POINTER MVI B,80H ;BUFFER COUNTER ; ;TRANSMIT BUFFER ; XSND1: IN ESTAT PUSH H ;TIME DELAY POP H ANI ETMASK JZ XSND1 MOV A,M ;GET CHARACTER FROM BUFFER OUT EDATA CPI KEOF JZ S2 ;END OF FILE INX H DCR B JNZ XSND1 ;NEXT CHARACTER ; ;CHECK FOR "NAK" OR ABORT AND CLEAR RECEIVE BUFFER OF GARBAGE ; XCHK: IN ESTAT ANI ERMASK JZ XETX ;SKIP IF BUFFER EMPTY PUSH H ;TIME DELAY POP H IN EDATA CPI KCTLZ JZ XABORT ;ABORT AND CLOSE? CPI KNAK JZ XRSND ;RESEND BUFFER? JMP XCHK ;DUMP GARBAGE ; XETX: IN ESTAT PUSH H ;TIME DELAY POP H ANI ETMASK JZ XETX MVI A,KETX ;^C OUT EDATA ;SEND END-OF-TRANSMISSION JMP X0 ; ;RETRANSMIT BLOCK AFTER RECEIPT OF "NAK" ; XRSND: LDA RETRY DCR A STA RETRY ORA A JNZ XSND LXI D,UMSG MVI C,PRSTR CALL BDOS RST 0 ; UMSG: DB KCR,KLF,KLF DB 'UNSUCCESSFUL TRANSFER AFTER 10 ATTEMPTS' DB KCR,KLF,KLF DB '$' ; XEOF: IN ESTAT PUSH H ;TIME DELAY POP H ANI ETMASK JZ XEOF MVI A,KEOF OUT EDATA JMP S2 ;CLOSE FILE AND EXIT ; RFLAG: DB KACK RDCHK: DB 00H WRCHK: DB 00H RETRY: DB 0AH ; END