NEW AUTO 3,1 *-------------------------------------- * drawline(short int hWND, short int OP, short int COLOR, int X1, int Y1, int X2, int X2) *-------------------------------------- DRAW.Line jsr CB.PullY2X2Y1X1 >PULLB CB.Cache+S.CB.COLOR >PULLB CB.Cache+S.CB.OP jsr OBJ.PullHWND get dest window at ZPWNDPtr jsr WND.GetInnerInClip jsr CB.ToGlobal lda CB.Cache+S.CB.X2 sec sbc CB.Cache+S.CB.X1 sta DX lda CB.Cache+S.CB.X2+1 sbc CB.Cache+S.CB.X1+1 sta DX+1 DX = X2 - X1 bmi .1 DX < 0.... ora DX bne .2 DX > 0... ldx CB.Cache+S.CB.Y2 cpx CB.Cache+S.CB.Y1 lda CB.Cache+S.CB.Y2+1 sbc CB.Cache+S.CB.Y1+1 bcs .17 >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2 .17 lda #S.CB.CMD.VLINE DX=0 : VLINE Y1,Y2 At X1 bra .20 *-------------------------------------- .1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2 >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2 >NOT16 DX swap X1/X2, Y1/Y2, set DX=-DX (DX positive) .2 lda #1 sta IY lda CB.Cache+S.CB.Y2 sec sbc CB.Cache+S.CB.Y1 sta DY lda CB.Cache+S.CB.Y2+1 sbc CB.Cache+S.CB.Y1+1 sta DY+1 DY = Y2 - Y1 bmi .3 DY < 0 ... ora DY bne .4 lda #S.CB.CMD.HLINE DY=0 : HLINE X1,X2 At Y1 .20 sta CB.Cache+S.CB.CMD jmp CB.Write .8 clc rts *-------------------------------------- .3 >NOT16 DY set DY=-DY lda #$ff sta IY set IY=-1 .4 * jsr CLIP.Line * bcs .8 jsr PTR.Disable lda #S.CB.CMD.SETPIXEL sta CB.Cache+S.CB.CMD ldx #0 Select CB.Cache jsr CB.GFXWriteX lda DX sec sbc DY tax lda DX+1 sbc DY+1 bmi DRAW.Line.IncY DY is greater than DX, we will increase on Y axis txa beq DRAW.Line.IncXY DX=DY, go inc X & Y jmp DRAW.Line.IncX DY is lower than DX, we will increase on X axis *-------------------------------------- DRAW.Line.IncXY lda DX DX=DY eor #$ff sta Counter lda DX+1 eor #$ff sta Counter+1 .1 inc Counter bne .2 inc Counter+1 beq .8 .2 inc CB.Cache+S.CB.X1 bne .3 inc CB.Cache+S.CB.X1+1 .3 lda CB.Cache+S.CB.Y1 Y1=Y1+IY clc adc IY sta CB.Cache+S.CB.Y1 ldx #0 Select CB.Cache jsr CB.GFXWriteX bra .1 .8 jmp PTR.Enable *-------------------------------------- DRAW.Line.IncY lda DY eor #$ff sta Counter lda DY+1 eor #$ff sta Counter+1 lda DX IE=2*DX asl sta IE pha lda DX+1 rol sta IE+1 tax pla D=IE-DY sec sbc DY sta D txa sbc DY+1 sta D+1 lda DX INE=2*(DX-DY) sec sbc DY pha lda DX+1 sbc DY+1 tax pla asl sta INE txa rol sta INE+1 .1 inc Counter bne .2 inc Counter+1 beq .8 .2 lda D+1 IF D < 0 ... bmi .4 lda D D > 0 : D=D+INE clc adc INE sta D lda D+1 adc INE+1 sta D+1 inc CB.Cache+S.CB.X1 X1=X1+1 bne .5 inc CB.Cache+S.CB.X1+1 bra .5 .4 lda D D > 0 : D=D+IE clc adc IE sta D lda D+1 adc IE+1 sta D+1 .5 lda CB.Cache+S.CB.Y1 Y1=Y1+IY clc adc IY sta CB.Cache+S.CB.Y1 ldx #0 Select CB.Cache jsr CB.GFXWriteX bra .1 .8 jmp PTR.Enable *-------------------------------------- DRAW.Line.IncX lda DX eor #$ff sta Counter lda DX+1 eor #$ff sta Counter+1 lda DY IE=2*DY asl sta IE pha * lda DY+1 lda #0 rol sta IE+1 tax pla D=IE-DX sec sbc DX sta D txa sbc DX+1 sta D+1 lda DY INE=2*(DY-DX) sec sbc DX pha * lda DY+1 lda #0 sbc DX+1 tax pla asl sta INE txa rol sta INE+1 .1 inc Counter bne .2 inc Counter+1 beq .8 .2 lda D+1 ID D < 0 .... bmi .4 lda D D > 0 : D=D+INE clc adc INE sta D lda D+1 adc INE+1 sta D+1 lda CB.Cache+S.CB.Y1 Y1=Y1+IY clc adc IY sta CB.Cache+S.CB.Y1 bra .5 .4 lda D D < 0 : D=D+IE clc adc IE sta D lda D+1 adc IE+1 sta D+1 .5 inc CB.Cache+S.CB.X1 X1=X1+1 bne .6 inc CB.Cache+S.CB.X1+1 .6 ldx #0 Select CB.Cache jsr CB.GFXWriteX bra .1 .8 jmp PTR.Enable *-------------------------------------- * fill (short int hWND, short int OP, short int COLOR, int X1, int Y1, int X2, int Y2) *-------------------------------------- DRAW.Fill jsr CB.PullY2X2Y1X1 >PULLB CB.Cache+S.CB.COLOR >PULLB CB.Cache+S.CB.OP jsr OBJ.PullHWND get dest window at ZPWNDPtr jsr WND.GetInnerInClip jsr CB.ToGlobal lda #S.CB.CMD.FILLRECT sta CB.Cache+S.CB.CMD jmp CB.Write *-------------------------------------- * drawBitmap (short int hWND, short int OP, short int M, S.BM *bitmap, int X1, int Y1) *-------------------------------------- DRAW.BitMap jsr CB.PullY1X1 >PULLW CB.Cache+S.CB.SrcPtr >PULLB CB.Cache+S.CB.M >PULLB CB.Cache+S.CB.OP jsr OBJ.PullHWND get dest window at ZPWNDPtr jsr WND.GetInnerInClip jsr CB.ToGlobal lda #S.CB.CMD.BITBLT sta CB.Cache+S.CB.CMD jsr CB.ResetSrcXY jmp CB.Write *-------------------------------------- * drawtext (short int hWND, short int OP, short int hFONT, int X1, int Y1, char *str) *-------------------------------------- DRAW.Text >PULLW CB.Cache+S.CB.TxtPtr jsr CB.PullY1X1 >PULLB CB.Cache+S.CB.hFont >PULLB CB.Cache+S.CB.OP jsr OBJ.PullHWND get dest window at ZPWNDPtr jsr WND.GetInnerInClip jsr CB.ToGlobal lda #S.CB.CMD.DRAWTEXT2 sta CB.Cache+S.CB.CMD jmp CB.Write *-------------------------------------- * private *-------------------------------------- DRAW.BordersAtX stx IY jsr CB.BorderLineH ldy #S.OBJ.X1 lda (ZPObjPtr),y sec sbc IY sta CB.Cache+S.CB.X1 iny lda (ZPObjPtr),y sbc #0 sta CB.Cache+S.CB.X1+1 iny #S.OBJ.Y1 lda (ZPObjPtr),y sec sbc IY sta CB.Cache+S.CB.Y1 iny lda (ZPObjPtr),y sbc #0 sta CB.Cache+S.CB.Y1+1 iny #S.OBJ.X2 lda (ZPObjPtr),y clc adc IY sta CB.Cache+S.CB.X2 iny lda (ZPObjPtr),y adc #0 sta CB.Cache+S.CB.X2+1 top: X1,X2 at Y1 iny #S.OBJ.Y2 lda (ZPObjPtr),y clc adc IY sta CB.Cache+S.CB.Y2 iny lda (ZPObjPtr),y adc #0 sta CB.Cache+S.CB.Y2+1 jsr CB.Cache2CBBufG jsr CB.SwapY1Y2 jsr CB.Cache2CBBuf bottom X1,X2 at Y2 lda #S.CB.CMD.VLINE sta CB.Cache+S.CB.CMD jsr CB.SwapY1Y2 jsr CB.Cache2CBBuf left Y1,Y2 at X1 jsr CB.SwapX1X2 jmp CB.Cache2CBBuf right X2,Y1,X2,Y2 *-------------------------------------- DRAW.xBM >LDYA L.BMs,x DRAW.yaBM jsr BM.YA2CB.cache jmp CB.Cache2CBBuf *-------------------------------------- DRAW.YAText >STYA CB.Cache+S.CB.TxtPtr stx CB.Cache+S.CB.hFont lda #S.CB.CMD.DRAWTEXT2 sta CB.Cache+S.CB.CMD lda #S.CB.OP.XOR sta CB.Cache+S.CB.OP lda #S.CB.M.MONO sta CB.Cache+S.CB.M jsr CB.ResetSrcXY jmp CB.Cache2CBBuf *-------------------------------------- MAN SAVE usr/src/lib/libgui.s.draw LOAD usr/src/lib/libgui.s ASM