Kernel 0.9.1 : GUI, API & Driver......RECT & BitBLT

This commit is contained in:
Rémy GIBERT 2017-11-16 17:46:18 +01:00
parent f20065ed25
commit 612d583925
10 changed files with 335 additions and 128 deletions

Binary file not shown.

Binary file not shown.

View File

@ -6,18 +6,82 @@ AUTO 6
.LIST OFF
*--------------------------------------
* BitBlt
* In : YA = Ptr to CtrlBlk :
* 1 : OP
* 4 : SrcX1
* 6 : SrcY1
* 8 : SrcX2
* 10 : SrcY2
* 12 : DestX
* 14 : DestY
* 16 : SrcPtr
* 18 : DstPtr
* S.CB.X1 : SrcX1 in bitmap/mask
* S.CB.Y1 : SrcY1
* S.CB.X2 : SrcX2
* S.CB.Y2 : SrcY2
* S.CB.DestX : Destination X (screen)
* S.CB.DestY : Destination Y (screen)
* S.CB.SrcPtr : pointer to S.BM
* S.CB.DstPtr : pointer to Save Buffer
*--------------------------------------
BITBLT
BITBLT >LDYA CB.CACHE+S.CB.SrcPtr
>STYA ZPBMDataPtr
ldy #S.BM-1
.1 lda (ZPBMDataPtr),y
sta BM.Cache,y
dey
bpl .1
lda ZPBMDataPtr
clc
adc #S.BM
sta ZPBMDataPtr
bcc .2
inc ZPBMDataPtr+1
.2 >LDYA CB.Cache+S.CB.Y1
ldx BM.Cache+S.BM.RowBytes
jsr YAMultX
pha
tya
clc
adc ZPBMDataPtr
sta ZPBMDataPtr
pla
pha
adc ZPBMDataPtr+1
sta ZPBMDataPtr+1
tya
adc BM.Cache+S.BM.MASK.OFS
sta ZPBMMaskPtr
pla
adc BM.Cache+S.BM.MASK.OFS+1
sta ZPBMMaskPtr+1
lda CB.Cache+S.CB.X1
and #7 we have to shift right!!!
tax
lda CB.Cache+S.CB.X1+1
lsr
lsr
lsr
pha
clc
adc ZPBMDataPtr
sta ZPBMDataPtr
bcc .3
inc ZPBMDataPtr+1
.3 pla
adc ZPBMMaskPtr
sta ZPBMMaskPtr
bcc .4
inc ZPBMMaskPtr+1
.4
clc
rts
*--------------------------------------

131
DRV/DHGR.DRV.S.LBUF.txt Normal file
View File

@ -0,0 +1,131 @@
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
LBUF.SetBounds1YA
jsr DIVMOD7YA A=DIV, X=MOD
sta LBUF.C1
tay
lda C1.MASK,x
sta LBUF.C1.MASK
lda C1.DATA,x
sta LBUF.C1.DATA
rts
*--------------------------------------
LBUF.SetBounds2YA
jsr DIVMOD7YA A=DIV, X=MOD
sta LBUF.C2
tay
cmp LBUF.C1 C1=C2, go combine in C1
beq .1
lda C2.MASK,x
sta LBUF.C2.MASK
lda C2.DATA,x
sta LBUF.C2.DATA
rts
.1 lda C1.MASK,x
and C2.MASK,x
sta LBUF.C1.MASK
lda C1.DATA,x
and C2.DATA,x
sta LBUF.C2.DATA
rts
*--------------------------------------
LBUF.DrawAtY lda BASEL,y setup line Base Ptr
sta ZPBasePtr
lda BASEH,y
sta ZPBasePtr+1
*--------------------------------------
LBUF.DrawAtY.SET
ldx LBUF.C1 x C1->C2
ldy COL.BANK,x
sta $C000,y
ldy COL.OFS,x
lda (ZPBasePtr),y Get C1
and LBUF.C1.MASK clear ONLY bits starting at X1 mod 7
sta GBYTE
lda LBUF.DATA,x get DATA bits
and LBUF.C1.DATA set ONLY bits starting at X1 mod 7
ora GBYTE
sta (ZPBasePtr),y update screen
inx
cpx LBUF.C2
beq .2 C1=C2, go setup C2
bcs .8 C1+1 > C2, we are done...
.1 ldy COL.BANK,x
sta $C000,y
ldy COL.OFS,x
lda LBUF.DATA,x set all bytes between C1+1 & C2-1
sta (ZPBasePtr),y
inx
cpx LBUF.C2
bne .1
.2 ldy COL.BANK,x
sta $C000,y
ldy COL.OFS,x
lda (ZPBasePtr),y Get C2
and LBUF.C2.MASK clear ONLY bits ending at X2 mod 7
sta GBYTE
lda LBUF.DATA,x get DATA bits
and LBUF.C2.DATA set ONLY bits ending at X2 mod 7
ora GBYTE
sta (ZPBasePtr),y update screen
.8 rts
*--------------------------------------
LBUF.DrawAtY.ORA
ldy LBUF.C1 y C1->C2
.1 ldx COL.BANK,y
sta $C000,x
lda (ZPBasePtr),y
and LBUF.MASK,y
ora LBUF.DATA,y
sta (ZPBasePtr),y
cpy LBUF.C2
iny
bcc .1
rts
*--------------------------------------
LBUF.DrawAtY.XOR
ldy LBUF.C1 y C1->C2
.1 ldx COL.BANK,y
sta $C000,x
lda (ZPBasePtr),y
and LBUF.MASK,y
eor LBUF.DATA,y
sta (ZPBasePtr),y
cpy LBUF.C2
iny
bcs .1
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.LBUF
LOAD /A2OSX.SRC/DRV/DHGR.DRV.S
ASM

View File

@ -30,17 +30,15 @@ HLINE.MONO >LDYA CB.Cache+S.CB.X1
.1 ldx LBUF.C1
.2 tya
and LBUF.MASK,x
sta LBUF.DATA,x
inx
cpx LBUF.C2
bcs .2
inx
bcc .2
ldy CB.Cache+S.CB.Y1
jmp LBUF.DrawAtY
HLINE.C16 >DEBUG
lda CB.Cache+S.CB.X1
HLINE.C16 lda CB.Cache+S.CB.X1
and #%11111100
tay
lda CB.Cache+S.CB.X1+1
@ -48,7 +46,7 @@ HLINE.C16 >DEBUG
jsr LBUF.SetBounds1YA
lda CB.Cache+S.CB.X2
and #%11111100
ora #%00000011
tay
lda CB.Cache+S.CB.X2+1
@ -64,7 +62,7 @@ HLINE.C16 >DEBUG
adc #0
sta ZPPalettePtr+1
ldx LBUF.C1
ldx LBUF.C1
.1 txa
and #3 Compute index in Palette (Mod 4)
@ -72,7 +70,6 @@ HLINE.C16 >DEBUG
tay
lda (ZPPalettePtr),y
and LBUF.MASK,x
sta LBUF.DATA,x
cpx LBUF.C2
inx

View File

@ -15,16 +15,16 @@ AUTO 6
*--------------------------------------
FILLRECT jsr HLINE
inc CB.Cache+S.CB.Y1
ldy CB.Cache+S.CB.Y1
cpy CB.Cache+S.CB.Y2
bcs .8
beq .8
.2 jsr LBUF.DrawAtY
inc CB.Cache+S.CB.Y1
ldy CB.Cache+S.CB.Y1
.2 iny
phy
jsr LBUF.DrawAtY
ply
cpy CB.Cache+S.CB.Y2
bcc .2
bne .2
.8 rts
*--------------------------------------

View File

@ -16,8 +16,8 @@ AUTO 6
ZPCmdPtr .EQ ZPDRV
ZPBasePtr .EQ ZPDRV+2
ZPPalettePtr .EQ ZPDRV+4
ZPBMDataPtr .EQ ZPDRV+6
ZPBMMaskPtr .EQ ZPDRV+8
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@ -142,7 +142,7 @@ WRITE >STYA ZPCmdPtr
sta SET80STORE
lda (ZPCmdPtr) Get Cmd
.1 tax
ldy CB.CmdLen,x
@ -159,86 +159,6 @@ WRITE >STYA ZPCmdPtr
rts
.10 jmp (J.Cmds,x)
*--------------------------------------
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.PIX
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.LINE
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.RECT
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.BLT
*--------------------------------------
LBUF.SetBounds1YA
jsr DIVMOD7YA A=DIV, X=MOD
sta LBUF.C1
tay
lda C1.MASK,x
sta LBUF.MASK,y
rts
*--------------------------------------
LBUF.SetBounds2YA
jsr DIVMOD7YA A=DIV, X=MOD
sta LBUF.C2
tay
cmp LBUF.C1
beq .2
lda C2.MASK,x
sta LBUF.MASK,y
lda #0
.1 dey
cpy LBUF.C1
beq .8
sta LBUF.MASK,y
bra .1
.2 lda C1.MASK,x
and C2.MASK,x
sta LBUF.MASK,y
.8 rts
*--------------------------------------
LBUF.SetOPA
*--------------------------------------
LBUF.DrawAtY lda BASEL,y setup line Base Ptr
sta ZPBasePtr
lda BASEH,y
sta ZPBasePtr+1
ldy LBUF.C1 y C1->C2
.1 ldx COL.BANK,y
sta $C000,x
lda (ZPBasePtr),y
and LBUF.MASK,y
ora LBUF.DATA,y
lda #$ff
sta (ZPBasePtr),y
cpy LBUF.C2
iny
bcc .1
rts
*--------------------------------------
LBUF.DrawAtY.XOR
.1 ldx COL.BANK,y
sta $C000,x
lda (ZPBasePtr),y
and LBUF.MASK,y
eor LBUF.DATA,y
sta (ZPBasePtr),y
iny
cpy LBUF.C2
bcs .1
rts
*--------------------------------------
* IN:
* Y = LO
@ -267,6 +187,44 @@ DIVMOD7Y2 lda DIV7.512,y
ldx MOD7.512,y
rts
*--------------------------------------
* IN:
* Y,A = num1 (16)
* X = num2 (8)
* OUT:
* Y,A = (Y,A) * X
*--------------------------------------
YAMultX stx GBYTE
sty GWORD
sta GWORD+1
ldy #0 Result LO
tya Result HI
bra .3
.1 pha
tya
clc
adc GWORD
tay
pla
adc GWORD+1
.2 asl GWORD
rol GWORD+1
.3 lsr GBYTE
bcs .1
bne .2
rts
*--------------------------------------
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.PIX
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.LINE
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.RECT
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.BLT
.INB /A2OSX.SRC/DRV/DHGR.DRV.S.LBUF
*--------------------------------------
DRV.CS.END
*--------------------------------------
.INB /A2OSX.SRC/DRV/DHGR.DRV.T
@ -279,6 +237,7 @@ CB.CmdLen .DA S.CB.Y1+1 SETPIXEL
.DA S.CB.DstPtr+1 BITBLT
*--------------------------------------
CB.Cache .BS S.CB
BM.Cache .BS S.BM
*--------------------------------------
DIV7.lo .BS 3
DIV7.hi .BS 3
@ -286,14 +245,19 @@ MOD7.lo .BS 3
MOD7.hi .BS 3
*--------------------------------------
LBUF.C1 .BS 1
LBUF.C2 .BS 1 C1 C2
LBUF.MASK .BS 80 Bits to CLR in VMEM & LBUF.DATA from C1 to C2 : 11100000 00000000 00111111
LBUF.DATA .BS 80 Bits to SET/ORA/XOR in VMEM from C1 to C2 : 000ccccc cccccccc cc000000
LBUF.C1.MASK .BS 1 Bits to CLR in VMEM : 11100000 00000000 00111111
LBUF.C1.DATA .BS 1 Bits to SET/ORA/XOR : 000ccccc cccccccc cc000000
LBUF.C2 .BS 1 C1 C2
LBUF.C2.MASK .BS 1
LBUF.C2.DATA .BS 1
LBUF.MASK .BS 80
LBUF.DATA .BS 80
*--------------------------------------
XDIV7 .BS 1
XMOD7 .BS 1
XCOL7 .BS 1
GBYTE .BS 1
GWORD .BS 2
*--------------------------------------
DSTAT .DA #0
.DA #0,#0,#0

View File

@ -28,9 +28,7 @@ C2.DATA .DA #%10000001 ->C1.DATA
.DA #%10001111
.DA #%10011111
.DA #%10111111 ...to 6
*--------------------------------------
C1.DATA .DA #%11111111
*--------------------------------------
C2.MASK .DA #%11111110
.DA #%11111100
.DA #%11111000
@ -105,6 +103,11 @@ COL.BANK .DA #SETPAGE2,#CLRPAGE2,#SETPAGE2,#CLRPAGE2
.DA #SETPAGE2,#CLRPAGE2,#SETPAGE2,#CLRPAGE2
.DA #SETPAGE2,#CLRPAGE2,#SETPAGE2,#CLRPAGE2
*--------------------------------------
COL.OFS .DA #00,#00,#01,#01,#02,#02,#03,#03,#04,#04,#05,#05,#06,#06,#07,#07,#08,#08,#09,#09
.DA #10,#10,#11,#11,#12,#12,#13,#13,#14,#14,#15,#15,#16,#16,#17,#17,#18,#18,#19,#19
.DA #20,#20,#21,#21,#22,#22,#23,#23,#24,#24,#25,#25,#26,#26,#27,#27,#28,#28,#29,#29
.DA #30,#30,#31,#31,#32,#32,#33,#33,#34,#34,#35,#35,#36,#36,#37,#37,#38,#38,#39,#39
*--------------------------------------
DIV7.BASE .HS 002449 Indexed with X.HI
*--------------------------------------
DIV7.0 .HS 00

View File

@ -15,17 +15,18 @@ S.CB.CMD.FILLRECT .EQ 8
S.CB.CMD.BITBLT .EQ 10
S.CB.CMD.DRAWLINE .EQ 12
S.CB.OP .EQ 1
S.CB.OP.SAVE .EQ %00000001
S.CB.OP.REPLACE .EQ %00000010
S.CB.OP.AND .EQ %00000100
S.CB.OP.ORA .EQ %00001000
S.CB.OP.XOR .EQ %00010000
S.CB.OP.SET .EQ %00000001 replace screen with bitmap
S.CB.OP.ORA .EQ %00000010 combine screen & bitmap -> Screen
S.CB.OP.XOR .EQ %00000011 screen EOR bitmap -> Screen
S.CB.OP.SAVE .EQ %00010000 Save Screen to DstPtr before painting
S.CB.OP.AND .EQ %00100000 Apply BitMap mask before painting
S.CB.OP.COLOR .EQ %01000000 Assume BitMap is COLOR
S.CB.MODE .EQ 2
S.CB.MODE.MONO .EQ %00000001 b/w (1 bit/pixel)
*S.CB.MODE.C4 .EQ %00000010
*S.CB.MODE.C8 .EQ %00000100
S.CB.MODE.C16 .EQ %00001000 16 colors (4 bits/pixel)
S.CB.MODE.C256 .EQ %00010000 256 colors (8 bits/pixel)
*S.CB.MODE.C256 .EQ %00010000 256 colors (8 bits/pixel)
S.CB.COLOR .EQ 3
S.CB.X1 .EQ 4
S.CB.Y1 .EQ 6
@ -69,8 +70,9 @@ S.BM.F.BBP8 .EQ %00010000
S.BM.RowBytes .EQ 1
S.BM.W .EQ 2
S.BM.H .EQ 4
S.BM.MASK.OFFSET .EQ 6
S.BM.DATA .EQ 8
S.BM.MASK.OFS .EQ 6
*
S.BM .EQ 8
*--------------------------------------
LIBGUI.InitGUI.A .EQ 4
LIBGUI.CloseGUI .EQ 6

View File

@ -248,11 +248,48 @@ MouseData .BS 5
Rect.CB .DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.C16
.DA #13
.DA #11
.DA 0
.DA 0
.DA 559
.DA 191
.DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
.DA #1
.DA 10
.DA 10
.DA 550
.DA 180
.DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.C16
.DA #0
.DA 20
.DA 20
.DA 540
.DA 170
.DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.C16
.DA #9
.DA 30
.DA 30
.DA 530
.DA 160
.DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.C16
.DA #8
.DA 40
.DA 40
.DA 520
.DA 150
.DA #0
*--------------------------------------
SetPixel.CB .DA #S.CB.CMD.SETPIXEL
@ -271,7 +308,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 191
.DA 80+191
.DA 191+191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
@ -280,7 +317,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0
.DA 140
.DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
@ -289,7 +326,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0
.DA 100+191
.DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
@ -298,7 +335,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0
.DA 559
.DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
@ -307,7 +344,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0
.DA 28
.DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
@ -316,7 +353,16 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0
.DA 84
.DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO
.DA #1
.DA 0
.DA 92
.DA 559
.DA 92
.DA #0
*--------------------------------------
.DUMMY