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 adc ZPBMDataPtr0 sta ZPBMDataPtr0 pla pha adc ZPBMDataPtr0+1 sta ZPBMDataPtr0+1 tya adc BM.Cache+S.BM.MASK.OFS sta ZPBMMaskPtr0 pla adc BM.Cache+S.BM.MASK.OFS+1 sta ZPBMMaskPtr0+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 ZPBMDataPtr0 sta ZPBMDataPtr0 bcc .3 inc ZPBMDataPtr0+1 .3 pla adc ZPBMMaskPtr0 sta ZPBMMaskPtr0 bcc .4 inc ZPBMMaskPtr0+1 .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 lda S.CB.Y2 sec sbc S.CB.Y1 sta BLT.DY lda BLT.BMBitOfs sta BLT.BMBitOfsL 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 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 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 * ^ * SCRBitOfs (0->6) *-------------------------------------- BLT.Get7BMDBits lda (ZPBMDataPtr) ldx BLT.BMBitOfsL 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 ldy Shift.R.LO,x X = 1->6 sty ZPShiftPtr ldy Shift.R.HI,x X = 1->6 sty ZPShiftPtr+1 and Mask7BitsL,x Get only left upper X bits tay xxxxx000 lda (ZPShiftPtr),y shift'em RIGHT 000xxxxx pha inc ZPBMDataPtr Next BM data byte bne .2 inc ZPBMDataPtr+1 .2 lda (ZPBMDataPtr) get next byte and Mask7BitsH,x only first Y bits 000000yy tay pla get back right part bits 000xxxxx 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 *-------------------------------------- MAN SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.RECT LOAD /A2OSX.SRC/DRV/DHGR.DRV.S ASM