Kernel 0.94

This commit is contained in:
Rémy GIBERT 2020-09-04 17:21:15 +02:00
parent 2b0f02c7a3
commit 987ae82bcd
12 changed files with 461 additions and 336 deletions

Binary file not shown.

View File

@ -180,12 +180,12 @@ CS.RUN.LOGO.SHOW
bit xDir bit xDir
bmi .4 bmi .4
lda CB.LOGO+S.CB.DstX lda CB.LOGO+S.CB.X1
clc clc
adc #4 adc #4
tay tay
lda CB.LOGO+S.CB.DstX+1 lda CB.LOGO+S.CB.X1+1
adc #0 adc #0
pha pha
cpy #244 cpy #244
@ -198,19 +198,19 @@ CS.RUN.LOGO.SHOW
sta xDir sta xDir
bra .6 bra .6
.4 lda CB.LOGO+S.CB.DstX .4 lda CB.LOGO+S.CB.X1
sec sec
sbc #4 sbc #4
tay tay
lda CB.LOGO+S.CB.DstX+1 lda CB.LOGO+S.CB.X1+1
sbc #0 sbc #0
bcc .3 bcc .3
.5 sty CB.LOGO+S.CB.DstX .5 sty CB.LOGO+S.CB.X1
sta CB.LOGO+S.CB.DstX+1 sta CB.LOGO+S.CB.X1+1
.6 lda CB.LOGO+S.CB.DstY .6 lda CB.LOGO+S.CB.Y1
bit yDir bit yDir
bmi .8 bmi .8
@ -223,14 +223,14 @@ CS.RUN.LOGO.SHOW
sta yDir sta yDir
bra .1 bra .1
.7 sta CB.LOGO+S.CB.DstY .7 sta CB.LOGO+S.CB.Y1
bra .1 bra .1
.8 sec .8 sec
sbc #1 sbc #1
bcc .60 bcc .60
sta CB.LOGO+S.CB.DstY sta CB.LOGO+S.CB.Y1
jmp .1 jmp .1
.80 >SYSCALL GetChar .80 >SYSCALL GetChar
@ -375,12 +375,14 @@ CB.Apple .DA #S.CB.CMD.BITBLT
.DA #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.COLOR .DA #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.COLOR
.DA #S.CB.M.C16 .DA #S.CB.M.C16
.DA #0 .DA #0
.DA 0 X1 .DA 20 X1
.DA 0 Y1 .DA 172 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 16 SrcW .DA 16 SrcW
.DA 7 SrcH .DA 7 SrcH
.DA 20 DstX
.DA 172 DstY
.BS 2 SrcPtr .BS 2 SrcPtr
.DA 0 DstPtr .DA 0 DstPtr
@ -388,12 +390,14 @@ CB.PIX .DA #S.CB.CMD.BITBLT
.DA #S.CB.OP.SET+S.CB.OP.COLOR .DA #S.CB.OP.SET+S.CB.OP.COLOR
.DA #S.CB.M.MONO .DA #S.CB.M.MONO
.DA #0 .DA #0
.DA 10 X1 .DA 56 X1
.DA 20 Y1 .DA 30 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 120 SrcW .DA 120 SrcW
.DA 100 SrcH .DA 100 SrcH
.DA 56 DstX
.DA 30 DstY
.BS 2 SrcPtr .BS 2 SrcPtr
.DA 0 DstPtr .DA 0 DstPtr
@ -401,12 +405,14 @@ CB.PALETTE .DA #S.CB.CMD.BITBLT
.DA #S.CB.OP.SET+S.CB.OP.COLOR .DA #S.CB.OP.SET+S.CB.OP.COLOR
.DA #S.CB.M.C16 .DA #S.CB.M.C16
.DA #0 .DA #0
.DA 0 X1 .DA 200 X1
.DA 0 Y1 .DA 100 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 320 SrcW .DA 320 SrcW
.DA 40 SrcH .DA 40 SrcH
.DA 200 DstX
.DA 100 DstY
.BS 2 SrcPtr .BS 2 SrcPtr
.DA 0 DstPtr .DA 0 DstPtr
@ -414,27 +420,33 @@ CB.TEXTB .DA #S.CB.CMD.DRAWTEXT+S.CB.CMD.OSD
.DA #S.CB.OP.SET+S.CB.OP.INVERSE .DA #S.CB.OP.SET+S.CB.OP.INVERSE
.DA #S.CB.M.MONO .DA #S.CB.M.MONO
.BS 1 hFONT .BS 1 hFONT
.DA 0 X1 .DA 7 X1
.DA 0 Y1 .DA 1 Y1
.DA 0 X2 .DA 0
.DA 0 Y2 .DA 0
.DA 7 DstX .DA 0 SrcX
.DA 1 DstY .DA 0 SrcY
.DA 0
.DA 0
.DA 0
.BS 2 DstPtr
.BS 2 TXTPTR .BS 2 TXTPTR
.DA 0 DstPtr
CB.TEXT .DA #S.CB.CMD.DRAWTEXT+S.CB.CMD.OSD CB.TEXT .DA #S.CB.CMD.DRAWTEXT+S.CB.CMD.OSD
.DA #S.CB.OP.SET .DA #S.CB.OP.SET
.DA #S.CB.M.MONO .DA #S.CB.M.MONO
.BS 1 hFONT .BS 1 hFONT
.DA 0 X1 .DA 50 X1
.DA 0 Y1 .DA 184 Y1
.DA 0 X2 .DA 0
.DA 0 Y2 .DA 0
.DA 50 DstX .DA 0 SrcX
.DA 184 DstY .DA 0 SrcY
.DA 0
.DA 0
.DA 0
.BS 2 DstPtr
.BS 2 TXTPTR .BS 2 TXTPTR
.DA 0 DstPtr
*-------------------------------------- *--------------------------------------
BM.Apple .DA #S.BM.F.BBP4 BM.Apple .DA #S.BM.F.BBP4
.DA #2 RowBytes .DA #2 RowBytes
@ -460,20 +472,21 @@ CB.LOGO .DA #S.CB.CMD.BITBLT
.DA #S.CB.OP.SET+S.CB.OP.COLOR+S.CB.OP.SAVE .DA #S.CB.OP.SET+S.CB.OP.COLOR+S.CB.OP.SAVE
.DA #S.CB.M.C16 .DA #S.CB.M.C16
.DA #0 .DA #0
.DA 0 X1 .DA 200 X1
.DA 0 Y1 .DA 50 Y1
.DA 200+320 X2 For GETRECTBUFSIZE
.DA 50+40 XZ For GETRECTBUFSIZE
.DA 0 SrcX
.DA 0 SrcY
.DA 320 SrcW .DA 320 SrcW
.DA 40 SrcH .DA 40 SrcH
.DA 200 DstX
.DA 50 DstY
.BS 2 SrcPtr .BS 2 SrcPtr
.DA 0 DstPtr .DA 0 DstPtr
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY
.OR 0 .OR 0
DS.START DS.START
DS.END DS.END .ED
.ED
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE usr/src/bin/gtest.s SAVE usr/src/bin/gtest.s

View File

@ -2,14 +2,12 @@ NEW
AUTO 3,1 AUTO 3,1
*-------------------------------------- *--------------------------------------
* BitBlt * BitBlt
* S.CB.X1 : SrcX1 in bitmap/mask * S.CB.X1 : Destination X (screen)
* S.CB.Y1 : SrcY1 * S.CB.Y1 : Destination Y (screen)
* S.CB.SrcW : width * S.CB.DstX : X1 in bitmap/mask
* S.CB.SrcH : height * S.CB.DstY : Y1 in bitmap/mask
* S.CB.SrcW : width in bitmap/mask
* S.CB.DstX : Destination X (screen) * S.CB.SrcH : height in bitmap/mask
* S.CB.DstY : Destination Y (screen)
* S.CB.SrcPtr : pointer to S.BM * S.CB.SrcPtr : pointer to S.BM
* S.CB.SrcPtr+1 = 0, hMem in S.CB.SrcPtr * S.CB.SrcPtr+1 = 0, hMem in S.CB.SrcPtr
* S.CB.DstPtr : pointer to Save Buffer * S.CB.DstPtr : pointer to Save Buffer
@ -74,7 +72,7 @@ BITBLT.1 ldy #S.BM-1
bcc .2 bcc .2
inc ZPBMDataPtr+1 inc ZPBMDataPtr+1
.2 >LDYA CB.Cache+S.CB.Y1 .2 >LDYA CB.Cache+S.CB.SrcY
ldx BM.Cache+S.BM.RowBytes ldx BM.Cache+S.BM.RowBytes
jsr YAMultX jsr YAMultX
pha pha
@ -92,16 +90,16 @@ BITBLT.1 ldy #S.BM-1
pla pla
adc ZPBMMaskPtr+1 adc ZPBMMaskPtr+1
sta BLT.BMMaskPtr+1 sta BLT.BMMaskPtr+1
lda CB.Cache+S.CB.X1 lda CB.Cache+S.CB.SrcX
pha pha
and #7 and #7
sta BLT.BMBitOfs sta BLT.BMBitOfs
pla pla
lsr CB.Cache+S.CB.X1+1 lsr CB.Cache+S.CB.SrcX+1
ror ror
lsr CB.Cache+S.CB.X1+1 lsr CB.Cache+S.CB.SrcX+1
ror ror
lsr CB.Cache+S.CB.X1+1 lsr CB.Cache+S.CB.SrcX+1
ror ror
pha pha
clc clc
@ -119,14 +117,14 @@ BITBLT.1 ldy #S.BM-1
inc BLT.BMMaskPtr+1 inc BLT.BMMaskPtr+1
.4 >LDYA CB.Cache+S.CB.DstX .4 >LDYA CB.Cache+S.CB.X1
jsr LBUF.SetBounds1YA jsr LBUF.SetBounds1YA
stx BLT.ScrBitOfs stx BLT.ScrBitOfs
lda CB.Cache+S.CB.DstX lda CB.Cache+S.CB.X1
clc clc
adc CB.Cache+S.CB.SrcW adc CB.Cache+S.CB.SrcW
tay tay
lda CB.Cache+S.CB.DstX+1 lda CB.Cache+S.CB.X1+1
adc CB.Cache+S.CB.SrcW+1 adc CB.Cache+S.CB.SrcW+1
pha pha
tya tya
@ -188,9 +186,9 @@ BITBLT.LOOP0 lda CB.Cache+S.CB.OP
cpx LBUF.C2 cpx LBUF.C2
bne .3 bne .3
ldy CB.Cache+S.CB.DstY ldy CB.Cache+S.CB.Y1
jsr LBUF.DrawAtY jsr LBUF.DrawAtY
inc CB.Cache+S.CB.DstY inc CB.Cache+S.CB.Y1
dec CB.Cache+S.CB.SrcH dec CB.Cache+S.CB.SrcH
beq .8 beq .8
@ -278,9 +276,9 @@ BITBLT.LOOPx.7 and #$ff SELF MODIFIED : #%01110000 get only col2 bites
cpx LBUF.C2 cpx LBUF.C2
bne BITBLT.LOOPx.5 bne BITBLT.LOOPx.5
ldy CB.Cache+S.CB.DstY ldy CB.Cache+S.CB.Y1
jsr LBUF.DrawAtY jsr LBUF.DrawAtY
inc CB.Cache+S.CB.DstY inc CB.Cache+S.CB.Y1
dec CB.Cache+S.CB.SrcH dec CB.Cache+S.CB.SrcH
beq .8 beq .8

View File

@ -596,7 +596,7 @@ CBX.CmdLen .DA #S.CB.Y1+1 SETPIXEL
.DA #S.CB.DstPtr+1 BITBLT .DA #S.CB.DstPtr+1 BITBLT
.DA #S.CB.DstPtr+1 GETRECTBUFSIZE .DA #S.CB.DstPtr+1 GETRECTBUFSIZE
.DA #S.CB.TxtPtr+1 DRAWTEXT .DA #S.CB.TxtPtr+1 DRAWTEXT
.DA #S.CB.SrcH+1 GETTEXTSIZE .DA #S.CB.TxtPtr+1 GETTEXTSIZE
*-------------------------------------- *--------------------------------------
CBX.Cache .BS S.CB CBX.Cache .BS S.CB
FON.Cache .BS S.FON FON.Cache .BS S.FON

View File

@ -608,7 +608,7 @@ CB.CmdLen .DA #S.CB.Y1+1 SETPIXEL
.DA #S.CB.DstPtr+1 BITBLT .DA #S.CB.DstPtr+1 BITBLT
.DA #S.CB.DstPtr+1 GETRECTBUFSIZE .DA #S.CB.DstPtr+1 GETRECTBUFSIZE
.DA #S.CB.TxtPtr+1 DRAWTEXT .DA #S.CB.TxtPtr+1 DRAWTEXT
.DA #S.CB.SrcH+1 GETTEXTSIZE .DA #S.CB.TxtPtr+1 GETTEXTSIZE
*-------------------------------------- *--------------------------------------
CB.Cache .BS S.CB CB.Cache .BS S.CB
BM.Cache .BS S.BM BM.Cache .BS S.BM

View File

@ -73,26 +73,23 @@ S.CB.M.MONO .EQ %00000001 b/w (1 bit/pixel)
S.CB.M.C16 .EQ %00001000 16 colors (4 bits/pixel) S.CB.M.C16 .EQ %00001000 16 colors (4 bits/pixel)
*S.CB.M.C256 .EQ %00010000 256 colors (8 bits/pixel) *S.CB.M.C256 .EQ %00010000 256 colors (8 bits/pixel)
S.CB.COLOR .EQ 3 xPIXEL,xLINE,FILLRECT S.CB.COLOR .EQ 3 xPIXEL,xLINE,FILLRECT
S.CB.hFont .EQ 3 DRAWTEXT S.CB.hFont .EQ 3 DRAWTEXT,GETTEXTSIZE
S.CB.X1 .EQ 4 xPIXEL,xLINE,FILLRECT,BITBLT,GETRECTBUFSIZE,DRAWLINE S.CB.X1 .EQ 4 xPIXEL,xLINE,FILLRECT,BITBLT,GETRECTBUFSIZE,DRAWLINE
S.CB.Y1 .EQ 6 xPIXEL,xLINE,FILLRECT,BITBLT,GETRECTBUFSIZE,DRAWLINE S.CB.Y1 .EQ 6 xPIXEL,xLINE,FILLRECT,BITBLT,GETRECTBUFSIZE,DRAWLINE
S.CB.X2 .EQ 8 VLINE,FILLRECT,GETRECTBUFSIZE,DRAWLINE
S.CB.Y2 .EQ 10 HLINE,FILLRECT,GETRECTBUFSIZE,DRAWLINE
S.CB.X2 .EQ 8 VLINE,FILLRECT,DRAWLINE S.CB.SrcX .EQ 12 BITBLT,DRAWTEXT,GETTEXTSIZE
S.CB.SrcW .EQ 8 BITBLT,GETRECTBUFSIZE S.CB.SrcY .EQ 14 BITBLT,DRAWTEXT,GETTEXTSIZE
S.CB.SrcW .EQ 16 BITBLT
S.CB.SrcH .EQ 18 BITBLT
S.CB.Y2 .EQ 10 HLINE,FILLRECT,DRAWLINE S.CB.SrcPtr .EQ 20 BITBLT
S.CB.SrcH .EQ 10 BITBLT,GETRECTBUFSIZE S.CB.DstPtr .EQ 22 BITBLT,GETRECTBUFSIZE
S.CB.TxtPtr .EQ 24 DRAWTEXT,GETTEXTSIZE
S.CB.DstX .EQ 12 BITBLT,DRAWTEXT
S.CB.DstY .EQ 14 BITBLT,DRAWTEXT
S.CB.SrcPtr .EQ 16 BITBLT
S.CB.TxtPtr .EQ 16 DRAWTEXT
S.CB.DstPtr .EQ 18 BITBLT
* *
S.CB .EQ 20 S.CB .EQ 26
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE inc/gfx.i SAVE inc/gfx.i

View File

@ -9,7 +9,7 @@ NEW
* CC : CB.Cache clipped & visible * CC : CB.Cache clipped & visible
* CS : CB.Cache invisible * CS : CB.Cache invisible
*-------------------------------------- *--------------------------------------
CLIP.YA jsr CB.Get CLIP.YA jsr CB.Get Put CB in cache
CLIP.CB.Cache ldx CB.Cache+S.CB.CMD CLIP.CB.Cache ldx CB.Cache+S.CB.CMD
bpl CLIP.X bpl CLIP.X
@ -21,161 +21,122 @@ CLIP.CB.Cache ldx CB.Cache+S.CB.CMD
CLIP.X jmp (J.CLIP-2,x) CLIP.X jmp (J.CLIP-2,x)
*-------------------------------------- *--------------------------------------
CLIP.Point CLIP.Point
clc
rts
*--------------------------------------
CLIP.HLine CLIP.HLine
clc
rts
*--------------------------------------
CLIP.VLine CLIP.VLine
clc clc
rts 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.Rect
CLIP.Text CLIP.Text
* >DEBUG
clc clc
rts CLIP.Text.RTS rts
*-------------------------------------- *--------------------------------------
CLIP.BitBlt.9 pla * BitBlt :
CLIP.BitBlt.99 sec *--------------------------------------
rts CLIP.BitBlt jsr CB.Cache.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
CLIP.BitBlt lda CB.Cache+S.CB.DstX jsr CB.Cache.Overlap
ldx CB.Cache+S.CB.DstX+1 bcs CLIP.Text.RTS
pha
>SCMPAX OBJ.Cache+S.OBJ.X2 lda OBJ.Cache+S.OBJ.X1
bpl CLIP.BitBlt.9 DestX after X2....exit
pla
>SCMPAX OBJ.Cache+S.OBJ.X1
bpl .1 DestX Inside X1-X2, go check if X1+W fit in
* S.CB.DstX before S.OBJ.X1: D=S.OBJ.X1-S.CB.DstX, S.CB.SrcW-=D, S.CB.DstX=+=D, S.CB.X1+=D
lda OBJ.Cache+S.OBJ.X1 Compute D....
sec sec
sbc CB.Cache+S.CB.DstX sbc CB.Cache+S.CB.X1
sta D sta DX
lda OBJ.Cache+S.OBJ.X1+1 lda OBJ.Cache+S.OBJ.X1+1
sbc CB.Cache+S.CB.DstX+1 sbc CB.Cache+S.CB.X1+1
sta D+1 ....always positive sta DX+1
bvc .1
lda CB.Cache+S.CB.SrcW S.CB.SrcW-=D eor #$80
sec .1 bmi .2
sbc D >DEBUG
sta CB.Cache+S.CB.SrcW lda S.CB.X1
lda CB.Cache+S.CB.SrcW+1
sbc D+1
sta CB.Cache+S.CB.SrcW+1
bcc CLIP.BitBlt.99 Negative!!!! nothing to do,exit...
lda CB.Cache+S.CB.DstX S.CB.DstX+=D
clc clc
adc D adc DX
sta CB.Cache+S.CB.DstX sta S.CB.X1
lda CB.Cache+S.CB.DstX+1
adc D+1
sta CB.Cache+S.CB.DstX+1
lda CB.Cache+S.CB.X1 S.CB.X1+=D
clc
adc D
sta CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1+1 lda CB.Cache+S.CB.X1+1
adc D+1 adc DX+1
sta CB.Cache+S.CB.X1+1 S.CB.DstX=0, new between S.OBJ.X1 & S.OBJ.X2.... sta CB.Cache+S.CB.X1+1
* S.CB.DstX between S.OBJ.X1 & S.OBJ.X2: D=(S.OBJ.X2+1)-S.CB.DstX lda CB.Cache+S.CB.SrcX
.1 lda OBJ.Cache+S.OBJ.X2 Compute D in X,Y
sec
sbc CB.Cache+S.CB.DstX
tax
lda OBJ.Cache+S.OBJ.X2+1
sbc CB.Cache+S.CB.DstX+1
inx
bne .2
inc
.2 tay
cpx CB.Cache+S.CB.SrcW
sbc CB.Cache+S.CB.SrcW+1
bcs CLIP.BitBlt.Y D >= SrcW....nothing to clip
stx CB.Cache+S.CB.SrcW SrcW < D, make SrcW=D
sty CB.Cache+S.CB.SrcW+1
CLIP.BitBlt.Y lda CB.Cache+S.CB.DstY
ldx CB.Cache+S.CB.DstY+1
pha
>SCMPAX OBJ.Cache+S.OBJ.Y2 DestY after Y2....exit
bmi .10
pla
sec
rts
.10 pla
>SCMPAX OBJ.Cache+S.OBJ.Y1
bpl .1 DestY Inside Y1-Y2, go check if Y1+H fit in
* S.CB.DstY above S.OBJ.Y1: D=S.OBJ.Y1-S.CB.DstY, S.CB.SrcH-=D, S.CB.DstY=0, S.CB.Y1+=D
lda OBJ.Cache+S.OBJ.Y1 Compute D....
sec
sbc CB.Cache+S.CB.DstY
sta D
lda OBJ.Cache+S.OBJ.Y1+1
sbc CB.Cache+S.CB.DstY+1
sta D+1 ....always positive
lda CB.Cache+S.CB.SrcH S.CB.SrcH-=D
sec
sbc D
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc D+1
sta CB.Cache+S.CB.SrcH+1
bcc .99 Negative!!!! nothing to do,exit...
lda CB.Cache+S.CB.DstY Dst.Y+=D
clc clc
adc D adc DX
sta CB.Cache+S.CB.DstY sta CB.Cache+S.CB.SrcX
lda CB.Cache+S.CB.DstY+1
adc D+1
sta CB.Cache+S.CB.DstY+1
lda CB.Cache+S.CB.Y1 S.CB.Y1+=D
clc
adc D
sta CB.Cache+S.CB.Y1
lda CB.Cache+S.CB.Y1+1
adc D+1
sta CB.Cache+S.CB.Y1+1 S.CB.DstY=0, new between S.OBJ.Y1 & S.OBJ.Y2....
* S.CB.DstY between S.OBJ.Y1 & S.OBJ.Y2: D=(S.OBJ.Y2+1)-S.CB.DstY lda CB.Cache+S.CB.SrcX+1
adc DX+1
.1 lda OBJ.Cache+S.OBJ.Y2 Compute D in X,Y sta CB.Cache+S.CB.SrcX+1
lda CB.Cache+S.CB.SrcW
sec sec
sbc CB.Cache+S.CB.DstY sbc DX
tax sta CB.Cache+S.CB.SrcW
lda OBJ.Cache+S.OBJ.Y2+1
sbc CB.Cache+S.CB.DstY+1
inx lda CB.Cache+S.CB.SrcW+1
bne .2 sbc DX+1
sta CB.Cache+S.CB.SrcW+1
bcc .9
inc .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
>DEBUG
lda CB.Cache+S.CB.SrcW
sec
sbc DX
sta CB.Cache+S.CB.SrcW
.2 tay lda CB.Cache+S.CB.SrcW+1
cpx CB.Cache+S.CB.SrcH sbc DX+1
sbc CB.Cache+S.CB.SrcH+1 sta CB.Cache+S.CB.SrcW+1
bcs .8 D >= SrcH....nothing to clip bcc .9
stx CB.Cache+S.CB.SrcH SrcH < D, make SrcH=D
sty CB.Cache+S.CB.SrcH+1
.8 clc
rts
.9 pla
.99 sec .4 clc
.99 rts
.9 sec
rts rts
*-------------------------------------- *--------------------------------------
CLIP.Line.LEFT .EQ 1 CLIP.Line.LEFT .EQ 1
@ -297,6 +258,66 @@ CLIP.Line.EncodeY.AX
ora #CLIP.Line.BOTTOM ora #CLIP.Line.BOTTOM
.8 rts .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 MAN
SAVE usr/src/lib/libgui.s.clip SAVE usr/src/lib/libgui.s.clip
LOAD usr/src/lib/libgui.s LOAD usr/src/lib/libgui.s

View File

@ -26,18 +26,51 @@ SetCursor sta CUR.T
lda L.Cursors+1,x lda L.Cursors+1,x
sta CUR.CB+S.CB.SrcPtr+1 sta CUR.CB+S.CB.SrcPtr+1
sta ZPPtr1+1 sta ZPPtr1+1
ldy #S.BM.W ldy #S.BM.W
lda (ZPPtr1),y lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcW sta CUR.CB+S.CB.SrcW
clc
adc CUR.CB+S.CB.X1
pha
iny iny
lda (ZPPtr1),y lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcW+1 sta CUR.CB+S.CB.SrcW+1
adc CUR.CB+S.CB.X1+1
tax
pla
bne .2
dex
.2 dec
sta CUR.CB+S.CB.X2
stx CUR.CB+S.CB.X2+1
iny S.BM.H iny S.BM.H
lda (ZPPtr1),y lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcH sta CUR.CB+S.CB.SrcH
clc
adc CUR.CB+S.CB.Y1
pha
iny iny
lda (ZPPtr1),y lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcH+1 sta CUR.CB+S.CB.SrcH+1
adc CUR.CB+S.CB.Y1+1
tax
pla
bne .3
dex
.3 dec
sta CUR.CB+S.CB.Y2
stx CUR.CB+S.CB.Y2+1
lda CUR.bVisible lda CUR.bVisible
bmi ShowCursor.I bmi ShowCursor.I
@ -77,36 +110,37 @@ ShowCursor lda CUR.bVisible
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
HideCursor.I lda #S.CB.OP.RESTORE HideCursor.I lda #S.CB.OP.RESTORE
sta CUR.CB+S.CB.OP
bra DrawCursor.I bra DrawCursor.I
*-------------------------------------- *--------------------------------------
ShowCursor.I lda #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE ShowCursor.I sta CUR.CB+S.CB.OP
sta CUR.CB+S.CB.OP
ldx CUR.T ldx CUR.T
lda CUR.Pos+S.POINT.X lda CUR.Pos+S.POINT.X
sec sec
sbc CUR.HotPoints,x sbc CUR.HotPoints,x
sta CUR.CB+S.CB.DstX sta CUR.CB+S.CB.X1
lda CUR.Pos+S.POINT.X+1 lda CUR.Pos+S.POINT.X+1
sbc #0 sbc #0
sta CUR.CB+S.CB.DstX+1 sta CUR.CB+S.CB.X1+1
lda CUR.Pos+S.POINT.Y lda CUR.Pos+S.POINT.Y
sec sec
sbc CUR.HotPoints+1,x sbc CUR.HotPoints+1,x
sta CUR.CB+S.CB.DstY sta CUR.CB+S.CB.Y1
lda CUR.Pos+S.POINT.Y+1 lda CUR.Pos+S.POINT.Y+1
sbc #0 sbc #0
sta CUR.CB+S.CB.DstY+1 sta CUR.CB+S.CB.Y1+1
DrawCursor.I >LDYA L.SCR lda #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE
DrawCursor.I sta CUR.CB+S.CB.OP
>LDYA L.SCR
jsr OBJ.Get jsr OBJ.Get
>LDYA L.CUR.CB >LDYA L.CUR.CB
jsr CLIP.YA jsr CLIP.YA
bcs .9 bcs .9
>LDYA L.CUR.CB jmp GFXWrite.CB
jmp GFXWrite.YA
.9 rts .9 rts
*-------------------------------------- *--------------------------------------

View File

@ -1,6 +1,6 @@
NEW NEW
AUTO 3,1 AUTO 3,1
.LIST OFF .LIST OFF
.OP 65C02 .OP 65C02
.OR $2000 .OR $2000
.TF lib/libgui .TF lib/libgui
@ -23,6 +23,7 @@ WND.MAX .EQ 64
stx ]1+1 stx ]1+1
sta ]2+1 sta ]2+1
.EM .EM
.MA NOT16 .MA NOT16
sec sec
lda #0 lda #0
@ -32,6 +33,7 @@ WND.MAX .EQ 64
sbc ]1+1 sbc ]1+1
sta ]1+1 sta ]1+1
.EM .EM
.MA SCMPAX .MA SCMPAX
sec sec
sbc ]1 sbc ]1
@ -39,6 +41,34 @@ WND.MAX .EQ 64
sbc ]1+1 sbc ]1+1
bvc :1 bvc :1
eor #$80 eor #$80
:1 .EQ *
.EM
.MA SCMPYA
cpy ]1
sbc ]1+1
bvc :1
eor #$80
:1 .EQ *
.EM
.MA STYAIFGTR
tax
>SCMPYA ]1
bmi :1
sty ]1
stx ]1+1
:1 .EQ *
.EM
.MA STYAIFLWR
tax
>SCMPYA ]1
bpl :1
sty ]1
stx ]1+1
:1 .EQ * :1 .EQ *
.EM .EM
*-------------------------------------- *--------------------------------------
@ -114,7 +144,7 @@ J.Clip .DA CLIP.Point SETPIXEL
.DA CLIP.BitBlt .DA CLIP.BitBlt
.DA CLIP.Rect GETRECTBUFSIZE .DA CLIP.Rect GETRECTBUFSIZE
.DA CLIP.Line .DA CLIP.Line
.DA CLIP.Text .DA CLIP.Text
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
LIB.LOAD lda LibCount LIB.LOAD lda LibCount
@ -221,7 +251,7 @@ CB.Get >STYA .1+1
sta CB.Cache,x sta CB.Cache,x
dex dex
bpl .1 bpl .1
rts rts
*-------------------------------------- *--------------------------------------
GFXWrite.CB >LDYA L.CB.Cache GFXWrite.CB >LDYA L.CB.Cache

View File

@ -54,9 +54,13 @@ CS.INIT >LDYA L.LIBGUI
* clc * clc
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
CS.RUN >PUSHW L.MouseData CS.RUN jsr Destop.Paint
CS.RUN.LOOP >SLEEP
>PUSHW L.MouseData
>LIBCALL hLIBGUI,LIBGUI.ReadMouse >LIBCALL hLIBGUI,LIBGUI.ReadMouse
bcs .4 bcs .8
lda MouseData+S.MOUSE.S lda MouseData+S.MOUSE.S
bit #S.MOUSE.S.MOVE bit #S.MOUSE.S.MOVE
@ -64,10 +68,34 @@ CS.RUN >PUSHW L.MouseData
>PUSHW L.MouseData >PUSHW L.MouseData
>LIBCALL hLIBGUI,LIBGUI.SetCursorPos >LIBCALL hLIBGUI,LIBGUI.SetCursorPos
lda MouseData+S.MOUSE.X1
sta CB.Paint+S.CB.X1
clc
adc #39
sta CB.Paint+S.CB.X2
lda MouseData+S.MOUSE.X1+1
sta CB.Paint+S.CB.X1+1
adc #0
sta CB.Paint+S.CB.X2+1
lda MouseData+S.MOUSE.Y1
sta CB.Paint+S.CB.Y1
clc
adc #29
sta CB.Paint+S.CB.Y2
lda MouseData+S.MOUSE.Y1+1
sta CB.Paint+S.CB.Y1+1
adc #0
sta CB.Paint+S.CB.Y2+1
lda MouseData+S.MOUSE.S lda MouseData+S.MOUSE.S
.1 bit #S.MOUSE.S.CLK .1 bit #S.MOUSE.S.CLK
beq .4 beq .4
>LDA.G CUR.T >LDA.G CUR.T
inc inc
inc inc
@ -75,13 +103,17 @@ CS.RUN >PUSHW L.MouseData
bne .2 bne .2
lda #CUR.T.ARROW lda #CUR.T.ARROW
.2 >STA.G CUR.T .2 >STA.G CUR.T
>LIBCALL hLIBGUI,LIBGUI.SetCursor >LIBCALL hLIBGUI,LIBGUI.SetCursor
* jsr Destop.Paint jsr Destop.Paint
.4
.4
.8 clc .8 jmp CS.RUN.LOOP
clc
rts rts
*-------------------------------------- *--------------------------------------
CS.DOEVENT lda (pEvent) CS.DOEVENT lda (pEvent)
@ -101,14 +133,7 @@ Destop.Paint >LIBCALL hLIBGUI,LIBGUI.HideCursor
>PUSHYA >PUSHYA
>PUSHW L.CB.Paint >PUSHW L.CB.Paint
>LIBCALL hLIBGUI,LIBGUI.Draw >LIBCALL hLIBGUI,LIBGUI.Draw
* >LIBCALL hLIBGUI,LIBGUI.GetScreenGC
* >PUSHYA
* >PUSHW L.GC.Clip
* >PUSHW L.CB.Marylin
* >LIBCALL hLIBGUI,LIBGUI.Draw
>LIBCALL hLIBGUI,LIBGUI.ShowCursor >LIBCALL hLIBGUI,LIBGUI.ShowCursor
rts rts
*-------------------------------------- *--------------------------------------
@ -122,18 +147,17 @@ CB.Paint .DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.SET .DA #S.CB.OP.SET
.DA #S.CB.M.C16 .DA #S.CB.M.C16
.DA #11 Color .DA #11 Color
.DA 540 .DA 540 X1
.DA 10 .DA 160 Y1
.DA 550 .DA 579 X2
.DA 30 .DA 199 Y2
.DA #0 .DA #0
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY
.OR 0 .OR 0
DS.START DS.START
CUR.T .BS 1 CUR.T .BS 1
DS.END DS.END .ED
.ED
MAN MAN
SAVE usr/src/sbin/gui.s SAVE usr/src/sbin/gui.s
ASM ASM

View File

@ -439,6 +439,98 @@ CORE.FSID .BS 1
CORE.EvtIndex .BS 1 CORE.EvtIndex .BS 1
CORE.EvtCount .BS 1 CORE.EvtCount .BS 1
*-------------------------------------- *--------------------------------------
* Called by :
* - Kernel K.IrqHAuxLC
* - ProDOS IRQ Manager (GP)
*--------------------------------------
K.IrqH.IIGS lda IO.IIGS.INTFLAG
and #$08
beq K.IrqH.DEV
stz IO.IIGS.CLRVBLINT
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.TCLOCK ldy IRQ.VBL.n0
lda $c080,y
and #$20
beq K.IrqH.DEV
lda $c088,y
lda $c080,y
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.VBL
K.IrqH.VBL.MSM jsr $FFFF SELF MODIFIED,SERVEMOUSE
bcs K.IrqH.DEV Not From Mouse
ldx IRQ.VBL.0n
lda MOUSESTSx,x
and #MOUSESTSx.INTVBL IRQ was caused by VBL ?
beq K.IrqH.DEV
ldx K.IrqH.VBL.MRM+2 $Cn
ldy IRQ.VBL.n0
K.IrqH.VBL.MRM jsr $FFFF SELF MODIFIED,READMOUSE
*--------------------------------------
K.IrqH.Switch inc IRQ.Tick
dec CORE.CPUStatCnt
bne .2
lda #100
sta CORE.CPUStatCnt
ldx #K.PS.MAX-1
.1 lda PS.Table.Hits,x
stz PS.Table.Hits,x
sta PS.Table.Stats,x
dex
bpl .1
.2 lda IRQ.InKernel
bpl .3
inc PS.Table.Hits
.9 clv
clc
rts
.3 ldx CORE.PSIndex
inc PS.Table.Hits,x
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
ldy #S.PS.S
lda (pPS),y
eor #S.PS.S.RUN
bne .9
lda IRQ.InLib
bmi .9 we are in LIB, no switching
.8 clc exit with V flag set
rts
*--------------------------------------
K.IrqH.DEV ldx #0
.1 lda IRQ.Vectors+1,x
beq .9
sta .10+2
lda IRQ.Vectors,x
sta .10+1
phx
.10 jsr $ffff SELF MODIFIED
plx
bcc .8 CC, IRQ cleared by device
.2 inx
inx
.3 cpx #K.IRQDEV.MAX*2
bne .1
.9 sec
.8 clv clear V (no task switching)
rts
*--------------------------------------
IRQ.InKernel .BS 1 IRQ.InKernel .BS 1
IRQ.InLib .BS 1 IRQ.InLib .BS 1
IRQ.SkipA2osX .BS 1 IRQ.SkipA2osX .BS 1
@ -449,6 +541,8 @@ IRQ.VBL.0n .BS 1
IRQ.Mode .BS 1 IRQ.Mode .BS 1
IRQ.Tick .BS 1 IRQ.Tick .BS 1
*-------------------------------------- *--------------------------------------
IRQ.Vectors .BS K.IRQDEV.MAX*2
*--------------------------------------
MAN MAN
SAVE USR/SRC/SYS/KERNEL.S.CORE SAVE USR/SRC/SYS/KERNEL.S.CORE
LOAD USR/SRC/SYS/KERNEL.S LOAD USR/SRC/SYS/KERNEL.S

View File

@ -25,9 +25,12 @@ K.IrqHAuxLC cld
stx K.IrqHAuxLC.5+1 stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1 sty K.IrqHAuxLC.4+1
lda RDPAGE2 lda RDPAGE2
pha pha
sta CLRPAGE2 sta CLRPAGE2
lda RD80STORE
pha
lda RDREADAUX lda RDREADAUX
pha pha
sta CLRREADAUX Make sure we can access FD.Table sta CLRREADAUX Make sure we can access FD.Table
@ -78,9 +81,14 @@ K.IrqHAuxLC.3 pla Must keep Carry
.2 pla .2 pla
bpl .3 bpl .3
sta SET80STORE
.3 pla
bpl .30
sta SETPAGE2 sta SETPAGE2
.3 bvc K.IrqHAuxLC.4 if not V, skip task switching .30 bvc K.IrqHAuxLC.4 if not V, skip task switching
tsx Check Stack if before "dec IRQ.InKernel" tsx Check Stack if before "dec IRQ.InKernel"
cpx #$fc $1ff-PChi-PClo-P = $1fc cpx #$fc $1ff-PChi-PClo-P = $1fc
@ -125,100 +133,6 @@ K.IrqHAuxLC.JMP jmp $FFFF SELF MODIFIED Not handled, pass to ProDOS
K.IrqHAuxLC.8 rti K.IrqHAuxLC.8 rti
*-------------------------------------- *--------------------------------------
* Called by :
* - Kernel K.IrqHAuxLC
* - ProDOS IRQ Manager (GP)
*--------------------------------------
K.IrqH.IIGS lda IO.IIGS.INTFLAG
and #$08
beq K.IrqH.DEV
stz IO.IIGS.CLRVBLINT
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.TCLOCK ldy IRQ.VBL.n0
lda $c080,y
and #$20
beq K.IrqH.DEV
lda $c088,y
lda $c080,y
bra K.IrqH.Switch
*--------------------------------------
K.IrqH.VBL
K.IrqH.VBL.MSM jsr $FFFF SELF MODIFIED,SERVEMOUSE
bcs K.IrqH.DEV Not From Mouse
ldx IRQ.VBL.0n
lda MOUSESTSx,x
and #MOUSESTSx.INTVBL IRQ was caused by VBL ?
beq K.IrqH.DEV
ldx K.IrqH.VBL.MRM+2 $Cn
ldy IRQ.VBL.n0
K.IrqH.VBL.MRM jsr $FFFF SELF MODIFIED,READMOUSE
*--------------------------------------
K.IrqH.Switch inc IRQ.Tick
dec CORE.CPUStatCnt
bne .2
lda #100
sta CORE.CPUStatCnt
ldx #K.PS.MAX-1
.1 lda PS.Table.Hits,x
stz PS.Table.Hits,x
sta PS.Table.Stats,x
dex
bpl .1
.2 lda IRQ.InKernel
bpl .3
inc PS.Table.Hits
.9 clv
clc
rts
.3 ldx CORE.PSIndex
inc PS.Table.Hits,x
bit A2osX.F A2osX.F.PMODE .EQ %01000000
bvc .8
ldy #S.PS.S
lda (pPS),y
eor #S.PS.S.RUN
bne .9
lda IRQ.InLib
bmi .9 we are in LIB, no switching
.8 clc exit with V flag set
rts
*--------------------------------------
K.IrqH.DEV ldx #0
.1 lda IRQ.Vectors+1,x
beq .9
sta .10+2
lda IRQ.Vectors,x
sta .10+1
phx
.10 jsr $ffff SELF MODIFIED
plx
bcc .8 CC, IRQ cleared by device
.2 inx
inx
.3 cpx #K.IRQDEV.MAX*2
bne .1
.9 sec
.8 clv clear V (no task switching)
rts
*--------------------------------------
IRQ.Vectors .BS K.IRQDEV.MAX*2
*--------------------------------------
MAN MAN
SAVE USR/SRC/SYS/KERNEL.S.IRQ SAVE USR/SRC/SYS/KERNEL.S.IRQ
LOAD USR/SRC/SYS/KERNEL.S LOAD USR/SRC/SYS/KERNEL.S