Kernel 0.9.1 : DHGR Driver, BitBLT, mouse pointer, Off Screen Driver

This commit is contained in:
Rémy GIBERT 2017-11-29 17:28:13 +01:00
parent ab08792170
commit 940866d6ed
8 changed files with 532 additions and 338 deletions

Binary file not shown.

Binary file not shown.

View File

@ -239,7 +239,7 @@ LBUF.DrawAtY.AND.ORA
sta $C000,y
ldy COL.OFS,x
>DEBUG
* >DEBUG
lda LBUF.MASK,x get MASK bits
ora LBUF.C2.MASK
and (ZPBasePtr),y

View File

@ -49,15 +49,18 @@ S.CB.DstPtr .EQ 18
*
S.CB .EQ 20
*--------------------------------------
S.DC.hDev .EQ 0
S.DC.hMem .EQ 1
S.DC.Parent .EQ 2
S.DC.X .EQ 4
S.DC.Y .EQ 6
S.DC.W .EQ 8
S.DC.H .EQ 10
S.GC.hDev .EQ 0
S.GC.hMem .EQ 1
S.GC.Parent .EQ 2
*
S.DC .EQ 12
S.GC.X1 .EQ 4
S.GC.Y1 .EQ 6
S.GC.X2 .EQ 8
S.GC.Y2 .EQ 10
S.GC.W .EQ 12
S.GC.H .EQ 14
*
S.GC .EQ 16
*--------------------------------------
CUR.T.ARROW .EQ 0
CUR.T.PLUS .EQ 2

154
LIB/LIBGUI.S.CLIP.txt Normal file
View File

@ -0,0 +1,154 @@
PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
ClipLine.LEFT .EQ 1
ClipLine.RIGHT .EQ 2
ClipLine.BOTTOM .EQ 4
ClipLine.TOP .EQ 8
*--------------------------------------
* In:
* Control Block in CB.Cache
* Graphic Context in GC.Cache
*--------------------------------------
ClipLine jsr ClipLine.EncodeP1
jsr ClipLine.EncodeP2
.1 lda ClipLine.P1
ora ClipLine.P2
beq .88
lda ClipLine.P1
and ClipLine.P2
bne .99
lda ClipLine.P1
beq .5
bit #ClipLine.TOP
beq .2
* Y1 is above S.CB.Y1....
* DY=Y2-Y1;
jsr ClipLine.EncodeP1
bra .1
.2 bit #ClipLine.BOTTOM
beq .3
* Y1 is below S.CB.Y2....
jsr ClipLine.EncodeP1
bra .1
.3 bit #ClipLine.RIGHT
beq .4
* X1 is after S.CB.X2....
jsr ClipLine.EncodeP1
bra .1
* X1 is before S.CB.X1....
.4
jsr ClipLine.EncodeP1
bra .1
* P2
.5 lda ClipLine.P2
bit #ClipLine.TOP
beq .6
* Y2 is above S.CB.Y1....
jsr ClipLine.EncodeP2
bra .1
.6 bit #ClipLine.BOTTOM
beq .7
* Y2 is below S.CB.Y2....
jsr ClipLine.EncodeP2
bra .1
.7 bit #ClipLine.RIGHT
beq .8
* X2 is after S.CB.X2....
jsr ClipLine.EncodeP2
bra .1
* X2 is before S.CB.X1....
.8
jsr ClipLine.EncodeP2
bra .1
.88 clc
rts
.99 sec
rts
*--------------------------------------
ClipLine.EncodeP1
ldy #0
lda CB.Cache+S.CB.X1
ldx CB.Cache+S.CB.X1+1
jsr ClipLine.EncodeX.AX
tay
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y1+1
jsr ClipLine.EncodeY.AX
sta ClipLine.P1
rts
*--------------------------------------
ClipLine.EncodeP2
ldy #0
lda CB.Cache+S.CB.X2
ldx CB.Cache+S.CB.X2+1
jsr ClipLine.EncodeX.AX
tay
lda CB.Cache+S.CB.Y2
ldx CB.Cache+S.CB.Y2+1
jsr ClipLine.EncodeY.AX
sta ClipLine.P2
rts
*--------------------------------------
ClipLine.EncodeX.AX
pha
>SCMPAX GC.Cache+S.GC.X1
bmi .1
tya
ora #ClipLine.LEFT
plx
rts
.1 pla
>SCMPAX GC.Cache+S.GC.X1
bpl .8
tya
ora #ClipLine.RIGHT
.8 rts
*--------------------------------------
ClipLine.EncodeY.AX
pha
>SCMPAX GC.Cache+S.GC.Y1
bmi .1
tya
ora #ClipLine.TOP
plx
rts
.1 pla
>SCMPAX GC.Cache+S.GC.Y1
bpl .8
tya
ora #ClipLine.BOTTOM
.8 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBGUI.S.CLIP
LOAD /A2OSX.SRC/LIB/LIBGUI.S
ASM

22
LIB/LIBGUI.S.CUR.txt Normal file
View File

@ -0,0 +1,22 @@
PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
SetCursor.A
*--------------------------------------
SetCursorPos
*--------------------------------------
HideCursor
*--------------------------------------
ShowCursor
clc
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBGUI.S.CUR
LOAD /A2OSX.SRC/LIB/LIBGUI.S
ASM

325
LIB/LIBGUI.S.DRAW.txt Normal file
View File

@ -0,0 +1,325 @@
PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 6
*--------------------------------------
Draw >PULLW ZPCmdPtr
lda (ZPCmdPtr) Get Cmd
.1 tax
cpx #S.CB.CMD.DRAWLINE
bcc .3 Native DRV Cmd
ldy CB.CmdLen,x
.2 lda (ZPCmdPtr),y Y=Byte count-1 to cache
sta CB.Cache,y
dey
bpl .2
jsr Draw.Jmp
bra .7
.3 >LDYA ZPCmdPtr
jsr GoDev.YA
.7 lda (ZPCmdPtr) Get Cmd
tax
lda CB.CmdLen,x
sec
adc ZPCmdPtr
sta ZPCmdPtr
bcc .8
inc ZPCmdPtr+1
.8 lda (ZPCmdPtr) Get Cmd
bne .1
clc
rts
Draw.Jmp jmp (J.Cmds,x)
*--------------------------------------
* In: Control Block in CB.Cache
* CMD
* OP
* MODE
* COLOR
* X1
* Y1
* X2
* Y2
*--------------------------------------
DrawLine 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...
lda #S.CB.CMD.VLINE
sta CB.Cache+S.CB.CMD
jmp GoDev DX=0 : VLIN Y1,Y2 At X1
.1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2
* >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y2
stx CB.Cache+S.CB.Y1
sta 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
lda #0
* sbc CB.Cache+S.CB.Y1+1
sbc #0
sta DY+1 DY = Y2 - Y1
bmi .3 DY < 0 ...
ora DY
bne .4
lda #S.CB.CMD.HLINE
sta CB.Cache+S.CB.CMD
jmp GoDev DY=0 : HLIN X1,X2 At Y1
.3 >NOT16 DY set DY=-DY
lda #$ff
sta IY set IY=-1
.4 lda #S.CB.CMD.SETPIXEL
sta CB.Cache+S.CB.CMD
jsr GoDev
lda DX
sec
sbc DY
tax
lda DX+1
* sbc DY+1
sbc #0
bmi DrawLine.IncY DY is greater than DX, we will increase on Y axis
txa
beq DrawLine.IncXY DX=DY, go inc X & Y
jmp DrawLine.IncX DY is lower than DX, we will increase on X axis
DrawLine.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
jsr GoDev
bra .1
.8 rts
DrawLine.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
jsr GoDev
bra .1
.8 rts
DrawLine.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+1k
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 jsr GoDev
bra .1
.8 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBGUI.S.DRAW
LOAD /A2OSX.SRC/LIB/LIBGUI.S
ASM

View File

@ -31,6 +31,15 @@ AUTO 6
sbc ]1+1
sta ]1+1
.EM
.MA SCMPAX
sec
sbc ]1
txa
sbc ]1+1
bvc :1
eor #$80
:1 .EQ *
.EM
*--------------------------------------
ZPDCPtr .EQ ZPLIB+2
ZPCmdPtr .EQ ZPLIB+4
@ -66,7 +75,7 @@ LIB.LOAD
LIB.UNLOAD clc
rts
*--------------------------------------
InitGUI.A sta hDev
InitGUI.A sta GC.Screen+S.GC.hDev
>SYSCALL GetDevByID.A
>STYA GoDev.Jmp+1
@ -74,342 +83,19 @@ InitGUI.A sta hDev
rts
*--------------------------------------
CloseGUI
stz hDev
stz GC.Screen+S.GC.hDev
sec
rts
*--------------------------------------
Draw >PULLW ZPCmdPtr
lda (ZPCmdPtr) Get Cmd
.1 tax
cpx #S.CB.CMD.DRAWLINE
bcc .3 Native DRV Cmd
ldy CB.CmdLen,x
.2 lda (ZPCmdPtr),y Y=Byte count-1 to cache
sta CB.Cache,y
dey
bpl .2
jsr Draw.Jmp
bra .7
.3 >LDYA ZPCmdPtr
jsr GoDev.YA
.7 lda (ZPCmdPtr) Get Cmd
tax
lda CB.CmdLen,x
sec
adc ZPCmdPtr
sta ZPCmdPtr
bcc .8
inc ZPCmdPtr+1
.8 lda (ZPCmdPtr) Get Cmd
bne .1
clc
rts
Draw.Jmp jmp (J.Cmds,x)
*--------------------------------------
SetCursor.A
*--------------------------------------
SetCursorPos
*--------------------------------------
HideCursor
*--------------------------------------
ShowCursor
clc
rts
*--------------------------------------
* In: Control Block
* CMD
* OP
* MODE
* COLOR
* X1
* Y1
* X2
* Y2
*--------------------------------------
DrawLine 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...
lda #S.CB.CMD.VLINE
sta CB.Cache+S.CB.CMD
jmp GoDev DX=0 : VLIN Y1,Y2 At X1
.1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2
* >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y2
stx CB.Cache+S.CB.Y1
sta 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
lda #0
* sbc CB.Cache+S.CB.Y1+1
sbc #0
sta DY+1 DY% = Y2% - Y1%
bmi .3 DY < 0 ...
ora DY
bne .4
lda #S.CB.CMD.HLINE
sta CB.Cache+S.CB.CMD
jmp GoDev DY=0 : HLIN X1,X2 At Y1
.3 >NOT16 DY set DY=-DY
lda #$ff
sta IY set IY=-1
.4 lda #S.CB.CMD.SETPIXEL
sta CB.Cache+S.CB.CMD
jsr GoDev
lda DX
sec
sbc DY
tax
lda DX+1
* sbc DY+1
sbc #0
bmi DrawLine.IncY DY is greater than DX, we will increase on Y axis
txa
beq DrawLine.IncXY DX=DY, go inc X & Y
jmp DrawLine.IncX DY is lower than DX, we will increase on X axis
DrawLine.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
jsr GoDev
bra .1
.8 rts
DrawLine.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
jsr GoDev
bra .1
.8 rts
DrawLine.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 jsr GoDev
bra .1
.8 rts
*--------------------------------------
GoDev >LDYA L.CB.Cache
GoDev.YA ldx #DEVMGR.WRITE
GoDev.Jmp jmp $ffff
*--------------------------------------
.INB /A2OSX.SRC/LIB/LIBGUI.S.DRAW
.INB /A2OSX.SRC/LIB/LIBGUI.S.CLIP
.INB /A2OSX.SRC/LIB/LIBGUI.S.CUR
*--------------------------------------
CS.END
hDev .BS 1
*--------------------------------------
DX .BS 2
DY .BS 2
@ -418,6 +104,8 @@ IE .BS 2
D .BS 2
INE .BS 2
Counter .BS 2
ClipLine.P1 .BS 1
ClipLine.P2 .BS 1
*--------------------------------------
CB.CmdLen .DA S.CB.Y1+1 SETPIXEL
.DA S.CB.Y1+1 GETPIXEL
@ -428,6 +116,8 @@ CB.CmdLen .DA S.CB.Y1+1 SETPIXEL
.DA S.CB.DstPtr+1 GETRECTBUFSIZE
.DA S.CB.Y2+1 DRAWLINE
*--------------------------------------
GC.Screen .BS S.GC
GC.Cache .BS S.GC
CB.Cache .BS S.CB
*--------------------------------------
MAN