# Ansii-Sequenzen RESET = chr(27)+"[m" REVERSE = chr(27)+"[7m" BLACK = chr(27)+"[30m" RED = chr(27)+"[31m" GREEN = chr(27)+"[32m" BROWN = chr(27)+"[33m" BLUE = chr(27)+"[34m" MAGENTA = chr(27)+"[35m" CYAN = chr(27)+"[36m" WHITE = chr(27)+"[37m" # Fehler ERRCODE = 255 ERRCHR = REVERSE + "?" + RESET # CHR: ASC1,ASC2,SCR1,SCR2 tab_chr2 = { # Ziffern u.a. (identische Codes) ' ': [ 32, 32, 32, 32], '!': [ 33, 33, 33, 33], '"': [ 34, 34, 34, 34], '#': [ 35, 35, 35, 35], '$': [ 36, 36, 36, 36], '%': [ 37, 37, 37, 37], '&': [ 38, 38, 38, 38], '\'':[ 39, 39, 39, 39], '(': [ 40, 40, 40, 40], ')': [ 41, 41, 41, 41], '*': [ 42, 42, 42, 42], '+': [ 43, 43, 43, 43], ',': [ 44, 44, 44, 44], '-': [ 45, 45, 45, 45], '.': [ 46, 46, 46, 46], '/': [ 47, 47, 47, 47], '0': [ 48, 48, 48, 48], '1': [ 49, 49, 49, 49], '2': [ 50, 50, 50, 50], '3': [ 51, 51, 51, 51], '4': [ 52, 52, 52, 52], '5': [ 53, 53, 53, 53], '6': [ 54, 54, 54, 54], '7': [ 55, 55, 55, 55], '8': [ 56, 56, 56, 56], '9': [ 57, 57, 57, 57], ':': [ 58, 58, 58, 58], ';': [ 59, 59, 59, 59], '<': [ 60, 60, 60, 60], '=': [ 61, 61, 61, 61], '>': [ 62, 62, 62, 62], '?': [ 63, 63, 63, 63], # AT-Zeichen '@': [ 64, 64, 0, 0], # Grossbuchstaben 'A': [ 65, 97, 1, 65], 'B': [ 66, 98, 2, 66], 'C': [ 67, 99, 3, 67], 'D': [ 68, 100, 4, 68], 'E': [ 69, 101, 5, 69], 'F': [ 70, 102, 6, 70], 'G': [ 71, 103, 7, 71], 'H': [ 72, 104, 8, 72], 'I': [ 73, 105, 9, 73], 'J': [ 74, 106, 10, 74], 'K': [ 75, 107, 11, 75], 'L': [ 76, 108, 12, 76], 'M': [ 77, 109, 13, 77], 'N': [ 78, 110, 14, 78], 'O': [ 79, 111, 15, 79], 'P': [ 80, 112, 16, 80], 'Q': [ 81, 113, 17, 81], 'R': [ 82, 114, 18, 82], 'S': [ 83, 115, 19, 83], 'T': [ 84, 116, 20, 84], 'U': [ 85, 117, 21, 85], 'V': [ 86, 118, 22, 86], 'W': [ 87, 119, 23, 87], 'X': [ 88, 120, 24, 88], 'Y': [ 89, 121, 25, 89], 'Z': [ 90, 122, 26, 90], # weitere Zeichen (Pfund und Pfeil nach links fehlen) '[': [ 91, 91, 27, 27], ']': [ 93, 93, 29, 29], '^': [ 94, 94, 30, 30], # Kleinbuchstaben (gibt es nur in Font 2) 'a': [ None, 65, None, 1], 'b': [ None, 66, None, 2], 'c': [ None, 67, None, 3], 'd': [ None, 68, None, 4], 'e': [ None, 69, None, 5], 'f': [ None, 70, None, 6], 'g': [ None, 71, None, 7], 'h': [ None, 72, None, 8], 'i': [ None, 73, None, 9], 'j': [ None, 74, None, 10], 'k': [ None, 75, None, 11], 'l': [ None, 76, None, 12], 'm': [ None, 77, None, 13], 'n': [ None, 78, None, 14], 'o': [ None, 79, None, 15], 'p': [ None, 80, None, 16], 'q': [ None, 81, None, 17], 'r': [ None, 82, None, 18], 's': [ None, 83, None, 19], 't': [ None, 84, None, 20], 'u': [ None, 85, None, 21], 'v': [ None, 86, None, 22], 'w': [ None, 87, None, 23], 'x': [ None, 88, None, 24], 'y': [ None, 89, None, 25], 'z': [ None, 90, None, 26], } # SCR: CHR1,CHR2 tab_scr2 = { # AT-Zeichen 0: [ '@', '@' ], # Grossbuchstaben bei Font 1 # Kleinbuchstaben bei Font 2 1: [ 'A', 'a' ], 2: [ 'B', 'b' ], 3: [ 'C', 'c' ], 4: [ 'D', 'd' ], 5: [ 'E', 'e' ], 6: [ 'F', 'f' ], 7: [ 'G', 'g' ], 8: [ 'H', 'h' ], 9: [ 'I', 'i' ], 10: [ 'J', 'j' ], 11: [ 'K', 'k' ], 12: [ 'L', 'l' ], 13: [ 'M', 'm' ], 14: [ 'N', 'n' ], 15: [ 'O', 'o' ], 16: [ 'P', 'p' ], 17: [ 'Q', 'q' ], 18: [ 'R', 'r' ], 19: [ 'S', 's' ], 20: [ 'T', 't' ], 21: [ 'U', 'u' ], 22: [ 'V', 'v' ], 23: [ 'W', 'w' ], 24: [ 'X', 'x' ], 25: [ 'Y', 'y' ], 26: [ 'Z', 'z' ], # weitere Zeichen (Pfund und Pfeil nach links fehlen) 27: [ '[', '[' ], 28: [ None, None ], 29: [ ']', ']' ], 30: [ '^', '^' ], 31: [ None, None ], # Ziffern u.a. (identische Codes) 32: [ ' ', ' ' ], 33: [ '!', '!' ], 34: [ '"', '"' ], 35: [ '#', '#' ], 36: [ '$', '$' ], 37: [ '%', '%' ], 38: [ '&', '&' ], 39: [ '\'', '\'' ], 40: [ '(', '(' ], 41: [ ')', ')' ], 42: [ '*', '*' ], 43: [ '+', '+' ], 44: [ ',', ',' ], 45: [ '-', '-' ], 46: [ '.', '.' ], 47: [ '/', '/' ], 48: [ '0', '0' ], 49: [ '1', '1' ], 50: [ '2', '2' ], 51: [ '3', '3' ], 52: [ '4', '4' ], 53: [ '5', '5' ], 54: [ '6', '6' ], 55: [ '7', '7' ], 56: [ '8', '8' ], 57: [ '9', '9' ], 58: [ ':', ':' ], 59: [ ';', ';' ], 60: [ '<', '<' ], 61: [ '=', '=' ], 62: [ '>', '>' ], 63: [ '?', '?' ], # horizontale Linie fehlt 64: [ None, None ], # Grafikzeichen bei Font 1 fehlen # Grossbuchstaben bei Font 2 65: [ None, 'A' ], 66: [ None, 'B' ], 67: [ None, 'C' ], 68: [ None, 'D' ], 69: [ None, 'E' ], 70: [ None, 'F' ], 71: [ None, 'G' ], 72: [ None, 'H' ], 73: [ None, 'I' ], 74: [ None, 'J' ], 75: [ None, 'K' ], 76: [ None, 'L' ], 77: [ None, 'M' ], 78: [ None, 'N' ], 79: [ None, 'O' ], 80: [ None, 'P' ], 81: [ None, 'Q' ], 82: [ None, 'R' ], 83: [ None, 'S' ], 84: [ None, 'T' ], 85: [ None, 'U' ], 86: [ None, 'V' ], 87: [ None, 'W' ], 88: [ None, 'X' ], 89: [ None, 'Y' ], 90: [ None, 'Z' ], } # ASC: CHR1,CHR2 tab_asc2 = { # Steuercodes 5: [ WHITE, WHITE ], 18: [ REVERSE, REVERSE ], 28: [ RED, RED ], 30: [ GREEN, GREEN ], 31: [ BLUE, BLUE ], # Ziffern u.a. (identische Codes) 32: [ ' ', ' ' ], 33: [ '!', '!' ], 34: [ '"', '"' ], 35: [ '#', '#' ], 36: [ '$', '$' ], 37: [ '%', '%' ], 38: [ '&', '&' ], 39: [ '\'', '\'' ], 40: [ '(', '(' ], 41: [ ')', ')' ], 42: [ '*', '*' ], 43: [ '+', '+' ], 44: [ ',', ',' ], 45: [ '-', '-' ], 46: [ '.', '.' ], 47: [ '/', '/' ], 48: [ '0', '0' ], 49: [ '1', '1' ], 50: [ '2', '2' ], 51: [ '3', '3' ], 52: [ '4', '4' ], 53: [ '5', '5' ], 54: [ '6', '6' ], 55: [ '7', '7' ], 56: [ '8', '8' ], 57: [ '9', '9' ], 58: [ ':', ':' ], 59: [ ';', ';' ], 60: [ '<', '<' ], 61: [ '=', '=' ], 62: [ '>', '>' ], 63: [ '?', '?' ], # AT-Zeichen 64: [ '@', '@' ], # Grossbuchstaben bei Font 1 # Kleinbuchstaben bei Font 2 65: [ 'A', 'a' ], 66: [ 'B', 'b' ], 67: [ 'C', 'c' ], 68: [ 'D', 'd' ], 69: [ 'E', 'e' ], 70: [ 'F', 'f' ], 71: [ 'G', 'g' ], 72: [ 'H', 'h' ], 73: [ 'I', 'i' ], 74: [ 'J', 'j' ], 75: [ 'K', 'k' ], 76: [ 'L', 'l' ], 77: [ 'M', 'm' ], 78: [ 'N', 'n' ], 79: [ 'O', 'o' ], 80: [ 'P', 'p' ], 81: [ 'Q', 'q' ], 82: [ 'R', 'r' ], 83: [ 'S', 's' ], 84: [ 'T', 't' ], 85: [ 'U', 'u' ], 86: [ 'V', 'v' ], 87: [ 'W', 'w' ], 88: [ 'X', 'x' ], 89: [ 'Y', 'y' ], 90: [ 'Z', 'z' ], # weitere Zeichen (Pfund und Pfeil nach links fehlen) 91: [ '[', '[' ], 92: [ None, None ], 93: [ ']', ']' ], 94: [ '^', '^' ], 95: [ None, None ], # horizontale Linie fehlt 96: [ None, None ], # Grafikzeichen bei Font 1 fehlen # Grossbuchstaben bei Font 2 97: [ None, 'A' ], 98: [ None, 'B' ], 99: [ None, 'C' ], 100: [ None, 'D' ], 101: [ None, 'E' ], 102: [ None, 'F' ], 103: [ None, 'G' ], 104: [ None, 'H' ], 105: [ None, 'I' ], 106: [ None, 'J' ], 107: [ None, 'K' ], 108: [ None, 'L' ], 109: [ None, 'M' ], 110: [ None, 'N' ], 111: [ None, 'O' ], 112: [ None, 'P' ], 113: [ None, 'Q' ], 114: [ None, 'R' ], 115: [ None, 'S' ], 116: [ None, 'T' ], 117: [ None, 'U' ], 118: [ None, 'V' ], 119: [ None, 'W' ], 120: [ None, 'X' ], 121: [ None, 'Y' ], 122: [ None, 'Z' ], # Steuercodes 144: [ BLACK, BLACK ], 146: [ RESET, RESET ], # REVERSE OFF 149: [ BROWN, BROWN ], 156: [ MAGENTA, MAGENTA ], # PURPUR 159: [ CYAN, CYAN ], } def chr2asc(ch, font): """ Gibt fuer das angegebene Zeichen den C64-ASCII Wert zurueck. Tritt ein Fehler auf, wird der Wert 255 zurueck geliefert. """ global tab_chr2, ERRCODE if font == 1: idx = 0 elif font == 2: idx = 1 else: raise ValueError("wrong font parameter") try: code = tab_chr2[ch][idx] except KeyError: code = ERRCODE if code is None: code = ERRCODE return code def chr2scr(ch, font): """ Gibt fuer das angegebene Zeichen den C64-Bildschirmcode zurueck. Tritt ein Fehler auf, wird der Wert 255 zurueck geliefert. """ global tab_chr2, ERRCODE if font == 1: idx = 2 elif font == 2: idx = 3 else: raise ValueError("wrong font parameter") try: code = tab_chr2[ch][idx] except KeyError: code = ERRCODE if code is None: code = ERRCODE return code def scr2chr(code, font): """ Gibt fuer den angegebenen Bildschirmcode das Zeichen zurueck. Tritt ein Fehler auf, wird ein inverses Fragezeichen zurueck geliefert. """ global tab_scr2, REVERSE, RESET, ERRCHR # Invertiertes Zeichen inv = (code >= 128) if inv: code = code & 127 if font == 1: idx = 0 elif font == 2: idx = 1 else: raise ValueError("wrong font parameter") try: ch = tab_scr2[code][idx] except KeyError: ch = ERRCHR if ch is None: ch = ERRCHR if inv: return REVERSE + ch + RESET else: return ch def asc2chr(code, font): """ Gibt fuer den angegebenen C64-ASCII Wert das Zeichen zurueck. Tritt ein Fehler auf, wird ein inverses Fragezeichen zurueck geliefert. """ global tab_asc2, ERRCHR if font == 1: idx = 0 elif font == 2: idx = 1 else: raise ValueError("wrong font parameter") try: ch = tab_asc2[code][idx] except KeyError: ch = ERRCHR if ch is None: ch = ERRCHR return ch