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