from argparse import ArgumentParser, RawDescriptionHelpFormatter
import codetable
def hexfmt4(val):
""" 4bit-Zahl mit hex(val) umwandeln und das Ergebnis wie
folgt anpassen:
'0x5' -> '5'
"""
if val > 15:
raise SystemExit("hexfmt4 overflow: %d" % val)
s = hex(val)
s = s[2:]
return s
def hexfmt8(val):
""" 8bit-Zahl hexadezimal ausgeben """
return "%s%s" % (hexfmt4(val >> 4), hexfmt4(val & 0xf))
class Table:
""" Basis-Klasse """
def __init__(self, rows, cols, start, title):
self.rows = rows
self.cols = cols
self.start = start
self.title = title
# Fehler-Zeichen aendern
codetable.ERRCHR = ' '
def _empty(self,val):
return "%3d: " % val
def _cell(self, val):
return self._empty()
def __str__(self):
lines = []
lines.append(self.title)
lines.append("")
y = 0
while y < self.rows:
x = 0
line = []
while x < self.cols:
v = self.start + x * self.rows + y
line.append(self._cell(v))
x += 1
lines.append(" ".join(line))
y += 1
return "\n".join(lines)
class ASCIIDec(Table):
"""ASCII-Codes (dezimal)"""
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "ASCII-Codes (dezimal)")
def _cell(self, val):
if (val >= 32) and (val <= 126):
return "%3d: %c" % (val, chr(val))
else:
return self._empty(val)
class ASCIIHex(Table):
"""ASCII-Codes (hexadezimal)"""
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "ASCII-Codes (hexadezimal)")
def _empty(self,val):
return "$%s: " % hexfmt8(val)
def _cell(self, val):
if (val >= 32) and (val <= 126):
return "$%s: %c" % (hexfmt8(val), chr(val))
else:
return self._empty(val)
class ASCIIC64(Table):
""" ASCII-Codes C64 (Basis-Klasse) """
def __init__(self, rows, cols, start, title):
super().__init__(rows, cols, start, title)
# Liste der unterstuetzten Steuercodes
self.spec_codes = [
5, # weiss
18, # invers an
28, # rot
30, # gruen
31, # blau
144, # schwarz
146, # invers aus (reset)
149, # braun
156, # magenta
159, # cyan
]
def _get(self, val, font):
""" Liefert einen String mit dem Zeichen; bei Steuercodes
wird ein Stern als Zeichen verwendet und der String
mit einem Reset-Code abgeschlossen.
"""
ch = codetable.asc2chr(val, font)
if val in self.spec_codes:
ch = ch + '*'
return ch + codetable.RESET
class ASCIIC64Font1(ASCIIC64):
""" ASCII-Codes C64 (Zeichensatz 1) """
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "ASCII-Codes C64 (Zeichensatz 1)")
def _cell(self, val):
return "%3d: %s" % (val, self._get(val, 1))
class ASCIIC64Font2(ASCIIC64):
""" ASCII-Codes C64 (Zeichensatz 2) """
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "ASCII-Codes C64 (Zeichensatz 2)")
def _cell(self, val):
return "%3d: %s" % (val, self._get(val, 2))
class SCREENC64Font1(Table):
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "Screen-Codes C64 (Zeichensatz 1)")
def _cell(self, val):
return "%3d: %c" % (val, codetable.scr2chr(val, 1))
class SCREENC64Font2(Table):
def __init__(self, rows, cols, start):
super().__init__(
rows, cols, start, "Screen-Codes C64 (Zeichensatz 2)")
def _cell(self, val):
return "%3d: %c" % (val, codetable.scr2chr(val, 2))
desc = """Zeichensatz-Tabellen darstellen:
ascdec: ASCII-Codes (dezimal)
aschex: ASCII-Codes (hexadezimal)
c64ascfont1: ASCII-Codes C64 (Zeichensatz 1)
c64ascfont2: ASCII-Codes C64 (Zeichensatz 2)
c64scrfont1: Screen-Codes C64 (Zeichensatz 1)
c64scrfont2: Screen-Codes C64 (Zeichensatz 2)
"""
if __name__ == '__main__':
parser = ArgumentParser(prog='codes.py',
formatter_class=RawDescriptionHelpFormatter,
description = desc)
parser.add_argument('table', choices = [
'ascdec', 'aschex', 'c64ascfont1', 'c64ascfont2',
'c64scrfont1', 'c64scrfont2'
], help="darzustellende Tabelle")
args = parser.parse_args()
if args.table == "ascdec":
tab = ASCIIDec(16, 6, 32) # ASCII 32-127
elif args.table == "aschex":
tab = ASCIIHex(16, 6, 32) # ASCII 32-127
elif args.table == "c64ascfont1":
tab = ASCIIC64Font1(16, 10, 0) # ASC 0-159
elif args.table == "c64ascfont2":
tab = ASCIIC64Font2(16, 10, 0) # ASC 0-159
elif args.table == "c64scrfont1":
tab = SCREENC64Font1(16, 6, 0) # SCR 0-95
elif args.table == "c64scrfont2":
tab = SCREENC64Font2(16, 6, 0) # SCR 0-95
print(tab)