123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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
|