packages feed

retroclash-lib-0.1.0: src/RetroClash/PS2/ASCII.hs

{-# LANGUAGE RecordWildCards, LambdaCase #-}
module RetroClash.PS2.ASCII
    ( Side(..), Modifier(..)
    , modMap
    , asciiMap
    ) where

import Clash.Prelude
import RetroClash.PS2
import Data.Char

data Side
    = OnLeft
    | OnRight
    deriving (Eq, Show, Enum, Bounded, Generic, NFDataX)

data Modifier
    = Shift
    | Ctrl
    | Alt
    | Win
    deriving (Eq, Show, Enum, Bounded, Generic, NFDataX)

modMap :: KeyCode -> Maybe (Modifier, Side)
modMap 0x012 = Just (Shift, OnLeft)
modMap 0x059 = Just (Shift, OnRight)
modMap 0x014 = Just (Ctrl, OnLeft)
modMap 0x114 = Just (Ctrl, OnRight)
modMap 0x011 = Just (Alt, OnLeft)
modMap 0x111 = Just (Alt, OnRight)
modMap 0x11f = Just (Win, OnLeft)
modMap 0x127 = Just (Win, OnRight)
modMap _ = Nothing

{-# INLINE asciiMap #-}
asciiMap :: KeyCode -> Maybe (Unsigned 7)
asciiMap = fmap fromChar . charMap
  where
    fromChar = fromIntegral . ord

{-# INLINE charMap #-}
charMap :: KeyCode -> Maybe Char
charMap 0x05a = Just '\r'
charMap 0x15a = Just '\r' -- Keypad
charMap 0x00d = Just '\t'
charMap 0x029 = Just ' '
charMap 0x04c = Just ';'
charMap 0x052 = Just '\''
charMap 0x054 = Just '['
charMap 0x05b = Just ']'
charMap 0x05d = Just '\\'
charMap 0x04a = Just '/'
charMap 0x041 = Just ','
charMap 0x049 = Just '.'
charMap 0x04e = Just '-'
charMap 0x055 = Just '='
charMap 0x045 = Just '0'
charMap 0x016 = Just '1'
charMap 0x01e = Just '2'
charMap 0x026 = Just '3'
charMap 0x025 = Just '4'
charMap 0x02e = Just '5'
charMap 0x036 = Just '6'
charMap 0x03d = Just '7'
charMap 0x03e = Just '8'
charMap 0x046 = Just '9'
charMap 0x01c = Just 'a'
charMap 0x032 = Just 'b'
charMap 0x021 = Just 'c'
charMap 0x023 = Just 'd'
charMap 0x024 = Just 'e'
charMap 0x02b = Just 'f'
charMap 0x034 = Just 'g'
charMap 0x033 = Just 'h'
charMap 0x043 = Just 'i'
charMap 0x03b = Just 'j'
charMap 0x042 = Just 'k'
charMap 0x04b = Just 'l'
charMap 0x03a = Just 'm'
charMap 0x031 = Just 'n'
charMap 0x044 = Just 'o'
charMap 0x04d = Just 'p'
charMap 0x015 = Just 'q'
charMap 0x02d = Just 'r'
charMap 0x01b = Just 's'
charMap 0x02c = Just 't'
charMap 0x03c = Just 'u'
charMap 0x02a = Just 'v'
charMap 0x01d = Just 'w'
charMap 0x022 = Just 'x'
charMap 0x035 = Just 'y'
charMap 0x01a = Just 'z'
charMap _ = Nothing