home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG019.ARK
/
XFER.ASM
< prev
Wrap
Assembly Source File
|
1984-04-29
|
9KB
|
260 lines
;;; XFER - FILE TRANSFER UTILITY FOR ONE-DRIVE DISK SYSTEMS
;
; LAWRENCE E. HUGHES
; 8080 SOFTWARE DEVELOPMENT CENTER
; 1506 MYRICK ROAD
; TALLAHASSEE, FLORIDA 32303
;
; PHONE (904) 385-4573
;
; XFER IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER OF
; A SINGLE DRIVE DISK SYSTEM TO TRANSFER ARBITRARILY LARGE FILES
; FROM ONE DISKETTE TO ANOTHER. THE CURRENT VERSION REQUIRES AT
; LEAST A 24K CP/M SYSTEM.
;
; TO USE, TYPE 'XFER FILENAME.TYP'. IF THE FILE FITS IN A
; SINGLE EXTENT ON DISK (UP TO 16K BYTES), IT WILL ALL BE LOADED
; INTO MEMORY AT THIS TIME. IF THE FILE IS LARGER THAN 16K, ONE
; EXTENT MAY BE TRANSFERRED AT A TIME BY TYPING THE COMMAND
; 'XFER FILENAME.TYP N' WHERE N IS THE NUMBER OF THE EXTENT TO
; BE LOADED. THE DEFAULT FOR N IS 0 (ZERO). AFTER A GIVEN SEGMENT
; IS LOADED, XFER WILL SPECIFY HOW MANY PAGES (DECIMAL) SHOULD
; BE SAVED BY TYPING 'READY FOR "SAVE NN FILENAME.TYP" ', WHERE
; NN IS THE NUMBER OF PAGES (DECIMAL) REQUIRED. THE USER MAY THEN
; SWAP DISKETTES, AND TYPE CTRL-C. THIS WILL CAUSE XFER TO INITIATE
; A WARM BOOT ON THE NEW DISKETTE. THE USER MAY THEN TYPE THE
; APPROPRIATE SAVE COMMAND. IF TRANSFERRING A MULTI-EXTENT FILE,
; SAVE EACH EXTENT AS A SEPARATE FILE (EG. LONG.1$$, LONG.2$$,
; ETC.), THEN USE PIP TO CONCATENATE THEM INTO ONE LONG FILE
; (E.G. 'PIP LONG.ASM=LONG.1$$,LONG.2$$,...,LONG.N$$').
;
; IF AVAILABLE, "SAP" IS A SIMPLER AND FASTER WAY TO MERGE BACK
; FRAGMENTED FILES INTO SINGLE FILES. SEE DOCUMENTATION ON SAP
; IF YOU HAVE ACCESS TO IT.
;
; NOTE THAT A SIMPLE LOAD WILL NOT SUFFICE TO GENERATE A NEW
; COM FILE FOR XFER. THIS IS DUE TO THE FACT THAT PART OF THE
; CODE ASSEMBLES FOR EXECUTION AT 4200H, WHICH MAKES FOR AN
; EXCESSIVELY LONG COM FILE AND LOAD TIME. HENCE I HAVE WRITTEN
; A SHORT BOOT ROUTINE WHICH COPIES 200H BYTES STARTING AT
; 200H UP TO 4200H. THEREFORE, TO 'LOAD' XFER, DO THE FOLLOWING:
;
; A> ASM XFER
; A> DDT XFER.HEX
; -M4200,43FF,200
; - (CTRL-C)
; A> SAVE 8 XFER.COM
BDOS EQU 0005H ;BDOS ENTRY POINT AND FUNCTION CODES
RCFC EQU 01 ;READ CONSOLE
WCFC EQU 02 ;WRITE CONSOLE
OFFC EQU 15 ;OPEN FILE
RRFC EQU 20 ;READ RECORD
SAFC EQU 26 ;SET (DMA) ADDRESS
WBOOT EQU 0000H ;WARM BOOT ENTRY POINT
FCB EQU 005CH ;SYSTEM FILE CONTROL BLOCK AREA AND FIELDS
FN EQU 01 ;FILE NAME
FT EQU 09 ;FILE TYPE
EX EQU 12 ;EXTENT NUMBER
NR EQU 32 ;NEXT RECORD
CR EQU 0DH ;CARRIAGE RETURN
LF EQU 0AH ;LINE FEED
ORG 0100H
MOVE: LXI H,200H
LXI D,4200H
LXI B,200H
MOVE1: MOV A,M
INX H
STAX D
INX D
DCX B
MOV A,B
ORA C
JNZ MOVE1
JMP 4200H
ORG 4200H
XFER: LXI SP,STACK+64
LXI H,STR1 ;PRINT 'XFER 1.0'
CALL WASC
XRA A ;DEFAULT TO EXTENT ZERO
STA FCB+EX
LDA FCB+17 ;CHECK FOR SECOND PARAMETER
CPI ' ' ;JUMP IF NOT PRESENT
JZ XFER0
SUI '0' ;DECODE IT
JC XFER9 ;JUMP IF NOT LEGAL DECIMAL DIGIT
CPI 10
JNC XFER9
STA FCB+EX
XFER0: LXI H,0100H ;SET FWA OF BUFFER
SHLD ADDR
XRA A ;CLEAR SECTOR COUNT
STA SCNT
LXI D,FCB ;OPEN USER'S FILE
CALL OPEN
INR A ;JUMP IF OK
JNZ XFER1
LXI H,STR2 ;ELSE PRINT 'FILE NOT FOUND'
CALL WASC
JMP XFERX ;AND EXIT
XFER1: XRA A ;REWIND FILE
STA FCB+NR
XFER2: LHLD ADDR ;DE = CURRENT BUFFER ADDRESS
MOV D,H
MOV E,L
CALL SETDMA ;SET DMA ADDRESS
LXI D,FCB
CALL READ ;READ NEXT SECTOR INTO BUFFER
DCR A ;JUMP IF EOF
JZ XFER3
LHLD ADDR ;INCREMENT LOAD ADDRESS
LXI D,80H
DAD D
SHLD ADDR
LDA SCNT ;INCREMENT SECTOR COUNT
INR A
STA SCNT
CPI 128 ;LOOP IF STILL ROOM IN BUFFER
JC XFER2
LXI H,STR3 ;PRINT BUFFER FULL MSG
CALL WASC
XFER3: LXI H,STR4 ;PRINT 'READY FOR "SAVE '
CALL WASC
LDA SCNT ;PRINT (SCNT+1)/2 (PAGE COUNT)
INR A
RRC
ANI 7FH
CALL WDB
MVI A,' ' ;PRINT A SPACE
CALL WACC
LXI H,FCB+FN ;PRINT USER'S FILE NAME
MVI B,8
XFER4: MOV A,M
INX H
CPI ' '
JZ XFER8
CALL WACC
DCR B
JNZ XFER4
XFER8: MVI A,'.' ;PRINT A PERIOD
CALL WACC
LDA SCNT ;JUMP IF BUFFER FULL
CPI 128
LDA FCB+EX ;CHECK FOR EXTENT OTHER THAN 0
JZ XFERB
ORA A
JZ XFERA ;JUMP IF EXTENT ZERO
XFERB: ADI '0' ;ELSE PRINT EXTENT NUMBER
CALL WACC ;INSTEAD OF FILE TYPE
MVI A,'$' ;PRINT TWO DOLLAR SIGNS
CALL WACC
MVI A,'$'
CALL WACC
JMP XFER6
XFERA: LXI H,FCB+FT ;PRINT USER'S FILE TYPE
MVI B,3
XFER5: MOV A,M
INX H
CPI ' '
JZ XFER6
CALL WACC
DCR B
JNZ XFER5
XFER6: MVI A,'"' ;PRINT CLOSING QUOTE
CALL WACC
CALL WEOLC ;PRINT END-OF-LINE
XFER7: LXI H,STR5 ;PRINT 'SWAP DISKETTES AND TYPE CTRL-C'
CALL WASC
CALL RACC ;AWAIT CTRL-C
ANI 7FH
CPI 'C'-40H
JNZ XFER7
JMP XFERX
XFER9: LXI H,STR6 ;PRINT 'ILLEGAL EXTENT NUMBER'
CALL WASC
XFERX: JMP WBOOT ;AND AWAY WE GO!!!
WASC: MOV A,M
ORA A
RZ
CALL WACC
INX H
JMP WASC
OPEN: MVI C,OFFC
JMP BDOS
SETDMA: MVI C,SAFC
JMP BDOS
READ: MVI C,RRFC
JMP BDOS
RACC: MVI C,RCFC
JMP BDOS
WACC: PUSH H
PUSH D
PUSH B
MVI C,WCFC
MOV E,A
CALL BDOS
POP B
POP D
POP H
RET
WEOLC: MVI A,CR
CALL WACC
MVI A,LF
JMP WACC
WDB: PUSH PSW
PUSH B
MVI C,0
WDB1: CPI 100
JC WDB2
INR C
SUI 100
JMP WDB1
WDB2: CALL WDD
MVI C,0
WDB3: CPI 10
JC WDB4
INR C
SUI 10
JMP WDB3
WDB4: CALL WDD
MOV C,A
CALL WDD
POP B
POP PSW
RET
WDD: PUSH PSW
MOV A,C
ADI '0'
CALL WACC
POP PSW
RET
; DATA AREA
STR1: DB 'XFER 1.0',CR,LF,0
STR2: DB 'FILE NOT FOUND',CR,LF,0
STR3: DB 'BUFFER FULL, FURTHER PASSES REQUIRED',CR,LF,0
STR4: DB 'READY FOR "SAVE ',0
STR5: DB 'SWAP DISKETTES AND TYPE CTRL-C',CR,LF,0
STR6: DB 'ILLEGAL EXTENT NUMBER',CR,LF,0
STACK: DS 64
ADDR: DS 2
SCNT: DS 1
END