>
> I am working on updating the ap_doc.do file with AsciiPixel image
> encoding documentation, but it is a bit involved and is taking some time to
> update.
>

Hey Ken, I know you're in the middle of updating the documentation, but I
figured I might as well share the minor changes I made to ap_doc.do. Mainly
I corrected the instructions for the Tandy 200, but I also fixed the mouse
cursor ascii art, and added a section on how to detect if AsciiPixels is
available.

Here's the patch:

--- ap_doc.txt~ 2023-02-13 21:14:40.395371132 -0800+++
ap_doc.txt      2023-02-13 22:22:58.771620379 -0800@@ -5,8 +5,8 @@
  /_/   \_\___/\___|_|_||_|   |_/_/\_\___|_|___/

 -         Version 1.0-         Copyright 2015, Ken Pettit+
Version 1.0.1+         Copyright 2023, Ken Pettit
          All rights reserved.

 @@ -19,7 +19,7 @@
     The library is distributed as a standard .CO file that can be loaded
 to the portable and installed using the LOADM BASIC instruction.  Once
 installed, the library is accessed by making CALL instructions to
the-base entry address (value depends on M100/T102 vs T200), passing
in +base entry address (value is the same on M100/T102 and T200),
passing in
 arguments in the A and HL registers to indicate the desired action.

 Services currently provided by AP include:@@ -44,12 +44,21 @@
     2.  Enter basic and execute the "CLEAR" command to move HIMEM so
         there is room to load ASCPIX:
 -        - Model 100/102:        clear 256,58000-        - Model 200:
           clear 256,58000+        clear 256,58000

     3.  Still from BASIC, load the CO:
 -        loadm "ASCPIX"+        - Model 100/102:        loadm
"ASCPIX"+        - Model 200:            loadm
"ASCPX2"++++DETECTING+=========+    To detect if ASCPIX has been
loaded, use this code:++        A=58000+        IF PEEK(A)=195 AND
PEEK(A)=46 THEN AP=1 ELSE AP=0


 CALLING@@ -106,8 +115,8 @@

           |\           |\           |\
           | \          | \          | \-          |  \         |. \
      |_.'-          |__/           \\           \\+          |/^`
    |_.'        |  \+            \\           \\        |__/

           Cursor 0     Cursor 1    Cursor 2

Or, see the attached file.

—b9
     _             _ _  ____  _          _
    / \   ___  ___(_|_)|  _ \(_)_  _____| |___
   / _ \ / __|/ __| | || |_) | \ \/ / _ \ / __|
  / ___ \\__ \ (__| | ||  __/| |>  <  __/ \__ \
 /_/   \_\___/\___|_|_||_|   |_/_/\_\___|_|___/


         Version 1.0.1
         Copyright 2023, Ken Pettit
         All rights reserved.


    AsciiPixels (AP) is a graphics library for the TRS-80 Model 100/102
and T200 portable computers.  It is a machine language library written in
8085 assmebly for speed.  The graphics routines directly access the LCD
driver controller(s) instead of performing ROM accesses for added
performance improvements.

    The library is distributed as a standard .CO file that can be loaded
to the portable and installed using the LOADM BASIC instruction.  Once
installed, the library is accessed by making CALL instructions to the
base entry address (value is the same on M100/T102 and T200), passing in
arguments in the A and HL registers to indicate the desired action.

Services currently provided by AP include:

    - Drawing graphics resources saved as ASCII strings (A$, B$, etc.)
    - Drawing graphics from a FILE in the M100/102 catalog (the entire
            file will be drawn)
    - Drawing named resources stored in a FILE containing multiple
            resources
    - Drawing and managing a "cursor/pointer" with automatic background
            saving and restoring, cursor masking, etc.

    Additionally, a BASIC program is provied for converting .DO files
containing the source for one or more icons drawn with '*' and ' '
characters into ASCII strings to be passed to AP.


INSTALLING
==========
    1.  Copy the ASCPIX.CO file to the portable

    2.  Enter basic and execute the "CLEAR" command to move HIMEM so
        there is room to load ASCPIX:

        clear 256,58000

    3.  Still from BASIC, load the CO:

        - Model 100/102:        loadm "ASCPIX"
        - Model 200:            loadm "ASCPX2"



DETECTING
=========
    To detect if ASCPIX has been loaded, use this code:

        A=58000
        IF PEEK(A)=195 AND PEEK(A)=46 THEN AP=1 ELSE AP=0


CALLING
=======
    Just in case a new version of AsciiPixels needs to change the base
entry location, programs should assign a variable, perhaps A, equal
to the entry location where all calls will be made.  This will also
reduce the amount of typing and code size:

    10 A=58000

    or

    10 DEFINT A
    20 A=58000-65536

    After defining the call address in a variable, all calls will be
made by calling that base address with the first parameter (A) of the
call indicating the requested operation and the second parameter (HL)
indicating the operation parameter.  The operations can either be
loaded into variables for ease in remembering them, or simply entered
as numeric values in the CALL instruction.

    CALL A,8,0   : REM Operation 8 initializes the cursor.  Parameter
                   0 indicates the cursor style (0,1,2).

    CALL A,2,VARPTR(R$)  : REM Draw graphic whose ASCII text is in R$

                           NOTE:  All X,Y coordinates are zero-based.

OPERATIONS
==========

    Init Cursor
    -----------

        OP:  CALL A, 8, cursor_number

            This function initializes the standard cursor.  Initialization
        consistst of marking the cursor as "not visible" and setting the
        style of cursor to be drawn.

            Since the cursor routines save data in the unused LCD controller
        RAM, This routine should be called when the BASIC program starts
        prior to any other cursor operations.  Failure to call this routine
        can cause old data saved in the LCD RAM from a previous BASIC RUN
        to be improperly drawn if that LCD RAM data indicates the cursor
        was currently on-screen (i.e. it will try to "restore" the data
        that was under the cursor during the previous BASIC run).

            There are three standard cursors included in the ASCPIX file
        that can be selected as "cursor_number":


          |\           |\          |\
          | \          | \         | \
          |/^`         |_.'        |  \
            \\           \\        |__/

          Cursor 0     Cursor 1    Cursor 2



    Turn Cursor On
    --------------

        OP:  CALL A, 6, Y*256 + X

            This function turns on the selected standard cursor a the
        X,Y LCD pixel coordinate specified.  As indicated, the Y coordinate
        is passed in the upper byte of HL with the X coordinate in the
        lower byte.  This function marks the cursor as "shown".

            Before drawing the cursor, the function will copy the current
        LCD screen contents "under" the cursor to the unused LCD controller
        RAM area so that it can be restored later when turning the cursor
        off.  Then it will draw the cursor at the specified location.  If
        the X,Y coordinates provided cause the pointer to be partialy off
        the LCD (to the right or bottom), this will be handled properly.

            If this function is called and the cursor is already being
        displayed on the LCD, then the cursor to first be removed from the
        display by restoring the previous LCD contents from unused LCD
        controller RAM area (that was previously saved prior to drawing
        the cursor).


    Turn Cursor Off
    ---------------

        OP:  CALL A, 7

            This function hides the selected standard cursor by restoring
        the LCD contents from the spare LCD controller RAM area that was
        previously saved prior to drawing the cursor.  It also marks the
        cursor as "hidden".


    Set Render X,Y Location
    -----------------------

        OP:  CALL A, 1,     Y*256 + X
        OP:  CALL A, Y+128, X

            This function set the X,Y location where the subsequent image
        render operation will be performed.  As indicated, there are two
        calling conventions for passing the X and Y coordinates.  The first
        invocation was written first when developing the AP library routines,
        and the second was added as a performance improvement to avoid
        needing a multiply to specify the Y coordinate of every graphic
        drawn.

            If the X,Y coordinate is selected such that the size of the
        subsequent image drawing does not fit on the LCD (i.e. overflows
        the right or bottom), then the image will simply be cropped.


    Render from string
    ------------------

        OP:  CALL A, 2, VALPTR(S$)

            This function performs decoding and rendering of the image
        whose ASCII source data is stored in the string S$.  This is used
        when AsciiPixel data is stored directly within the BASIC program
        as either DATA statement or through direct variable assignment:

        10 CALL A,Y+128,X
        15 ...
        20 S$="AP3)++'1>:B1#"
        30 CALL A,2,VARPTR(S$)


    Render from file
    ----------------

        OP:  CALL A, 3, VALPTR(S$)

            This function performs decoding and rendering of the image
        whose ASCII source data is stored in the FILE whose name is
        stored in the string S$.  The entire contents of the FILE will
        be rendered.

        10 CALL A,Y+128,X
        15 ...
        20 S$="IMAGE1.DO"
        30 CALL A,3,VARPTR(S$)


    Render from resource
    --------------------

        OP:  CALL A, 4, VALPTR(S$)

            This function performs decoding and rendering of an image
        whose ASCII source data is stored in a resource file.  The name
        of the resource stored in the string S$, and the filename of
        the resource file is specified via the CALL A,5,VARPTR(FN$) OP.
        The file must exist in the Model 100/102/200 catalog as a standard
        .DO file.  The format of resources within the file are:

            "Chek" AP3++xX
            "Ball" AP300w1*Cb#Z$Z*a2_BSBCbd*w2
            "Padl" AP3)7dFZz$%A/#
            etc.

        Example:

        10 F$="RES.DO"
        20 CALL A,5,VARPTR(F$)  : REM Set resource filename
        30 CALL A,Y+128,X
        40 R$="Ball"
        50 CALL A,4,VARPTR(R$)  : REM Render resource "Ball" from RES.DO


    Set resource filename
    ---------------------

        OP:  CALL A, 5, VALPTR(S$)

            This function sets the filename of the resource file from
        which CALL A,4,VARPTR(R$) resources will be read.  See above
        for example.


BUILDING STRINGS
================

    In order to use AsciiPixels, one first needs a way to encode the pixel
data into a string that AP can decode and render.  Looking at the few
examples in this document, it is clear that encoding by hand is out of
the question.  So two methods have been developed (so far) for converting
source images into encoded AsciiPixel strings. Both will be mentioned here,
but only one will be described:

    - A Model 100/102/200 BASIC program called MAKEAP.BA

        Converts images in a formatted .DO file into AP strings.  This
        one is described below.

    - A Linux C program called pbm2ap

        Converts standard pbm (Pixel Bit Map) images (export from GIMP, etc.)
        into AP strings.  This is a project of its own and is not described
        here.  It can be used to convert full images into AP strings.


    MAKEAP.BA
    ---------

        This is a BASIC program that runs on the Model 100/102/200 and reads
    "icon" / image source data from a .DO file and creates a new .DO file
    containing the encoded AP string for each image in the file.  The file
    names of both the input and output files are queried when the program
    excutes.

        The input file can contain multiple images (i.e. a "resource file"),
    and each image will be added to the output file in a format compatible
    with the CALL A,4,VARPTR(R$) render resource operation.  Images in the
    source file can be specified on image per line or multiple images per
    line.  Each image consists of a name, size specification and image data
    drawn using '*' and ' ' characters.  Multiple images per line are
    separated with ',' and each image or group of images must be terminated
    using an '=' sign (or really any character other than '*' or ' ').

    An example resource file is provided:

        CHECK,  NOCHECK, NODOT,   DOT
        7x7,    7x7,     7x7,     7x7
        *******,*******,  ***  ,  ***
        *     *,*     *, *   * , *   *
        * *** *,*     *,*     *,* *** *
        * *** *,*     *,*     *,* *** *
        * *** *,*     *,*     *,* *** *
        *     *,*     *, *   * , *   *
        *******,*******,  ***  ,  ***
        =

        OKBTN
        19x9
           *************
         **             **
        *    **** *  *    *
        *    *  * * *     *
        *    *  * **      *
        *    *  * * *     *
        *    **** *  *    *
         **             **
           *************
        =
        OKINV
        19x9
           *************
         *****************
        *****    * ** *****
        ***** ** * * ******
        ***** ** *  *******
        ***** ** * * ******
        *****    * ** *****
         *****************
           *************
        =

    And the resulting output file will look like:

        "CHECK" AP3**nC@^Y0[B
        "NOCHECK" AP3**nC$&)/[B
        "NODOT" AP3**?'(/;34?#
        "DOT" AP3**?'XP>:4?#
        "OKBTN" AP36,[pSi._5;+8S3=CD7$&R'=h&s#
        "OKINV" AP36,[pSua3^m9`m9am9`m3^^tSq#

        As indicated, the output resource file can be used directly via
    the "Render from resource" operation, or the resulting encoded ASCII
    text can simply be copied to a BASIC program, assigned to a variable
    and rendered via the "Render from string" operation.


STRING ENCODING FORMAT
======================

    Top Secret.

Reply via email to