$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