(*
-------------------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@*)  DEFINITION  MODULE  AreaIO;  (*@@@@@@@@@@@@@@@@@@@@@@@@@
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
| Kurzbeschreibung   | formatierte Zahlenein- und -ausgabe fuer Windowmodul   |
|                    | Area                                                   |
---------------------+---------------------------------------------------------
| Programm - Version |  2.0   |   Text - Version        |   V#027             |
---------------------+--------+-----------------+-------+----------------------
| Modulholder        |  WS    |   Urversion     |  WS   |   August 88         |
---------------------+---------------------------------------------------------
| System - Version   | OS-9, Miele-Modula-2 3.5                               |
---------------------+---------------------------------------------------------
| Copyright          | Freigegeben fuer nichtkommerzielle Nutzung             |
|                    |  durch Teilnehmer am EFFO                              |
---------------------+---------------------------------------------------------
| Hardware           | GEPARD 68010, 1 MByte RAM, 80Zeichen-Textkarte         |
---------------------+---------------------------------------------------------
| besondere Importe  | Area                                                   |
---------------------+---------------------------------------------------------
| Autoren            |  WS    | Werner Stehling, Seilerwis 3,                 |
|                    |        | CH-8606 Greifensee, Tel. 01/256 42 21         |
---------------------+---------------------------------------------------------
|   U P D A T E S    |                                                        |
----------------------                                                        |
|   Datum   Version  Autor  Bemerkungen                                       |
| --------  -------  -----  -----------                                       |
| 10. 8.88    1.1      WS   dynamische Fensterverwaltung unter GDOS           |
| 17. 8.88    1.1      WS   Prozeduren zur Zahlenausgabe                      |
| 12.12.88    2.0      WS   Umstellung auf OS-9                               |
| 15.12.88    2.0      WS   Aufteilung in Area und AreaIO                     |
|                                                                             |
-------------------------------------------------------------------------------
| Modul-Beschreibung |                                                        |
----------------------                                                        |
| Formatierte Zahlenein- und -ausgabe fuer Windowmodul area                   |
|                                                                             |
| Die Read-Prozeduren schlagen jeweils den alten Wert der Variablen vor, der  |
| dann editiert werden kann. Dabei sind folgende Editiertasten erlaubt:       |
|                                                                             |
| Cursor links und rechts                                                     |
| Delete und Backspace zum Loeschen                                           |
| Insert-Taste toggelt zwischen Insert- und Overwrite-Modus                   |
| Home loescht das Eingabefeld                                                |
| Undo (Ctrl-X) restauriert den Startwert                                     |
|                                                                             |
| Die Eingabe wird mit Return, ESC, Cursor hoch oder tief verlassen; dieser   |
| Character wird als Funktionswert zurueckgegeben. Anschliessend erfolgt die  |
| Umwandlung in die gesuchte Zahl. Falls dabei ein Fehler auftritt, landen    |
| wir wieder im Editiermodus.                                                 |
|                                                                             |
| Bei den Zahleneingaben werden drei Klassen unterschieden:                   |
|                                                                             |
| Integer :   die erste Stelle darf ein Vorzeichen sein                       |
| Cardinal, Hex, Octal, Binaer : das erste Zeichen gibt die Basis an:         |
| (Ziffer)   $     &      %      Vorzeichen nicht erlaubt                     |
| Real, Ohm, ... : der Rest                                                   |
|                                                                             |
| Innerhalb der Klassen darf die Eingabe in einer beliebigen (Basis-)         |
| Darstellung erfolgen; der Prozedurname bestimmt nur die Darstellung bei der |
| Ausgabe. Leerzeichen am Anfang und am Ende werden ignoriert.                |
|                                                                             |
| Bei den Real-Zahlen bedeutet Fix = Festkomma, Float = mit Exponent und      |
| Real = je nachdem. Eng ist Exponent in 3er Schritten und Ohm ist die        |
| beliebte abkuerzende Schreibweise der Elektroniker: der Dezimalpunkt wird   |
| durch das entsprechende DIN-Zeichen der Zehnerpotenz ersetzt; dafuer        |
| entfaellt dann der Exponent. Beispiel: 4K7 = 4700 Ohm ist wohl der          |
| beruehmteste Widerstand. Folgende Zeichen sind zulaessig:                   |
|                                                                             |
| Zehnerpotenz  -18  -15  -12   -9   -6    -3    3    6    9   12             |
| DIN-Kuerzel    a    f    p     n    u     m    K    M    G    T             |
|              atto femto pico nano mikro milli Kilo Mega Giga Tera           |
|                                                                             |
| Die Prozeduren erklaeren sich durch ihre Namen. Bei Real-Zahlen wird in     |
| 'digs' die Anzahl der Nachkommastellen angegeben; die anderen Zahlen werden |
| gegebenenfalls durch fuehrende Nullen auf die Feldgroesse 'digs' gebracht.  |
| Ein eventueller Prefix zaehlt extra.                                        |
|                                                                             |
| Der Parameter 'space' gibt die Groesse des zur Verfuegung stehenden         |
| Ausgabefeldes an. Dabei wird folgende Vereinbarung getroffen:               |
|                                                                             |
|  space = 0   :   Feldgroesse entsprechend der Laenge des Strings            |
|  space < 0   :   Ausgabe links buendig im Feld der Groesse '-space'         |
|  space > 0   :   Ausgabe rechts buendig, Feldgroesse = space                |
|  space = 1000:   Ausgabe in der Mitte zentriert, Feldgroesse = Fensterbreite|
|  space > 1000:   Ausgabe in der Mitte zentriert, Feldgroesse = space - 1000 |
|                                                                             |
| Falls die Laenge des auszugebenden Strings groesser als 'space' ist, wird   |
| 'space' ignoriert und der volle String angezeigt.                           |
|                                                                             |
|                                                                             |
| W A R N U N G :                                                             |
| ===============                                                             |
| Die Prozeduren dieses Moduls und darauf aufbauender Module duerfen nicht    |
| gemeinsam mit anderen I/O-Prozeduren (z.B. aus InOut) verwendet werden, da  |
| ueber den Bildschirm-Inhalt und die Cursorpositionen separat Buch gefuehrt  |
| wird.                                                                       |
-------------------------------------------------------------------------------
*)

FROM  SYSTEM        IMPORT  WORD, ADDRESS;

EXPORT  QUALIFIED   WriteStr,
                    WriteCard, WriteHex, WriteOct, WriteBin, WriteInt,
                    WriteLCard, WriteLHex, WriteLBin, WriteLInt,
                    WriteFix, WriteEng, WriteFloat, WriteReal, WriteOhm,
                    ReadStr,
                    ReadCard, ReadHex, ReadOct, ReadBin, ReadInt,
                    ReadLCard, ReadLHex, ReadLBin, ReadLInt,
                    ReadFix, ReadEng, ReadFloat, ReadReal, ReadOhm;

(*==========================================================================*)
(****   Prozeduren fuer die formatierte Ausgabe                          ****)
(*==========================================================================*)
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteStr (val : ARRAY OF CHAR; space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteCard (val : WORD; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteHex (val : WORD; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteOct (val : WORD; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteBin (val : WORD; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteInt (val : INTEGER; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteLCard (val : ADDRESS; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteLHex (val : ADDRESS; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteLBin (val : ADDRESS; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteLInt (val : LONGINT; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteFix (val : REAL; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteEng (val : REAL; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteFloat (val : REAL; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteReal (val : REAL; digs, space : INTEGER);
(*--------------------------------------------------------------------------*)
        PROCEDURE  WriteOhm (val : REAL; digs, space : INTEGER);

(*==========================================================================*)
(****   Prozeduren fuer die formatierte Eingabe                          ****)
(*==========================================================================*)
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadStr (VAR s : ARRAY OF CHAR; space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadCard (VAR val : WORD; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadHex (VAR val : WORD; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadOct (VAR val : WORD; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadBin (VAR val : WORD; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadInt (VAR val : INTEGER; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadLCard (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadLHex (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadLBin (VAR val : ADDRESS; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadLInt (VAR val : LONGINT; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadFix (VAR val : REAL; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadEng (VAR val : REAL; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadFloat (VAR val : REAL; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadReal (VAR val : REAL; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
        PROCEDURE  ReadOhm (VAR val : REAL; digs, space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)

END  AreaIO.

