CLEO Help key pressed

CLEO related
Status
Not open for further replies.

KamikazeSripterul

Well-known member
Joined
Jun 30, 2019
Messages
353
Reaction score
23
Hey, I've been thinking of a cleo however im not sure how to get the key that has been pressed. So if i press 'F' the key will appear in chat. I don't want to write 'if key_down {key}' for every existing key. Is there any way to make it quicker and cleaner?
 

Hidend

Expert
Joined
Mar 4, 2013
Messages
625
Reaction score
39
I mean, if you want "if i press F key" without an IF statement I'm not sure what you can really do. If you have multiple keys, you have to make multiple IF staments, as there isn't a switch statement or something like that in CLEO, you can use OB34 if you want as it's "cleaner" but idk
 

Zin

Expert
Joined
Aug 1, 2013
Messages
1,690
Reaction score
103
Probably reading memory address for virtual keys you could do a FOR loop through all the different key codes and check if they're equal to 255 and then print the key if it is.
 

KamikazeSripterul

Well-known member
Joined
Jun 30, 2019
Messages
353
Reaction score
23
I want to make a keybinder. And I want to be able to modify the keys from the game. I need to know which key I pressed. If I type '/keybind' a dialog comes up which I enter the text I need. After I submitted that, the chat says 'press the key you want this bind on'. Once the key is pressed, it says '{entered text} is now set on key {key}.'
 

Hidend

Expert
Joined
Mar 4, 2013
Messages
625
Reaction score
39
I want to make a keybinder. And I want to be able to modify the keys from the game. I need to know which key I pressed. If I type '/keybind' a dialog comes up which I enter the text I need. After I submitted that, the chat says 'press the key you want this bind on'. Once the key is pressed, it says '{entered text} is now set on key {key}.'
Use a .ini file, a txt or basically whatever to bind a key to a value (text)?
 

Zin

Expert
Joined
Aug 1, 2013
Messages
1,690
Reaction score
103
Probably reading memory address for virtual keys you could do a FOR loop through all the different key codes and check if they're equal to 255 and then print the key if it is.
C++:
{$CLEO .cs}

THREAD 'BINDS'

REPEAT
    WAIT 0
UNTIL 0AFA:

WHILE TRUE
    WAIT 0
   
    FOR 0@ = 0x01 TO 0xFE STEP 0x01
        0085: 1@ = 0@
        1@ *= 2
        1@ += 0xB72CC8
        0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
        IF
            2@ == 255
        THEN
            CHATMSG "KEY: %x" -1 0@
        END
    END
   
END
Like this, not sure if all keys work I know lmb didn't work but that's probably down to me otherwise it does what you want. Oh and thanks Parazitas for somehow knowing about this address.
 

KamikazeSripterul

Well-known member
Joined
Jun 30, 2019
Messages
353
Reaction score
23
C++:
{$CLEO .cs}

THREAD 'BINDS'

REPEAT
    WAIT 0
UNTIL 0AFA:

WHILE TRUE
    WAIT 0
 
    FOR 0@ = 0x01 TO 0xFE STEP 0x01
        0085: 1@ = 0@
        1@ *= 2
        1@ += 0xB72CC8
        0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
        IF
            2@ == 255
        THEN
            CHATMSG "KEY: %x" -1 0@
        END
    END
 
END
Like this, not sure if all keys work I know lmb didn't work but that's probably down to me otherwise it does what you want. Oh and thanks Parazitas for somehow knowing about this address.
Yeah, I was gonna ask... What does 1@ *= 2 and 1@ += 0xB72CC8 do.. Is there a condition they must meet?
Edit: Also, I wish only numbers and letters to work so it's not TOO confusing with which keys work and don't work if that's possible. @Parazitas.
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania
Oh and thanks Parazitas for somehow knowing about this address.
This address you can find easy way with cheat engine bys scanning Gta_sa.exe.
For example:
Hold key W and do scan 255 , when you release it next scan is 0 value and repeat again same way until you find it.
Or
You can first scan unknown initial value then Hold key W and do scan increase value when you release key do scan decreased value and repeat again same way until you find it, but now not need do unknown initial value.
So..
Finally you should get between 3-5 memory address , add all to list and set value to 255 if value not return to 0 it means virtual key.
This two way how you can find virtual, game or char key pointers.
 
Last edited:

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania
Also, I wish only numbers and letters to work so it's not TOO confusing with which keys work and don't work if that's possible.

Also with numpad keys
PHP:
{$CLEO .cs}

THREAD 'BINDS'

REPEAT
    WAIT 0
UNTIL 0AFA:

WHILE TRUE
    WAIT 0
   
    FOR 0@ = 0x30 TO 0x69 STEP 0x01 // From Key 1 till NUMPAD KEY 9 
        0085: 1@ = 0@
        1@ *= 2
        1@ += 0xB72CC8
        0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
        IF
            2@ == 255
        THEN
            CHATMSG "KEY: %x" -1 0@
        END
    END
   
END

Only digits and letters
PHP:
{$CLEO .cs}

THREAD 'BINDS'

REPEAT
    WAIT 0
UNTIL 0AFA:

WHILE TRUE
    WAIT 0
   
    FOR 0@ = 0x30 TO 0x5A STEP 0x01 // From Key 1 till key Z
        0085: 1@ = 0@
        1@ *= 2
        1@ += 0xB72CC8
        0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
        IF
            2@ == 255
        THEN
            CHATMSG "KEY: %x" -1 0@
        END
    END
   
END
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania

KamikazeSripterul

Well-known member
Joined
Jun 30, 2019
Messages
353
Reaction score
23
@Parazitas do you know if there is any way to tell that key as letter / digit? So if I press '1' I will display 1 in chat, if I press 'A' it will display A in chat. If you don't know that okay, you've helped me enough anyways.
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania

Zin

Expert
Joined
Aug 1, 2013
Messages
1,690
Reaction score
103
@Parazitas do you know if there is any way to tell that key as letter / digit? So if I press '1' I will display 1 in chat, if I press 'A' it will display A in chat. If you don't know that okay, you've helped me enough anyways.
Probably ought to make a string array where each "element" is equal to the key code and thus you can cross-reference for the "KEY", this could be a pain in the arse to set up though unless there is some sort of premade array out there in the windows files or something.
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania
PHP:
{$CLEO .cs}

THREAD 'BINDS'

REPEAT
    WAIT 0
UNTIL 0AFA:

WHILE TRUE
    WAIT 0
   
FOR 0@ = 0x30 TO 0x5A STEP 0x01 // From Key 1 till key Z
    0085: 1@ = 0@
    1@ *= 2
    1@ += 0xB72CC8
    0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
    IF AND
    0@ == 0x30 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 0" -1
    END
    
    IF AND
    0@ == 0x31 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 1" -1
    END
    
    IF AND
    0@ == 0x32 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 2" -1
    END
    
    IF AND
    0@ == 0x33 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 3" -1
    END
    
    IF AND
    0@ == 0x34 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 4" -1
    END
    
    IF AND
    0@ == 0x35 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 5" -1
    END
    
    IF AND
    0@ == 0x36 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 6" -1
    END
    
    IF AND
    0@ == 0x37 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 7" -1
    END
    
    IF AND
    0@ == 0x38
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 8" -1
    END
    
    IF AND
    0@ == 0x39 
    2@ == 255
    THEN
        CHATMSG "I PRESSED KEY: 9" -1
    END
END

END
 

KamikazeSripterul

Well-known member
Joined
Jun 30, 2019
Messages
353
Reaction score
23
Code:
{$CLEO}
{$INCLUDE SF}
0000:
thread "TaxiCMD"

repeat
wait 0
until SAMP.Available()

0B34: "clear" @clear
0B34: "clearall" @clearall
0B34: "bind" @keybind
0B34: "keybinder" @info

WHILE TRUE
WAIT 0

    // test for pressed key
    IF AND
    0B21: NOT samp is_chat_opened
    11@ == 1
    THEN
        FOR 0@ = 0x30 TO 0x5A STEP 0x01 // From Key 1 till key Z
            0085: 1@ = 0@
            1@ *= 2
            1@ += 0xB72CC8
            0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
            IF 2@ == 255
            THEN
                alloc 8@ 100
                format 8@ "key%d" 10@
                0AF1: write_int 0@ to_ini_file "cleo\Keybinder.ini" section "Binds" key 8@
                // chatmsg "KEY: %x" -1 0@
                wait 1000
                11@ = 0
            END
        END
    END
  
    // Clear all binds {id 2000}
    IF SAMP.DialogRespond(2000, 1@, 0, 0)
    THEN
        IF 1@ == 1
        THEN
            IF 0AAB:   file_exists "CLEO\Keybinder.ini"
            THEN
                0B00: delete_file "CLEO\Keybinder.ini"
                10@ = 0
            ELSE
                IF 0AAB: file_exists "Cleo\Keybinder.ini"
                THEN
                    0AAB:   file_exists "Cleo\Keybinder.ini"
                    10@ = 0
                END
            END
        END
    END
  
    // Set command {id 5000}
    IF SAMP.DialogRespond(5000, 1@, 0, 2@)
    THEN
        IF 1@ == 1 // button 1 {Set}
        THEN
            11@ = 1 // enable key press
            alloc 7@ 100
            format 7@ "bind%d" 10@
            10@ += 1 // number of binds increases *no overlap*                     
            0AF5: write_string 2@ {command} to_ini_file "cleo\Keybinder.ini" section "Binds" key 7@ {bind in .ini}
            free 7@
        END
    END
          

END

:clear

:clearall
SAMP.IsCommandTyped(20@)
SAMP.ShowDialog(2000, "Keybinder by Kristler", "Are you sure you wish to clear all binds?", "Yes", "No", 0)
SAMP.CmdRet()

:keybind
SAMP.IsCommandTyped(20@)
SAMP.ShowDialog(5000, "Keybinder by Kristler", "Please enter the command you wish to bind (include '/' if needed):", "Set", "Cancel", 1)
SAMP.CmdRet()

:info
SAMP.IsCommandTyped(20@)
0AC6: 4@ = label @info_ offset
SAMP.ShowDialog(3000, "Keybinder by Kristler", 4@, "Close", "", 0)
SAMP.CmdRet()

:info_
HEX

END
So I've got this so far.. I decided to leave the pressing key part towards the end and move on. The process is to type /bind > Dialog shows up to enter the command / text which will be bind on the key, afterwards you have to press the key on which you want to bind it. I am having trouble allocating the right memory for reading the entered text / command in the dialog and then storing it to .ini file. Could you help me with this, please? @Parazitas @Zin
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,116
Solutions
5
Reaction score
882
Location
Lithuania
@KamikazeSripterul
I made this just because i working now with my new project, so take it.

Usage example:
PHP:
if
0AB1: @KeyPressCheck 0 0@
then
    chatmsg "%s" -1 0@
end

Code return letter or digit with you pressed
PHP:
:KeyPressCheck
if
32@ > 200 // anti spam key , timer: 200 mili sec
then
    0485:  return_true
    if 
    0AB0: 48 // 0
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "0"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 49 // 1
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "1"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 50 // 2
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "2"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 51 // 3
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "3"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 52 // 4
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "4"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 53 // 5
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "5"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 54 // 6
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "6"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 55 // 7
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "7"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 56 // 8
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "8"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 57 // 9
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "9"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 96 // 0
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "0"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 97 // 1
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "1"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 98 // 2
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "2"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 99 // 3
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "3"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 100 // 4
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "4"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
 
    if 
    0AB0: 101 // 5
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "5"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 102 // 6
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "6"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 103 // 7
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "7"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 104 // 8
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "8"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if 
    0AB0: 105 // 9
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "9"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 65 // a
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "A"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 65 // a
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "a"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 66 // b
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "B"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 66 // b
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "b"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 67 // c
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "C"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 67 // c
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "c"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 68 // d
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "D"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 68 // d
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "d"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 69 // e
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "E"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@  
    else
        if 
        0AB0: 69 // e
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "e"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@  
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 70 // f
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "F"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 70 // f
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "f"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 71 // g
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "G"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 71 // g
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "g"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 72 // h
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "H"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 72 // h
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "h"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 73 // i
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "I"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 73 // i
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "i"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 74 // j
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "J"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 74 // j
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "j"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 75 // k
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "K"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 75 // k
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "k"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 76 // l
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "L"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 76 // l
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "l"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 77 // m
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "M"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 77 // m
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "m"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 78 // n
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "N"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 78 // n
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "n"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift   
    0AB0: 79 // o
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "O"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 79 // o
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "o"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift   
    0AB0: 80 // p
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "P"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 80 // p
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "p"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 81 // q
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "Q"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 81 // q
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "q"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 82 // r
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "R"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 82 // r
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "r"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 83 // s
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "S"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 83 // s
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "s"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 84 // t
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "T"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 84 // t
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "t"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 85 // u
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "U"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 85 // u
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "u"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 86 // v
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "V"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 86 // v
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "v"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 87 // w
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "W"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 87 // w
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "w"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 88 // x
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "X"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 88 // x
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "x"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift  
    0AB0: 89 // y
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "Y"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 89 // y
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "y"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
 
    if and
    0AB0: 16 // shift 
    0AB0: 90 // z
    then
        32@ = 0
        0AC8: 10@ = allocate_memory_size 60
        0AD3: 10@ = format "Z"
        0AB2: ret 1 10@
        0AC9: free_allocated_memory 10@
    else
        if 
        0AB0: 90 // z
        then
            32@ = 0
            0AC8: 10@ = allocate_memory_size 60
            0AD3: 10@ = format "z"
            0AB2: ret 1 10@
            0AC9: free_allocated_memory 10@
        end
    end
else
    059A:  return_false
end             
0AB2: ret 0
 
Status
Not open for further replies.
Top