home *** CD-ROM | disk | FTP | other *** search
- ;;; 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
-