maclab@reed.UUCP (Mac DLab) (12/20/85)
High Speed Plotting Routines
----------------------------
Below you will find a slick piece of 68000 code (Lisa assembler,
but translation to MDS6800 is a piece of cake) -- these routines will
blast black or white dots on your Macintosh screen *very* quickly.
The procedures qplotblack and qplotwhite are called like so, from
Rascal:
QPlotWhite(x,y);
QPlotBlack(x,y);
The x and y are in global coordinates. You must make sure not
to draw on a non-sceen position -- it is possible to plot right
into other parts of memory with these routines.
--------------------------------------------------------------------------
Happy Holidays from the Reed Academic Software Development Laboratory!
Richard Crandall
Marianne Colgrove
Josh Doenias
Scott Gillespie
Michael McGreevy
Greg Stein (in absentia)
Ann Muir Thomas
and :-)
"That's what he *does*. That's *all* he does." (Sgt. Kyle Reese, Tech Com).
{decvax, ucbvax, pur-ee, uw-beaver, masscomp, cbosg, aat,
mit-ems, psu-cs, uoregon, orstcs, ihnp4, uf-cgrl, ssc-vax}!tektronix
\
+--!reed!maclab
{teneron, ogcvax, muddcs, cadic, oresoft, grpwre, /
harvard, psu-cs, omen, isonvax, nsc-pdc}-------------+
------------------------------------------------------------------------------
;
; High-speed plotting
;
; Written by Greg Stein
; 84.09.27.gjs
; 85.12.10.spg --- Made compatible with all mac configurations.
;
; Procedure QPlotWhite(x,y : integer);
; Procedure QPlotBlack(x,y : Integer);
;
ScreenBase .EQU $824 ; top of screen screen address
ScreenRow .EQU $106 ; screen rowbytes
.PROC QPlotWhite
move.l (sp)+,a1 ; save return address
move.w (sp)+,d0 ; y value
move.w (sp)+,d1 ; x value
ext.l d0 ; clear upper bits
muls ScreenRow,d0 ; multiply y by 64 to find line base
move.w d1,d2
and.w #$07,d2 ; obtain bit number
move.b WhiteTable(d2),d2 ; get mask bits
move.l ScreenBase,a0 ; get screen base
lsr.w #$3,d1 ; divide x by 8 to obtain byte offset
add.w d1,a0 ; add x byte offset to line base
and.b d2,0(a0,d0)
jmp (a1) ; done, return
WhiteTable:
.byte $7f, $bf, $df, $ef, $f7, $fb, $fd, $fe
.PROC QPlotBlack
move.l (sp)+,a1 ; save return address
move.w (sp)+,d0 ; y value
move.w (sp)+,d1 ; x value
ext.l d0 ; clear upper bits
muls screenRow,d0 ; multiply y by 64 to find line base
move.w d1,d2
and.w #$07,d2 ; obtain bit number
move.b BlackTable(d2),d2 ; get mask bits
move.l ScreenBase,a0 ; get screen base
lsr.w #$3,d1 ; divide x by 8 to obtain byte offset
add.w d1,a0 ; add x byte offset to line base
or.b d2,0(a0,d0)
jmp (a1) ; done, return
BlackTable:
.byte $80, $40, $20, $10, $08, $04, $02, $01
.end