' RawKeyKonvert
'
' T.Ströter 10/12/89
' GFA BASIC 3.0 Amiga
'
' Dieses Unterprogramm verwendet die Routine RawKeyKonvert
' aus dem 'console.device', um den ASCII-Code der Raw-Codes
' gemäß der voreingestellten Keymap zu ermitteln.
' So kann man in GFA BASIC Amiga 3.0 alle Sondertasten über
' die RAW-Codes abfragen, und gleichzeitig erhält man in
' einem String das dazugehörige ASCII-Zeichen.
'
OPENW #0,100,30,380,70,&H400+&H200,&H100F
ON MENU KEY GOSUB what_key
ON MESSAGE GOSUB ende
PRINT "Ende mit ESC oder Close-Gadget"
@init_console
ende!=FALSE
'
REPEAT
  ON MENU
UNTIL ende! OR MOUSEK=3
'
@exit_console
CLOSEW #0
> PROCEDURE ende
  ende!=TRUE
RETURN
'
> PROCEDURE what_key
  LOCAL a$
  '
  IF iev%
    ' Die folgenden zwei Zeilen dienen nur zur Demonstration
    ' (TITLEW verlangsamt die Abarbeitung gewaltig...)
    TITLEW #0,"RAW:$"+HEX$(MENU(2),2)+" Qualifier:X"+BIN$(MENU(3),16)
    ende!=(MENU(2)=&H45)
    '
    IF MENU(1)=&H400 AND AND(MENU(2),&H80)=0
      CARD{iev%+6}=MENU(2)        ! Code:    Pressed Key
      CARD{iev%+8}=MENU(3)        ! Qualifier
      LONG{iev%+10}=LONG{MENU(4)} ! IAdress für Dead Keys
      CARD{iev%+14}=MENU(5)       ! XPosition
      CARD{iev%+16}=MENU(6)       ! YPosition
      CARD{iev%+18}=MENU(7)       ! Zeitpunkt
      CARD{iev%+20}=MENU(8)
      '
      ' RawKeyKonvert aufrufen
      '
      reg%(8)=iev%                ! InputEvent-Struktur
      reg%(9)=buf%                ! Buffer
      reg%(10)=0                  ! Keymap
      reg%(1)=255                 ! Länge Buffer
      RCALL reg%(14)-&H30,reg%()  ! RawKeyConvert
      IF reg%(0)
        a$=SPACE$(reg%(0))
        ~FRE(0)
        BMOVE buf%,V:a$,reg%(0)
        PRINT "ASCII:";STR$(ASC(a$),3)'a$
      ELSE
        a$=""
      ENDIF
    ENDIF
  ENDIF
RETURN
'
> PROCEDURE init_console
  '
  ' Console Device öffnen
  '
  INLINE iostdreq%,48
  LONG{iostdreq%+40}=MENU(9)    ! Fensteradresse
  a$="console.device"+CHR$(0)
  ~FRE(0)
  IF OpenDevice(V:a$,-1,iostdreq%,0)
    ALERT 0,"console.device kann nicht geöffnet werden.",1,"Weiter",ok%
    iev%=0
  ELSE
    '
    ' InputEvent-Struktur initialisieren
    '
    INLINE iev%,22
    INLINE buf%,255
    '
    LONG{iev%}=0
    BYTE{iev%+4}=1              ! CLASS:   RAW-Event
    BYTE{iev%+5}=0              ! SubClass ???
    '
    DIM reg%(15)
    reg%(14)=LONG{iostdreq%+20} ! Basisadresse Library
  ENDIF
RETURN
> PROCEDURE exit_console
  IF iev%
    ~CloseDevice(iostdreq%)
    ERASE reg%()
    iev%=0
  ENDIF
RETURN
