├── .gitignore ├── LICENSE ├── README.rst ├── boot.py ├── examples ├── box_better.py ├── box_even_better.py ├── box_simple.py ├── circle.py ├── circle2.py ├── menu_example.py ├── polygon.py ├── star.py └── write.py ├── fonts ├── astrol.fnt ├── cyrilc.fnt ├── gotheng.fnt ├── gothger.fnt ├── gothita.fnt ├── greekc.fnt ├── greekcs.fnt ├── greekp.fnt ├── greeks.fnt ├── italicc.fnt ├── italiccs.fnt ├── italict.fnt ├── japan.fnt ├── lowmat.fnt ├── marker.fnt ├── meteo.fnt ├── misc.fnt ├── music.fnt ├── romanc.fnt ├── romancs.fnt ├── romand.fnt ├── romanp.fnt ├── romans.fnt ├── romant.fnt ├── scriptc.fnt ├── scripts.fnt ├── symbol.fnt └── uppmat.fnt ├── frozen ├── vga1_16x16.py ├── vga1_16x32.py ├── vga1_8x16.py ├── vga1_8x8.py ├── vga1_bold_16x16.py ├── vga1_bold_16x32.py ├── vga2_16x16.py ├── vga2_16x32.py ├── vga2_8x16.py ├── vga2_8x8.py ├── vga2_bold_16x16.py └── vga2_bold_16x32.py ├── images ├── hello.jpg ├── main_menu-1-1.jpg ├── main_menu-1-5.jpg ├── main_menu-3-1.jpg ├── main_menu-3-3.jpg ├── message-10.jpg └── message-2.jpg ├── jlcpcb ├── bom_esp32-drawbot3_3.csv ├── gerber_esp32_drawbot3_3.rar └── pnp_esp32-drawbot3_3.csv ├── lib ├── button.py ├── mcp23017.py ├── menu.py ├── servo.py ├── tftui.py ├── turtleplot.py └── turtleplotbot.py ├── main.py ├── micropython ├── fat.zip └── turtleplotbot.bin ├── parts ├── bio_wheel.stl ├── caster.stl ├── chassis.stl ├── pen_lifter.stl └── pipsqueek_holder.stl └── programs ├── free_space.py ├── hello.py ├── message.py ├── reset_config.py ├── show_fonts.py └── stars.py /.gitignore: -------------------------------------------------------------------------------- 1 | venv 2 | .vscode 3 | .DS_Store 4 | *~ 5 | __pycache__ 6 | 7 | #sphinx build folder 8 | docs/build 9 | 10 | #ignore gcode files 11 | *.gcode 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | Copyright (c) 2020 Russ Hughes 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | TurtlePlotBot 2 | ============= 3 | 4 | The TurtlePlotBot is a MicroPython based 3D printed drawing robot inspired 5 | by `MakersBox's `_ `Arduino Chassis 6 | for Drawing Robot `_. The 7 | TurtlePlotBot can be easily built in a couple of hours and offers a fun 8 | environment to learn python programming and robotics. 9 | 10 | | 11 | 12 | .. figure:: images/hello.jpg 13 | :width: 400px 14 | :align: center 15 | 16 | Say "Hello!" to my little friend! 17 | 18 | | 19 | 20 | The software that runs the TurtlePlotBot is modular and includes the 21 | `turtleplot` module. The `turtleplot` module contains the methods needed to 22 | turn turtle graphics commands into simple robot movements. You can use the 23 | `turtleplot` module run your own robot using different hardware without 24 | having to write all the python code for each of the turtle graphics commands. 25 | 26 | A TurtlePlotBot is built from 3D printed parts, a pair of 28BYJ-48 27 | stepper motors and uses a MG90S mini servo to lift and lower a pen used for 28 | drawing. 29 | 30 | An ESP-32 Based Microcontroller module with a 240x135 LCD display 31 | running MicroPython is paired with a `ESP32 DrawBot Board 32 | `_ 33 | to provide the interface circuitry needed to run the stepper motors, servo, 34 | MicroSD card and a five way joystick. The TurtlePlotBot has Wifi capability 35 | allowing it to be controlled and programmed wirelessly from a computer, 36 | smartphone or tablet. 37 | 38 | A menu system provides an easy way to configure the TurtlePlotBot, connect to 39 | or create a Wifi access point as well as running TurtlePlotBot MicroPython 40 | programs without the use of a computer or another device. 41 | 42 | 43 | * Connect to a Wifi Access Point 44 | 45 | =================================== =================================== 46 | .. image:: images/main_menu-1-1.jpg .. image:: images/main_menu-1-5.jpg 47 | =================================== =================================== 48 | 49 | * Create a Wifi Access Point 50 | 51 | =================================== =================================== 52 | .. image:: images/main_menu-3-1.jpg .. image:: images/main_menu-3-3.jpg 53 | =================================== =================================== 54 | 55 | * Write a message using a font 56 | 57 | =================================== =================================== 58 | .. image:: images/message-2.jpg .. image:: images/message-10.jpg 59 | =================================== =================================== 60 | 61 | 62 | TurtlePlotBot Documentation 63 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 64 | 65 | See the `TurtlePlotBot Documentation `_ 66 | for more details. 67 | -------------------------------------------------------------------------------- /boot.py: -------------------------------------------------------------------------------- 1 | # This file is executed on every boot (including wake-boot from deepsleep) 2 | """ 3 | boot.py 4 | """ 5 | import gc 6 | import sys 7 | 8 | sys.path.append('/programs') 9 | 10 | # uncomment to enable webrepl 11 | #import webrepl 12 | #webrepl.start() 13 | 14 | def reload(mod): 15 | mod_name = mod.__name__ 16 | del sys.modules[mod_name] 17 | gc.collect() 18 | return __import__(mod_name) 19 | 20 | 21 | -------------------------------------------------------------------------------- /examples/box_better.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Better way to draw a box 3 | ''' 4 | 5 | from turtleplotbot import TurtlePlotBot 6 | bot=TurtlePlotBot() 7 | bot.pendown() 8 | 9 | for _ in range(4): 10 | bot.forward(30) 11 | bot.left(90) 12 | 13 | bot.done() 14 | 15 | __import__("menu") # optional return to turtleplotbot menu 16 | -------------------------------------------------------------------------------- /examples/box_even_better.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Even better way to draw boxes 3 | ''' 4 | 5 | from turtleplotbot import TurtlePlotBot 6 | bot=TurtlePlotBot() 7 | 8 | def box(bot, size): 9 | bot.pendown() 10 | 11 | for _ in range(4): 12 | bot.forward(size) 13 | bot.left(90) 14 | 15 | bot.penup() 16 | 17 | box(bot, 10) 18 | box(bot, 20) 19 | box(bot, 30) 20 | 21 | bot.done() 22 | 23 | __import__("menu") # optional return to turtleplotbot menu 24 | -------------------------------------------------------------------------------- /examples/box_simple.py: -------------------------------------------------------------------------------- 1 | ''' 2 | The simple way to draw a box 3 | ''' 4 | 5 | from turtleplotbot import TurtlePlotBot 6 | bot=TurtlePlotBot() 7 | bot.pendown() 8 | 9 | bot.forward(30) 10 | bot.left(90) 11 | 12 | bot.forward(30) 13 | bot.left(90) 14 | 15 | bot.forward(30) 16 | bot.left(90) 17 | 18 | bot.forward(30) 19 | bot.left(90) 20 | 21 | bot.done() 22 | 23 | __import__("menu") # optional return to turtleplotbot menu 24 | -------------------------------------------------------------------------------- /examples/circle.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Approximate a circle or ellipse using a `n` sided polygon 3 | ''' 4 | 5 | import math 6 | 7 | from turtleplotbot import TurtlePlotBot 8 | bot=TurtlePlotBot() 9 | 10 | def circle(bot, radius_x, radius_y, sides): 11 | ''' 12 | Approximate a circle or ellipse by drawing a `n` sided polygon 13 | 14 | Args: 15 | radius_x: horizonal radius 16 | radius_y: vertical radius 17 | sides: number of line segments to draw 18 | 19 | Note: 20 | To draw circle use the same value for both radii 21 | 22 | ''' 23 | step = 2 * math.pi / sides 24 | 25 | for theta in range(0, 2 * math.pi, step): 26 | x = radius_x * math.cos(theta) 27 | y = radius_y * math.sin(theta) 28 | 29 | if theta is 0: 30 | start_x = x 31 | start_y = y 32 | bot.goto(x, y) 33 | bot.pendown() 34 | else: 35 | bot.goto(x, y) 36 | 37 | bot.goto(start_x, start_y) 38 | bot.penup() 39 | 40 | circle(bot, 30, 30, 20) 41 | bot.done() 42 | 43 | __import__("menu") # optional return to turtleplotbot menu 44 | -------------------------------------------------------------------------------- /examples/circle2.py: -------------------------------------------------------------------------------- 1 | from turtleplotbot import TurtlePlotBot 2 | 3 | bot=TurtlePlotBot() 4 | bot.pendown() 5 | bot.circle(20,360) 6 | bot.done() 7 | 8 | __import__("menu") # optional return to turtleplotbot menu 9 | -------------------------------------------------------------------------------- /examples/menu_example.py: -------------------------------------------------------------------------------- 1 | """ 2 | menu_example.py - Show a menu of numbers that the user can select and show the 3 | number picked. Pressing the left button will exit the menu and program. 4 | """ 5 | 6 | import vga2_bold_16x16 as font 7 | import tftui 8 | 9 | def main(ui): 10 | """ 11 | Main routine 12 | """ 13 | 14 | menu = [ 15 | "One", 16 | "Two", 17 | "Three", 18 | "Four", 19 | "Five", 20 | "Six", 21 | "Seven", 22 | "Eight", 23 | "Nine" 24 | ] 25 | 26 | option = 0 27 | while option is not None: 28 | option = ui.menu("Pick a Number", menu, option) 29 | if option: 30 | ui.cls("You Picked:", 2) 31 | ui.center(menu[option], 3) 32 | ui.center("Press to", 5) 33 | ui.wait("Continue", 6) 34 | 35 | ui.cls("Bye!") 36 | 37 | main(tftui.UI(font,1)) 38 | 39 | __import__("menu") # return to turtleplotbot menu 40 | 41 | -------------------------------------------------------------------------------- /examples/polygon.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Draw a `n` sided polygon 3 | ''' 4 | from turtleplotbot import TurtlePlotBot 5 | bot=TurtlePlotBot() 6 | 7 | def polygon(bot, sides, length): 8 | ''' 9 | Draw a 'sides' sided polygon 10 | 11 | Args: 12 | sides: number of sides in polygon 13 | length: length of eacg side 14 | ''' 15 | angle = 360 / sides 16 | bot.pendown() 17 | for _ in range(sides): 18 | bot.forward(length) 19 | bot.right(angle) 20 | 21 | bot.penup() 22 | 23 | polygon(bot, 8, 20) 24 | bot.done() 25 | 26 | __import__("menu") # return to turtleplotbot menu 27 | -------------------------------------------------------------------------------- /examples/star.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Draw a star 3 | ''' 4 | 5 | from turtleplotbot import TurtlePlotBot 6 | bot=TurtlePlotBot() 7 | 8 | def star(bot, points, length): 9 | ''' 10 | Draw a 'n' pointed star with 'length' sides 11 | 12 | Args: 13 | sides: number of points 14 | length: length of each side 15 | ''' 16 | angle = 180.0 - 180.0 / points 17 | bot.pendown() 18 | 19 | for _ in range(points): 20 | bot.forward(length) 21 | bot.left(angle) 22 | bot.forward(length) 23 | 24 | bot.penup() 25 | 26 | star(bot, 5, 30) 27 | 28 | __import__("menu") # return to turtleplotbot menu 29 | -------------------------------------------------------------------------------- /examples/write.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Write a message. 3 | ''' 4 | 5 | from turtleplotbot import TurtlePlotBot 6 | bot=TurtlePlotBot() 7 | 8 | # make the text 2 times larger then the default 9 | bot.setscale(2) 10 | bot.write("Hello!", "fonts/scripts.fnt") 11 | bot.done() 12 | 13 | __import__("menu") # return to turtleplotbot menu 14 | -------------------------------------------------------------------------------- /fonts/astrol.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/astrol.fnt -------------------------------------------------------------------------------- /fonts/cyrilc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/cyrilc.fnt -------------------------------------------------------------------------------- /fonts/gotheng.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/gotheng.fnt -------------------------------------------------------------------------------- /fonts/gothger.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/gothger.fnt -------------------------------------------------------------------------------- /fonts/gothita.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/gothita.fnt -------------------------------------------------------------------------------- /fonts/greekc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/greekc.fnt -------------------------------------------------------------------------------- /fonts/greekcs.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/greekcs.fnt -------------------------------------------------------------------------------- /fonts/greekp.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/greekp.fnt -------------------------------------------------------------------------------- /fonts/greeks.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/greeks.fnt -------------------------------------------------------------------------------- /fonts/italicc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/italicc.fnt -------------------------------------------------------------------------------- /fonts/italiccs.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/italiccs.fnt -------------------------------------------------------------------------------- /fonts/italict.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/italict.fnt -------------------------------------------------------------------------------- /fonts/japan.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/japan.fnt -------------------------------------------------------------------------------- /fonts/lowmat.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/lowmat.fnt -------------------------------------------------------------------------------- /fonts/marker.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/marker.fnt -------------------------------------------------------------------------------- /fonts/meteo.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/meteo.fnt -------------------------------------------------------------------------------- /fonts/misc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/misc.fnt -------------------------------------------------------------------------------- /fonts/music.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/music.fnt -------------------------------------------------------------------------------- /fonts/romanc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romanc.fnt -------------------------------------------------------------------------------- /fonts/romancs.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romancs.fnt -------------------------------------------------------------------------------- /fonts/romand.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romand.fnt -------------------------------------------------------------------------------- /fonts/romanp.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romanp.fnt -------------------------------------------------------------------------------- /fonts/romans.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romans.fnt -------------------------------------------------------------------------------- /fonts/romant.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/romant.fnt -------------------------------------------------------------------------------- /fonts/scriptc.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/scriptc.fnt -------------------------------------------------------------------------------- /fonts/scripts.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/scripts.fnt -------------------------------------------------------------------------------- /fonts/symbol.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/symbol.fnt -------------------------------------------------------------------------------- /fonts/uppmat.fnt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/fonts/uppmat.fnt -------------------------------------------------------------------------------- /frozen/vga1_16x16.py: -------------------------------------------------------------------------------- 1 | WIDTH = 16 2 | HEIGHT = 16 3 | FIRST = 0x20 4 | LAST = 0x7f 5 | _FONT = \ 6 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 7 | b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 9 | b'\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00'\ 10 | b'\x00\x00\x01\x80\x0f\xf0\x39\x9c\x71\x8e\x71\x80\x39\x80\x0f\xf0\x01\x9c\x01\x8e\x71\x8e\x39\x9c\x0f\xf0\x01\x80\x00\x00\x00\x00'\ 11 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x1c\x1e\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x3c\x1c\x3c\x00\x00\x00\x00\x00\x00'\ 12 | b'\x00\x00\x00\x00\x07\xc0\x1c\x70\x38\x38\x1c\x70\x07\xc0\x0f\xce\x38\xfc\x70\x78\x70\x78\x38\xfc\x0f\xce\x00\x00\x00\x00\x00\x00'\ 13 | b'\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 14 | b'\x00\x00\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00'\ 15 | b'\x00\x00\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\ 16 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x38\x03\xe0\x3f\xfe\x03\xe0\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 17 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 18 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\x80\x07\x00\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 20 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 22 | b'\x00\x00\x00\x00\x07\xe0\x1c\x38\x38\x3c\x38\x7c\x38\xdc\x39\x9c\x3b\x1c\x3e\x1c\x3c\x1c\x1c\x38\x07\xe0\x00\x00\x00\x00\x00\x00'\ 23 | b'\x00\x00\x00\x00\x01\xc0\x03\xc0\x0f\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 24 | b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x00\x0e\x00\x0e\x00\x1c\x00\x70\x01\xc0\x07\x00\x1c\x00\x38\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\ 25 | b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x00\x0e\x00\x0e\x00\x1c\x01\xf0\x00\x1c\x00\x0e\x00\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 26 | b'\x00\x00\x00\x00\x01\xf0\x03\xf0\x07\x70\x0e\x70\x1c\x70\x38\x70\x3f\xfc\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x00\x00\x00'\ 27 | b'\x00\x00\x00\x00\x3f\xfe\x38\x00\x38\x00\x38\x00\x3f\xf0\x00\x1c\x00\x0e\x00\x0e\x00\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 28 | b'\x00\x00\x00\x00\x07\xf0\x1c\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 29 | b'\x00\x00\x00\x00\x3f\xf8\x00\x38\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00'\ 30 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 31 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x1c\x0e\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 32 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x0e\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x70\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x00\x07\xe0\x1c\x38\x38\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 38 | b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x70\x0e\x71\xfe\x73\x8e\x73\x8e\x73\x8e\x71\xfc\x70\x00\x38\x00\x0f\xfc\x00\x00\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x00\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x38\x1c\x3f\xfc\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\ 40 | b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x00\x00\x00\x00\x00\x00'\ 41 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 42 | b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x00\x00\x00\x00\x00\x00'\ 43 | b'\x00\x00\x00\x00\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 44 | b'\x00\x00\x00\x00\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\ 45 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x3e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 46 | b'\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xfe\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00'\ 47 | b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 48 | b'\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x1c\x1c\x0e\x38\x03\xe0\x00\x00\x00\x00\x00\x00'\ 49 | b'\x00\x00\x00\x00\x1c\x38\x1c\x70\x1c\xe0\x1d\xc0\x1f\x80\x1f\x80\x1d\xc0\x1c\xe0\x1c\x70\x1c\x38\x1c\x1c\x00\x00\x00\x00\x00\x00'\ 50 | b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 51 | b'\x00\x00\x00\x00\x78\x1e\x7c\x3e\x7e\x7e\x77\xee\x73\xce\x71\x8e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x00\x00\x00\x00\x00\x00'\ 52 | b'\x00\x00\x00\x00\x38\x0e\x3c\x0e\x3e\x0e\x3f\x0e\x3b\x8e\x39\xce\x38\xee\x38\x7e\x38\x3e\x38\x1e\x38\x0e\x00\x00\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 54 | b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\ 55 | b'\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\xee\x1c\x7c\x07\xf8\x00\x1c\x00\x00\x00\x00'\ 56 | b'\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\xe0\x38\x70\x38\x38\x38\x1c\x38\x0e\x00\x00\x00\x00\x00\x00'\ 57 | b'\x00\x00\x00\x00\x0f\xf0\x38\x1c\x70\x0e\x70\x00\x38\x00\x0f\xf0\x00\x1c\x00\x0e\x70\x0e\x38\x1c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 58 | b'\x00\x00\x00\x00\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 59 | b'\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 60 | b'\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 61 | b'\x00\x00\x00\x00\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x71\x8e\x73\xce\x77\xee\x3e\x7c\x1c\x38\x00\x00\x00\x00\x00\x00'\ 62 | b'\x00\x00\x00\x00\x38\x1c\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\ 63 | b'\x00\x00\x00\x00\x38\x0e\x1c\x1c\x0e\x38\x07\x70\x03\xe0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 64 | b'\x00\x00\x00\x00\x3f\xfe\x00\x1c\x00\x38\x00\x70\x00\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x1c\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\ 65 | b'\x00\x00\x00\x00\x07\xf0\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\xf0\x00\x00\x00\x00\x00\x00'\ 66 | b'\x00\x00\x00\x00\x00\x00\x1c\x00\x0e\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x70\x00\x38\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x00\x07\xf0\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x07\xf0\x00\x00\x00\x00\x00\x00'\ 68 | b'\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 69 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00'\ 70 | b'\x00\x00\x07\x00\x03\x80\x01\xc0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 71 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x00\x0e\x0f\xfe\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xf8\x00\x00\x00\x00\x00\x00'\ 73 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x0e\x0f\xf8\x00\x00\x00\x00\x00\x00'\ 74 | b'\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x07\xfe\x1c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x00\x00\x00\x00\x00'\ 75 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x0e\x3f\xfe\x38\x00\x38\x00\x0f\xfc\x00\x00\x00\x00\x00\x00'\ 76 | b'\x00\x00\x00\x00\x00\xf8\x03\x80\x03\x80\x03\x80\x03\x80\x0f\xf0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00'\ 77 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x00\x0e\x00\x0e\x1f\xf8\x00\x00'\ 78 | b'\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3b\xf8\x3c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00'\ 79 | b'\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 80 | b'\x00\x00\x00\x00\x00\x00\x00\x70\x00\x70\x00\x00\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\xe0\x0f\x80\x00\x00'\ 81 | b'\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x38\x0e\x70\x0e\xe0\x0f\xc0\x0e\xe0\x0e\x70\x0e\x38\x00\x00\x00\x00\x00\x00'\ 82 | b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 83 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x78\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x00\x00\x00\x00\x00\x00'\ 84 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xe0\x38\x38\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00'\ 85 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 86 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x0e\x38\x0e\x38\x1c\x3f\xf0\x38\x00\x38\x00\x38\x00\x00\x00'\ 87 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xfe\x1c\x0e\x38\x0e\x38\x0e\x1c\x0e\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x00'\ 88 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x38\x1c\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00'\ 89 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfc\x38\x00\x38\x00\x0f\xf8\x00\x0e\x00\x0e\x1f\xf8\x00\x00\x00\x00\x00\x00'\ 90 | b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x1f\xfc\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 91 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x0f\xfc\x00\x00\x00\x00\x00\x00'\ 92 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x0e\x38\x1c\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x01\x80\x00\x00\x00\x00\x00\x00'\ 93 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x39\xce\x3b\xee\x1f\x7c\x0e\x38\x00\x00\x00\x00\x00\x00'\ 94 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x0e\x70\x07\xe0\x03\xc0\x07\xe0\x0e\x70\x1c\x38\x00\x00\x00\x00\x00\x00'\ 95 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x1c\x1c\x0e\x38\x07\x70\x03\xe0\x01\xc0\x03\x80\x07\x00\x0e\x00\x00\x00'\ 96 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x00\x1c\x00\x70\x01\xc0\x07\x00\x1c\x00\x3f\xfe\x00\x00\x00\x00\x00\x00'\ 97 | b'\x00\x00\x00\x00\x00\xf8\x01\xc0\x03\x80\x03\x80\x03\x80\x1e\x00\x03\x80\x03\x80\x03\x80\x01\xc0\x00\xf8\x00\x00\x00\x00\x00\x00'\ 98 | b'\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00'\ 99 | b'\x00\x00\x00\x00\x1f\x00\x03\x80\x01\xc0\x01\xc0\x01\xc0\x00\x78\x01\xc0\x01\xc0\x01\xc0\x03\x80\x1f\x00\x00\x00\x00\x00\x00\x00'\ 100 | b'\x00\x00\x00\x00\x07\x9e\x3c\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 101 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x07\x70\x1c\x1c\x70\x07\x70\x07\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | 103 | FONT = memoryview(_FONT) 104 | 105 | -------------------------------------------------------------------------------- /frozen/vga1_16x32.py: -------------------------------------------------------------------------------- 1 | WIDTH = 16 2 | HEIGHT = 32 3 | FIRST = 0x20 4 | LAST = 0x7f 5 | _FONT = \ 6 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x00\x00\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 9 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 10 | b'\x00\x00\x00\x00\x01\x80\x01\x80\x0f\xf0\x0f\xf0\x39\x9c\x39\x9c\x71\x8e\x71\x8e\x71\x80\x71\x80\x39\x80\x39\x80\x0f\xf0\x0f\xf0\x01\x9c\x01\x9c\x01\x8e\x01\x8e\x71\x8e\x71\x8e\x39\x9c\x39\x9c\x0f\xf0\x0f\xf0\x01\x80\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00'\ 11 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x1c\x1e\x1c\x1e\x38\x1e\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x0e\x3c\x0e\x3c\x1c\x3c\x1c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 12 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xc0\x07\xc0\x1c\x70\x1c\x70\x38\x38\x38\x38\x1c\x70\x1c\x70\x07\xc0\x07\xc0\x0f\xce\x0f\xce\x38\xfc\x38\xfc\x70\x78\x70\x78\x70\x78\x70\x78\x38\xfc\x38\xfc\x0f\xce\x0f\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 13 | b'\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 14 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 15 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 16 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x38\x0e\x38\x03\xe0\x03\xe0\x3f\xfe\x3f\xfe\x03\xe0\x03\xe0\x0e\x38\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 17 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x3f\xfe\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 18 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 20 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x38\x00\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 22 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\x07\xe0\x1c\x38\x1c\x38\x38\x3c\x38\x3c\x38\x7c\x38\x7c\x38\xdc\x38\xdc\x39\x9c\x39\x9c\x3b\x1c\x3b\x1c\x3e\x1c\x3e\x1c\x3c\x1c\x3c\x1c\x1c\x38\x1c\x38\x07\xe0\x07\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 23 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x03\xc0\x03\xc0\x0f\xc0\x0f\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 24 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x38\x1c\x38\x1c\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x00\x70\x00\x70\x01\xc0\x01\xc0\x07\x00\x07\x00\x1c\x00\x1c\x00\x38\x00\x38\x00\x3f\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 25 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x38\x1c\x38\x1c\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x01\xf0\x01\xf0\x00\x1c\x00\x1c\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x38\x1c\x38\x1c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 26 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf0\x01\xf0\x03\xf0\x03\xf0\x07\x70\x07\x70\x0e\x70\x0e\x70\x1c\x70\x1c\x70\x38\x70\x38\x70\x3f\xfc\x3f\xfc\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 27 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x3f\xf0\x00\x1c\x00\x1c\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x38\x1c\x38\x1c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 28 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x00\x1c\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 29 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf8\x3f\xf8\x00\x38\x00\x38\x00\x38\x00\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 30 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 31 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x0e\x1c\x0e\x07\xfe\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 32 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x00\x0e\x00\x0e\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\x70\x00\x70\x00\x38\x00\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\x07\xe0\x1c\x38\x1c\x38\x38\x1c\x38\x1c\x00\x38\x00\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 38 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x38\x1c\x38\x1c\x70\x0e\x70\x0e\x71\xfe\x71\xfe\x73\x8e\x73\x8e\x73\x8e\x73\x8e\x73\x8e\x73\x8e\x71\xfc\x71\xfc\x70\x00\x70\x00\x38\x00\x38\x00\x0f\xfc\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0e\x70\x0e\x70\x1c\x38\x1c\x38\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x3f\xfc\x3f\xfc\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 40 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 41 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 42 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 43 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 44 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xe0\x3f\xe0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 45 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x3e\x38\x3e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 46 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xfe\x3f\xfe\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 47 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 48 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x1c\x1c\x1c\x1c\x0e\x38\x0e\x38\x03\xe0\x03\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 49 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x1c\x70\x1c\x70\x1c\xe0\x1c\xe0\x1d\xc0\x1d\xc0\x1f\x80\x1f\x80\x1f\x80\x1f\x80\x1d\xc0\x1d\xc0\x1c\xe0\x1c\xe0\x1c\x70\x1c\x70\x1c\x38\x1c\x38\x1c\x1c\x1c\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 50 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 51 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x7c\x3e\x7c\x3e\x7e\x7e\x7e\x7e\x77\xee\x77\xee\x73\xce\x73\xce\x71\x8e\x71\x8e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 52 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x3c\x0e\x3c\x0e\x3e\x0e\x3e\x0e\x3f\x0e\x3f\x0e\x3b\x8e\x3b\x8e\x39\xce\x39\xce\x38\xee\x38\xee\x38\x7e\x38\x7e\x38\x3e\x38\x3e\x38\x1e\x38\x1e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 54 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 55 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\xee\x38\xee\x1c\x7c\x1c\x7c\x07\xf8\x07\xf8\x00\x1c\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00'\ 56 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x38\xe0\x38\xe0\x38\x70\x38\x70\x38\x38\x38\x38\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 57 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x38\x1c\x38\x1c\x70\x0e\x70\x0e\x70\x00\x70\x00\x38\x00\x38\x00\x0f\xf0\x0f\xf0\x00\x1c\x00\x1c\x00\x0e\x00\x0e\x70\x0e\x70\x0e\x38\x1c\x38\x1c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 58 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 59 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 60 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x1c\x38\x1c\x38\x0e\x70\x0e\x70\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 61 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x70\x0e\x71\x8e\x71\x8e\x73\xce\x73\xce\x77\xee\x77\xee\x3e\x7c\x3e\x7c\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 62 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x1c\x38\x1c\x38\x0e\x70\x0e\x70\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0e\x70\x0e\x70\x1c\x38\x1c\x38\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 63 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x0e\x38\x0e\x38\x07\x70\x07\x70\x03\xe0\x03\xe0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 64 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x00\x1c\x00\x1c\x00\x38\x00\x38\x00\x70\x00\x70\x00\xe0\x00\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x00\x3f\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 65 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 66 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x0e\x00\x0e\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\x70\x00\x70\x00\x38\x00\x38\x00\x1c\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 68 | b'\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0e\x70\x0e\x70\x1c\x38\x1c\x38\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 69 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00'\ 70 | b'\x00\x00\x00\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 71 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x00\x0e\x00\x0e\x0f\xfe\x0f\xfe\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x0f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xf8\x3f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 73 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x38\x0e\x38\x0e\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x0e\x38\x0e\x0f\xf8\x0f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 74 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x07\xfe\x07\xfe\x1c\x0e\x1c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x0f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 75 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x3f\xfe\x3f\xfe\x38\x00\x38\x00\x38\x00\x38\x00\x0f\xfc\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 76 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x0f\xf0\x0f\xf0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 77 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x0f\xfe\x0f\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x1f\xf8\x1f\xf8\x00\x00\x00\x00'\ 78 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3b\xf8\x3b\xf8\x3c\x0e\x3c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 79 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 80 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x00\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\xe0\x00\xe0\x0f\x80\x0f\x80\x00\x00\x00\x00'\ 81 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x38\x0e\x38\x0e\x70\x0e\x70\x0e\xe0\x0e\xe0\x0f\xc0\x0f\xc0\x0e\xe0\x0e\xe0\x0e\x70\x0e\x70\x0e\x38\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 82 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 83 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x78\x3e\x78\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x39\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 84 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xe0\x3f\xe0\x38\x38\x38\x38\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 85 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1c\x1c\x1c\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 86 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x1c\x38\x1c\x3f\xf0\x3f\xf0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00'\ 87 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xfe\x07\xfe\x1c\x0e\x1c\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x1c\x0e\x1c\x0e\x07\xfe\x07\xfe\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x00\x00\x00'\ 88 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xf0\x3f\xf0\x38\x1c\x38\x1c\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 89 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfc\x0f\xfc\x38\x00\x38\x00\x38\x00\x38\x00\x0f\xf8\x0f\xf8\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x1f\xf8\x1f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 90 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x1f\xfc\x1f\xfc\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 91 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x0f\xfc\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 92 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x0e\x70\x0e\x38\x1c\x38\x1c\x1c\x38\x1c\x38\x0e\x70\x0e\x70\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x01\x80\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 93 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x38\x0e\x39\xce\x39\xce\x3b\xee\x3b\xee\x1f\x7c\x1f\x7c\x0e\x38\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 94 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x0e\x70\x0e\x70\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0e\x70\x0e\x70\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 95 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x0e\x38\x0e\x1c\x1c\x1c\x1c\x0e\x38\x0e\x38\x07\x70\x07\x70\x03\xe0\x03\xe0\x01\xc0\x01\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x0e\x00\x0e\x00\x00\x00\x00\x00'\ 96 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x00\x1c\x00\x1c\x00\x70\x00\x70\x01\xc0\x01\xc0\x07\x00\x07\x00\x1c\x00\x1c\x00\x3f\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 97 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x01\xc0\x01\xc0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x1e\x00\x1e\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x01\xc0\x01\xc0\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 98 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 99 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x1f\x00\x03\x80\x03\x80\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x00\x78\x00\x78\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x01\xc0\x03\x80\x03\x80\x1f\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 100 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\x9e\x07\x9e\x3c\xf0\x3c\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 101 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x01\xc0\x07\x70\x07\x70\x1c\x1c\x1c\x1c\x70\x07\x70\x07\x70\x07\x70\x07\x7f\xff\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | 103 | FONT = memoryview(_FONT) 104 | 105 | -------------------------------------------------------------------------------- /frozen/vga1_8x16.py: -------------------------------------------------------------------------------- 1 | """converted from vga_8x16.bin """ 2 | WIDTH = 8 3 | HEIGHT = 16 4 | FIRST = 0x20 5 | LAST = 0x7f 6 | _FONT =\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00'\ 9 | b'\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 10 | b'\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00'\ 11 | b'\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00'\ 12 | b'\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00'\ 13 | b'\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 14 | b'\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 15 | b'\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00'\ 16 | b'\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00'\ 17 | b'\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00'\ 18 | b'\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00'\ 20 | b'\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00'\ 22 | b'\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00'\ 23 | b'\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00'\ 24 | b'\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00'\ 25 | b'\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00'\ 26 | b'\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00'\ 27 | b'\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00'\ 28 | b'\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00'\ 29 | b'\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 30 | b'\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00'\ 31 | b'\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 32 | b'\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00'\ 38 | b'\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00'\ 40 | b'\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 41 | b'\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00'\ 42 | b'\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00'\ 43 | b'\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00'\ 44 | b'\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00'\ 45 | b'\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00'\ 46 | b'\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00'\ 47 | b'\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 48 | b'\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 49 | b'\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00'\ 50 | b'\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00'\ 51 | b'\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00'\ 52 | b'\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 53 | b'\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 54 | b'\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 55 | b'\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00'\ 56 | b'\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00'\ 57 | b'\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00'\ 58 | b'\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00'\ 59 | b'\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 60 | b'\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 61 | b'\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00'\ 62 | b'\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00'\ 63 | b'\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00'\ 64 | b'\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 65 | b'\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00'\ 66 | b'\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00'\ 68 | b'\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00'\ 69 | b'\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 70 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00'\ 71 | b'\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 73 | b'\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00'\ 74 | b'\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 75 | b'\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 76 | b'\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 77 | b'\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00'\ 78 | b'\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00'\ 79 | b'\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00'\ 80 | b'\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 81 | b'\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00'\ 82 | b'\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00'\ 83 | b'\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 84 | b'\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00'\ 85 | b'\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00'\ 86 | b'\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 87 | b'\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00'\ 88 | b'\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00'\ 89 | b'\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00'\ 90 | b'\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00'\ 91 | b'\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00'\ 92 | b'\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 93 | b'\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00'\ 94 | b'\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00'\ 95 | b'\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00'\ 96 | b'\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00'\ 97 | b'\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00'\ 98 | b'\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00'\ 99 | b'\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00'\ 100 | b'\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00'\ 101 | b'\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | b'\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00'\ 103 | 104 | FONT = memoryview(_FONT) 105 | -------------------------------------------------------------------------------- /frozen/vga1_8x8.py: -------------------------------------------------------------------------------- 1 | """converted from vga_8x8.bin """ 2 | WIDTH = 8 3 | HEIGHT = 8 4 | FIRST = 0x20 5 | LAST = 0x7f 6 | _FONT =\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x18\x3c\x3c\x18\x18\x00\x18\x00'\ 9 | b'\x66\x66\x24\x00\x00\x00\x00\x00'\ 10 | b'\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00'\ 11 | b'\x18\x3e\x60\x3c\x06\x7c\x18\x00'\ 12 | b'\x00\xc6\xcc\x18\x30\x66\xc6\x00'\ 13 | b'\x38\x6c\x38\x76\xdc\xcc\x76\x00'\ 14 | b'\x18\x18\x30\x00\x00\x00\x00\x00'\ 15 | b'\x0c\x18\x30\x30\x30\x18\x0c\x00'\ 16 | b'\x30\x18\x0c\x0c\x0c\x18\x30\x00'\ 17 | b'\x00\x66\x3c\xff\x3c\x66\x00\x00'\ 18 | b'\x00\x18\x18\x7e\x18\x18\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x18\x18\x30'\ 20 | b'\x00\x00\x00\x7e\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x18\x18\x00'\ 22 | b'\x06\x0c\x18\x30\x60\xc0\x80\x00'\ 23 | b'\x38\x6c\xc6\xd6\xc6\x6c\x38\x00'\ 24 | b'\x18\x38\x18\x18\x18\x18\x7e\x00'\ 25 | b'\x7c\xc6\x06\x1c\x30\x66\xfe\x00'\ 26 | b'\x7c\xc6\x06\x3c\x06\xc6\x7c\x00'\ 27 | b'\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00'\ 28 | b'\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00'\ 29 | b'\x38\x60\xc0\xfc\xc6\xc6\x7c\x00'\ 30 | b'\xfe\xc6\x0c\x18\x30\x30\x30\x00'\ 31 | b'\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00'\ 32 | b'\x7c\xc6\xc6\x7e\x06\x0c\x78\x00'\ 33 | b'\x00\x18\x18\x00\x00\x18\x18\x00'\ 34 | b'\x00\x18\x18\x00\x00\x18\x18\x30'\ 35 | b'\x06\x0c\x18\x30\x18\x0c\x06\x00'\ 36 | b'\x00\x00\x7e\x00\x00\x7e\x00\x00'\ 37 | b'\x60\x30\x18\x0c\x18\x30\x60\x00'\ 38 | b'\x7c\xc6\x0c\x18\x18\x00\x18\x00'\ 39 | b'\x7c\xc6\xde\xde\xde\xc0\x78\x00'\ 40 | b'\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00'\ 41 | b'\xfc\x66\x66\x7c\x66\x66\xfc\x00'\ 42 | b'\x3c\x66\xc0\xc0\xc0\x66\x3c\x00'\ 43 | b'\xf8\x6c\x66\x66\x66\x6c\xf8\x00'\ 44 | b'\xfe\x62\x68\x78\x68\x62\xfe\x00'\ 45 | b'\xfe\x62\x68\x78\x68\x60\xf0\x00'\ 46 | b'\x3c\x66\xc0\xc0\xce\x66\x3a\x00'\ 47 | b'\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00'\ 48 | b'\x3c\x18\x18\x18\x18\x18\x3c\x00'\ 49 | b'\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00'\ 50 | b'\xe6\x66\x6c\x78\x6c\x66\xe6\x00'\ 51 | b'\xf0\x60\x60\x60\x62\x66\xfe\x00'\ 52 | b'\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00'\ 53 | b'\xc6\xe6\xf6\xde\xce\xc6\xc6\x00'\ 54 | b'\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00'\ 55 | b'\xfc\x66\x66\x7c\x60\x60\xf0\x00'\ 56 | b'\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e'\ 57 | b'\xfc\x66\x66\x7c\x6c\x66\xe6\x00'\ 58 | b'\x3c\x66\x30\x18\x0c\x66\x3c\x00'\ 59 | b'\x7e\x7e\x5a\x18\x18\x18\x3c\x00'\ 60 | b'\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00'\ 61 | b'\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00'\ 62 | b'\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00'\ 63 | b'\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00'\ 64 | b'\x66\x66\x66\x3c\x18\x18\x3c\x00'\ 65 | b'\xfe\xc6\x8c\x18\x32\x66\xfe\x00'\ 66 | b'\x3c\x30\x30\x30\x30\x30\x3c\x00'\ 67 | b'\xc0\x60\x30\x18\x0c\x06\x02\x00'\ 68 | b'\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00'\ 69 | b'\x10\x38\x6c\xc6\x00\x00\x00\x00'\ 70 | b'\x00\x00\x00\x00\x00\x00\x00\xff'\ 71 | b'\x30\x18\x0c\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x78\x0c\x7c\xcc\x76\x00'\ 73 | b'\xe0\x60\x7c\x66\x66\x66\xdc\x00'\ 74 | b'\x00\x00\x7c\xc6\xc0\xc6\x7c\x00'\ 75 | b'\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00'\ 76 | b'\x00\x00\x7c\xc6\xfe\xc0\x7c\x00'\ 77 | b'\x3c\x66\x60\xf8\x60\x60\xf0\x00'\ 78 | b'\x00\x00\x76\xcc\xcc\x7c\x0c\xf8'\ 79 | b'\xe0\x60\x6c\x76\x66\x66\xe6\x00'\ 80 | b'\x18\x00\x38\x18\x18\x18\x3c\x00'\ 81 | b'\x06\x00\x06\x06\x06\x66\x66\x3c'\ 82 | b'\xe0\x60\x66\x6c\x78\x6c\xe6\x00'\ 83 | b'\x38\x18\x18\x18\x18\x18\x3c\x00'\ 84 | b'\x00\x00\xec\xfe\xd6\xd6\xd6\x00'\ 85 | b'\x00\x00\xdc\x66\x66\x66\x66\x00'\ 86 | b'\x00\x00\x7c\xc6\xc6\xc6\x7c\x00'\ 87 | b'\x00\x00\xdc\x66\x66\x7c\x60\xf0'\ 88 | b'\x00\x00\x76\xcc\xcc\x7c\x0c\x1e'\ 89 | b'\x00\x00\xdc\x76\x60\x60\xf0\x00'\ 90 | b'\x00\x00\x7e\xc0\x7c\x06\xfc\x00'\ 91 | b'\x30\x30\xfc\x30\x30\x36\x1c\x00'\ 92 | b'\x00\x00\xcc\xcc\xcc\xcc\x76\x00'\ 93 | b'\x00\x00\xc6\xc6\xc6\x6c\x38\x00'\ 94 | b'\x00\x00\xc6\xd6\xd6\xfe\x6c\x00'\ 95 | b'\x00\x00\xc6\x6c\x38\x6c\xc6\x00'\ 96 | b'\x00\x00\xc6\xc6\xc6\x7e\x06\xfc'\ 97 | b'\x00\x00\x7e\x4c\x18\x32\x7e\x00'\ 98 | b'\x0e\x18\x18\x70\x18\x18\x0e\x00'\ 99 | b'\x18\x18\x18\x18\x18\x18\x18\x00'\ 100 | b'\x70\x18\x18\x0e\x18\x18\x70\x00'\ 101 | b'\x76\xdc\x00\x00\x00\x00\x00\x00'\ 102 | b'\x00\x10\x38\x6c\xc6\xc6\xfe\x00'\ 103 | 104 | FONT = memoryview(_FONT) 105 | -------------------------------------------------------------------------------- /frozen/vga1_bold_16x16.py: -------------------------------------------------------------------------------- 1 | WIDTH = 16 2 | HEIGHT = 16 3 | FIRST = 0x20 4 | LAST = 0x7f 5 | _FONT = \ 6 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 7 | b'\x00\x00\x00\x00\x03\xc0\x07\xe0\x0f\xf0\x0f\xf0\x0f\xf0\x07\xe0\x03\xc0\x03\xc0\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x3c\x3c\x3c\x3c\x1c\x38\x0c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 9 | b'\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00'\ 10 | b'\x03\xc0\x03\xc0\x07\xe0\x1e\x78\x3c\x3c\x3c\x00\x1e\x00\x07\xe0\x00\x78\x00\x3c\x3c\x3c\x1e\x78\x07\xe0\x03\xc0\x03\xc0\x00\x00'\ 11 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x78\x00\xf0\x01\xe0\x03\xc0\x07\x80\x0f\x00\x1e\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00'\ 12 | b'\x00\x00\x00\x00\x07\xc0\x1e\xf0\x3c\x78\x1e\xf0\x07\xc0\x0f\x9e\x3f\xfc\x78\xf8\x78\x78\x3c\xfc\x0f\x9e\x00\x00\x00\x00\x00\x00'\ 13 | b'\x00\x00\x0f\x00\x0f\x00\x0f\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 14 | b'\x00\x00\x00\x00\x01\xe0\x03\xc0\x07\x80\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x07\x80\x03\xc0\x01\xe0\x00\x00\x00\x00\x00\x00'\ 15 | b'\x00\x00\x00\x00\x01\xe0\x00\xf0\x00\x78\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x78\x00\xf0\x01\xe0\x00\x00\x00\x00\x00\x00'\ 16 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x0f\xf0\x7f\xfe\x0f\xf0\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 17 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x7f\xfe\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 18 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\x80\x07\x00\x00\x00\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 20 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x78\x00\xf0\x01\xe0\x03\xc0\x07\x80\x0f\x00\x1e\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 22 | b'\x00\x00\x00\x00\x07\xe0\x1e\x78\x3c\x3c\x3c\x7c\x3c\xfc\x3d\xbc\x3f\x3c\x3e\x3c\x3c\x3c\x1e\x78\x07\xe0\x00\x00\x00\x00\x00\x00'\ 23 | b'\x00\x00\x00\x00\x03\xc0\x0f\xc0\x3f\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 24 | b'\x00\x00\x00\x00\x0f\xe0\x3c\x78\x00\x3c\x00\x3c\x00\x78\x00\xf0\x03\xc0\x0f\x00\x1e\x00\x3c\x3c\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 25 | b'\x00\x00\x00\x00\x0f\xf0\x3c\x3c\x00\x1e\x00\x1e\x00\x3c\x03\xf0\x00\x3c\x00\x1e\x00\x1e\x3c\x3c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 26 | b'\x00\x00\x00\x00\x01\xf0\x03\xf0\x07\xf0\x0f\xf0\x1e\xf0\x3c\xf0\x3f\xfc\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x00\x00\x00\x00\x00\x00'\ 27 | b'\x00\x00\x00\x00\x3f\xfe\x3c\x00\x3c\x00\x3c\x00\x3f\xf0\x00\x3c\x00\x1e\x00\x1e\x00\x1e\x3c\x3c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 28 | b'\x00\x00\x00\x00\x07\xf0\x1e\x00\x3c\x00\x3c\x00\x3c\x00\x3f\xf0\x3c\x3c\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 29 | b'\x00\x00\x00\x00\x3f\xfc\x3c\x3c\x00\x3c\x00\x78\x00\xf0\x01\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 30 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 31 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x1e\x1e\x07\xfe\x00\x1e\x00\x1e\x00\x1e\x00\x3c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 32 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x07\x80\x00\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x01\xe0\x03\xc0\x07\x80\x0f\x00\x1e\x00\x3c\x00\x1e\x00\x0f\x00\x07\x80\x03\xc0\x01\xe0\x00\x00\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x07\x80\x03\xc0\x01\xe0\x00\xf0\x00\x78\x00\x3c\x00\x78\x00\xf0\x01\xe0\x03\xc0\x07\x80\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x00\x07\xe0\x1e\x78\x3c\x3c\x00\x78\x00\xf0\x01\xe0\x03\xc0\x03\xc0\x00\x00\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 38 | b'\x00\x00\x00\x00\x0f\xfc\x3c\x1e\x78\x1e\x79\xfe\x7b\x8e\x7b\x8e\x7b\x8e\x79\xfc\x78\x00\x3c\x00\x0f\xfc\x00\x00\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x00\x03\xc0\x07\xe0\x0f\xf0\x1e\x78\x3c\x3c\x3c\x3c\x3f\xfc\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00'\ 40 | b'\x00\x00\x00\x00\x7f\xf0\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x3c\x1f\xf0\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x3c\x7f\xf0\x00\x00\x00\x00\x00\x00'\ 41 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 42 | b'\x00\x00\x00\x00\x7f\xf0\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x7f\xf0\x00\x00\x00\x00\x00\x00'\ 43 | b'\x00\x00\x00\x00\x7f\xfe\x1e\x0e\x1e\x06\x1e\x00\x1e\x60\x1f\xe0\x1e\x60\x1e\x00\x1e\x06\x1e\x0e\x7f\xfe\x00\x00\x00\x00\x00\x00'\ 44 | b'\x00\x00\x00\x00\x7f\xfe\x1e\x0e\x1e\x06\x1e\x00\x1e\x60\x1f\xe0\x1e\x60\x1e\x00\x1e\x00\x1e\x00\x7f\x80\x00\x00\x00\x00\x00\x00'\ 45 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x7e\x3c\x1e\x3c\x1e\x1e\x3e\x07\xf6\x00\x00\x00\x00\x00\x00'\ 46 | b'\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3f\xfe\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x00\x00\x00\x00\x00\x00'\ 47 | b'\x00\x00\x00\x00\x0f\xf0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 48 | b'\x00\x00\x00\x00\x03\xfe\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x3c\x78\x1f\xf0\x07\xc0\x00\x00\x00\x00\x00\x00'\ 49 | b'\x00\x00\x00\x00\x7e\x3c\x1e\x78\x1e\xf0\x1f\xe0\x1f\xc0\x1f\xc0\x1f\xe0\x1e\xf0\x1e\x78\x1e\x3c\x7e\x1e\x00\x00\x00\x00\x00\x00'\ 50 | b'\x00\x00\x00\x00\x7f\x80\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x06\x1e\x0e\x7f\xfe\x00\x00\x00\x00\x00\x00'\ 51 | b'\x00\x00\x00\x00\x78\x1e\x7c\x3e\x7e\x7e\x7f\xfe\x7b\xde\x79\x9e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x00\x00\x00\x00\x00\x00'\ 52 | b'\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3e\x1e\x3f\x1e\x3f\x9e\x3d\xde\x3c\xfe\x3c\x7e\x3c\x3e\x3c\x1e\x3c\x1e\x00\x00\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 54 | b'\x00\x00\x00\x00\x7f\xf0\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x3c\x1f\xf0\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x7f\x80\x00\x00\x00\x00\x00\x00'\ 55 | b'\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3d\xde\x3c\xfe\x1e\x7c\x07\xf8\x00\x1c\x00\x00\x00\x00'\ 56 | b'\x00\x00\x00\x00\x7f\xf0\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x3c\x1f\xf0\x1f\xe0\x1e\xf0\x1e\x78\x1e\x3c\x7e\x1e\x00\x00\x00\x00\x00\x00'\ 57 | b'\x00\x00\x00\x00\x0f\xf0\x3c\x3c\x78\x1e\x3c\x00\x0f\x00\x03\xc0\x00\xf0\x00\x3c\x78\x1e\x3c\x3c\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 58 | b'\x00\x00\x00\x00\x7f\xfe\x73\xce\x63\xc6\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 59 | b'\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 60 | b'\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1e\x78\x0f\xf0\x07\xe0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 61 | b'\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x79\x9e\x7b\xde\x7f\xfe\x3e\x7c\x1c\x38\x00\x00\x00\x00\x00\x00'\ 62 | b'\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x1e\x78\x0f\xf0\x07\xe0\x03\xc0\x07\xe0\x0f\xf0\x1e\x78\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00'\ 63 | b'\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1e\x78\x0f\xf0\x07\xe0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 64 | b'\x00\x00\x00\x00\x3f\xfc\x38\x3c\x30\x78\x00\xf0\x01\xe0\x03\xc0\x07\x80\x0f\x00\x1e\x0c\x3c\x1c\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 65 | b'\x00\x00\x00\x00\x0f\xf0\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 66 | b'\x00\x00\x00\x00\x00\x00\x3c\x00\x1e\x00\x0f\x00\x07\x80\x03\xc0\x01\xe0\x00\xf0\x00\x78\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x00\x0f\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00'\ 68 | b'\x03\xc0\x07\xe0\x0f\xf0\x1e\x78\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 69 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00'\ 70 | b'\x03\xc0\x03\xc0\x01\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 71 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xe0\x00\x78\x0f\xf8\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x00\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x00\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\xf0\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x3c\xf8\x00\x00\x00\x00\x00\x00'\ 73 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x1e\x0f\xf8\x00\x00\x00\x00\x00\x00'\ 74 | b'\x00\x00\x00\x00\x01\xf8\x00\x78\x00\x78\x00\x78\x07\xf8\x1e\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x00\x00\x00\x00\x00\x00'\ 75 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x3c\x1e\x3c\x1e\x3f\xfe\x3c\x00\x3c\x1e\x0f\xf8\x00\x00\x00\x00\x00\x00'\ 76 | b'\x00\x00\x00\x00\x03\xf0\x0f\x3c\x0f\x0c\x0f\x00\x0f\x00\x3f\xf0\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xc0\x00\x00\x00\x00\x00\x00'\ 77 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x9e\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\xf8\x00\x78\x3c\x78\x0f\xe0\x00\x00'\ 78 | b'\x00\x00\x00\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x78\x0f\x9e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x3f\x1e\x00\x00\x00\x00\x00\x00'\ 79 | b'\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\x00\x03\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x00\x00\x00\x00\x00\x00'\ 80 | b'\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x00\x00\xfc\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x3c\x3c\x1e\x78\x07\xe0\x00\x00'\ 81 | b'\x00\x00\x00\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x1e\x0f\x3c\x0f\x78\x0f\xf0\x0f\x78\x0f\x3c\x3f\x1e\x00\x00\x00\x00\x00\x00'\ 82 | b'\x00\x00\x00\x00\x03\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x00\x00\x00\x00\x00\x00'\ 83 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7c\x7f\xfe\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x00\x00\x00\x00\x00\x00'\ 84 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf8\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x00\x00\x00\x00\x00\x00'\ 85 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x07\xf0\x00\x00\x00\x00\x00\x00'\ 86 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf0\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x3c\x0f\xf0\x0f\x00\x0f\x00\x3f\xc0\x00\x00'\ 87 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x9e\x1e\x78\x3c\x78\x3c\x78\x1e\x78\x07\xf8\x00\x78\x00\x78\x00\xfe\x00\x00'\ 88 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf8\x0f\x9e\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xc0\x00\x00\x00\x00\x00\x00'\ 89 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x3c\x1e\x3c\x00\x0f\xf8\x00\x1e\x3c\x1e\x0f\xf8\x00\x00\x00\x00\x00\x00'\ 90 | b'\x00\x00\x00\x00\x01\x80\x03\x80\x07\x80\x07\x80\x7f\xf8\x07\x80\x07\x80\x07\x80\x07\x80\x07\x9e\x01\xf8\x00\x00\x00\x00\x00\x00'\ 91 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x00\x00\x00\x00\x00\x00'\ 92 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x1e\x78\x07\xe0\x01\x80\x00\x00\x00\x00\x00\x00'\ 93 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x79\x9e\x7b\xde\x3f\xfc\x1e\x78\x00\x00\x00\x00\x00\x00'\ 94 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x0e\x70\x07\xe0\x03\xc0\x07\xe0\x0e\x70\x3c\x3c\x00\x00\x00\x00\x00\x00'\ 95 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x07\xfe\x00\x1e\x00\x3c\x0f\xf0\x00\x00'\ 96 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3c\x3c\x00\xf0\x03\xc0\x0f\x00\x3c\x3c\x3f\xfc\x00\x00\x00\x00\x00\x00'\ 97 | b'\x00\x00\x00\x00\x00\xfc\x01\xe0\x03\xc0\x03\xc0\x03\xc0\x3f\x80\x03\xc0\x03\xc0\x03\xc0\x01\xe0\x00\xfc\x00\x00\x00\x00\x00\x00'\ 98 | b'\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00'\ 99 | b'\x00\x00\x00\x00\x3f\x00\x07\x80\x03\xc0\x03\xc0\x03\xc0\x01\xfc\x03\xc0\x03\xc0\x03\xc0\x07\x80\x3f\x00\x00\x00\x00\x00\x00\x00'\ 100 | b'\x00\x00\x00\x00\x0f\x9e\x3c\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 101 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x03\xf0\x0f\x3c\x3c\x0f\x3c\x0f\x3f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | 103 | FONT = memoryview(_FONT) 104 | 105 | -------------------------------------------------------------------------------- /frozen/vga1_bold_16x32.py: -------------------------------------------------------------------------------- 1 | WIDTH = 16 2 | HEIGHT = 32 3 | FIRST = 0x20 4 | LAST = 0x7f 5 | _FONT = \ 6 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0f\xf0\x0f\xf0\x0f\xf0\x0f\xf0\x0f\xf0\x0f\xf0\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1c\x38\x1c\x38\x0c\x30\x0c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 9 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x7f\xfe\x7f\xfe\x1c\x38\x1c\x38\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 10 | b'\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x3c\x00\x3c\x00\x1e\x00\x1e\x00\x07\xe0\x07\xe0\x00\x78\x00\x78\x00\x3c\x00\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00'\ 11 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x78\x3c\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x0f\x00\x0f\x00\x1e\x3c\x1e\x3c\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 12 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xc0\x07\xc0\x1e\xf0\x1e\xf0\x3c\x78\x3c\x78\x1e\xf0\x1e\xf0\x07\xc0\x07\xc0\x0f\x9e\x0f\x9e\x3f\xfc\x3f\xfc\x78\xf8\x78\xf8\x78\x78\x78\x78\x3c\xfc\x3c\xfc\x0f\x9e\x0f\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 13 | b'\x00\x00\x00\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x1e\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 14 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x07\x80\x07\x80\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 15 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe0\x01\xe0\x00\xf0\x00\xf0\x00\x78\x00\x78\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 16 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x0f\xf0\x0f\xf0\x7f\xfe\x7f\xfe\x0f\xf0\x0f\xf0\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 17 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x7f\xfe\x7f\xfe\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 18 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\x80\x03\x80\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 19 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 20 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 21 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x0f\x00\x0f\x00\x1e\x00\x1e\x00\x3c\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 22 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\x07\xe0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x3c\x7c\x3c\x7c\x3c\xfc\x3c\xfc\x3d\xbc\x3d\xbc\x3f\x3c\x3f\x3c\x3e\x3c\x3e\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x07\xe0\x07\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 23 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x0f\xc0\x0f\xc0\x3f\xc0\x3f\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 24 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xe0\x0f\xe0\x3c\x78\x3c\x78\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x03\xc0\x03\xc0\x0f\x00\x0f\x00\x1e\x00\x1e\x00\x3c\x3c\x3c\x3c\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 25 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x3c\x3c\x3c\x3c\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x3c\x00\x3c\x03\xf0\x03\xf0\x00\x3c\x00\x3c\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x3c\x3c\x3c\x3c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 26 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf0\x01\xf0\x03\xf0\x03\xf0\x07\xf0\x07\xf0\x0f\xf0\x0f\xf0\x1e\xf0\x1e\xf0\x3c\xf0\x3c\xf0\x3f\xfc\x3f\xfc\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x03\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 27 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x3f\xfe\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3f\xf0\x3f\xf0\x00\x3c\x00\x3c\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x3c\x3c\x3c\x3c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 28 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x00\x1e\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3f\xf0\x3f\xf0\x3c\x3c\x3c\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 29 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x3c\x3c\x3c\x3c\x00\x3c\x00\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 30 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 31 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x07\xfe\x07\xfe\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x3c\x00\x3c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 32 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x07\x80\x07\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x0f\x00\x0f\x00\x1e\x00\x1e\x00\x3c\x00\x3c\x00\x1e\x00\x1e\x00\x0f\x00\x0f\x00\x07\x80\x07\x80\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\x80\x07\x80\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\xf0\x00\xf0\x00\x78\x00\x78\x00\x3c\x00\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\x07\xe0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x00\x78\x00\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 38 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfc\x0f\xfc\x3c\x1e\x3c\x1e\x78\x1e\x78\x1e\x79\xfe\x79\xfe\x7b\x8e\x7b\x8e\x7b\x8e\x7b\x8e\x7b\x8e\x7b\x8e\x79\xfc\x79\xfc\x78\x00\x78\x00\x3c\x00\x3c\x00\x0f\xfc\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0f\xf0\x0f\xf0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3f\xfc\x3f\xfc\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 40 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xf0\x7f\xf0\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x1e\x3c\x1f\xf0\x1f\xf0\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x1e\x3c\x7f\xf0\x7f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 41 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 42 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xf0\x7f\xf0\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x1e\x3c\x7f\xf0\x7f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 43 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x7f\xfe\x1e\x0e\x1e\x0e\x1e\x06\x1e\x06\x1e\x00\x1e\x00\x1e\x60\x1e\x60\x1f\xe0\x1f\xe0\x1e\x60\x1e\x60\x1e\x00\x1e\x00\x1e\x06\x1e\x06\x1e\x0e\x1e\x0e\x7f\xfe\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 44 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x7f\xfe\x1e\x0e\x1e\x0e\x1e\x06\x1e\x06\x1e\x00\x1e\x00\x1e\x60\x1e\x60\x1f\xe0\x1f\xe0\x1e\x60\x1e\x60\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x7f\x80\x7f\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 45 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x7e\x3c\x7e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3e\x1e\x3e\x07\xf6\x07\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 46 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3f\xfe\x3f\xfe\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 47 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 48 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfe\x03\xfe\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x3c\x78\x3c\x78\x1f\xf0\x1f\xf0\x07\xc0\x07\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 49 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x3c\x7e\x3c\x1e\x78\x1e\x78\x1e\xf0\x1e\xf0\x1f\xe0\x1f\xe0\x1f\xc0\x1f\xc0\x1f\xc0\x1f\xc0\x1f\xe0\x1f\xe0\x1e\xf0\x1e\xf0\x1e\x78\x1e\x78\x1e\x3c\x1e\x3c\x7e\x1e\x7e\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 50 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x80\x7f\x80\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x06\x1e\x06\x1e\x0e\x1e\x0e\x7f\xfe\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 51 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x7c\x3e\x7c\x3e\x7e\x7e\x7e\x7e\x7f\xfe\x7f\xfe\x7b\xde\x7b\xde\x79\x9e\x79\x9e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 52 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3e\x1e\x3e\x1e\x3f\x1e\x3f\x1e\x3f\x9e\x3f\x9e\x3d\xde\x3d\xde\x3c\xfe\x3c\xfe\x3c\x7e\x3c\x7e\x3c\x3e\x3c\x3e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 54 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xf0\x7f\xf0\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x1e\x3c\x1f\xf0\x1f\xf0\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x7f\x80\x7f\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 55 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3d\xde\x3d\xde\x3c\xfe\x3c\xfe\x1e\x7c\x1e\x7c\x07\xf8\x07\xf8\x00\x1c\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00'\ 56 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xf0\x7f\xf0\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x3c\x1e\x3c\x1f\xf0\x1f\xf0\x1f\xe0\x1f\xe0\x1e\xf0\x1e\xf0\x1e\x78\x1e\x78\x1e\x3c\x1e\x3c\x7e\x1e\x7e\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 57 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x3c\x3c\x3c\x3c\x78\x1e\x78\x1e\x3c\x00\x3c\x00\x0f\x00\x0f\x00\x03\xc0\x03\xc0\x00\xf0\x00\xf0\x00\x3c\x00\x3c\x78\x1e\x78\x1e\x3c\x3c\x3c\x3c\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 58 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x7f\xfe\x73\xce\x73\xce\x63\xc6\x63\xc6\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 59 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 60 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x0f\xf0\x0f\xf0\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 61 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x79\x9e\x79\x9e\x7b\xde\x7b\xde\x7f\xfe\x7f\xfe\x3e\x7c\x3e\x7c\x1c\x38\x1c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 62 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x0f\xf0\x0f\xf0\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0f\xf0\x0f\xf0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 63 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x0f\xf0\x0f\xf0\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 64 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x38\x3c\x38\x3c\x30\x78\x30\x78\x00\xf0\x00\xf0\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x07\x80\x07\x80\x0f\x00\x0f\x00\x1e\x0c\x1e\x0c\x3c\x1c\x3c\x1c\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 65 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 66 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x1e\x00\x1e\x00\x0f\x00\x0f\x00\x07\x80\x07\x80\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\xf0\x00\xf0\x00\x78\x00\x78\x00\x3c\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0f\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x0f\xf0\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 68 | b'\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0f\xf0\x0f\xf0\x1e\x78\x1e\x78\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 69 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x7f\xff\x00\x00\x00\x00'\ 70 | b'\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 71 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xe0\x0f\xe0\x00\x78\x00\x78\x0f\xf8\x0f\xf8\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x0f\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 72 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\xf0\x0f\xf0\x0f\x3c\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x3c\xf8\x3c\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 73 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x3c\x1e\x3c\x1e\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x1e\x3c\x1e\x0f\xf8\x0f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 74 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf8\x01\xf8\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x00\x78\x07\xf8\x07\xf8\x1e\x78\x1e\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x0f\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 75 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3f\xfe\x3f\xfe\x3c\x00\x3c\x00\x3c\x1e\x3c\x1e\x0f\xf8\x0f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 76 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xf0\x03\xf0\x0f\x3c\x0f\x3c\x0f\x0c\x0f\x0c\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xf0\x3f\xf0\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xc0\x3f\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 77 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x9e\x0f\x9e\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\xf8\x0f\xf8\x00\x78\x00\x78\x3c\x78\x3c\x78\x0f\xe0\x0f\xe0\x00\x00\x00\x00'\ 78 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x78\x0f\x78\x0f\x9e\x0f\x9e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x3f\x1e\x3f\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 79 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x03\xf0\x03\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x03\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 80 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x3c\x3c\x3c\x3c\x1e\x78\x1e\x78\x07\xe0\x07\xe0\x00\x00\x00\x00'\ 81 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x3f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x1e\x0f\x1e\x0f\x3c\x0f\x3c\x0f\x78\x0f\x78\x0f\xf0\x0f\xf0\x0f\x78\x0f\x78\x0f\x3c\x0f\x3c\x3f\x1e\x3f\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 82 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xf0\x03\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x03\xfc\x03\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 83 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7c\x7e\x7c\x7f\xfe\x7f\xfe\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x7b\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 84 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf8\x3c\xf8\x0f\x3c\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 85 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf0\x07\xf0\x1e\x3c\x1e\x3c\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x3c\x1e\x3c\x07\xf0\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 86 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf0\x3c\xf0\x0f\x3c\x0f\x3c\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x1e\x0f\x3c\x0f\x3c\x0f\xf0\x0f\xf0\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xc0\x3f\xc0\x00\x00\x00\x00'\ 87 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x9e\x07\x9e\x1e\x78\x1e\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x1e\x78\x1e\x78\x07\xf8\x07\xf8\x00\x78\x00\x78\x00\x78\x00\x78\x00\xfe\x00\xfe\x00\x00\x00\x00'\ 88 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xf8\x3c\xf8\x0f\x9e\x0f\x9e\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x0f\x00\x3f\xc0\x3f\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 89 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xf8\x0f\xf8\x3c\x1e\x3c\x1e\x3c\x00\x3c\x00\x0f\xf8\x0f\xf8\x00\x1e\x00\x1e\x3c\x1e\x3c\x1e\x0f\xf8\x0f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 90 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x01\x80\x03\x80\x03\x80\x07\x80\x07\x80\x07\x80\x07\x80\x7f\xf8\x7f\xf8\x07\x80\x07\x80\x07\x80\x07\x80\x07\x80\x07\x80\x07\x80\x07\x80\x07\x9e\x07\x9e\x01\xf8\x01\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 91 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x3c\x78\x0f\x9e\x0f\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 92 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x1e\x78\x1e\x78\x07\xe0\x07\xe0\x01\x80\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 93 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x78\x1e\x79\x9e\x79\x9e\x7b\xde\x7b\xde\x3f\xfc\x3f\xfc\x1e\x78\x1e\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 94 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x3c\x3c\x3c\x0e\x70\x0e\x70\x07\xe0\x07\xe0\x03\xc0\x03\xc0\x07\xe0\x07\xe0\x0e\x70\x0e\x70\x3c\x3c\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 95 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x3c\x1e\x1e\x1e\x1e\x1e\x07\xfe\x07\xfe\x00\x1e\x00\x1e\x00\x3c\x00\x3c\x0f\xf0\x0f\xf0\x00\x00\x00\x00'\ 96 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfc\x3f\xfc\x3c\x3c\x3c\x3c\x00\xf0\x00\xf0\x03\xc0\x03\xc0\x0f\x00\x0f\x00\x3c\x3c\x3c\x3c\x3f\xfc\x3f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 97 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x01\xe0\x01\xe0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x3f\x80\x3f\x80\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x01\xe0\x01\xe0\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 98 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 99 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x3f\x00\x07\x80\x07\x80\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x01\xfc\x01\xfc\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x03\xc0\x07\x80\x07\x80\x3f\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 100 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x9e\x0f\x9e\x3c\xf8\x3c\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 101 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xc0\x03\xf0\x03\xf0\x0f\x3c\x0f\x3c\x3c\x0f\x3c\x0f\x3c\x0f\x3c\x0f\x3f\xff\x3f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | 103 | FONT = memoryview(_FONT) 104 | 105 | -------------------------------------------------------------------------------- /frozen/vga2_8x16.py: -------------------------------------------------------------------------------- 1 | """converted from vga_8x16.bin """ 2 | WIDTH = 8 3 | HEIGHT = 16 4 | FIRST = 0x00 5 | LAST = 0xff 6 | _FONT =\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00'\ 9 | b'\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00'\ 10 | b'\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00'\ 11 | b'\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00'\ 12 | b'\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00'\ 13 | b'\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00'\ 14 | b'\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00'\ 15 | b'\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff'\ 16 | b'\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00'\ 17 | b'\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff'\ 18 | b'\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00'\ 19 | b'\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00'\ 20 | b'\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00'\ 21 | b'\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00'\ 22 | b'\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00'\ 23 | b'\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00'\ 24 | b'\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00'\ 25 | b'\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00'\ 26 | b'\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00'\ 27 | b'\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00'\ 28 | b'\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00'\ 29 | b'\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00'\ 30 | b'\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00'\ 31 | b'\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00'\ 32 | b'\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00'\ 33 | b'\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00'\ 34 | b'\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00'\ 35 | b'\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00'\ 36 | b'\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00'\ 37 | b'\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00'\ 38 | b'\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00'\ 39 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 40 | b'\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00'\ 41 | b'\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 42 | b'\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00'\ 43 | b'\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00'\ 44 | b'\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00'\ 45 | b'\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 46 | b'\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 47 | b'\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00'\ 48 | b'\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00'\ 49 | b'\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00'\ 50 | b'\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00'\ 51 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00'\ 52 | b'\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00'\ 54 | b'\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00'\ 55 | b'\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00'\ 56 | b'\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00'\ 57 | b'\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00'\ 58 | b'\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00'\ 59 | b'\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00'\ 60 | b'\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00'\ 61 | b'\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 62 | b'\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00'\ 63 | b'\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 64 | b'\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00'\ 65 | b'\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00'\ 66 | b'\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00'\ 67 | b'\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00'\ 68 | b'\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00'\ 69 | b'\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00'\ 70 | b'\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00'\ 71 | b'\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00'\ 72 | b'\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 73 | b'\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00'\ 74 | b'\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00'\ 75 | b'\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00'\ 76 | b'\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00'\ 77 | b'\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00'\ 78 | b'\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00'\ 79 | b'\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 80 | b'\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 81 | b'\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00'\ 82 | b'\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00'\ 83 | b'\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00'\ 84 | b'\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 85 | b'\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 86 | b'\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 87 | b'\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00'\ 88 | b'\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00'\ 89 | b'\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00'\ 90 | b'\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00'\ 91 | b'\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 92 | b'\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 93 | b'\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00'\ 94 | b'\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00'\ 95 | b'\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00'\ 96 | b'\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 97 | b'\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00'\ 98 | b'\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00'\ 99 | b'\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00'\ 100 | b'\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00'\ 101 | b'\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 102 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00'\ 103 | b'\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 104 | b'\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 105 | b'\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00'\ 106 | b'\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 107 | b'\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 108 | b'\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 109 | b'\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00'\ 110 | b'\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00'\ 111 | b'\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00'\ 112 | b'\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 113 | b'\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00'\ 114 | b'\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00'\ 115 | b'\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 116 | b'\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00'\ 117 | b'\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00'\ 118 | b'\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 119 | b'\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00'\ 120 | b'\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00'\ 121 | b'\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00'\ 122 | b'\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00'\ 123 | b'\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00'\ 124 | b'\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 125 | b'\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00'\ 126 | b'\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00'\ 127 | b'\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00'\ 128 | b'\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00'\ 129 | b'\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00'\ 130 | b'\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00'\ 131 | b'\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00'\ 132 | b'\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00'\ 133 | b'\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 134 | b'\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00'\ 135 | b'\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00\x00'\ 136 | b'\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 137 | b'\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 138 | b'\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 139 | b'\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 140 | b'\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 141 | b'\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 142 | b'\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x70\x00\x00'\ 143 | b'\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 144 | b'\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 145 | b'\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00'\ 146 | b'\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 147 | b'\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 148 | b'\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 149 | b'\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00'\ 150 | b'\x38\x6c\x38\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 151 | b'\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00'\ 152 | b'\x00\x00\x00\x00\x00\xec\x36\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00'\ 153 | b'\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00'\ 154 | b'\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 155 | b'\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 156 | b'\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 157 | b'\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 158 | b'\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 159 | b'\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00'\ 160 | b'\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 161 | b'\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 162 | b'\x00\x18\x18\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x18\x00\x00\x00\x00'\ 163 | b'\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00'\ 164 | b'\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x18\x00\x00\x00\x00'\ 165 | b'\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xcc\xc6\x00\x00\x00\x00'\ 166 | b'\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00\x00\x00\x00'\ 167 | b'\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 168 | b'\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00'\ 169 | b'\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00'\ 170 | b'\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00'\ 171 | b'\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00'\ 172 | b'\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00'\ 173 | b'\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00'\ 174 | b'\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00'\ 175 | b'\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00'\ 176 | b'\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00'\ 177 | b'\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00'\ 178 | b'\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00'\ 179 | b'\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00'\ 180 | b'\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00'\ 181 | b'\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00'\ 182 | b'\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00'\ 183 | b'\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44'\ 184 | b'\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa'\ 185 | b'\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77'\ 186 | b'\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18'\ 187 | b'\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18'\ 188 | b'\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18'\ 189 | b'\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36'\ 190 | b'\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36'\ 191 | b'\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18'\ 192 | b'\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36'\ 193 | b'\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36'\ 194 | b'\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36'\ 195 | b'\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00'\ 196 | b'\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00'\ 197 | b'\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00'\ 198 | b'\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18'\ 199 | b'\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00'\ 200 | b'\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 201 | b'\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18'\ 202 | b'\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18'\ 203 | b'\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 204 | b'\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18'\ 205 | b'\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18'\ 206 | b'\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36'\ 207 | b'\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00'\ 208 | b'\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36'\ 209 | b'\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 210 | b'\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36'\ 211 | b'\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36'\ 212 | b'\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 213 | b'\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36'\ 214 | b'\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 215 | b'\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00'\ 216 | b'\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18'\ 217 | b'\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36'\ 218 | b'\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00'\ 219 | b'\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00'\ 220 | b'\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18'\ 221 | b'\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36'\ 222 | b'\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36'\ 223 | b'\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18'\ 224 | b'\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00'\ 225 | b'\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18'\ 226 | b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'\ 227 | b'\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff'\ 228 | b'\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0'\ 229 | b'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f'\ 230 | b'\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 231 | b'\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xd8\xdc\x76\x00\x00\x00\x00'\ 232 | b'\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00'\ 233 | b'\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00'\ 234 | b'\x00\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00'\ 235 | b'\x00\x00\xfe\xc6\x60\x30\x18\x18\x30\x60\xc6\xfe\x00\x00\x00\x00'\ 236 | b'\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\xd8\x70\x00\x00\x00\x00'\ 237 | b'\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00'\ 238 | b'\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00'\ 239 | b'\x00\x00\x7e\x18\x3c\x66\x66\x66\x66\x3c\x18\x7e\x00\x00\x00\x00'\ 240 | b'\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00'\ 241 | b'\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\x6c\xee\x00\x00\x00\x00'\ 242 | b'\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00'\ 243 | b'\x00\x00\x00\x00\x00\x7e\xdb\xdb\xdb\x7e\x00\x00\x00\x00\x00\x00'\ 244 | b'\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00\x00'\ 245 | b'\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x60\x30\x1c\x00\x00\x00\x00'\ 246 | b'\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00'\ 247 | b'\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00'\ 248 | b'\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00'\ 249 | b'\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00'\ 250 | b'\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00'\ 251 | b'\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18'\ 252 | b'\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00'\ 253 | b'\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00'\ 254 | b'\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00'\ 255 | b'\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 256 | b'\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00'\ 257 | b'\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00'\ 258 | b'\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00'\ 259 | b'\x00\x6c\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 260 | b'\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 261 | b'\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00'\ 262 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\ 263 | 264 | FONT = memoryview(_FONT) 265 | -------------------------------------------------------------------------------- /frozen/vga2_8x8.py: -------------------------------------------------------------------------------- 1 | """converted from vga_8x8.bin """ 2 | WIDTH = 8 3 | HEIGHT = 8 4 | FIRST = 0x00 5 | LAST = 0xff 6 | _FONT =\ 7 | b'\x00\x00\x00\x00\x00\x00\x00\x00'\ 8 | b'\x7e\x81\xa5\x81\xbd\x99\x81\x7e'\ 9 | b'\x7e\xff\xdb\xff\xc3\xe7\xff\x7e'\ 10 | b'\x6c\xfe\xfe\xfe\x7c\x38\x10\x00'\ 11 | b'\x10\x38\x7c\xfe\x7c\x38\x10\x00'\ 12 | b'\x38\x7c\x38\xfe\xfe\xd6\x10\x38'\ 13 | b'\x10\x38\x7c\xfe\xfe\x7c\x10\x38'\ 14 | b'\x00\x00\x18\x3c\x3c\x18\x00\x00'\ 15 | b'\xff\xff\xe7\xc3\xc3\xe7\xff\xff'\ 16 | b'\x00\x3c\x66\x42\x42\x66\x3c\x00'\ 17 | b'\xff\xc3\x99\xbd\xbd\x99\xc3\xff'\ 18 | b'\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78'\ 19 | b'\x3c\x66\x66\x66\x3c\x18\x7e\x18'\ 20 | b'\x3f\x33\x3f\x30\x30\x70\xf0\xe0'\ 21 | b'\x7f\x63\x7f\x63\x63\x67\xe6\xc0'\ 22 | b'\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18'\ 23 | b'\x80\xe0\xf8\xfe\xf8\xe0\x80\x00'\ 24 | b'\x02\x0e\x3e\xfe\x3e\x0e\x02\x00'\ 25 | b'\x18\x3c\x7e\x18\x18\x7e\x3c\x18'\ 26 | b'\x66\x66\x66\x66\x66\x00\x66\x00'\ 27 | b'\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00'\ 28 | b'\x3e\x61\x3c\x66\x66\x3c\x86\x7c'\ 29 | b'\x00\x00\x00\x00\x7e\x7e\x7e\x00'\ 30 | b'\x18\x3c\x7e\x18\x7e\x3c\x18\xff'\ 31 | b'\x18\x3c\x7e\x18\x18\x18\x18\x00'\ 32 | b'\x18\x18\x18\x18\x7e\x3c\x18\x00'\ 33 | b'\x00\x18\x0c\xfe\x0c\x18\x00\x00'\ 34 | b'\x00\x30\x60\xfe\x60\x30\x00\x00'\ 35 | b'\x00\x00\xc0\xc0\xc0\xfe\x00\x00'\ 36 | b'\x00\x24\x66\xff\x66\x24\x00\x00'\ 37 | b'\x00\x18\x3c\x7e\xff\xff\x00\x00'\ 38 | b'\x00\xff\xff\x7e\x3c\x18\x00\x00'\ 39 | b'\x00\x00\x00\x00\x00\x00\x00\x00'\ 40 | b'\x18\x3c\x3c\x18\x18\x00\x18\x00'\ 41 | b'\x66\x66\x24\x00\x00\x00\x00\x00'\ 42 | b'\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00'\ 43 | b'\x18\x3e\x60\x3c\x06\x7c\x18\x00'\ 44 | b'\x00\xc6\xcc\x18\x30\x66\xc6\x00'\ 45 | b'\x38\x6c\x38\x76\xdc\xcc\x76\x00'\ 46 | b'\x18\x18\x30\x00\x00\x00\x00\x00'\ 47 | b'\x0c\x18\x30\x30\x30\x18\x0c\x00'\ 48 | b'\x30\x18\x0c\x0c\x0c\x18\x30\x00'\ 49 | b'\x00\x66\x3c\xff\x3c\x66\x00\x00'\ 50 | b'\x00\x18\x18\x7e\x18\x18\x00\x00'\ 51 | b'\x00\x00\x00\x00\x00\x18\x18\x30'\ 52 | b'\x00\x00\x00\x7e\x00\x00\x00\x00'\ 53 | b'\x00\x00\x00\x00\x00\x18\x18\x00'\ 54 | b'\x06\x0c\x18\x30\x60\xc0\x80\x00'\ 55 | b'\x38\x6c\xc6\xd6\xc6\x6c\x38\x00'\ 56 | b'\x18\x38\x18\x18\x18\x18\x7e\x00'\ 57 | b'\x7c\xc6\x06\x1c\x30\x66\xfe\x00'\ 58 | b'\x7c\xc6\x06\x3c\x06\xc6\x7c\x00'\ 59 | b'\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00'\ 60 | b'\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00'\ 61 | b'\x38\x60\xc0\xfc\xc6\xc6\x7c\x00'\ 62 | b'\xfe\xc6\x0c\x18\x30\x30\x30\x00'\ 63 | b'\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00'\ 64 | b'\x7c\xc6\xc6\x7e\x06\x0c\x78\x00'\ 65 | b'\x00\x18\x18\x00\x00\x18\x18\x00'\ 66 | b'\x00\x18\x18\x00\x00\x18\x18\x30'\ 67 | b'\x06\x0c\x18\x30\x18\x0c\x06\x00'\ 68 | b'\x00\x00\x7e\x00\x00\x7e\x00\x00'\ 69 | b'\x60\x30\x18\x0c\x18\x30\x60\x00'\ 70 | b'\x7c\xc6\x0c\x18\x18\x00\x18\x00'\ 71 | b'\x7c\xc6\xde\xde\xde\xc0\x78\x00'\ 72 | b'\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00'\ 73 | b'\xfc\x66\x66\x7c\x66\x66\xfc\x00'\ 74 | b'\x3c\x66\xc0\xc0\xc0\x66\x3c\x00'\ 75 | b'\xf8\x6c\x66\x66\x66\x6c\xf8\x00'\ 76 | b'\xfe\x62\x68\x78\x68\x62\xfe\x00'\ 77 | b'\xfe\x62\x68\x78\x68\x60\xf0\x00'\ 78 | b'\x3c\x66\xc0\xc0\xce\x66\x3a\x00'\ 79 | b'\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00'\ 80 | b'\x3c\x18\x18\x18\x18\x18\x3c\x00'\ 81 | b'\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00'\ 82 | b'\xe6\x66\x6c\x78\x6c\x66\xe6\x00'\ 83 | b'\xf0\x60\x60\x60\x62\x66\xfe\x00'\ 84 | b'\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00'\ 85 | b'\xc6\xe6\xf6\xde\xce\xc6\xc6\x00'\ 86 | b'\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00'\ 87 | b'\xfc\x66\x66\x7c\x60\x60\xf0\x00'\ 88 | b'\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e'\ 89 | b'\xfc\x66\x66\x7c\x6c\x66\xe6\x00'\ 90 | b'\x3c\x66\x30\x18\x0c\x66\x3c\x00'\ 91 | b'\x7e\x7e\x5a\x18\x18\x18\x3c\x00'\ 92 | b'\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00'\ 93 | b'\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00'\ 94 | b'\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00'\ 95 | b'\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00'\ 96 | b'\x66\x66\x66\x3c\x18\x18\x3c\x00'\ 97 | b'\xfe\xc6\x8c\x18\x32\x66\xfe\x00'\ 98 | b'\x3c\x30\x30\x30\x30\x30\x3c\x00'\ 99 | b'\xc0\x60\x30\x18\x0c\x06\x02\x00'\ 100 | b'\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00'\ 101 | b'\x10\x38\x6c\xc6\x00\x00\x00\x00'\ 102 | b'\x00\x00\x00\x00\x00\x00\x00\xff'\ 103 | b'\x30\x18\x0c\x00\x00\x00\x00\x00'\ 104 | b'\x00\x00\x78\x0c\x7c\xcc\x76\x00'\ 105 | b'\xe0\x60\x7c\x66\x66\x66\xdc\x00'\ 106 | b'\x00\x00\x7c\xc6\xc0\xc6\x7c\x00'\ 107 | b'\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00'\ 108 | b'\x00\x00\x7c\xc6\xfe\xc0\x7c\x00'\ 109 | b'\x3c\x66\x60\xf8\x60\x60\xf0\x00'\ 110 | b'\x00\x00\x76\xcc\xcc\x7c\x0c\xf8'\ 111 | b'\xe0\x60\x6c\x76\x66\x66\xe6\x00'\ 112 | b'\x18\x00\x38\x18\x18\x18\x3c\x00'\ 113 | b'\x06\x00\x06\x06\x06\x66\x66\x3c'\ 114 | b'\xe0\x60\x66\x6c\x78\x6c\xe6\x00'\ 115 | b'\x38\x18\x18\x18\x18\x18\x3c\x00'\ 116 | b'\x00\x00\xec\xfe\xd6\xd6\xd6\x00'\ 117 | b'\x00\x00\xdc\x66\x66\x66\x66\x00'\ 118 | b'\x00\x00\x7c\xc6\xc6\xc6\x7c\x00'\ 119 | b'\x00\x00\xdc\x66\x66\x7c\x60\xf0'\ 120 | b'\x00\x00\x76\xcc\xcc\x7c\x0c\x1e'\ 121 | b'\x00\x00\xdc\x76\x60\x60\xf0\x00'\ 122 | b'\x00\x00\x7e\xc0\x7c\x06\xfc\x00'\ 123 | b'\x30\x30\xfc\x30\x30\x36\x1c\x00'\ 124 | b'\x00\x00\xcc\xcc\xcc\xcc\x76\x00'\ 125 | b'\x00\x00\xc6\xc6\xc6\x6c\x38\x00'\ 126 | b'\x00\x00\xc6\xd6\xd6\xfe\x6c\x00'\ 127 | b'\x00\x00\xc6\x6c\x38\x6c\xc6\x00'\ 128 | b'\x00\x00\xc6\xc6\xc6\x7e\x06\xfc'\ 129 | b'\x00\x00\x7e\x4c\x18\x32\x7e\x00'\ 130 | b'\x0e\x18\x18\x70\x18\x18\x0e\x00'\ 131 | b'\x18\x18\x18\x18\x18\x18\x18\x00'\ 132 | b'\x70\x18\x18\x0e\x18\x18\x70\x00'\ 133 | b'\x76\xdc\x00\x00\x00\x00\x00\x00'\ 134 | b'\x00\x10\x38\x6c\xc6\xc6\xfe\x00'\ 135 | b'\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78'\ 136 | b'\xcc\x00\xcc\xcc\xcc\xcc\x76\x00'\ 137 | b'\x0c\x18\x7c\xc6\xfe\xc0\x7c\x00'\ 138 | b'\x7c\x82\x78\x0c\x7c\xcc\x76\x00'\ 139 | b'\xc6\x00\x78\x0c\x7c\xcc\x76\x00'\ 140 | b'\x30\x18\x78\x0c\x7c\xcc\x76\x00'\ 141 | b'\x30\x30\x78\x0c\x7c\xcc\x76\x00'\ 142 | b'\x00\x00\x7e\xc0\xc0\x7e\x0c\x38'\ 143 | b'\x7c\x82\x7c\xc6\xfe\xc0\x7c\x00'\ 144 | b'\xc6\x00\x7c\xc6\xfe\xc0\x7c\x00'\ 145 | b'\x30\x18\x7c\xc6\xfe\xc0\x7c\x00'\ 146 | b'\x66\x00\x38\x18\x18\x18\x3c\x00'\ 147 | b'\x7c\x82\x38\x18\x18\x18\x3c\x00'\ 148 | b'\x30\x18\x00\x38\x18\x18\x3c\x00'\ 149 | b'\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00'\ 150 | b'\x38\x6c\x7c\xc6\xfe\xc6\xc6\x00'\ 151 | b'\x18\x30\xfe\xc0\xf8\xc0\xfe\x00'\ 152 | b'\x00\x00\x7e\x18\x7e\xd8\x7e\x00'\ 153 | b'\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00'\ 154 | b'\x7c\x82\x7c\xc6\xc6\xc6\x7c\x00'\ 155 | b'\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00'\ 156 | b'\x30\x18\x7c\xc6\xc6\xc6\x7c\x00'\ 157 | b'\x78\x84\x00\xcc\xcc\xcc\x76\x00'\ 158 | b'\x60\x30\xcc\xcc\xcc\xcc\x76\x00'\ 159 | b'\xc6\x00\xc6\xc6\xc6\x7e\x06\xfc'\ 160 | b'\xc6\x38\x6c\xc6\xc6\x6c\x38\x00'\ 161 | b'\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00'\ 162 | b'\x18\x18\x7e\xc0\xc0\x7e\x18\x18'\ 163 | b'\x38\x6c\x64\xf0\x60\x66\xfc\x00'\ 164 | b'\x66\x66\x3c\x7e\x18\x7e\x18\x18'\ 165 | b'\xf8\xcc\xcc\xfa\xc6\xcf\xc6\xc7'\ 166 | b'\x0e\x1b\x18\x3c\x18\xd8\x70\x00'\ 167 | b'\x18\x30\x78\x0c\x7c\xcc\x76\x00'\ 168 | b'\x0c\x18\x00\x38\x18\x18\x3c\x00'\ 169 | b'\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00'\ 170 | b'\x18\x30\xcc\xcc\xcc\xcc\x76\x00'\ 171 | b'\x76\xdc\x00\xdc\x66\x66\x66\x00'\ 172 | b'\x76\xdc\x00\xe6\xf6\xde\xce\x00'\ 173 | b'\x3c\x6c\x6c\x3e\x00\x7e\x00\x00'\ 174 | b'\x38\x6c\x6c\x38\x00\x7c\x00\x00'\ 175 | b'\x18\x00\x18\x18\x30\x63\x3e\x00'\ 176 | b'\x00\x00\x00\xfe\xc0\xc0\x00\x00'\ 177 | b'\x00\x00\x00\xfe\x06\x06\x00\x00'\ 178 | b'\x63\xe6\x6c\x7e\x33\x66\xcc\x0f'\ 179 | b'\x63\xe6\x6c\x7a\x36\x6a\xdf\x06'\ 180 | b'\x18\x00\x18\x18\x3c\x3c\x18\x00'\ 181 | b'\x00\x33\x66\xcc\x66\x33\x00\x00'\ 182 | b'\x00\xcc\x66\x33\x66\xcc\x00\x00'\ 183 | b'\x22\x88\x22\x88\x22\x88\x22\x88'\ 184 | b'\x55\xaa\x55\xaa\x55\xaa\x55\xaa'\ 185 | b'\x77\xdd\x77\xdd\x77\xdd\x77\xdd'\ 186 | b'\x18\x18\x18\x18\x18\x18\x18\x18'\ 187 | b'\x18\x18\x18\x18\xf8\x18\x18\x18'\ 188 | b'\x18\x18\xf8\x18\xf8\x18\x18\x18'\ 189 | b'\x36\x36\x36\x36\xf6\x36\x36\x36'\ 190 | b'\x00\x00\x00\x00\xfe\x36\x36\x36'\ 191 | b'\x00\x00\xf8\x18\xf8\x18\x18\x18'\ 192 | b'\x36\x36\xf6\x06\xf6\x36\x36\x36'\ 193 | b'\x36\x36\x36\x36\x36\x36\x36\x36'\ 194 | b'\x00\x00\xfe\x06\xf6\x36\x36\x36'\ 195 | b'\x36\x36\xf6\x06\xfe\x00\x00\x00'\ 196 | b'\x36\x36\x36\x36\xfe\x00\x00\x00'\ 197 | b'\x18\x18\xf8\x18\xf8\x00\x00\x00'\ 198 | b'\x00\x00\x00\x00\xf8\x18\x18\x18'\ 199 | b'\x18\x18\x18\x18\x1f\x00\x00\x00'\ 200 | b'\x18\x18\x18\x18\xff\x00\x00\x00'\ 201 | b'\x00\x00\x00\x00\xff\x18\x18\x18'\ 202 | b'\x18\x18\x18\x18\x1f\x18\x18\x18'\ 203 | b'\x00\x00\x00\x00\xff\x00\x00\x00'\ 204 | b'\x18\x18\x18\x18\xff\x18\x18\x18'\ 205 | b'\x18\x18\x1f\x18\x1f\x18\x18\x18'\ 206 | b'\x36\x36\x36\x36\x37\x36\x36\x36'\ 207 | b'\x36\x36\x37\x30\x3f\x00\x00\x00'\ 208 | b'\x00\x00\x3f\x30\x37\x36\x36\x36'\ 209 | b'\x36\x36\xf7\x00\xff\x00\x00\x00'\ 210 | b'\x00\x00\xff\x00\xf7\x36\x36\x36'\ 211 | b'\x36\x36\x37\x30\x37\x36\x36\x36'\ 212 | b'\x00\x00\xff\x00\xff\x00\x00\x00'\ 213 | b'\x36\x36\xf7\x00\xf7\x36\x36\x36'\ 214 | b'\x18\x18\xff\x00\xff\x00\x00\x00'\ 215 | b'\x36\x36\x36\x36\xff\x00\x00\x00'\ 216 | b'\x00\x00\xff\x00\xff\x18\x18\x18'\ 217 | b'\x00\x00\x00\x00\xff\x36\x36\x36'\ 218 | b'\x36\x36\x36\x36\x3f\x00\x00\x00'\ 219 | b'\x18\x18\x1f\x18\x1f\x00\x00\x00'\ 220 | b'\x00\x00\x1f\x18\x1f\x18\x18\x18'\ 221 | b'\x00\x00\x00\x00\x3f\x36\x36\x36'\ 222 | b'\x36\x36\x36\x36\xff\x36\x36\x36'\ 223 | b'\x18\x18\xff\x18\xff\x18\x18\x18'\ 224 | b'\x18\x18\x18\x18\xf8\x00\x00\x00'\ 225 | b'\x00\x00\x00\x00\x1f\x18\x18\x18'\ 226 | b'\xff\xff\xff\xff\xff\xff\xff\xff'\ 227 | b'\x00\x00\x00\x00\xff\xff\xff\xff'\ 228 | b'\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0'\ 229 | b'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f'\ 230 | b'\xff\xff\xff\xff\x00\x00\x00\x00'\ 231 | b'\x00\x00\x76\xdc\xc8\xdc\x76\x00'\ 232 | b'\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00'\ 233 | b'\xfe\xc6\xc0\xc0\xc0\xc0\xc0\x00'\ 234 | b'\x00\x00\xfe\x6c\x6c\x6c\x6c\x00'\ 235 | b'\xfe\xc6\x60\x30\x60\xc6\xfe\x00'\ 236 | b'\x00\x00\x7e\xd8\xd8\xd8\x70\x00'\ 237 | b'\x00\x00\x66\x66\x66\x66\x7c\xc0'\ 238 | b'\x00\x76\xdc\x18\x18\x18\x18\x00'\ 239 | b'\x7e\x18\x3c\x66\x66\x3c\x18\x7e'\ 240 | b'\x38\x6c\xc6\xfe\xc6\x6c\x38\x00'\ 241 | b'\x38\x6c\xc6\xc6\x6c\x6c\xee\x00'\ 242 | b'\x0e\x18\x0c\x3e\x66\x66\x3c\x00'\ 243 | b'\x00\x00\x7e\xdb\xdb\x7e\x00\x00'\ 244 | b'\x06\x0c\x7e\xdb\xdb\x7e\x60\xc0'\ 245 | b'\x1e\x30\x60\x7e\x60\x30\x1e\x00'\ 246 | b'\x00\x7c\xc6\xc6\xc6\xc6\xc6\x00'\ 247 | b'\x00\xfe\x00\xfe\x00\xfe\x00\x00'\ 248 | b'\x18\x18\x7e\x18\x18\x00\x7e\x00'\ 249 | b'\x30\x18\x0c\x18\x30\x00\x7e\x00'\ 250 | b'\x0c\x18\x30\x18\x0c\x00\x7e\x00'\ 251 | b'\x0e\x1b\x1b\x18\x18\x18\x18\x18'\ 252 | b'\x18\x18\x18\x18\x18\xd8\xd8\x70'\ 253 | b'\x00\x18\x00\x7e\x00\x18\x00\x00'\ 254 | b'\x00\x76\xdc\x00\x76\xdc\x00\x00'\ 255 | b'\x38\x6c\x6c\x38\x00\x00\x00\x00'\ 256 | b'\x00\x00\x00\x18\x18\x00\x00\x00'\ 257 | b'\x00\x00\x00\x18\x00\x00\x00\x00'\ 258 | b'\x0f\x0c\x0c\x0c\xec\x6c\x3c\x1c'\ 259 | b'\x6c\x36\x36\x36\x36\x00\x00\x00'\ 260 | b'\x78\x0c\x18\x30\x7c\x00\x00\x00'\ 261 | b'\x00\x00\x3c\x3c\x3c\x3c\x00\x00'\ 262 | b'\x00\x00\x00\x00\x00\x00\x00\x00'\ 263 | 264 | FONT = memoryview(_FONT) 265 | -------------------------------------------------------------------------------- /images/hello.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/hello.jpg -------------------------------------------------------------------------------- /images/main_menu-1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/main_menu-1-1.jpg -------------------------------------------------------------------------------- /images/main_menu-1-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/main_menu-1-5.jpg -------------------------------------------------------------------------------- /images/main_menu-3-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/main_menu-3-1.jpg -------------------------------------------------------------------------------- /images/main_menu-3-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/main_menu-3-3.jpg -------------------------------------------------------------------------------- /images/message-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/message-10.jpg -------------------------------------------------------------------------------- /images/message-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/images/message-2.jpg -------------------------------------------------------------------------------- /jlcpcb/bom_esp32-drawbot3_3.csv: -------------------------------------------------------------------------------- 1 | ID,Name,Designator,Footprint,Quantity,Manufacturer Part,Manufacturer,Supplier,Supplier Part,LCSC Assembly,,,,,,,,,,, 2 | 1,74HC14D,U4,SOIC-14_L8.7-W3.9-P1.27-LS6.0-BL,1,74HC14D,653,Nexperia,LCSC,C5605,Yes,,,,,,,,,, 3 | 2,SB2P-HVQ-CA (LF)(SN),MOT5V,CHG,HDR-2X1/2.54,2,-,JST Sales America,LCSC,C157909,,,,,,,,,,, 4 | 3,Header-Male-2.54_1x4_C124378,BATTERY,HDR-TH_4P-P2.54-V,1,210S-1*4P L=11.6MMGold-plated black,Ckmtw,LCSC,C124378,,,,,,,,,,,, 5 | 4,TTGO_T_DISPLAY,U3,TTGO_T_DISPLAY,1,,,,,,,,,,,,,,,, 6 | 5,XH-5A,LEFT,RIGHT,XH-5A,2,XH-5A,BOOMELE,LCSC,C2318,,,,,,,,,,, 7 | 6,Z-211-0311-0021-001,PEN,HDR-3X1/2.54,1,Z-211-0311-0021-001,ZHENGLING,LCSC,C152153,,,,,,,,,,,, 8 | 7,K1-1506DN-01,SW1,K1-1506DN-01,1,K1-1506DN-01,HRO,LCSC,C145911,,,,,,,,,,,, 9 | 8,micro 5P180,CHARGE,MICRO-USB-TH_U-MICRS05P-BF00,1,micro 5P180,ValuePro,LCSC,C40941,,,,,,,,,,,, 10 | 9,4.7K,R14,R15,0603',2,0603WAF4701T5E,Uniroyal Elec,LCSC,C23162,,,,,,,,,,, 11 | 10,100nF,C10,C9,C8,C7,C6,C5,C1,C3,C4,0603',9,CC0603KRX7R9BB104,YAGEO,LCSC,C14663,,,, 12 | 11,MCP23017,U1,SOIC-28_L18.1-W10.3-P1.27-LS10.3-BL,1,MCP23017-E/SO,MICROCHIP,LCSC,C47023,,,,,,,,,,,, 13 | 12,TPS2069CDBVR,U5,U6,SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BL,2,TPS2069CDBVR,Texas Instruments,LCSC,C181752,Yes,,,,,,,,,, 14 | 13,10K,R13,R8,R7,R6,R5,R2,R10,R11,R9,R4,R3,R12,0603',12,0603WAF1002T5E,UniOhm,LCSC,C25804,Yes 15 | 14,210S-2*6P L=11.6MMGold-plated black,PORTB,210S-2.54-2X6P,1,210S-2*6P L=11.6MMGold-plated black,Ckmtw,LCSC,C124388,,,,,,,,,,,, 16 | 15,470uF,C2,CAP-SMD_L7.3-W4.3,1,TAJD477K006RNJ,AVX,LCSC,C7229,Yes,,,,,,,,,,, 17 | 16,ULN2803A,U2,SOIC-18_300MIL,1,ULN2803ADWR,TI,LCSC,C9683,Yes,,,,,,,,,,, 18 | 17,220S-1*6P H=8.5MM Ytype Gold-plated,MH-CD42,DIP-1X6P2.54,1,220S-1*6P H=8.5MM Ytype Gold-plated,Ckmtw,LCSC,C124415,,,,,,,,,,,, 19 | 18,OS103011MS8QP1,SW2,OS103011MS8QP1,1,OS103011MS8QP1,C&K,LCSC,C221831,,,,,,,,,,,, 20 | 19,B5819W,D1,SOD-123_L2.8-W1.8-LS3.7-RD,1,B5819W,CJ,LCSC,C8598,Yes,,,,,,,,,,, 21 | -------------------------------------------------------------------------------- /jlcpcb/gerber_esp32_drawbot3_3.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/jlcpcb/gerber_esp32_drawbot3_3.rar -------------------------------------------------------------------------------- /jlcpcb/pnp_esp32-drawbot3_3.csv: -------------------------------------------------------------------------------- 1 | Designator,Footprint,Mid X,Mid Y,Ref X,Ref Y,Pad X,Pad Y,Layer,Rotation,Comment 2 | MOT5V,HDR-2X1/2.54,78.99mm,-10.92mm,78.99mm,-10.92mm,78.99mm,-9.65mm,T,0,SB2P-HVQ-CA (LF)(SN) 3 | U4,SOIC-14_L8.7-W3.9-P1.27-LS6.0-BL,70.61mm,-24.89mm,70.61mm,-24.89mm,67.51mm,-21.08mm,T,270,74HC14D 4 | U5,SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BL,10.8mm,-29.97mm,10.8mm,-29.97mm,9.3mm,-29.02mm,T,180,TPS2069CDBVR 5 | U6,SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BL,10.8mm,-40.89mm,10.8mm,-40.89mm,9.3mm,-39.94mm,T,180,TPS2069CDBVR 6 | C2,CAP-SMD_L7.3-W4.3,54.61mm,-11.94mm,54.61mm,-11.94mm,54.61mm,-8.22mm,T,90,470uF 7 | D1,SOD-123_L2.8-W1.8-LS3.7-RD,16.51mm,-29.97mm,16.51mm,-29.97mm,16.51mm,-31.67mm,T,90,B5819W 8 | CHG,HDR-2X1/2.54,9.14mm,-4.83mm,9.14mm,-4.83mm,9.14mm,-3.56mm,T,0,SB2P-HVQ-CA (LF)(SN) 9 | CHARGE,MICRO-USB-TH_U-MICRS05P-BF00,3.81mm,-13.46mm,3.81mm,-13.46mm,4.31mm,-12.16mm,T,270,micro 5P180 10 | SW2,OS103011MS8QP1,2.79mm,-30.23mm,2.79mm,-30.23mm,2.79mm,-24.13mm,T,90,OS103011MS8QP1 11 | R13,0603',10.8mm,-33.78mm,10.8mm,-33.78mm,10.09mm,-33.78mm,T,0,10K 12 | R12,0603',10.8mm,-24.89mm,10.79mm,-24.89mm,11.5mm,-24.89mm,T,180,10K 13 | C9,0603',10.8mm,-22.61mm,10.8mm,-22.61mm,10.09mm,-22.61mm,T,0,100nF 14 | C10,0603',10.8mm,-35.81mm,10.8mm,-35.81mm,10.09mm,-35.81mm,T,0,100nF 15 | PORTB,210S-2.54-2X6P,43.26mm,-10.05mm,43.26mm,-10.05mm,44.53mm,-16.4mm,T,90,210S-2*6P L=11.6MMGold-plated black 16 | U1,SOIC-28_L18.1-W10.3-P1.27-LS10.3-BL,28.7mm,-31.24mm,28.7mm,-31.24mm,23.64mm,-22.99mm,T,270,MCP23017 17 | BATTERY,HDR-TH_4P-P2.54-V,32.77mm,-7.37mm,32.77mm,-7.37mm,32.77mm,-3.56mm,T,270,Header-Male-2.54_1x4_C124378 18 | MH-CD42,DIP-1X6P2.54,14.48mm,-9.91mm,14.48mm,-9.91mm,14.48mm,-3.56mm,T,270,220S-1*6P H=8.5MM Ytype Gold-plated 19 | U3,TTGO_T_DISPLAY,37.59mm,-31.24mm,51.56mm,-19.81mm,51.56mm,-19.81mm,T,270,TTGO_T_DISPLAY 20 | SW1,K1-1506DN-01,70.1mm,-38.61mm,70.1mm,-38.61mm,65mm,-35.41mm,T,0,K1-1506DN-01 21 | U2,SOIC-18_300MIL,44.96mm,-31.24mm,44.96mm,-31.24mm,39.76mm,-26.16mm,T,270,ULN2803A 22 | PEN,HDR-3X1/2.54,54.61mm,-3.56mm,54.61mm,-3.56mm,52.07mm,-3.56mm,T,0,Z-211-0311-0021-001 23 | R14,0603',17.02mm,-41.15mm,17.02mm,-41.15mm,17.02mm,-40.45mm,T,270,4.7K 24 | R15,0603',19.56mm,-41.15mm,19.56mm,-41.15mm,19.56mm,-40.45mm,T,270,4.7K 25 | R3,0603',62.8mm,-24.13mm,62.8mm,-24.13mm,62.1mm,-24.13mm,T,0,10K 26 | R2,0603',62.74mm,-31.5mm,62.74mm,-31.5mm,62.04mm,-31.5mm,T,0,10K 27 | C4,0603',80.77mm,-15.75mm,80.77mm,-15.75mm,80.07mm,-15.75mm,T,0,100nF 28 | C3,0603',62.74mm,-19.05mm,62.74mm,-19.05mm,62.04mm,-19.05mm,T,0,100nF 29 | C1,0603',62.74mm,-26.42mm,62.74mm,-26.42mm,62.04mm,-26.42mm,T,0,100nF 30 | C5,0603',80.77mm,-23.62mm,80.77mm,-23.62mm,80.07mm,-23.62mm,T,0,100nF 31 | C6,0603',80.77mm,-31.75mm,80.77mm,-31.75mm,80.07mm,-31.75mm,T,0,100nF 32 | R4,0603',80.77mm,-20.83mm,80.77mm,-20.83mm,80.07mm,-20.83mm,T,0,10K 33 | R5,0603',80.77mm,-28.7mm,80.77mm,-28.7mm,80.07mm,-28.7mm,T,0,10K 34 | R6,0603',80.77mm,-36.83mm,80.77mm,-36.83mm,80.07mm,-36.83mm,T,0,10K 35 | R7,0603',62.74mm,-28.96mm,62.74mm,-28.96mm,63.44mm,-28.96mm,T,180,10K 36 | R9,0603',80.77mm,-18.29mm,80.77mm,-18.29mm,81.47mm,-18.29mm,T,180,10K 37 | R10,0603',80.77mm,-26.16mm,80.77mm,-26.16mm,81.47mm,-26.16mm,T,180,10K 38 | R11,0603',80.77mm,-34.29mm,80.77mm,-34.29mm,81.47mm,-34.29mm,T,180,10K 39 | R8,0603',62.8mm,-21.59mm,62.8mm,-21.59mm,63.5mm,-21.59mm,T,180,10K 40 | C7,0603',70.8mm,-30.73mm,70.8mm,-30.73mm,70.1mm,-30.73mm,T,0,100nF 41 | C8,0603',20.07mm,-33.78mm,20.07mm,-33.78mm,20.07mm,-34.48mm,T,90,100nF 42 | LEFT,XH-5A,65.02mm,-9.91mm,65.02mm,-9.91mm,65.02mm,-14.91mm,T,90,XH-5A 43 | RIGHT,XH-5A,71.88mm,-9.91mm,71.88mm,-9.91mm,71.88mm,-14.91mm,T,90,XH-5A 44 | -------------------------------------------------------------------------------- /lib/button.py: -------------------------------------------------------------------------------- 1 | """ 2 | module button 3 | 4 | Button debounce and JoyStick classes 5 | 6 | MIT License 7 | Copyright (c) 2020 Russ Hughes 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | """ 27 | 28 | # pylint: disable-msg=import-error, no-member 29 | import time 30 | import machine 31 | 32 | # pylint: disable-msg=invalid-name 33 | const = lambda x: x 34 | 35 | UP = const(32) 36 | DOWN = const(25) 37 | LEFT = const(33) 38 | RIGHT = const(26) 39 | CENTER = const(27) 40 | ZERO = const(0) 41 | CHANGE = const(1) 42 | ENTER = const(35) 43 | 44 | # pylint: disable-msg=too-many-instance-attributes 45 | class Button(): 46 | """ 47 | Button debounce class, handles button release and long presses. 48 | 49 | Args: 50 | pin (int): the pin number the button is connected to. 51 | debounce (int optional): the debounce time in ms, defaults to 50ms 52 | long: (int optional): the long press interval, defaults to 600ms, a 53 | value of 0 will disable reporting of long presses. 54 | active_high (bool optional): if True pin reads 1 when pressed. If False 55 | pin reads 0 when pressed. Defaults the True. 56 | 57 | """ 58 | def __init__(self, pin, debounce=50, long=600, active_low=False): 59 | self.pin = machine.Pin(pin, machine.Pin.IN) 60 | self.active = 1 61 | self.state = 0 62 | self.last = 0 63 | self.last_ms = 0 64 | self.down = 0 65 | self.fired = 0 66 | self.debounce = debounce 67 | self.long = long 68 | self.active_low = active_low 69 | 70 | def modify(self, debounce=None, long=None): 71 | """ 72 | Modify button debounce or long press timing 73 | 74 | Args: 75 | debounce (int): debounce time in ms 76 | long (int): long press time in ms 77 | """ 78 | if debounce is not None: 79 | self.debounce = debounce 80 | 81 | if long is not None: 82 | self.long = long 83 | 84 | def read(self): 85 | """ 86 | Read button with debounce and long press detection 87 | 88 | Returns: 89 | int: 0 if not pressed. 1 if pressed, -1 if long pressed 90 | """ 91 | value = self.pin.value() 92 | if self.active_low: 93 | value ^= 1 94 | 95 | if value != self.last: 96 | self.last_ms = time.ticks_ms() 97 | 98 | if time.ticks_ms() - self.last_ms > self.debounce: 99 | if value != self.state: 100 | self.state = value 101 | self.fired = False 102 | 103 | if value == self.active: 104 | self.down = time.ticks_ms() 105 | return 1 106 | 107 | if self.long and self.state == self.active and not self.fired: 108 | if time.ticks_ms() - self.down > self.long: 109 | self.fired = True 110 | return -1 111 | 112 | self.last = value 113 | return 0 114 | 115 | # pylint: disable-msg=too-few-public-methods 116 | class JoyStick(): 117 | """ 118 | JoyStick class, handles reading a five way switch style joystick. Uses 119 | the Button class and supports long press notification. 120 | """ 121 | def __init__(self, buttons=None): 122 | """ 123 | Initialize JoyStick 124 | 125 | Args: buttons (list of tuples): The first tuple element should be the 126 | value to return when switch is pressed and released. The second 127 | tuple element should be a Button object for the switch. 128 | 129 | """ 130 | if buttons is None: 131 | self.buttons = [ 132 | (UP, Button(UP)), 133 | (DOWN, Button(DOWN)), 134 | (LEFT, Button(LEFT)), 135 | (RIGHT, Button(RIGHT)), 136 | (CENTER, Button(CENTER)), 137 | (CHANGE, Button(ZERO, long=0, active_low=True)), 138 | (ENTER, Button(ENTER, active_low=True)) 139 | ] 140 | else: 141 | self.buttons = buttons 142 | 143 | self.max_ms = 0 144 | self.start_ms = 0 145 | 146 | def read(self, max_wait=0): 147 | """ 148 | Read JoyStick 149 | 150 | Args: max_wait (optional int): maximum time to wait for button press 151 | in ms. 152 | 153 | Returns: int: the value of the button that was pressed and released. 154 | if the button definition did not set the parameter `long` to 0, 155 | and the button was pressed and held longer then the parameter 156 | `long` in ms the value returned will be negative. If `max_wait` 157 | was specified and `max_wait` ms pass without a button being 158 | pressed amd release a 0 will be returned. 159 | """ 160 | self.max_ms = max_wait 161 | if max_wait: 162 | self.start_ms = time.ticks_ms() 163 | 164 | while True: 165 | for button in self.buttons: 166 | result = button[1].read() 167 | if result: 168 | return button[0] * result 169 | 170 | if self.max_ms and time.ticks_ms() - self.start_ms > self.max_ms: 171 | return 0 172 | -------------------------------------------------------------------------------- /lib/mcp23017.py: -------------------------------------------------------------------------------- 1 | """ 2 | MicroPython MCP23017 16-bit I/O Expander 3 | https://github.com/mcauser/micropython-mcp23017 4 | 5 | MIT License 6 | Copyright (c) 2019 Mike Causer 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | """ 26 | 27 | __version__ = '0.1.4' 28 | 29 | const = lambda x: x 30 | 31 | # register addresses in port=0, bank=1 mode (easier maths to convert) 32 | _MCP_IODIR = const(0x00) # R/W I/O Direction Register 33 | _MCP_IPOL = const(0x01) # R/W Input Polarity Port Register 34 | _MCP_GPINTEN = const(0x02) # R/W Interrupt-on-Change Pins 35 | _MCP_DEFVAL = const(0x03) # R/W Default Value Register 36 | _MCP_INTCON = const(0x04) # R/W Interrupt-on-Change Control Register 37 | _MCP_IOCON = const(0x05) # R/W Configuration Register 38 | _MCP_GPPU = const(0x06) # R/W Pull-Up Resistor Register 39 | _MCP_INTF = const(0x07) # R Interrupt Flag Register (read clears) 40 | _MCP_INTCAP = const(0x08) # R Interrupt Captured Value For Port Register 41 | _MCP_GPIO = const(0x09) # R/W General Purpose I/O Port Register 42 | _MCP_OLAT = const(0x0a) # R/W Output Latch Register 43 | 44 | # Config register (IOCON) bits 45 | _MCP_IOCON_INTPOL = const(2) 46 | _MCP_IOCON_ODR = const(4) 47 | # _MCP_IOCON_HAEN = const(8) # no used - for spi flavour of this chip 48 | _MCP_IOCON_DISSLW = const(16) 49 | _MCP_IOCON_SEQOP = const(32) 50 | _MCP_IOCON_MIRROR = const(64) 51 | _MCP_IOCON_BANK = const(128) 52 | 53 | 54 | class Port(): 55 | # represents one of the two 8-bit ports 56 | def __init__(self, port, mcp): 57 | self._port = port & 1 # 0=PortA, 1=PortB 58 | self._mcp = mcp 59 | 60 | def _which_reg(self, reg): 61 | if self._mcp._config & 0x80 == 0x80: 62 | # bank = 1 63 | return reg | (self._port << 4) 64 | else: 65 | # bank = 0 66 | return (reg << 1) + self._port 67 | 68 | def _flip_property_bit(self, reg, condition, bit): 69 | if condition: 70 | setattr(self, reg, getattr(self, reg) | bit) 71 | else: 72 | setattr(self, reg, getattr(self, reg) & ~bit) 73 | 74 | def _read(self, reg): 75 | return self._mcp._i2c.readfrom_mem(self._mcp._address, self._which_reg(reg), 1)[0] 76 | 77 | def _write(self, reg, val): 78 | val &= 0xff 79 | self._mcp._i2c.writeto_mem(self._mcp._address, self._which_reg(reg), bytearray([val])) 80 | # if writing to the config register, make a copy in mcp so that it knows 81 | # which bank you're using for subsequent writes 82 | if reg == _MCP_IOCON: 83 | self._mcp._config = val 84 | 85 | @property 86 | def mode(self): 87 | return self._read(_MCP_IODIR) 88 | @mode.setter 89 | def mode(self, val): 90 | self._write(_MCP_IODIR, val) 91 | 92 | @property 93 | def input_polarity(self): 94 | return self._read(_MCP_IPOL) 95 | @input_polarity.setter 96 | def input_polarity(self, val): 97 | self._write(_MCP_IPOL, val) 98 | 99 | @property 100 | def interrupt_enable(self): 101 | return self._read(_MCP_GPINTEN) 102 | @interrupt_enable.setter 103 | def interrupt_enable(self, val): 104 | self._write(_MCP_GPINTEN, val) 105 | 106 | @property 107 | def default_value(self): 108 | return self._read(_MCP_DEFVAL) 109 | @default_value.setter 110 | def default_value(self, val): 111 | self._write(_MCP_DEFVAL, val) 112 | 113 | @property 114 | def interrupt_compare_default(self): 115 | return self._read(_MCP_INTCON) 116 | @interrupt_compare_default.setter 117 | def interrupt_compare_default(self, val): 118 | self._write(_MCP_INTCON, val) 119 | 120 | @property 121 | def io_config(self): 122 | return self._read(_MCP_IOCON) 123 | @io_config.setter 124 | def io_config(self, val): 125 | self._write(_MCP_IOCON, val) 126 | 127 | @property 128 | def pullup(self): 129 | return self._read(_MCP_GPPU) 130 | @pullup.setter 131 | def pullup(self, val): 132 | self._write(_MCP_GPPU, val) 133 | 134 | # read only 135 | @property 136 | def interrupt_flag(self): 137 | return self._read(_MCP_INTF) 138 | 139 | # read only 140 | @property 141 | def interrupt_captured(self): 142 | return self._read(_MCP_INTCAP) 143 | 144 | @property 145 | def gpio(self): 146 | return self._read(_MCP_GPIO) 147 | @gpio.setter 148 | def gpio(self, val): 149 | # writing to this register modifies the OLAT register for pins configured as output 150 | self._write(_MCP_GPIO, val) 151 | 152 | @property 153 | def output_latch(self): 154 | return self._read(_MCP_OLAT) 155 | @output_latch.setter 156 | def output_latch(self, val): 157 | # modifies the output latches on pins configured as outputs 158 | self._write(_MCP_OLAT, val) 159 | 160 | 161 | class MCP23017(): 162 | def __init__(self, i2c, address=0x20): 163 | self._i2c = i2c 164 | self._address = address 165 | self._config = 0x00 166 | self._virtual_pins = {} 167 | self.init() 168 | 169 | def init(self): 170 | # error if device not found at i2c addr 171 | if self._i2c.scan().count(self._address) == 0: 172 | raise OSError('MCP23017 not found at I2C address {:#x}'.format(self._address)) 173 | 174 | self.porta = Port(0, self) 175 | self.portb = Port(1, self) 176 | 177 | self.io_config = 0x00 # io expander configuration - same on both ports, only need to write once 178 | 179 | # Reset to all inputs with no pull-ups and no inverted polarity. 180 | self.mode = 0xFFFF # in/out direction (0=out, 1=in) 181 | self.input_polarity = 0x0000 # invert port input polarity (0=normal, 1=invert) 182 | self.interrupt_enable = 0x0000 # int on change pins (0=disabled, 1=enabled) 183 | self.default_value = 0x0000 # default value for int on change 184 | self.interrupt_compare_default = 0x0000 # int on change control (0=compare to prev val, 1=compare to def val) 185 | self.pullup = 0x0000 # gpio weak pull up resistor - when configured as input (0=disabled, 1=enabled) 186 | self.gpio = 0x0000 # port (0=logic low, 1=logic high) 187 | 188 | def config(self, interrupt_polarity=None, interrupt_open_drain=None, sda_slew=None, sequential_operation=None, interrupt_mirror=None, bank=None): 189 | io_config = self.porta.io_config 190 | 191 | if interrupt_polarity is not None: 192 | # configre INT as push-pull 193 | # 0: Active low 194 | # 1: Active high 195 | io_config = self._flip_bit(io_config, interrupt_polarity, _MCP_IOCON_INTPOL) 196 | if interrupt_polarity: 197 | # if setting to 1, unset ODR bit - interrupt_open_drain 198 | interrupt_open_drain = False 199 | if interrupt_open_drain is not None: 200 | # configure INT as open drain, overriding interrupt_polarity 201 | # 0: INTPOL sets the polarity 202 | # 1: Open drain, INTPOL ignored 203 | io_config = self._flip_bit(io_config, interrupt_open_drain, _MCP_IOCON_ODR) 204 | if sda_slew is not None: 205 | # 0: Slew rate function on SDA pin enabled 206 | # 1: Slew rate function on SDA pin disabled 207 | io_config = self._flip_bit(io_config, sda_slew, _MCP_IOCON_DISSLW) 208 | if sequential_operation is not None: 209 | # 0: Enabled, address pointer increments 210 | # 1: Disabled, address pointer fixed 211 | io_config = self._flip_bit(io_config, sequential_operation, _MCP_IOCON_SEQOP) 212 | if interrupt_mirror is not None: 213 | # 0: Independent INTA,INTB pins 214 | # 1: Internally linked INTA,INTB pins 215 | io_config = self._flip_bit(io_config, interrupt_mirror, _MCP_IOCON_MIRROR) 216 | if bank is not None: 217 | # 0: Registers alternate between A and B ports 218 | # 1: All port A registers first then all port B 219 | io_config = self._flip_bit(io_config, bank, _MCP_IOCON_BANK) 220 | 221 | # both ports share the same register, so you only need to write on one 222 | self.porta.io_config = io_config 223 | self._config = io_config 224 | 225 | def _flip_bit(self, value, condition, bit): 226 | if condition: 227 | value |= bit 228 | else: 229 | value &= ~bit 230 | return value 231 | 232 | def pin(self, pin, mode=None, value=None, pullup=None, polarity=None, interrupt_enable=None, interrupt_compare_default=None, default_value=None): 233 | assert 0 <= pin <= 15 234 | port = self.portb if pin // 8 else self.porta 235 | bit = (1 << (pin % 8)) 236 | if mode is not None: 237 | # 0: Pin is configured as an output 238 | # 1: Pin is configured as an input 239 | port._flip_property_bit('mode', mode & 1, bit) 240 | if value is not None: 241 | # 0: Pin is set to logic low 242 | # 1: Pin is set to logic high 243 | port._flip_property_bit('gpio', value & 1, bit) 244 | if pullup is not None: 245 | # 0: Weak pull-up 100k ohm resistor disabled 246 | # 1: Weak pull-up 100k ohm resistor enabled 247 | port._flip_property_bit('pullup', pullup & 1, bit) 248 | if polarity is not None: 249 | # 0: GPIO register bit reflects the same logic state of the input pin 250 | # 1: GPIO register bit reflects the opposite logic state of the input pin 251 | port._flip_property_bit('input_polarity', polarity & 1, bit) 252 | if interrupt_enable is not None: 253 | # 0: Disables GPIO input pin for interrupt-on-change event 254 | # 1: Enables GPIO input pin for interrupt-on-change event 255 | port._flip_property_bit('interrupt_enable', interrupt_enable & 1, bit) 256 | if interrupt_compare_default is not None: 257 | # 0: Pin value is compared against the previous pin value 258 | # 1: Pin value is compared against the associated bit in the DEFVAL register 259 | port._flip_property_bit('interrupt_compare_default', interrupt_compare_default & 1, bit) 260 | if default_value is not None: 261 | # 0: Default value for comparison in interrupt, when configured to compare against DEFVAL register 262 | # 1: Default value for comparison in interrupt, when configured to compare against DEFVAL register 263 | port._flip_property_bit('default_value', default_value & 1, bit) 264 | if value is None: 265 | return port.gpio & bit == bit 266 | 267 | def interrupt_triggered_gpio(self, port): 268 | # which gpio triggered the interrupt 269 | # only 1 bit will be set 270 | port = self.portb if port else self.porta 271 | return port.interrupt_flag 272 | 273 | def interrupt_captured_gpio(self, port): 274 | # captured gpio values at time of int 275 | # reading this will clear the current interrupt 276 | port = self.portb if port else self.porta 277 | return port.interrupt_captured 278 | 279 | # mode (IODIR register) 280 | @property 281 | def mode(self): 282 | return self.porta.mode | (self.portb.mode << 8) 283 | @mode.setter 284 | def mode(self, val): 285 | self.porta.mode = val 286 | self.portb.mode = (val >> 8) 287 | 288 | # input_polarity (IPOL register) 289 | @property 290 | def input_polarity(self): 291 | return self.porta.input_polarity | (self.portb.input_polarity << 8) 292 | @input_polarity.setter 293 | def input_polarity(self, val): 294 | self.porta.input_polarity = val 295 | self.portb.input_polarity = (val >> 8) 296 | 297 | # interrupt_enable (GPINTEN register) 298 | @property 299 | def interrupt_enable(self): 300 | return self.porta.interrupt_enable | (self.portb.interrupt_enable << 8) 301 | @interrupt_enable.setter 302 | def interrupt_enable(self, val): 303 | self.porta.interrupt_enable = val 304 | self.portb.interrupt_enable = (val >> 8) 305 | 306 | # default_value (DEFVAL register) 307 | @property 308 | def default_value(self): 309 | return self.porta.default_value | (self.portb.default_value << 8) 310 | @default_value.setter 311 | def default_value(self, val): 312 | self.porta.default_value = val 313 | self.portb.default_value = (val >> 8) 314 | 315 | # interrupt_compare_default (INTCON register) 316 | @property 317 | def interrupt_compare_default(self): 318 | return self.porta.interrupt_compare_default | (self.portb.interrupt_compare_default << 8) 319 | @interrupt_compare_default.setter 320 | def interrupt_compare_default(self, val): 321 | self.porta.interrupt_compare_default = val 322 | self.portb.interrupt_compare_default = (val >> 8) 323 | 324 | # io_config (IOCON register) 325 | # This register is duplicated in each port. Changing one changes both. 326 | @property 327 | def io_config(self): 328 | return self.porta.io_config 329 | @io_config.setter 330 | def io_config(self, val): 331 | self.porta.io_config = val 332 | 333 | # pullup (GPPU register) 334 | @property 335 | def pullup(self): 336 | return self.porta.pullup | (self.portb.pullup << 8) 337 | @pullup.setter 338 | def pullup(self, val): 339 | self.porta.pullup = val 340 | self.portb.pullup = (val >> 8) 341 | 342 | # interrupt_flag (INTF register) 343 | # read only 344 | @property 345 | def interrupt_flag(self): 346 | return self.porta.interrupt_flag | (self.portb.interrupt_flag << 8) 347 | 348 | # interrupt_captured (INTCAP register) 349 | # read only 350 | @property 351 | def interrupt_captured(self): 352 | return self.porta.interrupt_captured | (self.portb.interrupt_captured << 8) 353 | 354 | # gpio (GPIO register) 355 | @property 356 | def gpio(self): 357 | return self.porta.gpio | (self.portb.gpio << 8) 358 | @gpio.setter 359 | def gpio(self, val): 360 | self.porta.gpio = val 361 | self.portb.gpio = (val >> 8) 362 | 363 | # output_latch (OLAT register) 364 | @property 365 | def output_latch(self): 366 | return self.porta.output_latch | (self.portb.output_latch << 8) 367 | @output_latch.setter 368 | def output_latch(self, val): 369 | self.porta.output_latch = val 370 | self.portb.output_latch = (val >> 8) 371 | 372 | # list interface 373 | # mcp[pin] lazy creates a VirtualPin(pin, port) 374 | def __getitem__(self, pin): 375 | assert 0 <= pin <= 15 376 | if not pin in self._virtual_pins: 377 | self._virtual_pins[pin] = VirtualPin(pin, self.portb if pin // 8 else self.porta) 378 | return self._virtual_pins[pin] 379 | 380 | class VirtualPin(): 381 | def __init__(self, pin, port): 382 | self._pin = pin % 8 383 | self._bit = 1 << self._pin 384 | self._port = port 385 | 386 | def _flip_bit(self, value, condition): 387 | return value | self._bit if condition else value & ~self._bit 388 | 389 | def _get_bit(self, value): 390 | return (value & self._bit) >> self._pin 391 | 392 | def value(self, val=None): 393 | # if val, write, else read 394 | if val is not None: 395 | self._port.gpio = self._flip_bit(self._port.gpio, val & 1) 396 | else: 397 | return self._get_bit(self._port.gpio) 398 | 399 | def input(self, pull=None): 400 | # if pull, enable pull up, else read 401 | self._port.mode = self._flip_bit(self._port.mode, 1) # mode = input 402 | if pull is not None: 403 | self._port.pullup = self._flip_bit(self._port.pullup, pull & 1) # toggle pull up 404 | 405 | def output(self, val=None): 406 | # if val, write, else read 407 | self._port.mode = self._flip_bit(self._port.mode, 0) # mode = output 408 | if val is not None: 409 | self._port.gpio = self._flip_bit(self._port.gpio, val & 1) 410 | -------------------------------------------------------------------------------- /lib/menu.py: -------------------------------------------------------------------------------- 1 | """ 2 | menu.py Drawbot Menu System 3 | 4 | MIT License 5 | Copyright (c) 2020 Russ Hughes 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | """ 25 | #pylint: disable-msg=import-error 26 | import time 27 | import sys 28 | import gc 29 | import network 30 | import uos 31 | 32 | import vga2_bold_16x16 as font 33 | import tftui 34 | import button 35 | 36 | def reload(mod): 37 | """ 38 | reload: Removes a module and re-imports allowing you to re-run programs 39 | 40 | Args: 41 | mod (str): Name of module to reload 42 | """ 43 | mod_name = mod.__name__ 44 | del sys.modules[mod_name] 45 | gc.collect() 46 | return __import__(mod_name) 47 | 48 | def connect_ap(uio): 49 | """ 50 | scan for ap's and allow user to select and connect to it 51 | """ 52 | sta_if = network.WLAN(network.STA_IF) 53 | sta_if.active(True) 54 | if sta_if.isconnected(): 55 | sta_if.disconnect() 56 | 57 | ap_name = "" 58 | ap_pass = "" 59 | 60 | uio.cls("Scanning", 3) 61 | 62 | scan = sta_if.scan() 63 | connect = 0 64 | 65 | connect = uio.menu("Select AP", scan, connect, 0) 66 | if connect is not None: 67 | ap_name = scan[connect][0] 68 | ap_pass = uio.get(ap_name) 69 | ok = 0 70 | form = [ 71 | [uio.HEAD, 0, "Select AP"], 72 | [uio.CENTER, 1, "Connect to"], 73 | [uio.CENTER, 2, ap_name], 74 | [uio.STR, 0, 4, "Password:", 0, 5, 16, ap_pass], 75 | [uio.OK, 0, 7, ("Continue", "Cancel"), ok], 76 | ] 77 | 78 | btn, ok = uio.form(form) 79 | if btn == button.CENTER and ok == 0: 80 | ap_pass = form[3][uio.VAL] 81 | 82 | uio.cls("Connecting", 1) 83 | uio.center("to", 2) 84 | uio.center(ap_name, 3) 85 | sta_if.connect(ap_name, ap_pass) 86 | timeouts = 30 87 | while not sta_if.isconnected() and timeouts: 88 | uio.center(str(timeouts), 7) 89 | timeouts -= 1 90 | time.sleep(1) 91 | 92 | uio.cls("Connection", 0) 93 | if sta_if.isconnected(): 94 | uio.put(ap_name, ap_pass) 95 | uio.center("Successful", 1) 96 | ifconfig = sta_if.ifconfig() 97 | uio.center("IP Address:", 3) 98 | uio.center(ifconfig[0], 4) 99 | else: 100 | uio.center("Failed", 1) 101 | sta_if.active(False) 102 | 103 | uio.center("Press to", 6) 104 | uio.wait("Continue", 7) 105 | 106 | def disconnect_ap(uio): 107 | """ 108 | disconnect from ap 109 | """ 110 | sta_if = network.WLAN(network.STA_IF) 111 | uio.cls() 112 | uio.center("Disable AP", 0, uio.fg_hdr, uio.bg_hdr) 113 | uio.center("Disconnecting", 3) 114 | sta_if.active(False) 115 | uio.center("Press to", 6) 116 | uio.wait("Continue", 7) 117 | 118 | def enable_ap(uio): 119 | """ 120 | Ask user for ap_name and ap_password then start ap and save 121 | ap_name and ap_pass to uio.cfg btree file 122 | """ 123 | ap_name = uio.get(b'AP_NAME') 124 | ap_pass = uio.get(b'AP_PASS') 125 | ok = 0 126 | 127 | form = [ 128 | [uio.HEAD, 0, "Enable AP"], 129 | [uio.STR, 0, 1, "AP Name:", 0, 2, 16, ap_name], 130 | [uio.STR, 0, 4, "Password:", 0, 5, 16, ap_pass], 131 | [uio.OK, 0, 7, ("Continue", "Cancel"), ok], 132 | ] 133 | 134 | again = True 135 | while again: 136 | btn, ok = uio.form(form) 137 | if btn == button.CENTER and ok == 0: 138 | ap_name = form[1][uio.VAL] 139 | ap_pass = form[2][uio.VAL] 140 | 141 | if not 1 <= len(ap_pass) <= 7: 142 | sta_ap = network.WLAN(network.AP_IF) 143 | if sta_ap.active(): 144 | sta_ap.active(False) 145 | sta_ap.active(True) 146 | if len(ap_pass) == 0: 147 | sta_ap.config(essid=ap_name, authmode=network.AUTH_OPEN) 148 | uio.put(b'AP_NAME', ap_name) 149 | uio.put(b'AP_PASS', ap_pass) 150 | else: 151 | sta_ap.config( 152 | essid=ap_name, 153 | password=ap_pass, 154 | authmode=network.AUTH_WPA_WPA2_PSK) 155 | uio.put(b'AP_NAME', ap_name) 156 | uio.put(b'AP_PASS', ap_pass) 157 | 158 | uio.cls() 159 | uio.center("Access Point", 0) 160 | if sta_ap.active(): 161 | uio.put(ap_name, ap_pass) 162 | uio.center("Enabled", 1) 163 | ifconfig = sta_ap.ifconfig() 164 | uio.center("IP Address:", 3) 165 | uio.center(ifconfig[0], 4) 166 | again = False 167 | else: 168 | uio.center("Failed", 2) 169 | sta_ap.active(False) 170 | else: 171 | uio.center("Password must", 1) 172 | uio.center("be at least 8", 2) 173 | uio.center("characters or", 3) 174 | uio.center("be blank", 4) 175 | 176 | uio.center("Press to", 6) 177 | uio.wait("Continue", 7) 178 | else: 179 | again = False 180 | 181 | def disable_ap(uio): 182 | """ 183 | disable AP if running 184 | """ 185 | sta_ap = network.WLAN(network.AP_IF) 186 | uio.cls() 187 | uio.center("Disable AP", 0, uio.fg_hdr, uio.bg_hdr) 188 | uio.center("Disabling AP", 3) 189 | sta_ap.active(False) 190 | uio.center("Press to", 6) 191 | uio.wait("Continue", 7) 192 | 193 | def run_program(uio): 194 | """ 195 | show list of python programs and allow user to select one to run 196 | """ 197 | programs = uos.listdir("/programs") 198 | program = 0 199 | program = uio.menu("Run Program", programs, program) 200 | if program is not None: 201 | mod_name = "".join(programs[program].split(".")[:-1]) 202 | if mod_name in sys.modules: 203 | reload(sys.modules[mod_name]) 204 | else: 205 | __import__(mod_name) 206 | 207 | def main_menu(uio): 208 | """ 209 | show user main menu and call method based on selection 210 | """ 211 | menu = [ 212 | ("Connect to AP", connect_ap), 213 | ("Disconnect AP", disconnect_ap), 214 | ("Enable AP", enable_ap), 215 | ("Disable AP", disable_ap), 216 | ("Run Program", run_program), 217 | ("Quit", None)] 218 | 219 | option = 0 220 | while True: 221 | option = uio.menu("DrawBot Menu", menu, option, 0) 222 | if option not in [None, 5]: 223 | if callable(menu[option][1]): 224 | menu[option][1](uio) 225 | else: 226 | uio.cls("Exiting", 1) 227 | uio.center("to", 2) 228 | uio.center("REPL", 3) 229 | uio.center("Press to", 5) 230 | uio.wait("Continue", 6) 231 | uio.cls() 232 | break 233 | 234 | main_menu(tftui.UI(font)) 235 | sys.exit() 236 | -------------------------------------------------------------------------------- /lib/servo.py: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | # 3 | # Copyright (c) 2016 Radomir Dopieralski 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | 23 | # https://bitbucket.org/thesheep/micropython-servo/src/default/ 24 | 25 | from machine import PWM 26 | import math 27 | 28 | class Servo: 29 | """ 30 | A simple class for controlling hobby servos. 31 | 32 | Args: 33 | pin (machine.Pin): The pin where servo is connected. Must support PWM. 34 | freq (int): The frequency of the signal, in hertz. 35 | min_us (int): The minimum signal length supported by the servo. 36 | max_us (int): The maximum signal length supported by the servo. 37 | angle (int): The angle between the minimum and maximum positions. 38 | 39 | """ 40 | def __init__(self, pin, freq=50, min_us=1000, max_us=2000, angle=180): 41 | self.min_us = min_us 42 | self.max_us = max_us 43 | self.us = 0 44 | self.freq = freq 45 | self.angle = angle 46 | self.pwm = PWM(pin, freq=freq, duty=0) 47 | 48 | def write_us(self, us): 49 | """Set the signal to be ``us`` microseconds long. Zero disables it.""" 50 | if us == 0: 51 | self.pwm.duty(0) 52 | return 53 | us = min(self.max_us, max(self.min_us, us)) 54 | duty = us * 1024 * self.freq // 1000000 55 | self.pwm.duty(duty) 56 | 57 | def write_angle(self, degrees=None, radians=None): 58 | """Move to the specified angle in ``degrees`` or ``radians``.""" 59 | if degrees is None: 60 | degrees = math.degrees(radians) 61 | degrees = degrees % 360 62 | total_range = self.max_us - self.min_us 63 | us = self.min_us + total_range * degrees // self.angle 64 | self.write_us(us) 65 | 66 | def deinit(self): 67 | self.pwm.deinit() 68 | -------------------------------------------------------------------------------- /lib/turtleplot.py: -------------------------------------------------------------------------------- 1 | # 2 | # turtleplot.py: An adaptation of Gregor Lingl's turtle.py for use by 3 | # drawing robots running micropython and using Hershey fonts for write. 4 | # Version 1.0 - Oct 2019 5 | # 6 | # My modifications are Copyright (C) 2019 Russ Hughes (russ@owt.com) 7 | # and maintains the same licensing as the module it is based on. 8 | # 9 | 10 | # turtle.py: a Tkinter based turtle graphics module for Python 11 | # Version 1.1b - 4. 5. 2009 12 | # 13 | # Copyright (C) 2006 - 2010 Gregor Lingl 14 | # email: glingl@aon.at 15 | # 16 | # This software is provided 'as-is', without any express or implied 17 | # warranty. In no event will the authors be held liable for any damages 18 | # arising from the use of this software. 19 | # 20 | # Permission is granted to anyone to use this software for any purpose, 21 | # including commercial applications, and to alter it and redistribute it 22 | # freely, subject to the following restrictions: 23 | # 24 | # 1. The origin of this software must not be misrepresented; you must not 25 | # claim that you wrote the original software. If you use this software 26 | # in a product, an acknowledgment in the product documentation would be 27 | # appreciated but is not required. 28 | # 2. Altered source versions must be plainly marked as such, and must not be 29 | # misrepresented as being the original software. 30 | # 3. This notice may not be removed or altered from any source distribution. 31 | # 32 | 33 | """ 34 | .. admonition:: Attribution 35 | 36 | The turtleplot module and documentation is based on the |turtle.py|: 37 | a Tkinter based turtle graphics module for Python Version 1.1b - 38 | 4. 5. 2009 by Gregor Lingl 39 | 40 | .. code:: python 41 | 42 | # turtle.py: a Tkinter based turtle graphics module for Python 43 | # Version 1.1b - 4. 5. 2009 44 | # 45 | # Copyright (C) 2006 - 2010 Gregor Lingl 46 | # email: glingl@aon.at 47 | # 48 | # This software is provided 'as-is', without any express or implied 49 | # warranty. In no event will the authors be held liable for any damages 50 | # arising from the use of this software. 51 | # 52 | # Permission is granted to anyone to use this software for any purpose, 53 | # including commercial applications, and to alter it and redistribute it 54 | # freely, subject to the following restrictions: 55 | # 56 | # 1. The origin of this software must not be misrepresented; you must not 57 | # claim that you wrote the original software. If you use this software 58 | # in a product, an acknowledgment in the product documentation would be 59 | # appreciated but is not required. 60 | # 2. Altered source versions must be plainly marked as such, and must not be 61 | # misrepresented as being the original software. 62 | # 3. This notice may not be removed or altered from any source distribution. 63 | # 64 | 65 | """ 66 | 67 | import math 68 | 69 | class Vec2D: 70 | """A 2 dimensional vector class, used as a helper class for implementing 71 | turtle graphics. May be useful for turtle graphics programs also. 72 | Derived from tuple, so a vector is a tuple! 73 | 74 | Provides (for a, b vectors, k number) 75 | * a+b vector addition 76 | * a-b vector subtraction 77 | * a*b inner product 78 | * k*a and a*k multiplication with scalar 79 | * \\|a\\| absolute value of a 80 | * a.rotate(angle) rotation 81 | """ 82 | def __init__(self, x, y): 83 | self.vector = (float(x), float(y)) 84 | 85 | def __getitem__(self, index): 86 | return self.vector[index] 87 | 88 | def __add__(self, other): 89 | return Vec2D(self[0]+other[0], self[1]+other[1]) 90 | 91 | def __mul__(self, other): 92 | if isinstance(other, Vec2D): 93 | return self[0]*other[0]+self[1]*other[1] 94 | return Vec2D(self[0]*other, self[1]*other) 95 | 96 | def __rmul__(self, other): 97 | if isinstance(other, (int, float)): 98 | return Vec2D(self[0]*other, self[1]*other) 99 | return None 100 | 101 | def __sub__(self, other): 102 | return Vec2D(self[0]-other[0], self[1]-other[1]) 103 | 104 | def __neg__(self): 105 | return Vec2D(-self[0], -self[1]) 106 | 107 | def __abs__(self): 108 | return (self[0]**2 + self[1]**2)**0.5 109 | 110 | def rotate(self, angle): 111 | """rotate self counterclockwise by angle 112 | 113 | Args: 114 | angle (int, float): number of angle units to rotate 115 | counterclockwise 116 | """ 117 | perp = Vec2D(-self[1], self[0]) 118 | angle = angle * math.pi / 180.0 119 | c_angle, sin_angle = math.cos(angle), math.sin(angle) 120 | return Vec2D(self[0]*c_angle+perp[0]*sin_angle, self[1]*c_angle+perp[1]*sin_angle) 121 | 122 | def __getnewargs__(self): 123 | return (self[0], self[1]) 124 | 125 | def __repr__(self): 126 | return "(%.2f,%.2f)" % (self.vector[0], self.vector[1]) 127 | 128 | 129 | class TurtlePlot: #pylint: disable=no-self-use,too-many-instance-attributes,too-many-locals,too-many-public-methods 130 | """TurtlePlot Class 131 | """ 132 | START_ORIENTATION = { 133 | "standard": Vec2D(1.0, 0.0), 134 | "logo" : Vec2D(0.0, 1.0)} 135 | DEFAULT_MODE = "standard" 136 | DEFAULT_ANGLEOFFSET = 0 137 | DEFAULT_ANGLEORIENT = 1 138 | 139 | def __init__(self, mode=DEFAULT_MODE): 140 | self._setmode(mode) 141 | self.degrees() 142 | self._scale = 1.0 143 | self._position = Vec2D(0.0, 0.0) 144 | self._orient = self.START_ORIENTATION[self._mode] 145 | self._angle_offset = self.DEFAULT_ANGLEOFFSET 146 | self._fullcircle = 360 147 | self._degrees_per_au = 1 148 | self._drawing = False 149 | 150 | 151 | def mode(self, mode=None): 152 | """Set turtle-mode ('standard' or 'logo') and perform reset. 153 | 154 | Args: 155 | mode (str): 'standard' or 'logo'. 156 | Mode 'standard' is compatible with turtle.py. 157 | Mode 'logo' is compatible with most Logo-Turtle-Graphics. 158 | 159 | Returns: 160 | If mode is not given, return the current mode. 161 | 162 | ========== ====================== ================ 163 | Mode Initial turtle heading Positive angles 164 | ========== ====================== ================ 165 | 'standard' to the right (east) counterclockwise 166 | 'logo' upward (north) clockwise 167 | ========== ====================== ================ 168 | 169 | Examples:: 170 | 171 | >>> mode('logo') # resets turtle heading to north 172 | >>> mode() 173 | 'logo' 174 | 175 | """ 176 | if mode is not None: 177 | mode = mode.lower() 178 | if mode not in ["standard", "logo"]: 179 | raise Exception("No turtle-graphics-mode %s" % mode) 180 | self._setmode(mode) 181 | 182 | return self._mode 183 | 184 | 185 | def reset(self): 186 | """ 187 | Reset turtle's scale, position and orientation to its initial values 188 | 189 | """ 190 | self._scale = 1.0 191 | self._position = Vec2D(0.0, 0.0) 192 | self._orient = self.START_ORIENTATION[self._mode] 193 | 194 | 195 | def _setmode(self, mode=None): 196 | """Set turtle-mode to 'standard' or 'logo'. 197 | """ 198 | if mode not in ["standard", "logo"]: 199 | raise Exception("No turtle-graphics-mode %s" % mode) 200 | 201 | self._mode = mode 202 | if mode == "standard": 203 | self._angle_offset = self.DEFAULT_ANGLEOFFSET 204 | self._angle_orient = self.DEFAULT_ANGLEORIENT 205 | else: # mode == "logo": 206 | self._angle_offset = self._fullcircle/4. 207 | self._angle_orient = -1 208 | self.reset() 209 | 210 | 211 | def _set_degrees_per_au(self, fullcircle): 212 | """Helper function for degrees() and radians()""" 213 | self._fullcircle = fullcircle 214 | self._degrees_per_au = 360/fullcircle 215 | if self._mode == "standard": 216 | self._angle_offset = self.DEFAULT_ANGLEOFFSET 217 | else: 218 | self._angle_offset = fullcircle/4. 219 | 220 | 221 | def degrees(self, fullcircle=360.0): 222 | """ 223 | Set angle measurement units to degrees. 224 | 225 | Args: 226 | fullcircle (Optional[int, float]): Set angle measurement units, i. e. set number 227 | of 'degrees' for a full circle. Default value is 360 degrees. 228 | 229 | 230 | Example (for a Turtle instance named turtle):: 231 | 232 | >>> turtle.left(90) 233 | >>> turtle.heading() 234 | 90 235 | 236 | Change angle measurement unit to grad (also known as gon, 237 | grade, or gradian and equals 1/100-th of the right angle.):: 238 | 239 | >>> turtle.degrees(400.0) 240 | >>> turtle.heading() 241 | 100 242 | 243 | """ 244 | self._set_degrees_per_au(fullcircle) 245 | 246 | 247 | def radians(self): 248 | """ Set the angle measurement units to radians. 249 | 250 | Args: 251 | None 252 | 253 | Example (for a Turtle instance named turtle):: 254 | 255 | >>> turtle.heading() 256 | 90 257 | >>> turtle.radians() 258 | >>> turtle.heading() 259 | 1.5707963267948966 260 | """ 261 | self._set_degrees_per_au(2*math.pi) 262 | 263 | 264 | def setscale(self, scale=None): 265 | """Sets the scaling factor 266 | 267 | Args: 268 | scale (int, float): sets scale, if None returns current scale 269 | 270 | Returns: 271 | float: current scale 272 | 273 | Example (for a Turtle instance named turtle):: 274 | 275 | >>> turtle.scale() 276 | 1.0 277 | >>> turtle.scale(1.5) 278 | 1.5 279 | """ 280 | if scale is not None: 281 | self._scale = scale 282 | return self._scale 283 | 284 | 285 | def _go(self, distance): 286 | """move turtle forward by specified distance""" 287 | end = self._position + self._orient * distance 288 | self._position = end 289 | self._move(distance * self._scale) 290 | 291 | 292 | def _rotate(self, angle): 293 | """Turn turtle counterclockwise by specified angle if angle > 0.""" 294 | angle *= self._degrees_per_au 295 | neworient = self._orient.rotate(angle) 296 | self._orient = neworient 297 | self._turn(angle) 298 | 299 | 300 | def _goto(self, end, draw=None): 301 | """move turtle to position end.""" 302 | # save current heading as goto commands do not change 303 | # the turtle's heading, but turtleplot's have too turn 304 | # in order to get to the destination 305 | #original = self.heading() 306 | 307 | # save pen status letting draw override for write 308 | if draw is None: 309 | was_down = self._drawing 310 | else: 311 | was_down = draw 312 | 313 | # raise pen while turning to destination 314 | self.penup() 315 | 316 | angle = self.towards(end) 317 | self.setheading(angle) 318 | distance = self.distance(end) * self._scale 319 | 320 | # set the pen down if drawing 321 | if was_down: 322 | self.pendown() 323 | 324 | self._move(distance) 325 | self._position = end 326 | 327 | # restore the original heading 328 | #self.setheading(original) 329 | 330 | 331 | def forward(self, distance): 332 | """Move the turtle forward by the specified distance. 333 | 334 | Aliases: 335 | forward | fd 336 | 337 | Args: 338 | distance (int, float): Move the turtle forward by the specified 339 | distance, in the direction the turtle is headed. 340 | 341 | Note: 342 | Negative distances move the turtle backwards without turning 343 | 344 | Example (for a Turtle instance named turtle):: 345 | 346 | >>> turtle.position() 347 | (0.00, 0.00) 348 | >>> turtle.forward(25) 349 | >>> turtle.position() 350 | (25.00,0.00) 351 | >>> turtle.forward(-75) 352 | >>> turtle.position() 353 | (-50.00,0.00) 354 | """ 355 | self._go(distance) 356 | 357 | 358 | def back(self, distance): 359 | """Move the turtle backward by distance. 360 | 361 | Aliases: 362 | back | backward | bk 363 | 364 | Args: 365 | distance (int, float): Move the turtle backward by distance, 366 | opposite to the direction the turtle is headed. Does not change 367 | the turtle's heading. 368 | 369 | Note: 370 | Negative distances move the turtle forward without turning 371 | 372 | Example (for a Turtle instance named turtle):: 373 | 374 | >>> turtle.position() 375 | (0.00, 0.00) 376 | >>> turtle.backward(30) 377 | >>> turtle.position() 378 | (-30.00, 0.00) 379 | """ 380 | self._go(-distance) 381 | 382 | 383 | def right(self, angle): 384 | """Turn turtle right by angle units. 385 | 386 | Aliases: 387 | right | rt 388 | 389 | Args: 390 | angle (int, float): Turn turtle right by angle units. 391 | 392 | 393 | Units are by default degrees, but can be set via the degrees() and 394 | radians() functions. Angle orientation depends on mode. 395 | 396 | Example (for a Turtle instance named turtle):: 397 | 398 | >>> turtle.heading() 399 | 22.0 400 | >>> turtle.right(45) 401 | >>> turtle.heading() 402 | 337.0 403 | """ 404 | self._rotate(-angle) 405 | 406 | 407 | def left(self, angle): 408 | """Turn turtle left by angle units. 409 | 410 | Aliases: 411 | left | lt 412 | 413 | Args: 414 | angle (int, float): Turn turtle left by angle units. 415 | 416 | Units are by default degrees, but can be set via the degrees() and 417 | radians() functions. Angle orientation depends on mode. 418 | 419 | Example (for a Turtle instance named turtle):: 420 | 421 | >>> turtle.heading() 422 | 22.0 423 | >>> turtle.left(45) 424 | >>> turtle.heading() 425 | 67.0 426 | """ 427 | self._rotate(angle) 428 | 429 | 430 | def pos(self): 431 | """Return the turtle's current location (x,y), as a Vec2D-vector. 432 | 433 | Aliases: 434 | pos | position 435 | 436 | Args: 437 | None 438 | 439 | Returns: 440 | Tuple (x, y) containing the current location 441 | 442 | Example (for a Turtle instance named turtle):: 443 | 444 | >>> turtle.pos() 445 | (0.00, 240.00) 446 | """ 447 | return self._position 448 | 449 | 450 | def xcor(self): 451 | """ Return the turtle's x coordinate. 452 | 453 | Args: 454 | None 455 | 456 | Returns: 457 | float containing the current x coordinate. 458 | 459 | Example (for a Turtle instance named turtle):: 460 | 461 | >>> reset() 462 | >>> turtle.left(60) 463 | >>> turtle.forward(100) 464 | >>> print turtle.xcor() 465 | 50.0 466 | """ 467 | return self._position[0] 468 | 469 | 470 | def ycor(self): 471 | """ Return the turtle's y coordinate 472 | --- 473 | No arguments. 474 | 475 | Returns: 476 | float containting the current y coordinate. 477 | 478 | Example (for a Turtle instance named turtle):: 479 | 480 | >>> reset() 481 | >>> turtle.left(60) 482 | >>> turtle.forward(100) 483 | >>> print turtle.ycor() 484 | 86.6025403784 485 | """ 486 | return self._position[1] 487 | 488 | 489 | def goto(self, new_x, new_y=None): 490 | """Move turtle to an absolute position. 491 | 492 | Aliases: 493 | setpos | setposition | goto 494 | 495 | Args: 496 | new_x : x value or vector 497 | new_y : y value coordinate 498 | 499 | Move turtle to an absolute position. If the pen is down, 500 | a line will be drawn. The turtle's orientation does not change. 501 | 502 | ============== ========== 503 | Calling method Parameters 504 | ============== ========== 505 | goto(x, y) two coordinates 506 | goto((x, y)) a pair (tuple) of coordinates 507 | goto(vec) Vec2D as returned by pos() 508 | ============== ========== 509 | 510 | Example (for a Turtle instance named turtle):: 511 | 512 | >>> tp = turtle.pos() 513 | >>> tp 514 | (0.00, 0.00) 515 | >>> turtle.setpos(60,30) 516 | >>> turtle.pos() 517 | (60.00,30.00) 518 | >>> turtle.setpos((20,80)) 519 | >>> turtle.pos() 520 | (20.00,80.00) 521 | >>> turtle.setpos(tp) 522 | >>> turtle.pos() 523 | (0.00,0.00) 524 | """ 525 | if new_y is None: 526 | self._goto(Vec2D(*new_x)) 527 | else: 528 | self._goto(Vec2D(new_x, new_y)) 529 | 530 | 531 | def home(self): 532 | """Move turtle to the origin - coordinates (0,0). 533 | 534 | Args: 535 | None 536 | 537 | Move turtle to the origin - coordinates (0,0) and set its 538 | heading to its start-orientation (which depends on mode). 539 | 540 | Example (for a Turtle instance named turtle):: 541 | 542 | >>> turtle.home() 543 | >>> turtle.position() 544 | (0.00, 0.00) 545 | >>> turtle.heading() 546 | 0.0 547 | 548 | """ 549 | self.goto(0, 0) 550 | self.setheading(0) 551 | 552 | 553 | def setx(self, new_x): 554 | """Set the turtle's first coordinate to x 555 | 556 | Args: 557 | new_x (int, float): new x coordinate 558 | 559 | Set the turtle's first coordinate to x, leaving the y coordinate 560 | unchanged. 561 | 562 | Example (for a Turtle instance named turtle):: 563 | 564 | >>> turtle.position() 565 | (0.00, 240.00) 566 | >>> turtle.setx(10) 567 | >>> turtle.position() 568 | (10.00, 240.00) 569 | """ 570 | self._goto(Vec2D(new_x, self._position[1])) 571 | 572 | 573 | def sety(self, new_y): 574 | """Set the turtle's second coordinate to y 575 | 576 | Args: 577 | new_y (int, float): new y coordinate 578 | 579 | Set the turtle's y coordinate leaving the x coordinate unchanged. 580 | 581 | Example (for a Turtle instance named turtle):: 582 | 583 | >>> turtle.position() 584 | (0.00, 40.00) 585 | >>> turtle.sety(-10) 586 | >>> turtle.position() 587 | (0.00, -10.00) 588 | """ 589 | self._goto(Vec2D(self._position[0], new_y)) 590 | 591 | 592 | def distance(self, target_x, target_y=None): 593 | """Return the distance from the turtle to (x,y) in turtle step units. 594 | 595 | Args: 596 | target_x (int, float, tuple): x value or vector 597 | target_y (int, float, None): y value coordinate 598 | 599 | ================ ========== 600 | Calling method Parameters 601 | ================ ========== 602 | distance(x, y) two coordinates 603 | distance((x, y)) a pair (tuple) of coordinates 604 | distance(vec) Vec2D as returned by pos() 605 | ================ ========== 606 | 607 | Example (for a Turtle instance named turtle):: 608 | 609 | >>> turtle.pos() 610 | (0.00, 0.00) 611 | >>> turtle.distance(30,40) 612 | 50.0 613 | """ 614 | if target_y is not None: 615 | pos = Vec2D(target_x, target_y) 616 | if isinstance(target_x, Vec2D): 617 | pos = target_x 618 | elif isinstance(target_x, tuple): 619 | pos = Vec2D(*target_x) 620 | return abs(pos - self._position) 621 | 622 | 623 | def towards(self, target_x, target_y=None): 624 | """Return the angle of the line from the turtle's position to (x, y). 625 | 626 | Args: 627 | target_x (int, float, tuple): x value or vector 628 | target_y (int, float, None): y value coordinate 629 | 630 | ================ ========== 631 | Calling method Parameters 632 | ================ ========== 633 | distance(x, y) two coordinates 634 | distance((x, y)) a pair (tuple) of coordinates 635 | distance(vec) Vec2D as returned by pos() 636 | ================ ========== 637 | 638 | Return the angle, between the line from turtle-position to position 639 | specified by x, y and the turtle's start orientation. (Depends on 640 | modes - "standard" or "logo") 641 | 642 | Example (for a Turtle instance named turtle):: 643 | >>> turtle.pos() 644 | (10.00, 10.00) 645 | >>> turtle.towards(0,0) 646 | 225.0 647 | """ 648 | if target_y is not None: 649 | pos = Vec2D(target_x, target_y) 650 | if isinstance(target_x, Vec2D): 651 | pos = target_x 652 | elif isinstance(target_x, tuple): 653 | pos = Vec2D(*target_x) 654 | 655 | target_x, target_y = pos - self._position 656 | result = round(math.atan2(target_y, target_x)*180.0/math.pi, 10) % 360.0 657 | result /= self._degrees_per_au 658 | return (self._angle_offset + self._angle_orient*result) % self._fullcircle 659 | 660 | 661 | def heading(self): 662 | """ Return the turtle's current heading. 663 | 664 | Args: 665 | None 666 | 667 | Example (for a Turtle instance named turtle):: 668 | 669 | >>> turtle.left(67) 670 | >>> turtle.heading() 671 | 67.0 672 | """ 673 | current_x, current_y = self._orient 674 | result = round(math.atan2(current_y, current_x)*180.0/math.pi, 10) % 360.0 675 | result /= self._degrees_per_au 676 | return (self._angle_offset + self._angle_orient*result) % self._fullcircle 677 | 678 | 679 | def setheading(self, to_angle): 680 | """Set the orientation of the turtle to to_angle. 681 | 682 | Aliases: 683 | setheading | seth 684 | 685 | Args: 686 | to_angle (float, integer): Set the orientation of the turtle to to_angle. 687 | 688 | Here are some common directions in degrees: 689 | 690 | ============= ========= 691 | standard mode logo mode 692 | ============= ========= 693 | 0 - east 0 - north 694 | 90 - north 90 - east 695 | 180 - west 180 - south 696 | 270 - south 270 - west 697 | ============= ========= 698 | 699 | Example (for a Turtle instance named turtle):: 700 | 701 | >>> turtle.setheading(90) 702 | >>> turtle.heading() 703 | 90 704 | """ 705 | angle = (to_angle - self.heading())*self._angle_orient 706 | full = self._fullcircle 707 | angle = (angle+full/2.)%full - full/2. 708 | self._rotate(angle) 709 | 710 | 711 | def circle(self, radius, extent=None, steps=None): 712 | """ Draw a circle with given radius. 713 | 714 | Args: 715 | radius (int, float): radius of circle in turtle units 716 | extent (optional[int, float]): arc length 717 | steps (optional[int]): number of steps 718 | 719 | Draw a circle with given radius. The center is radius units left 720 | of the turtle; extent - an angle - determines which part of the 721 | circle is drawn. If extent is not given, draw the entire circle. 722 | If extent is not a full circle, one endpoint of the arc is the 723 | current pen position. Draw the arc in counterclockwise direction 724 | if radius is positive, otherwise in clockwise direction. Finally 725 | the direction of the turtle is changed by the amount of extent. 726 | 727 | As the circle is approximated by an inscribed regular polygon, 728 | steps determines the number of steps to use. If not given, 729 | it will be calculated automatically. Maybe used to draw regular 730 | polygons. 731 | 732 | 733 | ============================== =============== 734 | Parameters Result 735 | ============================== =============== 736 | circle(radius) full circle 737 | circle(radius, extent) arc 738 | circle(radius, extent, steps) partial polygon 739 | circle(radius, steps=6) 6-sided polygon 740 | ============================== =============== 741 | 742 | Example (for a Turtle instance named turtle):: 743 | 744 | >>> turtle.circle(50) 745 | >>> turtle.circle(120, 180) # semicircle 746 | """ 747 | if extent is None: 748 | extent = self._fullcircle 749 | if steps is None: 750 | frac = abs(extent)/self._fullcircle 751 | steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac) 752 | per_step = 1.0 * extent / steps 753 | half_per_step = 0.5 * per_step 754 | length = 2.0 * radius * math.sin(half_per_step*math.pi/180.0*self._degrees_per_au) 755 | if radius < 0: 756 | length, per_step, half_per_step = -length, -per_step, -half_per_step 757 | 758 | self._rotate(half_per_step) 759 | 760 | for _ in range(steps): 761 | self._go(length) 762 | self._rotate(per_step) 763 | 764 | self._rotate(-half_per_step) 765 | 766 | 767 | def penup(self): 768 | """Pull the pen up -- no drawing when moving. 769 | 770 | Aliases: 771 | penup | pu | up 772 | 773 | No argument 774 | 775 | Example (for a Turtle instance named turtle):: 776 | 777 | >>> turtle.penup() 778 | """ 779 | self._drawing = False 780 | self._pen(False) 781 | 782 | 783 | def pendown(self): 784 | """Pull the pen down -- drawing when moving. 785 | 786 | Aliases: 787 | pendown | pd | down 788 | 789 | No argument. 790 | 791 | Example (for a Turtle instance named turtle):: 792 | 793 | >>> turtle.pendown() 794 | """ 795 | self._drawing = True 796 | self._pen(True) 797 | 798 | 799 | def isdown(self): 800 | """Return True if pen is down, False if it's up. 801 | 802 | No argument. 803 | 804 | Returns: 805 | bool: True if the pen is down, false if the pen is up 806 | 807 | Example (for a Turtle instance named turtle):: 808 | 809 | >>> turtle.penup() 810 | >>> turtle.isdown() 811 | False 812 | >>> turtle.pendown() 813 | >>> turtle.isdown() 814 | True 815 | """ 816 | return self._drawing 817 | 818 | 819 | def write(self, message, font_file="/fonts/romans.fnt"): 820 | """ 821 | Draws a message starting at the current location. 822 | 823 | Args: 824 | message (str): The message to write 825 | font_file (str): The Hershy font file to use. 826 | Defaults to rowmans.fnt if not specified. 827 | 828 | 829 | Provided font_files: 830 | 831 | ============= ============== ============= ============= 832 | |astrol.fnt| |greekp.fnt| |marker.fnt| |romanp.fnt| 833 | |cyrilc.fnt| |greeks.fnt| |meteo.fnt| |romans.fnt| 834 | |gotheng.fnt| |italicc.fnt| |misc.fnt| |romant.fnt| 835 | |gothger.fnt| |italiccs.fnt| |music.fnt| |scriptc.fnt| 836 | |gothita.fnt| |italict.fnt| |romanc.fnt| |scripts.fnt| 837 | |greekc.fnt| |japan.fnt| |romancs.fnt| |symbol.fnt| 838 | |greekcs.fnt| |lowmat.fnt| |romand.fnt| |uppmat.fnt| 839 | ============= ============== ============= ============= 840 | 841 | Example (for a Turtle instance named turtle):: 842 | 843 | >>> turtle.write('Howdy!', '/fonts/cursive.fnt') 844 | 845 | 846 | Note: 847 | If a scale factor is set using :func:`scale`, the size of the 848 | message glyphs are multiplied by the current scale setting. 849 | 850 | The default scale setting is is 1.0, a scale of '2' would double 851 | the size of the glyphs. 852 | 853 | """ 854 | was_down = self._drawing 855 | self.penup() 856 | with open(font_file, "rb", buffering=0) as file: 857 | characters = int.from_bytes(file.read(2), 'little') 858 | if characters > 96: 859 | begins = 0x00 860 | ends = characters 861 | else: 862 | begins = 0x20 863 | ends = characters + 0x20 864 | 865 | for char in [ord(char) for char in message]: 866 | if begins <= char <= ends: 867 | is_down = False 868 | (pos_x, pos_y) = self.position() 869 | file.seek((char-begins+1)*2) 870 | file.seek(int.from_bytes(file.read(2), 'little')) 871 | length = ord(file.read(1)) 872 | left, right = file.read(2) 873 | 874 | left -= 0x52 # Position left side of the glyph 875 | right -= 0x52 # Position right side of the glyph 876 | width = right - left # Calculate the character width 877 | 878 | for _ in range(length): 879 | vector_x, vector_y = file.read(2) 880 | vector_x -= 0x52 881 | vector_y -= 0x52 882 | 883 | if vector_x == -50: 884 | is_down = False 885 | continue 886 | 887 | self._goto( 888 | Vec2D(pos_x + vector_x - left, pos_y - vector_y), 889 | is_down) 890 | 891 | is_down = True 892 | 893 | self._goto(Vec2D(pos_x + width, pos_y), False) 894 | 895 | if was_down: 896 | self.pendown() 897 | 898 | 899 | def _turn(self, angle): 900 | """ 901 | Turn turtle left by angle units 902 | 903 | Args: 904 | angle (int, float): angle units to turn 905 | 906 | Method should be overwritten by your robot's class 907 | """ 908 | print("turn", angle, "is not implemented") 909 | 910 | 911 | def _move(self, distance): 912 | """ 913 | Move the turtle forward by the specified distance. 914 | 915 | Args: 916 | distance (int, float) distance to move 917 | 918 | Method should be overwritten by your robot's class 919 | """ 920 | print("move", distance, "is not implemented") 921 | 922 | 923 | def _pen(self, down): 924 | """ 925 | Raise or Lower the turtle's pen 926 | 927 | Args: 928 | down (bool): True=Raise Pen, False=Lower Pen 929 | 930 | Method should be overwritten by robot's class 931 | """ 932 | print("pen", down, "is not implemented") 933 | 934 | # Aliases for compatibility with turtle 935 | fd = forward 936 | bk = back 937 | backward = back 938 | rt = right 939 | lt = left 940 | position = pos 941 | setpos = goto 942 | setposition = goto 943 | seth = setheading 944 | -------------------------------------------------------------------------------- /lib/turtleplotbot.py: -------------------------------------------------------------------------------- 1 | """ 2 | .. module:: turtleplotbot 3 | :synopsis: functions to control the ESP-32 based TurtlePlotBot 4 | 5 | MIT License 6 | Copyright (c) 2020 Russ Hughes 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | 26 | 27 | TurtlePlotBot Class Functions 28 | ============================ 29 | 30 | The `turtleplotbot` module contains the `TurtlePlotBot` class used to provide the 31 | hardware interface needed by the `turtleplotbot` module to run a 32 | `TurtlePlotBot` using an ESP-32 device and a |esp32bot|. 33 | 34 | .. topic::Library Dependencies 35 | 36 | `micropython-servo 37 | `_ 38 | by `Radomir Dopieralski 39 | `_ 40 | 41 | `MicroPython ssd1306 display driver 42 | `_ 43 | 44 | """ 45 | 46 | #pylint: disable-msg=import-error 47 | import time 48 | from math import pi 49 | import machine 50 | import mcp23017 51 | from servo import Servo 52 | from turtleplot import TurtlePlot 53 | 54 | #pylint: disable-msg=invalid-name 55 | const = lambda x: x 56 | 57 | #pylint: disable-msg=bad-whitespace 58 | _I2C_ADDR = const(0x20) # MCP23008 i2c address 59 | _SCL_PIN = const(22) # i2c SCL Pin 60 | _SDA_PIN = const(21) # i2c SDA Pin 61 | _SERVO_PIN = const(13) # Servo control pin 62 | 63 | _PEN_UP_ANGLE = const(90) # servo angle for pen up 64 | _PEN_DOWN_ANGLE = const(180) # servo angle for pen down 65 | _STEPS_PER_REV = const(4076) # stepper steps per revolution 66 | _WHEEL_DIAMETER = 64.5 # in mm (increase = spiral out) 67 | _WHEELBASE = 112.5 # in mm (increase = spiral in) 68 | _LEFT_MOTOR = const(0) # left motor index 69 | _RIGHT_MOTOR = const(1) # right motor index 70 | 71 | _WHEEL_BPI = _WHEELBASE * pi 72 | _STEPS_PER_MM = _STEPS_PER_REV / (_WHEEL_DIAMETER * pi) 73 | _MOTORS = (_LEFT_MOTOR, _RIGHT_MOTOR) 74 | 75 | _STEP_MASKS = ( 76 | 0b1000, 0b1100, 0b0100, 0b0110, 0b0010, 0b0011, 0b0001, 0b1001 77 | ) 78 | 79 | class TurtlePlotBot(TurtlePlot): # pylint: disable=too-many-instance-attributes, too-many-public-methods 80 | """ 81 | Initialize the TurtlePlotBot 82 | 83 | Args: 84 | i2c (machine.I2C): The I2C peripheral to use. 85 | Defaults to creating a device using the pins 86 | defined in _SCL_PIN and _SDA_PIN. 87 | """ 88 | def __init__(self, scl=_SCL_PIN, sda=_SDA_PIN): 89 | """ 90 | Initialize the turtleplotbot, optionally passing an i2c object to use. 91 | """ 92 | self._current_step = [0, 0] # current step indexes 93 | self._step_delay = 1000 # us delay between steps 94 | self._pen_delay = 250 # ms delay for pen raise or lower 95 | 96 | self.mcp23017 = mcp23017.MCP23017( 97 | machine.I2C( 98 | scl=machine.Pin(scl), 99 | sda=machine.Pin(sda), 100 | freq=100000), 101 | 0x20) 102 | 103 | # pylint: disable=no-member 104 | 105 | self.mcp23017.porta.mode = 0x00 # porta output 106 | self.mcp23017.porta.gpio = 0x00 # all pins low 107 | 108 | self._pen_servo = Servo( 109 | machine.Pin(_SERVO_PIN, machine.Pin.OUT), 110 | freq=50, 111 | min_us=600, 112 | max_us=2400, 113 | angle=180) 114 | 115 | time.sleep_ms(100) 116 | self._pen_servo.write_angle(degrees=_PEN_UP_ANGLE) 117 | 118 | self.rst = machine.Pin(16, machine.Pin.OUT) # power pin for LCD display 119 | self.rst.value(1) # power on 120 | 121 | super().__init__() 122 | 123 | 124 | def _movesteppers(self, left, right): 125 | """ 126 | Internal routine to step steppers 127 | 128 | Note: 129 | Both steppers always move the same distance, but not 130 | always in the same direction. De-energizes the stepper 131 | coils after moving to save power. 132 | 133 | Args: 134 | left (float or integer): millimeters to move left stepper 135 | right (float or integer): millimeters to move right stepper 136 | 137 | """ 138 | steppers = [int(left * _STEPS_PER_MM), int(right * _STEPS_PER_MM)] 139 | steps = abs(steppers[_LEFT_MOTOR]) 140 | 141 | for _ in range(steps): 142 | # pylint: disable=no-member 143 | last = time.ticks_us() 144 | out = 0 145 | for motor in _MOTORS: 146 | if steppers[motor]: 147 | self._current_step[motor] &= 0x07 148 | mask = _STEP_MASKS[self._current_step[motor]] 149 | out |= mask <<4 if motor else mask 150 | 151 | if steppers[motor] > 0: 152 | self._current_step[motor] -= 1 153 | 154 | if steppers[motor] < 0: 155 | self._current_step[motor] += 1 156 | 157 | self.mcp23017.porta.gpio = out 158 | 159 | while time.ticks_diff(time.ticks_us(), last) < self._step_delay: 160 | time.sleep_us(100) 161 | 162 | # de-energize stepper coils between moves to save power 163 | self.mcp23017.porta.gpio = 0x00 # all pins low 164 | 165 | 166 | def _turn(self, angle): 167 | """ 168 | Turn TurtlePlotBot left angle degrees 169 | 170 | Args: 171 | angle (integer or float): turn left degrees 172 | 173 | This Method overrides the TurtlePlotBot method 174 | """ 175 | distance = _WHEEL_BPI * (angle / 360.0) 176 | self._movesteppers(-distance, -distance) 177 | 178 | 179 | def _move(self, distance): 180 | """ 181 | Move the TurtlePlotBot distance millimeters 182 | 183 | Args: 184 | distance (integer or float): 185 | 186 | This Method overrides the TurtlePlotBot method 187 | """ 188 | self._movesteppers(-distance, distance) 189 | 190 | 191 | def _pen(self, down): 192 | """ 193 | lower or raise the pen 194 | 195 | Args: 196 | down (boolean): 197 | 198 | This Method overrides the TurtlePlotBot method 199 | """ 200 | if down: 201 | self._pen_servo.write_angle(degrees=_PEN_DOWN_ANGLE) 202 | else: 203 | self._pen_servo.write_angle(degrees=_PEN_UP_ANGLE) 204 | # pylint: disable=no-member 205 | time.sleep_ms(self._pen_delay) 206 | 207 | 208 | def done(self): 209 | """ 210 | Raise pen and turn off the stepper motors. 211 | """ 212 | self.penup() 213 | self._pen_servo.deinit() 214 | self.mcp23017.porta.gpio = 0x00 # all outputs to zero 215 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import menu 2 | -------------------------------------------------------------------------------- /micropython/fat.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/micropython/fat.zip -------------------------------------------------------------------------------- /micropython/turtleplotbot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russhughes/turtleplotbot3/f4a9a3b4ccd6f1d33c00da21295b6e7d8edcc547/micropython/turtleplotbot.bin -------------------------------------------------------------------------------- /programs/free_space.py: -------------------------------------------------------------------------------- 1 | import uos 2 | 3 | import vga2_bold_16x16 as font 4 | import tftui 5 | 6 | def main(ui): 7 | fs_stat = uos.statvfs('/') 8 | fs_size = fs_stat[0] * fs_stat[2] 9 | fs_free = fs_stat[0] * fs_stat[3] 10 | 11 | ui.cls() 12 | ui.center("System Size",0) 13 | ui.center("{:,}".format(fs_size), 1) 14 | 15 | ui.center("Free Space", 3) 16 | ui.center("{:,}".format(fs_free), 4) 17 | 18 | ui.center("Press to", 6) 19 | ui.wait("Continue", 7) 20 | 21 | main(tftui.UI(font)) 22 | 23 | __import__("menu") # return to turtleplotbot menu 24 | -------------------------------------------------------------------------------- /programs/hello.py: -------------------------------------------------------------------------------- 1 | """ 2 | hello.py: Simple example using write 3 | """ 4 | #pylint: disable-msg=import-error 5 | from turtleplotbot import TurtlePlotBot 6 | import vga2_bold_16x16 as font 7 | import tftui 8 | 9 | def main(ui): 10 | """ 11 | Write "Hello!" 12 | """ 13 | message = "Hello!" 14 | ui.cls() 15 | width = ui.size(message, scale=2, font="fonts/scripts.fnt") 16 | column = ui.width//2 - width//2 17 | line = ui.height//2 - 16 18 | ui.draw(message, column, line, scale=2, font="fonts/scripts.fnt") 19 | 20 | bot = TurtlePlotBot() 21 | bot.setscale(2) 22 | bot.write(message, "fonts/scripts.fnt") 23 | bot.done() 24 | 25 | main(tftui.UI(font)) 26 | 27 | __import__("menu") # return to turtleplotbot menu 28 | -------------------------------------------------------------------------------- /programs/message.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Write text using user provided values 3 | ''' 4 | #pylint: disable-msg=import-error 5 | import uos 6 | from turtleplotbot import TurtlePlotBot 7 | import vga2_bold_16x16 as font 8 | import tftui 9 | import button 10 | 11 | def main(ui): 12 | """ 13 | Write text using user provided values 14 | """ 15 | fonts = [f for f in uos.listdir("/fonts") if f.endswith(".fnt")] 16 | fonts_len = len(fonts) 17 | message = "Hello!" 18 | scale = 0 19 | ok = 0 20 | 21 | form = [ 22 | [ui.HEAD, 0, "Write A Message"], 23 | [ui.STR, 0, 2, "Message:", 0, 3, 16, message], 24 | [ui.SEL, 0, 5, "Scale:", 6, 5, ("1", "2", "3"), scale], 25 | [ui.OK, 0, 7, ("Next", "Cancel"), ok], 26 | ] 27 | 28 | again = True 29 | while again: 30 | btn, ok = ui.form(form) 31 | if btn == button.CENTER and ok == 0: 32 | message = form[1][ui.VAL] 33 | scale = form[2][ui.VAL]+1 34 | font = 0 35 | font = ui.menu("Choose A Font", fonts, font) 36 | if font is not None: 37 | 38 | while again: 39 | ui.cls(fonts[font], 0) 40 | font_file = "/fonts/" + fonts[font] 41 | width = ui.size(message, font=font_file, scale=scale) 42 | 43 | ui.draw( 44 | message, 45 | ui.width//2 - width//2, 46 | ui.height//2, 47 | ui.fg, 48 | font=font_file, 49 | scale=scale) 50 | 51 | response = 0 52 | btn, response = ui.select(0, 7, ("Draw", "Back", "Quit"), response) 53 | if btn == button.CENTER: 54 | if response == 0: 55 | ui.cls(0) 56 | bot = TurtlePlotBot() 57 | bot.setscale(scale) 58 | bot.write(message, "/fonts/" + fonts[font]) 59 | bot.done() 60 | again = False 61 | elif response == 2: 62 | again = False 63 | 64 | if btn == button.UP: 65 | font -= 1 66 | font %= fonts_len 67 | 68 | elif btn == button.DOWN: 69 | font += 1 70 | font %= fonts_len 71 | 72 | else: 73 | again = False 74 | 75 | main(tftui.UI(font)) 76 | 77 | __import__("menu") # return to turtleplotbot menu 78 | -------------------------------------------------------------------------------- /programs/reset_config.py: -------------------------------------------------------------------------------- 1 | 2 | """ 3 | Write ui.cfg with default values 4 | """ 5 | 6 | #pylint: disable-msg=import-error 7 | import btree 8 | import vga2_bold_16x16 as font 9 | import button 10 | import tftui 11 | 12 | def reset_cfg(): 13 | """ 14 | Overwrite ui.cfg with default values 15 | """ 16 | cfg_file = open("ui.cfg", "w+b") 17 | cfg_db = btree.open(cfg_file) 18 | 19 | # Add a default AP name and password 20 | cfg_db[b'AP_NAME'] = b'TurtleBot' 21 | cfg_db[b'AP_PASS'] = b'turtlebot' 22 | 23 | # Add any password for ap's you use 24 | cfg_db[b'MY_AP_NAME'] = b'mypassword' 25 | 26 | for key in cfg_db: 27 | print("key", key, " = ", cfg_db[key]) 28 | 29 | cfg_db.close() 30 | cfg_file.close() 31 | 32 | def main(ui): 33 | """ 34 | Ask for confirmation before reset 35 | """ 36 | ui.cls("Reset", 2) 37 | ui.center("Config?", 3) 38 | ok = 0 39 | btn, ok = ui.select(0, 7, ("Reset", "Cancel"), ok) 40 | if btn == button.CENTER and ok == 0: 41 | reset_cfg() 42 | ui.cls("Resetting", 3) 43 | ui.center("Press to", 5) 44 | ui.wait("Continue", 6) 45 | else: 46 | ui.cls("Canceled", 3) 47 | ui.center("Press to", 5) 48 | ui.wait("Continue", 6) 49 | 50 | main(tftui.UI(font)) 51 | 52 | __import__("menu") # return to turtleplotbot menu 53 | -------------------------------------------------------------------------------- /programs/show_fonts.py: -------------------------------------------------------------------------------- 1 | ''' 2 | scroll_fonts.py - Scroll Hershey fonts on display 3 | ''' 4 | 5 | #pylint: disable-msg=import-error 6 | import uos 7 | import button 8 | import vga2_bold_16x16 as font 9 | import tftui 10 | 11 | def main(ui): 12 | """ 13 | Main routine 14 | """ 15 | fonts = [font for font in uos.listdir('/fonts') if font.endswith('.fnt')] 16 | font_count = len(fonts) 17 | font_current = 0 18 | message="Hello!" 19 | again = True 20 | joystick = button.JoyStick() 21 | 22 | while again: 23 | ui.cls(fonts[font_current], 0) 24 | 25 | font = '/fonts/' + fonts[font_current] 26 | column = ui.width//2 - ui.size(message, scale=1, font=font)//2 27 | line = ui.height//2 - 16 28 | 29 | ui.draw(message, column, line, scale=1, font=font) 30 | 31 | ui.center('Up-Prev Dn-Next', 6) 32 | ui.center('other-exit', 7) 33 | btn = button.JoyStick().read() 34 | 35 | if btn == button.DOWN: 36 | font_current -= 1 37 | font_current %= font_count 38 | 39 | elif btn == button.UP: 40 | font_current += 1 41 | font_current %= font_count 42 | 43 | again = btn in [button.UP, button.DOWN] 44 | 45 | main(tftui.UI(font)) 46 | 47 | __import__("menu") # return to turtleplotbot menu 48 | -------------------------------------------------------------------------------- /programs/stars.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Draw a star from user provided values 3 | ''' 4 | #pylint: disable-msg=import-error 5 | from turtleplotbot import TurtlePlotBot 6 | import vga2_bold_16x16 as font 7 | import button 8 | import tftui 9 | 10 | def star(bot, points, length): 11 | ''' 12 | Draw a 'n' pointed star with 'length' sides 13 | 14 | Args: 15 | sides: number of points 16 | length: length of each side 17 | ''' 18 | angle = 180.0 - 180.0 / points 19 | bot.pendown() 20 | 21 | for _ in range(points): 22 | bot.forward(length) 23 | bot.left(angle) 24 | bot.forward(length) 25 | 26 | bot.penup() 27 | 28 | def main(ui): 29 | """ 30 | Main routine 31 | """ 32 | points = 5 33 | length = 20 34 | ok = 0 35 | 36 | form = [ 37 | [ui.HEAD, 0, "Draw A Star"], 38 | [ui.INT, 0, 2, "Points:", 8, 2, 2, points], 39 | [ui.INT, 0, 4, "Length:", 8, 4, 2, length], 40 | [ui.OK, 0, 7, ("Next", "Cancel"), ok], 41 | ] 42 | 43 | btn, ok = ui.form(form) 44 | if btn == button.CENTER and ok == 0: 45 | points = form[1][ui.VAL] 46 | length = form[2][ui.VAL] 47 | 48 | bot = TurtlePlotBot() 49 | star(bot, points, length) 50 | 51 | main(tftui.UI(font)) 52 | 53 | __import__("menu") # return to turtleplotbot menu 54 | --------------------------------------------------------------------------------