; SAVE.S - *SAVE command using blocked tape save ; J.G.Harston, 25 June 1986 ; ; Syntax: *SAVE filename START+LENGTH:BLKLEN ; v1.00 25-Jun-1986 Saves fixed 256-byte blocks, <256 for last block ; v1.01 23-Aug-1987 Saves a final zero-length block if last block not <256 bytes ; Skips spaces before calling SCANHEX ; Note, bad syntax not checked for, must be no space before '+' ; Block header: ; 00 ; File type ; Filename ; Block length - 256+ for full block, <256 for last block ; Block start address ; Block extra address ; ; Block data: ; FF ; as per length ; ; Block data if final block is not &00xx bytes long: ; 00 SCANHEX EQU #0025 ; Scan hex from DE to HL, A=term char ORG #5B00 SAVE LD HL,HEADER+1 ; Point to filename LD B,10 NAME LD A,(DE) ; Copy filename from DE CP 33 JR C,NAMEPAD LD (HL),A INC HL INC DE DJNZ NAME JR NAMEOK NAMEPAD LD A,32 ; Pad with spaces LD (HL),A INC HL DJNZ NAMEPAD NAMEOK CALL SKIPSPC CALL SCANHEX LD (HEADER+13),HL ; Start LD (HEADER+15),HL ; Extra CALL SKIPSPC CALL SKIPNXT ; Step past '+' CALL SCANHEX ; Read length LD (LENGTH),HL ; Length CALL SKIPSPC CP ":" ; Any block length specified? JR NZ,BLKOK ; No, use default CALL SKIPNXT ; Step past ':' CALL SCANHEX ; Read blocklen LD (BLKLEN),HL BLKOK LD A,3 LD (HEADER+0),A ; Filetype SA_LOOP LD HL,(LENGTH) ; Get remaining length LD DE,(BLKLEN) ; Prepare to save full BLKLEN bytes AND A SBC HL,DE ; Is remaining length