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 .LIST OFF
*-------------------------------------- *--------------------------------------
* BitBlt * BitBlt
* In : YA = Ptr to CtrlBlk : * S.CB.X1 : SrcX1 in bitmap/mask
* 1 : OP * S.CB.Y1 : SrcY1
* 4 : SrcX1 * S.CB.X2 : SrcX2
* 6 : SrcY1 * S.CB.Y2 : SrcY2
* 8 : SrcX2
* 10 : SrcY2 * S.CB.DestX : Destination X (screen)
* 12 : DestX * S.CB.DestY : Destination Y (screen)
* 14 : DestY
* 16 : SrcPtr * S.CB.SrcPtr : pointer to S.BM
* 18 : DstPtr * 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 clc
rts 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 .1 ldx LBUF.C1
.2 tya .2 tya
and LBUF.MASK,x
sta LBUF.DATA,x sta LBUF.DATA,x
inx
cpx LBUF.C2 cpx LBUF.C2
bcs .2 inx
bcc .2
ldy CB.Cache+S.CB.Y1 ldy CB.Cache+S.CB.Y1
jmp LBUF.DrawAtY jmp LBUF.DrawAtY
HLINE.C16 >DEBUG HLINE.C16 lda CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1
and #%11111100 and #%11111100
tay tay
lda CB.Cache+S.CB.X1+1 lda CB.Cache+S.CB.X1+1
@ -48,7 +46,7 @@ HLINE.C16 >DEBUG
jsr LBUF.SetBounds1YA jsr LBUF.SetBounds1YA
lda CB.Cache+S.CB.X2 lda CB.Cache+S.CB.X2
and #%11111100 ora #%00000011
tay tay
lda CB.Cache+S.CB.X2+1 lda CB.Cache+S.CB.X2+1
@ -64,7 +62,7 @@ HLINE.C16 >DEBUG
adc #0 adc #0
sta ZPPalettePtr+1 sta ZPPalettePtr+1
ldx LBUF.C1 ldx LBUF.C1
.1 txa .1 txa
and #3 Compute index in Palette (Mod 4) and #3 Compute index in Palette (Mod 4)
@ -72,7 +70,6 @@ HLINE.C16 >DEBUG
tay tay
lda (ZPPalettePtr),y lda (ZPPalettePtr),y
and LBUF.MASK,x
sta LBUF.DATA,x sta LBUF.DATA,x
cpx LBUF.C2 cpx LBUF.C2
inx inx

View File

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

View File

@ -16,8 +16,8 @@ AUTO 6
ZPCmdPtr .EQ ZPDRV ZPCmdPtr .EQ ZPDRV
ZPBasePtr .EQ ZPDRV+2 ZPBasePtr .EQ ZPDRV+2
ZPPalettePtr .EQ ZPDRV+4 ZPPalettePtr .EQ ZPDRV+4
ZPBMDataPtr .EQ ZPDRV+6
ZPBMMaskPtr .EQ ZPDRV+8
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -142,7 +142,7 @@ WRITE >STYA ZPCmdPtr
sta SET80STORE sta SET80STORE
lda (ZPCmdPtr) Get Cmd lda (ZPCmdPtr) Get Cmd
.1 tax .1 tax
ldy CB.CmdLen,x ldy CB.CmdLen,x
@ -159,86 +159,6 @@ WRITE >STYA ZPCmdPtr
rts rts
.10 jmp (J.Cmds,x) .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: * IN:
* Y = LO * Y = LO
@ -267,6 +187,44 @@ DIVMOD7Y2 lda DIV7.512,y
ldx MOD7.512,y ldx MOD7.512,y
rts 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 DRV.CS.END
*-------------------------------------- *--------------------------------------
.INB /A2OSX.SRC/DRV/DHGR.DRV.T .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 .DA S.CB.DstPtr+1 BITBLT
*-------------------------------------- *--------------------------------------
CB.Cache .BS S.CB CB.Cache .BS S.CB
BM.Cache .BS S.BM
*-------------------------------------- *--------------------------------------
DIV7.lo .BS 3 DIV7.lo .BS 3
DIV7.hi .BS 3 DIV7.hi .BS 3
@ -286,14 +245,19 @@ MOD7.lo .BS 3
MOD7.hi .BS 3 MOD7.hi .BS 3
*-------------------------------------- *--------------------------------------
LBUF.C1 .BS 1 LBUF.C1 .BS 1
LBUF.C2 .BS 1 C1 C2 LBUF.C1.MASK .BS 1 Bits to CLR in VMEM : 11100000 00000000 00111111
LBUF.MASK .BS 80 Bits to CLR in VMEM & LBUF.DATA from C1 to C2 : 11100000 00000000 00111111 LBUF.C1.DATA .BS 1 Bits to SET/ORA/XOR : 000ccccc cccccccc cc000000
LBUF.DATA .BS 80 Bits to SET/ORA/XOR in VMEM from C1 to C2 : 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 XDIV7 .BS 1
XMOD7 .BS 1 XMOD7 .BS 1
XCOL7 .BS 1 XCOL7 .BS 1
GBYTE .BS 1 GBYTE .BS 1
GWORD .BS 2
*-------------------------------------- *--------------------------------------
DSTAT .DA #0 DSTAT .DA #0
.DA #0,#0,#0 .DA #0,#0,#0

View File

@ -28,9 +28,7 @@ C2.DATA .DA #%10000001 ->C1.DATA
.DA #%10001111 .DA #%10001111
.DA #%10011111 .DA #%10011111
.DA #%10111111 ...to 6 .DA #%10111111 ...to 6
*--------------------------------------
C1.DATA .DA #%11111111 C1.DATA .DA #%11111111
*--------------------------------------
C2.MASK .DA #%11111110 C2.MASK .DA #%11111110
.DA #%11111100 .DA #%11111100
.DA #%11111000 .DA #%11111000
@ -105,6 +103,11 @@ COL.BANK .DA #SETPAGE2,#CLRPAGE2,#SETPAGE2,#CLRPAGE2
.DA #SETPAGE2,#CLRPAGE2,#SETPAGE2,#CLRPAGE2 .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.BASE .HS 002449 Indexed with X.HI
*-------------------------------------- *--------------------------------------
DIV7.0 .HS 00 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.BITBLT .EQ 10
S.CB.CMD.DRAWLINE .EQ 12 S.CB.CMD.DRAWLINE .EQ 12
S.CB.OP .EQ 1 S.CB.OP .EQ 1
S.CB.OP.SAVE .EQ %00000001 S.CB.OP.SET .EQ %00000001 replace screen with bitmap
S.CB.OP.REPLACE .EQ %00000010 S.CB.OP.ORA .EQ %00000010 combine screen & bitmap -> Screen
S.CB.OP.AND .EQ %00000100 S.CB.OP.XOR .EQ %00000011 screen EOR bitmap -> Screen
S.CB.OP.ORA .EQ %00001000 S.CB.OP.SAVE .EQ %00010000 Save Screen to DstPtr before painting
S.CB.OP.XOR .EQ %00010000 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 .EQ 2
S.CB.MODE.MONO .EQ %00000001 b/w (1 bit/pixel) S.CB.MODE.MONO .EQ %00000001 b/w (1 bit/pixel)
*S.CB.MODE.C4 .EQ %00000010 *S.CB.MODE.C4 .EQ %00000010
*S.CB.MODE.C8 .EQ %00000100 *S.CB.MODE.C8 .EQ %00000100
S.CB.MODE.C16 .EQ %00001000 16 colors (4 bits/pixel) 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.COLOR .EQ 3
S.CB.X1 .EQ 4 S.CB.X1 .EQ 4
S.CB.Y1 .EQ 6 S.CB.Y1 .EQ 6
@ -69,8 +70,9 @@ S.BM.F.BBP8 .EQ %00010000
S.BM.RowBytes .EQ 1 S.BM.RowBytes .EQ 1
S.BM.W .EQ 2 S.BM.W .EQ 2
S.BM.H .EQ 4 S.BM.H .EQ 4
S.BM.MASK.OFFSET .EQ 6 S.BM.MASK.OFS .EQ 6
S.BM.DATA .EQ 8 *
S.BM .EQ 8
*-------------------------------------- *--------------------------------------
LIBGUI.InitGUI.A .EQ 4 LIBGUI.InitGUI.A .EQ 4
LIBGUI.CloseGUI .EQ 6 LIBGUI.CloseGUI .EQ 6

View File

@ -248,11 +248,48 @@ MouseData .BS 5
Rect.CB .DA #S.CB.CMD.FILLRECT Rect.CB .DA #S.CB.CMD.FILLRECT
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.C16 .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 30 .DA 30
.DA 530 .DA 530
.DA 160 .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 .DA #0
*-------------------------------------- *--------------------------------------
SetPixel.CB .DA #S.CB.CMD.SETPIXEL SetPixel.CB .DA #S.CB.CMD.SETPIXEL
@ -271,7 +308,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 191 .DA 191
.DA 80+191 .DA 80+191
.DA 191+191 .DA 191+191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE .DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO .DA #S.CB.MODE.MONO
@ -280,7 +317,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0 .DA 0
.DA 140 .DA 140
.DA 191 .DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE .DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO .DA #S.CB.MODE.MONO
@ -289,7 +326,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0 .DA 0
.DA 100+191 .DA 100+191
.DA 191 .DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE .DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO .DA #S.CB.MODE.MONO
@ -298,7 +335,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0 .DA 0
.DA 559 .DA 559
.DA 191 .DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE .DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO .DA #S.CB.MODE.MONO
@ -307,7 +344,7 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0 .DA 0
.DA 28 .DA 28
.DA 191 .DA 191
*--------------------------------------
.DA #S.CB.CMD.DRAWLINE .DA #S.CB.CMD.DRAWLINE
.DA #S.CB.OP.ORA .DA #S.CB.OP.ORA
.DA #S.CB.MODE.MONO .DA #S.CB.MODE.MONO
@ -316,7 +353,16 @@ DrawLines.CB .DA #S.CB.CMD.DRAWLINE
.DA 0 .DA 0
.DA 84 .DA 84
.DA 191 .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 .DA #0
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY