Kernel 0.9.1 : DHGR Driver, BitBLT, mouse pointer

This commit is contained in:
Rémy GIBERT 2017-11-27 17:39:09 +01:00
parent c19f98bd81
commit 2a14a04de4
8 changed files with 227 additions and 99 deletions

Binary file not shown.

Binary file not shown.

View File

@ -101,7 +101,7 @@ BITBLT >LDYA CB.CACHE+S.CB.SrcPtr
lda CB.Cache+S.CB.X2+1 lda CB.Cache+S.CB.X2+1
sbc CB.Cache+S.CB.X1+1 sbc CB.Cache+S.CB.X1+1
sta BLT.DX+1 sta BLT.DX+1
>LDYA CB.Cache+S.CB.DestX >LDYA CB.Cache+S.CB.DestX
jsr LBUF.SetBounds1YA jsr LBUF.SetBounds1YA
stx BLT.SCRBitOfs stx BLT.SCRBitOfs
@ -128,10 +128,111 @@ BITBLT >LDYA CB.CACHE+S.CB.SrcPtr
ldy Shift.L.HI,x X = 1->6 ldy Shift.L.HI,x X = 1->6
sty ZPScrShiftPtr+1 sty ZPScrShiftPtr+1
BITBLT.LOOP >LDYA BLT.BMDataPtr BITBLT.LOOP ldx BLT.SCRBitOfs
>STYA ZPBMDataPtr bne BITBLT.LOOPx
*------------ Shift 0
BITBLT.LOOP0 lda CB.Cache+S.CB.OP
bit #S.CB.OP.MASK
beq .2
>LDYA BLT.BMMaskPtr >LDYA BLT.BMMaskPtr
>STYA ZPBMMaskPtr >STYA ZPBMDataPtr
lda BLT.BMBitOfs
sta BLT.BMBitOfsL
stz BLT.BMIdx
ldx LBUF.C1
stx BLT.ScrColIdx
stz LBUF.MASK,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
.1 jsr BLT.Get7BMDBits we have 0xxxxxxxx in A
ldx BLT.ScrColIdx
sta LBUF.MASK,x
inc BLT.ScrColIdx
cpx LBUF.C2
bne .1
.2 >LDYA BLT.BMDataPtr
>STYA ZPBMDataPtr
lda BLT.BMBitOfs
sta BLT.BMBitOfsL
stz BLT.BMIdx
ldx LBUF.C1
stx BLT.ScrColIdx
stz LBUF.DATA,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
.3 jsr BLT.Get7BMDBits we have 0xxxxxxxx in A
ldx BLT.ScrColIdx
sta LBUF.DATA,x
inc BLT.ScrColIdx
cpx LBUF.C2
bne .3
jmp BITBLT.DRAW
*------------ Shift 1->6 Comment : SCRBitOfs=X=3
BITBLT.LOOPx lda CB.Cache+S.CB.OP
bit #S.CB.OP.MASK
beq .4
lda Shift7BitsCol1,x get #%00001111, BM bits that go in Col1
sta .2+1
lda Shift7BitsCol2,x get #%01110000, BM bits that go in Col2
sta .3+1
>LDYA BLT.BMMaskPtr
>STYA ZPBMDataPtr
lda BLT.BMBitOfs
sta BLT.BMBitOfsL
stz BLT.BMIdx
ldx LBUF.C1
stx BLT.ScrColIdx
stz LBUF.MASK,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
.1 jsr BLT.Get7BMDBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
pha save BM byte for 2nd col
.2 and #$ff SELF MODIFIED : MASK WITH #%00001111, keep col1 bits only
tay
lda (ZPScrShiftPtr),y make 0000dddd Shift left 3 : 0dddd000
ldx BLT.ScrColIdx Get actual COL index
ora LBUF.MASK,x Light proper bits : 0dddd???
sta LBUF.MASK,x store 0xdddd???
pla Get back BM Byte
.3 and #$ff SELF MODIFIED : #%01110000 get only col2 bites
tay
lda (ZPScrShiftPtr),y shift right 4 (=shift left 3!!!) : 00000ddd
sta LBUF.MASK+1,x
inx
stx BLT.ScrColIdx
cpx LBUF.C2
bne .1
.4 lda Shift7BitsCol1,x get #%00001111, BM bits that go in Col1
sta .6+1
lda Shift7BitsCol2,x get #%01110000, BM bits that go in Col2
sta .7+1
>LDYA BLT.BMDataPtr
>STYA ZPBMDataPtr
lda BLT.BMBitOfs lda BLT.BMBitOfs
sta BLT.BMBitOfsL sta BLT.BMBitOfsL
@ -141,33 +242,11 @@ BITBLT.LOOP >LDYA BLT.BMDataPtr
stx BLT.ScrColIdx stx BLT.ScrColIdx
stz LBUF.DATA,x make sure C1 not ORed with trash in "ora LBUF.DATA,x" stz LBUF.DATA,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
ldx BLT.SCRBitOfs .5 jsr BLT.Get7BMDBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
bne .2
*------------ Shift 0
.1 jsr BLT.Get7BMDBits we have 0xxxxxxxx in A
ldx BLT.ScrColIdx
sta LBUF.DATA,x
inc BLT.ScrColIdx
cpx LBUF.C2
bne .1
bra BITBLT.DRAW
*------------ Shift 1->6 Comment : SCRBitOfs=X=3
.2 lda Shift7BitsCol1,x get #%00001111, BM bits that go in Col1
sta .4+1
lda Shift7BitsCol2,x get #%01110000, BM bits that go in Col2
sta .5+1
.3 jsr BLT.Get7BMDBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
pha save BM byte for 2nd col pha save BM byte for 2nd col
.4 and #$ff SELF MODIFIED : MASK WITH #%00001111, keep col1 bits only .6 and #$ff SELF MODIFIED : MASK WITH #%00001111, keep col1 bits only
tay tay
lda (ZPScrShiftPtr),y make 0000dddd Shift left 3 : 0dddd000 lda (ZPScrShiftPtr),y make 0000dddd Shift left 3 : 0dddd000
@ -178,7 +257,7 @@ BITBLT.LOOP >LDYA BLT.BMDataPtr
pla Get back BM Byte pla Get back BM Byte
.5 and #$ff SELF MODIFIED : #%01110000 get only col2 bites .7 and #$ff SELF MODIFIED : #%01110000 get only col2 bites
tay tay
lda (ZPScrShiftPtr),y shift right 4 (=shift left 3!!!) : 00000ddd lda (ZPScrShiftPtr),y shift right 4 (=shift left 3!!!) : 00000ddd
@ -188,43 +267,46 @@ BITBLT.LOOP >LDYA BLT.BMDataPtr
inx inx
stx BLT.ScrColIdx stx BLT.ScrColIdx
cpx LBUF.C2 cpx LBUF.C2
bne .3 bne .5
BITBLT.DRAW ldy CB.Cache+S.CB.DestY BITBLT.DRAW ldy CB.Cache+S.CB.DestY
jsr LBUF.DrawAtY jsr LBUF.DrawAtY
inc CB.Cache+S.CB.DestY inc CB.Cache+S.CB.DestY
dec BLT.DY
beq .8
lda BLT.BMDataPtr lda CB.Cache+S.CB.OP
clc bit #S.CB.OP.MASK
adc BM.Cache+S.BM.RowBytes beq .1
sta BLT.BMDataPtr
bcc .6
inc BLT.BMDataPtr+1 lda BLT.BMMaskPtr
.6 lda BLT.BMMaskPtr
clc clc
adc BM.Cache+S.BM.RowBytes adc BM.Cache+S.BM.RowBytes
sta BLT.BMMaskPtr sta BLT.BMMaskPtr
bcc .7 bcc .1
inc BLT.BMMaskPtr+1 inc BLT.BMMaskPtr+1
.1 lda BLT.BMDataPtr
clc
adc BM.Cache+S.BM.RowBytes
sta BLT.BMDataPtr
bcc .2
.7 dec BLT.DY inc BLT.BMDataPtr+1
beq .8
jmp BITBLT.LOOP .2 jmp BITBLT.LOOP
.8 clc .8 clc
rts rts
*-------------------------------------- *--------------------------------------
* BMD/BMM bits : * BM Data/Mask bits :
* 76543210 76543210 * 76543210 76543210
* ^ * ^
* BMBitOfsL (0->7) * BMBitOfsL (0->7)
* LBUF DATA/MASK Bits * LBUF DATA/MASK Bits
* c6543210 c6543210 * c6543210 c6543210
* ^ * ^
* SCRBitOfs (0->6)
*-------------------------------------- *--------------------------------------
BLT.Get7BMDBits ldy BLT.BMIdx BLT.Get7BMDBits ldy BLT.BMIdx
lda (ZPBMDataPtr),y lda (ZPBMDataPtr),y
@ -258,7 +340,6 @@ BLT.Get7BMDBits ldy BLT.BMIdx
pla get back right part bits 000xxxxx pla get back right part bits 000xxxxx
ora (ZPBMShiftPtr),y shift right 000000yy and ORA with 000xxxxx=0yyxxxxx ora (ZPBMShiftPtr),y shift right 000000yy and ORA with 000xxxxx=0yyxxxxx
dec BLT.BMBitOfsL X = 1->6, ADD 7 MOD 8..... dec BLT.BMBitOfsL X = 1->6, ADD 7 MOD 8.....
rts rts

View File

@ -51,13 +51,14 @@ LBUF.DrawAtY lda BASEL,y setup line Base Ptr
lda CB.Cache+S.CB.OP lda CB.Cache+S.CB.OP
.1 and #$f .1 and #$F
tax tax
jmp (J.LBUF.DrawAtY,x) jmp (J.LBUF.DrawAtY,x)
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
LBUF.DrawAtY.XOR LBUF.DrawAtY.XOR
LBUF.DrawAtY.AND.XOR
ldx LBUF.C1 x C1->C2 ldx LBUF.C1 x C1->C2
ldy COL.BANK,x ldy COL.BANK,x
@ -106,6 +107,7 @@ LBUF.DrawAtY.XOR
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
LBUF.DrawAtY.SET LBUF.DrawAtY.SET
LBUF.DrawAtY.AND.SET
ldx LBUF.C1 x C1->C2 ldx LBUF.C1 x C1->C2
ldy COL.BANK,x ldy COL.BANK,x
@ -198,20 +200,21 @@ LBUF.DrawAtY.ORA
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
LBUF.DrawAtY.AND LBUF.DrawAtY.AND.ORA
ldx LBUF.C1 x C1->C2 ldx LBUF.C1 x C1->C2
ldy COL.BANK,x ldy COL.BANK,x
sta $C000,y sta $C000,y
ldy COL.OFS,x ldy COL.OFS,x
lda (ZPBasePtr),y Get C1 lda LBUF.MASK,x get MASK bits
and LBUF.C1.MASK clear ONLY bits starting at X1 mod 7 ora LBUF.C1.MASK clear ONLY bits starting at X1 mod 7
and (ZPBasePtr),y Clear screen at C1
sta GBYTE sta GBYTE
lda LBUF.DATA,x get DATA bits lda LBUF.DATA,x get DATA bits
and LBUF.C1.DATA set ONLY bits starting at X1 mod 7 and LBUF.C1.DATA set ONLY bits starting at X1 mod 7
ora GBYTE ora GBYTE ora with screen bits
and (ZPBasePtr),y
sta (ZPBasePtr),y update screen sta (ZPBasePtr),y update screen
inx inx
@ -223,8 +226,9 @@ LBUF.DrawAtY.AND
sta $C000,y sta $C000,y
ldy COL.OFS,x ldy COL.OFS,x
lda LBUF.DATA,x set all bytes between C1+1 & C2-1 lda (ZPBasePtr),y
and (ZPBasePtr),y and LBUF.MASK,x
ora LBUF.DATA,x set all bytes between C1+1 & C2-1
sta (ZPBasePtr),y sta (ZPBasePtr),y
inx inx
@ -235,13 +239,14 @@ LBUF.DrawAtY.AND
sta $C000,y sta $C000,y
ldy COL.OFS,x ldy COL.OFS,x
lda (ZPBasePtr),y Get C2 lda LBUF.MASK,x get MASK bits
and LBUF.C2.MASK clear ONLY bits ending at X2 mod 7 ora LBUF.C2.MASK
and (ZPBasePtr),y
sta GBYTE sta GBYTE
lda LBUF.DATA,x get DATA bits lda LBUF.DATA,x get DATA bits
and LBUF.C2.DATA set ONLY bits ending at X2 mod 7 and LBUF.C2.DATA set ONLY bits ending at X2 mod 7
ora GBYTE ora GBYTE
and (ZPBasePtr),y
sta (ZPBasePtr),y update screen sta (ZPBasePtr),y update screen
.8 rts .8 rts

View File

@ -18,11 +18,10 @@ AUTO 6
ZPCmdPtr .EQ ZPDRV ZPCmdPtr .EQ ZPDRV
ZPBasePtr .EQ ZPDRV+2 ZPBasePtr .EQ ZPDRV+2
ZPBMShiftPtr .EQ ZPDRV+4 ZPBMShiftPtr .EQ ZPDRV+4
ZPScrShiftPtr .EQ ZPDRV+6
ZPScrShiftPtr .EQ ZPDRV+8 ZPBMDataPtr .EQ ZPDRV+8
ZPBMDataPtr .EQ ZPDRV+10 ZPBMMaskPtr .EQ ZPDRV+10
ZPBMMaskPtr .EQ ZPDRV+12 ZPBMSavePtr .EQ ZPDRV+12
ZPBMSavePtr .EQ ZPDRV+14
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -146,7 +145,10 @@ J.Cmds .DA SETPIXEL
J.LBUF.DrawAtY .DA LBUF.DrawAtY.XOR J.LBUF.DrawAtY .DA LBUF.DrawAtY.XOR
.DA LBUF.DrawAtY.SET .DA LBUF.DrawAtY.SET
.DA LBUF.DrawAtY.ORA .DA LBUF.DrawAtY.ORA
.DA LBUF.DrawAtY.AND .DA $ffff
.DA LBUF.DrawAtY.AND.XOR
.DA LBUF.DrawAtY.AND.SET
.DA LBUF.DrawAtY.AND.ORA
L.SHIFT .DA SHIFT.L1 L.SHIFT .DA SHIFT.L1
.DA SHIFT.L2 .DA SHIFT.L2
.DA SHIFT.L3 .DA SHIFT.L3

View File

@ -16,10 +16,10 @@ S.CB.CMD.BITBLT .EQ 10
S.CB.CMD.GETRECTBUFSIZE .EQ 12 S.CB.CMD.GETRECTBUFSIZE .EQ 12
S.CB.CMD.DRAWLINE .EQ 14 S.CB.CMD.DRAWLINE .EQ 14
S.CB.OP .EQ 1 S.CB.OP .EQ 1
S.CB.OP.XOR .EQ %00000000 screen EOR bitmap -> Screen S.CB.OP.XOR .EQ 0 screen EOR bitmap -> Screen
S.CB.OP.SET .EQ %00000010 replace screen with bitmap S.CB.OP.SET .EQ 2 replace screen with bitmap
S.CB.OP.ORA .EQ %00000100 combine screen & bitmap -> Screen S.CB.OP.ORA .EQ 4 combine screen & bitmap -> Screen
S.CB.OP.AND .EQ %00000110 Apply BitMap mask before painting S.CB.OP.MASK .EQ %00001000 Apply BitMap mask before painting
S.CB.OP.SAVE .EQ %00010000 Save Screen to DstPtr before painting S.CB.OP.SAVE .EQ %00010000 Save Screen to DstPtr before painting
S.CB.OP.RESTORE .EQ %00100000 Restore Screen From DstPtr S.CB.OP.RESTORE .EQ %00100000 Restore Screen From DstPtr
S.CB.OP.COLOR .EQ %01000000 Assume BitMap is COLOR S.CB.OP.COLOR .EQ %01000000 Assume BitMap is COLOR
@ -85,3 +85,5 @@ LIBGUI.ShowCursor .EQ 16
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE /A2OSX.BUILD/INC/LIBGUI.I SAVE /A2OSX.BUILD/INC/LIBGUI.I
LOAD /A2OSX.SRC/LIB/LIBGUI.S
ASM

View File

@ -430,36 +430,6 @@ CB.CmdLen .DA S.CB.Y1+1 SETPIXEL
*-------------------------------------- *--------------------------------------
CB.Cache .BS S.CB CB.Cache .BS S.CB
*-------------------------------------- *--------------------------------------
CUR.Arrow .DA #S.BM.F.BBP1
.DA #2 RowBytes
.DA 12 W
.DA 12 H
.DA CUR.Arrow.MASK-CUR.Arrow
CUR.Arrow.DATA .DA %00000001.000000000
.DA %00000011.000000000
.DA %00000101.000000000
.DA %00001001.000000000
.DA %00010001.000000000
.DA %00100011.000000000
.DA %01110101.000000000
.DA %00011000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
CUR.Arrow.MASK .DA %00000000.000000000
.DA %00000000.000000000
.DA %00000010.000000000
.DA %00000110.000000000
.DA %00001110.000000000
.DA %00011100.000000000
.DA %00001000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
.DA %00000000.000000000
*--------------------------------------
MAN MAN
SAVE /A2OSX.SRC/LIB/LIBGUI.S SAVE /A2OSX.SRC/LIB/LIBGUI.S
ASM ASM

View File

@ -45,6 +45,8 @@ L.SetPixel.CB .DA SetPixel.CB
L.DrawLines.CB .DA DrawLines.CB L.DrawLines.CB .DA DrawLines.CB
L.Filename .DA Filename L.Filename .DA Filename
L.BitBlT.CB .DA BitBlT.CB L.BitBlT.CB .DA BitBlT.CB
L.MousePtr.CB .DA MousePtr.CB
L.BM.Arrow .DA BM.Arrow
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
CS.INIT >LDYA L.MSG.INIT CS.INIT >LDYA L.MSG.INIT
@ -252,6 +254,21 @@ Destop.Paint >PUSHW L.Rect.CB
>PUSHW L.BitBlt.CB >PUSHW L.BitBlt.CB
>LIBCALL hLIBGUI,LIBGUI.Draw >LIBCALL hLIBGUI,LIBGUI.Draw
>LDYA L.BM.Arrow
>STYA MousePtr.CB+S.CB.SrcPtr
>PUSHW L.MousePtr.CB
>LIBCALL hLIBGUI,LIBGUI.Draw
>LDYAI 128
>STYA MousePtr.CB+S.CB.DestX
>PUSHW L.MousePtr.CB
>LIBCALL hLIBGUI,LIBGUI.Draw
>LDYAI 182
>STYA MousePtr.CB+S.CB.DestX
>PUSHW L.MousePtr.CB
>LIBCALL hLIBGUI,LIBGUI.Draw
rts rts
*-------------------------------------- *--------------------------------------
*-------------------------------------- *--------------------------------------
@ -392,8 +409,23 @@ BitBlT.CB .DA #S.CB.CMD.BITBLT
.DA 0 Y1 .DA 0 Y1
.DA 140 X2 .DA 140 X2
.DA 149 y2 .DA 149 y2
.DA 196 DestX .BS 2 DestX
.DA 21 DestY .DA 24 DestY
.BS 2 SrcPtr
.DA 0
.DA #0
*--------------------------------------
MousePtr.CB .DA #S.CB.CMD.BITBLT
.DA #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE
.DA #S.CB.MODE.MONO
.DA #0
.DA 0 X1
.DA 0 Y1
.DA 11 X2
.DA 12 y2
.DA 112 DestX
.DA 24 DestY
.BS 2 SrcPtr .BS 2 SrcPtr
.DA 0 .DA 0
@ -407,6 +439,42 @@ SetPixel.X .BS 2
SetPixel.Y .BS 2 SetPixel.Y .BS 2
.DA #0 .DA #0
*--------------------------------------
.LIST ON
BM.Arrow .DA #S.BM.F.BBP1
.DA #2 RowBytes
.DA 12 W
.DA 13 H
.DA BM.Arrow.MASK-BM.Arrow
BM.Arrow.DATA .DA %0000.00000000
.DA %0000.00000010
.DA %0000.00000110
.DA %0000.00001110
.DA %0000.00011110
.DA %0000.00111110
.DA %0000.01111110
.DA %0000.11111110
.DA %0001.11111110
.DA %0010.01110010
.DA %0100.11110010
.DA %0000.11100000
.DA %0000.00000000
BM.Arrow.MASK .DA %1111.11111100
.DA %1111.11111000
.DA %1111.11110000
.DA %1111.11100000
.DA %1111.11000000
.DA %1111.10000000
.DA %1111.00000000
.DA %1110.00000000
.DA %1100.00000000
.DA %1000.00000000
.DA %0000.00000000
.DA %0000.00000000
.DA %1110.00001111
.LIST OFF
*-------------------------------------- *--------------------------------------
.DUMMY .DUMMY
.OR 0 .OR 0