convert.py

Created by ilyas-r

Created on February 14, 2023

4.41 KB

Convert v1.1.
Python Util for Numworks, all models.
By Ilyas R. & Vincent ROBERT. September 2022.

Learn more about Convert on: nsi.xyz/convert (FR)

Changelog

Convert v1.0 - 16/09/2022:
- Initial util

Convert v1.1 - 19/09/2022:
- The [Ans] key is now used to exit the program cleanly


from kandinsky import draw_string as txt, fill_rect as rec
from ion import keydown as k

# Convert 1.1 NumWorks, 19.09.2022
# Par Ilyas R. & Vincent ROBERT
# https://nsi.xyz/convert <3

grey_c,dark_c,game_c = (196,196,196),(42,42,42),(148,113,222)
pos,val,mode = 0,42,1
characters, eggs = {"C":32355021942288319580, "o":16773148219294089216, "n":20231912733114630144, "v":4991731697172086784,
              "e":34625346773446557696, "r":1190113516208521216, "t":34624836154483246113, "0":16773148341215741486,
              "1":9520900167075899784, "2":34624836168961245711, "3":17888878827397464591, "4":9520900958181164065,
              "5":17888878826877912126, "6":16773148338514068542, "7":19041800347036697103,
              "8":16773148337994516014, "9":16735957322825254446, "A":20231912870068667716, "B":8414467146932340007,
              "D":8414467432816100647, "E":34624836160925500478, "F":1190112527326938174, "+":4568909873152,
              "-":33285996544, "":0}, {42:"The answer to life,"}
values = ["0","0","1","0","1","0","1","0","","","2","A","","+","0","4","2"]


def draw_letter(x, y, dico_key, c, loop=0):
    rec(x * 2 + 18 * loop, y, 14, 38, "white")
    for j in range(65):
        if characters[dico_key] >> j & 1 == 1:
            rec(x * 2 + 18 * loop + (j % 5) * 3, y + (j // 5) * 3, 2, 2, c)


def gui():
    for i, l in enumerate("Convert"):
        draw_letter(42, 5, l, game_c, i)
    txt("8 bits", 220, 30, dark_c)
    rec(139, 200, 174, 22, game_c)
    txt("Calculate by", 12, 202, grey_c)
    txt("nsi.xyz/convert", 152, 202, "white", game_c)
    txt("  BIN         HEX     DEC", 50, 155, dark_c)
    cursor()
    refresh(values, values, 1)


def refresh(old_values, new_values, init=0):
    global values, mode
    if init:
        txt("  Integer  ", 8, 55, "white", game_c)
        txt(" Two's complement ", 130, 55, "white", grey_c)
        for i in range(len(values)):
            draw_letter(5, 98, values[i], game_c, i)
    else:
        for i in range(len(values)):
            if old_values[i] != new_values[i]:
                draw_letter(5 + 9 * i, 98, new_values[i], game_c)
        values = new_values
    rec(0, 178, 320, 19, "white")
    if val in eggs:
        txt(eggs[val], 160 - len(eggs[val]) * 5, 178, grey_c)


def switch():
    global mode, val
    txt("  Integer  ", 8, 55, "white", grey_c if mode == 1 else game_c)
    txt(" Two's complement ", 130, 55, "white", game_c if mode == 1 else grey_c)
    mode = -1 if mode == 1 else 1
    val = (val*(-1 if val < 0 else -1 if mode != 1 else 1)) if val <= 128 else -128
    refresh(values, calcul(val))


def arrow(x, y, d):
    for i in range(6):
        if d == 0:
            rec((x - 2) + 6 - i, y + i, 2 + 2 * i, 1, game_c)
        if d == 1:
            rec((x - 1) + i, y + i, 12 - 2 * i, 1, game_c)


def d_p(p_x):
    return 18 * p_x + (12 if p_x < 8 else 48 if p_x < 10 else 66)


def cursor():
    global pos
    pos = 13 if pos == -1 else 0 if pos == 14 else pos
    rec(11, 85, 300, 6, "white")
    rec(11, 145, 300, 6, "white")
    arrow(d_p(pos), 85, 0)
    arrow(d_p(pos), 145, 1)


def update(p, signe):
    global val
    if p == 10 and val != 0:
        switch()
        return
    temp_val = val + signe * (2 ** abs(p - 7)) * (p < 8) + signe * (2 ** (4 * (p == 8)))*(8 <= p < 10) + signe * (int(
               "1" + "0" * (13 - p)))*(11 <= p < 14)
    if (val >= 0 and temp_val < 0) or (val < 0 and temp_val >= 0):
        switch()
    val = temp_val if -128 <= temp_val <= 255 else val
    refresh(values, calcul(val))


def calcul(v):
    return list("0" * (10 - len(bin(v + 256 * (v < 0)))) + bin(v + 256 * (v < 0))[2:]) + ["", ""] + list("0" * (4 - len(
            hex(v + 256 * (v < 0)))) + hex(v + 256 * (v < 0))[2:].upper()) + ["", "-" if val < 0 else "+"] + list(
            "0" * (3 - len(str(v)[1*(mode != 1):])) + str(v)[1*(mode != 1):])


def convert():
    global pos
    gui()
    last_key = None
    while not k(51):
        if k(0) and last_key != 0:
            pos -= 1
            cursor()
            last_key = 0
        if k(3) and last_key != 3:
            pos += 1
            cursor()
            last_key = 3
        if (k(1) and last_key != 1) or (k(2) and last_key != 2):
            update(pos, 1*(k(1)+-1*(k(2))))
            last_key = 1 if k(1) else 2
        if k(4) and last_key != 4 and val != 0:
            switch()
            last_key = 4
        if not (k(0) or k(3) or k(1) or k(2) or k(4)):
            last_key = None


convert()