NNNNNNp NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN2O`  @`! #@%`)+-/1 O5`79;=A C@E`GIMOQ S@U`Y[]_a Oe`gikmq s@u`wy} @` O ` @ ` O ` O ` ǀ ɠ  @ ׀ ٠  @ @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[a!cAeagikmoq!sAuawy{}!o!Aa!Ao!Aa!Aaǁɡ!Aaׁ١!O`  @`! #@%`)+-/1 O5`79;=A C@E`GIMOQ S@U`Y[]_a Oe`gikmq s@u`wy} @` O ` @ ` O ` O ` ǀ ɠ  @ ׀ ٠  @ @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[a!cAeagikmoq!sAuawy{}!o!Aa!Ao!Aa!Aaǁɡ!Aaׁ١!FONTS ; t GUTENBERDOCz t GUTENBERGEM t GUTENBERLIS t SOURCES  t 2000_JBZDOC t ]FONT PRG t _FONT RSC t GUTENBERINF t GUTENBERPIC t }GUTENBERPRG t GUTENBERRSC t GUTENBERZSZ t .HIGHRES PRG t PD_SCENEDOC t )READ_ME 1ST t  .  ; t..  ; tGOTHIC ZSZ = t .SCRIPT ZSZ C t .FUTURE ZSZ G t .NLQ ZSZ K t '.OUTLINE ZSZ O t 3.SAKRAL ZSZ T t ?.SHADOW ZSZ X t K.STEIN ZSZ \ t W.UTOPIA ZSZ c t c.HALF_OUTZSZ g t o.MAC ZSZ l t {.NLQ_2 ZSZ q t .ANTIQ ZSZ u t .?08p8p @??! 0338?s8p088`pp?aa>8p? @ `?0 `? `80` 0 8`00  80x`as> b8fffoscA{s? ?033333!@18bFF a c8ccos>8bs??a``p?8pp 8 `````@8 @<p`as>Hopgh``p? p?"b=?`@((?@`0 axorXob`p??`A((?fd0 ?B?ff40?`A((?fg'? ?abb3 `8o`@ `oaB002Hb@d`fp73080``0 ? ? ? ??`7?`@((?@? p?"?@0` ??`@((?@x? ??Aa1>p?8Aax2!@ `o`o`H` ?? ? ?8?```? ??? p0<8 `  ?? a8bXbcbfjrd ?@@@0 `0 `` p88    ?88   0808X ?b4; #? oo? p?  808 0 8    ?      8 0 "  F   ?@ ogo g (0PP@@@@3g 87c(( ?b"?HNp`@`@  8   8   $ BxGz!`@``p&FI0`Xp@p @@@@p# @  @@@ `8!Np(H AABBD80@DDF9`8  tHHHD0C@ $dD `@0@AFLp9fBBF9 D@D@H@A`!`@@  @@@@@@  @0@ABD8 8@ @ p@BB% 0 @@`  80@@@ &BB@@ @8C~BB@` 2 @ @ @ ` 8qxp @pC|  &@xC|Or ``x`  q 08p xa  @@@@0`$0HOqAAC&  @@H@(@0h$0HOqAA@C & $BBBA! @@xC\@@@@p0p`x0pp````0 `0@xB"",px@h@ABDHP`8p@@@ @ @8ANp   t` @`pHH `|$HH0%%)*\0  tx @H`o H 8t p|p88h`8 ` "%)Q9 @ 0  @  p Nx00x 0`  @`02 < )ii    0@@@8p@ @0G@80`@0aNdHcL 8@@ hH`g@ @@@@0`π8080DDJ188xxxx>>88 ØØ88?88hx888        oooo<<     x  8xxxxx  Ȉ??""">>?    >?`00`    000 0   oo    00p 0     0{1    00 0 0    000@0000@@??@@??@@p 0 `0``9p`pp |p000<?00?0`0p0p|80 @``00w#0@`00?00g1{00{1<~`00?0048 ` @@@@@@ ` `00x0?0?x0{1p0``p0?00?``00c0p000`00`p`?p00p?|8?p0Pp`p?x000px 00C00p000p99p00`0p00<00``0`0    000  0 0 0`@ 0 0 0     0 @@ 1 1#  oooop0     0 0a 0 0 0 0a  p 0     0 0pp  0pp0   0pp 01 0p  0=xx=@oo0oodm    0og0xgl0l0g?p00p?00:bBBb?0O$ $ Op $ T T T d   (0  (0    {HHp $ T T T d |h d T T T T tp B%p $ T T T d     p $ T T T d   =@W0dd<p P;  ;;  ; Pp<hdwwt p0H<`HH0p#@tT4FL800@4 4@00  xHHxd` @@  $O $D$D4TA"$<`(PHH$D*   g`PH$ @L:%BB%!0@dTTT@ x H Hxv J Dx@ P0@@@@@@0P @(HTTB$ @@P P t<à0< | B%00@4$HHD< @  4$$<  O$J   @ D$ 4$$<O$ $ O q `` GddG ` A"` Gd$HG $T `Bd$ |$DB($R``000HH0 $  $  $D4T4$$<`d $HH$ H$ p $ T T T d          $HP      d T T T T TXP=@W0E%'(U(U$  /8    {HH {HH   D$             K((  ((K  t |h d T T T T tp  (0  0$$00 $H$ 0  $  $  E%UU  $ D 4 T 4 $ <p!Br  rB!p@@ P p$T T T d |<à<|    `LjddLj` "NRRN d`?```` `? ` `? `@ <0~>G!````p=FGy0pp?@@@@`p? ? ?8p 0`8p`8@`p80 @8@8@x@a> `0a8abfo{q@ya 0rddddfcA84$F ``8`xagnxp@ =?BB7=?3`@`pp`? 0 0p8  ``````@088`Ab|8hfx  x!AB~;?xx`@@@`00 Glx89pcCCB`00 ?;cCB`0?xx`@@ @`<0? p?@@@@?`0` ?0? `? `?0`@0`?8p`8@`p80? @ `@p?8p`8@`Hp8p? @0`xp? <0~8FBcc! #/>80  ``0@ 'ox8p?`x>!@8@``q?op8`?0`?`p x0@ >x?| b8bxacglp`@?` ` ` @`xx ` ` `  0`p80< hfx  x!AB~;?xx`@@@`00 Glx89pcCCB`00 ?;cCB`0?xx`@@ @`<0? p?@@@@?`0` ?0? `? `?0`@0`?8p`8@`p80? @ `@p?8p`8@`Hp8p? @0`xp? <0~8FBcc! #/>80  ``0@ 'ox8p?`x>!@8@``q?op8`?0`?`p x0@ >x?| b8bxacglp`@?}@ @ @? ``}?'ox8p?hfx  xhfx  x8p`8@`p808p`8@`p80'ox8p?DDsspHAArO ``$ xd$   @?@D8<d \@p@8@@@@@8`@?  H |8y`|9!!!! H$B   | !!z @ `p      !xx@@@@@ 9!!!B=H   P0 ?   @?9!!!'  89!!!'  H  P3y|H(`8@@0 H   @ 9!!!<H  @ $8 H(<H!!!!J9pH@ p8@xx|Hp8?  0 4   @"yHHHHHH  #   s    | H88   HHHHsHH H  H8I HHHH8  |/`H `!b `Cx@@@P@#b hHH@ _H@B =B =?<pppp ?? ?? ``88|>~~ga pxp!|8x8`3~n8Gi00pp````  <8888x<80??p8`@@8`?pqx8xxqsg~|8<80@8acw8=A~p~8ddl8lxogC 0   8 ?    ?    88x00 8  8xx8 x8 x ?|@@@@|?8   x|`p`<88080  8 x88?pbg9x88 p??'ww' p8x0}8 p p0xx0|||||| `` <?<< ^x8q ?xx?@  @<80xx0 <??`888`8x>8`0xxb0}8@@0xx0cax@99@8|0x0 0xx 0 <<||ppppppp||<< ``0xx0~88x@x}88x?8xq88xx88x|8x|88<~x8ψxxxx8?8?8?x?< 8x8x8 p80'ww''ww'x88x0?888x88x8x~~@@@@~~gggg pffggx@8gggg?yy0`< < p$TTTd (0(0  oooop$TTTd |hdTTTTtp =p$TTTd  p$TTTd ?w0ddpP??????Pp<hdwwtpp<G`HH0p?tT4~L8?04 4?0  xHHxd`?? < <|$D4T>$<`8PxH$;   `PH$?;==?0dTTT?xHHxvJDx@ P0@@@@@@0P @8xTT~<?XP?P t<?<| =?04$xH|< ? 4$$<  ?${   @ D$ 4$$<< <  ``?dd?` >`?d$H?$T `~d< |0&'~'03`pa~x0`01{F0O`y30xx?@@?xp`ppp0<0?`0@@`0? 00pppAC~<@ @DN^0wcA~ ~0|DF0GG<0tD0@0@CO|p;0Fg09>c A`@a?ppp  0p`0 008` `aCf|8?`@@@`?BBBf0;?`0@@@`0 @@@@`0?BBB@@BBB@@?`0@Bb0c# @@@@00``0@0 ?`0@@`0?AAAc>?`0A@`p?AAAc`>0@8 |0|nFG0c#@@@@@@00p~0~0 00`ppyq`@px|~0`~|@@pAG_~x`@@p<0@ 0`p8 0 0000 0 ?DDd 2&gggggg `000   `??? 0 0000 p02<0p?}@@}?gg0` ggg0b g؀Ѐ؀gg0f0g0000?` D~0;xx@@@@@@@0PP 000 000p @@@@ @@4800``?@@@@@@?  p@ABBD(0@@BBB~~BBBBBBCBBBB@@@@CDHp~BBBB~~BBBBB0048@    @p@@CBBB~!AAAA!@@BBBB~?@@@@@@@`0@@@@@@@@?@@BBB@@@`0@@BBB@@@`?@@@BBBBc@BB@@@@@ @@@@@F `P@0@@@0   `?@@@@@@@?@@BBBBBB<?@@@P@p@@@?@@BBBBCBp<00HDBBAA@```@@@@@@`@  @ @@ @ppHHpp@@pHHp@`p@AABBDHp0@@``@@ @@ ``0?DD@gg@ P0@@PP ?  0@@00PP0 @@@@ @@gg`dd!!!!ddBBB~@``?? "#~"0`a0`9FG8@p @@@@   ``  0`` @PAFX _ @@0@0@P@ABD80``DPDDLTd0C qAAD@| HHHHD c (H `@@0BCNr@:DDDD:!@@@@!@@  @0@ABD8p\``\p@DDDDL2  @@@PP0`@@@@@@@ @BBBG@`0@BBBG@` @@@@Q 1@BB@@@``@@@@@F `@@0@@@0@  @@P@@ @@@@ @AAAAA> @@@@P @AAAA@A0>@8`DPDDDT2 `@@@@`@@@ @@pN00Np@@@   @ @@xEEx@@|BB|@`p@EFDLT`0@@ @ @@ @@ @      @D  P  D @      0 ?HH !@DOO@D@"  "     H   00    p  pF(0  0P    0=@@@@=hh i   i `p\``\`phh @@@@ @ @?DPD D : .  z t..  z tOPERATE DOC| t JDEMO_01 DOC t ARTICLE DOC t "066010303050000132002006006010000 11 21 F0110030001 9[........................................................]0010  GUTENBERG~PRINTER -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- for ATARI ST-Computers Version 1.1 16.04.1987 Writtenby: Matthias Baldauf Luitpoldstr.62 6760 Rockenhausen Tel.: 06361/7162 Hardware: ATARI ST - Computer system with Floppy, Printer and a Monochrome Monitor SM 124. Language: The complete Program was written with ST:Pascal-Compiler Development package from CCD. The Program was written on an ATARI 520 ST with 1.5 MByte RAM,  andwillwork on every model of ST computer. During testing, an old model of printer was used: the STAR GEMINI  10 X. However all printers are usable (E.g. GEMINI 10 X form Star)  n/144 Inch advance or (E.g. Star NL-10 or Epson FX-80) n/216 Inch  advance. Now why was this program written? The idea behind this program is very simple, that eternal problem: money! (And this is as good a place as any to remind you of the Shareware Fee). I couldn't afford to buy a modern all-singing, all-dancing super-duper printer. Also the more I considered the problem, the more convinced I became that there must be a software-solution possible. Since the main reason for purchasing a new printer was to enable the use of better-quality NLQ fonts, I first of all examined my own printer manual looking for ways of improving the printed output. To my surprise I found that the ability to print NLQ copy was in fact available, although dormant. It just needed some suitable software to drive it properly. The result of a little experimenting became the...  GUTENBERG-PRINTER -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- This software simulates on your Epson-compatible 9-Pin DotMatrix  printer a modern NLQ machine. But not only that. If you already have  an NLQ printer which only has one NLQ Font, then note that the  GUTENBERG PRINTER will allow you to use a variety of Fonts on your  equipment! But wait, there's still more! I also include a Font Editor  which gives you the ability to create your own fonts on a 16x16 Matrix. The are then available for use in your documents. Giving you  that impressive professional finish. Inevitably it is slower to print in NLQ Mode, even if hardware- based. But the quality is well worth the small elay and in any case  my program is very nearly as fast as printers using hardware-NLQ, the  difference is really minimal. The printing process is really very simple. As you have seen, we  use a character size of 16x16 Pixels. As this is too large for a  normal-size Font, we have to use a little trick. First we will make use of the graphics capabilities of the printer instead of character mode. But this on its own would still produce characters that are too big. So we switch the printer into Double Density mode, which will still give us 80 characters per line. Though now those letters will be much smaller in width but far too high in relation. Not especially pretty. Now we use the aforementioned trick! We dismantle the Matrix into 2 parts and arrange to print both  parts separately. First lines 1,3,5 etc. are printed and then the  paper is move up by half a Pixel! Then we print lines 2,4,6 etc.  This upward movement tends to erase the space between the dots which  make the typical Dot-Matrix printout look so unsatisfactory. The  resultant script looks much blacker and slightly heavier in quality. Just right in fact! It's at this point that you can start being grateful that you  didn't actually BUY that expensive new NLQ Printer... Now some detail on both the main programs themselves. Starting  with the Files present on the disk: FONT.PRG :The Character Editor program file, FONT.RSC :and its accompanying Resource File. GUTENBER.PRG :The NLQ Printer program, GUTENBER.RSC :and its accompanying Resource File. GUTENBER.PIC :The Main Screen picture file. ********.ZSZ :This extension is used for Fonts.  The FIRST thing you should do is to read the operating instructions carefully.(You know the saying: 'If all else fails, read  the manual...!') Operation is really very straightforward, so don't worry. Double- Click on GUTENBER.PRG from the DeskTop. Once the program has loaded  successfully it will search for a file called 'GUTENBER.ZSZ' on the startup disk. This Font will be loaded as default. Note that any Font  can be renamed GUTENBER.ZSZ in order to have it loaded automatically  at startup. This means that you have completely free choice in having  your favourite Font loaded for you. If the default file is not found  you will need to load one manually before anything can be printed.  This facility is available under the Menu Heading FILE. Note: During printing the program loads in 10 lines of text from disk into a Buffer, and these lines are then printed. Then another 10 lines are loaded in and so on. This means that you must leave the disk in the drive during the whole of the printing process. Otherwise errors will occur. On starting, the program will also look for a file called GUTENBER.INF on the startup diskl. In this file are the Set-up Instructions for the printer. See also under SAVE SETTINGS  THEMENUS:  -~-~-~-~-~-~-~ FILE: LOAD FONT : Load in a font from disk. This Font will remain in Memory until another one is loaded. PRINT TEXT : Loads in a text file from disk and prints it out using the Font which is presently in Memory. The following 3 Menu entries refer to Text-style settings. ASCII : Pur ASCII Text, without any special characters or control codes. 1st-Word : 1st-Word Plus Text Files Textomat : Files having the extension .OUT, created with the Output-Program of Textomat. QUIT : Terminates the program and returns  you to the DeskTop.Noconfirmation isgiven! FONT: NLQ : Set NLQ-Mode. NORMAL : Normal Script wdith in NLQ. BREIT : Wide Script in NLQ (only 40 characters per line possible). STANDARD: Sets Standard-Script (double-height and width). NORMAL : Normal Standard-Script (40 characters per line and 36 lines per page). SMALL : Small Standard-Script (80 characters per line. BOLD : Bold (double-strike) Standard-Script. SPECIAL: PROPORTIONAL: Sets Proportional printing. SELECT PRINTER: Here you can choose between two possible printer-types. One which is able to use 1/144 inch advance or one which uses 1/216 advance. The last type mentioned must have a suitable paper-transport mechanism. SAVE SETTINGS: The possible settings: - Printer type. - Script type. - Proportional - Text type. When you have made the required settings and Saved to disk, your chosen settings will be automatically installed each time the program is started. Note that there is room for much more expansion in future versions... -~-~-~-~-~-~-~-~-~-~-  Here is an example session with the GUTENBERG PRINTER. Note that in  this example, the file GUTENBER.ZSZ is assumed NOT to be present. Double-Click on the file GUTENBER.PRG to start the program. At  this point a printout is still not possible since there is not yet a  font in memory. First thing to do then is to load one! Point with the  mouse at the Menu Heading FILE & select the entry LOAD FONT. You are  presented with a File Selector Box showing the Font files available  on the active drive (files ending with the extension .ZSZ). Choose  a Font and press RETURN, or simply Double-Click on one of them. This  font will be loaded into memory for your use. The actual Character  Set will be displayed in the panel on the right of the screen. Now we can select a Print Style under the FONT Menu. We will use  NLQ Mode & NORMAL for our printout (normal character height & width),  and of course the Font which we have just installed... Now go to the Menu FILE once more because we need to choose what  sort of Text file we intend to print: Normal ASCII-Files - No control codes or special characters. 1st-WORD PLUS Text Files - The program will take heed of page layout details (as per 1st Word's LAYOUT-Menu). Including Headers, Footers, Page Numbers, paper size etc. TEXTOMAT Files - Text files created with the OUTPUT Program of Textomat. These files have the extension .OUT. For the purposes of our demonstration select '1st Word Plus'. Again from the FILE Menu, click on PRINT TEXT. Again you get the  File Selector Box from the active drive. Assuming you still have the  GUTENBERG disk inserted, click on the Folder GUTENBER.DOC. Choose the  file called DEMO_01.DOC, which will then be opened. At this point you  get a Dialog Box allowing you to set the left margin. It will  already contain the margin set when the file was written with 1st  Word Plus but you can alter it if you wish. This box also permits you  to set the starting page number (only for 1st Word files). This is extremely useful when printing long documents spanning several files.  Simply set the starting page number to follow on from the last one of  the previous file... Only one thing remains. By Clicking on PRINT or pressing RETURN  on the keyboard, we can get on with actually printing our sample  document. The first thing that happens is that the text is converted to suit  the requirements you just set in the paragraphs above, it only takes  a few seconds. This will only be done once, no matter how many  documents you print, provided youmake no changes to the settings.  Changing the settings will of course mean that the program must  re-calculate and re-format to suit your new requirements. You should now find that the document begins to appear on your printer. You can terminate printing at any time simply by pressing any  key. Printing will cease at the end of the line currently being  printed. You are then asked to confirm whether to stop printing or  carry on once more. As an added 'extra' you can select to use PROPORTIONALprinting. This is a means of properly spacing each character to give a more  professional appearance to your document. Unfortunately, only left-justified printout is possible. This of course will require the text to be re-calculated and re-formatted as above. Hopefully you now have a top-quality sample document to admire.  Load in a new font and try again, what a difference from that 'dotty'  print you were used to...! -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- Now let's have a look at the operation of the FONT EDITOR: The Font Editor permits the display, editing &creation ofFonts. Using the Font Editor, each of the 256 ATARI character set can be  edited. Each of the Font files will be about 12Kbytes in length. This  is partly due to the size of the character matrix: 16x16 Pixels. It  should be noted that these Font files are not compatible with Degas  or GEM Fonts. As has already been explained, the print quality is  directly connected with the 16x16 matrix used n the character set. The Font Editor, like the GUTENBERG program itself, requires a Monochrome Monitor SM 124 and fully utilises GEM. By the way it is perfectly possible to call Accessories from  within either of my programs, but there exists the possibility that  when the Accessory is closed the background may not be redrawn. It  depends very much on the person who programmed the Acc! He/she  SHOULD have buffered the screen in order to redraw it when closing. Now to more important things. Two thirds of the screen area is occupied by the Font Panel. Each character field in this panel  represents an actual character from the full character set. Naturally when the program is first started all of these are empty  and above each is shown in the system font the character it  represents. To start creating a character, you simply click on the  appropriate field and begin your design. Alternatively you can load  in a Font and re-edit it as much as you wish. When you click on a field to edit it, that field is highlighted  in inverse & the character it presently contains will be copied over  to the large editing grid ready for you to work on it. You just have  to click on the squares of the grid to 'set' each pixel. Changes  will also be shown in that characters own field as well as in the  editing grid. To delete a square, simply click on the ERASER symbol. The mouse now becomes an eraser. To return to drawing, click on the  'pen' symbol... Here is a breakdown of the various Menus in the Font Editor: FILE: -~-~-~ LOAD FONT : Load a Font from disk via a File Selector Box from the active drive. SAVE FONT : A previously Loaded Font will be Saved to the same directory with the same name. CAUTION: it will also be Saved if the Font is Deleted. SAVE AS... : Also Saves to disk, but this time you must specify the Filename. PRINT FONT : This produces a sample printout of the Font currently in Memory. You can select whether to use NLQ or Normal Mode. DELETE FONT : Deletes the whole Font from Memory As a safety feature, a Dialog Box will ask you for confirmation. QUIT : Will terminate the program after a confirmation check. EDIT -~-~-~ V-MIRROR : Mirror the Matrix on a Vertical axis. H-MIRROR : Mirror the Matrix on a Horizontal axis. FILL : Fill the Matrix with BLACK pixels. ERASE : Fill the Matrix with WHITE pixels. INVERT : Invert the Matrix. I.e. All White pixels become Black and vice versa. COPY : In the Symbol Table, click first on the Source-Character and then on the Destination-Character. Source will  be copied to Destination. MOVE -~-~-~ Using this function will move the contents of the Editing Field in the appropriate direction. IMPORTANT: Pixel rows which scroll out of the 16x16 Matrix will be LOST! MARK -~-~-~ SET MARKER: Clicking this Menu item will get you a Dialog box allowing to Select or De-select the Marker function. You may also adjust the Marker Frame dimensions to your requirements. The purpose of the Marker function is to make it much easier for you to ensure that all the characters you design are in fact the same size by providing a 'Frame' around the area occupied by each character. Simply working within the Frame will prevent any accident. It is also possible to save your Frame to disk for future use. These settings will then be loaded in each time the program is started. -~-~-~-~-~-~-~-~-~-~-~-~-~- I hope my small explanation as been helpful to you in using the GUTENBERG PRINTER and FONT EDITOR. Perhaps also you will have found  new life in that 'old' printer...! Your friend, Matthias Baldauf, 20 March 1987 (Version 1.1: 16 April 1987) 072010303050000144002006006010000 1Widowmaker1 2Page #1 F0110030001 9[.............................]1010 1234567891012345678901234567890123456 Maximum36Charactersperline: LayoutData:72  01  03  03  05 Hereisthesampletext... WIDOWMAKER ------------ Ihadtravelledforaweekanda halfjusttogethereanditlooked likeawasteoftime.  Thestoryhadbeenconvincing enoughtostirinterestinunwelcome quartersandasaresultithadtaken betwodaystoshakeoffacoupleof would-betreasurehunters.Andthen oneofthemhadcomeatmewitha knifeacrossthefirelightonenight thinkingtomakeaheroofhimself. WhenIlastsawhimhewastryingto beatouttheflameswithonehand whiletheothertuggedattheknife inhisbelly.Ineverseteyeson eitherofthemagain Ifirstheardaboutthesword calledMirandi(pronouncedMir-and- eye)whenIwasachild.Myfather toldmethestoryoftenenoughforme toknowhehalf-believedithimself. Itwassaidtobetheultimate creationofLopi,blacksmithand armourertoallfourwarriorclansof Antarctica.Hehadthingssewnup rightenough;supplyingweaponsto allsidessotheycouldfightamongst themselves.Itwassaidtobefor possessionofthatswordthatthe finalwarwasfought.Thewarthat leftthatbountifulcontinentsmoking inruins,andtheclansdestroyed forever. Whenitwasdone,Lopihad disappearedandhisgreatswordwith him.Deadoralive?No-oneknows. Thestoryhasitthatatacertain timeofyear,inaquietvalley headedbyawaterfall,youcan sometimeshearLopi'shammerringing ontheanvil...  Thesortoffancifultaleyoutell childrenroundthewinterfireto keepthementertained.Ithad fascinatedmesincethefirst telling.Andtimewithoutnumberas IgrewtomanhoodIthoughtof findingthatfabledswordwithits blue-steelblade. Weallhavedreams. Ihadallbutforgottenitasa legendoftheolddaysuntilacouple ofyearsago.Yarningonboarda shiponenightwithoneofthehands, anelderlycarpenter,Iheardthe samestoryagainbutwithmore detail.WhenIscoffedatithehad gonelimpingoffbelowdecksandI thoughtIhadinsultedhim.Butina whilehecamebackwithacylinderof thin,muchwornleatherunderhis arm. Weshiftedacrossthedeckand squattedunderoneoftheswinging lanterns.Whenheunriolledthething Isawitwasamap. AmapofAntarctica! Butmorethanthat,itshowedthe continentcompletelywithoutice. Sincethecometpassed,beforeIwas born,icehasbeenspreadingof Antarcticawhereoncetherewere gardensandorchards.Theysaythe cometmovedtheworldbutIdon't believethatnonsense. OfcourseItookitforafake; drawnwiththelegendinmind.Buta partofme,deepinsidemysoulwhere nowordscouldreach,wasconvinced finallythatMirandiwasreal. EversincethatnightIhave carefullytrackeddowneveryrumour, everystoryaboutLopi'sfamous sword.Notthattherehavebeenmany worthwastingtimeon.ButIfound nothing,nothingatallandlatelyI hadbeenwonderingagainifIwas justchasingshadows. Thenaservingwenchinatavern, watchingmeheatingresinbythefire torepairtheloosepommelofmy sword,mentionedtheweaponsheanda brotherhadfoundinacaveoneday whentheywerechildren.Iwasonly halflisteningtoherchatteruntil shecommentedontheodd,blue-tinted blade... WhenIhadquestionedher,as subtelyasmyscreamingnerveswould allow,itwasobviousshehadheard noneofthelegends.Manytimes afterwards,shesaid,theyhadtried tofindthecaveagainandfailed. Butitwasjustanoldswordand children'smemoriesareshort. Shehadhelditinherhands! Ileftthatsameevening... Unfortunatelyaninnishardlythe bestplacetodiscusssuchbusiness andinevitablytherehadbeenwagging ears.Iwasnottheonlyonewho knewthelegend.Ihadbeenso engrossedinthegirl'sstorythatI hadn'tnoticedthemcomein.ButI hadbeendimlyawareofthemsitting ontheothersideofthefireplace. AndIsawthepairofthemleave shortlyafterIdid,becauseIstood intheshadowsandwatchedforthem. Theyhadbeentooslowwiththeir beerandtooquietwheneverthewench hadcomeanywherenearme.Rough- neckslikethoseshouldhavebeen singinginsideanhour. SoIwatchedthemdownthestreet andthenwenttheotherwaybutthey werebetterthanIgavethemcredit for. Therewerenocavesanywhereinthe vicinityofthegirl'shomevillage thatIcouldfind.No-onehadever heardofanyeither.Iendedupina dried-upriverbedtireddirtyand depressed.Thisreallyhadbeenthe bestleadsofarbitithadended hereinthedustyscrub,amongthe lizardsandblownsand. Movement. Icameroundinahalfcrouchwith theswordgrippedinbothhandsbut shejustsmiledatmewithout speaking. Itwasthegirlfromthetavern...  066010303050000132002006006010000 11 21 F0110030001 9[.........................................................]0010  GUTENBERG-PRINTER -----------------------------------  Have you ever looked with envy at someones new and expensive NLQ Printer? And wished you could print your correspondance, articles or even dissertations in a more impressive better quality print without having to spend a fortune on a fancy printer? Well now you can. I am delighted to present to you the GUTENBERG-PRINTER,speciallydesigned foryourATARIST Computer. The program is designed to work with all types of ST, it is not necessary to have endless memory... You will need to have a Monochrome Monitor (ATARI SM 124) and an Epson-compatible 9 Pin Dot matrix printer. The best results canbe obtained with the latest Epson or Star (Epson compatible) printers, although owners of older equipment should also see a great improvement. I myself own a Star Gemini10 which has always given quite acceptable results despite being of modest quality. However, owners of more 'Up-Market' printers will also find a use for my program as an enhancement. In the following acticle I want to discuss some of the more unusual aspects of the Program. Unlike some other similar programs this one canhandle rather more than just ASCII! For example: there is a 1st Word Plus file Converter to tell you about. And then there aresome of the principals of NLQ printing. TheNLQ-PrintMode: ------------------- If you presently have a Near Letter Quality printer,such as the Star NL 10 or the Epson FX 85, then you will know that the print head runs twice over each line in NLQ Mode. This prints each character in two parts, with a very small vertical movement between each pass. Thus giving a somewhat darker image with none of the rather'dotty' characteristics so typical of Dot Matrix printouts. A trade offis slower speed because of course bi-directional printing is not possible in NLQ mode. Precisely this principal is used in the GUTENBERG-PRINTER. Rather than being built in to the printer hardware, the same effect is achieved by means of software 'emulation'. This emulation is virtually as fast as a hardware-installed NLQ Font. In Pic 1.1 (see the Folder called GUTENBER.GEM) under 'Normal' is shown how the printer prints out each line point by point and line over line.To make our 16x16 Pixels print size rather than 8x8 Pixels (the normal character size for a 9-Pin printer), we simply double the graphic density of the printer. This will print out a compressed form although there will still be 80 characters per line. The result is as seen in Pic 1.2. The script now shows as being compressed (komprimiert) in width but is still double height. In order to also compress the height we need to employ a little trick. As shown in Pic 1.3, the first step is to compress and print lines 1,3,5 etc. Then he printer platten is scrolled upwards by half a Pixel. Now we print lines 2,4,6 etc as  a second pass and the result is as depicted in Pic 1.4, a reasonable density for NLQ use and much improved over the standard output. If still better print quality is desired, you should simply use a new, fresh ribbon and a heavier paper (or use two sheets together!) in your printer. I know it sounds a bit simplistic but just try it, you might be surprised... The1st-WordTextConversion: ----------------------------- The most common Word Processor for the Atari ST is probably 1st Word now updated to 1st Word Plus. Because of the widespread use of this Word Processor I have included a 1st Word Plus text conversion routine in my program. Although 1st Word documents will be handled without problems, special characteristics such as Italics, Bold Type etc will NOT be translated. I have in fact tried to implement these facilities with some success, but only at the expense of speed. I therefore decided to do without. Nothing annoys me more than a s-l-o-w program! However, things like Justification (Left, Right or Centre), Tabs, variable spacing and so on are supported. all layout data will be correctly printed by GUTENBERG-PRINTER, including Headers & Footers. Headers or Footers can contain the hash symbol '#' where you wish the Page Number to go. There's also the possibility of printing very long documents, spread over several files. Before printing you are presented with a separate Menu allowing you to set the starting Page Number for each file. Just set this to the appropriate number to commence the next file in sequence. As in the Original 1st_Word Printer Driver, you can set the required position of the left margin. If you're loading a 1st Word document then the left margin setting will automatically be set according to the document layout. There is a small routine in the Program which analyses all the characters in each file as it isloaded. This is for the purpose of identifying special 1st Word layout characters (although they're not used, the Program needs to know what they are so they can be ignored!). Pic 2 shows the Special Character Table. Pic 3 shows the construction of Headerand Footer lines, the Format Lines as well as theLayout-Data ines. In the interests of space (this procedure is over 300 lines in length) and also because there is little incentive to freely give out my programming efforts, I have supplied only a framework for this Routine (see Listing 1). Enough information is given to get you get started on developing your own 1st Word Printer Driver. Also you should note that a different Driver would be needed for a different Word Processor, incorporating the appropriate control codes for that program. See the Word Processor documentation and your printers manual.  GEM-Object-ProgrammingunderST:Pascalv1.5: -------------------------------------------- Such things as Drop-Down Menus and Window-Handling are in principal handled the same way in ST:Pascal, as in 'C' - the 'Mother tongue' of the ST. As Address Pointers, 'long_integer' Variables were used in this prog. Prospective GEM programmers should note that if a GEM-call should return a value, then a corresponding parameter must be previously registered in the Procedure declaration. Otherwise strange things can happen... The principals of Window-Handling and Drop-Down Menus has been often explained in 'ST-Computer'magazine (articles by T. Weinstein) and there is little purpose in going into detail here about what is a quite complex subject. In this Program the Dialog Boxesand Menus were designed using the Resource-Construction-Set fromDigitalResearch. If you don't have a copy of this superb package then you canobtain it from 'ST Computer' for a reasonable cost. It is an important help in understanding and working with OBJECT-Trees. On exiting from a Dialog Box (by clicking on the EXIT-Button) the background needs to be restored. GUTENBERG-PRINTER simply uses a buffer of sufficient size to contain the normal screen layout, which is redrawn whenever required. This is certainly not the most elegant or memory-efficient of solutions to the problem but it is one of the easiest and quickest. Often you want to know the status of a Button without necessarily waiting for it to be pressed. For this you can use the Function 'get_state'. The Function 'get_text' is used to find the contents of a Text Box. These parameters are passed over in the same way as for 'get_state'. Out of this a String Variable must be obtained before the text can be written. The Function 'set_text' writes a String in a TEXT-Box. The practical operation of these Procedures and Functions can be seen in Listing 2. If you would like further assistance with GEM-Programming, you would be well advised to consult the full Listing of GUTENBERG-PRINTER in 'ST-Computer' magazine. With this Listing and a good GEM-book most of the problems you will possibly encounter with ST:PASCAL V1.5 should be easily overcome. GEM has many fascinations and can be an extremely useful tool for the programmer. Although fraustrating to learn the effort is always worth it. We all had to do it, so can you... Regards... .  t..  tPIC_1 GEM t zPIC_2 GEM t  PIC_3 GEM t 2d/ q @p ddddldddd ddd'djdkd dddhdcPccchc ~l~~~cQcP  cQcP = =cQcP  cQcP ] ]cQcP f fcQcP =f =fcQcP  cQcP  cQcP  cQcP  cQccjc'ckc c c  v 1      v2      v,3      v4      wb5  j     1.Normal  cP _/'_//'_'_cQcPccc z/ z/cQcP / /cQcPccc  cQcPccc  cQcPccc "O "OcQcP " "cQcP "o "ocQcP F FcQjc c  2      3      4      5  cP " "cQ c  2  cP 5 5cQ c  y1  j     u2.Komprimiert      F3.Einzelschritte  cP _/_//__cQcPccc z> z>cQcP > >cQcPccc " "cQcPccc  cQcPccc "^ "^cQcP " "cQcP F" F"cQjc c  %2  cP " "cQcP D DcQcP cQcPccc  cQcP  cQcPccc Md MdcQcPccc  cQcPccc  cQcP 0 0cQcP  cQcP d dcQ c  g2  cP  cQcP  cQ c  1      Q3      5      7      !9      ~2      4      6      O8  cP rrrcQcPccc ? ?cQcP  cQcP _ _cQcP  cQcP ? ?cQcP  cQcP ?? ??cQcP ? ?cQcP ?_ ?_cQ c  U1      2      u3      4      5  cPccc g gcQcP  cQcP  cQcP  cQcP g gcQcP  cQcP g? g?cQcP g gcQcP g_ g_cQ c  02      0u3      04      15  cPccc @ @cQcP  cQcP ` `cQcP  cQcP @q @qcQcP k kcQcP @ @cQcP @ @cQcP @! @!cQ c  1      2      73      4      m5  cPccc } }cQcP  cQcP  cQcP  cQcP hq hqcQcP q qcQcP h hcQcP h hcQcP h! h!cQjc c  *c 4. Die NLQ-Schrift  c xkc c  y #Bild 1  e4z 8:     l        ' j k    h cc&cUUUUUUUUUUUUUUUU cckc jc c4  |Special-Character Tablecjcc  The number of the ASCII-Codescc   l12  cFormfeedc@^  /  25 Variable Separation (1st Wordplus)cct % 027 Style change (see below)ccb 0  28 Stretch Space (in Indent or Centre)cc ,  R29 Indent Spacecc  $30 Variable cSpacec$   ~31 Format Line cc   z32 Fixed cSpacejc ch&  (Style Change Tablecjccr 6  First comes an ESC (27)cc   zthen:cc I  154 ccBoldc   2136 c Unterstrichenc p  132 ccItalicc   ^*137 Bold-c Unterstrichenc\  *133 Bold-cItalicc* " 141 Bold-Italic-Underlinedcc   130 ccLightc R"  4138 Light-c Unterstrichenc # 8142 Light-Underlined-Italiccc y  144  c Superscriptc \  d:160  c Subscriptc   128 c Normalschriftjckcc\  NXPic 2ce 8:     l        ' j k    h cc&c?8UUUUUUUUUUUUUUUU cckc jc cB  B4Format-Linecjcc  Format-Line begins with ASCIIcc8 + j Code 31. After that as Character (not ascc   (ASCII-cCode):cP  J0 Layout Data cZeilec   &1  c Kopf-Zeilec 4  v&2  c Fuss-Zeilec )  9 Format-Line (Text Width, Tab)cjc cBjj  B$Format-Line (9)cjccP 1  The contents of the Format-Line can be ignored,cc\ / @ important is only the position of the second cc| % Nsquare ']', the precise line width.cjc c.h  Head- and Footer Linecjcc 5 PE.g. 1@written by Matthias Baldauf@Page #@All cklarjccP -  The brackets should show the ASCII-Code 31:ccPlccVRcQcPcVcQcPccQcPccQcPcUcQcPcqqcQcPccQcPccQcPccQcN  Header-Linecc   fHeader-Leftcc&  |Header-Centre.cc&  # is Page Numbercc&  &f Header-Rightcjc c  Layout-Data-Linecjcc %  An Example: (Identification numberscc& % |Ntheoretically apart bit in practisecc|  directlt behing each other)cc6 " 4The number incidentally from twoccj 0  Characters (therefore put no character values)cjcc  0 c66 01 04 03 05 66cPccQcPcz?cQcPc0cQcPc|cQcPc~cQcPccQcPc^cQcPcacQcPc|cQcPcmcQcPcRcQcPccQcPccQjccl  6Layout-ccp0  DataccWB  Paper lengthccAz  BJTOF marginccT  XHead margincc>  >@JFoot-ccz  marginccS&f  XBOF marginccz  vText-Widthcc0 1 0. n TOF margin : Set platten for Header Linecc0h * 0 pHead margin : Start Line for textcc0 x ) 0Z Foot margin : Last Line for textcc0 x / 0 ( BOF margin : Footer Line for paper endcjckcc( \  ( XPic 3c.  t..  tLISTING1DOC t HLISTING2DOC t ! {************************************************* ** L I S T I N G 1 ** ** ================== ** ** 1st_Word Converter Procedure ** ** ** ** written by M.Baldauf 3/87 ** ** ** *************************************************} procedure st_word_print; var i:integer; { Variables must be Declared here or the } { Procedure will not function. } procedure print_line(line:string); { Format wanted Script and } begin { print a line. } { This is where the Routine goes } { which Branches to the printer } { and prints the String 'line'. } { In my Program this is the NLQ } { Print Routine, but a different } { Routine could be called here. } end; procedure kopf; { Generate and print the Header } begin { line. } { Rememeber that the Header will } { likely be centred. Again it } { is important to test for the } { Page Number symbol '#'. It } { can be placed left, right or } { in the middle. } { The Program will provide and } { insert its own Page Numbers. } { The number will be stored in } { a String and located where } { you put the '#'. } end; procedure fuss; { Assemble the Footer line. } { Same programming as the } { Header line. } end; procedure read_zeile; { Read 10 lines from disk. } begin { A precise number of lines (10) } { is read into a String Array. } { Always test for the File-End } { symbol too. } { The reading in of several } { lines speeds up the process } { considerably. } end; begin { Begin von st_word_print } { Set Page Number to start value. } { Set Line Number to 0 and open a } { Text-File. Initialise printer. } { Divert output to printer. } repeat read_zeile; zaehler := 0; while ((zaehler < {eingelesene Zeilen} ) and (keypress = false)) do begin zaehler := zaehler + 1; line := {eingelesene Zeile}[zaehler]; if ((length(line) > 1) and (ord(line[1]) = 31)) then begin case line[2] of '0' : begin { Layout Data } { Filter out Layout Data. Read } { in line and dismantle into 2 } { parts. Calculate and Format } { each part. } end; '1' : begin { Header Line, with '#' as Page Number } { Filter out each part of the Header line } { and insert in a String. } end; '2' : begin { Footer Line, with '#' as Page Number } { Exactly as in the Header Line } end; '9' : begin { Format Line with Tab Character } pap_breit := pos(']',line) - 2; { Print width } end; end; end else begin if ((length(line) > 0) and (ord(line[1]) = 12)) then begin { Formfeed -> Advance } { Advance to Footer Line. } { Print Footer Line and Page Number. } { Line Number to 0. } end; if pap_zeil = pap_len-pap_foot-pap_bof then begin { Page full -> Advance } { Print Footer Line and Page Number. } { Line Number to 0. } end; if pap_zeil < 1 then { Time to print the Header } begin { Line... } kopf; pap_zeil := pap_tof+pap_head; { Print Header -> Set the } end; { Line Number. } ganz_zeil := ''; lang:=length(line); { How long is the Line ? } for i := 1 to lang do begin zei:=copy(line,i,1); { Actual character height. } zeich := ord(zei[1]); { ASCII-Code } if flag = 1 then { Aha, now a style-change. } flag := 0 else if zeich > 31 then { All in order. } ganz_zeil := concat(ganz_zeil,chr(zeich)) else { Otherwise repeat test. } case zeich of 25 : { Variable separation } ganz_zeil := concat(ganz_zeil,'-'); 27 : flag := 1; { Style change } 28 : { Stretch space } ganz_zeil := concat(ganz_zeil,chr(32)); 29 : { Indent space } ganz_zeil := concat(ganz_zeil,chr(32)); 30 : { Variable space } ganz_zeil := concat(ganz_zeil,chr(32)); end; end; { Now output line. } print_line(ganz_zeil); pap_zeil := pap_zeil + 1; { Print line again. } end; end; if eof(fil) then { What, Text finished already? } begin { Then advance to Footer Line. } { Print Footer Line, } quit := true; { and it's all done! } end; if keypress then { What to do now ? } begin { Really terminate ? } { If YES, then 'Okay, I'm convinced'; quit := true; otherwise again } end; until quit = true; { Another abort or exit test } close(fil); { Close Text-File. } rewrite(output,'CON:'); { Standard Console Output. } end; { End of st_word_print } {************************************************ ** L I S T I N G 2 ** ** =================== ** ** OBJECT-Manipulation under CCD-Pascal ** ** ** ** written by M.Baldauf 3/87 ** ** ** ************************************************} { DATA STRUCTURE } TYPE ted1 = PACKED RECORD { TEDINFO-Structure } te_ptext:long_integer; { Pointer to additional text } te_ptmplt:long_integer; { Pointer to Input-Routine } te_pvalid:long_integer; { Pointer to valid Input } te_font:integer; { Normal or small Characters } te_junk1:integer; { Reserved } te_just:integer; { Text Formatting: Centring etc } te_color:integer; { Colour check } te_junk2:integer; { Reserved } te_thickness:integer; { Thickness of rectangle edging } te_txtlen:integer; { Length of String ^te_ptext } te_tmplen:integer { Length of String ^te_ptmplt } END; tedinfo = RECORD CASE boolean OF FALSE: (ted_tree:long_integer); TRUE : (p_ted:^ted1) END; ob1 = PACKED RECORD { OBJECT-Struktur } ob_next:integer; { Next Object } ob_head:integer; { First Object } ob_tail:integer; { Last Object } ob_type:integer; { Object type } ob_flags:integer; { Object Eligibility } ob_state:integer; { Object state } ob_spec:long_integer; { Object specification } ob_x:integer; { Object X-Coordinate } ob_y:integer; { Object Y-Coordinate } ob_width:integer; { Object width } ob_height:integer { Object height } END; object_typ = RECORD CASE boolean OF FALSE: (object_tree:long_integer); TRUE : (p_obj:^ob1) END; { ---------------------------------------------- } { NECESSARY PROCEDURES } {********************* ** Peek und Poke ** *********************} function peek(adr:long_integer):byte; type word = packed record w:byte end; var ptr:record case boolean of false:(i:long_integer); true :(p:^word) end; begin ptr.i := adr; peek := ptr.p^.w end; procedure poke(adr:long_integer;val:byte); type word = packed record w:byte end; var ptr:record case boolean of false:(i:long_integer); true :(p:^word) end; begin ptr.i := adr; ptr.p^.w := val end; {**************************************** ** Get Object text ** ****************************************} PROCEDURE get_text(baum,index:integer;VAR text:string); VAR adress,text_tree:long_integer; object:object_typ; ted_info:tedinfo; text_len,i:integer; i1:integer; BEGIN dummy:=rsrc_gaddr(0,baum,adress); object.object_tree:=adress+index*24; ted_info.ted_tree:=object.p_obj^.ob_spec; text_tree:=ted_info.p_ted^.te_ptext; text_len:=ted_info.p_ted^.te_tmplen-2; text:=''; for i:=0 TO text_len DO text:=concat(text,chr(peek(text_tree+i))); if text[1] = '@' then text:='' else begin i1:=1; text:=''; loop exit if (text[i1]=chr(0)) or ((i1>=text_len-2) and (text[i1]=' ')); text:=concat(text,text[i1]); i1:=i1+1; end; end; END; {**************************************** ** Set Object text ** ****************************************} PROCEDURE set_text(baum,index:integer;text:string); VAR adress,text_tree:long_integer; object:object_typ; ted_info:tedinfo; text_len,i:integer; BEGIN dummy:=rsrc_gaddr(0,baum,adress); object.object_tree:=adress+index*24; ted_info.ted_tree:=object.p_obj^.ob_spec; text_tree:=ted_info.p_ted^.te_ptext; text_len:=ted_info.p_ted^.te_txtlen-2; text:=''; FOR i:=0 TO text_len DO poke(text_tree+i,ord(text[i+1])); END; {**************************************** ** Get Object status ** ****************************************} FUNCTION get_state(baum,index:integer):integer; var object:object_typ; error:integer; address:long_integer; begin error := rsrc_gaddr(0,baum,address); object.object_tree := address + index*24; get_state := object.p_obj^.ob_state; end; {******************************* ** Object not selected ** *******************************} procedure desel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,0,1); END; {*********************** ** Object selected ** ***********************} procedure sel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,1,1); END; {********************************************** ** This Function locates Dialog-Boxes ** **********************************************} function hndl_dial(tree:long_integer; def, x,y,w,h:integer):integer; VAR obj,xdial,ydial,wdial,hdial:integer; BEGIN form_center(tree, xdial,ydial,wdial,hdial); { Calculate Coordinates of } { the given Object tree, so } { that it is displayed in } { the centre of the screen. } form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); { Reserve the screen memory } { area. } form_dial(1,x,y,w,h,xdial,ydial,wdial,hdial); { Expand Box } objc_draw(tree,0,30,xdial,ydial,wdial,hdial); { Formula supervision of } obj := form_do(tree,def); { Object Trees via AES } hndl_dial := obj; form_dial(2,x,y,w,h,xdial,ydial,wdial,hdial); { Shrink Box } form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); { Free the reserved screen } { memory. } END; { ---------------------------------------------- } { AN EXAMPLE-CALL } procedure about_prg; var tree:long_integer; dummy,obj,status:integer; begin set_text(UEBER, DRUCKRND,'Matthias'); { Set Text 'Matthias' in TEDINFO - } { Structure DRUCKRND in the Object } { Tree UEBER } set_text(UEBER, SEITE,'Baldauf'); { Set Text 'Baldauf' in TEDINFO - } { Structure SEITE in the Object- } { Tree UEBER } dummy := rsrc_gaddr(0, UEBER, tree); { Contains the Address of the OBJECT } { Structure UEBER. } obj := hndl_dial(tree,0,320,200,1,1); { Calls the Procedure 'hndl_dial'. } { Overrides the Program Control } { until the User presses an Exit } { Button. } desel_obj(tree,obj); { Highlight the 'clicked' Exit } { Button. } get_text(UEBER, DRUCKRND,str_1); { Get Text from TEDINFO-Structure, } { DRUCKRND, from the OBJECT-Structure} { UEBER and fashion the String str_1 } { zu. } status := get_state(UEBER, OK_BUTTON);{ Gets Object-Status of the OK_BUTTON} { from the OBJECT-Structure UEBER } end; { END OF EXAMPLE-CALL} .  t..  tFONT I t ~GUTENBERI t FONT PAS t !GUTENBERPAS t ! FONTEDIT = 0; (* TREE *) DESK = 3; (* OBJECT in TREE #0 *) AUSGABE = 4; (* OBJECT in TREE #0 *) EDIT = 5; (* OBJECT in TREE #0 *) ABOUT = 10; (* OBJECT in TREE #0 *) LOAD = 19; (* OBJECT in TREE #0 *) SAVE = 20; (* OBJECT in TREE #0 *) SAVEAS = 21; (* OBJECT in TREE #0 *) PRINT = 23; (* OBJECT in TREE #0 *) QUIT = 28; (* OBJECT in TREE #0 *) VSPIEGEL = 30; (* OBJECT in TREE #0 *) HSPIEGEL = 31; (* OBJECT in TREE #0 *) FILL = 34; (* OBJECT in TREE #0 *) TOGGLE = 37; (* OBJECT in TREE #0 *) COPY = 39; (* OBJECT in TREE #0 *) UEBER = 1; (* TREE *) DRUCKE = 2; (* TREE *) NLQ = 3; (* OBJECT in TREE #2 *) NORMAL = 5; (* OBJECT in TREE #2 *) ABBRUCH = 4; (* OBJECT in TREE #2 *) ERASE = 35; (* OBJECT in TREE #0 *) MOVEUP = 41; (* OBJECT in TREE #0 *) MOVEDOWN = 42; (* OBJECT in TREE #0 *) MOVELEFT = 43; (* OBJECT in TREE #0 *) MOVERIGH = 44; (* OBJECT in TREE #0 *) MOVE = 6; (* OBJECT in TREE #0 *) ERASEFON = 26; (* OBJECT in TREE #0 *) PRINTFON = 24; (* OBJECT in TREE #0 *) MARK = 7; (* OBJECT in TREE #0 *) SETMARK = 46; (* OBJECT in TREE #0 *) MARKE = 3; (* TREE *) OBENGR = 4; (* OBJECT in TREE #3 *) UNTENGR = 6; (* OBJECT in TREE #3 *) OBENKL = 5; (* OBJECT in TREE #3 *) UNTENKL = 7; (* OBJECT in TREE #3 *) LINKSGR = 8; (* OBJECT in TREE #3 *) LINKSKL = 9; (* OBJECT in TREE #3 *) RECHTSGR = 11; (* OBJECT in TREE #3 *) RECHTSKL = 10; (* OBJECT in TREE #3 *) MARKAUS = 17; (* OBJECT in TREE #3 *) MARKEIN = 18; (* OBJECT in TREE #3 *) MARKSAVE = 20; (* OBJECT in TREE #3 *) MARKFERT = 21; (* OBJECT in TREE #3 *) GUTENB = 0; (* TREE *) UEBER = 1; (* TREE *) WAIT = 2; (* TREE *) DESK = 3; (* OBJECT in TREE #0 *) AUSGABE = 4; (* OBJECT in TREE #0 *) FONTI = 5; (* OBJECT in TREE #0 *) SPECIAL = 6; (* OBJECT in TREE #0 *) INFO = 9; (* OBJECT in TREE #0 *) LADEFONT = 19; (* OBJECT in TREE #0 *) PRINTFIL = 20; (* OBJECT in TREE #0 *) QUIT = 18; (* OBJECT in TREE #0 *) NLQ = 28; (* OBJECT in TREE #0 *) NORMAL = 29; (* OBJECT in TREE #0 *) INFOOK = 2; (* OBJECT in TREE #1 *) WARTE = 3; (* TREE *) ASCII = 24; (* OBJECT in TREE #0 *) TEXTOMAT = 23; (* OBJECT in TREE #0 *) DRUCKE = 4; (* TREE *) DRUCKDRU = 4; (* OBJECT in TREE #4 *) DRUCKABB = 5; (* OBJECT in TREE #4 *) DRUCKRND = 3; (* OBJECT in TREE #4 *) STANDNOR = 31; (* OBJECT in TREE #0 *) STANDSCH = 33; (* OBJECT in TREE #0 *) STANDHER = 32; (* OBJECT in TREE #0 *) PROPORT = 37; (* OBJECT in TREE #0 *) NLQNORM = 34; (* OBJECT in TREE #0 *) NLQBREIT = 35; (* OBJECT in TREE #0 *) STWORD = 26; (* OBJECT in TREE #0 *) SEITE = 7; (* OBJECT in TREE #4 *) SAVEPREV = 40; (* OBJECT in TREE #0 *) PRINTTYP = 43; (* OBJECT in TREE #0 *) PRINTER = 5; (* TREE *) NL10 = 5; (* OBJECT in TREE #5 *) GEMINI = 6; (* OBJECT in TREE #5 *) PRINTOK = 9; (* OBJECT in TREE #5 *)  { Font-Editor ist part of the Program package } { GUTENBERG-PRINTER for the ATARI ST Computer } { } { FONT.PRG (c) July 1986 by MKB-Soft M.Baldauf } { } { Last update : 02.05.1987 } {$U70} program FONT_EDIT; CONST mu_mesag = 16; mu_button = 2; { The Include File FONT.I contains values used in the RSC File } {$I FONT.I} TYPE in_type = ARRAY[0..10] OF integer; out_type = ARRAY[0..99] OF integer; stringtyp = PACKED ARRAY[1..21] OF char; zeiltyp = PACKED ARRAY[1..60] OF char; nulldrei = ARRAY[0..3] OF integer; mgbuftyp = ARRAY[0..7] OF integer; text_type = PACKED ARRAY [0..39] OF char; pxy_type = ARRAY[0..7] OF integer; grect = RECORD g_x:integer; g_y:integer; g_w:integer; g_h:integer; END; ted1 = PACKED RECORD te_ptext:long_integer; te_ptmplt:long_integer; te_pvalid:long_integer; te_font:integer; te_junk1:integer; te_just:integer; te_color:integer; te_junk2:integer; te_thickness:integer; te_txtlen:integer; te_tmplen:integer END; tedinfo = RECORD CASE boolean OF FALSE: (ted_tree:long_integer); TRUE : (p_ted:^ted1) END; ob1 = PACKED RECORD ob_next:integer; ob_head:integer; ob_tail:integer; ob_type:integer; ob_flags:integer; ob_state:integer; ob_spec:long_integer; ob_x:integer; ob_y:integer; ob_width:integer; ob_height:integer END; object_typ = RECORD CASE boolean OF FALSE: (object_tree:long_integer); TRUE : (p_obj:^ob1) END; copy_type = RECORD address:long_integer; wort:array[2..9] of integer; END; fs_type = PACKED ARRAY [1..39] OF char; ch_type = PACKED ARRAY [1..150] OF char; spritetyp = RECORD { Record Data for both Icons } x_spot:integer; y_spot:integer; format:integer; bcolor:integer; fcolor:integer; mask: ARRAY [0..15] OF RECORD background:integer; foreground:integer; END END; VAR handle,w_handle,dummy:integer; xdesk,ydesk,wdesk,hdesk:integer; mausx,mausy,ready:integer; modus:integer; l_intin:in_type; l_out :out_type; mgbuf:mgbuftyp; menu_tree:long_integer; fs_iexbutton:boolean; fs_iinpath,fs_iinsel:fs_type; obj_tree:long_integer; laenge:integer; infozeil:zeiltyp; a1: ARRAY [0..100] OF integer; sprite1 : spritetyp; sprite2 : spritetyp; a:char; i:integer; str:string; dateiname:string; pxy:pxy_type; pos: ARRAY[1..4,1..4] OF integer; sourc,dest:copy_type; screen_sourc,screen_dest:long_integer; select : integer; select_x,select_y:integer; esc:char; font: ARRAY[1..250,1..13] OF long_integer; font_pr : ARRAY[1..2,1..250,1..13] OF integer; mark_li,mark_re, mark_ob,mark_un: integer; mark_stat : integer; potenz : array[0..15] of long_integer; potenz_w : array[0..7] of integer; pr_init,pr_vor_halb,pr_vor_acht,pr_vor_norm, pr_hrg_norm,pr_hrg_dopp:string[10]; procedure vro_cpyfm(handle,mode:integer;var xy:pxy_type; var sourc,dest:copy_type); C; procedure appl_init; C; procedure appl_exit; C; procedure rsrc_free; C; function graf_handle(var gl_wchar,gl_hchar,gl_wbox,gl_hbox:integer):integer; C; function wind_create(wtype,w1,w2,w3,w4:integer):integer; C; function evnt_multi(t,i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12:integer; var mgbuf:mgbuftyp; j1,j2:integer; var k1,k2,k3,k4,k5,k6:integer):integer; C; procedure v_opnvwk(var wi:in_type; var handle:integer; var wo:out_type); C; procedure graf_mouse(i:integer); C; procedure wind_get(i,j:integer; var x,y,w,h:integer); C; procedure wind_calc(i,wtype,w1,w2,w3,w4:integer; var j,k,l,m: integer); C; procedure wind_set(handle,i:integer;var text:zeiltyp;j,k:integer); C; procedure v_gtext(handle,k,l:integer;var t:string); C; procedure wind_open(handle,w1,w2,w3,w4:integer); C; procedure v_clsvwk(handle:integer); C; procedure wind_close(handle:integer); C; procedure wind_delete(handle:integer); C; procedure vsf_interior(handle,i:integer); C; procedure vsf_color(handle,i:integer); C; procedure vswr_mode(handle,i:integer); C; procedure evnt_button(i,j,k:integer; var mausx,mausy,l,m:integer); C; procedure vs_clip(handle,i:integer; var t:nulldrei); C; procedure v_bar(handle:integer; var t:nulldrei); C; procedure graf_growbox(i,j,k,l,m1,m2,m3,m4:integer); C; procedure graf_shrinkbox(i,j,k,l,m1,m2,m3,m4:integer); C; procedure vsf_style(handle,i:integer); C; function rsrc_load(var title:stringtyp):integer; C; function rsrc_gaddr(i,j:integer; var menu_tree:long_integer):integer; C; procedure menu_bar(m:long_integer; k:integer); C; procedure menu_tnormal(m:long_integer; k,l:integer); C; function form_alert(i:integer; var l:ch_type):integer; C; procedure form_dial(i,j,k,l,m,m1,m2,m3,m4:integer); C; procedure form_center(i:long_integer; var m1,m2,m3,m4:integer); C; procedure objc_change(i:long_integer; j,l,m1,m2,m3,m4,m,k:integer); C; function form_do(i:long_integer; m:integer):integer; C; procedure objc_draw(i:long_integer; k,j,m1,m2,m3,m4:integer); C; function rc_intersect(var i,j:grect):integer; C; procedure wind_update(i:integer); C; function fsel_input(var pfad1:fs_type; var filename1:fs_type; var button1:boolean):boolean; C; procedure menu_ienable(m_tree:long_integer; m_item,m_enable:integer); C; function getrez:integer; xbios(4); function logbase:long_integer; xbios(3); function malloc(size:long_integer):long_integer; gemdos($48); {******************************************************** ** Text written with the LINEA Funktion 'PUT_CHAR' ** ********************************************************} procedure set_text(zeile:string; x,y:integer); var i:integer; begin for i := 1 to length(zeile) do put_char(zeile[i],x+(i*8)-1,y,1); end; {************************************************* ** Convert STRING -> PACKED ARRAY OF CHAR ** *************************************************} procedure str_to_char(str:string; var pa:ch_type); var i,len:integer; begin len := length(str); for i := 1 to len do pa[i] := str[i]; pa[len+1] := chr(0); end; {************************************************* ** Convert PACKED ARRAY OF CHAR -> STRING ** *************************************************} procedure char_to_str(pa:fs_type; var str:string); var i:integer; begin str := ''; i := 1; while pa[i] <> chr(0) do begin str := concat(str,pa[i]); i := i + 1; end; end; {************************************************* ** LINE drawn with the LINEA Routine 'LINE' ** *************************************************} procedure linef(x1,y1,x2,y2:integer); begin line(x1,y1,x2,y2,1,0,0,0,$FFFF,0); end; {************************************** ** Put INFO LINE in the Window ** **************************************} procedure set_infozeil(st:string); { Put Info Line into Window } var i:integer; procedure str_to_char(str:string; var pa:zeiltyp); var i,len:integer; begin len := length(str); for i := 1 to len do pa[i] := str[i]; pa[len+1] := chr(0); end; begin str_to_char(st,infozeil); wind_set(w_handle,3,infozeil,0,0); end; {***************************************** ** Identify the chosen Field ** *****************************************} procedure select_feld(spalte,zeile:integer); var i,n,flag:integer; clip:nulldrei; begin clip[0] := ((spalte-1)*9+pos[1,1])+1; clip[1] := ((zeile-1)*9+pos[1,2])+1; clip[2] := clip[0] + 7; clip[3] := clip[1] + 7; vsf_color(handle,modus-1); vsf_interior(handle,1); v_bar(handle,clip); end; {******************************************** ** Identify the chosen Character ** ********************************************} procedure select_char(which:integer); var i,n,spalte,zeile:integer; clip:nulldrei; begin zeile := trunc(which/26)+1; spalte := which-((zeile-1)*26); clip[0] := ((spalte-1)*16+pos[2,1]); clip[1] := ((zeile-1)*32+pos[2,2]); clip[2] := clip[0] + 16; clip[3] := clip[1] + 12; select_x := clip[0] +2; select_y := clip[1] +14; hide_mouse; vswr_mode(handle,3); vsf_color(handle,1); vsf_interior(handle,1); v_bar(handle,clip); vswr_mode(handle,1); show_mouse; end; {*********************************** ** Draw Rectangle with LINEA ** ***********************************} procedure rechteck(x,y,x1,y1:integer); procedure linef(x1,y1,x2,y2:integer); begin line(x1,y1,x2,y2,1,0,0,0,$FFFF,2); end; begin linef(x,y,x1,y); linef(x1,y,x1,y1); linef(x1,y1,x,y1); linef(x,y1,x,y); end; {********************************************* ** Delete or Draw required? ** *********************************************} procedure set_modus; var i:integer; begin hide_mouse; rechteck(pos[modus+2,1]-1,pos[modus+2,2]-1,pos[modus+2,3]+1,pos[modus+2,4]+1); rechteck(pos[modus+2,1]-2,pos[modus+2,2]-2,pos[modus+2,3]+2,pos[modus+2,4]+2); show_mouse; end; {************************************************************** ** Character Matrix design by User ** **************************************************************} procedure feld(x,y:integer); var i,n,flag,spalte,zeile,sel,mem,x1,y1:integer; clip:nulldrei; begin if ((x>pos[1,1])and(xpos[1,2])and(ypos[2,1])and(xpos[2,2])and(ypos[3,1])and(xpos[3,2])and(ypos[4,1])and(xpos[4,2])and(y DESTINATION ** ****************************************************} procedure sourc_dest(x,y,w,h:integer); var i : integer; begin hide_mouse; pxy[0] := x; pxy[1] := y; pxy[2] := x+w; pxy[3] := y+h; for i := 4 to 7 do pxy[i] := pxy[i-4]; vro_cpyfm(handle,3,pxy,sourc,dest); show_mouse; end; {****************************************************** ** COPY a Block : DESTINATION -> SOURCE ** ******************************************************} procedure dest_sourc(x,y,w,h:integer); var i : integer; begin hide_mouse; pxy[0] := x; pxy[1] := y; pxy[2] := x+w; pxy[3] := y+h; for i := 4 to 7 do pxy[i] := pxy[i-4]; vro_cpyfm(handle,3,pxy,dest,sourc); show_mouse; end; {*********************************************************************** ** The following Procedure sets the Marker Frame ** ***********************************************************************} procedure desel_hline(which:integer); begin line(pos[1,1],pos[1,2]+which*9,pos[1,3],pos[1,2]+which*9,1,0,0,0,$AAAA,0); end; procedure desel_vline(which:integer); begin line(pos[1,1]+which*9,pos[1,2],pos[1,1]+which*9,pos[1,4],1,0,0,0,$AAAA,0); end; procedure sel_hline(which:integer); begin linef(pos[1,1],pos[1,2]+which*9,pos[1,3],pos[1,2]+which*9); end; procedure sel_vline(which:integer); begin linef(pos[1,1]+which*9,pos[1,2],pos[1,1]+which*9,pos[1,4]); end; {******************************************************************** ** Initialisation must occur before Program start! ** ********************************************************************} procedure init; var i,n,l,x,y,error:integer; tree:long_integer; fil:text; function getdrv:integer;gemdos($19); begin hide_mouse; fs_iinpath := 'A:\*.ZSZ '; { 39 char } fs_iinpath[9] := chr(0); fs_iinsel := ' '; { 39 char } fs_iinsel[1] := chr(0); fs_iinpath[1] := chr(getdrv+1+64); sourc.address := screen_sourc; dest.address := screen_dest; sourc.wort[2] := 640; sourc.wort[3] := 400; sourc.wort[4] := 40; sourc.wort[5] := 0; sourc.wort[6] := 1; sourc.wort[7] := 0; sourc.wort[8] := 0; sourc.wort[9] := 0; for i := 2 to 9 do dest.wort[i] := sourc.wort[i]; { Erase Point } pos[3,1] := 20-1; pos[3,2] := 150-1; pos[3,3] := pos[3,1]+18; pos[3,4] := pos[3,2]+18; rechteck(pos[3,1],pos[3,2],pos[3,3],pos[3,4]); { Set Point } pos[4,1] := 20-1; pos[4,2] := 174-1; pos[4,3] := pos[4,1]+18; pos[4,4] := pos[4,2]+18; rechteck(pos[4,1],pos[4,2],pos[4,3],pos[4,4]); { Now comes the ICON - Data for 2 Icons } WITH sprite1 DO BEGIN x_spot := 0; y_spot := 0; format := 0; bcolor := 1; fcolor := 1; mask[0].foreground := 0; mask[0].background := 0; mask[1].foreground := $c800; mask[1].background := 0; mask[2].foreground := $c800; mask[2].background := 0; mask[3].foreground := 21504; mask[3].background := 0; mask[4].foreground := 25600; mask[4].background := 0; mask[5].foreground := 12800; mask[5].background := 0; mask[6].foreground := 12800; mask[6].background := 0; mask[7].foreground := 5376; mask[7].background := 0; mask[8].foreground := 3328; mask[8].background := 0; mask[9].foreground := 3200; mask[9].background := 0; mask[10].foreground := 3456; mask[10].background := 0; mask[11].foreground := 2016; mask[11].background := 0; mask[12].foreground := 2032; mask[12].background := 0; mask[13].foreground := 1016; mask[13].background := 0; mask[14].foreground := 126; mask[14].background := 0; mask[15].foreground := 0; mask[15].background := 0; END; WITH sprite2 DO BEGIN x_spot := 0; y_spot := 0; format := 0; bcolor := 1; fcolor := 1; mask[0].foreground := 0; mask[0].background := 0; mask[1].foreground := 0; mask[1].background := 0; mask[2].foreground := 255; mask[2].background := 0; mask[3].foreground := 475; mask[3].background := 0; mask[4].foreground := 877; mask[4].background := 0; mask[5].foreground := 1455; mask[5].background := 0; mask[6].foreground := 4090; mask[6].background := 0; mask[7].foreground := 4156; mask[7].background := 0; mask[8].foreground := 8280; mask[8].background := 0; mask[9].foreground := $4090; mask[9].background := 0; mask[10].foreground := $ff20; mask[10].background := 0; mask[11].foreground := $8140; mask[11].background := 0; mask[12].foreground := $8180; mask[12].background := 0; mask[13].foreground := $ff00; mask[13].background := 0; mask[14].foreground := 0; mask[14].background := 0; mask[15].foreground := 0; mask[15].background := 0; END; pos[1,1] := 50; pos[1,2] := 100; pos[1,3] := pos[1,1] + 108; pos[1,4] := pos[1,2] + 144; x := pos[1,1]; y := pos[1,2]; for i := 1 to 17 do begin desel_hline(i-1); y := y + 9; end; x := pos[1,1]; y := pos[1,2]; for i := 1 to 13 do begin desel_vline(i-1); x := x + 9; end; pos[2,1] := 200; pos[2,2] := 65; pos[2,3] := pos[2,1] + 400; pos[2,4] := pos[2,2] + 319; x := pos[2,1]; y := pos[2,2]; for i := 1 to 10 do begin linef(x,y,x+pos[2,3]-pos[2,1],y); y := y + 11; linef(x,y,x+pos[2,3]-pos[2,1],y); y := y + 20; linef(x,y,x+pos[2,3]-pos[2,1],y); y := y + 1; end; x := pos[2,1]; y := pos[2,2]; for i := 1 to 26 do begin linef(x,y,x,y+pos[2,4]-pos[2,2]); x := x + 16; end; l := 0; y := pos[2,2] + 2; for i := 1 to 10 do begin x := pos[2,1] + 4; for n := 1 to 25 do begin l := l + 1; put_char(chr(l),x,y,1); x := x + 16; end; y := y + 32; end; select := 66; select_char(select); modus := 2; show_mouse; mark_stat := 0; { Marker Frame is first switched off } mark_li := 1; mark_re := 11; mark_ob := 1; mark_un := 15; reset(fil,'FONT.DAT'); { Marker information to be Saved? } if not eof(fil) then begin readln(fil,mark_li); readln(fil,mark_re); readln(fil,mark_un); readln(fil,mark_ob); readln(fil,mark_stat); close(fil); end; if mark_stat = 1 then { Switch on the Marker Frame } begin sel_vline(mark_re); sel_vline(mark_li); sel_hline(mark_un); sel_hline(mark_ob); end; error := rsrc_gaddr(0, MARKE, tree); objc_change(tree,MARKAUS+mark_stat,0,xdesk,ydesk,wdesk,hdesk,1,0); { Printer Driver } pr_init := concat(chr(27),chr(64)); pr_vor_halb := concat(chr(27),chr(51),chr(1)); pr_vor_acht := concat(chr(27),chr(65),chr(8)); pr_hrg_dopp := concat(chr(27),chr(76)); pr_hrg_norm := concat(chr(27),chr(75)); pr_vor_norm := concat(chr(27),chr(50)); { Printer Driver - End } potenz[0] := 1; potenz[1] := 2; potenz[2] := 4; potenz[3] := 8; potenz[4] := 16; potenz[5] := 32; potenz[6] := 64; potenz[7] := 128; potenz[8] := 256; potenz[9] := 512; potenz[10] := 1024; potenz[11] := 2048; potenz[12] := 4096; potenz[13] := 8192; potenz[14] := 16384; potenz[15] := 32768; potenz_w[0] := 1; potenz_w[1] := 2; potenz_w[2] := 4; potenz_w[3] := 8; potenz_w[4] := 16; potenz_w[5] := 32; potenz_w[6] := 64; potenz_w[7] := 128; end; {************************************************************ ** Now come a pair of Routines for WINDOW-Handling ** ************************************************************} procedure set_clip(x,y,w,h:integer); var clip:nulldrei; begin clip[0] := x; clip[1] := y; clip[2] := x+w; clip[3] := y+h; vs_clip(handle,1,clip); end; procedure clear_window; var clip:nulldrei; begin hide_mouse; clip[0] := xdesk; clip[1] := ydesk+36; clip[2] := xdesk+wdesk; clip[3] := ydesk+hdesk; vsf_color(handle,0); vsf_interior(handle,1); v_bar(handle,clip); show_mouse; end; procedure open_work; var i,gr_1,gr_2,gr_3,gr_4:integer; begin appl_init; handle := graf_handle(gr_1,gr_2,gr_3,gr_4); for i:=0 to 9 do l_intin[i] := 1; l_intin[10] := 2; v_opnvwk(l_intin, handle, l_out); end; procedure close_window; begin menu_bar(menu_tree,0); rsrc_free; wind_close(w_handle); graf_shrinkbox(xdesk+wdesk DIV 2,ydesk+hdesk DIV 2, 0,0,xdesk,ydesk,wdesk,hdesk); wind_delete(w_handle); v_clsvwk(handle); appl_exit; end; procedure open_window; type titletyp = packed array[1..22] of char; var wi_title:titletyp; wi_kind:integer; procedure wind_set(x,i:integer;var title:titletyp;j,k:integer); C; begin wi_kind := 1+16; (* Namens + Infozeile *) hide_mouse; wind_get(0,4,xdesk,ydesk,wdesk,hdesk); w_handle := wind_create(wi_kind,xdesk,ydesk,wdesk,hdesk); wi_title := ' FONT - EDITOR '; wi_title[16] := chr(0); wi_title[17] := chr(0); wind_set(w_handle,2,wi_title,0,0); graf_growbox(xdesk+wdesk DIV 2,ydesk+hdesk DIV 2, 0,0,xdesk,ydesk,wdesk,hdesk); clear_window; wind_open(w_handle,xdesk,ydesk,wdesk,hdesk); set_infozeil(' (c) Juli 1986 by Matthias Baldauf, Version 1.0 3/87'); show_mouse; end; {*********************************************************** ** Wait for a Mouse key to be pressed - and released ** ***********************************************************} procedure click; (* Wait for the Left Mouse Button to be pressed *) begin evnt_button(1,1,1,mausx,mausy,dummy,dummy); end; procedure un_click; (*  Wait for the Left Button to be released *) begin evnt_button(1,1,0,mausx,mausy,dummy,dummy); end; {************************************************** ** Sometimes an ALERT-Box is also necessary ** **************************************************} function alert(art:integer; text:string):integer; var al_txt:ch_type; begin str_to_char(text,al_txt); alert := form_alert(art,al_txt); end; {********************************************************** ** RESOURCE-FILE will also need to be loaded ** **********************************************************} function load_rsc:integer; var error:integer; title:stringtyp; begin load_rsc := 0; title := 'FONT.RSC '; title[9] := chr(0); error := rsrc_load(title); if error = 0 then begin graf_mouse(0); str:='[1][ Come on, wake up! | Where is my | RSC File ??][ CUSS ]'; ready:=alert(1,str); load_rsc := 1; end; error := rsrc_gaddr(0,0,menu_tree); if error = 0 then begin graf_mouse(0); str:='[1][ Error found in | the RSC File ! | ][SHAME]'; ready:=alert(1,str); load_rsc := 1; end; end; {************************************************** ** Object-Button selected or deleted ** **************************************************} procedure desel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,0,1); END; procedure sel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,1,1); END; {************************************************ ** This Routine controls OBJECT-Handling ** ************************************************} function hndl_dial(tree:long_integer; def, x,y,w,h:integer):integer; VAR obj,xdial,ydial,wdial,hdial:integer; BEGIN form_center(tree, xdial,ydial,wdial,hdial); sourc_dest(xdial,ydial,wdial,hdial); form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); objc_draw(tree,0,30,xdial,ydial,wdial,hdial); obj := form_do(tree,def); hndl_dial := obj; form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); desel_obj(tree,obj); dest_sourc(xdial,ydial,wdial,hdial); END; procedure about_prg; var tree:long_integer; error,obj:integer; begin set_infozeil(' Informationen'); error := rsrc_gaddr(0, UEBER, tree); obj := hndl_dial(tree,0,320,200,1,1); set_infozeil(' '); end; {***************************************************************** ** File-Select-Box Routine ** *****************************************************************} procedure show_file(iinsel,iinpath:fs_type); var ende:boolean; tree:long_integer; xdial,ydial,wdial,hdial:integer; error,i:integer; fn:fs_type; function setdrv(drv:integer):integer;gemdos($0e); function chdir(var fn:fs_type):integer; gemdos($3b); begin xdial := 100; ydial := 50; wdial := 400; hdial := 330; sourc_dest(xdial,ydial,wdial,hdial); ende := fsel_input(iinpath, iinsel, fs_iexbutton); if fs_iexbutton = TRUE then begin char_to_str(iinsel,str); dateiname := str; fs_iinpath := iinpath; fs_iinsel := iinsel; error := setdrv(ord(fs_iinpath[1])-64-1); fn:=('\\ '); fn[3]:=chr(0); error:=chdir(fn); i:=3; while fs_iinpath[i]<>'*' do begin fn[i-2]:=fs_iinpath[i]; i:=i+1; end; fn[i-2]:=chr(0); error:=chdir(fn); end; dest_sourc(xdial,ydial,wdial,hdial); end; {****************************************************************** ** The Character Set must also be displayed on the screen ** ******************************************************************} procedure recompile_font; var i,n,zeile,spalte:integer; zaehler,status:integer; flag : long_integer; begin hide_mouse; zaehler := 0; for zeile := 1 to 10 do for spalte := 1 to 25 do begin zaehler := zaehler + 1; select_x := ((spalte-1)*16+pos[2,1])+2; select_y := ((zeile-1)*32+pos[2,2])+14; for n := 1 to 12 do begin for i := 1 to 16 do begin flag := font[zaehler,n] - potenz[16-i]; if flag >= 0 then begin font[zaehler,n] := flag; put_pixel(select_x+n-1,select_y+i-1,1); end else put_pixel(select_x+n-1,select_y+i-1,0); end; end; end; show_mouse; end; {********************************************************************* ** Routine for Saving or Printing the Character Set ** *********************************************************************} procedure compile_font; var i,n,zeile,spalte:integer; zaehler,status:integer; begin hide_mouse; zaehler := 0; for zeile := 1 to 10 do for spalte := 1 to 25 do begin zaehler := zaehler + 1; select_x := ((spalte-1)*16+pos[2,1])+2; select_y := ((zeile-1)*32+pos[2,2])+14; for n := 1 to 12 do begin font[zaehler,n] := 0; for i := 16 downto 1 do begin status := get_pixel(select_x+n-1,select_y+i-1); if status = 1 then begin font[zaehler,n] := font[zaehler,n] + potenz[16-i]; end; end; end; end; show_mouse; end; {*************************************************** ** Load a Character Set into memory ** ***************************************************} procedure load_font; var i,n,mem,flag:integer; datei:file of long_integer; begin show_file(fs_iinsel,fs_iinpath); set_infozeil(' Loading Font: --Please Wait--'); if fs_iexbutton = TRUE then begin select_char(select); graf_mouse(2); reset(datei,dateiname); if not eof(datei) then begin menu_ienable(menu_tree,SAVE,1); for i := 1 to 250 do for n := 1 to 12 do begin font[i,n] := datei^; get(datei); end; graf_mouse(0); set_infozeil(' Converting Font: --Please Wait--'); recompile_font; select_char(select); mem := modus; hide_mouse; for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; select_feld(n,i); modus := 2; flag := get_pixel(select_x+n-1,select_y+i-1); if flag = 1 then select_feld(n,i); end; show_mouse; modus := mem; end else begin str:='[1][ Sorry, I can't | find this Font !!][ EXIT ]'; ready:=alert(1,str); end; close(datei); end; set_infozeil(' '); end; {*************************************** ** Save a Character Set ** ***************************************} procedure save_font; var i,n,mem,flag:integer; datei:file of long_integer; begin select_char(select); set_infozeil(' Converting Font: --Please Wait--'); compile_font; graf_mouse(2); set_infozeil(' Saving Font: --Please Wait--'); rewrite(datei,dateiname); for i := 1 to 250 do for n := 1 to 12 do begin datei^ := font[i,n]; put(datei); end; close(datei); set_infozeil(' '); graf_mouse(0); select_char(select); mem := modus; for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; select_feld(n,i); modus := 2; flag := get_pixel(select_x+n-1,select_y+i-1); if flag = 1 then select_feld(n,i); end; modus := mem; end; procedure save_as; begin set_infozeil(' Save Font using the Name ...'); show_file(fs_iinsel,fs_iinpath); if fs_iexbutton = TRUE then begin save_font; end; set_infozeil(' '); end; {*************************************************** ** Prepare Character Set for NLQ Printing ** ***************************************************} procedure convert_nlq; var i,n,g,z,za:integer; flag:long_integer; begin set_infozeil(' Print Font: --Convert to NLQ--'); for i := 1 to 250 do for n := 1 to 12 do begin font_pr[1,i,n] := 0; font_pr[2,i,n] := 0; za := 0; for z := 1 to 8 do begin za := za + 1; flag := font[i,n] - potenz[16-za]; if flag >= 0 then begin font[i,n] := flag; g := 8-z; font_pr[1,i,n] := font_pr[1,i,n] + potenz_w[g]; end; za := za + 1; flag := font[i,n] - potenz[16-za]; if flag >= 0 then begin font[i,n] := flag; g := 8-z; font_pr[2,i,n] := font_pr[2,i,n] + potenz_w[g]; end; end; end; end; {******************************************************* ** Prepare Font for ordinary Printing ** *******************************************************} procedure convert_norm; var i,n,g,z:integer; flag:long_integer; begin set_infozeil(' Print Font: --Convert to NORMAL--'); for i := 1 to 250 do for n := 1 to 12 do begin font_pr[1,i,n] := 0; font_pr[2,i,n] := 0; for z := 1 to 8 do begin flag := font[i,n] - potenz[16-z]; if flag >= 0 then begin font[i,n] := flag; g := 8-z; font_pr[1,i,n] := font_pr[1,i,n] + potenz_w[g]; end; end; for z := 9 to 16 do begin flag := font[i,n] - potenz[16-z]; if flag >= 0 then begin font[i,n] := flag; g := 16-z; font_pr[2,i,n] := font_pr[2,i,n] + potenz_w[g]; end; end; end; end; {***************************************** ** Print complete Font ** *****************************************} procedure print_font; var tree:long_integer; error,obj,ready,i,n,z,g,count:integer; zaehler:integer; function bcostat(dev:integer):integer;bios(8); begin esc := chr(27); set_infozeil(' Print Font '); error := rsrc_gaddr(0, DRUCKE, tree); obj := hndl_dial(tree,0,320,200,1,1); if obj <> ABBRUCH then begin str:='[1][ Switch the bloody | printer on ! ][ OK | EXIT ]'; ready:=alert(2,str); if ready = 1 then begin i := bcostat(0); if i = -1 then begin set_infozeil(' Print Font: --Compile Font--'); compile_font; graf_mouse(2); if obj = NLQ then convert_nlq else convert_norm; zaehler := 0; rewrite(output,'PRN:'); write(pr_init); { Printer - Reset } set_infozeil(' Now Printing: --Press a key to abort--'); i := 0; while ((i < 10) and (keypress <> true)) do begin i := i + 1; if obj = NLQ then write(pr_vor_halb) {Advance Line by1/2 Pixel} else write(pr_vor_acht); {Advance Line by 8 Pixel } for g := 1 to 2 do begin if obj = NLQ then {HRG 300 Split } write(concat(pr_hrg_dopp,chr(44),chr(1))) {HRG Double} else write(concat(pr_hrg_norm,chr(44),chr(1)));{HRG Single} for n := 1 to 25 do begin zaehler := zaehler + 1; for count := 1 to 12 do write(chr(font_pr[g,zaehler,count])); end; if g = 1 then begin zaehler := zaehler - 25; writeln; end; end; writeln(pr_vor_norm); {normal-Advance} end; rewrite(output,'CON:'); graf_mouse(0); end else begin str:='[1][ Better check the | printer & cable !!][ EXIT ]'; ready:=alert(1,str); end; end; end; set_infozeil(' '); end; {********************************************************************** ** The following Procedure makes the necessary alterations to the ** ** Character-Editing Matrix ** **********************************************************************} procedure v_spiegel; var i,n,flag,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Character movement: Vertical'); for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; flag := get_pixel(select_x+n-1,select_y+i-1); if flag = 1 then modus := 2; put_pixel(100+n-1,300+i-1,modus-1); end; for i := 1 to 16 do for n := 12 downto 1 do begin modus := 1; flag := get_pixel(100+n-1,300+i-1); if flag = 1 then modus := 2; select_feld(13-n,i); put_pixel(select_x+13-n-1,select_y+i-1,modus-1); end; for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; put_pixel(100+n-1,300+i-1,modus-1); end; set_infozeil(' '); show_mouse; modus := mem; end; procedure h_spiegel; var i,n,flag,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Character movement: Horizontal ') for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; flag := get_pixel(select_x+n-1,select_y+i-1); if flag = 1 then modus := 2; put_pixel(100+n-1,300+i-1,modus-1); end; for i := 16 downto 1 do for n := 1 to 12 do begin modus := 1; flag := get_pixel(100+n-1,300+i-1); if flag = 1 then modus := 2; select_feld(n,17-i); put_pixel(select_x+n-1,select_y+17-i-1,modus-1); end; for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; put_pixel(100+n-1,300+i-1,modus-1); end; set_infozeil(' '); show_mouse; modus := mem; end; procedure fill_prg; var i,n,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Fill Matrix with black '); for i := 1 to 16 do for n := 1 to 12 do begin modus := 2; select_feld(n,i); put_pixel(select_x+n-1,select_y+i-1,modus-1); end; set_infozeil(' '); show_mouse; modus := mem; end; procedure erase_prg; var i,n,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Erase Matrix '); for i := 1 to 16 do for n := 1 to 12 do begin modus := 1; select_feld(n,i); put_pixel(select_x+n-1,select_y+i-1,modus-1); end; set_infozeil(' '); show_mouse; modus := mem; end; procedure toggle_prg; var i,n,flag,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Invert Matrix '); for i := 1 to 16 do for n := 1 to 12 do begin modus := 2; flag := get_pixel(select_x+n-1,select_y+i-1); if flag = 1 then modus := 1; select_feld(n,i); put_pixel(select_x+n-1,select_y+i-1,modus-1); end; set_infozeil(' '); show_mouse; modus := mem; end; procedure copy_prg; var x1,y1,quit,i,n,mem:integer; von,von_x,von_y,nach,nach_x,nach_y:integer; x,y,spalte,zeile:integer; begin quit := 0; mem := modus; select_char(select); set_infozeil(' Copy Matrix from:'); repeat click; x := mausx; y := mausy; if ((x>pos[2,1])and(xpos[2,2])and(ypos[2,1])and(xpos[2,2])and(y 0 then begin desel_hline(mark_ob); mark_ob := mark_ob -1; sel_hline(mark_ob); end; end; end; OBENKL : begin if mark_stat = 1 then begin if mark_ob < mark_un - 1 then begin desel_hline(mark_ob); mark_ob := mark_ob + 1; sel_hline(mark_ob); end; end; end; UNTENGR : begin if mark_stat = 1 then begin if mark_un > mark_ob + 1 then begin desel_hline(mark_un); mark_un := mark_un - 1; sel_hline(mark_un); end; end; end; UNTENKL : begin if mark_stat = 1 then begin if mark_un < 16 then begin desel_hline(mark_un); mark_un := mark_un +1; sel_hline(mark_un); end; end; end; LINKSGR : begin if mark_stat = 1 then begin if mark_li > 0 then begin desel_vline(mark_li); mark_li := mark_li - 1; sel_vline(mark_li); end; end; end; LINKSKL : begin if mark_stat = 1 then begin if mark_li < mark_re - 1 then begin desel_vline(mark_li); mark_li := mark_li + 1; sel_vline(mark_li); end; end; end; RECHTSGR: begin if mark_stat = 1 then begin if mark_re > mark_li+1 then begin desel_vline(mark_re); mark_re := mark_re - 1; sel_vline(mark_re); end; end; end; RECHTSKL: begin if mark_stat = 1 then begin if mark_re < 12 then begin desel_vline(mark_re); mark_re := mark_re + 1; sel_vline(mark_re); end; end; end; MARKAUS : begin mark_stat := 0; desel_vline(mark_re); desel_vline(mark_li); desel_hline(mark_un); desel_hline(mark_ob); end; MARKEIN : begin mark_stat := 1; sel_vline(mark_re); sel_vline(mark_li); sel_hline(mark_un); sel_hline(mark_ob); end; MARKSAVE: begin rewrite(fil,'FONT.DAT'); writeln(fil,mark_li); writeln(fil,mark_re); writeln(fil,mark_un); writeln(fil,mark_ob); writeln(fil,mark_stat); close(fil); desel_obj(tree,obj); end; end; { case of } until obj = MARKFERT; form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); desel_obj(tree,obj); dest_sourc(xdial,ydial,wdial,hdial); set_infozeil(' '); END; procedure select_menu(menu,item:integer); begin CASE menu OF DESK : case item of ABOUT : about_prg; end; AUSGABE : case item of LOAD : load_font; SAVE : save_font; SAVEAS : save_as; ERASEFON : erase_font; PRINTFON : print_font; end; EDIT : case item of VSPIEGEL: v_spiegel; HSPIEGEL: h_spiegel; FILL : fill_prg; ERASE : erase_prg; TOGGLE : toggle_prg; COPY : copy_prg; end; MOVE : case item of MOVEUP : move_up; MOVEDOWN: move_down; MOVELEFT: move_left; MOVERIGH: move_right; end; MARK : case item of SETMARK : mark_prg; end; END; { CASE OF } menu_tnormal(menu_tree,menu,1); end; procedure do_menu; var evnt:integer; begin REPEAT evnt := evnt_multi(mu_mesag | mu_button, 1,1,dummy,0,0,0,0,0,0,0,0,0,0, mgbuf,0,0,mausx,mausy,dummy, dummy,dummy,dummy); if (evnt & mu_mesag)= mu_mesag then begin if mgbuf[0] = 10 then select_menu(mgbuf[3],mgbuf[4]); { MN_SELECTED } end else feld(mausx,mausy); UNTIL ((((evnt & mu_mesag)=mu_mesag) and (mgbuf[3] = AUSGABE) and (mgbuf[4] = QUIT))); end; (* HAUPTPROGRAMM *) BEGIN open_work; screen_sourc := logbase; screen_dest := malloc(32768); i := load_rsc; if i = 0 then begin i := getrez; if i = 2 then begin menu_bar(menu_tree,1); open_window; graf_mouse(0); init; draw_sprite(pos[3,1]+1,pos[3,2]+1,sprite2,a1); draw_sprite(pos[4,1]+1,pos[4,2]+1,sprite1,a1); set_modus; repeat do_menu; set_infozeil(' Exit Program '); str:='[1][ Are you sure | you really want | to leave ?? ][ NO | YES ]'; ready := alert(1,str); set_infozeil(' '); until ready = 2; end else begin graf_mouse(0); str:='[1][ Sorry, this Program | only works in MONOCHROME ][ SHAME ]'; ready:=alert(1,str); end; end; close_window; END. { GUTENBERG-PRINTER is part of the Program } { package to print NLQ script on Epson- } { compatible printers. } { Also included is FONT.PRG to edit or } { create the character sets. } { GUTENBERG (c) July 1986 by MKB-Soft M.Baldauf } { } { Last update : 16.04.1987 } { } { ** VERSION 1.1 4/87 ** } { We need 70 kByte of memory for eventual Malloc Calls } {$U70} { Let's get on with the Program... } program GUTENBERG_DRUCKER; { First a few Constants } CONST mu_mesag = 16; mu_button = 2; {$I GUTENBERG.I} { After the Constants come the known Arrays } TYPE in_type = ARRAY[0..10] OF integer; out_type = ARRAY[0..99] OF integer; stringtyp = PACKED ARRAY[1..21] OF char; nulldrei = ARRAY[0..3] OF integer; mgbuftyp = ARRAY[0..7] OF integer; text_type = PACKED ARRAY [0..39] OF char; pxy_type = ARRAY[0..7] OF integer; grect = RECORD { RECORD is used in Window-restoring } g_x:integer; g_y:integer; g_w:integer; g_h:integer; END; ted1 = PACKED RECORD { Important for Object-Handling } te_ptext:long_integer; te_ptmplt:long_integer; te_pvalid:long_integer; te_font:integer; te_junk1:integer; te_just:integer; te_color:integer; te_junk2:integer; te_thickness:integer; te_txtlen:integer; te_tmplen:integer END; tedinfo = RECORD { Important for Object-Handling } CASE boolean OF FALSE: (ted_tree:long_integer); TRUE : (p_ted:^ted1) END; ob1 = PACKED RECORD { Impotant forr Object-Handling } ob_next:integer; ob_head:integer; ob_tail:integer; ob_type:integer; ob_flags:integer; ob_state:integer; ob_spec:long_integer; ob_x:integer; ob_y:integer; ob_width:integer; ob_height:integer END; object_typ = RECORD { Important for Object-Handling } CASE boolean OF FALSE: (object_tree:long_integer); TRUE : (p_obj:^ob1) END; copy_type = RECORD { We need this for Block-Copy } address:long_integer; wort:array[2..9] of integer; END; fs_type = PACKED ARRAY [1..39] OF char; ch_type = PACKED ARRAY [1..150] OF char; str_type = packed array [1..14] of char; { Now we Declare many necessary Variables } VAR handle,w_handle,dummy:integer; druck_zeile : ARRAY [1..10] OF string; xdesk,ydesk,wdesk,hdesk:integer; mausx,mausy,ready:integer; modus:integer; l_intin:in_type; l_out :out_type; mgbuf:mgbuftyp; menu_tree:long_integer; fs_iexbutton:boolean; fs_iinpath,fs_iinsel:fs_type; f_iinpath,f_iinsel:fs_type; obj_tree:long_integer; laenge:integer; a:char; fil:text; i:integer; str:string; dateiname:string; pxy:pxy_type; sourc,dest:copy_type; screen_sourc,screen_dest:long_integer; select : integer; select_x,select_y:integer; esc:char; font: ARRAY[1..250,1..13] OF long_integer; font_pr : ARRAY[1..2,1..250,1..13] OF integer; prop:integer; pr_init,pr_vor_halb,pr_vor_acht,pr_vor_norm, pr_hrg_norm,pr_hrg_dopp,pr_vor_wahl:string[10]; pr_vor_halb_nl, pr_zur_halb_nl:string[10]; nl_10:integer; druck:integer; stand:integer; small:integer; rand:integer; zsz:integer; st:integer; seit:integer; potenz : array[0..15] of long_integer; potenz_w : array[0..7] of integer; pap_len,pap_tof,pap_head,pap_foot,pap_bof,pap_breit:integer; kopf_left,kopf_mid,kopf_right:string; fuss_left,fuss_mid,fuss_right:string; { Procedure-Declaration for GEM- and System calls } procedure vro_cpyfm(handle,mode:integer;var xy:pxy_type; var sourc,dest:copy_type); C; procedure appl_init; C; procedure appl_exit; C; procedure rsrc_free; C; function graf_handle(var gl_wchar,gl_hchar,gl_wbox,gl_hbox:integer):integer; C; function wind_create(wtype,w1,w2,w3,w4:integer):integer; C; function evnt_multi(t,i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12:integer; var mgbuf:mgbuftyp; j1,j2:integer; var k1,k2,k3,k4,k5,k6:integer):integer; C; procedure v_opnvwk(var wi:in_type; var handle:integer; var wo:out_type); C; procedure graf_mouse(i:integer); C; procedure wind_get(i,j:integer; var x,y,w,h:integer); C; procedure wind_calc(i,wtype,w1,w2,w3,w4:integer; var j,k,l,m: integer); C; procedure v_gtext(handle,k,l:integer;var t:string); C; procedure wind_open(handle,w1,w2,w3,w4:integer); C; procedure v_clsvwk(handle:integer); C; procedure wind_close(handle:integer); C; procedure wind_delete(handle:integer); C; procedure vsf_interior(handle,i:integer); C; procedure vsf_color(handle,i:integer); C; procedure vswr_mode(handle,i:integer); C; procedure evnt_button(i,j,k:integer; var mausx,mausy,l,m:integer); C; procedure vs_clip(handle,i:integer; var t:nulldrei); C; procedure v_bar(handle:integer; var t:nulldrei); C; procedure graf_growbox(i,j,k,l,m1,m2,m3,m4:integer); C; procedure graf_shrinkbox(i,j,k,l,m1,m2,m3,m4:integer); C; procedure vsf_style(handle,i:integer); C; function rsrc_load(var title:stringtyp):integer; C; function rsrc_gaddr(i,j:integer; var menu_tree:long_integer):integer; C; procedure menu_bar(m:long_integer; k:integer); C; procedure menu_tnormal(m:long_integer; k,l:integer); C; function form_alert(i:integer; var l:ch_type):integer; C; procedure form_dial(i,j,k,l,m,m1,m2,m3,m4:integer); C; procedure form_center(i:long_integer; var m1,m2,m3,m4:integer); C; procedure objc_change(i:long_integer; j,l,m1,m2,m3,m4,m,k:integer); C; function form_do(i:long_integer; m:integer):integer; C; procedure objc_draw(i:long_integer; k,j,m1,m2,m3,m4:integer); C; function rc_intersect(var i,j:grect):integer; C; procedure wind_update(i:integer); C; function fsel_input(var pfad1:fs_type; var filename1:fs_type; var button1:boolean):boolean; C; procedure menu_ienable(m_tree:long_integer; m_item,m_enable:integer); C; procedure menu_icheck(m_tree:long_integer; m_item,m_check:integer); C; function getrez:integer; xbios(4); function logbase:long_integer; xbios(3); function malloc(size:long_integer):long_integer; gemdos($48); function fopen(var name:str_type; i:integer):integer; gemdos($3d); procedure fclose(handle:integer); gemdos($3e); function fread(hande:integer; count,buf:long_integer):integer; gemdos($3f); {********************* ** Peek und Poke ** *********************} function peek(adr:long_integer):byte; type word = packed record w:byte end; var ptr:record case boolean of false:(i:long_integer); true :(p:^word) end; begin ptr.i := adr; peek := ptr.p^.w end; procedure poke(adr:long_integer;val:byte); type word = packed record w:byte end; var ptr:record case boolean of false:(i:long_integer); true :(p:^word) end; begin ptr.i := adr; ptr.p^.w := val end; {*************************************************** ** Convert an INTEGER-number to a String ** ***************************************************} procedure itoa(n:integer); { return result in 'str' } var i,j,sign,n1:integer; st:string; begin sign := n; if sign < 0 then n := -n; i := 0; st := ''; str := ''; repeat i := i + 1; n1 := n-(trunc(n/10)*10); st := concat(st,chr(48+n1)); n := trunc(n/10); until n <= 0; if sign < 0 then st := concat(st,'-'); j := length(st); for i := 1 to j do begin str := concat(str,st[j]); j := j - 1; end; end; {**************************************** ** Get Object text ** ****************************************} PROCEDURE get_text(baum,index:integer;VAR text:string); VAR adress,text_tree:long_integer; object:object_typ; ted_info:tedinfo; text_len,i:integer; i1:integer; BEGIN dummy:=rsrc_gaddr(0,baum,adress); object.object_tree:=adress+index*24; ted_info.ted_tree:=object.p_obj^.ob_spec; text_tree:=ted_info.p_ted^.te_ptext; text_len:=ted_info.p_ted^.te_tmplen-2; text:=''; for i:=0 TO text_len DO text:=concat(text,chr(peek(text_tree+i))); if text[1]='@' then text:='' else begin i1:=1;text:=''; loop exit if (text[i1]=chr(0)) or ((i1>=text_len-2) and (text[i1]=' ')); text:=concat(text,text[i1]); i1:=i1+1; end; end; END; {**************************************** ** Set Object text ** ****************************************} PROCEDURE set_text(baum,index:integer;text:string); VAR adress,text_tree:long_integer; object:object_typ; ted_info:tedinfo; text_len,i:integer; BEGIN dummy:=rsrc_gaddr(0,baum,adress); object.object_tree:=adress+index*24; ted_info.ted_tree:=object.p_obj^.ob_spec; text_tree:=ted_info.p_ted^.te_ptext; text_len:=ted_info.p_ted^.te_txtlen-2; text:=''; FOR i:=0 TO text_len DO poke(text_tree+i,ord(text[i+1])); END; {**************************************** ** Get Object status ** ****************************************} FUNCTION get_state(baum,index:integer):integer; var object:object_typ; error:integer; address:long_integer; begin error := rsrc_gaddr(0,baum,address); object.object_tree := address + index*24; get_state := object.p_obj^.ob_state; end; {************************************************** ** Convert a String to an INTEGER-number ** **************************************************} function atoi(s:string):integer; var i,n:integer; begin n := 0; i := 1; while ((s[i] >= '0') and (s[i] <= '9')) do begin n := 10*n + (ord(s[i])-48); i := i+1; end; atoi := n; end; {******************************************************* ** Load title picture into screen Buffer ** *******************************************************} procedure load_pic; var i:integer; f_handle:integer; pstr:str_type; begin pstr := 'GUTENBER.PIC '; pstr[13] := chr(0); f_handle := fopen(pstr,0); if f_handle > 0 then begin i := fread(f_handle,32000,screen_dest); fclose(f_handle); end; end; {********************************************************** ** Convert a Strings to a PACKED ARRAY OF CHAR ** **********************************************************} procedure str_to_char(str:string; var pa:ch_type); var i,len:integer; begin len := length(str); for i := 1 to len do pa[i] := str[i]; pa[len+1] := chr(0); end; {**************************************** ** and also the reverse ** ****************************************} procedure char_to_str(pa:fs_type; var str:string); var i:integer; begin str := ''; i := 1; while pa[i] <> chr(0) do begin str := concat(str,pa[i]); i := i + 1; end; end; {******************************************************************* ** Copy a Block from SOURCE- to DESTINATION-SCREEN ** *******************************************************************} procedure sourc_dest(x,y,w,h:integer); var i : integer; begin hide_mouse; pxy[0] := x; pxy[1] := y; pxy[2] := x+w; pxy[3] := y+h; for i := 4 to 7 do pxy[i] := pxy[i-4]; vro_cpyfm(handle,3,pxy,sourc,dest); show_mouse; end; {**************************************** ** and also the reverse ** ****************************************} procedure dest_sourc(x,y,w,h:integer); var i : integer; begin hide_mouse; pxy[0] := x; pxy[1] := y; pxy[2] := x+w; pxy[3] := y+h; for i := 4 to 7 do pxy[i] := pxy[i-4]; vro_cpyfm(handle,3,pxy,dest,sourc); show_mouse; end; {********************************************* ** Two Procedures for Object-Handling ** *********************************************} procedure desel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,0,1); END; procedure sel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,1,1); END; {*********************************************************************** ** Must do the Initialisation before program start ** ***********************************************************************} procedure init; var i,n,l,x,y,error:integer; tree:long_integer; fil:text; function getdrv:integer;gemdos($19); begin menu_ienable(menu_tree, PRINTFIL,0); hide_mouse; fs_iinpath := 'A:\*.ZSZ '; { 39 char } fs_iinpath[9] := chr(0); fs_iinsel := ' '; { 39 char } fs_iinsel[1] := chr(0); f_iinpath := 'A:\*.DOC '; { 39 char } f_iinpath[9] := chr(0); f_iinsel := ' '; { 39 char } f_iinsel[1] := chr(0); f_iinpath[1] := chr(getdrv+1+64); fs_iinpath[1] := chr(getdrv+1+64); sourc.address := screen_sourc; dest.address := screen_dest; sourc.wort[2] := 640; sourc.wort[3] := 400; sourc.wort[4] := 40; sourc.wort[5] := 0; sourc.wort[6] := 1; sourc.wort[7] := 0; sourc.wort[8] := 0; sourc.wort[9] := 0; for i := 2 to 9 do dest.wort[i] := sourc.wort[i]; {##############################################################################} {Printer Driver} pr_init := concat(chr(27),chr(64)); { Printer-Initialisation } pr_vor_halb := concat(chr(27),chr(51),chr(1)); { Advance by 1/144 Inch } pr_vor_wahl := concat(chr(27),chr(65),chr(11)); { Advance by 11/72 Inch } pr_vor_acht := concat(chr(27),chr(65),chr(8)); { Advance by 8/72 Inch } pr_hrg_dopp := concat(chr(27),chr(76)); { Graphic double density } pr_hrg_norm := concat(chr(27),chr(75)); { Graphik single density } pr_vor_norm := concat(chr(27),chr(50)); { Advance by 1/6 Inch } { Following only for ** NL-10 ** } pr_vor_halb_nl := concat(chr(27),chr(51),chr(2));{ Advance by 2/216 Inch } pr_zur_halb_nl := concat(chr(27),chr(106),chr(4));{ 4/216 Inch return } { Printer Driver up to here } {##############################################################################} druck := 1 ; { Set Print Type to NLQ Script } prop := 0 ; { Don't set Proportional Script } stand := 1 ; small := 1 ; rand := 8 ; { Set Margin to 8 } zsz := 0 ; { No Character Set compiled } st := 1; { 1st Word } nl_10 := 1; { NL-10 Printer selected } { Fetch the Standard-Settings from Disk } reset(fil,'GUTENBER.INF'); if not eof(fil) then begin readln(fil,st); { Text style } readln(fil,prop); { Proportional } readln(fil,nl_10); { Printer type } readln(fil,druck); { Print-type } readln(fil,small); { NLQ-type } readln(fil,stand); { Standard-type } close(fil); end; { All Settings installed } if small = 1 then begin menu_icheck(menu_tree,NLQNORM,1); menu_icheck(menu_tree,NLQBREIT,0); end else begin menu_icheck(menu_tree,NLQNORM,0); menu_icheck(menu_tree,NLQBREIT,1); end; if stand = 3 then begin menu_icheck(menu_tree,STANDHER,1); menu_icheck(menu_tree,STANDSCH,0); menu_icheck(menu_tree,STANDNOR,0); end; if stand = 2 then begin menu_icheck(menu_tree,STANDHER,0); menu_icheck(menu_tree,STANDSCH,1); menu_icheck(menu_tree,STANDNOR,0); end; if stand = 1 then begin menu_icheck(menu_tree,STANDHER,0); menu_icheck(menu_tree,STANDSCH,0); menu_icheck(menu_tree,STANDNOR,1); end; if druck = 1 then begin menu_icheck(menu_tree,NORMAL,0); menu_icheck(menu_tree,NLQ,1); menu_ienable(menu_tree, NLQBREIT,1); menu_ienable(menu_tree, NLQNORM,1); menu_ienable(menu_tree, STANDHER,0); menu_ienable(menu_tree, STANDSCH,0); menu_ienable(menu_tree, STANDNOR,0); end else begin menu_icheck(menu_tree,NORMAL,1); menu_icheck(menu_tree,NLQ,0); menu_ienable(menu_tree, NLQBREIT,0); menu_ienable(menu_tree, NLQNORM,0); menu_ienable(menu_tree, STANDHER,1); menu_ienable(menu_tree, STANDSCH,1); menu_ienable(menu_tree, STANDNOR,1); end; if prop = 1 then menu_icheck(menu_tree,PROPORT,1) else menu_icheck(menu_tree,PROPORT,0); error := rsrc_gaddr(0, PRINTER, tree); if nl_10 = 1 then sel_obj(tree,NL10) else sel_obj(tree,GEMINI); if st = 1 then { 1st-Word } begin menu_icheck(menu_tree,STWORD,1); menu_icheck(menu_tree,ASCII,0); menu_icheck(menu_tree,TEXTOMAT,0); end; if st = -1 then { ASCII-Text } begin menu_icheck(menu_tree,STWORD,0); menu_icheck(menu_tree,ASCII,1); menu_icheck(menu_tree,TEXTOMAT,0); end; if st = 0 then { Textomat } begin menu_icheck(menu_tree,STWORD,0); menu_icheck(menu_tree,ASCII,0); menu_icheck(menu_tree,TEXTOMAT,1); end; seit := 1; { Set Page Number } itoa(seit); if length(str)<2 then str := concat(str,chr(0)); set_text(DRUCKE, SEITE,str); itoa(rand); if length(str)<2 then str := concat(str,chr(0)); set_text(DRUCKE, DRUCKRND,str); potenz[0] := 1; potenz[1] := 2; potenz[2] := 4; potenz[3] := 8; potenz[4] := 16; potenz[5] := 32; potenz[6] := 64; potenz[7] := 128; potenz[8] := 256; potenz[9] := 512; potenz[10] := 1024; potenz[11] := 2048; potenz[12] := 4096; potenz[13] := 8192; potenz[14] := 16384; potenz[15] := 32768; potenz_w[0] := 1; potenz_w[1] := 2; potenz_w[2] := 4; potenz_w[3] := 8; potenz_w[4] := 16; potenz_w[5] := 32; potenz_w[6] := 64; potenz_w[7] := 128; end; {************************************************* ** Various Procedures for Window-Handling ** *************************************************} procedure set_clip(x,y,w,h:integer); var clip:nulldrei; begin clip[0] := x; clip[1] := y; clip[2] := x+w; clip[3] := y+h; vs_clip(handle,1,clip); end; procedure clear_window; var clip:nulldrei; begin hide_mouse; clip[0] := xdesk; clip[1] := ydesk; clip[2] := xdesk+wdesk; clip[3] := ydesk+hdesk; vsf_color(handle,0); vsf_interior(handle,1); v_bar(handle,clip); show_mouse; end; procedure open_work; var i,gr_1,gr_2,gr_3,gr_4:integer; begin appl_init; handle := graf_handle(gr_1,gr_2,gr_3,gr_4); for i:=0 to 9 do l_intin[i] := 1; l_intin[10] := 2; v_opnvwk(l_intin, handle, l_out); end; procedure close_window; begin menu_bar(menu_tree,0); rsrc_free; wind_close(w_handle); graf_shrinkbox(xdesk+wdesk DIV 2,ydesk+hdesk DIV 2, 0,0,xdesk,ydesk,wdesk,hdesk); wind_delete(w_handle); v_clsvwk(handle); appl_exit; end; procedure open_window; type titletyp = packed array[1..22] of char; var wi_title:titletyp; wi_kind:integer; procedure wind_set(x,i:integer;var title:titletyp;j,k:integer); C; begin wi_kind := 1; (* Namensziele *) hide_mouse; wind_get(0,4,xdesk,ydesk,wdesk,hdesk); w_handle := wind_create(wi_kind,xdesk,ydesk,wdesk,hdesk); wi_title := ' GUTENBERG - DRUCKER '; wi_title[22] := chr(0); wind_set(w_handle,2,wi_title,0,0); graf_growbox(xdesk+wdesk DIV 2,ydesk+hdesk DIV 2, 0,0,xdesk,ydesk,wdesk,hdesk); clear_window; wind_open(w_handle,xdesk,ydesk,wdesk,hdesk); init; wind_get(w_handle,4,xdesk,ydesk,wdesk,hdesk); dest_sourc(xdesk,ydesk,wdesk,hdesk); show_mouse; end; {************************************************** ** ALERT-BOXES routine ** **************************************************} function alert(art:integer; text:string):integer; var al_txt:ch_type; begin str_to_char(text,al_txt); alert := form_alert(art,al_txt); end; {******************************************************** ** We also need to load the RSC File ** ********************************************************} function load_rsc:integer; var error:integer; title:stringtyp; begin load_rsc := 0; title := 'GUTENBER.RSC '; title[13] := chr(0); error := rsrc_load(title); if error = 0 then begin graf_mouse(0); str:='[1][ Come on, wake up ! | |Where's my .RSC File ?? ][ CUSS ]'; ready:=alert(1,str); load_rsc := 1; end; error := rsrc_gaddr(0,0,menu_tree); if error = 0 then begin graf_mouse(0); str:='[1][ Error found in | the .RSC File ! ][ SHAME ]'; ready:=alert(1,str); load_rsc := 1; end; end; {********************************************** ** This Function locates the Dialog-Boxes ** **********************************************} function hndl_dial(tree:long_integer; def, x,y,w,h:integer):integer; VAR obj,xdial,ydial,wdial,hdial:integer; BEGIN form_center(tree, xdial,ydial,wdial,hdial); sourc_dest(xdial,ydial,wdial,hdial); form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); objc_draw(tree,0,30,xdial,ydial,wdial,hdial); obj := form_do(tree,def); hndl_dial := obj; form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); desel_obj(tree,obj); dest_sourc(xdial,ydial,wdial,hdial); END; {****************************************** ** Info on the Program & Author ** ******************************************} procedure about_prg; var tree:long_integer; error,obj:integer; begin error := rsrc_gaddr(0, UEBER, tree); obj := hndl_dial(tree,0,320,200,1,1); end; {********************************************* ** Which Printer to expect ? ** *********************************************} procedure sel_printer_type; var tree:long_integer; error,obj,stat:integer; begin error := rsrc_gaddr(0, PRINTER, tree); obj := hndl_dial(tree,0,320,200,1,1); stat := get_state(PRINTER,NL10); if stat = 0 then nl_10 := 0 else nl_10 := 1; end; {***************************************************************** ** Function for File-Select-Box handling ** *****************************************************************} procedure show_file(mode:integer; iinsel,iinpath:fs_type); var ende:boolean; tree:long_integer; xdial,ydial,wdial,hdial:integer; error,i:integer; fn:fs_type; function setdrv(drv:integer):integer;gemdos($0e); function chdir(var fn:fs_type):integer; gemdos($3b); begin xdial := 100; ydial := 50; wdial := 400; hdial := 330; sourc_dest(xdial,ydial,wdial,hdial); ende := fsel_input(iinpath, iinsel, fs_iexbutton); if fs_iexbutton = TRUE then begin char_to_str(iinsel,str); dateiname := str; if mode = 1 then begin fs_iinpath := iinpath; fs_iinsel := iinsel; error := setdrv(ord(fs_iinpath[1])-64-1); end else begin f_iinpath := iinpath; f_iinsel := iinsel; error := setdrv(ord(f_iinpath[1])-64-1); end; fn:=('\\ '); fn[3]:=chr(0); error:=chdir(fn); i:=3; if mode = 1 then begin while fs_iinpath[i]<>'*' do begin fn[i-2]:=fs_iinpath[i]; i:=i+1; end; end else begin while f_iinpath[i]<>'*' do begin fn[i-2]:=f_iinpath[i]; i:=i+1; end; end; fn[i-2]:=chr(0); error:=chdir(fn); end; dest_sourc(xdial,ydial,wdial,hdial); end; {********************************************* ** Set a Pixel ** *********************************************} procedure set_pixel(mode,x,y,art:integer); var i,n:integer; begin for n := 0 to mode do for i := 0 to mode do begin put_pixel(x+n,y+i,art); end; end; {********************************************************** ** Display the Font on screen ** **********************************************************} procedure recompile(mode,x,y:integer; str:string); var i,n,z:integer; zaehler,status:integer; flag,flag1 : long_integer; begin hide_mouse; for z := 1 to length(str) do begin zaehler := ord(str[z]); for n := 1 to 12 do begin flag1 := font[zaehler,n]; for i := 1 to 16 do begin flag := flag1 - potenz[16-i]; if flag >= 0 then begin flag1 := flag; set_pixel(mode,x+n-1+mode*n,y+i-1+mode*i,1); end else set_pixel(mode,x+n-1+mode*n,y+i-1+mode*i,0); end; end; x := x + 12+mode*12; end; show_mouse; end; {**************************************** ** Read-in a Font File ** ****************************************} procedure load_font(mode:integer); var i,n,mem,flag:integer; datei:file of long_integer; begin if mode = 1 then show_file(1,fs_iinsel,fs_iinpath) else fs_iexbutton := TRUE; if fs_iexbutton then begin graf_mouse(2); reset(datei,dateiname); if not eof(datei) then begin for i := 1 to 250 do for n := 1 to 12 do begin font[i,n] := datei^; get(datei); end; zsz := 0; menu_ienable(menu_tree, PRINTFIL,1); str := 'ABCDEFGHIJ'; recompile(0,474,138,str); str := 'KLMNOPQRST'; recompile(0,474,160,str); str := 'UVWXYZ'; recompile(0,474,182,str); str := 'abcdefghij'; recompile(0,474,204,str); str := 'klmnopqrst'; recompile(0,474,226,str); str := 'uvwxyz'; recompile(0,474,248,str); str := '0123456789'; recompile(0,474,270,str); graf_mouse(0); end else if mode = 1 then begin str:='[1][ Sorry, couldn't find | that Font File ! ][ EXIT ]'; ready:=alert(1,str); end; close(datei); graf_mouse(0); end; end; {********************************************************** ** Prepare Font for NLQ Printing ** **********************************************************} procedure convert_nlq; var i,n,g,z,za:integer; flag,flag1:long_integer; begin zsz := 1; for i := 1 to 250 do for n := 1 to 12 do begin flag1 := font[i,n]; font_pr[1,i,n] := 0; font_pr[2,i,n] := 0; za := 0; for z := 1 to 8 do begin za := za + 1; flag := flag1 - potenz[16-za]; if flag >= 0 then begin flag1 := flag; g := 8-z; font_pr[1,i,n] := font_pr[1,i,n] + potenz_w[g]; end; za := za + 1; flag := flag1 - potenz[16-za]; if flag >= 0 then begin flag1 := flag; g := 8-z; font_pr[2,i,n] := font_pr[2,i,n] + potenz_w[g]; end; end; end; end; {************************************************************** ** Prepare Font for ordinary Printing ** **************************************************************} procedure convert_norm; var i,n,g,z:integer; flag,flag1:long_integer; begin zsz := 2; for i := 1 to 250 do for n := 1 to 12 do begin flag1 := font[i,n]; font_pr[1,i,n] := 0; font_pr[2,i,n] := 0; for z := 1 to 8 do begin flag := flag1 - potenz[16-z]; if flag >= 0 then begin flag1 := flag; g := 8-z; font_pr[1,i,n] := font_pr[1,i,n] + potenz_w[g]; end; end; for z := 9 to 16 do begin flag := flag1 - potenz[16-z]; if flag >= 0 then begin flag1 := flag; g := 16-z; font_pr[2,i,n] := font_pr[2,i,n] + potenz_w[g]; end; end; end; end; {*************************************************************************** ** Don't print lines which contain only blank spaces ** ***************************************************************************} procedure cut_line(line:string); var i:integer; begin i := 0; repeat if line[length(line)] = chr(32) then line := copy(line,1,length(line)-1) else i := 1; until (( i = 1 ) or (length(line) < 1)); str := line; end; {************************************************** ** Print-Routine for Proportional NLQ-Print ** **************************************************} procedure prop_nlq(line:string); var i,z,z1,zei,lang,ra:integer; g,count:integer; zeile,zeile1:packed array [1..1920] of char; begin ra := rand; if line <> '' then begin cut_line(line); line := str; if small = 2 then ra := ra * 2; lang := ra*12; z1 := 0; if ra <> 0 then for i := 1 to ra do for z := 1 to 12 do begin if z1 < 1920 then begin z1 := z1 + 1; zeile[z1] := chr(0); zeile1[z1] := chr(0); end; end; for i := 1 to length(line) do begin zei := ord(line[i]); if zei = 32 then begin for count := 1 to 12 do begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; if small = 2 then begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; end end; end else begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; for count := 1 to 12 do begin if ((font_pr[1,zei,count]) | (font_pr[2,zei,count])) <> 0 then begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(font_pr[1,zei,count]); zeile1[lang] := chr(font_pr[2,zei,count]); end; if small = 2 then begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(font_pr[1,zei,count]); zeile1[lang] := chr(font_pr[2,zei,count]); end; end; end; end; end; end; z := lang div 256; z1 := lang mod 256; if nl_10 = 0 then write(pr_vor_halb) { STAR Gemini 10 x etc. } else write(pr_vor_halb_nl); { STAR NL-10, Epson-FX etc. } write(concat(pr_hrg_dopp,chr(z1),chr(z))); for i := 1 to lang do write(zeile[i]); writeln; write(concat(pr_hrg_dopp,chr(z1),chr(z))); for i := 1 to lang do write(zeile1[i]); writeln; if nl_10 = 0 then writeln(pr_vor_wahl) { STAR Gemini 10 x etc. } else begin write(pr_zur_halb_nl);{ STAR NL-10, Epson-FX etc. } writeln(pr_vor_norm); end; end else begin if nl_10 = 0 then begin write(pr_vor_halb); { STAR Gemini 10 x etc. } writeln; writeln; writeln(pr_vor_wahl); end else writeln(pr_vor_norm); { STAR NL-10, Epson-FX etc. } end; end; {****************************************************** ** Print-Routine for Proportional Ordinary-Print ** ******************************************************} procedure prop_norm(line:string); var i,z,z1,zei,lang,ra:integer; g,count:integer; zeile,zeile1:packed array [1..1920] of char; begin ra := rand; if line <> '' then begin cut_line(line); line := str; if stand = 3 then ra := ra * 2; lang := ra*12; z1 := 0; if ra <> 0 then for i := 1 to ra do for z := 1 to 12 do begin if z1<1920 then begin z1 := z1 + 1; zeile[z1] := chr(0); zeile1[z1] := chr(0); end; end; for i := 1 to length(line) do begin zei := ord(line[i]); if zei = 32 then begin for count := 1 to 12 do begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; if stand = 3 then if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; end; end else begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; if stand = 3 then if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(0); zeile1[lang] := chr(0); end; for count := 1 to 12 do begin if ((font_pr[1,zei,count]) | (font_pr[2,zei,count])) <> 0 then begin if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(font_pr[1,zei,count]); zeile1[lang] := chr(font_pr[2,zei,count]); end; if stand = 3 then if lang < 1920 then begin lang := lang + 1; zeile[lang] := chr(font_pr[1,zei,count]); zeile1[lang] := chr(font_pr[2,zei,count]); end; end; end; end; end; z := lang div 256; z1 := lang mod 256; write(pr_vor_acht); if ((stand = 2) or (stand = 3)) then write(concat(pr_hrg_dopp,chr(z1),chr(z))) else write(concat(pr_hrg_norm,chr(z1),chr(z))); for i := 1 to lang do write(zeile[i]); writeln; if ((stand = 2) or (stand = 3)) then write(concat(pr_hrg_dopp,chr(z1),chr(z))) else write(concat(pr_hrg_norm,chr(z1),chr(z))); for i := 1 to lang do write(zeile1[i]); writeln(pr_vor_wahl); end else begin write(pr_vor_acht); writeln; writeln(pr_vor_wahl); end; end; {*********************************** ** Print-Routine for NLQ-Print ** ***********************************} procedure print_nlq(line:string); var i,z,z1,zei,lang,ra:integer; g,count:integer; begin ra := rand; if line <> '' then begin cut_line(line); line := str; lang := length(line)*12; lang := lang+ra*12; if small = 2 then begin lang := lang * 2; ra := ra * 2; end; if nl_10 = 0 then write(pr_vor_halb) { STAR Gemini 10 x etc. } else write(pr_vor_halb_nl); { STAR NL-10, Epson-FX etc. } z := lang div 256; z1 := lang mod 256; for g := 1 to 2 do begin write(concat(pr_hrg_dopp,chr(z1),chr(z))); if ra > 0 then for i := 1 to ra*12 do write(chr(0)); for i := 1 to length(line) do begin zei := ord(line[i]); for count := 1 to 12 do begin write(chr(font_pr[g,zei,count])); if small = 2 then write(chr(font_pr[g,zei,count])); end; end; writeln; end; if nl_10 = 0 then writeln(pr_vor_wahl) { STAR Gemini 10 x etc. } else begin write(pr_zur_halb_nl);{ STAR NL-10, Epson-FX etc. } writeln(pr_vor_norm); end; end else begin if nl_10 = 0 then begin write(pr_vor_halb); { STAR Gemini 10 x etc. } writeln; writeln; writeln(pr_vor_wahl); end else writeln(pr_vor_norm); { STAR NL-10, Epson-FX etc. } end; end; {*************************************** ** Print-Routine for Ordinary-Print ** ***************************************} procedure print_norm(line:string); var i,z,z1,zei,lang,ra:integer; g,count:integer; begin ra := rand; if line <> '' then begin cut_line(line); line := str; lang := length(line)*12; lang := lang+ra*12; if stand = 3 then begin ra := ra * 2; lang := lang * 2; end; write(pr_vor_acht); z := lang div 256; z1 := lang mod 256; for g := 1 to 2 do begin if ((stand = 2) or (stand = 3)) then write(concat(pr_hrg_dopp,chr(z1),chr(z))) else write(concat(pr_hrg_norm,chr(z1),chr(z))); if ra > 0 then for i := 1 to ra*12 do write(chr(0)); for i := 1 to length(line) do begin zei := ord(line[i]); for count := 1 to 12 do begin write(chr(font_pr[g,zei,count])); if stand = 3 then write(chr(font_pr[g,zei,count])); end; end; if g = 1 then writeln; end; writeln(pr_vor_wahl); end else begin write(pr_vor_acht); writeln; writeln(pr_vor_wahl); end; end; {*************************************************** ** 1st-Word Converter Routine (c) by MKB-Soft ** ** ------------------------------------------- ** ** This Routine could be adjusted for ** ** other uses. ** ** ** **************************************************} procedure st_word_print; var i,ii,lang,zeile,zeich,flag:integer; fil:text; line,zei,ganz_zeil:string; esc:char; pap_zeil:integer; xdial,ydial,wdial,hdial:integer; x,y,w,h,z,error,obj:integer; tree:long_integer; quit:boolean; poit:integer; seite:integer; anzahl,zaehler:integer; procedure print_line(line:string); { Print out a Line as } begin { per the settings } if prop = 0 then if druck = 1 then print_nlq(line) else print_norm(line); if prop = 1 then if druck = 1 then prop_nlq(line) else prop_norm(line); end; procedure kopf; { Generate the Header } var line,left,mid,right,zahl_str,zw:string; i,poit,zahl:integer; begin line := ''; if pap_tof > 0 then for i := 1 to pap_tof do print_line(line); { Arrange the Header Line } poit := pos('#',kopf_left); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; left := copy(kopf_left,1,poit - 1); left := concat(left,zahl_str); if length(kopf_left) > poit+1 then begin zw := copy(kopf_left,poit+1,length(kopf_left)-poit-1); left := concat(left,zw); end; end else left := kopf_left; line := left; poit := pos('#',kopf_mid); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; mid := copy(kopf_mid,1,poit - 1); mid := concat(mid,zahl_str); if length(kopf_mid) > poit+1 then begin zw := copy(kopf_mid,poit+1,length(kopf_mid)-poit-1); mid := concat(mid,zw); end; end else mid := kopf_mid; zahl := (pap_breit div 2) - (length(left)) - (length(mid) div 2); if zahl <> 0 then for i := 1 to zahl do line := concat(line,' '); line := concat(line,mid); poit := pos('#',kopf_right); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; right := copy(kopf_right,1,poit - 1); right := concat(right,zahl_str); if length(kopf_right) > poit+1 then begin zw := copy(kopf_right,poit+1,length(kopf_right)-poit-1); right := concat(right,zw); end; end else right := kopf_right; zahl := (pap_breit) - (length(line)) - (length(right)); if zahl <> 0 then for i := 1 to zahl do line := concat(line,' '); line := concat(line,right); if pap_head > 0 then begin print_line(line); end; line := ''; if pap_head > 1 then for i := 1 to pap_head-1 do print_line(line); end; procedure fuss; { Arrange the Footer Line } var line,left,mid,right,zahl_str,zw:string; i,poit,zahl:integer; begin line := ''; if pap_foot > 1 then for i := 1 to pap_foot-1 do print_line(line); { Arrange the Footer Line } poit := pos('#',fuss_left); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; left := copy(fuss_left,1,poit - 1); left := concat(left,zahl_str); if length(fuss_left) > poit+1 then begin zw := copy(fuss_left,poit+1,length(fuss_left)-poit-1); left := concat(left,zw); end; end else left := fuss_left; line := left; poit := pos('#',fuss_mid); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; mid := copy(fuss_mid,1,poit - 1); mid := concat(mid,zahl_str); if length(fuss_mid) > poit+1 then begin zw := copy(fuss_mid,poit+1,length(fuss_mid)-poit-1); mid := concat(mid,zw); end; end else mid := fuss_mid; zahl := (pap_breit div 2) - (length(left)) - (length(mid) div 2); if zahl <> 0 then for i := 1 to zahl do line := concat(line,' '); line := concat(line,mid); poit := pos('#',fuss_right); { Remember the Page Number } if poit <> 0 then begin itoa(seite); zahl_str := str; right := copy(fuss_right,1,poit - 1); right := concat(right,zahl_str); if length(fuss_right) > poit+1 then begin zw := copy(fuss_right,poit+1,length(fuss_right)-poit-1); right := concat(right,zw); end; end else right := fuss_right; zahl := (pap_breit) - (length(line)) - (length(right)); if zahl <> 0 then for i := 1 to zahl do line := concat(line,' '); line := concat(line,right); if pap_foot > 0 then print_line(line); line := ''; if pap_bof > 0 then for i := 1 to pap_bof do print_line(line); end; procedure read_zeile; { Read in 10 Lines from Disk } var i:integer; begin i := 0; repeat i := i + 1; line := ''; readln(fil,druck_zeile[i]); until ((eof(fil)) or (i = 10)); anzahl := i; end; begin { Start of st_word_print } fuss_left := ''; fuss_mid := ''; fuss_right := ''; kopf_left := ''; kopf_mid := ''; kopf_right := ''; esc := chr(27); seite := seit; pap_zeil := 0; ganz_zeil := ''; reset(fil,dateiname); { Open File } rewrite(output,'PRN:'); { Printer Output } write(pr_init); x := 320; y := 200; w := 1; h := 1; error := rsrc_gaddr(0, WAIT, tree); form_center(tree, xdial,ydial,wdial,hdial); sourc_dest(xdial,ydial,wdial,hdial); form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); objc_draw(tree,0,30,xdial,ydial,wdial,hdial); quit := false; repeat read_zeile; zaehler := 0; while ((zaehler < anzahl) and (keypress = false)) do begin line := ''; zaehler := zaehler + 1; line := druck_zeile[zaehler]; if ((length(line) > 1) and (ord(line[1]) = 31)) then begin case line[2] of '0' : begin { Layout Data } str := copy(line,3,2); pap_len := atoi(str); str := copy(line,5,2); pap_tof := atoi(str); str := copy(line,7,2); pap_head := atoi(str); str := copy(line,9,2); pap_foot := atoi(str); str := copy(line,11,2); pap_bof := atoi(str); str := copy(line,13,2); pap_breit := atoi(str); { Calculate Page Length } end; '1' : begin { Header Line with '#' as Page Number } line := copy(line,3,length(line)-2); poit := pos(chr(31),line); if poit <> 1 then kopf_left := copy(line,1,poit); line := copy(line,poit+1,length(line)-poit); poit := pos(chr(31),line); if poit <> 1 then kopf_mid := copy(line,1,poit); kopf_right := copy(line,poit+1,length(line)-poit); end; '2' : begin { Footer Line with '#' as Page Number } line := copy(line,3,length(line)-2); poit := pos(chr(31),line); if poit <> 1 then fuss_left := copy(line,1,poit); line := copy(line,poit+1,length(line)-poit); poit := pos(chr(31),line); if poit <> 1 then fuss_mid := copy(line,1,poit); fuss_right := copy(line,poit+1,length(line)-poit); end; '9' : begin { Format Line with TAB character } pap_breit := pos(']',line) - 2; end; end; end else begin if ((length(line) > 0) and (ord(line[1]) = 12)) then begin { Formfeed -> Advance } for ii := pap_zeil to pap_len-pap_foot-pap_bof-1 do print_line(''); pap_zeil := 0; fuss; seite := seite + 1; end; if pap_zeil = pap_len-pap_foot-pap_bof then begin { Page full -> Advance } pap_zeil := 0; fuss; seite := seite + 1; end; if pap_zeil < 1 then { Time to print the } begin { Header Line } kopf; pap_zeil := pap_tof+pap_head; { Print Header } end; ganz_zeil := ''; lang:=length(line); { How long is the Line ? } for i := 1 to lang do begin zei:=copy(line,i,1); { Get Actual character } zeich := ord(zei[1]); if flag = 1 then { Aha, now a style change } flag := 0 else if zeich > 31 then { All in order } ganz_zeil := concat(ganz_zeil,chr(zeich)) else { Otherwise do a test } case zeich of 25 : ganz_zeil := concat(ganz_zeil,'-'); 27 : flag := 1; { Style change } 28 : { Stretch space } ganz_zeil := concat(ganz_zeil,chr(32)); 29 : { Indent space } ganz_zeil := concat(ganz_zeil,chr(32)); 30 : { Variable space } ganz_zeil := concat(ganz_zeil,chr(32)); end; end; { Now output the line } print_line(ganz_zeil); pap_zeil := pap_zeil + 1; { Print line again } end; end; if eof(fil) then { Text finished already ? } begin { Advance to Footer Line } for ii := pap_zeil to pap_len-pap_foot-pap_bof-1 do print_line(''); fuss; { Print Footer Line } quit := true; { and that's all ! } end; if keypress then { Well, what now ? } begin { Abort when ready... } str := '[1][ Are you sure | you want to leave ?][ YES | NO ]'; ready:=alert(2,str); if ready = 1 then quit := true; { Okay, I'm convinced! } end; until quit = true; { check again for Abort or end } close(fil); { Close File } form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); dest_sourc(xdial,ydial,wdial,hdial); { Restore background } write(pr_init); rewrite(output,'CON:'); { Standard Consol-Output } graf_mouse(0); { Mouse Cursor = Arrow } end; { end of st_word_print } {*************************************** ** Now what to print ? ** ***************************************} procedure print_text; VAR xdial,ydial,wdial,hdial:integer; x,y,w,h,i,z,error,obj:integer; line:string; tree:long_integer; quit : boolean; function bcostat(dev:integer):integer;bios(8); begin show_file(2,f_iinsel,f_iinpath); if fs_iexbutton = TRUE then begin error := rsrc_gaddr(0, DRUCKE, tree); obj := hndl_dial(tree,0,320,200,1,1); get_text(DRUCKE, DRUCKRND,str); rand := atoi(str); get_text(DRUCKE, SEITE,str); seit := atoi(str); if obj = DRUCKDRU then begin i := bcostat(0); if i = -1 then begin graf_mouse(2); if zsz <> druck then begin x := 320; y := 200; w := 1; h := 1; error := rsrc_gaddr(0, WARTE, tree); form_center(tree, xdial,ydial,wdial,hdial); sourc_dest(xdial,ydial,wdial,hdial); form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); objc_draw(tree,0,30,xdial,ydial,wdial,hdial); if druck = 1 then convert_nlq else convert_norm; form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); dest_sourc(xdial,ydial,wdial,hdial); end; if st <> 1 then begin { Print Normal ASCII File } reset(fil,dateiname); { Open File } rewrite(output,'PRN:'); { Direct Output to Printer } write(pr_init); x := 320; y := 200; w := 1; h := 1; error := rsrc_gaddr(0, WAIT, tree); form_center(tree, xdial,ydial,wdial,hdial); sourc_dest(xdial,ydial,wdial,hdial); form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); objc_draw(tree,0,30,xdial,ydial,wdial,hdial); quit := false; repeat while ((not eof(fil)) and (keypress <> true)) do begin readln(fil,line); if prop = 0 then if druck = 1 then print_nlq(line) else print_norm(line); if prop = 1 then if druck = 1 then prop_nlq(line) else prop_norm(line); end; if eof(fil) then quit := true; if keypress = true then begin str:= '[1][ Are you sure you | want to Abort ? ][ YES | NO]; ready:=alert(2,str); if ready = 1 then quit := true; end; until quit = true; close(fil); form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); dest_sourc(xdial,ydial,wdial,hdial); write(pr_init); rewrite(output,'CON:'); graf_mouse(0); end else st_word_print; end else begin str := '[1][ Better check the | Printer & Cable !!][ EXIT ]'; i := alert(1,str); end; end; end; end; {*********************************************** ** Which DROP-DOWN-MENU was clicked ? ** ***********************************************} procedure select_menu(menu,item:integer); var tree:long_integer; error:integer; x:char; begin CASE menu OF DESK : case item of INFO : about_prg; end; AUSGABE : case item of LADEFONT : load_font(1); PRINTFIL : print_text; ASCII : begin x := f_iinpath[1]; f_iinpath := 'A:\*.* '; f_iinpath[7] := chr(0); f_iinpath[1] := x; str := concat('0',chr(0)); set_text(DRUCKE, DRUCKRND,str); menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,TEXTOMAT,0); menu_icheck(menu_tree,STWORD,0); st := -1; end; TEXTOMAT : begin x := f_iinpath[1]; f_iinpath := 'A:\*.OUT '; f_iinpath[9] := chr(0); f_iinpath[1] := x; str := concat('0',chr(0)); set_text(DRUCKE, DRUCKRND,str); menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,ASCII,0); menu_icheck(menu_tree,STWORD,0); st := 0; end; STWORD : begin x := f_iinpath[1]; f_iinpath := 'A:\*.DOC '; f_iinpath[9] := chr(0); f_iinpath[1] := x; str := concat('8',chr(0)); set_text(DRUCKE, DRUCKRND,str); menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,ASCII,0); menu_icheck(menu_tree,TEXTOMAT,0); st := 1; end; end; FONTI : case item of NLQ : begin menu_icheck(menu_tree,NORMAL,0); menu_icheck(menu_tree,NLQ,1); menu_ienable(menu_tree, NLQBREIT,1); menu_ienable(menu_tree, NLQNORM,1); menu_ienable(menu_tree, STANDHER,0); menu_ienable(menu_tree, STANDSCH,0); menu_ienable(menu_tree, STANDNOR,0); druck := 1; end; NLQNORM : begin small := 1; { Normal } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,NLQBREIT,0); end; NLQBREIT : begin small := 2; { Wide } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,NLQNORM,0); end; NORMAL : begin menu_icheck(menu_tree,NORMAL,1); menu_icheck(menu_tree,NLQ,0); menu_ienable(menu_tree, STANDHER,1); menu_ienable(menu_tree, STANDSCH,1); menu_ienable(menu_tree, STANDNOR,1); menu_ienable(menu_tree, NLQBREIT,0); menu_ienable(menu_tree, NLQNORM,0); druck := 2; end; STANDHER : begin stand := 3; { Bold } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,STANDSCH,0); menu_icheck(menu_tree,STANDNOR,0); end; STANDSCH : begin stand := 2; { Small } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,STANDHER,0); menu_icheck(menu_tree,STANDNOR,0); end; STANDNOR : begin stand := 1; { Normal } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,STANDSCH,0); menu_icheck(menu_tree,STANDHER,0); end; end; SPECIAL : case item of PROPORT : begin if prop = 0 then { Set Proportional } begin prop := 1; menu_icheck(menu_tree,PROPORT,1); end else { Stop Proportional } begin prop := 0; menu_icheck(menu_tree,PROPORT,0); end; end; SAVEPREV : begin { Save Preferences } str:= '[1][ Please insert the | Startup Disk | in the Drive ! ][ OK | EXIT ]'; error := alert(1,str); if error = 1 then begin rewrite(fil,'GUTENBER.INF'); writeln(fil,st); { Text style } writeln(fil,prop); { Proportional } writeln(fil,nl_10); { Printer type } writeln(fil,druck); { Print type } writeln(fil,small); { NLQ-type } writeln(fil,stand); { Standard-type} close(fil); end; end; PRINTTYP : begin { Select Print type } sel_printer_type; end; end; END; { CASE OF } menu_tnormal(menu_tree,menu,1); end; {**************************************** ** Event-Handling ** ****************************************} procedure do_menu; var evnt:integer; begin REPEAT evnt := evnt_multi(mu_mesag | mu_button, 1,1,dummy,0,0,0,0,0,0,0,0,0,0, mgbuf,0,0,mausx,mausy,dummy, dummy,dummy,dummy); if (evnt & mu_mesag)= mu_mesag then begin if mgbuf[0] = 10 then select_menu(mgbuf[3],mgbuf[4]); { MN_SELECTED } end; UNTIL ((((evnt & mu_mesag)=mu_mesag) and (mgbuf[3] = AUSGABE) and (mgbuf[4] = QUIT))); end; {*************************************************************** ** This is the Main Program Code... ** ***************************************************************} BEGIN open_work; screen_sourc := logbase; { Where is the screen ? } screen_dest := malloc(32768); { Reserve 32 kByte } i := load_rsc; { Now we load the .RSC File } if i = 0 then { If OK then continue } begin i := getrez; { What Resolution are we in ? } if i = 2 then { Works only in High Resolution ! } begin load_pic; { We need a proper background for the Menu Line } menu_bar(menu_tree,1); open_window; graf_mouse(0); dateiname := 'GUTENBER.ZSZ'; load_font(2); { Is this the default Font ? } do_menu; { On to the Menu } end else begin graf_mouse(0); str:= { That;s life ! } '[1][ Sorry, this Program | |only works in MONOCHROME ! ][ SHAME ]'; ready:=alert(1,str); end; end; close_window; END. { End Main } { That's All Folks, 'Bye...... } Welcome toPD 2000 - The common collection of the "23". For your information, we are: 1000 COMPU-SIGN 6200 Computer Treff 1000 HD Computertechnik 6370 ALPHACOPY Th. Baumann 2308 V.U.-Volker Uecker 6676 KREATIV-Software 2400 ST Profi-Partner 6970 Comp-Soft. Markert 2905 T.U.M-ST-Soft 7150 Weeske Computertechnik 4000 Axel Witaseck 7516 iks 4000 H&S Wohlfahrtsttter 7519 =PD-EXPRESS= Rangnow 4018 JUCO - COMPUTER 7833 Soft-Serv. Duffner 4053 OHST-Software 8000 Peter Gerstenberg 4056 Elektronikv. Michiels 8000 LAUTERBACH Software 4200 Intersoft 8122 Dietmar Schramm PD 5000 McByte GmbH 8221 Robert Rehrl PD 5120 Schreiber's Software 8490 A&P-Shop 5210 LOGITEAM 8542 Schick EDV-Systeme 6100 IDL Software 8702 PR8-SOFT, Klaus-M.Pracht 6100 Softwareversand Bornemann Dieser Platz ist noch frei!? In Austria: In Switzerland: A-1030 Michael Twrdy CH-6020 Bossart-Soft The rest of Europe: Join PD-Pool now! =================================== PD-Pool participants have developed the following activities: PD-Pool Series 2000, (see May 1989, 10 new disks monthly). PD-Review-Group (Regularly in ST-Computer + ST-Magazin). PD-Scene Magazine (see September 1989, monthly) Take 20 Review-Group (see December 1989. Regularly in ST-Computer and ST-Magazin, now also on .CICERO). NEW: Take 20 SOFTWARE EDITION - A new label in the Market. Further participants, Programmers, writers and reviewers are always welcome. Contact the amazing "23" for more details... Your great friends, The "23" `x\{ o"h#y#z#z,Oc.N//Bg?<JNA BbByz NRNNV/./. /.?.?.NV8N^ _ONNVNXN^NuNVNXN^NuNVN]"N^NuNV/./. /./.N[N^ _ONNV?.?. ?. ?.?.N]hN^ _O NNV/./. /./././.?. ?."/.$?.(?.*?.,?..?.0?.2?.4?.6?.8?.:?.?.@?.BNXN^ _O]C0. y<^C0. y@]CBd 09{rAfNp3{NN^,_ _XN/,HNVA-HNuNx330.n30.n 3p=@ nn*0.@2.YAAA40A1Rn`?9{t?<HyHyVHyBNpNwN^,_ _PN/,HNVA-HNuNx330.n30.n 3p=@ nn*0.@2.YAAA40A1Rn`?9{t?<HyHyBHyVNNwN^,_ _PN/,HNVAR-HNu?9"09$2. A??9&09$2. A??<BgBgBg?09<@3@?9:?9?9@NC}-I8"n8BQ"n8Bi"n8Bi"n8p3@"n8p3@"n8Bi "n8Bi "n83|"n8Bi"n83|"n8Bi"n83|T"n8Bi"n83|d"n8Bi"n83|2 "n8Bi"n83|2$"n8Bi""n83|("n8Bi&"n83| ,"n8Bi*"n83| 0"n8Bi."n83| 4"n8Bi2"n83|8"n8Bi6"n83|<"n8Bi:"n83|@"n8Bi>"n8p~3@D"n8BiB"n8BiH"n8BiFC~ -I8"n8BQ"n8Bi"n8Bi"n8p3@"n8p3@"n8Bi "n8Bi "n8Bi"n8Bi"n83|"n8Bi"n83|"n8Bi"n83|m"n8Bi"n83| "n8Bi"n83|$"n8Bi""n83|<("n8Bi&"n83| X,"n8Bi*"n83|@0"n8Bi."n83| 4"n8Bi2"n83|@8"n8Bi6"n83|<"n8Bi:"n83|@"n8Bi>"n8BiD"n8BiB"n8BiH"n8BiFp23"pd3$09"@l3&09$@3(=y"=y$p=@ nn 0.S@?N0.@ =@Rn`=y"=y$p=@ n n 0.S@?N0.@ =@Rn`3*pA3,09*@3.09,@?30=y*=y,p=@ n n?.?.0.y.y*??.N(0.@ =@?.?.0.y.y*??.N0.@=@?.?.0.y.y*??.N0.R@=@Rn`h=y*=y,p=@ nn6?.?.?.0.y0y,?Nx0.@=@Rn`Bn09,T@=@p=@ n nh09*X@=@p=@ nn:0.R@=@0.??.?.?<BgBgNw 0.@=@Rn`0.@ =@Rn`pB3r?9rNrp3{NwByp3p 3p3 p3 HnQ?<A~nO"O2p"QN3{~p=@0.N^,_Nu[1][ Error found in | the .RSC File ! | ][SHAME!][1][Come on, wake up !|No .RSC File found.| | Exit Program][ OH! ]FONT.RSC /,HNVA8-HNu/.?. Bg?9{|?9{z?9{x?9{vBg?<NN^,_ _\N/,HNVA:-HNu/.?. Bg?9{|?9{z?9{x?9{v?<?<NN^,_ _\N/,HNVA-HNu/.HnHnHnHnNT?.?.?.?.NBg?.?.?.?. ?.?.?.?.N/.Bg?<?.?.?.?.Nx/.?.NP=@=n?<?.?.?.?. ?.?.?.?.N/.?.N?.?.?.?.N0.N^,_ _ON/,HNVAh-HNuC`O$Op QNBg?<HnNߠ=@/.Bg?<@?<?<?<N=@p O"ONN^,_Nu Information NV?.?<NAN^ _ONNV/.?<;NAN^ _ON/,HNVAl-HNupd=@p2=@=|=|J?.?.?.?.NHn Hn4Hy|xNd=@09|x|r|AfA4O"Op "QHy~nNC~nE~4p$QC E|p $QC4E|zp $Qp9|@S@?N=@CEp $Qp@HnN=@p=@0.rA|0p*@g,0.U@2.tA|0A0.R@=@`0.U@rAHnN=@?.?.?.?.NN^,_ _OPN\\ /,HNVAX-HNuNxBnp=@ n n.p=@ nn0.R@=@0.S@@y*T@3v0.S@@y,@3tp=@ n np=@ nn0.42.AAAB"0pn@A-A .JkH0.42.AAAB!09vnS@?09tnS@??<Nu`&09vnS@?09tnS@?BgNuRn`LRn`4Rn`Rn`NwN^,_Nu/,HNVAH-HNuNxBnp=@ n np=@ nn0.R@=@0.S@@y*T@3v0.S@@y,@3tp=@ n n0.42.AAABBp=@ nm09vnS@?09tnS@?Nu0=@0.rAfH0.42.AA2.44.BBAB$0rnAA԰AB!Sn`vRn`DRn`Rn`NwN^,_Nu/,HNVBA8-HNuABBP1|A|zO"Op "QA|O"Op "QNJClO$O'p&QNޒ09|x|r|Af?9rN\?<NזHnBHy~??.?<NÖ09vnS@?09tR@S@?09{S@?NuRn`p O"ON3{NwN^,_Nu Move Matrix Down... /,HNVA:-HNu=y{NxC$O$OpQNŠp=@ nnp=@ n nj09vn?09tnS@?Nu0R@3{?.?.NŽ09vnS@?09tnS@?09{S@?NuRn`Rn`xp3{p=@ nn@?< ?.N009v@ S@?09tnS@?09{S@?NuRn`p O"ON3{NwN^,_Nu Move Matrix Left... /,HNVA:-HNu=y{NxC$O$OpQN"p=@ nnp =@ nml09vnU@?09tnS@?Nu0R@3{?.?.N$09vnS@?09tnS@?09{S@?NuSn`Rn`vp3{p=@ nn>?<?.N09vR@S@?09tnS@?09{S@?NuRn`p O"ON*3{NwN^,_Nu Move Matrix Right... /,HNVA-HNuC4O$OpQN=y{CE~nLpKQ?<A~nO"O2p"QN3{~09{~rAf:CVO$O'p&QN\Nxp=@ nn2p=@ n np3{?.?.N|Rn`Rn`p=@ n np=@ nn0.S@@y*T@3v0.S@@y,@3tp=@ nnRp=@ n n`09rAf809 29 RAAo$?9 NB09 S@3 ?9 N`09rAf209 rAl$?9 N09 R@3 ?9 NĴ`V09rAf209rAo$?9N$09S@3?9N`09rAf80929SAAl$?9N09R@3?9N~`09rAf80929RAAo$?9NÔ09S@3?9N6`09rAf209r Al$?9NR09R@3?9N`BBy?9N&?9N?9 N¬?9 N¢`p3?9Nì?9Nâ?9 ND?9 N:`Hn2HzJ?<N`Hn2?9NcNcXHn2?9NcNcXHn2?9 NcNcXHn2?9 NcNcXHn2?9NcNcXHn2Nb/.?.N`8Y@ @b.@0;NDX""""""H0.rAfx?<?.?.?.?.?.?.?.?.NH/.?.NZ?.?.?.?.Np O"ONHn2NbN^,_NuFONT.DAT Matrix marker /,HNVA-HNu0.`d0. ` Nn`@ @b@0;N`V0. `*Nb`HN>`@N:`8NN`0Nz`(@ @b@0;N`0. `2N`TN`LN`DN`Q?<A~nO"O2p"QND3{~p O"ON09{~rAf`BBgNCLE~nAp@Q?<A~nO"O2p"QN3{~N HyzNbBgNA[1][ This Program will | only work in MONO !! | ][SHAME!][1][ | Sure you want| to leave ? ][ NO |OK] Exit Program "/0<NBNuNV3 3 By33NW09N^NuNV# 3 3By33NW#N^NuNV3eByBy3NWN^NuNV3 3 Bn nH|2n2RRnJ@f33Sn33NWN^NuNV## .мZ#3dBy3 n 3NW n 0####N^NuNV3 .NW.NW# 3m333NW#N^NuNV# 3 3333NW#N^NuNV3 3By33NW09N^NuNV3 3By33NW09N^NuNV3 3By33NW09N^Nu#Nu#Nu#"<psNBNuNV3\0.|Hмx-@=|` nH2n\2RRn nm.dNTB@09hN^NuNV#\v#z#~#h###vd> aF3hpN^NuNV>a*pN^NuNV33 3 >NW n0j n0l n0n n0pB@09hN^NuNV33 3 3333333333 3"#$3(3*>NW n,0j n00l n40n n80p n<0r n@0tB@09hN^NuNV#3 >2NWN^NuNV33 3 333333>3NWN^NuNV3# >4NWN^NuNV#>6NW n 0j n0l n0n n0pB@09hN^NuNV## >ZNW n0jB@09hN^NuNV33 3 33333>INWN^NuNV33 3 33333>JNWN^NuNV>MNW n0j n 0l n0n n0pB@09hN^NuNV3# >NNWN^NuNV#3 >NWN^NuNV#3 3> NWN^NuNV#3 3>!NWN^NuNV#3 33333>*NWN^NuNV#3 3333333>/NWN^NuNV#>nNWN^NuNV>oNWN^NuNV33 >pNW n B@09hN^NuNV33 3 33>dNWN^NuNV33 3 33>eNWN^NuNV3>fNWN^NuNV3>gNWN^NuNV33 >hNW n 0j n0l n0n n0pB@09hN^NuNV33 3 333>iNWN^NuNV3>kNWN^NuNV33 3 333>lNW n0j n0l n0n n 0pB@09hN^NuNVH *n(n >0-W?0,WN_T:>0-W?,0,WN_T8>?N_T>>?,N_T<89F0G9@0F9@GoFnB@`pJL0N^NuNV0.n o0.`0. N^NuNV0.n l0.`0. N^NuB9`P _0g$_jp"_// HNbLJ@fP)J9f" f |` f|` f |` f|`4<G BQB) @ef *:f^&Jrt `e QGb*tWJBk4GbB3 J9f g g`> g8 fp@`*S@rG   e gRAQJ9g`tJ)f8/ HybH?< NA\"_J9f|#|3|Nu|Nu )bJ) g )g )g ) f J9fgZBNu|/ BgHi ?<ANA>3|NAXNu _4` _t6 Bo r aSB`2aNH?e _r ar a/L?e Nu _r aN _4` _t"x0HgJJjDxvCe`zp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCe`p0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtJCkgCe4`BSCr aQSBk aQN _v` _60@d Cdt`Cd~tJCgkCe4`BSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH e"oA/ Ne`L eNu(_ _/ C( g  f,t4(H / /?(?<@NA LJkffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHyf]`Hyf*?< NA\Jyz g L9BgNA *** REWRITE required prior to WRITE or PUT *** *** Disk or directory full *** _$_"Wp )f)H/ NhL4NH/ NhLp)` _"WJyhf8J)f )f)H/ NhL )g)J)fJgByh )g J)fBiNz`z _$_"WptvH/ HyaB29XL- -fJf^p`4  fJg*`N0eH  bBԂi\(؄iV؄iRԄiNԁRCJ)f  g )f) 0e 9c~Jg$JgDJf 6Höf4N$N/Hyh`/Hyh?< NA\ _Jyz g9BgNA _$_0"Wt )gJ&JRJ)f4H/ HyaZ29XL )gJ)f RBBe`ưBe`N&|H/ ?< NA\Hyh?< NA\LS@kQ3hN *** Bad digit in number encountered *** *** Overflow during READ of number *** (_ _/ C (g ( fxJ(f t4($IH / /?(?<?NA LJk,g*fJg  f"J` g  Wf NuJgJ(f P Nu!|Nu4(SBa@J(f8Jg. fJ(f"gr W1Agp f W1A1AQNu(gRJ(fD f&H`?<NAT f?< ?<NAXp LNu fH`?<NATLNuHyjt`HyjD?< NA\Jyz g L9BgNA *** RESET required prior to READ or GET *** *** Attempt to read past end-of-file *** Hp`:Hp`.Hp`"Hp`Hp` Hp _/fJ/ gLJ/kJ`L/ fJkB`</jJk2`,gbJk&` Jk`"eb// ebr`r`rAV ?/LNuHv` Hv _ `Hv` Hv _0HJ[fBBg`,j Dj4<` 4<ЀkSB`Jf].B/BJg 2/.?o /@?A /LNuHv` Hv _ [2Jkp`&4<cH@j JgR@kJ@kJgD@?/LNuHv` Hv _ [2Jkp`$4<cd JgRkJk~JgD//LNuJ/ goNuNuH _?///` H _0/2// Jv/ 8://N~/DD?DBoJgJgC|k?>BGHGv8ބdRC8ބdRC>HGvކdRC8ބdRCHGv48ބBޅB:>HG8ކkE߇SDkBg|d RdRDUJg( DbRD ME \/LNuBBo `H _0/2// v/ 8://~/?DD?DBo 8JgJgG|HD8H@0zr)`рe efef<څ߇QgRCgڼd RGdSCJCkD|blo/EC \/LNuoH _p2/g/ f/W?o `ֲ@e:f$/&e&f // d*B6//J/ k`(&// S@Q`&// `R"/?/[4JfFӃddRdRR/eJd RdRd`/AG o Jk`z0H*kS/JkFft grkRBjIHA~`( dtHAI.kRBҁjBG` BBRBӁj/e2/AG o Jk\/LNuH _0 @&b(CqLC/)?/LNuHyrZ`Hyr6?< #NA y\Jyz g L9BgNA Hz@CPt$> nk(:C@hԥ*5 c_1ɿ1.Ź^ k:v #-xŬX&x2n)h? SYQa@%oNˏ'?9x!7I|o|@Eŭ+E75vV 9@{pvP *** Floating point overflow *** *** Floating point division by zero *** H _0"_e /LNu/Hyt?< NA\ _Jyz g9BgNA/B9D/|DNuH _0 @f0"|p` "_J@jpEDr4@ BbBS@kQ/LNuH _4SBk`82$_rAdP0 @f0"|p` "_J@jp6ADb"CG0IS@k$eQ/LNuH _4k2SAk0"_p6B@bE0)CS@kQ/LNuH _2$_r0 @f0"|p` "_J@jp@kS@kv&J$IRC4(K Vg RQBg`?/LNuH _4k22SAk*0 @f0"|p` "_J@jp6B@bEDSBkQ/LNu *** Stringoverflow *** _ hNVf 0(gr"OD@Hd2S@k "Q` _"yye(Hyu?< #DNA yD\Jyz fBgNA9N#L#H .f -|ut`-|ut nNнHf yLN *** Stack overruns heap *** yP#X f#P#TBh6Nu&_a"h $h43_2,yXNH\&_a"h 3_2?/ L\,yXNu&_a1_$1_"1_1_1_1_1_,1_*1_(1_&1| ,yXN&_aR1_2!_.1_$1_1_1_1_1_*1_(1_&Bh4,yXN&_a1_2!_.1_$1_1_1_1_1_,1_*1_(1_&Bh4,yXN&_a1_2!_.1_$1_1_1_1_1_("h3_$_0)gk"h (JS@"Q"Bh4,yXN&_a1_h1_Z01_N1_L2 @b"yT@$qBh$1|jBhr!jLT1jPXj$"jHA1qHBhJTA01hH1@P1jRRBhf1|B1|D1j>\1j@^1j:`([g1j6d1j8b`BhbBhd1|F1|@Bh6!|\l1|@p,yXNa"hBQ$hB5| ,yXNua ,yXNu&_az$h\BZ4"_p$Q"_p$Q ,yXN&_aJ$_ ,yXN&_a8$_ _20 ,yXN&_a 1_>1_<1_:1_81_6h6N ,(p ,<($(0 44  8(80 TN(t0:& t * (*( ( x            *4  $$   $   "  02  "        RP  68  $(("("<,              t*,     ,   $$h  RB"*,:( D< 6(  &< &8 *2 F6 (2 N : *4 v nP8(6 $(6 dP*(6 2(6 ~` f  $    L ,  ,D 6 8 $6D 6 8 $8D $<D $2D (6 ( (: (>  T@  " :@  " :@   " :@  "  < ((F ( "                 6,    ,       $                          *p HL@>2J  2 0 0"p z  f H F    J  ( *@ B @ N  ( " <<@V("0t0$W  File Edit Move Mark Font-Editor Info-------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Load Font Save Font Save As... ----------------- Print Font Print Font ----------------- Delete Font----------------- Quit V-Mirror H-Mirror -------------------------- Fill Delete ------------------ Invert ------------------ Copy... Move Up  Move Down  Move Left  Move Right  Set Marker FONT - EDITOR(c) by M.BALDAUFwritten July 1986 byMatthias Baldauf THIS PROGRAM IS PART OF A PROGRAM PACKAGE !!OK FONT - PRINTas NLQ EXIT NORMAL(c) BY MATTHIAS BALDAUF 7/86 MATRIX MARKER  TOP BOTTOM RIGHT LEFT OFFON MARKER Save CLOSE p pp @@@}(`?@>} (D((88H#4CA0B $p0DC<G9   H 0 0 88p?$p `8pxx8ftuv345FGX_`aijktu v~ h0 (0 PP $ ) 0  7 > -P  E X m   ,:HZhz('   !"#$%&'-),*+%,4(C..- R "      4     00  R0 !  P %A% l@H@J@L@N @P @R @T @V A QQ  ' t 1 0 1 1 1 1 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUꪪUUUUUUUUUUUUUUUUU_UUUWUUUUUUUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWUWUUUU__UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUꪯ\UUUUUUUUUUUUW?UUUUU8/UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU'߫ >_A%UUUUUUUU~A?U UU^< ?UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@"@!`!POꪪUUUUUUUUp ~2 UUÀ$L M(UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@ C$ " UUUUUUU_BB#9 3PBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU @x ڪUUUUUUU'  py  @@DUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU)x* !8@ @GꪪUUUUUUVu H !PDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU$@(!P@H("PzꪪUUUUUUW4P TBE@ =UUUUUUUU3uUUUUUUUUUUUWUUUUU@0@ުΪUUUUUUWֺAB AP@P@?UUUUUUUWmUUUUUUUU/UUUUd @@@ ~oUUUUUU_l 'q@ @@$UUUUUUU_`aUUUUUUUUU 4@EϪ_B>UUUUUUZBuxoUUUUUUUzX|D+UUUU@~@??UUUUUU^B4UUUUUU_ UUUh"E0&OUUUUUUZ%@ @ %UUUUUUo  @?UUUX{R@DA!UUUUUU_0 "FUUUUUz   UUp 4@@@ 0 UUUUW 6,<&<U >@px>( p" $!UUUUUU_~ UUUUUp@ `" (U~# ( @" 0 (UUUUUUV| ~!C!UUUU^"  U ?`<@@>0 QrA$$CUUUUUUVx`UUUU^1 "888 GU xx0ꪪP 0P/UUUUUUW@xx  GUUUU\h0HU`?xx@x@ꪪ ߪUUUUUUZa|xxx UUUU\Uq|xx< 'UUUUUU^|xx< UUUUUz(?'UUP|xx<>6/UUUUUUWؘ |xxUUUUUI'UU|xxx6.UUUUUUVJ ~xxx7UUUUU$ =UU~~xx 6 UUUUUUW6>xxx"7UUUUUBUU@ > xx@qUUUUUUU?xx7UUUUUÅ@UUxx>86X ꪪUUUUUUUxx`~8 '7UUUUUP ?UU| |?0G 6@@ꪪUUUUUUW@~? UUUUUUU?@Ȓ  着UUUUUUV ~p>UUUUU $7UUU~~|` ?xz ?UUUUUUUШ<8 xB}UUUUUr@_UU zsꪪUUUUUUW uUUUUUp0UUz DUUUUUU_!uUUUUUlB(@ SUUlz@ CUUUUUU]@uUUUUUn8U @ UUUUUUgI??!UUUUUeuU*'UUUUUU |UUUUUv@@WU= |2aUUUUUU~ԡ>0AUUUUU_"UUo90UUUUUW UUUUU_) U AUUUUUWA0PUUUUUW!Ukx@0<UUUUUWk @<uUUUUUW*gUz<zBGUUUUUW~@D<UUUUUW U|@<zUUUUUW@8 p8<<uUUUUUV@2Up|>~<>z@UUUUUWɐ0?~<}UUUUUW`@,U0~<!zpUUUUUW@p>~<@@=UUUUUW,UUay>><x>>`UUUUUU z0UUUUUW@UU||  A:UUUUUUAx <@@ UUUUUUPAUUCx@<K !UUUUUU^`x< UUUUUUUUx<$,.ҪUUUUUU|~x<UUUUUU~!@SUU- x<"UUUUUUz$x<UUUUUU\7UUx<&% UUUUUU_x< UUUUU@@UU@x<媪@UUUUUU_@x<=UUUUUUU@@x</QUUUUUU_@x<UUUUWx00@BUUx< Ϫ UUUUUU_x?<DUUUUUm UU@x@~  :UUUUUUW x UUUUWA@=UU?>bD$UUUUUUWЀ??@UUUUUWB@ }UUp <x  E@zUUUUUUWF  UUUUUWa@}UUP B@ZUUUUUUU@@ UUUUUUH@mUU@@,ɪ@jUUUUUUUD UUUUUU mUU$~UUUUUUUX@@(UUUUUU]UU  @~UUUUUUU @ UUUUUU?UUAA?UUUUUUU䀀"UUUUUUU@PUUUUUUUB =UUUUUWUT :/UUUUUUU@uUUUUUVUAb!ꪪUUUUUUU UUUUUWUꪪUUUUUUU,UUUUUVU@ꪪ UUUUUUU@UUUUUWU ꪪ UUUUUUUBUUUUUUV U@CjR-UUUUUUUZ`xwUUUUUWU@g@ ᆻ@?UUUUUUU@( @32 @UUUUUW{U@ 0@9 328؀NA@@1{UUUUUUUA @8$|H 3c\P@sUUUUUUVUU LMn]@ 3cSUUUUUUWLLلlp@ a_@ UUUUUUV7UU@ LDD a\N$@@P~UUUUUUWDLDD `p@`$@UUUUUUV@}UUBMĉD fذ@0$@@!UUUUUUWhDvM@UUUUUUW@UUUUUUW@HmUU着p@@pZUUUUUUW@$GUUUUUU`UU B:UUUUUUW3UUUUUUa 7=UU`'ꪪPzUUUUUUW/UUUUUUUU GꪪC>:UUUUUUW PUUUUUUqh=UU,ꪪ:UUUUUUZgUUUUUUpUUꪪ UUUUUU_UUUUUUp@UU Fw `@ꪪ@@UUUUUU[!@!8@ZUUUUUUhUU8TB!3!@@ @ꪪ>UUUUUU^!"3!؆``LUUUUUUp UUܒ!g 6>! 0z UUUUUUl@m{*p6d{˻#9 P@tUUUUUUpUU@L!2 6d! #M@U:mUUUUUUXL!"d!#YM@@}UUUUUUp U"@L!"d!#pYM0@ UUUUUUL!" d!#YM"]UUUUUUpp0U(H)R"we)H+YJ锨 UUUUUW@qswf>sLp̀UUUUUUGU0@ !"@$2! Ȉ_UUUUUW  ` @5UUUUUWU= @!>UUUUU^"=UUUUUT ?UU.ꪪUUUUU_mUUUUUY@UU`P QzUUUUU] %eUUUUU_UU  FUUUUUW@UUUUU] }UUh@@.>UUUUUZ: `=UUUUUU -UU: b J.>UUUUUW-Dpps<-UUUUUU@UU@ D>  UUUUUU  G` }UUUUUWpUU &p1ψ@@^UUUUUUrٲ:A5UUUUUUUU# paٲ:2UUUUUU~w8" a!: 5UUUUUUUU9 " @: 0zP0UUUUUU_n@" 92:@UUUUUUUUU2 &]2YJ@ZUUUUUUW7pC$rPUUUUUU]0UU" < Z UUUUUU_?$ UUUUUU^  UU@@@ZUUUUUU@UUUUUU^U @ ڪDRUUUUUUo UUUUU\U(   Q@@ UUUUUU`DUUUUU\!UЀ@UUUUUU @HZUUUUU]Uߢ  jUUUUUV@UUUUU\ U@@@a~UUUUUWv? UUUUU^@U@vM@DUUUUUV@@v_UUUUU^$uU@ T@vv  PjUUUUUV$UUUUU^2uU@GzUUUUUV "UUUU]@0uUB @#$zUUUUUW UUUU]uU"ꪪzUUUUUW5UUUU_uU  zUUUUUW?UUUUU[ uU A(zUUUUUUUUUUU[ uU@ꪪUUUUUUUUWsUUw UUVUUUUUUUUUUUU@UUU>ݸ@hꪪUUUUUUUUUUUU_< UUUUUUU]UUUUUUUUUU@ GUUU>`$PꪪnUUUUUUUUUUUUUUUUUUU_UUUUU{UUUUUWUUUUUUUUUU@UUU3330 33 6  UUUUUUUUUUUUUUUUUUUU_~UUUUUUUUUUUUUUUUUUUUUUUUUUUU@3?0 33 ?3UUU<``ff `f0UUUUUUUUUUUUUUUUUUUUUUUUU_UUUUUUUUUUUUUUUUUUUUUUUUUUUU@<`|<?.@?.BNkN^ _ONAN^ _ONNV/./. ?.?<?NAN^ _O N/,HNVA -HN-n "np)=@0.N^,_ _XN/,HNVA-HN-n"n0. @N^,_ _\N/,HNVA-HN=n 0.J@j 0. D@=@ BnCzECnE0.R@=@0. 2. ?<}/?<BgN,NC nElp $QptC ,EDp $QpDCEp $QpCEp $QpNNR@@@N>R@@@l#~f#zR3j3lp(3nBypp3rBytByvByxp=@ n n(0.@2.AAf40AR1Rn`NZp???<"?<N4/9>?<#BgN$`$/9>?<"BgN/9>?<#?<N09rAf4/9>?< ?<N/9>?<!BgN/9>?<BgN09rAf4/9>?< BgN/9>?<!?<N/9>?<BgN~09rAf4/9>?< BgN`/9>?<!BgNP/9>?<?<N>09rAf|/9>?<BgN /9>?<?<N/9>?<#?<N/9>?<"?<N/9>?< BgN/9>?<!BgN/9>?<BgN`z/9>?<?<N/9>?<BgN/9>?<#BgNd/9>?<"BgNT/9>?< ?<NB/9>?<!?<N0/9>?<?<N09rAf/9>?<%?<N`/9>?<%BgN Bg?<HnN,=@09rAf/.?<N`/.?<N09rAf4/9>?<?<N/9>?<BgN/9>?<BgN09rAf4/9>?<BgNp/9>?<?<N^/9>?<BgNN09J@f4/9>?<BgN2/9>?<BgN"/9>?<?<Np3?9Np9rAl8NZHy?BgNN ?9N09F29BtHA?09D29@tHA?BgBg?9F?9D?9B?9@N?9N?9 NVNN^,_NuNV?.?. /. ?.?.NqTN^ _O N/,HNVAL-HNp=@NBg?<HyFHyDHyBHy@N,?.?9F?9D?9B?9@N<3CE4p$Qp@?9?<HnBgBgNB09F29BtHA?09D29@tHA?BgBg?9F?9D?9B?9@NHNZ?9?9F?9D?9B?9@NN ?9?<HyFHyDHyBHy@NNh=@0.J@fHBgNCHEAp@Q?<AO"O2p"QN3Hp=@0.N^,_Nu[1][ Error found in | .RSC File !! | ][ SHAME! ][1][Come on, wake up !|No .RSC File found.| Exit Program !][ CUSS ]GUTENBER.RSC /,HNVA-HN/.HnHnHnHnN?.?.?.?.NvBg?.?.?.?. ?.?.?.?.N~/.Bg?<?.?.?.?.N/.?.N=@=n?<?.?.?.?. ?.?.?.?.N"/.?.NH?.?.?.?.N0.N^,_ _ON/,HNVA<-HNBg?<HnNV=@/.Bg?<@?<?<?<N=@N^,_Nu/,HNVAh-HNBg?<HnN =@/.Bg?<@?<?<?<N=@?<?<N=@0.J@f By` p3N^,_NuNV?.?<NAN^ _ONNV/.?<;NAN^ _ON/,HNVA -HNpd=@p2=@=|=|J?.?.?.?.NHn Hn4HyBN=@09B|r|AfA4O"Op "QHyNCE4p$Q0.\rAfBC Elp $QC4EDp $Qp9l@S@?N=@`>C Ep $QC4Ep $Qp9@S@?N=@CEp $Qp@HnN=@p=@0.\rAfH0.rAk0p*@g,0.U@2.tAk0A0.R@=@``D0.rA0p*@g,0.U@2.tA0A0.R@=@`0.U@rAHnN=@?.?.?.?.NlN^,_ _ORN\\ /,HNVAb-HNBn=n0.nnBBn=n0.nn&0.n?0.n??. N^Rn`Rn`N^,_ _PN/,HNVAL-HNNp=@p. =@0.nn0.rA 0=Ap=@ n n0.42.AAAR-pp=@ nn .rnAA-@ .JkD-n?.b0.`nS@2.bA?0.^nS@2.bA??<N`8?.b0.`nS@2.bA?0.^nS@2.bA?BgNjRn`TRn` 0.`@ 2.b A=@`Rn`NN^,_ _OXN/,HNVBA-HNABBP1|0. rAf6?<ADO"Op "QAlO"Op "QN` p3B09B@d?<NxHnBHy??<?<NC~E p QBg?<?<AO"O2p"QN^C:E p QBg?<?<AO"O2p"QN$CE pQBg?<?<AO"O2p"QNCE p QBg?<?<AO"O2p"QNCnE p QBg?<?<AO"O2p"QNvC*E p QBg?<?<AO"O2p"QNHn@HnBHnDN0?.>?.@?.B?.DNBg?.0?.2?.4?.6?.>?.@?.B?.DN/.,Bg?<?.>?.@?.B?.DNTBn* NNBn$0.$n"]?< NAT2|p|@WCBdC EJ0.$R@=@$0.$RACEJ4p$Qp.JrA^p.KrAWCBdp.L`NZHnJ?H~Rn`TAO"O2p"Q NN0.FR@=@F`0.D@dR=nF09yyS@=@ 0.n nC^O$O NNRn` NNfp=@*?< NAT2AdPCE8p7Q?<AO"O2p"QN 3H09HrAfp=@*0.*|r|AfHn@NwJ?<?.0?.2?.4?.6?.>?.@?.B?.DNv?.>?.@?.B?.DNHyVHyd??. ?<Nf/9>?<BgNV/9>?<BgNFp3`p9=@C$Ep $Qp0.NZ?<0??. ?<N/9>?<BgN/9>?<BgNBy`p9=@C:Ep $Qp0.NZ?<8??. ?<N/9>?<BgN/9>?<BgNp3`(@ @b@0;Nd&`0. `/9>?<BgNr/9>?<?<N`/9>?<#?<N./9>?<"?<N/9>?< BgN /9>?<!BgN/9>?<BgNp3`p3/9>?. ?<N/9>?<#BgN`p3/9>?. ?<N/9>?<"BgN`f/9>?<?<N/9>?<BgN/9>?< ?<NP/9>?<!?<N>/9>?<?<N,/9>?<#BgN/9>?<"BgN p3`p3/9>?. ?<N/9>?<!BgN/9>?<BgN`p3/9>?. ?<N/9>?< BgN/9>?<BgN`fp3/9>?. ?<N/9>?<!BgNz/9>?< BgNj`(@ @b@0;N0nP~`0. `R09J@f p3/9>?<%?<N`By/9>?<%BgN`2CvEGpFQ?<AO"O2p"QN=@0.rAfHyHz ?< NtHy?9Nx,NwXHy?9Nx,NwXHy?9Nx,NwXHy?9Nx,NwXHy?9Nx,NwXHy?9Nx,NwXHyNwJ`.N`&@% @b@0;N`W@ @b@0;Nbl/9>?.?<NN^,_ _XNGUTENBER.INF[1][Bitte Start-Diskette|ins aktuelle|Laufwerk legen !][ OK | ABBRUCH ]A:\*.DOC A:\*.OUT A:\*.* /,HNVA-HNprA??<?<?9BgBgBgBgBgBgBgBgBgBgHy.BgBgHyLHyJHyHyHyHyNv=@0.rArAf 09.r Af?94?96N0.rArAW094rAWC096rAWCBdDN^,_NuA#A0B1|AV01|A01|NN#~/<N#zN309J@fN309rAfDNF/9>?<NNBgNCE p Q?<NN``BBgNCXEAp@Q?<AO"O2p"QN3HNvHyNwJHyVNwJBgNA[1][Dieses Programm luft|nur auf dem Mono-Screen|SM124!][SCHADE]GUTENBER.ZSZ"/0<NBNuNV3 3 By33Njf09N^NuNV# 3 3By33Njf#N^NuNV3eByBy3NjfN^NuNV3 3 Bn nH|2n2RRnJ@f33Sn33NjfN^NuNV## .мZ#3dBy3 n 3Njf n 0####N^NuNV3 .NjR.Nj\# 3m333Njf#N^NuNV# 3 3333Njf#N^NuNV3 3By33Njf09N^NuNV3 3By33Njf09N^NuNV3 3By33Njf09N^Nu#Nu#Nu#"<psNBNuNV30.|Hм8-@=|` nH2n2RRn nm.Ng^B@09N^NuNV##### #(#> aF3,pN^NuNV>a*pN^NuNV33 3 >Nj| n0 n0 n0 n0B@09N^NuNV33 3 333 3 333333 3"#$ 3(3*>Nj| n,0 n00 n40 n80 n<0 n@0B@09N^NuNV# 3 >2Nj|N^NuNV33 3 333 3 33>3Nj|N^NuNV3#  >4Nj|N^NuNV# >6Nj| n 0 n0 n0 n0B@09N^NuNV# # $>ZNj| n0B@09N^NuNV33 3 333 3 3>INj|N^NuNV33 3 333 3 3>JNj|N^NuNV>MNj| n0 n 0 n0 n0B@09N^NuNV3#  >NNj|N^NuNV# 3 >Nj|N^NuNV# 3 3>Nj|N^NuNV# 3 3> Nj|N^NuNV# 3 3>!Nj|N^NuNV# 3 33333 >*Nj|N^NuNV# 3 33333 3 3>/Nj|N^NuNV# >nNj|N^NuNV>oNj|N^NuNV33 >pNj| n (B@09N^NuNV33 3 33>dNj|N^NuNV33 3 33>eNj|N^NuNV3>fNj|N^NuNV3>gNj|N^NuNV33 >hNj| n 0 n0 n0 n0B@09N^NuNV33 3 333 >iNj|N^NuNV3>kNj|N^NuNV33 3 333 >lNj| n0 n0 n0 n 0B@09N^NuNVH *n(n >0-W?0,WNrT:>0-W?,0,WNrT8>?NrT>>?,NrT<89F0G9@0F9@GoFnB@`pJL0N^NuNV0.n o0.`0. N^NuNV0.n l0.`0. N^NuH aS@r VW?/L NuH aS@r VV?/L NuH aS@r VU?/L NuH abS@r VS?/L NuH a>S@r VR?/L NuH aS@r VT?/L Nu#( _0 @g "_J@jp`0 "| p2 Ag $_JAjr`2 $| r@g\H G e$4SBkQ4@SBpQ0"| ` 4SBkQ4ASBrQ$| L J@f pCt$I/9(NuB9,`P, _0g$_jp"_// H.NwJL.J@fP)J9,f" f |` f|` f |` f|`4<G BQB) @ef *:f^&Jrt `e QGvtWJBk4Gv3 J9,f g g`> g8 fp@`*S@rG   e gRAQJ9,g`tJ)f8/ Hyv?< NA\"_J9,f|#|3|Nu|Nu )bJ) g )g )g ) f J9,fgZBNu|/ BgHi ?<ANA>3|NAXNu _4` _t6 Bo r aSB`2aNH?y _r ar a/L?yNu _r aN _4` _t"x0HgJJjDxvCyzp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCyp0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtJCkgCe4`BSCr aQSBk aQN _v` _60@d Cyt`CytJCgkCe4`BSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH y"oA/ NyL yNu(_ _/ C( g  f,t4(H / /?(?<@NA LJkffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHyz`Hyz?< NA\Jyg L9BgNA *** REWRITE required prior to WRITE or PUT *** *** Disk or directory full *** _$_"Wp )f)H/ N}L4NH/ N}Lp)` _"WJy}.f8J)f )f)H/ N}L )g)J)fJgBy}. )g J)fBiNz`z _$_"WptvH/ Hy:aB29:XL- -fJf^p`4  fJg*`N0eH  bBԂi\(؄iV؄iRԄiNԁRCJ)f  g )f) 0e 9c~Jg$JgDJf 6Höf4N$N/Hy}_`/Hy}3?< NA\ _Jyg9BgNA _$_0"Wt )gJ&JRJ)f4H/ Hy:aZ29:XL )gJ)f RBBe`ưBe`N&|p`:H >p`.H >p`"H >p`H >p` H >p _/fJ/ gLJ/kJ`L/ fJkB`</jJk2`,gbJk&` Jk`"eb// ebr`r`rAV ?/L >NuH >v` H >v _ `H >v` H >v _0HJ[fBBg`,j Dj4<` 4<ЀkSB`Jf].B/BJg 2/.?o /@?A /L >NuH >v` H >v _ [2Jkp`&4<cH@j JgR@kJ@kJgD@?/L >NuH >v` H >v _ [2Jkp`$4<cd JgRkJk~JgD//L >NuJ/ goNuNuH > _?///` H > _0/2// Jv/ 8://N~/DD?DBoJgJgC|k?>BGHGv8ބdRC8ބdRC>HGvކdRC8ބdRCHGv48ބBޅB:>HG8ކkE߇SDkBg|d RdRDUJg( DbRD ME \/L >NuBBo `H > _0/2// v/ 8://~/?DD?DBo 8JgJgG|HD8H@0zr)`рe efef<څ߇QgRCgڼd RGdSCJCkD|blo/EC \/L >NuoH > _p2/g/ f/W?o `ֲ@e:f$/&e&f // d*B6//J/ k`(&// S@Q`&// `R"/?/[4JfFӃddRdRR/eJd RdRd`/AG o Jk`z0H*kS/JkFft grkRBjIHA~`( dtHAI.kRBҁjBG` BBRBӁj/e2/AG o Jk\/L >NuH > _0 @&b(CC/)?/L >NuHy`Hy?< # jNA y j\Jyg L >9BgNA Hz@CPt$> nk(:C@hԥ*5 c_1ɿ1.Ź^ k:v #-xŬX&x2n)h? SYQa@%oNˏ'?9x!7I|o|@Eŭ+E75vV 9@{pvP *** Floating point overflow *** *** Floating point division by zero *** H p _0"_e /L pNu/Hy`?< NA\ _Jyg9BgNA/B9 /| NuH p _0 @f0"| n np` "_J@jpE r4@ BbBS@kQ/L pNuH p _4SBk`82$_rAdP0 @f0"| n np` "_J@jp6ADb"CG0IS@k$eQ/L pNuH p _4k2SAk0"_p6B@bE0)CS@kQ/L pNuH p _2$_r0 @f0"| n np` "_J@jp@kS@kv&J$IRC4(K Vg RQBg`?/L pNuH p _4k22SAk*0 @f0"| n np` "_J@jp6B@bE SBkQ/L pNu *** Stringoverflow *** _ hNVf 0(gr"OD@Hd2S@k "Q` _"ye(Hy?< # NA y \JyfBgNA9N# # .f -| `-|  nNн f y N *** Stack overruns heap *** y # f# # Bh6Nu&_a"h $h43_2,y NH &_a"h 3_2?/ L ,y Nu&_a1_$1_"1_1_1_1_1_,1_*1_(1_&1| ,y N&_aR1_2!_.1_$1_1_1_1_1_*1_(1_&Bh4,y N&_a1_2!_.1_$1_1_1_1_1_,1_*1_(1_&Bh4,y N&_a1_2!_.1_$1_1_1_1_1_("h3_$_0)gk"h (JS@"Q"Bh4,y N&_a1_h1_Z01_N1_L2 @b"y @$qBh$1|jBhr!jLT1jPXj$"jHA1qHBhJTA01hH1@P1jRRBhf1|B1|D1j>\1j@^1j:`([g1j6d1j8b`BhbBhd1|F1|@Bh6!| l1|@p,y Na"hBQ$hB5| ,y Nua ,y Nu&_az$h\BZ4"_p$Q"_p$Q ,y N&_aJ$_ ,y N&_a8$_ _20 ,y N&_a 1_>1_<1_:1_81_6h6N ,(p ,<$(0 44  8(80 824(&"8 :`":TB:t0:$   $   *:    "               "*       *,     ,     2RB"LP L:(  P(J,T("" D4 64H H 86&H .H 8"@,&:&8&D     $  $          $&~`:&8&D      $     $    $&4"   :  4f (           $&4" :     4f ( $    $ B^< . H <4N@ . H <4J4 <  B &"&"&"&"$ ^J28@"$|R,B t N  0V  , BF0(B X     <  F*V  , j      $                           *r     $"  HL@>2J  2 0 0"p z  f H F    J  ( *@ B @ N  ( " <<@V("0 j NN$fjV  File Font Special Gutenberg-Info~~~~~~~~~~~~~~~~~~~~ Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Quit Load Font Print Text... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Textomat ASCII~~~~~~~~~~~~~~~~~ 1st Word NLQ Standard~~~~~~~~~~~~~~~~ Normal Bold Cond Normal Wide Proportional ~~~~~~~~~~~~~~~~~~~~~~ Save New Setting ~~~~~~~~~~~~~~~~~~~~~~ Printer SelectionBY MATTHIAS BALDAUF, 4/1987 V1.1OKthe NLQ-Print ProgramGUTENBERG-PRINTERfor your ATARI ST PRESENTS SALES: <<< PRINTING IN PROGRESS >>> PRESS ANY KEY TO TERMINATE ! Please Wait: Formatting TextCHARACTER SET IS BEING CONVERTED Print Text 00Left Margin:__99 PRINT ABORT 00 Page Number:__99IN 1st WORD PLUSPlease select required Printer <<< SAVE with 'Save New Setting' >>> NL-10GEMINIn/216 INCH ADVANCE n/144 INCH ADVANCE EXIT FOR PRINTER WITHFOR PRINTER WITHq@@C8q0p8y=bpp?\wMv1brp8<61rx x 1>t~&1rpF1"1b18B!x0"0@) `  `8?8ldo{joxno{8ߟx???}Ny?@DQE?xE_y?Q@FQ?@DQMf#" )KL"Pfghz{|    " )*+LM!N]^_bq-  45?PQRcdPP $ ) 0  7 $P  A R g | %7BJ\$# gmx  !"#%+&'()*+$  )j M % ! !N      \ `!% !  . J !% ! f   !!   t |       (  !  *! ! F b 6    ~  V`00`    000 0   oo    00p 0     0{1    00 0 0    000@0000@@??@@??@@p 0 `0``9p`pp |p000<?00?0`0p0p|80 @``00w#0@`00?00g1{00{1<~`00?0048 ` @@@@@@ ` `00x0?0?x0{1p0``p0?00?``00c0p000`00`p`?p00p?|8?p0Pp`p?x000px 00C00p000p99p00`0p00<00``0`0    000  0 0 0`@ 0 0 0     0 @@ 1 1#  oooop0     0 0a 0 0 0 0a  p 0     0 0pp  0pp0   0pp 01 0p  0=xx=@oo0oodm    0og0xgl0l0g?p00p?00:bBBb?0`/<&?< NA\/<O?< NA\&/<&?< NA\0<(J9'g@ 9'gB@9(@0o @ n BA9)A0m A nA @Pn3B?< NA\F'Np R#_fMNMNf $ 1AY&&f -*J-*ff @MNA||9gM"N  0| :"|p0f m.+HN#tOP3w@3F2< Q mN+HN#p y eC!gA!!+| `j+|v+| r+|~+||z+|4+| +|n+|+| ,+mN66+m2OM;|TPD;|@+|z;|+|+| :+|nG$I R#_g&C A0<= Q!+|h+K+|N+|H(+L+|D+L m6##V#x3(|3~$m6"|0<QC0<'$QX4$0<'$QX4 m6!!pA+HV0<BQN!pNMvN `LNjNH`"|$Of Nj0* @g6 @g8 @f:5| * g&#@%| ` )LNs0<LNsLNHH33B33D9@g3w@3F`3@3wF*|B99&@ m"mg K+H $-2< J8>fJ8 f2- aUm mf+|}};|QLRfSxRkHRbNRxRNs2X2XNuEThe Mono Emulator - Mick West 1987 Enter speed (10-80, return=40)Nq $ hFD<  V It's a jungle out there, therefore: PPPPPPPPP DDDDDDDDD PPPPPPPPPP DDDDDDDDDD PP PP DD DD PP PP DD DD PP PP DD DD PPPPPPPPPP DD DD ==> SCENE PPPPPPPPP DD DD PP DD DD The Public-Domain Insider Magazine PP DD DD Monthly from your PD-Supplier, PP DDDDDDDDDD ATARI-Specialist or direct from: PP DDDDDDDDD PD-Szene, Postfach 130104, 6100 Darmstadt 13. Please remember to include the price of DM 1.40... -> Reports and Insider Info about the Atari scene. -> EACH BIT COUNTS - Regular Series. -> Tips for PD-Suppliers. -> Top Thousand: The 1000 best PD's in Germany. -> PD-Challenge, How good a programmer are you...? -> PD-Software Tests, New products and much more. -> Update-Pages for the PD-Primer, the Reference Book for the PD-User. -> Issue 6 with 68 Pages and a circulation of 6000+ Like a rolling stone... Ask your PD Supplier for PD Scene and get a pleasant surprise... Translators Note: "PD-SZENE" (PD-SCENE) is a German-language magazine, and not likely to be available in the UK. ----------------------------------------------------------------------- G U T E N B E R G - P R I N T E R Version 1.1 only for 9-Pin Printers (c) by Matthias Baldauf Luitpoldstr.62 6760 Rockenhausen Germany ------------------------------------------------------------------------ PUBLIC-DOMAIN = PUBLIC-DOMAIN = PUBLIC-DOMAIN = PUBLIC-DOMAIN ------------------------------------------------------------------------ Please send Shareware royalties to the above address. ------------------------------------------------------------------------ * DISK CONTENTS * =================== The following programs and files should be on this disk: FONTS 13 different character sets. GUTENBER.DOC OPERATION.DOC -- Operating instructions. ARTICLE.DOC -- Further info on the GUTENBERG-PRINTER. DEMO_01.DOC -- Demo-File in 40 character format. READER.PRG -- Program which will allow you to read the text files, which must reside in the same directory. GUTENBER.GEM PIC_1.GEM \ PIC_2.GEM >>>>> Graphics & tables. (done with GEM-DRAW) PIC_3.GEM / GUTENBER.LIS LISTING_1.LIS\ Program listings for LISTING_2.LIS/ -- the Articles. SOURCES FONT.I -- Include-File for the FONT-EDITOR Source. FONT.PAS -- FONT-EDITOR Source file. GUTENBER.I -- Include-File for the GUTENBERG-PRINTER Source. GUTENBER.PAS -- GUTENBERG-PRINTER Source file. FONT.PRG -- FONT EDITOR Program-File. FONT.RSC -- Associated RSC-File. GUTENBER.PIC -- Title Picture for GUTENBERG-PRINTER. GUTENBER.PRG -- GUTENBERG-PRINTER program file. GUTENBER.RSC -- Associated RSC-File. It is best to read the Operating Instructions for the GUTENBERG-PRINTER before attempting to use it... Your friend, Matthias Baldauf, 22.03.87