ACE Technical Information

by Craig Bruce -- for Release #16 -- February 4, 1995.


1. INTRODUCTION

This document contains some technical information about ACE that may be of
interest to technically inclined members of our audience.  Technical
information about writing applications for ACE can be found in the
Programmer's Reference Guide documentation, which should be available from
the same place that you got this document.

2. OVERVIEW MEMORY MAP

Note that the "ace128" and "ace64" programs are functionally identical, except
that one is set up for the 128 and the other for the 64.  Thus, all of the
appication binary programs will work with either "ace128" or "ace64".  LOAD
and RUN the "ace" program and it will load the correct "kernel" for your
computer.

Here is an overview memory map of ACE-128/64:

$0002-$007f = application work area (0.125K)
$0080-$00ff = system zero-page storage (0.125K)
$0100-$01ff = processor stack (0.25K)
$0200-$0eff = system storage (3.25K)
$0f00-$0fff = kernel-interface variables (0.25K)
$1000-$12ff = system storage / free on the C64 (0.75K)
$1300-$5fff = ACE kernel and device drivers (23.25K)
$7000-$bfff = application area & stack (20K / configurable size)
$c000-$edff = free memory (11K)
$ee00-$eeff = modem receive buffer (0.25K / configurable size)
$ef00-$efff = modem transmit buffer (0.25K)
$f000-$f7ff = regular character set (2K)
$f800-$fbff = vic 40-column screen (1K)
$fc00-$feff = free memory (0.75K)
$ff00-$ffff = system storage (0.25K)

or, if you're on a C64 with the soft-80 screen configured:

$c000-$c9ff = free memory (2K)
$ca00-$caff = modem receive buffer (0.25K / configurable size)
$cb00-$cbff = modem transmit buffer (0.25K)
$cc00-$cfff = vic 40-column screen (1K)
$d000-$d7ff = regular character set (2K)
$d800-$dfff = soft-80 4-bit character set (2K)
$e000-$ff3f = bitmapped screen (7.81K)
$ff40-$ffff = system storage (0.19K)

When I get around to reorganizing the New ACE-128 memory map, it will look
like the following:

RAM0  $0000  (256)   system zero page
RAM0  $0100  (256)   system stack page
RAM0  $0200  (512)   Commodore Kernal work areas / temporary storage
RAM0  $0400  (1024)  forty-column-screen video RAM
RAM0  $0800  (512)   ACE inter-bank system-call launch area
RAM0  $0a00  (256)   Commodore Kernal work area
RAM0  $0b00  (256)   ACE string buffer
RAM0  $0c00  (256)   ACE work area
RAM0  $0d00  (512)   ACE common-RAM code
RAM0  $0f00  (256)   ACE status-variable storage
RAM0  $1000  (2048)  eight-bit character set
RAM0  $1800  (256)   exit-data buffer
RAM0  $1900  (58880) Application-Program Area
RAM0  $ff00  (256)   ACE system page

RAM1  $0000  (512)   inaccessible memory
RAM1  $0200  (3584)  memory hidden beneath the 4K of common RAM -- dynamic alloc
RAM1  $1000  (32768) ACE-kernel code + miscellaneous storage
RAM1  $9000  (8192)  disk-cache space
RAM1  $b000  (20224) dynamically-allocated memory
RAM1  $ff00  (256)   ACE system page

ram-configuration registers: $ff01=RAM0, $ff02=RAM1 w/IO, $ff03=RAM1, $ff04=R1k
call code:
   open:  (6 bytes)
      sta $ff02
      jmp kernFileOpen
return code:
   return:  (5 bytes)
      sta $ff01
      clc
      rts
   returnError:  (12 bytes)
      sta $ff01
      sta error
      ldx #$00
      ldy #$00
      sec
      rts
   internCall:  (10 bytes)
      sta $ff01
      jsr syswork+13
      sta $ff02
      rts
   fetch string buffer
   copy RAM0 to RAM0
   copy RAM0 to RAMx
   copy RAMx to RAM0
   zpload from RAMx
   zpstore to RAMx
   load VDC from RAM0
   store from VDC to RAM0
   load VIC from RAM0
   call CHROUT for RAM0
   call CHRIN for RAM0
   trigger REU transfer
   trigger RAMLink transfer

3. BOOTSTRAPPING

More explanation here later.

ace         - the kernel bootstrapper; can be run from either 64 or 128 mode
ace128      - the kernel for the 128
ace64       - the kernel for the 64
config      - the configuration initializer
.acerc      - the system configuration - this is data not an executable
config.edit - configuration editor program (written in BASIC)
acechr-commodore - regular Commodore character set
acechr-iso8859-1 - ISO 8859-1 "8-bit" character set
sh          - the command shell
.ashrc      - the ACE-command-shell auto-execution shell script

4. CONFIGURATION FILE FORMAT OVERVIEW

ACE-128/64 Configuration.sys file format

For devices: device slots "a" to "z" (offset 0 to 127, 32 entries):

0 device driver type
        0=Kernal non-disk    1=Kernal disk       2=console          3=null
        4=ramdisk            5=parallel port     6=swiftlink
1 device primary address / sl:iopage / par:0=clean,1=network
2 device secondary address / sl:recvBufSize(1-27)
3 flags / kd:$80=device has CMD real-time clock

Other:

OFF  SIZ  DESC
---  ---  ----
$80    1  ramlink device number
$81    1  ramlink last logical bank allowed to use plus one (norm 255)
$82    4  real-time clock devices to check [4], 255=unused, 254=SmartWatch
$86    1  screen saver activation time (in minutes)
$87    1  RTS assertion-to-modem-acceptance delay period (norm 40)
$88    8  -unused-
$90   12  default date in BDC YY:YY:MM:DD:hh:mm:ss:tt:tw:GH:gm:aa
$9c    4  time-zone string: 3 char + null, lowercase
$A0    1  C128 bank1 start free page (norm $04)
$A1    1  C128 bank1 last free page plus one (norm $ff)
$A2    1  C128 expanded internal memory type:
          0=none, 1=Curcio-256K/512K, 2=Pessi-256K/512K/1024K
$A3    1  C128 bank0 last allowed free page plus one (norm $ff)
$A4    1  C64 soft-80 non-REU _minimum_ prescrolling amount (norm 5)
$A5    1  C128 last internal bank allowed to use above 2, plus one (norm 8)
$A6    1  C128 first REU bank allowed to use (norm 0)
$A7    1  C128 last REU bank allowed to use plus one (norm 255)
$A8    1  C128 top page of TPA (stack) (norm $c0)
$A9    1  C128 VDC standard row count (norm 25)
$AA    1  C128 kilobytes of VDC RAM (norm 16)
$AB    1  C64 soft-80 REU-hardware-scroll prescroll amount (norm 1)
$AC    1  C128 80-col prescroll amount (norm 99)
$AD    1  C128 40-col prescroll amount (norm 99)
$AE    1  C64 soft-80 software-scoll prescroll amount (norm 99)
$AF    1  C64 40-col prescroll amount (norm 99)
$B0    8  C128 80-col color palette: table of eight RGBI codes, offsets:
          0=char,1=cursor,2=status,3=separat,4=hilite,5=alert,6=border,7=screen
$B8    8  C128 40-col color palette
$C0    1  C64 bitmap flags: $80=allow soft-80, $40=make default, $20=REU-scroll
$C1    1  C64 last allowed page free plus one (norm $ff)
$C2    1  C64 first REU bank allowed to use (norm 0)
$C3    1  C64 last REU bank allowed to use (norm 255)
$C4    1  C64 expanded internal memory type: 0=none, 1=Pessi-256K
$C5    1  C64 end expanded internal memory banks plus one (norm 4)
$C6    1  C64 top page of stack (norm $c0)
$C7    1  video type: 0=NTSC, 1=PAL  (default 0)
$C8    1  key repeat delay in jiffies (norm 20)
$C9    1  key repeat rate in jiffies (norm 3)
$CA    1  console color enable: $80=text, $40=color (default $80)
$CB    1  input line scrollback line count (default 5)
$CC    1  controller port #1 device: 0=none, 1=joystick, 2=mouse (default 2)
$CD    1  controller port #2 device: 0=none, 1=joystick, 2=mouse (default 1)
$CE    1  C128 VDC maximum number of allowed display rows
$CF    1  C128 VDC normal-to-interlaced-crossover number of display rows
$D0    8  C64 80-col color palette (for bitmapped hi-res 80-col screen)
$D8    8  C64 40-col color palette
$E0    1  RamLink-RAM partition number
$E1   13  RamLink-RAM partition name string
$EE    1  RamLink-Indirect-REU partition number
$EF   17  RamLink-Indirect-REU partition name string
$100  32  initial/home working directory ("a:")
$120  32  user-definable keymatrix-table file, or null ("")
$140  64  default shell executable-search-path string ("z:","a:",".:","b:"...)
$180  64  configuration file .xxxrc search path ("z:", "a:", ".:")
$1C0  32  temporary directory name (".:")
$1E0  32  name of characterset to load on bootup ("acechr-commodore")
$200   0  -END-

5. CHARACTER-SET FILE FORMAT

Character sets are stored in a custom format: a 16-byte header followed by a
32-byte special-character palette followed by a 2048-byte 8-bit-wide
characterset followed by a 2048-byte 4-bit-wide characterset.  The best way
to edit this file is with a machine-language monitor.  I can't remember the
exact format of the header right now, so I'll save that until next time.
The character palette points to the characters that will be used for the
codes $80 to $9f in the following displayable character set (Commodore+ISO):

          Craig's Handy ACE PETSCII OUTPUT Guide (including ISO-8859-1)

  0/00 ___rvs_@___   64/40 _____@_____  128/80 __bullet___  192/c0 _____`_____
  1/01 ___rvs_a___   65/41 _____a_____  129/81 __v_line___  193/c1 _____A_____
  2/02 ___rvs_b___   66/42 _____b_____  130/82 __h_line___  194/c2 _____B_____
  3/03 ___rvs_c___   67/43 _____c_____  131/83 ___cross___  195/c3 _____C_____
  4/04 ___rvs_d___   68/44 _____d_____  132/84 _tl_corner_  196/c4 _____D_____
  5/05 ___rvs_e___   69/45 _____e_____  133/85 _tr_corner_  197/c5 _____E_____
  6/06 ___rvs_f___   70/46 _____f_____  134/86 _bl_corner_  198/c6 _____F_____
  7/07 _BEL/rvs_g_   71/47 _____g_____  135/87 _br_corner_  199/c7 _____G_____
  8/08 ___rvs_h___   72/48 _____h_____  136/88 ___l_tee___  200/c8 _____H_____
  9/09 _TAB/rvs_i_   73/49 _____i_____  137/89 ___r_tee___  201/c9 _____I_____
 10/0a _BOL/rvs_j_   74/4a _____j_____  138/8a ___t_tee___  202/ca _____J_____
 11/0b ___rvs_k___   75/4b _____k_____  139/8b ___b_tee___  203/cb _____K_____
 12/0c ___rvs_l___   76/4c _____l_____  140/8c ___heart___  204/cc _____L_____
 13/0d _CR_/rvs_m_   77/4d _____m_____  141/8d __diamond__  205/cd _____M_____
 14/0e ___rvs_n___   78/4e _____n_____  142/8e ___club____  206/ce _____N_____
 15/0f ___rvs_o___   79/4f _____o_____  143/8f ___spade___  207/cf _____O_____
 16/10 ___rvs_p___   80/50 _____p_____  144/90 _s_circle__  208/d0 _____P_____
 17/11 _VT_/rvs_q_   81/51 _____q_____  145/91 __circle___  209/d1 _____Q_____
 18/12 ___rvs_r___   82/52 _____r_____  146/92 ___pound___  210/d2 _____R_____
 19/13 ___rvs_s___   83/53 _____s_____  147/93 _CLS/check_  211/d3 _____S_____
 20/14 _BS_/rvs_t_   84/54 _____t_____  148/94 ____pi_____  212/d4 _____T_____
 21/15 ___rvs_u___   85/55 _____u_____  149/95 ____+/-____  213/d5 _____U_____
 22/16 ___rvs_v___   86/56 _____v_____  150/96 __divide___  214/d6 _____V_____
 23/17 ___rvs_w___   87/57 _____w_____  151/97 __degree___  215/d7 _____W_____
 24/18 ___rvs_x___   88/58 _____x_____  152/98 _c_checker_  216/d8 _____X_____
 25/19 ___rvs_y___   89/59 _____y_____  153/99 _f_checker_  217/d9 _____Y_____
 26/1a ___rvs_z___   90/5a _____z_____  154/9a _solid_sq__  218/da _____Z_____
 27/1b ___rvs_[___   91/5b _____[_____  155/9b __cr_char__  219/db _____{_____
 28/1c ___rvs_\___   92/5c _____\_____  156/9c _up_arrow__  220/dc _____|_____
 29/1d ___rvs_]___   93/5d _____]_____  157/9d _down_arro_  221/dd _____}_____
 30/1e ___rvs_^___   94/5e _____^_____  158/9e _left_arro_  222/de _____~_____
 31/1f _rvs_under_   95/5f _UNDERLINE_  159/9f _right_arr_  223/df ___HOUSE___
 32/20 ___SPACE___   96/60 _A`_grave__  160/a0 _req space_  224/e0 _a`_grave__
 33/21 _____!_____   97/61 _A'_acute__  161/a1 _!_invertd_  225/e1 _a'_acute__
 34/22 _____"_____   98/62 _A^_circum_  162/a2 ___cent____  226/e2 _a^_circum_
 35/23 _____#_____   99/63 _A~_tilde__  163/a3 ___pound___  227/e3 _a~_tilde__
 36/24 _____$_____  100/64 _A"_dieres_  164/a4 __currency_  228/e4 _a"_dieres_
 37/25 _____%_____  101/65 _A__ring___  165/a5 ____yen____  229/e5 _a__ring___
 38/26 _____&_____  102/66 _AE________  166/a6 _|_broken__  230/e6 _ae________
 39/27 _____'_____  103/67 _C,cedilla_  167/a7 __section__  231/e7 _c,cedilla_
 40/28 _____(_____  104/68 _E`_grave__  168/a8 __umulaut__  232/e8 _e`_grave__
 41/29 _____)_____  105/69 _E'_acute__  169/a9 _copyright_  233/e9 _e'_acute__
 42/2a _____*_____  106/6a _E^_circum_  170/aa __fem_ord__  234/ea _e^_circum_
 43/2b _____+_____  107/6b _E"_dieres_  171/ab _l_ang_quo_  235/eb _e"_dieres_
 44/2c _____,_____  108/6c _I`_grave__  172/ac ____not____  236/ec _i`_grave__
 45/2d _____-_____  109/6d _I'_acute__  173/ad _syl_hyphn_  237/ed _i'_acute__
 46/2e _____._____  110/6e _I^_circum_  174/ae _registerd_  238/ee _i^_circum_
 47/2f _____/_____  111/6f _I"_dieres_  175/af _overline__  239/ef _i"_dieres_
 48/30 _____0_____  112/70 _D-_Eth_lr_  176/b0 __degrees__  240/f0 _o^x_Eth_s_
 49/31 _____1_____  113/71 _N~_tilde__  177/b1 ____+/-____  241/f1 _n~_tilda__
 50/32 _____2_____  114/72 _O`_grave__  178/b2 _2_supersc_  242/f2 _o`_grave__
 51/33 _____3_____  115/73 _O'_acute__  179/b3 _3_supersc_  243/f3 _o'_acute__
 52/34 _____4_____  116/74 _O^_circum_  180/b4 ___acute___  244/f4 _o^_circum_
 53/35 _____5_____  117/75 _O~_tilde__  181/b5 ____mu_____  245/f5 _o~_tilde__
 54/36 _____6_____  118/76 _O"_dieres_  182/b6 _paragraph_  246/f6 _o"_dieres_
 55/37 _____7_____  119/77 __multiply_  183/b7 __mid_dot__  247/f7 __divide___
 56/38 _____8_____  120/78 _O/_slash__  184/b8 __cedilla__  248/f8 _o/_slash__
 57/39 _____9_____  121/79 _U`_grave__  185/b9 _1_supersc_  249/f9 _u`_grave__
 58/3a _____:_____  122/7a _U'_acute__  186/ba __mas_ord__  250/fa _u'_acute__
 59/3b _____;_____  123/7b _U^_circum_  187/bb _r_ang_quo_  251/fb _u^_circum_
 60/3c _____<_____  124/7c _U"_dieres_  188/bc ____1/4____  252/fc _u"_dieres_
 61/3d _____=_____  125/7d _Y'_acute__  189/bd ____1/2____  253/fd _y'_acute__
 62/3e _____>_____  126/7e _cap_thorn_  190/be ____3/4____  254/fe _sm_thorn__
 63/3f _____?_____  127/7f _Es-sed_B__  191/bf _?_invertd_  255/ff _y"_dieres_

The images of the characters in the charactersets each take up eighty bytes
and are ordered as in the table above.  The 8-bit-wide is in the regular
format, and the four-bit-wide images are arranged as two images of each
character in the upper and lower nybbles of the eight bytes used to encode
them.

6. KEYMATRIX FILE FORMAT

The keymatrix file format is simply concatenation of seven arrays of 88
bytes each.  The 88-byte arrays contain the character codes to generate for
when a user pressed one of the following physical keys:

    \                           COLUMNS:
ROWS:\
      \    0       1       2       3       4       5       6       7
       +-------+-------+-------+-------+-------+-------+-------+-------+ code
   0   | DELETE| RETURN| RIGHT |  F7   |  F1   |  F3   |  F5   | DOWN  | (0)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   1   |   3   |   W   |   A   |   4   |   Z   |   S   |   E   |L-SHIFT| (8)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   2   |   5   |   R   |   D   |   6   |   C   |   F   |   T   |   X   | (16)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   3   |   7   |   Y   |   G   |   8   |   B   |   H   |   U   |   V   | (24)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   4   |   9   |   I   |   J   |   0   |   M   |   K   |   O   |   N   | (32)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   5   |   +   |   P   |   L   |   -   |   .   |   :   |   @   |   ,   | (40)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   6   |   \   |   *   |   ;   | HOME  |R-SHIFT|   =   |   ^   |   /   | (48)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   7   |   1   |   _   |CONTROL|   2   | SPACE |COMMODR|   Q   | STOP  | (56)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   8   | HELP  |   8   |   5   |  TAB  |   2   |   4   |   7   |   1   | (64)
       +-------+-------+-------+-------+-------+-------+-------+-------+
   9   |  ESC  |   +   |   -   |  LF   | ENTER |   6   |   9   |   3   | (72)
       +-------+-------+-------+-------+-------+-------+-------+-------+
  10   |  ALT  |   0   |   .   |  UP   | DOWN  | LEFT  | RIGHT |NO-SCRL| (80)
       +-------+-------+-------+-------+-------+-------+-------+-------+

Note that the C128's keyboard has all eleven rows (0-10) whereas the C64's
keyboard only has the first eight (0-7).  The entires with $00 mean that
pressing the associated key does nothing.  There are multiple key matrices
to produce the codes for use with various "shift" keys.  The order of the
seven key matrices is:

    1. Normal (unshifted)
    2. Shift
    3. Commodore
    4. Control
    5. Alternate
    6. CapsLock
    7. Shift+Commodore

The character codes generated should correspond to the following table:

                Craig's Handy ACE PETSCII INPUT Guide (ISO-8859-1)

  0/00 _____   64/40 _____@_____  128/80 ___Ct-F1___  192/c0 __Sh-*__`__
  1/01 _Ct-RETURN_   65/41 _____a_____  129/81 ___Co-1____  193/c1 _____A_____
  2/02 __Sh-TAB___   66/42 _____b_____  130/82 ___Ct-F3___  194/c2 _____B_____
  3/03 ___STOP____   67/43 _____c_____  131/83 __Sh-STOP__  195/c3 _____C_____
  4/04 ___HELP____   68/44 _____d_____  132/84 __Sh-HELP__  196/c4 _____D_____
  5/05 ___Ct-2____   69/45 _____e_____  133/85 ____F1_____  197/c5 _____E_____
  6/06 __Sh-LEFT__   70/46 _____f_____  134/86 ____F3_____  198/c6 _____F_____
  7/07 ___Sh-LF___   71/47 _____g_____  135/87 ____F5_____  199/c7 _____G_____
  8/08 __Co-DEL___   72/48 _____h_____  136/88 ____F7_____  200/c8 _____H_____
  9/09 ____TAB____   73/49 _____i_____  137/89 ____F2_____  201/c9 _____I_____
 10/0a _LINEFEED__   74/4a _____j_____  138/8a ____F4_____  202/ca _____J_____
 11/0b _Sh-RIGHT__   75/4b _____k_____  139/8b ____F6_____  203/cb _____K_____
 12/0c ___Co-UP___   76/4c _____l_____  140/8c ____F8_____  204/cc _____L_____
 13/0d __RETURN___   77/4d _____m_____  141/8d _Sh-RETURN_  205/cd _____M_____
 14/0e _Sh-ESCAPE_   78/4e _____n_____  142/8e ___Ct-F5___  206/ce _____N_____
 15/0f __Co-DOWN__   79/4f _____o_____  143/8f ___Ct-F7___  207/cf _____O_____
 16/10 __Co-LEFT__   80/50 _____p_____  144/90 ___Ct-1____  208/d0 _____P_____
 17/11 ___DOWN____   81/51 _____q_____  145/91 ____UP_____  209/d1 _____Q_____
 18/12 ____RVS____   82/52 _____r_____  146/92 __RVS-OFF__  210/d2 _____R_____
 19/13 ___HOME____   83/53 _____s_____  147/93 ____CLR____  211/d3 _____S_____
 20/14 ____DEL____   84/54 _____t_____  148/94 ___INST____  212/d4 _____T_____
 21/15 _Co-RIGHT__   85/55 _____u_____  149/95 ___Co-2____  213/d5 _____U_____
 22/16 ___Ct-UP___   86/56 _____v_____  150/96 ___Co-3____  214/d6 _____V_____
 23/17 __Ct-DOWN__   87/57 _____w_____  151/97 ___Co-4____  215/d7 _____W_____
 24/18 __Ct-TAB___   88/58 _____x_____  152/98 ___Co-5____  216/d8 _____X_____
 25/19 __Ct-LEFT__   89/59 _____y_____  153/99 ___Co-6____  217/d9 _____Y_____
 26/1a _Ct-RIGHT__   90/5a _____z_____  154/9a ___Co-7____  218/da _____Z_____
 27/1b ____ESC____   91/5b _____[_____  155/9b ___Co-8____  219/db __Sh-+__{__
 28/1c ___Ct-3____   92/5c _____\_____  156/9c ___Ct-5____  220/dc __Sh-\__|__
 29/1d ___RIGHT___   93/5d _____]_____  157/9d ___LEFT____  221/dd __Sh--__}__
 30/1e ___Ct-6____   94/5e _____^_____  158/9e ___Ct-8____  222/de __Sh-^__~__
 31/1f ___Ct-7____   95/5f _BACKARROW_  159/9f ___Ct-4____  223/df _Sh-BACKAR_
 32/20 ___SPACE___   96/60 ___Alt-@___  160/a0 __Comm-@___  224/e0 __Ctrl-@___
 33/21 _____!_____   97/61 ___Alt-A___  161/a1 __Comm-A___  225/e1 __Ctrl-A___
 34/22 _____"_____   98/62 ___Alt-B___  162/a2 __Comm-B___  226/e2 __Ctrl-B___
 35/23 _____#_____   99/63 ___Alt-C___  163/a3 __Comm-C___  227/e3 __Ctrl-C___
 36/24 _____$_____  100/64 ___Alt-D___  164/a4 __Comm-D___  228/e4 __Ctrl-D___
 37/25 _____%_____  101/65 ___Alt-E___  165/a5 __Comm-E___  229/e5 __Ctrl-E___
 38/26 _____&_____  102/66 ___Alt-F___  166/a6 __Comm-F___  230/e6 __Ctrl-F___
 39/27 _____'_____  103/67 ___Alt-G___  167/a7 __Comm-G___  231/e7 __Ctrl-G___
 40/28 _____(_____  104/68 ___Alt-H___  168/a8 __Comm-H___  232/e8 __Ctrl-H___
 41/29 _____)_____  105/69 ___Alt-I___  169/a9 __Comm-I___  233/e9 __Ctrl-I___
 42/2a _____*_____  106/6a ___Alt-J___  170/aa __Comm-J___  234/ea __Ctrl-J___
 43/2b _____+_____  107/6b ___Alt-K___  171/ab __Comm-K___  235/eb __Ctrl-K___
 44/2c _____,_____  108/6c ___Alt-L___  172/ac __Comm-L___  236/ec __Ctrl-L___
 45/2d _____-_____  109/6d ___Alt-M___  173/ad __Comm-M___  237/ed __Ctrl-M___
 46/2e _____._____  110/6e ___Alt-N___  174/ae __Comm-N___  238/ee __Ctrl-N___
 47/2f _____/_____  111/6f ___Alt-O___  175/af __Comm-O___  239/ef __Ctrl-O___
 48/30 _____0_____  112/70 ___Alt-P___  176/b0 __Comm-P___  240/f0 __Ctrl-P___
 49/31 _____1_____  113/71 ___Alt-Q___  177/b1 __Comm-Q___  241/f1 __Ctrl-Q___
 50/32 _____2_____  114/72 ___Alt-R___  178/b2 __Comm-R___  242/f2 __Ctrl-R___
 51/33 _____3_____  115/73 ___Alt-S___  179/b3 __Comm-S___  243/f3 __Ctrl-S___
 52/34 _____4_____  116/74 ___Alt-T___  180/b4 __Comm-T___  244/f4 __Ctrl-T___
 53/35 _____5_____  117/75 ___Alt-U___  181/b5 __Comm-U___  245/f5 __Ctrl-U___
 54/36 _____6_____  118/76 ___Alt-V___  182/b6 __Comm-V___  246/f6 __Ctrl-V___
 55/37 _____7_____  119/77 ___Alt-W___  183/b7 __Comm-W___  247/f7 __Ctrl-W___
 56/38 _____8_____  120/78 ___Alt-X___  184/b8 __Comm-X___  248/f8 __Ctrl-X___
 57/39 _____9_____  121/79 ___Alt-Y___  185/b9 __Comm-Y___  249/f9 __Ctrl-Y___
 58/3a _____:_____  122/7a ___Alt-Z___  186/ba __Comm-Z___  250/fa __Ctrl-Z___
 59/3b _____;_____  123/7b ___Alt-[___  187/bb __Comm-[___  251/fb __Ctrl-[___
 60/3c _____<_____  124/7c ___Alt-\___  188/bc __Comm-\___  252/fc __Ctrl-\___
 61/3d _____=_____  125/7d ___Alt-]___  189/bd __Comm-]___  253/fd __Ctrl-]___
 62/3e _____>_____  126/7e ___Alt-^___  190/be __Comm-^___  254/fe __Ctrl-^___
 63/3f _____?_____  127/7f _Alt-BAKAR_  191/bf _Comm-BKAR_  255/ff _Ctrl-BKAR_

7. VBM FILE FORMAT

There are two VBM file formats in existence: Version #2 and Version #3.  For
Version #3, there are two variations available: Compressed and Uncompressed.
All VBM files begin with the following three-byte identifier: $42, $4d, $cb.
This is followed by the version number, either $02 or $03, followed by the
image width and height, each encoded in 16 bits in high/low order.

For Version #2 images, the image data follows, but Version #3 images have
more header information: five bytes for the compression-encoding meta data
followed by a two $00 bytes (reserved), followed by a 16-bit high/low field
giving telling the length of the comment block, followed by up to 64K of
comment text (in PETSCII), followed by the image data.  If the image is
compressed, then the compression-encoding meta data is: the repeat code
(usually $XX: for coding repetitions of any arbitrary image byte), the zero
code (usually $XX, for coding three or more repetitions of the image-byte
$00), the ... oh never mind.  I'll fill this in next time.  You can examine
the C program to see how the images are encoded.

8. CONCLUSION

Cool eh?


[Back to the ACE Page]