* MEMSET5 - 16 STs MEMSET5 CSECT , * ASSUMES R13=A(SAVEAREA), R14=A(RETURN), R15=A(MEMSET16), R1=A(PARAMS) * PARAMS: S=A(AREA TO SET), C=INT WITH C IN LOW BYTE, N=INT COUNT USING *,15 USE R15 AS BASE REG STM 0,5,12(13) SAVE REGS WE USE LM 2,4,0(1) LOAD PARAMS S, C, N LA 2,0(,2) CLEAR HIGH-ORDER BITS OF ADDRESS LTR 2,2 VALID MEMORY ADDRESS > 0? BNP ALLDONE NO, JUST EXIT LTR 4,4 VALID LENGTH > 0? BNP ALLDONE NO, JUST EXIT SRDL 4,8 DIVIDE N BY 256 LTR 4,4 NON-ZERO MULTIPLE OF 256? BZ REMDR NO, JUST DO REMAINDER STC 3,0(,2) STORE C IN BYTE 0 MVC 1(3,2),0(2) STORE C IN BYTES 1-3 L 0,0(,2) SET R0 = CCCC LOOP256 DS 0H LOOP SETTING 256 BYTES AT A TIME TO C LA 1,16 LOOP COUNT TO SET 16 BYTES 16 TIMES LOOP16 DS 0H LOOP SETTING 16 BYTES AT A TIME TO C ST 0,0(,2) STORE CCCC IN BYTES 0-3 ST 0,4(,2) STORE CCCC IN BYTES 4-7 ST 0,8(,2) STORE CCCC IN BYTES 8-11 ST 0,12(,2) STORE CCCC IN BYTES 12-15 BCT 1,LOOP16 DECR 16-COUNT BY 1 AND BRANCH IF NOT ZERO LA 2,256(,2) INCR S BY 256 BCT 4,LOOP256 DECR 256-COUNT BY 1 AND BRANCH IF NOT ZERO REMDR DS 0H HERE TO DO REMAINDER LESS THAN 256 SRL 5,24 MOVE REMDR TO LOW BYTE OF R5 LTR 5,5 ANY REMAINDER TO DO? BZ ALLDONE NO, GO RETURN DOLAST DS 0H SET REMAINDER TO C BCTR 5,0 DECR REMAINDER FOR EXECUTE STC 3,0(,2) STORE C IN BYTE 0 LAST1S DS 0H LABEL FOR EXECUTE MVC 1(0,2),0(2) LENGTH 1 MOVE TO BYTE 1 EX 5,LAST1S EXECUTE PREVIOUS MVC FOR (REMDR - 1) ALLDONE DS 0H RETURN TO CALLER LM 0,5,0(13) RESTORE REGS WE USED L 15,0(,1) RETURN ORIGINAL S BR 14 GO BACK TO CALLER END MEMSET5 ALL DONE