; FSTAPE.ASM ; ZX Spectrum Tape-only filing routines - J.G.Harston ; --------------------------------------------------- ; FSLOAD - Load data ; FSSAVE - Save data ; FSCAT - Catalog files ; Size: 263 bytes ; ; All routines are entered with IX=>some workspace, HL=>filename ; (terminated with carriage return), and return C if Completed ; successfully, and return NC if Not Completed. ; FSLOAD - Load data ; ------------------ ; On entry, IX=>header workspace, at least 34 bytes ; HL=>filename, terminated with ; DE= start or 0 to use file's address ; A = type ; On exit, CS= load successful ; NC= load failed - BREAK pressed or Bad filename ; FSLOAD CALL FSPARSE ; Parse filename, build header RET NC ; Bad filename FSLD01 PUSH IX LD DE,17 ; DE=length ADD IX,DE ; IX=>loaded header XOR A ; Header block CALL FSLD10 ; Load a header block FSLD02 POP IX JR C,FSLD03 ; Header loaded CALL &1F54 ; Test BREAK key JR C,FSLD01 ; Loop for another header RET ; BREAK pressed FSLD03 PUSH IX LD A,(IX+1) CP " " JR Z,FSLD08 ; load "" - match next LD B,11 ; Match type byte and ten characters LD A,(IX+0) JR FSLD04 ; Check type byte first FSLDLP LD A,(IX+0) CP "*" JR Z,FSLD08 ; Match all CP "#" JR Z,FSLD06 ; Match one character CP (IX+17) JR Z,FSLD06 ; Match one character XOR &20 ; Force to upper case FSLD04 XOR (IX+17) ; EQ=match, CC always JR Z,FSLD06 ; Matched POP IX JR FSLD01 ; Loop for another FSLD06 INC IX DJNZ FSLDLP ; Loop for 11 bytes FSLD08 POP IX ; IX=>header to match LD H,(IX+14) LD L,(IX+13) ; Start LD A,H OR L JR NZ,FSLD09 ; Use specified address LD H,(IX+17+14) ; Use file's address LD L,(IX+17+13) FSLD09 LD D,(IX+17+12) ; Length LD E,(IX+17+11) PUSH HL POP IX ; IX=start address LD A,&FF ; Data block FSLD10 SCF ; Load ; Drop through... ; ; Call LDBYTES catching error ; --------------------------- ERRSP EQU 23613 LDBYTES LD HL,(ERRSP) ; Save error handler PUSH HL CALL LDBYT2 JR SVDONE LDBYT2 LD (ERRSP),SP JP &0556 ; FSSAVE - Save data ; ------------------ ; On entry, IX= header workspace, at least 17 bytes ; HL=>filename, terminated with ; A = type ; BC= length ; DE= start ; (IX+15)=exec ; On exit, CS= save successful ; NC= save failed - BREAK pressed or Bad filename ; FSSAVE CALL FSPARSE ; Parse filename, build header RET NC ; Bad filename RET Z ; Null filename ; ; Call SVBYTES catching error ; --------------------------- SVBYTES LD HL,(ERRSP) ; Save error handler PUSH HL CALL SVBYT2 SVDONE POP HL LD (ERRSP),HL RET SVBYT2 LD (ERRSP),SP PUSH DE ; Stack data start address JP &0984 ; Save header and data ; FSCAT - Catalog files ; --------------------- ; On entry, IX=>header workspace, at least 17 bytes ; On exit, Tape catalog terminated by pressing a key ; FSCAT FSCAT1 LD C,3 ; Three columns FSCATLP PUSH IX PUSH BC LD DE,17 ; DE=length XOR A ; Header block SCF ; Load CALL LDBYTES ; Load a header block POP BC POP IX BIT 5,(IY+1) JR NZ,FSCATX ; Exit if key pressed JR NC,FSCATLP ; Get another header PUSH IX LD (IY+82),255 ; Prevent Scroll? LD B,10 FSCAT4 INC IX LD A,(IX+0) ; Get character RST 16 ; Print it DJNZ FSCAT4 POP IX DEC C JR Z,FSCAT1 LD A,32 RST 16 JR FSCATLP FSCATX LD A,8 ; Print tidy newline RST 16 LD A,13 RST 16 RET ; FSPARSE - Parse filename, build header ; -------------------------------------- ; On entry, IX=>header workspace ; HL=>filename ; DE= start ; BC= length ; A = type ; On exit, IX=>header ; EQ= null filename ; NC= bad filename ; DE,BC preserved ; AF,HL corrupted ; FSPARSE LD (IX+0),A ; File type PUSH BC PUSH IX FSPAR1 LD A,(HL) INC HL CP 32 JR Z,FSPAR1 ; Skip spaces DEC HL LD B,10 ; 10 characters FSPARLP LD A,(HL) CP "!" JR C,FSPAR2 ; End of filename INC HL INC IX LD (IX+0),A DJNZ FSPARLP LD A,(HL) CP "!" ; CS+NE=ok, NC=bad JR FSPAROK FSPAR2 INC IX LD (IX+0),32 ; Pad with spaces DJNZ FSPAR2 LD A,(IX-9) CP " " ; EQ=null filename, NC=ok CCF ; EQ=null filename, CS=ok FSPAROK POP IX POP BC LD (IX+14),D ; Start LD (IX+13),E LD (IX+12),B ; Length LD (IX+11),C FSINIT FSDRIVE RET