2018-01-09 22:28:39 +00:00
|
|
|
"""
|
|
|
|
Programming Language for 6502/6510 microprocessors, codename 'Sick'
|
|
|
|
Here are the data type definitions and -conversions.
|
|
|
|
|
|
|
|
Written by Irmen de Jong (irmen@razorvine.net) - license: GNU GPL 3.0
|
|
|
|
"""
|
|
|
|
|
|
|
|
import enum
|
|
|
|
from functools import total_ordering
|
|
|
|
|
|
|
|
|
|
|
|
@total_ordering
|
|
|
|
class VarType(enum.Enum):
|
|
|
|
CONST = 1
|
|
|
|
MEMORY = 2
|
|
|
|
VAR = 3
|
|
|
|
|
|
|
|
def __lt__(self, other):
|
|
|
|
if self.__class__ == other.__class__:
|
|
|
|
return self.value < other.value
|
|
|
|
return NotImplemented
|
|
|
|
|
|
|
|
|
|
|
|
@total_ordering
|
|
|
|
class DataType(enum.Enum):
|
|
|
|
"""The possible data types of values"""
|
|
|
|
BYTE = 1
|
|
|
|
WORD = 2
|
|
|
|
FLOAT = 3
|
|
|
|
BYTEARRAY = 4
|
|
|
|
WORDARRAY = 5
|
|
|
|
MATRIX = 6
|
|
|
|
STRING = 7
|
|
|
|
STRING_P = 8
|
|
|
|
STRING_S = 9
|
|
|
|
STRING_PS = 10
|
|
|
|
|
|
|
|
def __lt__(self, other):
|
|
|
|
if self.__class__ == other.__class__:
|
|
|
|
return self.value < other.value
|
|
|
|
return NotImplemented
|
|
|
|
|
2018-01-13 22:49:57 +00:00
|
|
|
def isnumeric(self) -> bool:
|
|
|
|
return self.value in (1, 2, 3)
|
|
|
|
|
2018-01-23 23:41:50 +00:00
|
|
|
def isinteger(self) -> bool:
|
|
|
|
return self.value in (1, 2)
|
|
|
|
|
2018-01-13 22:49:57 +00:00
|
|
|
def isarray(self) -> bool:
|
|
|
|
return self.value in (4, 5, 6)
|
|
|
|
|
|
|
|
def isstring(self) -> bool:
|
|
|
|
return self.value in (7, 8, 9, 10)
|
|
|
|
|
2018-01-09 22:28:39 +00:00
|
|
|
|
|
|
|
STRING_DATATYPES = {DataType.STRING, DataType.STRING_P, DataType.STRING_S, DataType.STRING_PS}
|
|
|
|
|
2018-01-13 22:49:57 +00:00
|
|
|
|
2018-01-10 23:29:46 +00:00
|
|
|
REGISTER_SYMBOLS = {"A", "X", "Y", "AX", "AY", "XY", "SC", "SI"}
|
|
|
|
REGISTER_SYMBOLS_RETURNVALUES = REGISTER_SYMBOLS | {"SZ"}
|
|
|
|
REGISTER_BYTES = {"A", "X", "Y"}
|
|
|
|
REGISTER_SBITS = {"SC", "SI", "SZ"}
|
|
|
|
REGISTER_WORDS = {"AX", "AY", "XY"}
|
|
|
|
|
2018-01-09 22:28:39 +00:00
|
|
|
# 5-byte cbm MFLPT format limitations:
|
|
|
|
FLOAT_MAX_POSITIVE = 1.7014118345e+38
|
|
|
|
FLOAT_MAX_NEGATIVE = -1.7014118345e+38
|
|
|
|
|
|
|
|
|
|
|
|
def char_to_bytevalue(character: str, petscii: bool=True) -> int:
|
|
|
|
assert len(character) == 1
|
|
|
|
if petscii:
|
|
|
|
return ord(character.translate(ascii_to_petscii_trans))
|
|
|
|
else:
|
|
|
|
raise NotImplementedError("screencode conversion not yet implemented for chars")
|
|
|
|
|
|
|
|
|
|
|
|
# ASCII/UNICODE-to-PETSCII translation table
|
|
|
|
# Unicode symbols supported that map to a PETSCII character: £ ↑ ← ♠ ♥ ♦ ♣ π ● ○ and various others
|
2018-02-25 15:43:00 +00:00
|
|
|
|
2018-06-08 18:00:36 +00:00
|
|
|
# @todo cbmcodecs pypi package?
|
2018-01-09 22:28:39 +00:00
|
|
|
ascii_to_petscii_trans = str.maketrans({
|
|
|
|
'\f': 147, # form feed becomes ClearScreen "{clear}"
|
|
|
|
'\n': 13, # line feed becomes a RETURN "{cr}" (not a line feed)
|
|
|
|
'\r': 17, # CR becomes CursorDown "{down}"
|
|
|
|
'a': 65,
|
|
|
|
'b': 66,
|
|
|
|
'c': 67,
|
|
|
|
'd': 68,
|
|
|
|
'e': 69,
|
|
|
|
'f': 70,
|
|
|
|
'g': 71,
|
|
|
|
'h': 72,
|
|
|
|
'i': 73,
|
|
|
|
'j': 74,
|
|
|
|
'k': 75,
|
|
|
|
'l': 76,
|
|
|
|
'm': 77,
|
|
|
|
'n': 78,
|
|
|
|
'o': 79,
|
|
|
|
'p': 80,
|
|
|
|
'q': 81,
|
|
|
|
'r': 82,
|
|
|
|
's': 83,
|
|
|
|
't': 84,
|
|
|
|
'u': 85,
|
|
|
|
'v': 86,
|
|
|
|
'w': 87,
|
|
|
|
'x': 88,
|
|
|
|
'y': 89,
|
|
|
|
'z': 90,
|
|
|
|
'A': 97,
|
|
|
|
'B': 98,
|
|
|
|
'C': 99,
|
|
|
|
'D': 100,
|
|
|
|
'E': 101,
|
|
|
|
'F': 102,
|
|
|
|
'G': 103,
|
|
|
|
'H': 104,
|
|
|
|
'I': 105,
|
|
|
|
'J': 106,
|
|
|
|
'K': 107,
|
|
|
|
'L': 108,
|
|
|
|
'M': 109,
|
|
|
|
'N': 110,
|
|
|
|
'O': 111,
|
|
|
|
'P': 112,
|
|
|
|
'Q': 113,
|
|
|
|
'R': 114,
|
|
|
|
'S': 115,
|
|
|
|
'T': 116,
|
|
|
|
'U': 117,
|
|
|
|
'V': 118,
|
|
|
|
'W': 119,
|
|
|
|
'X': 120,
|
|
|
|
'Y': 121,
|
|
|
|
'Z': 122,
|
|
|
|
'{': 179, # left squiggle
|
|
|
|
'}': 235, # right squiggle
|
|
|
|
'£': 92, # pound currency sign
|
|
|
|
'^': 94, # up arrow
|
|
|
|
'~': 126, # pi math symbol
|
|
|
|
'π': 126, # pi symbol
|
|
|
|
'`': 39, # single quote
|
|
|
|
'✓': 250, # check mark
|
|
|
|
|
|
|
|
'|': 221, # vertical bar
|
|
|
|
'│': 221, # vertical bar
|
|
|
|
'─': 96, # horizontal bar
|
|
|
|
'┼': 123, # vertical and horizontal bar
|
|
|
|
|
|
|
|
'↑': 94, # up arrow
|
|
|
|
'←': 95, # left arrow
|
|
|
|
|
|
|
|
'▔': 163, # upper bar
|
|
|
|
'_': 164, # lower bar (underscore)
|
|
|
|
'▁': 164, # lower bar
|
|
|
|
'▎': 165, # left bar
|
|
|
|
|
|
|
|
'♠': 97, # spades
|
|
|
|
'●': 113, # circle
|
|
|
|
'♥': 115, # hearts
|
|
|
|
'○': 119, # open circle
|
|
|
|
'♣': 120, # clubs
|
|
|
|
'♦': 122, # diamonds
|
|
|
|
|
|
|
|
'├': 171, # vertical and right
|
|
|
|
'┤': 179, # vertical and left
|
|
|
|
'┴': 177, # horiz and up
|
|
|
|
'┬': 178, # horiz and down
|
|
|
|
'└': 173, # up right
|
|
|
|
'┐': 174, # down left
|
|
|
|
'┌': 175, # down right
|
|
|
|
'┘': 189, # up left
|
|
|
|
'▗': 172, # block lr
|
|
|
|
'▖': 187, # block ll
|
|
|
|
'▝': 188, # block ur
|
|
|
|
'▘': 190, # block ul
|
|
|
|
'▚': 191, # block ul and lr
|
|
|
|
'▌': 161, # left half
|
|
|
|
'▄': 162, # lower half
|
|
|
|
'▒': 230, # raster
|
|
|
|
})
|