$TITLE(' TRANSFER PROGRAM - FLICKINGER - 06 JAN 81 00:36 ') .XLIST $INCLUDE HEADER.MAC .LIST ; PUBLIC SPCM ;LINE FEEDS PUBLIC S2 ;FILE CLOSE AND EXIT PUBLIC OWRITE ;OPEN FILE FOR WRITE PUBLIC OREAD ;OPEN FILE FOR READ PUBLIC FCLOSE ;CLOSE FILE ; EXTRN VMSG ;VERSION FROM EIA DRIVERS EXTRN RCVR ;EIA RECEIVER EXTRN XMIT ;EIA TRANSMITTER ; EXTRN DRCODE ;DISK FILE CONTROL BLOCK (36) EXTRN KBBUF ;KEYBOARD BUFFER BLOCK (40H + ID) EXTRN DMABUF ;DISK BUFFER BLOCK (80H) EXTRN STACK ;STACK BUFFER (80H) ; CSEG ; START: LXI SP,STACK+70H DI ; CALL FCBCLR ;CLEAR FILE CONTROL BLOCK LXI D,DMABUF ;DISK R/W BUFFER ADDRESS MVI C,SETDMA CALL BDOS ;SET DMA BUFFER ADDRES ; LXI D,OMSG MVI C,PRSTR CALL BDOS ;TITLE ; LXI D,VMSG ;VERSION IDENTIFICATION MVI C,PRSTR CALL BDOS ; S0: LXI D,NMSG MVI C,PRSTR CALL BDOS ;REQUEST FILENAME ; LXI D,KBBUF MVI C,CONBUF CALL BDOS ;GET FILENAME CALL GFILE ;WRITE FILENAME TO DISK FCB ; LXI D,FMSG ;RECEIVE OR TRANSMIT REQUEST MVI C,PRSTR CALL BDOS S1: MVI C,CONIN CALL BDOS ;CHARACTER RETURNED IN ANI 01011111B ;MASK LOWER CASE TO UPPER CASE CPI 'R' JZ RCVR CPI 'T' JZ XMIT CPI KCTLC JZ 0000H ;REBOOT JMP S1 ; S2: CALL FCLOSE ;CLOSE FILE LXI D,CMSG MVI C,PRSTR ;EXIT MESSAGE CALL BDOS RST 0 ; ;CLEAR FILE CONTROL BLOCK ; FCBCLR: LXI H,DRCODE MVI B,36 FCLR1: MVI M,00H INX H DCR B JNZ FCLR1 RET ; ;OPEN CMDOS FILE FOR READ ; OREAD: LXI D,DRCODE ;CMDOS FCB BASE ADDRESS MVI C,OPEN ;LOAD CMDOS CREATE FUNCTION CALL BDOS ORA A ;DIR CODE CPI 04H ;=00-03 OK RC LXI D,FERRM MVI C,PRSTR CALL BDOS LXI SP,STACK+70H JMP S0 ; ;OPEN CMDOS FILE FOR WRITE ; OWRITE: LXI D,DRCODE ;CMDOS FCB BASE ADDRESS MVI C,DELETE ;LOAD CMDOS DELETE FUNCTION CALL BDOS LXI D,DRCODE ;CMDOS FCB BASE ADDRESS MVI C,CREATE ;LOAD CMDOS CREATE FUNCTION CALL BDOS ORA A ;DIR CODE CPI 04H ;=00-03 OK RC LXI D,FERRM MVI C,PRSTR CALL BDOS LXI SP,STACK+70H JMP S0 ; ;CLOSE CMDOS FILE ; FCLOSE: LXI D,DRCODE ;CMDOS FCB BASE ADDRESS MVI C,CLOSE ;LOAD CMDOS CLOSE FUNCTION CALL BDOS RET ; ;GET CMDOS FILENAME ; GFILE: LDA KBBUF+01H ORA A JNZ BUFOK ; KERR: LXI D,KERRM MVI C,PRSTR CALL BDOS LXI SP,STACK+70H JMP S0 ; ;SEPARATE DRIVE NUMBER IF PRESENT ; BUFOK: LXI H,KBBUF+03 ;COLON IF PRESENT MOV A,M ;RECOVER DCX H ;1ST BUFFER CHARACTER (DRCODE) CPI ':' ;DRIVE LETTER PRECEDING JNZ FN2 MOV A,M ;LETTER DRCODE IN CALL SELDR ;SET DRIVE CODE LXI H,KBBUF+04 ;1ST CHARACTER AFTER ':' ; ;GET FILENAME FROM KBBUF ; FN2: LXI D,DRCODE+01H ;CMDOS FILENAME POINTER MVI B,08H ;FILENAME MAX LEN LDA KBBUF+01H ;CHARACTERS IN BUFFER MOV C,A ; CFN0: MOV A,M ;GET CHAR FROM BUFFER CPI 'a' JC CUC ;TEST FOR UPPER CASE CPI 'z'+1 JNC CUC ;TEST FOR LOWER CASE SUI 20H ;CONVERT TO UPPER CASE ; CUC: CPI KPER JZ CFN1 ;END OF FILENAME? XCHG ;CMDOS FCB IN MOV M,A ;PUT CHAR IN FCB XCHG ;KBBUF IN INX H ;NEXT CHAR IN BUF INX D ;NEXT SPACE IN FCB XRA A DCR C DCR B ;FN CHAR COUNT CMP C ;BUFFER EMPTY? JZ CFN7 ;JUMP FOR FILL CMP B JNZ CFN0 ;GO FOR NEXT CHAR ; DUMP0: MOV A,M ;END OF LEGAL CHARS ORA A CPI KPER ;NEXT CHAR MUST BE PERIOD JZ CFN1 INX H DCR C JNZ DUMP0 ;OTHERWISE DUMP CHAR JMP CFN7 ;END OF BUFFER - FILL ; CFN1: INX H ;KBBUF POINTER XCHG ;FCB IN DCR C ;BUFFER COUNTER FOR PERIOD JZ CFN5 ;BUFFER EMPTY? MOV A,B ;PERIOD INPUT/DEFAULTED ORA A ;CHARS REQUIRED IN FN JZ CFN3 ;8 CHAR IN FN? CFN2: MVI M,KSP ;FILL FN WITH SPACES INX H DCR B ;UNTIL 8 JNZ CFN2 ;8 CHAR IN FN? ; ;FILENAME EXTENSION ; CFN3: MVI B,03H ;FILE EXT CHARACTERS XCHG ;KBBUF IN CFN4: MOV A,M ;GET EXT CHAR FROM BUFFER CPI 'a' JC CUC1 ;TEST FOR UPPER CASE CPI 'z'+1 JNC CUC1 ;TEST FOR LOWER CASE SUI 20H ;CONVERT TO UPPER CASE CUC1: XCHG ;FCB IN MOV M,A ;PUT CHAR IN FCB TYPE INX H INX D XCHG ;KBBUF IN XRA A DCR C DCR B CMP C JZ CFN8 ;BUFFER EMPTY? CMP B JNZ CFN4 ;MAX LENGTH (3) RET ; ;FILL WITH BLANKS IF NECESSARY ; CFN5: MVI A,03H ;3 CHAR FOR EXTENSION ADD B ;+ BAL OF NAME MOV B,A ;SAVE IN CFN6: MVI M,KSP ;LOAD BUFFER WITH SPACES INX H ;FCB POINTER IN DCR B ;FCB NAME COUNTER JNZ CFN6 RET ;RETURN TO CALLER ; CFN7: XCHG ;FCB IN JMP CFN5 ; CFN8: CMP B RZ ;RETURN TO CALLER XCHG ;FCB IN JMP CFN6 ; ;LETTERED DRIVE TO NUMBERED DRIVE CONVERSION - DRCODE IN ; SELDR: LXI H,DRTBL LXI D,0002H ;TABLE ENTRY RECORD ; ANI 01011111B ;MASK LOWER TO UPPER CASE CNVT: CPI 'A' JC DERR CPI 'F'+1 JNC DERR MOV C,A ;SAVE DRIVE CHARACTER ; SELDR0: MOV A,M CMP C JNZ SELDR1 INX H MOV A,M STA DRCODE ;NUMBERED DRIVE CODE IN RET ; SELDR1: DAD D JMP SELDR0 ; DRTBL: DB 'A',01H DB 'B',02H DB 'C',03H DB 'D',04H DB 'E',05H DB 'F',06H ; DERR: LXI D,DERRM MVI C,PRSTR CALL BDOS LXI SP,STACK+70H JMP S0 ; ;MESSAGES ; OMSG: DB KCR,KLF,KLF DB 'SOURCE FILE TRANSFER PROGRAM' DB KCR,KLF,KLF DB 'DANIEL FLICKINGER' DB '$' ; NMSG: DB KCR,KLF,KLF DB 'ENTER FILENAME >' DB '$' ; FMSG: DB KCR,KLF,KLF DB 'RECEIVE OR TRANSMIT? >' DB '$' ; CMSG: DB KCR,KLF,KLF DB 'FILE TRANSFER COMPLETE' DB KCR,KLF,KLF DB '$' ; FERRM: DB KCR,KLF,KLF DB 'CMDOS FILE OPENING ERROR' DB '$' ; KERRM: DB KCR,KLF,KLF DB 'KEYBOARD BUFFER EMPTY' DB '$' ; DERRM: DB KCR,KLF,KLF DB 'INCORRECT DRIVE SPECIFICATION' DB '$' ; SPCM: DB KCR,KLF,KLF DB '$' ; END START