* Bitmap/Bresenham's line algorithm - 13/05/2019 BRESENH CSECT USING BRESENH,R13 base register B 72(R15) skip savearea DC 17F'0' savearea SAVE (14,12) save previous context ST R13,4(R15) link backward ST R15,8(R13) link forward LR R13,R15 set addressability LA R10,DATAXY @dataxy LA R8,1 p=1 DO WHILE=(C,R8,LE,=A(POINTS)) do p=1 to points L R6,0(R10) x=dataxy((p-1)*2+1) L R7,4(R10) y=dataxy((p-1)*2+2) IF C,R8,EQ,=F'1' THEN if p=1 then ST R6,MINX minx=x ST R6,MAXX maxx=x ST R7,MINY miny=y ST R7,MAXY maxy=y ENDIF , endif IF C,R6,LT,MINX THEN if xmaxx then ST R6,MAXX maxx=x ENDIF , endif IF C,R7,LT,MINY THEN if ymaxy then ST R7,MAXY maxy=y ENDIF , endif LA R10,8(R10) @dataxy+=8 LA R8,1(R8) p++ ENDDO , enddo p L R1,MINX minx S R1,=A(BORDER*2) -border*2 ST R1,MINX minx=minx-border*2 L R1,MAXX maxx A R1,=A(BORDER*2) +border*2 ST R1,MAXX maxx=maxx+border*2 L R1,MINY miny S R1,=A(BORDER) -border ST R1,MINY miny=miny-border L R1,MAXY maxy A R1,=A(BORDER) +border ST R1,MAXY maxy=maxy+border L R1,MINX minx LCR R1,R1 - A R1,=F'1' +1 ST R1,OX ox=-minx+1 L R1,MINY miny LCR R1,R1 - A R1,=F'1' +1 ST R1,OY oy=-miny+1 LA R1,HMAPX hbound(map,1) S R1,OX wx=hbound(map,1)-ox IF C,R1,LT,MAXX THEN if maxx>wx then ST R1,MAXX maxx=wx ENDIF , endif LA R1,HMAPY hbound(map,2) S R1,OY wy=hbound(map,2)-oy IF C,R1,LT,MAXY THEN if maxy>wy then ST R1,MAXY maxy=wy ENDIF , endif L R6,MINX x=minx DO WHILE=(C,R6,LE,MAXX) do x=minx to maxx L R1,OY oy BCTR R1,0 1 MH R1,=AL2(HMAPX) dim(x) AR R1,R6 x A R1,OX ox LA R1,MAP-1(R1) map(0+oy,x+ox) MVC 0(1,R1),=C'-' map(0+oy,x+ox)='-' A R6,=F'1' x++ ENDDO , enddo x L R7,MINY y=miny DO WHILE=(C,R7,LE,MAXY) do y=miny to maxy LR R1,R7 y A R1,OY +oy BCTR R1,0 -1 MH R1,=AL2(HMAPX) *dim(x) A R1,OX +ox LA R1,MAP-1(R1) @map(y+oy,0+ox) MVC 0(1,R1),=C'|' map(y+oy,0+ox)='|' A R7,=F'1' y++ ENDDO , enddo y L R1,OY +oy BCTR R1,0 -1 MH R1,=AL2(HMAPX) *dim(x) A R1,OX +ox LA R1,MAP-1(R1) @map(0+oy,0+ox) MVC 0(1,R1),=C'+' map(0+oy,0+ox)='+' LA R10,POINTS points BCTR R10,0 pn=points-1 LA R9,DATAXY @dataxy LA R8,1 p=1 DO WHILE=(CR,R8,LE,R10) do p=1 to points-1 L R6,0(R9) x=dataxy((p-1)*2+1) L R7,4(R9) y=dataxy((p-1)*2+2) L R4,8(R9) xf=dataxy(p*2+1) L R5,12(R9) yf=dataxy(p*2+2) LR R2,R4 xf SR R2,R6 -x LPR R2,R2 abs() ST R2,DX dx=abs(xf-x) LR R2,R5 xf SR R2,R7 -y LPR R2,R2 abs() ST R2,DY dy=abs(yf-y) IF CR,R6,LT,R4 THEN if x-dy then A R0,ERR -dy+err ST R0,ERR err=err-dy A R6,SX x=x+sx ENDIF , endif L R0,DX dx IF C,R0,GT,ERR2 THEN if err2