1           } NEWS18D.DFV                                                         STEINIC  @     Liebe Clubmitglieder!
Ursprnglich sollte in dieser Ausgabe der PC-NEWS ein Adressplan des PC, mit genauer Beschreibung der Interruptvektoren, der DOS-Funktionen und der BIOS-Adressen, erscheinen. Als Zusatz haben wir uns einige Beitrge in Assemblersprache vorgestellt, die das Heft zum Nachschlagen fr 'wie -formuliere-ich-in Assembler' benutzbar machen sollte. 
Der Zahl der Assemblerbeitrge ist aber so stark angestiegen, da wir uns aus Rcksicht auf die Druckkosten zu einer Teilung des Heftes entschlossen haben. Die Beitrge finden Sie nachfolgend abgedruckt, den Adressplan des PC knnen Sie gegen Ersatz der Kopierkosten beim Clubsekretariat bestellen (ca. 80 Seiten A4). 
Neben den Assemblerbeitrgen finden Sie eine Logo-Writer-Beschreibung und eine Open-Access-Beschreibung von Kollegen Neidhart/Spittal und eine Turbo-Pascal-Beschreibung und vielerlei ntzliche Tips von Kollegen Melchart. Fr beides dankt die Redaktion; htten wir doch nur mehr dieser Beitrge. 
Da sich das Layout schon wieder ndert, ist auf chronischen Zeitmangel der Gestalter zurckzufhren. Wie sie aus Einschaltung auf der vorigen Seite ersehen knnen, suchen wir in dieser Richtung eine Hilfe zur Gestaltung der PC-NEWS. 
Clublieferanten
In den vergangenen Jahren sind gnstige Bezugsquellen fr Clubmitglieder aus verschiedenen Grnden immer wieder versiegt. Seit der letzten Ausgabe der PC-NEWS haben wir aber wiederholt Rckmeldung erhalten, da die Sonderpreisliste von EXCON fr den PCC wirklich gnstige Angebote enthlt. Viele Kollegen im TGM haben positiv ber Einkufe bei Familie Hanisch (Herr Hanisch ist ehemaliger TGM-Absolvent) berichtet. 
Clubbetrieb
Nachdem Arbeiten fr den Club immer mehr Routinecharakter annehmen, ist sie als Freizeitbeschftigung fr Vorstandsmitglieder immer weniger tragbar. Fr administrative Angelegenheiten ist seit kurzem Frau Jelinek im Clubbro beschftigt. Daher kann sich Herr Leeb, eher den technischen Fragestellungen widmen. Er hat auch die ersten BTX-Seiten des PCC erstellt. Da er aber das BTX nur so nebenbei betreuen kann, geht die Informationseingabe ins BTX nur allmhlich vor sich. 
Wir bemhen uns um Arbeitsteilung. BTX eignet sich gut, auch einmal von Nicht-Wienern betreut zu werden. Unser aktives Krntner PCC-Team rund um Kollegen Schlatte wird sich bis nach den Ferien mit den BTX-Gegebenheiten auseinandersetzen und Eingabearbeiten bernehemen. 
Preisausschreiben
Last-Call-for-Papers: Durch die um Monate verzgerte Aussendung der NEWS-16 (4.Heft 1989) wurde das Preisausschreiben mit Termin Ostern 1989 nur von einigen wenigen als relevant eingestuft, wir haben daher, gemessen an der Mitgliederzahl, nur wenige Einsender. Der Termin fr die Einsendung wird daher auf Ende August 1990 verlegt und wir bitten unsere Mitglieder gem den Ausschreibungsbedingungen 'Programme fr den Unterricht' einzureichen. Bei den Preisen sind wir wegen der geringen Teilnehmerzahl noch unschlssig, stellen uns aber von, da der jeweils erste Preis umso hbscher ausfllt, als es der Zahl der Einsendungen entspricht aus der er ausgewhlt wurde. Zudem soll auf jeden Einsender ein Gewinn fallen. 
BTX
In der Clubgrndungsphase gab es im Mitgliederverzeichnis eine eigene Spalte fr eine BTX-Nummer. Da diese aber nur bei einigen wenigen Mitgliedern ausgefllt wurde, ist sie bei der ersten Revision des Verzeichnisses verschwunden. 
Die Entwicklung der letzten Monate lt uns vermuten, da wir diese Spalte bald wiedereinfhren sollten. In der folgenden Tabelle finden Sie alle Mitglieder, die uns ihre BTX-Nummer mitgeteilt haben (BTX-Nummer/Mitgliedsnummer/Name). Fr das Aktualisieren der Liste bentigen wir unbedingt Ihre BTX-Nummer. 
BTX-Nummer	MNum	Name221345801		ADIM-Wien912218106		ADIM-Wien912415915	1353	Anderle912615360	733	Brenner912115060		BRG-Bruck912218753	104	Bruckner912216428	551	Callsen-Rauer		848	Cernusca912218249	47	Chloupek912218558	646	Deutsch912216439	139	Eckl912218431	1039	Eisenzopf915520729	725	Feurstein912218242	77	Fiala		672	Gassner		518	Gotschim		82	Gottfried912218682	952	Hafenschar916210260	425	Hasenburger912218893	506	Herzog912218898	1097	Hintenaus911210196		Hirschmann*(Post-Lehrwerksttte)912214406	590	Hirz912916298		HTBLA-Hollabrunn912213510		HTBLA-Wien-1912214660		HTBLA-Wien-1, Direktion912211581		HTBLA-WIEN-1,Abt.N912615243		HTBLuVA-Wr.Neustadt912615244		HTBLuVA-Wr.Neustadt911219987		HTL-Hollabrunn912217106		HTL-Mdling911219953		HTL-St.Plten912217641		HTL-Wien-22912218795		HTL-Wien-3 Ungarg.912215359	581	Hummer912218465	94	Jordis917415021	302	Junker912218694	317	Kliemstein		453	Klinsky912218880	1440	Kolacek912216420	132	Knig914210137	1260	Lindner912218740	194	Lirnberger912216391	599	Mandl		72	Martinek912218220	26	Mayer912222064		MCCA912218703	50	Navratil914710016	311	Neidhart*(BRG-Spittal)912222588	1161	Neufingerl912218527	27	Nitsche912218705	652	Obdrzalek915210681	830	Oppl	912218759	51	Ostermaier912218336	785	Pany912222584		PCCTGM *5645#912218557	121	Reiermann912211090	1	Reiter912216422	65	Riemer912216436	565	Salkovic915510761	606	Salzmann912218218	80	Scharl913110525	533	Scheiber ADIM-Graz912218862	1372	Scheuer915210650	383	Schlager914210023	92	Schlatte912218432	644	Schleidt-Schuller912212040	701	Schlgl912218702	199	Schneeweis912218930	236	Schwarz H.		382	Schwarz P.912218281	1206	Sicher912215400	203	Sigart912218720	173	Skriwanek912218731	305	Sokol914210158	102	Sorko912218716	7	Stani912216435	1261	Steiner912218709	20	Streisselberger916211421	379	Trebuch912213458	307	Weissenbck912218769	190	Weltsch		326	Widder912213499	29	Winkler912216313	801	Wurm912715326	149	Zehetner912216424	118	Zelinka


Clubdisketten
Den Text der vorliegenden PC-NEWS und alle dazugehrigen Programme sowie auch einen Teil des oben angegebenen Adressplans finden Sie auf der Diskette TGM-136. 
Weitere Disketten haben wir in unser Verzeichnis aufgenommen:
TGM-136: PC-NEWS-18
NEWS17   TXT    178176 05-22-90   7:45aNEWS17D  DFV      1024 05-22-90   7:45aN17PGM   ARC     67409 05-22-90   7:57aBIOS     TXTAFD      DFVAFD      TXTBIOS     DFVLPTXCHG  ASMINTPRUEF ASMINTPRUEF COMINT_TAB  DATSPOOLER  ASMSPOOLER  EXESKC      ASMSKC      COMSKC0     ASMAUTOASK  COMAUTOASK  ASM

TGM-137: Lohnsteuerberechnungsprogramm
FCG      BAT       766 11-24-88  12:27pHINWEISE BAT      1592 10-26-88   1:01pLST      EXE    188912 11-13-88   7:10pLSTARIFA DBF       158 10-25-88   2:49pLSTARIFN DBF       128 10-25-88   2:49pLSTNAM   DBF      1186 04-01-90   8:24p

TGM-138: DEMO-DISK, LAB-WINDOWS, National Instruments, (HD)
SETUP    BAT       337 11-14-89  10:08aUNPACK   EXE     38951 11-14-89  12:07pLWDEMO   ZIP    895222 11-17-89   5:35p

TGM-139: PSPICE (Dokumentation, ca. 40 Seiten beim Club) (HD)Diese PSPICE-Version ist eine Demoversion, die aber fr Unterrichtszwecke ausreichend ist, die Dokumentation ist eine zum Erlernen geeignete 
PS-OVL   ARC    395766 05-22-89   9:12pPS-PARTS ARC    142460 05-22-89   9:12pPS-PROBE ARC    202422 05-22-89   9:13pPSPICE   BAT        52 06-22-87   7:31aEXAMPLE1 CIR     10287 05-13-89   6:28pEXAMPLE1 DAT      8092 05-15-89  12:26pCSHELL   DOC     24911 10-24-88   8:33aINSTALL  DOC      4029 11-01-88   9:58aREADME   DOC     15443 01-28-89  10:07aPS       EXE     15824 01-28-89  11:13aPSPICE1  EXE    213232 04-05-89   9:03pPSPICE   HLP     30699 12-16-88   2:45pBIPOLAR  LIB      3297 11-02-88  10:10aDIODE    LIB      1613 11-02-88  10:04aJFET     LIB       960 11-02-88  10:15aLINEAR   LIB      5031 11-02-88  10:12aMAGNETIC LIB      2636 11-01-88   8:52aNOM      LIB      1087 11-01-88   8:45aPWRMOS   LIB      3535 11-02-88  10:14aPSPICE   NDX      2192 12-16-88   2:46pEXAMPLE1 OUT     22380 05-15-89  12:26pCONFIG   SYS        22 12-15-87  10:47aPKARC    COM     19573 04-27-87  12:00aPKXARC   COM     12242 04-27-87  12:00a

Farben und Notizdateigre im SideKick einfach und schnell verndern 
Walter Riemer, TGM (Diskette TGM-136)
Der folgende Bericht bezieht sich auf SideKick, Version 1.56A, also die "Urversion" des SideKick. Der Autor bentzt insbesondere auf seinem Laptop nach wie vor diesen SideKick. Der Laptop wird fallweise mit externem Monitor betrieben, dann wieder mit dem eingebauten LCD-Display. 
1. Side-Kick-Farben 
Das LCD-Display ist von Natur aus Invers (dunkle Buchstaben auf hellem Hintergrund), fr die Monitore gilt meistens das Umgekehrte. Es ist inzwischen allgemein bekannt, da dunkle Schrift auf hellem Untergrund besser und augenschonender lesbar ist, als die frher ausschlielich bliche Darstellung Hell auf Dunkel; deswegen sind moderne Monocolor-Monitore mit einem Inversschalter ausgestattet, soda man bei jedem Programm eine "Hell auf Dunkel"-Darstellung am Monitor selbst whlen kann. SideKick bietet die Mglichkeit, die Farben mittels Installationsprogramms SKINST einzustellen, jedoch ist dies umstndlich und zeitraubend. 
Um bei LCD-Betrieb wie auch bei Monitorbetrieb immer den richtigen SideKick zu haben, wre es daher wnschenswert, ein Programm zu haben, das ohne viel Aufwand den SideKick zwischen zwei vorgewhlten Farbdarstellungen umschaltet. 
2. Editor-Dateigre 
Der SideKick belegt je nach Editor-Dateigre etwa 110 kBytes (bei 45 k) bzw. 80 kBytes (bei 15 k Editor-Dateigre). Wenn es darum geht, einem Programm mglichst viel RAM-Speicher zu belassen, andererseits aber nicht zu groe ASCII-Dateien zu editieren sind (wie etwa beim Programmieren modular aufgebauter dBASE- oder Assemblerprogramme oder beim Protokollieren), wird eine kleinere SideKick-Version von Vorteil sein. Ein Programm zum einfachen Umschalten des SideKick wre wnschenswert. 
3. SKC.COM: SideKickChange-Programm 
Das Assembler-Programm SKC.ASM erlaubt beide Umschaltungen. Es belegt als .COM-Datei nicht einmal 500 Bytes. Der Grund fr diese Verffentlichung ist vor allem der, da in diesem Programm viele "Tricks" angewendet wurden, um mglichst codeeffizient zu programmieren; auerdem wird von den uerst komfortablen Xenix-orientierten Dateifunktionen Gebrauch gemacht, die im Lehrbuch "Maschinennahes Programmieren unter MS-DOS" zwar erklrt, nicht aber durch ein Beispiel belegt sind. 
Zunchst mute natrlich erforscht werden, wo die Unterschiede, welche die Farben bzw. die Editor-Dateigre steuern, liegen. Es wurden die gewnschten SideKick-Versionen mit SKINST installiert; dann wurde mit der File-Compare- Funktion von PCTOOLS festgestellt, wo die Unterschiede liegen: Im Sektor 0 ab Displacement 51 (2 Bytes) fr die Editor-Dateigre und im Sektor 16 ab Displacement 102 (33 Bytes) fr die Farben. 
Aufgabe des Programms SKC ist, nach Aufruf mit 2 Parametern die gewnschten Umstellungen an der Datei SK.COM im aktuellen Verzeichnis vorzunehmen; dann erst sollte der Sidekick geladen werden. Zweck des Programms ist es nicht, den residenten SideKick zu verndern. 
Die Parameter sind I oder N (Invers oder Normal) sowie + oder - (groe bzw. kleine Editor-Dateigre). Wenn kein Parameter angegeben ist, wird auch nichts gendert. 
Der Ablauf ist im wesentlichen folgender: 
Zunchst wird SK.COM erffnet (Funktion 3Dh). Dann wird die Kommandozeile (im PSP - Program Segment Prefix ab Adresse 80h) auf Grobuchstaben gendert, indem Bit 5 gelscht wird; dies verndert natrlich auch die Codes von Plus und Minus). Als Nchstes wird mittels SCAN-Befehls geprft, ob die vorgesehenen Parameterzeichen enthalten sind; dabei macht eine Schleife Gebrauch von einer Tabelle namens Codes, welche die vier Zeichen enthlt. Fr jedes enthaltenen Parameterzeichen wird ein zugeordnetes Bit in einem Byte namens Schalter gesetzt. Diese Schalter-Bits haben eine wesentliche Steuerungsfunktion in der anschlieend auszufhrenden Routine Patch, welche die Vernderung des SK.COM vornimmt. 
Je nachdem, welches Schalter-Bit gesetzt ist, wird zu der einen oder anderen Patchtabelle zugegriffen ("Patchen" heit wrtlich etwa Flicken, Ausbessern und bedeutet in der EDV blicherweise das direkte Verndern ausfhrbaren Codes entweder im Speicher oder auf einer Datei). Jede Patchtabelle enthlt die Adresse, wo ge"patcht" werden soll (Sektornummer und Offset innerhalb dieses Sektors), die Anzahl zu patchender Bytes sowie die neuen Bytewerte; falls fr letztere Null angegeben ist, soll das betreffende Byte nicht verndert werden. 
Nach Festlegen der Patchtabelle mu der entsprechende Sektor gelesen werden. Dazu wird mit der Funktion 42h (Dateizeiger verschieben, "Logical Seek") 
bestimmt, ab wo SK.COM in den Puffer des Programms SKC zu lesen ist, nmlich ab dem ersten zu patchenden Byte; dann wird gelesen (Funktion 3Hh), in einer kleinen Schleifen-Unterroutine gepatcht, das zugehrige Steuerbit gelscht, die vorher gelesene Anzahl Bytes (genau so viele, wie zu patchen sind) wieder zurckgeschrieben und neuerlich zum Anfang der Patch-Routine gesprungen. Der Vorgang wird wiederholt, bis keine Steuerbits mehr gesetzt sind, also normalerweise hchsten ein weiteres Mal. 
Zuletzt wird SK.COM geschlossen (Funktion 3Eh) und das Programm beendet. 
         TITLE    'SKC.ASM: SideKick einstellen: 15 k / 45 k, invers / normal' 
; Aufruf mit SKC pq, wobei die Parameter p und q sein knnen: 
;        i oder n, - oder + (invers oder normal, klein 15 k oder gro 45 k) 
CodeSeg  SEGMENT  PARA PUBLIC 'Code' 
         ASSUME   CS:CodeSeg,SS:CodeSeg 
         ASSUME   DS: CodeSeg,ES:CodeSeg 
         ORG      100h 
Begin:   JMP      Start 
DatNam   DB       'SK.COM'   ; Name der Zieldatei auf dem aktuellen Laufwerk 
Displ    DW       0          ; Displacement fr Dateizeiger 
KdoZLng  DB       0          ; Lnge der Kommandozeile 
Kdo      DW       0          ; Adresse des Kommandos 
Codes    DB       'IN'       ; Codezeichen in Kommandozeile 
         DB       0Bh        ; "+" nach Bitlschen 
         DB       0Dh        ; "-" nach Bitlschen 
Schalter DB       0          ; Bit 7 = I, 6 = N, 5 = -, 4 = + 
TabAktu  DW       0          ; zum Sichern der Adresse der aktuellen Tabelle 
SKSize   DB       0          ; Sektor 
         DB       51         ; Displacement 
SKSizeL  DB       2          ; Anzahl Bytes 
SK15k    DB       98h,3Ah    ; Inhalt fr 15 k 
SK45k    DB       50h,0C3h   ;        fr 45 k 
SKColors DB       16         ; Sektor 
         DB       102        ; Displacement 
SKColoL  DB       33         ; Anzahl Bytes ( = Pufferlnge ) 
SKInvers DB       70h,60h,0,0,60h,0Fh,0,0,0,70h,60h,0Fh,0,0,0,70h,60h,0Fh 
         DB       0,0,0,0,60h,0Fh,70h,60h,0Fh,0,75h,0Fh,70h,60h,0Fh 
                  ; 0 = unverndert 
SKNormal DB       7Fh,70h,0,0,75h,7Fh,0,0,0,06h,70h,70h,0,0,0,06h,70h,70h 
         DB       0,0,0,0,06h,70h,06h,70h,70h,0,06h,06h,06h,70h,70h 
Handle   DW       0          ; Dateinummer (File Handle) 
FehlMdg  DB       10,13,'SK.COM nicht da oder schreibgeschtzt',10,13,"$" 
; 
Start:   CALL     OpenSK     ; SK.COM erffnen 
         CALL     KdoZUpCase ; Kommandozeile in Grobuchstaben umsetzen 
         CALL     Analyse    ; Kommandozeile analysieren 
         CALL     Patch      ; SK.COM patchen 
         JMP      CloseSK 
; 
OpenSK:  ; SK.COM im aktuellen Pfad erffnen 
         MOV      CX,0       ; Dateiattribut 0 (keine besonderen Attribute) 
         LEA      DX,DatNam  ; Dateiname 
         MOV      AH,3Dh     ; Xenix-orientiertes Erffnen eines Zugriffspfads 
         MOV      AL,2       ; erffnen fr Schreiben und Lesen 
         INT      21h        ; Funktion ausfhren 
         JC       Fehler     ; Wenn Erffnen nicht mglich (sonst CF=0) 
         MOV      Handle,AX  ; Dateinummer (Handle) sichern 
         RET 
Fehler:  LEA      DX,FehlMdg 
         MOV      AH,9 
         INT      21h 
         JMP      Exit 
; 
KdoZUpCase:    ; Kommandozeile in Grobuchstaben umsetzen 
         XOR      CH,CH 
         MOV      CL,CS:80h  ; Kdo-Zeilenlnge steht auf PSP+80h 
         MOV      KdoZLng,CL ; Lnge sichern 
         MOV      DI,81h     ; Adresse erstes Byte der Kommandozeile 
         MOV      Kdo,DI     ; sichern 
KdoZU0:  AND      BYTE PTR [DI],0DFh   ; Bit 5 lschen 
         INC      DI 
         LOOP     KdoZU0 
         RET 
; 
Analyse: MOV      DI,OFFSET Codes 
         MOV      SI,OFFSET Schalter 
         MOV      CX,4       ; 4 mgliche Codes 
         MOV      AH,80h     ; Bitcode fr Code "L" 
         PUSH     CS 
         POP      ES 
Ana0:    MOV      AL,[DI]    ; Codebuchstaben laden 
         PUSH     CX 
         PUSH     DI 
         MOV      CL,KdoZLng ; Lnge der Kommandozeile 
         MOV      DI,Kdo     ; Adresse des Kommandos 
         XOR      CH,CH      ; Nullsetzen 
         REPNE SCASB         ; nach Codebuchstaben durchsuchen 
         JNZ      AnaLoop    ; wenn nicht gefunden: Schleife fortsetzen 
         OR       Schalter,AH ; wenn gefunden: Schalterbit setzen 
AnaLoop: SHR      AH,1       ; Schaltermuster fr nchsten Code 
         POP      DI 
         INC      DI         ; nchster Code 
         POP      CX 
         LOOP     Ana0 
         RET 
; 
Patch:   TEST     Schalter,0C0h  ; I oder N gesetzt ? 
         JZ       PatchLS        ; keines gesetzt 
         LEA      SI,SKColors    ; eines gesetzt: Parameter fr Sektor lesen 
         MOV      TabAktu,SI     ; Tabellenadresse sichern 
         MOV      BL,[SI+2]      ; Lnge der Tabelle 
         CALL     Read           ; Sektor lesen 
         TEST     Schalter,80h   ; I gesetzt ? 
         JZ       PatN           ; nein, also N gesetzt 
         LEA      DI,SKInvers    ; Bytetabelle fr Invers 
         AND      Schalter,3Fh   ; Bits 7 und 6 lschen 
PatCall: CALL     Einsetz        ; Bytes aus Tabelle einsetzen 
         CALL     Write          ; Sektor zurckschreiben 
         JMP      Patch          ; nochmals anfangen fr Bits 5 und 4 
PatN:    LEA      DI,SKNormal    ; Bytetabelle fr Normal 
         AND      Schalter,3Fh   ; Bits 7 und 6 lschen 
         JMP      PatCall 
PatchLS: TEST     Schalter,30h   ; + oder - gesetzt ? 
         JZ       PatchEx        ; keines gesetzt: keine Vernderung 
         LEA      SI,SKSize      ; eines gesetzt: Parameter fr Sektor lesen 
         MOV      TabAktu,SI     ; Tabellenadresse sichern 
         MOV      BL,[SI+2]      ; Lnge der Tabelle 
         CALL     READ           ; Sektor lesen 
         TEST     Schalter,20h   ; + gesetzt ? 
         JZ       PatS           ; nein, also - gesetzt 
         LEA      DI,SK45k       ; Bytetabelle fr 45 k 
         AND      Schalter,0CFh  ; Bits 5 und 4 lschen 
         JMP      PatCall 
PatS:    LEA      DI,SK15k       ; Bytetabelle fr 15 k 
         AND      Schalter,0CFh  ; Bits 5 und 4 lschen 
         JMP      PatCall 
PatchEx: RET 
; 
Read:    MOV      AX,512         ; Sektorgre 
         XOR      CX,CX 
         MOV      SI,TabAktu     ; Tabellenadresse holen 
         MUL      WORD PTR [SI]  ; Multiplikator = Sektornummer 
         PUSH     BX 
         MOV      BL,[SI+1]      ; Displacement 
         XOR      BH,BH 
         ADD      AX,BX          ; Displacement dazu 
         PUSH     CX 
         PUSH     AX 
         POP      DX 
         POP      CX             ; CX:DX = Offset fr Logical Seek-Funktion 
         MOV      Displ,DX       ; Offset fr spteres Write sichern 
         CALL     LSeek          ; Dateizeiger stellen 
         MOV      AH,3Fh         ; Lesen von Zugriffspfad 
         MOV      BX,Handle      ; Dateinummer 
         XOR      CX,CX 
         MOV      SI,TabAktu     ; Tabellenadresse holen 
         MOV      CL,[SI+2]      ; Anzahl zu lesender Bytes 
         LEA      DX,Puffer      ; Adresse des Datenpuffers 
         INT      21h 
         POP      BX 
         RET 
; 
LSeek:   MOV      AH,42h         ; Logical Seek 
         MOV      AL,0           ; Zeiger auf Dateianfang + Offset 
         MOV      BX,Handle 
         INT      21h 
         RET 
; 
Einsetz: ; Bytes laut Tabelle einsetzen 
         MOV      CL,BL          ; Anzahl Bytes 
         XOR      CH,CH 
         LEA      SI,Puffer 
Eins0:   CMP      BYTE PTR [DI],0 ; Eintragen ntig ? 
         JE       Eins1          ; nein 
         MOV      AL,[DI] 
         MOV      BYTE PTR [SI],AL ; ja: Byte einsetzen 
Eins1:   INC      DI             ; nchstes Byte in Tabelle 
         INC      SI             ; nchstes Byte im Puffer 
         LOOP     Eins0 
         RET 
; 
Write:   MOV      DX,Displ   ; Displacement wieder holen 
         CALL     LSeek      ; Dateizeiger einstellen 
         MOV      BX,Handle  ; Dateinummer (File-Handle) nach BX 
         XOR      CH,CH 
         MOV      SI,TabAktu ; Tabellenadresse holen 
         MOV      CL,[SI+2]  ; Pufferlnge (=Anzahl zu schreibender Bytes) 
         LEA      DX,Puffer 
         MOV      AH,40h     ; Funktion Schreiben auf Zugriffspfad 
         INT      21h        ; ausfhren 
         RET 
; 
CloseSK: MOV      AH,3Eh     ; Funktion Schlieen eines Zugriffspfads 
         MOV      BX,Handle 
         INT      21h 
Exit:    MOV      AH,4Ch 
         INT      21h 
; 
Puffer   EQU      $          ; Dateipuffer 
; 
CodeSeg  ENDS 
         END      Begin 
 
4. Variante mit Hilfetext 
Wer nicht Wert darauf legt, da SKC.COM nur 473 Bytes belegt, kann im Anfangsbereich einige nderungen vornehmen, soda er mit SKC ? einen Hilfetext als Gedchtnissttze fr die praktische Anwendung erhlt. Hier nur der relevante Ausschnitt: 
(ab HelpMdg neu) 
FehlMdg  DB       10,13,'SK.COM nicht da oder schreibgeschtzt',10,13,"$" 
HelpMdg  DB       10,13,'Aufruf mit SKC pq, wobei die Parameter p und q sein ' 
         DB       'knnen: i oder n, - oder + ',10,13 
         DB       '(invers oder normal, 15 k oder 45 k). SKC ? ' 
         DB       'gibt Hilfe.','$' 
; 
Start:   CALL     KdoZUpCase ; Kommandozeile in Grobuchstaben umsetzen 
         CALL     Help       ; Hilfe ausgeben 
         CALL     OpenSK     ; SK.COM erffnen 
         CALL     Analyse    ; Kommandozeile analysieren 
         CALL     Patch      ; SK.COM patchen 
         JMP      CloseSK 
; 
KdoZUpCase:    ; Kommandozeile in Grobuchstaben umsetzen 
         XOR      CH,CH 
         MOV      CL,CS:80h  ; Kdo-Zeilenlnge steht auf PSP+80h 
         MOV      KdoZLng,CL ; Lnge sichern 
         MOV      DI,81h     ; Adresse erstes Byte der Kommandozeile 
         MOV      Kdo,DI     ; sichern 
KdoZU0:  AND      BYTE PTR [DI],0DFh   ; Bit 5 lschen 
         INC      DI 
         LOOP     KdoZU0 
         RET 
; 
Help:    MOV      AL,1Fh     ; "?" ohne Bit 5 
         MOV      CL,KdoZLng ; Lnge der Kommandozeile 
         MOV      DI,Kdo     ; Adresse des Kommandos 
         REPNE SCASB         ; nach "?" durchsuchen 
         JNZ      HelpEnd    ; wenn nicht gefunden 
         LEA      DX,HelpMdg 
         JMP      LineOut    ; Hilfetext ausgeben 
HelpEnd: RET 
; 
OpenSK:  ; SK.COM im aktuellen Pfad erffnen 
 
(ab OpenSK: weiter wie in der Grundvariante)
INTPRUEF
Christoph Ferstl, TGM, 4ANA90 (Diskette TGM-136)
Programm zur berprfung der Interruptvektortabelle. Wird das Programm zum erstenmal gestartet, so wird die gesamte Vektortabelle erfat und in der Datei INT_TAB.DAT gespeichert. Kann die Datei nicht erstellt oder geffnet werden, wird dies durch eine Fehlermeldung angezeigt. Bei Wiederaufruf wird die aktuelle Vektortabelle mit der alten Tabelle in INT_TAB.DAT verglichen und auf Fehler in der bereinstimmung geprft. Die Datei mu dabei im selben Unterverzeichnis stehen, wie das Programm INTPRUEF.COM . Sollten sich Vektoren verndert haben, so werden sie am Bildschirm dargestellt. Weiters wird bei Vernderungen abgefragt, ob die Datei INT_TAB.DAT aktualisiert werden soll.
                              title INTPRUEF
page 72,80
comment ?   Programm - Datei  \MASM\SOURCE\INTPRUEF.ASM
;
;MASM Version 5.0
code segment
     org 100h
     assume cs:code,ds:code
;
public start
start:             jmp anfang
;
LF             equ  0Ah
CR             equ  0Dh
;
int_tab        db 'INT_TAB.DAT',0
Fehlertext_1   db CR,LF,CR,LF,'Kein Zugriff mglich (Disk vermutlich voll) !',CR,LF,'$'
Fehlertext_2   db CR,LF,CR,LF,'Zu viele Dateien geffnet !',CR,LF,'$'
Ueberschrift   db CR,LF,'          PRFUNG DER INTERRUPTVEKTORTABELLE',CR,LF,'$'
Text           db CR,LF,'   Interrupt   Bestand    Segment:Offset  Vergleich','$'
Meldung_1      db CR,LF,CR,LF,'Aktuelle Vektortabelle in Int_tab.dat gespeichert !','$'
Meldung_2      db CR,LF,CR,LF,CR,LF,'In der Vektortabelle sind keine Vernderungen aufgetreten!','$'
Meldung_3      db 'OK$'
Meldung_4      db 'UNGLEICH$'
Meldung_5      db CR,LF,'Die Datei Int_tab.dat wurde geschlossen.',CR,LF,'$'
Frage_1        db CR,LF,CR,LF,CR,LF,'Soll die aktuelle Vektortabelle abgespeichert werden ?','$'
Neu            db 'neu =>$'
Alt            db 'alt =>$'
Int_num        db 1 dup (0)
Int_seg        dw ?
Int_off        dw ?
Handle         dw ?
Vmodus         db ?
Bseite         db ?
Zeile          db 1 dup (5)
Spalte         db ?
Zeichen        db ?
Schalter       dB 1 dup (0)
Schleife       dw ?
Vek_add_puf    dw 512 dup (0)
;
;
Int_tab_erstellen  proc
                   mov ah,5bh                ;Funktion Datei erstellen
                   mov cx,00                 ;Dateiattribut / 0 = normal
                   lea dx,Int_tab            ;Offset des Dateinamens bergeben
                   int 21h
                   jnc OK1                   ;wenn CF=0 wurde Datei erstellt
                   cmp ax,5                  ;wenn CF=1/Fehlercode 5 =>
                   jz Fehler1                ;Zugriff verweigert (Disk voll)
                   cmp ax,80                 ;wenn CF=1/Fehlercode 80 =>
                                             ;          Datei existiert bereits
                   mov Schalter,1            ;Schalter setzen: Datei existiert
                   jz Int_tab_oeffnen        ;Datei Int_tab ffnen
             OK1:  mov Handle,ax             ;sichern des Dateihandles
                   ret
Int_tab_erstellen  endp
;
Vek_add_schreiben  proc                      ;schreiben in die Datei Int_tab
                   mov ah,40h                ;Funktion Datei schreiben
                   mov bx,Handle             ;Dateihandle bergeben
                   mov cx,400h               ;Anzahl der zu schreibenden Bytes
                   lea dx,Vek_add_puf        ;Offset d. Schreibpuffers bergeben
                   int 21h
                   cmp ax,0                  ;wenn ax = 0:Disk voll
                   jnz OK3
                   cmp ax,400h               ;wenn ax < 400h:Disk voll
                   jz OK3
                   call Int_tab_loeschen     ;Datei Int_tab lschen
                   call Fehler1              ;Zugriff verweigert (Disk voll)
              OK3: ret
Vek_add_schreiben  endp
;
Fehler1            proc                      ;Fehler: Zugriff verweigert
                   lea dx,Fehlertext_1
                   call String_ausgabe
                   jmp Fin                   ;Programm beenden
                   ret
Fehler1            endp
;
Fehler2            proc                      ;Fehler: Zu viele Dateien geffnet
                   lea dx,Fehlertext_2
                   call String_ausgabe
                   jmp Fin                   ;Programm beenden
                   ret
Fehler2            endp
;
Int_tab_loeschen   proc
                   mov ah,41h                ;Funktion Datei lschen
                   lea dx,Int_tab            ;Offset des Dateinames bergeben
                   int 21h
                   ret
Int_tab_loeschen   endp
;
Int_tab_oeffnen    proc
                   mov ah,3dh                ;Funktion Datei ffnen
                   lea dx,Int_tab            ;Offset des Dateinamens bergeben
                   mov al,02                 ;Schreib- und Lesezugriff
                   int 21h
                   jnc OK2                   ;wenn CF=0 wurde Datei geffnet
                   cmp ax,4                  ;wenn CF=1/Fehlercode 4 => zuviele
                   jz Fehler2                ;                 Dateien geffnet
             OK2:  mov handle,ax             ;sichern des Dateihandles
                   ret
Int_tab_oeffnen    endp
;
Int_tab_schlieszen proc
                   mov ah,3eh                ;Funktion Datei schlieen
                   mov bx,Handle             ;Dateihandle bergeben
                   int 21h
                   ret
Int_tab_schlieszen endp
;
Int_tab_schreiben  proc                      ;Vek_add_puf mit Adressen laden
                   mov cx,100h               ;Schleifenzhler auf 256 setzen
        Puf_laden: xor ax,ax                 ;ax-Register lschen
                   mov al,Int_num            ;al mit laufender Int_num laden
                   push cx                   ;sichern des Schleifenzhlers
                   mov cl,2
                   sal ax,cl                 ;Displacement: 4 * Int_num
                   mov di,ax                 ;Index setzen
                   call Vek_add_holen        ;Int_add aus Speicher holen
                   mov ax,Int_off
                   mov Vek_add_puf[di],ax    ;Offset bertragen
                   mov ax,Int_seg
                   mov Vek_add_puf[di]+2,ax  ;Segment bertragen
                   inc Int_num               ;nchste Interruptnummer festlegen
                   pop cx                    ;Schleifenzhler vom Stack holen
                   loop Puf_laden            ;solange cx > 0:Sprung
                                             ;Vek_add in Int_tab schreiben
                   call Vek_add_schreiben    ;Vek_add_puf auf Disk schreiben
                   ret
Int_tab_schreiben  endp
;
Vek_add_holen      proc                      ;aus aktueller Tabelle im Speicher
                   mov ah,35h                ;Funktion Interruptadresse lesen
                   mov al,Int_num            ;Interruptnummer bergeben
                   int 21h
                   mov Int_seg,es            ;Segment des Interrupts festhalten
                   mov Int_off,bx            ;Offset des Interrupts festhalten
                   ret
Vek_add_holen      endp
;
Vek_add_lesen      proc                      ;aus der Datei Int_tab
                   mov ah,3fh                ;Funktion Datei lesen
                   mov bx,Handle             ;Dateihandle bergeben
                   mov cx,400h               ;Anzahl der zu lesenden Bytes
                   lea dx,Vek_add_puf        ;Offset des Lesepuffers bergeben
                   int 21h
                   ret
Vek_add_lesen      endp
;
String_ausgabe     proc
                   mov ah,9                  ;Funktion: Ausgabe eines Strings
                   int 21h
                   ret
String_ausgabe     endp
;
Zeichen_ausgabe    proc
                   push cx                   ;alten Schleifenzhler sichern
                   push dx                   ;dx-Register sichern
                   mov cl,4                  ;Vorbereitung f. 4 bit-Verschiebung
                   mov bl,2                  ;neuen Schleifenzhler setzen
                   rol dl,cl                 ;vertauschen v.unteren 4 mit oberen
           Loop_1: and dl,0fh                ;auszugebende Hexziffer isolieren
                   cmp dl,9                  ;Vergleich mit 9
                   jbe kleiner_gleich_9      ;wenn Zahl kleiner/gleich 9: Sprung
                   add dl,37h                ;Ascii-Zeichen A-F vorbereiten
                   jmp weiter
 kleiner_gleich_9: add dl,30h                ;Ascii_Zeichen 0-9 vorbereiten
           weiter: mov ah,02                 ;Funktion Zeichen ausgeben
                   int 21h
                   pop dx                    ;dx v.Stack holen f.nchste Hexzif.
                   push dx
                   dec bl                    ;Schleifenzhler um 1 erniedrigen
                   jnz Loop_1                ;Sprung,solange bis dl = 0
                   pop dx                    ;dx-Register vom Stack holen
                   pop cx                    ;alt. Schleifenzhler v.Stack holen
                   ret
Zeichen_ausgabe    endp
;
Zeichen_eingabe    proc
                   mov ah,01                 ;Funktion Zeicheneingabe
                   int 21h
                   mov Zeichen,al            ;Ascii-Wert in Zeichen bergeben
                   ret
Zeichen_eingabe    endp
;
Alt_ausgabe        proc
                   add Zeile,1               ;Cursor in die nchste Zeile
                   mov Spalte,17             ;Cursor unter 'Bestand' setzen
                   call Cursor_position
                   lea dx,Alt                ;Ausgabe von 'alt'
                   call String_ausgabe
                   mov Spalte,27             ;Cursor unter 'Segment' setzen
                   call Cursor_position
                   mov dl,byte ptr Vek_add_puf[di]+3 ;altes Segment ausgeben
                   call Zeichen_ausgabe
                   mov dl,byte ptr Vek_add_puf[di]+2
                   call Zeichen_ausgabe
                   mov Spalte,35             ;Cursor unter 'Offset' setzen
                   call Cursor_position
                   mov dl,byte ptr Vek_add_puf[di]+1 ;alten Offset ausgeben
                   call Zeichen_ausgabe
                   mov dl,byte ptr Vek_add_puf[di]
                   call Zeichen_ausgabe
                   sub Zeile,1
                   ret
Alt_ausgabe        endp
;
Videomodus         proc
                   mov ah,0fh                ;Bestimmung des Videomodus
                   int 10h
                   mov Vmodus,al             ;Videomodus festhalten
                   mov Bseite,bh             ;akt. Bildschirmseite festhalten
                   ret
Videomodus         endp
;
Bloesch            proc
                   mov ah,00                 ;Bild lschen d. Videom. setzen
                   mov al,Vmodus             ;Videomodus bergeben
                   int 10h
                   ret
Bloesch            endp
;
Cursor_position    proc
                   mov ah,02                 ;Funktion Cursor positionieren
                   mov bh,Bseite             ;Nummer d.aktuellen Bildschirmseite
                   mov dh,Zeile              ;Zeilennummer bergeben
                   mov dl,Spalte             ;Spaltennummer bergeben
                   int 10h
                   ret
Cursor_position    endp
;
Curs_pos_bestimmen proc
                   mov ah,03                 ;Funktion Cursorposition bestimmen
                   mov bh,Bseite             ;Nummer d.aktuellen Bildschirmseite
                   int 10h
                   mov Zeile,dh              ;Ausgabe der aktuellen Zeilennummer
                   mov Spalte,dl             ;Ausgabe d. akt.  Spaltenposition
                   ret
Curs_pos_bestimmen endp
;
;
Anfang:            call Int_tab_erstellen    ;Datei Int_tab erstellen
                                             ;wenn vorhanden: ffnen
                                             ;wenn nicht vorh.:erstellen+ffnen
                   cmp Schalter,1            ;Prfung ob Int_tab vorhanden
                   jz Vergleich              ;Sprung zu Vergleich
;
                   call Int_tab_schreiben    ;aktuelle Vektortabelle schreiben
;
                   lea dx,Meldung_1          ;Adresse von Meldung_1 bergeben
                   call String_ausgabe       ;Meldung_1 ausgeben
                   jmp Ende                  ;Programm beenden
;
                                             ;Bildschirmaufbau
        Vergleich: mov Schalter,0            ;Schalter rcksetzen
                   call Videomodus           ;Vmodus und Bseite feststellen
                   call Bloesch              ;Bildschirm lschen
                   lea dx,Ueberschrift       ;Programmtitel ausgeben
                   call String_ausgabe
                   lea dx,Text               ;Textzeile ausgeben
                   call String_ausgabe
;
                   call Vek_add_lesen        ;Adressen von Int_tab in d.Puffer
;
                   mov cx,100h               ;Schleifenregister initialisieren
;
           Loop_2:                           ;Ausgabe der Interruptnummer
                   mov Spalte,7              ;Cursor unter 'Interrupt' setzen
                   call Cursor_position
                   mov dl,Int_num            ;Interruptnummer ins dl-Register
                   call Zeichen_ausgabe      ;Ausgabe der Interruptnummer
;
                   mov Spalte,17             ;Cursor unter 'Bestand' setzen
                   call Cursor_position
                   lea dx,Neu                ;Ausgabe von 'neu'
                   call String_ausgabe

                                             ;Ausgabe des neuen Segments
                   mov Spalte,27             ;Cursor unter 'Segment' setzen
                   call Cursor_position
;
                   call Vek_add_holen        ;Vek_add aus Speicher bestimmen
                   mov dl,byte ptr Int_seg+1 ;hherwertige Byte v.Seg.vorbereit.
                   call Zeichen_ausgabe      ;Ausgabe des hherwertigen Bytes
                   mov dl,byte ptr Int_seg   ;niederwertiges Byte vorbereiten
                   call Zeichen_ausgabe      ;niederwertiges Byte ausgeben
;
                                             ;Ausgabe des neuen Offsets
                   mov Spalte,35             ;Cursor unter 'Offset' setzen
                   call Cursor_position
                   mov dl,byte ptr Int_off+1 ;hherwertiges Byte v.Offset vorbe.
                   call Zeichen_ausgabe      ;Ausgabe des hherwertigen Bytes
                   mov dl,byte ptr Int_off   ;niederwertiges Byte vorbereiten
                   call Zeichen_ausgabe      ;Ausgabe des niederwertigen Bytes
;
                                             ;Vergleich durchfhren
                   xor ax,ax                 ;ax-Register auf 0 setzen
                   mov al,Int_num            ;Interruptnummer bergeben
                   push cx                   ;Schleifenzhler sichern
                   mov cl,2
                   sal ax,cl                 ;Displacement: 4 * Int_num
                   mov di,ax                 ;Displacement setzen
                   jmp Bruecke
;
            Hilfe: jmp loop_2
;
          Bruecke: call Alt_ausgabe          ;Ausgabe von 'alt' mit Seg+Off
                                             ;Vergleich durchfhren
                   mov ax,Int_seg            ;Int_seg vom Speicher laden
                   cmp ax,Vek_add_puf[di]+2  ;Vergleich mit Int_seg aus Int_tab
                   jnz Ungleich              ;wenn nicht gleich: Sprung
                   mov ax,Int_off            ;Int_off vom Speicher laden
                   cmp ax,Vek_add_puf[di]    ;Vergleich mit Int_off aus Int_tab
                   jnz Ungleich              ;wenn nicht gleich: Sprung
;
                   mov Spalte,45             ;Cursor unter 'Status' setzen
                   call Cursor_position
                   lea dx,Meldung_3          ;Meldung_3 bergeben
                   call String_ausgabe       ;Meldung_3 ausgeben
                   jmp short Neuer
;
         Ungleich: mov Schalter,1            ;wenn ungleich  => Frage
                   mov Spalte,43
                   call Cursor_position
                   lea dx,Meldung_4          ;Meldung_4 bergeben
                   call String_ausgabe       ;Meldung_4 ausgeben
                   add Zeile,2               ;Zeilenvariable um 2 erhhen
            Neuer: pop cx                    ;Schleifenzhler vom Stack holen
                   inc Int_num               ;nchster Interrupt
                   loop Hilfe
;
            Frage: cmp Schalter,1            ;Vergleich, ob Schalter gesetzt
                   jnz Alles_klar            ;wenn cx = 0: Frage ausgeben
                   lea dx,Frage_1            ;Offset von Frage bergeben
                   call String_ausgabe
                   call curs_pos_bestimmen   ;aktuelle Cursorposition bestimmen
                   inc Spalte                ;Cursor um 1 nach rechts
                   call Cursor_position      ;Cursor auf Eingabeplatz
                   call Zeichen_eingabe      ;J/N eingeben
                   cmp Zeichen,'j'           ;Vergleich mit 'j'
                   jz Ueberschreiben         ;wenn 'j':Sprung zu Int_tab schrei.
                   cmp Zeichen,'J'           ;Vergleich mit 'J'
                   jz Ueberschreiben         ;wenn 'J':Sprung zu Int_tab schrei.
                   jmp Ende                  ;wenn nicht: Programm beenden
;
       Alles_klar: lea dx,Meldung_2          ;Meldung_2 bergeben
                   call String_ausgabe       ;Ausgabe von Meldung_2
                   jmp short Ende            ;Programm beenden
;
   Ueberschreiben: call Int_tab_schlieszen   ;Int_tab schlieen
                   call Int_tab_oeffnen      ;Int_tab ffnen
                   mov Int_num,0             ;Interruptnummer auf Beginn stellen
                   call Int_tab_schreiben    ;aktuelle Vektortabelle schreiben
;
Ende:              call Int_tab_schlieszen   ;Int_tab schlieen
                   lea dx,Meldung_5          ;Meldung_5 ausgeben
                   call String_ausgabe
              Fin: mov ah,4ch
                   int 21h
;
code ends
     end start
Spooler
Otto Heilig, Franz Lckl, TGM, 4ANA89 (Diskette TGM-136)
Dieses Programm wird ohne Argumente aufgerufen und installiert einen 64k Puffer als Spooler. Defaultmig wird der Drucker Nr. 1 verwendet. Bei einem 2. Aufruf erscheint die Abfrage " Druckerpuffer lschen (J/N) ? ", bei der Eingabe von j wird der Spooler-Speicherbereich gelscht. Das Programm kann nur durch Ctrl-Alt-Del gelscht werden.
Kommandos des Drucker-Interrupts
0: Drucken eines Zeichen, das sich im AL-Register befindet. Versuch an einen Drucker ein Zeichen zu senden, der ausgeschaltet ist: Bit Nummer 0 im AH-Register gesetzt (Device-Timeout)
1: Der im DX-Register angegebene Drucker wird zurckgesetzt; die INIT-Leitung wird aktiviert.
2: Der Status des gewhlten Druckers im AH-Register wird zurckgegeben. 
Kommandos des Tastatur-Interrupts
0: Warten auf einen Tastendruck. Wenn eine Taste gedrckt wurde, so ist der Scancode der Taste im AH, das ASCII-Zeichen im AL-Register.
1: Bestimmung des Tastaturstatus. Wird eine Taste gedrckt, so wird das Zeroflag im Prozessorstatusregister zurckgesetzt. Die folgende Programmsequenz wartet also auf einen Tastendruck :
               KEY:  MOV AH,1                     INT 16h                     JZ KE

2: Status der Ctrl-, Alt- und Shifttasten wird ins AL-Register geschrieben. Aufruf mit Interrupt 16 und AH = 2.
title   DRUCKER PUFFER FR IBM PC's
        page 66,80

        dos     equ 21h                    ; DOS Interrupt
        intr    equ 16h                    ; Keyboard interrupt
        print   equ 17h                    ; BIOS Drucker I/O
        printer equ 0                      ; erster Drucker

comment *

        DOS Drucker-Puffer mit  64 kByte als Pufferspeicher

        *

        d0      segment para 'data'             ; 1. Datensegment
                buf0    dw 4000h dup (?)
        d0      ends

        d1      segment byte 'data'             ; 2. Datensegment
                buf1    dw 4000h dup (?)
        d1      ends

c               segment para 'code'             ; Programm-Segment
                assume  cs:    c, ds:c

                org     100h

pr_buf          proc far
                sti                             ; Setzen des Interrupt-Flags
                push    ds                      ; Register sichern
                push    bx
                push    dx
                push    ax
                pushf
                mov     ax,cs                   ; Datensegment holen
                mov     ds,ax
                mov     bx,[pi]
                cmp     bx,[pp]                 ; Ist etwas zu drucken ?
                je      no_print                ; Nein - weiter mit Interrupt
                                                ; chain
                mov     ah,2
                mov     dx, [printer]           ; Drucker-Status  holen
                pushf
                call    ds:[pr_intr]            ; BIOS Routine aufrufen
                test    ah,80h                  ; Drucker bereit ?
                jz      no_print                ; Nein
                push    ds
                mov     ds,cs:[d_seg]           ; Datensegment holen
                mov     al,[bx]                 ; Character holen
                pop     ds
                xor     ah,ah                   ; Kommando um ein Zeichen zu
                                                ; drucken
                mov     dx,printer              ; Drucker-Nummer holen
                pushf                           ; Datenregister sichern
                call    ds:  [pr_intr]
                inc     bx
                mov     [pi],bx
no_print:
                popf
                pop     ax
                test    ah,ah                   ; Hole Tastatur-Kommando ?
                jnz     l1                      ; Nein - Rufe BIOS-Routine
;
l0:
                mov     ah,1                    ; Warten auf einen Character
                int     intr                    ; Aufruf der Intr-routine
                jz      l0
                xor     ah,ah
l1:
                pop     dx
                pop     bx
                pop     ds
                jmp     cs:[key_intr]           ; Aufruf der BIOS-Routine
pr_buf          endp

pr_irq          proc    near
                push    ds
                push    bx
                push    dx                      ; Registers abspeichern
                push    ax
                test    ah,ah
                jz      pr_buf0                 ; Ist ein zeichen zu drucken ?
                pop     ax
                mov     ah,90h                  ; Das aufrufende Programm erhlt
                                                ; Signal "Drucker fertig"
                jmp     short cont0
pr_buf0:
                mov     bx,cs
                mov     ds,bx                   ; Datensegment holen
                mov     bx, [pp]                ; Zeiger des Druckerpuffers
                                                ; holen
                push    ds
                mov     ds,cs:[d_seg]           ; Puffersegment holen
                mov     [bx],al                 ; Speichere Byte
                pop     ds
                inc     bx                      ; Erhhe Puffer um 1
                mov     [pp],bx                 ; Wenn 64k erledigt sind ,
                                                ; BX wird geteilt durch 0
                pop     ax
                mov     ah,90h                  ; Das aufrufende Programm erhlt
                                                ; Signal "Alles in Ordnung"
cont0:
                pop     dx
                pop     bx                      ; Register zurckholen
                pop     ds
                iret                            ; Return from interrupt
pr_irq          endp

                pp       dw 0
                pi       dw 0
                key_intr dd ?
                pr_intr  dd ?
                d_seg    dw ?
;
start           proc    near
                mov     ax,cs
                mov     ds,ax
                mov     ax,35h shl 8+intr       ; Hole alten Keyboard Vector
                int     dos
                cmp     bx,offset pr_buf        ; Puffer bereits installiert ?
                jnz     not_inst                ; Nein
                mov     ah,9
                mov     dx,offset mess          ; Print Fehlermeldung
                int     dos
                mov     ah,1                    ; Hole Tastatureingabe
                int     dos
                or      al,20h                  ; Umwandeln in Grobuchstaben
                cmp     al,"j"                  ; Pufferspeicher lschen ?
                jne     no_clear                ; Nein
                xor     ax,ax
                mov     es:[pp],ax              ; Pointer zurcksetzen
                mov     es:[pi],ax
                mov     es,es:[d_seg]           ; Puffersegment holen
                mov     cx,length buf0*2        ; Pufferlnge in words
                mov     di,ax                   ; Start-Adresse
                rep     stosw                   ; Puffer lschen
no_clear:
                mov     ax,4c00h                ; Abbruch des Programmes mit
                                                ; MS-DOS Call
                int     dos
not_inst:
                mov     word ptr [key_intr],bx  ; Sichern fr die Interruptkette
                mov     word ptr [key_intr+2],es
                mov     dx,offset pr_buf
                mov     ax,25h shl 8+intr       ; Neuen Tastaturvektor setzen
                int     dos
                mov     ax,35h shl 8+print      ; Alten Drucker-I/0-Interr.-
                                                ; Vektor sichern
                int     dos
                mov     word ptr [pr_intr],bx   ; Sichere alten 17h Vektor
                mov     word ptr [pr_intr+2],es
                mov     dx, offset pr_irq
                mov     ax,25h shl 8+print      ; Neuen Drucker-I/0-Interr.-
                                                ; Vektor setzen
                int     dos
                xor     ax,ax
                mov     word ptr [pi],ax        ; Zhler lschen
                mov     word ptr [pp],ax
                mov     ax,d0
                mov     [d_seg],ax              ; Puffer Segment Adresse lagern
                mov     es,ax
                xor     ax,ax
                mov     di,ax                   ; Start bei 0
                mov     cx,length buf0*2        ; 32768 words zu lschen
                push    cx
                rep     stosw
;
                mov     dx,offset m             ; Drucker Begrungsbotschaft
                mov     ah,9
                int     dos
                mov     dx,1000h                ; Puffer Gre (64k) in
                                                ; Abschnitten
                mov     bx,100h                 ; Berechne Programmgre
                add     bx,offset start
                mov     cl,4
                shr     bx,cl                   ; In Abschnitte umwandeln
                add     dx,bx
                inc     dx
                mov     ax,3100h                ; DOS - Resident Aufruf
                int     dos
                start   endp
                mess    db 13,10,"Drucker-Puffer bereits installiert!",13,10
                        db "Drucker-Puffer lschen (j/n)? $"
                m       db 13,10, "Drucker-Puffer ist jetzt fertig installiert."
                        db " Druckerdaten werden in 64 kByte"
                        db 13,10, "des Systemspeichers gepuffert.",13,10,"$"
c               ends

            end start
LPTXCHG
Eduard ERHART, 4ANA90 (Diskette TGM-136)
Das Programm LPTXCHG dient zum Austauschen von Portadressen zwischen zwei parallelen Schnittstellen im PC. Unter MSDOS knnen blicherweise vier Drucker angeschlossen werden. Die Gertetreiber werden dann unter den Namen LPT1 bis LPT4 angesprochen. 
Standardsoftware und bedienungsfreundliche Programme erlauben whrend der Ausfhrung oder bei der Installation die Auswahl eines beliebigen Druckeranschlues. Die Standarddruckerausgabe fhrt MSDOS ber LPT1 durch und setzt diesen PRN gleich. Schon in den Betriebssystemprogrammen PRINT und GRAPHICS mu der Port extra angegeben werden, was leicht lstig fallen kann. Auch gibt es eine Vielzahl kleiner Programme, deren Umstellung auf einen anderen Druckerport unmglich oder zumindest undokumentiert ist. 
LPTXCHG, in AUTOEXEC.BAT eingebunden, behebt diesen Mangel. 
Bedienung
LPTXCHG wird von der Kommandozeile aus mit Parametern versorgt. Der Aufruf erfolgt durch den Namen und den Ziffern der zu tauschenden Drcukeranschlsse.
   LPTXCHG 12

Die obige Zeile bewirkt das Vertauschen der Druckerports von LPT1 mit LPT2. Durch das Tauschen der Adressen erspart man sich das Speichern der alten Werte. Alle Ausdrcke, die das Programm an LPT2 schickt, werden nach LPT1 umgeleitet. Durch erneuten Aufruf mit denselben Parametern wird der alte Zustand wiederhergestellt. 
Fehlermeldungen
Bei falschen Parameterangaben kennt das Programm drei Fehlermeldungen:
"Die Parameter in der Kommandozeile sind unrichtig""Es sind keine Paramtere in der Kommandozeile""Der angegebene Druckeranschlu ist nicht installiert"

Ist im Rechner keine entsprechende Einsteckkarte vorhanden, erkennt das Programm dies und unterbricht die Ausfhrung. 

title	lptxchg - vertauscht Portadressen von lptn (n=1..4)


biosseg	equ	0040h	; BIOS-Datensegment	


code	segment para
	assume 	cs:code,ds:code
	org	100h

main:	jmp	begin	; Datenbereich berspringen


	; DATEN
	; -----


	; Fehlermeldungen
	; ---------------

wrong	db	'Die Parameter in der Kommandozeile sind unrichtig$'
noparr 	db	'Es sind keine Parameter in der Kommandozeile$'
swap	db	'Portadressen sind ausgetauscht$'
noprint db	'Der angegebene Druckeranschlu ist nicht installiert$'



	;PROGRAMM
	;--------
	
	;DS zeigt bereits auf Segmentvorspann

begin: 	push	ds		; ds sichern
	mov 	si,80h          ; Offset vom Diskettenzwischenspeicher
	xor 	cx,cx           ; CX mit Lnge der Kommandozeile laden
       	mov 	cl,[si]
       	jcxz 	noparaerr       ; Parameter vorhanden?
	cmp	cl,3		; stimmt die Lnge(2 Zeichen)?
	jne	paraerr


lesen: 	mov 	al,[si+2]       ; erstes Zeichen ins AL-Register
	mov	bl,[si+3]	; zweites Zeichen ins bl

	sub	al,48d		; aus ASCII Dezimalzahl
	sub	bl,48d

	push	bx		; bx sichern
	add	bl,al		; Summe der Parameterwerte bilden
	cmp	bl,2		; Summe mu mindestens 3 sein
	jbe	paraerr 	; wenn kleiner, ...
	cmp	bl,8		; Summe darf max 7 (lpt3+lpt4) 
	jae	paraerr		; wenn grer,...
	pop	bx		; bx rckholen

;	Adresstabelle 
;	lpt	offset
;	--------------
;	1  ->	8	
;	2  ->	10
;	3  ->	12
;	4  ->	14		
; 	offset = lpt*2+6

	mov	cx,biosseg
	mov	ds,cx		; Bios-datensegment 40hex als neuer
				; Datenbereich
	xor	si,si		; si lschen
	mov	si,ax		; erste Printernummer
	call	calc 		; offset in si bilden
	mov	cx,word ptr [si]; erste Druckerportadresse zwischenspeichern
	push 	si	     	; ersten offset zwischenspeichern
	cmp	cx,0		; installiert???
	je	printer

	xor	si,si		; si lschen
	mov	si,bx		; zweite Printernummer
	call 	calc		; offset
	mov	dx,word ptr [si]; zweite Adresse speichern
	cmp	cx,0		;installiert???
	je	printer	

	mov	word ptr [si],cx; erste Adresse an Platz der zweiten speichern
	pop	si		; ersten offset
	mov	word ptr [si],dx; zweite Adresse an Platz der ersten speichern

	pop	ds		; altes ds wieder herstellen
	mov	dx,offset swap

message:
	mov	ah,09h		; Stringausgabe
	int	21h
bye:	mov	ah,4ch		; zurck zum DOS
	int 	21h

noparaerr:
	call	beep
	mov	dx,offset noparr
	jmp	message

paraerr:
	call	beep
	mov	dx,offset wrong
	jmp	message 

printer:
	call	beep
	pop	ds
	pop	ds		; mit altem ds
	mov	dx,offset noprint
	jmp	message

;--------------------------------------------------
beep	proc	near
	mov	ah,2
	mov	dl,7
	int	21h
	ret
beep	endp
;----------------------------------------------------
calc	proc	near
	add	si,si	; si verdoppeln
	add	si,6	; Adresse bilden laut Formel
	ret
calc	endp
;----------------------------------------------------

code	ends
	end	main

AUTOASK
R. Syrovatka, TGM (Diskette TGM-136: AUTOASK.COM, AUTOASK.ASM)
Das Programm AUTOASK.COM entstand aus der Notwendigkeit heraus, bei einem nicht besetzten Rechner im Netzwerk automatisch die Netz-Software zu laden, wenn er ferneingeschaltet wurde.
In die AUTOEXEC.BAT-Datei des unbesetzten Rechners wurden folgende Zeilen aufgenommen:
	...
	echo SOLL NETZWERK GELADEN WERDEN  J/N
	autoask
	if errorlevel 1 goto weiter
	Netz
	...
	:weiter
	...
Nach dem Ferneinschalten, das ber eine eigene Netzzuleitung erfolgte, lud der Rechner dann automatisch nach dem BOOTEN die Netz-Software. Wurde dieser Rechner hingegen fr eigene Anwendungen selbst hochgefahren, konnte das Laden durch Eingabe von N unterbunden werden, wodurch der gesamte Speicher fr die Anwender-Software zur Verfgung stand.
Nun zum Programm selbst. Das Source-Listing ist ziemlich ausfhrlich dokumentiert, deshalb sollen, vor allem fr ASSEMBLER-Neulinge, nur einige Schwerpunkte besprochen werden:
Da das Programm spter als .COM-Programm laufen soll, ist die ORG100h-Direktive erforderlich:
	ORG   100h	;jedes .COM-Programm beginnt an der
		;OFFSET-Adresse 0100h mit einem
		;ausfhrbaren Befehl

	ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG

START  PROC  NEAR
	NOP	;Erster ausfhrbarer Befehl fr autoask.COM
	NOP
	NOP
	JMP  INIT1

Bei INIT wird zunchst berprft, ob beim Aufruf von AUTOASK Parameter angegeben wurden. Als Parameter kommen eine ein- oder zweiziffrige Zahl oder das Fragezeichen in Frage. Alle brigen Zeichen werden ignoriert. Der Eingabepuffer beginnt bei 80h, wobei als erstes die Anzahl der im Anschlu an den Programmaufruf eingegebenen Zeichen steht (das abschlieende CARRIAGE RETURN wird dabei nie mitgezhlt!). Wurden keine Parameter angegeben, so wird bei INIT2 der vorgegebene Wert von 5 Sekunden (AH=0, AL=5) in den Speicherplatz fr die Verzgerungszeit DLY geladen. Wurde ? bergeben, so wird der HELP-Bildschirm angezeigt:
INIT1:	
MOV  SI,80h			;80h = Beginn des Kommandopuffers
	MOV  AL,[SI]	;Anzahl der Zeichen im Puffer (ohne abschlieendes CR)
	CMP  AL,0		;wenn 0 keine weitere Eingabe
	JE   INIT2

	XOR  AH,AH
	ADD  SI,AX	; = letztes Zeichen im Eingabepuffer (vor CR)
	MOV  AL,[SI]
	CMP  AL,"?"     	;bei ? Helpmen aufrufen und beenden
	JE   HELP

Nun erfolgt die berprfung, ob die eingegebenen Zeichen tatschlich Ziffern sind (mssen zwischen 30h und 39h liegen!). Ist dies nicht der Fall wird wieder mit der Standardeinstellung bei INIT2 fortgefahren. Bei einer gltigen Ziffer wird diese vom ASCII-Wert in den Dezimalwert (= Hexwert) umgewandelt und in der entsprechenden Speicherstelle (EINER bzw. ZEHNER) gespeichert. 

	CMP  AL,30h		;ASCII-Zahl 0 = 30h
	JC   INIT2		;wenn CARRY - keine Zahl
	CMP  AL,40h		;ASCII-Zahl 9 = 39h
	JNC  INIT2		;wenn noch kein CARRY, dann keine Zahl
	SUB  AL,30h		;ASCII-Zahl in Dezimalwert umwandeln
	MOV  EINER,AL	;Einerstelle sichern

	DEC  SI
	MOV  AL,[SI]
	CMP  AL,30h		;ASCII-Zahl 0 = 30h
	JC   INIT2		;wenn CARRY - keine Zahl
	CMP  AL,40h		;ASCII-Zahl 9 = 39h
	JNC  INIT2		;wenn noch kein CARRY, dann keine Zahl
	SUB  AL,30h		;ASCII-Zahl in Dezimalwert umwandeln
	MOV  ZEHNER,AL	;Zehnerstelle sichern

Die in EINER und ZEHNER gespeicherten Werte werden nun in AL addiert und als "Verzgerungszeit" in DLY gespeichert:
INIT2:
	MOV  AL,EINER		;Verzgerungszeit ermitteln: Fr jede
	MOV  AH,ZEHNER		;Zehnerstelle in AH werden 10 zu AL, in
IN2:	SUB  AH,1			;dem bereits die Einer stehen, addiert.
	JC   IN4
	ADD  AL,10
	JMP  IN2

IN4:	MOV  DLY,AL	;Verzgerungszeit in DLY

Bei INIT3 wird der Vektor (Interrupt-Adresse) des USER TIMER INTERRUPTS gesichert und auf die Adresse der AUTOASK-Routine umgeleitet. Fortan wird bei jedem Auftreten des USER TIMER INTERRUPTS (18,2 mal in der Sekunde) die Routine DELAY angesprungen, der Wert in COUNT um 1 verringert und der USER TIMER INTERRUPT an die ursprngliche Vektoradresse weitergereicht (JMP DWORD PTR CS:TIMER): 
DELAY:	STI		;Interrupts wieder zulassen
	PUSH DS
	PUSH CX
	PUSH CS
	POP  DS 		;da Einsprung ber INT Datensegment setzen
	MOV  CL,COUNT	;Timer-Interrupt kommt 18,2 mal pro Sekunde,
	DEC  CL		;nach 18 mal, also nach etwa 1 Sekunde ist
	JZ   DLY4		;CL und damit COUNT = Null geworden.
DLY2:MOV  COUNT,CL
	POP  CX
	POP  DS 		;altes Datensegment wiederherstellen
	JMP  DWORD PTR CS:TIMER

Ist COUNT schlielich Null geworden (nach 18 mal der Fall, entspricht etwa einer Sekunde) wird DLY um 1 verringert und, falls DLY noch nicht Null ist, der Zhler COUNT erneut mit dem Wert 18 geladen: 
DLY4:MOV  CL,DLY
	OR   CL,CL		;ist DLY schon Null ? Wenn nicht
	JZ   DLY6
	DEC  CL		;DLY um 1 verringern und COUNT wieder
	MOV  DLY,CL
DLY6:	MOV  CL,18		;auf 18 stellen fr neuen Durchgang
	JMP  DLY2

Nach dieser Installation wartet AUTOASK in der "Zeitschleife" solange, bis entweder der Wert in DLY Null geworden ist oder aber eine "gltige Taste" bettigt wurde. 
;********** ZEITSCHLEIFE ANFANG **********************************

BEGINN: BEEP
BEG2:MOV  AH,0Bh		;Wurde ein Zeichen ber Tastatur eingegeben?
	INT  21h		;Rckgabe:  AL = 00   kein Zeichen
	OR   AL,AL		;		  AL = FF   Zeichen verfgbar
	JNZ  EINGABE
	MOV  AL,DLY
	OR   AL,AL
	JZ   EIN2
	JMP  BEG2		;Solange, bis entweder eine Eingabe erfolgt
				;oder DLY Null geworden ist.

;********** ZEITSCHLEIFE ENDE ************************************

Gltige Zeichen bei der Eingabe sind nur J und N, wobei es gleichgltig ist, ob die Eingabe in Klein- oder Grobuchstaben (unterscheiden sich nur im Bit 5) erfolgt. Dies wird durch Setzen des Bits 5 (OR AL,00100000b) erreicht. Bit 5 ist bei Grobuchstaben ohnedies 1, bei Kleinbuchstaben wird es durch die ODER-Funktion auf 1 gesetzt.
EINGABE:
	MOV  AH,07h			;Console Char.Input ohne Echo, Zeichen in AL
	INT  21h
	OR   AL,00100000b		;Gro- in Kleinbuchstaben umwandeln
	CMP  AL,"j"
	JE   EIN2
	CMP  AL,"n"
	JE   EIN4
	JMP  BEGINN

EIN2:	MOV  ERR,0
	JMP  SHORT ENDE

EIN4:	MOV  ERR,1
	JMP  SHORT ENDE

Wurde J eingegeben oder ist die Zeit ohne Eingabe abgelaufen, wird ERR=0 gesetzt, bei einer Eingabe von N wird ERR=1 gesetzt. Mit ENDE2 wird das Programm beendet und in AL dieser ERRORLEVEL an das aufrufende Programm - meist das Betriebssystem - bergeben. Im Betriebssystem kann dieser ERRORLEVEL, z.B. in einer BATCH-Datei abgefragt werden.
ENDE2:	BEEP

	MOV  AL,ERR		; AL = Beendigungscode (ERRORLEVEL ERR)
	MOV  AH,4Ch		; Programm beenden
	INT  21h


LOGO WRITER 2.0
                            LOGO WRITER 2.0                           
                            H A N D B U C H                           
                             Version 1.00                             


TASTENBELEGUNG:

F 1 : selektiert einen Textbereich
F 2 : lscht (selektierten) Text heraus und speichert ihn zum Verschieben im Speicher "clipboard"
F 3 : kopiert (selektierten) Text heraus und speichert ihn wie bei F2
F 4 : fgt den, mit <F2> od. <F3>, gewhlten Text an beliebiger Stelle ein.
F 6 : LSCHT , z.B. Textzeilen, aber auch Dateien !!!
F 8 : dient zum Beschriften von Graphikseiten (Text = Graphik !) falscher Text wird durch berschreiben mit dem selben Inhalt beseitigt.
F 9 : schaltet die Schildkrte auf die Cursortasten um (turtle move)
F 10 : ruft das Programm HELP.LWR auf (wenn vorhanden)
ESC : verlt die, mit den F-Tasten, angewhlten Modi.

Ctrl - U : (UP) -> schaltet von der Kommandozeile in die Textseite Text im Textmodus !!!
Ctrl - D : schaltet in die Kommandozeile zurck
Ctrl - F: schaltet auf die Programmierseite (flip-side) und wieder zurck !!
Ctrl Break / Ctrl - S :  stoppt alles
Ctrl <--- : an den Anfang der Zeile
Ctrl ---> : an das Ende der Zeile
Del, Ins, PgUp, PgDn, Home, End : exakte MS DOS Funktion !


STARTEN DES LOGOWRITERS :

nach dem Titelbild erscheint das Inhaltsverzeichnis :


Logowriter----------------contents---------------------------------

New page
Shapes

help
+ alle gespeicherten *.lwr Dateien

Mit dem Cursor whlt man 
          - eine neue Seite
          - die vordefinierten Cursorzeichen (shapes)
          - bereits vorhandene Programme

ERSTELLEN EINER NEUEN SEITE :

-----------------------------????----------------------------------




                            TURTLE 
                        in Position 0/0




---------------------------------------------------------------------
Kommandozeile mit blinkendem Cursor

------------------------Bildschirmende-----------------------------
Befehlseingabe in der Kommandozeile :

LOGOWRITER BEFEHLE :

forward_Punktezahl  {fd 50} bewegt die Schildkrte 50 Bildpunkte 
                            vorwrts = nach oben 
back_Punktezahl     {bk 30} rckwrts
right_Winkel        {rt 45} dreht die Turtle um 45 nach rechts
left_Winkel         {lt 30} dreht um 30 nach links

hide turtle         {ht} macht Turtle unsichtbar
show turtle         {st} zeigt sie wieder
pen erase           {pe} radiert
pen up              {pu} Turtle hinterlt keinen Strich
pen down            {pd} Strich wieder ein
pixel               {px} zeichnet einen Strich, wo keiner ist und 
                         lscht, wo einer ist.
fill                     fllt eine Figur mit der aktuellen Farbe 
stamp                    hinterlt einen Abdruck der Turtle
shade                    fllt  eine  Figur  mit   der   aktuellen 
                         Turtlefigur
Fill, stamp und shade bentigen unbedingt vorher die Befehle st und 
pd, weil sonst der Befehl nicht ausgefhrt werden kann.


FARB- UND TURTLENDERUNG                     

setc_Farbe  (setcolor)   setzt die Farbe der Turtle fest
                         Farbe: 0 - 15 (EGA)
setbg_Farbe (setbackground) Farbe des Hintergrundes 0 - 15

setsh_Turtlenummer  (set  shape)  setzt   neue   Figur   nach   dem 
                         Shape-katalog. Alle Figuren anschauen : 
                         shapes - Ende mit Esc -
 Erstellen eigener Shapes : leere Stelle im  Shapekatalog  anwhlen, 
 <Enter> -> Shape Editor : mit <Leer> sowohl einen Punkt  setzen  als 
 auch lschen - Ende mit Esc.
slowturtle               verringert Turtlegeschwindigkeit, Standard 
                         ist  fastturtle.
seth_Winkel    (set heading) richtet die Turtle nach dem Winkel aus
show heading             zeigt den Winkel der Turtle an

REORGANISATION                          

cg      clear graphik     lscht die Graphik und die  Turtle  steht 
                          wieder in der Mitte
ct      clear text        lscht Text im Textmodus 
cc      clear command     lscht alles in der Kommandozeile
rg      reset graphik     setzt die Seite in den Urzustand
                       -> Einschaltfarbe, Turtle in der Mitte
                       -> Text und Graphik gelscht !
cp      clear page        lscht Graphik/Textseite und Programm-
                          seite 
restore                   stellt die mit CP gelschten  Seiten  von 
                          der Diskette wieder her
home                      bringt Turtle immer in Bildschirmmitte

VERLASSEN DES LOGOWRITERS :
a) mit Abspeichern :

setdisk "Laufwerk         whlt ein Laufwerk zum Abspeichern
show disk                 zeigt aktuelles Laufwerk an
savepage "Dateiname       speichert die Datei unter Dateiname.LWR 
namepage "Dateiname       vergibt Dateiname und speichert.
dos                       kehrt zum Betriebssystem zurck

b) ohne Abspeichern der aktuellen Seite ;
     - clear page 
     mit Ctrl-F auf die Flip Seite und dort Esc, man befindet  sich 
     im Inhaltsverzeichnis.  Auswahl  einer  bereits  gespeicherten 
     Seite und in deren Kommandozeile  "dos" eingeben. 

DATEIEN UND INHALT:

filelist                  bringt alphabetisch geordnet alle Dateien 
                          des aktuellen Verzeichnisses
Eingabe : show filelist
contents                   bringt  alle  "pages"  (=   *.LWR)   des 
                           aktuellen Verzeichnisses
printscreen                druckt die komplette Seite
printtext                  druckt nur Text im Textmodus



MATHEMAT. OPERATIONEN                       

show 1 + 3       show 8 - 3      show 2 * 5      show 25 / 5
4                5               10              5


ERSTELLEN EINES PROGRAMMES = "procedur"              

1) Wechsel auf die Programmierseite mit Ctrl-F
-------------------------flip side---------------------------------

     ---> Programmbefehl :to
 
to quadrat
repeat 4 [fd 50 rt 90 ]
end


Programmbefehl : repeat_Zahl     Wiederholung Zahl-mal
                 end             Ende der Prozedur
-------------------------------------------------------------------
2) Zurck zur Kommandozeile wieder mit Ctrl-F

3) Eingabe von quadrat : zeichnet ein  Quadrat,  das  Wort  quadrat 
wird zu einem Logo Befehl (= tool).



Aufruf von tools in einer procedur :

1) erstellen eines tools : z.B. 6ECK
     to 6eck
     repeat 6[fd 30 rt 60]
     end
2) Einbau von "6eck" in einer neuen Prozedur :
     to stern
     repeat 6[6eck rt 60]
     end
3) Definition von Variablen fr Punktezahl und/oder Winkel :
     to kreis  :umfang
     repeat 18[fd :umfang rt 20]
     end
4) Aufruf einer Prozedur in sich selbst :REKURSION 
     to muster :umfang
     if :umfang > 100 [stop]          -->  Abbruchbedingung,  sonst 
                                      luft die Prozedur unendlich.
     kreis :umfang
     muster :umfang + 5
     end


Weitere Programmbefehle :

print "TEXT             schreibt den Text in die oberste Zeile  und 
                        macht einen Zeilenvorschub
print [Liste]          schreibt den Inhalt der [ ]

random  ZAHL             schreibt  eine   ganzzahlige   Zufallszahl 
                         kleiner als ZAHL
                         SHOW RANDOM 10     ----> z.B. 4
                         fd random 100      ----> alles < 100
show "TEXT               schreibt den Text in der Kommandozeile
show [Liste]             schreibt den Inhalt der [ ] 

                         show space  : zeigt Speicherplatz in %
                         repeat 5 [show [ Hallo Freunde ]]
                         show   bg       : zeigt Farbe des Hinter-
                                           grundes
                         show  color       :  zeigt  die   aktuelle 
                                           Vordergrundfarbe

tell turtle/turtleliste  ruft die 4 mglichen Turtles auf
          tell [0 1 2 3]
          st fd 50
          ---> bewegt alle 4 Turtles 50 Punkte nach oben

          tell 3
          st rt 90
          ---> dreht die 3. Turtle um 90

          tell all
          --->  ruft alle auf

          show who
          ---> zeigt die aktuellen Turtles an, who  gibt  die  Zahl 
               der Turtle aus

         tell all
         st
         each [repeat 4[fd 40 rt 90]]
         ---> lt alle Schildkrten der Reihe nach den Befehl  in 
               [ ] ausfhren.

         tell [1 3]
         st
         each [seth (90 * who) fd 50 ]
         ---> multipliziert den Winkel von set heading mit der Zahl 
              der aufgerufnen Turtles:
              1. Turtle dreht sich um 90 nach rechts
              3. Turtle dreht sich um 270 ber rechts

tone Frequenz Zeit   produziert einen Ton mit der Freqeunz Frequenz 
                     mit der Dauer von zeit* 1/20 Sekunde
                     tone 440 20  ---> Kammerton A eine Sekunde
wait Zeit            Pause mit der Dauer Zeit * 1/20 Sekunde

OPEN ACCESS II Vers. 2.05
W. Neidhart, BRG Spittal, Tel. 047 62 - 4084
Eine Beschreibung fr die Bentzer von Computer mit 2 
Diskettenlaufwerken, sowie mind. 640 KB RAM

Ŀ
 1.) KONFIGURATION der Disketten  

  
  OA  II  ist etwas umfangreicher als OA I und daher  empfiehlt
sich  fr  die  Verwendung mit 2  Diskettenlaufwerken  folgende
Anordnung:
  a) Startdiskette : enthlt 
         MS-DOS,  Tbge,  ramdisk 64,  misce.spi,  miscalle.spi,
       infoe.prt  und  eine autoexec.bat, die *.spi  und  *.prt
       nach C: kopiert.
         Misce.spi enthlt die komplette SPI-Konfiguration
         Miscalle.spi enthlt die Fehlermeldungen
         Infoe.prt  enthlt  die  Druckertreiber, so  z.B.  den
       Epson  FX-80,  so da man sich den DIO-55D.SYS  ersparen
       kann.
  b)  SPI Diskette = "Hilfsprogrammdiskette" von SPI, wird nach
der  Startdiskette ins Laufwerk A: gegeben und startet mit  der
Eingabe  von  'SPI'  das Programm. Nach der Auswahl  der  betr.
Option  gibt  man  die entsprechende Diskette nach  A:,  in  B:
befindet sich eine formatierte, leere Arbeitsdiskette.
  
  Man bentigt also mind. 4 Disketten :
  - MS DOS mit ramdisk
  - SPI Startdiskette
  - optionale SPI Diskette (Datenbank, Text, Kalkulation etc.)
  - Arbeitsdiskette
  
 Ŀ
 2.) KONFIGURATION von OA II 
 
  
  Nach  dem  Startaufruf whlt man im Optionenfenster :  Hilfs-
programm  -  Konfiguration  -> und erhlt  folgendes  Men  zur
Auswahl:
  PARAMETER:  
  Standarddrucker  : mit <f4> sucht man den passenden  Drucker,
dazu mu aber bereits die "Suchtabelle" definiert sein (s. u.)
  Farbeinstellung  :   hier   kann   man   mit   <f6>  zwischen
verschiedenen Farben fr den Bildschirm whlen.
  Zwischendatei  :  hier wird festgelegt, wo OA II  bei  Bedarf
Dateien  zwischenlagert,  am  besten B:, bei  gengend  RAMdisk
auch in C:.
  SUCHTABELLE  : Es empfiehlt sich mit der Ramdisk die  Vorgabe
von  B:\ , C:\ , A:\ , d.h. OA II sucht zuerst im Laufwerk B: =
Arbeitsadiskette,  dann in der Ramdisk C: (= dorf findet es die
Druckerdatei infoe.prt) und zuletzt in A:.
  ZEITTABELLE  : zur Steuerung des Desk managers (= <f8> ) kann
man  hier beliebige Zeitzonen definieren, Vorgabe ist New  York
und San Diego.
  FUNKTIONSTASTEN  :  hier  kann  man den Tasten  <f1>  -  <f8>
beliebige Zeichenfolgen zuordnen ( siehe Pkt. 3)
  DRUCKER  :  im Menpunkt Drucker kann man beliebige  Drucker-
konfigurationen  fr  den  Epson  FX-80  verfassen  (Falls  der
Drucker es berhaupt erlaubt !).
  
  In  der   Option   Hilfsprogramm   gibt   es   noch  folgende
interessante Punkte:
  DB3  =>  df/if  :  mit  dierser Option kann  man  alte  OA  I
Datenbanken  nach OA II transferieren. DF steht fr  datafiles,
IF  steht fr indexfiles, OA II trennt jetzt Datenbanken, daher
ist eine Transferierung nach OA I NICHT mehr mglich.
  BERNEHME_DATEN:  damit lassen sich fremde Textdateien  (auch
ASCII  Dateien) einlesen, leider funktioniert in der Vers. 2.05
NICHT  die  bernahme von dBase III Dateien. nach Auskunft  von
Philips  ist  dieser Fehler SPI bekannt, wird aber auch in  der
kommenden Version 2.11 nicht beseitigt. Wer noch die Vers. 2.03
zur Verfgung hat, kann dBase III Daten anstandslos bernehmen.
  GRAPHIKTREIBER  :  von der Hilfsprogrammdiskette  kann  jetzt
auch  ein  EGA Treiber geladen werden, nach meinen  Dafrhalten
ndert sich am Bildschirm nichts !!.
  
  
 Ŀ
 3.) OPEN ACCESS II      TASTATUR
 

Im Unterschied zu OA I sind nun die folgenden Tasten immer
gleich. Man kann mit der Taste <f1> jederzeit die Tasten-
belegung und eine dazupassende Information abrufen.
  <f2> : bringt einem immer das Hauptmen
  <f3> : spricht den Drucker an
  <f4>  :  Auswahl,Suchen  :  ersteres  in  der  Datenbank,  im
Inhaltsverzeichnis, zweiteres in der Textverarb.
  <f6> : ndern, sei es nun Dateinamen, Schriftart o..
  <f8>  :  Desk Manager Men : Kalender, Uhr, Weltzeiten  etc.,
beim 2.x drcken -> Taschenrechner.
  <f10> : wie eh und je : do
  
  Die  Tasten  f5,  f7  und  f9   sind  von  Option  zu  Option
verschieden und sind mit <f1> jederzeit nachzuschauen.
  
  NEU:  die  Tastenbelegung  f1  - f8  mit  frei  definierbaren
Zeichen.  Der Aufruf erfolgt ber Shift-<fx>, die Definition in
der Option Hilfsprogramme, Konfiguration,Funktionstasten.
  
  Neu:  alt-<f4>  : bringt jederzeit die ASCII Tabelle  in  ein
Fenster,  das  ausgewhlte Zeichen (ab ASCII 33) kann mit  <f7>
in  die  Anwendung  bernommen werden, z.B.  oder   ,  leider
scheitert alles am FX-80 !
  Genauso  kann   die   mit   dem   Taschenrechner  ausgefhrte
Berechnung mit <f7> in den Text bernommen werden.
  Der  Aufruf von Macros erfolgt jetzt mit alt-<f8> und  bringt
als erstes ein Macrofensteer auf den Bildschirm.
  
  Die  Kombination von Crtl-Return bringt eine neue Zeile,  die
Kombination   von   Crtl-Backslash   lscht   eine   Zeile.  !!
Funktioniert   nicht  mit  DIO-55D.SYS, daher  entfernen. Durch
den Druckertreiber FX 80 ist man auch diese "Altlast" los.
  
 Ŀ
 4.) DATENBANK  
 
  
  Die  Datenbank  wurde  vllig berarbeitet  und  entscheidend
verbessert.  Die Aufteilung in Hauptmenu I und II ist  gefallen
und dadurch wesentlich verstndlicher geworden.
  Man  beginnt  im  Hauptmenu  mit AUFBAU und  gelangt  in  ein
Untermen  zu  ANLEGEN. Hier beginnt man mit dem  Aufbau  einer
Schirmmaske, kenntlich an .SMK.
  Die  Felddefinition beginnt mit dem 2x-ligen Drcken von <f9>
und  es erscheint das Felddefinitionsfenster mit den  bekannten
Punkten.  Wenn  man  auf die shift-<fx>  Tasten  Graphikzeichen
geladen  hat,  kann  man die Schirmmaske auch mit  Rahmen  u..
versehen.
  Man  kan  bis  zu  100  Schlsselfelder  definieren  und  die
Schirmmaske  ist  15 (!) Bildschirmseiten gro. Mit <PgDn>  und
<Pgup>  kann  man  weiterblttern  - damit  ist  die  Datenbank
irrsinnig gro.
  Die  grte  nderung  gegenber  OA   I  betrifft  aber  die
Mglichkeit,  jede Datenbank jederzeit zu NDERN. Man kann  mit
dem  Menpunkt  AUFBAU  - DATEI_NDERN  jede  Schirmmaske  frei
ndern, dazu noch die Satzlnge u..
  
  Mit  dem Menpunkt EINGABE kann man jetzt Daten eingeben, die
Anzahl  der  Datenstze  ist nur durch  die  Diskettenkapazitt
begrenzt.
  
  Der Menpunkt PFLEGE erlaubt ein sortiertes Durchblttern der
Datei, mit <f6> kann man jeden Datensatz anwhlen/ndern.
  
  Mit AUFBAU - DRUCKMASKE kann man sich zu jeder Datenbank eine
Druckmaske (.PMK) anlegen. Der Text wird unterteilt in
  Kopfseite
  Gruppenseite
  Satzseite
  Fuseite
  Gruppensummenseite
  Summenseite und jede Seite kann 16 Zeilen Daten beinhalten.
  Die  Kopfseite  enthlt die berschrift und  vorgegeben  sind
Seitennummerierung    (SEITENNR)    und   das   aktuelle  Datum
(SYSDATUM).  Eigenen  Text gibt man mit <f9> ein und setzt  ihn
unter  die einfachen Anfhrungszeichen ' ', Befehlswrter,  wie
SYSDATUM  und  FELDNAMEN  etc.  werden  ohne  Anfhrungszeichen
geschrieben.
  Gruppenseite  :  hier kann man seine Datenstze in  "Gruppen"
ausdrucken lassen, z. B. bei einer Schlerliste erklrt man das
Feld  KLASSE zum Gruppennamen (mit <f2> ins Druckmaskenmen  zu
Punkt  Gruppendefinition)  und kann dann pro Seite eine  Klasse
ausdrucken. = erste Seite 1.A, zweite Seite 1.B etc.
  Satzseite  : enthlt alle Felder in frei whlbarer Anordnung,
mit  <f9>  kann  ein  Feld selektiert ,  mit  den  Cursortasten
positioniert und mit <f10> fixiert werden.
  Fuseite  :  Text  fr die letzten Zeilen einer  Seite,  oder
SEITENNR
  Gruppensummen: zu jeder def. Gruppe knnen Summen oder andere
mathem.  Berechnungen (MEAN, COUNT,MAX, MIN, SUM)  durchgefhrt
werden.
  Summenseite:  wie  in  der  Gruppensumme, nur  hier  fr  den
gesamten Datensatz.
  
 Ŀ
 5.) TEXTVERARBEITUNG
 
 
 Wegen  der  wesentliche verbesserten Textverarbeitung bin  ich
schon  sehr  frh auf OA II Vers. 2.03 umgestiegen,  Vers.  2.05
bringt  nur  kleine nderungen. Hingegen enthlt  die  Version 2.11 
ein Wrterbuch = Rechtschreibhilfe und eine  Silbentrennung,  sowie
die  Mglichkeit,  in  Spalten  zu schreiben. 
  Das Hauptmen enthlt folgende Optionen:
  LADEN : ldt vorhandene Dateien, fr Suchen <f4>
  ANLEGEN : fr Schreiben neuer Dateien, dafr braucht man aber
  STANDARD_NDERN  : eine der besten nderungen gegenber OA I.
Da  man  ja blicherweise nur wenige verschiedene  Briefformate
mit  entsprechenden   Parametern hat, kann man  hier  Standard-
dateien  definieren  und  aufrufen.  Man legt  z.  B.  folgende
Standarddateien an:
  ST_BRIEF.DOC
  ST_TEST.DOC
  ST_SERIEN.DOC
  Wenn  man  diese  Dateien auf die Startdiskette  kopiert  und
ber  die Autoexec.bat nach C: kopiert, kann man sie  jederzeit
aufrufen. (<f4> sucht die Dateien)
  TYP_NDERN  :hier  stellt man den gewnschten  Dateityp  ein.
.DOC  fr   Dokument   mit   allen   Mglichkeiten  (Parameter,
Schriftarten etc.) und .TXT fr reine ASCII Dateien.
  
  Im  Hauptmen steht einem dann mit <f2> das Kommandomen  zur
Verfgung.  Neben  der Zeilen- und Spaltenangabe in der  linken
unteren  Ecke kann man mit SEITENUMBRUCH jederzeit den  Umbruch
zu  einem  gewnschten Drucker aufrufen. Alle anderen  Optionen
sind selbsterklrend.
  ERSTELLUNG VON SERIENBRIEFEN:
  Neu:  fr  Serienbriefe  mu man die Werte der  Datenbank  in
eine  eigene Exportdatei (*.DIF) schicken. Im Serienbrief  sind
die  Felder  mit ^@FELDNAME^ zu kennzeichnen, im Druckmen  ist
dann  die  Option Serienbrief_Datei mit <f4>  auszufllen,  bei
einem    einzelnen   Serienbrief   auch   die   Option  Serien-
brief_Datensatz.
  
  Die  Textverarbeitung  stellt  nur   die  Schrifttypen  Fett,
Unter-  strichen  und Kursiv zur Verfgung. Man kann jetzt  fr
andere  Schrifttypen  eigene Druckerdateien definieren  (z.  B.
fett=  subskript,  unterstrichen=  superskript  etc.),  dadurch
wird  die Auswahl aber nicht grer. Elegant aber aufwendig ist
die  Definition eigener Steuerzeichen in der Druckerdatei unter
dem  Absatz Zeichenbersetzung -> dort stehen auch die Zeichen-
bersetzungen fr den FX-80 !
  
  Ŀ
  6.) KALKULATION 
  
  
  Die  Kalkulation  ist  im Prinzip gleich geblieben,  es  gibt
einige  praktische  Erweiterungen.   Nicht   optimal   ist  die
Einbindung  der  Graphik  in die Kalkulation,  dadurch  ist  es
nicht  mehr  mglich,  unabhngig   von  der  Kalkulation  eine
Graphik zu erstellen. 
  Im gesamten OA II gibt es als Whrungssymbol nur DM, ev. wre
es mit den Norton Ut. mglich, dies gegen S auszutauschen.
  
  Ŀ
   7.) PROGRAMMIERER  
  
  
  Dieses  Kapitel  wurde  von  mir  noch  kaum  bis  gar  nicht
ausprobiert.  ber die einfachen Beispiele der Demo-Dateien bin
ich  noch  nicht hinausgekommen und kann daher  darber  NICHTS
sagen.
  
  Da  es sich hierbei nur um einen frei in die Tasten getippten
Bericht handelt, ist mir  die  Unzulnglichkeit
vollkommen  klar. Wenn jemand dringend Rat oder Hilfe  braucht,
stehe  ich gerne zur Verfgung. Meine Schultelefonnummer  steht
am  Kopf des Berichtes, privat bin ich unter 0 47 62 - 46 5  42
bis mind. 22 Uhr zu erreichen.
  
  Ich wnsche allen Bentzern von OA II viel Erfolg.
  
  
                                                    W. Neidhart
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  *) ich schreibe mit OA II ber OA II !!
  
Escape-Sequenzen in WORDSTAR und WORD
Josef MELCHART, TGM Wien
Moderne Drucker bieten etliche Funktionen (z.B. doppelt hohe, doppelt breite Schrift, berstreichen), die von manchen Textverarbeitungsprogrammen nicht untersttzt werden. 
Eine nicht sehr komfortable, aber brauchbare Mglichkeit bieten Escape-Sequenzen, die direkt in den Text geschrieben werden und den Drucker entsprechend steuern. Eine notwendige Voraussetzung dafr ist, da das Textverarbeitungsprogramm diese Zeichen unverflscht an den Drucker weiterleitet. 
Ich habe WORDSTAR 4.0 und WORD 5.0 mit einem STAR LC-10 Schwarz-Wei-Drucker auf diese Mglichkeit hin untersucht. Das Ergebnis vorweg: Es funktioniert wieder nur ein Teil. Ein Versuch lohnt sich trotzdem, an das "Handling" gewhnt man sich rasch.
A) WORDSTAR 4.0
Vorgangsweise:
1) Eingabe des ESC-Zeichens:
Ein Versuch mit ALT-027 scheitert - Wordstar interpretiert dies wie einen Druck auf die Escape-Taste und antwortet mit dem Makro-Men. Mit einem Trick gelingt es aber doch:
a) Einmalige Erstellung einer ASCII-Datei, die (nur) das ESC-Zeichen enthlt: wahlweise
- mit WORD:  ALT-027 eingeben und unformatiert abspeichern.
- mit EDLIN: CTRL-V und ALT-091 bzw. CTRL-V und [ eingeben. Anzeige des ESC-Zeichens in EDLIN mit ^[ .
- mit PCTOOLS oder NU (Norton Utilities): Hexcode eines beliebigen Zeichens (Dummy) mit der Funktion EDIT auf Hex 1B (=ESC-Zeichen) ndern.
b) Hineinkopieren dieser ASCII-Datei ins WORDSTAR-Dokument mit CTRL-K R (Block einlesen). 
Anzeige des ESC-Zeichens in WORDSTAR mit ^[  (Druckerzeichen mit CTRL-O D sichtbar schalten!)
c) Innerhalb des Textes ist ein Kopieren und Lschen leicht mglich: Das ESC-Zeichen mit CTRL-T (Wort lschen) oder mit CTRL-Y (Zeile lschen) in den "Papierkorb" lschen  und mit CTRL-U (Undo) beliebig oft aus dem Papierkorb wieder herausholen (wie in WORD).
2) Eingabe der restlichen Zeichen der Escape-Sequenz:
Ganz normal als Buchstaben nach dem ESC-Zeichen in den Text schreiben.
Und hier tritt die leider gravierende Beschrnkung auf: Es sind nur Escape-Sequenzen mglich, die aus ESC-Zeichen + DRUCKBAREN Zeichen bestehen.
Versuche mit nichtdruckbaren Zeichen waren mhsam und nicht von Erfolg gekrnt: 
- WORDSTAR akzeptiert die nichtdruckbaren ASCII-Zeichen #0..#31 (Hex 00..1F) nicht als Eingabe in den Text. ALT-00..ALT-031 funktioniert nicht.
- Der Umweg ber Dummy-Zeichen und eine nachtrgliche nderung mit PCTOOLS bzw. NU funktionierte auch nicht wie gewnscht - WORDSTAR "zensurierte" die nichtdruckbaren Zeichen beim Ausdruck.
Ergebnis:
Alle Escape-Sequenzen mit nichtdruckbaren Zeichen scheiden aus. Dennoch bleiben etliche, deren Verwendung sich lohnt:
Zum Beispiel fr den STAR LC-10 Schwarz-Wei-Drucker funktionieren in WORDSTAR 4.0 folgende Escape-Sequenzen: 
<ESC>W1  Breitdruck ein
<ESC>W0  Breitdruck aus
<ESC>w1  Doppelt hohe Zeichen ein
<ESC>w0  Doppelt hohe Zeichen aus
<ESC>_1  berstreichen ein
<ESC>_0  berstreichen aus

Weiters knnen die Schriftarten auch innerhalb einer Zeile gewechselt werden:
<ESC>x1  Schnschrift ein (NLQ)
<ESC>x0  Schnschrift aus (Draft)
<ESC>P   Pica ein (10 Zeichen/Zoll
<ESC>M   Elite ein (12 Zeichen/Zoll
<ESC>p1  Proportionalschrift ein
<ESC>p0  Proportionalschrift aus
<ESC>9   Papierende-Sensor ein
<ESC>8   Papierende-Sensor aus
<ESC>U1  Unidirektionaler Druck ein
<ESC>U0  Unidirektionaler Druck aus
(Weitere ESC-Sequenzen siehe Druckerhandbuch.)

Nicht mglich sind leider zum Beispiel:
Vierfach hohe und breite Zeichen, Schmalschrift innerhalb einer Zeile ein/aus, Wahl des Zeichensatzes (z.B. Orator), beliebiger Zeilenabstand (in n/216 Zoll).
Serienmig ohnehin mglich sind z.B.:
Unterstreichen, Fettdruck, Doppeldruck, Kursivschrift.
Ein Tip:
Ich habe mir die am hufigsten verwendeten Escape-Sequenzen (fr Doppelt-breit und Doppelt-hoch) als Kommentarzeilen (mit ".." am Zeilenanfang) in eine Initialdatei geschrieben, die ich mit CTRL-K R an den Beginn jedes neuen Dokumentes kopiere. Diese Initialdatei enthlt weiters Punktbefehle fr ein Standard-Seitenformat. Fr Endlospapier hat sich folgende Datei mit dem Namen # bewhrt:
.RR---!--------------------------------------------------------R
..Endlospapier: .pl 72
..              .mt 0  { bei n Kopfzeilen: .mt (n+1) }
..              .mb 7  { bei n Fuzeilen:  .mb (n+8) }
.pl 72
.mt 0
.mb 9  { bei 1 Fuzeile }
.po 6
..^[W1    ESC-W1 Breitschrift ein
..^[W0    ESC-W0 Breitschrift aus
..^[w1    ESC-w1 Hochschrift ein
..^[w0    ESC-w0 Hochschrift aus
.lq off
.cw 12
.fo (Dateiname)                  - # -

Im aktuellen Dokument brauchen dann je nach Bedarf nur ein paar Einstellungen gendert bzw. unntige Zeilen gelscht werden. Das ESC-Zeichen ist durch Kopieren sofort verfgbar.
B) WORD 5.0
Punkto Zeichenformatierung lt WORD ohnehin nicht viele Wnsche offen. Dennoch sind manche Druckeroptionen interessant, die WORD nicht ausntzen kann.
Die Eingabe nichtdruckbarer Zeichen mit ALT-nnn funktioniert nur fr die ASCII-Zeichen #1..#8 und #16..#30  (Hex 01..08 und 10..1E). (Das ESC-Zeichen kann also direkt mit ALT-27 eingegeben werden und wird als Rckwrtspfeil dargestellt.)
Escape-Sequenzen, in denen nur diese Zeichen vorkommen, scheinen zu funktionieren. 
Jedenfalls funktionieren folgende Escape-Sequenzen mit dem Star LC-10 Schwarz-Wei-Drucker:
            Eingabe:
<ESC>8      ALT-27 8        Papierende-Sensor aus
<ESC>9      ALT-27 9        Papierende-Sensor ein
<ESC>_1     ALT-27 _ 1      berstreichen ein
<ESC>_0     ALT-27 _ 0      berstreichen aus
<ESC>W1     ALT-27 W 1      Doppelt breit ein
<ESC>W0     ALT-27 W 0      Doppelt breit aus
<ESC>w1     ALT-27 w 1      Doppelt hoch ein
<ESC>w0     ALT-27 w 0      Doppelt hoch aus
<ESC>h<01>  ALT-27 h ALT-1  Doppelt hoch+breit
<ESC>h<02>  ALT-27 h ALT-2  Vierfach hoch+breit

<ESC>h<00> wre das Zurckschalten auf normale Zeichengre, aber das ASCII-Zeichen 00 wird von WORD nicht akzeptiert. Abhilfe: Zuerst auf doppelt breite und doppelt hohe Zeichen schalten und diese dann ausschalten:
<ESC>W1 <ESC>w1 <ESC>W0 <ESC>w0  Normale Zeichengre
(Weitere Escape-Sequenzen siehe Druckerhandbuch.)
Interessant ist noch das ASCII-Zeichen 08 (Backstep), das ein mehrfaches berdrucken ermglicht:
<08>        ALT-8           Nchstes Zeichen berdrucken
C) Resumee:
Die Verwendung von Escape-Sequenzen in WORDSTAR und WORD ist unkomfortabel, aber es gelingt damit, wenigstens ein paar besondere Funktionen des Druckers auszuntzen.
Als Nachteile sind noch zu nennen: 
 Das Bild ist nicht WYSIWYG (What You See Is What You Get), aber damit hat man sich ja schon fast abgefunden.
 Der Blocksatz funktioniert nicht mehr richtig, da die Escape-Sequenzen nicht als Steuerzeichen erkannt und mitgezhlt werden. 
Bei der Druckersteuerung heit es also weiterhin "mit Mngeln leben".
Papierende-Sensor beim STAR LC-10 Drucker 
Josef MELCHART, TGM Wien
Dieser Sensor soll bei Papierende ein Weiterdrucken auf die Walze verhindern. Der Nachteil bei Einzelblatt-Betrieb ist, da die Seite nicht vollgedruckt werden kann: Der Sensor unterbricht den Druck bereits 2,5 cm oberhalb des unteren Blattrandes.
Mglichkeiten der Abhilfe:
1) Papierende-Sensor hardwaremig ausschalten (DIP-Schalter 1-5 auf AUS stellen). 
2) Papierende-Sensor softwaremig ausschalten (mit <ESC>8 aus, mit <ESC>9 wieder ein).
Nachteil: Irrtmlicher Druck auf Walze mglich.
3) Fr sporadischen Einzelblattbetrieb gibt es eine einfache Mglichkeit, ohne den Papierende-Sensor ausschalten zu mssen:
Wenn der Sensor den Druck stoppt (mit einem penetranten Piepston), ein neues Blatt nachschieben und ONLINE drcken. Der Rest der Seite wird dann fertiggedruckt.
Mit diesem einfachen Trick kann die volle Seitenlnge ausgentzt werden.
TURBO-PASCAL 5.0   MENBEFEHLE 
Josef MELCHART, TGM Wien
FILE

LOAD (F3): Laden einer Datei. Bei Angabe eines Laufwerks oder Wildcards (*,?) erscheint Verzeichnis.

PICK (ALT-F3): Weiterbearbeitung. Die letzten bearbeiteten Dateien werden gespeichert (samt letzter Cursorposition, Blockmarkierung, etc.) im Pick-File (Name in OPTIONS/DIRECTORIES/PICK-FILE einstellbar)

NEW:       Arbeitsspeicher lschen, neue Pascal-Datei erstellen.

SAVE (F2): Abspeichern (gleicher Dateiname).

WRITE TO:  Abspeichern unter neuem Dateinamen.Zustzlich kann ein Laufwerk oder Verzeichnis angegeben werden, z.B.  B:PRIMZAHL.PAS ,   C:\TP5\PRIMZAHL.PAS

DIRECTORY: Inhaltsverzeichnis anzeigen (wie DOS-Befehl DIR).

CHANGE DIRECTORY: aktuelles Verzeichnis ndern (wie CD).

OS SHELL:  (Operating System Shell)  MS-DOS aufrufen, Hauptspeicherinhalt (Arbeitsdatei) bleibt erhalten.Rckkehr mit EXIT.

QUIT (ALT-X): Aussteigen aus Turbo-Pascal.


EDIT

Arbeitsdatei editieren.


RUN

RUN (CTRL-F9): Programm laufen lassen.  = MAKE (F9) + RUN.bergabe von Parametern in OPTIONS/PARAMETERS mglich.

PROGRAM RESET (CTRL-F2): Neustart beim Debugging. Gibt den vom Debugger belegten Hauptspeicher frei. Sollte nach DEBUG aufgerufen werden.

GO TO CURSOR (F4): Programmablauf bis zur Zeile unmittelbar vor dem Cursor. Achtung: Diese Zeile mu vom Programm tatschlich erreicht werden!

TRACE INTO (F7): Zeilenweise Ausfhrung (markierte Programmzeile). Unterprogramme ebenfalls zeilenweise ausgefhrt.

STEP OVER (F8): Zeilenweise Ausfhrung wie TRACE INTO (F7), aber Unterprogramme komplett ausgefhrt (wie 1 Zeile). 

USER SCREEN (ALT-F5): Umschalten zwischen Ausgabebildschirm (User Screen) und Editor (Integrated Development Environment = Integrierte Entwicklungsumgebung).


COMPILE

COMPILE (ALT-F9): bersetzen (Datei im Editor). (Mit DESTINATION einstellen, ob im Hauptspeicher oder als .EXE-Datei auf Diskette)

MAKE (F9): bersetzen (Primary File bzw. Datei im Editor) + Neubersetzung aller Dateien, auf die sich die nderung auswirkt (Units .TPU, Include-Files auf der Diskette).  = Update.

BUILD:     Wie MAKE, aber alle zusammenhngenden Dateien neu bersetzt (egal, ob sich nderung auswirkt oder nicht).

DESTINATION: Memory --> bersetzung im HauptspeicherDisk   --> .EXE-File auf der Diskette

FIND ERROR: Anzeige eines Laufzeitfehlers (z.B. Division durch0) als Adresse (Segment:Offset)--> Debuginformation anwhlen, Eingabe der Fehleradresse im Hex-Format, z.B. 2BE0:FFD4.(1) Laufzeitfehler im Hauptspeicher: Fehleradresse    automatisch gespeichert, mit CTRL-Q W anspringen.(2) Laufzeitfehler unter DOS (in .EXE-Datei):     - Fehleradresse notieren    - Programm in Editor laden (oder als Primary File)    - Destination: Disk    - Fehleradresse eingeben.

PRIMARY FILE: welche .PAS-Datei mit MAKE (F9) oder BUILD(ALTCB) bersetzt werden soll;sonst: Datei im Editor bersetzt.COMPILE (ALT-F9) bersetzt immer Datei im Editor.

GET INFO:  Information ber aktuelles Verzeichnis, Speicherbelegung, etc.


OPTIONS

COMPILER:  Compiler-Optionen whlbar, gleiche Wirkung wie Compileranweisungen im Programm (z.B. (*$I+*) oder {$I+}   Ein/Ausgabe-berprfung,(*$R+*) oder {$R+}   Zahlenbereichsberprfung.

LINKER:    

ENVIRONMENT: (Umgebung)Backup source files:  .BAK-File beim Speichern                      erstellen (ein/aus)Edit auto save:   automat. Abspeichern bei RUNConfig auto save: Editoreinstellungen automatisch                  speichernZoom windows:     voller Bildschirm  oder geteilt                  (Edit, Output-, Watch-Window)Screen Size:  Anzeige 25 Zeilen (Standard)                      43 Zeilen (EGA)                      50 Zeilen (VGA)Tab Size:     Tabulatorenabstand 2..16              (mit CTRL-O T  Tab-Mode einschalten)

DIRECTORIES: Suchpfade (Laufwerk+Pfad) fr die bentigten Dateien:Turbo:     .TPL (Turbo Pascal Library), Config- und           Help-DateienEXE & TPU: .EXE und .TPU-Dateien           (Turbo Pascal Unit = bersetzte Units)Include:   Include-DateienUnit:Object:    .OBJ (Assembler-) DateienPick file name:    Pfad fr Pick-FileCurrent pick file: Pfad + Name des aktuellen                   PickFiles

PARAMETERS: bergabe von Parametern (Argumenten) beim Programmstart (entspricht in MS-DOS z.B.WORD TEST.TXT  oder TYPE READ.ME)

SAVE OPTIONS: Abspeichern der Optionseinstellungen  auf ein .TPFile (standardmig TURBO.TP)

RETRIEVE OPTIONS: Wiederherstellen einer Optionseinstellung von einem .TPFile


DEBUG

EVALUATE (CTRL-F4): (1) Werte von Variablen (Ausdrcken) kontrollieren und verndern. (Werden nicht stndig angezeigt - Unterschied zu WATCH).3 Kstchen (Umschalten mit Tab oder Pfeiltasten):Evaluate:  Variable oder Ausdruck eingeben (automatisch     wird Wort von Cursorposition genommen, weitere     Buchstaben mit Rechter Pfeiltaste hereinkopieren).Result:    zeigt Ergebnis.New Value: neuen Wert eingeben (Bereichsprfung aktiv).(2) Taschenrechnerfunktion:Ausdruck in Evaluate eingeben (z.B. 2*5/10.4) --> Ergebnis in Result.

Formatzustze: fr gewnschtes Ausgabeformat    (Eingabe: Variablenname, Beistrich, Formatzustze):D  Decimals: Integerwerte dezimal anzeigen.Fn Floating Point: n = 2..18 fr Anzahl der angezeigten      Stellen (incl. Vorkommastellen + Komma).H  Hexadecimal: Integerwerte hexadezimal mit $...M  Memory: Speicherdump einer Variablen (siehe auch S)P  Pointer als seg:ofs anzeigen      (sonst als Ptr(seg,ofs))R  Record: Feldnamen+Werte anzeigen (sonst: nur Werte)S  String: (zusammen mit M)       Anzeige von ASCII 0..31 in der Form #0..#31

CALL STACK (CTRL-F3): Liste der erfolgten Unterprogrammaufrufe (mit Parametern) anzeigen.

FIND PROCEDURE: Aufsuchen einer bestimmten Prozedur (Funktion) im geladenen Programm (incl. Units und Include-Dateien).Vorher kompilieren!

INTEGRATED DEBUGGING:ON:  Breakpoints, Step, Trace mglich     (OPTIONS/COMPILER/DEBUG INFORMATION mu ON sein!)OFF: Debugging nicht mglich (Hauptspeicherersparnis,     wenn COMPILE/DESTINATION DISK)

STANDALONE DEBUGGING:OFF: (Normaleinstellung)ON:  Debuginformation wird an .EXE-File angeschlossen     (fr Verwendung mit Turbo-Debugger)

DISPLAY SWAPPING: Umschaltung Editor --> Ausgabebildschirm:SMART:  nur bei Ausgabeanweisungen und        Unterprogrammaufrufen.ALWAYS: bei jeder Anweisung (fr Programme, die den        Editor-Bildschirm berschreiben).NEVER:  keine Umschaltung (fr Programmteile ohne        Ausgabe).

REFRESH DISPLAY: Wiederherstellen des (irrtmlich berschriebenen) Editor-Bildschirmes.

BREAK/WATCH


   "Watch" = Watch Expression = zu beobachtender Ausdruck:Variable oder Ausdruck, dessen Wert whrend des Debuggens stndig im Watch-Fenster angezeigt werden soll. Wert nicht vernderbar! (Vernderung nur mit EVALUATE (CTRL-F4) mglich)

    Umschalten zwischen Watch- und Edit-Fenster mit F6 (Switch).


ADD WATCH (CTRL-F7): neue Watch-Variable (Ausdruck) hinzufgen.

DELETE WATCH: Watch-Variable (Ausdruck) lschen.

EDIT WATCH:   Watch-Variable (Ausdruck) verndern.   (schnellere Mglichkeit: mit F6 ins Watch-Fenster,   gewnschten Ausdruck anwhlen und verndern)

REMOVE ALL WATCHES: alle Watch-Variablen entfernen.

   "Breakpoint" = gewnschte Unterbrechung des Programmablaufes vor der markierten Programmzeile. Weiterlaufen des Programms mit CTRL-F9 (Run)


TOGGLE BREAKPOINT (CTRL-F8): Breakpoint setzen/lschen (Schalter) an der Cursorposition.

CLEAR ALL BREAKPOINTS: alle Breakpoints lschen.

VIEW NEXT BREAKPOINT: bewegt Cursor zum nchsten Breakpoint (ohne Befehlsausfhrung).




FUNKTIONSTASTEN


F1   Help                 ALT-F1   Last HelpF2   Save                 F3   Load                 ALT-F3   PickF4   Go to Cursor         F5   Zoom   (Window)      ALT-F5   User Screen (Ausgabebildschirm)F6   Switch (Window)      ALT-F6   Swap (Umschalten zwischenF7   Trace                               den letzten 2 Dateien)F8   Step  F9   Make (Update)        ALT-F9   CompileF10  Menu                 ALT-X    ExitCTRL-F1   Online Help (zur Cursorposition)CTRL-F3   Call StackCTRL-F4   EvaluateCTRL-F7   Add WatchCTRL-F8   Toggle BreakpointCTRL-F9   RunCTRL-BREAK (CTRL-SCROLL LOCK) (2x)   Programmabbruch
.Anfang Verzeichnis V.
Inhalt
ASSEMBLER

>	Farben und Notizdateigre im SideKick einfach und schnell verndern 	5
>	INTPRUEF	9
>	Spooler	13
>	LPTXCHG	16
>	AUTOASK	18
		LOGO WRITER 2.0	21
		OPEN ACCESS II Vers. 2.05	26
		Escape-Sequenzen in WORDSTAR und WORD	31
		TURBO-PASCAL 5.0   MENBEFEHLE 	34
		Papierende-Sensor beim STAR LC-10 Drucker 	38
>	Adressplan eines kompatiblen PC	39
		Preisliste EXCON (fr PCCTGM)	50
.Ende Verzeichnis V.

Diese Ausgabe der PC-NEWS ist dem Thema 'wie-formuliere-ich-in-Assembler' gewidmet. Sie finden weiter hinten einen mglichst genauen Adressplan eines kompatiblen PC und einige dazu passende Beitrge in Assembler. 
Ein Hinweis zur Numerierung der PC-NEWS: Die Aussendung gemeinsam mit der PT betreffend BTX war die PC-NEWS1/90=Lfd.Nr.17. Die heutige Ausgabe ist Nr.18. 
Da wir beim Zusammenstellen der Beitrge den genauen Druckzeitpunkt und noch weniger den der Aussendung kennen, wnschen wir Ihnen schon jetzt, im Mai erholsame Ferien. 
܀     ,  v 
  
  q 5  E  l     g     e     c |  ~  a       @ @ @ @  F  y     u   s $  {  o     k     g     c l  ;  _ =  ]          =      w   s     o y    k   g   d   b a b ` }  77        }  y 
( ( w .( /( u . . s . . q 9 9 o 9 9 m fK wK h QR 77  @7777777QR \R v V W q Z [ l a (a g ld d b {  ]   Y  V wK6 B< @ @ @ @ @ @  x  u   s   p   m   j * - g ; < d = a R  6666676 R S x T u s t r u o   l  i ǈ Ȉ f Ɉ c   ` F \ [ R @6 6 6 6 6\ } x T u s t r u o   l  i ǈ Ȉ f Ɉ c   ` F \ [ R @6 6 6 6  @      v   q 0  q Y  q E  q V  q   q   q   q                                                       6 =  	  	  v 
  v   v   v 
  v   v   U                                             @                 `   	 @=     ^   Y   Y   Y   Y     W                                             @A= <   M	          p     y B  3  w 5  w r    u   u   |  s                                                              AAAA	|  ~  ^   Y   T !  O !  O #  O                                            = E  <   M	          p #  $  v $  v &  v &  v (  v 3*  v >+  v +  v ,  v                                                               p= 	,  .  v 0  v 1  v x3  v 3  v 4  q T4  q 4  q 4  q                                                            ? = 	4  4  v 5  v 75  v Q5  v 5  v 5  v 6  v N6  v 6  v                                                            ? ? 	6  6  v 6  v 67  v 7  v 7  v 7  v 	8  v :8  v k8  v                                                            ? ? 	k8  8  v 8  v 9  v M9  v 9  v 9  v :  v K:  v :  v                                                            ? ? 	:  :  v :  v ;  v Q;  v ;  v ;  v ;  v ;  v <  v                                                            ? ? 	<  Y<  v <  v <  v =  v K=  v =  v =  v =  v >  v                                                            ? ? 	>  >  v 2>  v K>  v O>  v >  v >  v >  v ?  v ^?  v                                                            ? ? 	^?  ?  v ?  v ?  v ?  v @  v @  v )@  v P@  v @  v                                                            ? ? 	@  @  v @  v @  v A  v 3A  v JA  v A  v A  v A  v                                                            ? ? 	A  'B  v qB  v B  v B  v C  v =C  v TC  v mC  v |C  v                                                            ? ? 	|C  C  v C  v C  v ;D  v xD  v D  v D  v E  v LE  v                                                            ? ? 	LE  E  v E  v F  v ?F  v F  v F  v F  v G  v QG  v                                                            ? ? 	QG  G  v G  v $H  v [H  v H  v H  v H  v 2I  v lI  v                                                            ? ? 	lI  I  v I  v I  v J  v 'J  v +J  v \J  v vJ  v J  v                                                            ? ? 	J  J  v 
K  v <K  v VK  v K  v K  v K  v K  v  L  v                                                            ? ? 	 L  gL  v L  v L  v 
M  v 'M  v bM  v M  v M  v M  v                                                            ? ? 	M  
N  v N  v  N  v RN  v N  v N  v N  v N  v N  v                                                            ? ? 	N  
O  v <O  v VO  v tO  v O  v O  v O  v ,P  v jP  v                                                            ? ? 	jP  P  v P  v P  v P  v Q  v GQ  v Q  v Q  v Q  v                                                            ? ? 	Q  (R  v FR  v R  v R  v R  v R  v S  v /S  v GS  v                                                            ? ? 	GS  bS  v zS  v ~S  v S  v S  v S  v S  v S  q S  q                                                            = ? 	S  T  v T  v KU  q U  q U  q V  q =V  q AV  q V  q                                                            ? = 	V  V  v V  v 'W  v WW  v sW  v wW  v W  v W  v X  v                                                            ? ? 	X  ?X  v X  v X  v X  v X  v Y  v )Y  v -Y  v ]Y  v                                                            ? ? 	]Y  Y  v Y  v Z  v 8Z  v WZ  v Z  v Z  v Z  v Z  v                                                            ? ? 	Z  Z  v Z  v [  q :[  l ]  g ^  b ^  b W^  b                                                   ? = E  = W^  Z^  v m^  v {^  v ^  v ^  v ^  v ^  v ^  v ^  v                                                       E  ? 	^  ^  v _  v _  v 2_  v _  v _  v $`  v w`  v `  v                                                       E  ? 	`  6a  v Oa  v na  v a  v b  v ;b  v Xb  v ub  v b  v                                                       E  ? 	b  b  v b  v b  v b  v b  v c  v %c  v Bc  v Wc  v                                                       E  ? 	Wc  vc  v yc  v |c  v c  v c  v 'd  v wd  v d  v d  v                                                       E  ? 	d  *e  v xe  v e  v f  v cf  v f  v f  v g  v  g  v                                                       E  ? 	 g  #g  v qg  v g  v g  v Nh  v h  v h  v i  v i  v                                                       E  ? 	i  ei  v i  v i  v j  v +j  v Dj  v Gj  v j  v j  v                                                       E  ? 	j  j  v !k  v 9k  v Rk  v Uk  v k  v k  v k  v 6l  v                                                       E  ? 	6l  Nl  v gl  v jl  v l  v l  v m  v 4m  v Lm  v em  v                                                       E  ? 	em  hm  v m  v m  v n  v ^n  v zn  v n  v o  v jo  v                                                       E  ? 	jo  o  v o  v o  v o  v o  v Gp  v p  v p  v p  v                                                       E  ? 	p  p  v p  v *q  v xq  v q  v 	r  v Ur  v rr  v r  v                                                       E  ? 	r  r  v As  v ds  v s  v s  v 
t  v [t  v t  v t  v                                                       E  ? 	t  ;u  v u  v u  v u  v u  v v  v ]v  v v  v v  v                                                       E  ? 	v  w  v cw  v {w  v w  v w  v w  v  x  v ex  v x  v                                                       E  ? 	x  y  v y  v 5y  v Ny  v Qy  v jy  v y  v y  v y  v                                                       E  ? 	y  z  v 	z  v "z  v oz  v z  v {  v P{  v {  v {  v                                                       E  ? 	{  1|  v |  v |  v |  v <}  v }  v }  v }  v ~  v                                                       E  ? 	~  _~  v ~  v ~  v E  v ]  v v  v y  v   v   v                                                       E  ? 	    v D  v \  v u  v x  v   v ܀  v )  v R  v                                                       E  ? 	R    v   v   v 1  v   v   v ނ  v   v S  v                                                       E  ? 	S  |  v Ƀ  v   v &  v O  v o  v   v   v   v                                                       E  ? 	    v   v !  v f  v   v ͅ  v   v   v   v                                                       E  ? 	  P  v   v   v Ȇ  v   v   v   v J  v   v                                                       E  ? 	    v )  v E  v ]  v v  v y  v   v   v 5  v                                                       E  ? 	5  Q  v   v   v   v $  v '  v *  v q  v   v                                                       E  ? 	    v T  v   v   v   v   v <  v ~  v   v                                                       E  ? 	    v   v D  v   v Ӎ  v   v A  v   v   v                                                       E  ? 	    v   v   v Q  v T  v   v   v   v f  v                                                       E  ? 	f    v   v   v *  v k  v   v   v ߑ  v ,  v                                                       E  ? 	,  U  v X  v   v   v G  v   v   v   v .  v                                                       E  ? 	.  z  v   v   v D  v   v   v   v +  v s  v                                                       E  ? 	s    v   v    v i  v   v ̗  v ϗ  v   v   v                                                       E  ? 	  >  v   v ͘  v   v g  v   v   v K  v N  v                                                       E  ? 	N    v Ú  v   v H  v l  v o  v   v ؛  v   v                                                       E  ? 	  D  v   v ќ  v    v b  v   v   v ҝ  v   v                                                       E  ? 	  g  v   v   v '  v n  v   v   v =  v ~  v                                                       E  ? 	~  Р  v   v   v b  v   v   v   v +  v i  v                                                       E  ? 	i    v   v   v O  v   v   v أ  v   v   v                                                       E  ? 	    v   v   q V  l   g ͥ  g   g   g                                                        = E  ?   /  v R  v ۧ  v   v   q   q b  l   g                                                        ? = A =     v   v ٩  v   v Y  v   v   v   v   v                                                       = A ? 	    v   v   v   v 4  v ^  v t  v v  v   v                                                       = A ? 	    v   v   v ?  v g  v i  v   v   v   v                                                       = A ? 	    v 5  v Q  v m  v   v   v   v   v &  v                                                       = A ? 	&  p  v   v   v   v _  v v  v   v   v ;  v                                                       = A ? 	;  W  v   v   v   v J  v   v ͱ  v   v >  v                                                       = A ? 	>  Z  v {  v   v   v   v   v P  v S  v X  v                                                       = A ? 	X    v   v 
  v ,  v 1  v M  v i  v   v д  v                                                       = A ? 	д    v   v   v "  v >  v   v   v µ  v   v                                                       = A ? 	  .  v   v ˶  v   v   v   v _  v   v   v                                                       = A ? 	    v H  v   v   v   v 8  v   v   v   v                                                       = A ? 	  >  v F  v b  v   v ƺ  v   v %  v '  v F  v                                                       = A ? 	F  e  v   v   v »  v Ż  v   v   v !  v o  v                                                       = A ? 	o    v ܼ  v   v 2  v y  v   v ޽  v   v J  v                                                       = A ? 	J    v ξ  v   v 5  v Y  v   v   v )  v k  v                                                       = A ? 	k  v  v   v   v    v +  v }  v   v   v (  v                                                       = A ? 	(  E  v   v   v   v >  v o  v   v   v )  v                                                       = A ? 	)  F  v e  v   v   v   v A  v `  v   v   v                                                       = A ? 	    v $  v C  v F  v   v   v   v   v X  v                                                       = A ? 	X    v   v   v 4  v S  v o  v   v   v   v                                                       = A ? 	  A  v   v   v   v ^  v t  v v  v   v   q                                                       =  ? 	    v   q   q   q   q   q   l   l                                                             A = E     v   v J  v   q   q _  l a  g   g                                                        ? = A =     v   v   v   v   v   v   v   v   v                                                       = A ? 	  3  v 5  v 7  v A  v K  v M  v O  v c  v w  v                                                       = A ? 	w  y  v   v   v   v c  v e  v g  v i  v u  v                                                       = A ? 	u    v   v   v   v   v   v I  v _  v   v                                                       = A ? 	    v   v   v   v   v :  v <  v b  v o  v                                                       = A ? 	o  q  v   v   v   v   v 1  v R  v k  v m  v                                                       = A ? 	m    v   v   v   v   v   v   v   v   v                                                       = A ? 	    v *  v >  v X  v {  v   v   v   v 2  v                                                       = A ? 	2  ?  v A  v [  v   v   v   v   v   v   v                                                       = A ? 	  8  v R  v   v   v   v   v   v   v   v                                                       = A ? 	  	  v ,  v 7  v 9  v E  v Q  v h  v v  v x  v                                                       = A ? 	x    v   v   v   v   v   v   v   v   v                                                       = A ? 	    v   v   v J  v Z  v e  v p  v z  v   v                                                       = A ? 	    v   v   v   v   v   v '  v ^  v `  v                                                       = A ? 	`  k  v v  v x  q   l   g z  b   b                                                         = E  = ?     v   v   v )  v 0  v 6  v @  v F  v   q                                                        = < 	  V  v   v   Y 
  Y "  Y $  T                                                 < <                  0  = $  M  ^ O  ^ b  ^   A                                          <                  0   
<                  0      ^   ^   ^   Y $  T -  O                                           < = < <                  0  -  ^  v   v   v   v   v   v &  v 5  v m  v                                                                0< 	m  y  v {  v   v   v   v E  v h  v   v   v                                                                0< 	    v   v   v   v 4  v [  v ~  v   v   v                                                                0< 	    v   v   q   l   l   l 8  l C  l P  l                                                       < = < 	P  [  v ]  v   v   v   q <  l F  l P  l Z  l                                                       < = < 	Z    v   v   v 6  v J  v T  v   v   v   v                                                       < = < 	  l  v ~  q   q   q   q   q /  q ;  q =  q                                                       < < = 	=    v )  q +  q 9  q y  q   q   q   q   q                                                       < < = 	    v 
  v F  v h  v j  v   v   v   q   l                                                       < = < 	  I  v T  v   v   v   v   v   v   v   v                                                       < = < 	    v   v   v 	  v   v   v y  q   l   l                                                       < = < 	    v   v   v   v   q   l I  g   g                                                        A  A <     v   v   v   v   v   i w  i   i                                                        A@    $A     n B  n   n   n J  n   n   n   n   n                                                        @    $	  ]  n   n   n   n   n 
  i   i '  i                                                          A @    $'  )  v `  v b  v d  v   v   v   v   v   v                                                       @    A 	    v   v   v   v #  v Z  v   v   v   v                                                       @    A 	    v   v   v   v   v   v   v C  v E  v                                                       @    A 	E  G  v I  v K  v   v   v   v   v %  v '  v                                                       @    A 	'  =  v ?  v   v   v   v   v R  v T  v   v                                                       @    A 	    v   v 
  v 9  v }  v   v   v / v t v                                                       @    A 	t  v  v  v  v  v L v N v  v  v                                                       @    A 	  v  v : v } v  v  v > v ] v  v                                                       @    A 	  v  v L v O v y v { v  v  v % v                                                       @    A 	% b v  v  v  v V v x v  v  v 3 v                                                       @    A 	3 5 v R v h v j v  v  v #	 v _	 v 	 v                                                       @    A 		 	 v 	 v 	 v !
 v g
 v 
 v 
 v 
 v 
 v                                                       @    A 	
 
 v 7 v P v  v  v  v ; v = v ? v                                                       @    A 	? A v o v q v  v  v  v  v 
 v !
 v                                                       @    A 	!
 Q
 v 
 v 
 v 
 v 
 v 
 v 
 v 
 v 
 v                                                       @    A 	
 
 v  v S v  v  v  v  v 4 v 6 v                                                       @    A 	6 8 v : v ` v b v  v  v  v  v  v                                                       @    A 	  v  v   v ^ v v v  v  v  v  v                                                       @    A 	 5 v z v  v  v  v  v  v  v  v                                                       @    A 	  v L v  v  v  v  v - v l v  v                                                       @    A 	  v  v ' v c v  v  v ! v ^ v ` v                                                       @    A 	`  v  v  v  v  v  v + v V v X v                                                       @    A 	X l v  v  v  v  v  v  v  v ( v                                                       @    A 	( O v  v  v  v  v  v  v E v m v                                                       @    A 	m  v  v  v $ v _ v  v  v  v  q                                                       @  A 	 * v b q  q  q  q  q  q  q H q                                                       @ A E 	H  v  v  v  v 6 v O v  v  v  v                                                       @ A A 	 @ v N v  v  v  v R v  v  v  v                                                       @ A A 	  v  v & v ; v ? v ` v  v  v  v                                                       @ A A 	  v (  v 2  v B  v   v   v ! v 5! v v! v                                                       @ A A 	v! ! v ! v " v F" v " v " v " v 5# v E# v                                                       @ A A 	E# # v # v # v :$ v \$ v `$ v $ v $ v $ v                                                       @ A A 	$ 9% v z% v % v % v 3& v t& v & v & v 7' v                                                       @ A A 	7' x' v ' v ' v ' v ' v ( v 1( v V( v X( v                                                       @ A A 	X( ( v ( v ) v /) v P) v ) v ) v ) v =* v                                                       @ A A 	=* b* v * v * v * v * v + v B+ v + v + v                                                       @ A A 	+ + v , v D, v , v , v , v - v W- v - v                                                       @ A A 	- - v - v . v P. v . v . v . v . v . v                                                       @ A A 	. . v / v S/ v / v / v 0 v '0 v h0 v 0 v                                                       @ A A 	0 0 v +1 v 61 v w1 v 1 v 1 v 
2 v K2 v 2 v                                                       @ A A 	2 2 v 2 v 2 v 83 v y3 v 3 v 3 v 3 v 4 v                                                       @ A A 	4 4 v I4 v 4 v 4 v 4 v 4 v 4 v 4 v 5 v                                                       @ A A 	5 M5 v 5 v 5 v 6 v Q6 v _6 v 6 v 6 v "7 v                                                       @ A A 	"7 c7 v 7 v 7 v 8 v G8 v 8 v 8 v 8 v 9 v                                                       @ A A 	9 9 v ^9 v s9 v w9 v 9 v 9 v 9 v 9 v : v                                                       @ A A 	: H: v : v : v ; v /; v c; v ; v ; v &< v                                                       @ A A 	&< g< v < v < v < v < v < v .= v o= v = v                                                       @ A A 	= = v > v K> v O> v > v > v ? v S? v j? v                                                       @ A A 	j? ? v ? v 
@ v N@ v @ v @ v @ v @ v 'A v                                                       @ A A 	'A hA v A v A v +B v lB v B v B v B v B v                                                       @ A A 	B B v C v C v XC v C v C v D v 3D v tD v                                                       @ A A 	tD D v D v D v D v E v E v HE v E v E v                                                       @ A A 	E E v E v F v HF v F v F v G v +G v /G v                                                       @ A A 	/G eG v iG v mG v G v G v G v G v G v G v                                                       @ A A 	G G v G v G v G v G v G v G v G v G v                                                       @ A A 	G G v H v VH v ~H q H l FI g mJ g fK g                                                        = E  A fK wK v K v K v SL v L v L v QM v M v :N v                                                       E  = 	:N N v O v O v P v P v Q v Q v QR v \R v                                                       E  = 	\R R v CS v \S q uS q S q S q S q S q S q                                                       E A = 	S DT v eT q T q T q T q T q U q 5U q UU q                                                       E A = 	UU zU v U v U v U q U q V q V q V q W q                                                       E = A 	W X v X q X q Y q UY q ]Y q dY q Y q Y q                                                       E A = 	Y Y v Y v Y v Z v Z v !Z v IZ v KZ q Z q                                                       E = A 	Z [ v [ v \ v \ v E] v [] q ] q ] q ] q                                                       E A = 	] ^ v N^ v }^ v ^ v ^ v 	_ v :_ v <_ v ` q                                                       E = A 	` L` v ` v ` v a v (a v a v a v db v b v                                                       E = = 	b -c v Yc q sc l ld g d g d g 6e g ge g                                                        = E  = ge e v f v f v f q g l g g g g zg g                                                        A E  = zg |g v Ih v Kh v h v h v h v h v \i v ^i v                                                       E  A 	^i i v i v i v i v Xj v Zj v j v j v j v                                                       E  A 	j j v j v j v j v j v j v j v )k v +k v                                                       E  A 	+k k v k v Hl v Jl v l v l v 6m v 8m v m v                                                       E  A 	m m v m v m v m v kn v mn v $o v &o v o v                                                       E  A 	o o v o v o v q v q v r v r v r v r v                                                       E  A 	r r v r v r v s v s v s v s v u v u v                                                       E  A 	u ww v yw v w v w v \x v ^x v x v x v x v                                                       E  A 	x x v x v z v z v } v } v ^} v `} v } v                                                       E  A 	} } v ~ v ~ v N v P v u v w v Ѐ v Ҁ v                                                       E  A 	Ҁ ߀ v  v  v ҁ v ԁ v  v  v  v [ v                                                       E  A 	[ ] v  v  v + v - v b v d v  v  v                                                       E  A 	  v S v U v  v  v  v  v  v  v                                                       E  A 	  v  v  v  v z t {   o                                                             E  AA   a  a  ?  ?  ?                                  !     n               %
     n           %
 * Y ; Y R Y s Y  Y ǈ Y  Y                                             !     n               %
 " Y F Y \ ^ 5 Ҋ }                                             !     n               %
} ~       \ ^ 5 Ҋ }                                             !     n               %
A.n8' ?S+ 
     B
  W  c    ,  S=  $K  V  4b  Yp  Ҁ    j       E      5        p     f  a y# . 8 QB G Q Y b Qf Ym t | c       5        5     G                       	     
      A     O    
 A     	     F          	          
     	          /                         <          A                    ! '    "     #     $ ,    % !    &     '     ( K    )     *     +                   (       05.28.9005.20.90 