.NLIST TTM .TITLE PSCAN .IDENT /RICE02/ ; ; CALL PSCAN(ITEST,LABEL,DATA,ISKIP,ILIM,LOLIM,HILIM) ; ; REGISTERS ; R0,R1 = Temporary data ; R3 = Data or list address ; R4 = Status or output title address ; R5 = Parameter list address ; .psect $VARS,RW,D,LCL,CON ECTR: .WORD 0 ; Array counter TYPE: .WORD 0 ; TYPE OF DATA - FLOAT,0 1 WD INT INIT: .WORD 0 ; 0 if not started (status) SVTB2: .WORD 0 ; Save location in table SVTB: .WORD 0 ; Save label address SVDATA: .WORD 0 ; Save current data address TSAVE: .WORD 1 ; Temporary saved location LSAVE: .BLKW 1 ; Limit indicator save PARAM: .WORD 1 ; Number of params .PSECT $CODE,RO,LCL,CON,I PSCAN:: MOV #^RAN ,-(SP) ; SET UP FOR TRACEBACK MOV #^RPSC,R4 JSR R4,NAM$ MOV (R5)+,PARAM ; Number of params BIC #177400,PARAM ; Clear extra bytes SUB #3,PARAM ; Too few? BGE 10$ ; No JMP BPARM ; Yes 10$: BEQ 20$ ; No skip count CLR @6(R5) ; Clear skip count 20$: TST INIT ; FIRST TIME THRU BEQ INIT1 ; YES TST @(R5) ; FIRST TIME THRU? BNE BEG ; THIS IS NOT FIRST TIME THRU INIT1: INC INIT ; NO LONGER FIRST TIME CLR ECTR ; YES MOV #SVT2,SVTB2 ; ADDRESS OF ARRAY BR UPDATE BEG: MOV SVTB,R2 ; LABELS MOV SVDATA,R3 ; DATA ADDRESS DEC ECTR ; OUTPUT OLD DATA? BGT OUTNXT ; NEXT IN LINE CLR TYPE ; NEW DATA ADDRESS CLR ECTR UPDATE: MOV SVTB2,R2 ; NEXT ENTRY IN TABLE MOV (R2),R2 BEQ END ; NO MORE TO DO MOV R2,SVTB2 ; SAVE IT TST (R2)+ ; Skip over pointer to next MOV (R2)+,R4 ; TYPE SWITCH MOV R4,TSAVE ; SAVE STATUS MOV (R2)+,R3 ; SOURCE ADDRESS MOV R2,SVTB ; SAVE LABELS NEXT MOVB R4,ECTR ; COUNT OF DATA WDS BIC #177700,ECTR ; CLEAR EXTRA BITS BIT #40000,R4 ; PRECISION? BEQ 10$ ; SINGLE PRE INTEGER INC TYPE 10$: BIT #20000,R4 ; FLOATING? BEQ 20$ ; NO IT IS INTEGER DEC TYPE ; FLOATING PT. TYPE 20$: BIT #200,R4 ; Skip requested? BEQ OUTNXT ; No TST PARAM ; Skip requested? BLE OUTNXT ; None MOV -10(R2),@6(R5) ; Yes, Line skip count to caller OUTNXT: MOV TSAVE,@(R5)+ ; TYPE OF DATA MOV (R5)+,R4 ; Address of label CALL GETDAT ; Get a datum MOV R3,SVDATA ; Save data address MOV (R5)+,R3 ; Output address MOV R0,(R3)+ ; Data to caller MOV R1,(R3)+ ; Data to caller MOV R2,R3 ; WILL BE FOR COMPARISON MOV (R3)+,(R4) ; Move label BIC #100200,(R4)+ ; Strip off extra bits MOV (R3)+,(R4) ; Move label BIC #100200,(R4)+ ; Strip off extra bits DEC PARAM ; Test # of params BLE 40$ TST (R5)+ ; Points to Limit reg. MOV (R5),LSAVE CLR @(R5)+ ; Clear limit indicator 40$: CALL LIMIT ; MOVE TITLE, TEST LO LIMIT IF ANY BCS 50$ ; No limit BIS #1,@LSAVE ; Indicate limit present 50$: CALL LIMIT ; MOVE TITLE, TEST HI LIMIT IF ANY BCS 60$ ; No limit BIS #2,@LSAVE ; Indicate limit present 60$: BIT #100,TSAVE ; DIFFERENCE REQUESTED? BEQ 70$ ; NO CALL GETDAT ; get difference 70$: MOV R3,SVTB ; SAVE CURRENT TITLE RETURN END: CLR INIT ; SET FIRST TIME INDICATOR CLR @(R5)+ ; TELL CALLER NO MORE PARAMS RETURN ; ; Subroutine to get a variable into %0 ; GETDAT: TST TYPE ; TYPE OF DATA? BEQ 10$ ; SINGLE WD INTEGER BPL 20$ ; Double word integer MOV (R3)+,R0 ; Get hi bits MOV (R3)+,R1 ; Get lo bits RETURN 10$: MOV (R3)+,R1 ; Low order bits SXT R0 ; Extend sign BR 30$ ; 20$: MOV (R3)+,R1 ; Get lo bits MOV (R3)+,R0 ; Get hi bits 30$: CALL $FLOT2 ; Float the integers RETURN ; ; Subroutine to get limit and move title to caller ; LIMIT: TST (R2)+ ; Limit requested? BPL 10$ ; NO LIMIT CALL GETDAT ; Get limit DEC PARAM ; Param output? BLE 15$ ; No limit output MOV R0,@(R5) ; Save hi MOV (R5)+,R0 MOV R1,2(R0) ; Save lo CLC ; Set indicator of limit RETURN 10$: DEC PARAM ; Params? BLE 15$ ; None TST (R5)+ ; Yes, pop it 15$: SEC ; No limits RETURN .END