.TITLE DSUIO - DATA SET UTILITY PROGRAM I/O SUBROUTINES .IDENT /DSU.04/ ; ; DSU.04 17-FEB-82 - SPLIT OUT I/O ROUTINES ; ; ; .DSABL GBL ; ; ENTRY POINTS ; .GLOBL ASGNIN,RDBLK,WIGGLE,WIG,GLE,ECHO,CURSOR .GLOBL VDTIN,FNDIDX,MOVIDX,MOVMFD,FNDHED,UFSRCH,UFFIND ; ; EXTERNAL ENTRY POINTS ; .GLOBL BADDIR,IOERR,LKUP ; ; EXTERNAL DATA ; .GLOBL PHYDEV,$DSW,IOSTAT,VDTSTAT,DATA,INBUF,OUTBUF,NMAPS .GLOBL BLKLO,BLKHI,IDXLBL,IDXLBH,IDXHED,MFDLBH,MFDLBL,MFDHED .GLOBL CSTAT,UFDFIL,USRFIL,MAXVER,MAXVID,VBLKLO,VBLKHI .GLOBL IO.RLB,IO.WLB ; ; MACROS ; .MCALL DIR$,QIOW$,QIOW$C,QIOW$S,CSI$ ; CSI$ ; ; ; **************************************************************** ; **************************************************************** ; ; ; ASSIGN LU 2 TO INPUT, WHATEVER IT IS ; ASGNIN: DIR$ #PHYDEV ;ASSIGN LUN 2 BCC 2$ 1$: JMP BADDIR ;CHOKE! 2$: TST $DSW ;DIRECTIVE COMPLETE SUCCESSFULLY? BMI 1$ ;NOPE! RETURN ; ; ; ; ; ; TERMINAL OUTPUT KLUGE ROUTINES TO PREVENT INGESTION ; OF FIRST CHARACTER SENT BACK TO TERMINAL ; ; WIG: QIOW$C IO.WLB,5,1,,VDTSTAT,, RETURN GLE: QIOW$C IO.WLB,5,1,,VDTSTAT,, RETURN WIGGLE: QIOW$C IO.WLB,5,1,,VDTSTAT,, RETURN LR: L: .BYTE 33,'[,'D R: .BYTE 33,'[,'C ; ; ; ; ; READ LOGICAL BLOCK FROM DEVICE AT LUN 2 ; QIO DIRECTIVE BLOCK OFFSETS BLKHI AND BLKLO DEFINED HERE ; RDBLK: DIR$ #LBLK ;READ DEVICE LOGICAL BLOCK BCC 1$ ;DIRECTIVE ACCEPTED JMP BADDIR ;ELSE, DOWN THE CHUTE 1$: TSTB IOSTAT ;ERROR? BPL 2$ ;NOPE! JMP IOERR ;ELSE, DOWN THE CRAPPER 2$: RETURN ; LBLK: QIOW$ IO.RLB,2,4,,IOSTAT,, BLKHI=LBLK+Q.IOPL+6 ;HI-ORDER LBN BLKLO=BLKHI+2 ;LO-ORDER LBN ; ; ; ; ; READ FROM TERMINAL ; VDTIN: QIOW$C IO.RLB,5,1,,VDTSTAT,, RETURN ; ; ; ECHO CHARACTER BACK TO VDT ; ECHO: QIOW$S #IO.WLB,#5,#1,,#VDTSTAT,,<#INBUF,#1> RETURN ; ; ; ECHO BACK THE CURSOR MOVEMENT ; CURSOR: QIOW$C IO.WLB,5,1,,VDTSTAT,, RETURN ; ; ; ; **************************************************************** .SBTTL VIRTUAL BLOCK HANDLING ROUTINES ; **************************************************************** ; ; READ IN HEADER BLOCK OF SYSTEM INDEX FILE ; THE HEADER BLOCK IS AT VIRTUAL BLOCK 3+N, WHERE N IS THE NUMBER ; OF INDEX-FILE BIT MAP BLOCKS AND IS DEFINED AT OFFSET 0 OF THE ; HOME BLOCK (VIRTUAL BLOCK 2, LOGICAL BLOCK 1) AND THE LBN OF ; THE FIRST BIT MAP (VIRTUAL BLOCK 3) IS AT OFFSETS 2 - 5 OF THE ; HOME BLOCK ; FNDIDX: MOV #1,BLKLO ;READ HOME BLOCK CLR BLKHI ;(LBN 1) CALL RDBLK ;READ BLOCK MOV DATA+2,BLKHI ;PICK UP BASE OF INDEX BITMAPS MOV DATA+4,BLKLO ADD DATA,BLKLO ;ADD # OF BITMAP BLOCKS ADC BLKHI ;DOUBLE PRECISION MOV DATA,NMAPS ;WHILE YOU'RE AT IT, SAVE THE COUNT ;OF INDEX FILE BIT MAPS CALL RDBLK ;READ NEW BLOCK ;SAVE INDEX FILE HEADER DATA MOVIDX: MOV BLKHI,IDXLBH ;SAVE THOSE BOXTOPS! MOV BLKLO,IDXLBL ;(REMEMBER LBN OF INDEX FILE HEADER) MOV #IDXHED,R1 ;MOVE TO HERE MOVEM: MOV #DATA,R0 ;MOVE FROM HERE MOV #256.,R2 ;THIS MANY WORDS 1$: MOV (R0)+,(R1)+ SOB R2,1$ RETURN ;NOPE! MOVMFD: MOV BLKHI,MFDLBH ;SAVE LBN OF MFD HEADER MOV BLKLO,MFDLBL MOV #MFDHED,R1 ;MOVE IT TO HERE BR MOVEM ; ; READ IN HEADER BLOCK OF REQUESTED FILE ; THE HEADER BLOCK OF THE SYSTEM INDEX FILE IS IN THE IDXHED BUFFER ; (OR AT LEAST IT HAD BETTER BE!) THE LBN POINTERS ARE UPDATED TO POINT ; TO THE MASTER FILE DIRECTORY (MFD) HEADER. MFD BLOCKS ARE SCANNED UNTIL ; THE UFD OF THE REQUESTED FILE IS FOUND. THE FILE SEQUENCE NUMBER OF THE ; UFD IS USED TO REFERENCE THE MAPPING IN THE INDEX FILE HEADER TO LOCATE ; THE UFD HEADER. IF THE REQUESTED FILE IS A UFD THEN NO FURTHER ACTION ; NEED BE TAKEN. ON THE OTHER HAND, IF THE FILE IS NOT A UFD, THE UFD IS ; SEARCHED FOR THE FILE, THE SEQUENCE NUMBER IS OBTAINED, AND THE FILE ; HEADER IS FOUND IN THE INDEX FILE. ; FNDHED: MOV IDXLBL,BLKLO ;SET LBN TO INDEX FILE HEADER BLOCK MOV IDXLBH,BLKHI ADD #3,BLKLO ;OFFSET TO MFD HEADER ADC BLKHI CALL RDBLK ;READ BLOCK CALL MOVMFD ;SAVE MFD HEADER CALL UFFIND ;AND GET SEQUENCE # OF UFD BCS 1$ ;CAN'T FIND IT: RETURN IN SHAME CALL LKUP ;USE SEQ. # TO FIND HEADER BLOCK CALL RDBLK ;READ HEADER BLOCK ;GOT UFD HEADER - GO ON? BITB #CS.NMF,CSTAT ;DID THEY WANT A FILE? BEQ 1$ ;NO, UFD IS FINE CALL UFSRCH ;SEARCH UFD FOR FILE BCS 1$ ;RETURN WITH FAILURE CALL LKUP ;LOOK UP HEADER BY SEQUENCE # BCS 1$ ;RETURN WITH FAILURE CALL RDBLK ;READ HEADER BLOCK 1$: RETURN ; ; ; ; SEARCH THROUGH UFD FOR SPECIFIED FILE. ENTER WITH UFD HEADER ; IN DATA BUFFER. RETURNS FILE SEQUENCE NUMBER IF FILE FOUND ; ELSE CARRY SET. ; UFSRCH: MOV #DATA,R0 ;MOVE UFD HEADER TO MFD BUFFER MOV #MFDHED,R1 MOV #256.,R2 1$: MOV (R0)+,(R1)+ SOB R2,1$ MOV USRFIL,UFDFIL ;MOVE USER FILE SPEC TO UFD SPEC BLOCK MOV USRFIL+2,UFDFIL+2 MOV USRFIL+4,UFDFIL+4 MOV USRFIL+6,UFDFIL+6 MOV USRFIL+10,UFDFIL+10 ;INCLUDE VERSION ;AND FAKE A UFD FIND ; ; ; ; ; ; SEARCH MFD FOR SPECIFIED UFD. MFD HEADER IS IN MFDHED BUFFER AND ; UFD DIRECTORY FILE SPEC IS IN UFDFIL BLOCK IN RAD50. RETURNS FILE ; SEQUENCE NO. IN R0 OR CARRY BIT SET IF UFD NOT FOUND ; UFFIND: MOV #UFDFIL,R1 ;POINT TO UFD FILE SPEC MOV MFDHED,R5 ;GET OFFSET TO MAP AREA OF MFD CLRB R5 ;IT LIVES IN THE UPPER BYTE SWAB R5 ASL R5 ;AND IT'S A WORD OFFSET ADD #MFDHED+10,R5 ;ADD BASE ADDRESS + ADJUSTMENT MOV (R5)+,R3 ;GET # OF RETRIEVAL PTR WORDS IN USE BIC #177400,R3 ;LOW BYTE ONLY ASR R3 ;AND DIV BY 2 SINCE A PTR IS 2 WORDS ;AND YOU'RE SET TO FLY 1$: BNE 3$ ;IF COUNT NOT 0, GO ON 2$: TST MAXVER ;WAS THIS A CHOICE AMONG EQUALS? BEQ 25$ ;NO, IT'S A REAL SEARCH FAILURE MOV MAXVID,R0 ;ELSE GET PRE-FOUND SEQUENCE # BR 26$ ;AND GO GRACEFULLY 25$: SEC ;ELSE, END OF THE TRAIL 26$: RETURN ;RETURN WITH FAILURE 3$: MOVB (R5)+,BLKHI ;GET HI LBN MOVB (R5)+,R4 ;GET BLOCK COUNT BIC #177400,R4 ;STRIP PROPAGATED BITS MOV (R5)+,BLKLO ;FINALLY GET LO LBN 4$: CALL RDBLK ;READ THAT BLOCK MOV #DATA,R0 ;POINT TO TOP OF DATA BUFFER ;SEARCH BLOCK FOR UFD 5$: TST 6(R0) ;IS THERE A FILENAME THERE? BEQ 7$ ;NO, END OF DATA FOR THIS BLOCK CMP @R1,6(R0) ;FILE NAMES MATCH? BNE 6$ ;NO CMP 2(R1),10(R0) BNE 6$ ;NO CMP 4(R1),12(R0) BNE 6$ ;NO CMP 6(R1),14(R0) BNE 6$ ;NO TST 10(R1) ;VERSION NO. SPECIFIED BNE 55$ ;YES, TRY TO MATCH IT TST @R0 ;IS THIS A REAL FILE OR A GHOST? BEQ 6$ ;0 SEQUENCE # MEANS IT'S A GHOST CMP 16(R0),MAXVER ;IS THIS THE HIGHEST VER SEEN SO FAR? BLOS 6$ ;NO, SKIP IT MOV 16(R0),MAXVER ;ELSE, REMEMBER THIS VER MOV @R0,MAXVID ;AND THIS FILE ID BR 6$ ;CONTINUE 55$: CMP 10(R1),16(R0) ;VERSIONS THE SAME? BNE 6$ ;NO MOV @R0,R0 ;FOUND IT: RETURN SEQUENCE # BEQ 25$ ;ZERO SEQUENCE # MEANS GHOST FILE RETURN 6$: ADD #16.,R0 ;SKIP OVER ENTRY CMP #DATA+512.,R0 ;END OF BLOCK? BHI 5$ ;NO, KEEP LOOKING 7$: DEC R4 ;COUNT THAT BLOCK OFF BMI 8$ ;END OF THIS CONTIGUOUS BUNCH ADD #1,BLKLO ;ELSE, GO TO NEXT BLOCK ADC BLKHI BR 4$ 8$: DEC R3 ;ELSE, TICK OFF ONE MORE MAPPING BR 1$ ;AND TRY NEXT BLOCK ; ; .END