A2osX/LIB/LIBGUI.S.CLIP.txt
burniouf 9a7d20a7e1 ProDOS 203 / FX:TC mod for year 2022-2026
FORMAT: new switches & checks
SH:BREAK in FOR and WHILE
ASM / S-C MASM: new directives, CString support and .HX
LC / UC:bugfix
DHGR.DRV:bugfix
LIBGUI:wip
CC:wip
2022-12-07 08:02:29 +01:00

473 lines
8.0 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
*--------------------------------------
CLIP.GetRect >STYA .1+1
ldy #S.OBJ.Y2+1
ldx #7
.1 lda $ffff,y
sta CLIP.Rect,x
dey
dex
bpl .1
rts
*--------------------------------------
* CLIPPING Functions:
* In:
* Target Clipping Region in CLIP.Rect
* YA = Control Block
* Out:
* CC : CLIP.Cache clipped & visible
* CS : CLIP.Cache invisible
*--------------------------------------
CLIP.CB.Cache ldx #S.CB
.1 lda CB.Cache-1,x
sta CLIP.Cache-1,x
dex
bne .1
* lda CB.Cache+S.CB.CMD
and #$7F remove S.CB.CMD.OSD
tax
jmp (J.CLIP-2,x)
*--------------------------------------
CLIP.Point
clc
rts
*--------------------------------------
CLIP.HLine >LDYA CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CLIP.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CLIP.Cache+S.CB.X2
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.VLine >LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X1
bpl CLIP.Y1Y2
* bmi .9
* >LDYA CLIP.Rect+S.RECT.Y1
* >STYAIFGTR CLIP.Cache+S.CB.Y1
* >LDYA CLIP.Rect+S.RECT.Y2
* >STYAIFLWR CLIP.Cache+S.CB.Y2
* clc
* rts
.9 sec
rts
*--------------------------------------
CLIP.Rectangle jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CLIP.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CLIP.Cache+S.CB.X2
CLIP.Y1Y2 >LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CLIP.Cache+S.CB.Y1
>LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CLIP.Cache+S.CB.Y2
* clc
* rts
*--------------------------------------
CLIP.Text clc
rts
CLIP.Text.9 sec
CLIP.Text.RTS rts
*--------------------------------------
* BitBlt :
*--------------------------------------
CLIP.BitBlt jsr CLIP.SetX2Y2
jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS
ldx #S.RECT select CLIP.Rect
CLIP.BitBltX lda CLIP.Screen+S.RECT.X1,x
sec
sbc CLIP.Cache+S.CB.X1
sta TmpW
lda CLIP.Screen+S.RECT.X1+1,x
sbc CLIP.Cache+S.CB.X1+1
sta TmpW+1
bvc .1
eor #$80
.1 bmi .2
lda CLIP.Cache+S.CB.X1
clc
adc TmpW
sta CLIP.Cache+S.CB.X1
lda CLIP.Cache+S.CB.X1+1
adc TmpW+1
sta CLIP.Cache+S.CB.X1+1
lda CLIP.Cache+S.CB.SrcX
clc
adc TmpW
sta CLIP.Cache+S.CB.SrcX
lda CLIP.Cache+S.CB.SrcX+1
adc TmpW+1
sta CLIP.Cache+S.CB.SrcX+1
lda CLIP.Cache+S.CB.SrcW
sec
sbc TmpW
sta CLIP.Cache+S.CB.SrcW
lda CLIP.Cache+S.CB.SrcW+1
sbc TmpW+1
sta CLIP.Cache+S.CB.SrcW+1
bcc CLIP.Text.9
*--------------------------------------
.2 lda CLIP.Cache+S.CB.X2
sec
sbc CLIP.Screen+S.RECT.X2,x
sta TmpW
lda CLIP.Cache+S.CB.X2+1
sbc CLIP.Screen+S.RECT.X2+1,x
sta TmpW+1
bvc .3
eor #$80
.3 bmi .4
lda CLIP.Cache+S.CB.SrcW
sec
sbc TmpW
sta CLIP.Cache+S.CB.SrcW
lda CLIP.Cache+S.CB.SrcW+1
sbc TmpW+1
sta CLIP.Cache+S.CB.SrcW+1
bcc .9
*--------------------------------------
.4 lda CLIP.Screen+S.RECT.Y1,x
sec
sbc CLIP.Cache+S.CB.Y1
sta TmpW
lda CLIP.Screen+S.RECT.Y1+1,x
sbc CLIP.Cache+S.CB.Y1+1
sta TmpW+1
bvc .5
eor #$80
.5 bmi .6
lda CLIP.Cache+S.CB.Y1
clc
adc TmpW
sta CLIP.Cache+S.CB.Y1
lda CLIP.Cache+S.CB.Y1+1
adc TmpW+1
sta CLIP.Cache+S.CB.Y1+1
lda CLIP.Cache+S.CB.SrcY
clc
adc TmpW
sta CLIP.Cache+S.CB.SrcY
lda CLIP.Cache+S.CB.SrcY+1
adc TmpW+1
sta CLIP.Cache+S.CB.SrcY+1
lda CLIP.Cache+S.CB.SrcH
sec
sbc TmpW
sta CLIP.Cache+S.CB.SrcH
lda CLIP.Cache+S.CB.SrcH+1
sbc TmpW+1
sta CLIP.Cache+S.CB.SrcH+1
bcc .9
*--------------------------------------
.6 lda CLIP.Cache+S.CB.Y2
sec
sbc CLIP.Screen+S.RECT.Y2,x
sta TmpW
lda CLIP.Cache+S.CB.Y2+1
sbc CLIP.Screen+S.RECT.Y2+1,x
sta TmpW+1
bvc .7
eor #$80
.7 bmi .8
lda CLIP.Cache+S.CB.SrcH
sec
sbc TmpW
sta CLIP.Cache+S.CB.SrcH
lda CLIP.Cache+S.CB.SrcH+1
sbc TmpW+1
sta CLIP.Cache+S.CB.SrcH+1
bcc .9
.8 clc
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 CLIP.Cache+S.CB.X1
ldx CLIP.Cache+S.CB.X1+1
jsr CLIP.Line.EncodeX.AX
lda CLIP.Cache+S.CB.Y1
ldx CLIP.Cache+S.CB.Y1+1
jsr CLIP.Line.EncodeY.AX
sty CLIP.Line.P1
rts
*--------------------------------------
CLIP.Line.EncodeP2
ldy #0
lda CLIP.Cache+S.CB.X2
ldx CLIP.Cache+S.CB.X2+1
jsr CLIP.Line.EncodeX.AX
lda CLIP.Cache+S.CB.Y2
ldx CLIP.Cache+S.CB.Y2+1
jsr CLIP.Line.EncodeY.AX
sty CLIP.Line.P2
rts
*--------------------------------------
CLIP.Line.EncodeX.AX
pha
>SCMPAX CLIP.Rect+S.RECT.X1
bpl .1
pla
tya
ora #CLIP.Line.LEFT
tay
rts
.1 pla
>SCMPAX CLIP.Rect+S.RECT.X2
bmi .8
tya
ora #CLIP.Line.RIGHT
tay
.8 rts
*--------------------------------------
CLIP.Line.EncodeY.AX
pha
>SCMPAX CLIP.Rect+S.RECT.Y1
bpl .1
pla
tya
ora #CLIP.Line.TOP
tya
rts
.1 pla
>SCMPAX CLIP.Rect+S.RECT.Y2
bmi .8
tya
ora #CLIP.Line.BOTTOM
tay
.8 rts
*--------------------------------------
CLIP.SetX2Y2 ldx CLIP.Cache+S.CB.SrcW+1
lda CLIP.Cache+S.CB.SrcW
bne .3
dex
.3 dec
clc
adc CLIP.Cache+S.CB.X1
sta CLIP.Cache+S.CB.X2
txa
adc CLIP.Cache+S.CB.X1+1
sta CLIP.Cache+S.CB.X2+1
ldx CLIP.Cache+S.CB.SrcH+1
lda CLIP.Cache+S.CB.SrcH
bne .4
dex
.4 dec
clc
adc CLIP.Cache+S.CB.Y1
sta CLIP.Cache+S.CB.Y2
txa
adc CLIP.Cache+S.CB.Y1+1
sta CLIP.Cache+S.CB.Y2+1
rts
*--------------------------------------
CLIP.Rect.Overlap
>LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CLIP.Cache+S.CB.X2
>SCMPYA CLIP.Rect+S.RECT.X1
bmi .9
>LDYA CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CLIP.Cache+S.CB.Y2
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.clip
LOAD usr/src/lib/libgui.s
ASM