IMPLEMENTATION MODULE DoRawTbl;

(*======================================================================*)
(*                        Helper version v0.07                          *)
(*======================================================================*)
(*           Copyright © 1989 Mike Cargal, All Rights Reserved          *)
(*======================================================================*)
(*      Version: 0.07           Author : Mike Cargal                    *)
(*      Date   : 20-Jun-89      Changes: Original                       *)
(*======================================================================*)


FROM SYSTEM         IMPORT ADR, TSIZE, ADDRESS, BYTE;
FROM ArpPortUtils   IMPORT CreatePort, DeletePort;
FROM ArpMemory      IMPORT ArpAllocMem;
FROM IO             IMPORT IOStdReq, IOStdReqPtr, IOFlagSet;
FROM IOUtils        IMPORT CreateStdIO, DeleteStdIO;
FROM Devices        IMPORT OpenDevice, CloseDevice;
FROM Ports          IMPORT MsgPortPtr;
FROM ConsoleDevice  IMPORT ConsoleName, ConsoleBase,
                           RawKeyConvert;
FROM Memory         IMPORT MemReqs, MemReqSet;
FROM InputEvents    IMPORT IEQualifiers, IEQualifierSet, InputEvent,
                           IEClass;
FROM TimerDevice    IMPORT TimeVal; 
                 (* IMPORT Debug; *)
(*$O-,$R-,$L+*)

(******************************************************************)

PROCEDURE AddRawTbl(RTPtr   : RawTblPtr;
                    TblCd   : CARDINAL;
                    TblQual : IEQualifierSet;
                    i       : INTEGER );

  (*-------------------------------------------------------------\
   |                                                             |
   |  Initialize RawTbl entry i (this table is indexed by the    |
   |    ASCII value of the character which we will later try     |
   |    to translate back to raw key codes).                     |
   |                                                             |
   |     RTPtr   - pointer to table to initialize entry in.      |
   |     TblCd   - Raw key code to translate to.                 |
   |     TblQual - IEQualifier to associate with code to         |
   |                generate character.                          |
   |                                                             |
   \-------------------------------------------------------------*)

BEGIN
  
  WITH RTPtr^[i] DO
    Cd   := TblCd;
    Qual := TblQual;
  END;  

END AddRawTbl;
     
(******************************************************************)
     
PROCEDURE BuildRawTbl() : RawTblPtr;

  (*-------------------------------------------------------------\
   |                                                             |
   | Open Console device. (using unit number -1 since no window) |
   |                                                             |
   | Using dummy input event loop through all $3f Raw key        |
   |   codes of the LoKeyMap, using Shift, Alt, Shift-ALt,       |
   |   and no qualifier combinations adding entry to             |
   |   RawTbl indexed by resulting character if result is        |
   |   a single character.                                       |
   |                                                             |
   | Close up Console device etc.                                |
   |                                                             |
   \-------------------------------------------------------------*)

VAR
  MyRawTblPtr  : RawTblPtr;
  MyPort       : MsgPortPtr;
  MyStdIO      : IOStdReqPtr;
  IOReturn     : INTEGER;
  QualArray    : ARRAY [0..3] OF IEQualifierSet;
  MyCode,
  MyQualifier  : CARDINAL;
  Length       : LONGINT;
  MyInputEvent : InputEvent;
  MyBuffer     : BYTE;

BEGIN

  WITH MyInputEvent DO
    ieNextEvent         := NIL;
    ieClass             := IEClassRawKey;
    ieSubClass          := BYTE(0);
    ieEventAddress      := NIL;
    ieTimeStamp.tvSecs  := 0;
    ieTimeStamp.tvMicro := 0;
  END;  

  QualArray[0] := IEQualifierSet{IEQualifierLShift,IEQualifierLAlt};
  QualArray[1] := IEQualifierSet{IEQualifierLAlt};
  QualArray[2] := IEQualifierSet{IEQualifierLShift};
  QualArray[3] := IEQualifierSet{};

  MyPort  := CreatePort(NIL,0);
  MyStdIO := CreateStdIO(MyPort);

  WITH MyStdIO^ DO
    ioData   := NIL;
    ioLength := 0;
  END;

  MyRawTblPtr := NIL;
  
  IF OpenDevice(ADR(ConsoleName),-1,MyStdIO,LONGBITSET{}) = 0 THEN
    ConsoleBase := MyStdIO^.ioDevice;
    MyRawTblPtr := RawTblPtr(ArpAllocMem(TSIZE(RawTbl),MemReqSet{MemClear}));
    FOR MyCode := 0 TO 63 DO
       FOR MyQualifier := 0 TO 3 DO 
         MyInputEvent.ieCode := MyCode;
         MyInputEvent.ieQualifier := QualArray[MyQualifier];
         Length := RawKeyConvert(ADR(MyInputEvent),
                                 ADR(MyBuffer),
                                 1,NIL);
         IF Length = 1 THEN                         
           AddRawTbl(MyRawTblPtr,
                     MyCode,
                     QualArray[MyQualifier],
                     INTEGER(MyBuffer));
         END;
       END;              
    END;
    AddRawTbl(MyRawTblPtr,68,IEQualifierSet{},13); (* RETURN *)
    AddRawTbl(MyRawTblPtr,64,IEQualifierSet{},32); (* SPACE *)
    
    CloseDevice(MyStdIO);
  END;  
  
  DeleteStdIO(MyStdIO);
  DeletePort(MyPort);
  
  RETURN(MyRawTblPtr);

END BuildRawTbl;

END DoRawTbl.