SIGNS.DOC Version 4.1 by Robert W. Bloom 22 December 1986 Release Notice: Signs and all associated files (Signs, Gsigns, Font#, MakeFont, etc.) are freely released to the public for non-profit use. If anybody's going to profit, it should be me! Anywhat, this is my contribution for all the great programs I've received free: NSWP, NULU, VDO, ZCPR, SQ/UNSQ, etc. Thanks guys! Revision History: Signs: 1.x - March 86, first versions, menu driven. GSigns created. 2.x - May 86, all screen oriented. 3.x - Jun 86, bit mapped font files, released w/MakeFont Version 2.0. New features: inverse video, user changeable single block character, inter- character spacing, block_char used for fill in inverse video. 4.0 - 25 Oct 86, added bit-mapped output, .DAT assumed for font-files. 4.1 - 27 Oct 86, errors corrected: default file extensions, add initial for printing set-up, correct some initialization problems. Library released with 3 font files (font1, font2, gothfont) 4.1 - 22 Dec 86, MS-DOS version released as one continuous source file (no include files needed) and patched so that 'Gothfont' fit. MakeFont: 1.x - March 86, creates byte-mapped font files 2.0 - Jun 86, creates bit- mapped font files 2.1 - 8 Jul 86, minor change to open/close file routine to report errors. 2.2 - (lost) 2.3 - 27 Oct 86, made filename extensions optional. GSigns 1.2 - Version for Pascal MT+, byte-mapped font files 3.2a - 28 Jul 86, Version 3.2 of Signs with all screen handling and printer codes removed. Main code routines reworked for menu-redisplay on first entry and demand. GMakeFnt 1.0 - Version for Pascal MT+, creates byte-mapped font files for Gsigns12. Background: I was never happy with the sign- and banner-making programs available for CP/M. Sure there were a number of good ones, specially 'GOTHIC,' but none have enough variability to suit me. By variability, I mean the capability to change sizes, fonts, and paper positioning to create whatever I wanted. What I really wanted was a 'Print Shop' for CP/M-80. Alas, it's not available and it looks as if no one is developing any new stuff for my favorite OS. I though the problem was solved when I ran across a set of two programs by Ken Crook in Pascal. I was just learning Pascal, so I thought this would be a good way to get some fun education. Unfortunately, the program was not written very well - although some good options were present, I couldn't even compile the programs (called 'sign' and 'banner') as they wouldn't fit in memory. (CP/M-80, TurboPascal, 63k, error messages off.) The main problem was that all of the character fonts were held in memory at one time. Even eliminating all the symbols and keeping just numbers and upper case letters yielded a com file of 36k. (Besides, input was taken from a file not the console, which was a pain.) Features: So I decided to start over and write my own. Major features of my program are: - Fonts are held in an external data file and a random access method reads only the required characters into memory when they are needed. Different data files may hold different fonts. - Signs and Banners are made with the same program by changing an option. They may be output to the console, a file, or lst: device (printer). Lots of other options are available. (see below) - A separate program is provided to create font files. The input to the makefont program is a file modifiable by any text-editor. (I may write a separate font editor is in the works - ASCII font files can be quite large.) - Two font sets are supplied: one with characters that are up to 12 units high counting a two block desender and up to 10 blocks wide; and one which is four times wider and twice as high. Characters less than the maximum width are printed proportionally. (An extra-large font, from 'GOTHIC' is also supplied for those with lots of RAM.) - If printing, one can change the cpi and lpi from the menu which automatically adjusts the printer. Input lines are checked to see if they will fit. Normal (80) and wide (132) terminals, as well as small (8") and large (14") printers are correctly handled. The user can even request output in "reverse video" (White letters, black background instead of black letters on a white background.) - The letters of the output sign/banner can be made of the letter itself, any single character, a 'overstrike' block to make a nice black solid block or individual dots using the graphics mode of the printer. (Naturally the graphics dot-mode will create much smaller letters and is strongly printer dependant. Currently it is written for the IDS (or DataProducts) printer. OKI is very similar.) I think you'll find that the program is self-explanatory. Once selected, a option does not change until manually changed. This allows changing just one option quickly. Some options eliminate others. Files: There are four basic libraries: TSIGNS, MSIGNS, ISIGNS, and GSIGNS. Generally speaking, TSIGNS contains sources, MSIGNS contain generic executables (CP/M-80), GSIGNS generic Z80 code and executables, and ISIGNS an MS-DOS version with source including a extra-large gothic font. Most files are crunched, squeezed and archived. If you have CP/m-80 TurboPascal, all you need is TSIGNS.LBR. If you don't but can run Z80 code, get GSIGNS or later. If all you can run is 8080 code you need is MSIGNS. IBM people get ISIGNS and the extra-large GOTHIC font. Major file break-down is: TSIGNS contains: READ.ME - unsqueezed introduction to signs. FONT1.ASC \ FONT2.ASC / ASCII files of character fonts, modify at will. Use with MakeFont to create FONT1.DAT and FONT2.DAT which is used as the font files by SIGNS.COM. FONT1 is 10x12, FONT2 is 40x24. MAKEFONT.PAS - (MakeFont) source code for font generator - asks for input and output filenames. Changes .ASC font file into a .DAT font file. SIGNS.PAS \ SIGNS0.PAS \ SIGNS1.PAS \ - source code for sign generator. SIGNS2.PAS / SIGNS3.PAS / SIGNS4.PAS / SIGNS.IN - sample file input, contains all printable characters. SIGNS.OUT - sample output file from signs.in SIGNS.DOC - this file. POP.PAS - make your machine go 'pop' MSIGNS Contains: GSIGNS12.SRC - Generic Pascal version (no TurboPascal functions and considerably less sophisicated.) GSIGNS12.COM - CP/M-80 object code from above GMAKEFNT.SRC - source code for font generator - asks for input and output filenames. GMAKEFNT.COM - CP/M-80 object code (max size 20w by 24h) GCHARS.DAT - created by GMAKEFNT, used by GSIGNS12. GFONT.ASC - old copy of FONT1.ASC (in a slightly different format) as used in the SIGNS.LBR above and used to create GCHARS.DAT (10x12 font) GREAD.ME - very brief introduction to gsigns. GSIGNS Contains: GSIGNS32.PAS - Source, but if you need source use the full SIGNS. GSIGNS32.COM - CP/M-80 object code (Z80) FONT1.DAT \ FONT2.DAT / font files, ready to run MAKEFONT.COM - font generator (object code of source in the full SIGNS library. To run this, you'll also need the sources for the Font files from TSIGNS. ISIGNS contains: GOTHFONT.FF - A file of all characters as output by 'GOTHIC' in banner form GOTHMASC.PAS - a Pascal program to convert the GOTHFONT.FF file to a GOTHFONT.ASC file which MakeFont could read. (Note: this .ASC file still needs some touch up before converting to .DAT) GOTHFONT.ASC - the ASCII font file after being touched-up GOTHSN.PAS - Signs source patched for the gothic font GOTHMF.PAS - MakeFont source patched for the gothic font POP.PAS - make your machine go 'pop' Compiling: Executable files are included for GSIGNS, MAKEFONT and in ISIGNS. GSIGNS12.COM and GMAKEFNT were created for CP/M-80 by DR's Pascal MT+ so should run on nearly anything with a 8080, Z80 or compatible. The GSIGNS32.COM version was compiled with TurboPascal and so needs a Z80. The full Signs version has to be compile for your hardware using a Pascal compiler. TurboPascal will work best as several Turbo-specific functions are used. You will also have to create a new FONT#.DAT files from FONT#.ASC using MakeFont before running SIGNS. See below for hardware and version specific comments. Note that the font.DAT files are NOT interchangeable accross different Pascal compilers. GSIGNS12 uses different font.dat files than GSIGNS32 and SIGNS40. Likewise, the MS-DOS font.dat files are different than CP/M's. COM files in ISIGNS were created on a full-up Zenith 248. GSIGNS12 is also considerably less capable; I had to create the generic version for a homework assignment for a class I'm took; it's thrown in here 'for free.' Some SIGNS functions NOT included in GSIGNS12 are: . Hex input, . bit-mapped font files, . fonts with greater than 95 characters, . reporting of font size, . direct list device output nor any printer codes at all, . screen-oriented menus, . concurrent parameter editing and text input. It has 2 menus: a control and a parameter menu. Note that the .DAT font files are *not* compatible with Signs. Gsigns are byte mapped, Signs are bit mapped. The .DAT files created by GmakeFnt will be 8 times larger! The .ASC files are compatible. Excuteable version have been compiled with a maximum 20 wide by 24 high font size. The Gchars.DAT file included is 10x12, and was created from FONT1.ASC of Signs. Some Gsigns options have difference call letters than Signs. Suggestion: buy TurboPascal! GSIGNS32 has most of the functionality of SIGNS40 with several significant omissions. No screen and printer codes are included, and bit- mapped outputs are not supported. One can do practically all the same operations with both (except the bit-mapped output of course), but the program doesn't have as much 'dash' and 'flash'. Minimal bells and whistles are provided. Notes: - The ASC fontfiles must be in ASCII character order and follow a specific format as detailed below to be successfully converted by MakeFont. - some options are disabled with other options. For instance, if one selects console output, you don't see any printer options. Or if you enter a given left margin to use, the output centering option is disabled. (To center the output after zeroing a previously-given left margin, one has to manually enter 'y' to centering as a non-zero left margin sets centering to 'no'.) Non-applicable menu items are not displayed. - the source code (SIGNS.PAS and the five SIGNS#.PAS) as supplied in the library will compile to a file with TurboPascal in a minimum 56k CP/M-80 system. Alternatively, one can edit SIGNS.PAS, remove the include lines (which look like {$I SIGNS#}) and copy in the SIGNS#.PAS files at those locations to make one long source code file. If combined into one long source it is compileable directly on the 16-bit PCs with TurboPascal. (I will *not* say the magic three letters!) - beware of hardware differences in printers. If in doubt, turn dump printer switch on and avoid bit-mapped graphics output. Options: Upon entry to the program one is placed directly in "change parameters" mode. A options menu is shown. (see below) Upon entry of a 'X' or , one is placed in "input text" mode. In this mode of control characters is shown. One can: - send a formfeed to the printer ('^F' or '^L'), - send a reverse formfeed to printer to return to TOF ('^T'), - goto the options menu and change the program parameters ('^P'), - exit program ('^C' or '^D'), - backspace ('^H' or ), - ask to redisplay the menu again ('^R'), - delete entered line and start over ('^X'), or - enter alternate input routine to enter hex characters ('^A') - anything else is entered into the line to be printed. (You CAN mix input and control characters, i.e. enter the input line, strike a ^P to change the parameters, and return to input line without losing anything.) The alternate input routine (^A) prompts you to enter a HEX code of a character. These can be put to good use if you have defined more than the standard 96 characters in the fontfile. Entries less than 20H or greater than FFh are rejected, others are appended to the input string. The decimal value is echoed as the character is appended. Enter a to return to normal input. A run-time error occurs if the character requested has a HEX code larger than the number of records in the font file, so don't do that. On the options menu one can change: - Font_file: One can change the name of the font file to be used at any time. If the filename entered it not found, an error message and '????' will be shown for the filename. If found, the size of the font will be shown. An filename extension of .DAT will be assumed for all entered filenames. - Sign_type: Signs are horizontally printed across page, banners are vertically printed down page - Block_type: The character that makes up the signs can either be the letter printed, solid block, or bit-mapped. Blocks may be made two ways, by overstriking several characters or by sending a printer a single user-defined character. (The default single block character is a 7F which prints a block in a single pass on my IDS printer - this probably will not work for other type printers.) If one selects single block, it will ask what character to send. For bit-mapping, each 'block' becomes a single dot in the graphics mode on a printer. For my printer with 84 dot/inch, the output line is 8 inches or 672 'characters' wide. When entering bit mode, the width of the output line is automatically set by assigning Max_Length to Given_width. Set Given_Width back to zero to return to autosizing. - Mult_w,Mult_h: The output may be doubled, tripled, etc. in both width and height. Enter your choice, the program will watch for overflow. - Given_offset: Enter how many characters shold be sent before printing signs or banner. This has the effect of a left margin for signs or moving banner 'left' or 'right' on the output device. (By playing with the given offset and reverse formfeed, one can get multiple lines in Banner format.) - Given_width: If not zero, the program will use this figure for the maximum number of characters per output line. Also centering, if on, will be based on this width if not zero. Automatically set to Max_Length upon entering bit-mapped mode (block_type = bit). - Centering: If no given offset, answer if output be centered on page or flush to left margin. - Intercharacter_spacing: Allows one to change the amount of blank space between characters output. (A normal space is 6 blocks wide [10x12 font], and a normal inter-character space is 1 block wide.) - Inverse_video: Does what you think: spaces are printed as the character, and the character is printed as a space. Suggest using blocks as output - banners look strange with letters (try it!). Signs are made all of the first character in the line. All fully blank lines are filled with 'x' and all lines are filled out to the available width less one. Not available in bit-mapped graphics output mode. - Input_device: One can enter the output lines one at a time from the keyboard or take them in a bunch from a designated text file. The default filename is SIGNS.IN. If input from a file, one can specify how many copies you want. A formfeed is sent between copies if output to a printer. - Output_device: Specify output should be sent to the console screen, a text file, or the lst: device. If recording output in a file, the default name is SIGNS.OUT. If printing, one can: enter what pitch should be used (10 pica, 12 elite, 16.5 squeezed or 20 tiny [squeezed gives 132 characters per 8" line]); how many lines per inch should be used (6, 8, 10, or 12); and color (black, blue, green or red). - Device_size: If printing, indicate whether printer is 8" wide or 14" wide. If displaying on screen, indicate whether terminal is 80 characters wide or 132. Output width for file output is whatever was previously set with a maximun of Max_Length (672 characters.) Specify a given width if you want centering to a different width. - Dumb_Printer: Turning this flag on eliminated all control codes sent to the printer. To get the various line and character spacing one must set up the printer external to the program. This switch has no effect on bit-mapping output, i.e. all graphics codes are still sent to the printer. - Quit: one can quit from the options menu with a 'A'. One might need this if you forget the name of the fontfile to use and signs won't let you exit until you give it a good name. Note also that the size of the font in use is displayed, as well as the calculated available output space and approximate number of input characters that will fit. These are displayed after the font file has been opened. Hardware: There is hardware-specific code in the source in several procedures: Procedure set_up_prt contains all the character sequences necessary to set and reset the printer in the various modes (10, 12, 16.5, 20 pitch.) The code included in the distribution copy is for the IDS MicroPrism (or Prism). You will most likely have to change it for any other printer model. Note: the IDS printers can't do 20 pitch, an entry is included for easy converting to Epsons. A separate file of the set_up_prt for Epsons is included below. (This has not been tested - I don't have an Epson!) Procedure calc_width contains the actual pitches for the various conditions. Squeezed print on the IDS is 16.5 pitch, Squeezed print on the Epson is 17 pitch. Tiny (20 pitch) is available on the Epson, not on the IDS. Procedure out_char outputs 'Block_Char', (defined as #127 in the CONST block as the default.) This printers a single pass block for the IDS printer. Apparently the standard mode on the Epson printer doesn't have a one-pass block character (only in 'IBM-mode'.) I advise not to use block mode with the Epson, use overstrike mode to print blocks or define the single pass 'block' character as a '*' or 'X'. Procedure main outputs strings to the printer for formfeed (^L - that's pretty standard) and reverse formfeed (H0$G0$ - that's not standard). Procedure gdump outputs one graphics line to the IDS printer. The graphics line is 672 characters (8 inch) and is contained in the char array out_line. The printer is put in graphics mode, the line outputted (control- C's being doubled as necessary), returned to normal mode, and finally a cr-lf for the next line. Note that both sign_out and banner_out must call gdump directly to make sure the bottom graphic lines are outputted. Software: I used lots of built-in procedures to save code. Probably not all of these are standard and some might be unique to TurboPascal: String Procedures/Functions: LENGTH(str), VAL(str,#,err), CHR(#). Built-in terminal control Procedures/Functions: GOTOXY(x,y), CLRSCR, CLREOL. Other Procedures/Functions: IORESULT, RESET(file), OPEN(file), CLOSE(file), ASSIGN(file,fn), SEEK(file,rec), ROUND(real), TRUNC(real), ORD(var), HALT. I also used Turbo's initialized 'constants' (really variables), {$I-} and {$I+} for i/o error control, {$c-} to turn off the ^S and ^C interrupts, predefined devices (kbd,con,lst) for i/o, and the #n and ^c convention to express ASCII characters. To change number or characters for creating the overstrike block, adjust the os-char string to the appropriate characters. The length of os_char determines the number of strikes (currently the maximum length is 5). Creating new Font Files: FONT1.DAT and FONT2.DAT are ASCII readable files which have 'pictures' of each of the printable ASCII characters with their width and height. Each picture is preceeded by a line with the character in column 1 and two integers separated by spaces. The two integers are respectively the width and the height of each character. The character that makes up the picture may be any character ('X' is used in the samples) as it is used only as a marker. (If all the same marker character is used the file will squeeze better for archiving.) The first line of the fontfile contains the last revision date, it is output for information but ignored in processing. The second line has the maximum height and width of the characters. (And should match the height and width of character record number 96.) The FONT#.ASC files must have as a minimum all 96 printable ASCII characters ASCII order starting from to <~> and including . The actual character picture should start from the top (in FONT1, a ' has only 3 lines, a _ has the maximum of 12 lines) and be padded with spaces so that it is rectangular at least the given width x height. When output, all characters will be a constant (currently 12) although the pictures in the font file need not be that high (contain that many lines). For instance, is defined as a 1 high by 6 wide character in FONT1. It is actually output as Max_Height high by 6 wide. For convenience, I've ended each line in the .ASC files with an '.' so that one can tell that the picture has been correctly blocked and filled with spaces. (And to stop the TurboPascal editor from deleting the normal trailing spaces.) ASCII values starting with 127 and higher have no commonly defined printed character. You may make up your own. The font file may have up to 224 characters defined (256-32). Character number 127 must be defined as the equal to the largest character in the font file because it is used to determine the width and height of all other output. MakeFont takes the input for the ASC file and stores the output into the DAT file. The DAT file has the information in record form and has filled each record to the maximum size (12 high by 10 wide). No character can be larger than that. (unless the constants are changed both in this program and signs!) For version 3.0 and higher, the .DAT file contains a bit map record of the font rather than a byte map. Without changing the max width and height defaults, the fonts can be up to 40 wide by 24 high. If one DOES change the defaults, you have to change them in both SIGNS and MAKEFONT; and then redo all of the font files. All font files (.DAT versions) should be the same size. (Unfortunately, a 'large' 40x24 font will require the same space as a 'small' 10x12 font because of the need for fixed size records.) A bit-mapped 40x24 is somewhere around 12k, 56x120 is 72k, Byte-mapped 10x12 is 12k, 20x24 is 46k, and 40x24 is 72k. Starting in version 4.0, bit-mapped output is possible. Unfortunately, bit-mapping takes *alot* of memory. My present 64k TurboDOS (CP/M-like) system only has 1.5k left assuming a max 40x24 font and 8 inch graphics output at 84 dpi. (The program must allocate an character array of Max_Height by Max_Length; this is 16k with the present parmeters.) GOTHFONT: I like the font of the public domain program 'GOTHIC'. I tried to create a font file of it. Unfortunately, two thing went wrong - GOTHIC outputs as banners only (character printed down page) and Makefont expects a Sign-type input (character printed across); and gothic is a *big* font. Somewhere around 105 high by 55 wide. I captured the GOTHIC output in a disk file and cleaned it up by removing overstrikes. Then created a program to convert the modified output to a MAKEFONT .ASC input file. Created the font, 55x105. Tried to recompile Signs for the larger font. No way will it ever fit in memory with the present program design. The out-array for sign output requires a character array 55x672 for a 8 inch line. That's over 36k! Maybe you MS-DOS people have enough RAM - I don't. And I don't have any really algorythyms to reduce the spave requirements. The .DAT file itself is some 72k. Therefore. the GOTHFON files are provided 'for information only'. Bugs I have detected one bug that the cure is worse than the bug. If one defines a input string that, when converted with the current paramaters *exactly* matches the available width, the output will probably be double spaced. This is because most printers and terminals that I know do a automatic when the last printing character on a line is printed. The cure is to reduce the output width by one which will give an overflow error in analysis of the line. I decided it wasn't worth it. Note that during 'inverse video' output, the lines are filled to the available width minus one to take care of just this problem. Gsigns12 does not output overstrike blocks correctly to the screen. They are correct when output to a file. I think this is a MT+ Pascal problem. I don't plan to support the two Gsigns versions, Signs 'maybe'. Notes on Programming Techniques: I have a tendency to write my Pascal procedures and functions too long according to classical thought. (So much for classical thought.) However, the long procedures all contain just one idea (or menu) and couldn't be easily and clearly broken. Main, out_sign, out_banner, and check_sign are also too long according by my Pascal Perfesser. (What does he know, anyhow? - how to spell professor for one!) Anywhat, I'll somebody else figure a good way to break it up. I've even used a couple of GOTO's (heresy!) where it was easier to use one than to figure out how to loop it. There's too many loops as it is. Purists will complain that there are too many global variables and I should have passed the record variable by pointer. Having learned by style from FORTRAN, I'm a long ways from being a purist. Speaking of style, my style of programming is different from most, I do alot of dBase II programming so have picked up its style and translated it to Pascal. In particular, BEGIN/END pairs are *not* necessarily matched up in indenting, but flow control statements more than two statements apart *are* and a terminator is used. If there's a natural 'END' there, fine; otherwise a {end} is used. Try it, I like it. One can change my defaults by changing the initized 'constants' at the top of the file. Warning: if you make input from or output to a file the default, you will somehow have to open the file in procedure main - I opened the files when the user exits from ask_parameters. Most procedures are in 'natural', i.e. FORTRAN, order. (Another throwback!) Main comes first, followed by major subroutines, closed out with utilities. This has the effect of causeing all procedures and functions to be FORWARD declared. (Or almost all - main doesn't as being the first.) The real program at the end simply annouces itself, calls main, and annouces termination. Pascal can be readable! The disp_? and ask_? procedures are not in natural order and are not forward declared. They are randomly accessed anyhow. Another warning: the program may hang if the printer is the defined output and is off-line when you exit. This happens because a reset string is sent to it even if no output is done. (assuming the dumb printer switch is off.) This may be a concern if the printer is the default output and one exits without any input. A carriage return to the entry prompt without any input characters will ask to exit. Input a space if you want a blank line to be output output. While outputting to a file, the file will remain open until program is exited or the output direction is changed. This way, multiple output lines may be stored in one file. Remember that when outputting to a file that the width is set whatever the previous maximum was. The program can handle up to 220 character wide output. Auto-centering may add more or not enough spaces than you want, so set a smaller/larger width with the given-width setting. One possible enhancement I haven't yet figured out: how to handle edit font files without requiring the .ASC file to be redone. I'm working on it "real soon now". Epson Procedures: I have been persuaded to include some of the changes needed for Epson printers. Here they are but note they have not been tested! (The changes for graphics output is not included. Somebody else, who really understands the Epson, can do this!) Change procedure set_up_prt to: PROCEDURE set_up_prt; BEGIN WRITE(lst,CHR(27),'x0',CHR(27),'5'); {draft, non-italic defaults} IF reset_prt THEN BEGIN WRITE(lst,CHR(27),CHR(18),CHR(27),'M'); {12 cpi} WRITE(lst,CHR(27),'2'); {6 lpi} WRITE(lst,CHR(27),'F',CHR(27),'H'); {Emph off, DS off} END ELSE BEGIN CASE prt_lpi OF six : WRITE(lst,CHR(27),'2'); eight : WRITE(lst,CHR(27),'0'); twelve : WRITE(lst,CHR(27),'1'); ten : WRITE(lst,CHR(27),'A'6') END; {case} CASE prt_cpi OF pica : WRITE(lst,CHR(27),CHR(18),CHR(27),'P'); squeezed : WRITE(lst,CHR(27),CHR(18),CHR(27),'M'); elite : WRITE(lst,CHR(27),CHR(15),CHR(27),'P'); tiny : WRITE(lst,CHR(27),CHR(15),CHR(27),'M'); END; {case} CASE prt_color OF black : WRITE(lst,CHR(27),'F',CHR(27),'H'); {Emph off, DS off} blue : WRITE(lst,CHR(27),'F',CHR(27),'G'); {Emph off, DS on} green : WRITE(lst,CHR(27),'E',CHR(27),'H'); {Emph on, DS off} red : WRITE(lst,CHR(27),'E',CHR(27),'G'); {Emph on, DS on} END {case} END END; Coming Attractions: (maybe) A font editor which would allow direct edits of the font file without need for the intermediate .ASC file stage. A font3 - 55x105 font based on the font of 'GOTHIC'. (note: the 55x105 font does not fit in 64k CP/M systems if a full 220 character max output width is used.) Quick Reference Chart: Input Text Mode: ^F,^L - send a formfeed to the printer ^R,^T - send a reverse formfeed to printer to return to TOF ^P - goto the options menu and change the program parameters ^D,^C - exit program ^H, - backspace ^A - Alternate input of Hex codes. ^X - delete entered line and start over - anything else is entered into the line to be printed. Change Parmeters mode: , X - check parameters entered and if ok, return to input mode F - change font filename T - change sign type B - change block/letter type W - change width of output graphic characters H - change height of output graphic characters M - enter a given left margin to use A - change auto-centering on/off V - change inverse video on/off Y - change intercharacter spacing G - enter the maximum width of output line in characters} I - change input device R - change read from input filename N - change number of copies desired O - change output device E - change output record filename S - change output device size P - change printer characters/inch L - change printer lines/inch C - change printer color D - change dumb printer on/off Q - abort exit Have fun. If anyone makes up a new, different and improved font file; or even adds new and exciting options, I would be interested in seeing it. I 'think' all the bugs are out, but one never knows ... Robert W. Bloom 46 Broadleaf Drive Newark, DE 19702