Announcement

Collapse
No announcement yet.

BASIC NES Game Genie code decoder

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • BASIC NES Game Genie code decoder

    I find bit operations a "bit" confusing so I made a BASIC program that follows a more intuitive approach

    If you want to try it out on modern computers I would suggest QB64 (www.qb64.net), but this should work in most forms of BASIC.

    Next step will be a BASIC encoder, after that we'll see what it develops into.

    Code:
    c$ = "nallenap" 
     
    a$ = "apzlgity" 
    b$ = "eoxuksvn" 
     
    DIM addr AS INTEGER 
    
    compused = 0 
    
    addr = &H8000 'base address
    
    IF LEN(c$) > 6 THEN len8 = 1 
    
    FOR a = 1 TO LEN(c$) 
    cur$ = MID$(c$, a, 1) 
    v = INSTR(1, a$, cur$) - 1 
    k = -1 
    IF v = -1 THEN k = INSTR(1, b$, cur$) - 1 
    IF k = -1 AND v = -1 THEN EXIT FOR 
    
    IF a = 1 THEN 
    IF v = -1 THEN value = value + k: value = value + &H80 
    IF v >= 0 THEN value = value + v 
    END IF 
     
    IF a = 2 THEN 
    IF v = -1 THEN value = value + &H10 * k: addr = addr + &H80 
    IF v >= 0 THEN value = value + &H10 * v 
    END IF 
     
    IF a = 3 THEN 
    IF v = -1 THEN addr = addr + &H10 * k: l8 = 1 
    IF v >= 0 THEN addr = addr + &H10 * v: l8 = 0 
    END IF 
     
    IF a = 4 THEN 
    IF v = -1 THEN addr = addr + 8: addr = addr + (&H1000 * k) 
    IF v >= 0 THEN addr = addr + (&H1000 * v) 
    END IF 
     
    IF a = 5 THEN 
    IF v = -1 THEN addr = addr + &H800: addr = addr + k 
    IF v >= 0 THEN addr = addr + v 
    END IF 
     
    IF a = 6 THEN 
    IF v = -1 THEN addr = addr + &H100 * k: IF len8 = 0 THEN value = value + 8: ELSE comp = comp + 8 
    IF v >= 0 THEN addr = addr + &H100 * v 
    END IF 
     
    IF a = 7 THEN 
    IF v = -1 THEN comp = comp + k: comp = comp + &H80 
    IF v >= 0 THEN comp = comp + v 
    compused = 1 
    END IF 
     
    IF a = 8 THEN 
    IF v = -1 THEN value = value + 8: comp = comp + (&H10 * k) 
    IF v >= 0 THEN comp = comp + (&H10 * v) 
    END IF 
     
    NEXT 
     
    PRINT c$ 
    IF compused = 1 THEN PRINT HEX$(addr); ":"; HEX$(comp); ":"; HEX$(value) 
    IF compused = 0 THEN PRINT HEX$(addr); ":"; HEX$(value)
    Last edited by Cyperium; 12-04-2015, 05:01:46 PM.
    Check out my YouTube channel PolPon: https://www.youtube.com/channel/UC8C...gJmUA81luZQqZw

  • #2
    The encoding function is now done:

    Code:
    FUNCTION ggenc$ (addr, comp, value, compused) 
    gga$ = "apzlgity" 
    ggb$ = "eoxuksvn" 
    addr2 = addr 'addr2 is a temporary address so not to destroy addr 
    addr2 = addr2 - &H8000 
    IF addr2 < 0 THEN EXIT FUNCTION 
    IF addr2 > &H7FFF THEN EXIT FUNCTION 
     
    IF compused = 0 THEN ggc$ = "aaaaaa" 
    IF compused = 1 THEN ggc$ = "aaaaaaaa" 
    IF addr2 >= &H1000 THEN 
        letter = 1 
        DO 
            addr2 = addr2 - &H1000 
            letter = letter + 1 
        LOOP UNTIL addr2 < &H1000 
        MID$(ggc$, 4, 1) = MID$(gga$, letter, 1) 
    END IF 
     
    IF addr2 >= &H800 THEN 
        komp5 = 1            'inserts later when we know what letter to replace it with 
        addr2 = addr2 - &H800 
    END IF 
     
     
    IF addr2 >= &H100 AND addr2 < &H800 THEN 
        letter = 1 
        DO 
            addr2 = addr2 - &H100 
            letter = letter + 1 
        LOOP UNTIL addr2 < &H100 
        MID$(ggc$, 6, 1) = MID$(gga$, letter, 1) 
    END IF 
     
    IF addr2 >= &H80 THEN 
        komp2 = 1            'inserts later when we know what letter to replace it with 
        addr2 = addr2 - &H80 
    END IF 
     
    IF addr2 >= &H10 AND addr2 < &H80 THEN 
        letter = 1 
        DO 
            addr2 = addr2 - &H10 
            letter = letter + 1 
        LOOP UNTIL addr2 < &H10 
        IF compused = 0 THEN MID$(ggc$, 3, 1) = MID$(gga$, letter, 1) 
        IF compused = 1 THEN MID$(ggc$, 3, 1) = MID$(ggb$, letter, 1) 
    END IF 
     
    IF addr2 >= 8 THEN 
        komp4 = 1 
        addr2 = addr2 - 8 
    END IF 
     
    IF addr2 < 8 AND addr2 > 0 THEN 
        letter = 1 
        DO 
            addr2 = addr2 - 1 
            letter = letter + 1 
        LOOP UNTIL addr2 = 0 
        MID$(ggc$, 5, 1) = MID$(gga$, letter, 1) 
    END IF 
     
     
    'address is done 
     
    value2 = value 
    IF value2 >= &H80 THEN 
        komp1 = 1 
        value2 = value2 - &H80 
    END IF 
     
    IF value2 >= &H10 AND value2 < &H80 THEN 
        letter = 1 
        DO 
            value2 = value2 - &H10 
            letter = letter + 1 
        LOOP UNTIL value2 < &H10 
        MID$(ggc$, 2, 1) = MID$(gga$, letter, 1) 
    END IF 
     
    IF value2 >= 8 AND value2 < &H10 THEN 
        IF compused = 1 THEN komp8 = 1 
        IF compused = 0 THEN komp6 = 1 
        value2 = value2 - 8 
    END IF 
     
     
     
    IF value2 > 0 AND value2 < 8 THEN 
        letter = 1 
        DO 
            value2 = value2 - 1 
            letter = letter + 1 
        LOOP UNTIL value2 = 0 
        MID$(ggc$, 1, 1) = MID$(gga$, letter, 1) 
    END IF 
     
    'value is done 
    IF compused = 1 THEN 
        comp2 = comp 
        IF comp2 >= &H80 THEN 
            komp7 = 1 
            comp2 = comp2 - &H80 
        END IF 
     
        IF comp2 >= &H10 AND comp2 < &H80 THEN 
            letter = 1 
            DO 
                comp2 = comp2 - &H10 
                letter = letter + 1 
            LOOP UNTIL comp2 < &H10 
            MID$(ggc$, 8, 1) = MID$(gga$, letter, 1) 
        END IF 
     
        IF comp2 >= 8 AND comp2 < &H10 THEN 
            komp6 = 1 
            comp2 = comp2 - 8 
        END IF 
     
        IF comp2 > 0 AND comp2 < 8 THEN 
            letter = 1 
            DO 
                comp2 = comp2 - 1 
                letter = letter + 1 
            LOOP UNTIL comp2 = 0 
            MID$(ggc$, 7, 1) = MID$(gga$, letter, 1) 
        END IF 
     
        'compare is done 
    END IF 
     
        'do "komplement" (complementary) letters 
        IF komp1 = 1 THEN MID$(ggc$, 1, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 1, 1)), 1) 
        IF komp2 = 1 THEN MID$(ggc$, 2, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 2, 1)), 1) 
        IF komp4 = 1 THEN MID$(ggc$, 4, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 4, 1)), 1) 
        IF komp5 = 1 THEN MID$(ggc$, 5, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 5, 1)), 1) 
        IF komp6 = 1 THEN MID$(ggc$, 6, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 6, 1)), 1) 
        IF komp7 = 1 THEN MID$(ggc$, 7, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 7, 1)), 1) 
        IF komp8 = 1 THEN MID$(ggc$, 8, 1) = MID$(ggb$, INSTR(1, gga$, MID$(ggc$, 8, 1)), 1) 
     
     
     
    ggenc$ = ggc$ 
     
    END FUNCTION
    Check out my YouTube channel PolPon: https://www.youtube.com/channel/UC8C...gJmUA81luZQqZw

    Comment

    Working...
    X