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?