ALWAYS 13FEB1 SEARCH .MCALL DIR$ .PSECT ;************************************************************************ ;* * ;* MODULE: SEARCH * ;* * ;* FUNCTION: SEARCH AN AREA OF VIRTUAL MEMORY FOR A VALUE * ;* * ;* INPUT PARAMETERS: * ;* * ;* R0 POINTS TO THE COMMAND LINE IN PROCESS * ;* * ;* OUTPUT PARAMETERS: * ;* * ;* R0 POINTS JUST BEYOND COMMAND LINE * ;* * ;* DESTROYS: R1,R2,R3,R4 * ;* * ;* AUTHOR: KEVIN ANGLEY * ;* * ;* DATE: 13-FEB-81 * ;* * ;************************************************************************ SEARCH:: CALL FROMTH ; GET FROM ADDR IN R1, THRU ADDR IN R2 ; AND COUNT IN R3 BCS 250$ ; CS: NOT SUCCESSFUL, TAKE ERROR EXIT MOV R1,R2 ; SAVE FROM ADDRESS IN R2 - DON'T NEED THRU GETKEY FOR ; COLLECT "FOR" KEYWORD BEQ 10$ ; EQ: YES - GO PROCESS OUTPUT MSK ; OUTPUT "MISSING KEYWORD" BR 250$ ; AND TAKE ERROR EXIT 10$: CALL GETHX2 ; GET TWO HEX DIGITS ; VALUE NOW IN LOW BYTE OF R1 BCS 250$ ; CS: TAKE ERROR EXIT MOVB R1,R4 ; SAVE HIGH BYTE OR ONLY BYTE TSTB (R0) ; CHECK FOR EOLN BEQ 30$ ; EQ: MUST BE A BYTE SEARCH CALL GETHX2 ; GET LOW BYTE INTO R1 BCS 250$ ; CS: HEX CONVERSION ERROR 20$: ; WORD SEARCH CMPB R1,MEMORY(R2) ; MUST MATCH LOW BYTE BNE 25$ ; NE: NO MATCH CMP R2,#MEMHIGH ; CAN'T MATCH IF ALREADY AT TOP BYTE BEQ 25$ ; EQ: YES - DON'T ATTEMPT MATCH CMPB R4,MEMORY+1(R2) ; COMPARE HIGH BYTE BNE 25$ ; NE: NO MATCH CALL SERDIS ; DISPLAY MATCHING ADDRESS 25$: INC R2 ; NEXT VIRTUAL ADDRESS SOB R3,20$ ; KEEP LOOKING IN ANY CASE BR 250$ ; UNTIL DONE, THEN EXIT 30$: CMPB R4,MEMORY(R2) ; BYTE MATCH? BNE 35$ ; NE: NO CALL SERDIS ; DISPLAY ADDRESS 35$: INC R2 ; NEXT VIRTUAL ADDRESS SOB R3,30$ ; KEEP LOOKING IN ANY CASE 250$: ; ERROR EXIT 255$: ; NORMAL EXIT CALL$R EXTRA ; PURGE COMMAND LINE OF SUPERFLUOUS JUNK ; AND RETURN FROM THERE .PAGE .SBTTL SERDIS - DISPLAY MATCHING ADDRESS SERDIS: PUSH R0 ; SAVE R0 PUSH R1 ; SAVE R1 MOV #ADR,R0 ; FILL IN ADDRESS BUFFER MOV R2,R1 ; GET MATCHING ADDRESS INTO R1 ADD OFFST,R1 ; UN-OFFSET CALL PUTHX4 ; PUT INTO BUFFER OUTPUT ADR ; OUTPUT THE ADDRESS POP R1 ; RESTORE R1 POP R0 ; RESTORE R0 RETURN .END