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
/
CPMUG006.ARK
/
TSAVE.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
4KB
|
201 lines
;TSAVE V.3 - TARBELL SAVE
;WORKS FOR ANY FILE
;
;WRITES 11 CHAR FILENAME, 1 BYTE # SECTORS, DATA
;
;IF 'TSAVE FN.FT ?' IS TYPED, CHECKS THE TAPE
NSEC EQU 32 ;NUMBER OF SECTORS/BLOCK
ORG 100H ;TO TPA
CALL START ;SKIP ID
ID DB '(TSAVE 8/1/77)',0DH,0AH,'$'
START POP D ;GET ID MSG ADDR
MVI C,PRINT
CALL BDOS ;PRINT ID
;INIT PRIVATE STACK
LXI H,0
DAD SP
SHLD STACK
LXI SP,STACK
;SAVE THE '?' FROM 'TSAVE FN.FT ?'
LDA FCB+17 ;LOAD THE '?'
STA CHECK ;SAVE
;OPEN FILE
LXI D,FCB
MVI C,OPEN
CALL BDOS
INR A ;OPEN OK?
JZ OPNER
;READ FILE, WRITE TARBELL
; IN NSEC SECTOR (4K) BLOCKS
READB MVI E,'*' ;PRINT '*' EVERY BLOCK WRITTEN
MVI C,WRCON
;PRINT '?' IF CHECKING, OTHERWISE '*'
LDA CHECK
CPI '?'
JNZ PRAST
MOV E,A ;MOVE SO '?' PRINTS
PRAST CALL BDOS
RDLP LHLD BUFAD ;GET BUFFER ADDR
XCHG ;MOVE TO D,E
;SET NEW BUFFER ADDR
LXI H,128
DAD D ;POINT TO NEXT
SHLD BUFAD
MVI C,STDMA ;SET
CALL BDOS ;..DMA ADDR
LHLD BUFAD
LXI D,FCB
MVI C,READ
CALL BDOS
ORA A ;READ OK?
JNZ RDER ;NO, CHECK EOF
;INCR BUFF COUNT, IF NSEC, WRITE
LDA BUFFN
INR A
STA BUFFN
CPI NSEC
JC RDLP ;LOOP IF MORE TO DO
;HAVE READ NSEC SECTORS, WRITE THEM
EOFWR LDA CHECK ;WAS TSAVE ? REQUESTED?
CPI '?'
JNZ NCK1 ;YES - INIT FOR INPUT TEST
;INIT TARBELL FOR INPUT
MVI A,10H ;GET INPUT RESET CHAR
OUT 6EH ;RESET TARBELL
JMP SENDF ;SKIP OUTPUT INIT
;CHECK NOT REQUESTED - INIT TARBELL OUTPUT
NCK1 MVI A,3CH ;GET TARBELL START CHAR
CALL TOUT ;OUTPUT IT
MVI A,0E6H ;GET TARBELL SYNCH CHAR
CALL TOUT ;OUTPUT IT
SENDF LXI H,FCB+1 ;SET UP AND
MVI B,8+3 ;..OUTPUT
FCBLP MOV A,M ;GET FCB CHAR
CALL TOUT ;WRITE IT
INX H ;POINT TO NEXT
DCR B ;MORE?
JNZ FCBLP
;WRITE THE SECTOR COUNT
LDA BUFFN ;GET SECTOR COUNT
CALL TOUT ;WRITE IT
;IF BUFFN IS 0, THEN THAT WAS EOF
LDA BUFFN
ORA A ;DONE?
JZ EXIT ;YES
;WRITE THE SECTORS
LXI H,BUFF ;POINT TO START
SHLD BUFAD ;INIT BUFF ADDR
LDA BUFFN ;GET NUMBER OF BUFFERS
MOV B,A ;SAVE IN B
XRA A ;GET A ZERO
STA CKSUM ;INIT CKSUM
WRSEC MVI C,128 ;INIT C TO SECTOR LENGTH
WRCHR MOV A,M ;GET CHAR
CALL TOUT ;WRITE IT
INX H ;POINT TO NEXT
DCR C ;MORE IN SECTOR?
JNZ WRCHR
DCR B ;DECR # OF SECTORS
JNZ WRSEC ;MORE SECTORS TO WRITE
LDA CKSUM ;SEND CKSUM
CALL TOUT
XRA A ;GET A ZERO
STA BUFFN ;INIT BUFF NUMBER
;DONE - IF NOT CHECKING, INSERT DELAY
;TO ALLOW FOR FILE WRITE ON LOAD
LDA CHECK
CPI '?'
JZ READB
LXI B,0
MVI D,8
WAIT DCR C
JNZ WAIT
DCR B
JNZ WAIT
DCR D
JNZ WAIT
;IF EOF, SEND EOF REC (HDR, 0 DATA)
LDA EOFLG ;GET FLAG
ORA A ;EOF?
JNZ EOFWR ;YES
JMP READB ;GO READ MORE
;READ ERROR - CHECK FOR EOF
RDER DCR A ;WAS IT 1?
JNZ RDERR ;NO, GENUINE READ ERROR
;EOF REACHED
INR A ;GET NON-ZERO VALUE
STA EOFLG ;SET EOF FLAG
JMP EOFWR ;GO WRITE LAST PART
OPNER LXI D,MSG2
JMP ERXIT
RDERR LXI D,MSG5 ;READ ERROR
JMP ERXIT
ERXIT MVI C,PRINT
CALL BDOS ;PRINT MESSAGE
EXIT LHLD STACK ;GET ORIGINAL STACK
SPHL ;RESTORE IT
RET ;--EXIT--
;TARBELL WRITE
TOUT PUSH PSW
;CALC CKSUM
PUSH H
LXI H,CKSUM
XRA M ;CALC CKSUM
MOV M,A ;SAVE IT BACK
POP H
;IF CHECKING, THEN READ AND MATCH
LDA CHECK
CPI '?'
JZ RDCK ;READ, CHECK
TWAIT IN 6EH
ANI 20H
JNZ TWAIT
POP PSW
OUT 6FH
RET
RDCK POP PSW ;GET CHAR
PUSH B ;SAVE BC
MOV B,A ;PUT CHAR IN B
RDWT IN 6EH ;READ TARBELL STAT
ANI 10H
JNZ RDWT
IN 6FH
CMP B
JZ CKOK ;CHAR MATCHED
;CHAR DIDN'T MATCH -
LXI D,CKERR ;GET ERR MSG
JMP ERXIT ;PRINT ERROR, EXIT
CKOK POP B ;RESTORE BC
RET
DS 30 ;STACK AREA
STACK DS 2 ;STACK POINTER
MSG2 DB 'CANNOT OPEN$'
MSG5 DB 'READ ERR$'
CKERR DB 'COMPARE UNEQUAL$'
BLKNO DB 0 ;BLOCKS READ, TO BE WRITTEN
BUFFN DB 0 ;BUFFER NUMBER
CHECK DS 1 ;IF TSAVE ? TYPED
CKSUM DS 1 ;CHECKSUM
EOFLG DB 0 ;EOF FLAG, 0=NO
BUFAD DW BUFF ;CURRENT READ ADDR
BUFF EQU $ ;BUFFER FROM HERE ON
;
; BDOS EQUATES (VERSION 2)
;
RDCON EQU 1
WRCON EQU 2
PRINT EQU 9
OPEN EQU 15 ;0FFH=NOT FOUND
CLOSE EQU 16 ; " "
SRCHF EQU 17 ; " "
SRCHN EQU 18 ; " "
ERASE EQU 19 ;NO RET CODE
READ EQU 20 ;0=OK, 1=EOF
WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
MAKE EQU 22 ;0FFH=BAD
REN EQU 23 ;0FFH=BAD
STDMA EQU 26
BDOS EQU 5
REIPL EQU 0
FCB EQU 5CH ;SYSTEM FCB