mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1669 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1669 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
''***************************************
 | 
						|
''*  Graphics Driver v1.0               *
 | 
						|
''*  Author: Chip Gracey                *
 | 
						|
''*  Copyright (c) 2005 Parallax, Inc.  *               
 | 
						|
''*  See end of file for terms of use.  *               
 | 
						|
''***************************************
 | 
						|
 | 
						|
''
 | 
						|
'' Theory of Operation:
 | 
						|
''
 | 
						|
'' A cog is launched which processes commands via the PUB routines.
 | 
						|
''
 | 
						|
'' Points, lines, arcs, sprites, text, and polygons are rasterized into
 | 
						|
'' a specified stretch of memory which serves as a generic bitmap buffer.
 | 
						|
''
 | 
						|
'' The bitmap can be displayed by the TV.SRC or VGA.SRC driver.
 | 
						|
''
 | 
						|
'' See GRAPHICS_DEMO.SRC for usage example.
 | 
						|
''
 | 
						|
 | 
						|
CON
 | 
						|
 | 
						|
  #1, _setup, _color, _width, _plot, _line, _arc, _vec, _vecarc, _pix, _pixarc, _text, _textarc, _textmode, _fill, _loop
 | 
						|
 | 
						|
VAR
 | 
						|
 | 
						|
  long  cog
 | 
						|
 | 
						|
  long  command
 | 
						|
 | 
						|
  long  bitmap_base                                     'bitmap data
 | 
						|
  long  bitmap_longs
 | 
						|
  word  bases[32]
 | 
						|
 | 
						|
  long  pixel_width                                     'pixel data
 | 
						|
  long  slices[8]
 | 
						|
 | 
						|
  long  text_xs, text_ys, text_sp, text_just            'text data (these 4 must be contiguous)
 | 
						|
 | 
						|
 | 
						|
PUB start : okay
 | 
						|
 | 
						|
'' Start graphics driver - starts a cog
 | 
						|
'' returns false if no cog available
 | 
						|
 | 
						|
  fontptr := @font                                      'set font pointer (same for all instances)
 | 
						|
 | 
						|
  stop
 | 
						|
  okay := cog := cognew(@loop, @command) + 1
 | 
						|
 | 
						|
 | 
						|
PUB stop
 | 
						|
 | 
						|
'' Stop graphics driver - frees a cog
 | 
						|
 | 
						|
  if cog
 | 
						|
    cogstop(cog~ - 1)
 | 
						|
 | 
						|
  command~
 | 
						|
 | 
						|
 | 
						|
PUB setup(x_tiles, y_tiles, x_origin, y_origin, base_ptr) | bases_ptr, slices_ptr
 | 
						|
 | 
						|
'' Set bitmap parameters
 | 
						|
''
 | 
						|
''   x_tiles        - number of x tiles (tiles are 16x16 pixels each)
 | 
						|
''   y_tiles        - number of y tiles
 | 
						|
''   x_origin       - relative-x center pixel
 | 
						|
''   y_origin       - relative-y center pixel
 | 
						|
''   base_ptr       - base address of bitmap
 | 
						|
 | 
						|
  setcommand(_loop, 0)                                  'make sure last command finished
 | 
						|
 | 
						|
  repeat bases_ptr from 0 to x_tiles - 1 <# 31          'write bases
 | 
						|
    bases[bases_ptr] := base_ptr + bases_ptr * y_tiles << 6
 | 
						|
 | 
						|
  y_tiles <<= 4                                         'adjust arguments and do setup command
 | 
						|
  y_origin := y_tiles - y_origin - 1
 | 
						|
  bases_ptr := @bases
 | 
						|
  slices_ptr := @slices
 | 
						|
  setcommand(_setup, @x_tiles)
 | 
						|
 | 
						|
  bitmap_base := base_ptr                               'retain high-level bitmap data
 | 
						|
  bitmap_longs := x_tiles * y_tiles
 | 
						|
 | 
						|
 | 
						|
PUB clear
 | 
						|
 | 
						|
'' Clear bitmap
 | 
						|
 | 
						|
  setcommand(_loop, 0)                                  'make sure last command finished
 | 
						|
 | 
						|
  longfill(bitmap_base, 0, bitmap_longs)                'clear bitmap
 | 
						|
 | 
						|
 | 
						|
PUB copy(dest_ptr)
 | 
						|
 | 
						|
'' Copy bitmap
 | 
						|
'' use for double-buffered display (flicker-free)
 | 
						|
''
 | 
						|
''   dest_ptr       - base address of destination bitmap
 | 
						|
 | 
						|
  setcommand(_loop, 0)                                  'make sure last command finished
 | 
						|
 | 
						|
  longmove(dest_ptr, bitmap_base, bitmap_longs)         'copy bitmap
 | 
						|
 | 
						|
 | 
						|
PUB color(c)
 | 
						|
 | 
						|
'' Set pixel color to two-bit pattern
 | 
						|
''
 | 
						|
''   c              - color code in bits[1..0]
 | 
						|
 | 
						|
  setcommand(_color, @colors[c & 3])                    'set color
 | 
						|
 | 
						|
 | 
						|
PUB width(w) | pixel_passes, r, i, p
 | 
						|
 | 
						|
'' Set pixel width
 | 
						|
'' actual width is w[3..0] + 1
 | 
						|
''
 | 
						|
''   w              - 0..15 for round pixels, 16..31 for square pixels
 | 
						|
 | 
						|
  r := not w & $10                                      'determine pixel shape/width
 | 
						|
  w &= $F
 | 
						|
  pixel_width := w
 | 
						|
  pixel_passes := w >> 1 + 1
 | 
						|
 | 
						|
  setcommand(_width, @w)                                'do width command now to avoid updating slices when busy
 | 
						|
 | 
						|
  p := w ^ $F                                           'update slices to new shape/width
 | 
						|
  repeat i from 0 to w >> 1
 | 
						|
    slices[i] := true >> (p << 1) << (p & $E)
 | 
						|
    if r and pixels[w] & |< i
 | 
						|
      p += 2
 | 
						|
    if r and i == pixel_passes - 2
 | 
						|
      p += 2
 | 
						|
 | 
						|
 | 
						|
PUB colorwidth(c, w)
 | 
						|
 | 
						|
'' Set pixel color and width
 | 
						|
 | 
						|
  color(c)
 | 
						|
  width(w)
 | 
						|
 | 
						|
 | 
						|
PUB plot(x, y)
 | 
						|
 | 
						|
'' Plot point
 | 
						|
''
 | 
						|
''   x,y            - point
 | 
						|
 | 
						|
  setcommand(_plot, @x)
 | 
						|
 | 
						|
 | 
						|
PUB line(x, y)
 | 
						|
 | 
						|
'' Draw a line to point
 | 
						|
''
 | 
						|
''   x,y            - endpoint
 | 
						|
 | 
						|
  setcommand(_line, @x)
 | 
						|
 | 
						|
 | 
						|
PUB arc(x, y, xr, yr, angle, anglestep, steps, arcmode)
 | 
						|
 | 
						|
'' Draw an arc
 | 
						|
''
 | 
						|
''   x,y            - center of arc
 | 
						|
''   xr,yr          - radii of arc
 | 
						|
''   angle          - initial angle in bits[12..0] (0..$1FFF = 0°..359.956°)
 | 
						|
''   anglestep      - angle step in bits[12..0]
 | 
						|
''   steps          - number of steps (0 just leaves (x,y) at initial arc position)
 | 
						|
''   arcmode        - 0: plot point(s)
 | 
						|
''                    1: line to point(s)
 | 
						|
''                    2: line between points
 | 
						|
''                    3: line from point(s) to center
 | 
						|
 | 
						|
  setcommand(_arc, @x)
 | 
						|
 | 
						|
 | 
						|
PUB vec(x, y, vecscale, vecangle, vecdef_ptr)
 | 
						|
 | 
						|
'' Draw a vector sprite
 | 
						|
''
 | 
						|
''   x,y            - center of vector sprite
 | 
						|
''   vecscale       - scale of vector sprite ($100 = 1x)
 | 
						|
''   vecangle       - rotation angle of vector sprite in bits[12..0]
 | 
						|
''   vecdef_ptr     - address of vector sprite definition
 | 
						|
''
 | 
						|
''
 | 
						|
'' Vector sprite definition:
 | 
						|
''
 | 
						|
''    word    $8000|$4000+angle       'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)
 | 
						|
''    word    length                  'vector length
 | 
						|
''    ...                             'more vectors
 | 
						|
''    ...
 | 
						|
''    word    0                       'end of definition
 | 
						|
 | 
						|
  setcommand(_vec, @x)
 | 
						|
 | 
						|
 | 
						|
PUB vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)
 | 
						|
 | 
						|
'' Draw a vector sprite at an arc position
 | 
						|
''
 | 
						|
''   x,y            - center of arc
 | 
						|
''   xr,yr          - radii of arc
 | 
						|
''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
 | 
						|
''   vecscale       - scale of vector sprite ($100 = 1x)
 | 
						|
''   vecangle       - rotation angle of vector sprite in bits[12..0]
 | 
						|
''   vecdef_ptr     - address of vector sprite definition
 | 
						|
 | 
						|
  setcommand(_vecarc, @x)
 | 
						|
 | 
						|
 | 
						|
PUB pix(x, y, pixrot, pixdef_ptr)
 | 
						|
 | 
						|
'' Draw a pixel sprite
 | 
						|
''
 | 
						|
''   x,y            - center of vector sprite
 | 
						|
''   pixrot         - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror
 | 
						|
''   pixdef_ptr     - address of pixel sprite definition
 | 
						|
''
 | 
						|
''
 | 
						|
'' Pixel sprite definition:
 | 
						|
''
 | 
						|
''    word                            'word align, express dimensions and center, define pixels
 | 
						|
''    byte    xwords, ywords, xorigin, yorigin
 | 
						|
''    word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
''    word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
''    word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
''    ...
 | 
						|
 | 
						|
  setcommand(_pix, @x)
 | 
						|
 | 
						|
 | 
						|
PUB pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)
 | 
						|
 | 
						|
'' Draw a pixel sprite at an arc position
 | 
						|
''
 | 
						|
''   x,y            - center of arc
 | 
						|
''   xr,yr          - radii of arc
 | 
						|
''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
 | 
						|
''   pixrot         - 0: 0°, 1: 90°, 2: 180°, 3: 270°, +4: mirror
 | 
						|
''   pixdef_ptr     - address of pixel sprite definition
 | 
						|
 | 
						|
  setcommand(_pixarc, @x)
 | 
						|
 | 
						|
 | 
						|
PUB text(x, y, string_ptr) | justx, justy
 | 
						|
 | 
						|
'' Draw text
 | 
						|
''
 | 
						|
''   x,y            - text position (see textmode for sizing and justification)
 | 
						|
''   string_ptr     - address of zero-terminated string (it may be necessary to call .finish
 | 
						|
''                    immediately afterwards to prevent subsequent code from clobbering the
 | 
						|
''                    string as it is being drawn
 | 
						|
 | 
						|
  justify(string_ptr, @justx)                           'justify string and draw text
 | 
						|
  setcommand(_text, @x)
 | 
						|
 | 
						|
 | 
						|
PUB textarc(x, y, xr, yr, angle, string_ptr) | justx, justy
 | 
						|
 | 
						|
'' Draw text at an arc position
 | 
						|
''
 | 
						|
''   x,y            - center of arc
 | 
						|
''   xr,yr          - radii of arc
 | 
						|
''   angle          - angle in bits[12..0] (0..$1FFF = 0°..359.956°)
 | 
						|
''   string_ptr     - address of zero-terminated string (it may be necessary to call .finish
 | 
						|
''                    immediately afterwards to prevent subsequent code from clobbering the
 | 
						|
''                    string as it is being drawn
 | 
						|
 | 
						|
  justify(string_ptr, @justx)                           'justify string and draw text
 | 
						|
  setcommand(_textarc, @x)
 | 
						|
 | 
						|
 | 
						|
PUB textmode(x_scale, y_scale, spacing, justification)
 | 
						|
 | 
						|
'' Set text size and justification
 | 
						|
''
 | 
						|
''   x_scale        - x character scale, should be 1+
 | 
						|
''   y_scale        - y character scale, should be 1+
 | 
						|
''   spacing        - character spacing, 6 is normal
 | 
						|
''   justification  - bits[1..0]: 0..3 = left, center, right, left
 | 
						|
''                    bits[3..2]: 0..3 = bottom, center, top, bottom
 | 
						|
 | 
						|
  longmove(@text_xs, @x_scale, 4)                       'retain high-level text data
 | 
						|
 
 | 
						|
  setcommand(_textmode, @x_scale)                       'set text mode
 | 
						|
 | 
						|
 | 
						|
PUB box(x, y, box_width, box_height) | x2, y2, pmin, pmax 
 | 
						|
 | 
						|
'' Draw a box with round/square corners, according to pixel width
 | 
						|
''
 | 
						|
''   x,y            - box left, box bottom
 | 
						|
 | 
						|
  if box_width > pixel_width and box_height > pixel_width
 | 
						|
 | 
						|
    pmax := pixel_width - (pmin := pixel_width >> 1)    'get pixel-half-min and pixel-half-max
 | 
						|
 | 
						|
    x += pmin                                           'adjust coordinates to accomodate width
 | 
						|
    y += pmin
 | 
						|
    x2 := x + box_width - 1 - pixel_width
 | 
						|
    y2 := y + box_height - 1 - pixel_width
 | 
						|
 | 
						|
    plot(x, y)                                          'plot round/square corners
 | 
						|
    plot(x, y2)
 | 
						|
    plot(x2, y)
 | 
						|
    plot(x2, y2)
 | 
						|
 | 
						|
    fill(x, y2 + pmax, 0, (x2 - x) << 16, 0, 0, pmax)   'fill gaps
 | 
						|
    fill(x, y, 0, (x2 - x) << 16, 0, 0, pmin)
 | 
						|
    fill(x - pmin, y2, 0, (x2 - x + pixel_width) << 16, 0, 0, y2 - y)
 | 
						|
 | 
						|
 | 
						|
PUB quad(x1, y1, x2, y2, x3, y3, x4, y4)
 | 
						|
 | 
						|
'' Draw a solid quadrilateral
 | 
						|
'' vertices must be ordered clockwise or counter-clockwise
 | 
						|
 | 
						|
  tri(x1, y1, x2, y2, x3, y3)                           'draw two triangle to make 4-sides polygon
 | 
						|
  tri(x3, y3, x4, y4, x1, y1)
 | 
						|
 | 
						|
 | 
						|
PUB tri(x1, y1, x2, y2, x3, y3) | xy[2]
 | 
						|
 | 
						|
'' Draw a solid triangle
 | 
						|
 | 
						|
' reorder vertices by descending y
 | 
						|
 | 
						|
  case (y1 => y2) & %100 | (y2 => y3) & %010 | (y1 => y3) & %001
 | 
						|
    %000:
 | 
						|
      longmove(@xy, @x1, 2)
 | 
						|
      longmove(@x1, @x3, 2)
 | 
						|
      longmove(@x3, @xy, 2)
 | 
						|
    %010:
 | 
						|
      longmove(@xy, @x1, 2)
 | 
						|
      longmove(@x1, @x2, 4)
 | 
						|
      longmove(@x3, @xy, 2)
 | 
						|
    %011:
 | 
						|
      longmove(@xy, @x1, 2)
 | 
						|
      longmove(@x1, @x2, 2)
 | 
						|
      longmove(@x2, @xy, 2)
 | 
						|
    %100:
 | 
						|
      longmove(@xy, @x3, 2)
 | 
						|
      longmove(@x2, @x1, 4)
 | 
						|
      longmove(@x1, @xy, 2)
 | 
						|
    %101:
 | 
						|
      longmove(@xy, @x2, 2)
 | 
						|
      longmove(@x2, @x3, 2)
 | 
						|
      longmove(@x3, @xy, 2)
 | 
						|
 | 
						|
' draw triangle
 | 
						|
 | 
						|
  fill(x1, y1, (x3 - x1) << 16 / (y1 - y3 + 1), (x2 - x1) << 16 / (y1 - y2 + 1), (x3 - x2) << 16 / (y2 - y3 + 1), y1 - y2, y1 - y3)
 | 
						|
 | 
						|
 | 
						|
PUB finish
 | 
						|
 | 
						|
'' Wait for any current graphics command to finish
 | 
						|
'' use this to insure that it is safe to manually manipulate the bitmap
 | 
						|
 | 
						|
  setcommand(_loop, 0)                                  'make sure last command finished
 | 
						|
 | 
						|
 | 
						|
PRI fill(x, y, da, db, db2, linechange, lines_minus_1)
 | 
						|
 | 
						|
  setcommand(_fill, @x)
 | 
						|
 | 
						|
 | 
						|
PRI justify(string_ptr, justptr) | x
 | 
						|
 | 
						|
  x := (strsize(string_ptr) - 1) * text_xs * text_sp + text_xs * 5 - 1
 | 
						|
  long[justptr] := -lookupz(text_just >> 2 & 3: 0, x >> 1, x, 0)
 | 
						|
  long[justptr][1] := -lookupz(text_just & 3: 0, text_ys << 3, text_ys << 4, 0)
 | 
						|
 | 
						|
 | 
						|
PRI setcommand(cmd, argptr)
 | 
						|
 | 
						|
  command := cmd << 16 + argptr                         'write command and pointer
 | 
						|
  repeat while command                                  'wait for command to be cleared, signifying receipt
 | 
						|
 | 
						|
 | 
						|
CON
 | 
						|
 | 
						|
  ' Vector font primitives
 | 
						|
 | 
						|
  xa0   = %000 << 0             'x line start / arc center
 | 
						|
  xa1   = %001 << 0
 | 
						|
  xa2   = %010 << 0
 | 
						|
  xa3   = %011 << 0
 | 
						|
  xa4   = %100 << 0
 | 
						|
  xa5   = %101 << 0
 | 
						|
  xa6   = %110 << 0
 | 
						|
  xa7   = %111 << 0
 | 
						|
 | 
						|
  ya0   = %0000 << 3            'y line start / arc center
 | 
						|
  ya1   = %0001 << 3
 | 
						|
  ya2   = %0010 << 3
 | 
						|
  ya3   = %0011 << 3
 | 
						|
  ya4   = %0100 << 3
 | 
						|
  ya5   = %0101 << 3
 | 
						|
  ya6   = %0110 << 3
 | 
						|
  ya7   = %0111 << 3
 | 
						|
  ya8   = %1000 << 3
 | 
						|
  ya9   = %1001 << 3
 | 
						|
  yaA   = %1010 << 3
 | 
						|
  yaB   = %1011 << 3
 | 
						|
  yaC   = %1100 << 3
 | 
						|
  yaD   = %1101 << 3
 | 
						|
  yaE   = %1110 << 3
 | 
						|
  yaF   = %1111 << 3
 | 
						|
 | 
						|
  xb0   = %000 << 7             'x line end
 | 
						|
  xb1   = %001 << 7
 | 
						|
  xb2   = %010 << 7
 | 
						|
  xb3   = %011 << 7
 | 
						|
  xb4   = %100 << 7
 | 
						|
  xb5   = %101 << 7
 | 
						|
  xb6   = %110 << 7
 | 
						|
  xb7   = %111 << 7
 | 
						|
 | 
						|
  yb0   = %0000 << 10           'y line end
 | 
						|
  yb1   = %0001 << 10
 | 
						|
  yb2   = %0010 << 10
 | 
						|
  yb3   = %0011 << 10
 | 
						|
  yb4   = %0100 << 10
 | 
						|
  yb5   = %0101 << 10
 | 
						|
  yb6   = %0110 << 10
 | 
						|
  yb7   = %0111 << 10
 | 
						|
  yb8   = %1000 << 10
 | 
						|
  yb9   = %1001 << 10
 | 
						|
  ybA   = %1010 << 10
 | 
						|
  ybB   = %1011 << 10
 | 
						|
  ybC   = %1100 << 10
 | 
						|
  ybD   = %1101 << 10
 | 
						|
  ybE   = %1110 << 10
 | 
						|
  ybF   = %1111 << 10
 | 
						|
 | 
						|
  ax1   = %0 << 7               'x arc radius
 | 
						|
  ax2   = %1 << 7
 | 
						|
 | 
						|
  ay1   = %00 << 8              'y arc radius
 | 
						|
  ay2   = %01 << 8
 | 
						|
  ay3   = %10 << 8
 | 
						|
  ay4   = %11 << 8
 | 
						|
 | 
						|
  a0    = %0000 << 10           'arc start/length
 | 
						|
  a1    = %0001 << 10           'bits[1..0] = start (0..3 = 0°, 90°, 180°, 270°)
 | 
						|
  a2    = %0010 << 10           'bits[3..2] = length (0..3 = 360°, 270°, 180°, 90°)
 | 
						|
  a3    = %0011 << 10
 | 
						|
  a4    = %0100 << 10
 | 
						|
  a5    = %0101 << 10
 | 
						|
  a6    = %0110 << 10
 | 
						|
  a7    = %0111 << 10
 | 
						|
  a8    = %1000 << 10
 | 
						|
  a9    = %1001 << 10
 | 
						|
  aA    = %1010 << 10
 | 
						|
  aB    = %1011 << 10
 | 
						|
  aC    = %1100 << 10
 | 
						|
  aD    = %1101 << 10
 | 
						|
  aE    = %1110 << 10
 | 
						|
  aF    = %1111 << 10
 | 
						|
 | 
						|
  fline = %0 << 14              'line command
 | 
						|
  farc  = %1 << 14              'arc command
 | 
						|
 | 
						|
  more  = %1 << 15              'another arc/line
 | 
						|
 | 
						|
 | 
						|
DAT
 | 
						|
 | 
						|
' Color codes
 | 
						|
 | 
						|
colors  long    %%0000000000000000
 | 
						|
        long    %%1111111111111111
 | 
						|
        long    %%2222222222222222
 | 
						|
        long    %%3333333333333333
 | 
						|
 | 
						|
' Round pixel recipes
 | 
						|
 | 
						|
pixels  byte    %00000000,%00000000,%00000000,%00000000         '0,1,2,3
 | 
						|
        byte    %00000000,%00000000,%00000010,%00000101         '4,5,6,7
 | 
						|
        byte    %00001010,%00001010,%00011010,%00011010         '8,9,A,B
 | 
						|
        byte    %00110100,%00111010,%01110100,%01110100         'C,D,E,F
 | 
						|
 | 
						|
' Vector font - standard ascii characters ($21-$7E)
 | 
						|
 | 
						|
font    word    fline + xa2 + yaC + xb2 + yb7 + more            '!
 | 
						|
        word    fline + xa2 + ya5 + xb2 + yb4
 | 
						|
 | 
						|
        word    fline + xa1 + yaD + xb1 + ybC + more            '"
 | 
						|
        word    fline + xa3 + yaD + xb3 + ybC
 | 
						|
 | 
						|
        word    fline + xa1 + yaA + xb1 + yb6 + more            '#
 | 
						|
        word    fline + xa3 + yaA + xb3 + yb6 + more
 | 
						|
        word    fline + xa0 + ya9 + xb4 + yb9 + more
 | 
						|
        word    fline + xa0 + ya7 + xb4 + yb7
 | 
						|
 | 
						|
        word    farc + xa2 + ya9 + a9 + ax2 + ay1 + more        '$
 | 
						|
        word    farc + xa2 + ya7 + aB + ax2 + ay1 + more
 | 
						|
        word    fline + xa0 + ya6 + xb2 + yb6 + more
 | 
						|
        word    fline + xa2 + yaA + xb4 + ybA + more
 | 
						|
        word    fline + xa2 + yaA + xb2 + ybB + more
 | 
						|
        word    fline + xa2 + ya6 + xb2 + yb5
 | 
						|
 | 
						|
        word    farc + xa1 + yaA + a0 + ax1 + ay1 + more        '%
 | 
						|
        word    farc + xa3 + ya6 + a0 + ax1 + ay1 + more
 | 
						|
        word    fline + xa0 + ya6 + xb4 + ybA
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a7 + ax1 + ay1 + more        '&
 | 
						|
        word    farc + xa2 + ya7 + a5 + ax2 + ay2 + more
 | 
						|
        word    fline + xa1 + yaA + xb4 + yb5
 | 
						|
 | 
						|
        word    fline + xa2 + yaD + xb2 + ybC                   ' '
 | 
						|
 | 
						|
        word    farc + xa3 + ya9 + aD + ax1 + ay4 + more        '(
 | 
						|
        word    farc + xa3 + ya7 + aE + ax1 + ay4 + more
 | 
						|
        word    fline + xa2 + ya7 + xb2 + yb9
 | 
						|
 | 
						|
        word    farc + xa1 + ya9 + aC + ax1 + ay4 + more        ')
 | 
						|
        word    farc + xa1 + ya7 + aF + ax1 + ay4 + more
 | 
						|
        word    fline + xa2 + ya7 + xb2 + yb9
 | 
						|
 | 
						|
        word    fline + xa4 + ya6 + xb0 + ybA + more            '*
 | 
						|
        word    fline + xa0 + ya6 + xb4 + ybA + more
 | 
						|
        word    fline + xa2 + yaB + xb2 + yb5
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8 + more            '+
 | 
						|
        word    fline + xa2 + yaA + xb2 + yb6
 | 
						|
 | 
						|
        word    fline + xa2 + ya4 + xb1 + yb3                   ',
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8                   '-
 | 
						|
 | 
						|
        word    fline + xa2 + ya5 + xb2 + yb4                   '.
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb4 + ybC                   '/
 | 
						|
 | 
						|
        word    farc + xa2 + ya8 + a0 + ax2 + ay4               '0
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4 + more            '1
 | 
						|
        word    fline + xa2 + ya4 + xb2 + ybC + more
 | 
						|
        word    fline + xa0 + yaA + xb2 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        '2
 | 
						|
        word    farc + xa2 + yaA + aF + ax2 + ay3 + more
 | 
						|
        word    farc + xa2 + ya4 + aD + ax2 + ay3 + more
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a7 + ax2 + ay2 + more        '3
 | 
						|
        word    farc + xa2 + ya6 + a6 + ax2 + ay2
 | 
						|
 | 
						|
        word    fline + xa2 + yaC + xb0 + yb7 + more            '4
 | 
						|
        word    fline + xa0 + ya7 + xb4 + yb7 + more
 | 
						|
        word    fline + xa3 + ya4 + xb3 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + aB + ax2 + ay2 + more        '5
 | 
						|
        word    fline + xa4 + yaC + xb0 + ybC + more
 | 
						|
        word    fline + xa0 + yaC + xb0 + yb8 + more
 | 
						|
        word    fline + xa0 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa0 + ya4 + xb2 + yb4
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        '6
 | 
						|
        word    farc + xa2 + ya8 + aD + ax2 + ay4 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + yb8 + more
 | 
						|
        word    fline + xa2 + yaC + xb3 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC + more            '7
 | 
						|
        word    fline + xa1 + ya4 + xb4 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        '8
 | 
						|
        word    farc + xa2 + yaA + a0 + ax2 + ay2
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a0 + ax2 + ay2 + more        '9
 | 
						|
        word    farc + xa2 + ya8 + aF + ax2 + ay4 + more
 | 
						|
        word    fline + xa4 + ya8 + xb4 + ybA + more
 | 
						|
        word    fline + xa1 + ya4 + xb2 + yb4
 | 
						|
 | 
						|
        word    fline + xa2 + ya6 + xb2 + yb7 + more            ':
 | 
						|
        word    fline + xa2 + yaA + xb2 + yb9
 | 
						|
 | 
						|
        word    fline + xa2 + ya4 + xb1 + yb3 + more            ';
 | 
						|
        word    fline + xa2 + ya8 + xb2 + yb7
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb4 + ybA + more            '<
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb6
 | 
						|
 | 
						|
        word    fline + xa0 + yaA + xb4 + ybA + more            '=
 | 
						|
        word    fline + xa0 + ya6 + xb4 + yb6
 | 
						|
 | 
						|
        word    fline + xa4 + ya8 + xb0 + ybA + more            '>
 | 
						|
        word    fline + xa4 + ya8 + xb0 + yb6
 | 
						|
 | 
						|
        word    farc + xa2 + yaB + a8 + ax2 + ay1 + more        '?
 | 
						|
        word    farc + xa3 + yaB + aF + ax1 + ay2 + more
 | 
						|
        word    farc + xa3 + ya7 + aD + ax1 + ay2 + more
 | 
						|
        word    fline + xa2 + ya5 + xb2 + yb4
 | 
						|
 | 
						|
        word    farc + xa2 + ya8 + a0 + ax1 + ay1 + more        '@
 | 
						|
        word    farc + xa2 + ya8 + a4 + ax2 + ay3 + more
 | 
						|
        word    farc + xa3 + ya8 + aF + ax1 + ay1 + more
 | 
						|
        word    farc + xa2 + ya6 + aF + ax2 + ay1 + more
 | 
						|
        word    fline + xa3 + ya7 + xb3 + yb9
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'A
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybA + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + ybA + more
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'B
 | 
						|
        word    farc + xa2 + ya6 + aB + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more
 | 
						|
        word    fline + xa0 + ya4 + xb2 + yb4 + more
 | 
						|
        word    fline + xa0 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa0 + yaC + xb2 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'C
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + ybA
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + aC + ax2 + ay2 + more        'D
 | 
						|
        word    farc + xa2 + ya6 + aF + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more
 | 
						|
        word    fline + xa4 + ya6 + xb4 + ybA + more
 | 
						|
        word    fline + xa0 + ya4 + xb2 + yb4 + more
 | 
						|
        word    fline + xa0 + yaC + xb2 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'E
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4 + more
 | 
						|
        word    fline + xa0 + ya8 + xb3 + yb8 + more
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'F
 | 
						|
        word    fline + xa0 + ya8 + xb3 + yb8 + more
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'G
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + ybA + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb7 + more
 | 
						|
        word    fline + xa3 + ya7 + xb4 + yb7
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'H
 | 
						|
        word    fline + xa4 + ya4 + xb4 + ybC + more
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8
 | 
						|
 | 
						|
        word    fline + xa2 + ya4 + xb2 + ybC + more            'I
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4 + more
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'J
 | 
						|
        word    fline + xa4 + ya6 + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'K
 | 
						|
        word    fline + xa4 + yaC + xb0 + yb8 + more
 | 
						|
        word    fline + xa4 + ya4 + xb0 + yb8
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'L
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'M
 | 
						|
        word    fline + xa4 + ya4 + xb4 + ybC + more
 | 
						|
        word    fline + xa2 + ya8 + xb0 + ybC + more
 | 
						|
        word    fline + xa2 + ya8 + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'N
 | 
						|
        word    fline + xa4 + ya4 + xb4 + ybC + more
 | 
						|
        word    fline + xa4 + ya4 + xb0 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        '0
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + ybA + more
 | 
						|
        word    fline + xa4 + ya6 + xb4 + ybA
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'P
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more
 | 
						|
        word    fline + xa0 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa0 + yaC + xb2 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a8 + ax2 + ay2 + more        'Q
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + ybA + more
 | 
						|
        word    fline + xa4 + ya6 + xb4 + ybA + more
 | 
						|
        word    fline + xa2 + ya6 + xb4 + yb3
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + aB + ax2 + ay2 + more        'R
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more
 | 
						|
        word    fline + xa0 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa0 + yaC + xb2 + ybC + more
 | 
						|
        word    fline + xa4 + ya4 + xb2 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + yaA + a4 + ax2 + ay2 + more        'S
 | 
						|
        word    farc + xa2 + ya6 + a6 + ax2 + ay2
 | 
						|
 | 
						|
        word    fline + xa2 + ya4 + xb2 + ybC + more            'T
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'U
 | 
						|
        word    fline + xa0 + ya6 + xb0 + ybC + more
 | 
						|
        word    fline + xa4 + ya6 + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa2 + ya4 + xb0 + ybC + more            'V
 | 
						|
        word    fline + xa2 + ya4 + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + yaC + xb0 + yb4 + more            'W
 | 
						|
        word    fline + xa4 + yaC + xb4 + yb4 + more
 | 
						|
        word    fline + xa2 + ya8 + xb0 + yb4 + more
 | 
						|
        word    fline + xa2 + ya8 + xb4 + yb4
 | 
						|
 | 
						|
        word    fline + xa4 + ya4 + xb0 + ybC + more            'X
 | 
						|
        word    fline + xa0 + ya4 + xb4 + ybC
 | 
						|
 | 
						|
        word    fline + xa0 + yaC + xb2 + yb8 + more            'Y
 | 
						|
        word    fline + xa4 + yaC + xb2 + yb8 + more
 | 
						|
        word    fline + xa2 + ya4 + xb2 + yb8
 | 
						|
 | 
						|
        word    fline + xa0 + yaC + xb4 + ybC + more            'Z
 | 
						|
        word    fline + xa0 + ya4 + xb4 + ybC + more
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    fline + xa2 + yaD + xb2 + yb3 + more            '[
 | 
						|
        word    fline + xa2 + yaD + xb4 + ybD + more
 | 
						|
        word    fline + xa2 + ya3 + xb4 + yb3
 | 
						|
 | 
						|
        word    fline + xa4 + ya4 + xb0 + ybC                   '\
 | 
						|
 | 
						|
        word    fline + xa2 + yaD + xb2 + yb3 + more            '[
 | 
						|
        word    fline + xa2 + yaD + xb0 + ybD + more
 | 
						|
        word    fline + xa2 + ya3 + xb0 + yb3
 | 
						|
 | 
						|
        word    fline + xa2 + yaA + xb0 + yb6 + more            '^
 | 
						|
        word    fline + xa2 + yaA + xb4 + yb6
 | 
						|
 | 
						|
        word    fline + xa0 + ya1 + xa4 + yb1                   '_
 | 
						|
 | 
						|
        word    fline + xa1 + ya9 + xb3 + yb7                   '`
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'a
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'b
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a9 + ax2 + ay2 + more        'c
 | 
						|
        word    fline + xa2 + ya4 + xb4 + yb4 + more
 | 
						|
        word    fline + xa2 + ya8 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'd
 | 
						|
        word    fline + xa4 + ya4 + xb4 + ybC
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a4 + ax2 + ay2 + more        'e
 | 
						|
        word    fline + xa0 + ya6 + xb4 + yb6 + more
 | 
						|
        word    fline + xa2 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    farc + xa4 + yaA + aD + ax2 + ay2 + more        'f
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8 + more
 | 
						|
        word    fline + xa2 + ya4 + xb2 + ybA
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'g
 | 
						|
        word    farc + xa2 + ya3 + aF + ax2 + ay2 + more
 | 
						|
        word    fline + xa4 + ya3 + xb4 + yb8 + more
 | 
						|
        word    fline + xa1 + ya1 + xb2 + yb1
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a8 + ax2 + ay2 + more        'h
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb6
 | 
						|
 | 
						|
        word    fline + xa1 + ya4 + xb3 + yb4 + more            'i
 | 
						|
        word    fline + xa2 + ya4 + xb2 + yb8 + more
 | 
						|
        word    fline + xa1 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa2 + yaB + xb2 + ybA
 | 
						|
 | 
						|
        word    farc + xa0 + ya3 + aF + ax2 + ay2 + more        'j
 | 
						|
        word    fline + xa2 + ya3 + xb2 + yb8 + more
 | 
						|
        word    fline + xa1 + ya8 + xb2 + yb8 + more
 | 
						|
        word    fline + xa2 + yaB + xb2 + ybA
 | 
						|
 | 
						|
        word    fline + xa0 + ya4 + xb0 + ybC + more            'k
 | 
						|
        word    fline + xa0 + ya6 + xb2 + yb6 + more
 | 
						|
        word    fline + xa2 + ya6 + xb4 + yb8 + more
 | 
						|
        word    fline + xa2 + ya6 + xb4 + yb4
 | 
						|
 | 
						|
        word    fline + xa1 + ya4 + xb3 + yb4 + more            'l
 | 
						|
        word    fline + xa2 + ya4 + xb2 + ybC + more
 | 
						|
        word    fline + xa1 + yaC + xb2 + ybC
 | 
						|
 | 
						|
        word    farc + xa1 + ya7 + a8 + ax1 + ay1 + more        'm
 | 
						|
        word    farc + xa3 + ya7 + a8 + ax1 + ay1 + more
 | 
						|
        word    fline + xa0 + ya4 + xb0 + yb8 + more
 | 
						|
        word    fline + xa2 + ya4 + xb2 + yb7 + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb7
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a8 + ax2 + ay2 + more        'n
 | 
						|
        word    fline + xa0 + ya4 + xb0 + yb8 + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb6
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2               'o
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'p
 | 
						|
        word    fline + xa0 + ya1 + xb0 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + a0 + ax2 + ay2 + more        'q
 | 
						|
        word    fline + xa4 + ya1 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya7 + a8 + ax2 + ay1 + more        'r
 | 
						|
        word    fline + xa0 + ya4 + xb0 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya7 + a9 + ax2 + ay1 + more        's
 | 
						|
        word    farc + xa2 + ya5 + aB + ax2 + ay1 + more
 | 
						|
        word    fline + xa0 + ya4 + xb2 + yb4 + more
 | 
						|
        word    fline + xa2 + ya8 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa4 + ya6 + aE + ax2 + ay2 + more        't
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8 + more
 | 
						|
        word    fline + xa2 + ya6 + xb2 + ybA
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'u
 | 
						|
        word    fline + xa0 + ya6 + xb0 + yb8 + more
 | 
						|
        word    fline + xa4 + ya4 + xb4 + yb8
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb2 + yb4 + more            'v
 | 
						|
        word    fline + xa4 + ya8 + xb2 + yb4
 | 
						|
 | 
						|
        word    farc + xa1 + ya5 + aA + ax1 + ay1 + more        'w
 | 
						|
        word    farc + xa3 + ya5 + aA + ax1 + ay1 + more
 | 
						|
        word    fline + xa0 + ya5 + xb0 + yb8 + more
 | 
						|
        word    fline + xa2 + ya5 + xb2 + yb6 + more
 | 
						|
        word    fline + xa4 + ya5 + xb4 + yb8
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb4 + more            'x
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb8
 | 
						|
 | 
						|
        word    farc + xa2 + ya6 + aA + ax2 + ay2 + more        'y
 | 
						|
        word    farc + xa2 + ya3 + aF + ax2 + ay2 + more
 | 
						|
        word    fline + xa4 + ya3 + xb4 + yb8 + more
 | 
						|
        word    fline + xa0 + ya6 + xb0 + yb8 + more
 | 
						|
        word    fline + xa1 + ya1 + xb2 + yb1
 | 
						|
 | 
						|
        word    fline + xa0 + ya8 + xb4 + yb8 + more            'z
 | 
						|
        word    fline + xa4 + ya8 + xb0 + yb4 + more
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    farc + xa3 + yaA + aD + ax1 + ay3 + more        '{
 | 
						|
        word    farc + xa1 + ya6 + aC + ax1 + ay2 + more
 | 
						|
        word    farc + xa1 + yaA + aF + ax1 + ay2 + more
 | 
						|
        word    farc + xa3 + ya6 + aE + ax1 + ay3
 | 
						|
 | 
						|
        word    fline + xa2 + ya3 + xb2 + ybD                   '|
 | 
						|
 | 
						|
        word    farc + xa1 + yaA + aC + ax1 + ay3 + more        '}
 | 
						|
        word    farc + xa3 + ya6 + aD + ax1 + ay2 + more
 | 
						|
        word    farc + xa3 + yaA + aE + ax1 + ay2 + more
 | 
						|
        word    farc + xa1 + ya6 + aF + ax1 + ay3
 | 
						|
 | 
						|
        word    farc + xa1 + ya8 + a8 + ax1 + ay1 + more        '~
 | 
						|
        word    farc + xa3 + ya8 + aA + ax1 + ay1
 | 
						|
 | 
						|
' Vector font - custom characters ($7F+)
 | 
						|
 | 
						|
        word    fline + xa2 + ya9 + xb0 + yb4 + more            'delta
 | 
						|
        word    fline + xa2 + ya9 + xb4 + yb4 + more
 | 
						|
        word    fline + xa0 + ya4 + xb4 + yb4
 | 
						|
 | 
						|
        word    farc + xa2 + ya7 + a8 + ax2 + ay2 + more        'omega
 | 
						|
        word    farc + xa1 + ya7 + aE + ax1 + ay2 + more
 | 
						|
        word    farc + xa3 + ya7 + aF + ax1 + ay2 + more
 | 
						|
        word    fline + xa1 + ya5 + xb1 + yb4 + more
 | 
						|
        word    fline + xa3 + ya5 + xb3 + yb4 + more
 | 
						|
        word    fline + xa0 + ya4 + xb1 + yb4 + more
 | 
						|
        word    fline + xa4 + ya4 + xb3 + yb4
 | 
						|
 | 
						|
        word    farc + xa2 + ya8 + a0 + ax1 + ay1               'bullet
 | 
						|
 | 
						|
CON     fx = 3  'number of custom characters
 | 
						|
 | 
						|
DAT
 | 
						|
 | 
						|
'*************************************
 | 
						|
'* Assembly language graphics driver *
 | 
						|
'*************************************
 | 
						|
 | 
						|
                        org
 | 
						|
'
 | 
						|
'
 | 
						|
' Graphics driver - main loop
 | 
						|
'
 | 
						|
loop                    rdlong  t1,par          wz      'wait for command
 | 
						|
        if_z            jmp     #loop
 | 
						|
 | 
						|
                        movd    :arg,#arg0              'get 8 arguments
 | 
						|
                        mov     t2,t1
 | 
						|
                        mov     t3,#8
 | 
						|
:arg                    rdlong  arg0,t2
 | 
						|
                        add     :arg,d0
 | 
						|
                        add     t2,#4
 | 
						|
                        djnz    t3,#:arg
 | 
						|
 | 
						|
                        wrlong  zero,par                'zero command to signify received
 | 
						|
 | 
						|
                        call    #setd                   'set dx,dy from arg0,arg1
 | 
						|
 | 
						|
                        ror     t1,#16+2                'lookup command address
 | 
						|
                        add     t1,#jumps
 | 
						|
                        movs    :table,t1
 | 
						|
                        rol     t1,#2
 | 
						|
                        shl     t1,#3
 | 
						|
:table                  mov     t2,0
 | 
						|
                        shr     t2,t1
 | 
						|
                        and     t2,#$FF
 | 
						|
                        jmp     t2                      'jump to command
 | 
						|
 | 
						|
 | 
						|
jumps                   byte    0                       '0
 | 
						|
                        byte    setup_                  '1
 | 
						|
                        byte    color_                  '2
 | 
						|
                        byte    width_                  '3
 | 
						|
                        byte    plot_                   '4
 | 
						|
                        byte    line_                   '5
 | 
						|
                        byte    arc_                    '6
 | 
						|
                        byte    vec_                    '7
 | 
						|
                        byte    vecarc_                 '8
 | 
						|
                        byte    pix_                    '9
 | 
						|
                        byte    pixarc_                 'A
 | 
						|
                        byte    text_                   'B
 | 
						|
                        byte    textarc_                'C
 | 
						|
                        byte    textmode_               'D
 | 
						|
                        byte    fill_                   'E
 | 
						|
                        byte    loop                    'F
 | 
						|
'
 | 
						|
'
 | 
						|
' setup(x_tiles, y_tiles*16, x_origin, y_origin, base_ptr)  bases_ptr, slices_ptr
 | 
						|
'
 | 
						|
setup_                  mov     xlongs,arg0             'set xlongs, ylongs
 | 
						|
                        mov     ylongs,arg1
 | 
						|
                        mov     xorigin,arg2            'set xorigin, yorigin
 | 
						|
                        mov     yorigin,arg3
 | 
						|
                        mov     basesptr,arg5           'set pointers
 | 
						|
                        mov     slicesptr,arg6
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' color(c)
 | 
						|
'
 | 
						|
color_                  mov     pcolor,arg0             'set pixel color
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' width(w)  pixel_passes
 | 
						|
'
 | 
						|
width_                  mov     pwidth,arg0             'set pixel width
 | 
						|
                        mov     passes,arg1             'set pixel passes
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' plot(x, y)
 | 
						|
'
 | 
						|
plot_                   call    #plotd
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' line(x, y)
 | 
						|
'
 | 
						|
line_                   call    #linepd
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' arc(x, y, xr, yr, angle, anglestep, iterations, mode)
 | 
						|
'
 | 
						|
arc_                    and     arg7,#3                 'limit mode
 | 
						|
 | 
						|
:loop                   call    #arca                   'get arc dx,dy
 | 
						|
 | 
						|
                        cmp     arg7,#1         wz      'if not mode 1, set px,py
 | 
						|
        if_nz           mov     px,dx
 | 
						|
        if_nz           mov     py,dy
 | 
						|
 | 
						|
                        tjz     arg6,#loop              'if no points exit with new px,py
 | 
						|
 | 
						|
                        cmp     arg7,#3         wz      'if mode 3, set center
 | 
						|
        if_z            call    #setd
 | 
						|
 | 
						|
                        test    arg7,#1         wz      'if mode 0 or 2, plot point
 | 
						|
        if_z            call    #plotp
 | 
						|
 | 
						|
                        test    arg7,#1         wz      'if mode 1 or 3, plot line
 | 
						|
        if_nz           call    #linepd
 | 
						|
 | 
						|
                        cmp     arg7,#2         wz      'if mode 2, set mode 1
 | 
						|
        if_z            mov     arg7,#1
 | 
						|
 | 
						|
                        add     arg4,arg5               'step angle
 | 
						|
                        djnz    arg6,#:loop             'loop if more iterations
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' vec(x, y, vecscale, vecangle, vecdef_ptr)
 | 
						|
' vecarc(x, y, xr, yr, angle, vecscale, vecangle, vecdef_ptr)
 | 
						|
'
 | 
						|
' vecdef:       word    $8000/$4000+angle       'vector mode + 13-bit angle (mode: $4000=plot, $8000=line)
 | 
						|
'               word    length                  'vector length
 | 
						|
'               ...                             'more vectors
 | 
						|
'               ...
 | 
						|
'               word    0                       'end of definition
 | 
						|
'
 | 
						|
vecarc_                 call    #arcmod
 | 
						|
 | 
						|
vec_                    tjz     arg2,#loop              'if scale 0, exit
 | 
						|
 | 
						|
:loop                   rdword  t7,arg4         wz      'get vector mode+angle
 | 
						|
                        add     arg4,#2
 | 
						|
 | 
						|
        if_z            jmp     #loop                   'if mode+angle 0, exit
 | 
						|
 | 
						|
                        rdword  t1,arg4                 'get vector length
 | 
						|
                        add     arg4,#2
 | 
						|
 | 
						|
                        abs     t2,arg2         wc      'add/sub vector angle to/from angle
 | 
						|
                        mov     t6,arg3
 | 
						|
                        sumc    t6,t7
 | 
						|
 | 
						|
                        call    #multiply               'multiply length by scale
 | 
						|
                        add     t1,#$80                 'round up 1/2 lsb
 | 
						|
                        shr     t1,#8
 | 
						|
 | 
						|
                        mov     t4,t1                   'get arc dx,dy
 | 
						|
                        mov     t5,t1
 | 
						|
                        call    #arcd
 | 
						|
 | 
						|
                        test    t7,h8000        wc      'plot pixel or draw line?
 | 
						|
        if_nc           call    #plotd
 | 
						|
                        test    t7,h8000        wc
 | 
						|
        if_c            call    #linepd
 | 
						|
 | 
						|
                        jmp     #:loop                  'get next vector
 | 
						|
'
 | 
						|
'
 | 
						|
' pix(x, y, pixrot, pixdef_ptr)
 | 
						|
' pixarc(x, y, xr, yr, angle, pixrot, pixdef_ptr)
 | 
						|
'
 | 
						|
' pixdef:       word
 | 
						|
'               byte    xwords, ywords, xorigin, yorigin
 | 
						|
'               word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
'               word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
'               word    %%xxxxxxxx,%%xxxxxxxx
 | 
						|
'               ...
 | 
						|
'
 | 
						|
pixarc_                 call    #arcmod
 | 
						|
 | 
						|
pix_                    mov     t6,pcolor               'save color
 | 
						|
 | 
						|
                        mov     px,dx                   'get center into px,py
 | 
						|
                        mov     py,dy
 | 
						|
 | 
						|
                        mov     sy,pwidth               'get actual pixel width
 | 
						|
                        add     sy,#1
 | 
						|
 | 
						|
                        rdbyte  dx,arg3                 'get dimensions into dx,dy
 | 
						|
                        add     arg3,#1
 | 
						|
                        rdbyte  dy,arg3
 | 
						|
                        add     arg3,#1
 | 
						|
 | 
						|
                        rdbyte  t1,arg3                 'get origin and adjust px,py
 | 
						|
                        add     arg3,#1
 | 
						|
                        rdbyte  t2,arg3
 | 
						|
                        add     arg3,#1
 | 
						|
                        neg     t2,t2
 | 
						|
                        sub     t2,#1
 | 
						|
                        add     t2,dy
 | 
						|
                        mov     t3,sy
 | 
						|
:adjust                 test    arg2,#%001      wz
 | 
						|
                        test    arg2,#%110      wc
 | 
						|
        if_z            sumnc   px,t1
 | 
						|
        if_nz           sumc    py,t1
 | 
						|
                        test    arg2,#%010      wc
 | 
						|
        if_nz           sumnc   px,t2
 | 
						|
        if_z            sumnc   py,t2
 | 
						|
                        djnz    t3,#:adjust
 | 
						|
 | 
						|
:yline                  mov     sx,#0                   'plot entire pix
 | 
						|
                        mov     t3,dx
 | 
						|
:xword                  rdword  t4,arg3                 'read next pix word
 | 
						|
                        add     arg3,#2
 | 
						|
                        shl     t4,#16
 | 
						|
                        mov     t5,#8
 | 
						|
:xpixel                 rol     t4,#2                   'plot pixel within word
 | 
						|
                        test    t4,#1           wc      'set color
 | 
						|
                        muxc    pcolor,color1
 | 
						|
                        test    t4,#2           wc
 | 
						|
                        muxc    pcolor,color2   wz      '(z=1 if color=0)
 | 
						|
        if_nz           call    #plotp
 | 
						|
                        test    arg2,#%001      wz      'update px,py for next x
 | 
						|
                        test    arg2,#%110      wc
 | 
						|
        if_z            sumc    px,sy
 | 
						|
        if_nz           sumnc   py,sy
 | 
						|
                        add     sx,sy
 | 
						|
                        djnz    t5,#:xpixel             'another x pixel?
 | 
						|
                        djnz    t3,#:xword              'another x word?
 | 
						|
        if_z            sumnc   px,sx                   'update px,py for next y
 | 
						|
        if_nz           sumc    py,sx
 | 
						|
                        test    arg2,#%010      wc
 | 
						|
        if_nz           sumc    px,sy
 | 
						|
        if_z            sumc    py,sy
 | 
						|
                        djnz    dy,#:yline              'another y line?
 | 
						|
 | 
						|
                        mov     pcolor,t6               'restore color
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' text(x, y, @string) justx, justy
 | 
						|
' textarc(x, y, xr, yr, angle, @string) justx, justy
 | 
						|
'
 | 
						|
textarc_                call    #arcmod
 | 
						|
 | 
						|
text_                   add     arg3,arg0               'add x into justx
 | 
						|
                        add     arg4,arg1               'add y into justy
 | 
						|
 | 
						|
:chr                    rdbyte  t1,arg2         wz      'get chr
 | 
						|
                        add     arg2,#1
 | 
						|
 | 
						|
        if_z            jmp     #loop                   'if 0, done
 | 
						|
 | 
						|
                        sub     t1,#$21                 'if chr out of range, skip
 | 
						|
                        cmp     t1,#$7F-$21+fx  wc
 | 
						|
        if_nc           jmp     #:skip
 | 
						|
 | 
						|
                        mov     arg5,fontptr            'scan font for chr definition
 | 
						|
:scan                   tjz     t1,#:def
 | 
						|
                        rdword  t2,arg5
 | 
						|
                        add     arg5,#2
 | 
						|
                        test    t2,h8000        wc
 | 
						|
        if_nc           sub     t1,#1
 | 
						|
                        jmp     #:scan
 | 
						|
 | 
						|
:def                    rdword  t7,arg5                 'get font definition word
 | 
						|
                        add     arg5,#2
 | 
						|
 | 
						|
                        call    #fontxy                 'extract initial x,y
 | 
						|
 | 
						|
                        test    t7,#$80         wc      'arc or line?
 | 
						|
        if_nc           jmp     #:line
 | 
						|
 | 
						|
 | 
						|
                        mov     t2,textsx               'arc, extract x radius
 | 
						|
                        mov     t3,#%0001_0001_1
 | 
						|
                        call    #fontb
 | 
						|
                        mov     t4,t1
 | 
						|
 | 
						|
                        mov     t2,textsy               'extract y radius
 | 
						|
                        mov     t3,#%0010_0011_1
 | 
						|
                        call    #fontb
 | 
						|
                        mov     t5,t1
 | 
						|
 | 
						|
                        mov     t2,#1                   'extract starting angle
 | 
						|
                        mov     t3,#%0010_0011_0
 | 
						|
                        call    #fontb
 | 
						|
                        shl     t1,#11
 | 
						|
 | 
						|
                        mov     t6,t1                   'extract angle sweep
 | 
						|
                        mov     t3,#%0010_0011_0
 | 
						|
                        call    #fontb
 | 
						|
                        neg     arg6,t1
 | 
						|
                        shl     arg6,#4
 | 
						|
                        add     arg6,#65
 | 
						|
 | 
						|
                        call    #arcd                   'plot initial arc point
 | 
						|
                        call    #plotd
 | 
						|
 | 
						|
:arc                    call    #arcd                   'connect subsequent arc points with lines
 | 
						|
                        call    #linepd
 | 
						|
                        add     t6,#$80
 | 
						|
                        djnz    arg6,#:arc
 | 
						|
 | 
						|
                        jmp     #:more
 | 
						|
 | 
						|
 | 
						|
:line                   call    #plotd                  'line, plot initial x,y
 | 
						|
 | 
						|
                        call    #fontxy                 'extract terminal x,y
 | 
						|
 | 
						|
                        call    #linepd                 'draw line
 | 
						|
 | 
						|
 | 
						|
:more                   test    t7,#$02         wc      'more font definition?
 | 
						|
        if_c            jmp     #:def
 | 
						|
 | 
						|
:skip                   mov     t1,textsp               'advance x to next chr position
 | 
						|
                        mov     t2,textsx
 | 
						|
                        call    #multiply
 | 
						|
                        add     arg3,t1
 | 
						|
 | 
						|
                        jmp     #:chr                   'get next chr
 | 
						|
 | 
						|
 | 
						|
fontxy                  mov     t2,textsx               'extract x
 | 
						|
                        mov     t3,#%0011_0111_0
 | 
						|
                        call    #fontb
 | 
						|
                        mov     arg0,t1
 | 
						|
                        add     arg0,arg3
 | 
						|
 | 
						|
                        mov     t2,textsy               'extract y
 | 
						|
                        mov     t3,#%0100_1111_0
 | 
						|
                        call    #fontb
 | 
						|
                        mov     arg1,t1
 | 
						|
                        add     arg1,arg4
 | 
						|
 | 
						|
setd                    mov     dx,xorigin              'set dx,dy from arg0,arg1
 | 
						|
                        add     dx,arg0
 | 
						|
                        mov     dy,yorigin
 | 
						|
                        sub     dy,arg1
 | 
						|
setd_ret
 | 
						|
fontxy_ret              ret
 | 
						|
 | 
						|
 | 
						|
fontb                   mov     t1,t7                   'extract bitrange from font word
 | 
						|
                        shr     t3,#1           wc
 | 
						|
                        and     t1,t3
 | 
						|
        if_c            add     t1,#1
 | 
						|
                        shr     t3,#4
 | 
						|
                        shr     t7,t3
 | 
						|
 | 
						|
                        shl     t1,#32-4                'multiply t1[3..0] by t2
 | 
						|
                        mov     t3,#4
 | 
						|
:loop                   shl     t1,#1           wc
 | 
						|
        if_c            add     t1,t2
 | 
						|
                        djnz    t3,#:loop
 | 
						|
 | 
						|
fontb_ret               ret
 | 
						|
'
 | 
						|
'
 | 
						|
' textmode(x_scale, y_scale, spacing, justification)
 | 
						|
'
 | 
						|
textmode_               mov     textsx,arg0             'set text x scale
 | 
						|
                        mov     textsy,arg1             'set text y scale
 | 
						|
                        mov     textsp,arg2             'set text spacing
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' fill(x, y, da, db, db2, linechange, lines_minus_1)
 | 
						|
'
 | 
						|
fill_                   shl     dx,#16                  'get left and right fractions
 | 
						|
                        or      dx,h8000
 | 
						|
                        mov     t1,dx
 | 
						|
 | 
						|
                        mov     t2,xlongs               'get x pixels
 | 
						|
                        shl     t2,#4
 | 
						|
 | 
						|
                        add     arg6,#1                 'pre-increment line counter
 | 
						|
 | 
						|
:yloop                  add     dx,arg2                 'adjust left and right fractions
 | 
						|
                        add     t1,arg3
 | 
						|
 | 
						|
                        cmps    dx,t1           wc      'get left and right integers
 | 
						|
        if_c            mov     base0,dx
 | 
						|
        if_c            mov     base1,t1
 | 
						|
        if_nc           mov     base0,t1
 | 
						|
        if_nc           mov     base1,dx
 | 
						|
                        sar     base0,#16
 | 
						|
                        sar     base1,#16
 | 
						|
 | 
						|
                        cmps    base0,t2        wc      'left out of range?
 | 
						|
        if_c            cmps    hFFFFFFFF,base1 wc      'right out of range?
 | 
						|
        if_c            cmp     dy,ylongs       wc      'y out of range?
 | 
						|
        if_nc           jmp     #:skip                  'if any, skip
 | 
						|
 | 
						|
                        mins    base0,#0                'limit left and right
 | 
						|
                        maxs    base1,t2        wc
 | 
						|
        if_nc           sub     base1,#1
 | 
						|
 | 
						|
                        shl     base0,#1                'make left mask
 | 
						|
                        neg     mask0,#1
 | 
						|
                        shl     mask0,base0
 | 
						|
                        shr     base0,#5
 | 
						|
 | 
						|
                        shl     base1,#1                'make right mask
 | 
						|
                        xor     base1,#$1E
 | 
						|
                        neg     mask1,#1
 | 
						|
                        shr     mask1,base1
 | 
						|
                        shr     base1,#5
 | 
						|
 | 
						|
                        sub     base1,base0     wz      'ready long count
 | 
						|
                        add     base1,#1
 | 
						|
 | 
						|
        if_z            and     mask0,mask1             'if single long, merge masks
 | 
						|
 | 
						|
                        shl     base0,#1                'get long base
 | 
						|
                        add     base0,basesptr
 | 
						|
                        rdword  base0,base0
 | 
						|
                        shl     dy,#2
 | 
						|
                        add     base0,dy
 | 
						|
                        shr     dy,#2
 | 
						|
 | 
						|
                        mov     bits0,mask0             'ready left mask
 | 
						|
:xloop                  mov     bits1,pcolor            'make color mask
 | 
						|
                        and     bits1,bits0
 | 
						|
                        rdlong  pass,base0              'read-modify-write long
 | 
						|
                        andn    pass,bits0
 | 
						|
                        or      pass,bits1
 | 
						|
                        wrlong  pass,base0
 | 
						|
                        shl     ylongs,#2               'advance to next long
 | 
						|
                        add     base0,ylongs
 | 
						|
                        shr     ylongs,#2
 | 
						|
                        cmp     base1,#2        wz      'one more?
 | 
						|
        if_nz           neg     bits0,#1                'if not, ready full mask
 | 
						|
        if_z            mov     bits0,mask1             'if one more, ready right mask
 | 
						|
                        djnz    base1,#:xloop           'loop if more longs
 | 
						|
 | 
						|
:skip                   sub     arg5,#1         wc      'delta change?
 | 
						|
        if_c            mov     arg3,arg4               'if so, set new deltas
 | 
						|
:same
 | 
						|
                        add     dy,#1                   'adjust y
 | 
						|
                        djnz    arg6,#:yloop            'another y?
 | 
						|
 | 
						|
                        jmp     #loop
 | 
						|
'
 | 
						|
'
 | 
						|
' Plot line from px,py to dx,dy
 | 
						|
'
 | 
						|
linepd                  cmps    dx,px           wc, wr  'get x difference
 | 
						|
                        negc    sx,#1                   'set x direction
 | 
						|
 | 
						|
                        cmps    dy,py           wc, wr  'get y difference
 | 
						|
                        negc    sy,#1                   'set y direction
 | 
						|
 | 
						|
                        abs     dx,dx                   'make differences absolute
 | 
						|
                        abs     dy,dy
 | 
						|
 | 
						|
                        cmp     dx,dy           wc      'determine dominant axis
 | 
						|
        if_nc           tjz     dx,#:last               'if both differences 0, plot single pixel
 | 
						|
        if_nc           mov     count,dx                'set pixel count
 | 
						|
        if_c            mov     count,dy
 | 
						|
                        mov     ratio,count             'set initial ratio
 | 
						|
                        shr     ratio,#1
 | 
						|
        if_c            jmp     #:yloop                 'x or y dominant?
 | 
						|
 | 
						|
 | 
						|
:xloop                  call    #plotp                  'dominant x line
 | 
						|
                        add     px,sx
 | 
						|
                        sub     ratio,dy        wc
 | 
						|
        if_c            add     ratio,dx
 | 
						|
        if_c            add     py,sy
 | 
						|
                        djnz    count,#:xloop
 | 
						|
 | 
						|
                        jmp     #:last                  'plot last pixel
 | 
						|
 | 
						|
 | 
						|
:yloop                  call    #plotp                  'dominant y line
 | 
						|
                        add     py,sy
 | 
						|
                        sub     ratio,dx        wc
 | 
						|
        if_c            add     ratio,dy
 | 
						|
        if_c            add     px,sx
 | 
						|
                        djnz    count,#:yloop
 | 
						|
 | 
						|
:last                   call    #plotp                  'plot last pixel
 | 
						|
 | 
						|
linepd_ret              ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Plot pixel at px,py
 | 
						|
'
 | 
						|
plotd                   mov     px,dx                   'set px,py to dx,dy
 | 
						|
                        mov     py,dy
 | 
						|
 | 
						|
plotp                   tjnz    pwidth,#wplot           'if width > 0, do wide plot
 | 
						|
 | 
						|
                        mov     t1,px                   'compute pixel mask
 | 
						|
                        shl     t1,#1
 | 
						|
                        mov     mask0,#%11
 | 
						|
                        shl     mask0,t1
 | 
						|
                        shr     t1,#5
 | 
						|
 | 
						|
                        cmp     t1,xlongs       wc      'if x or y out of bounds, exit
 | 
						|
        if_c            cmp     py,ylongs       wc
 | 
						|
        if_nc           jmp     #plotp_ret
 | 
						|
 | 
						|
                        mov     bits0,pcolor            'compute pixel bits
 | 
						|
                        and     bits0,mask0
 | 
						|
 | 
						|
                        shl     t1,#1                   'get address of pixel long
 | 
						|
                        add     t1,basesptr
 | 
						|
                        mov     t2,py
 | 
						|
                        rdword  t1,t1
 | 
						|
                        shl     t2,#2
 | 
						|
                        add     t1,t2
 | 
						|
 | 
						|
                        rdlong  t2,t1                   'write pixel
 | 
						|
                        andn    t2,mask0
 | 
						|
                        or      t2,bits0
 | 
						|
                        wrlong  t2,t1
 | 
						|
plotp_ret
 | 
						|
plotd_ret               ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Plot wide pixel
 | 
						|
'
 | 
						|
wplot                   mov     t1,py                   'if y out of bounds, exit
 | 
						|
                        add     t1,#7
 | 
						|
                        mov     t2,ylongs
 | 
						|
                        add     t2,#7+8
 | 
						|
                        cmp     t1,t2           wc
 | 
						|
        if_nc           jmp     #plotp_ret
 | 
						|
 | 
						|
                        mov     t1,px                   'determine x long pair
 | 
						|
                        sub     t1,#8
 | 
						|
                        sar     t1,#4
 | 
						|
                        cmp     t1,xlongs       wc
 | 
						|
                        muxc    jumps,#%01              '(use jumps[1..0] to store writes)
 | 
						|
                        add     t1,#1
 | 
						|
                        cmp     t1,xlongs       wc
 | 
						|
                        muxc    jumps,#%10
 | 
						|
 | 
						|
                        test    jumps,#%11      wz      'if x out of bounds, exit
 | 
						|
        if_z            jmp     #plotp_ret
 | 
						|
 | 
						|
                        shl     t1,#1                   'get base pair
 | 
						|
                        add     t1,basesptr
 | 
						|
                        rdword  base1,t1
 | 
						|
                        sub     t1,#2
 | 
						|
                        rdword  base0,t1
 | 
						|
 | 
						|
                        mov     t1,px                   'determine pair shifts
 | 
						|
                        shl     t1,#1
 | 
						|
                        movs    :shift1,t1
 | 
						|
                        xor     :shift1,#7<<1
 | 
						|
                        add     t1,#9<<1
 | 
						|
                        movs    :shift0,t1
 | 
						|
                        test    t1,#$F<<1       wz      '(account for special case)
 | 
						|
        if_z            andn    jumps,#%01
 | 
						|
 | 
						|
                        mov     pass,#0                 'ready to plot slices
 | 
						|
                        mov     slice,slicesptr
 | 
						|
 | 
						|
:loop                   rdlong  mask0,slice             'get next slice
 | 
						|
                        mov     mask1,mask0
 | 
						|
 | 
						|
:shift0                 shl     mask0,#0                'position slice
 | 
						|
:shift1                 shr     mask1,#0
 | 
						|
 | 
						|
                        mov     bits0,pcolor            'colorize slice
 | 
						|
                        and     bits0,mask0
 | 
						|
                        mov     bits1,pcolor
 | 
						|
                        and     bits1,mask1
 | 
						|
 | 
						|
                        mov     t1,py                   'plot lower slice
 | 
						|
                        add     t1,pass
 | 
						|
                        cmp     t1,ylongs       wc
 | 
						|
        if_c            call    #wslice
 | 
						|
 | 
						|
                        mov     t1,py                   'plot upper slice
 | 
						|
                        test    pwidth,#1       wc
 | 
						|
                        subx    t1,pass
 | 
						|
                        cmp     t1,ylongs       wc
 | 
						|
        if_c            call    #wslice
 | 
						|
 | 
						|
                        add     slice,#4                'next slice
 | 
						|
                        add     pass,#1
 | 
						|
                        cmp     pass,passes     wz
 | 
						|
        if_nz           jmp     #:loop
 | 
						|
 | 
						|
                        jmp     #plotp_ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Plot wide pixel slice
 | 
						|
'
 | 
						|
wslice                  shl     t1,#2                   'ready long offset
 | 
						|
 | 
						|
                        add     base0,t1                'plot left slice
 | 
						|
                        test    jumps,#%01      wc
 | 
						|
        if_c            rdlong  t2,base0
 | 
						|
        if_c            andn    t2,mask0
 | 
						|
        if_c            or      t2,bits0
 | 
						|
        if_c            wrlong  t2,base0
 | 
						|
 | 
						|
                        add     base1,t1                'plot right slice
 | 
						|
                        test    jumps,#%10      wc
 | 
						|
        if_c            rdlong  t2,base1
 | 
						|
        if_c            andn    t2,mask1
 | 
						|
        if_c            or      t2,bits1
 | 
						|
        if_c            wrlong  t2,base1
 | 
						|
 | 
						|
                        sub     base0,t1                'restore bases
 | 
						|
                        sub     base1,t1
 | 
						|
 | 
						|
wslice_ret              ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Get arc point from args and then move args 5..7 to 2..4
 | 
						|
'
 | 
						|
arcmod                  call    #arca                   'get arc using first 5 args
 | 
						|
 | 
						|
                        mov     arg0,dx                 'set arg0,arg1
 | 
						|
                        sub     arg0,xorigin
 | 
						|
                        mov     arg1,yorigin
 | 
						|
                        sub     arg1,dy
 | 
						|
 | 
						|
                        mov     arg2,arg5               'move args 5..7 to 2..4
 | 
						|
                        mov     arg3,arg6
 | 
						|
                        mov     arg4,arg7
 | 
						|
 | 
						|
arcmod_ret              ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Get arc dx,dy from arg0,arg1
 | 
						|
'
 | 
						|
'   in:         arg0,arg1 = center x,y
 | 
						|
'               arg2/t4 = x length
 | 
						|
'               arg3/t5 = y length
 | 
						|
'               arg4/t6 = 13-bit angle
 | 
						|
'
 | 
						|
'   out:        dx,dy = arc point
 | 
						|
'
 | 
						|
arca                    mov     t4,arg2                 'use args
 | 
						|
                        mov     t5,arg3
 | 
						|
                        mov     t6,arg4
 | 
						|
 | 
						|
arcd                    call    #setd                   'reset dx,dy to arg0,arg1
 | 
						|
 | 
						|
                        mov     t1,t6                   'get arc dx
 | 
						|
                        mov     t2,t4
 | 
						|
                        call    #polarx
 | 
						|
                        add     dx,t1
 | 
						|
 | 
						|
                        mov     t1,t6                   'get arc dy
 | 
						|
                        mov     t2,t5
 | 
						|
                        call    #polary
 | 
						|
                        sub     dy,t1
 | 
						|
arcd_ret
 | 
						|
arca_ret                ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Polar to cartesian
 | 
						|
'
 | 
						|
'   in:         t1 = 13-bit angle
 | 
						|
'               t2 = 16-bit length
 | 
						|
'
 | 
						|
'   out:        t1 = x|y
 | 
						|
'
 | 
						|
polarx                  add     t1,sine_90              'cosine, add 90° for sine lookup
 | 
						|
polary                  test    t1,sine_180     wz      'get sine quadrant 3|4 into nz
 | 
						|
                        test    t1,sine_90      wc      'get sine quadrant 2|4 into c
 | 
						|
                        negc    t1,t1                   'if sine quadrant 2|4, negate table offset
 | 
						|
                        or      t1,sine_table           'or in sine table address >> 1
 | 
						|
                        shl     t1,#1                   'shift left to get final word address
 | 
						|
                        rdword  t1,t1                   'read sine/cosine word
 | 
						|
                        call    #multiply               'multiply sine/cosine by length to get x|y
 | 
						|
                        add     t1,h8000                'add 1/2 lsb to round up x|y fraction
 | 
						|
                        shr     t1,#16                  'justify x|y integer
 | 
						|
                        negnz   t1,t1                   'if sine quadrant 3|4, negate x|y
 | 
						|
polary_ret
 | 
						|
polarx_ret              ret
 | 
						|
 | 
						|
sine_90                 long    $0800                   '90° bit
 | 
						|
sine_180                long    $1000                   '180° bit
 | 
						|
sine_table              long    $E000 >> 1              'sine table address shifted right
 | 
						|
'
 | 
						|
'
 | 
						|
' Multiply
 | 
						|
'
 | 
						|
'   in:         t1 = 16-bit multiplicand (t1[31..16] must be 0)
 | 
						|
'               t2 = 16-bit multiplier
 | 
						|
'
 | 
						|
'   out:        t1 = 32-bit product
 | 
						|
'
 | 
						|
multiply                mov     t3,#16
 | 
						|
                        shl     t2,#16
 | 
						|
                        shr     t1,#1           wc
 | 
						|
 | 
						|
:loop   if_c            add     t1,t2           wc
 | 
						|
                        rcr     t1,#1           wc
 | 
						|
                        djnz    t3,#:loop
 | 
						|
 | 
						|
multiply_ret            ret
 | 
						|
'
 | 
						|
'
 | 
						|
' Defined data
 | 
						|
'
 | 
						|
zero                    long    0                       'constants
 | 
						|
d0                      long    $200
 | 
						|
h8000                   long    $8000
 | 
						|
hFFFFFFFF               long    $FFFFFFFF
 | 
						|
color1                  long    %%1111111111111111
 | 
						|
color2                  long    %%2222222222222222
 | 
						|
 | 
						|
fontptr                 long    0                       'font pointer (set before cognew command)
 | 
						|
 | 
						|
pcolor                  long    %%1111111111111111      'pixel color
 | 
						|
pwidth                  long    0                       'pixel width
 | 
						|
passes                  long    1                       'pixel passes
 | 
						|
textsx                  long    1                       'text scale x
 | 
						|
textsy                  long    1                       'text scale y
 | 
						|
textsp                  long    6                       'text spacing
 | 
						|
'
 | 
						|
'
 | 
						|
' Undefined data
 | 
						|
'
 | 
						|
t1                      res     1       'temps
 | 
						|
t2                      res     1
 | 
						|
t3                      res     1
 | 
						|
t4                      res     1
 | 
						|
t5                      res     1
 | 
						|
t6                      res     1
 | 
						|
t7                      res     1
 | 
						|
 | 
						|
arg0                    res     1       'arguments passed from high-level
 | 
						|
arg1                    res     1
 | 
						|
arg2                    res     1
 | 
						|
arg3                    res     1
 | 
						|
arg4                    res     1
 | 
						|
arg5                    res     1
 | 
						|
arg6                    res     1
 | 
						|
arg7                    res     1
 | 
						|
 | 
						|
basesptr                res     1       'pointers
 | 
						|
slicesptr               res     1
 | 
						|
 | 
						|
xlongs                  res     1       'bitmap metrics
 | 
						|
ylongs                  res     1
 | 
						|
xorigin                 res     1
 | 
						|
yorigin                 res     1
 | 
						|
 | 
						|
dx                      res     1       'line/plot coordinates
 | 
						|
dy                      res     1
 | 
						|
px                      res     1
 | 
						|
py                      res     1
 | 
						|
 | 
						|
sx                      res     1       'line
 | 
						|
sy                      res     1
 | 
						|
count                   res     1
 | 
						|
ratio                   res     1
 | 
						|
 | 
						|
pass                    res     1       'plot
 | 
						|
slice                   res     1
 | 
						|
base0                   res     1
 | 
						|
base1                   res     1
 | 
						|
mask0                   res     1
 | 
						|
mask1                   res     1
 | 
						|
bits0                   res     1
 | 
						|
bits1                   res     1
 | 
						|
 | 
						|
{{
 | 
						|
 | 
						|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 | 
						|
│                                                   TERMS OF USE: MIT License                                                  │                                                            
 | 
						|
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
 | 
						|
│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    │ 
 | 
						|
│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,    │
 | 
						|
│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
 | 
						|
│is furnished to do so, subject to the following conditions:                                                                   │
 | 
						|
│                                                                                                                              │
 | 
						|
│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
 | 
						|
│                                                                                                                              │
 | 
						|
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          │
 | 
						|
│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         │
 | 
						|
│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   │
 | 
						|
│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         │
 | 
						|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 | 
						|
}} |