mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-03 12:06:05 +00:00
329 lines
7.8 KiB
Plaintext
329 lines
7.8 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
* BitBlt
|
||
* S.CB.X1 : SrcX1 in bitmap/mask
|
||
* S.CB.Y1 : SrcY1
|
||
* S.CB.SrcW : width
|
||
* S.CB.SrcH : height
|
||
|
||
* S.CB.DstX : Destination X (screen)
|
||
* S.CB.DstY : Destination Y (screen)
|
||
|
||
* S.CB.SrcPtr : pointer to S.BM
|
||
* S.CB.SrcPtr+1 = 0, hMem in S.CB.SrcPtr
|
||
* S.CB.DstPtr : pointer to Save Buffer
|
||
*--------------------------------------
|
||
BITBLT ldy CB.CACHE+S.CB.SrcPtr
|
||
lda CB.CACHE+S.CB.SrcPtr+1
|
||
bne BITBLT.1
|
||
sta SETREADAUX
|
||
sta SETWRITEAUX
|
||
|
||
tya
|
||
>SYSCALL2 GetMemPtr
|
||
jsr BITBLT.1
|
||
sta CLRREADAUX
|
||
sta CLRWRITEAUX
|
||
rts
|
||
BITBLT.1 >STYA ZPBMDataPtr
|
||
ldy #S.BM-1
|
||
|
||
.1 lda (ZPBMDataPtr),y
|
||
sta BM.Cache,y
|
||
dey
|
||
bpl .1
|
||
ldx #0
|
||
lda BM.Cache+S.BM.F
|
||
cmp #S.BM.F.BBP1
|
||
beq .11
|
||
ldx #$80
|
||
.11 stx BLT.CMASK
|
||
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.DstPtr
|
||
>STYA ZPBMSavePtr
|
||
>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
|
||
pha
|
||
and #7
|
||
sta BLT.BMBitOfs
|
||
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
|
||
clc
|
||
.3 pla
|
||
adc BLT.BMMaskPtr
|
||
sta BLT.BMMaskPtr
|
||
bcc .4
|
||
inc BLT.BMMaskPtr+1
|
||
.4 >LDYA CB.Cache+S.CB.DstX
|
||
jsr LBUF.SetBounds1YA
|
||
stx BLT.SCRBitOfs
|
||
lda CB.Cache+S.CB.DstX
|
||
clc
|
||
adc CB.Cache+S.CB.SrcW
|
||
tay
|
||
lda CB.Cache+S.CB.DstX+1
|
||
adc CB.Cache+S.CB.SrcW+1
|
||
pha
|
||
tya
|
||
sbc #0
|
||
tay
|
||
pla
|
||
sbc #0
|
||
jsr LBUF.SetBounds2YA
|
||
ldx BLT.SCRBitOfs
|
||
beq BITBLT.LOOP0
|
||
ldy Shift.L.LO-1,x X = 1->6
|
||
sty ZPScrShiftPtr
|
||
ldy Shift.L.HI-1,x X = 1->6
|
||
sty ZPScrShiftPtr+1
|
||
lda Shift7BitsCol1,x get #%00001111, BM bits that go in Col1
|
||
sta BITBLT.LOOPx.2+1
|
||
sta BITBLT.LOOPx.6+1
|
||
lda Shift7BitsCol2,x get #%01110000, BM bits that go in Col2
|
||
sta BITBLT.LOOPx.3+1
|
||
sta BITBLT.LOOPx.7+1
|
||
jmp 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
|
||
ldx LBUF.C1
|
||
stx BLT.ScrColIdx
|
||
|
||
.1 jsr BLT.Get7BMBits 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
|
||
ldx LBUF.C1
|
||
stx BLT.ScrColIdx
|
||
|
||
.3 jsr BLT.Get7BMBits we have 0xxxxxxxx in A
|
||
|
||
ora BLT.CMASK
|
||
ldx BLT.ScrColIdx
|
||
sta LBUF.DATA,x
|
||
inc BLT.ScrColIdx
|
||
cpx LBUF.C2
|
||
bne .3
|
||
ldy CB.Cache+S.CB.DstY
|
||
jsr LBUF.DrawAtY
|
||
inc CB.Cache+S.CB.DstY
|
||
dec CB.Cache+S.CB.SrcH
|
||
beq .8
|
||
lda CB.Cache+S.CB.OP
|
||
bit #S.CB.OP.MASK
|
||
beq .4
|
||
lda BLT.BMMaskPtr
|
||
clc
|
||
adc BM.Cache+S.BM.RowBytes
|
||
sta BLT.BMMaskPtr
|
||
bcc .4
|
||
|
||
inc BLT.BMMaskPtr+1
|
||
|
||
.4 lda BLT.BMDataPtr
|
||
clc
|
||
adc BM.Cache+S.BM.RowBytes
|
||
sta BLT.BMDataPtr
|
||
bcc .5
|
||
inc BLT.BMDataPtr+1
|
||
.5 jmp BITBLT.LOOP0
|
||
|
||
.8 rts
|
||
|
||
*------------ Shift 1->6 Comment : SCRBitOfs=X=3
|
||
BITBLT.LOOPx lda CB.Cache+S.CB.OP X = BLT.SCRBitOfs
|
||
bit #S.CB.OP.MASK
|
||
beq BITBLT.LOOPx.4
|
||
>LDYA BLT.BMMaskPtr
|
||
>STYA ZPBMDataPtr
|
||
|
||
lda BLT.BMBitOfs
|
||
sta BLT.BMBitOfsL
|
||
ldx LBUF.C1
|
||
stx BLT.ScrColIdx
|
||
stz LBUF.MASK,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
|
||
|
||
BITBLT.LOOPx.1 jsr BLT.Get7BMBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
|
||
pha save BM byte for 2nd col
|
||
BITBLT.LOOPx.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
|
||
BITBLT.LOOPx.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
|
||
inc BLT.ScrColIdx
|
||
cpx LBUF.C2
|
||
bne BITBLT.LOOPx.1
|
||
|
||
BITBLT.LOOPx.4 >LDYA BLT.BMDataPtr
|
||
>STYA ZPBMDataPtr
|
||
|
||
lda BLT.BMBitOfs
|
||
sta BLT.BMBitOfsL
|
||
ldx LBUF.C1
|
||
stx BLT.ScrColIdx
|
||
stz LBUF.DATA,x make sure C1 not ORed with trash in "ora LBUF.DATA,x"
|
||
|
||
BITBLT.LOOPx.5 jsr BLT.Get7BMBits we have c6543210 in A, destination : COL=3210xxx, COL+1=xxxx654
|
||
pha save BM byte for 2nd col
|
||
BITBLT.LOOPx.6 and #$ff SELF MODIFIED : MASK WITH #%00001111, keep col1 bits only
|
||
tay
|
||
lda (ZPScrShiftPtr),y make 0000dddd Shift left 3 : 0dddd000
|
||
ora BLT.CMASK
|
||
|
||
ldx BLT.ScrColIdx Get actual COL index
|
||
ora LBUF.DATA,x Light proper bits : 0dddd???
|
||
sta LBUF.DATA,x store 0xdddd???
|
||
pla Get back BM Byte
|
||
BITBLT.LOOPx.7 and #$ff SELF MODIFIED : #%01110000 get only col2 bites
|
||
tay
|
||
lda (ZPScrShiftPtr),y shift right 4 (=shift left 3!!!) : 00000ddd
|
||
ora BLT.CMASK
|
||
sta LBUF.DATA+1,x
|
||
inc BLT.ScrColIdx
|
||
cpx LBUF.C2
|
||
bne BITBLT.LOOPx.5
|
||
ldy CB.Cache+S.CB.DstY
|
||
jsr LBUF.DrawAtY
|
||
inc CB.Cache+S.CB.DstY
|
||
dec CB.Cache+S.CB.SrcH
|
||
beq .8
|
||
lda CB.Cache+S.CB.OP
|
||
bit #S.CB.OP.MASK
|
||
beq .1
|
||
lda BLT.BMMaskPtr
|
||
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
|
||
inc BLT.BMDataPtr+1
|
||
.2 jmp BITBLT.LOOPx
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
* BM Data/Mask bits :
|
||
* 76543210 76543210
|
||
* ^
|
||
* BMBitOfsL (0->7)
|
||
* LBUF DATA/MASK Bits
|
||
* c6543210 c6543210
|
||
* ^
|
||
*--------------------------------------
|
||
BLT.Get7BMBits ldx BLT.BMBitOfsL
|
||
beq BLT.Get7BMBits0 OFS=0, done! and no need to advance ZPBMDataPtr
|
||
|
||
dex OFS 0->6
|
||
beq BLT.Get7BMBits1 OFS was 1....done and go to next byte, OFS=0
|
||
lda Shift.R.LO-1,x X = 1->6
|
||
sta ZPBMShiftPtr
|
||
lda Shift.R.HI-1,x X = 1->6
|
||
sta ZPBMShiftPtr+1
|
||
lda (ZPBMDataPtr)
|
||
lsr OFS=1->7, shift one (Range 0->127)
|
||
and Mask7BitsH,x Get only left upper X bits
|
||
tay xxxxx000
|
||
lda (ZPBMShiftPtr),y shift'em RIGHT 000xxxxx
|
||
pha
|
||
inc ZPBMDataPtr Next BM data byte
|
||
bne .1
|
||
inc ZPBMDataPtr+1
|
||
.1 lda (ZPBMDataPtr) get next byte
|
||
|
||
and Mask7BitsL,x only first Y bits 000000yy
|
||
tay
|
||
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 lda #7
|
||
sta BLT.BMBitOfsL Was 0, add 7 bits
|
||
lda (ZPBMDataPtr)
|
||
and #%01111111 Get only 7 needed bits
|
||
rts
|
||
BLT.Get7BMBits1 lda (ZPBMDataPtr)
|
||
lsr OFS=1->7, shift one (Range 0->127)
|
||
|
||
stz BLT.BMBitOfsL LSR did already 0xxxxxxx, Was 1, add 7 bits, MOD 8=0
|
||
|
||
inc ZPBMDataPtr go to next byte in BM line
|
||
bne .8
|
||
inc ZPBMDataPtr+1
|
||
.8 rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE USR/SRC/DRV/DHGR.DRV.S.RECT
|
||
LOAD USR/SRC/DRV/DHGR.DRV.S
|
||
ASM
|