IMD 1.16: 29/05/2007 11:52:19 FOGCPM.003 --FOGCPM003GRAF COM GRAF COM !"GRAF COMh#$%&'()*+,-./-10-00 85 -CPM003 DOCGRAF DOC0123456789:;<=>?GRAF DOC!@ABCDGRAF CQ +EFGHIJGRAFCIRCCQ KGRAFFILECQ LMGRAFINVTC NGRAFLINECQ OPGRAFPLOTCQ QGRAFUTILCQ RSTDEMO COMUVWXYZ[\]^_`abcdDEMO COMefghijklmnopqrstDEMO COM@!"M͎p!"M͎p!"MGp!"MGp!"Mp!"Mp!"M_ p!"M_ p pl p!"Mͽp!"Mͽp͚p!͗&!xKʹ&:xKo&D>YA$GO!͗&p!͗&!xKʹ&:xKo&D>YA$|9Ä!͗&p!͗&!͗&!"͗&!C͗&!q͗&!͗&!͗&!͗&!͗&!*͗&!Z͗&!͗&!͗&!͗&!͗&!4͗&!S͗&!͗&!͗&p!Q'!͗&p~!"!V^#V" """RCommand: RESTART? Restart command ignored. QUIT? Exit command ignored. GRAF recognizes the following commands: BORDER draws a border around the graph KILL removes all border points LINE allows the user to draw straight lines ERASE is used to erase lines CIRCLE is used to plot circles NO CIRCLE is used to erase circles PLOT allows the user to plot individual points UNPLOT removes individual points DUMP sends a copy of the graph to the printer INVERT allows color inversion: black <-> white SAVE saves a copy of an existing graph on disk GET retrieves a previously SAVEd graph TELL returns the current graph dimensions RESTART erases the current graph QUIT returns control to CP/M To execute a command, only the first letter needs to be typed (in upper or lower case). ? $!͗&!xKʹ&&"M*M@|$!QBA$^!"M!Q!9`i!9~#foU%Aͫ>!9^#VAͫ>!9ͅ>>W?>,A͘>!9^#VAͫ>!9^#V!9~#foU%Aͫ>!9ͅ>>3@>A? B!9s#r!9^#Vv!9^#VBKI`i#DM+`i!9~#foa$!9!9^#VA͘>!9`i!9~#foU%Aͫ>!9^#VAͫ>!9ͅ>>W?>,A͘>!9^#VAͫ>!9^#V!9~#foU%Aͫ>!9ͅ>>3@>A? B!9s#r!9^#V͚C$*M|!9^#VBK!`i#DM+`i!9~#foa$!9!9^#VA͘>!9`i!9~#foU%Aͫ>!9^#VAͫ>!9ͅ>>W?>,A͘>!9^#VAͫ>!9^#V!9~#foU%Aͫ>!9ͅ>>3@>A? B!9s#r!9^#Væ!9^#VBK`i#DM+`i!9~#foa$ʦ!9!9^#VA͘>!9`i!9~#foU%Aͫ>!9^#VAͫ>!9ͅ>>W?>,A͘>!9^#VAͫ>!9^#V!9~#foU%Aͫ>!9ͅ>>3@>A? B!9s#r!9^#V͚$!9!9^#VA͘>*M|!9^#V!'$!9^#VU%!9s#r!9^#V!'$!9~#foU%DM `i#DM+`i!9~#foa$!9`iA͘>!9ͅ>!9w>,Aͫ>!9ͅ>!9w>,A>W?ͫ> ! 9s#r!9^#V! 9~#fo!9^#V`i!9^#V! 9~#foU%!9^#V`i!9^#V`i!9^#V!9~#fo!9^#V`i!9^#V!9~#foU%!9^#V!'$!9^#VU%!9s#r!9^#V!'$!9~#foU%DM:`i#DM+`i!9~#foa$!9`iA͘>!9ͅ>!9w>,Aͫ>!9ͅ>!9w>,A>W?ͫ> ! 9s#r!9^#V! 9~#fo!9^#V`i͚!9^#V! 9~#foU%!9^#V`i͚!9^#V`i!9^#V!9~#fo͚!9^#V`i!9^#V!9~#foU%͚4$! 9ͅ>p>ͿAE!͗&!!DMS`i#DM+`iA! 9w>ͿAʝ`i'$Aͫ>!9ͅ>>W?ͫ>`iPY$A>Aʚ`iMArgument error in SQRT. $! 9^#V!9~#fo|$!9^#V!9~#fo|$!d ͗&pc !9^#V #+!9~#foa$c ! 9^#VBK. `i#DM+`i!9~#foa$` ͑ U ͚] (  Argument error in INVERT: command aborted. $! 9^#V!R$!9^#V!'$*M+'$U%)M^#V!9^#V!͕$!J#$*M'$!9s#r!9^#Vn#!!!K .!9s#r!9^#V!9^#V]2!9^#V!9^#V]2!`!#+!9~#fo{$ʶ!!DMÀ!`i#DM+`i*M{$ʳ!!9^#V)`iR$M^#V1z!X!!9^#V/w$!9^#Vn#!"!K .!9s#r!9^#Vz "!K!"͗&!"͗&!9^#V1"M!9^#V1"M*M'$!9s#r!K!#͗&*M!@#͗&*M!W#͗&!y"#+!9~#fo{$"!DMÙ"`i#DM+`i*M{$"!9^#V80)`iR$Ms#rÓ"q"!9^#V/r ERROR: %s does not exist on the current drive. The graph in %s has the following dimensions: Horizontal size: %3d Vertical size: %3d $!DMÁ#`i#DM+! 9^#V`i^D>`iKszʤ#{#!.`i#DM+Ks!G`i#DM+Ks!R`i#DM+Ks!F`i#DM+Ks!`iKs|g}o|/g}/o^#V#DM!99`i$|z2Kͦ$:K%}Ϳ$}}K$|Z$!}Z$|K$!}|s$}|?>o&zo&|$}|>o&|o&z2Kͦ$:K%||$/g}/o#z$/W{/_ÿ$DM!>2K))$#}o|g$ :K=2K$}:K=2K$}DM!>)) % =%}}/o|/g#}|Z$K$|g}o{_R%|%|7g}o8%{_R%)M%}}o|gN#F# N#F#zv%{z%##^#VBK^#Vz%#yʚ%###È%#x•%#~#fo}|>?o&}|>o&{_R%|g}o%|g}o~# x%!9K~#%!&|$! 9N#F!`i^!-A$=&`i#DM!P&`i^!+A$P&`i#DM!`i^2>ʂ& $`i#DM+^V&|ʓ&%Ö&$!9!9^#V!Q<Ϳ'$!P!9s!9! -7! !-7!^9^#V!9^!A$&!!9^!9DM+#|/'`i#DM+^#+s '!u!^9^#V$! 9^#V^zo'! 9~#fo#s#r+^Q9s#r#+^!0`$ʮ(9a$ʮ(!>9^#V! $!>9s#rj(.A$ )!!@9s#r#+^!0`$ )9a$ )!@9^#V! $!@9s#r(lA$I)#+^!:9!T9~#fos#rͅ>͘>)dA${)!:9!T9~#fo##s#r++^#VA͘>)eA$Ÿ)fA$Ÿ)gA$)!9!T9~#fos#rqB͐B)!:9!T9~#fo##s#r++^#VA͘>Ò+!9!!>9ͅ>ͫ>;-!9!49s#rù+!:9ͅ>p>ͿAg*!9! !>9ͅ>>ͫ>,!9!49s#r!-!69~#fo+s#rsÊ*!9! !>9ͅ>ͫ>,!9!49s#rù+!9! !>9ͅ>ͫ>;-!9!49s#rù+!9!!>9ͅ>ͫ>;-!9!49s#rù+!:9ͅ> B!49s#r'=!89s#r+eA$ +!+!!B9^#V!A$'+!/+!B9^#V!9! 9qBͲBI!9! 9!49s#r'=!89s#r!!@9s#r+!:9ͅ> B!9!69s#rsù+̀%co+d*e*f*o)s*u*x*|+!9!49~#foU%!89s#r!89^#V!@9~#fo|$+!@9^#V!89s#r!D9^#Vz1,!>9~#fo+s#r#!89~#fo|$1,!B9^#V`i$,!!69s#rN,!69~#fo#s#r!49^#V^zʑ,!69^#V!@9~#fo{$ʑ,!49~#fo#s#r+^`i$?,!D9^#Vz,!>9~#fo+s#r#!89~#fo|$,! `i$Ý,,`i$'$!9N#F!9^#V`iAͫ>!9ͅ>>m@ BK^+s! 9`iA>ͅ>3@͘>>,$!9N#F!9^#V! 9ͅ>p>ͿA-! 9ͅ> B#! 9!9ͅ>p>?p>m?͘>`i+%Aͫ>!9ͅ>>m@ B)K^+s! 9`i+%A>ͅ>3@͘>!9ͅ>ͫ>,!9$!KDM! ^z8.`i DMKͧ%5.!.!9^#V#^!+A$!9^#V^r/|j.!m.!!9^#VC9! s!A$ʎ.!|ʜ.!ß.!! s!! s#rÅ/!!9^#VC9! s!A$.!|.!..!*! s!! s#rÅ/!!9^#VC9! s!A$@/!!9^#VC9! s!A$@/!|N/!Q/! ! s! ^ͤ;! s#rÅ/!̀%r\.w.a.n/! ^#Vz¯/!͓6! s#rz¯//!! ^#V`is#r! s#r`i$! 9N#F! ^z0! ^!#/!P3! ^::!! s$!KDM`iK͵%70`i DM/0$! 9N#F! ^#V`i^#Vͧ%0! ^! #0!! ^#V! ^y:a$ʓ0!! ^#V! ^#VU%*h*j%`i~#fos#r! ^#V`is#r! ^#V! s#r!`in&#s`i~#fo#s#r+^!#$! 9^#V80DMA$F1! 9^#V80A$J1!E%PY#%$!9N#F!!9s#rÃ1!9~#fo#s#r!9^#V!9~#fo{$1!9^#Vì1+|1!9^#V80A$1!9^#V`i#DM+så1t1!9^#V$!9N#F! ^#V`i^#Vͧ%!2!P3!2!! 9^#V`i~#fo#s#r+s!`in&#%s! 9^#V!#$! 9N#F!9^#V`i#1{$ʍ2!!9^#V`i%#1{$ʸ2!`i$! 9N#F!9^#V!9~#fo$!2#͵% 3!9^#V`i#DM+^1A$3!2!9^#V$! 9N#F!$!!9^#VP3$! 9N#F! ^!#3*h#! ^#V`i^#VU%*h#! ^#V! ^q;! ^#V! ^:!`in&#s!9^#Vz3*j%`i~#fos#r!9^#Vzʔ4*l!! ^#Vͭ 6 #=y7>6#=‚7 : >µ7 A7[Ҧ7@ò7a7{7`w# .77ʸ77w#ù7{o|g 77w#7!!|a{ !9^#V*K!9}|8"K|!$!9"K!#+^! LDM!"LV8*L#"L*L{$9|ʘ8n& A$‡8n& A$ʘ8#+c8a$9`i*L)Ks#r|8n& P$8n& P$8+#+^`i#DM+sô8!`i#DM+sO8!K*L9$ 0! 9^#Vz59!99;7A:$$$.SUB$!L[9%jM͵%u9n$&|9Q9!"M!!9^#Vf7ʛ9!"M!!9^#V9!-7A$9!"M!:!-7!-7A$9!"M!:!"M!̀%9999!9^#V#u$!u#u!t"LU%%:$$! 9^#V!%$LDM!$ ^!|$l:!-7!!$ s!$! 9^#V!%$LDM!ä:!!9~#fo͵%:!9^#V!-7!!-7"M|:`i!~#fo#s#rÚ:$! 9^#V!%$LDM! ;!!9~#fo͵%m;!9^#V!-7!"-7"M|m;`i!~#fo#s#r;$! 9^#V!%$LDM!9^#V!! s#r!!# s!$! 9^#V!%$LDM!#-7!! ^#V$! 9^#V!%$L$!9!29^#Vf7!9!-7$!!-7DM A$> > >->!9~A->[->!}!9~a->{>!!9~0->:->>!9~aU>{U> o&!9~Ak>[k> o&!*MÉ>!*Mw#w#w#w*M~#~#~#~"jM*MV+^+V+^*jM"jM*Ms#r#s#r*jM*M*M"M"M*M>w#>*M~¹A#>îA=ɯ<*M*M###*? ?.??? ?+0?*M*M#L?*M*M#b?*M*M#w?*M*M#Œ?*M*M#¡?*M~/w#±?*M~?G*M^#V#~#fo))?#?DM*Ms#r#q#p*M~?W*M###~ @~w+??7~w+@ @~#!@O!vM>*MvM@y2tM*M~M@:tM2tM͠@vM*Mw#\@:tM>*MvM@y2tM*M~M@͠@zM*Mw#@:tM>!zMw#¦@> 2uM!vM~w#·@OzM!~M#@y@!vM4!uM5±@!uM5A!vM~w#@OzM!~M#Ay@@zM!~M#"A*M~M~#5A*MzM~#EA!vMw#SA> 2uM!vM~w#dAҏAvM!~M#xAҏAƒA!uM5^A*MvMw#žA?ʹA!?ʮA!<?AîA?AʹAîA?AùA?AʮAùA*Ms#r#6#6*Ms#r#zA6#6*M^#V*MB*Mw#@w#6#w+B#w6B*M~G#~@##~RB!*MuB!*Mw#@w#6#wƒB#6͏F*M~G#~@##~¨B"M͏F*M V+^+V+^+V+^+V++~@_+~怳_*M"M*Ms#{@w#6#r#s#r#s#r#s#r#6*M*M*M"M"M*M~w*M~F#~F##~FF=ɯ<*M*MZCBC_C>C#>CBC #>CBCkC*M~w*M w#ŽC*M w#C*M*M#C/<+"M"M ҶFO _"M! "M:DD*M*M+C CD*M*Mw+ D>w+ D#~>3D>w+(D>*MwöF*M*M+CD LDöF*M*M#O~zD>2MIG##D~D q#6#62M#FqڦD q+ M~+°D M~+D!Mw#D>@2M!M~w#DOM!M#DyE!M4!M5DEE!M5EE!M~w# EOM!M#3EyEE*M 6+6M+wVEöF*M*M#F~F M~+†E M~+˜E!Mw#¦E>@2M!M~w#·EEM!M#EEE!M5±E*M M w+EöFFCF!FCF!GG+y>O~# FFG@GDG8G>2M y!T]w+*G6G>2MdGF>2MdG*M#6?#6>#wYG#6*M|ʁG!9N#F*M̀GHFloating point :M¬GHunderflowGGHoverflowGHdivide by zeroH at location 0x!9~H H+~H H! Q<0:Ho&Q< 1Ho&Q< H*M6#6]T#wEH*M###~kH*M>#[H6öF~#kHöF*MT]w#w#w#w*MN#~GGҼHG#oҞH$~+žHyG*M>w#°HGyH6#6#6#67I6#6#6#67IH*MF#~HH!GI#oI$^+VyGxG|/g}/o#Gy)I!7Ix4I!7I!>2M@@ @GzH? ěT?F]cf>S#>c{Z=ֿzf=y0==%}<6{<_^Y&; oP;4$C;hIj:$_=ά3:VR8! 9^#V"M!9qB!9~<I>2M2M*M~JC*M6-#"M%C6J\BA *M#~/J(J##~ 6JXD JJK J!9~FJ:M2M:M=RJYJYJ>o&)))>IcB̓C\BA ,FʓJjBA !9~ʓJ!M4y2M!9~JyJ*M60#6.#:MJy/ýJ:MJ60#=J"M>O:MKK*M#~>0J##6*Mw#xJ6.#"MJKJ!9~CK*M6e#6+:MK6-/<#d)K61#d 6K +K0_>0w#s#"M*M6*M#4 ^&)DM)) #wz++WK#wʶF0123456789abcdefnMMlMpM     Epson MX-80 Bit-Plot Graphics Don Brittain Preliminary Version 1.0 4200 Spruce St. #208 3 January 1983 Philadelphia, PA 19104 OVERVIEW GRAF is an interactive program allowing the user to create reasonably high resolution graphics images on an Epson MX-80 dot-matrix printer equipped with GRAFTRAX. GRAF allows the user to plot (or 'unplot') points, lines, circles, borders, and solid boxes. [Here, 'plot' means to turn a pixel on (black) and 'unplot' means to turn a pixel off (white).] Graphics images created with GRAF can be saved in CP/M files (with default extension .GRF) and later retrieved for modifica- tion or printing. This way a 'user library' of standard images (logos, report headings, etc.) can be generated. Although this version of GRAF is only preliminary (see the section titled 'THE FUTURE OF GRAF'), it is still fairly powerful. For a demonstration of what types of images can be created with GRAF, run the program DEMO on this disk. (Note: if you wish to copy DEMO.COM to another disk, be sure to also copy all the .GRF files on this disk. The .GRF files contain the graphs used in the DEMO program.) GRAF is really only a 'shell' which allows the user access to the underlying functions contained in the various 'graf????.c' files found on this disk. The power of these functions is only hinted at by the GRAF shell. By using the underlying functions directly, C programs can easily be written to plot functions, draw recursive figures, plot solutions to equations, etc. The next two sections discuss the more technical aspects of GRAF. DESCRIPTION OF THE FILES This disk contains the following files related to GRAF: GRAF.COM This is the interactive routine that allows the user to create simple graphics images. GRAF.C Source code (in C) for the above. This program uses all the GRAF????.C modules described below. DEMO.COM is a demonstration program which illustrates some of the types of images GRAF will create. DEMO.C   Source code for the above. *.GRF These files contains the graphics images used in the DEMO program. GRAFUTIL.C contains the basic utility routines to be used by all programs utilizing this graphics package. These routines include initialization of the graph (all white or all black), creation or removal of a border around the graph, and the routine to send the graph to the MX-80. GRAFPLOT.C contains the routines to plot or unplot a particular pixel. GRAFLINE.C contains routines for plotting or unplotting line segments, given the coordinates of the two endpoints. GRAFINVT.C contains the routine to 'invert' (ie change black to white and white to black) any rectangular region of the graph (with sides parallel to the axes). GRAFCIRC.C contains a preliminary circle plotting routine, which plots or unplots a circle given the radius and the coordinates of its center. GRAFFILE.C contains the file-handling routines. These routines allow the user to save the current graphics image in a CP/M file of type .GRF, and later retrieve the image for further modification or printing. The interdependence of the graf????.c files is illustrated below. graf.c | | grafutil.c / \ / \ graffile.c \ grafplot.c / | \ grafline.c | grafcirc.c | grafinvt.c TECHNICAL ASPECTS The entire GRAF package was written in standard UNIX 7 C. It was compiled using AZTEC C II by Manx Software Systems. The only nonstandard command used was the i/o call 'bdos(bc,de)' which calls BDOS with BC=bc and DE=de. This command was used to send information to the printer, and it only appears in grafutil.c (and demo.c). If your C compiler does not have such a function in its i/o library, you will have to write this function separately. (Place it at the end of the grafutil.c file.) Or, you might try using i/o redirection (after changing the BDOS calls to putchar's or printf's). However, since the routines distinguish between the CONSOLE and LIST devices, this may not work satisfactorily. (All inter- action with the user is through the console. The printer is only used to print the graphs.) Now for an advertisement: AZTEC C II for $199 is one of the best bargains around. This implementa- tion supports the entire C language as described in Kernighan and Ritchie, and comes complete with a compiler, an assembler, a linking loader, and an exhaustive i/o library. (Source code for the library is included.) This means that programs which are typed in exactly as found in K&R don't cause the assembler to choke (even if they use float, long, short, static, register, printf, fopen, . . .). Interfacing assembly language sub- routines is easy (although there is no #asm directive) and C II even supports bdos and bios (!) calls through the standard i/o library. The resulting machine code runs quickly, although the complile time and program size are both reasonably long. Error messages, whether given by the compliler, assembler, or linker, are right on the money and allow errors to be corrected quickly. AZTEC C II does have some shortcomings, however, the most 'serious' of which being lack of i/o redirection (which perhaps is better described as a shortcoming of CP/M), and I have run into two minor 'bugs': The compiler dies (without a word of warning) if the current disk does not have enough space for the .ASM file it is creating, (both the assembler and linker give error messages under the same conditions), and declarations of external arrays must include the (correct) size of the array (as opposed to a statement of the form: external int array[][]; ). I have not tested how the compiler reacts to declarations of the form: external int **array; Being a good bargain at $199, AZTEC C II is an incredible deal at the special Micro C price of $149 (see the back cover of issues 7 and 8). No, I am not associated with Manx Software Systems in any way (other than satisfied customer)! Back to the issues at hand: In order to use the graf????.c modules in a C program it is necessary to define several external variables (all are integers): horsize is the horizontal dimension of the graphics matrix versize is the vertical dimension of the graphics matrix flag is an external flag which is usually used by the subroutines as an indication to plot or unplot. (When 'flag' is equal to 0, the subroutines unplot, but when 'flag' is nonzero, they plot.) After reading Kidder's 'Soul of a New Machine' I was going to rename this variable 'mode-bit'. All pixel-plotting is done in RAM. The current routines support up to 320 x 320 pixel graphs, though this size can be increased or decreased simply by changing the constants HSIZE and VSIZE to the approriate dimensions. (Note: VSIZE must actually be set to 8 more than the vertical dimension you desire. This is because the plotting routines work with bits, whereas the actual graphics buffer is stored as bytes -- for example, a 1 x 5 graph actually takes an entire byte of RAM (wow!). Horizontal coordinates are mapped in one-to-one correspondence with bytes (actually, arrays of bytes) whereas a vertical coordinate maps to a particular bit in a particular (array of) byte(s).) If you change HSIZE and VSIZE, you MUST change them in all graf????.c files which have HSIZE and VSIZE defined -- otherwize, the results will be unpredictable. (I'm speaking from experience; actually, from several bad experiences.) NOTE: If your C compiler supports declarations of external arrays without their size, then you can alter the external declarations external short grafbuf[HSIZE][VSIZE/8]; to read esternal short grafbuf[][]; and remove #define HSIZE 320 #define VSIZE 328 from all files except grafutil.c. Then changing graph dimensions is easy: simply modify HSIZE and VSIZE in grafutil.c. Although HSIZE and VSIZE govern how much RAM is allotted for the graphics image, the external variables 'horsize' and 'versize' govern how much of this RAM is actually accessed by the plotting routines. Thus the actual graph size is horsize x versize . Obviously it is necessary that horsize <= HSIZE and versize <= VSIZE-8. GRAF checks that this is true, but none of the subroutines do. Thus it is left to the programmer to make sure these conditions are met before the subroutines are called. If 'horsize' or 'versize' are too large, the results are virtually guaranteed to be disastrous -- the plotting routines will be altering the program code! Unless you need to make hugh plots, or memory is at a premium, it is probably best to only alter 'horsize' and 'versize' in any particular application. This package supports the following functions: (The file name in brackets following the description indicates the file in which the function is defined. The user-interface functions in GRAF.C are not described here.) init(h,v) clears the graphics region from 0 to h horizontally, int h,v and 0 to v vertically. If flag=1 the region is set to all white, and if flag=0 the region is set all black. This function is usually used to initiallize a graph, and for this purpose it is called via init(horsize, versize). [grafutil.c] grafprnt(n) sends a copy of the graph (horsize x versize) to the int n MX-80. The image is produced using the low-resolution (480 dots/line) bit-plot graphics function in the GRAFTRAX package. [grafutil.c] border() plots (if flag=1 ) or unplots (if flag=0 )a border around the current image. [grafutil.c] pixplot(h,v) plots a pixel having coordinates (h, v). If h>horsize int h,v or v>versize this does nothing. [grafplot.c] unpixplot(h,v) similar to pixplot, but this function unplots points. int h,v [grafplot.c] lineplot(x,y,h,v) plots a line segment from (x, y) to (h, v). int x,y,v,h No assumptions are made concerning the relationships of the variables ( <, >, =). This function uses pixplot and unpixplot. (As usual, if flag=0 the line is unplotted. Otherwise, it is plotted.) [grafline.c] invert(x,h,y,v) inverts (white <-> black) all points with int x,h,y,v coordinates (a,b) satisfying x<=a<=h and y<=b<=v . Note the order of the variables! This function is especially useful for making bar graphs (and checker- boards!) [grafinvt.c] get(h,v) returns the value of the bit corresponding int h,v to the pixel with coordinates (h,v). savegraf(h,v,name) saves a copy of the current graph image as int h,v the CP/M file NAME.GRF. Only the region char *name having horizontal coordinates less than h and vertical coordinates less than v is saved. Thus the usual invocation is savegraf(horsize,versize,name). The size of the resulting file is of course depen- dent on h and v. [graffile.c] getgraf(name) is used to retrieve a previously saved graph having char *name filename NAME.GRF. If the file doesn't exist on the current drive, an error message is displayed on the console. Otherwise, the dimensions of the retrieved graph are displayed. This command, if successful, alters 'horsize' and 'versize'. [graffile.c] Remarks: To utilize the graphics subroutines, it is only necessary to link them to the C program which requires them. (They must first be compiled, of course.) If your C compiler/assembler package does not support linking, then the files may be included directly in the program (using #include) but this requires modification of the 'external' declarations and the #define statements. (They should be removed.) Of course, this lengthens the compile time of the application program considerably. To create the GRAF.COM file I used the following AZTEC C II command: ln graf.o -f graf where the file GRAF. (the filetype is 3 blanks) contains the list grafutil.o grafplot.o grafline.o grafinvt.o grafcirc.o graffile.o -l libc.lib If you're wondering why I didn't simply include graf.o in the list and then execute ln -f graf it's because the latter command results in a '.COM' file having the name ' . '. (Yes, that's all blanks.) You then have to execute the following idiotic command: A>ren graf.com= At least the linker doesn't call the file ' .COM'. If it did that, then any inadvertent bump of the -key at system level would cause CP/M to start executing GRAF!! Of course, the -o option could be used to rename the .COM file. The file DEMO.C contains so many character strings that the -z option must be used to compile it on AZTEC C II: ln -z2900 demo.c (Numbers smaller than 2900 might work. I didn't try for the smallest one.) THE FUTURE OF GRAF In its present form, GRAF is supports only the minimum number of commands required of an interactive graphics program. As more modules are written, GRAF will be expanded. However, the real power of this graphics package lies in the fact that the modules may be easily included in any C program. Present deficincies of this package include the following: Only minimal error-checking takes place in any of the subroutines. This is especially critical in the file-handling portion. (If there's no room on the current disk for another .GRF file, savegraf() dies a sudden death.) I wonder what happens when pixplot() is handed negative num- bers? (I think it will quite happily rewrite random portions of the executing .COM file!) Perhaps error-checking should be done condition- ally using C's #ifdef command. That way, the error-checking could be easily removed from a thoroughly debugged application. The circle routine appears to draw ellipses since the MX-80 puts more space between horizontal columns than vertical rows. (Similary, squares look like horizontally-long rectangles.) The 960 bits/inch graphics mode on the MX-80 reverses the problem -- it squeezes the horizontal dots too close together. Thus some kind of scaling routines should be written (perhaps to be called by grafprnt()) to take care of this problem. Also, there is presently no way to plot only por- tions of a circle (arcs). There is no way to enlarge or shrink a graph. Sometimes it is de- sirable to change the scale of a graph late in the game. Thus, it would be nice to have a function which changes 'horsize' and 'versize' and then scales the existing graph accordingly. The inversion routine (invert()) operates on bits rather than bytes. This has the advantage of allowing precision on what regions can be inverted, but causes the function to work rather slowly. For large regions, invert() should operate on bytes (or even words) everywhere except the vertical edges. This could increase speed by a factor of 5 or 10. It would also be nice to be able to invert regions of dif- ferent shapes. There is no 'fill', 'paint', or 'color' command. This makes it very difficult to fill in regions of a graph after some lines, points, or circles have been plotted. (Invert() works fine at the beginning, but it never erases or covers anything.) I recommend the following form for a fill command: fill(x,y) will fill the region containing the point (x,y). int x,y It examines the adjacent bits and fills as follows: ^^^^^ ^^^^^ (continues ^) XXXXX XXXXX XXX XXXXX XXX X X X XXXXXXXXXXXXXX X X XX XXXXXXXXXXXXXXXXX XX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX>>> X @ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX>>> X X XXXXXXXXXXXXXXX (continues->) X X X XX XXXXXXXXXXXX X XX XXXX X X Before Fill(@) After Fill(@) (I don't know if this makes sense to amyone but me. But the point is that fill actually has to examine more than just the bits in the current row or column that it is filling -- a 'hole' of only one bit should not be interpretted as a 'hole' by fill().) There is no 'copy' or 'move' command. Thus large graphs can't be built up out of smaller components, and if you blow it in some small region you may have to recreate the entire graph (even with the all the un- plot options). I suggest building large graphs in stages, and saving the images often. That way, if you blow it at some late stage, it is not necessary to recreate the entire graph -- simply retrieve the most recently saved image. Although bar graphs are especially easy to create (with the invert() function), there is no convenient way to label the graphs. A 'label' command would be great here. I suggest the following functions: x-axis(label) plots a horizontal axis and labels it 'label'. (This one's easy to write.) y-axis(label) plots a vertical axis and labels it 'label'. (This one's not so easy.) To implement these, it might be best to simply define a new grafprnt() function (called lablprnt()?) which prints the graph along with the labels. Note that there is currently no convenient way to put text inside a graph. PROJECTS For those of you with a lot of ambition, I recommend the following projects. (Most of which are non-trivial.) letters Write a function which prints nice (smooth) large letters at a given location on a piece of paper. This involves creating a lot of .GRF files containing the alphabet and rewriting the grafprnt() function (grafprnt() will only print one graph in a given vertical region). Another (easier?) way to imple- ment this project would be to write the 'move' or 'copy' function described above, then have the letters program simply move the corresponding LETTER.GRF files to the appropriate places in a large rectangular graph. An advanced version of this program will print upper and lower case, possibly in different fonts and sizes. (I'd really love to have each chapter of my PhD thesis start with one of those nice, big, capital Gothic letters!!) functions Write a module for GRAF which allows the user to plot elementary functions such as sin, cos, exp, and ln, in addition to recognizing + - * /. This is a very extensive project: It will be neces- sary to implement a 'desk calculator' similar to the one in K&R, a math routines library or module, (for integer or floating point math, keeping in mind that pixplot(), etc. only except small, posi- tive integers), and (probably) some 'virtual memory' routines, since I find it hard to believe that all this can be added to the present GRAF file and have it still fit in the TPA. (GRAF.COM is already 46k!) I'd appreciate having a nice math routines library, even without any tie-ins to graphics! recursive Since C supports recursion, the routines already drawings written can be used to easily create some nice recursively-drawn pictures. See Hofstader's 'Godel, Escher, and Bach', and 'LISP', by Winston and Horn, for references. 3-D graphics Here's a real biggy. This project makes the existing GRAF look ridiculously trivial. FORTH Rewrite the entire package (or your own graphics package) in FORTH. I originally planned to write GRAF in FORTH, but after receiving AZTEC C II I couldn't resist writing it in C. FORTH has the advantage (and disadvantage) of being interpretive. (You wouldn't believe how many times I got to sit around watching my disk drive go through 10 or 15 minutes of calisthentics just to produce a worth- less GRAF.COM file. My refrigerator has been empty for a week.) The transportability of the FORTH language is great, but the transportability of its screens on disk isn't too good. CONCLUDING REMARKS As with all of my programs, suggestions, criticisms, and improvements concerning GRAF or any of its modules are always welcome. I would appreciate being informed of any applications of these routines. I would also like to know of any other MX-80 graphics programs in existence (and preferably in the public domain). I hope that GRAF proves to be a useful addition to your program library. Don Brittain 4200 Spruce St. #208 Philadelphia, PA 19104 (215) 386-2684 H, but after receiving AZTEC C II I couldn't resist writing it in C. FORTH has the advantage (and disadvantage) of being interpretive. (You wouldn't believe how many times I got to sit around watching my disk drive go through 10 or 15 minutes of calisthentics just to produce a worth- less GRAF.COM file. My refrigerator has been empty for a week.) The transportability of the FORTH language is great, but the transportability of its screens on disk isn't too good. CONCLUDING REMARKS As with all of my programs, suggestions, criticisms, and improvements concerning GRAF or any of its modules are always welcome. I would appreciate being informed of any applications of these routines. I would also like to know of any other MX-80 graphics programs in existence (and preferably in the public domain). I hope that GRAF proves to be a useful additiovGRAF.CZ  !"#$o%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYFofn3zSNz{Wory:w(୵mgEN;RI<ËdzvlیvkU ~8}mFo;/3g5߬T >F #I%kJrC&J{J@@H]haҸt_Yk$895€)Cfm?_u3i()%@8Qzr |_Wm4= )a8x aʍaQd5IaP 20Br{Z+!^B(WB6w!mKڑGgޞ՛#\NJ#xh欄vGng ǃSoy6VFC7't Cn};^C~eF׾!mO$8ND Tq5 #n3mܚ's NPIY!n3mry:AF FC7g%%|;^/ a H}> %VFC79 ;>}i]"z F[[>+=x 25h[DpK0ҸCeVR!VF[[wXmk.?_…֖-phkk7be{kѶvt F[[|}#L!VF[[wXmk.]…֖-phkkעB}x 2.\~ -[_>TF[[U7be{kѶv%\mmiGx}n+]S־!VF%˧K0HMbe{kѶv%\mmVXB;~mv!LχhkCΤχe4Z;+&B7g%%#N!Ծ {Em}x 2.\.6+a,= XmBRCJ 臜IRChCDF[ ݜ0Ў|zdah}B7׾!VF%OpaY c ?PTDP| Ծb6VF[0Ў<}z r88x+D(6VF[0ЎES4pj% cjceY c #~r4}D ê{H,B#Lf%%#xz $h@%FR+JKhGoO D+xZTPjceY c #~^|I0$Z=rU7XmmVXB;o>x4}D Cn<*{Y@˜XmmVXB;}y(up d/f%%#~A-8, NY #6VF[0Ў<ݗwOƿOP+ޓJf%%#x$jop XxUҟXmmVXB;?@*=%pߝVXS+JKhG3(AqA)bE<*=qϩf%%#t' %"FXS+JKhG="'= oo߷2ڬv䑟<8};^ss 8Q !DRhkZ&ZfZ!C+JKhGr&^Aߓ%#hkk+J …ɩXmm0>+JKh5r+};^C~e) mO$P~@aD`ȀAP$!8bn3m{J0y {RInGN5یv\NpJ!5mOw?`~>op]Ѿ4ɩXmڧw=IԮUz$Aa}lϧ2&t C+_{w@~$ +hce4tBRCR!gRaPx2BiG29XONyzr*8hfa0y䆮PnJKhG~N@ \JqM#WFmѵa n;.a$U\Mp"h)7C4P`m~i4t0tn6YJ([6+a,yī> i<? \xyX LM"mVXB;W3|&8)a3\u#h欄AZR_'"*! mnJKhGxF@Z/G^BRC29+a,)5P{tmn=:|JY c '{ ;Nj+ mnJKhGxF@Z/ѡPbnJKhG|G v ޫ‹ ^?A/C/a!LχX ,%9}iJKhF 8mq2*Aq}e4ts#Lo}~eF׾ύvpH=dyȍ 0px vF4YJ([6+a,yīxa7G^kp=+"XWFC7g%%##Rjzmnz a H}> %hf)a<8^mK8}eU+hf)4nFC7,}n&v,}n΍G7ce4tsVXB '^a.ѡPbnJKh88#RGnce4tsVXB _ifX |{t%,) 0+Z8 { |2yt%,) 0+|>Gh0~}xw i}y6VF5ʾ2DF[=) >VF2hktZTPn;c$U\Mp"E ]# /zf/nFxVFC7K qK4f%%#x=7QuC 0pGnce4t35Y c #^uMTK 0pGnce4tsVXB{y@^)A p"8ԢGnce4tsVXB;'3y hce4tѡPbnJKhG|G v |^hۣC/a!LχX ݜ0qp"Pn!Axq>=|xmnVG^BRC2YJPKmVXB5gpǑGnce-[OVC+kQuCZWFmBܞBIWpQW(WB+P~@aJیvzH,Iһn3RBiY c #^uryׄJhyX LM"mVXB;W3\ Cio{y6VFC7g%%'FR`Q.Oh0>+Ҹ%mE|Jn&6=-ʕ0y䆮5RCyzr*8h<`=9^6VFC7-ǏWF]iB(aLA=(E('X'N9 @[mF[x+e^'" ]MFxFC7g%%#?M1¢\`8N\]29+a,yO^ɍgt $ Ïk{=ybe4tsVXB;HԮ$7tqyzO* WF};^_ifX |{t%,) 0+Z8 { |2yt%,) 0+|>Gh0~}xw i}y6VF5ʾ2DF[=) >VF2hktZTPn;c$U\Mp"E ]# /zf/nFxVFC7K qK4f%%#x=7QuC 0pGnce4t35Y c #^uMTK 0pGnce4tsVXB{y@^)A p"8ԢGnce4tsVXB;'3y hce4tѡPbnJKhG|G v |^hۣC/a!LχX ݜ0qp"Pn!Axq>=|xmnVG^BRC2YJPKmVXB5gpǑGnce-[OVC+kQuCZWFmBܞBIWpQW(WB+P~@aJیvzH,Iһn3RBiY c #^urv8GRAFCIRC.CG o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFLυ* S{j XثoEN3^ҫ/LW?U? j}B;dwJ* Ssabz{; 5ڊ4vw:{&h44Ui:etE:tL*=4WW?ԟj)NGI)UzV  q:&LL7&3 gС`eaў B9 x&* B{霙ԍIYsYe^%*iZsՍIAnX:,w=5U1ΞIANq阇EgϤ t csU8gRSEOLj+ugRw&ueR7&eeYʓgR{Y?@ABCDEFGHIJKLMNOPQRSTULM.,§ajFѻ9J_/_<܊[5Maj"|*,Qi]F颸}0'(ʆ)l2\4LL_vhF{{|_g/;J#|{|_LLޣhPC[I8%QktLޣhHJcSm:̊)AЋ-$\ 1c abFԦC B9/U:fP1AJ{;&Q0WG5;9&)t<>}v7w7/ose!b^t9&փji.jl"1AgP|`*jQty ^U<{x4LfMc*jQt[AWz'c*At#V59֙c{Dq?؋%Qk˚ !֢d"bZolWJSDU:y5b6f BEioJ]%j]io5dV5f BEioJwfZ+xޭJOf=J֘9&V^8fL$UفzV5:P1b.^\-Őh*֙cĔvzjaVM h|ߞ(&ikJm:tLL D\%cbm%\զùZ :5JMsȲfu8P9&1cpq1l7 BXm:q\ ۍcs1VjfqLb.j\blt8Wa:oG0HMbehHJcSm:̊)AЋ-$\ 1c abFԦC B9/U:fP1AJ{;&Q0WG5;9&)t<>}v7w7/ose!b^t9&փji.jl"1A /********************************************************/ /* */ /* Graph Inversion for MX-80 Bit-Plot Graphics */ /* */ /* Don Brittain 3 January 1983 */ /* */ /********************************************************/ #define HSIZE 320 #define VSIZE 328 extern int versize; extern int pixplot(), unpixplot(), power(); extern short grafbuf[HSIZE][VSIZE/8]; invert(x,h,y,v) /* Changes all pixels with coords (a,b) */ /* satisfying x < a < h and */ int x,h,y,v; /* y < b < v from 0 to 1 or vice versa */ { register i,j; if((x>h)||(y>v)) { printf("Argument error in INVERT: command aborted.\n\n"); command(); } else for(j=y; j<=v; j++) for(i=x; i<=h; i++) if(get(i,j)) unpixplot(i,j); else pixplot(i,j); } get(h,v) /* returns the value (0 or 1) of the pixel at (h,v) */ int h,v; { return(power(2,v%8)&grafbuf[h][(versize-1)/8-v/8]); } vGRAFLINE.CB o !"#$%&'()*+,-./0123456789:;<=>?@A^t(«#F2%%']._m[z~SvƎŷk6B[lm// 1v(«##$|Q%'&|Q%x&>cʟIʟl#>cbJR%.SҎp)Iy;NZt#, U/eLT@v0vx;NN!󪔟^{yX G#P𪶧}ҷ~Z Wo&/pvҎP@TI(D_(Uo'JB!ۤ dKTvBJB!&ْ(Uo'ა0Q*o-R[f&Ay;hAv0vx;8B;!̫ZvjB_LIA;BY* %.SvЎAHH=US->m"a7K4)[#$;B;!̫^kBdv4U&ӥE{}iTэ*mxlOUUS63 !Z//e7`9&v!Bndv)Bȵ/-q2!̫ZvjBx6zN( cYGŻ׎P@f>:^_G( bJRlvA!KS%XKS<{|{|jq'1OP@Ǭ}УkG( d3w#%.Sbk!$[2vFXLI G 6qcʟIʟl#>cbJR%.SҎp)Iy;NZt#, U/eLT@v0vx;NN!󪔟^{yX G#P𪶧}ҷ~Z Wo&/pvҎP@TI(D_(Uo'JB!ۤ dKTvBJB!&ْ(Uo'ა0Q*o-R[f&Ay;hAv0vx;8B;!̫ZvjB_LIA;BY* %.SvЎAHH=US->m"a7K4)[#$;B;!̫^kBdv4U&ӥE{}iTэ*mxlOUUS63 !Z//e7`9&v!Bndv)Bȵ/-q2!̫ZvjBx6zN( cYGŻ׎P@f>:^_G( bJRlvA!KS%XKS<{|{|jq'1OP@Ǭ}УkG( d3w#%.Sbk!vGRAFPLOT.CO  !"#$%&'o()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN:ԝ&֏A`f}pقrKN"Ci&֏A`9 _0kQȾPɧڠ ucЄ:ԝ&$ܳ{B2ޟUGxg/$ïp$ܳҰ ̩RlxU)6<_mCKJB9eU?fw{:OvBB\,31du3%NHQH0C<%sr ^p 1J@P @6T !9!+! !!+cn*Vp:bv9U d Rlx}ttBU?8oc )q_FVj^W2_8JV+3%;! D`z%KŒO4!j ^ i`l^B>bU !f7SpJЎX*ņ'IwJw mUz?e4تŸ~i)w#x5T/]JY s.a$;BnY3nrm!!hBkP=-eA i`9Ȇꕐw*ۓcL6aBRlz%c BKS%XKS<{|{|jq'1OP@Ǭ}УkG( d3w#%.Sbk!vGRAFUTIL.CY o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXM.¦Uk6rd>e'Ӌ%?1X[چiU6MN'Wv.j¦Uk6mh _RmstOwKW>^ v%^ v?n6pF9gWn6o !0\ ç(մ 7On>~v!K+; sОe=_GC(Vv:bUV!$$dǶjZx%kAC1zʋ%C( j!TiN\nf \Z.G8~.b!dga^B!Rފ^!TPpB*i{ 8=?BHTͅ!TAWәǫsuM+j6uM Ű*a*8FC*bkBU]4W^kBu.Uqˇii!((ůe7 ۼvuf`mCvJ^ v3{Y-FhB?չh׋vi=ܮ3oۗab3{!TmgPc R*H6{;xAT1NOPAK~ir T7PAK~ir/PAgC 4h/ TnxJtf䗆PA* |J*5h/ Tnx/*8!TjВ_Bf/JtlԞPAW<- lPA*GaUa*8FC"qq1J5-+;g +/Px؜,\mKjմzp 胅Qn歇ꗋ%&wO/6,8C#T}9YlֆR9Wd߯kCrWwjB#TC|ux؜,\mKjմzp 胅Qn歇ꗋ%&wO/6,8C#T}9YlֆR9Wd߯kCrWwjB#TC|uo&zo&|}|>o&|o&z25:5\||/g}/o#z /W{/_ DM!>25))#}o|g5 :5=25}:5=25}DM!>))T =L}}/o|/g#}|ʥÖ|g}o{_ʝ||7g}oƒ{_ʝ)˜}}o|gN#F# N#F#z{##^#VBK^#Vz#y####x#~#fo}|>?o&}|>o&{_ʝ|g}o|g}o~# x*!95~#E!R|M!9!9^#V!X&M! 9^#V"5!9!9^#V!!*5sM! 9^#V*5#"5+s!<M!N9N#F!P9^#V#+^z%͌!!9s!!D9s#r! !B9s#r!!@9s#rn&-͌O!!D9s#r#+^0͌f!0!B9s#r!!>9s#r#+^!0ͫʵ9ͬʵ!>9^#V! D!>9s#rq.͌!!@9s#r#+^!0ͫ9ͬ!@9^#V! D!@9s#rl͌P#+^!:9!T9~#fos#r͌(͟(d͌ʂ!:9!T9~#fo##s#r++^#V+͟(e͌¦f͌¦g͌!9!T9~#fos#rx,͗,!:9!T9~#fo##s#r++^#V+͟(Ù!9!!>9͌(Ͳ(B!9!49s#r!:9͌(w(+n!9! !>9͌((Ͳ(!9!49s#r!-!69~#fo+s#rsÑ!9! !>9͌(Ͳ(!9!49s#r!9! !>9͌(Ͳ(B!9!49s#r!9!!>9͌(Ͳ(B!9!49s#r!:9͌(,!49s#r.'!89s#re͌!!!B9^#V!͌.!6!B9^#V!9! 9x,͹,3!9! 9!49s#r.'!89s#r!!@9s#r!:9͌(,!9!69s#rscvdefosux!9!49~#fo͠!89s#r!89^#V!@9~#fo!@9^#V!89s#r!D9^#Vz8!>9~#fo+s#r#!89~#fo8!B9^#V`iL!!69s#rU!69~#fo#s#r!49^#V^zʘ!69^#V!@9~#foʘ!49~#fo#s#r+^`iLF!D9^#Vz!>9~#fo+s#r#!89~#fo! `iLä`iLM!9N#F!9^#V`i+Ͳ(!9͌((t*,5^+s! 9`i+(͌(:*͟((M!9N#F!9^#V! 9͌(w(+! 9͌(,<! 9!9͌(w()w(t)͟(`iv+Ͳ(!9͌((t*,)5^+s! 9`iv+(͌(:*͟(!9͌(Ͳ(!9M!5DM! ^z?`i DM5<!!9^#V#^!+͌!9^#V^y|q!t!!9^#VJ#! s!͌ʕ!|ʣ!æ!! s!! s#rÌ!!9^#VJ#! s!͌!|!.!*! s!! s#rÌ!!9^#VJ#! s!͌G!!9^#VJ#! s!͌G!|U!X! ! s! ^ͫ%! s#rÌ!rcwau! ^#Vz¶!͚ ! s#rz¶!! ^#V`is#r! s#r`iM! 9N#F! ^z ! ^!<!W! ^A$!! sM!5DM`i5>`i DMM! 9N#F! ^#V`i^#V! ^! <–!! ^#V! ^̀$ͬʚ!! ^#V! ^#V͠*f*h `i~#fos#r! ^#V`is#r! ^#V! s#r!`in&<s`i~#fo#s#r+^!<M! 9^#V?DM͌M! 9^#V?͌Q!͐PYnM!9N#F!!9s#rÊ!9~#fo#s#r!9^#V!9~#fo!9^#Vó+|!9^#V?͌!9^#V`i#DM+sì{!9^#VM!9N#F! ^#V`i^#V(!W(!! 9^#V`i~#fo#s#r+s!`in&ns! 9^#V!<M! 9N#F!9^#V`i<ʔ!!9^#V`i <ʿ!`iM! 9N#F!9^#V!9~#foD!#'!9^#V`i#DM+^͌$!!9^#VM! 9N#F!M!!9^#VWM! 9N#F! ^!<*fD! ^#V`i^#V͠*f<! ^#V! ^x%! ^#V! ^$!`in&<s!9^#Vz*h `i~#fos#r!9^#Vzʛ*j!! ^#Vʹ&! ^! <|!! ^#V! ^̀$_!||! `in&ns! ^#V`is#r! ^#V!! s#r!M!9N#F! 9^#V!͌! ^#V`i^#V!! 9^#V`i~#fo+s#rs! 9^#VM! 9N#F!W!!9^#Vï!9^#V*h ! s#r!9^#V*f<! ^#V`i^#V͠!9~#fos#r|! ^ͫ%! s#r!9^#V*dr`i~#fos#r!9^#V*dDh!`in&<s! ^#V! ^x%*d! ^#V! ^̀$! ^#V`is#r! ^#V! s#rͬh ! `in&nsd |h !!M! 9N#F! ^#V*h͐! ^#V`i^#V͠M*5|µ !""5"5*5DM! 9^#V*5"5PY `i"5!*5*5!*5*5͠<! 9s#r" ! 9^#V*5"5`i*)"#!57!5*5DM*5o&5U!o&5*5*+++*5DM*5!9N#F#^#Vkb6#> 6 #=€!>6#=‰! : >¼! A![ҭ!@ù!a!{!`w# .!!ʿ!!w#!{o|g !!w#!!!|a{ !9^#V*5!9}|$""5|!M!#"5!#+^!5DM!"{6]"*{6#"{6*{6 #|ʟ"n& ͌Ž"n& ͌ʟ"#+j"ͬ #`i*{6)5s#r|"n& ͛"n& ͛"+#+^`i#DM+sû"!`i#DM+sV"!5*{6 #M! 9^#Vz<#!@#%#!A:$$$.SUBM!}6b#%[7|#n$&|ʆ#X#!"?!!9^#Vm!ʢ#!"?!!9^#V$!4!͌#!"?!$!4!!4!͌#!"?!$!"?!####!9^#V#u$!u#u!t"}6͠%ͅM! 9^#V!%D}6DM!$ ^!s$!4!!!$ s!M! 9^#V!%D}6DM!ë$!!9~#fo$!9^#V!4!!!4!"?|$`i!~#fo#s#rá$M! 9^#V!%D}6DM!'%!!9~#fot%!9^#V!4!!"4!"?|t%`i!~#fo#s#r%M! 9^#V!%D}6DM!9^#V!! s#r!!# s!M! 9^#V!%D}6DM!#4!!! ^#VM! 9^#V!%D}6M!9!29^#Vm!!9!4!M!!4!DM ͌E&! !4!! DMU&`i͌U&!DM`iM! 9^#V! ͌z&! !4!! 9^#V!4!! 9^#V! 9F+N+V+^+~+ngxʲ&w# å&!9^#V#N#F#nx&s# &!9^#V#~#fox&&&# &!'!}!}!9^#V#~#fox+'~+'# '!9~#foC'#:'}!9^#V#^#V#N#F&!9^#V#^#V#N#F'!9^#V#~#fox+'ʕ'# Ç''!9^#V#^#V#N#FÇ'!9^#V#n~''#û'!|!9^#V#n'#'x' +~''!9~ ( ( (4(!9~A4([4(!}!9~a4({(!!9~04(:4((!9~a\({\( o&!9~Ar([r( o&!*OÐ(!*Mw#w#w#w*M~#~#~#~"[7*MV+^+V+^*[7"[7*Os#r#s#r*[7*O*M"O"M*M>w#(*M~+#)õ+=ɯ<*M*O###1))5))))+7)*M*O#S)*M*O#i)*M*O#~)*M*O#“)*M*O#¨)*M~/w#¸)*O~?G*M^#V#~#fo)))#)DM*Ms#r#q#p*O~?W*M###~*~w+**7~w+**~#(*O!g7(*Mg7&*y2e7*Oo7&*:e72e7ͧ*g7*Mw#c*:e7(*Mg7&*y2e7*Oo7&*ͧ*k7*Mw#–*:e7(!k7w#­*> 2f7!g7~w#¾*Ok7!o7#*y*!g74!f75¸*!f75 +!g7~w#*Ok7!o7#+y**k7!o7#)+*Oo7~#<+*Mk7~#L+!g7w#Z+> 2f7!g7~w#k+Җ+g7!o7#+Җ+Š+!f75e+*Mg7w#¥+)+!)ʵ+!<)+õ+)++õ+)++)+ʵ++*Ms#r#6#6*Ms#r#z+6#6*M^#V*K$,*Iw#@w#6#w2,#w=,*I~G#~@##~Y,!*K|,!*Iw#@w#6#wŠ,#6͖0*I~G#~@##~¯,"s7͖0*I V+^+V+^+V+^+V++~@_+~怳_*s7"s7*Ks#{@w#6#r#s#r#s#r#s#r#6*s7*K*I"K"I*I~w*I~0#~0##~0 0=ɯ<*I*Ka-I-f-E-#E-I- #E-I-r-*K~w*I w#•-*K w#¤-*I*K#-/<+"K"I ҽ0O _"u7! "w7A..*u7*w7+- -#.*w7*u7w+.>w+ .#~>:.>w+/.>*Iwý0*u7*w7+J. S.ý0*I*K#O~.>2QP1##¤.…. q#6#62Q#0qڭ. q+ 7~+·. 7~+.!7w#.>@27!7~w#.O7!7#.y/!74!75.L/!75L/!7~w#'/O7!7#:/y/ /*I 6+67+w]/ý0*I*K#0~0 7~+/ 7~+Ÿ/!7w#­/>@27!7~w#¾//7!7#///!75¸/*I 7 w+/ý0M-0!M- 0!G 1+y>O~# 011@1K1?1>2Q y!T]w+116 1>2Qk10>2Qk1*I#6?#6>#w`1#6*A|ʈ1!9N#F*Q͇1&2Floating point :Q³1&2underflow11&2overflow1&2divide by zero&2 at location 0x!9~22+~22! X&0:2o&X& 82o&X&'2*I6#6]T#wL2*M###~r2*M>#b26ý0~#r2ý0*MT]w#w#w#w*IN#~112G#oҥ2$~+¥2y1*M>w#·21y26#6#6#6>36#6#6#6>32*IF#~23!1%3#o 3$^+Vy1x1|/g}/o#1y03!>3x;3!>3!>2Q@@ @GzH? ěT?F]cf>S#>c{Z=ֿzf=y0==%}<6{<_^Y&; oP;4$C;hIj:$_=ά3:VR8! 9^#V"7!9x,!9~<3>2727*I~4$-*76-#"7,-=4c,A *I#~64/4##~ =4_. 4Q5 4!9~M4:727:7=Y4`4`4>o&)))E3j,͊-c,A 30ʚ4q,A !9~ʚ4!74y27!9~4y4*760#6.#:74y/4:7460#=4"7>O:7 5 5*I#~>04##6*7w#x56.#"7Q54!9~J5*76e#6+:7%56-/<#d0561#d =5 250_>0w#s#"7*76*I#4 ^&)DM)) #wz++^5#wʽ00123456789abcdeflz77]7a7vDEMO.C_ o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^J.Wzr5WK%iz}y<,+ -aVK%)Z*\M9v UB8z}FT^LӴZ*\M6W3_3|~\dz @<<{p~iTrϫU^*Ǒv?q~UȍЌw?q~xǑ*qFhPRIh4ymWRh.w<-wڢL{r;Ch4 xvT}5u%QW+`II%_*\fw5;;L^I䲧+\d.V؊D.{x`:'$rYP?\ޟno~~mΎ ]'$r9j+\k5zng?^+\T5D.CD. נ+ k ]'$r9j+\O-v{zD.C0y%˂b*:afpxuJ"Vx9y%˂b&_~>|N^I䲧g+\N8Z2aOZְΒ 1gBhW,(ֶcwf(*v31zbcy^q% ɉzD. Eo禪nfx}yf,ЖV2\UuSUa/t8-S%,teA6}؎1q^CK[Q3d %TBQ?CKy^:y%˂b Z2з-GUǎ1q^ÞHBY:y%˂b'a-k؀5C辚lNjB:VMD.%D.[,WRI%4:j3pJ"Mq҄ul4 6EJ"M_DZ)Wl4iWJd_GmNJ*wf`/D.[,WRI #dm~O'6̋)j3xJC'$rْiQ?x%˖LWl4 (N.eKfGq|trpD.[26?+JI% T a^I%_*\Y&$r$r9joWlEqfGb{!z .nvW3m~O+JIIɖLS1)K%KV81$r)lD.D.oO-w|CZ^{%sȉ;^^{%˞&'$rVBsN^I䲯Cqe(9zr8M/ar⎓WrjEq_@Nܱ8>NJNz .nvW3dyOoWrP'?RjyJ"m%4dz|J:u+P[6 "h؎/[J m/D.cpt%$r y%\ZZ*)JTRh lEq_8>NJ"1x]pTCQ'%^ɗJT5,y%CQ'+% @@  |d????????????????????????????????|d, `0@  ` @ @@ @ @@@ ? 0@00@  @ @ @@ @ @@?` 0  0@ @ @ @ @@??? p 0 0` `    @ @ @@@????80 0`0@0@  @ @ @ @@@@@???8p```0 0@ @ @ ???880 p 0 `   @ @?????<x80`0@  @ @@???|>xp`` 0@ @@???x0 0   @@@??????x<0@ ???pp?? 8???``8~???? @` 0 px|>???? @@@@ @ @088pp<|??? @@ @` ```8pp<??? @@ @ @` `0 0 p`8p???? @@ @ @ @0@0 080?? @@ @0@`   ````? @@@@@ @ @ @  @` ` 0@` 0? @@@@ @ @ @0@ @`0@ ?? @@@ @ @ @ ` @0`? !!!AA !!A !A !A !A!A a!  @` ` 0@` 0? @@@@ @ @ @0@ @`0@ ?? @@@ @ @ @ `,,        @  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@`````` @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@ @  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@   @@  @A""AA""A@! !@@! !@ @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@ `` @P PP@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @ @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@ !@@! !@@! !@@! !@@  @  @@  @@  @@  @@  @@  @@  !@@  @@  @@  @@  @@  @@  @@  @@  @@  @P PP PP PP P @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  !AA!  !AA!  !AA!  !AA!  @@  @@  @@  @@  @@  @@  @@  @@  !AA!  !AA!  !A? ? ? ? ? ??????????????????????????????????????????????????? ? ? ? ? ?o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@߿߿@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|<` 0 @    @    @ 0 `<|p 0 a@#$C$dD((Fd$CB"  @` 0 x8 0`p` !@A""AA""AA!  0 p0L 0 |??>80 0   @A&(!"AAB$$BA! ``B$ !@ 00 8 p 000@0@ 4B@"$BD((DA"a`A"  `` @0 0 8x|<` 0 0@ `  A  A "AAA$$DHH00(HB$A`C! !A0 `00p 0 ` c!B!B!!CA$$(DEP PPED($A"B!B!bB! a `p 8 0a1B"D"D"D"D!BB$(0(I ```` E(($BaDB!D"D"D2 "!C0 ap 8?>80 1"&$$$I$H"D"BD!BB((000II @@@ II)((BB!D""HD"ID$I$I$E2dfca s655JJJ%J)R%I$$I"$DH!"BD01IIJ !!!!!!! JJI))DB""HD$II$RIR*RUU.%ef?o_k׮[[VUU*R%II"$DDH!""BBB """""AAAAAAAAAA!!!!! DDBB"""HD$$$JI)TRUjmo_o?[kUUUU%%%IIIII!!!!!!!!!!AAAAAAAAAAAAAAAAAAAA!!!!!!!!!!IIIII)UUյmݽ`00p 0 ` c!B!B!!CA$$(DEP PPED($A#22O/аpp/O``H00H߿@@'GG'߿D((B„H00H?~>>>>>>>>>~.6:<>><:6.~>>>>>>>>>>?GRAFUTILCQ RSTDEMO COMUVWXYZ[\]^_`abcdDEMO COMefghijklmnopqrstDEMO COM1Ͽ?C|x?`???~??????#??????0pppppаpppp!!!!!!!!!!!!!HHHHHHHH($$$$$$$  """"""""DDDDDDDDIIIIIIIIIIIIIIIIIIIIIIIIII**kkkk]~?????>>>> >>>>====]k~~~]]]]]]]]]]***************IIIIIIIIIIIIIIIIIIIIIIIIII@@@@@BBBBBBBBBBBBBDDDDDDDD"""$$$$$$$$((HHHHHHPPPPPP@@@@@@@@@@@@@ HHHHHHHDDDDD$$$$""""""""! @@@@@@@@@@@@@@@@ p8&@@@@@@@@@@@@@@@@@@@@@@@@@@@pNA@@@?@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@p ` @p `  This is the release date of the disk. DEMO CQ }BAR1 GRF BAR2 GRF CIRCLE GRF HUGH GRF -LINE GRF MEDIUM GRF SMALL GRF STAR GRF TITLE GRF DEMO .COM 1F 21 40448 316 DEMO .CQ 29 1C 4096 32 BAR1 .GRF F8 49 1664 13 BAR2 .GRF 5F 0C 1664 13 CIRCLE .GRF 99 A7 7552 59 HUGH .GRF 54 8F 11520 90 LINE .GRF 80 42 2944 23 MEDIUM .GRF 3C 56 3328 26 SMALL .GRF 61 8F 384 3 STAR .GRF 18 B7 8064 63 TITLE .GRF 8A AA 7552 59  Fog Library Disk FOG-CPM.003 Copyright (1985) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Printer graphics program in Aztec C for Epson FX/MX printers. Filename Description -10-00 .85 This is the release date of the disk. -CPM003 .DOC This is the description of the disk contents. GRAF .COM 5C32 45K [Epson Graphics 1 of 20] Epson MX/FX printer graphics program written in Aztec c II. Includes demo program and source code. GRAF .DOC 379F 21K [Epson Graphics 2 of 20] GRAF .CQ E1C3 6K [Epson Graphics 3 of 20] GRAFCIRC.CQ EB9E 1K [Epson Graphics 4 of 20] GRAFFILE.CQ 8846 2K [Epson Graphics 5 of 20] GRAFINVT.C C24E 1K [Epson Graphics 6 of 20] GRAFLINE.CQ 19EB 2K [Epson Graphics 7 of 20] GRAFPLOT.CQ A35B 1K [Epson Graphics 8 of 20] GRAFUTIL.CQ 99B2 3K [Epson Graphics 9 of 20] DEMO .COM 1F21 40K [Epson Graphics 10 of 20] DEMO .CQ 291C 4K [Epson Graphics 11 of 20] BAR1 .GRF F849 2K [Epson Graphics 12 of 20] BAR2 .GRF 5F0C 2K [Epson Graphics 13 of 20] 'CIRCLE .GRF 99A7 8K [Epson Graphics 14 of 20] HUGH .GRF 548F 12K [Epson Graphics 15 of 20] LINE .GRF 8042 3K [Epson Graphics 16 of 20] MEDIUM .GRF 3C56 4K [Epson Graphics 17 of 20] SMALL .GRF 618F 1K [Epson Graphics 18 of 20] STAR .GRF 18B7 8K [Epson Graphics 19 of 20] TITLE .GRF 8AAA 8K [Epson Graphics 20 of 20] FX/MX printers. Filename Description -10-00 .85 This is the  8K [Epson Graphics 14 of 20] HUGH .GRF 548F 12K [Epson Graphics 15 of 20] LINE .GRF 8042 3K [Epson Graphics 16 of 20] MEDIUM .GRF 3C56 4K [Epson Graphics 17 of 20] SMALL .GRF 618F 1K [Epson Graphics 18 of 20] STAR .GRF 18B7 8K [Epson Graphics 19 of 20] TITLE .GRF 8AAA 8K [Epson Graphics 20 of 20] f 20] BAR2 .GRF 5F0C 2K [Epson Graphics 13 of 20] CIRCLE .GRF 99A7