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
bmi .4
lda CB.LOGO+S.CB.DstX
lda CB.LOGO+S.CB.X1
clc
adc #4
tay
lda CB.LOGO+S.CB.DstX+1
lda CB.LOGO+S.CB.X1+1
adc #0
pha
cpy #244
@ -198,19 +198,19 @@ CS.RUN.LOGO.SHOW
sta xDir
bra .6
.4 lda CB.LOGO+S.CB.DstX
.4 lda CB.LOGO+S.CB.X1
sec
sbc #4
tay
lda CB.LOGO+S.CB.DstX+1
lda CB.LOGO+S.CB.X1+1
sbc #0
bcc .3
.5 sty CB.LOGO+S.CB.DstX
sta CB.LOGO+S.CB.DstX+1
.5 sty CB.LOGO+S.CB.X1
sta CB.LOGO+S.CB.X1+1
.6 lda CB.LOGO+S.CB.DstY
.6 lda CB.LOGO+S.CB.Y1
bit yDir
bmi .8
@ -223,14 +223,14 @@ CS.RUN.LOGO.SHOW
sta yDir
bra .1
.7 sta CB.LOGO+S.CB.DstY
.7 sta CB.LOGO+S.CB.Y1
bra .1
.8 sec
sbc #1
bcc .60
sta CB.LOGO+S.CB.DstY
sta CB.LOGO+S.CB.Y1
jmp .1
.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.M.C16
.DA #0
.DA 0 X1
.DA 0 Y1
.DA 20 X1
.DA 172 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 16 SrcW
.DA 7 SrcH
.DA 20 DstX
.DA 172 DstY
.BS 2 SrcPtr
.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.M.MONO
.DA #0
.DA 10 X1
.DA 20 Y1
.DA 56 X1
.DA 30 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 120 SrcW
.DA 100 SrcH
.DA 56 DstX
.DA 30 DstY
.BS 2 SrcPtr
.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.M.C16
.DA #0
.DA 0 X1
.DA 0 Y1
.DA 200 X1
.DA 100 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 320 SrcW
.DA 40 SrcH
.DA 200 DstX
.DA 100 DstY
.BS 2 SrcPtr
.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.M.MONO
.BS 1 hFONT
.DA 0 X1
.DA 0 Y1
.DA 0 X2
.DA 0 Y2
.DA 7 DstX
.DA 1 DstY
.DA 7 X1
.DA 1 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 0
.DA 0
.DA 0
.BS 2 DstPtr
.BS 2 TXTPTR
.DA 0 DstPtr
CB.TEXT .DA #S.CB.CMD.DRAWTEXT+S.CB.CMD.OSD
.DA #S.CB.OP.SET
.DA #S.CB.M.MONO
.BS 1 hFONT
.DA 0 X1
.DA 0 Y1
.DA 0 X2
.DA 0 Y2
.DA 50 DstX
.DA 184 DstY
.DA 50 X1
.DA 184 Y1
.DA 0
.DA 0
.DA 0 SrcX
.DA 0 SrcY
.DA 0
.DA 0
.DA 0
.BS 2 DstPtr
.BS 2 TXTPTR
.DA 0 DstPtr
*--------------------------------------
BM.Apple .DA #S.BM.F.BBP4
.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.M.C16
.DA #0
.DA 0 X1
.DA 0 Y1
.DA 200 X1
.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 40 SrcH
.DA 200 DstX
.DA 50 DstY
.BS 2 SrcPtr
.DA 0 DstPtr
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END
.ED
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/gtest.s

View File

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

View File

@ -9,7 +9,7 @@ NEW
* CC : CB.Cache clipped & visible
* 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
bpl CLIP.X
@ -21,161 +21,122 @@ CLIP.CB.Cache ldx CB.Cache+S.CB.CMD
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.Rect
CLIP.Text
* >DEBUG
clc
rts
CLIP.Text.RTS rts
*--------------------------------------
CLIP.BitBlt.9 pla
CLIP.BitBlt.99 sec
rts
* BitBlt :
*--------------------------------------
CLIP.BitBlt jsr CB.Cache.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
CLIP.BitBlt lda CB.Cache+S.CB.DstX
ldx CB.Cache+S.CB.DstX+1
pha
jsr CB.Cache.Overlap
bcs CLIP.Text.RTS
>SCMPAX OBJ.Cache+S.OBJ.X2
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....
lda OBJ.Cache+S.OBJ.X1
sec
sbc CB.Cache+S.CB.DstX
sta D
sbc CB.Cache+S.CB.X1
sta DX
lda OBJ.Cache+S.OBJ.X1+1
sbc CB.Cache+S.CB.DstX+1
sta D+1 ....always positive
lda CB.Cache+S.CB.SrcW S.CB.SrcW-=D
sec
sbc D
sta CB.Cache+S.CB.SrcW
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
sbc CB.Cache+S.CB.X1+1
sta DX+1
bvc .1
eor #$80
.1 bmi .2
>DEBUG
lda S.CB.X1
clc
adc D
sta CB.Cache+S.CB.DstX
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
adc DX
sta S.CB.X1
lda CB.Cache+S.CB.X1+1
adc D+1
sta CB.Cache+S.CB.X1+1 S.CB.DstX=0, new between S.OBJ.X1 & S.OBJ.X2....
adc DX+1
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
.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
lda CB.Cache+S.CB.SrcX
clc
adc D
sta CB.Cache+S.CB.DstY
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....
adc DX
sta CB.Cache+S.CB.SrcX
* S.CB.DstY between S.OBJ.Y1 & S.OBJ.Y2: D=(S.OBJ.Y2+1)-S.CB.DstY
.1 lda OBJ.Cache+S.OBJ.Y2 Compute D in X,Y
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 CB.Cache+S.CB.DstY
tax
lda OBJ.Cache+S.OBJ.Y2+1
sbc CB.Cache+S.CB.DstY+1
sbc DX
sta CB.Cache+S.CB.SrcW
inx
bne .2
lda CB.Cache+S.CB.SrcW+1
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
cpx CB.Cache+S.CB.SrcH
sbc CB.Cache+S.CB.SrcH+1
bcs .8 D >= SrcH....nothing to clip
lda CB.Cache+S.CB.SrcW+1
sbc DX+1
sta CB.Cache+S.CB.SrcW+1
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
*--------------------------------------
CLIP.Line.LEFT .EQ 1
@ -297,6 +258,66 @@ CLIP.Line.EncodeY.AX
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

View File

@ -26,18 +26,51 @@ SetCursor sta CUR.T
lda L.Cursors+1,x
sta CUR.CB+S.CB.SrcPtr+1
sta ZPPtr1+1
ldy #S.BM.W
lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcW
clc
adc CUR.CB+S.CB.X1
pha
iny
lda (ZPPtr1),y
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
lda (ZPPtr1),y
sta CUR.CB+S.CB.SrcH
clc
adc CUR.CB+S.CB.Y1
pha
iny
lda (ZPPtr1),y
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
bmi ShowCursor.I
@ -77,36 +110,37 @@ ShowCursor lda CUR.bVisible
.9 rts
*--------------------------------------
HideCursor.I lda #S.CB.OP.RESTORE
sta CUR.CB+S.CB.OP
bra DrawCursor.I
*--------------------------------------
ShowCursor.I lda #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE
sta CUR.CB+S.CB.OP
ShowCursor.I sta CUR.CB+S.CB.OP
ldx CUR.T
lda CUR.Pos+S.POINT.X
sec
sbc CUR.HotPoints,x
sta CUR.CB+S.CB.DstX
sta CUR.CB+S.CB.X1
lda CUR.Pos+S.POINT.X+1
sbc #0
sta CUR.CB+S.CB.DstX+1
sta CUR.CB+S.CB.X1+1
lda CUR.Pos+S.POINT.Y
sec
sbc CUR.HotPoints+1,x
sta CUR.CB+S.CB.DstY
sta CUR.CB+S.CB.Y1
lda CUR.Pos+S.POINT.Y+1
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
>LDYA L.CUR.CB
jsr CLIP.YA
bcs .9
>LDYA L.CUR.CB
jmp GFXWrite.YA
jmp GFXWrite.CB
.9 rts
*--------------------------------------

View File

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

View File

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

View File

@ -439,6 +439,98 @@ CORE.FSID .BS 1
CORE.EvtIndex .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.InLib .BS 1
IRQ.SkipA2osX .BS 1
@ -449,6 +541,8 @@ IRQ.VBL.0n .BS 1
IRQ.Mode .BS 1
IRQ.Tick .BS 1
*--------------------------------------
IRQ.Vectors .BS K.IRQDEV.MAX*2
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.CORE
LOAD USR/SRC/SYS/KERNEL.S

View File

@ -25,9 +25,12 @@ K.IrqHAuxLC cld
stx K.IrqHAuxLC.5+1
sty K.IrqHAuxLC.4+1
lda RDPAGE2
pha
sta CLRPAGE2
lda RD80STORE
pha
lda RDREADAUX
pha
sta CLRREADAUX Make sure we can access FD.Table
@ -78,9 +81,14 @@ K.IrqHAuxLC.3 pla Must keep Carry
.2 pla
bpl .3
sta SET80STORE
.3 pla
bpl .30
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"
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
*--------------------------------------
* 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
SAVE USR/SRC/SYS/KERNEL.S.IRQ
LOAD USR/SRC/SYS/KERNEL.S