A2osX/LIB/LIBGUI.S.CLIP.txt
2020-09-05 15:38:04 +02:00

386 lines
6.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
* CLIPPING Functions:
* In:
* Graphic Context in OBJ.Cache
* YA = Control Block
* Out:
* CC : CB.Cache clipped & visible
* CS : CB.Cache invisible
*--------------------------------------
CLIP.YA jsr CB.Get Put CB in cache
CLIP.CB.Cache ldx CB.Cache+S.CB.CMD
bpl CLIP.X
txa
and #$7F
tax
CLIP.X jmp (J.CLIP-2,x)
*--------------------------------------
CLIP.Point
clc
rts
*--------------------------------------
CLIP.HLine
clc
rts
*--------------------------------------
CLIP.VLine
clc
rts
sec
rts
*--------------------------------------
* OBJ.Cache = Target Context
* CB.Cache = Src Control Block
*--------------------------------------
CLIP.Rect jsr CB.Cache.Overlap
bcs .9
>LDYA OBJ.Cache+S.OBJ.X1
>STYAIFGTR CB.Cache+S.CB.X1
>LDYA OBJ.Cache+S.OBJ.X2
>STYAIFLWR CB.Cache+S.CB.X2
>LDYA OBJ.Cache+S.OBJ.Y1
>STYAIFGTR CB.Cache+S.CB.Y1
>LDYA OBJ.Cache+S.OBJ.Y2
>STYAIFLWR CB.Cache+S.CB.Y2
clc
.9 rts
*--------------------------------------
CLIP.Text
clc
rts
CLIP.Text.9 sec
CLIP.Text.RTS rts
*--------------------------------------
* BitBlt :
*--------------------------------------
CLIP.BitBlt jsr CB.Cache.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
jsr CB.Cache.Overlap
bcs CLIP.Text.RTS
lda OBJ.Cache+S.OBJ.X1
sec
sbc CB.Cache+S.CB.X1
sta DX
lda OBJ.Cache+S.OBJ.X1+1
sbc CB.Cache+S.CB.X1+1
sta DX+1
bvc .1
eor #$80
.1 bmi .2
lda CB.Cache+S.CB.X1
clc
adc DX
sta CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1+1
adc DX+1
sta CB.Cache+S.CB.X1+1
lda CB.Cache+S.CB.SrcX
clc
adc DX
sta CB.Cache+S.CB.SrcX
lda CB.Cache+S.CB.SrcX+1
adc DX+1
sta CB.Cache+S.CB.SrcX+1
lda CB.Cache+S.CB.SrcW
sec
sbc DX
sta CB.Cache+S.CB.SrcW
lda CB.Cache+S.CB.SrcW+1
sbc DX+1
sta CB.Cache+S.CB.SrcW+1
bcc CLIP.Text.9
.2 lda CB.Cache+S.CB.X2
sec
sbc OBJ.Cache+S.OBJ.X2
sta DX
lda CB.Cache+S.CB.X2+1
sbc OBJ.Cache+S.OBJ.X2+1
sta DX+1
bvc .3
eor #$80
.3 bmi .4
lda CB.Cache+S.CB.SrcW
sec
sbc DX
sta CB.Cache+S.CB.SrcW
lda CB.Cache+S.CB.SrcW+1
sbc DX+1
sta CB.Cache+S.CB.SrcW+1
bcc .9
.4 lda OBJ.Cache+S.OBJ.Y1
sec
sbc CB.Cache+S.CB.Y1
sta DX
lda OBJ.Cache+S.OBJ.Y1+1
sbc CB.Cache+S.CB.Y1+1
sta DX+1
bvc .5
eor #$80
.5 bmi .6
lda CB.Cache+S.CB.Y1
clc
adc DX
sta CB.Cache+S.CB.Y1
lda CB.Cache+S.CB.Y1+1
adc DX+1
sta CB.Cache+S.CB.Y1+1
lda CB.Cache+S.CB.SrcY
clc
adc DX
sta CB.Cache+S.CB.SrcY
lda CB.Cache+S.CB.SrcY+1
adc DX+1
sta CB.Cache+S.CB.SrcY+1
lda CB.Cache+S.CB.SrcH
sec
sbc DX
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc DX+1
sta CB.Cache+S.CB.SrcH+1
bcc .9
.6 lda CB.Cache+S.CB.Y2
sec
sbc OBJ.Cache+S.OBJ.Y2
sta DX
lda CB.Cache+S.CB.Y2+1
sbc OBJ.Cache+S.OBJ.Y2+1
sta DX+1
bvc .7
eor #$80
.7 bmi .8
lda CB.Cache+S.CB.SrcH
sec
sbc DX
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc DX+1
sta CB.Cache+S.CB.SrcH+1
bcc .9
.8 clc
.99 rts
.9 sec
rts
*--------------------------------------
CLIP.Line.LEFT .EQ 1
CLIP.Line.RIGHT .EQ 2
CLIP.Line.BOTTOM .EQ 4
CLIP.Line.TOP .EQ 8
*--------------------------------------
CLIP.Line jsr CLIP.Line.EncodeP1
jsr CLIP.Line.EncodeP2
.1 lda CLIP.Line.P1
ora CLIP.Line.P2
beq .88
lda CLIP.Line.P1
and CLIP.Line.P2
bne .99
lda CLIP.Line.P1
beq .5
bit #CLIP.Line.TOP
beq .2
* Y1 is above S.CB.Y1....
* DY=Y2-Y1;
jsr CLIP.Line.EncodeP1
bra .1
.2 bit #CLIP.Line.BOTTOM
beq .3
* Y1 is below S.CB.Y2....
jsr CLIP.Line.EncodeP1
bra .1
.3 bit #CLIP.Line.RIGHT
beq .4
* X1 is after S.CB.X2....
jsr CLIP.Line.EncodeP1
bra .1
* X1 is before S.CB.X1....
.4
jsr CLIP.Line.EncodeP1
bra .1
* P2
.5 lda CLIP.Line.P2
bit #CLIP.Line.TOP
beq .6
* Y2 is above S.CB.Y1....
jsr CLIP.Line.EncodeP2
bra .1
.6 bit #CLIP.Line.BOTTOM
beq .7
* Y2 is below S.CB.Y2....
jsr CLIP.Line.EncodeP2
bra .1
.7 bit #CLIP.Line.RIGHT
beq .8
* X2 is after S.CB.X2....
jsr CLIP.Line.EncodeP2
bra .1
* X2 is before S.CB.X1....
.8
jsr CLIP.Line.EncodeP2
bra .1
.88 clc
rts
.99 sec
rts
*--------------------------------------
CLIP.Line.EncodeP1
ldy #0
lda CB.Cache+S.CB.X1
ldx CB.Cache+S.CB.X1+1
jsr CLIP.Line.EncodeX.AX
tay
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y1+1
jsr CLIP.Line.EncodeY.AX
sta CLIP.Line.P1
rts
*--------------------------------------
CLIP.Line.EncodeP2
ldy #0
lda CB.Cache+S.CB.X2
ldx CB.Cache+S.CB.X2+1
jsr CLIP.Line.EncodeX.AX
tay
lda CB.Cache+S.CB.Y2
ldx CB.Cache+S.CB.Y2+1
jsr CLIP.Line.EncodeY.AX
sta CLIP.Line.P2
rts
*--------------------------------------
CLIP.Line.EncodeX.AX
pha
>SCMPAX OBJ.Cache+S.OBJ.X1
bmi .1
tya
ora #CLIP.Line.LEFT
plx
rts
.1 pla
>SCMPAX OBJ.Cache+S.OBJ.X1
bpl .8
tya
ora #CLIP.Line.RIGHT
.8 rts
*--------------------------------------
CLIP.Line.EncodeY.AX
pha
>SCMPAX OBJ.Cache+S.OBJ.Y1
bmi .1
tya
ora #CLIP.Line.TOP
plx
rts
.1 pla
>SCMPAX OBJ.Cache+S.OBJ.Y1
bpl .8
tya
ora #CLIP.Line.BOTTOM
.8 rts
*--------------------------------------
CB.Cache.SetX2Y2
lda CB.Cache+S.CB.SrcW
clc
adc CB.Cache+S.CB.X1
pha
lda CB.Cache+S.CB.SrcW+1
adc CB.Cache+S.CB.X1+1
tax
pla
bne .2
dex
.2 dec
sta CB.Cache+S.CB.X2
stx CB.Cache+S.CB.X2+1
lda CB.Cache+S.CB.SrcH
clc
adc CB.Cache+S.CB.Y1
pha
lda CB.Cache+S.CB.SrcH+1
adc CB.Cache+S.CB.Y1+1
tax
pla
bne .3
dex
.3 dec
sta CB.Cache+S.CB.Y2
stx CB.Cache+S.CB.Y2+1
rts
*--------------------------------------
CB.Cache.Overlap
>LDYA CB.Cache+S.CB.X1
>SCMPYA OBJ.Cache+S.OBJ.X2
bpl .9
>LDYA CB.Cache+S.CB.X2
>SCMPYA OBJ.Cache+S.OBJ.X1
bmi .9
>LDYA CB.Cache+S.CB.Y1
>SCMPYA OBJ.Cache+S.OBJ.Y2
bpl .9
>LDYA CB.Cache+S.CB.Y2
>SCMPYA OBJ.Cache+S.OBJ.Y1
bmi .9
clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.clip
LOAD usr/src/lib/libgui.s
ASM