; TAPEBLOCK 1.00 ; J.G.HARSTON ; ; 'Format' a tape by writing block headers with ; incrementing block numbers. Tape can then be ; overwritten with normal files. Cataloging will ; list files with block numbers SCR_CT EQU 23692 VER_NO EQU 3 DFCC EQU 23684 ORG 65000 ; Catalogue a tape CATALOG JP CAT ; Format a tape FORMAT LD HL,VERSION-1 ; Print header CALL PR_NAME ; Print version string LD HL,FORM-1 CALL PR_NAME ; Print 'Formatting' LD HL,T_BYTES CALL PR_NAME ; Print 'Tape count' LD A,13 RST #10 LD HL,0 ; Start at block zero LD A,6 LD (T_BYTES),A ; Set filetype to 6 F_LOOP LD (COUNT),HL ; Save block number LD (T_BYTES+11),HL ; Set block number LD A,VER_NO LD (T_BYTES+13),A ; Set version number CALL SAVER ; Save a header LD HL,(COUNT) ; Get block number back LD A,#FF LD (SCR_CT),A ; Prevent scroll prompting CALL PR_SPC ; Print a space LD A,L CALL PR_HEX ; Print low byte of block number CALL PR_SPC ; Print a space INC HL ; Update block number LD A,H OR L JR NZ,F_LOOP ; Loop until block wraps to zero RET SAVER CALL S_REG ; Get header address,length LD HL,#053F PUSH HL ; Stack SALD_RET LD HL,#0800 ; 1.5s leader JP #04D0 ; Save a header PREG_1 CALL P_REG ; Print HL in hex, then a space PR_SPC LD A,32 RST #10 RET P_REG LD A,H ; Print HL in hex CALL PR_HEX LD A,L PR_HEX PUSH AF ; Print A in hex RRCA RRCA RRCA RRCA CALL P_HEX2 POP AF P_HEX2 AND 15 ADD A,48 CP #3A JR C,P_HEX3 ADD A,7 P_HEX3 RST #10 RET S_REG XOR A ; Get header address and length SCF LD IX,T_BYTES LD DE,17 RET PR_NAME LD B,10 ; Print name at HL PR_LOOP INC HL LD A,(HL) CP 32 JR NC,PR_N_2 ; Jump to print normal chars PUSH HL ; Print control chars inverted LD HL,(DFCC) ; Save DFCC PUSH HL ADD A,64 ; Print control char plus '@' RST #10 POP HL ; Get old DFCC PUSH BC LD B,8 PNLOOP LD A,(HL) ; Invert printed character CPL LD (HL),A INC H DJNZ PNLOOP POP BC POP HL JR P_N_NXT PR_N_2 RST #10 P_N_NXT DJNZ PR_LOOP ; Loop for ten characters JR PR_SPC ; Finish with a space CAT_P PUSH HL LD A,(HL) ; Get filetype CP 6 JR NZ,CAT_P2 ; If not block, print title string PUSH HL ; Block found, so print cassette name LD HL,T_MESS-1 ; Print 'Cassette:' CALL PR_NAME POP HL CALL PR_NAME ; Print cassette name LD A,13 RST #10 CAT_P2 LD HL,C_MESS-1 ; Point to catalog title LD B,32 CALL PR_LOOP ; Print message LD A,13 LD (FLAG),A ; Flag that title has been printed RST #10 POP HL RET ; Catalog a tape CAT XOR A LD (FLAG),A ; Clear flag JR CAT_L2 ; Jump to main loop CAT_LP LD A,13 ; Move to column 0 RST #10 CAT_L2 CALL S_REG ; Get header address, length CALL #0556 ; Load a header JR NC,CAT_L2 ; Loop until loaded LD HL,T_BYTES ; Point to loaded header LD A,(FLAG) AND A CALL Z,CAT_P ; Print title if none printed yet LD A,(HL) ; Get filetype CP 6 JR NZ,PR_INFO ; Not block header, print standard header CALL PR_NAME ; Print header name LD HL,(T_BYTES+11) ; Get block number LD (COUNT),HL CALL PREG_1 ; Print block number LD B,32 CAT_4 LD A,8 ; Move up a line to overwrite RST #10 DJNZ CAT_4 JR CAT_LP ; Jump to wait for another block PR_INFO LD HL,(COUNT) ; Print standard header CALL PREG_1 ; Print last block encountered LD HL,T_BYTES LD A,(HL) CALL P_HEX2 ; Print filetype CALL PR_SPC CALL PR_NAME ; Print filename LD HL,(T_BYTES+11) CALL PREG_1 ; Print length LD HL,(T_BYTES+13) CALL PREG_1 ; Print start LD HL,(T_BYTES+15) CALL P_REG ; Print extra JR CAT_LP ; Jump to wait for another header COUNT DEFW 0 T_BYTES DEFB 0 ; Type DEFM "Tape Count" ; Filename DEFW 0,0,0 ; Length, Start, Extra VERSION DEFM "Version " DEFB VER_NO+48 DEFB 32 FORM DEFM "Formatting" C_MESS DEFM " No. ? Name Len. Strt Prog" FLAG DEFB 0 T_MESS DEFM " Cassette:"