(***************************************************************************

    :Program.    SerLib.mod
    :Contents.   Implementation of serlib.library in Oberon
    :Author.     Frank Schummertz
    :Address.    Emmastrasse 20, 5600 Wuppertal 2
    :Tel.        +49-202-595130
    :EMail.      Fido     : 2:241/4006.3
    :EMail.      Zerberus : FRANK_SCHUMMERTZ@TTB.ZER
    :Copyright.  Public Domain
    :Language.   Oberon
    :Translator. AmigaOberon V1.17
    :History.    03-Mar-1990 : V1.0
    :Remarks.    The SerLibData entries are marked with * for export, but
    :Remarks.    you shouldn`t play with them

****************************************************************************)

MODULE SerLib;

IMPORT e   : Exec,
       i   : Intuition,
       s   : SYSTEM,
       Serial;

CONST abortSend * = 1;
      abortRecv * = 2;

TYPE SerLibDataPtr * = POINTER TO SerLibData;
     SerLibData * = STRUCT
     SerPort *  : e.MsgPortPtr;
     SerWPort * : e.MsgPortPtr;
     SerReq *   : Serial.IOExtSerPtr;
     SerWReq *  : Serial.IOExtSerPtr;
     END;

     SerStatusPtr * = POINTER TO SerStatus;
     SerStatus * = STRUCT
     unread *   : LONGINT;
     status *   : SET;
     END;

     SerLibPtr * = POINTER TO SerLibBase;
     SerLibBase * = STRUCT
	LibNode * : e.LibraryPtr;
	flags *   : INTEGER;
     pad *     : INTEGER;
     SysLib *  : LONGINT;
     DosLib *  : LONGINT;
     SegList * : LONGINT;
     Cnt *     : CHAR;
	unused *  : INTEGER;
     unused2 * : INTEGER;
     END;

VAR ser * : SerLibPtr;

PROCEDURE OpenSerial * {ser, -30 } (device {8} : ARRAY OF CHAR;
                                      unit {0} : LONGINT;
                                      baud {1} : LONGINT;
                                       bpc {2} : INTEGER;
                                      stop {3} : INTEGER;
                                  serFlags {4} : LONGSET): SerLibDataPtr;

PROCEDURE CloseSerial * {ser, -36} (sld {8} : SerLibDataPtr);
PROCEDURE ChangeData * {ser, -42} (sld {8} : SerLibDataPtr;
                                  baud {0} : LONGINT;
                                   bpc {1} : INTEGER;
                                  stop {2} : INTEGER;
                              serFlags {3} : LONGSET);

PROCEDURE WriteSer * {ser, -48} (sld {8} : SerLibDataPtr;
                                 buf {9} : ARRAY OF CHAR;
                                 len {0} : LONGINT);

PROCEDURE ReadSer * {ser, -54} (sld {8} : SerLibDataPtr;
                                buf {9} : ARRAY OF CHAR;
                                max {0} : LONGINT): LONGINT;

PROCEDURE GetStatus * {ser, -60} (sld {8} : SerLibDataPtr;
                                  sst {9} : SerStatusPtr);

PROCEDURE SerBuffer * {ser, -66} (sld {8} : SerLibDataPtr): LONGINT;

PROCEDURE WaitSer * {ser, -72} (sld {8} : SerLibDataPtr;
                             orMask {0} : LONGINT): LONGINT;

PROCEDURE CheckCD * {ser, -78} (sld {8} : SerLibDataPtr): BOOLEAN;

PROCEDURE SendSer * {ser, -84} (sld {8} : SerLibDataPtr;
                                buf {9} : ARRAY OF CHAR;
                                len {0} : LONGINT);

PROCEDURE RecvSer * {ser, -90} (sld {8} : SerLibDataPtr;
                                buf {9} : ARRAY OF CHAR;
                                len {0} : LONGINT);

PROCEDURE AbortIOSer * {ser, -96} (sld {8} : SerLibDataPtr;
                                 which {0} : LONGINT);

PROCEDURE CheckIOSer * {ser, -102} (sld {8} : SerLibDataPtr): BOOLEAN;

PROCEDURE ClearSer * {ser, -108} (sld {8} : SerLibDataPtr);

BEGIN

 ser :=  s.VAL (SerLibPtr, e.OpenLibrary ("serlib.library", 3));
 IF ser = NIL THEN
   s.SETREG (0, i.DisplayAlert ( 0, "\x00\x64\x14missing serlib.library !", 50));
   HALT (0);
 END;

CLOSE

 IF ser # NIL THEN e.CloseLibrary (s.VAL (e.LibraryPtr, ser)) END;

END SerLib.
