;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