.TITLE MRKPNT - MARK AND POINT ROUTINES FOR LIST .IDENT /01/ .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 .MCALL GET$ .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 #FDB,R0 ; SET 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 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$: GET$ #FDB,#BUFFER,#BUFSIZ ; GET 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 #FDB,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 RETURN .SBTTL MRKDOT - MARK POSITION OF DOT ;+ ; ; MRKDOT - Mark current record position (known as dot). ; ;- MRKDOT:: CALL $SAVAL ; SAVE R0 - R5 MOV CURREC,OLDREC ; SAVE LAST MOV CURREC+2,OLDREC+2 ; RECORD MARKED MOV #FDB,R0 ; SET ADDRESS OF FDB CALL .MARK ; GET VIRTUAL BLOCK # MOV #OLDDOT,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 RETURN .SBTTL PNTDOT - POINT AT OLD DOT ;+ ; ; PNTDOT - Point to old position of dot. Used to reprint current page. ; ;- PNTDOT:: CALL $SAVAL ; SAVE R0 - R5 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 RETURN .END