playscii/formats/in_ata.py

67 lines
2.1 KiB
Python

from art_import import ArtImporter
# import as white on black for ease of edit + export
DEFAULT_FG, DEFAULT_BG = 113, 1
# most ATAs are 40 columns, but some are a couple chars longer and a few are 80!
WIDTH, HEIGHT = 80, 40
class ATAImporter(ArtImporter):
format_name = "ATASCII"
format_description = """
ATARI 8-bit computer version of ASCII.
Imports with ATASCII character set and Atari palette.
"""
allowed_file_extensions = ["ata"]
def run_import(self, in_filename, options={}):
self.set_art_charset("atari")
self.set_art_palette("atari")
self.resize(WIDTH, HEIGHT)
self.art.clear_frame_layer(0, 0, DEFAULT_BG)
# iterate over the bytes
data = open(in_filename, "rb").read()
i = 0
x, y = 0, 0
while i < len(data):
fg, bg = DEFAULT_FG, DEFAULT_BG
if x >= WIDTH:
x = 0
y += 1
if y >= HEIGHT:
y = HEIGHT - 1
char = data[i]
# handle control characters
# (most not supported!)
# https://en.wikipedia.org/wiki/ATASCII#Control_characters_2
# tab
if char == 127:
x += 4
i += 1
continue
# backspace
elif char == 126:
x -= 1
i += 1
continue
# line break
elif char == 155:
x = 0
y += 1
i += 1
continue
# over 127: inverted set
elif char > 127:
fg, bg = DEFAULT_BG, DEFAULT_FG
# being a little fancy here, redo if it backfires
char -= 128
# handle mismatch between playscii's version of ATASCII (which
# prefers to have character index 0 empty) and the real ATASCII
if char == 0:
char = 32
elif char == 32:
char = 0
self.art.set_tile_at(0, 0, x, y, char, fg, bg)
x += 1
i += 1
return True