# C64 color palette (RGB values)
C64_PALETTE = [
(0, 0, 0), # 0: Black
(255, 255, 255), # 1: White
(136, 57, 50), # 2: Red
(103, 182, 189), # 3: Cyan
(139, 63, 150), # 4: Purple
(85, 160, 73), # 5: Green
(64, 49, 141), # 6: Blue
(191, 206, 114), # 7: Yellow
(139, 84, 41), # 8: Orange
(87, 66, 0), # 9: Brown
(184, 105, 98), # 10: Light Red
(80, 80, 80), # 11: Dark Gray
(120, 120, 120), # 12: Medium Gray
(148, 224, 137), # 13: Light Green
(120, 105, 196), # 14: Light Blue
(159, 159, 159), # 15: Light Gray
]
# C64 uppercase/graphics character set (2048 bytes, 256 chars x 8 bytes each)
# This is the standard C64 character ROM (uppercase + graphics)
C64_CHARSET = bytes([
# Characters 0-31 (@ A-Z [ \ ] ^ _ and graphics)
0x3c,0x66,0x6e,0x6e,0x60,0x62,0x3c,0x00, # @
0x18,0x3c,0x66,0x7e,0x66,0x66,0x66,0x00, # A
0x7c,0x66,0x66,0x7c,0x66,0x66,0x7c,0x00, # B
0x3c,0x66,0x60,0x60,0x60,0x66,0x3c,0x00, # C
0x78,0x6c,0x66,0x66,0x66,0x6c,0x78,0x00, # D
0x7e,0x60,0x60,0x78,0x60,0x60,0x7e,0x00, # E
0x7e,0x60,0x60,0x78,0x60,0x60,0x60,0x00, # F
0x3c,0x66,0x60,0x6e,0x66,0x66,0x3c,0x00, # G
0x66,0x66,0x66,0x7e,0x66,0x66,0x66,0x00, # H
0x3c,0x18,0x18,0x18,0x18,0x18,0x3c,0x00, # I
0x1e,0x0c,0x0c,0x0c,0x0c,0x6c,0x38,0x00, # J
0x66,0x6c,0x78,0x70,0x78,0x6c,0x66,0x00, # K
0x60,0x60,0x60,0x60,0x60,0x60,0x7e,0x00, # L
0x63,0x77,0x7f,0x6b,0x63,0x63,0x63,0x00, # M
0x66,0x76,0x7e,0x7e,0x6e,0x66,0x66,0x00, # N
0x3c,0x66,0x66,0x66,0x66,0x66,0x3c,0x00, # O
0x7c,0x66,0x66,0x7c,0x60,0x60,0x60,0x00, # P
0x3c,0x66,0x66,0x66,0x66,0x3c,0x0e,0x00, # Q
0x7c,0x66,0x66,0x7c,0x78,0x6c,0x66,0x00, # R
0x3c,0x66,0x60,0x3c,0x06,0x66,0x3c,0x00, # S
0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x00, # T
0x66,0x66,0x66,0x66,0x66,0x66,0x3c,0x00, # U
0x66,0x66,0x66,0x66,0x66,0x3c,0x18,0x00, # V
0x63,0x63,0x63,0x6b,0x7f,0x77,0x63,0x00, # W
0x66,0x66,0x3c,0x18,0x3c,0x66,0x66,0x00, # X
0x66,0x66,0x66,0x3c,0x18,0x18,0x18,0x00, # Y
0x7e,0x06,0x0c,0x18,0x30,0x60,0x7e,0x00, # Z
0x3c,0x30,0x30,0x30,0x30,0x30,0x3c,0x00, # [
0x0c,0x12,0x30,0x7c,0x30,0x62,0xfc,0x00, # pound
0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00, # ]
0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18, # up arrow
0x00,0x10,0x30,0x7f,0x7f,0x30,0x10,0x00, # left arrow
# Characters 32-63 (space, !"#$%&'()*+,-./0-9:;<=>?)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, # space
0x18,0x18,0x18,0x18,0x00,0x00,0x18,0x00, # !
0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00, # "
0x66,0x66,0xff,0x66,0xff,0x66,0x66,0x00, # #
0x18,0x3e,0x60,0x3c,0x06,0x7c,0x18,0x00, # $
0x62,0x66,0x0c,0x18,0x30,0x66,0x46,0x00, # %
0x3c,0x66,0x3c,0x38,0x67,0x66,0x3f,0x00, # &
0x06,0x0c,0x18,0x00,0x00,0x00,0x00,0x00, # '
0x0c,0x18,0x30,0x30,0x30,0x18,0x0c,0x00, # (
0x30,0x18,0x0c,0x0c,0x0c,0x18,0x30,0x00, # )
0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00, # *
0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00, # +
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, # ,
0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00, # -
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, # .
0x00,0x03,0x06,0x0c,0x18,0x30,0x60,0x00, # /
0x3c,0x66,0x6e,0x76,0x66,0x66,0x3c,0x00, # 0
0x18,0x18,0x38,0x18,0x18,0x18,0x7e,0x00, # 1
0x3c,0x66,0x06,0x0c,0x30,0x60,0x7e,0x00, # 2
0x3c,0x66,0x06,0x1c,0x06,0x66,0x3c,0x00, # 3
0x06,0x0e,0x1e,0x66,0x7f,0x06,0x06,0x00, # 4
0x7e,0x60,0x7c,0x06,0x06,0x66,0x3c,0x00, # 5
0x3c,0x66,0x60,0x7c,0x66,0x66,0x3c,0x00, # 6
0x7e,0x66,0x0c,0x18,0x18,0x18,0x18,0x00, # 7
0x3c,0x66,0x66,0x3c,0x66,0x66,0x3c,0x00, # 8
0x3c,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00, # 9
0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00, # :
0x00,0x00,0x18,0x00,0x00,0x18,0x18,0x30, # ;
0x0e,0x18,0x30,0x60,0x30,0x18,0x0e,0x00, # <
0x00,0x00,0x7e,0x00,0x7e,0x00,0x00,0x00, # =
0x70,0x18,0x0c,0x06,0x0c,0x18,0x70,0x00, # >
0x3c,0x66,0x06,0x0c,0x18,0x00,0x18,0x00, # ?
# Characters 64-95 (graphics characters)
0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00, # horiz line
0x36,0x7f,0x7f,0x7f,0x3e,0x1c,0x08,0x00, # spade
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, # vert line
0x00,0x00,0x00,0xff,0xff,0x18,0x18,0x18, # T up
0x18,0x18,0x18,0xff,0xff,0x00,0x00,0x00, # T down
0x18,0x18,0x18,0xf8,0xf8,0x18,0x18,0x18, # T left
0x00,0x00,0x03,0x3e,0x76,0x36,0x36,0x00, # curve TR
0x00,0x00,0xc0,0x7c,0x6e,0x6c,0x6c,0x00, # curve TL
0x36,0x36,0x76,0x3e,0x03,0x00,0x00,0x00, # curve BR
0x6c,0x6c,0x6e,0x7c,0xc0,0x00,0x00,0x00, # curve BL
0x18,0x18,0x18,0x1f,0x1f,0x18,0x18,0x18, # T right
0x00,0x00,0x00,0x1f,0x1f,0x18,0x18,0x18, # corner TL
0x18,0x18,0x18,0x1f,0x1f,0x00,0x00,0x00, # corner BL
0x18,0x18,0x18,0xf8,0xf8,0x00,0x00,0x00, # corner BR
0x00,0x00,0x00,0xf8,0xf8,0x18,0x18,0x18, # corner TR
0x18,0x18,0x18,0xff,0xff,0x18,0x18,0x18, # cross
0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x00, # block BR
0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0x00, # block BL
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00, # block TR
0x08,0x1c,0x3e,0x7f,0x7f,0x1c,0x3e,0x00, # club
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00, # block TL
0x80,0xc0,0xe0,0xf0,0xe0,0xc0,0x80,0x00, # triangle left
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, # full block
0x01,0x03,0x07,0x0f,0x07,0x03,0x01,0x00, # triangle right
0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x08,0x00, # diamond
0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18, # plus
0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, # left edge
0x00,0x00,0x00,0xfe,0xfe,0x06,0x06,0x06, # corner DR
0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00, # square
0x18,0x7e,0x7e,0x18,0x18,0x7e,0x3c,0x00, # pi
0x06,0x06,0x06,0xfe,0xfe,0x00,0x00,0x00, # corner UR
0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x00, # arrow up
0x10,0x30,0x7f,0x7f,0x7f,0x30,0x10,0x00, # arrow left
# Characters 96-127 (lowercase letters in PETSCII are graphics)
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, # bottom bar
0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x08,0x00, # diamond
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00, # top bar
0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff, # btm thick bar
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, # right edge
0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f, # btm right quad
0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00, # top left quad
0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0, # checkerboard
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00, # top right quad
0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0, # btm left quad
0x18,0x18,0x18,0x18,0x00,0x00,0x18,0x18, # vert split
0x00,0xc6,0x7c,0xc6,0xc6,0x7c,0xc6,0x00, # circled times
0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, # center dot
0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00, # upper left dot
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, # left half
0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00, # upper right dot
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, # top half
0x36,0x7f,0x7f,0x7f,0x3e,0x1c,0x08,0x00, # spade
0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06, # lower right dot
0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00, # vert bars
0x7e,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x00, # para
0x3c,0x60,0x3c,0x66,0x3c,0x06,0x3c,0x00, # section
0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60, # lower left dot
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, # btm half
0x08,0x1c,0x3e,0x7f,0x7f,0x1c,0x3e,0x00, # club
0x36,0x36,0x7f,0x7f,0x7f,0x3e,0x1c,0x00, # heart
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, # right half
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, # vert line
0x00,0x00,0x00,0x07,0x0f,0x1c,0x18,0x18, # curve UL
0x18,0x18,0x1c,0x0f,0x07,0x00,0x00,0x00, # curve LL
0x18,0x18,0x38,0xf0,0xe0,0x00,0x00,0x00, # curve LR
0x00,0x00,0x00,0xe0,0xf0,0x38,0x18,0x18, # curve UR
# Characters 128-159 (reversed @-_ )
0xc3,0x99,0x91,0x91,0x9f,0x9d,0xc3,0xff, # @ reversed
0xe7,0xc3,0x99,0x81,0x99,0x99,0x99,0xff, # A reversed
0x83,0x99,0x99,0x83,0x99,0x99,0x83,0xff, # B reversed
0xc3,0x99,0x9f,0x9f,0x9f,0x99,0xc3,0xff, # C reversed
0x87,0x93,0x99,0x99,0x99,0x93,0x87,0xff, # D reversed
0x81,0x9f,0x9f,0x87,0x9f,0x9f,0x81,0xff, # E reversed
0x81,0x9f,0x9f,0x87,0x9f,0x9f,0x9f,0xff, # F reversed
0xc3,0x99,0x9f,0x91,0x99,0x99,0xc3,0xff, # G reversed
0x99,0x99,0x99,0x81,0x99,0x99,0x99,0xff, # H reversed
0xc3,0xe7,0xe7,0xe7,0xe7,0xe7,0xc3,0xff, # I reversed
0xe1,0xf3,0xf3,0xf3,0xf3,0x93,0xc7,0xff, # J reversed
0x99,0x93,0x87,0x8f,0x87,0x93,0x99,0xff, # K reversed
0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x81,0xff, # L reversed
0x9c,0x88,0x80,0x94,0x9c,0x9c,0x9c,0xff, # M reversed
0x99,0x89,0x81,0x81,0x91,0x99,0x99,0xff, # N reversed
0xc3,0x99,0x99,0x99,0x99,0x99,0xc3,0xff, # O reversed
0x83,0x99,0x99,0x83,0x9f,0x9f,0x9f,0xff, # P reversed
0xc3,0x99,0x99,0x99,0x99,0xc3,0xf1,0xff, # Q reversed
0x83,0x99,0x99,0x83,0x87,0x93,0x99,0xff, # R reversed
0xc3,0x99,0x9f,0xc3,0xf9,0x99,0xc3,0xff, # S reversed
0x81,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xff, # T reversed
0x99,0x99,0x99,0x99,0x99,0x99,0xc3,0xff, # U reversed
0x99,0x99,0x99,0x99,0x99,0xc3,0xe7,0xff, # V reversed
0x9c,0x9c,0x9c,0x94,0x80,0x88,0x9c,0xff, # W reversed
0x99,0x99,0xc3,0xe7,0xc3,0x99,0x99,0xff, # X reversed
0x99,0x99,0x99,0xc3,0xe7,0xe7,0xe7,0xff, # Y reversed
0x81,0xf9,0xf3,0xe7,0xcf,0x9f,0x81,0xff, # Z reversed
0xc3,0xcf,0xcf,0xcf,0xcf,0xcf,0xc3,0xff, # [ reversed
0xf3,0xed,0xcf,0x83,0xcf,0x9d,0x03,0xff, # pound reversed
0xc3,0xf3,0xf3,0xf3,0xf3,0xf3,0xc3,0xff, # ] reversed
0xff,0xe7,0xc3,0x81,0xe7,0xe7,0xe7,0xe7, # up arrow rev
0xff,0xef,0xcf,0x80,0x80,0xcf,0xef,0xff, # left arrow rev
# Characters 160-191 (reversed space-?)
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, # space reversed
0xe7,0xe7,0xe7,0xe7,0xff,0xff,0xe7,0xff, # ! reversed
0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff, # " reversed
0x99,0x99,0x00,0x99,0x00,0x99,0x99,0xff, # # reversed
0xe7,0xc1,0x9f,0xc3,0xf9,0x83,0xe7,0xff, # $ reversed
0x9d,0x99,0xf3,0xe7,0xcf,0x99,0xb9,0xff, # % reversed
0xc3,0x99,0xc3,0xc7,0x98,0x99,0xc0,0xff, # & reversed
0xf9,0xf3,0xe7,0xff,0xff,0xff,0xff,0xff, # ' reversed
0xf3,0xe7,0xcf,0xcf,0xcf,0xe7,0xf3,0xff, # ( reversed
0xcf,0xe7,0xf3,0xf3,0xf3,0xe7,0xcf,0xff, # ) reversed
0xff,0x99,0xc3,0x00,0xc3,0x99,0xff,0xff, # * reversed
0xff,0xe7,0xe7,0x81,0xe7,0xe7,0xff,0xff, # + reversed
0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xcf, # , reversed
0xff,0xff,0xff,0x81,0xff,0xff,0xff,0xff, # - reversed
0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xff, # . reversed
0xff,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0xff, # / reversed
0xc3,0x99,0x91,0x89,0x99,0x99,0xc3,0xff, # 0 reversed
0xe7,0xe7,0xc7,0xe7,0xe7,0xe7,0x81,0xff, # 1 reversed
0xc3,0x99,0xf9,0xf3,0xcf,0x9f,0x81,0xff, # 2 reversed
0xc3,0x99,0xf9,0xe3,0xf9,0x99,0xc3,0xff, # 3 reversed
0xf9,0xf1,0xe1,0x99,0x80,0xf9,0xf9,0xff, # 4 reversed
0x81,0x9f,0x83,0xf9,0xf9,0x99,0xc3,0xff, # 5 reversed
0xc3,0x99,0x9f,0x83,0x99,0x99,0xc3,0xff, # 6 reversed
0x81,0x99,0xf3,0xe7,0xe7,0xe7,0xe7,0xff, # 7 reversed
0xc3,0x99,0x99,0xc3,0x99,0x99,0xc3,0xff, # 8 reversed
0xc3,0x99,0x99,0xc1,0xf9,0x99,0xc3,0xff, # 9 reversed
0xff,0xff,0xe7,0xff,0xff,0xe7,0xff,0xff, # : reversed
0xff,0xff,0xe7,0xff,0xff,0xe7,0xe7,0xcf, # ; reversed
0xf1,0xe7,0xcf,0x9f,0xcf,0xe7,0xf1,0xff, # < reversed
0xff,0xff,0x81,0xff,0x81,0xff,0xff,0xff, # = reversed
0x8f,0xe7,0xf3,0xf9,0xf3,0xe7,0x8f,0xff, # > reversed
0xc3,0x99,0xf9,0xf3,0xe7,0xff,0xe7,0xff, # ? reversed
# Characters 192-223 (reversed graphics)
0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff, # horiz line rev
0xc9,0x80,0x80,0x80,0xc1,0xe3,0xf7,0xff, # spade rev
0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, # vert line
0xff,0xff,0xff,0x00,0x00,0xe7,0xe7,0xe7, # T up rev
0xe7,0xe7,0xe7,0x00,0x00,0xff,0xff,0xff, # T down rev
0xe7,0xe7,0xe7,0x07,0x07,0xe7,0xe7,0xe7, # T left rev
0xff,0xff,0xfc,0xc1,0x89,0xc9,0xc9,0xff, # curve TR rev
0xff,0xff,0x3f,0x83,0x91,0x93,0x93,0xff, # curve TL rev
0xc9,0xc9,0x89,0xc1,0xfc,0xff,0xff,0xff, # curve BR rev
0x93,0x93,0x91,0x83,0x3f,0xff,0xff,0xff, # curve BL rev
0xe7,0xe7,0xe7,0xe0,0xe0,0xe7,0xe7,0xe7, # T right rev
0xff,0xff,0xff,0xe0,0xe0,0xe7,0xe7,0xe7, # corner TL rev
0xe7,0xe7,0xe7,0xe0,0xe0,0xff,0xff,0xff, # corner BL rev
0xe7,0xe7,0xe7,0x07,0x07,0xff,0xff,0xff, # corner BR rev
0xff,0xff,0xff,0x07,0x07,0xe7,0xe7,0xe7, # corner TR rev
0xe7,0xe7,0xe7,0x00,0x00,0xe7,0xe7,0xe7, # cross rev
0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0,0xff, # block BR rev
0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f,0xff, # block BL rev
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff, # block TR rev
0xf7,0xe3,0xc1,0x80,0x80,0xe3,0xc1,0xff, # club rev
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff, # block TL rev
0x7f,0x3f,0x1f,0x0f,0x1f,0x3f,0x7f,0xff, # triangle left rev
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, # full block rev (empty)
0xfe,0xfc,0xf8,0xf0,0xf8,0xfc,0xfe,0xff, # triangle right rev
0xf7,0xe3,0xc1,0x80,0xc1,0xe3,0xf7,0xff, # diamond rev
0xe7,0xe7,0xe7,0xe7,0x00,0xe7,0xe7,0xe7, # plus rev
0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, # left edge rev
0xff,0xff,0xff,0x01,0x01,0xf9,0xf9,0xf9, # corner DR rev
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff, # square rev
0xe7,0x81,0x81,0xe7,0xe7,0x81,0xc3,0xff, # pi rev
0xf9,0xf9,0xf9,0x01,0x01,0xff,0xff,0xff, # corner UR rev
0xe7,0xc3,0x81,0xe7,0xe7,0xe7,0xe7,0xff, # arrow up rev
0xef,0xcf,0x80,0x80,0x80,0xcf,0xef,0xff, # arrow left rev
# Characters 224-255 (more reversed graphics)
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, # bottom bar rev
0xf7,0xe3,0xc1,0x80,0xc1,0xe3,0xf7,0xff, # diamond rev
0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff, # top bar rev
0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, # btm thick bar rev
0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, # right edge rev
0xff,0xff,0xff,0xff,0xf0,0xf0,0xf0,0xf0, # btm right quad rev
0x0f,0x0f,0x0f,0x0f,0xff,0xff,0xff,0xff, # top left quad rev
0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f, # checkerboard rev
0xf0,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff, # top right quad rev
0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0x0f, # btm left quad rev
0xe7,0xe7,0xe7,0xe7,0xff,0xff,0xe7,0xe7, # vert split rev
0xff,0x39,0x83,0x39,0x39,0x83,0x39,0xff, # circled times rev
0xff,0xff,0xff,0xe7,0xe7,0xff,0xff,0xff, # center dot rev
0xff,0xff,0x9f,0x9f,0xff,0xff,0xff,0xff, # upper left dot rev
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, # left half rev
0xff,0xff,0xf9,0xf9,0xff,0xff,0xff,0xff, # upper right dot rev
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, # top half rev
0xc9,0x80,0x80,0x80,0xc1,0xe3,0xf7,0xff, # spade rev
0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xf9, # lower right dot rev
0x99,0x99,0x99,0x99,0x99,0xff,0x99,0xff, # vert bars rev
0x81,0x24,0x24,0x84,0xe4,0xe4,0xe4,0xff, # para rev
0xc3,0x9f,0xc3,0x99,0xc3,0xf9,0xc3,0xff, # section rev
0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x9f, # lower left dot rev
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, # btm half rev
0xf7,0xe3,0xc1,0x80,0x80,0xe3,0xc1,0xff, # club rev
0xc9,0xc9,0x80,0x80,0x80,0xc1,0xe3,0xff, # heart rev
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, # right half rev
0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, # vert line
0xff,0xff,0xff,0xf8,0xf0,0xe3,0xe7,0xe7, # curve UL rev
0xe7,0xe7,0xe3,0xf0,0xf8,0xff,0xff,0xff, # curve LL rev
0xe7,0xe7,0xc7,0x0f,0x1f,0xff,0xff,0xff, # curve LR rev
0xff,0xff,0xff,0x1f,0x0f,0xc7,0xe7,0xe7, # curve UR rev
])
# Keyboard buffer constants
KEYBUF_ADDR = 0x0277 # Keyboard buffer (10 bytes)
KEYBUF_LEN_ADDR = 0xC6 # Number of characters in buffer
KEYBUF_MAX_SIZE = 10 # Maximum buffer size
# Special key placeholders for type_text (JSON-friendly)
SPECIAL_KEYS = {
"{RETURN}": 13,
"{RET}": 13,
"{ENTER}": 13,
"{HOME}": 19,
"{CLR}": 147,
"{CLEAR}": 147,
"{DEL}": 20,
"{DELETE}": 20,
"{INS}": 148,
"{INSERT}": 148,
"{UP}": 145,
"{DOWN}": 17,
"{LEFT}": 157,
"{RIGHT}": 29,
"{F1}": 133,
"{F2}": 137,
"{F3}": 134,
"{F4}": 138,
"{F5}": 135,
"{F6}": 139,
"{F7}": 136,
"{F8}": 140,
"{STOP}": 3,
"{RUN}": 131,
"{SPACE}": 32,
}