$title (Plotter driver V1.0 BRESENHAM rutina) $pagewidth (80) $pagelength (70) $registerbank (1) BRESDSEG SEGMENT DATA RSEG BRESDSEG cw1: ds 1 ;gibanje z nacinom 1 cw2: ds 1 ;gibanje z nacinom 2 accscnt: ds 1 ;stevec korakov za pospeske delayl: ds 1 ;tekoca zakasnitev delayh: ds 1 CODESEG SEGMENT CODE RSEG CODESEG PUBLIC BRESENHAM EXTRN DATA (x1) EXTRN DATA (x2) EXTRN DATA (y1) EXTRN DATA (y2) EXTRN DATA (pmask) EXTRN DATA (maxdly) EXTRN DATA (mindly) EXTRN DATA (ddly) EXTRN DATA (accsteps) bresenham: delaynum equ 33000 accsign BIT ACC.7 brake BIT F0 stepsl equ R0 stepsh equ R1 dxl equ R2 dxh equ R3 dyl equ R4 dyh equ R5 errorl equ R6 errorh equ R7 timerl equ TL0 timerh equ TH0 timerrun BIT TR0 timer_ov BIT TF0 clr brake ;najprej pospesujemo zato brisi bremzo mov delayl,maxdly ;delay=maxdelay mov delayh,maxdly+1 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=x2-x1 mov a,x2 subb a,x1 mov dxl,a mov a,x2+1 subb a,x1+1 mov dxh,a jnb accsign,brsubdy ;skoci, ce je dx>=0 clr c ;sicer dx=-dx clr a subb a,dxl mov dxl,a clr a subb a,dxh mov dxh,a orl cw1,#00100000b ;cw1=x01x00xx ;za oktante 3,4,5,6 decx orl cw2,#00100000b ;cw2=x01x00xx brsubdy: clr c ;dy=y2-y1 mov a,y2 subb a,y1 mov dyl,a mov a,y2+1 subb a,y1+1 mov dyh,a jnb accsign,brcmpdxdy ;skoci ce je dy>=0 clr c ;sicer dy=-dy clr a subb a,dyl mov dyl,a clr a subb a,dyh mov dyh,a orl cw1,#00000100b ;cw1=x0?x01xx ;za oktante 5,6,7,8 decy orl cw2,#00000100b ;cw2=x0?x01xx brcmpdxdy: clr c ;c <- dx-dy mov a,dxl subb a,dyl mov a,dxh subb a,dyh jnb accsign,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 ;OV pomeni napako pri racuanju! mov accscnt,accsteps ;predvidi normalno pospesevanje ;racunam steps-2*accsteps mov a,accsteps ;shl accsteps clr c rlc a mov errorl,a ;error je le zacasni pomnilnik clr a rlc a mov errorh,a mov a,stepsl ;Kontrola ali bo dosezena meja clr c ;maksimalne hitrosti subb a,errorl mov a,stepsh subb a,errorh jnb accsign,bracc3 ;pot je dovolj dolga za pospesevanje zato skoci mov a,stepsh ;accscnt=steps div 2 clr c rrc a mov a,stepsl rrc a mov accscnt,a bracc3: clr c ;error=-dx clr a subb a,dxl mov errorl,a clr a subb a,dxh mov errorh,a ;accsign mora biti 1, ce je vse prav 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,stepsl ;step == 0 orl a,stepsh 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 jnb accsign,brmovcw2 ;ce je error<0 se gibaj z 2 nacinom mov P1,cw1 ;gibaj se s cw1 nop orl P1,#01001000b mov a,stepsl ;dec steps clr c ;brisi CY in da bo odstel le en korak jmp brdelay bresenhamend: ret brmovcw2: mov P1,cw2 ;gibaj se s cw2 nop orl P1,#01001000b setb c ;prizgi CY da bo odstel dva koraka mov a,errorl ;error=error-dx clr c subb a,dxl mov errorl,a mov a,errorh subb a,dxh mov errorh,a ;OV pomeni napako brdelay: jnc brdlync ;ce ni CY ni porebno preracunavati delay mov a,accscnt jz brdlync ;ce je accscnt == 0 skoci dec accscnt ;sicer zmanjsaj stevec korakov pospesevanja jb brake,breaking0 ;ce je zavora vklopljena potem jo uporabi mov a,delayl ;delay=delay-ddelay clr c subb a,ddly mov delayl,a mov a,delayh subb a,ddly+1 mov delayh,a setb c jmp brdlync breaking0: mov a,delayl add a,ddly mov delayl,a mov a,delayh addc a,ddly+1 mov delayh,a setb c brdlync: mov a,stepsl ;steps=steps-1-CY subb a,#1 mov stepsl,a mov a,stepsh subb a,#0 mov stepsh,a mov a,accscnt jnz brdlydec ;ce ni stevec pospeskov 0 skoci mov a,stepsl clr c ;accsign <- steps-accsteps subb a,accsteps mov a,stepsh subb a,#0 jnb accsign,brwait ;skoci ce ni potrebno zavirati ne pospesevati mov accscnt,#0FFh ;ostali del poti je zaviranje setb brake jmp breaking brdlydec: dec accscnt ;zmanjsaj stevec korakov pospesevanja jb brake,breaking ;ce je zavora vklopljena potem jo uporabi mov a,delayl ;delay=delay-ddelay clr c subb a,ddly mov delayl,a mov a,delayh subb a,ddly+1 mov delayh,a jmp brwait breaking: mov a,delayl add a,ddly mov delayl,a mov a,delayh addc a,ddly+1 mov delayh,a brwait: clr c ;timer=-delay clr a subb a,delayl mov timerl,a clr a subb a,delayh mov timerh,a clr timer_ov ;brisi zastavico setb timerrun ;pozeni timer za zakasnitev jnb timer_ov,$ ;cakaj da timer presteje do konca clr timerrun ;pa ga spet ustavi jmp brstzero outa: cpl a mov P1,a jmp $ flasherr: mov P1,#0FFh mov a,#0ffh fel: dec a jnz fel mov p1,#0 mov a,#0ffh fel1: dec a jnz fel1 jmp flasherr END