Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <REG51F380.H> ;INCLUDE
- ;-------------------------------------------------------------------------------------------------------------------;
- ;CONSTANT DEFINES FOR CHAR_NUM AND CHAR_STATE
- ;-------------------------------------------------------------------------------------------------------------------;
- CHAR_0 EQU 0C0H ;DEFINE NUMBERS
- CHAR_1 EQU 0F9H
- CHAR_2 EQU 0A4H
- CHAR_3 EQU 0B0H
- CHAR_4 EQU 099H
- CHAR_5 EQU 092H
- CHAR_6 EQU 082H
- CHAR_7 EQU 0F8H
- CHAR_8 EQU 080H
- CHAR_9 EQU 090H
- CHAR_a EQU 088H
- CHAR_b EQU 083H
- CHAR_c EQU 0C6H
- CHAR_d EQU 0A1H
- CHAR_e EQU 086H
- CHAR_f EQU 08EH
- CHAR_LOCKED EQU 0C7h ;DEFINE CHARACTERS
- CHAR_FAIL EQU 08Eh
- CHAR_OPEN EQU 023h
- CHAR_BLOCKED EQU 083h
- ;-------------------------------------------------------------------------------------------------------------------;
- ;OTHER DEFINES
- ;-------------------------------------------------------------------------------------------------------------------;
- VTIME EQU (-50000) ;THIS TIMES 250(us) = 12.5 seconds (led blinking in blocked)
- INITIAL_ATTEMPT EQU 1 ;RESET_TENTATIVAS
- KEY_LEN EQU 4 ;DEFAULT KEY LENGHT
- MAX_TENT EQU 5 ;MAXIMUM OF TRIES
- STACK_FRAME EQU 0A0H ;PLACE WHERE SP POINTS TO
- ;-------------------------------------------------------------------------------------------------------------------;
- ;STATES
- ;-------------------------------------------------------------------------------------------------------------------;
- S_LOCKED EQU 0 ;ESTADOS-CORRESPONDEM A VALORES NUMERICOS
- S_DECRYPT EQU 1
- S_FAIL EQU 2
- S_BLOCKED EQU 3
- S_OPEN EQU 4
- S_ENCRYPT EQU 5
- S_ERROR EQU 6
- ;-------------------------------------------------------------------------------------------------------------------;
- ;FLAGS
- ;-------------------------------------------------------------------------------------------------------------------;
- F_SET BIT 0H ;DECLARE FLAGS
- WRONG BIT 1H
- FT_DEC BIT 2H
- FT_ENC BIT 3H
- EXHAUST BIT 4H
- FTOOGLE_SLOW BIT 5H
- ;-------------------------------------------------------------------------------------------------------------------;
- ;VARIABLES
- ;-------------------------------------------------------------------------------------------------------------------;
- STATE DATA 030H ;DECLARE STATE AND NSTATE
- NSTATE DATA 032H
- COUNT_B0 DATA 033H
- COUNT_B1 DATA 034H
- COUNT_O0 DATA 035H
- COUNT_O1 DATA 036H
- COUNT_O2 DATA 037H
- BLINK7L DATA 038H
- BLINK7H DATA 039H
- COUNT_F0 DATA 040H
- COUNT_F1 DATA 041H
- COUNT_F2 DATA 042H
- INDEX DATA 050H
- COUNT DATA 051H
- LED_BAR DATA 053H
- TENTATIVAS DATA 054H
- INDEX_CODE DATA 055H
- BYTE0 DATA 056H
- BYTE1 DATA 057H
- BYTE2 DATA 058H
- BYTE3 DATA 059H
- USER_KEY DATA 060H ;KEYS
- SEC_KEY IDATA 080H
- ;-------------------------------------------------------------------------------------------------------------------;
- ;HARDWARE ASSIGNMENTS
- ;-------------------------------------------------------------------------------------------------------------------;
- OUTPORT EQU P3
- TB EQU P3.4
- K_LOAD EQU P0.6
- K_SET EQU P0.7
- LED_PIN EQU P2.7
- BUZZER_PIN EQU P3.5
- HW_FLAG EQU P1.0
- ;-------------------------------------------------------------------------------------------------------------------;
- ;EXTERN CODE
- ;-------------------------------------------------------------------------------------------------------------------;
- EXTRN CODE (INIT_XBARE)
- EXTRN CODE (CONFIG_TIMERS)
- EXTRN CODE (OSCILLATOR_INIT)
- ;-------------------------------------------------------------------------------------------------------------------;
- ;BOXES: FORWARD_SUBSTITUTION_BOX
- ;-------------------------------------------------------------------------------------------------------------------;
- CSEG AT 1500H
- FS_BOX:
- DB 63h, 7ch, 77h, 7bh, 0f2h, 6bh, 6fh, 0c5h, 30h, 01h, 67h, 2bh, 0feh, 0d7h, 0abh, 76h
- DB 0cah, 82h, 0c9h, 7dh, 0fah, 59h, 47h, 0f0h, 0adh, 0d4h, 0a2h, 0afh, 9ch, 0a4h, 72h, 0c0h
- DB 0b7h, 0fdh, 93h, 26h, 36h, 3fh, 0f7h, 0cch, 34h, 0a5h, 0e5h, 0f1h, 71h, 0d8h, 31h, 15h
- DB 04h, 0c7h, 23h, 0c3h, 18h, 96h, 05h, 9ah, 07h, 12h, 80h, 0e2h, 0ebh, 27h, 0b2h, 75h
- DB 09h, 83h, 2ch, 1ah, 1bh, 6eh, 5ah, 0a0h, 52h, 3bh, 0d6h, 0b3h, 29h, 0e3h, 2fh, 84h
- DB 53h, 0d1h, 00h, 0edh, 20h, 0fch, 0b1h, 5bh, 6ah, 0cbh, 0beh, 39h, 4ah, 4ch, 58h, 0cfh
- DB 0d0h, 0efh, 0aah, 0fbh, 43h, 4dh, 33h, 85h, 45h, 0f9h, 02h, 7fh, 50h, 3ch, 9fh, 0a8h
- DB 51h, 0a3h, 40h, 8fh, 92h, 9dh, 38h, 0f5h, 0bch, 0b6h, 0dah, 21h, 10h, 0ffh, 0f3h, 0d2h
- DB 0cdh, 0ch, 13h, 0ech, 5fh, 97h, 44h, 17h, 0c4h, 0a7h, 7eh, 3dh, 64h, 5dh, 19h, 73h
- DB 60h, 81h, 4fh, 0dch, 22h, 2ah, 90h, 88h, 46h, 0eeh, 0b8h, 14h, 0deh, 5eh, 0bh, 0dbh
- DB 0e0h, 32h, 3ah, 0ah, 49h, 06h, 24h, 5ch, 0c2h, 0d3h, 0ach, 62h, 91h, 95h, 0e4h, 79h
- DB 0e7h, 0c8h, 37h, 6dh, 8dh, 0d5h, 4eh, 0a9h, 6ch, 56h, 0f4h, 0eah, 65h, 7ah, 0aeh, 08h
- DB 0bah, 78h, 25h, 2eh, 1ch, 0a6h, 0b4h, 0c6h, 0e8h, 0ddh, 74h, 1fh, 4bh, 0bdh, 8bh, 8ah
- DB 70h, 3eh, 0b5h, 66h, 48h, 03h, 0f6h, 0eh, 61h, 35h, 57h, 0b9h, 86h, 0c1h, 1dh, 9eh
- DB 0e1h, 0f8h, 98h, 11h, 69h, 0d9h, 8eh, 94h, 9bh, 1eh, 87h, 0e9h, 0ceh, 55h, 28h, 0dfh
- DB 8ch, 0a1h, 89h, 0dh, 0bfh, 0e6h, 42h, 68h, 41h, 99h, 2dh, 0fh, 0b0h, 54h, 0bbh, 16h
- CSEG AT 0H //RESPOSTA AO RESET
- LJMP MAIN
- ;-------------------------------------------------------------------------------------------------------------------;
- ;ISR
- ;-------------------------------------------------------------------------------------------------------------------;
- CSEG AT 0bh
- LJMP ISR_T0
- CSEG AT 100H
- ISR_T0:
- PUSH PSW ;STORE PSW
- PUSH ACC ;STORE ACC
- ENCODE_IFSM:
- MOV DPTR, #ITABLE_FSM
- MOV A, STATE
- RL A
- JMP @A+DPTR
- ITABLE_FSM:
- AJMP INT_LOCKED
- AJMP INT_DECRYPT
- AJMP INT_FAIL
- AJMP INT_BLOCKED
- AJMP INT_OPEN
- AJMP INT_ENCRYPT
- AJMP INT_ERROR
- INT_LOCKED:
- RETI
- INT_DECRYPT:
- RETI
- INT_FAIL:
- CLR C
- MOV A,COUNT_F0
- ADD A,#1
- MOV COUNT_F0,A
- MOV A,COUNT_F1
- ADDC A,#0
- MOV COUNT_F1,A
- MOV A,COUNT_F2
- ADDC A,#0
- MOV COUNT_F2,A
- JC TIME_OUT_T0_FAIL
- POP ACC
- POP PSW
- RETI
- INT_BLOCKED:
- CPL BUZZER_PIN
- SETB RS0 ;SWITCH TO BANK 1
- CLR C
- MOV A,COUNT_B0
- ADD A,#1
- MOV COUNT_B0,A
- MOV A,COUNT_B1
- ADDC A,#0
- MOV COUNT_B1,A
- JC TIME_OUT_T0_BLOCKED
- POP ACC
- POP PSW
- RETI
- INT_OPEN:
- SETB RS0
- CLR C
- MOV A,COUNT_O0
- ADD A,#1
- MOV COUNT_O0,A
- MOV A,COUNT_O1
- ADDC A,#0
- MOV COUNT_O1,A
- MOV A,COUNT_O2
- ADDC A,#0
- MOV COUNT_O2,A
- JC TIME_OUT_T0_OPEN
- MOV A,BLINK7L
- ADD A,#1
- MOV BLINK7L,A
- MOV A,BLINK7H
- ADDC A,#0
- MOV BLINK7H,A
- JNC END_INT
- ACALL RELOAD_OPEN_BLINK
- CPL P2.7
- END_INT:
- POP ACC
- POP PSW
- RETI
- INT_ENCRYPT:
- RETI
- INT_ERROR:
- RETI
- TIME_OUT_T0_FAIL:
- ACALL RELOAD_FAIL
- DJNZ R4, END1CYCLE
- SETB EXHAUST
- INC R0 ;R0 AT BANK 1
- CLR EA
- END1CYCLE:
- POP ACC
- POP PSW
- RETI
- TIME_OUT_T0_OPEN:
- ACALL RELOAD_OPEN_WAIT
- SETB EXHAUST
- INC R0 ;R0 AT BANK 1
- CLR EA
- POP ACC
- POP PSW
- RETI
- TIME_OUT_T0_BLOCKED:
- ACALL RELOAD_BLOCKED
- SETB FTOOGLE_SLOW
- INC R0 ;R0 AT BANK 1
- POP ACC
- POP PSW
- RETI
- ;-------------------------------------------------------------------------------------------------------------------;
- ;RELOAD_TIMES
- ;-------------------------------------------------------------------------------------------------------------------;
- RELOAD_OPEN_WAIT:
- MOV COUNT_O0,#040H
- MOV COUNT_O1,#02BH
- MOV COUNT_O2,#0FEH
- RET
- RELOAD_OPEN_BLINK:
- MOV BLINK7L, #030H
- MOV BLINK7H, #0F8H
- RET
- RELOAD_BLOCKED:
- MOV COUNT_B0,#LOW(VTIME)
- MOV COUNT_B1,#HIGH(VTIME)
- RET
- RELOAD_FAIL:
- MOV COUNT_F0,#040H
- MOV COUNT_F1,#02BH
- MOV COUNT_F2,#0FEH
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;INIT_VAR
- ;-------------------------------------------------------------------------------------------------------------------;
- INIT_VAR:
- MOV LED_BAR, #00H
- MOV OUTPORT, #00H
- MOV TENTATIVAS, #INITIAL_ATTEMPT
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;INIT_FLAGS_BUTTONS
- ;-------------------------------------------------------------------------------------------------------------------;
- INIT_FLAGS_BUTTONS:
- SETB K_LOAD //ATIVAR LOAD
- SETB K_SET //ATIVAR SET
- CLR F_SET //limpar flag_set
- SETB HW_FLAG //ativar/limpar hwflag
- CLR EXHAUST //exhaust block
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;WAIT_INPUT
- ;-------------------------------------------------------------------------------------------------------------------;
- WAIT_LOAD:
- JB K_LOAD, $
- JNB K_LOAD, $
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;MAIN
- ;-------------------------------------------------------------------------------------------------------------------;
- MAIN:
- MOV SP, #0A0H
- ACALL CONFIG_TIMERS
- ACALL OSCILLATOR_INIT
- ACALL INIT_XBARE
- ACALL INIT_VAR
- ACALL INIT_FLAGS_BUTTONS
- ACALL RELOAD_OPEN_WAIT
- ACALL RELOAD_OPEN_BLINK
- ACALL RELOAD_BLOCKED
- ACALL RELOAD_FAIL
- JNB HW_FLAG, RELOAD
- ;-------------------------------------------------------------------------------------------------------------------;
- ;COMP SIZE: WARMSTART-> SIZE = 4, COLDSTART-> SIZE !=4
- ;-------------------------------------------------------------------------------------------------------------------;
- COMP_SIZE:
- MOV R1,#SEC_KEY
- MOV A, @R1
- CLR C
- SUBB A, #KEY_LEN
- JNZ COLDSTART
- WARMSTART:
- JMP MLOOP
- COLDSTART:
- MOV STATE, #S_ERROR
- MOV NSTATE, #S_ERROR
- MOV R1,#SEC_KEY
- MOV @R1,#0
- JMP MLOOP
- ;-------------------------------------------------------------------------------------------------------------------;
- ;RELOAD SEC_KEY, HW_FLAG = 1
- ;-------------------------------------------------------------------------------------------------------------------;;
- RELOAD:
- MOV R1, #SEC_KEY
- MOV @R1, #00H
- MOV INDEX_CODE, #CHAR_1
- ACALL ENCRYPTION
- ACALL INSERT_SEC_KEY
- MOV INDEX_CODE, #CHAR_0
- ACALL ENCRYPTION
- ACALL INSERT_SEC_KEY
- MOV INDEX_CODE, #CHAR_0
- ACALL ENCRYPTION
- ACALL INSERT_SEC_KEY
- MOV INDEX_CODE, #CHAR_0
- ACALL ENCRYPTION
- ACALL INSERT_SEC_KEY
- MOV STATE, #S_LOCKED
- MOV NSTATE, #S_LOCKED
- MLOOP:
- ACALL ENCODE_FSM
- MOV STATE, NSTATE
- JMP MLOOP
- KEY_LOOP:
- JNB K_SET, FLX_SET
- JB K_LOAD, KEY_LOOP
- JNB K_LOAD, FLX_LOAD
- ;-------------------------------------------------------------------------------------------------------------------;
- ;FLOW: LOAD, SET
- ;-------------------------------------------------------------------------------------------------------------------;
- FLX_LOAD:
- JNB K_LOAD, $
- CLR F_SET
- RET
- FLX_SET:
- JNB K_SET, $
- SETB F_SET
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;JUMP_TABLE
- ;-------------------------------------------------------------------------------------------------------------------;
- ENCODE_FSM:
- MOV DPTR, #TABLE_FSM
- MOV A, STATE
- RL A
- JMP @A+DPTR
- TABLE_FSM:
- AJMP CODE_LOCKED
- AJMP CODE_DECRYPT
- AJMP CODE_FAIL
- AJMP CODE_BLOCKED
- AJMP CODE_OPEN
- AJMP CODE_ENCRYPT
- AJMP CODE_ERROR
- ;-------------------------------------------------------------------------------------------------------------------;
- ;STATES
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_LOCKED:
- MOV P2, #CHAR_LOCKED
- CLR TB
- ACALL WAIT_LOAD
- SETB FT_DEC
- ;MOV INDEX, #00H
- MOV NSTATE, #S_DECRYPT
- CLR F_SET
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_DECRYPT:
- JB FT_DEC, FIRSTIME
- ACALL KEY_LOOP
- JB F_SET, INC_INDEX
- JNB F_SET, LOAD_PRESSED
- FIRSTIME:
- CLR FT_DEC
- MOV LED_BAR, #00H
- ACALL RESET_INDEX
- MOV P2, #CHAR_0
- MOV R0, #USER_KEY
- MOV @R0, #00H
- JMP CODE_DECRYPT
- LOAD_PRESSED:
- MOV P2, #CHAR_0
- ACALL ENCRYPTION
- ACALL RESET_INDEX
- ACALL INSERT_USER_KEY
- ACALL UPDATE_LEDS
- ACALL CHECK_SIZE
- JZ COMPARE
- JMP CODE_DECRYPT
- INC_INDEX:
- CLR F_SET
- INC INDEX
- ANL INDEX, #0FH
- JMP PRINT
- CHECK_SIZE:
- CLR C
- MOV A, #KEY_LEN
- SUBB A, @R0
- RET
- COMPARE:
- ACALL COMP_KEY
- JMP ENCODE_FSM
- PRINT:
- ACALL UPDATE_DISP
- MOV NSTATE, #S_DECRYPT
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_FAIL:
- USING 0
- MOV P2, #CHAR_FAIL
- CLR TB
- MOV 4, TENTATIVAS
- MOV A, TENTATIVAS
- CLR C
- SUBB A, #05H
- CLR C
- JZ ST_BLOCKED
- SETB EA
- SETB TR0
- JNB EXHAUST, $
- CLR TR0
- ACALL LOCKED_FAIL
- RET
- ST_BLOCKED:
- MOV NSTATE, #S_BLOCKED
- RET
- LOCKED_FAIL:
- CLR EXHAUST
- INC TENTATIVAS
- MOV NSTATE, #S_LOCKED
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_BLOCKED:
- MOV P2, #CHAR_BLOCKED
- MOV TENTATIVAS, #INITIAL_ATTEMPT
- CLR TB
- CLR EA
- CLR FTOOGLE_SLOW
- SETB EA
- SETB TR0
- B_LOOP:
- JNB FTOOGLE_SLOW,$
- CPL LED_PIN
- CLR EA
- CLR FTOOGLE_SLOW
- SETB EA
- SJMP B_LOOP
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_OPEN:
- MOV P2, #CHAR_OPEN
- SETB TB
- SETB FT_ENC
- MOV TENTATIVAS, #INITIAL_ATTEMPT
- MOV NSTATE, #S_ENCRYPT
- SETB EA
- SETB TR0
- ACALL KEY_LOOP
- JNB F_SET, KLOAD_PR
- CLR F_SET
- SETB EXHAUST
- KLOAD_PR:
- CLR TR0
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_ENCRYPT:
- JB FT_ENC, FIRSTIME_ENC
- ACALL KEY_LOOP
- JB F_SET, INC_INDEX_ENC
- JNB F_SET, LOAD_PRESSED_ENC
- FIRSTIME_ENC:
- JNB EXHAUST, LOCKING
- CLR EXHAUST
- CLR FT_ENC
- MOV LED_BAR, #00H
- ACALL RESET_INDEX
- MOV P2, #CHAR_0
- MOV R1, #SEC_KEY
- MOV @R1, #00H
- JMP CODE_ENCRYPT
- LOAD_PRESSED_ENC:
- MOV P2, #CHAR_0
- ACALL ENCRYPTION
- ACALL RESET_INDEX
- ACALL INSERT_SEC_KEY
- ACALL UPDATE_LEDS
- ACALL CHECK_SIZE_ENC
- JZ LOCKING
- JMP CODE_ENCRYPT
- INC_INDEX_ENC:
- CLR F_SET
- INC INDEX
- ANL INDEX, #0FH
- JMP PRINT_ENC
- CHECK_SIZE_ENC:
- CLR C
- MOV A, #KEY_LEN
- SUBB A, @R1
- RET
- LOCKING:
- MOV NSTATE, #S_LOCKED
- RET
- PRINT_ENC:
- ACALL UPDATE_DISP
- MOV NSTATE, #S_ENCRYPT
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- CODE_ERROR:
- MOV P2, #CHAR_e
- CLR TB
- CLR F_SET
- ACALL WAIT_LOAD
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;INSERT_SEC_KEY
- ;-------------------------------------------------------------------------------------------------------------------;
- INSERT_SEC_KEY:
- ;R1 APONTA PARA SEC KEY EM I:
- ;R6 PASSAGEM DE PARAMETRO
- USING 0
- PUSH AR1
- INC @R1
- MOV A, R1
- ADD A, @R1
- MOV R1, A
- MOV @R1, 6
- POP AR1
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;INSERT_USER_KEY
- ;-------------------------------------------------------------------------------------------------------------------;
- INSERT_USER_KEY:
- ;R0 APONTA PARA USER KEY EM D:
- ;R7 PASSAGEM DE PARAMETROS
- USING 0
- PUSH AR0
- INC @R0
- MOV A, R0
- ADD A, @R0
- MOV R0, A
- MOV @R0, 7
- POP AR0
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;UPDATE_LEDS
- ;-------------------------------------------------------------------------------------------------------------------;
- UPDATE_LEDS:
- MOV A, LED_BAR
- RL A
- ORL A,#1
- MOV LED_BAR, A
- MOV OUTPORT, A
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;ENCRYPTION: WORKS WITH BOTH R6 AND R7
- ;-------------------------------------------------------------------------------------------------------------------;
- ENCRYPTION:
- MOV DPTR, #FS_BOX
- MOV A, INDEX_CODE
- MOVC A, @A+DPTR
- MOV R6, A
- MOV R7, A
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;RESET_INDEX: CLEAR INDEX AND INDEX_CODE
- ;-------------------------------------------------------------------------------------------------------------------;
- RESET_INDEX:
- MOV INDEX, #00H
- MOV INDEX_CODE, #CHAR_0
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;COMPARE_KEY
- ;-------------------------------------------------------------------------------------------------------------------;
- COMP_KEY:
- ;R1 APONTA PARA SEC KEY EM I:
- ;R0 APONTA PARA USER KEY EM C:
- ;R4 E O INDICE
- MOV R4, #KEY_LEN
- MOV R0, #USER_KEY
- MOV R1, #SEC_KEY
- MOV COUNT, #00H
- CLR WRONG
- INC R0
- INC R1
- CLOOP:
- CLR C
- MOV A, R4
- JZ NEXTSTATE
- MOV A, @R0
- SUBB A, @R1
- JZ COUNTING
- SETB WRONG
- JMP DEC_POINTERS
- COUNTING:
- INC COUNT
- DEC_POINTERS:
- INC R0
- INC R1
- DEC R4
- JMP CLOOP
- NEXTSTATE:
- JB WRONG, STATE_FAIL
- CLR C
- MOV A, COUNT
- SUBB A, #KEY_LEN
- JNZ STATE_FAIL
- STATE_OPEN:
- MOV STATE, #S_OPEN
- RET
- STATE_FAIL:
- MOV STATE, #S_FAIL
- RET
- ;-------------------------------------------------------------------------------------------------------------------;
- ;UPDATE_DISPLAY
- ;-------------------------------------------------------------------------------------------------------------------;
- UPDATE_DISP:
- MOV DPTR, #NUM_DISP
- MOV A, INDEX
- MOVC A, @A+DPTR
- MOV INDEX_CODE, A
- MOV P2, A
- RET
- NUM_DISP: DB CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9, CHAR_a, CHAR_b, CHAR_c, CHAR_d, CHAR_e, CHAR_f
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement