Shop OBEX P1 Docs P2 Docs Learn Events
Video Tv problems — Parallax Forums

Video Tv problems

Hi I am using the propeller starter kit and cannot get video to work. I use the generic code off of line. If you can help it would be very appreciated.

Sincerely,

Andy

Comments

  • Mike GreenMike Green Posts: 23,101
    edited 2009-09-02 22:39
    Which video? What are you using for a display? What's happening (or not happening)? Exactly what code are you using? What are you doing? Details matter.
  • edited 2009-09-03 03:50
    I am using a TV using the RCA port. No video is showing. I am downloading it to the epprom. Here is the Code:

    ''***************************************
    ''* 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[noparse][[/noparse]32]

    long pixel_width 'pixel data
    long slices[noparse][[/noparse]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[noparse][[/noparse]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[noparse][[/noparse]1..0]

    setcommand(_color, @colors[noparse][[/noparse]c & 3]) 'set color


    PUB width(w) | pixel_passes, r, i, p

    '' Set pixel width
    '' actual width is w[noparse][[/noparse]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 := true >> (p << 1) << (p & $E)
    if r and pixels[noparse][[/noparse]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[noparse][[/noparse]12..0] (0..$1FFF = 0°..359.956°)
    '' anglestep - angle step in bits[noparse][[/noparse]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[noparse][[/noparse]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[noparse][[/noparse]12..0] (0..$1FFF = 0°..359.956°)
    '' vecscale - scale of vector sprite ($100 = 1x)
    '' vecangle - rotation angle of vector sprite in bits[noparse][[/noparse]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[noparse][[/noparse]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[noparse][[/noparse]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[noparse][[/noparse]1..0]: 0..3 = left, center, right, left
    '' bits[noparse][[/noparse]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

    '' 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[noparse][[/noparse]justptr] := -lookupz(text_just >> 2 & 3: 0, x >> 1, x, 0)
    long[noparse][[/noparse]justptr] := -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[noparse][[/noparse]1..0] = start (0..3 = 0°, 90°, 180°, 270°)
    a2 = %0010 << 10 'bits[noparse][[/noparse]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 '[noparse][[/noparse]
    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 '[noparse][[/noparse]
    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[noparse][[/noparse]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[noparse][[/noparse]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[noparse][[/noparse]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. │
    └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    }}
  • potatoheadpotatohead Posts: 10,261
    edited 2009-09-03 03:56
    Please run graphics_demo.spin. It is configured for the kit you have.

    You can then verify the video is working.

    From there, it's pretty fun and educational to write some SPIN code to change that demo, draw lines and explore how that Parallax Graphics system works.

    You will find that program, along with a few others in your propeller tool home directory. C:\program files\parallax\propeller tool\...

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Propeller Wiki: Share the coolness!
    Chat in real time with other Propellerheads on IRC #propeller @ freenode.net
    Safety Tip: Life is as good as YOU think it is!

    Post Edited (potatohead) : 9/3/2009 4:04:11 AM GMT
  • Mike GreenMike Green Posts: 23,101
    edited 2009-09-03 04:07
    In the future, please do not cut and paste source code into your messages. The forum software strips out the indenting and some square brackets ([noparse][[/noparse] ]) which are crucial for understanding. It's also unwieldy to try to look at if you have more than a few lines of code. Instead use the Attachment Manager which you can use if you click on the Post Reply button.

    If you want to include small pieces of code, you can use the code tags: [noparse][[/noparse] code ] and [noparse][[/noparse] /code ]. In actual use, you don't put the extra spaces you see here.
Sign In or Register to comment.