A2osX/DRV/DHGR.DRV.S.BLT.txt

359 lines
7.6 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* BitBlt
* 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 >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 BM.Cache+S.BM.MASK.OFS
sta ZPBMMaskPtr
lda ZPBMDataPtr+1
adc BM.Cache+S.BM.MASK.OFS+1
sta ZPBMMaskPtr+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 BLT.BMDataPtr
pla
pha
adc ZPBMDataPtr+1
sta BLT.BMDataPtr+1
tya
adc ZPBMMaskPtr
sta BLT.BMMaskPtr
pla
adc ZPBMMaskPtr+1
sta BLT.BMMaskPtr+1
lda CB.Cache+S.CB.X1
2017-11-17 07:09:39 +00:00
pha
2017-11-20 06:59:59 +00:00
and #7
sta BLT.BMBitOfs
2017-11-17 07:09:39 +00:00
pla
lsr CB.Cache+S.CB.X1+1
ror
lsr CB.Cache+S.CB.X1+1
ror
lsr CB.Cache+S.CB.X1+1
ror
pha
clc
adc BLT.BMDataPtr
sta BLT.BMDataPtr
bcc .3
inc BLT.BMDataPtr+1
.3 pla
adc BLT.BMMaskPtr
sta BLT.BMMaskPtr
bcc .4
inc BLT.BMMaskPtr+1
.4 lda CB.Cache+S.CB.X2
2017-11-20 06:59:59 +00:00
sec
sbc CB.Cache+S.CB.X1
2017-11-20 06:59:59 +00:00
sta BLT.DX
lda CB.Cache+S.CB.X2+1
sbc CB.Cache+S.CB.X1+1
2017-11-20 06:59:59 +00:00
sta BLT.DX+1
>LDYA CB.Cache+S.CB.DestX
2017-11-20 06:59:59 +00:00
jsr LBUF.SetBounds1YA
stx BLT.SCRBitOfs
lda CB.Cache+S.CB.DestX
2017-11-20 06:59:59 +00:00
clc
adc BLT.DX
tay
lda CB.Cache+S.CB.DestX+1
2017-11-20 06:59:59 +00:00
adc BLT.DX+1
jsr LBUF.SetBounds2YA
lda CB.Cache+S.CB.Y2
2017-11-23 16:51:52 +00:00
sec
sbc CB.Cache+S.CB.Y1
inc
2017-11-23 16:51:52 +00:00
sta BLT.DY
ldx BLT.SCRBitOfs
beq BITBLT.LOOP
ldy Shift.L.LO,x X = 1->6
sty ZPScrShiftPtr
2017-11-23 16:51:52 +00:00
ldy Shift.L.HI,x X = 1->6
sty ZPScrShiftPtr+1
2017-11-23 16:51:52 +00:00
BITBLT.LOOP ldx BLT.SCRBitOfs
bne BITBLT.LOOPx
*------------ Shift 0
BITBLT.LOOP0 lda CB.Cache+S.CB.OP
bit #S.CB.OP.MASK
beq .2
>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 0xxxxxxxx in A
ldx BLT.ScrColIdx
sta LBUF.MASK,x
inc BLT.ScrColIdx
cpx LBUF.C2
bne .1
2017-11-23 16:51:52 +00:00
.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
2017-11-23 16:51:52 +00:00
ldx BLT.ScrColIdx
2017-11-23 16:51:52 +00:00
sta LBUF.DATA,x
inc BLT.ScrColIdx
2017-11-23 16:51:52 +00:00
cpx LBUF.C2
bne .3
2017-11-23 16:51:52 +00:00
jmp BITBLT.DRAW
*------------ Shift 1->6 Comment : SCRBitOfs=X=3
2017-11-23 16:51:52 +00:00
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
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"
.5 jsr BLT.Get7BMDBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
2017-11-23 16:51:52 +00:00
pha save BM byte for 2nd col
2017-11-23 16:51:52 +00:00
.6 and #$ff SELF MODIFIED : MASK WITH #%00001111, keep col1 bits only
2017-11-23 16:51:52 +00:00
tay
lda (ZPScrShiftPtr),y make 0000dddd Shift left 3 : 0dddd000
ldx BLT.ScrColIdx Get actual COL index
ora LBUF.DATA,x Light proper bits : 0dddd???
sta LBUF.DATA,x store 0xdddd???
2017-11-23 16:51:52 +00:00
pla Get back BM Byte
2017-11-23 16:51:52 +00:00
.7 and #$ff SELF MODIFIED : #%01110000 get only col2 bites
2017-11-23 16:51:52 +00:00
tay
lda (ZPScrShiftPtr),y shift right 4 (=shift left 3!!!) : 00000ddd
2017-11-23 16:51:52 +00:00
sta LBUF.DATA+1,x
2017-11-23 16:51:52 +00:00
inx
stx BLT.ScrColIdx
cpx LBUF.C2
bne .5
BITBLT.DRAW ldy CB.Cache+S.CB.DestY
2017-11-23 16:51:52 +00:00
jsr LBUF.DrawAtY
inc CB.Cache+S.CB.DestY
dec BLT.DY
beq .8
2017-11-23 16:51:52 +00:00
lda CB.Cache+S.CB.OP
bit #S.CB.OP.MASK
beq .1
2017-11-23 16:51:52 +00:00
lda BLT.BMMaskPtr
2017-11-23 16:51:52 +00:00
clc
adc BM.Cache+S.BM.RowBytes
sta BLT.BMMaskPtr
bcc .1
inc BLT.BMMaskPtr+1
.1 lda BLT.BMDataPtr
clc
adc BM.Cache+S.BM.RowBytes
sta BLT.BMDataPtr
bcc .2
2017-11-23 16:51:52 +00:00
inc BLT.BMDataPtr+1
.2 jmp BITBLT.LOOP
.8 clc
rts
*--------------------------------------
* BM Data/Mask bits :
* 76543210 76543210
* ^
* BMBitOfsL (0->7)
* LBUF DATA/MASK Bits
* c6543210 c6543210
* ^
*--------------------------------------
BLT.Get7BMDBits ldy BLT.BMIdx
lda (ZPBMDataPtr),y
ldx BLT.BMBitOfsL
2017-11-23 16:51:52 +00:00
beq BLT.Get7BMBits0 OFS=0, done! and no need to advance ZPBMDataPtr
lsr OFS=1->7, shift one (Range 0->127)
dex OFS 0->6
beq BLT.Get7BMBits1 OFS was 1....done and go to next byte, OFS=0
2017-11-23 16:51:52 +00:00
ldy Shift.R.LO,x X = 1->6
sty ZPBMShiftPtr
2017-11-23 16:51:52 +00:00
ldy Shift.R.HI,x X = 1->6
sty ZPBMShiftPtr+1
2017-11-23 16:51:52 +00:00
and Mask7BitsH,x Get only left upper X bits
2017-11-23 16:51:52 +00:00
tay xxxxx000
lda (ZPBMShiftPtr),y shift'em RIGHT 000xxxxx
pha
inc BLT.BMIdx Next BM data byte
ldy BLT.BMIdx
lda (ZPBMDataPtr),y get next byte
and Mask7BitsL,x only first Y bits 000000yy
tay
2017-11-23 16:51:52 +00:00
pla get back right part bits 000xxxxx
ora (ZPBMShiftPtr),y shift right 000000yy and ORA with 000xxxxx=0yyxxxxx
dec BLT.BMBitOfsL X = 1->6, ADD 7 MOD 8.....
rts
BLT.Get7BMBits0 and #%01111111 Get only 7 needed bits
ldx #7
stx BLT.BMBitOfsL Was 0, add 7 bits
rts
BLT.Get7BMBits1 stz BLT.BMBitOfsL Was 1, add 7 bits, MOD 8=0
inc BLT.BMIdx go to next byte in BM line
rts LSR did already 0xxxxxxx
2017-11-20 06:59:59 +00:00
*--------------------------------------
MAN
2017-11-14 16:57:34 +00:00
SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.RECT
LOAD /A2OSX.SRC/DRV/DHGR.DRV.S
ASM