$title (Plotter driver V1.0 bresenham rutine) clkx BIT P1.6 clky BIT P1.3 delh equ 30 errsign BIT F0 CODESEG SEGMENT CODE RSEG CODESEG PUBLIC bres_1 PUBLIC BRESENHAM EXTRN DATA (error) EXTRN DATA (derror1) EXTRN DATA (derror2) EXTRN DATA (steps) EXTRN DATA (dx) EXTRN DATA (dy) EXTRN DATA (pmask) EXTRN DATA (cw1) EXTRN DATA (cw2) decstep: clr c mov a,steps subb a,#1 mov steps,a mov a,steps+1 subb a,#0 mov steps+1,a ret adderror: mov a,error add a,r4 mov error,a mov a,error+1 addc a,r5 mov error+1,a jnc adde1 clr errsign adde1: ret substrerror: mov a,error clr c subb a,r4 mov error,a mov a,error+1 subb a,r5 mov error+1,a jnc subst1 setb errsign subst1: ret bres_1: ;bresenham hitra rutina za prvi oktant mov error,derror1 ;error <- derror1 mov error+1,derror1+1 mov r4,dx ;error <- error-dx mov r5,dx+1 call substrerror br_1r: mov a,steps ;if step==0 orl a,steps+1 jz br_1end ;koncaj call decstep ;steps <- steps-1 jnb errsign,br_1neg ;if errror <= 0 skoci na br_1neg clr clkx ;step_xi nop setb clkx mov r4,derror1 ;error <- error+derror1 mov r5,derror1+1 call adderror jmp br_1d br_1neg: clr clkx ;step_ix_iy clr clky setb clkx setb clky mov r4,derror2 ;error <- error-derror2 mov r5,derror2+1 call substrerror call decstep ;steps <- steps-1 br_1d: mov r5,#delh br_1d1: mov r4,#50 djnz r4,$ djnz r5,br_1d1 jmp br_1r br_1end: ret bresenham: stepsl equ R0 stepsh equ R1 dxl equ R2 dxh equ R3 dyl equ R4 dyh equ R5 errorl equ R6 errorh equ R7 mov a,pmask ;Beri masko za P1 krmilni port anl a,#10010011b ;Nastavi incx in incy mov cw1,a ;in jih shrani v cw1 mov cw2,a ;ter cw2. clr c ;dx=x1-x2 mov a,x1 subb a,x2 mov dxl,a mov a,x1+1 subb a,x2+1 mov dxh,a jnc brsubdy ;skoci, ce je x1>x2 clr c ;sicer dx=x2-x1 mov a,x2 subb a,x1 mov dxl,a mov a,x2+1 subb a,x1+1 mov dxh,a orl cw1,#00100000b ;cw1=x01x00xx ;za oktante 3,4,5,6 decx orl cw2,#00100000b ;cw2=x01x00xx brsubdy: clr c ;dy=x1-x2 mov a,y1 subb a,y2 mov dyl,a mov a,y1+1 subb a,y2+1 mov dyh,a jnc brcmpdxdy ;skoci ce je y1>y2 clr c ;sicer dy=y2-y1 mov a,y2 subb a,y1 mov dyl,a mov a,y2+1 subb a,y1+1 mov dyh,a orl cw1,#00000100b ;cw1=x0?x01xx ;za oktante 5,6,7,8 decy orl cw2,#00000100b ;cw2=x0?x01xx brcmpdxdy: clrc ;c <- dx-dy mov a,dxl subb a,dyl mov a,dxh subb a,dyh jnc brdxgedy ;skoci ce je dx>=dy mov a,dxl ;sicer swap dx,dy xch a,dyl mov dxl,a mov a,dxh xch a,dyh mov dxh,a orl cw1,#01000000b ;eliminiraj x gibanje za 2, 3, 6, 7 jmp brcalc brdxgedy: orl cw1,#00001000b ;cw1=x0?x1?xx eliminiraj y gibanje za ; oktante 1, 4, 5, 8 brcalc: mov a,dxl ;steps=dx+dy add a,dyl mov stepsl,a mov a,dxh addc a,dyh mov stepsh,a ;CY pomeni napako pri racuanju! setb errorsign ;Prizgi predznak za error ker bo ;error negativen. clr c ;error=-dx clr a subb a,dxl mov errorl,a clr a subb a,dxh mov errorh,a mov a,dxl ;shl dx clr c rlc a mov dxl,a mov a,dxh rlc a mov dxh,a ;CY pomeni napako pri mnozenju z 2 mov a,dyl ;shl dy clr c rlc a mov dyl,a mov a,dyh rlc a mov dyh,a ;CY pomeni napako pri mnozenju z 2 brstzero: mov a,stepl ;step == 0 orl a,steph jz bresenhamend ;ce je koncaj mov a,errorl ;error=error+dy add a,dyl mov errorl,a mov a,errorh addc a,dyh mov errorh,a jnc brmovcw2 ;ce je error<0 se gibaj z 2 nacinom clr errorsign ;brisi predznak, ker je error>=0 mov P1,cw1 ;gibaj se s cw1 nop orl P1,#01001000b mov a,stepsl ;dec steps clr c subb a,#1 mov stepsl,a mov a,stepsh subb a,#0 jmp brdelay brmovcw2: mov P1,cw2 ;gibaj se s cw2 nop orl P1,#01001000b mov a,stepsl ;steps=steps-2 clr c subb a,#2 mov stepsl,a mov a,stepsh subb a,#0 mov a,errorl ;error=error-dx clr c subb a,dxl mov errorl,a mov a,errorh subb a,dxh mov errorh,a jnc brdelay ;ce ni CY ni negeativen error setb errorsign ;sicer prizgi znak za minus brdelay: brdxpos: END