70 lines
1.4 KiB
Forth
70 lines
1.4 KiB
Forth
start-microcode wireframe
|
|
|
|
\ See http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
|
|
|
|
COMM+0 constant X0
|
|
COMM+1 constant Y0
|
|
COMM+2 constant X1
|
|
COMM+3 constant Y1
|
|
COMM+4 constant steep
|
|
COMM+5 constant deltax
|
|
COMM+6 constant deltay
|
|
COMM+7 constant ystep
|
|
COMM+8 constant color
|
|
|
|
: setpixel ( yx -- ) \ set pixel yx to color
|
|
dup>r
|
|
h# f and
|
|
r@ d# 4 rshift h# 0ff0 and or
|
|
r@ h# 30 and swab or
|
|
RAM_SPRIMG or ( addr )
|
|
dupc@ ( addr v )
|
|
color c@ r> d# 5 rshift h# 6 and rshift or
|
|
swap c!
|
|
;
|
|
|
|
: negate invert ;fallthru
|
|
: 1+ d# 1 + ;
|
|
: @ dupc@ swap 1+ c@ swab or ;
|
|
: byte h# ff and ;
|
|
|
|
: bresenham
|
|
deltay c@ negate >r \ keep -deltay on R stack for speed
|
|
X0 @ \ load y0x0
|
|
deltax c@ d# 1 rshift \ load deltax/1, is error
|
|
|
|
( y0x0 error )
|
|
begin
|
|
over byte X1 c@ xor
|
|
while
|
|
over
|
|
steep c@ if swab then
|
|
setpixel
|
|
r@ + \ error -= deltay
|
|
dup d# 0 < if
|
|
deltax c@ + \ error += deltax
|
|
ystep c@ swab 1+
|
|
else
|
|
d# 1
|
|
then
|
|
>r swap r> + swap \ increment YX
|
|
repeat
|
|
r> drop
|
|
;
|
|
|
|
: main
|
|
begin
|
|
\ wait until command reg is nonzero
|
|
begin
|
|
ystep c@
|
|
until
|
|
|
|
bresenham
|
|
|
|
\ tell host we're done
|
|
d# 0 ystep c!
|
|
again
|
|
;
|
|
|
|
end-microcode
|