** Revision Header * Header built automatically - do not edit! ************* * * (C) Copyright 1991 by Olaf `Olsen' Barthel, all rights reserved * * Name .....: Plot.asm * Created ..: Monday 26-Aug-91 11:20 * Revision .: 1 * * Date Author Comment * ========= ======== ==================== * 26-Aug-91 Olsen Created this file! * **************************************************************************** include "graphics/gfx.i" csect text,0,0,1,2 xdef _Plot xdef _Test ; VOID __asm Plot(register __a0 struct BitMap *,register __d0 WORD X,register __d1 WORD Y,register __d2 WORD Colour); ; ; Fast pixel drawing routine, somewhat equivalent to ; graphics.library/WritePixel. ; ; Register usage is as follows: ; ; d1 = Byte offset into bitplane ; d2 = Pixel colour ; d3 = Number of bitplanes ; d4 = Line modulo/pixel number ; a0 = Pointer to array of bitplanes ; a1 = Pointer to bitplane _Plot: movem.l d3/d4,-(sp) ; Save registerrs moveq #0,d4 ; Clear d3 & d4 move.l d4,d3 move.w bm_BytesPerRow(a0),d4 ; Get line modulo move.b bm_Depth(a0),d3 ; Get bitmap depth lea.l bm_Planes(a0),a0 ; Get array of planes mulu.l d4,d1 ; Multiply Y-position by modulo move.l d0,d4 ; Save X-position lsr #3,d0 ; Get byte offset of X-position add d0,d1 ; Add byte offsets not d4 ; Get bit number subq #1,d3 ; One plane less (for dbra) loop move.l (a0)+,a1 ; Get next plane lsr.b #1,d2 ; Clear or set the pixel? bcc clear bset d4,0(a1,d1) ; Set pixel dbra d3,loop ; Loop until all planes are done exit movem.l (sp)+,d3/d4 ; Restore registers rts clear bclr d4,0(a1,d1) ; Clear pixel dbra d3,loop ; Loop until all planes are done bra exit ; BYTE __asm Test(register __a0 struct BitMap *,register __d0 WORD X,register __d1 WORD Y); ; ; Fast pixel reading routine, somewhat equivalent to ; graphics.library/ReadPixel, returns 1 if there is a pixel in ; the given position in bitmap, else 0. ; ; Register usage is as follows: ; ; d1 = Byte offset into bitplane ; d3 = Number of bitplanes ; d4 = Line modulo/pixel number ; a0 = Pointer to array of bitplanes ; a1 = Pointer to bitplane _Test: movem.l d3/d4,-(sp) ; Save registerrs moveq #0,d4 ; Clear d3 & d4 move.l d4,d3 move.w bm_BytesPerRow(a0),d4 ; Get line modulo move.b bm_Depth(a0),d3 ; Get bitmap depth lea.l bm_Planes(a0),a0 ; Get array of planes mulu.l d4,d1 ; Multiply Y-position by modulo move.l d0,d4 ; Save X-position lsr #3,d0 ; Get byte offset of X-position add d0,d1 ; Add byte offsets not d4 ; Get bit number sub.w #1,d3 ; One plane less (for dbra) moveq #0,d0 ; So we have valid return code tloop move.l (a0)+,a1 ; Get next plane btst d4,0(a1,d1) ; Is a pixel in this position? bne.s go ; Yes, there is dbra d3,tloop ; Test next plane movem.l (sp)+,d3/d4 ; Restore registers rts go moveq #1,d0 ; Got a pixel movem.l (sp)+,d3/d4 ; Restore registers rts end