home *** CD-ROM | disk | FTP | other *** search
- ;MOVE.ASM
- ;V0.3
- ;
- ;>>>>> THIS FILE IS FILE MOVENMAC.ASM, A VERSION
- ; OF "MOVE.ASM" WHICH HAS THE MACROS EXPANDED
- ; FOR USE BY PEOPLE WHO DON'T HAVE "MAC" <<<<<
- ;
- ;7/23/78 BY WARD CHRISTENSEN
- ;USED TO TRANSFER FILES FROM ONE DISK TO ANOTHER
- ; ON A 1 DISK SYSTEM, BY READING THE
- ; FILE INTO MEMORY
- ;
- ;IS NOT ABLE TO MOVE A PROGRAM BIGGER THAN MEMORY
- ; (WARNING MESSAGE IS ISSUED)
- ;
- ;
- ;CPM FUNCTION MACRO -
- ;
- ; CPM FNC,ADDR
- ; EX: CPM OPEN,FCB
- ;
- ;IF A NON-NULL THIRD OPERAND IS SUPPLIED, THEN
- ; A 'MOV E,A' IS GENERATED, FOR USE
- ; IN THE CONSOLE OUT ROUTINE.
- ;
- ; ALL INDEX REGISTERS ARE SAVED
- ;
- ;CPM MACRO ?F,?A,?T
- ; PUSH B
- ; PUSH D
- ; PUSH H
- ; IF NOT NUL ?A
- ; LXI D,?A
- ; ENDIF
- ; IF NOT NUL ?T
- ; MOV E,A ;FOR TYPE
- ; ENDIF
- ; MVI C,?F
- ; CALL BDOS
- ; POP H
- ; POP D
- ; POP B
- ; ENDM
- ;
- ;END OF MACRO DEFINITIONS
- ;
- ORG 100H
- ;SAVE THE LOCAL STACK
- LXI H,0
- DAD SP
- SHLD STACK
- LXI SP,STACK
- ;
- CALL ILPRT
- DB 'MOVE.COM 7/28/78',0DH,0AH,0
- SRCMSG CALL ILPRT
- DB 'MOUNT SOURCE DISK, TYPE S: ',0
- ; CPM RDCON ;GET THE CHARACTER
- PUSH B
- PUSH D
- PUSH H
- MVI C,RDCON
- CALL BDOS
- POP H
- POP D
- POP B
- ANI 5FH ;MAKE UPPER CASE
- CPI 'S'
- JNZ SRCMSG
- ;
- ;'S' WAS TYPED, OPEN THE INPUT FILE
- ;
- ; CPM OPEN,FCB
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,OPEN
- CALL BDOS
- POP H
- POP D
- POP B
- INR A ;WAS THE OPEN OK?
- JNZ OPENOK ;YES
- ;
- ;OPEN WAS BAD, EXIT WITH ERROR MESSAGE.
- ;
- CALL MSGEXIT
- DB '++NO SUCH FILE++',0DH,0AH,'$'
- ;
- OPENOK LXI D,BUFF ;POINT TO BUFFER
- READLP PUSH D ;SAVE BUFFER ADDRESS
- ; CPM STDMA ;SET THE DMA ADDR
- PUSH B
- PUSH D
- PUSH H
- MVI C,STDMA
- CALL BDOS
- POP H
- POP D
- POP B
- ; CPM READ,FCB ;READ A SECTOR
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,READ
- CALL BDOS
- POP H
- POP D
- POP B
- ORA A ;OK?
- JNZ EOF ;NOT OK, MUST BE EOF
- LDA FCT ;LOAD SECTOR COUNT FOR FILE
- INR A ;BUMP BY 1
- STA FCT ;SAVE IT BACK
- POP D ;GET DMA ADDR
- LXI H,80H
- DAD D ;CALC NEXT BUFF ADDR
- XCHG ;PUT IT BACK IN DE
- ;OUT OF MEMORY?
- LDA 7 ;GET BDOS PAGE POINTER
- CMP D ;ABOUT TO HIT BDOS?
- JNC READLP ;NO, LOOP
- ;
- ;FILE IS TOO BIG - EXIT PRINTING ERROR MSG.
- ;
- CALL MSGEXIT
- DB '++FILE WON''T FIT IN MEMORY++$'
- ;
- ;GOT RETURN CODE ON READ, SEE IF ERROR OR EOF
- ;
- EOF DCR A ;EOF?
- JZ DESTMSG ;YES, ASK FOR DEST. DISK
- ;
- ;READ ERROR - EXIT WITH MSG
- ;
- CALL MSGEXIT
- DB '++READ ERROR++$'
- ;
- ;FILE READ INTO MEMORY. ASK FOR DEST. DISK
- ;
- DESTMSG CALL ILPRT
- DB 'MOUNT DESTINATION DISK, TYPE D: ',0
- ; CPM RDCON ;GET CHAR
- PUSH B
- PUSH D
- PUSH H
- MVI C,RDCON
- CALL BDOS
- POP H
- POP D
- POP B
- ANI 5FH ;MAKE IT UPPER CASE
- CPI 'D' ;IS IT A D?
- JNZ DESTMSG ;NO, ASK AGAIN
- ;
- ;RESET DISK, WRITE THE FILE
- ;
- POP H
- ; CPM RESETDK ;RESET DISK, KILLING R/O STATUS
- PUSH B
- PUSH D
- PUSH H
- MVI C,RESETDK
- CALL BDOS
- POP H
- POP D
- POP B
- ; CPM SELDK,0 ;LOG IN THE MOUNTED DISK
- PUSH B
- PUSH D
- PUSH H
- LXI D,0
- MVI C,SELDK
- CALL BDOS
- POP H
- POP D
- POP B
- XRA A
- STA FCB+12 ;ZERO EXTENT #
- STA FCB+32 ;ZERO SECTOR #
- ; CPM ERASE,FCB
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,ERASE
- CALL BDOS
- POP H
- POP D
- POP B
- ; CPM MAKE,FCB
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,MAKE
- CALL BDOS
- POP H
- POP D
- POP B
- INR A
- JZ BADMAKE ;MAYBE DIRECTORY IS FULL?
- ;
- ;WRITE THE FILE TO DISK
- ;
- LXI D,BUFF ;POINT TO BUFFER
- WRLP PUSH D ;SAVE THE DMA ADDR
- ; CPM STDMA ;SET DMA
- PUSH B
- PUSH D
- PUSH H
- MVI C,STDMA
- CALL BDOS
- POP H
- POP D
- POP B
- ; CPM WRITE,FCB ;WRITE THE SECTOR
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,WRITE
- CALL BDOS
- POP H
- POP D
- POP B
- ORA A ;WAS THE WRITE SUCCESSFUL?
- JNZ WRERR ;NO, EXIT W/ERROR MSG
- POP D ;GET DMA ADDR
- LXI H,80H ;GET BUFFER LENGTH
- DAD D ;CALC NEXT DISK WRITE ADDR
- XCHG ;SAVE IN DE
- LDA FCT ;GET FILE'S SECTOR COUNT
- DCR A ;DECREMENT IT
- STA FCT ;SAVE IT BACK
- JNZ WRLP ;IF MORE, LOOP
- ; CPM STDMA,80H ;RESET DMA ADDR T0 80H
- PUSH B
- PUSH D
- PUSH H
- LXI D,80H
- MVI C,STDMA
- CALL BDOS
- POP H
- POP D
- POP B
- ; CPM CLOSE,FCB ;CLOSE THE FILE
- PUSH B
- PUSH D
- PUSH H
- LXI D,FCB
- MVI C,CLOSE
- CALL BDOS
- POP H
- POP D
- POP B
- CALL MSGEXIT ;EXIT PRINTING FOLLOWING:
- DB '++DONE++',0DH,0AH,'$'
- ;
- ;GOT A WRITE ERROR - EXIT W/ERROR MSG.
- ;
- WRERR CALL MSGEXIT
- DB '++WRITE ERROR$'
- ;
- ;COULDN'T MAKE THE FILE, EXIT W/ERROR MSG.
- ;
- BADMAKE CALL MSGEXIT
- DB '++CAN''T MAKE OUTPUT FILE$'
- ;
- ;INLINE PRINT ROUTINE - CALL ILPRT FOLLOWED
- ; BY MESSAGE (ENDING IN 0)
- ;
- ILPRT MVI A,0DH ;CR..
- CALL TYPE
- MVI A,0AH ;LF FIRST.
- CALL TYPE
- XTHL ;SAVE HL, GET MSG ADDR
- ILPLP MOV A,M ;GET CHAR OF MSG
- CALL TYPE ;TYPE IT
- INX H ;POINT TO NEXT CHAR
- MOV A,M ;GET IT
- ORA A ;IS IT END OF MSG?
- JNZ ILPLP ;NO, LOOP
- INX H ;SKIP THE 0
- XTHL ;RESTORE HL, STACK RET ADDR
- RET ;..AND RETURN
- ;
- ;TYPE CHAR IN A
- ;
- TYPE:
- ; CPM WRCON,,TYPE
- PUSH B
- PUSH D
- PUSH H
- MOV E,A
- MVI C,WRCON
- CALL BDOS
- POP H
- POP D
- POP B
- RET
- ;
- ;CHAR MOVE ROUTINE, (DE) -> (HL) LEN IN B
- ;
- MOVER LDAX D ;GET SOURCE CHAR
- MOV M,A ;STORE IN DEST. LOCATION
- INX D ;POINT TO NEXT SOURCE
- INX H ;POINT TO NEXT DEST.
- DCR B ;DECREMENT COUNT
- JNZ MOVER ;LOOP UNTIL ZERO
- RET ;..THEN RETURN
- FCT DB 0 ;FILE COUNT
- ;FOLLOWING FROM WARD'S "EQU5.LIB"---->
- DS 40H ;STACK AREA
- STACK DS 2
- ;
- ;EXIT WITH ERROR MESSAGE
- MSGEXIT MVI A,0DH
- CALL TYPE
- MVI A,0AH
- CALL TYPE
- POP D ;GET MSG
- ; CPM PRINT
- PUSH B
- PUSH D
- PUSH H
- MVI C,PRINT
- CALL BDOS
- POP H
- POP D
- POP B
- ;EXIT, RESTORING STACK AND RETURN
- EXIT CALL ILPRT
- DB 0DH,0AH,'RE-BOOTING '
- DB 'VIA "JMP E900", '
- DB 'PRESS RETURN',0
- ; CPM RDCON
- PUSH B
- PUSH D
- PUSH H
- MVI C,RDCON
- CALL BDOS
- POP H
- POP D
- POP B
- CPI 0DH
- JNZ EXIT
- JMP 0E900H
- BUFF EQU $
- ;WARD'S BDOS/CBIOS EQUATES (VERSION 6)
- RDCON EQU 1
- WRCON EQU 2
- PRINT EQU 9
- RESETDK EQU 13
- SELDK EQU 14
- OPEN EQU 15
- CLOSE EQU 16
- SRCHF EQU 17
- SRCHN EQU 18
- ERASE EQU 19
- READ EQU 20
- WRITE EQU 21
- MAKE EQU 22
- STDMA EQU 26
- BDOS EQU 5
- FCB EQU 5CH
-