Gp O`  @`! #@%`)+-/1 O5`79;=A C@E`GIMOQ S@U`Y[]_a Oe`gikmq s@u`wy} @` O ` O ` @ ` ` ǀ ɠ @ ׀  @@`!Aa   !Aa!!#Ao)+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeaikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Oa١!aO`  @`! #@%`)+-/1 O5`79;=A C@E`GIMOQ S@U`Y[]_a Oe`gikmq s@u`wy} @` O ` O ` @ ` ` ǀ ɠ @ ׀  @@`!Aa   !Aa!!#Ao)+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeaikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Oa١!aA288 \FONTS `fGUTENBERDOC afGUTENBERGEMafGUTENBERLISafSOURCES %afFONT PRG AF gFONT RSC F GUTENBERINF wF GUTENBERPIC F }GUTENBERPRG F GUTENBERRSC F GUTENBERZSZ nF .READ_ME 1ST  LEES DITt OESKTOP INF [. `f.. GOTIK ZSZ F .SCRIPT ZSZ F .FUTURE ZSZ F .NLQ ZSZ F '.OUTLINE ZSZ F 3.SAKRAL ZSZ F ?.SHADOW ZSZ F K.STEIN ZSZ F W.UTOPIA ZSZ F c.HALF_OUTZSZ  F o.MAC ZSZ F {.NLQ_2 ZSZ F .ANTIQ ZSZ aF .GUTENBERINF ?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 : .  af.. DEMO_01 DOC F ARTIKEL DOC F p*BEDIENUNDOC F ;VREADER PRG F < 07201030305801 1by MKB-Soft 2Seite # 9[............................]1 1234567891012345678901234567890123456 Maximal36ZeichenproZeile LayoutDaten:72 01 03 03 05 Kopf-MitteundFu-Mitte HiereinBeispiel-Text: Vorwort:  Siehaltenhiereineeinfhrende BeschreibungderArbeitandenApollo WorkstationsinIhrenHnden.Bevor wirunsindieGefildederKommandos, Compiler,BitsundByteshinein- strzen,sindnocheinpaar Vorbemerkungenzumachen. Eshandeltsichhierumein'Profi' System,dasvonseinerStruktursehr flexibelundoffen(frdenBenutzer) ausgelegtist.Deshalbistesfr eineVeranstaltungimSinneeiner EinfhrungindieProgrammiersprache PASCALnotwendig,Sperreneinzubauen, dieden'unerfahrenen'Anwenderdavor bewahren,unabsichtlichz.B.seinem NachbarndieProgrammeabzuschiessen oderwichtigeSystemdatenzuzer- stren. EinekleineBlock-kopie: MehrereTestkandidatentratenan,um ihrebesonderenLeistungenvorzuzei gen.EinErgebnisseiaberbereits jetztvorausgestellt:diesuper- ultra-extra-optimaleallesknnende Textverarbeitungwarnichtdabei- damanabermiteinemProduktnicht arbeitenknnte,trifftauchnicht zu.Richtigistvielmehr:DieLei stungsschwerpunktesindunterschied lichverteiltundunterschiedlich ausgeprgt.DiewichtigstenErgnzun genausjngsterZeitsindRechtsch reibprfung,MischungvonTextund Grafik,UntersttzungvonLaserdruck ernund'intelligente'Manuskriptge staltung-gepushtvonderaufkommen denEuphorieumdassogenannte'Desk top-Publishing'. Zielvorgabe  Dieunterschiedlichausgeprgten EigenschafteninEinklangmitden speziellenAnforderungeneinesAnwen derszubringenkannbereitsbedeu ten,damandiefrsichselbst optimaleTextverarbeitunggefunden hat.Esistdaherwichtigzuwissen, inwelchenKriteriensichdieeinzel nenProgramm-Paketedeutlichunters cheiden-undwasmannichtvonihnen erwartendarf.Darberhinausist klar,daeseinenKatalogvonMin destanforderungengibt,diejedes Paketerfllensollte.Letzterund nichtungewichtigerFaktor:der Preis;wichtigernoch:dieWeiterent wicklungdesPaketes,UpdateMglich keitenundUntersttzungdurchdas beratendeSoftware-Haus. DieProbanden:WordStarinderneuen Version3.45;MS-WORD,derzeitig hchstgelobtesProdukt;Word-Perfect, mitrelativgeringenAnschaffungs kosten;Wordcraft,nachlangerWei terentwicklungjetztmitinteressan tenGrafik-Utilitie;Scientex,'Soft waredesJahres1985';undT3,wis senschaftlicheTextverarbeitungder Spitzenklasse. -Textende- 07201030305801 1Gutenberg-Drucker21/03/87 2Seite # 9[...................................................]1  GUTENBERG-DRUCKER  ----------------------------------- HabenSieauchschonmanchmalmitNeidaufdieneuen,tollenNLQ- Druckergeblickt,mitdenenesendlichmglichistauchmaleinen BriefodereineDiplom-Arbeitauszudrucken.DiesesNeidgefhl knnenSienunendgltigbeiseiteschieben,dennesgibtjetzt denGUTENBERG-DRUCKERfrIhrenATARISTComputer.Vorausgesetzt wirdlediglichderMonochrom-MonitorSM124sowieeinEpson kompatiblerMatrix-Drucker.DiebestenErgebnisselassensichmit denOriginal-Epson-DruckernsowiedenneuerenSTAR-Gertener zielen.AberauchBesitzerltererDruckerwerdenvondem erzeugtenSchriftbildbegeistertsein.IchselbstbinBesitzer einesSTARGemini10XmitdemdieAusdruckeimmernoch zufriedenstellendgelingen.AberauchBesitzereines'noblen' NLQ-Printers(bitteumVerzeihung)findeneineAnwendungfrmein Programm.OderkannIhrDruckervonzuHauseausschon'SCRIPT' oder'GOTIK'Schriftschreiben?Wennnicht,soistauchfrSie meinProgrammgenaudasRichtige. IndemfolgendenArtikelmchteichaufeinigeBesonderheitendes Programmseingehen.Soistz.B.eine1st_Word-Textkonvertierung eingebaut.DesweiterenmchteichaufdasPrinzipdesNLQ-Drucks eingehen,sowieaufeinigeBesonderheitendiebeimProgrammieren vonGEM-DialogboxenunterCCD-Pascal(nichtST:Pascal+)zu beachtensind.AmEndemeinesAufsatzesfindenSiedanneine kurzeBedienungsanleitungzudenbeidenEinzelprogrammenFONT.PRG undGUTENBER.PRGdesPakets. DerNLQ-Druck ------------- WennSieeinmaleinemNLQ-Drucker,wiez.B.STARNL10oderEpson FX85,beiderArbeit(demDrucken)zugesehenhaben,sowerden Siewissen,daeineNLQ-Zeiledurchzweimaligesberfahrenderer ZeilemitdemDruckkopferstelltwird.DabeizerlegtderDrucker dienormaleZeichenmatrixinzweiTeileunddrucktdiese, vertikalleichtversetzt,untereindanderaus.Sowirdauchklar, warumderDruckerimNLQ-Modusviellangsamerdrucktalsgewohnt, dennermujaeineZeilezweimaldruckenundkanndiesnur seltenbidirectional. GenaudiesesDruckprinzipnutztdasProgrammGUTENBERG-DRUCKER auchaus.Diesmalnatrlichnichthardwaremig,sonderndurch einesoftwaremigeNLQ-Drucker-Emulation.DieseEmulationist aberbeidenmeistenDruckernetwasoschnellwiedas entsprechendeGertmitHardware-NLQ-Fonts. WiefunktioniertdasGanzejetztabergenau?InBild1.1unter 'Normal'istdargestellt,wiederDrucker(werauchsonst)jedes ZeichenimmerschnPunktnebenPunktundZeileberZeile ausdruckt.Umunser16x16PixelsgroesZeichenwiederaufdie Grevon8x8Pixels(dernormalenZeichengreeines9-Nadel Druckers)zubringen,nutzenwireinfachdiedoppelteGraphik dichtedesDruckers.DadurchwirdderAusdruckhorizontalkompri miert,sodawieder80ZeichenineineZeilepassen.Das ErgebnisistinBild1.2zusehen.DieSchrifterscheintjetztin derBreitekomprimiert,istaberimmernochdoppeltsohochwie gewnscht.UmauchdieHhezuverdichtenwirdeinkleinerTrick benutzt,denauchdieNLQ-Printeranwenden.WieinBild1.3zu sehen,werdenimerstenSchrittdieZeilen1,3,5usw. komprimiertausgedruckt.IstdieZeilevollstndigzuPapier gebracht,soveranlassenwirdenDruckerdasBlattumeinehalbe Pixelreihenachobenzuverschieben.IneinemzweitenDruchgang werdennundieZeilen2,4,6usw.ebenfallshorizontalkompri miertausgedruckt.DasErgebnissehenwirinBild1.4,ein ziemlichdichtesPixelfeld. WennSienochbessereDruckergebnissewnschen,sosolltenSie einfachmaleinneues,frischesFarbbandbentzenundschwereres PapierinIhrenDruckereinspannen. Die1st_WordTextkonvertierung ------------------------------ DasamweitestenverbreiteteTextverarbeitungsprogrammfrden ATARISTistbekanntlich1st_WordundjetztseinNachfolger 1st_Wordplus,beidevonGST.AusdiesemGrundhabeichaucheine TextkonvertierungsroutineinmeinProgrammeingebaut,diees erlaubt,1st_Word-Textedirektauszudrucken.Dienichtdruck- barenSteuerzeichenwieFett,Lightusw.werdenvonderKonver tier-routineunterdrckt.IchhabeversuchtdieSchriftattribute zuimplimentieren,aberdannausGeschwindigkeitsgrndendarauf ver-zichtet.EineSchreibmaschinekannjaauch'nur'ineiner Schrift-artschreiben.AndereSteuerzeichenwie'variableTren nung','variablesLeerzeichen'oder'Einrcken'werdenordnungs gembersetztundausgefhrt. AlleLayout-DatenfhrtderGUTENBERG-DRUCKERwunschgemaus. Kopf-undFuzeilenwerdenauchrichtiggedruckt.InKopf-und FuzeilenkannanbeliebigerStelledasDoppelkreuz'#'stehenum dieSeitenzunumerieren. UmdieMglichkeitzubietenauchsehrlange,aufmehrereDateien verteilteteDokumentezudrucken,wirdvordemDruckbeginnin einemgesondertenMenderStartwertdesSeitenzhlers eingegeben. WiebeimOriginal-1st_Word-Druckertreiberauch,kannvordem AusdruckauchdiePositiondeslinkenRandesbestimmtwerden. WieprogrammiertmanabereineKonvertierungsroutinefrTexte vonTextverarbeitunssystemen?Ichhabemiralsersteseinkleines Programmgeschrieben,daseinebeliebigeText-Dateieinliestund alleZeichenentsprechendihremASCII-CodeaufdemBildschirm ausgibt.Sohabeichdannschnellfestgestellt,welchesSteuer- zeichenwelcheFunktionausfhrt.InBild2isteineTabelleder Steuerzeichen-CodesundihrerFunktionzusehen. InBild3istderAufbauvonKopf-undFuzeilen,Formatzeilen sowiederLayout-Daten-Zeileerkennbar.AusPlatzgrnden(allein dieseProzeduristber300Zeilenlang)undalskleinerAnsporn zureigenenProgrammierbungverzichteichhieraufdenAbdruck derlauffhigenProzedurundgebenurdenRahmenfrdieRoutine an(sieheListing1).DieserRahmendrftefrdieEntwicklung eigener1st_Word-Druckertreiberausreichen.Wemesnichtgengt derfindetimListingdesGUTENBERG-DRUCKERSeinenfunktionsfhi genTreibervor.PrinzipiellltsichdieserProzedur-Rahmen auchaufjedeandereTextverarbeitunganwenden.Jedermudann aberselbstdievorhandenenSteuerzeichenherausfindenundim ProgrammdurchentsprechendeRoutinenausfhrenlassen. GEM-Object-ProgrammierungunterST:Pascalv1.5 ---------------------------------------------- SolcheDingewieDrop-DownMensunddasWindow-Handlingwerden inST:PascalimPrinzipgenausoprogrammiertwie,diesinder 'Muttersprache'desST,in'C'gemachtwird.AlsAdressenzeiger werdeneinfach'long_integer'Variablenbenutzt.WenneinGEM- AufrufeinenWertezurckliefernsoll,somuinderProzedur deklarationderentsprechendeParameterdurcheinvorangestelltes 'VAR'frankommendeZeigeretc.bereitgemachtwerden. WiesoeinWindow-Handlingaussieht,oderwieDrop-down-Mens gehandhabtwerden,wurdeinder'ST-COMPUTER'schondesfteren erlutert(ArtikelserievonTh.Weinstein)undgeschiehthierin PASCAL,wieschongesagt,quivalentzurProgrammierungunter 'C'.InmeinemProgrammGUTENBERG-DRUCKERistaberauchdiesin PASCALzufinden. Ichmchtehierjedochvielmehreinwenigaufdieweitaus komplexereObjectdarstellungeingehen.Dabeigeheichdavonaus, daauchSieIhreObjecte,wieDialogboxenoderauchDrop-Down- MensmitdemResoruce-Construction-SetdesEntwicklungspakets vonDigitalResearcherstellthaben.Werdieses'RSC'nochnicht besitzt,kannesvonderST-COMPUTER-Redaktionsehrbillig erstehen.EsisteinwichtigesHilfsmittelzumErstellenvon OBJECT-Bumen.HierbeimssenSiejedemObject-Baumeineneigenen Namengeben.DesweiterenmujederButton,Textetc.derwhrend desProgrammlaufsgendertbzw.abgefragtwerdensoll,miteinem beliebigenNamenversehenwerden.WennSievonIhremProgrammaus einenObject-Baumzeichnenlassenwollen,sobestimmenSie einfach,wieinListing2zusehen,dieAdressederObject- Gruppe.UmdieFormularberwachungnichtselbsterledigenzu mssen,rufenSieeinfachdie'hndl_dial'Funktionauf,dieden IndexdesangeklicktenEXIT-ButtonsandieaufrufendeProzedur zurckgibt.EXIT-ButtonssindbesondersgekennzeichneteButtons (dieseKennzeichnungwirdim'RSC'vorgenommen),diedenComputer dazuveranlassen,dieKontrolleberdenProgrammablaufwieder deraufrufendenProzedurzuberlassen.Jetztmunurnochder angeklickteEXIT-Button'abgewhlt'undderHintergrundrestaur iertwerden.DasWiederherstellendesHintergrundskanneinfach, wieimGUTENBERG-DRUCKERerfolgt,durchPufferneinesgengend groenBildschirmausschnittsgeschehen,dernachdemBenutzerdia logwiederandiealteStelledesScreenskopiertwird.Diesist sicherlichnichtdieelegantesteundspeicher-platzschonenste Methode,aberbeiverzwicktem(beieinfachemnatrlichauch) Bildschirmaufbaudieweitausschnellste. OftmalsmchtemandenStatuseinigerButtons,diekeineExits veranlassen,(egalobsienunangewhltwurdenodernicht) erfahren.HierzudientdieFunktion'get_state',dienachder FormularabarbeitungmitderAngabedesBaum-unddesObject- NamensaufgerufenwirdunddenStatusdiesesObjectes(Button etc.)andaseigeneProgrammzurckliefert. UmandenInhalteinerTEXT-Boxzukommen,wirddieFunktion 'get_text'bentzt.AlsParameterwerdendiegleichenbergeben wieinderFunktion'get_state'.Auerdiesenmunocheine Stringvariableangegebenwerden,indiederTextdanngeschrieben wird.DieFunktion'set_text',dieeinenStringineineTEXT-Box schreibt,funktionierthierzuanalog.WiediepraktischeHand habungdieserProzedurenundFunktionenaussieht,knnenSieaus Listing2ersehen. WennSieweiterfhrendeHilfenzurGEM-Programmierungbekommen wollen,sosolltenSiesichschleunigstdaskompletteListingdes GUTENBERG-DRUCKERSvon'ST-COMPUTER'besorgen.MitdiesemListing undeinemgutenGEM-BuchdrftedieGEM-Programmierungunter ST:PASCALV1.5keinProblemmehrdarstellen.  07201030305801 1Gutenberg-DruckerSeite - # -Version 1.1 4/87 2(c) by MKB-Soft 9[...................................................]0  GUTENBERG-DRUCKER frATARIST-Computer Version1.1 vom16.04.1987 Gutenberg-Drucker geschriebenvon:MatthiasBaldauf Luitpoldstr.62  6760Rockenhausen Tel.:06361/7162 Hardware:ATARIST-ComputersystemmitFloppy,Grafikdruckerund demSchwarz-WeiMonitorSM124. Sprache:DaskompletteProgrammwurdemitdemST:Pascal-Compiler derFirmaCCDentwickelt. GeschriebenwurdedasProgrammaufeinemATARI520ST+miteinem RAM-Speichervon1,5MByte.DasProgrammdrfteaberauchauf jedemanderenRechnerderST-Serielauffhigsein. AlsDruckerwurdeeinlteresModellderFirmaSTARbenutzt,der GEMINI10X.EswerdenaberalleDruckeruntersttztdieentweder (wiez.B.derGEMINI10XvonStar)n/144Inchoderaber(wie StarNL-10oderEpsonFX-80)n/216InchVorschubzurVerfgung stellen.LetztereTypen(diemitn/216InchVorschub)mssenauch berdieMglichkeitverfgen,dasPapierzurckzutransportieren. WarumwurdediesesProgrammgeschrieben? DieIdeediehinterdiesemProgrammstehtistsehreinfach, derewigeMangelanGeld.Hieristabernichtdaseventuelle Autoren-Honorargemeint,sonderndieflligeAnschaffung einesneuen,modernenWunderwerksderFeinmechanik,eines Matrix-Druckers.AbernacheinergrndlichenAnalyseder Computer-KasseunddenGrndenfrdenDruckerkaufkamich zudemSchlu,dadasProblemauchSoftwaremiglsbar seinmsste. DerHauptgrundfrdenDruckerkaufwarder,endlichauchmal TexteinNLQ-QualittberdenDruckeraufdasPapierzu bringen.AlsoschauteichmirmaleinigeNLQ-Druckerbeider Arbeit(alsobeimDrucken)anundentdeckte,dadieser Druck-Moduseigentlichschonimmerungenutztinmeinem Druckerschlummerte(wiediesesNLQ-Druckenfunktioniert, dazusptermehr).AlsdasProblemerkanntwar,machteich michansWerk.DasErgebnismchteichIhnenhiermit Vorstellen. WerhatsichvonIhnennichtschongewnschtdenSchriftverkehr oderdieDiplomarbeitetc.mitdemComputerzuschreibenund dieseberdenDruckerauszugeben.Sicherlichkamdannauch gleichderFrustweildieSchriftqualittdesbewhrtenMatrix- DruckersfrdieseAufgabedanndochnichtgeeignetwar.Wohldem derdurchumlegeneinesSchalterdiebesserNLQ-Qualittanwhlen kann. FrdieanderengibtesjetztaucheineLsung:den GUTENBERG-DRUCKER. DiesesSoftwareproduktsimuliertaufIhremEpson-kompatiblen Matrix-DruckereinendermodernenNLQ-Drucker.Abernichtnur das.HabenSieschonmaleinenNLQ-Druckerserienmigdie SchriftartSCRIPTdruckensehen,oderwiewreesmitGOTIK,oder mitSAKRALodermit....?Diesallesundnochvielmehrkannder Gutenberg-Drucker.DereigenenFantasiesinddurchdenmitgelie fertenFONT-EditorkeineGrenzengesetzt.Ineiner16x16Matrix knnenbeliebigeeigeneFontserstelltwerden,diedannbeim AusdruckenvonIhremDruckerausgegebenwerden.Unddieswohlge merktineinervonIhremDruckerbishernieerwartetenQualitt. DadasGanzedannetwaslangsamervonstattengeht,wirdman DankdesErgebnisseswohlverzeihen.ImmerhinistdasAusdrucken nochfastsoschnellwiebeieinemvergleichbarenDrucker,der dieNLQ-OptionhardwaremigzurVerfgungstellt. DasDruckverfahrenistdenkbareinfach.WieSiesicherschon bemerkthaben,verwendetdiesesProgrammZeicheneinerGrevon 16x16Bildpunkten.UmdiesezugroenZeichenaufnormalesFormat zukomprimierenwirdeinkleinerTrickangewandt.Zuerstmalwird derGraphikmodusdesDruckersdazubenutzt,dieZeichenberhaupt aufdasPapierzubringen.Aberdiewrenvielzugro.Hierzu wirddieGraphikausgabeeinfachaufdoppelteDichtegeschaltet undschongehenwieder80BuchstabenineineZeile.Allerdings wiesiehtdasGanzejetztaus,schmaleabersehrhoheZeichen? Nichtbesondersschn.JetztwirdalsodervorgenannteTrick angewandt.WirzerlegendieMatrixinzweiTeileundDruckenals erstesdie1.,3.,5.usw.ZeilederMatrixaus.Jetztverschieben wirdasPapierumeinenhalbenPixelabstandnachobenundDrucken denanderenTeilderMatrix,alsodie2.,4.,6.etc.Zeile.Druch diesesleichteverschiebendesPapierstrifftderzweiteDruck vorganggenaudieLckendesvorhergehenden.DieseLckenwerden alsogeschlossenundesentstehteinmakellosesSchriftbild. SieknnenalsogetrostaufdenKaufeinesneuen,NLQ-fhigen Matrixdruckersverzichten,wenndiefehlendeNLQ-FhigkeitIhres altenGertsderausschlaggebendeGrunddafrseinsollte. JetztaberlangsamzurErklrungderbeidenProgrammeselbst.Auf derDiskettesolltensichfolgendeDateienbefinden: FONT.PRG :dasProgrammfiledesZeichensatzeditors FONT.RSC :daszugehrigeResource-File GUTENBER.PRG :dasProgrammfiledesDruckprogramms GUTENBER.RSC :daszugehrigeResource-File GUTENBER.PIC :dasHintergrund-Bild  ********.ZSZ:einigeBeispiel-Fonts AlserstessolljetztdieBedienungdesProgrammsGUTENBER.PRG erlutertwerden. BeidiesemProgrammhandeltessichumdaseigentlicheDruck programmdesProgrammpaketsGUTENBERG-DRUCKER.DerNUR-Anwender brauchtsichnurumdieBedienungdiesesProgrammszukmmern.  DieBedienungwurdemglichsteinfachgestaltet.NachdemStarten desProgrammsvomDesktopaus,durchDoppelclickaufGUTENBER.PRG wirddiesesvonDiskettegeladen.IstderLadevorgangbeendet,so versuchtdasProgrammdieDateiGUTENBER.ZSZvonDiskettezu laden.HierbeihandeltessichumeinenbeliebigenZeichensatz, dermitdiesemNamenversehenwurde.DieserZeichensatzwirdalso ohnemanuellesZutundesBenutzersautomatischmitgeladen.Der BenutzerkannsoseinenLieblings-ZeichensatzmitdiesemNamen versehen,derdannbeiProgrammstartgeladenwird.Findetder ComputerdieseDateinicht,sobrichterdiesenLadevorgangab undSiebefindensichimDesktopdesProgramms.WennSieindem MenFILEnachschauen,werdenSieentdecken,daSiezuersteinen ZeichensatzvonDisketteladenmssenbevorSiemitdemAusdruck einesDokumentsbeginnenknnen.Istdiesgeschehen,sosindalle VoraussetzungenfreineneinwandfreienProgrammlaufgeschaffen. Anmerkung:DasProgrammliestbeimAusdruckimmerca.10Zeilen vonDisketteineinenPuffer-Speicher.SinddieseZeilen ausgedruckt,sowerdendienchsten10geladen.Also unbedingtwhrenddesAusdrucksdieDiskette,aufdersich derauszudruckendeTextbefindet,imLaufwerklassen. BeimStartendesProgrammswirdeineDateiNamens GUTENBER.INFvonDiskettemitgeladen.IndieserDateisind dieEinstellungendenDruckerunddieDruckartbetreffend abgespeichert.MehrhierzuunterMenpunktSPECIAL-- EINSTELLUNGSICHERN. DieMens: FILE: LADEFONT....: DientzumLadenbeliebigerFonts, diesichaufDiskettebefinden mssen. DRUCKETEXT...:NachAnwahldiesesMenpunkts knnenSieTextedrucken,diesich aufDiskettebefinden. DiefolgendendreiMenpunktedienenzur EinstellungderauszudruckendenTextart.Bei Programmstartist'1st-Word'angewhlt. ASCII :reineASCII-TextemitUmlauten,aber ohneSteuerzeichen.  1st-Word :1st-WordTexte(auchWORDPLUS) Textomat:MitdemOutput-Programmerstellte FilesdiedieEndung'.OUT'haben. QUIT:dientzumVerlassendesProgramms FONT: NLQ:EinstellungNLQ-Modus NORMAL:NormaleSchriftbreiteinNLQ BREIT:BreitschriftinNLQ(nurnoch40Zeichen proZeilemglich) STANDARD:EinstellungStandard-Schrift(doppelte HheundBreite) NORMAL:NormaleStandardschrift(40Zeichenpro Zeileund36ZeileproSeite) SCHMAL:SchmaleStandardschrift(80Zeichenpro Zeile  HERVORGEHOBEN:HervorgehobeneStandardschrift SPECIAL: PROPORTIONAL:DieeingestellteSchriftwird linksbndigproportionalausgegeben. DRUCKERAUSWHLEN:HierknnenSieeinender  beidenmglichenDruckertypenaus- whlen.EssinddiesDruckerdie bereinenminimalenVorschubvon  1/144Inchbzw.1/216Inch verfgen.LetztererTypmuauch dasPapierzurcktransportieren Knnen. EINSTELLUNGSICHERN:DiegewhltenEinstellungen: -Druckertyp -Schriftart -Proportional -Textart werdenmittelsdiesesMenpunkts aufDisketteabgespeichert,damit sienacherneutemProgrammstart sofortwiederwiegewnschtzur Verfgungstehen. IndiesemMenistnochvielPlatzfr Erweiterungenvorhanden.  BedienungdesProgrammanhandeinerBeispiel-Sitzung: BeidiesemBeispielwirddavonausgegangen,dakein ZeichensatzGUTENBER.ZSZaufderDiskettevorhandenist. NachdemDoppel-ClickaufGUTENBER.PRGwirddasProgramm geladenundgestartet.EinAusdruckenistjetztallerdingsnoch nichtmglich,dawirnochkeinenZeichensatzindenSpeicherdes Computersgeladenhaben.Umdiesschnellstenszutunffnenwir mitdemMaus-ZeigerdasDrop-DownMenFILEundwhlendortden EintragLADEFONT.....JetzterscheinteineObjekt-AuswahlBox inderalleaufderDiskettevorhandenenZeichenstze(Filesmit derEndung.ZSZ)zurAuswahlaufgezeigtwerden.Wirwhleneinen derZeichenstzedurchDoppel-Clickaus.Daraufhinwirdieservon Diskettegeladen.NachdemLadenerscheinenaufdemDESK-TOPin demrechtenFeldeineAuswahldervorhandenenZeicheninder ausgewhltenSchriftart. Jetztknntenwirz.B.dieAusdruckartimMenFONTauswhlen. WirwollenaberimNLQ-Modusausdrucken(normaleZeichenhheund Breite,besteSchriftqualitt)welcherschonvoreingestelltist. JetztstellenwirimMenFILEdieTextartein,diewirdrucken wollen.DabeidrucktASCIIallenormalenASCII-Dateien (allerdingsimGegensatzzurDruck-MglichkeitdesBetriebssystem DesktopsmitallenUmlauten)wieProgrammlistingsetc. MitderAuswahl1st-WORDknnen1st-Wordund1st-WordplusTexte gedrucktwerden.DasProgrammachtetdabeiaufalleEinstellun gen,dieimLAYOUT-Menvon1st-Wordgemachtwurden,wieKopf-, Fuzeile,Seitenummerierung,Papiergreetc..BeiderEinstel lungTEXTOMATerwartetderGUTENBERG-DRUCKERDateienmitder Endung.OUTdiemitdemOUTPUT-ProgrammdesTextomat'serstellt werdenknnen. IstdiesallesEingestellt,sowhlenwirDRUCKETEXTumeinen dervorhererstelltenundaufDisketteabgespeichertenTexteaus- zudrucken.EserscheintwiedereineOBJEKT-AuswahlBoxinderwir dengewnschtenTextdurchDoppelclickenauswhlen.Indernun erscheinendenDialog-BoxkannnochdiePositiondeslinkenRandes beimAusdruckeneingestelltwerden(wichtigbei1st-WordDateien, dadiesesProgrammdieTexteimmerlinksandenRandklatscht). Ebensokann(nurbei1st-WordDateien)derBeginnder Seitennummerierungangegebenwerden. JetztsolltenwirdieseDIALOG-BoxdurchAnklickenvonDRUCKEN (odereinfachRETURNaufderTastaturdrcken)verlassen.Ist unserDruckerjetztordnungsgemangeschlossenundeingeschal tet,wirdjetztnochderZeichensatznachdenvonunsgemachten EinstellungenimFONT-MenindasrichtigeFormatgebracht.Diese KonvertierungwirdnurbeiProgrammstartoderbeieinernderung desFormatsundbeimLadeneinesneuenZeichensatzesgemacht. WollenSiemehrereTextemitdergleichenEinstellungausdrucken, somuderZeichensatznatrlichnichtmehrkonvertiertwerden. Istdiesallesvollendet,wirddasAusdruckengestartet.Dieses AusdruckenknnenwirjederzeitdurcheinenTastendruckjeweils zumEndeeinerZeilestoppen.Umeinversehentlichesstoppendes Ausdruckszuvermeiden,mumandiesenWunschnocheinmal besttigen. AlskleinesSCHMANKERLknnenSieIhreBriefeetc.auchin Proportionalschriftausgebenlassen.Leideristhierbeinurein linksbndigesAusdruckenmglich.IchhabedieProgrammierung einessicherlichinteressantenBlocksatzesbegonnen,aberdies dannwegendesdochrechthohenRechenaufwandeswieder fallenlassen,dennesmtedergesamteTextneuformatiert werden.OftistgeradediesvomAnwendernichtgewnscht. DieswardaswichtigstezurBedienungdesDRUCK-PROGRAMMS GUTENBERG-DRUCKER. ------------------------------------- JetztwendenwirunsereAufmerksamkeitderBedienungdes ZEICHENSATZEDITORSFONT.PRGzu. DerFont-EditordientzumErstellenundEditierenvon Zeichenstzen.MitdemFont-Editorkannjedesder256vomATARI bereitgestelltenZeicheneditiertwerden.Dieserklrtvieleicht dieGrederZeichensatz-Dateiendieimmerhinfast12kBytelang sind.EinweitererGrundfrdieGredieserDateienistdie GrederZeichenmatrixvon16x16Pixeln,diedieseDateienauch inkompatibelzuDEGASundGEMZeichenstzenmacht.Wieschonbei denErluterungenzumGutenberg-DruckerHauptprogrammerwhnt, istdieseMatrixgreaberfrdieQualittdesAusdrucks ausschlaggebend. DerZeichensatz-Editorist,wieauchdasHauptprogramm GUTENBER.PRGnurmitdemMonochromMonitorSM124lauffhigund vollGEMuntersttzt.brigenswurdedieMglichkeitAccessories aufzurufenbeidenbeidenProgrammenverbautumeineBeschdigung deswichtigenHintergrundsdurcheinschlechtProgrammiertes Accessoryzuverhindern.Auerdemisteinesolche HintergrundverwaltungbeieinemGraphikschirmnichtunbedingt einfachzuProgrammieren(esmu'vor'jedemAccessory-Aufrufder Hintergrundgepuffertwerden). AberjetztzuvielwichtigerenDingen,wiedemBildschirmaufbau desFont-Editors.DerBildschirmwirdzu2/3vonderZeichensatz- Tafelbelegt.JedesZeichen-FeldindieserTafelbestehtausder eigentlichenZeichen-Matrix(beiProgrammstartnatrlichnoch leer)unddarberdementsprechendenZeichenausdemSystem-Font demdieseMatrixbeimAusdruckenzugeordnetwird.Umeinesolche Zeichen-Matrixzueditieren,klickenSiemitderMauseinfachin dasgewnschteZeichen-Feld.Jetzterscheintdasentsprechende ZeichenininverserDarstellung.GleichzeitigwirddieMatrix diesesZeichenfeldesnachlinksindasEditierfeldkopiertund dabeivergrert.JetztkanndurchAnklickendereinzelnenFelder desEditierfeldesPunktfrPunktgesetztwerden.DieserPunkt erscheintauchrechtsinderangewhltenZeichen-Matrixals einzelnesPixel.SoknnenSiejetztIhreZeicheninbeliebiger Formerstellen.UmeinenPunktzulschenklickenSieeinfachauf dasRadiergummi-IconundschonhatderMauszeigerdieFunktion einesRadierers.WennSiejetztwiederPunktesetzenwollen,so klickenSieaufdasPinsel-SymbolundIhrMauszeigerhatwieder dieursprnglicheFunktion. JetztmchteichdieeinzelnenDrop-DownMensaufzhlen (natrlichauchihreInhalte)undderenjeweiligeFunktionkurz erlutern. FILE LADEFONT... :  EserscheinteineObjekt-Auswahl BoxausdereinbeliebigerZeichen- satzmitderEndung.ZSZausgewhlt unddamitgeladenwerdenkann. SICHEREFONT : DervorhergeladeneFontwirdunter demgleichenNamenwiederabge- speichert.Vorsicht:eswirdauch abgespeichertwennderZeichensatz imSpeichergelschtwurde. SICHEREALS... : DergeradebearbeiteteZeichensatz wirduntereinemeinzugebenden NamenaufDisketteabgelegt. DRUCKEFONT :  DieserMenpunkterzeugteinen BeispielausdruckdesimSpeicher befindlichenZeichensatzesaufdem Drucker.SiehabendieWahlden NLQ-ModusoderdenNormal-Moduszu whlenoderaberdasGanzeabzu- brechen.  LSCHEFONT :  LschtdenganzenZeichensatzder sichim Speicherbefindet.Keine Gefahr,denndieserWunschmuin einerSicherheitsabfrageerstnoch besttigtwerden.  QUIT  : NacheinerSicherheitsabfragewird dasProgrammverlassen.  EDIT DieFunktionendiesesMensbeziehensichalleaufdas Editierfeld. V-SPIEGELN : SpiegeltdieMatrixvertikal H-SPIEGELN : SpiegeltdieMatrixhorizontal FLLEN : FlltMatrixmitschwarzenPixels aus  LSCHEN : FlltMatrixmitweienPixelsaus INVERTIEREN : invertiertdieMatrix,d.h.alle weienPixelswerdenschwarzund umgekehrt KOPIEREN : AlserstesrechtsinderZeichen- tafeldasQuell-Zeichenfeldund danachdasZiel-Zeichenfeldan- klickenunddieQuell-Matrixwird indieZiel-Matrixkopiert. MOVE DieseFunktionenbeziehensichnuraufdasEditierfeld. DurchAuswahleinerdervierFunktionen,wirdder InhaltdesEditierfeldesindieangegebeneRichtung verschoben.Vorsicht:PixelreihendieberdasEditier- feldhinausgeratengehendabeiverloren.  MARK SETZEMARKIERUNG :NachAuswahldiesesMenpunktes ercheinteineDialogboxdiezumsetzenund lschenvonMarkierungsstrichenindem Editierfelddient.DiesesMarkierungsstriche erleichterndasEinhaltendermaximalen Buchstabengren.Zudenmaximalen BuchstabengrenschauenSiesichambesten dieBeispiel-Zeichenstzeeinmalan.So solltemindestenslinksoderrechtseine Pixelspaltefreibleiben,dasonstdie BuchstabenbeimAusdruckenverlaufen. DieeingestelltenMarkierungenknnenauf Disketteabgespeichertwerden(aufdieDisk vonderdasProgrammgestartetwird).Wurde diesgemacht,sowirddieeingestellte MarkierungnachjedemProgrammstart automatischgesetzt. Ichhoffe,dameineErluterungenzurBedienungderbeiden ProgrammeGUTENBER.PRGundFONT.PRGausreichtundSiegefallenan dieserArtdesDruckensgefundenhaben. MatthiasBaldauf,20.Mrz1987 (Version1.1vom16.April1987) `\J o"h###,Ic.N//Bg?<JNA BbByNNVN N^NuNVN XN^NuNV?.N $N^ _ONNV/./. /./.N N^ _ONNV/./. /.N :N^ _O NNV?.N N^ _ONNV?.N N^ _ONNV?.?. N =@N*NNN^,_ _OPN/,HNVNVA-H?<N -@N^,_Nu/,HNVNVAB01|A-Hp=@A!O"Op "QA!@O"Op "QN09!h|r|AfJHy?.N4?<HN4XBnHnBHy t?0.F@eHnB?<PHnN(NXp.=@p=@=n0.nnFN Hn? aF312@pN^NuNV>a*pN^NuNV32# 24>4N N^NuNV#24# 28>ZN n01B@091N^NuNV>MN n01 n 01 n01 n01B@091N^NuNV32# 24>NN N^NuNV32>kN N^NuB9*t`P*t _0g$_jp"_// H*vNL*vJ@fP)J9*tf" f |` f|` f |` f|`4<G BQB) @ef *:f^&Jrt `e QGjtWJBk4G3 J9*tf g g`> g8 fp@`*S@rG   e gRAQJ9*tg`tJ)f8/ Hy?< NA\"_J9*tf|#|3|Nu|Nu )bJ) g )g )g ) f J9*tfgZBNu|/ BgHi ?<ANA>3|NAXNu _4` _t6 Bo r aSB`2aNH?L _r ar a/L?LNu _r aN _4` _t"x0HgJJjDxvCzp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCp0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtClBSCr aQSBk aQN _v` _60@d Ct`CtClBSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH <"oA/ NL \1j@^1j:`([g1j6d1j8b`BhbBhd1|F1|@Bh6!|,l1|@pNa"hBQ$hB5| Nua Nu&_a$h\BZ4"_p$Q"_p$Q N&_a$_ N&_a$_ _20 N&_an1_>1_<1_:1_81_6h6N , $   0t8N2" 2$&* xj(  ("  *.   . X    $      HL@>2J  2 0 0"p  ( *@ B @ N  ( & . af.. BILD_1 GEM [ F zBILD_2 GEM DF BILD_3 GEM GF d/ 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  d q @p ddddldddd ddd'djdkd dddhdccjc 'ckc c c  @t [Steuerzeichen-Tabelle  j   ! e[Die Zahlen bedeuten ASCII-Codes      l[12 Formfeed     - o[25 Variable Trennung (1st Wordplus)     ' s[27 Style change (siehe unten)     3 v[28 Stretch Space (bei Indent oder Center)      y [29 Indent Space      } [30 Variable Space     ! [31 Format Zeile folgt      [32 Fixed Space  j     [Style Change Tabelle  j    [Als erstes kommt ein ESC (27)      [danach:      *[154 Bold      [136 Unterstrichen      *[132 Italic      [137 Bold-Unterstrichen      [133 Bold-Italic     % [141 Bold-Italic-Unterstrichen      @[130 Light      [138 Light-Unterstrichen     & [142 Light-Unterstrichen-Italic      [144 Superscript      \[160 Subscript       [128 Normalschrift  j k     (#[Bild 2  d q @p ddddldddd ddd'djdkd dddhdccjc 'ckc c c  EFFormat-Zeilen  j   & Format-Zeilen beginnen mit dem ASCII     ( Code 31. Danach als Zeichen (nicht als      ASCII-Code):      0 Layout Daten Zeile      1 Kopf-Zeile       2 Fuss-Zeile     2 9 Format-Zeile (Textbreite, Tabulatoren)  j    u Format-Zeile (9)  j   6 ~Der Inhalt einer Format-Zeile kann ignoriert werden,     4 wichtig ist nur die Position der zweiten, eckigen     - Klammer ']', die die Zeilenbreite bestimmt.  j    Q Kopf- und Fusszeile  j    < z.B. 1@written by Matthias Baldauf@Seite #@Alles klar  j   4 ~der Klammeraffe soll den ASCII-Code 31 darstellen:  cPccclcccxcQcPcxcQcPc00cQcPc000cQcPc00cQcPcX0XcQcPc0( 0cQcPc0@0cQcPc0cQ c  RKopf-Zeile       1) and (ord(line[1]) = 31)) then begin case line[2] of '0' : begin { Layout Daten } { Hier werden die Layout-Daten } { herausgefiltert. Die eingelesene } { Linie wird also nach der '0' in } { Teile zu je 2 Zeichen zerlegt. } { Diese 2 Zeichen werden dann in einen } { Zahlenwert umgerechnet } end; '1' : begin { Kopfzeile, eventuell mit # als Seitenzhler } { Hier werden die einzelnen Teile der Kopf-Zeile } { herausgefiltert und jeweils einem String zu- } { gewiesen } end; '2' : begin { Fusszeile, eventuell mit # als Seitenzaehler } { Genauso wie bei der Kopf-Zeile } end; '9' : begin { Formatzeile mit Tabulator-Zeichen } pap_breit := pos(']',line) - 2; { Druckbreite festl. } end; end; end else begin if ((length(line) > 0) and (ord(line[1]) = 12)) then begin { Formfeed -> Vorschub } { Vorschub bis Foot-Marke } { Fuzeile drucken und Seitenzhler erhhen } { Zeilenzhler auf 0 } end; if pap_zeil = pap_len-pap_foot-pap_bof then begin { Seite voll -> Vorschub } { Fuzeile drucken und Seitenzhler erhhen } { Zeilenzhler auf 0 } end; if pap_zeil < 1 then { Es ist wohl Zeit einen - } begin { Kopf auszudrucken } kopf; pap_zeil := pap_tof+pap_head; { Kopf gedruckt -> Zeilen- } end; { zhler setzen } ganz_zeil := ''; lang:=length(line); { Wie lang ist denn die Zeile ? } for i := 1 to lang do begin zei:=copy(line,i,1); { Aktuelles zeichen holen } zeich := ord(zei[1]); { ASCII-Code } if flag = 1 then { Aha, jetzt kommt ein Style change } flag := 0 else if zeich > 31 then { Alles in Ordnung, also hinzufgen } ganz_zeil := concat(ganz_zeil,chr(zeich)) else { Ansonsten mal testen was anliegt } case zeich of 25 : { Variable Trennung } 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; { jetzt die Zeile ausgeben } print_line(ganz_zeil); pap_zeil := pap_zeil + 1; { Wieder eine Zeile gedruckt } end; end; if eof(fil) then { Was, Text schon zu Ende ? } begin { Noch schnell Vorschub bis Fu - } { Fuzeile ausdrucken - } quit := true; { und jetzt ist Feierabend } end; if keypress then { Was soll der Quatsch - } begin { Abbrechen wo es gerade Spa macht? } { wollen Sie wirklich abbrechen } { Wenn ja, dann 'Okay, berzeugt' quit := true; ansonsten weiter } end; until quit = true; { solange weiter bis Abbruch oder Ende } close(fil); { Text-Datei schliesen } rewrite(output,'CON:'); { Standart-Ausgabe auf Konsole lenken } end; { Ende von st_word_print } {************************************************ ** L I S T I N G 2 ** ** ** ** OBJECT-Darstellung unter CCD-Pascal ** ** ** ** written by M.Baldauf 3/87 ** ** ** ************************************************} { DATENSTRUKTUREN } TYPE ted1 = PACKED RECORD { TEDINFO-Struktur } te_ptext:long_integer; { Zeiger auf auszugebenden Text } te_ptmplt:long_integer; { Zeiger auf Eingabe-Schablone } te_pvalid:long_integer; { Zeiger auf zugelassene Eingabeart } te_font:integer; { Normaler oder kleiner Zeichensatz } te_junk1:integer; { Reserviert } te_just:integer; { Textformatierung - links,rechts...} te_color:integer; { Bestimmung der Farbe } te_junk2:integer; { Reserviert } te_thickness:integer; { Dicke der Rechteckumrandung } te_txtlen:integer; { Lnge des Strings ^te_ptext } te_tmplen:integer { Lnge des Strings ^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; { nchstes Object } ob_head:integer; { Anfangsobject } ob_tail:integer; { Endobject } ob_type:integer; { Art des Objects } ob_flags:integer; { Whlbarkeit von Objecten } ob_state:integer; { Zustand des Objects } ob_spec:long_integer; { Objectspezifikation } ob_x:integer; { Object X-Koordinate } ob_y:integer; { Object Y-Koordinate } ob_width:integer; { Objectbreite } ob_height:integer { Objecthhe } END; object_typ = RECORD CASE boolean OF FALSE: (object_tree:long_integer); TRUE : (p_obj:^ob1) END; { ---------------------------------------------- } { NOTWENDIGE PROZEDUREN } {********************* ** 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; {**************************************** ** Objecttext holen ** ****************************************} 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; {**************************************** ** Objecttext setzen ** ****************************************} 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; {**************************************** ** Objectstatus holen ** ****************************************} 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 nicht angewhlen ** *******************************} procedure desel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,0,1); END; {*********************** ** Object anwhlen ** ***********************} procedure sel_obj(tree:long_integer; which:integer); BEGIN objc_change(tree,which,0,xdesk,ydesk,wdesk,hdesk,1,1); END; {********************************************** ** Diese Function stellt Dialog-Boxen dar ** **********************************************} 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); { Es werden die Koordinaten des} { angegebenen Objectbaumes be- } { rechnet, so da dieser in der} { Mitte des Bildschirms er- } { scheint. } form_dial(0,x,y,w,h,xdial,ydial,wdial,hdial); { Reservierung des Bildschirm- } { speicherbereichs } form_dial(1,x,y,w,h,xdial,ydial,wdial,hdial); { Zeichnen eines sich aus- } { dehnenden Kastens } objc_draw(tree,0,30,xdial,ydial,wdial,hdial); { Zeichnen des Objectbaums } obj := form_do(tree,def); { Formularberwachung durch das} { AES. } hndl_dial := obj; form_dial(2,x,y,w,h,xdial,ydial,wdial,hdial); { Zeichnen eines schrumpfenden } { Kastens } form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); { Freigeben des reservierten } { Bildschirmspeichers } END; { ---------------------------------------------- } { EIN BEISPIEL - AUFRUF } { Die Grogeschriebenen Worte sind Konstanten aus dem vom RCS erzeugten } { Pascal - Include File zu dem jeweiligen Resource-File. Dieses Include } { File mu im CONST - Vereinbarungsteil des Pascal-Programms mittels } { Include {$I name.I } hinzugefgt werden. } procedure about_prg; var tree:long_integer; dummy,obj,status:integer; begin set_text(UEBER, DRUCKRND,'Matthias'); { Setzt Text 'Matthias' in TEDINFO - } { Struktur DRUCKRND in dem Object - } { Baum UEBER } set_text(UEBER, SEITE,'Baldauf'); { Setzt Text 'Baldauf' in TEDINFO - } { Struktur SEITE in dem Object-Baum } { UEBER } dummy := rsrc_gaddr(0, UEBER, tree); { Hier wird die Adresse der OBJECT - } { Struktur UEBER geholt und an 'tree' } { zugewiesen. } obj := hndl_dial(tree,0,320,200,1,1); { Die Prozedur 'hndl_dial' wird auf- } { gerufen. Sie bernimmt die Programm-} { Kontrolle bis der Benutzer einen } { Exit-Knopf bettigt. } { Zurck kommt der Index des Exit- } { Buttons } desel_obj(tree,obj); { Der angeklickte EXIT-Button wird } { 'abgewhlt' . } get_text(UEBER, DRUCKRND,str_1); { Holt Text aus TEDINFO-Struktur } { DRUCKRND aus der OBJECT-Struktur } { UEBER und weist ihn dem String str_1 } { zu. } status := get_state(UEBER, OK_BUTTON);{ Holt den Object-Status des OK_BUTTON } { aus der OBJECT-Struktur UEBER } end; { ENDE DES BEISPIEL-AUFRUFS } . %af.. FONT I F ~FONT PAS 9F lGUTENBERI }F %GUTENBERPAS F '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 *) { Font-Editor ist Teil des Programmpakets } { GUTENBERG-DRUCKER fr ATARI ST Computer } { } { FONT.PRG (c) July 1986 by MKB-Soft M.Baldauf } { } { letzte nderung : 02.05.1987 } {$U70} program FONT_EDIT; CONST mu_mesag = 16; mu_button = 2; { Das Include File FONT.I enthlt Werte die vom RSC kommen } {$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 in dem Daten fr die beiden - } x_spot:integer; { Icons abgelegt werden } 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 schreiben mit der 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; {************************************************* ** Umwandlung 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; {************************************************* ** Umwandlung 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; {************************************************* ** LINIE ziehen mit der LINEA Routine 'LINE' ** *************************************************} procedure linef(x1,y1,x2,y2:integer); begin line(x1,y1,x2,y2,1,0,0,0,$FFFF,0); end; {************************************** ** INFOZEILE in das Window setzen ** **************************************} procedure set_infozeil(st:string); { Infozeile des Windows setzen } 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; {***************************************** ** angewhltes Feld kenntlich machen ** *****************************************} 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; {******************************************** ** angewhltes Zeichen kenntlich machen ** ********************************************} 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; {*********************************** ** Rechteck mit LINEA zeichnen ** ***********************************} 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; {********************************************* ** Soll gelscht oder gezeichnet werden? ** *********************************************} 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; {************************************************************** ** Hier wird in der Zeichenmatrix vom Benutzer herumgemalt ** **************************************************************} 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; {****************************************************** ** Kopieren eines Blocks : 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; {*********************************************************************** ** Die Folgenden Prozeduren dienen zum Setzen der Markierungslinien ** ***********************************************************************} 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; {******************************************************************** ** Vor dem Programmstart mu schon einiges Initialisiert werden ** ********************************************************************} 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]; { Punkt loeschen } 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]); { Punkt setzen } 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]); { Jetzt kommen die ICON - Daten fr 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; { Markierung ist erstmal ausgeschaltet } mark_li := 1; mark_re := 11; mark_ob := 1; mark_un := 15; reset(fil,'FONT.DAT'); { Mal sehen, ob Markierungsdaten abgesaved sind } 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 { Die Markierungen sollen also doch eingeschaltet } begin { werden } 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); { Druckertreiber } 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)); { Druckertreiber-Ende } 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; {************************************************************ ** Nun kommen ein paar Routinen fr das 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; {*********************************************************** ** Warten bis Maustaste gedrckt bzw. losgelassen wird ** ***********************************************************} procedure click; (* wartet bis linke Maustaste gedrueckt wird *) begin evnt_button(1,1,1,mausx,mausy,dummy,dummy); end; procedure un_click; (* wartet bis linke Maustaste losgelassen wird *) begin evnt_button(1,1,0,mausx,mausy,dummy,dummy); end; {************************************************** ** Manchmal ist auch eine ALERT-Box notwendig ** **************************************************} 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; {********************************************************** ** Auch das RESOURCE-FILE will extra eingeladen werden ** **********************************************************} 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][Raubkopierer, was?|Ohne .RSC luft das|Programm nicht.][ PECH ]'; 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][Es ist ein Fehler|mit dem .RSC-File|aufgetreten !!][SCHADE]'; ready:=alert(1,str); load_rsc := 1; end; end; {************************************************** ** Object-Button wird angewhlt bzw. gelscht ** **************************************************} 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; {************************************************ ** Diese Routine regelt das 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; {***************************************************************** ** Eine Steuerung einer File-Select-Box ist auch interessant ** *****************************************************************} 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; {****************************************************************** ** Der Zeichensatz mu auch auf den Bildschirm gebracht werden ** ******************************************************************} 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; {********************************************************************* ** Der Zeichensatz wird vom Bildschirm geholt und fr das Absaven ** ** oder Ausdrucken vorbereitet ** *********************************************************************} 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; {*************************************************** ** Einladen eines Zeichensatzes in den Speicher ** ***************************************************} procedure load_font; var i,n,mem,flag:integer; datei:file of long_integer; begin show_file(fs_iinsel,fs_iinpath); set_infozeil(' Zeichensatz... laden --Bitte warten--'); 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(' Zeichensatz... konvertieren --Bitte warten--'); 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][Diesen Zeichensatz|habe ich nicht|gefunden !][ ABBRUCH ]'; ready:=alert(1,str); end; close(datei); end; set_infozeil(' '); end; {*************************************** ** Abspeichern eines Zeichensatzes ** ***************************************} procedure save_font; var i,n,mem,flag:integer; datei:file of long_integer; begin select_char(select); set_infozeil(' Zeichensatz konvertieren --Bitte warten--'); compile_font; graf_mouse(2); set_infozeil(' Zeichensatz abspeichern --Bitte warten--'); 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(' Zeichensatz abspeichern unter dem Namen ...'); show_file(fs_iinsel,fs_iinpath); if fs_iexbutton = TRUE then begin save_font; end; set_infozeil(' '); end; {*************************************************** ** Zeichensatzes fr den NLQ-Druck vorbereiten ** ***************************************************} procedure convert_nlq; var i,n,g,z,za:integer; flag:long_integer; begin set_infozeil(' Zeichensatz ausdrucken --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; {******************************************************* ** Zeichensatzes fr den Einfach-Druck vorbereiten ** *******************************************************} procedure convert_norm; var i,n,g,z:integer; flag:long_integer; begin set_infozeil(' Zeichensatz ausdrucken --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; {***************************************** ** Kompletten Zeichensatz ausdrucken ** *****************************************} 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(' Zeichensatz ausdrucken'); error := rsrc_gaddr(0, DRUCKE, tree); obj := hndl_dial(tree,0,320,200,1,1); if obj <> ABBRUCH then begin str:='[1][Bitte schalten|Sie Ihren Drucker|ein !][OK|ABBRUCH]'; ready:=alert(2,str); if ready = 1 then begin i := bcostat(0); if i = -1 then begin set_infozeil(' Zeichensatz ausdrucken --Compile Font--'); compile_font; graf_mouse(2); if obj = NLQ then convert_nlq else convert_norm; zaehler := 0; rewrite(output,'PRN:'); write(pr_init); { Drucker - Reset } set_infozeil(' Jetzt wird gedruckt --Taste zum abbrechen--'); i := 0; while ((i < 10) and (keypress <> true)) do begin i := i + 1; if obj = NLQ then write(pr_vor_halb) {Zeilenvorschub 1/2 Pixel} else write(pr_vor_acht); { Zeilenvorschub 8 Pixel } for g := 1 to 2 do begin if obj = NLQ then {HRG 300 Spalten} write(concat(pr_hrg_dopp,chr(44),chr(1))) {HRG doppelt} else write(concat(pr_hrg_norm,chr(44),chr(1)));{HRG einfach} 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-Vorschub} end; rewrite(output,'CON:'); graf_mouse(0); end else begin str:='[1][Bitte Drucker und|Kabel berprfen !!][ABBRUCH]'; ready:=alert(1,str); end; end; end; set_infozeil(' '); end; {************************************************************************* ** Die folgenden Prozeduren verndern (entsprechend ihrem Namen) die ** ** Zeichenmatrix entsprechend Ihren Wnschen ** *************************************************************************} procedure v_spiegel; var i,n,flag,mem:integer; begin hide_mouse; mem := modus; set_infozeil(' Zeichen vertikal Spiegeln'); 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(' Zeichen horizontal Spiegeln'); 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(' Zeichenmatrix mit Punkte fllen'); 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(' Zeichenmatrix lschen'); 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(' Zeichenmatrix invertieren'); 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(' Matrix kopieren von:'); 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(' Programm beenden'); str:='[1][Sind Sie sicher,|da alle Daten|gespeichert sind?][NEIN|JA]'; ready := alert(1,str); set_infozeil(' '); until ready = 2; end else begin graf_mouse(0); str:='[1][Dieses Programm luft|nur auf dem Mono-Screen|SM124!][SCHADE]'; ready:=alert(1,str); end; end; close_window; END. 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 *) { GUTENBERG-DRUCKER ist Teil des Programmpakets } { zum Drucken von NLQ und anderen Schriften auf } { EPSON-kompatiblen Druckern. } { Hierzu gehrt auch FONT.PRG zum editieren der } { Zeichenstze } { GUTENBERG (c) Juli 1986 by MKB-Soft M.Baldauf } { } { letzte nderung am : 16.04.1987 } { } { ** VERSION 1.1 4/87 ** } { Jetzt noch 70 kByte des Speichers fr eventuelle Malloc-Aufrufe freigeben } {$U70} { und schon kann das Programm beginnen } program GUTENBERG_DRUCKER; { Zuerst sind die Konstanten dran, nur wenige } CONST mu_mesag = 16; mu_button = 2; {$I GUTENBERG.I} { Nach den Konstanten kommen bekannterweise die Typen dran } 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 { Dieser RECORD wird zur Fenster-Restaurierung - } g_x:integer; { gebraucht } g_y:integer; g_w:integer; g_h:integer; END; ted1 = PACKED RECORD { Wichtig zur Object-Behandlung } 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 { Wichtig zur Object-Behandlung } CASE boolean OF FALSE: (ted_tree:long_integer); TRUE : (p_ted:^ted1) END; ob1 = PACKED RECORD { Wichtig zur Object-Behandlung } 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 { Wichtig zur Object-Behandlung } CASE boolean OF FALSE: (object_tree:long_integer); TRUE : (p_obj:^ob1) END; copy_type = RECORD { Dies brauchen wir fr das 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; { Nun folgt die Deklaratione der vielen ntigen Variablen } 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; { Eine Menge Prozedur-Deklarationen fr GEM- und Systemaufrufe } 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; {*************************************************** ** Wandlung einer INTEGER-Zahl in einen String ** ***************************************************} procedure itoa(n:integer); {liefert Ergebnis in 'str' zurueck} 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; {**************************************** ** Objecttext holen ** ****************************************} 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; {**************************************** ** Objecttext setzen ** ****************************************} 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; {**************************************** ** Objectstatus holen ** ****************************************} 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; {************************************************** ** Wandlung eines Strings in eine INTEGER-Zahl ** **************************************************} 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; {******************************************************* ** Titelbild wird in den Bildschirm-Puffer geladen ** *******************************************************} 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; {********************************************************** ** Wandlung eines Strings in ein 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; {**************************************** ** und das Ganze auch mal umgekehrt ** ****************************************} 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; {******************************************************************* ** Kopieren eines Blocks vom SOURC- nach dem 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; {**************************************** ** und das Ganze auch mal umgekehrt ** ****************************************} 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; {********************************************* ** Zwei Prozeduren zur Object-Behandlung ** *********************************************} 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; {*********************************************************************** ** vor dem Programmstart gibt es auch eine Menge zu initialisieren ** ***********************************************************************} 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]; {##############################################################################} {Druckertreiber} pr_init := concat(chr(27),chr(64)); { Drucker-Initialisierung } pr_vor_halb := concat(chr(27),chr(51),chr(1)); { Vorschub auf 1/144 Inch } pr_vor_wahl := concat(chr(27),chr(65),chr(11)); { Vorschub auf 11/72 Inch } pr_vor_acht := concat(chr(27),chr(65),chr(8)); { Vorschub auf 8/72 Inch } pr_hrg_dopp := concat(chr(27),chr(76)); { Graphik doppelte Dichte } pr_hrg_norm := concat(chr(27),chr(75)); { Graphik einfache Dichte } pr_vor_norm := concat(chr(27),chr(50)); { Vorschub 1/6 Inch } { Folgendes nur fr ** NL-10 ** } pr_vor_halb_nl := concat(chr(27),chr(51),chr(2));{ Vorschub auf 2/216 Inch } pr_zur_halb_nl := concat(chr(27),chr(106),chr(4));{ 4/216 Inch zurck } {Druckertreiber bis hierher} {##############################################################################} druck := 1 ; { Voreinstellung Druck-Art auf NLQ } prop := 0 ; { Voreinstellung keine Proportionalschrift } stand := 1 ; small := 1 ; rand := 8 ; { Voreinstellung Rand auf 8 } zsz := 0 ; { kein Zeichensatz compiliert } st := 1; { 1st Word } nl_10 := 1; { NL-10 Drucker ausgewhlt } { Nachschauen ob Standard-Einstellung auf Diskette } reset(fil,'GUTENBER.INF'); if not eof(fil) then begin readln(fil,st); { Textart } readln(fil,prop); { Proportional } readln(fil,nl_10); { Druckertyp } readln(fil,druck); { Druck-Art } readln(fil,small); { NLQ-Art } readln(fil,stand); { Standard-Art } close(fil); end; { Alle Einstellungen vornehmen } 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-Texte } 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; { Voreinstellung Seitenzhler } 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; {************************************************* ** Diverse Prozeduren zur Window-Darstellung ** *************************************************} 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; (* Namenszeile *) 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; {************************************************** ** auch ALERT-BOXEN werden manchmal gebraucht ** **************************************************} 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; {******************************************************** ** eine Resource-Datei will auch mal geladen werden ** ********************************************************} 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][Raubkopierer, was?|Ohne .RSC luft das|Programm nicht.][ PECH ]'; 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][Es ist ein Fehler|mit dem .RSC-File|aufgetreten !!][ SCHADE ]'; ready:=alert(1,str); load_rsc := 1; end; end; {********************************************** ** Diese Function stellt Dialog-Boxen dar ** **********************************************} 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; {****************************************** ** auch der Autor will genannt werden ** ******************************************} 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; {********************************************* ** Welchen Drucker haben Sie doch gleich ? ** *********************************************} 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; {***************************************************************** ** Eine Steuerung einer File-Select-Box ist auch interessant ** *****************************************************************} 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; {********************************************* ** Ein Pixel will erstmal gesetzt werden ** *********************************************} 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; {********************************************************** ** wird gebraucht um Font auf dem Screen darzustellen ** **********************************************************} 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; {**************************************** ** Einlesen einer Zeichensatz-Datei ** ****************************************} 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][Diesen Zeichensatz|habe ich nicht|gefunden !][ABBRUCH]'; ready:=alert(1,str); end; close(datei); graf_mouse(0); end; end; {********************************************************** ** Der Zeichensatz wird fr den NLQ-Druck vorbereitet ** **********************************************************} 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; {************************************************************** ** Der Zeichensatz wird fr den Einfach-Druck vorbereitet ** **************************************************************} 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; {*************************************************************************** ** Wenn eine Zeile nur aus Leerzeichen besteht wird sie nicht gedruckt ** ***************************************************************************} 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; {************************************************** ** Druck-Routine fr Proportionalen NLQ-Druck ** **************************************************} 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 Geminie 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; {****************************************************** ** Druck-Routine fr Proportionalen Einfach-Druck ** ******************************************************} 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; {*********************************** ** Druck-Routine fr NLQ-Druck ** ***********************************} 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 Geminie 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; {*************************************** ** Druck-Routine fr Einfach-Druck ** ***************************************} 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 Konvertier Routine (c) by MKB-Soft ** ** ** ** Diese Routine kann abgendert auch fr ** ** eigene Entwicklungen benutzt werden. ** ** ** **************************************************} 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); { Ausdrucken einer Zeile je nach } begin { eingestellten Schriftwnschen } 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; { Erzeugen der Kopfzeile } 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); { Zusammenstellen der Kopf-Zeile } poit := pos('#',kopf_left); { Suche nach dem Seitenzhler } 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); { Suche nach dem Seitenzhler } 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); { Suche nach dem Seitenzhler } 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; { Zusammenstellen der Fuzeile } 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); { Zusammenstellen der Fu-Zeile } poit := pos('#',fuss_left); { Suche nach dem Seitenzhler } 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); { Suche nach dem Seitenzhler } 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); { Suche nach dem Seitenzhler } 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; { 10 Zeilen von Diskette einlesen } 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 { Begin von 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); { oeffne Datei } rewrite(output,'PRN:'); { Leite Ausgaben auf Drucker } 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 Daten } 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); { Beschreibbare Seitenlnge berechnen } end; '1' : begin { Kopfzeile, eventuell mit # als Seitenzhler } 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 { Fusszeile, eventuell mit # als Seitenzaehler } 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 { Formatzeile mit Tabulator-Zeichen } pap_breit := pos(']',line) - 2; end; end; end else begin if ((length(line) > 0) and (ord(line[1]) = 12)) then begin { Formfeed -> Vorschub } 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 { Seite voll -> Vorschub } pap_zeil := 0; fuss; seite := seite + 1; end; if pap_zeil < 1 then { Es ist wohl Zeit einen - } begin { Kopf auszudrucken } kopf; pap_zeil := pap_tof+pap_head; { Kopf gedruckt } end; ganz_zeil := ''; lang:=length(line); { Wie lang ist denn die Zeile ? } for i := 1 to lang do begin zei:=copy(line,i,1); { Aktuelles zeichen holen } zeich := ord(zei[1]); if flag = 1 then { Aha, jetzt kommt ein Style change } flag := 0 else if zeich > 31 then { Alles in Ordnung, also hinzufgen } ganz_zeil := concat(ganz_zeil,chr(zeich)) else { Ansonsten mal testen was anliegt } case zeich of 25 : { Variable Trennung } 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; { jetzt die Zeile ausgeben } print_line(ganz_zeil); pap_zeil := pap_zeil + 1; { Wieder eine Zeile gedruckt } end; end; if eof(fil) then { Was, Text schon zu Ende ? } begin { Noch schnell Vorschub bis Fu - } for ii := pap_zeil to pap_len-pap_foot-pap_bof-1 do print_line(''); fuss; { Fuzeile ausdrucken - } quit := true; { und jetzt Feierabend } end; if keypress then { Was soll der Quatsch - } begin { Abbrechen wo es gerade Spa macht? } str := '[1][Sind Sie sicher,|da Sie abbrechen|wollen?][JA|NEIN]'; ready:=alert(2,str); if ready = 1 then quit := true; { Okay, berzeugt } end; until quit = true; { solange weiter bis Abbruch oder Ende } close(fil); { Datei schliesen } form_dial(3,x,y,w,h,xdial,ydial,wdial,hdial); dest_sourc(xdial,ydial,wdial,hdial); { Hintergrund restaurieren } write(pr_init); rewrite(output,'CON:'); { Standart-Ausgabe auf Konsole lenken } graf_mouse(0); { Maus-Cursor = Pfeil } end; { end von st_word_print } {*************************************** ** Jetzt soll wohl gedruckt werden ** ***************************************} 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 { normale ASCII-Dateien drucken } reset(fil,dateiname); { oeffne Datei } rewrite(output,'PRN:'); { Leite Ausgaben auf Drucker } 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][Sind Sie sicher,|dass Sie abbrechen|wollen?][JA|NEIN]'; 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][Bitte Drucker und|Kabel berprfen !!][ Abbruch ]'; i := alert(1,str); end; end; end; end; {*********************************************** ** Was wurde im DROP-DOWN-MEN angeclickt? ** ***********************************************} 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; { breit } 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; { Hervorgehoben } menu_icheck(menu_tree,item,1); menu_icheck(menu_tree,STANDSCH,0); menu_icheck(menu_tree,STANDNOR,0); end; STANDSCH : begin stand := 2; { Schmal } 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 { Proportional einstellen } begin prop := 1; menu_icheck(menu_tree,PROPORT,1); end else { Proportional loeschen } begin prop := 0; menu_icheck(menu_tree,PROPORT,0); end; end; SAVEPREV : begin { Preverences abspeichern } str:= '[1][Bitte Start-Diskette|ins aktuelle|Laufwerk legen !][ OK | ABBRUCH ]'; error := alert(1,str); if error = 1 then begin rewrite(fil,'GUTENBER.INF'); writeln(fil,st); { Textart } writeln(fil,prop); { Proportional } writeln(fil,nl_10); { Druckertyp } writeln(fil,druck); { Druck-Art } writeln(fil,small); { NLQ-Art } writeln(fil,stand); { Standard-Art } close(fil); end; end; PRINTTYP : begin { Druckertyp whlen } sel_printer_type; end; end; END; { CASE OF } menu_tnormal(menu_tree,menu,1); end; {**************************************** ** Event-Handling mu auch mal sein ** ****************************************} 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; {*************************************************************** ** Und dies, meine Damen?? und Herrn, ist das Hauptrogramm ** ***************************************************************} BEGIN open_work; screen_sourc := logbase; { Wo isser denn, der Bildschirm } screen_dest := malloc(32768); { Mal eben 32 kByte reservieren } i := load_rsc; { Wie lief denn das Laden der Resource-Datei? } if i = 0 then { wenn alles O.K. dann mal los } begin i := getrez; { Welche Auflsung haben wir denn eingestellt } if i = 2 then { Luft nur in der hohen Auflsung (bei der Grafik, haha)} begin load_pic; { Einen schnen Hintergrund brauchen wir auch noch } menu_bar(menu_tree,1); { Menzeile einschalten } open_window; graf_mouse(0); dateiname := 'GUTENBER.ZSZ'; load_font(2); { Ist denn der Lieblingszeichensatz da? } do_menu; { Auf zur Mensteuerung } end else begin graf_mouse(0); str:= { So spielt das Leben! } '[1][Dieses Programm luft|nur auf dem Mono-Screen|SM124!][SCHADE]'; ready:=alert(1,str); end; end; close_window; END. { Ende Main } { Das wars, Tscheerio } `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][Es ist ein Fehler|mit dem .RSC-File|aufgetreten !!][SCHADE][1][Raubkopierer, was?|Ohne .RSC luft das|Programm nicht.][ PECH ]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 InformationenNV?.?<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 Matrix nach unten verschieben/,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 Matrix nach links verschieben/,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 Matrix nach rechts verschieben/,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 markieren/,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][Dieses Programm luft|nur auf dem Mono-Screen|SM124!][SCHADE][1][Sind Sie sicher,|da alle Daten|gespeichert sind?][NEIN|JA] Programm beenden"/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("0f$WFONT - EDITOR(c) by M.BALDAUFwritten Juli 1986 byMatthias BaldaufDIESES PROGRAMM IST TEIL EINESPROGRAMM PAKETS !!OKFONT - DRUCKENals NLQABBRUCHNORMAL(c) BY MATTHIAS BALDAUF 7/86MATRIX MARKIEREN OBEN UNTEN RECHTS LINKS AUSEIN MARKIERUNG SpeichernFERTIG  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 Lade Font... Sichere Font Sichere als...----------------- Drucke Font Drucke Font----------------- Lsche Font----------------- Quit V-Spiegeln H-Spiegeln-------------------------- Fllen Lschen ------------------ Invertieren------------------ Kopieren... Verschiebe  Verschiebe  Verschiebe  Verschiebe  Setze Markierung p pp @@@}(`?@>} (D((88H#4CA0B $p0DC<G9   H 0 0 88p?$p `8pxx8Z0 0 $23DEZ[lm ' (09F  "     2N j      !   %A% @@@@ @ @ @  @  .A Q1Q5J G 'Q PP X ] d  k r -P  y     .=N`n|('   !"#$%&'(;-),*I+Y,h(w..-  &f 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 UUUUW6@2@U >@px>("2@ !UUUUUU_~ UUUUUp@>"2@ U~# (O"2@ (UUUUUUV| ~!C!UUUU^@"@2PU ?`<@@>0 Qr;@ CUUUUUUVx`UUUU^1a@"@@ GU xx0ꪪPa@P/UUUUUUW@xx  GUUUU\h2@0HU`?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~ԡAUUUUU_"UUo9@<UUUUUW@@ UUUUU_) U@ AUUUUUWA!PUUUUUW!Ukx@"UUUUUWk @&uUUUUUW*gUz.zBGUUUUUW~@D>UUUUUW U|czUUUUUW@8 @uUUUUUV@2U  z@UUUUUWɐ0? p}UUUUUW`@,U<zpUUUUUW@>>?~ @=UUUUUW,UU~0~?>`UUUUUU ?|_UUUUUW@UU~0< A:UUUUUUA>>?p =@ UUUUUUPAUUC?>K !UUUUUU^`< UUUUUUUU| <$,.ҪUUUUUU||@<UUUUUU~!@SUU- <<"UUUUUUz$><<UUUUUU\7UU><<&% UUUUUU_8<< UUUUU@@UU@`<<媪@UUUUUU_@8<=UUUUUUU@@x></QUUUUUU_@xp^<UUUUWx00@BUU`<Ϫ UUUUUU_<DUUUUUm UU@< :UUUUUUW  |0<UUUUWA@=UU@?< bD$UUUUUUWЀ@??<@@UUUUUWB@ }UUp  ?  E@zUUUUUUWF? UUUUUWa@}UUP B@ZUUUUUUU@x 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@ !"A$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@ꪪ( 'UUUUUUv01B `@ H ȈGD"FUUUU\ ?7UU!y 3BH B@3 $Is$ꪪ@sUUUUUƯ#`&2, O .jDlUUUUUF'=UUP̓!dB$`C`2 N6bLaD0 ꪪpDprUUUUUU_L! B(@ B 2 N"B!D UUUUˇ @=UU@L! 0B0@4B 2 N"CD j  0UUUUUU[ L! B @B 2 "BLP uUUUUi7  AUUΓ)R@R 2$ D"BHT j* @+UUUUUU_'88 9dvrr8pUUUU|@@JUUAB@ȄB DD8"A<DB !ꪪDX&( ꪪUUUUUU]@UUUU^P@ H@fUU iꪪ@.wUUUUUU_!UUUUU$ $ B $UUUܠ@ :  @UUUUUU_ UUUUUW@ @3UUU( ꪪ ` PEUUUUUU]&@UUUUUU_ @?@UUUꪪH@ʪUUUUUU] UUUUUUU?  }UUU@ꪪ_ꪪUUUUUU_FUUUUUUUwUUW{??UUUU8@ ꪪ?UUUUUU[? UUUUUUUUUUUUUWUWUUUUUUUUUU[ UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^` @UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU- 7UUUUUU\" -gUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUd@ ?@檪UUUUUU^ r !  (OUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUP5@ @4UUUUUU_Fh D@/@ UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUE 0o :UUUUUU^ R@8H BP@uUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU (BCP8DꪪUUUUUUWbC H  @ UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUh@ =@1UUUUUUU&@`@B `UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU00@ =|FPP~UUUUUUU|"+#!ӸH]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%\^@` CAPUUUUUUU_^ @'?24 WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUb0*? gk~UUUUUUUWĐ|@@N,Q@@UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI |3 A$@_UUUUUUUU&=@@ U{@%UUUUUUUUUUUU@X?Y@ @(ުUUUUUUUU_ЈUA ?uU_PUUWUUUUUUUUU@UUU7NꪭB>ꪪ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][Es ist ein Fehler|mit dem .RSC-File|aufgetreten !!][ SCHADE ][1][Raubkopierer, was?|Ohne .RSC luft das|Programm nicht.][ PECH ]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 bbF$^V  File Font Special Gutenberg-Info~~~~~~~~~~~~~~~~~~~~ Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Quit Lade Font... Drucke Text...~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Textomat ASCII~~~~~~~~~~~~~~~~~ 1st Word NLQ Standard~~~~~~~~~~~~~~~~ Normal Hervorgehoben Schmal Normal Breit Proportional ~~~~~~~~~~~~~~~~~~~~~~ Einstellung sichern~~~~~~~~~~~~~~~~~~~~~~ Drucker auswhlenBY MATTHIAS BALDAUF, 4/1987 V1.1OKdas NLQ-Druck PogrammGUTENBERG-DRUCKERfr Ihren ATARI STPRAESENTIERTVERTRIEB:Bitte warten, bin am Drucken !!VORGANG ABGEBROCHEN !DURCH TASTENDRUCK WIRD DER DRUCK-Bitte warten, bin am RECHNEN !!DER ZEICHENSATZ WIRD KONVERTIERTText Drucken00Linker Rand:__99DRUCKENABBRUCH00Seitenzhler:__99BEI 1st WORDBitte whlen Sie Ihren DruckerWIRD MIT 'EINSTELLUNG SICHERN' ABGESPEICHERTNL-10GEMINIn/216 ZOLL VORSCHUBn/144 ZOLL VORSCHUBFERTIGFUER DRUCKER MITFUER DRUCKER MITq@@C8q0p8y=bpp?\wMv1brp8<61rx x 1>t~&1rpF1"1b18B!x0"0@) `  `8?8ldo{joxno{8ߟx???}Ny?@DQE?xE_y?Q@FQ?@DQM^# )KL"Pfghz{|    " *+ ,MN!O\] ^ap -/08IJK\]PP $ ) 0  7 $P  A R g | %7BJ\$# gmx  !"#%+&'()*+$  )b M ~% ! !F      T !% !  & B!% ! ^ z!!   s {      (  !  "! ! > Z 1   v  N`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 --------------------------------------------------------------------------- G U T E N B E R G - D R U C K E R Version 1.1 nur fr 9-Nadel-Drucker (c) by Matthias Baldauf Luitpoldstr.62 6760 Rockenhausen --------------------------------------------------------------------------- PUBLIC-DOMAIN = PUBLIC-DOMAIN = PUBLIC-DOMAIN = PUBLIC-DOMAIN --------------------------------------------------------------------------- Anerkennungs-Honorare an obige Adresse schicken --------------------------------------------------------------------------- * INHALTSVERZEICHNIS Diskette GUTENBERG-DRUCKER V1.0 -------------------------------------------------- Auf dieser Diskette sollten sich folgende Programme und Dateien befinden: FONTS 13 verschiedene Zeichensaetze GUTENBER.DOC BEDIENUNG.DOC -- Bedienungsanleitung ARTIKEL.DOC -- Aufsatz zum GUTENBERG-DRUCKER DEMO_01.DOC -- Demo-File zum Breit-Druck (40 Zeichen breit) READER.PRG -- Programm zum Lesen von Text-Files. Source ist mir leider verloren gegangen. Muss in der gleichen Directory stehen wie der zu lesende Text! GUTENBER.GEM BILD_1.GEM \ BILD_2.GEM > Grafiken und Tabellen (mit GEM-DRAW) BILD_3.GEM / GUTENBER.LIS LISTING_1.LIS LISTING_2.LIS -- Programmlistings zum Artikel SOURCES FONT.I -- Include-File zum Quelltext FONT-EDITOR FONT.PAS -- Quelltext FONT-EDITOR GUTENBER.I -- Include-File zum Quelltext GUTENBERG-DRUCKER GUTENBER.PAS -- Quelltext GUTENBERG-DRUCKER FONT.PRG -- Programm-File FONT-EDITOR FONT.RSC -- zugehoeriges RSC-File GUTENBER.PIC -- Titelbild GUTENBERG-DRUCKER GUTENBER.PRG -- Programmfile GUTENBERG-DRUCKER GUTENBER.RSC -- zugerhoeriges RSC-File Am besten Bedieungsanleitung mit GUTENBERG-DRUCKER ausdrucken und lesen!!! Mit freundlichen Gruessen Matthias Baldauf, 22.03.87 -1 0 1 1 1 1 ********************************************** * * * pST-COMPUTERq * * Die Fachzeitschrift fr den ATARI-ST Anwender * * * * * * prsentiert * * die PD-Sammlung fr den ATARI ST * * * ***************************************************************** * * * pDiskette 306q * * ------------- * * * * Drucker * * ******************************************************************** Deze diskette is samengesteld door de Stichting ST, Postbus 11129, 2301 EC Leiden. Onze bibliotheek van public domain programma's omvat op dit moment (zomer 1990) al zo'n vier honderdvijftig disks. Daarop vindt u programma's op elk gebied, van tekstverwerker en database tot de leukste spelletjes, de fraaiste tekenprogramma's en de handigste utilities. Ook bevat onze bibliotheek een speciale afdeling voor public domain disks met Macintosh software, die te gebruiken zijn onder de ALADIN emulator. Deze MAC-PD serie bevat tot nu toe ongeveer vijfendertig disks. ******************************************************************** U vindt in het twee maandelijks tijdschrift "ST" (Onafhankelijk tijd- schrift van en voor gebruikers van Atari ST computers) een overzicht en een bespreking van de inhoud van de nieuwe public-domain diskettes. Dit tijdschrift bevat tevens een bestelkaart zodat U vlot over de software kunt beschikken. De Stichting ST geeft ook een speciale PD catalogus disk uit. Deze public domain disk is geproduceerd en gedistribueerd door: ************** Stichting ST afd. Software Bakkersteeg 9A 2311 RH LEIDEN ************** Ondanks onze controle komt het af en toe voor dat een diskje niet goed is gecopieerd.Mocht U dit overkomen, aarzel dan niet en stuur de defecte disk aan ons terug. U krijgt dan direct een vervangende disk toegestuurd. ************************************************************************ Teneinde het voor ons mogelijk te maken om productiefouten op te sporen en vervolgens in de toekomst te vermijden, zijn alle disks, geproduceerd door de Stichting ST, voorzien van een groen productienummer. ************************************************************************