ALWAYS 30APR2 SUM ;30APR2 .MCALL DIR$ ;**-1 .PSECT ;************************************************************************ ;* * ;* MODULE: SUM * ;* * ;* FUNCTION: COMPUTE A 16-BIT BYTE-WISE SUM OVER A RANGE * ;* * ;* INPUT PARAMETERS: * ;* * ;* R0 POINTS TO THE COMMAND LINE IN PROCESS * ;* * ;* OUTPUT PARAMETERS: * ;* * ;* R0 POINTS JUST BEYOND COMMAND LINE * ;* * ;* DESTROYS: R1,R2,R3 * ;* * ;* AUTHOR: KEVIN ANGLEY * ;* * ;* DATE: 29-AUG-80 * ;* * ;************************************************************************ ; ;28SEP1 ; 28SEP1 KEVIN ANGLEY ALLOW SUM OUTPUT TO LOCATION (LOW-HIGH) ;28SEP1 ; OR TO PSEUDO-REGISTER A LA CRC. ;28SEP1 ; ;28SEP1 ; 30APR2 KEVIN ANGLEY CORRECTED INCORRECT USAGE OF FLAGS AFTER THE ;30APR2 ; GETKEY MACRO. SHOULD USE Z-FLAG TO DETERMINE ;30APR2 ; MATCH (Z SET) OR NO MATCH (Z CLEAR). ;30APR2 ; ;30APR2 ;30APR2 ;30APR2 SUM:: CALL FROMTH ; GET FROM ADDR IN R1, THRU ADDR IN R2 ; AND COUNT IN R3 BCS 250$ ; CS: NOT SUCCESSFUL, TAKE ERROR EXIT PUSH R0 ; SAVE COMMAND LINE POINTER CLR R0 ; CLEAR INITIAL SUM MOV R1,R2 ; SAVE FROM ADDRESS IN R2 - DON'T NEED THRU 30$: MOVB MEMORY(R2),R1 ; GET BYTE TO ADD BIC #177400,R1 ; CLEAR HIGH BYTE ADD R1,R0 ; ADD TO ACCUMULATED SUM INC R2 ; MOVE TO NEXT VIRTUAL MEMORY LOCATION SOB R3,30$ ; USE COUNT TO COUNT LOCATIONS TO SUM MOV R0,R1 ; PREPARE FOR CONVERSION MOV R0,R2 ; SAVE IN R2 FOR POSSIBLE OUTPUT TO LOCATION ;28SEP1 MOV #SMO+SMOLEN-4,R0 ; PUT INTO MESSAGE CALL PUTHX4 ; CONVERT TO HEX - PUT IN MESSAGE OUTPUT SMO POP R0 ; RESTORE COMMAND LINE POINTER TSTB (R0) ; "TO" SPECIFIED? ;28SEP1 BEQ 255$ ; EQ: NO - TAKE NO ACTION ;28SEP1 GETKEY TO ; GET KEYWORD "TO" ;28SEP1 BEQ 40$ ; EQ: GOT IT ;30APR2 OUTPUT MSK ; MISSING KEYWORD ;**-1 BR 255$ ; TAKE ERROR EXIT ;28SEP1 40$: ;28SEP1 CMPB #'%,(R0) ; PSEUDO-REGISTER DESTINATION FOR SUM? ;28SEP1 BNE 45$ ; NE: NO - GET 4-DIGIT HEX ADDRESS ;28SEP1 INC R0 ; POINT TO REGISTER NUMBER ;28SEP1 CLR R1 ; CLEAR HIGH BYTE OF REGISTER NUMBER ;28SEP1 CALL GETHX2 ; GET TWO DIGIT HEX NUMBER ;28SEP1 BCS 255$ ; CS: FAILURE ;28SEP1 MOVB R2,REGISTER(R1) ; PUT IN LOW BYTE ;28SEP1 INCB R1 ; INCREMENT REGISTER NUMBER WITH WRAP ;28SEP1 SWAB R2 ; PREPARE TO PUT OUT HIGH BYTE ;28SEP1 MOVB R2,REGISTER(R1) ; PUT IN HIGH BYTE ;28SEP1 BR 255$ ; ALL DONE ;28SEP1 45$: ;28SEP1 CALL GETHX4 ; GET TARGET ADDRESS ;28SEP1 BCS 255$ ; CS: FAILED ;28SEP1 CALL VALID ; VALIDATE AND OFFSET ;28SEP1 BCS 255$ ; CS: INVALID ;28SEP1 MOVB R2,MEMORY(R1) ; PUT LOW BYTE IN ;28SEP1 INC R1 ;28SEP1 SWAB R2 ;28SEP1 ADD OFFST,R1 ; UN-OFFSET ;28SEP1 CALL VALID ; VALIDATE AND OFFSET LOC FOR HIGH BYTE ;28SEP1 BCS 255$ ; CS: INVALID ;28SEP1 MOVB R2,MEMORY(R1) ; PUT IN HIGH BYTE ;28SEP1 250$: ; ERROR EXIT 255$: ; NORMAL EXIT CALL$R EXTRA ; PURGE COMMAND LINE OF SUPERFLUOUS JUNK ; AND RETURN FROM THERE .END