From 7ca56c1a730fcecd0fe3af5e6b652fa09514a18b Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Fri, 26 Apr 2024 15:40:14 +0300 Subject: Refactor project structure, add README and LICENSE --- atk16_utils/charmem/charmem.bin | Bin 0 -> 2048 bytes atk16_utils/charmem/charmem.py | 63 ++++++++++++++++++++++++++++++++++++ atk16_utils/charmem/charset.txt | Bin 0 -> 23058 bytes atk16_utils/charmem/ibm_cga_8x8.ttf | Bin 0 -> 35952 bytes 4 files changed, 63 insertions(+) create mode 100644 atk16_utils/charmem/charmem.bin create mode 100644 atk16_utils/charmem/charmem.py create mode 100644 atk16_utils/charmem/charset.txt create mode 100644 atk16_utils/charmem/ibm_cga_8x8.ttf (limited to 'atk16_utils/charmem') diff --git a/atk16_utils/charmem/charmem.bin b/atk16_utils/charmem/charmem.bin new file mode 100644 index 0000000..1276d28 Binary files /dev/null and b/atk16_utils/charmem/charmem.bin differ diff --git a/atk16_utils/charmem/charmem.py b/atk16_utils/charmem/charmem.py new file mode 100644 index 0000000..aaac122 --- /dev/null +++ b/atk16_utils/charmem/charmem.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# Generate .bin file with ATK16 CPU TPU charmem data + +# Addressed by _CCC CCCC CYYY +# Data width 8bit: ___X XXXX +# where _ = unused, C = 8bit character code, Y = character y coordinate, X = pixel value + +import sys + +if len(sys.argv) != 2: + print("usage: charmem.py ") + sys.exit(1) + +outfile_path = sys.argv[1] + +with open("charset.txt", "r") as f: + lines = [s.strip("\n") for s in f.readlines()] + +header_chars = lines[0] + +charset: list[list[str]] = [] + +CHAR_HEIGHT = 8 +CHAR_WIDTH = 8 + +i = 0 +while i < len(lines): + i += 1 # skip comment line + char = lines[i:i+CHAR_HEIGHT] + for row in char: + if len(row) != CHAR_WIDTH: + raise Exception(f"char row number {i} has width != {CHAR_WIDTH}: {len(row)}\n" + row + "\n" + "\n".join(char)) + charset.append(char) + i += CHAR_HEIGHT + 1 + +CHAR_N = len(charset) + +TOTAL_BYTEARRAY_SIZE = CHAR_N * CHAR_HEIGHT + +def string_to_byte(input_string: str): + # Replace spaces with '0' and '#' with '1' + binary_string = input_string.replace(' ', '0').replace('█', '1') + + assert(len(input_string) == CHAR_WIDTH) + + # Check if the string contains only '0' or '1' + if not all(c in '01' for c in binary_string): + raise ValueError("Input string must contain only spaces and '█' characters.") + + # Convert the binary string to an unsigned integer byte + return int(binary_string[::-1], 2) + + +res_b = bytearray(TOTAL_BYTEARRAY_SIZE) +for cn, char in enumerate(charset): + for cy in range(0, CHAR_HEIGHT): + addr = (cn << 3) + cy + byte = string_to_byte(char[cy]) + print(f"{byte:>08b}") + res_b[addr] = byte + +with open(outfile_path, "wb") as f: + f.write(res_b) diff --git a/atk16_utils/charmem/charset.txt b/atk16_utils/charmem/charset.txt new file mode 100644 index 0000000..bee1e3d Binary files /dev/null and b/atk16_utils/charmem/charset.txt differ diff --git a/atk16_utils/charmem/ibm_cga_8x8.ttf b/atk16_utils/charmem/ibm_cga_8x8.ttf new file mode 100644 index 0000000..9f29ec5 Binary files /dev/null and b/atk16_utils/charmem/ibm_cga_8x8.ttf differ -- cgit v1.3