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

265 lines
4.9 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 #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
2017-11-23 16:51:52 +00:00
adc ZPBMDataPtr0
sta ZPBMDataPtr0
pla
pha
2017-11-23 16:51:52 +00:00
adc ZPBMDataPtr0+1
sta ZPBMDataPtr0+1
tya
adc BM.Cache+S.BM.MASK.OFS
2017-11-23 16:51:52 +00:00
sta ZPBMMaskPtr0
pla
adc BM.Cache+S.BM.MASK.OFS+1
2017-11-23 16:51:52 +00:00
sta ZPBMMaskPtr0+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
2017-11-23 16:51:52 +00:00
adc ZPBMDataPtr0
sta ZPBMDataPtr0
bcc .3
2017-11-23 16:51:52 +00:00
inc ZPBMDataPtr0+1
.3 pla
2017-11-23 16:51:52 +00:00
adc ZPBMMaskPtr0
sta ZPBMMaskPtr0
bcc .4
2017-11-23 16:51:52 +00:00
inc ZPBMMaskPtr0+1
2017-11-20 06:59:59 +00:00
.4 lda S.CB.X2
sec
sbc S.CB.X1
sta BLT.DX
lda S.CB.X2+1
sbc S.CB.X1+1
sta BLT.DX+1
>LDYA S.CB.DestX
jsr LBUF.SetBounds1YA
stx BLT.SCRBitOfs
lda S.CB.DestX
clc
adc BLT.DX
tay
lda S.CB.DestX+1
adc BLT.DX+1
jsr LBUF.SetBounds2YA
2017-11-23 16:51:52 +00:00
lda S.CB.Y2
sec
sbc S.CB.Y1
sta BLT.DY
lda BLT.BMBitOfs
sta BLT.BMBitOfsL
2017-11-23 16:51:52 +00:00
lda LBUF.C1
sta BLT.ScreenC
>LDYA ZPBMDataPtr0
>STYA ZPBMDataPtr
>LDYA ZPBMMaskPtr0
>STYA ZPBMMaskPtr
ldx BLT.SCRBitOfs
beq BITBLT.LOOP
ldy Shift.L.LO,x X = 1->6
sty ZPShiftPtr
ldy Shift.L.HI,x X = 1->6
sty ZPShiftPtr+1
BITBLT.LOOP ldx BLT.SCRBitOfs
bne .2
.1 jsr BLT.Get7BMDBits we have 0xxxxxxxx in A
ldx BLT.ScreenC
sta LBUF.DATA,x
inc BLT.ScreenC
cpx LBUF.C2
bne .1
bra BITBLT.DRAW
.2 jsr BLT.Get7BMDBits we have 0xxxxxxxx in A
pha save it for 2nd part
ldx BLT.SCRBitOfs
and Mask7BitsH,x 0000xxxx, keep col1 bits only
tay
lda (ZPShiftPtr),y make 0xxxx000
2017-11-23 16:51:52 +00:00
ldy BLT.ScreenC
ora LBUF.DATA,y
sta LBUF.DATA,y
pla
inc BLT.ScreenC
cpy LBUF.C2
beq BITBLT.DRAW
and Mask7BitsL,x 0yyy0000
tay
lda (ZPShiftPtr),y 00000yyy
ldy BLT.ScreenC
sta LBUF.DATA,y
inc BLT.ScreenC
cpy LBUF.C2
bne .2
2017-11-23 16:51:52 +00:00
BITBLT.DRAW ldy S.CB.Y1
jsr LBUF.DrawAtY
inc S.CB.Y1
lda ZPBMDataPtr0
clc
adc BM.Cache+S.BM.RowBytes
sta ZPBMDataPtr0
bcc .6
inc ZPBMDataPtr0+1
.6 lda ZPBMMaskPtr0
clc
adc BM.Cache+S.BM.RowBytes
sta ZPBMMaskPtr0
bcc .7
inc ZPBMMaskPtr0+1
.7 dec BLT.DY
bne BITBLT.LOOP
clc
rts
*--------------------------------------
* BMD/BMM bits :
* 76543210 76543210
* ^
* BMBitOfsL (0->7)
* LBUF DATA/MASK Bits
* c6543210 c6543210
* ^
2017-11-23 16:51:52 +00:00
* SCRBitOfs (0->6)
*--------------------------------------
2017-11-23 16:51:52 +00:00
BLT.Get7BMDBits lda (ZPBMDataPtr)
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 ZPShiftPtr
2017-11-23 16:51:52 +00:00
ldy Shift.R.HI,x X = 1->6
sty ZPShiftPtr+1
and Mask7BitsL,x Get only left upper X bits
tay xxxxx000
2017-11-23 16:51:52 +00:00
lda (ZPShiftPtr),y shift'em RIGHT 000xxxxx
pha
inc ZPBMDataPtr Next BM data byte
2017-11-23 16:51:52 +00:00
bne .2
inc ZPBMDataPtr+1
2017-11-23 16:51:52 +00:00
.2 lda (ZPBMDataPtr) get next byte
and Mask7BitsH,x only first Y bits 000000yy
tay
2017-11-23 16:51:52 +00:00
pla get back right part bits 000xxxxx
2017-11-23 16:51:52 +00:00
ora (ZPShiftPtr),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 ZPBMDataPtr go to next byte
bne .1
inc ZPBMDataPtr+1
.1 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