REParadiseCafe/ParadiseCafe.py

228 lines
12 KiB
Python
Executable File

# -*- coding: utf-8 -*-
# SkoolKit extension for Paradise Café by DAMATTA.
#
# This file copyright (c) Pedro de Oliveira, 2018. <falsovsky@gmail.com>
#
from skoolkit.skoolhtml import HtmlWriter
from skoolkit.graphics import Udg
class ParadiseCafeHtmlWriter(HtmlWriter):
font = {
'20': [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ],
'21': [ 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, ],
'22': [ 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, ],
'23': [ 0x00, 0x24, 0x7E, 0x24, 0x24, 0x7E, 0x24, 0x00, ],
'24': [ 0x00, 0x08, 0x3E, 0x28, 0x3E, 0x0A, 0x3E, 0x08, ],
'25': [ 0x00, 0x62, 0x64, 0x08, 0x10, 0x26, 0x46, 0x00, ],
'26': [ 0x00, 0x10, 0x28, 0x10, 0x2A, 0x44, 0x3A, 0x00, ],
'27': [ 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, ],
'28': [ 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x00, ],
'29': [ 0x00, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x00, ],
'2A': [ 0x00, 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, 0x00, ],
'2B': [ 0x00, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, ],
'2C': [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10, ],
'2D': [ 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, ],
'2E': [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, ],
'2F': [ 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, ],
'30': [ 0x00, 0x3C, 0x46, 0x4A, 0x52, 0x62, 0x3C, 0x00, ],
'31': [ 0x00, 0x18, 0x28, 0x08, 0x08, 0x08, 0x3E, 0x00, ],
'32': [ 0x00, 0x3C, 0x42, 0x02, 0x3C, 0x40, 0x7E, 0x00, ],
'33': [ 0x00, 0x3C, 0x42, 0x0C, 0x02, 0x42, 0x3C, 0x00, ],
'34': [ 0x00, 0x08, 0x18, 0x28, 0x48, 0x7E, 0x08, 0x00, ],
'35': [ 0x00, 0x7E, 0x40, 0x7C, 0x02, 0x42, 0x3C, 0x00, ],
'36': [ 0x00, 0x3C, 0x40, 0x7C, 0x42, 0x42, 0x3C, 0x00, ],
'37': [ 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, ],
'38': [ 0x00, 0x3C, 0x42, 0x3C, 0x42, 0x42, 0x3C, 0x00, ],
'39': [ 0x00, 0x3C, 0x42, 0x42, 0x3E, 0x02, 0x3C, 0x00, ],
'3A': [ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, ],
'3B': [ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x20, ],
'3C': [ 0x00, 0x00, 0x04, 0x08, 0x10, 0x08, 0x04, 0x00, ],
'3D': [ 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, ],
'3E': [ 0x00, 0x00, 0x10, 0x08, 0x04, 0x08, 0x10, 0x00, ],
'3F': [ 0x00, 0x3C, 0x42, 0x04, 0x08, 0x00, 0x08, 0x00, ],
'40': [ 0x00, 0x3C, 0x4A, 0x56, 0x5E, 0x40, 0x3C, 0x00, ],
'41': [ 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x00, ],
'42': [ 0x00, 0x7C, 0x42, 0x7C, 0x42, 0x42, 0x7C, 0x00, ],
'43': [ 0x00, 0x3C, 0x42, 0x40, 0x40, 0x42, 0x3C, 0x00, ],
'44': [ 0x00, 0x78, 0x44, 0x42, 0x42, 0x44, 0x78, 0x00, ],
'45': [ 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x7E, 0x00, ],
'46': [ 0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x00, ],
'47': [ 0x00, 0x3C, 0x42, 0x40, 0x4E, 0x42, 0x3C, 0x00, ],
'48': [ 0x00, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x00, ],
'49': [ 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, ],
'4A': [ 0x00, 0x02, 0x02, 0x02, 0x42, 0x42, 0x3C, 0x00, ],
'4B': [ 0x00, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42, 0x00, ],
'4C': [ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, ],
'4D': [ 0x00, 0x42, 0x66, 0x5A, 0x42, 0x42, 0x42, 0x00, ],
'4E': [ 0x00, 0x42, 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00, ],
'4F': [ 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, ],
'50': [ 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x00, ],
'51': [ 0x00, 0x3C, 0x42, 0x42, 0x52, 0x4A, 0x3C, 0x00, ],
'52': [ 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x44, 0x42, 0x00, ],
'53': [ 0x00, 0x3C, 0x40, 0x3C, 0x02, 0x42, 0x3C, 0x00, ],
'54': [ 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, ],
'55': [ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, ],
'56': [ 0x00, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, ],
'57': [ 0x00, 0x42, 0x42, 0x42, 0x42, 0x5A, 0x24, 0x00, ],
'58': [ 0x00, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x00, ],
'59': [ 0x00, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00, ],
'5A': [ 0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00, ],
'5B': [ 0x00, 0x0E, 0x08, 0x08, 0x08, 0x08, 0x0E, 0x00, ],
'5C': [ 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, ],
'5D': [ 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00, ],
'5E': [ 0x00, 0x10, 0x38, 0x54, 0x10, 0x10, 0x10, 0x00, ],
'5F': [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, ],
'60': [ 0x00, 0x1C, 0x22, 0x78, 0x20, 0x20, 0x7E, 0x00, ],
'61': [ 0x00, 0x00, 0x38, 0x04, 0x3C, 0x44, 0x3C, 0x00, ],
'62': [ 0x00, 0x20, 0x20, 0x3C, 0x22, 0x22, 0x3C, 0x00, ],
'63': [ 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x00, ],
'64': [ 0x00, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3C, 0x00, ],
'65': [ 0x00, 0x00, 0x38, 0x44, 0x78, 0x40, 0x3C, 0x00, ],
'66': [ 0x00, 0x0C, 0x10, 0x18, 0x10, 0x10, 0x10, 0x00, ],
'67': [ 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C, 0x04, 0x38, ],
'68': [ 0x00, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x00, ],
'69': [ 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x38, 0x00, ],
'6A': [ 0x00, 0x04, 0x00, 0x04, 0x04, 0x04, 0x24, 0x18, ],
'6B': [ 0x00, 0x20, 0x28, 0x30, 0x30, 0x28, 0x24, 0x00, ],
'6C': [ 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, ],
'6D': [ 0x00, 0x00, 0x68, 0x54, 0x54, 0x54, 0x54, 0x00, ],
'6E': [ 0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00, ],
'6F': [ 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, ],
'70': [ 0x00, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, ],
'71': [ 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C, 0x04, 0x06, ],
'72': [ 0x00, 0x00, 0x1C, 0x20, 0x20, 0x20, 0x20, 0x00, ],
'73': [ 0x00, 0x00, 0x38, 0x40, 0x38, 0x04, 0x78, 0x00, ],
'74': [ 0x00, 0x10, 0x38, 0x10, 0x10, 0x10, 0x0C, 0x00, ],
'75': [ 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, ],
'76': [ 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x00, ],
'77': [ 0x00, 0x00, 0x44, 0x54, 0x54, 0x54, 0x28, 0x00, ],
'78': [ 0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, ],
'79': [ 0x00, 0x00, 0x44, 0x44, 0x44, 0x3C, 0x04, 0x38, ],
'7A': [ 0x00, 0x00, 0x7C, 0x08, 0x10, 0x20, 0x7C, 0x00, ],
'7B': [ 0x00, 0x0E, 0x08, 0x30, 0x08, 0x08, 0x0E, 0x00, ],
'7C': [ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, ],
'7D': [ 0x00, 0x70, 0x10, 0x0C, 0x10, 0x10, 0x70, 0x00, ],
'7E': [ 0x00, 0x14, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, ],
'7F': [ 0x3C, 0x42, 0x99, 0xA1, 0xA1, 0x99, 0x42, 0x3C, ],
}
def init(self):
pass
def generate_block(self, cwd, char):
blockbytes = [0, 0, 0, 0, 0, 0, 0, 0]
if char == 0x80:
blockbytes = [0, 0, 0, 0, 0, 0, 0, 0]
elif char == 0x81:
blockbytes = [0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0x0, 0x0]
elif char == 0x82:
blockbytes = [0xf0, 0xf0, 0xf0, 0xf0, 0x0, 0x0, 0x0, 0x0]
elif char == 0x85:
blockbytes = [0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf]
elif char == 0x8A:
blockbytes = [0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0]
elif char == 0x8B:
blockbytes = [0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0]
elif char == 0x8f:
blockbytes = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
else:
print("BLOCK %02X NOT IMPLEMENTED" % (char))
return blockbytes
def decode_data(self, cwd, chraddr, dataaddr, comment = False):
#print "DEBUG: CHRADDR %04X+100 = %04X" % (chraddr, (chraddr+0x100))
# Cria um array com 24 linhas e 32 colunas
udg_array = [[0 for i in range(32)] for j in range(24)]
# Posicao da proxima escrita no ecra
x = 0
y = 0
# cor
ink = 0
# fundo
paper = 7
flash = 0
brightness = 0
# encher o array com o caracter SPACE
zbr = 0x3D00 # endereço do chr$ space na memoria
for i in range(24):
for j in range(32):
udg_array[i][j] = Udg(63, self.snapshot[zbr:zbr+8])
addr = dataaddr
while self.snapshot[addr] != 0xFF:
if self.snapshot[addr] == 0x16:
x = self.snapshot[addr+1]
y = self.snapshot[addr+2]
if comment == True:
print("B $%04X,$3 AT - X = %d, Y = %d" % (addr, x, y))
addr += 3
continue
if self.snapshot[addr] == 0x10:
ink = self.snapshot[addr+1]
if comment == True:
print("B $%04X,$2 INK %d" % (addr, ink))
addr += 2
continue
if self.snapshot[addr] == 0x11:
paper = self.snapshot[addr+1]
if comment == True:
print("B $%04X,$2 PAPER %d" % (addr, paper))
addr += 2
continue
if self.snapshot[addr] == 0x12:
flash = self.snapshot[addr+1]
if comment == True:
print("B $%04X,$2 FLASH %d" % (addr, flash))
addr += 2
continue
v = (self.snapshot[addr] - 0x20)
ad = ( chraddr + 256 ) + v * 8
attr = ink | (paper << 3) | (brightness << 6) | (flash << 7)
# BLOCK CHARS
if (self.snapshot[addr] >= 0x80 and self.snapshot[addr] <= 0x8f):
zbr = self.generate_block(cwd, self.snapshot[addr])
udg_array[x][y] = Udg(attr, zbr)
#if comment == True:
# print "B $%04X,$1 UDG %02X - ADDR = %04X - AT %d,%d - INK %d - PAPER %d - #HTML[#UDG$%04X,%d(%04x)]" % (addr, self.snapshot[addr], ad, ad, attr, ad)
elif (self.snapshot[addr] >= 0x90 and self.snapshot[addr] <= 0xa4):
v = ( self.snapshot[addr] - 0x90)
ad = ( 0xFF58 ) + (v*8)
udg_array[x][y] = Udg(attr, self.snapshot[ad:ad+8])
#if comment == True:
# print "B $%04X,$1 UDG %02X - ADDR = %04X - AT %d,%d - INK %d - PAPER %d - #HTML[#UDG$%04X,%d(%04x)]" % (addr, self.snapshot[addr], ad, x, y, ink, paper, ad, attr, ad)
else:
if (chraddr == 0x3C00):
key = "%02X" % (self.snapshot[addr])
udg_array[x][y] = Udg(attr, self.font[key])
else:
udg_array[x][y] = Udg(attr, self.snapshot[ad:ad+8])
if comment == True:
print("B $%04X,$1 UDG %02X - ADDR = $%04X - AT $%02X,$%02X - ATTRIBUTES $%02X - #HTML[#UDG$%04X,%d(%04x_%02x)]" % (addr, self.snapshot[addr], ad, x, y, attr, ad, attr, ad, attr))
addr += 1
y += 1
if y == 32:
y = 0
x += 1
img_path_id = 'ScreenshotImagePath'
fname = 'zbr-%x-%x' % (chraddr, addr)
img_path = self.image_path(fname, img_path_id)
self.write_image(img_path, udg_array)
return self.img_element(cwd, img_path)