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
/
CPMUG029.ARK
/
MOVENMAC.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
6KB
|
369 lines
;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