.TITLE MRKPNT - MARK AND POINT ROUTINES FOR LIST .IDENT /01.2/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: MRKPNT ; Author: Robin Miller ; Date: October 23, 1981 ; ; Description: ; ; These routines do the mark and pointing of records for the ; LIST file program. The mark routine will mark every 50th record. ; The point routine will point to a particular record number. ; ; ; Modification History: ; ;- .ENABL AMA .SBTTL MARKER - MARK CURRENT RECORD IF NEEDED ;+ ; ; MARKER - Mark the current record if needed. ; ; Inputs: ; CURREC = Current record number. ; RECCNT = Highest record encountered. ; ; Outputs: ; CURREC - Current record number bumped. ; RECCNT - Highest record number updated (if needed). ; ; Every 50th record: ; MARKB - Updated with record virtual block #'s. ; MARKP - Points to next mark buffer address. ; MARKC - Incremented to reflect # of mark entries. ; ;- MARKER:: CALL $SAVAL ; SAVE R0 - R5 INC CURREC+2 ; COUNT THIS RECORD ADC CURREC ; HIGH ORDER BITS CMP CURREC,RECCNT ; UPDATED HIGH RECCNT ? BHI 10$ ; IF HI, YES CMP CURREC+2,RECCNT+2 ; MAYBE, REALLY UPDATE ? BLOS 20$ ; IF LOS, NO 10$: MOV CURREC,RECCNT ; COPY HIGH BITS MOV CURREC+2,RECCNT+2 ; AND THE LOW BITS 20$: MOV #50.,R0 ; SET THE DIVISOR MOV CURREC,R1 ; SET HIGH ORDER PART MOV CURREC+2,R2 ; SET LOW ORDER PART CALL $DDIV ; DO THE DIVIDE CMP R2,MARKC ; DO WE NEED TO MARK ? BLE 100$ ; IF LE, NO CMP MARKC,#MRKLEN ; OVER THE LIMIT ? BGE 100$ ; IF GE, YES MOV CURREC,LSTREC ; SAVE LAST MOV CURREC+2,LSTREC+2 ; RECORD MARKED MOV FDBADR,R0 ; COPY ADDRESS OF FDB CALL .MARK ; GET VIRTUAL BLOCK # MOV MARKP,R4 ; GET MARK BUFFER POINTER MOV R1,(R4)+ ; SAVE THE HIGH ORDER BITS MOV R2,(R4)+ ; SAVE THE LOW ORDER BITS MOV R3,(R4)+ ; SAVE NEXT BYTE IN BLOCK MOV R4,MARKP ; SAVE UPDATED POINTER CLR MARKB+4 ; ZERO TO FORCE TO 1ST RECORD INC MARKC ; COUNT # OF MARK ENTRIES 100$: RETURN .SBTTL POINTR - POINT TO A PARTICULAR RECORD ;+ ; ; POINTR - Points to a particular record. ; ; Inputs: ; WTGREC = Contains the record to point to. ; ; Outputs: ; CURREC - Updated with the record pointed to. ; ;- POINTR:: CALL $SAVAL ; SAVE R0 - R5 TST WTGREC ; GOT A VALID RECORD # ? BNE 10$ ; IF NE, YES TST WTGREC+2 ; REALLY VALID RECORD ? BEQ 15$ ; IF EQ, MUST BE '0' 10$: SUB #1,WTGREC+2 ; BY -1 TO GET ACTUAL RECORD SBC WTGREC ; SUBTRACT OUT BORROW (IF ANY) 15$: MOV WTGREC,R1 ; SETUP HIGH BITS MOV WTGREC+2,R2 ; SETUP LOW BITS CMP R1,RECCNT ; HAVE WE EVER BEEN THERE ? BHI 20$ ; IF HI, NO CMP R2,RECCNT+2 ; MAYBE, REALLY ? BHI 20$ ; IF HI, NO MOV #50.,R0 ; SETUP DIVISOR CALL $DDIV ; DO THE DIVIDE CLR SKPCNT ; CLEAR THE HIGH BITS MOV R0,SKPCNT+2 ; REMAINDER = # TO SKIP CMP R2,#MRKLEN ; TABLE INDEX TOO BIG ? BGE 20$ ; IF GE, YES MOV R2,R5 ; COPY FOR MULTIPLY MUL #,R5 ; OFFSET INTO TABLE ADD #MARKB,R5 ; POINT TO ACTUAL ENTRY CALL POINT ; POINT TO THE RECORD MOV WTGREC,CURREC ; SETUP CURRENT RECORD MOV WTGREC+2,CURREC+2 ; AND THE LOW BITS SUB SKPCNT+2,CURREC+2 ; ADJUST FOR # TO SKIP BR 30$ ; AND CONTINUE ; Skip forward to desired record number. 20$: TST MARKC ; ANY ENTRIES ? BEQ 25$ ; IF EQ, NO MOV MARKP,R5 ; POINT TO NEXT ENTRY SUB #,R5 ; POINT TO LAST ENTRY CALL POINT ; POINT TO THAT ENTRY MOV LSTREC,CURREC ; SET UP NEW MOV LSTREC+2,CURREC+2 ; CURRENT RECORD 25$: MOV WTGREC,SKPCNT ; COPY DESIRED RECORD MOV WTGREC+2,SKPCNT+2 ; AND THE LOW BITS SUB CURREC,SKPCNT ; SUBTRACT CURRENT RECORD SBC SKPCNT+2 ; AND CARRY IF NEED BE SUB CURREC+2,SKPCNT+2 ; AND FINALLY THE HIGH BITS ; Skip records to get to desired record number. 30$: MOV SKPCNT,R4 ; COPY THE SKIP COUNT MOV SKPCNT+2,R3 ; AND THE LOW BITS TST R4 ; HAVE A COUNT ? BNE 40$ ; IF NE, YES TST R3 ; HAVE A COUNT ? BEQ 50$ ; IF EQ, NO 40$: CALL GET ; GET THE NEXT RECORD BCS 50$ ; IF CS, GET NO MORE CALL MARKER ; CHECK FOR MARKER SOB R3,40$ ; SKIP THE RECORDS DEC R4 ; NOW THE HIGH BYTE BGE 40$ ; IF GE, MORE TO GO 50$: RETURN ; Point to record. R5 = block #'s saved by MARKER. POINT: MOV FDBADR,R0 ; SETUP FDB ADDRESS MOV (R5)+,R1 ; HIGH VIRTUAL BLOCK # MOV (R5)+,R2 ; LOW VIRTUAL BLOCK # MOV (R5)+,R3 ; OFFSET INTO BLOCK CALL .POINT ; POINT TO THE RECORD BIC #B.EOF,STATUS ; PRESUME NOT END OF FILE RETURN .SBTTL MRKDOT - MARK POSITION OF DOT ;+ ; ; MRKDOT - Mark current record position (known as dot). ; ;- .ENABLE LSB MRKDOT:: CALL $SAVAL ; SAVE R0 - R5 BIT #B.PINV,STATUS ; SHOULD WE MARK DOT BNE 20$ ; IF NE, NO MOV #OLDDOT,R4 ; CURRENT PAGE DOT MOV CURREC,OLDREC ; SAVE LAST MOV CURREC+2,OLDREC+2 ; RECORD MARKED BR 10$ ; AND CONTINUE ... MRKSAV:: CALL $SAVAL ; SAVE R0 - R5 MOV #SAVDOT,R4 ; NEXT PAGE DOT MOV CURREC,SAVREC ; SAVE CURRENT MOV CURREC+2,SAVREC+2 ; RECORD # 10$: MOV FDBADR,R0 ; SET ADDRESS OF FDB CALL .MARK ; GET VIRTUAL BLOCK # MOV R1,(R4)+ ; SAVE THE HIGH ORDER BITS MOV R2,(R4)+ ; SAVE THE LOW ORDER BITS MOV R3,(R4)+ ; SAVE NEXT BYTE IN BLOCK 20$: RETURN .DSABLE LSB .SBTTL PNTDOT - POINT AT OLD DOT ;+ ; ; PNTDOT - Point to old position of dot. Used to reprint current page. ; ;- PNTDOT:: CALL $SAVAL ; SAVE R0 - R5 BIT #B.PINV,STATUS ; IS THE PAGE MARK VALID ? BEQ 10$ ; IF EQ, YES MOV OLDREC,WTGREC ; COPY RECORD NUMBER MOV OLDREC+2,WTGREC+2 ; TO POINT TO CALL POINTR ; POINT TO IT BIC #B.PINV,STATUS ; SHOW PAGE MARK IS VALID CALL MRKDOT ; MAKE CURRENT DOT VALID BR 20$ ; AND RETURN ... 10$: MOV OLDREC,CURREC ; MAKE OLD RECORD MOV OLDREC+2,CURREC+2 ; THE CURRENT RECORD MOV #OLDDOT,R5 ; SAVED VITUAL BLOCK CALL POINT ; POINT TO IT 20$: RETURN PNTSAV:: CALL $SAVAL ; SAVE R0 - R5 MOV SAVREC,CURREC ; MAKE SAVED RECORD MOV SAVREC+2,CURREC+2 ; THE CURRENT RECORD MOV #SAVDOT,R5 ; SAVED VIRTUAL BLOCK CALL POINT ; POINT TO IT RETURN .END