Compare commits

...

98 Commits

Author SHA1 Message Date
aadd328ef3 Added emulator as submodule, updated makefile to run directly os in emulator 2023-12-02 09:31:46 +01:00
Daniele
bb5cb5461c Merge branch 'master' of ssh://ichibi.eu:222/home/git/pato-z80-home-computer 2022-02-06 20:35:19 +01:00
Daniele
7ce4046796 Setting up PAT80 Emulator 2022-02-06 20:33:27 +01:00
Daniele Verducci (ZenPenguin)
bd6be9f18a Missing image 2021-07-11 21:13:04 +02:00
Daniele Verducci (ZenPenguin)
6f435cce35 Fixed image spacing in readme 2021-07-11 09:54:02 +02:00
Daniele Verducci (ZenPenguin)
aa844687c8 Ready for github publishing 2021-07-11 09:49:42 +02:00
Daniele Verducci (ZenPenguin)
1c77bc82ac Refinement 2021-04-02 09:06:41 +02:00
Daniele Verducci (ZenPenguin)
6e2c7a8e2d Fixed caps lock footprint error 2021-04-02 08:52:07 +02:00
Daniele Verducci (ZenPenguin)
e8ccf2a224 Keyboard PCB: edge cuts and mounting holes 2021-03-30 08:59:16 +02:00
Daniele Verducci (ZenPenguin)
7ed696e722 Completed routing keyboard PCB 2021-03-30 08:41:04 +02:00
Daniele Verducci su MatissePenguin
1dc178332d WIP routing keyboard 2021-03-29 20:23:44 +02:00
Daniele Verducci (ZenPenguin)
5478926e85 WIP routing keyboard 2021-03-29 09:06:48 +02:00
Daniele Verducci su MatissePenguin
133eb1a432 WIP routing keyboard 2021-03-28 22:39:42 +02:00
Daniele Verducci (ZenPenguin)
0a888b0955 Distanced keys to avoid interference 2021-03-27 20:50:56 +01:00
Daniele Verducci (ZenPenguin)
5b8914e5a9 Fine-positioned caps lock switch 2021-03-27 20:11:03 +01:00
Daniele Verducci su MatissePenguin
f3960a9f07 Uncommitted files 2021-03-27 19:49:10 +01:00
Daniele Verducci su MatissePenguin
ebfe3ae420 Split keyboard into two different schematics: kb controller and kb assembly. Started routing keyboard pcb. 2021-03-27 19:38:49 +01:00
Daniele Verducci su MatissePenguin
527da622c9 Assigning footprints 2021-03-27 14:56:14 +01:00
Daniele Verducci su MatissePenguin
bdb5e35a73 Final keyboard schematics with joystick port 2021-03-27 09:51:18 +01:00
Daniele Verducci (ZenPenguin)
025f324f63 Completed keyboard schematics 2021-03-26 08:52:01 +01:00
Daniele Verducci (ZenPenguin)
e5f8475364 WIP mainboard routing 2021-03-26 07:18:45 +01:00
Daniele Verducci su MatissePenguin
1ceee757e3 WIP routing mainboard 2021-03-24 22:38:25 +01:00
Daniele Verducci su MatissePenguin
bf678289eb WIP Keyboard schematics 2021-03-22 20:06:12 +01:00
Daniele Verducci (ZenPenguin)
ab9f1144a6 WIP Keyboard schematics (too much keys) 2021-03-21 20:31:05 +01:00
Daniele Verducci (ZenPenguin)
0727b793c3 Connector description 2021-03-21 17:59:52 +01:00
Daniele Verducci su MatissePenguin
9516ec36ba Schematics: assigned footprints, created ratsnest 2021-03-20 20:29:46 +01:00
Daniele Verducci su MatissePenguin
6796c134f3 Schematic complete, commit before assigning footprints 2021-03-20 19:01:09 +01:00
Daniele Verducci (ZenPenguin)
3c02ac0640 Almost finished transcribing mainboard schematics 2021-03-20 10:35:38 +01:00
Daniele Verducci (ZenPenguin)
3fe353db2e Memory decoding, WIP IO decoding 2021-03-19 08:58:05 +01:00
Daniele Verducci (ZenPenguin)
f179a1d8f5 WIP Schematics 2021-03-17 08:58:29 +01:00
Daniele Verducci su MatissePenguin
2a0750a06e Reset circuit 2021-03-15 20:12:23 +01:00
Daniele Verducci (ZenPenguin)
d2c3aa9bb2 Removed symbol using third party library 2021-03-15 19:30:11 +01:00
Daniele Verducci (ZenPenguin)
6890e352c1 WIP Mainboard schematics: added CPU, RAM, ROM, Addr and data bus.
TODO: Fix external dependency
2021-03-15 08:58:44 +01:00
Daniele Verducci (ZenPenguin)
faef987494 WIP UART sampling at mid clock 2021-03-15 07:30:36 +01:00
Daniele Verducci su MatissePenguin
186689fd5c UART: Thinking how to delay sampling to mid clock 2021-03-06 14:09:38 +01:00
Daniele Verducci su MatissePenguin
35cb230ea6 Working UART simulation without rx clock sync 2021-03-06 12:59:01 +01:00
Daniele Verducci su MatissePenguin
ec86180d82 Merge branch 'master' of ssh://ichibi.ddns.net:222/home/git/Repositories/pato-z80-home-computer 2021-03-06 11:56:46 +01:00
Daniele Verducci (ZenPenguin)
f414a14c09 WIP UART Rx simulation with Logisim 2021-03-05 08:58:22 +01:00
Daniele Verducci su MatissePenguin
8d38709c46 Working on memtest 2021-03-01 19:50:50 +01:00
Daniele Verducci (ZenPenguin)
2ba63877bf WIP memory check in memory monitor 2021-03-01 09:17:05 +01:00
Daniele Verducci su MatissePenguin
ddb7c58640 Reduced problem on char draw 2021-02-28 19:47:08 +01:00
Daniele Verducci su MatissePenguin
1d4c4f8d3f Bugfix, refactoring 2021-02-25 23:26:13 +01:00
Daniele Verducci su MatissePenguin
0697bc3753 Working carriage return 2021-02-22 20:01:19 +01:00
Daniele Verducci su MatissePenguin
2b3f9946d9 Working end of screen scrolling 2021-02-22 19:55:53 +01:00
Daniele Verducci (ZenPenguin)
2c65665900 Untested code 2021-02-22 13:59:55 +01:00
Daniele Verducci su MatissePenguin
75f5ce057f Fixed cat size to new resolution 2021-02-20 21:02:19 +01:00
Daniele Verducci su MatissePenguin
33baf71cf0 Straight, but unstable image. Some unwanted spaces during vertical sync 2021-02-20 20:33:55 +01:00
Daniele Verducci su MatissePenguin
36ede10f3b Testing with cat image 2021-02-20 17:02:13 +01:00
Daniele Verducci su MatissePenguin
97adb88023 Refinements 2021-02-20 11:22:29 +01:00
Daniele Verducci su MatissePenguin
cc9805f044 Minor fix 2021-02-16 08:57:15 +01:00
Daniele Verducci su MatissePenguin
e34cfef259 WIP newline and end-of-screen shift 2021-02-15 22:54:54 +01:00
Daniele Verducci su MatissePenguin
d3604ca3ab Working EOL 2021-02-15 21:23:12 +01:00
Daniele Verducci su MatissePenguin
706dbe56e1 Extended image to 368x256 2021-02-14 19:08:45 +01:00
Daniele Verducci su MatissePenguin
d71e5b65cf Perfected timings 2021-02-14 18:29:24 +01:00
Daniele Verducci su MatissePenguin
7e3896848f Trying to fit vertically the image. Heavily distorted on CRT. 2021-02-12 19:50:24 +01:00
Daniele Verducci su MatissePenguin
c90516ab51 horyzontally centered image in CRT 2021-02-12 19:23:08 +01:00
Daniele Verducci su MatissePenguin
b395a4dd21 Reduced columns to 46 2021-02-12 18:58:57 +01:00
Daniele Verducci su MatissePenguin
9872968720 Characters test prior to memory map refactor 2021-02-12 13:04:20 +01:00
Daniele Verducci su MatissePenguin
8ed06f78e4 ps/2 debugger 2021-02-12 12:20:41 +01:00
Daniele Verducci su MatissePenguin
e1af852f2e WIP PS/2 Keyboard 2021-02-09 18:54:30 +01:00
Daniele Verducci su MatissePenguin
a1a858a701 Reading ps/2 keyboard, but somehow, keycodes are decremented by 1 2021-02-07 11:01:58 +01:00
Daniele Verducci su MatissePenguin
2366408679 WIP PS/2 keyboard driver 2021-02-03 21:31:13 +01:00
Daniele Verducci (ZenPenguin)
51780e5606 Started implementing PS/2 Keyboard driver 2021-02-03 08:58:00 +01:00
Daniele Verducci su MatissePenguin
5bea35365d Back working on communication 2021-01-27 08:58:04 +01:00
Daniele Verducci su MatissePenguin
467197fd23 First working text mode without end of screen scroll 2021-01-26 23:22:55 +01:00
Daniele Verducci su MatissePenguin
9d6e6efd13 WIP 2021-01-26 20:52:53 +01:00
Daniele Verducci su MatissePenguin
64da85548e Single line chars demo 2021-01-26 08:29:08 +01:00
Daniele Verducci su MatissePenguin
154e4dc10c Working character output, non working return to home 2021-01-25 08:46:01 +01:00
Daniele Verducci su MatissePenguin
9de4753984 Testing character generation 2021-01-24 12:13:17 +01:00
Daniele Verducci (ZenPenguin)
baa00e3ea0 Testing char drawing routine 2021-01-24 11:48:35 +01:00
Daniele Verducci (ZenPenguin)
f49818caa1 Big refactoring and first character generator implementation 2021-01-24 11:27:40 +01:00
Daniele Verducci (ZenPenguin)
415300a2db Started working on characters 2021-01-22 08:58:11 +01:00
Daniele Verducci su MatissePenguin
17fdf97f75 Copying data bus to framebuffer memory, but ignoring clock signal 2021-01-19 21:38:21 +01:00
Daniele Verducci (ZenPenguin)
792db80ab4 Refactoring 2021-01-19 08:36:01 +01:00
Daniele Verducci (ZenPenguin)
3b23740c36 Renamed r0 to A 2021-01-19 07:58:06 +01:00
Daniele Verducci (ZenPenguin)
03e549a69c Merge branch 'master' of ichibi:/home/git/Repositories/pato-z80-home-computer 2021-01-19 07:43:47 +01:00
Daniele Verducci su MatissePenguin
901fe50fee Temporary fix for first short sync timer after image firing in advance 2021-01-17 17:51:34 +01:00
Daniele Verducci su MatissePenguin
b3269125ac Fixed halved number of sync pulses 2021-01-17 17:09:13 +01:00
Daniele Verducci su MatissePenguin
8b2063c6bc Working on timings 2021-01-17 10:58:04 +01:00
Daniele Verducci su MatissePenguin
cf3956356e Working timer1, but wrong timings 2021-01-16 19:54:32 +01:00
Daniele Verducci su MatissePenguin
7c07014b75 Using official mc device definition 2021-01-13 19:22:07 +01:00
Daniele Verducci (ZenPenguin)
90c200e6a9 Not working implementation of timer-driven video signal generation 2 2021-01-10 11:30:47 +01:00
Daniele Verducci (ZenPenguin)
ce23f9e799 Not working implementation of timer-driven video signal generation 2021-01-10 10:50:34 +01:00
Daniele Verducci (ZenPenguin)
66414a2e57 Merge branch 'master' of ichibi:/home/git/Repositories/pato-z80-home-computer 2021-01-10 07:23:18 +01:00
Daniele Verducci (ZenPenguin)
b64ed1839a WIP documenting interfacing idea 2021-01-10 07:22:55 +01:00
Daniele Verducci su MatissePenguin
ccb9d5ecec Documented idea of interrupt-driven video generation 2021-01-09 21:24:36 +01:00
Daniele Verducci su MatissePenguin
8959c7add8 Working stable non-interlaced image of cat read from rom into ram framebuffer 2021-01-08 17:32:08 +01:00
Daniele Verducci su MatissePenguin
ae495b6714 Polish 2021-01-08 16:12:46 +01:00
Daniele Verducci su MatissePenguin
62e98d7fe4 Scrambled image due to inverted bit order in every of the 52 line byte chunks 2021-01-08 10:08:03 +01:00
Daniele Verducci su MatissePenguin
a86dbed7f7 Fixed memory hsync 2021-01-07 18:50:05 +01:00
Daniele Verducci su MatissePenguin
2b32039b42 Read framebuffer from mc's memory 2021-01-07 13:32:01 +01:00
Daniele Verducci su MatissePenguin
0b88c7d0db WIP fucking video generation 2021-01-07 09:14:09 +01:00
Daniele Verducci su MatissePenguin
06779c5442 Loses sync when loading from memory 2021-01-06 00:19:15 +01:00
Daniele Verducci su MatissePenguin
09785e1317 Fixed timings 2021-01-03 15:30:06 +01:00
Daniele Verducci su MatissePenguin
c0f7049df9 New test pattern, still hsync issues 2021-01-03 12:48:38 +01:00
Daniele Verducci (ZenPenguin)
08b32b2064 Interrupt brings up Monitor: working, but calling "run" leaves garbage in the SP 2021-01-03 09:37:22 +01:00
Daniele Verducci (ZenPenguin)
b98ad3e136 Merge branch 'master' into monitor-interrupt 2021-01-03 08:23:56 +01:00
Daniele Verducci (ZenPenguin)
3ebf35fa77 WIP immediate return to monitor via interrupt 2021-01-02 10:53:30 +01:00
95 changed files with 247214 additions and 526 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "pat80-emulator/z80-python-emulator"]
path = pat80-emulator/z80-python-emulator
url = https://github.com/penguin86/z80-python-emulator.git

47
NOTES.md Normal file
View File

@ -0,0 +1,47 @@
# Software utilizzato
Compilatore assembly: z80asm (da repo debian)
Compilatore c: sdcc (da repo debian)
Eeprom flash: minipro (da https://gitlab.com/DavidGriffith/minipro/)
Disegnatore schemi logici: logisim (jar da sourceforge)
Per usarlo su hdpi: `java -Dsun.java2d.uiScale=2 -jar logisim-generic-2.7.1.jar`
Disegnatore circuiti: fritzing (da repo debian)
# Assembly
## Deploy
### Compilare assembly:
`z80asm -i hd44780_lcd_test_procedure.asm -o rom.bin`
### Portare binario alla dimensione dell eeprom:
`dd if=/dev/zero of=rom.bin bs=1 count=0 seek=8192`
### Scrivere su EEPROM:
`minipro -w rom.bin -p "AT28C64B"`
### Leggere EEPROM:
`minipro -r rom_read.bin -p "AT28C64B"`
## Istruzioni
### Dichiarare una variabile:
Usare EQU per assegnare una posizione di memoria nota (nella RAM) al nome variabile.
```
myVar: EQU 0x800F ; init variable
ld hl, "A" ; load value into register
ld (myVar), hl ; copy value into variable
```
NB: Se il programma si blocca, verificare che la variabile non sia stata dichiarata in una parte non scrivibile della memoria (ROM)
### Accedere ad una variabile
Modificarne il valore (nell'esempio: incrementarla di 1)
```
ld a, (myVar)
inc a
ld (myVar), a
```
Passarne il puntatore ad una funzione:
```
ld bc, myVar
call lcd_print
```
### Segmentation fault
Controllare che non si stia puntando ad un registro con le parentesi:
`ld (ix), a`
# C
## Deploy
### Compilare c:
`sdcc -mz80 test.c`

115
README.md
View File

@ -1,47 +1,72 @@
# Software utilizzato # Pat80
Compilatore assembly: z80asm (da repo debian)
Compilatore c: sdcc (da repo debian)
Eeprom flash: minipro (da https://gitlab.com/DavidGriffith/minipro/)
Disegnatore schemi logici: logisim (jar da sourceforge)
Per usarlo su hdpi: `java -Dsun.java2d.uiScale=2 -jar logisim-generic-2.7.1.jar`
Disegnatore circuiti: fritzing (da repo debian)
# Assembly ![Pat80 Home Computer Logo](/assets/media/pat80-banner-colour-raster.png)
## Deploy
### Compilare assembly:
`z80asm -i hd44780_lcd_test_procedure.asm -o rom.bin`
### Portare binario alla dimensione dell eeprom:
`dd if=/dev/zero of=rom.bin bs=1 count=0 seek=8192`
### Scrivere su EEPROM:
`minipro -w rom.bin -p "AT28C64B"`
### Leggere EEPROM:
`minipro -r rom_read.bin -p "AT28C64B"`
## Istruzioni
### Dichiarare una variabile:
Usare EQU per assegnare una posizione di memoria nota (nella RAM) al nome variabile.
```
myVar: EQU 0x800F ; init variable
ld hl, "A" ; load value into register
ld (myVar), hl ; copy value into variable
```
NB: Se il programma si blocca, verificare che la variabile non sia stata dichiarata in una parte non scrivibile della memoria (ROM)
### Accedere ad una variabile
Modificarne il valore (nell'esempio: incrementarla di 1)
```
ld a, (myVar)
inc a
ld (myVar), a
```
Passarne il puntatore ad una funzione:
```
ld bc, myVar
call lcd_print
```
### Segmentation fault
Controllare che non si stia puntando ad un registro con le parentesi:
`ld (ix), a`
# C Pat80 Home Computer is an attempt to develop the simplest possible Zilog Z80 based computer in 2021.
## Deploy
### Compilare c: ## Hardware
`sdcc -mz80 test.c` Instead of being another single board computer, Pat80 focuses on modularity:
- The Core board contains Z80 CPU, 32k ram, 32k rom, memory and I/O decoding logic
- The Backplane is a stupid I/O bus board with no active components, 1 socket for the Core board and 8 sockets for I/O boards
- Each I/O board must implement tri-state and go to high impedance according to its EN pin to avoid bus contention
- The Power Supply module contains a 7805-based linear power supply capable of delivering 1A @5v for the core and I/O boards
Here is a picture of the early stages of development:
![Pat80 Breadboard prototype](/assets/media/photos/breadboard.jpg)
### I/O Boards
#### Parallel terminal interface
A parallel terminal based on Arduino is used for development purposes and will be replaced by an UART card.
#### Keyboard controller
Pat80 features a blue-switches mechanical matrix keyboard, seen by the system as a memory area in I/O space. The keyboard doesn't use interrupts and is polled by the OS.
#### Video controller
The monochrome 368x248 pixels video output is software-generated by an ATMega 1284 MCU. The timings are generated by the MCU's 16 bit internal timer and the vertical sync time is used to update the framebuffer.
## Software
The OS is a simple Memory Monitor. It can show memory content in hex and ascii with the typical hex editor tabular view.
Programs can be loaded from the keyboard, writing Z80 opcodes and data in hex. The program can be executed from any ram position and the Memory Monitor can be brought to screen in any moment issuing an INT signal (the Z80 INT pin should be connected to a button with pull-up resistor).
There is an experimental and unfinished quick load function using a python terminal to load a binary file directly to memory and execute it.
![Pat80 Memory Monitor](/assets/media/photos/memory_monitor.jpg)
## Emulator
The pat80 memory monitor (the os) can be run in a z80 emulator. This repository contains an emulator as submodule, already set up to run the os.
To try it, head to `pat80-computer/software/z80-assembly/os/Makefile` and run `make run` to build the rom from assembly and start the emulator. You will see some windows showing the emulated computer's memory and register status and the pat80 memory monitor prompt.
![Emulator running Memory Monitor](/assets/media/photos/emulator.png)
## Status
The project is heavily work in progress.
### Working
- Core board
- Sound board
- Arduino parallel terminal with its own Python companion script (or any UART terminal)
The only fully working configuration as now is the Core board with two devices hooked to its I/O bus: the Arduino Parallel Terminal (see `pat80-io-devices/parallel-terminal` and `pat80-computer/software/z80-assembly/os/drivers/arduino_terminal.asm`) and the SN76489 sound chip (see `pat80-computer/software/z80-assembly/os/drivers/hd44780.asm`)
### Partially working
The keyboard is only partially tested, as it's not completed.
![Pat80 keyboard pcb](/assets/media/photos/keyboard_before_etching.jpg)
![Pat80 keyboard layout](/assets/media/photos/keyboard_layout.jpg)
The composite video card is partially working, but has some nasty bugs on text cursor positioning and the graphics mode is not yet implemented (the only way to output graphics ATM is to place the bitmap in the MCU flash and load it to VRAM manually).
![Pat80 composite monitor text mode](/assets/media/photos/composite_text.jpg)
![Pat80 composite monitor graphics mode](/assets/media/photos/composite_graphics.jpg)
For the moment, better to stick with the Arduino Parallel Terminal.
### Not working
All the rest
## License
All the project is under GPL v3 license

View File

@ -1,2 +1,3 @@
# Assets # Assets
This folder contains all the media assets for presenting Pat80 to the web, print and other media This folder contains all the media and text assets for presenting Pat80 to the web, print and other media

18
assets/media/LICENSE.md Normal file
View File

@ -0,0 +1,18 @@
# Assets
This folder contains all the media assets for presenting Pat80 to the web, print and other media
## License
All files contained in this folder are part of Pat80 Assets.
Pat80 Assets is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Assets is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Assets. If not, see <http://www.gnu.org/licenses/>.

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

18
kicad-symbols/LICENSE.md Normal file
View File

@ -0,0 +1,18 @@
# Kicad symbols
This folder contains the custom symbols required by Pat80 schematics and PCB layouts.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1,18 @@
(module SW_TH_DPDT_Pushbutton_Latched (layer F.Cu) (tedit 6066BDE4)
(fp_text reference SW54 (at 0 0.5) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value CAPSLK (at 0 -0.5) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -4 2) (end 4 2) (layer F.SilkS) (width 0.12))
(fp_line (start 4 2) (end 4 10) (layer F.SilkS) (width 0.12))
(fp_line (start 4 10) (end -4 10) (layer F.SilkS) (width 0.12))
(fp_line (start -4 10) (end -4 2) (layer F.SilkS) (width 0.12))
(pad 5 thru_hole circle (at 2.54 3.429) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 6 thru_hole circle (at 2.54 5.969) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 4 thru_hole circle (at 2.54 8.509) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at -2.54 8.509) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 3 thru_hole circle (at -2.54 5.969) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 1 thru_hole circle (at -2.54 3.429) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
)

3
kicad-symbols/pat80.dcm Normal file
View File

@ -0,0 +1,3 @@
EESchema-DOCLIB Version 2.0
#
#End Doc Library

4
kicad-symbols/pat80.lib Normal file
View File

@ -0,0 +1,4 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
#End Library

View File

@ -0,0 +1,18 @@
# Hardware
This folder contains the Pat80 logic definitions, schematics and PCB layouts.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1,21 @@
# Memory Decoding logic
This folder contains the memory decoding logic used by Pat80.
The memory map is a simple 32k ram / 32k rom obtained using the MSB as EN signal.
The I/O space is split in 8 devices (each with 32 registers).
Pat80 doesn't use the [high address lines I/O hack](https://retrocomputing.stackexchange.com/questions/7782/z80-16-bit-i-o-port-addresses) but adheres to the official Z80 I/O documentation.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1,18 @@
# Hardware
This folder contains the Pat80 schematics and PCB layouts.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,566 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# 74xx_74HC04
#
DEF 74xx_74HC04 U 0 40 Y Y 7 L N
F0 "U" 0 50 50 H V C CNN
F1 "74xx_74HC04" 0 -50 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS 74HC14 74HC04 74LS14
$FPLIST
DIP?14*
$ENDFPLIST
DRAW
S -200 300 200 -300 7 1 10 f
P 4 1 0 10 -150 150 -150 -150 150 0 -150 150 f
P 4 2 0 10 -150 150 -150 -150 150 0 -150 150 f
P 4 3 0 10 -150 150 -150 -150 150 0 -150 150 f
P 4 4 0 10 -150 150 -150 -150 150 0 -150 150 f
P 4 5 0 10 -150 150 -150 -150 150 0 -150 150 f
P 4 6 0 10 -150 150 -150 -150 150 0 -150 150 f
X ~ 1 -300 0 150 R 50 50 1 0 I
X ~ 2 300 0 150 L 50 50 1 0 O I
X ~ 3 -300 0 150 R 50 50 2 0 I
X ~ 4 300 0 150 L 50 50 2 0 O I
X ~ 5 -300 0 150 R 50 50 3 0 I
X ~ 6 300 0 150 L 50 50 3 0 O I
X ~ 8 300 0 150 L 50 50 4 0 O I
X ~ 9 -300 0 150 R 50 50 4 0 I
X ~ 10 300 0 150 L 50 50 5 0 O I
X ~ 11 -300 0 150 R 50 50 5 0 I
X ~ 12 300 0 150 L 50 50 6 0 O I
X ~ 13 -300 0 150 R 50 50 6 0 I
X VCC 14 0 500 200 D 50 50 7 0 W
X GND 7 0 -500 200 U 50 50 7 0 W
ENDDRAW
ENDDEF
#
# 74xx_74HC244
#
DEF 74xx_74HC244 U 0 40 Y Y 1 L N
F0 "U" -300 650 50 H V C CNN
F1 "74xx_74HC244" -300 -650 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS 74HCT244
$FPLIST
TSSOP*4.4x6.5mm*P0.65mm*
SSOP*4.4x6.5mm*P0.65mm*
$ENDFPLIST
DRAW
S -300 600 300 -600 1 1 10 f
P 4 1 0 6 50 0 -50 50 -50 -50 50 0 N
X 1OE 1 -500 -400 200 R 50 50 1 0 I I
X GND 10 0 -800 200 U 50 50 1 0 W
X 2A3 11 -500 -200 200 R 50 50 1 0 I
X 1Y3 12 500 200 200 L 50 50 1 0 O
X 2A2 13 -500 -100 200 R 50 50 1 0 I
X 1Y2 14 500 300 200 L 50 50 1 0 O
X 2A1 15 -500 0 200 R 50 50 1 0 I
X 1Y1 16 500 400 200 L 50 50 1 0 O
X 2A0 17 -500 100 200 R 50 50 1 0 I
X 1Y0 18 500 500 200 L 50 50 1 0 O
X 2OE 19 -500 -500 200 R 50 50 1 0 I I
X 1A0 2 -500 500 200 R 50 50 1 0 I
X VCC 20 0 800 200 D 50 50 1 0 W
X 2Y0 3 500 100 200 L 50 50 1 0 O
X 1A1 4 -500 400 200 R 50 50 1 0 I
X 2Y1 5 500 0 200 L 50 50 1 0 O
X 1A2 6 -500 300 200 R 50 50 1 0 I
X 2Y2 7 500 -100 200 L 50 50 1 0 O
X 1A3 8 -500 200 200 R 50 50 1 0 I
X 2Y3 9 500 -200 200 L 50 50 1 0 O
ENDDRAW
ENDDEF
#
# 74xx_74HC245
#
DEF 74xx_74HC245 U 0 40 Y Y 1 L N
F0 "U" -300 650 50 H V C CNN
F1 "74xx_74HC245" -300 -650 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS 74HC245
$FPLIST
DIP?20*
$ENDFPLIST
DRAW
S -300 600 300 -600 1 1 10 f
P 3 1 0 0 -25 -50 -25 50 25 50 N
P 4 1 0 0 -50 -50 25 -50 25 50 50 50 N
X A->B 1 -500 -400 200 R 50 50 1 0 I
X GND 10 0 -800 200 U 50 50 1 0 W
X B7 11 500 -200 200 L 50 50 1 0 T
X B6 12 500 -100 200 L 50 50 1 0 T
X B5 13 500 0 200 L 50 50 1 0 T
X B4 14 500 100 200 L 50 50 1 0 T
X B3 15 500 200 200 L 50 50 1 0 T
X B2 16 500 300 200 L 50 50 1 0 T
X B1 17 500 400 200 L 50 50 1 0 T
X B0 18 500 500 200 L 50 50 1 0 T
X CE 19 -500 -500 200 R 50 50 1 0 I I
X A0 2 -500 500 200 R 50 50 1 0 T
X VCC 20 0 800 200 D 50 50 1 0 W
X A1 3 -500 400 200 R 50 50 1 0 T
X A2 4 -500 300 200 R 50 50 1 0 T
X A3 5 -500 200 200 R 50 50 1 0 T
X A4 6 -500 100 200 R 50 50 1 0 T
X A5 7 -500 0 200 R 50 50 1 0 T
X A6 8 -500 -100 200 R 50 50 1 0 T
X A7 9 -500 -200 200 R 50 50 1 0 T
ENDDRAW
ENDDEF
#
# 74xx_74LS138
#
DEF 74xx_74LS138 U 0 40 Y Y 1 L N
F0 "U" -300 450 50 H V C CNN
F1 "74xx_74LS138" -300 -550 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
DIP?16*
$ENDFPLIST
DRAW
S -300 400 300 -500 1 1 10 f
X A0 1 -500 300 200 R 50 50 1 0 I
X O5 10 500 -200 200 L 50 50 1 0 O V
X O4 11 500 -100 200 L 50 50 1 0 O V
X O3 12 500 0 200 L 50 50 1 0 O V
X O2 13 500 100 200 L 50 50 1 0 O V
X O1 14 500 200 200 L 50 50 1 0 O V
X O0 15 500 300 200 L 50 50 1 0 O V
X VCC 16 0 600 200 D 50 50 1 0 W
X A1 2 -500 200 200 R 50 50 1 0 I
X A2 3 -500 100 200 R 50 50 1 0 I
X E1 4 -500 -400 200 R 50 50 1 0 I L
X E2 5 -500 -300 200 R 50 50 1 0 I L
X E3 6 -500 -200 200 R 50 50 1 0 I
X O7 7 500 -400 200 L 50 50 1 0 O V
X GND 8 0 -700 200 U 50 50 1 0 W
X O6 9 500 -300 200 L 50 50 1 0 O V
ENDDRAW
ENDDEF
#
# 74xx_74LS32
#
DEF 74xx_74LS32 U 0 40 Y Y 5 L N
F0 "U" 0 50 50 H V C CNN
F1 "74xx_74LS32" 0 -50 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
DIP?14*
$ENDFPLIST
DRAW
A -360 0 258 354 -354 1 1 10 N -150 150 -150 -150
A -47 -52 204 150 837 1 1 10 f 150 0 -24 150
A -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150
A -360 0 258 354 -354 2 1 10 N -150 150 -150 -150
A -47 -52 204 150 837 2 1 10 f 150 0 -24 150
A -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150
A -360 0 258 354 -354 3 1 10 N -150 150 -150 -150
A -47 -52 204 150 837 3 1 10 f 150 0 -24 150
A -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150
A -360 0 258 354 -354 4 1 10 N -150 150 -150 -150
A -47 -52 204 150 837 4 1 10 f 150 0 -24 150
A -47 52 204 -150 -837 4 1 10 f 150 0 -24 -150
A 0 0 150 -899 899 1 2 10 f 0 -150 0 150
A 0 0 150 -899 899 2 2 10 f 0 -150 0 150
A 0 0 150 -899 899 3 2 10 f 0 -150 0 150
A 0 0 150 -899 899 4 2 10 f 0 -150 0 150
S -200 300 200 -300 5 1 10 f
P 2 1 1 10 -150 -150 -25 -150 f
P 2 1 1 10 -150 150 -25 150 f
P 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f
P 2 2 1 10 -150 -150 -25 -150 f
P 2 2 1 10 -150 150 -25 150 f
P 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f
P 2 3 1 10 -150 -150 -25 -150 f
P 2 3 1 10 -150 150 -25 150 f
P 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f
P 2 4 1 10 -150 -150 -25 -150 f
P 2 4 1 10 -150 150 -25 150 f
P 12 4 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f
P 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f
P 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f
P 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f
P 4 4 2 10 0 150 -150 150 -150 -150 0 -150 f
X VCC 14 0 500 200 D 50 50 5 0 W
X GND 7 0 -500 200 U 50 50 5 0 W
X ~ 1 -300 100 170 R 50 50 1 1 I
X ~ 2 -300 -100 170 R 50 50 1 1 I
X ~ 3 300 0 150 L 50 50 1 1 O
X ~ 4 -300 100 170 R 50 50 2 1 I
X ~ 5 -300 -100 170 R 50 50 2 1 I
X ~ 6 300 0 150 L 50 50 2 1 O
X ~ 10 -300 -100 170 R 50 50 3 1 I
X ~ 8 300 0 150 L 50 50 3 1 O
X ~ 9 -300 100 170 R 50 50 3 1 I
X ~ 11 300 0 150 L 50 50 4 1 O
X ~ 12 -300 100 170 R 50 50 4 1 I
X ~ 13 -300 -100 170 R 50 50 4 1 I
X ~ 1 -300 100 150 R 50 50 1 2 I I
X ~ 2 -300 -100 150 R 50 50 1 2 I I
X ~ 3 300 0 150 L 50 50 1 2 O I
X ~ 4 -300 100 150 R 50 50 2 2 I I
X ~ 5 -300 -100 150 R 50 50 2 2 I I
X ~ 6 300 0 150 L 50 50 2 2 O I
X ~ 10 -300 -100 150 R 50 50 3 2 I I
X ~ 8 300 0 150 L 50 50 3 2 O I
X ~ 9 -300 100 150 R 50 50 3 2 I I
X ~ 11 300 0 150 L 50 50 4 2 O I
X ~ 12 -300 100 150 R 50 50 4 2 I I
X ~ 13 -300 -100 150 R 50 50 4 2 I I
ENDDRAW
ENDDEF
#
# CPU_Z80CPU
#
DEF CPU_Z80CPU U 0 40 Y Y 1 F N
F0 "U" -550 1400 50 H V L CNN
F1 "CPU_Z80CPU" 250 1400 50 H V L CNN
F2 "" 0 400 50 H I C CNN
F3 "" 0 400 50 H I C CNN
$FPLIST
DIP*
PDIP*
$ENDFPLIST
DRAW
S -550 1350 550 -1350 0 1 10 f
X A11 1 700 100 150 L 50 50 1 1 O
X D6 10 700 -1100 150 L 50 50 1 1 B
X VCC 11 0 1500 150 D 50 50 1 1 W
X D2 12 700 -700 150 L 50 50 1 1 B
X D7 13 700 -1200 150 L 50 50 1 1 B
X D0 14 700 -500 150 L 50 50 1 1 B
X D1 15 700 -600 150 L 50 50 1 1 B
X ~INT~ 16 -700 500 150 R 50 50 1 1 I
X ~NMI~ 17 -700 600 150 R 50 50 1 1 I
X ~HALT~ 18 -700 -100 150 R 50 50 1 1 O
X ~MREQ~ 19 -700 -700 150 R 50 50 1 1 O
X A12 2 700 0 150 L 50 50 1 1 O
X ~IORQ~ 20 -700 -800 150 R 50 50 1 1 O
X ~RD~ 21 -700 -500 150 R 50 50 1 1 O
X ~WR~ 22 -700 -600 150 R 50 50 1 1 O
X ~BUSACK~ 23 -700 -1200 150 R 50 50 1 1 O
X ~WAIT~ 24 -700 0 150 R 50 50 1 1 I
X ~BUSRQ~ 25 -700 -1100 150 R 50 50 1 1 I
X ~RESET~ 26 -700 1200 150 R 50 50 1 1 I
X ~M1~ 27 -700 200 150 R 50 50 1 1 O
X ~RFSH~ 28 -700 100 150 R 50 50 1 1 O
X GND 29 0 -1500 150 U 50 50 1 1 W
X A13 3 700 -100 150 L 50 50 1 1 O
X A0 30 700 1200 150 L 50 50 1 1 O
X A1 31 700 1100 150 L 50 50 1 1 O
X A2 32 700 1000 150 L 50 50 1 1 O
X A3 33 700 900 150 L 50 50 1 1 O
X A4 34 700 800 150 L 50 50 1 1 O
X A5 35 700 700 150 L 50 50 1 1 O
X A6 36 700 600 150 L 50 50 1 1 O
X A7 37 700 500 150 L 50 50 1 1 O
X A8 38 700 400 150 L 50 50 1 1 O
X A9 39 700 300 150 L 50 50 1 1 O
X A14 4 700 -200 150 L 50 50 1 1 O
X A10 40 700 200 150 L 50 50 1 1 O
X A15 5 700 -300 150 L 50 50 1 1 O
X ~CLK~ 6 -700 900 150 R 50 50 1 1 I C
X D4 7 700 -900 150 L 50 50 1 1 B
X D3 8 700 -800 150 L 50 50 1 1 B
X D5 9 700 -1000 150 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
# Connector_Conn_01x01_Male
#
DEF Connector_Conn_01x01_Male J 0 40 Y N 1 F N
F0 "J" 0 100 50 H V C CNN
F1 "Connector_Conn_01x01_Male" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*
$ENDFPLIST
DRAW
S 34 5 0 -5 1 1 6 F
P 2 1 1 6 50 0 34 0 N
X Pin_1 1 200 0 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Conn_01x02_Male
#
DEF Connector_Conn_01x02_Male J 0 40 Y N 1 F N
F0 "J" 0 100 50 H V C CNN
F1 "Connector_Conn_01x02_Male" 0 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S 34 -95 0 -105 1 1 6 F
S 34 5 0 -5 1 1 6 F
P 2 1 1 6 50 -100 34 -100 N
P 2 1 1 6 50 0 34 0 N
X Pin_1 1 200 0 150 L 50 50 1 1 P
X Pin_2 2 200 -100 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_01x26
#
DEF Connector_Generic_Conn_01x26 J 0 40 Y N 1 F N
F0 "J" 0 1300 50 H V C CNN
F1 "Connector_Generic_Conn_01x26" 0 -1400 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S -50 -1295 0 -1305 1 1 6 N
S -50 -1195 0 -1205 1 1 6 N
S -50 -1095 0 -1105 1 1 6 N
S -50 -995 0 -1005 1 1 6 N
S -50 -895 0 -905 1 1 6 N
S -50 -795 0 -805 1 1 6 N
S -50 -695 0 -705 1 1 6 N
S -50 -595 0 -605 1 1 6 N
S -50 -495 0 -505 1 1 6 N
S -50 -395 0 -405 1 1 6 N
S -50 -295 0 -305 1 1 6 N
S -50 -195 0 -205 1 1 6 N
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 205 0 195 1 1 6 N
S -50 305 0 295 1 1 6 N
S -50 405 0 395 1 1 6 N
S -50 505 0 495 1 1 6 N
S -50 605 0 595 1 1 6 N
S -50 705 0 695 1 1 6 N
S -50 805 0 795 1 1 6 N
S -50 905 0 895 1 1 6 N
S -50 1005 0 995 1 1 6 N
S -50 1105 0 1095 1 1 6 N
S -50 1205 0 1195 1 1 6 N
S -50 1250 50 -1350 1 1 10 f
X Pin_1 1 -200 1200 150 R 50 50 1 1 P
X Pin_10 10 -200 300 150 R 50 50 1 1 P
X Pin_11 11 -200 200 150 R 50 50 1 1 P
X Pin_12 12 -200 100 150 R 50 50 1 1 P
X Pin_13 13 -200 0 150 R 50 50 1 1 P
X Pin_14 14 -200 -100 150 R 50 50 1 1 P
X Pin_15 15 -200 -200 150 R 50 50 1 1 P
X Pin_16 16 -200 -300 150 R 50 50 1 1 P
X Pin_17 17 -200 -400 150 R 50 50 1 1 P
X Pin_18 18 -200 -500 150 R 50 50 1 1 P
X Pin_19 19 -200 -600 150 R 50 50 1 1 P
X Pin_2 2 -200 1100 150 R 50 50 1 1 P
X Pin_20 20 -200 -700 150 R 50 50 1 1 P
X Pin_21 21 -200 -800 150 R 50 50 1 1 P
X Pin_22 22 -200 -900 150 R 50 50 1 1 P
X Pin_23 23 -200 -1000 150 R 50 50 1 1 P
X Pin_24 24 -200 -1100 150 R 50 50 1 1 P
X Pin_25 25 -200 -1200 150 R 50 50 1 1 P
X Pin_26 26 -200 -1300 150 R 50 50 1 1 P
X Pin_3 3 -200 1000 150 R 50 50 1 1 P
X Pin_4 4 -200 900 150 R 50 50 1 1 P
X Pin_5 5 -200 800 150 R 50 50 1 1 P
X Pin_6 6 -200 700 150 R 50 50 1 1 P
X Pin_7 7 -200 600 150 R 50 50 1 1 P
X Pin_8 8 -200 500 150 R 50 50 1 1 P
X Pin_9 9 -200 400 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C
#
DEF Device_C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "Device_C" 25 -100 50 H V L CNN
F2 "" 38 -150 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 50 50 1 1 P
X ~ 2 0 -150 110 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_Crystal
#
DEF Device_Crystal Y 0 40 N N 1 F N
F0 "Y" 0 150 50 H V C CNN
F1 "Device_Crystal" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Crystal*
$ENDFPLIST
DRAW
S -45 100 45 -100 0 1 12 N
P 2 0 1 0 -100 0 -75 0 N
P 2 0 1 20 -75 -50 -75 50 N
P 2 0 1 20 75 -50 75 50 N
P 2 0 1 0 100 0 75 0 N
X 1 1 -150 0 50 R 50 50 1 1 P
X 2 2 150 0 50 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_LED
#
DEF Device_LED D 0 40 N N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "Device_LED" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
LED*
LED_SMD:*
LED_THT:*
$ENDFPLIST
DRAW
P 2 0 1 8 -50 -50 -50 50 N
P 2 0 1 0 -50 0 50 0 N
P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N
P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N
P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N
X K 1 -150 0 100 R 50 50 1 1 P
X A 2 150 0 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_R
#
DEF Device_R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "Device_R" 0 0 50 V V C CNN
F2 "" -70 0 50 V I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 50 50 1 1 P
X ~ 2 0 -150 50 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Memory_EEPROM_28C256
#
DEF Memory_EEPROM_28C256 U 0 20 Y Y 1 F N
F0 "U" -300 1050 50 H V C CNN
F1 "Memory_EEPROM_28C256" 100 -1050 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
DIP*W15.24mm*
SOIC*7.5x17.9mm*P1.27mm*
$ENDFPLIST
DRAW
S -300 1000 300 -1000 1 1 10 f
X A14 1 -400 -500 100 R 50 50 1 1 I
X A0 10 -400 900 100 R 50 50 1 1 I
X D0 11 400 900 100 L 50 50 1 1 T
X D1 12 400 800 100 L 50 50 1 1 T
X D2 13 400 700 100 L 50 50 1 1 T
X GND 14 0 -1100 100 U 50 50 1 1 W
X D3 15 400 600 100 L 50 50 1 1 T
X D4 16 400 500 100 L 50 50 1 1 T
X D5 17 400 400 100 L 50 50 1 1 T
X D6 18 400 300 100 L 50 50 1 1 T
X D7 19 400 200 100 L 50 50 1 1 T
X A12 2 -400 -300 100 R 50 50 1 1 I
X ~CS 20 -400 -900 100 R 50 50 1 1 I
X A10 21 -400 -100 100 R 50 50 1 1 I
X ~OE 22 -400 -800 100 R 50 50 1 1 I
X A11 23 -400 -200 100 R 50 50 1 1 I
X A9 24 -400 0 100 R 50 50 1 1 I
X A8 25 -400 100 100 R 50 50 1 1 I
X A13 26 -400 -400 100 R 50 50 1 1 I
X ~WE 27 -400 -700 100 R 50 50 1 1 I
X VCC 28 0 1100 100 D 50 50 1 1 W
X A7 3 -400 200 100 R 50 50 1 1 I
X A6 4 -400 300 100 R 50 50 1 1 I
X A5 5 -400 400 100 R 50 50 1 1 I
X A4 6 -400 500 100 R 50 50 1 1 I
X A3 7 -400 600 100 R 50 50 1 1 I
X A2 8 -400 700 100 R 50 50 1 1 I
X A1 9 -400 800 100 R 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Regulator_Linear_LM7805_TO220
#
DEF Regulator_Linear_LM7805_TO220 U 0 10 Y Y 1 F N
F0 "U" -150 125 50 H V C CNN
F1 "Regulator_Linear_LM7805_TO220" 0 125 50 H V L CNN
F2 "Package_TO_SOT_THT:TO-220-3_Vertical" 0 225 50 H I C CIN
F3 "" 0 -50 50 H I C CNN
ALIAS LM7806_TO220 LM7808_TO220 LM7809_TO220 LM7810_TO220 LM7812_TO220 LM7815_TO220 LM7818_TO220 LM7824_TO220 LM78M05_TO220 SPX2920U-3.3_TO220 SPX2920U-5.0_TO220 LF15_TO220 LF18_TO220 LF25_TO220 LF33_TO220 LF50_TO220 LF60_TO220 LF80_TO220 LF85_TO220 LF120_TO220 LF47_TO220 LF90_TO220 LM341T-05_TO220 LM341T-12_TO220 LM341T-15_TO220 LM2937xT
$FPLIST
TO?220*
$ENDFPLIST
DRAW
S -200 75 200 -200 0 1 10 f
X VI 1 -300 0 100 R 50 50 1 1 W
X GND 2 0 -300 100 U 50 50 1 1 W
X VO 3 300 0 100 L 50 50 1 1 w
ENDDRAW
ENDDEF
#
# Switch_SW_Push
#
DEF Switch_SW_Push SW 0 40 N N 1 F N
F0 "SW" 50 100 50 H V L CNN
F1 "Switch_SW_Push" 0 -60 50 H V C CNN
F2 "" 0 200 50 H I C CNN
F3 "" 0 200 50 H I C CNN
DRAW
C -80 0 20 0 1 0 N
C 80 0 20 0 1 0 N
P 2 0 1 0 0 50 0 120 N
P 2 0 1 0 100 50 -100 50 N
X 1 1 -200 0 100 R 50 50 0 1 P
X 2 2 200 0 100 L 50 50 0 1 P
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_VCC
#
DEF power_VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_VCC" 0 150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VCC 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,252 @@
update=mer 24 mar 2021 21:27:02 CET
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=pat80.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
TrackWidth2=0.25
TrackWidth3=0.5
ViaDiameter1=0.8
ViaDrill1=0.4
ViaDiameter2=1.5
ViaDrill2=0.5
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0
SolderMaskMinWidth=0
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
(sym_lib_table
)

View File

@ -1,3 +1,5 @@
; @language: Z80 ASM
org 0xA000 org 0xA000
include '../../os/abi-generated.asm' include '../../os/abi-generated.asm'

View File

@ -1,3 +1,4 @@
; @language: Z80 ASM
;hd44780 lcd test procedure ;hd44780 lcd test procedure
LCD_INSTR_REG: EQU %00000000 LCD_INSTR_REG: EQU %00000000

View File

@ -1,2 +1,4 @@
; @language: Z80 ASM
org 0xA000 ; Set starting position to ram org 0xA000 ; Set starting position to ram
include '../os/main.asm' include '../os/main.asm'

View File

@ -1,11 +1,17 @@
os: build:
@echo "Building PAT80 rom..." @echo "Building PAT80 rom..."
@z80asm -i main.asm -o rom.bin || (exit 1) @z80asm -i main.asm -o rom.bin || (exit 1)
@echo "Generating label lookup table..." @echo "Generating label lookup table..."
@z80asm -i main.asm -o rom.bin -L 2>&1 | grep "Sys_" > abi-generated.asm @z80asm -i main.asm -o rom.bin -L 2>&1 | grep "Sys_" > abi-generated.asm
@echo "PAT80 Rom size:" @echo "PAT80 Rom size:"
@du -h rom.bin @du -h rom.bin
write: build
@echo "Stretching rom to EEPROM size..." @echo "Stretching rom to EEPROM size..."
@dd if=/dev/zero of=rom.bin bs=1 count=0 seek=8192 @dd if=/dev/zero of=rom.bin bs=1 count=0 seek=8192
@echo "Writing to EEPROM..." @echo "Writing to EEPROM..."
@minipro -w rom.bin -p "AT28C64B" @minipro -w rom.bin -p "AT28C64B"
run: build
@echo "Starting emulator..."
@../../../../pat80-emulator/z80-python-emulator/src/z80sbc.py -b rom.bin

View File

@ -1,6 +1,6 @@
Sys_ABI: equ $0003 Sys_ABI: equ $0081
Sys_Beep: equ $0013 Sys_Beep: equ $0091
Sys_Print: equ $0007 Sys_Print: equ $0085
Sys_Printc: equ $000a Sys_Printc: equ $0088
Sys_Readc: equ $000d Sys_Readc: equ $008b
Sys_Readline: equ $0010 Sys_Readline: equ $008e

View File

@ -1,5 +1,22 @@
; Arduino terminal driver ; Arduino terminal driver
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
; config (IO port 0) ; config (IO port 0)
TERM_DATA_REG: EQU IO_0 TERM_DATA_REG: EQU IO_0

View File

@ -1,5 +1,23 @@
; HD44780 20x4 characters LCD display driver ; HD44780 20x4 characters LCD display driver
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; USAGE: ; USAGE:
; STR: DB "Hello world!",0 <-- null terminated string ; STR: DB "Hello world!",0 <-- null terminated string

View File

@ -1,5 +1,24 @@
; Keyboard driver ; Keyboard driver
; Direct keyboard grid control (direct keys addressing, without keyboard controller)
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; Requires declaration of following pointers, one for every column of the keys grid: ; Requires declaration of following pointers, one for every column of the keys grid:
; KEYB_A0_REG ; KEYB_A0_REG

View File

@ -0,0 +1,91 @@
; PS/2 Keyboard driver
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
;
; Based on PS/2 protocol as documented on http://www.lucadavidian.com/2017/11/15/interfacing-ps2-keyboard-to-a-microcontroller/
;
; The CLK and Data pin of the PS/2 keyboard are fed into two cascated serial-in parallel-out shift registers.
; Their outputs are connected to the Pat80 data bus via a buffer activated by the selected
; I/O EN signal and their RESET is connected to I/O Address line 0 of the keyboard I/O port.
; Being RESET active low, they will be erased when the PAT80 reads (or writes) anything at address 0
; of the keyboard I/0 port.
;
; Thus, the read cycle is:
; - Read address 1 of the I/O port (the data bus will contain read keycode)
; - Read address 0 of the I/O port (the shift registers will be reset)
; The read keycode must be interpreted based on PS/2 Scan Codeset 2
;
; NOTE: The keyboard controller circuit throws away the MSB (uses only the lower 7 bits), because this allows
; for using a single buffer chip instead of two (the freed up line is used by the PAT80 to reset the shift
; registers). This means that the few keys with keycodes > 0x0F are not readable and that the break code is
; seen by PAT80 not as 0xF0, but 0x70. This also means that the 0 of numeric keypad on extended keyboards will
; behave strangely (will drop next pressed key). This is not a problem, as the computer, once completed, will
; have a 60% keyboard, without any of the unusable keys.
include 'drivers/ps2_keyboard_scancodeset2.asm' ; PS/2 Scan Codeset 2 mappings
; config (IO port 1)
PS2KEYB_CLEAR_REG: EQU IO_2
PS2KEYB_DATA_REG: EQU IO_2 + 1
PS2KEYB_TRANSMISSION_DURATION: EQU 86 ;@ 100khz ; The time needed for the keyboard to transmit all the 11 bits of data, in CPU clock cycles
PS2KEYB_BREAK: EQU 0xF0 - %10000000 ; The MSB is dropped: see NOTE on intro above
; Reads a single character and returns an ascii code when a valid key is pressed. Blocking.
; @return A The read character
PS2Keyb_readc:
in a, (PS2KEYB_DATA_REG) ; reads a character
add a, 0
jp z, PS2Keyb_readc ; if char is 0 (NULL), user didn't press any key: wait for character
; we found something, but it may still be shifting in bits. Allow the keyboard to complete data transmission
ld a, PS2KEYB_TRANSMISSION_DURATION/5 ; every cycle is 5 CPU cycles
ps2keyb_readc_waitloop:
sub 1
jr nz, ps2keyb_readc_waitloop
; data transmission should now be complete.
; check if code is a Break Code. If it is, discard next key as it is a released key
in a, (PS2KEYB_DATA_REG) ; re-reads the character (it should now be complete)
ld c, a ; save a, because it will be modified by next compare
cp PS2KEYB_BREAK ; compare a with Break Code
jp z, ps2keyb_readc_discard ; if it is a Break Code, jump to discarder routine
; we read a valid character: clean key registers
in a, (PS2KEYB_CLEAR_REG)
; now we will convert keycode in c to ASCII code
ld hl, PS2KEYB_SCANCODESET_ASCII_MAP ; load start of codeset to ascii map
ld b, 0 ; reset b, as we are going to do a sum with bc (where c contains the read scancode)
add hl, bc ; add scancode value to map start addr (we are using it as offset)
ld a, (hl) ; load the corresponding ascii code in a for return
ret ; returns in the a register
ps2keyb_readc_discard:
; clean key registers
in a, (PS2KEYB_CLEAR_REG)
ps2keyb_readc_discard_waitfordata:
; wait for next non-0 keycode and discards it (it is the code of the released key)
in a, (PS2KEYB_DATA_REG) ; reads a character
add a, 0
jp z, ps2keyb_readc_discard_waitfordata ; if char is 0 (NULL), wait
; we found something, allow the keyboard to complete data transmission
ld a, PS2KEYB_TRANSMISSION_DURATION/5 ; every cycle is 5 CPU cycles
ps2keyb_readc_discard_waitloop:
sub 1
jr nz, ps2keyb_readc_discard_waitloop
; data transmission should now be complete, throw away key code
in a, (PS2KEYB_CLEAR_REG)
jp PS2Keyb_readc ; go back and wait for another keycode

View File

@ -0,0 +1,137 @@
; PS/2 Keycode Mode 2 to ASCII mapping table
; @language: Z80 ASM
;
; Keycodes 0 to 83
PS2KEYB_SCANCODESET_ASCII_MAP: DB 35
DB 33 ; F9
DB 33 ;
DB 33 ; F5
DB 33 ; F3
DB 33 ; F1
DB 33 ; F2
DB 33 ; F12
DB 33 ;
DB 33 ; F10
DB 33 ; F8
DB 33 ; F6
DB 33 ; F4
DB 9 ; TAB
DB 96 ; `
DB 33 ;
DB 33 ;
DB 33 ; L ALT
DB 33 ; L SHFT
DB 33 ;
DB 33 ; L CTRL
DB 81 ; Q
DB 49 ; 1
DB 33 ;
DB 33 ;
DB 33 ;
DB 90 ; Z
DB 83 ; S
DB 65 ; A
DB 87 ; W
DB 50 ; 2
DB 33 ;
DB 33 ;
DB 67 ; C
DB 88 ; X
DB 68 ; D
DB 69 ; E
DB 52 ; 4
DB 51 ; 3
DB 33 ;
DB 33 ;
DB 32 ; SPACE
DB 86 ; V
DB 70 ; F
DB 84 ; T
DB 82 ; R
DB 53 ; 5
DB 33 ;
DB 33 ;
DB 78 ; N
DB 66 ; B
DB 72 ; H
DB 71 ; G
DB 89 ; Y
DB 54 ; 6
DB 33 ;
DB 33 ;
DB 33 ;
DB 77 ; M
DB 74 ; J
DB 85 ; U
DB 55 ; 7
DB 56 ; 8
DB 33 ;
DB 33 ;
DB 44 ; ,
DB 75 ; K
DB 73 ; I
DB 79 ; O
DB 48 ; 0
DB 57 ; 9
DB 33 ;
DB 33 ;
DB 46 ; .
DB 47 ; /
DB 76 ; L
DB 59 ; ;
DB 80 ; P
DB 45 ; -
DB 33 ;
DB 33 ;
DB 33 ;
DB 39 ; '
DB 33 ;
DB 91 ; [
DB 61 ; =
DB 33 ;
DB 33 ;
DB 33 ; CAPS
DB 33 ; R SHFT
DB 10 ; ENTER
DB 93 ; ]
DB 33 ;
DB 92 ; \
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 8 ; BKSP
DB 33 ;
DB 33 ;
DB 49 ; KP 1
DB 33 ;
DB 52 ; KP 4
DB 55 ; KP 7
DB 33 ;
DB 33 ;
DB 33 ;
DB 48 ; KP 0
DB 46 ; KP .
DB 50 ; KP 2
DB 53 ; KP 5
DB 54 ; KP 6
DB 56 ; KP 8
DB 33 ; ESC
DB 33 ; NUM
DB 33 ; F11
DB 43 ; KP +
DB 51 ; KP 3
DB 45 ; KP -
DB 42 ; KP *
DB 57 ; KP 9
DB 33 ; SCROLL
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ;
DB 33 ; F7

View File

@ -1,5 +1,23 @@
; TI SN76489 sound chip display driver ; TI SN76489 sound chip driver
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; USAGE: ; USAGE:
; call Snd_init <-- inits sound (and silences default tone) ; call Snd_init <-- inits sound (and silences default tone)

View File

@ -1,5 +1,23 @@
; Vgax display driver ; Vgax display driver
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; Requires declaration of following pointers: ; Requires declaration of following pointers:
; VGAX_INSTR_REG ; VGAX_INSTR_REG

View File

@ -1,5 +1,22 @@
; Strings manipulation library ; Strings manipulation library
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
; Transforms case to upper ; Transforms case to upper

View File

@ -1,5 +1,22 @@
; Time library ; Time library
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
; Duration in cpu cycles / 55 (change these values based on CPU frequency) ; Duration in cpu cycles / 55 (change these values based on CPU frequency)

View File

@ -1,2 +1,4 @@
; @language: Z80 ASM
org 0xA000 ; Set starting position to ram org 0xA000 ; Set starting position to ram
include 'main.asm' include 'main.asm'

View File

@ -2,6 +2,24 @@ jp Sysinit ; Startup vector: DO NOT MOVE! Must be the first instruction
; Pat80 BIOS v0.01 ; Pat80 BIOS v0.01
; @author: Daniele Verducci ; @author: Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; MEMORY MAP ; MEMORY MAP
; ROM is at 0x0000 ; ROM is at 0x0000
@ -10,18 +28,30 @@ jp Sysinit ; Startup vector: DO NOT MOVE! Must be the first instruction
; DRIVERS VAR SPACE: 0x9000 - 0x9FFF (4kb) ; DRIVERS VAR SPACE: 0x9000 - 0x9FFF (4kb)
; APPLICATION VAR SPACE: 0xA000 - 0xFFFF (24kb) ; APPLICATION VAR SPACE: 0xA000 - 0xFFFF (24kb)
; I/O MAP ; I/O MAP
; I/O 0 (0x00 - 0x1F) Parallel terminal (uses addr 0x00 only) ; I/O 0 (0x00 - 0x1F) Parallel terminal (uses addr 0x00 and 0x01)
; I/O 1 (0x20 - 0x3F) Sound card (uses addr 0x20 only) ; I/O 1 (0x20 - 0x3F) Sound card (uses addr 0x20 only)
; I/O 2 (0x40 - 0x5F) ; I/O 2 (0x40 - 0x5F) PS2 Keyboard (uses 0x40 and 0x41)
; I/O 3 (0x60 - 0x7F) ; I/O 3 (0x60 - 0x7F)
; I/O 4 (0x80 - 0x9F) ; I/O 4 (0x80 - 0x9F)
; I/O 5 (0xA0 - 0xBF) ; I/O 5 (0xA0 - 0xBF)
; I/O 6 (0xC0 - 0xDF) ; I/O 6 (0xC0 - 0xDF)
; I/O 7 (0xE0 - 0xFF) ; I/O 7 (0xE0 - 0xFF)
; **** RESET/INTERRUPT VECTOR ****
; Maskable interrupt mode 1: when the BREAK key is pressed,
; a maskable interrupt is generated and the CPU jumps to this address.
; In this way, BREAK key brings up memory monitor at any time.
ds 0x38
di ; Disable maskable interrupts.
exx ; exchange registers
ex af, af'
jp Monitor_main
; **** SYSTEM CALLS **** ; **** SYSTEM CALLS ****
; System calls provide access to low level functions (input from keyboard, output to screen etc). ; System calls provide access to low level functions (input from keyboard, output to screen etc).
; The name starts always with Sys_ ; The name starts always with Sys_
ds 0x40 ; Place system calls after Z80 reset/interrupt subroutines space
; Returns ABI version. ; Returns ABI version.
; (ABI -> https://en.wikipedia.org/wiki/Application_binary_interface) ; (ABI -> https://en.wikipedia.org/wiki/Application_binary_interface)
@ -45,6 +75,7 @@ Sys_Printc:
; @return A The read character ; @return A The read character
Sys_Readc: Sys_Readc:
jp Term_readc jp Term_readc
;jp PS2Keyb_readc
; Reads a line ; Reads a line
; @return BC The pointer to a null-terminated read string ; @return BC The pointer to a null-terminated read string
@ -61,6 +92,7 @@ Sys_Beep:
SYS_VAR_SPACE: EQU 0x8000 SYS_VAR_SPACE: EQU 0x8000
DRV_VAR_SPACE: EQU 0x9000 DRV_VAR_SPACE: EQU 0x9000
APP_SPACE: EQU 0xA000 APP_SPACE: EQU 0xA000
MEM_END: EQU 0xFFFF
; SYSTEM CONFIGURATION ; SYSTEM CONFIGURATION
IO_0: EQU 0x00 IO_0: EQU 0x00
@ -79,6 +111,7 @@ IO_7: EQU 0xE0
;include 'drivers/hd44780.asm' ;include 'drivers/hd44780.asm'
;include 'drivers/keyboard.asm' ;include 'drivers/keyboard.asm'
include 'drivers/ps2_keyboard.asm'
include 'drivers/arduino_terminal.asm' include 'drivers/arduino_terminal.asm'
include 'drivers/sn76489.asm' include 'drivers/sn76489.asm'
include 'monitor.asm' include 'monitor.asm'
@ -101,13 +134,28 @@ Sysinit:
; Play startup sound ; Play startup sound
call Sys_Beep call Sys_Beep
; Run memory monitor ; Run memory monitor
call Monitor_main ei ; enable maskabpe interrupts
im 1 ; set interrupt mode 1 (on interrupt jumps to 0x38)
rst 0x38 ; throw fake interrupt: jump to interrupt routine to start monitor
; Keyboard test
; ld a, 0x3E
; call Sys_Printc
; ktestloop:
; call Sys_Readc
; call Sys_Printc
; ld a, 46
; call Sys_Printc
; jp ktestloop
; User exited from memory monitor without loading a program. Do nothing.
mloop:
; Main loop: do nothing.
jp mloop
; DEBUG: Echo chars ; DEBUG: Echo chars
; loop: ; loop:
; call Term_readc ; call Term_readc
; call Term_printc ; call Term_printc
; jp loop ; jp loop
halt

View File

@ -1,5 +1,23 @@
; Pat80 Memory Monitor ; Pat80 Memory Monitor
; @author Daniele Verducci ; @author Daniele Verducci
; @language: Z80 ASM
;
;
; This file is part of Pat80 Memory Monitor.
;
; Pat80 Memory Monitor is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 Memory Monitor is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 Memory Monitor. If not, see <http://www.gnu.org/licenses/>.
;
; ;
; Monitor commands (CMD $arg): ; Monitor commands (CMD $arg):
; H (HELP) Shows available commands ; H (HELP) Shows available commands
@ -21,11 +39,14 @@ MON_COMMAND_ZERO: DB "ZERO",0
MON_COMMAND_LOAD: DB "LOAD",0 MON_COMMAND_LOAD: DB "LOAD",0
MON_COMMAND_RUN: DB "RUN",0 MON_COMMAND_RUN: DB "RUN",0
MON_COMMAND_ADB: DB "ADB",0 MON_COMMAND_ADB: DB "ADB",0
MON_COMMAND_MEMTEST: DB "MEMTEST",0
MON_COMMAND_QUIT: DB "QUIT",0
MON_ARG_HEX: DB " 0x",0 MON_ARG_HEX: DB " 0x",0
MON_HELP: DB 10,"Available commands:\nHELP prints this message\nDUMP [ADDR] shows memory content\nSET [ADDR] sets memory content\nZERO [ADDR] [ADDR] sets all bytes to 0 in the specified range\nLOAD\nRUN [ADDR] executes code starting from ADDR\nADB starts Assembly Deploy Bridge",0 MON_HELP: DB 10,"Available commands:\nHELP prints this message\nDUMP [ADDR] shows memory content\nSET [ADDR] sets memory content\nZERO [ADDR] [ADDR] sets all bytes to 0 in the specified range\nLOAD\nRUN [ADDR] executes code starting from ADDR\nADB starts Assembly Deploy Bridge\nMEMTEST checks ram boundaries\nQUIT exits",0
MON_MSG_ADB: DB 10,"Waiting for data.",0 MON_MSG_ADB: DB 10,"Waiting for data.",0
MON_ERR_SYNTAX: DB " Syntax error",0 MON_ERR_SYNTAX: DB " Syntax error",0
;MON_ADB_TIMEOUT: EQU 0xFF // Number of cycles after an ADB binary transfer is considered completed ; MON_RAMTEST_INTRO: DB " Checking memory... ",0
; MON_RAMTEST_RAMSTART: DB " Ram starts at 0x",0
MON_DUMP_BYTES_LINES: EQU 8 MON_DUMP_BYTES_LINES: EQU 8
MON_DUMP_BYTES_PER_LINE: EQU 8 MON_DUMP_BYTES_PER_LINE: EQU 8
@ -66,6 +87,12 @@ Monitor_main:
ld hl, MON_COMMAND_ADB ld hl, MON_COMMAND_ADB
cp (hl) cp (hl)
jp z, monitor_adb jp z, monitor_adb
; ld hl, MON_COMMAND_MEMTEST
; cp (hl)
; jp z, monitor_memtest
ld hl, MON_COMMAND_QUIT
cp (hl)
jp z, monitor_quit
; Unrecognized command: print error and beep ; Unrecognized command: print error and beep
ld bc, MON_ERR_SYNTAX ld bc, MON_ERR_SYNTAX
call Sys_Print call Sys_Print
@ -80,6 +107,23 @@ monitor_help:
call Sys_Print call Sys_Print
jp monitor_main_loop jp monitor_main_loop
monitor_quit:
ld bc, MON_COMMAND_QUIT + 1 ; autocomplete command
call Sys_Print
; newline
ld a, 10
call Sys_Printc
; Restores registers and re-enable interrupts: when the BREAK key is pressed,
; a maskable interrupt is generated and the CPU jumps to 0x38 reset vector,
; where if finds a call to Memory monitor (see main.asm).
exx ; exchange registers
ex af, af'
; enable interrupts
ei
im 1 ; set interrupt mode 1 (on interrupt jumps to 0x38)
reti ; return from interrupt
; Asks the user for a memory position and shows the following 64 bytes of memory ; Asks the user for a memory position and shows the following 64 bytes of memory
; @uses a, b, c, d, e, h, l ; @uses a, b, c, d, e, h, l
monitor_dump: monitor_dump:
@ -257,23 +301,34 @@ monitor_zero: ; TODO: bugged, doesn't exit cycle
monitor_load: monitor_load:
ld bc, MON_COMMAND_LOAD + 1 ; autocomplete command ld bc, MON_COMMAND_LOAD + 1 ; autocomplete command
call Sys_Print call Sys_Print
; TODO: When implemented, re-enable interrupts before run application
jp monitor_main_loop jp monitor_main_loop
monitor_run: monitor_run:
ld bc, MON_COMMAND_RUN + 1 ; autocomplete command ld bc, MON_COMMAND_RUN + 1 ; autocomplete command
call Sys_Print call Sys_Print
; Now read the memory address to be changed from the user ; Now read the memory address to be executed from the user
call monitor_arg_2byte ; returns the read bytes in hl call monitor_arg_2byte ; returns the read bytes in hl
ld a, 10 ; newline ld a, 10 ; newline
call Sys_Printc call Sys_Printc
jp (hl) ; Start executing code ; enable interrupts
ei
im 1 ; set interrupt mode 1 (on interrupt jumps to 0x38)
; pop the last entry on the stack: this is needed (as the monitor
; runs in an interrupt) to counter-balance the missing reti statement
pop bc
; execute code
jp (hl)
monitor_adb: monitor_adb:
ld bc, MON_COMMAND_ADB + 1 ; autocomplete command ld bc, MON_COMMAND_ADB + 1 ; autocomplete command
call Sys_Print call Sys_Print
; start copying incoming data to application space ; start copying incoming data to application space
call monitor_copyTermToAppMem call monitor_copyTermToAppMem
; call monitor_enable_int ; re-enable interrupts
;jp APP_SPACE ; Start executing code ;jp APP_SPACE ; Start executing code
; ld bc, APP_SPACE ; ld bc, APP_SPACE
; call Sys_Print ; call Sys_Print
jp monitor_main_loop jp monitor_main_loop
@ -516,4 +571,55 @@ monitor_copyTermToAppMem:
dec d dec d
jp monitor_copyTermToAppMem_loop ; continue loop jp monitor_copyTermToAppMem_loop ; continue loop
; Runs a memory test to identify ram memory boundaries and check the ram is working.
; Starting from last memory position, writes 0xFF, reads it back, writes 0x00, reads it back.
; Exits when the first value differs from the written value (this may be caused by a bad ram
; block or the start of rom in memory map). Prints the last good address on exit.
; monitor_memtest:
; ld bc, MON_COMMAND_MEMTEST + 1 ; autocomplete command
; call Sys_Print
; ; Prints intro
; ld bc, MON_RAMTEST_INTRO
; call Sys_Print
; ; Starts checking
; ld hl, MEM_END
; monitor_memtest_loop:
; ; Save current byte value for later restore
; ld c, (hl)
; ; Write 0xFF
; ld a, 0xFF
; ld (hl), a
; ; Read and compare 0xFF
; ld a, (hl)
; cp 0xFF
; jp nz, monitor_memtest_badram
; ; Write 0x00
; ld a, 0x00
; ld (hl), a
; ; Read and compare 0xFF
; ld a, (hl)
; cp 0x00
; jp nz, monitor_memtest_badram
; ; Memory byte is good, restore previous value
; ld (hl), c
; ; Next one
; dec hl
; jp monitor_memtest_loop
; monitor_memtest_badram:
; ; Found a bad memory byte (or entered rom block).
; ld bc, MON_RAMTEST_RAMSTART
; call Sys_Print
; ; Print last valid memory addr
; inc hl
; ld a, h
; call monitor_printHexByte
; ld a, l
; call monitor_printHexByte
; ; Newline
; ld a, 10
; call Sys_Printc
; ; Back to menu
; jp monitor_main_loop

View File

@ -1,3 +1,5 @@
; @language: Z80 ASM
SndTest_test: SndTest_test:
; ch1 max volume ; ch1 max volume
ld a,%10010000 ld a,%10010000

7
pat80-emulator/README.md Normal file
View File

@ -0,0 +1,7 @@
# PAT80 Emulator
This folder contains a submodule (you should fetch it if you need to run the os in an emulator).
Uses cburbridge's Z80 emulator written in python. It opens some windows showing the emulated computer's memory map, the cpu registers state and parallel terminal to interact with the os.
## Usage
To run the os in the emulator, head to `pat80-computer/software/z80-assembly/os/Makefile` and run `make run` to build the rom from assembly and start the emulator.

@ -0,0 +1 @@
Subproject commit a5dbd3e829a94a2598b42ba976e61353c580600b

View File

@ -0,0 +1,2 @@
main.hex
main.obj

View File

@ -5,9 +5,14 @@
## Flash ## Flash
### Rom ### Rom
`minipro -w filename.hex -p ATMEGA1284` `minipro -w filename.hex -p ATMEGA1284`
### Fuses ### Fuses
Read fuses: `minipro -r -c config -p ATMEGA1284` (`-r -c config` means read configuration (fuses)) Read fuses: `minipro -r -c config -p ATMEGA1284` (`-r -c config` means read configuration (fuses))
Fuses must be written all together, so read the current values, edit the generated file and write it. Fuses must be written all together, so read the current values, edit the generated file and write it.
The meaning of every bis is in the conf file. The meaning of every bis is in the conf file.
Write fuses: `minipro -w fuses.conf -c config -p ATMEGA1284` Write fuses: `minipro -w fuses.conf -c config -p ATMEGA1284`
# Generate test images
Using GIMP, Image -> Mode -> Indexed, select 2 colors and Posterize.
Invert the image colors.
Save as .xbm file. Oper with a *text editor*, you will find an array of byte-packed pixels (every byte represents 8 pixels).
Copy and paste on an ASM file.

View File

@ -1,276 +0,0 @@
; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ UDR1 = 0xce ; MEMORY MAPPED
.equ UBRR1L = 0xcc ; MEMORY MAPPED
.equ UBRR1H = 0xcd ; MEMORY MAPPED
.equ UCSR1C = 0xca ; MEMORY MAPPED
.equ UCSR1B = 0xc9 ; MEMORY MAPPED
.equ UCSR1A = 0xc8 ; MEMORY MAPPED
.equ UDR0 = 0xc6 ; MEMORY MAPPED
.equ UBRR0L = 0xc4 ; MEMORY MAPPED
.equ UBRR0H = 0xc5 ; MEMORY MAPPED
.equ UCSR0C = 0xc2 ; MEMORY MAPPED
.equ UCSR0B = 0xc1 ; MEMORY MAPPED
.equ UCSR0A = 0xc0 ; MEMORY MAPPED
.equ TWAMR = 0xbd ; MEMORY MAPPED
.equ TWCR = 0xbc ; MEMORY MAPPED
.equ TWDR = 0xbb ; MEMORY MAPPED
.equ TWAR = 0xba ; MEMORY MAPPED
.equ TWSR = 0xb9 ; MEMORY MAPPED
.equ TWBR = 0xb8 ; MEMORY MAPPED
.equ ASSR = 0xb6 ; MEMORY MAPPED
.equ OCR2B = 0xb4 ; MEMORY MAPPED
.equ OCR2A = 0xb3 ; MEMORY MAPPED
.equ TCNT2 = 0xb2 ; MEMORY MAPPED
.equ TCCR2B = 0xb1 ; MEMORY MAPPED
.equ TCCR2A = 0xb0 ; MEMORY MAPPED
.equ OCR3BL = 0x9a ; MEMORY MAPPED
.equ OCR3BH = 0x9b ; MEMORY MAPPED
.equ OCR3AL = 0x98 ; MEMORY MAPPED
.equ OCR3AH = 0x99 ; MEMORY MAPPED
.equ ICR3L = 0x96 ; MEMORY MAPPED
.equ ICR3H = 0x97 ; MEMORY MAPPED
.equ TCNT3L = 0x94 ; MEMORY MAPPED
.equ TCNT3H = 0x95 ; MEMORY MAPPED
.equ TCCR3C = 0x92 ; MEMORY MAPPED
.equ TCCR3B = 0x91 ; MEMORY MAPPED
.equ TCCR3A = 0x90 ; MEMORY MAPPED
.equ OCR1BL = 0x8a ; MEMORY MAPPED
.equ OCR1BH = 0x8b ; MEMORY MAPPED
.equ OCR1AL = 0x88 ; MEMORY MAPPED
.equ OCR1AH = 0x89 ; MEMORY MAPPED
.equ ICR1L = 0x86 ; MEMORY MAPPED
.equ ICR1H = 0x87 ; MEMORY MAPPED
.equ TCNT1L = 0x84 ; MEMORY MAPPED
.equ TCNT1H = 0x85 ; MEMORY MAPPED
.equ TCCR1C = 0x82 ; MEMORY MAPPED
.equ TCCR1B = 0x81 ; MEMORY MAPPED
.equ TCCR1A = 0x80 ; MEMORY MAPPED
.equ DIDR1 = 0x7f ; MEMORY MAPPED
.equ DIDR0 = 0x7e ; MEMORY MAPPED
.equ ADMUX = 0x7c ; MEMORY MAPPED
.equ ADCSRB = 0x7b ; MEMORY MAPPED
.equ ADCSRA = 0x7a ; MEMORY MAPPED
.equ ADCH = 0x79 ; MEMORY MAPPED
.equ ADCL = 0x78 ; MEMORY MAPPED
.equ PCMSK3 = 0x73 ; MEMORY MAPPED
.equ TIMSK3 = 0x71 ; MEMORY MAPPED
.equ TIMSK2 = 0x70 ; MEMORY MAPPED
.equ TIMSK1 = 0x6f ; MEMORY MAPPED
.equ TIMSK0 = 0x6e ; MEMORY MAPPED
.equ PCMSK2 = 0x6d ; MEMORY MAPPED
.equ PCMSK1 = 0x6c ; MEMORY MAPPED
.equ PCMSK0 = 0x6b ; MEMORY MAPPED
.equ EICRA = 0x69 ; MEMORY MAPPED
.equ PCICR = 0x68 ; MEMORY MAPPED
.equ OSCCAL = 0x66 ; MEMORY MAPPED
.equ PRR1 = 0x65 ; MEMORY MAPPED
.equ PRR0 = 0x64 ; MEMORY MAPPED
.equ CLKPR = 0x61 ; MEMORY MAPPED
.equ WDTCSR = 0x60 ; MEMORY MAPPED
.equ SREG = 0x3f
.equ SPL = 0x3d
.equ SPH = 0x3e
.equ RAMPZ = 0x3b
.equ SPMCSR = 0x37
.equ MCUCR = 0x35
.equ MCUSR = 0x34
.equ SMCR = 0x33
.equ OCDR = 0x31
.equ ACSR = 0x30
.equ SPDR = 0x2e
.equ SPSR = 0x2d
.equ SPCR = 0x2c
.equ GPIOR2 = 0x2b
.equ GPIOR1 = 0x2a
.equ OCR0B = 0x28
.equ OCR0A = 0x27
.equ TCNT0 = 0x26
.equ TCCR0B = 0x25
.equ TCCR0A = 0x24
.equ GTCCR = 0x23
.equ EEARH = 0x22
.equ EEARL = 0x21
.equ EEDR = 0x20
.equ EECR = 0x1f
.equ GPIOR0 = 0x1e
.equ EIMSK = 0x1d
.equ EIFR = 0x1c
.equ PCIFR = 0x1b
.equ TIFR3 = 0x18
.equ TIFR2 = 0x17
.equ TIFR1 = 0x16
.equ TIFR0 = 0x15
.equ PORTD = 0x0b
.equ DDRD = 0x0a
.equ PIND = 0x09
.equ PORTC = 0x08
.equ DDRC = 0x07
.equ PINC = 0x06
.equ PORTB = 0x05
.equ DDRB = 0x04
.equ PINB = 0x03
.equ PORTA = 0x02
.equ DDRA = 0x01
.equ PINA = 0x00
; ***** PORTA ************************
; PORTA - Port A Data Register
.equ PORTA0 = 0 ; Port A Data Register bit 0
.equ PA0 = 0 ; For compatibility
.equ PORTA1 = 1 ; Port A Data Register bit 1
.equ PA1 = 1 ; For compatibility
.equ PORTA2 = 2 ; Port A Data Register bit 2
.equ PA2 = 2 ; For compatibility
.equ PORTA3 = 3 ; Port A Data Register bit 3
.equ PA3 = 3 ; For compatibility
.equ PORTA4 = 4 ; Port A Data Register bit 4
.equ PA4 = 4 ; For compatibility
.equ PORTA5 = 5 ; Port A Data Register bit 5
.equ PA5 = 5 ; For compatibility
.equ PORTA6 = 6 ; Port A Data Register bit 6
.equ PA6 = 6 ; For compatibility
.equ PORTA7 = 7 ; Port A Data Register bit 7
.equ PA7 = 7 ; For compatibility
; DDRA - Port A Data Direction Register
.equ DDA0 = 0 ; Data Direction Register, Port A, bit 0
.equ DDA1 = 1 ; Data Direction Register, Port A, bit 1
.equ DDA2 = 2 ; Data Direction Register, Port A, bit 2
.equ DDA3 = 3 ; Data Direction Register, Port A, bit 3
.equ DDA4 = 4 ; Data Direction Register, Port A, bit 4
.equ DDA5 = 5 ; Data Direction Register, Port A, bit 5
.equ DDA6 = 6 ; Data Direction Register, Port A, bit 6
.equ DDA7 = 7 ; Data Direction Register, Port A, bit 7
; PINA - Port A Input Pins
.equ PINA0 = 0 ; Input Pins, Port A bit 0
.equ PINA1 = 1 ; Input Pins, Port A bit 1
.equ PINA2 = 2 ; Input Pins, Port A bit 2
.equ PINA3 = 3 ; Input Pins, Port A bit 3
.equ PINA4 = 4 ; Input Pins, Port A bit 4
.equ PINA5 = 5 ; Input Pins, Port A bit 5
.equ PINA6 = 6 ; Input Pins, Port A bit 6
.equ PINA7 = 7 ; Input Pins, Port A bit 7
; ***** PORTB ************************
; PORTB - Port B Data Register
.equ PORTB0 = 0 ; Port B Data Register bit 0
.equ PB0 = 0 ; For compatibility
.equ PORTB1 = 1 ; Port B Data Register bit 1
.equ PB1 = 1 ; For compatibility
.equ PORTB2 = 2 ; Port B Data Register bit 2
.equ PB2 = 2 ; For compatibility
.equ PORTB3 = 3 ; Port B Data Register bit 3
.equ PB3 = 3 ; For compatibility
.equ PORTB4 = 4 ; Port B Data Register bit 4
.equ PB4 = 4 ; For compatibility
.equ PORTB5 = 5 ; Port B Data Register bit 5
.equ PB5 = 5 ; For compatibility
.equ PORTB6 = 6 ; Port B Data Register bit 6
.equ PB6 = 6 ; For compatibility
.equ PORTB7 = 7 ; Port B Data Register bit 7
.equ PB7 = 7 ; For compatibility
; DDRB - Port B Data Direction Register
.equ DDB0 = 0 ; Port B Data Direction Register bit 0
.equ DDB1 = 1 ; Port B Data Direction Register bit 1
.equ DDB2 = 2 ; Port B Data Direction Register bit 2
.equ DDB3 = 3 ; Port B Data Direction Register bit 3
.equ DDB4 = 4 ; Port B Data Direction Register bit 4
.equ DDB5 = 5 ; Port B Data Direction Register bit 5
.equ DDB6 = 6 ; Port B Data Direction Register bit 6
.equ DDB7 = 7 ; Port B Data Direction Register bit 7
; PINB - Port B Input Pins
.equ PINB0 = 0 ; Port B Input Pins bit 0
.equ PINB1 = 1 ; Port B Input Pins bit 1
.equ PINB2 = 2 ; Port B Input Pins bit 2
.equ PINB3 = 3 ; Port B Input Pins bit 3
.equ PINB4 = 4 ; Port B Input Pins bit 4
.equ PINB5 = 5 ; Port B Input Pins bit 5
.equ PINB6 = 6 ; Port B Input Pins bit 6
.equ PINB7 = 7 ; Port B Input Pins bit 7
; ***** PORTC ************************
; PORTC - Port C Data Register
.equ PORTC0 = 0 ; Port C Data Register bit 0
.equ PC0 = 0 ; For compatibility
.equ PORTC1 = 1 ; Port C Data Register bit 1
.equ PC1 = 1 ; For compatibility
.equ PORTC2 = 2 ; Port C Data Register bit 2
.equ PC2 = 2 ; For compatibility
.equ PORTC3 = 3 ; Port C Data Register bit 3
.equ PC3 = 3 ; For compatibility
.equ PORTC4 = 4 ; Port C Data Register bit 4
.equ PC4 = 4 ; For compatibility
.equ PORTC5 = 5 ; Port C Data Register bit 5
.equ PC5 = 5 ; For compatibility
.equ PORTC6 = 6 ; Port C Data Register bit 6
.equ PC6 = 6 ; For compatibility
.equ PORTC7 = 7 ; Port C Data Register bit 7
.equ PC7 = 7 ; For compatibility
; DDRC - Port C Data Direction Register
.equ DDC0 = 0 ; Port C Data Direction Register bit 0
.equ DDC1 = 1 ; Port C Data Direction Register bit 1
.equ DDC2 = 2 ; Port C Data Direction Register bit 2
.equ DDC3 = 3 ; Port C Data Direction Register bit 3
.equ DDC4 = 4 ; Port C Data Direction Register bit 4
.equ DDC5 = 5 ; Port C Data Direction Register bit 5
.equ DDC6 = 6 ; Port C Data Direction Register bit 6
.equ DDC7 = 7 ; Port C Data Direction Register bit 7
; PINC - Port C Input Pins
.equ PINC0 = 0 ; Port C Input Pins bit 0
.equ PINC1 = 1 ; Port C Input Pins bit 1
.equ PINC2 = 2 ; Port C Input Pins bit 2
.equ PINC3 = 3 ; Port C Input Pins bit 3
.equ PINC4 = 4 ; Port C Input Pins bit 4
.equ PINC5 = 5 ; Port C Input Pins bit 5
.equ PINC6 = 6 ; Port C Input Pins bit 6
.equ PINC7 = 7 ; Port C Input Pins bit 7
; ***** PORTD ************************
; PORTD - Port D Data Register
.equ PORTD0 = 0 ; Port D Data Register bit 0
.equ PD0 = 0 ; For compatibility
.equ PORTD1 = 1 ; Port D Data Register bit 1
.equ PD1 = 1 ; For compatibility
.equ PORTD2 = 2 ; Port D Data Register bit 2
.equ PD2 = 2 ; For compatibility
.equ PORTD3 = 3 ; Port D Data Register bit 3
.equ PD3 = 3 ; For compatibility
.equ PORTD4 = 4 ; Port D Data Register bit 4
.equ PD4 = 4 ; For compatibility
.equ PORTD5 = 5 ; Port D Data Register bit 5
.equ PD5 = 5 ; For compatibility
.equ PORTD6 = 6 ; Port D Data Register bit 6
.equ PD6 = 6 ; For compatibility
.equ PORTD7 = 7 ; Port D Data Register bit 7
.equ PD7 = 7 ; For compatibility
; DDRD - Port D Data Direction Register
.equ DDD0 = 0 ; Port D Data Direction Register bit 0
.equ DDD1 = 1 ; Port D Data Direction Register bit 1
.equ DDD2 = 2 ; Port D Data Direction Register bit 2
.equ DDD3 = 3 ; Port D Data Direction Register bit 3
.equ DDD4 = 4 ; Port D Data Direction Register bit 4
.equ DDD5 = 5 ; Port D Data Direction Register bit 5
.equ DDD6 = 6 ; Port D Data Direction Register bit 6
.equ DDD7 = 7 ; Port D Data Direction Register bit 7
; PIND - Port D Input Pins
.equ PIND0 = 0 ; Port D Input Pins bit 0
.equ PIND1 = 1 ; Port D Input Pins bit 1
.equ PIND2 = 2 ; Port D Input Pins bit 2
.equ PIND3 = 3 ; Port D Input Pins bit 3
.equ PIND4 = 4 ; Port D Input Pins bit 4
.equ PIND5 = 5 ; Port D Input Pins bit 5
.equ PIND6 = 6 ; Port D Input Pins bit 6
.equ PIND7 = 7 ; Port D Input Pins bit 7

View File

@ -0,0 +1,179 @@
; *******************************************
; * PAT80 COMPOSITE PAL VIDEO ADAPTER *
; * Character generator module *
; *******************************************
;
; @language: AVR ASM
;
; This file is part of Pat80 IO Devices.
;
; Pat80 IO Devices is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 IO Devices is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
;
;
; This module generates the character pixels using the font present in rom
; and adds it on the framebuffer in the position indicated by POS_COARSE (Y).
.equ LINE_COLUMNS = 46 ; number of columns (characters or chunks) per line
; Draws character in register A to the screen at current coords (Y)
; @param (HIGH_ACCUM) ascii code to display
; @modifies r0 (A), r1, r2, r3, r17, HIGH_ACCUM, Y, Z
draw_char:
; Check char is valid
cpi HIGH_ACCUM, 0x7f
brlo draw_char_valid
ret
draw_char_valid:
; Glyph's first byte is at:
; glyph_pointer = font_starting_mem_pos + (ascii_code * number_of_bytes_per_font)
; But all the fonts are 1 byte large, so a glyph is 1*height bytes:
; glyph_pointer = FONT + (ascii_code * FONT_HEIGHT)
; Load first glyph position on Z
ldi ZH, high(FONT<<1)
ldi ZL, low(FONT<<1)
; Obtain offset multiplying ascii_code * number_of_bytes_per_font
ldi r17, FONT_HEIGHT
mul HIGH_ACCUM, r17 ; result overwrites r0 and r1!
; 16-bit addition between gliph's first byte position and offset (and store result in Z) to obtain our glyph position
add ZL, r0
adc ZH, r1
; Z contain our glyph's first byte position: draw it
; Obtain drawing position in framebuffer memory (in Y)
call update_mem_pointer
; The drawing consist of FONT_HEIGHT cycles. Every glyph byte is placed on its own line
; on screen. To do this, we place it LINE_COLUMNS bytes after the previous one.
clr HIGH_ACCUM
draw_char_loop:
; Load glyph line byte from program memory (and point to the next)
lpm A, Z+
; Write glyph line to framebuffer at chunk cursor position (Y)
st Y, A
; Increment chunk cursor position (Y) to next line of the same char column
adiw YH:YL,LINE_COLUMNS
; Decrement loop counter and exit if reached 0
inc HIGH_ACCUM
cpi HIGH_ACCUM, FONT_HEIGHT
brlo draw_char_loop
; Char drawing is complete. Increment cursor position
inc POS_COLUMN
; Check if end of line
cpi POS_COLUMN, LINE_COLUMNS
brsh draw_char_eol
ret
draw_char_eol:
; end of line
clr POS_COLUMN ; reset column to 0
; Move cursor to next line
ldi HIGH_ACCUM, FONT_HEIGHT
add POS_ROWP, HIGH_ACCUM
; check if reached end of screen
cpi POS_ROWP, SCREEN_HEIGHT
brsh draw_char_eos
ret
draw_char_eos:
; end of screen: scroll screen but leave line pointer to last line
call scroll_screen
ret
; Sets the cursor to 0,0 and clears fine position
cursor_pos_home:
; Set all positions to 0
clr POS_COLUMN
clr POS_ROWP
ret
; Draws a newline
; Moves cursor to start of following screen line
; Takes care of particular cases, i.e. end of screen (shifts all screen up by one line)
draw_carriage_return:
; Move cursor to line start
ldi POS_COLUMN, 0
; Move cursor to next line
ldi HIGH_ACCUM, FONT_HEIGHT
add POS_ROWP, HIGH_ACCUM
; Check if end of screen
cpi POS_ROWP, SCREEN_HEIGHT
brsh draw_carriage_return_eos
ret
draw_carriage_return_eos:
call scroll_screen
ret
; Scrolls the screen by one line (=LINE_COLUMNS*FONT_HEIGHT bytes)
; and clears the last line (FRAMEBUFFER_END - LINE_COLUMNS*FONT_HEIGHT bytes)
; @uses A, Z
scroll_screen:
; "Read" Pointer to first char of second line
ldi YH, high(FRAMEBUFFER+(LINE_COLUMNS*FONT_HEIGHT))
ldi YL, low(FRAMEBUFFER+(LINE_COLUMNS*FONT_HEIGHT))
; "Write" Pointer to first char of first line
ldi ZH, high(FRAMEBUFFER)
ldi ZL, low(FRAMEBUFFER)
; Copy data
scroll_screen_copy_loop:
ld A, Y+
st Z+, A
cpi YH, high(FRAMEBUFFER_END)
brne scroll_screen_copy_loop
cpi YL, low(FRAMEBUFFER_END)
brne scroll_screen_copy_loop
; All the lines have been "shifted" up by one line.
; The first line is lost and the last is duplicate. Clear the last.
clr A
scroll_screen_clear_loop:
st Z+, A
cpi r31, high(FRAMEBUFFER_END)
brne scroll_screen_clear_loop
cpi r30, low(FRAMEBUFFER_END)
brne scroll_screen_clear_loop
; Last line cleared. Set cursor position
clr POS_COLUMN ; cursor to first column
ldi POS_ROWP, SCREEN_HEIGHT-FONT_HEIGHT
ret
; Sets the Y register to point to the cursor's first line memory position
; The cursor's position is represented by registers POS_COLUMN and POS_ROWP
update_mem_pointer:
; Compute memory pointer offset: offset = (LINE_COLUMNS*POS_ROWP)+POS_COLUMN
; LINE_COLUMNS*POS_ROWP
ldi HIGH_ACCUM, LINE_COLUMNS
mul HIGH_ACCUM, POS_ROWP ; result overwrites r0 and r1!
; ...+POS_COLUMN
add r0, POS_COLUMN
clr HIGH_ACCUM
adc r1, HIGH_ACCUM
; Set pointer to start of framebuffer
ldi YL, low(FRAMEBUFFER)
ldi YH, high(FRAMEBUFFER)
; Add offset to pointer
add YL, r0
adc YH, r1
ret
clear_screen:
ldi YH, high(FRAMEBUFFER)
ldi YL, low(FRAMEBUFFER)
load_mem_loop:
clr HIGH_ACCUM
;ser HIGH_ACCUM
st Y+, HIGH_ACCUM
; if reached the last framebuffer byte, exit cycle
cpi YH, high(FRAMEBUFFER_END)
brne load_mem_loop ; if not 0, repeat h_picture_loop
cpi YL, low(FRAMEBUFFER_END)
brne load_mem_loop ; if not 0, repeat h_picture_loop
ret

View File

@ -0,0 +1,53 @@
; *******************************************
; * PAT80 COMPOSITE PAL VIDEO ADAPTER *
; * Communication module *
; *******************************************
;
; @language: AVR ASM
;
; This file is part of Pat80 IO Devices.
;
; Pat80 IO Devices is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 IO Devices is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
;
;
; This module manages the communication between Pat80 and
; the video adapter.
; INTERNAL POINTER:
; Internally, the last screen position is represented by 24 bits in two registers:
; POS_COARSE: Register Y (16-bit, r31 and r30): Coarse position. Points to one of the chunks
; (character columns). 46 chunks per row, 304 rows. Used for character position, as
; 1 chunk = 1 byte = 1 character.
; Initializes and waits for a byte on PORTB
comm_init:
call cursor_pos_home ; Set cursor to 0,0
comm_wait_byte:
in HIGH_ACCUM, DATA_PORT_IN ; read PORTB
; Check continuously CLK until a LOW is found
sbic PORTD, CLK_PIN
jmp comm_wait_byte
; CLK triggered: Draw char
call draw_char
jmp comm_wait_byte
; ; CLK triggered: Copy PORTB to the next framebuffer byte
; st Y+, A
; ; if reached the last framebuffer byte, exit cycle
; cpi r31, 0b00111110
; brne comm_wait_byte ; if not 0, repeat h_picture_loop
; cpi r30, 0b11000000
; brne comm_wait_byte ; if not 0, repeat h_picture_loop
; jmp comm_init ; filled all memory: reset framebuffer position

View File

@ -0,0 +1,974 @@
; Draws a cat example image
draw_cat:
;*** Load data into ram ***
ldi YH, high(FRAMEBUFFER)
ldi YL, low(FRAMEBUFFER)
ldi ZH, high(CAT_IMAGE)
ldi ZL, low(CAT_IMAGE)
load_cat_loop:
lpm HIGH_ACCUM, Z+
st Y+, HIGH_ACCUM
; wait
; ser r19
; cat_wait_loop_1:
; dec r19
; brne cat_wait_loop_1
; if reached the last framebuffer byte, exit cycle
cpi YH, high(FRAMEBUFFER_END)
brne load_cat_loop ; if not 0, repeat h_picture_loop
cpi YL, low(FRAMEBUFFER_END)
brne load_cat_loop ; if not 0, repeat h_picture_loop
ret
; Image of the mighty Pepa during a rest
CAT_IMAGE: .db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x02, 0x00, 0x22, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x20, 0x22, 0x02, 0x82, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x54, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x11, 0x11, 0x51, 0x11, 0x51, 0x51, 0x51, 0x15, 0x55,
.db 0x55, 0xd5, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x22, 0x20, 0x82,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44,
.db 0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x55, 0x55, 0x54, 0xc5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x15, 0x11, 0x11, 0x11,
.db 0x11, 0x51, 0x55, 0x51, 0x55, 0xd5, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x22, 0x00, 0x22, 0xa2, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x55, 0x55,
.db 0x45, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x55, 0x11, 0x11, 0x11,
.db 0x11, 0x51, 0x11, 0x51, 0x11, 0x51, 0x55, 0x55, 0x55, 0xd5, 0x21, 0x22,
.db 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22,
.db 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22,
.db 0x20, 0x22, 0x20, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x82, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x54, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x55, 0x15, 0x11, 0x11,
.db 0x11, 0x11, 0x15, 0x55, 0x15, 0x15, 0x15, 0x15, 0x15, 0x11, 0x55, 0x55,
.db 0x55, 0xd5, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xa2,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x54, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x55, 0x11, 0x11,
.db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x51, 0x51, 0x55, 0x55, 0x55, 0x51,
.db 0x55, 0x15, 0x11, 0x11, 0x11, 0xd5, 0x23, 0x20, 0x22, 0x22, 0x22, 0x20,
.db 0x22, 0x22, 0x22, 0x20, 0x22, 0x22, 0x22, 0x20, 0x22, 0x22, 0x22, 0x20,
.db 0x22, 0x22, 0x22, 0x20, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x54, 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x15,
.db 0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x11, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x95, 0x23, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x22, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x44, 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x44, 0x45, 0x55, 0xc5,
.db 0x55, 0x55, 0x45, 0x55, 0x45, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x55, 0x55, 0x51,
.db 0x51, 0x51, 0x11, 0x51, 0x11, 0x11, 0x11, 0x51, 0x11, 0x11, 0x51, 0x55,
.db 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x75, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0x21, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22, 0x20, 0x22,
.db 0x20, 0x22, 0x20, 0x02, 0x00, 0x20, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x20, 0xa2, 0x20, 0x00, 0x20, 0x00, 0x20, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x44, 0x55, 0x55, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54,
.db 0x55, 0x54, 0x55, 0x7d, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88,
.db 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x15,
.db 0x55, 0x55, 0x15, 0x15, 0x55, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x55,
.db 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5f,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22,
.db 0x22, 0x22, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x02, 0xa2, 0x2a, 0x22, 0x22,
.db 0x22, 0x02, 0x22, 0xa2, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x44, 0x55, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x44, 0x45, 0x45,
.db 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x5f, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88,
.db 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x80, 0x08, 0x88, 0x8a, 0x88, 0x08, 0x88, 0x88, 0x08, 0x88,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x55, 0x55, 0x51, 0x51,
.db 0x55, 0x51, 0x51, 0x51, 0x55, 0x55, 0x51, 0x55, 0x55, 0x51, 0x51, 0x51,
.db 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0xf5, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x23, 0x22,
.db 0x22, 0x22, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0xa2,
.db 0xba, 0x23, 0x22, 0xa2, 0x22, 0x22, 0xaa, 0xa2, 0x55, 0x55, 0x55, 0x55,
.db 0x45, 0x44, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x44, 0x54, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x44,
.db 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xfd, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xee, 0x8a, 0x88, 0x80,
.db 0x80, 0x88, 0x88, 0x80, 0x55, 0x55, 0x15, 0x55, 0x55, 0x15, 0x15, 0x55,
.db 0x15, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x15, 0x55, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0x57, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x22,
.db 0x22, 0x22, 0x22, 0xa2, 0xbb, 0x02, 0x22, 0x2a, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x44, 0x44, 0x45,
.db 0x55, 0x55, 0x44, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x54, 0x44, 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0x7f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x80, 0xaa, 0x00, 0x00, 0x00, 0x88, 0x88, 0x08, 0x88, 0xaa,
.db 0xae, 0x80, 0x88, 0x8a, 0x88, 0x88, 0x88, 0x88, 0x55, 0x55, 0x55, 0x51,
.db 0x51, 0x51, 0x51, 0x51, 0x55, 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x11, 0x11, 0x11, 0x11, 0x51, 0x51, 0x51, 0x51, 0x11, 0x55, 0x55, 0x55,
.db 0xf5, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0x7f, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa,
.db 0x02, 0x00, 0x00, 0x20, 0x22, 0x22, 0x22, 0xba, 0xab, 0xa2, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xa2, 0xaa, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x54, 0x44, 0x54, 0x55, 0x54, 0x44, 0x40, 0x54, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x44, 0x40, 0x44, 0x55, 0x54, 0x75, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, 0x5f, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xa8, 0x2a, 0x00, 0x00, 0x00,
.db 0x80, 0x88, 0xa8, 0xaa, 0xaa, 0x80, 0xa8, 0xaa, 0xa8, 0xa8, 0xa8, 0xa8,
.db 0x55, 0x15, 0x55, 0x55, 0x55, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x01,
.db 0x51, 0x55, 0x55, 0x55, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x7f, 0x57, 0x55, 0x55, 0x75, 0x55, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0xf5, 0xff, 0x77, 0x55, 0x55, 0x55, 0x77, 0x57, 0x57, 0xd7, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xab,
.db 0xaa, 0x02, 0x28, 0xaa, 0xaa, 0x22, 0x22, 0x22, 0x2a, 0xaa, 0xba, 0xab,
.db 0x2b, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x45, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x45, 0x45, 0x44, 0x00, 0x44, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f,
.db 0x5d, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xff, 0xff, 0x55, 0x54,
.db 0x55, 0x55, 0xdd, 0x5d, 0x5d, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xee, 0xee, 0xee, 0xae, 0x0e, 0xa8,
.db 0xaa, 0x0a, 0x88, 0x08, 0x88, 0xaa, 0xae, 0xea, 0x02, 0x80, 0x8a, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x51, 0x51, 0x51, 0x51, 0x55, 0x51, 0x11, 0x10,
.db 0x11, 0x51, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x75, 0xf7,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf5, 0x77, 0x75,
.db 0x55, 0x55, 0x55, 0xff, 0xff, 0xff, 0x57, 0x51, 0x55, 0x55, 0x55, 0x75,
.db 0x77, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x20, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0x2a, 0xa8, 0xaa, 0xaa, 0xbb, 0xa2,
.db 0xaa, 0xba, 0xbb, 0xba, 0x22, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x45, 0x44, 0x44, 0x44, 0x44, 0x00, 0x40, 0x40, 0x40, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xdd, 0xdd, 0xfd, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x5f, 0xd5, 0x5d, 0x55, 0xfd, 0x57, 0xf5, 0xff,
.db 0xff, 0x5f, 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x80, 0xa8, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea,
.db 0xea, 0xea, 0x0a, 0xa8, 0xaa, 0xaa, 0xaa, 0xae, 0xea, 0xaa, 0x8a, 0xaa,
.db 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xa8, 0xaa, 0xaa, 0x15, 0x55, 0x15, 0x15,
.db 0x11, 0x11, 0x15, 0x55, 0x55, 0x55, 0x15, 0x15, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x5f, 0x55, 0x7f, 0xd7, 0x7f, 0xff, 0xff, 0x5f, 0x51, 0x55, 0x55, 0x75,
.db 0x77, 0x57, 0x55, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x22, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x3b, 0xa2,
.db 0xaa, 0xaa, 0xba, 0xaa, 0xba, 0x02, 0x20, 0x02, 0x00, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x45, 0x44, 0x04, 0x44, 0x44, 0x44, 0x55, 0x55,
.db 0x45, 0x45, 0x44, 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0x5d, 0xdd,
.db 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xd5, 0xdd, 0x55,
.db 0xfd, 0x55, 0xfd, 0x45, 0x54, 0x55, 0x54, 0x55, 0x5d, 0x5d, 0x55, 0x55,
.db 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xae, 0xee, 0xee, 0xee, 0x2e, 0xa8, 0xaa, 0xaa, 0xaa, 0x00,
.db 0xa0, 0x02, 0x00, 0x00, 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x51, 0x11, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x51,
.db 0x51, 0x51, 0x55, 0x55, 0x55, 0x75, 0x77, 0xf7, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf5, 0x7f, 0x77, 0xff, 0x57, 0x55, 0x17,
.db 0x55, 0x55, 0x15, 0x55, 0x77, 0x77, 0x77, 0x77, 0x77, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x20, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0x3b, 0xa2, 0xaa, 0xaa, 0xaa, 0x0b, 0x20, 0x20, 0x20, 0x22,
.db 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x05, 0x44, 0x44, 0x54,
.db 0x54, 0x55, 0x54, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x55,
.db 0x55, 0x55, 0xd5, 0xdd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x7f, 0x55, 0xd5, 0x5d, 0xfd, 0x5f, 0x55, 0x55, 0x54, 0x55, 0x55, 0xd4,
.db 0xdd, 0x5d, 0x55, 0xd5, 0xdd, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xea, 0xea, 0xaa, 0x80,
.db 0xa8, 0xaa, 0xaa, 0x0a, 0x00, 0x80, 0x00, 0x00, 0x00, 0xa0, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x15, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x77, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, 0xf5, 0x7f,
.db 0x7f, 0x57, 0x55, 0x55, 0x57, 0x55, 0x55, 0x55, 0x55, 0x7f, 0x7f, 0x77,
.db 0x57, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xfb, 0xa2, 0xaa, 0xaa, 0xaa, 0x02,
.db 0x22, 0x02, 0x0a, 0x20, 0x02, 0x82, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44,
.db 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0x5d, 0xdd, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0xdd, 0xfd, 0xdd, 0x55, 0x55, 0x55,
.db 0x5d, 0x55, 0x55, 0x45, 0x55, 0x55, 0xdd, 0x5d, 0x5d, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x88, 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xee,
.db 0xee, 0xee, 0xee, 0x88, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0x02,
.db 0x00, 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x51, 0x51, 0x51, 0x55, 0x55,
.db 0x55, 0x55, 0x77, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x55, 0xff, 0xff, 0x57, 0x55, 0x55, 0x55, 0xfd, 0x57, 0x55, 0x11,
.db 0x75, 0x77, 0x57, 0xf7, 0x77, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa2, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3,
.db 0xaa, 0xaa, 0x2a, 0x20, 0x22, 0x00, 0xb8, 0x03, 0x00, 0x00, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x54,
.db 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x55, 0x55, 0x55, 0xd5, 0xdd,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x5f, 0xfd,
.db 0x57, 0x54, 0x55, 0x55, 0xf4, 0x4f, 0x44, 0x55, 0x54, 0x5d, 0x55, 0x55,
.db 0xdd, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xea, 0xea, 0xee, 0xea, 0xee, 0xaa, 0x8a, 0xaa, 0x0a, 0x00,
.db 0x00, 0x00, 0xe8, 0xaa, 0x00, 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x15,
.db 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xf7, 0xff, 0x57, 0x55, 0x55, 0x55,
.db 0xfd, 0xff, 0x55, 0x55, 0x55, 0x7f, 0x77, 0x77, 0x57, 0xff, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x22, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xbb, 0x2a, 0x22, 0x02, 0x02, 0xba, 0xab,
.db 0x00, 0x22, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x45, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55,
.db 0x55, 0x55, 0x55, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xd7, 0xf5, 0xff, 0x55, 0x55, 0x55, 0x55, 0xfd, 0xff, 0x05, 0x55,
.db 0x45, 0xdd, 0x5d, 0x55, 0x55, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xee, 0xee, 0xee, 0xee, 0xaa,
.db 0xaa, 0xae, 0x0a, 0x00, 0x00, 0x00, 0xe8, 0xee, 0x02, 0x00, 0x00, 0xa8,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x51, 0x51, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x75, 0xf7,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf5, 0xff,
.db 0x57, 0x55, 0x55, 0x55, 0xfd, 0xff, 0x57, 0x55, 0x55, 0xf5, 0x77, 0x77,
.db 0x77, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xba,
.db 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xbb, 0x2b, 0x20,
.db 0x20, 0x22, 0xb8, 0xbb, 0x03, 0x20, 0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x55, 0x55, 0x54, 0x54, 0x54, 0x55, 0x54, 0x54, 0x54, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x54, 0x55, 0x55, 0x55, 0xd5, 0xdd, 0xdd, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0x55, 0x55, 0x55, 0x55,
.db 0xfd, 0xff, 0x47, 0x44, 0x55, 0x54, 0xdd, 0x5d, 0x55, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea,
.db 0xea, 0xee, 0xea, 0xaa, 0xaa, 0xea, 0x0a, 0x00, 0x00, 0x00, 0xe8, 0xea,
.db 0x0a, 0x00, 0x00, 0x08, 0xa8, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x15, 0x11, 0x55, 0x55,
.db 0x55, 0x55, 0x77, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x57, 0x55, 0x55, 0x55, 0xfd, 0xff, 0x17, 0x51,
.db 0x55, 0x5f, 0x75, 0x7f, 0x77, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x22, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0x0b, 0x22, 0x22, 0x22, 0xb8, 0xbb, 0x2b, 0x02, 0x02, 0xaa,
.db 0xa2, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x45, 0x45, 0x44, 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0xdd,
.db 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x4f, 0x55, 0x55, 0x55, 0xfd, 0xff, 0x5f, 0x45, 0x55, 0x5c, 0x45, 0xd5,
.db 0x5d, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xae, 0xae, 0xee, 0xee, 0xee, 0xaa, 0xaa, 0xaa, 0x0a, 0x00,
.db 0x00, 0x00, 0xe8, 0xee, 0x8e, 0x02, 0x00, 0xae, 0x0a, 0xaa, 0xaa, 0xaa,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x11, 0x11, 0x51, 0x55, 0x55, 0x55, 0x75, 0xf7, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0x55, 0x55, 0x55,
.db 0xf1, 0xff, 0xd7, 0x55, 0x15, 0xff, 0x57, 0x75, 0xf5, 0xf7, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x20, 0xa2, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xba, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xba, 0x23, 0x20, 0x22, 0x22, 0xb8, 0xbb,
.db 0xaa, 0x00, 0x20, 0xaa, 0x2a, 0xa0, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x54,
.db 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x54, 0x44, 0x44, 0x44, 0x44, 0x54,
.db 0x55, 0x55, 0xd5, 0xd5, 0xdd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x47, 0x55, 0x55, 0x55, 0xfd, 0xff, 0xdd, 0x45,
.db 0x54, 0xfd, 0x5d, 0x55, 0x55, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xea, 0xee, 0xee, 0xaa,
.db 0xaa, 0xaa, 0x0a, 0x00, 0x00, 0x00, 0xa8, 0xaa, 0xaa, 0x80, 0x2a, 0xaa,
.db 0xaa, 0x80, 0xaa, 0xa8, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x15, 0x15, 0x55, 0x55, 0x55, 0x55, 0x77, 0x77,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x1f, 0x55, 0x55, 0x55, 0xfd, 0x7f, 0x7d, 0xfd, 0x7f, 0xff, 0x7f, 0x15,
.db 0x57, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xab, 0xbb, 0x00,
.db 0x22, 0x22, 0xba, 0xbb, 0xaa, 0xff, 0xab, 0xba, 0xab, 0x02, 0xaa, 0xaa,
.db 0x55, 0x55, 0x55, 0x55, 0x45, 0x55, 0x45, 0x55, 0x45, 0x45, 0x45, 0x45,
.db 0x44, 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0xdd, 0xdd, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x54, 0x55,
.db 0xff, 0x7f, 0xc5, 0xff, 0x5f, 0xfd, 0xdf, 0x55, 0x54, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x88, 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xee,
.db 0xee, 0xee, 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0x02, 0x80, 0xaa, 0xae,
.db 0xe2, 0xee, 0xae, 0xaa, 0xaa, 0x0a, 0xa8, 0xaa, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x11, 0x51, 0x55,
.db 0x55, 0x55, 0x75, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xd5, 0xff, 0x7f, 0xf5, 0xff,
.db 0x7f, 0xff, 0xff, 0x57, 0x51, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xaa,
.db 0xaa, 0xaa, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xaa,
.db 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xa2, 0xaa, 0xba, 0xaa, 0xfb, 0x3b, 0xba,
.db 0xaa, 0x2a, 0xa0, 0xaa, 0x55, 0x55, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54,
.db 0x54, 0x54, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x54, 0x55, 0xdd, 0xfd,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
.db 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf5, 0xff, 0x5f, 0xfd, 0xff, 0x5d,
.db 0x45, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xea, 0xee, 0xea,
.db 0xea, 0xea, 0xea, 0xee, 0xea, 0xee, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xea, 0x2a, 0xaa, 0xaa, 0xaa, 0xea, 0x2a, 0xa8, 0xaa, 0xaa, 0x00, 0xa8,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x15, 0x15, 0x55, 0x55, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
.db 0xff, 0x7f, 0xf7, 0xff, 0x7f, 0xfd, 0xff, 0x7f, 0x15, 0xd5, 0x03, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0xa2, 0xaa, 0xbb, 0xbb, 0xfb, 0xff, 0xff, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbf, 0xab, 0xaa, 0xaa, 0xab, 0xab, 0xbb, 0xab, 0xab, 0xbb,
.db 0xaa, 0xbb, 0x2b, 0xba, 0xbb, 0xaa, 0x02, 0xaa, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x45, 0x55, 0x55, 0x55, 0x45, 0x45, 0x44, 0x44, 0x54,
.db 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff,
.db 0x5f, 0xfc, 0xff, 0x5f, 0x55, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xee,
.db 0xae, 0xaa, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xae, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xea, 0xea, 0xae, 0x0a, 0xaa,
.db 0xaa, 0xaa, 0x0a, 0x88, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x55, 0xf5, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x57, 0xff, 0xff, 0x7f,
.db 0x55, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xba, 0xbb, 0xbb, 0xba, 0xbb, 0xba,
.db 0xbb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0xba,
.db 0xba, 0xbb, 0xba, 0xba, 0xaa, 0xbb, 0x02, 0xba, 0xaa, 0xaa, 0x22, 0xa0,
.db 0x55, 0x54, 0x55, 0x54, 0x55, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54,
.db 0x44, 0x44, 0x44, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xd5, 0xff, 0x45, 0xfd, 0xff, 0xdd, 0x55, 0xc0, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0xe8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xee, 0xee, 0xfe, 0xae,
.db 0xaa, 0xea, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xea,
.db 0xaa, 0xaa, 0x00, 0xaa, 0xaa, 0xaa, 0x0a, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x51, 0xfd,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x7f,
.db 0x55, 0xff, 0xff, 0x7f, 0x57, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xba, 0xbb, 0xbb,
.db 0xab, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xab, 0xba, 0xbf, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xab, 0xbb, 0xab, 0x2a, 0x02, 0xba,
.db 0xaa, 0xaa, 0x2a, 0x80, 0x55, 0x55, 0x55, 0x55, 0x45, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x45, 0x04, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x5d, 0x55, 0xff, 0xdf, 0xdd,
.db 0x55, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0xa8, 0xee, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xea,
.db 0xaa, 0xee, 0xee, 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xae, 0xaa, 0x2a, 0x00, 0xaa, 0xaa, 0xaa, 0x0a, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x7f, 0xf5, 0x77, 0x51, 0xff, 0xff, 0x77, 0x55, 0x95, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xaa,
.db 0xba, 0xbb, 0xbb, 0xbb, 0xba, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xab, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xba, 0xaa, 0xaa,
.db 0xa2, 0x2a, 0x00, 0xba, 0xaa, 0xaa, 0x2a, 0x80, 0x55, 0x55, 0x54, 0x54,
.db 0x54, 0x54, 0x54, 0x55, 0x54, 0x55, 0x54, 0x54, 0xc0, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0xf5, 0x5d,
.db 0x54, 0xfd, 0xdd, 0x55, 0x55, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa, 0xea, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xee, 0xaa, 0xea, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0xa0, 0x0a, 0x80, 0xaa,
.db 0xaa, 0xaa, 0x0a, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x15, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0xf5, 0x17, 0x55, 0xff, 0x7f, 0x57,
.db 0x57, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x20, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xab,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb,
.db 0xab, 0xbb, 0xab, 0x2b, 0xa8, 0x02, 0x80, 0xaa, 0xaa, 0xaa, 0x2a, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x54,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x5f, 0xfd, 0x45, 0x55, 0xff, 0xdf, 0x55, 0x55, 0x85, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xaa, 0xaa,
.db 0xee, 0xae, 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xae, 0xee, 0xae, 0xee,
.db 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0x0e,
.db 0xae, 0x02, 0x80, 0xaa, 0xaa, 0xaa, 0x0a, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x75, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0x51,
.db 0x55, 0xff, 0x7f, 0x77, 0x55, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xba, 0xbb, 0xaa, 0xba, 0xbb, 0x8b, 0xbb, 0x00, 0x80, 0xaa,
.db 0xaa, 0xaa, 0x22, 0x80, 0x55, 0x54, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55,
.db 0x55, 0x44, 0x54, 0xd5, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x7f, 0x41, 0xc5, 0xff, 0xdf, 0x55,
.db 0x55, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xaa,
.db 0xaa, 0xaa, 0xea, 0x8a, 0xaa, 0x00, 0x80, 0xaa, 0xaa, 0xaa, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x55, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x17, 0x7f, 0x51, 0xd5, 0xff, 0x7f, 0x55, 0x55, 0x95, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xab, 0xaa, 0xab, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbf, 0x02,
.db 0x2a, 0x00, 0xa0, 0xab, 0xaa, 0xaa, 0x02, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x55, 0xdd, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x55, 0x40,
.db 0xd5, 0xff, 0x5f, 0x55, 0x55, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0xa8, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xae, 0xae,
.db 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xea, 0xae, 0x80, 0x0a, 0x00, 0xa0, 0xaa,
.db 0xaa, 0xaa, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x11, 0x51, 0x55, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf5, 0x57, 0x51, 0xf1, 0xff, 0x77, 0x55,
.db 0x55, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
.db 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xaa, 0xba, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xbb,
.db 0xbb, 0xbb, 0xaa, 0xaa, 0x2a, 0x00, 0xa0, 0xba, 0xaa, 0x2a, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x40, 0x54, 0x55, 0xdd,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xfd, 0xff, 0x55, 0x55, 0xf4, 0xff, 0x5d, 0x55, 0x55, 0xc0, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xea,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xee, 0xea,
.db 0x8a, 0x00, 0xa8, 0xaa, 0xaa, 0x0a, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x15, 0x11, 0x55, 0x75, 0xf7, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0x51,
.db 0xfd, 0xff, 0x77, 0x57, 0x55, 0xd1, 0x01, 0x00, 0x02, 0x00, 0x02, 0x02,
.db 0x02, 0x00, 0x00, 0x20, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xba, 0xab, 0xaa, 0xaa, 0xaa,
.db 0xab, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xbf, 0x2a, 0x00, 0xaa, 0xab,
.db 0xaa, 0x22, 0x02, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44,
.db 0x44, 0x55, 0x55, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, 0x45, 0xfd, 0xff, 0x5d, 0x55,
.db 0x45, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xa8, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xae, 0xae,
.db 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae,
.db 0xee, 0xee, 0xee, 0xae, 0x0a, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x51, 0x55, 0x75, 0xf7,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x7f, 0x57, 0x51, 0xff, 0xff, 0x57, 0x55, 0x15, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0xaa, 0xaa, 0xaa, 0xba,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xba,
.db 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xab, 0xfa, 0xaa,
.db 0xaa, 0x80, 0xba, 0xaa, 0x2a, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x45, 0x44, 0x44, 0x54, 0x55, 0xdd, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xc1,
.db 0xff, 0xff, 0x55, 0x55, 0x44, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xea, 0xee, 0xee, 0xee, 0xee, 0xae, 0x80, 0xaa, 0xaa,
.db 0x0a, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x15,
.db 0x11, 0x55, 0x55, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xd5, 0xff, 0xff, 0x55, 0x55,
.db 0x11, 0xd5, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x20,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xab, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xaa, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb,
.db 0xbb, 0xbf, 0xff, 0xff, 0xbf, 0xa2, 0xbb, 0xab, 0x22, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x54, 0x55, 0xdd,
.db 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xd5, 0xff, 0x5f, 0x55, 0x45, 0x44, 0xd5, 0x01, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xae, 0xae, 0xaa,
.db 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xaf, 0xa0, 0xaa, 0x0a, 0x00, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x15, 0x11, 0x11, 0x11, 0x55, 0x55, 0x75, 0xf7, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5,
.db 0xff, 0x57, 0x55, 0x11, 0x51, 0xd5, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0xa2, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xaa, 0xba, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xba, 0xbb, 0xfb, 0xbb, 0xfb, 0xff, 0xbf, 0xa2, 0xbb, 0x22,
.db 0x02, 0x00, 0x00, 0x80, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x40, 0x44,
.db 0x40, 0x54, 0x55, 0xd5, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0x55, 0x55, 0x44,
.db 0x44, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x80, 0xa8, 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea,
.db 0xee, 0xae, 0xea, 0xee, 0xfe, 0xa0, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x55, 0x55, 0x15, 0x11, 0x15, 0x11, 0x11, 0x51, 0x55, 0x75,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xf5, 0x57, 0x55, 0x15, 0x11, 0x55, 0xd5, 0x01, 0x02,
.db 0x22, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xaa, 0xaa, 0xaa,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab,
.db 0xba, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xff, 0xbf, 0xfb, 0xff,
.db 0xbf, 0xaa, 0x22, 0x02, 0x00, 0x00, 0x00, 0x80, 0x45, 0x54, 0x55, 0x55,
.db 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x55, 0xdd, 0xfd, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55,
.db 0x55, 0x55, 0x45, 0x44, 0x54, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xaa, 0xae, 0xae, 0xaa,
.db 0xaa, 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xea, 0xee, 0xee, 0xea, 0xef, 0xbe, 0x08, 0x08, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0x55, 0x51, 0x55, 0x55, 0x15, 0x11, 0x51, 0x11,
.db 0x11, 0x11, 0x55, 0x55, 0x75, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, 0x55, 0x55, 0x11, 0x51,
.db 0x55, 0x95, 0x2b, 0x00, 0x20, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0xa2, 0xaa, 0xaa, 0xba, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xbb, 0xba,
.db 0xbb, 0xbb, 0xba, 0xab, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xbb,
.db 0xfb, 0xfb, 0xbb, 0xbf, 0xbf, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0x55, 0x55, 0x40, 0x55, 0x45, 0x44, 0x44, 0x40, 0x44, 0x44, 0x54, 0x55,
.db 0xd5, 0xdd, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x57, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0x5f, 0x55, 0x55, 0x44, 0x44, 0x44, 0x54, 0xc4, 0xab, 0x0a,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xea, 0xea, 0xaa, 0xaa, 0x8a,
.db 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0xee, 0xee, 0xea, 0xee,
.db 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x57, 0x55, 0x51,
.db 0x15, 0x11, 0x15, 0x11, 0x11, 0x11, 0x55, 0x55, 0x55, 0xf7, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, 0x55,
.db 0x55, 0x15, 0x11, 0x55, 0x55, 0x95, 0xab, 0xaa, 0x2a, 0x02, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xab,
.db 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xba, 0xab, 0xab, 0xaa,
.db 0xaa, 0xab, 0xab, 0xbb, 0xff, 0xbb, 0xba, 0x2b, 0x22, 0x22, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xdf, 0xdd, 0x55, 0x55, 0x04, 0x44, 0x04, 0x44,
.db 0x44, 0x44, 0x44, 0x55, 0x55, 0xd5, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xfd,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xdf, 0xdf, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44,
.db 0x55, 0xc5, 0xab, 0xaa, 0xaa, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0xae,
.db 0xae, 0xaa, 0xaa, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea,
.db 0xee, 0xaa, 0x8a, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0x77, 0x77, 0x55, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x55,
.db 0x55, 0x75, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x57, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
.db 0x55, 0x55, 0x55, 0x55, 0x11, 0x51, 0x51, 0x55, 0x55, 0xd1, 0xbb, 0xba,
.db 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xaa, 0xba, 0x2a,
.db 0xaa, 0xbb, 0xaa, 0xaa, 0xaa, 0xba, 0xba, 0xbb, 0xbb, 0xab, 0x22, 0x22,
.db 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xdd,
.db 0x55, 0x55, 0x05, 0x40, 0x44, 0x44, 0x40, 0x44, 0x54, 0x55, 0xd5, 0xfd,
.db 0xfd, 0xff, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xfd, 0x57, 0xfd, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, 0x55, 0x45,
.db 0x40, 0x44, 0x44, 0x54, 0x45, 0xc4, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa8, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xaa, 0x8a, 0xe8, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xee, 0x8a, 0x80, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x57, 0x55,
.db 0x01, 0x11, 0x11, 0x11, 0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0x7f, 0x57,
.db 0xff, 0xff, 0xff, 0x7f, 0xff, 0x57, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x7f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x11, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xaa, 0x2a, 0x02, 0x00,
.db 0x00, 0x00, 0x20, 0xa2, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xbb,
.db 0xbb, 0xaa, 0xba, 0x2a, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xbb, 0xbb, 0x2b,
.db 0x2a, 0x2a, 0x2a, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdd, 0x55, 0x55, 0x05, 0x00, 0x44,
.db 0x44, 0x55, 0x55, 0xdd, 0xdd, 0xdd, 0x5d, 0x55, 0xff, 0xff, 0xff, 0x5d,
.db 0xfd, 0x55, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x55, 0x55, 0x45, 0xc4, 0xe9, 0xee,
.db 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0x08, 0x00, 0x00, 0x00, 0x88,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0xaa, 0xae, 0xaa, 0xaa, 0xaa, 0x8a,
.db 0xa8, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, 0x8a, 0x88, 0x88, 0x88, 0x08, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfd, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0x77, 0x57, 0x55, 0x15, 0x51, 0x55, 0x55, 0x75,
.db 0x77, 0x77, 0x77, 0x55, 0xff, 0xff, 0x7f, 0x77, 0xff, 0x57, 0xf5, 0xff,
.db 0xff, 0xff, 0xff, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11,
.db 0x51, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xb9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x00, 0x20, 0xa2, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xbb, 0xab, 0xaa, 0xaa, 0x22, 0xaa, 0xbb, 0xba, 0xbb,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xd5, 0x55, 0x55,
.db 0xfd, 0xff, 0x5f, 0x55, 0xdd, 0x55, 0xf5, 0xff, 0xff, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x54, 0x54, 0x54,
.db 0x44, 0xd4, 0xe9, 0xea, 0xee, 0xea, 0xee, 0xee, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x88, 0x80, 0xa8, 0xaa, 0xaa, 0x8a, 0xea, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0x02, 0xa8, 0xaa, 0xaa, 0xa8, 0xaa, 0xa8, 0xaa, 0xa8,
.db 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0x7f, 0x7f, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0xf7, 0xff, 0x77, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x57, 0x57, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x15, 0x11, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0xd5, 0xb9, 0xbb,
.db 0xbb, 0xbf, 0xbb, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xab, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x22, 0xaa, 0xaa, 0x2a, 0x2a, 0x22, 0x2a,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x02, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfd, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdd,
.db 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44,
.db 0x44, 0x55, 0x55, 0x45, 0x44, 0xc4, 0xe9, 0xee, 0xae, 0xaa, 0xaa, 0xee,
.db 0xee, 0xee, 0xee, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77,
.db 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x51,
.db 0x55, 0xd1, 0xb1, 0xbb, 0xaa, 0xaa, 0xaa, 0xba, 0xbb, 0xfb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a,
.db 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xf5, 0xff, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdd,
.db 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x44, 0x44, 0x44, 0x44, 0x54, 0x55, 0x54, 0x44, 0x44, 0xc4, 0xe1, 0xae,
.db 0xaa, 0xaa, 0xea, 0xaa, 0xaa, 0xea, 0xee, 0xee, 0xea, 0xee, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf5, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f,
.db 0x77, 0x77, 0x57, 0x57, 0x55, 0x55, 0x55, 0x55, 0x15, 0x11, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x95, 0xa3, 0xbb, 0xaa, 0xbb, 0xab, 0xaa,
.db 0xaa, 0xaa, 0xbb, 0xbf, 0xbb, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x2a, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xf5, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xdf, 0xdf,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xdd, 0xdd, 0xdd, 0x5d, 0x5d, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x45, 0x55, 0x45, 0x44, 0x44,
.db 0x44, 0xc4, 0xe9, 0xee, 0xee, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xee,
.db 0xee, 0xee, 0xee, 0xee, 0xee, 0xae, 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x88, 0x08,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x55, 0x55, 0x55, 0x55, 0x51,
.db 0x11, 0x51, 0x55, 0x55, 0x55, 0x51, 0x55, 0x55, 0x55, 0xd5, 0xab, 0xbb,
.db 0xfb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xba, 0xfb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xaa, 0xba, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf5, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xd5,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44, 0x44, 0x44, 0x54,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0xc4, 0xeb, 0xea, 0xee, 0xee, 0xaa, 0xee,
.db 0xaa, 0xaa, 0xea, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x77, 0x77, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x11, 0x11, 0x55, 0x55, 0x55, 0x11, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xab,
.db 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x02,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
.db 0xdf, 0xdd, 0xdd, 0xdd, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x44,
.db 0x44, 0x44, 0x45, 0x44, 0x44, 0x45, 0x44, 0x45, 0x44, 0xc4, 0xeb, 0xae,
.db 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xee, 0xee, 0xee, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77,
.db 0x77, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x11, 0x51, 0x55, 0x11, 0x51,
.db 0x51, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xfb, 0xfb, 0xfb, 0xbb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x2a, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x44, 0x40, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44, 0x54, 0x44, 0x44,
.db 0x44, 0xc4, 0xef, 0xee, 0xee, 0xee, 0xea, 0xea, 0xea, 0xee, 0xea, 0xee,
.db 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
.db 0x7f, 0x77, 0x57, 0x55, 0x57, 0x55, 0x55, 0x55, 0x55, 0x15, 0x11, 0x55,
.db 0x15, 0x11, 0x15, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xbf, 0xbb,
.db 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xbf, 0xbf,
.db 0xbf, 0xbb, 0xbb, 0xbb, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xdd, 0x5d, 0x5d, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0x04, 0x44, 0x44, 0x44, 0x44,
.db 0x54, 0x55, 0x45, 0x45, 0x45, 0xc4, 0xef, 0xee, 0xee, 0xee, 0xee, 0xae,
.db 0xaa, 0xae, 0xae, 0xae, 0xae, 0xae, 0xee, 0xae, 0xae, 0xae, 0xae, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x8a,
.db 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xf7, 0xf7, 0x77, 0x77, 0x77, 0x75, 0x55, 0x55, 0x55, 0x55,
.db 0x15, 0x11, 0x11, 0x51, 0x55, 0x55, 0x51, 0x11, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd1, 0xfb, 0xbb, 0xbb, 0xbb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x02, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdd,
.db 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0x40, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x54, 0x55, 0x44, 0x44, 0x44, 0xc4, 0xef, 0xee,
.db 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0xaa, 0xaa, 0xaa, 0xea, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x57, 0x77,
.db 0x57, 0x55, 0x55, 0x55, 0x15, 0x51, 0x55, 0x55, 0x55, 0x15, 0x15, 0x15,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbb,
.db 0xbb, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xab, 0xab,
.db 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22,
.db 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
.db 0xdf, 0xdf, 0xdd, 0xdd, 0xfd, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45,
.db 0x44, 0x45, 0x44, 0x45, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x45, 0x45,
.db 0x45, 0xc5, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x8a, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77,
.db 0x77, 0x77, 0x55, 0x75, 0x55, 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x51, 0x51, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xfb, 0xfb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xfb, 0xfb, 0xbb, 0xbb,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, 0xdd, 0xd5, 0x55, 0x55,
.db 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x55, 0x54, 0x44, 0xc4, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xee, 0xee, 0xea, 0xaa, 0xaa, 0xaa, 0xea, 0xee, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0x77, 0x57, 0x15, 0x11, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x15, 0x15, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xdf, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x04,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x45, 0x44, 0x45, 0x55, 0x55, 0xc5, 0xef, 0xee,
.db 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xae, 0xae, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x8a, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x57,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
.db 0x51, 0x11, 0x51, 0x51, 0x55, 0x51, 0x51, 0x51, 0x51, 0x11, 0x11, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xfb, 0xbb, 0xfb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x22,
.db 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x44, 0x44, 0x44, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x54, 0x54, 0x54, 0x54, 0x44,
.db 0x55, 0xc4, 0xeb, 0xee, 0xee, 0xee, 0xee, 0xea, 0xee, 0xea, 0xee, 0xea,
.db 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0x7f, 0x77, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15,
.db 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x15, 0x15, 0x55, 0x15, 0x15,
.db 0x15, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xfb, 0xbf,
.db 0xbf, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xab,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x2a, 0x22, 0x02, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
.db 0xdd, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x04, 0x04,
.db 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55,
.db 0x45, 0x45, 0x45, 0x45, 0x44, 0xc5, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xee, 0xee, 0xee, 0xae, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
.db 0x51, 0x51, 0x51, 0x11, 0x11, 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0xbb, 0xff, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x44, 0x44, 0x00, 0x00, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44,
.db 0x40, 0x40, 0x54, 0x54, 0x44, 0x54, 0x44, 0x44, 0x44, 0xd4, 0xeb, 0xee,
.db 0xee, 0xee, 0xee, 0xaa, 0xea, 0xee, 0xea, 0xea, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x88, 0x08, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0x7f, 0x7f, 0x77, 0x77, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15,
.db 0x11, 0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x11, 0x11, 0x11, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xbb, 0xfb, 0xff, 0xbf, 0xbf, 0xbb,
.db 0xbb, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xdd, 0xdd, 0x5d,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x04, 0x04, 0x04, 0x44,
.db 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x45, 0x45, 0x45,
.db 0x45, 0xc4, 0xaf, 0xee, 0xee, 0xee, 0xee, 0xae, 0xee, 0xee, 0xae, 0xae,
.db 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x8a, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x77, 0x77, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x51, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x51, 0x11,
.db 0x11, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0xbb, 0xfb,
.db 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x22,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
.db 0xdd, 0xdd, 0xdd, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44,
.db 0x44, 0x00, 0x00, 0x40, 0x44, 0x44, 0x44, 0x40, 0x40, 0x50, 0x55, 0x54,
.db 0x54, 0x44, 0x54, 0x44, 0x44, 0xc4, 0xaf, 0xae, 0xee, 0xee, 0xee, 0xaa,
.db 0xea, 0xea, 0xaa, 0xea, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x77,
.db 0x57, 0x57, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x11, 0x11, 0x11,
.db 0x11, 0x15, 0x11, 0x11, 0x11, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0xd5, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0x2a, 0x22, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xdf, 0xdd, 0xdd, 0x5d, 0x5d, 0x5d, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x45, 0x44, 0x04, 0x04, 0x44, 0x44, 0x44, 0x44, 0x04,
.db 0x04, 0x44, 0x55, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0xc4, 0xef, 0xee,
.db 0xee, 0xee, 0xee, 0xae, 0xae, 0xae, 0xea, 0xee, 0xae, 0xae, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x08,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xf7, 0x77, 0x77, 0x77, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x91, 0xbb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xd5, 0x55,
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x40, 0x00, 0x00, 0x40,
.db 0x40, 0x44, 0x00, 0x40, 0x40, 0x54, 0x54, 0x54, 0x44, 0x44, 0x44, 0x44,
.db 0x44, 0xc4, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xaa, 0xea, 0xea, 0xea,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0x88, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x77, 0x77, 0x77, 0x57, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
.db 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x91, 0xff, 0xbf,
.db 0xbf, 0xff, 0xbf, 0xbf, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xab,
.db 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, 0x22, 0x22,
.db 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
.db 0xdd, 0xdd, 0xdd, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45,
.db 0x44, 0x04, 0x04, 0x04, 0x44, 0x44, 0x04, 0x00, 0x54, 0x55, 0x45, 0x55,
.db 0x55, 0x45, 0x45, 0x45, 0x44, 0xc4, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee,
.db 0xae, 0xee, 0xee, 0xae, 0xae, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0x8a, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77,
.db 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 0x11, 0x11, 0x11, 0x11,
.db 0x11, 0x11, 0x11, 0x11, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11,
.db 0x11, 0xd1, 0xfb, 0xbb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
.db 0xbb, 0xbb, 0xbb, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xa2, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
.db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
.db 0xff, 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55,
.db 0x55, 0x55, 0x55, 0x44, 0x44, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40,
.db 0x55, 0x54, 0x54, 0x54, 0x54, 0x44, 0x44, 0x40, 0x44, 0xd4, 0xef, 0xee,
.db 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0xea, 0xea, 0xea, 0xaa, 0xaa, 0xaa,
.db 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x88, 0x88, 0x80, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80

View File

@ -0,0 +1,131 @@
.equ FONT_HEIGHT = 8
; Temporary dhepper's font8x8 adaptation (https://github.com/dhepper/font8x8)
FONT: .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0000 (nul)
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0001
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0002
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0003
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0004
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0005
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0006
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0007
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0008
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0009
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000A
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000B
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000C
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000D
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000E
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+000F
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0010
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0011
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0012
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0013
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0014
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0015
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0016
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0017
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0018
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0019
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001A
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001B
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001C
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001D
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001E
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+001F
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0020 (space)
.db 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, ; U+0021 (!)
.db 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0022 (")
.db 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00, ; U+0023 (#)
.db 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00, ; U+0024 ($)
.db 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00, ; U+0025 (%)
.db 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00, ; U+0026 (&)
.db 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0027 (')
.db 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00, ; U+0028 (()
.db 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00, ; U+0029 ())
.db 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, ; U+002A (*)
.db 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00, ; U+002B (+)
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06, ; U+002C (,)
.db 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, ; U+002D (-)
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, ; U+002E (.)
.db 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00, ; U+002F (/)
.db 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00, ; U+0030 (0)
.db 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, ; U+0031 (1)
.db 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00, ; U+0032 (2)
.db 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00, ; U+0033 (3)
.db 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00, ; U+0034 (4)
.db 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00, ; U+0035 (5)
.db 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00, ; U+0036 (6)
.db 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00, ; U+0037 (7)
.db 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00, ; U+0038 (8)
.db 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00, ; U+0039 (9)
.db 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, ; U+003A (:)
.db 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06, ; U+003B (;)
.db 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00, ; U+003C (<)
.db 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, ; U+003D (=)
.db 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00, ; U+003E (>)
.db 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00, ; U+003F (?)
.db 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00, ; U+0040 (@)
.db 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00, ; U+0041 (A)
.db 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00, ; U+0042 (B)
.db 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00, ; U+0043 (C)
.db 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00, ; U+0044 (D)
.db 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00, ; U+0045 (E)
.db 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00, ; U+0046 (F)
.db 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00, ; U+0047 (G)
.db 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00, ; U+0048 (H)
.db 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, ; U+0049 (I)
.db 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00, ; U+004A (J)
.db 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00, ; U+004B (K)
.db 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00, ; U+004C (L)
.db 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00, ; U+004D (M)
.db 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00, ; U+004E (N)
.db 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00, ; U+004F (O)
.db 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00, ; U+0050 (P)
.db 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00, ; U+0051 (Q)
.db 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00, ; U+0052 (R)
.db 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00, ; U+0053 (S)
.db 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, ; U+0054 (T)
.db 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00, ; U+0055 (U)
.db 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00, ; U+0056 (V)
.db 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00, ; U+0057 (W)
.db 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00, ; U+0058 (X)
.db 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00, ; U+0059 (Y)
.db 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00, ; U+005A (Y)
.db 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00, ; U+005B ([)
.db 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, ; U+005C (\)
.db 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00, ; U+005D (])
.db 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00, ; U+005E (^)
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, ; U+005F (_)
.db 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+0060 (`)
.db 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00, ; U+0061 (a)
.db 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00, ; U+0062 (b)
.db 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00, ; U+0063 (c)
.db 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00, ; U+0064 (d)
.db 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00, ; U+0065 (e)
.db 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00, ; U+0066 (f)
.db 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F, ; U+0067 (g)
.db 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00, ; U+0068 (h)
.db 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, ; U+0069 (i)
.db 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, ; U+006A (j)
.db 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00, ; U+006B (k)
.db 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, ; U+006C (l)
.db 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00, ; U+006D (m)
.db 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00, ; U+006E (n)
.db 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00, ; U+006F (o)
.db 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F, ; U+0070 (p)
.db 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78, ; U+0071 (q)
.db 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00, ; U+0072 (r)
.db 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00, ; U+0073 (s)
.db 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00, ; U+0074 (t)
.db 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00, ; U+0075 (u)
.db 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00, ; U+0076 (v)
.db 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00, ; U+0077 (w)
.db 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00, ; U+0078 (x)
.db 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F, ; U+0079 (y)
.db 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00, ; U+007A (z)
.db 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00, ; U+007B ({)
.db 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, ; U+007C (|)
.db 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00, ; U+007D (})
.db 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ; U+007E (~)
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; U+007F

File diff suppressed because it is too large Load Diff

View File

@ -1,142 +1,204 @@
; VIDEO COMPOSITE PAL IO DEVICE ; VIDEO COMPOSITE PAL IO DEVICE
; Implemented following timings in http://blog.retroleum.co.uk/electronics-articles/pal-tv-timing-and-voltages/ ;
; @language: AVR ASM
;
; This file is part of Pat80 IO Devices.
;
; Pat80 IO Devices is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; Pat80 IO Devices is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
;
;
; INTERFACING WITH PAT80:
; Use PortB as data port. Before writing anything, issue a read (pin RW HIGH) and check the busy pin on the data port.
; If the busy pin is high, retry reading until goes low. When the busy pin goes low, we have... TODO
;
; ELECTRONICALLY:
; The data port PB0 is tied to ground with a 1KOhm resistance. When the MC is busy drawing the screen, the data port is in
; high impedance state, so that avoids causing bus contention, but when read returns a 0bXXXXXXX0 byte. When the MC starts vsync,
; begins checking the port for data... TODO
;
; PINS:
; Video:
; Video pin: PA0 (pin 1) (but all PORTA is used)
; Sync pin: PC0 (pin 22)
; Communication:
; Data port is PORTB [INPUT]
; CLK (clock) signal is on PORTD0 [INPUT]
; RS (register select) on PORTD1 [INPUT]
; BUSY signal is on PORTD2 [OUTPUT]
; Debug:
; Debug hsync single pulse on pin: PC1 (pin 23) (may be disabled)
;
.include "atmega1284definition.asm" .include "m1284def.inc" ; Atmega 1280 device definition
; define constant ; *** reserved registers ***
.equ SYNC_PIN = PD7 ; Sync pin is on Port D 7 (pin 21) ; Video generator registers:
.equ VIDEO_PIN = PD6 ; Video pin is on Port D 6 (pin 20) ; X(R27, R26)
.def STATUS = r25 ; signal status (see STATUS TABLE)
.def VG_HIGH_ACCUM = r24 ; an accumulator in high registers to be used only by video_generator in interrupt
.def LINE_COUNTER = r23
; Character generator registers:
.def POS_COLUMN = r22 ; POS_COLUMN (0-46) represents the character/chunk column
.def POS_ROWP = r21 ; POS_ROWP (0-255) represent the chunk row. The caracter row is POS_ROWP/FONT_HEIGHT
.def HIGH_ACCUM = r20 ; an accumulator in high registers to be used outside of interrupts
.def A = r0 ; general purpose accumulator to be used outside of interrupts
; Hardware pins and ports
.equ VIDEO_PORT_OUT = PORTA ; Used all PORTA, but connected only PA0
.equ SYNC_PIN = PC0 ; Sync pin (pin 22)
.equ DEBUG_PIN = PC1 ; DEBUG: Single vertical sync pulse to trigger oscilloscope (pin 23)
.equ DATA_PORT_IN = PIND
.equ CLK_PIN = PC2
.equ RS_PIN = PC3
.equ BUSY_PIN = PC4
; Memory map
.equ FRAMEBUFFER = 0x0F70
.equ FRAMEBUFFER_END = 0x3C00
.equ SCREEN_HEIGHT = 248
; start vector ; start vector
.org 0x0000 .org 0x0000
rjmp main ; jump to main label rjmp main ; reset vector: jump to main label
.org 0x001E
rjmp on_tim1_ovf ; interrupt for timer 1 overflow (used by video generation)
.org 0x40
; main program ; main program
main: main:
sbi DDRD, SYNC_PIN ; set pin as output ; **** I/O SETUP ****
sbi DDRD, VIDEO_PIN ; set pin as output
v_refresh_loop: ; pins setup
; start 5 long sync pulses sbi DDRC, SYNC_PIN ; set pin as output
call long_sync sbi DDRC, DEBUG_PIN ; set pin as output
call long_sync sbi DDRC, BUSY_PIN ; set pin as output
call long_sync cbi DDRD, CLK_PIN ; set pin as input
call long_sync ldi HIGH_ACCUM, 0xFF
call long_sync out DDRA, HIGH_ACCUM ; set port as output (contains video pin)
; end 5 long sync pulses ldi HIGH_ACCUM, 0x00
out DDRB, HIGH_ACCUM ; set port as input (used as data bus)
; start 5 short sync pulses
call short_sync
call short_sync
call short_sync
call short_sync
call short_sync
; end 5 short sync pulses
; start 304 picture lines ; **** MEMORY SETUP ****
ldi r16, 2
h_picture_outer_loop:
ldi r17, 152 ; line counter
h_picture_loop:
; start line sync: 4uS, 96 cycles @ 24Mhz
cbi PORTD, SYNC_PIN ; sync goes low (0v) ; 2 cycle
ldi r18, 32 ; 1 cycle
l_sync_pulse_loop: ; requires 3 cpu cycles
dec r18 ; 1 cycle
brne l_sync_pulse_loop ; 2 cycle if true, 1 if false
sbi PORTD, SYNC_PIN ; sync goes high (0.3v)
; end line sync
; start back porch: 8uS, 192 cycles @ 24Mhz call clear_screen
ldi r18, 64 ; 1 cycle
l_sync_back_porch_loop:
dec r18 ; 1 cycle
brne l_sync_back_porch_loop ; 2 cycle if true, 1 if false
; end back porch
; start image: 52uS, 1247 cycles @ 24Mhz
; 3 bande da 416 cicli
sbi PORTD, VIDEO_PIN ; video goes high ; 2 cycle
ldi r18, 138 ; 1 cycle
l_sync_video_loop1:
dec r18 ; 1 cycle
brne l_sync_video_loop1 ; 2 cycle if true, 1 if false
cbi PORTD, VIDEO_PIN ; video goes low
ldi r18, 137 ; 1 cycle ; **** TIMERS AND DRAWING IMAGE ROUTINES SETUP ****
l_sync_video_loop2:
dec r18 ; 1 cycle
brne l_sync_video_loop2 ; 2 cycle if true, 1 if false
sbi PORTD, VIDEO_PIN ; video goes high ; Timer setup (use 16-bit counter TC1)
; The Power Reduction TC1 and TC3 bits in the Power Reduction Registers (PRR0.PRTIM1 and
; PRR1.PRTIM3) must be written to zero to enable the TC1 and TC3 module.
ldi HIGH_ACCUM, 0b00000000
sts PRR0, HIGH_ACCUM
; Set timer prescaler to 1:1
LDI HIGH_ACCUM,0b00000001
sts TCCR1B,HIGH_ACCUM
; Enambe timer1 overflow interrupt
LDI HIGH_ACCUM,0b00000001
STS TIMSK1,HIGH_ACCUM
; Enable interrupts globally
SEI
; Timer setup completed.
ldi r18, 138 ; 1 cycle
l_sync_video_loop3:
dec r18 ; 1 cycle
brne l_sync_video_loop3 ; 2 cycle if true, 1 if false
cbi PORTD, VIDEO_PIN ; video goes low
; end image
dec r17 ; decrement line counter
brne h_picture_loop ; if not 0, repeat h_picture_loop
dec r16 ; decrement outside counter ; **** MAIN ROUTINE ****
brne h_picture_outer_loop ; if not 0, repeat h_picture_loop
; end picture lines
; start 6 short sync pulses ; Wait for data (it never exits)
call short_sync ;jmp comm_init
call short_sync
call short_sync
call short_sync
call short_sync
; end 6 short sync pulses
jmp v_refresh_loop
; end vertical refresh
long_sync: ; draw example image
; long sync: 30uS low (719 cycles @ 24Mhz), 2uS high (48 cycles @ 24Mhz) ;call draw_cat
cbi PORTD, SYNC_PIN ; sync goes low (0v) ; 2 cycle
ldi r18, 120 ; 1 cycle ; test draw character routine
long_sync_low_loop: ; requires 6 cpu cycles call cursor_pos_home
nop ; 1 cycle dctest:
nop ; 1 cycle ldi r18, 0x41
nop ; 1 cycle draw_chars:
dec r18 ; 1 cycle mov HIGH_ACCUM, r18
brne long_sync_low_loop ; 2 cycle if true, 1 if false call draw_char
dc_continue:
; wait
ser r19
dc_wait_loop_1:
ser r16
dc_wait_loop_2:
dec r16
brne dc_wait_loop_2
dec r19
brne dc_wait_loop_1
; wait
; ser r19
; dc_wait_loop_a1:
; ser r16
; dc_wait_loop_a2:
; dec r16
; brne dc_wait_loop_a2
; dec r19
; brne dc_wait_loop_a1
; ; wait
; ser r19
; dc_wait_loop_s1:
; ser r16
; dc_wait_loop_s2:
; dec r16
; brne dc_wait_loop_s2
; dec r19
; brne dc_wait_loop_s1
; ; wait
; ser r19
; dc_wait_loop_d1:
; ser r16
; dc_wait_loop_d2:
; dec r16
; brne dc_wait_loop_d2
; dec r19
; brne dc_wait_loop_d1
; ; wait
; ser r19
; dc_wait_loop_f1:
; ser r16
; dc_wait_loop_f2:
; dec r16
; brne dc_wait_loop_f2
; dec r19
; brne dc_wait_loop_f1
sbi PORTD, SYNC_PIN ; sync goes high (0.3v) inc r18
cpi r18, 0x5B
brne draw_chars
call draw_carriage_return
jmp dctest
ldi r18, 16 ; 1 cycle
long_sync_high_loop: ; requires 3 cpu cycles
dec r18 ; 1 cycle
brne long_sync_high_loop ; 2 cycle if true, 1 if false
ret
short_sync:
; short sync: 2uS low (48 cycles @ 24Mhz), 30uS high
cbi PORTD, SYNC_PIN ; sync goes low (0v) ; 2 cycle
ldi r18, 16 ; 1 cycle forever:
short_sync_low_loop: ; requires 3 cpu cycles jmp forever
dec r18 ; 1 cycle
brne long_sync_low_loop ; 2 cycle if true, 1 if false
sbi PORTD, SYNC_PIN ; sync goes high (0.3v)
ldi r18, 120 ; 1 cycle
short_sync_high_loop: ; requires 6 cpu cycles
nop ; 1 cycle
nop ; 1 cycle
nop ; 1 cycle
dec r18 ; 1 cycle
brne short_sync_high_loop ; 2 cycle if true, 1 if false
ret
.include "video_generator.asm" ; Asyncronous timer-interrupt-based video generation
.include "character_generator.asm" ; Character generator
;.include "communication.asm" ; Communication with Pat80
.include "font.asm" ; Font face
;.include "example_data/cat.asm" ; Cat image

View File

@ -1,4 +0,0 @@
:020000020000FC
:1000000000C0579A4F995F984F9B5F9A40E230E447
:1000100020E82A95F1F73A95D9F74A95C1F7F2CF3A
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
# Hardware
This folder contains the Pat80 keyboard schematics and PCB layout.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name footprints)(type KiCad)(uri /home/danieleverducci/git/pato-z80-home-computer/kicad-symbols/footprints.pretty)(options "")(descr ""))
)

View File

@ -0,0 +1,235 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector_Generic_Conn_02x17_Odd_Even
#
DEF Connector_Generic_Conn_02x17_Odd_Even J 0 40 Y N 1 F N
F0 "J" 50 900 50 H V C CNN
F1 "Connector_Generic_Conn_02x17_Odd_Even" 50 -900 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_2x??_*
$ENDFPLIST
DRAW
S -50 -795 0 -805 1 1 6 N
S -50 -695 0 -705 1 1 6 N
S -50 -595 0 -605 1 1 6 N
S -50 -495 0 -505 1 1 6 N
S -50 -395 0 -405 1 1 6 N
S -50 -295 0 -305 1 1 6 N
S -50 -195 0 -205 1 1 6 N
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 205 0 195 1 1 6 N
S -50 305 0 295 1 1 6 N
S -50 405 0 395 1 1 6 N
S -50 505 0 495 1 1 6 N
S -50 605 0 595 1 1 6 N
S -50 705 0 695 1 1 6 N
S -50 805 0 795 1 1 6 N
S -50 850 150 -850 1 1 10 f
S 150 -795 100 -805 1 1 6 N
S 150 -695 100 -705 1 1 6 N
S 150 -595 100 -605 1 1 6 N
S 150 -495 100 -505 1 1 6 N
S 150 -395 100 -405 1 1 6 N
S 150 -295 100 -305 1 1 6 N
S 150 -195 100 -205 1 1 6 N
S 150 -95 100 -105 1 1 6 N
S 150 5 100 -5 1 1 6 N
S 150 105 100 95 1 1 6 N
S 150 205 100 195 1 1 6 N
S 150 305 100 295 1 1 6 N
S 150 405 100 395 1 1 6 N
S 150 505 100 495 1 1 6 N
S 150 605 100 595 1 1 6 N
S 150 705 100 695 1 1 6 N
S 150 805 100 795 1 1 6 N
X Pin_1 1 -200 800 150 R 50 50 1 1 P
X Pin_10 10 300 400 150 L 50 50 1 1 P
X Pin_11 11 -200 300 150 R 50 50 1 1 P
X Pin_12 12 300 300 150 L 50 50 1 1 P
X Pin_13 13 -200 200 150 R 50 50 1 1 P
X Pin_14 14 300 200 150 L 50 50 1 1 P
X Pin_15 15 -200 100 150 R 50 50 1 1 P
X Pin_16 16 300 100 150 L 50 50 1 1 P
X Pin_17 17 -200 0 150 R 50 50 1 1 P
X Pin_18 18 300 0 150 L 50 50 1 1 P
X Pin_19 19 -200 -100 150 R 50 50 1 1 P
X Pin_2 2 300 800 150 L 50 50 1 1 P
X Pin_20 20 300 -100 150 L 50 50 1 1 P
X Pin_21 21 -200 -200 150 R 50 50 1 1 P
X Pin_22 22 300 -200 150 L 50 50 1 1 P
X Pin_23 23 -200 -300 150 R 50 50 1 1 P
X Pin_24 24 300 -300 150 L 50 50 1 1 P
X Pin_25 25 -200 -400 150 R 50 50 1 1 P
X Pin_26 26 300 -400 150 L 50 50 1 1 P
X Pin_27 27 -200 -500 150 R 50 50 1 1 P
X Pin_28 28 300 -500 150 L 50 50 1 1 P
X Pin_29 29 -200 -600 150 R 50 50 1 1 P
X Pin_3 3 -200 700 150 R 50 50 1 1 P
X Pin_30 30 300 -600 150 L 50 50 1 1 P
X Pin_31 31 -200 -700 150 R 50 50 1 1 P
X Pin_32 32 300 -700 150 L 50 50 1 1 P
X Pin_33 33 -200 -800 150 R 50 50 1 1 P
X Pin_34 34 300 -800 150 L 50 50 1 1 P
X Pin_4 4 300 700 150 L 50 50 1 1 P
X Pin_5 5 -200 600 150 R 50 50 1 1 P
X Pin_6 6 300 600 150 L 50 50 1 1 P
X Pin_7 7 -200 500 150 R 50 50 1 1 P
X Pin_8 8 300 500 150 L 50 50 1 1 P
X Pin_9 9 -200 400 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C
#
DEF Device_C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "Device_C" 25 -100 50 H V L CNN
F2 "" 38 -150 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 50 50 1 1 P
X ~ 2 0 -150 110 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_D
#
DEF Device_D D 0 40 N N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "Device_D" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
TO-???*
*_Diode_*
*SingleDiode*
D_*
$ENDFPLIST
DRAW
P 2 0 1 8 -50 50 -50 -50 N
P 2 0 1 0 50 0 -50 0 N
P 4 0 1 8 50 50 50 -50 -50 0 50 50 N
X K 1 -150 0 100 R 50 50 1 1 P
X A 2 150 0 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_LED
#
DEF Device_LED D 0 40 N N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "Device_LED" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
LED*
LED_SMD:*
LED_THT:*
$ENDFPLIST
DRAW
P 2 0 1 8 -50 -50 -50 50 N
P 2 0 1 0 -50 0 50 0 N
P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N
P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N
P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N
X K 1 -150 0 100 R 50 50 1 1 P
X A 2 150 0 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_R
#
DEF Device_R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "Device_R" 0 0 50 V V C CNN
F2 "" -70 0 50 V I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 50 50 1 1 P
X ~ 2 0 -150 50 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Switch_SW_DPDT_x2
#
DEF Switch_SW_DPDT_x2 SW 0 0 Y N 2 F N
F0 "SW" 0 170 50 H V C CNN
F1 "Switch_SW_DPDT_x2" 0 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
SW*DPDT*
$ENDFPLIST
DRAW
C -80 0 20 0 0 0 N
C 80 -100 20 0 0 0 N
C 80 100 20 0 1 0 N
P 2 0 1 0 -60 10 65 90 N
X A 1 200 100 100 L 50 50 1 1 P
X B 2 -200 0 100 R 50 50 1 1 P
X C 3 200 -100 100 L 50 50 1 1 P
X A 4 200 100 100 L 50 50 2 1 P
X B 5 -200 0 100 R 50 50 2 1 P
X C 6 200 -100 100 L 50 50 2 1 P
ENDDRAW
ENDDEF
#
# Switch_SW_Push
#
DEF Switch_SW_Push SW 0 40 N N 1 F N
F0 "SW" 50 100 50 H V L CNN
F1 "Switch_SW_Push" 0 -60 50 H V C CNN
F2 "" 0 200 50 H I C CNN
F3 "" 0 200 50 H I C CNN
DRAW
C -80 0 20 0 1 0 N
C 80 0 20 0 1 0 N
P 2 0 1 0 0 50 0 120 N
P 2 0 1 0 100 50 -100 50 N
X 1 1 -200 0 100 R 50 50 0 1 P
X 2 2 200 0 100 L 50 50 0 1 P
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_VCC
#
DEF power_VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_VCC" 0 150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VCC 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,252 @@
update=mar 30 mar 2021 07:28:33 CEST
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=keyboard.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
TrackWidth2=0.5
TrackWidth3=1
ViaDiameter1=0.8
ViaDrill1=0.4
ViaDiameter2=2
ViaDrill2=0.5
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0
SolderMaskMinWidth=0
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
(sym_lib_table
(lib (name pat80)(type Legacy)(uri /home/danieleverducci/git/pato-z80-home-computer/kicad-symbols/pat80.lib)(options "")(descr ""))
)

View File

@ -0,0 +1,18 @@
# Hardware
This folder contains the Pat80 keyboard controller IO card schematics and PCB layout.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name footprints)(type KiCad)(uri /home/danieleverducci/git/pato-z80-home-computer/kicad-symbols/footprints.pretty)(options "")(descr ""))
)

View File

@ -0,0 +1,297 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# 74xx_74HC244
#
DEF 74xx_74HC244 U 0 40 Y Y 1 L N
F0 "U" -300 650 50 H V C CNN
F1 "74xx_74HC244" -300 -650 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS 74HCT244
$FPLIST
TSSOP*4.4x6.5mm*P0.65mm*
SSOP*4.4x6.5mm*P0.65mm*
$ENDFPLIST
DRAW
S -300 600 300 -600 1 1 10 f
P 4 1 0 6 50 0 -50 50 -50 -50 50 0 N
X 1OE 1 -500 -400 200 R 50 50 1 0 I I
X GND 10 0 -800 200 U 50 50 1 0 W
X 2A3 11 -500 -200 200 R 50 50 1 0 I
X 1Y3 12 500 200 200 L 50 50 1 0 O
X 2A2 13 -500 -100 200 R 50 50 1 0 I
X 1Y2 14 500 300 200 L 50 50 1 0 O
X 2A1 15 -500 0 200 R 50 50 1 0 I
X 1Y1 16 500 400 200 L 50 50 1 0 O
X 2A0 17 -500 100 200 R 50 50 1 0 I
X 1Y0 18 500 500 200 L 50 50 1 0 O
X 2OE 19 -500 -500 200 R 50 50 1 0 I I
X 1A0 2 -500 500 200 R 50 50 1 0 I
X VCC 20 0 800 200 D 50 50 1 0 W
X 2Y0 3 500 100 200 L 50 50 1 0 O
X 1A1 4 -500 400 200 R 50 50 1 0 I
X 2Y1 5 500 0 200 L 50 50 1 0 O
X 1A2 6 -500 300 200 R 50 50 1 0 I
X 2Y2 7 500 -100 200 L 50 50 1 0 O
X 1A3 8 -500 200 200 R 50 50 1 0 I
X 2Y3 9 500 -200 200 L 50 50 1 0 O
ENDDRAW
ENDDEF
#
# 74xx_74LS138
#
DEF 74xx_74LS138 U 0 40 Y Y 1 L N
F0 "U" -300 450 50 H V C CNN
F1 "74xx_74LS138" -300 -550 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
DIP?16*
$ENDFPLIST
DRAW
S -300 400 300 -500 1 1 10 f
X A0 1 -500 300 200 R 50 50 1 0 I
X O5 10 500 -200 200 L 50 50 1 0 O V
X O4 11 500 -100 200 L 50 50 1 0 O V
X O3 12 500 0 200 L 50 50 1 0 O V
X O2 13 500 100 200 L 50 50 1 0 O V
X O1 14 500 200 200 L 50 50 1 0 O V
X O0 15 500 300 200 L 50 50 1 0 O V
X VCC 16 0 600 200 D 50 50 1 0 W
X A1 2 -500 200 200 R 50 50 1 0 I
X A2 3 -500 100 200 R 50 50 1 0 I
X E1 4 -500 -400 200 R 50 50 1 0 I L
X E2 5 -500 -300 200 R 50 50 1 0 I L
X E3 6 -500 -200 200 R 50 50 1 0 I
X O7 7 500 -400 200 L 50 50 1 0 O V
X GND 8 0 -700 200 U 50 50 1 0 W
X O6 9 500 -300 200 L 50 50 1 0 O V
ENDDRAW
ENDDEF
#
# Connector_DB9_Female_MountingHoles
#
DEF Connector_DB9_Female_MountingHoles J 0 40 Y N 1 F N
F0 "J" 0 650 50 H V C CNN
F1 "Connector_DB9_Female_MountingHoles" 0 575 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
DSUB*Female*
$ENDFPLIST
DRAW
C -70 -400 30 0 1 0 N
C -70 -200 30 0 1 0 N
C -70 0 30 0 1 0 N
C -70 200 30 0 1 0 N
C -70 400 30 0 1 0 N
C 50 -300 30 0 1 0 N
C 50 -100 30 0 1 0 N
C 50 100 30 0 1 0 N
C 50 300 30 0 1 0 N
P 2 0 1 0 -150 -400 -100 -400 N
P 2 0 1 0 -150 -300 20 -300 N
P 2 0 1 0 -150 -200 -100 -200 N
P 2 0 1 0 -150 -100 20 -100 N
P 2 0 1 0 -150 0 -100 0 N
P 2 0 1 0 -150 100 20 100 N
P 2 0 1 0 -150 200 -100 200 N
P 2 0 1 0 -150 300 20 300 N
P 2 0 1 0 -150 400 -100 400 N
P 5 0 1 10 -150 525 -150 -525 150 -375 150 375 -150 525 f
X PAD 0 0 -600 150 U 50 50 1 1 P
X 1 1 -300 400 150 R 50 50 1 1 P
X 2 2 -300 200 150 R 50 50 1 1 P
X 3 3 -300 0 150 R 50 50 1 1 P
X 4 4 -300 -200 150 R 50 50 1 1 P
X 5 5 -300 -400 150 R 50 50 1 1 P
X 6 6 -300 300 150 R 50 50 1 1 P
X 7 7 -300 100 150 R 50 50 1 1 P
X 8 8 -300 -100 150 R 50 50 1 1 P
X 9 9 -300 -300 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_01x19
#
DEF Connector_Generic_Conn_01x19 J 0 40 Y N 1 F N
F0 "J" 0 1000 50 H V C CNN
F1 "Connector_Generic_Conn_01x19" 0 -1000 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S -50 -895 0 -905 1 1 6 N
S -50 -795 0 -805 1 1 6 N
S -50 -695 0 -705 1 1 6 N
S -50 -595 0 -605 1 1 6 N
S -50 -495 0 -505 1 1 6 N
S -50 -395 0 -405 1 1 6 N
S -50 -295 0 -305 1 1 6 N
S -50 -195 0 -205 1 1 6 N
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 205 0 195 1 1 6 N
S -50 305 0 295 1 1 6 N
S -50 405 0 395 1 1 6 N
S -50 505 0 495 1 1 6 N
S -50 605 0 595 1 1 6 N
S -50 705 0 695 1 1 6 N
S -50 805 0 795 1 1 6 N
S -50 905 0 895 1 1 6 N
S -50 950 50 -950 1 1 10 f
X Pin_1 1 -200 900 150 R 50 50 1 1 P
X Pin_10 10 -200 0 150 R 50 50 1 1 P
X Pin_11 11 -200 -100 150 R 50 50 1 1 P
X Pin_12 12 -200 -200 150 R 50 50 1 1 P
X Pin_13 13 -200 -300 150 R 50 50 1 1 P
X Pin_14 14 -200 -400 150 R 50 50 1 1 P
X Pin_15 15 -200 -500 150 R 50 50 1 1 P
X Pin_16 16 -200 -600 150 R 50 50 1 1 P
X Pin_17 17 -200 -700 150 R 50 50 1 1 P
X Pin_18 18 -200 -800 150 R 50 50 1 1 P
X Pin_19 19 -200 -900 150 R 50 50 1 1 P
X Pin_2 2 -200 800 150 R 50 50 1 1 P
X Pin_3 3 -200 700 150 R 50 50 1 1 P
X Pin_4 4 -200 600 150 R 50 50 1 1 P
X Pin_5 5 -200 500 150 R 50 50 1 1 P
X Pin_6 6 -200 400 150 R 50 50 1 1 P
X Pin_7 7 -200 300 150 R 50 50 1 1 P
X Pin_8 8 -200 200 150 R 50 50 1 1 P
X Pin_9 9 -200 100 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_02x17_Odd_Even
#
DEF Connector_Generic_Conn_02x17_Odd_Even J 0 40 Y N 1 F N
F0 "J" 50 900 50 H V C CNN
F1 "Connector_Generic_Conn_02x17_Odd_Even" 50 -900 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_2x??_*
$ENDFPLIST
DRAW
S -50 -795 0 -805 1 1 6 N
S -50 -695 0 -705 1 1 6 N
S -50 -595 0 -605 1 1 6 N
S -50 -495 0 -505 1 1 6 N
S -50 -395 0 -405 1 1 6 N
S -50 -295 0 -305 1 1 6 N
S -50 -195 0 -205 1 1 6 N
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 205 0 195 1 1 6 N
S -50 305 0 295 1 1 6 N
S -50 405 0 395 1 1 6 N
S -50 505 0 495 1 1 6 N
S -50 605 0 595 1 1 6 N
S -50 705 0 695 1 1 6 N
S -50 805 0 795 1 1 6 N
S -50 850 150 -850 1 1 10 f
S 150 -795 100 -805 1 1 6 N
S 150 -695 100 -705 1 1 6 N
S 150 -595 100 -605 1 1 6 N
S 150 -495 100 -505 1 1 6 N
S 150 -395 100 -405 1 1 6 N
S 150 -295 100 -305 1 1 6 N
S 150 -195 100 -205 1 1 6 N
S 150 -95 100 -105 1 1 6 N
S 150 5 100 -5 1 1 6 N
S 150 105 100 95 1 1 6 N
S 150 205 100 195 1 1 6 N
S 150 305 100 295 1 1 6 N
S 150 405 100 395 1 1 6 N
S 150 505 100 495 1 1 6 N
S 150 605 100 595 1 1 6 N
S 150 705 100 695 1 1 6 N
S 150 805 100 795 1 1 6 N
X Pin_1 1 -200 800 150 R 50 50 1 1 P
X Pin_10 10 300 400 150 L 50 50 1 1 P
X Pin_11 11 -200 300 150 R 50 50 1 1 P
X Pin_12 12 300 300 150 L 50 50 1 1 P
X Pin_13 13 -200 200 150 R 50 50 1 1 P
X Pin_14 14 300 200 150 L 50 50 1 1 P
X Pin_15 15 -200 100 150 R 50 50 1 1 P
X Pin_16 16 300 100 150 L 50 50 1 1 P
X Pin_17 17 -200 0 150 R 50 50 1 1 P
X Pin_18 18 300 0 150 L 50 50 1 1 P
X Pin_19 19 -200 -100 150 R 50 50 1 1 P
X Pin_2 2 300 800 150 L 50 50 1 1 P
X Pin_20 20 300 -100 150 L 50 50 1 1 P
X Pin_21 21 -200 -200 150 R 50 50 1 1 P
X Pin_22 22 300 -200 150 L 50 50 1 1 P
X Pin_23 23 -200 -300 150 R 50 50 1 1 P
X Pin_24 24 300 -300 150 L 50 50 1 1 P
X Pin_25 25 -200 -400 150 R 50 50 1 1 P
X Pin_26 26 300 -400 150 L 50 50 1 1 P
X Pin_27 27 -200 -500 150 R 50 50 1 1 P
X Pin_28 28 300 -500 150 L 50 50 1 1 P
X Pin_29 29 -200 -600 150 R 50 50 1 1 P
X Pin_3 3 -200 700 150 R 50 50 1 1 P
X Pin_30 30 300 -600 150 L 50 50 1 1 P
X Pin_31 31 -200 -700 150 R 50 50 1 1 P
X Pin_32 32 300 -700 150 L 50 50 1 1 P
X Pin_33 33 -200 -800 150 R 50 50 1 1 P
X Pin_34 34 300 -800 150 L 50 50 1 1 P
X Pin_4 4 300 700 150 L 50 50 1 1 P
X Pin_5 5 -200 600 150 R 50 50 1 1 P
X Pin_6 6 300 600 150 L 50 50 1 1 P
X Pin_7 7 -200 500 150 R 50 50 1 1 P
X Pin_8 8 300 500 150 L 50 50 1 1 P
X Pin_9 9 -200 400 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C
#
DEF Device_C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "Device_C" 25 -100 50 H V L CNN
F2 "" 38 -150 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 50 50 1 1 P
X ~ 2 0 -150 110 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_VCC
#
DEF power_VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_VCC" 0 150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VCC 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1 @@
(kicad_pcb (version 4) (host kicad "dummy file") )

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,248 @@
update=sab 27 mar 2021 17:56:11 CET
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=keyboard.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
ViaDiameter1=0.8
ViaDrill1=0.4
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0
SolderMaskMinWidth=0
SolderPasteClearance=0
SolderPasteRatio=0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=1
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

View File

@ -0,0 +1,755 @@
EESchema Schematic File Version 4
EELAYER 30 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
Wire Wire Line
4350 3800 5800 3800
Connection ~ 4350 3800
Text Label 4900 4800 0 50 ~ 0
ROW7
Text Label 4900 4700 0 50 ~ 0
ROW6
Text Label 4900 4600 0 50 ~ 0
ROW5
Text Label 4900 4500 0 50 ~ 0
ROW4
Text Label 4900 4400 0 50 ~ 0
ROW3
Text Label 4900 4300 0 50 ~ 0
ROW2
Text Label 4900 4200 0 50 ~ 0
ROW1
Text Label 4900 4100 0 50 ~ 0
ROW0
Text Label 6850 4300 0 50 ~ 0
COL7
Text Label 6850 4200 0 50 ~ 0
COL6
Text Label 6850 4100 0 50 ~ 0
COL5
Text Label 6850 4000 0 50 ~ 0
COL4
Text Label 6850 3900 0 50 ~ 0
COL3
Text Label 6850 3800 0 50 ~ 0
COL2
Text Label 6850 3700 0 50 ~ 0
COL1
Text Label 6850 3600 0 50 ~ 0
COL0
Wire Wire Line
4850 4800 5100 4800
Wire Wire Line
4850 4700 5100 4700
Wire Wire Line
4850 4600 5100 4600
Wire Wire Line
4850 4500 5100 4500
Wire Wire Line
4850 4400 5100 4400
Wire Wire Line
4850 4300 5100 4300
Wire Wire Line
4850 4200 5100 4200
Wire Wire Line
4850 4100 5100 4100
Entry Wire Line
5100 4800 5200 4900
Entry Wire Line
5100 4700 5200 4800
Entry Wire Line
5100 4600 5200 4700
Entry Wire Line
5100 4500 5200 4600
Entry Wire Line
5100 4400 5200 4500
Entry Wire Line
5100 4300 5200 4400
Entry Wire Line
5100 4200 5200 4300
Entry Wire Line
5100 4100 5200 4200
Wire Wire Line
6800 3600 7150 3600
Wire Wire Line
6800 3700 7150 3700
Wire Wire Line
6800 3800 7150 3800
Wire Wire Line
6800 3900 7150 3900
Wire Wire Line
6800 4000 7150 4000
Wire Wire Line
7150 4100 6800 4100
Wire Wire Line
6800 4200 7150 4200
Wire Wire Line
7150 4300 6800 4300
Entry Wire Line
7150 4300 7250 4400
Entry Wire Line
7150 4200 7250 4300
Entry Wire Line
7150 4100 7250 4200
Entry Wire Line
7150 4000 7250 4100
Entry Wire Line
7150 3900 7250 4000
Entry Wire Line
7150 3800 7250 3900
Entry Wire Line
7150 3700 7250 3800
Entry Wire Line
7150 3600 7250 3700
Connection ~ 5400 4250
Wire Wire Line
5400 3500 5400 4250
Wire Wire Line
2150 3500 5400 3500
Wire Wire Line
4850 5050 4850 5100
Connection ~ 4850 5050
Wire Wire Line
5800 4250 5800 4300
Connection ~ 5800 4250
Wire Wire Line
5400 5050 4850 5050
Wire Wire Line
5400 4250 5400 5050
Wire Wire Line
5800 4250 5400 4250
Wire Wire Line
4850 5000 4850 5050
Wire Wire Line
5800 4200 5800 4250
$Comp
L power:VCC #PWR010
U 1 1 605B5E0F
P 5800 4100
F 0 "#PWR010" H 5800 3950 50 0001 C CNN
F 1 "VCC" H 5817 4273 50 0000 C CNN
F 2 "" H 5800 4100 50 0001 C CNN
F 3 "" H 5800 4100 50 0001 C CNN
1 5800 4100
1 0 0 -1
$EndComp
Wire Wire Line
2150 3800 4350 3800
Wire Wire Line
2150 3700 5800 3700
Wire Wire Line
2150 3600 5800 3600
Wire Wire Line
4350 3150 4350 3800
NoConn ~ 2650 4000
NoConn ~ 2650 3900
NoConn ~ 2650 4900
Wire Wire Line
2150 4800 3850 4800
Wire Wire Line
2150 4700 3850 4700
Wire Wire Line
2150 4600 3850 4600
Wire Wire Line
2150 4500 3850 4500
Wire Wire Line
2150 4300 3850 4300
Wire Wire Line
2150 4200 3850 4200
Wire Wire Line
2150 4100 3850 4100
$Comp
L Device:C C2
U 1 1 6058BC4A
P 4700 3300
F 0 "C2" V 4448 3300 50 0000 C CNN
F 1 "56Pf" V 4539 3300 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 4738 3150 50 0001 C CNN
F 3 "~" H 4700 3300 50 0001 C CNN
1 4700 3300
0 1 1 0
$EndComp
Wire Wire Line
4850 3150 4850 3050
Connection ~ 4850 3150
Wire Wire Line
4950 3150 4850 3150
$Comp
L power:GND #PWR09
U 1 1 6058E1A9
P 4950 3150
F 0 "#PWR09" H 4950 2900 50 0001 C CNN
F 1 "GND" H 4955 2977 50 0000 C CNN
F 2 "" H 4950 3150 50 0001 C CNN
F 3 "" H 4950 3150 50 0001 C CNN
1 4950 3150
1 0 0 -1
$EndComp
Wire Wire Line
4350 3150 4350 3000
Connection ~ 4350 3150
Wire Wire Line
4550 3150 4550 3050
Connection ~ 4550 3150
Wire Wire Line
4550 3150 4350 3150
Wire Wire Line
4550 3300 4550 3150
Wire Wire Line
4850 3300 4850 3150
$Comp
L Device:C C1
U 1 1 6058B545
P 4700 3050
F 0 "C1" V 4448 3050 50 0000 C CNN
F 1 "100Nf" V 4539 3050 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 4738 2900 50 0001 C CNN
F 3 "~" H 4700 3050 50 0001 C CNN
1 4700 3050
0 1 1 0
$EndComp
$Comp
L power:GND #PWR08
U 1 1 6058B250
P 4350 5400
F 0 "#PWR08" H 4350 5150 50 0001 C CNN
F 1 "GND" H 4355 5227 50 0000 C CNN
F 2 "" H 4350 5400 50 0001 C CNN
F 3 "" H 4350 5400 50 0001 C CNN
1 4350 5400
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR07
U 1 1 6058AE17
P 4350 3000
F 0 "#PWR07" H 4350 2850 50 0001 C CNN
F 1 "VCC" H 4367 3173 50 0000 C CNN
F 2 "" H 4350 3000 50 0001 C CNN
F 3 "" H 4350 3000 50 0001 C CNN
1 4350 3000
1 0 0 -1
$EndComp
Wire Wire Line
2650 5450 2900 5450
$Comp
L power:VCC #PWR05
U 1 1 60585FB5
P 2900 5450
F 0 "#PWR05" H 2900 5300 50 0001 C CNN
F 1 "VCC" H 2917 5623 50 0000 C CNN
F 2 "" H 2900 5450 50 0001 C CNN
F 3 "" H 2900 5450 50 0001 C CNN
1 2900 5450
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR03
U 1 1 60585B88
P 2750 5200
F 0 "#PWR03" H 2750 4950 50 0001 C CNN
F 1 "GND" H 2755 5027 50 0000 C CNN
F 2 "" H 2750 5200 50 0001 C CNN
F 3 "" H 2750 5200 50 0001 C CNN
1 2750 5200
1 0 0 -1
$EndComp
Wire Wire Line
2150 5000 2750 5000
Wire Wire Line
2750 5000 2750 5200
Wire Wire Line
2650 5100 2650 5450
$Comp
L power:GND #PWR04
U 1 1 60584796
P 2850 3000
F 0 "#PWR04" H 2850 2750 50 0001 C CNN
F 1 "GND" H 2855 2827 50 0000 C CNN
F 2 "" H 2850 3000 50 0001 C CNN
F 3 "" H 2850 3000 50 0001 C CNN
1 2850 3000
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR02
U 1 1 60584370
P 2650 3000
F 0 "#PWR02" H 2650 2850 50 0001 C CNN
F 1 "VCC" H 2667 3173 50 0000 C CNN
F 2 "" H 2650 3000 50 0001 C CNN
F 3 "" H 2650 3000 50 0001 C CNN
1 2650 3000
1 0 0 -1
$EndComp
Wire Wire Line
2150 3400 2750 3400
Wire Wire Line
2750 3000 2850 3000
Wire Wire Line
2750 3400 2750 3000
Wire Wire Line
2650 3300 2650 3000
Text Label 2250 5100 0 50 ~ 0
IOVCC
Text Label 2250 5000 0 50 ~ 0
IOGND
Text Label 2250 4900 0 50 ~ 0
IOWR
Text Label 2250 4800 0 50 ~ 0
IOD7
Text Label 2250 4700 0 50 ~ 0
IOD6
Text Label 2250 4600 0 50 ~ 0
IOD5
Text Label 2250 4500 0 50 ~ 0
IOD4
Text Label 2250 4400 0 50 ~ 0
IOD3
Text Label 2250 4300 0 50 ~ 0
IOD2
Text Label 2250 4200 0 50 ~ 0
IOD1
Text Label 2250 4100 0 50 ~ 0
IOD0
Text Label 2250 4000 0 50 ~ 0
IOADDR4
Text Label 2250 3900 0 50 ~ 0
IOADDR3
Text Label 2250 3800 0 50 ~ 0
IOADDR2
Text Label 2250 3700 0 50 ~ 0
IOADDR1
Text Label 2250 3600 0 50 ~ 0
IOADDR0
Text Label 2250 3500 0 50 ~ 0
IOEN
Text Label 2250 3400 0 50 ~ 0
IOGND
Text Label 2250 3300 0 50 ~ 0
IOVCC
Wire Wire Line
2150 5100 2650 5100
Wire Wire Line
2150 4900 2650 4900
Wire Wire Line
2150 4000 2650 4000
Wire Wire Line
2150 3900 2650 3900
Wire Wire Line
2150 3300 2650 3300
$Comp
L Connector_Generic:Conn_01x19 IOBUS1
U 1 1 6057928D
P 1950 4200
F 0 "IOBUS1" H 1868 5317 50 0000 C CNN
F 1 "IO_Bus_conn" H 1868 5226 50 0000 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x19_P2.54mm_Horizontal" H 1950 4200 50 0001 C CNN
F 3 "~" H 1950 4200 50 0001 C CNN
1 1950 4200
-1 0 0 -1
$EndComp
$Comp
L 74xx:74HC244 U1
U 1 1 605787CB
P 4350 4600
F 0 "U1" H 4350 5581 50 0000 C CNN
F 1 "74HC244" H 4350 5490 50 0000 C CNN
F 2 "Package_DIP:DIP-20_W7.62mm_LongPads" H 4350 4600 50 0001 C CNN
F 3 "http://www.nxp.com/documents/data_sheet/74HC_HCT244.pdf" H 4350 4600 50 0001 C CNN
1 4350 4600
-1 0 0 -1
$EndComp
$Comp
L 74xx:74LS138 U2
U 1 1 60577A7C
P 6300 3900
F 0 "U2" H 6300 4681 50 0000 C CNN
F 1 "74HC138" H 6300 4590 50 0000 C CNN
F 2 "Package_DIP:DIP-16_W7.62mm_LongPads" H 6300 3900 50 0001 C CNN
F 3 "http://www.ti.com/lit/gpn/sn74LS138" H 6300 3900 50 0001 C CNN
1 6300 3900
1 0 0 -1
$EndComp
Wire Wire Line
2150 4400 3850 4400
Text Notes 4000 1300 0 197 ~ 0
PAT80 Keyboard Controller
Text Notes 4000 2000 0 47 ~ 0
The PAT80 keyboard is seen from the computer as a readonly block of 64 bytes of memory\nin the I/O space mapped to the first 3 of the 5 I/O address available for every single I/O device.\n\nThe keyboard controller is a board plugged on the I/O backplane and connected to the matrix board with a\n34-pin female-to-female flat ribbon cable (e.g. the ones used by IBM PC floppy disk drives)\n\nThe joystick port is Atari-style: partially C64 and MSX compatible (supports a single button and no analog paddle)
Text Notes 4750 6100 0 47 ~ 0
Keyboard controller
$Comp
L Connector_Generic:Conn_02x17_Odd_Even J1
U 1 1 60ECCE47
P 9100 3650
F 0 "J1" H 9150 4667 50 0000 C CNN
F 1 "Keyboard connector" H 9150 4576 50 0000 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_2x17_P2.54mm_Vertical" H 9100 3650 50 0001 C CNN
F 3 "~" H 9100 3650 50 0001 C CNN
1 9100 3650
1 0 0 -1
$EndComp
Wire Wire Line
9400 2850 9400 2950
Wire Wire Line
9400 4600 9600 4600
Connection ~ 9400 2950
Wire Wire Line
9400 2950 9400 3050
Connection ~ 9400 3050
Wire Wire Line
9400 3050 9400 3150
Connection ~ 9400 3150
Wire Wire Line
9400 3150 9400 3250
Connection ~ 9400 3250
Wire Wire Line
9400 3250 9400 3350
Connection ~ 9400 3350
Wire Wire Line
9400 3350 9400 3450
Connection ~ 9400 3450
Wire Wire Line
9400 3450 9400 3550
Connection ~ 9400 3550
Wire Wire Line
9400 3550 9400 3650
Connection ~ 9400 3650
Wire Wire Line
9400 3650 9400 3750
Connection ~ 9400 3750
Wire Wire Line
9400 3750 9400 3850
Connection ~ 9400 3850
Wire Wire Line
9400 3850 9400 3950
Connection ~ 9400 3950
Wire Wire Line
9400 3950 9400 4050
Connection ~ 9400 4050
Wire Wire Line
9400 4050 9400 4150
Connection ~ 9400 4150
Wire Wire Line
9400 4150 9400 4250
Connection ~ 9400 4250
Wire Wire Line
9400 4250 9400 4350
Connection ~ 9400 4350
Wire Wire Line
9400 4350 9400 4450
Connection ~ 9400 4450
Wire Wire Line
9400 4450 9400 4600
Entry Wire Line
8500 2850 8400 2950
Entry Wire Line
8500 2950 8400 3050
Entry Wire Line
8500 3050 8400 3150
Entry Wire Line
8500 3150 8400 3250
Entry Wire Line
8500 3250 8400 3350
Entry Wire Line
8500 3350 8400 3450
Entry Wire Line
8500 3450 8400 3550
Entry Wire Line
8500 3550 8400 3650
Entry Wire Line
8500 3750 8400 3850
Entry Wire Line
8500 3850 8400 3950
Entry Wire Line
8500 3950 8400 4050
Entry Wire Line
8500 4050 8400 4150
Entry Wire Line
8500 4150 8400 4250
Entry Wire Line
8500 4250 8400 4350
Entry Wire Line
8500 4350 8400 4450
Entry Wire Line
8500 4450 8400 4550
$Comp
L power:GND #PWR017
U 1 1 60ECCE7F
P 9600 4600
F 0 "#PWR017" H 9600 4350 50 0001 C CNN
F 1 "GND" H 9605 4427 50 0000 C CNN
F 2 "" H 9600 4600 50 0001 C CNN
F 3 "" H 9600 4600 50 0001 C CNN
1 9600 4600
1 0 0 -1
$EndComp
Wire Wire Line
8500 2850 8900 2850
Wire Wire Line
8500 2950 8900 2950
Wire Wire Line
8500 3050 8900 3050
Wire Wire Line
8500 3150 8900 3150
Wire Wire Line
8500 3250 8900 3250
Wire Wire Line
8500 3350 8900 3350
Wire Wire Line
8500 3450 8900 3450
Wire Wire Line
8500 3550 8900 3550
Wire Wire Line
8500 3750 8900 3750
Wire Wire Line
8500 3850 8900 3850
Wire Wire Line
8500 3950 8900 3950
Wire Wire Line
8500 4050 8900 4050
Wire Wire Line
8500 4150 8900 4150
Wire Wire Line
8500 4250 8900 4250
Wire Wire Line
8500 4350 8900 4350
Wire Wire Line
8500 4450 8900 4450
Text Label 8600 2850 0 47 ~ 0
COL0
Text Label 8600 2950 0 47 ~ 0
COL1
Text Label 8600 3050 0 47 ~ 0
COL2
Text Label 8600 3150 0 47 ~ 0
COL3
Text Label 8600 3250 0 47 ~ 0
COL4
Text Label 8600 3350 0 47 ~ 0
COL5
Text Label 8600 3450 0 47 ~ 0
COL6
Text Label 8600 3550 0 47 ~ 0
COL7
Text Label 8600 3750 0 47 ~ 0
ROW0
Text Label 8600 3850 0 47 ~ 0
ROW1
Text Label 8600 3950 0 47 ~ 0
ROW2
Text Label 8600 4050 0 47 ~ 0
ROW3
Text Label 8600 4150 0 47 ~ 0
ROW4
Text Label 8600 4250 0 47 ~ 0
ROW5
Text Label 8600 4350 0 47 ~ 0
ROW6
Text Label 8600 4450 0 47 ~ 0
ROW7
$Comp
L power:VCC #PWR014
U 1 1 6138B5E2
P 7950 3950
F 0 "#PWR014" H 7950 3800 50 0001 C CNN
F 1 "VCC" H 7967 4123 50 0000 C CNN
F 2 "" H 7950 3950 50 0001 C CNN
F 3 "" H 7950 3950 50 0001 C CNN
1 7950 3950
1 0 0 -1
$EndComp
Wire Wire Line
8900 3650 8450 3650
Wire Wire Line
8450 3650 8450 3750
Wire Wire Line
8450 3750 8150 3750
Wire Wire Line
8150 3750 8150 3950
Wire Wire Line
8150 3950 7950 3950
Text Label 8600 3650 0 47 ~ 0
MTXVCC
$Comp
L Connector:DB9_Female_MountingHoles J2
U 1 1 60C1B7D7
P 9250 5250
F 0 "J2" H 9430 5252 50 0000 L CNN
F 1 "Joystick connector" H 9430 5161 50 0000 L CNN
F 2 "Connector_Dsub:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm" H 9250 5250 50 0001 C CNN
F 3 " ~" H 9250 5250 50 0001 C CNN
1 9250 5250
1 0 0 -1
$EndComp
Wire Bus Line
7250 3650 8400 3650
Wire Bus Line
7250 5600 8100 5600
Wire Bus Line
5200 5750 8400 5750
Entry Wire Line
8100 5450 8200 5350
Text Label 8600 5350 0 50 ~ 0
COL7
Wire Wire Line
8950 4850 8500 4850
Entry Wire Line
8400 4950 8500 4850
Wire Bus Line
8100 5600 8100 5450
Wire Wire Line
8950 5050 8500 5050
Entry Wire Line
8400 5150 8500 5050
Wire Wire Line
8950 5250 8500 5250
Entry Wire Line
8400 5350 8500 5250
Wire Wire Line
8950 5450 8500 5450
Entry Wire Line
8400 5550 8500 5450
Text Label 8600 4850 0 50 ~ 0
ROW0
Text Label 8600 5050 0 50 ~ 0
ROW1
Text Label 8600 5250 0 50 ~ 0
ROW2
Text Label 8600 5450 0 50 ~ 0
ROW3
Wire Wire Line
8950 4950 8500 4950
Entry Wire Line
8400 5050 8500 4950
Text Label 8600 4950 0 50 ~ 0
ROW4
Wire Wire Line
8950 5150 8500 5150
Wire Wire Line
8500 5150 8500 5200
Wire Wire Line
8500 5200 7950 5200
$Comp
L power:VCC #PWR015
U 1 1 60EC4111
P 7950 5200
F 0 "#PWR015" H 7950 5050 50 0001 C CNN
F 1 "VCC" H 7967 5373 50 0000 C CNN
F 2 "" H 7950 5200 50 0001 C CNN
F 3 "" H 7950 5200 50 0001 C CNN
1 7950 5200
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR016
U 1 1 60EC5968
P 9250 5850
F 0 "#PWR016" H 9250 5600 50 0001 C CNN
F 1 "GND" H 9255 5677 50 0000 C CNN
F 2 "" H 9250 5850 50 0001 C CNN
F 3 "" H 9250 5850 50 0001 C CNN
1 9250 5850
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR012
U 1 1 60F7D3B6
P 6300 4950
F 0 "#PWR012" H 6300 4700 50 0001 C CNN
F 1 "GND" H 6305 4777 50 0000 C CNN
F 2 "" H 6300 4950 50 0001 C CNN
F 3 "" H 6300 4950 50 0001 C CNN
1 6300 4950
1 0 0 -1
$EndComp
Wire Wire Line
6300 4950 6300 4600
$Comp
L Device:C C4
U 1 1 60FB4E9D
P 6650 3100
F 0 "C4" V 6398 3100 50 0000 C CNN
F 1 "56Pf" V 6489 3100 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 6688 2950 50 0001 C CNN
F 3 "~" H 6650 3100 50 0001 C CNN
1 6650 3100
0 1 1 0
$EndComp
Wire Wire Line
6800 2950 6800 2850
Connection ~ 6800 2950
Wire Wire Line
6900 2950 6800 2950
$Comp
L power:GND #PWR013
U 1 1 60FB4EA6
P 6900 2950
F 0 "#PWR013" H 6900 2700 50 0001 C CNN
F 1 "GND" H 6905 2777 50 0000 C CNN
F 2 "" H 6900 2950 50 0001 C CNN
F 3 "" H 6900 2950 50 0001 C CNN
1 6900 2950
1 0 0 -1
$EndComp
Wire Wire Line
6300 2950 6300 2800
Wire Wire Line
6500 2950 6500 2850
Connection ~ 6500 2950
Wire Wire Line
6500 2950 6300 2950
Wire Wire Line
6500 3100 6500 2950
Wire Wire Line
6800 3100 6800 2950
$Comp
L Device:C C3
U 1 1 60FB4EB3
P 6650 2850
F 0 "C3" V 6398 2850 50 0000 C CNN
F 1 "100Nf" V 6489 2850 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 6688 2700 50 0001 C CNN
F 3 "~" H 6650 2850 50 0001 C CNN
1 6650 2850
0 1 1 0
$EndComp
$Comp
L power:VCC #PWR011
U 1 1 60FB4EB9
P 6300 2800
F 0 "#PWR011" H 6300 2650 50 0001 C CNN
F 1 "VCC" H 6317 2973 50 0000 C CNN
F 2 "" H 6300 2800 50 0001 C CNN
F 3 "" H 6300 2800 50 0001 C CNN
1 6300 2800
1 0 0 -1
$EndComp
Wire Wire Line
6300 2950 6300 3300
Connection ~ 6300 2950
Wire Wire Line
8200 5350 8950 5350
Wire Bus Line
8400 2950 8400 3650
Wire Bus Line
5200 4200 5200 5750
Wire Bus Line
7250 3650 7250 5600
Wire Bus Line
8400 3850 8400 5750
Text Notes 7350 7550 0 118 ~ 0
Pat80 Keyboard and Joystick Controller
$EndSCHEMATC

View File

@ -0,0 +1,755 @@
EESchema Schematic File Version 4
EELAYER 30 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
Wire Wire Line
4350 3800 5800 3800
Connection ~ 4350 3800
Text Label 4900 4800 0 50 ~ 0
ROW7
Text Label 4900 4700 0 50 ~ 0
ROW6
Text Label 4900 4600 0 50 ~ 0
ROW5
Text Label 4900 4500 0 50 ~ 0
ROW4
Text Label 4900 4400 0 50 ~ 0
ROW3
Text Label 4900 4300 0 50 ~ 0
ROW2
Text Label 4900 4200 0 50 ~ 0
ROW1
Text Label 4900 4100 0 50 ~ 0
ROW0
Text Label 6850 4300 0 50 ~ 0
COL7
Text Label 6850 4200 0 50 ~ 0
COL6
Text Label 6850 4100 0 50 ~ 0
COL5
Text Label 6850 4000 0 50 ~ 0
COL4
Text Label 6850 3900 0 50 ~ 0
COL3
Text Label 6850 3800 0 50 ~ 0
COL2
Text Label 6850 3700 0 50 ~ 0
COL1
Text Label 6850 3600 0 50 ~ 0
COL0
Wire Wire Line
4850 4800 5100 4800
Wire Wire Line
4850 4700 5100 4700
Wire Wire Line
4850 4600 5100 4600
Wire Wire Line
4850 4500 5100 4500
Wire Wire Line
4850 4400 5100 4400
Wire Wire Line
4850 4300 5100 4300
Wire Wire Line
4850 4200 5100 4200
Wire Wire Line
4850 4100 5100 4100
Entry Wire Line
5100 4800 5200 4900
Entry Wire Line
5100 4700 5200 4800
Entry Wire Line
5100 4600 5200 4700
Entry Wire Line
5100 4500 5200 4600
Entry Wire Line
5100 4400 5200 4500
Entry Wire Line
5100 4300 5200 4400
Entry Wire Line
5100 4200 5200 4300
Entry Wire Line
5100 4100 5200 4200
Wire Wire Line
6800 3600 7150 3600
Wire Wire Line
6800 3700 7150 3700
Wire Wire Line
6800 3800 7150 3800
Wire Wire Line
6800 3900 7150 3900
Wire Wire Line
6800 4000 7150 4000
Wire Wire Line
7150 4100 6800 4100
Wire Wire Line
6800 4200 7150 4200
Wire Wire Line
7150 4300 6800 4300
Entry Wire Line
7150 4300 7250 4400
Entry Wire Line
7150 4200 7250 4300
Entry Wire Line
7150 4100 7250 4200
Entry Wire Line
7150 4000 7250 4100
Entry Wire Line
7150 3900 7250 4000
Entry Wire Line
7150 3800 7250 3900
Entry Wire Line
7150 3700 7250 3800
Entry Wire Line
7150 3600 7250 3700
Connection ~ 5400 4250
Wire Wire Line
5400 3500 5400 4250
Wire Wire Line
2150 3500 5400 3500
Wire Wire Line
4850 5050 4850 5100
Connection ~ 4850 5050
Wire Wire Line
5800 4250 5800 4300
Connection ~ 5800 4250
Wire Wire Line
5400 5050 4850 5050
Wire Wire Line
5400 4250 5400 5050
Wire Wire Line
5800 4250 5400 4250
Wire Wire Line
4850 5000 4850 5050
Wire Wire Line
5800 4200 5800 4250
$Comp
L power:VCC #PWR010
U 1 1 605B5E0F
P 5800 4100
F 0 "#PWR010" H 5800 3950 50 0001 C CNN
F 1 "VCC" H 5817 4273 50 0000 C CNN
F 2 "" H 5800 4100 50 0001 C CNN
F 3 "" H 5800 4100 50 0001 C CNN
1 5800 4100
1 0 0 -1
$EndComp
Wire Wire Line
2150 3800 4350 3800
Wire Wire Line
2150 3700 5800 3700
Wire Wire Line
2150 3600 5800 3600
Wire Wire Line
4350 3150 4350 3800
NoConn ~ 2650 4000
NoConn ~ 2650 3900
NoConn ~ 2650 4900
Wire Wire Line
2150 4800 3850 4800
Wire Wire Line
2150 4700 3850 4700
Wire Wire Line
2150 4600 3850 4600
Wire Wire Line
2150 4500 3850 4500
Wire Wire Line
2150 4300 3850 4300
Wire Wire Line
2150 4200 3850 4200
Wire Wire Line
2150 4100 3850 4100
$Comp
L Device:C C2
U 1 1 6058BC4A
P 4700 3300
F 0 "C2" V 4448 3300 50 0000 C CNN
F 1 "56Pf" V 4539 3300 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 4738 3150 50 0001 C CNN
F 3 "~" H 4700 3300 50 0001 C CNN
1 4700 3300
0 1 1 0
$EndComp
Wire Wire Line
4850 3150 4850 3050
Connection ~ 4850 3150
Wire Wire Line
4950 3150 4850 3150
$Comp
L power:GND #PWR09
U 1 1 6058E1A9
P 4950 3150
F 0 "#PWR09" H 4950 2900 50 0001 C CNN
F 1 "GND" H 4955 2977 50 0000 C CNN
F 2 "" H 4950 3150 50 0001 C CNN
F 3 "" H 4950 3150 50 0001 C CNN
1 4950 3150
1 0 0 -1
$EndComp
Wire Wire Line
4350 3150 4350 3000
Connection ~ 4350 3150
Wire Wire Line
4550 3150 4550 3050
Connection ~ 4550 3150
Wire Wire Line
4550 3150 4350 3150
Wire Wire Line
4550 3300 4550 3150
Wire Wire Line
4850 3300 4850 3150
$Comp
L Device:C C1
U 1 1 6058B545
P 4700 3050
F 0 "C1" V 4448 3050 50 0000 C CNN
F 1 "100Nf" V 4539 3050 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 4738 2900 50 0001 C CNN
F 3 "~" H 4700 3050 50 0001 C CNN
1 4700 3050
0 1 1 0
$EndComp
$Comp
L power:GND #PWR08
U 1 1 6058B250
P 4350 5400
F 0 "#PWR08" H 4350 5150 50 0001 C CNN
F 1 "GND" H 4355 5227 50 0000 C CNN
F 2 "" H 4350 5400 50 0001 C CNN
F 3 "" H 4350 5400 50 0001 C CNN
1 4350 5400
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR07
U 1 1 6058AE17
P 4350 3000
F 0 "#PWR07" H 4350 2850 50 0001 C CNN
F 1 "VCC" H 4367 3173 50 0000 C CNN
F 2 "" H 4350 3000 50 0001 C CNN
F 3 "" H 4350 3000 50 0001 C CNN
1 4350 3000
1 0 0 -1
$EndComp
Wire Wire Line
2650 5450 2900 5450
$Comp
L power:VCC #PWR05
U 1 1 60585FB5
P 2900 5450
F 0 "#PWR05" H 2900 5300 50 0001 C CNN
F 1 "VCC" H 2917 5623 50 0000 C CNN
F 2 "" H 2900 5450 50 0001 C CNN
F 3 "" H 2900 5450 50 0001 C CNN
1 2900 5450
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR03
U 1 1 60585B88
P 2750 5200
F 0 "#PWR03" H 2750 4950 50 0001 C CNN
F 1 "GND" H 2755 5027 50 0000 C CNN
F 2 "" H 2750 5200 50 0001 C CNN
F 3 "" H 2750 5200 50 0001 C CNN
1 2750 5200
1 0 0 -1
$EndComp
Wire Wire Line
2150 5000 2750 5000
Wire Wire Line
2750 5000 2750 5200
Wire Wire Line
2650 5100 2650 5450
$Comp
L power:GND #PWR04
U 1 1 60584796
P 2850 3000
F 0 "#PWR04" H 2850 2750 50 0001 C CNN
F 1 "GND" H 2855 2827 50 0000 C CNN
F 2 "" H 2850 3000 50 0001 C CNN
F 3 "" H 2850 3000 50 0001 C CNN
1 2850 3000
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR02
U 1 1 60584370
P 2650 3000
F 0 "#PWR02" H 2650 2850 50 0001 C CNN
F 1 "VCC" H 2667 3173 50 0000 C CNN
F 2 "" H 2650 3000 50 0001 C CNN
F 3 "" H 2650 3000 50 0001 C CNN
1 2650 3000
1 0 0 -1
$EndComp
Wire Wire Line
2150 3400 2750 3400
Wire Wire Line
2750 3000 2850 3000
Wire Wire Line
2750 3400 2750 3000
Wire Wire Line
2650 3300 2650 3000
Text Label 2250 5100 0 50 ~ 0
IOVCC
Text Label 2250 5000 0 50 ~ 0
IOGND
Text Label 2250 4900 0 50 ~ 0
IOWR
Text Label 2250 4800 0 50 ~ 0
IOD7
Text Label 2250 4700 0 50 ~ 0
IOD6
Text Label 2250 4600 0 50 ~ 0
IOD5
Text Label 2250 4500 0 50 ~ 0
IOD4
Text Label 2250 4400 0 50 ~ 0
IOD3
Text Label 2250 4300 0 50 ~ 0
IOD2
Text Label 2250 4200 0 50 ~ 0
IOD1
Text Label 2250 4100 0 50 ~ 0
IOD0
Text Label 2250 4000 0 50 ~ 0
IOADDR4
Text Label 2250 3900 0 50 ~ 0
IOADDR3
Text Label 2250 3800 0 50 ~ 0
IOADDR2
Text Label 2250 3700 0 50 ~ 0
IOADDR1
Text Label 2250 3600 0 50 ~ 0
IOADDR0
Text Label 2250 3500 0 50 ~ 0
IOEN
Text Label 2250 3400 0 50 ~ 0
IOGND
Text Label 2250 3300 0 50 ~ 0
IOVCC
Wire Wire Line
2150 5100 2650 5100
Wire Wire Line
2150 4900 2650 4900
Wire Wire Line
2150 4000 2650 4000
Wire Wire Line
2150 3900 2650 3900
Wire Wire Line
2150 3300 2650 3300
$Comp
L Connector_Generic:Conn_01x19 IOBUS1
U 1 1 6057928D
P 1950 4200
F 0 "IOBUS1" H 1868 5317 50 0000 C CNN
F 1 "IO_Bus_conn" H 1868 5226 50 0000 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x19_P2.54mm_Horizontal" H 1950 4200 50 0001 C CNN
F 3 "~" H 1950 4200 50 0001 C CNN
1 1950 4200
-1 0 0 -1
$EndComp
$Comp
L 74xx:74HC244 U1
U 1 1 605787CB
P 4350 4600
F 0 "U1" H 4350 5581 50 0000 C CNN
F 1 "74HC244" H 4350 5490 50 0000 C CNN
F 2 "Package_DIP:DIP-20_W7.62mm_LongPads" H 4350 4600 50 0001 C CNN
F 3 "http://www.nxp.com/documents/data_sheet/74HC_HCT244.pdf" H 4350 4600 50 0001 C CNN
1 4350 4600
-1 0 0 -1
$EndComp
$Comp
L 74xx:74LS138 U2
U 1 1 60577A7C
P 6300 3900
F 0 "U2" H 6300 4681 50 0000 C CNN
F 1 "74HC138" H 6300 4590 50 0000 C CNN
F 2 "Package_DIP:DIP-16_W7.62mm_LongPads" H 6300 3900 50 0001 C CNN
F 3 "http://www.ti.com/lit/gpn/sn74LS138" H 6300 3900 50 0001 C CNN
1 6300 3900
1 0 0 -1
$EndComp
Wire Wire Line
2150 4400 3850 4400
Text Notes 4600 1300 0 197 ~ 0
PAT80 Keyboard
Text Notes 4000 2000 0 47 ~ 0
The PAT80 keyboard is seen from the computer as a readonly block of 64 bytes of memory\nin the I/O space mapped to the first 3 of the 5 I/O address available for every single I/O device.\n\nThe keyboard controller is a board plugged on the I/O backplane and connected to the matrix board with a\n34-pin female-to-female flat ribbon cable (e.g. the ones used by IBM PC floppy disk drives)\n\nThe joystick port is Atari-style: partially C64 and MSX compatible (supports a single button and no analog paddle)
Text Notes 4750 6100 0 47 ~ 0
Keyboard controller
$Comp
L Connector_Generic:Conn_02x17_Odd_Even J1
U 1 1 60ECCE47
P 9100 3650
F 0 "J1" H 9150 4667 50 0000 C CNN
F 1 "Keyboard connector" H 9150 4576 50 0000 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_2x17_P2.54mm_Vertical" H 9100 3650 50 0001 C CNN
F 3 "~" H 9100 3650 50 0001 C CNN
1 9100 3650
1 0 0 -1
$EndComp
Wire Wire Line
9400 2850 9400 2950
Wire Wire Line
9400 4600 9600 4600
Connection ~ 9400 2950
Wire Wire Line
9400 2950 9400 3050
Connection ~ 9400 3050
Wire Wire Line
9400 3050 9400 3150
Connection ~ 9400 3150
Wire Wire Line
9400 3150 9400 3250
Connection ~ 9400 3250
Wire Wire Line
9400 3250 9400 3350
Connection ~ 9400 3350
Wire Wire Line
9400 3350 9400 3450
Connection ~ 9400 3450
Wire Wire Line
9400 3450 9400 3550
Connection ~ 9400 3550
Wire Wire Line
9400 3550 9400 3650
Connection ~ 9400 3650
Wire Wire Line
9400 3650 9400 3750
Connection ~ 9400 3750
Wire Wire Line
9400 3750 9400 3850
Connection ~ 9400 3850
Wire Wire Line
9400 3850 9400 3950
Connection ~ 9400 3950
Wire Wire Line
9400 3950 9400 4050
Connection ~ 9400 4050
Wire Wire Line
9400 4050 9400 4150
Connection ~ 9400 4150
Wire Wire Line
9400 4150 9400 4250
Connection ~ 9400 4250
Wire Wire Line
9400 4250 9400 4350
Connection ~ 9400 4350
Wire Wire Line
9400 4350 9400 4450
Connection ~ 9400 4450
Wire Wire Line
9400 4450 9400 4600
Entry Wire Line
8500 2850 8400 2950
Entry Wire Line
8500 2950 8400 3050
Entry Wire Line
8500 3050 8400 3150
Entry Wire Line
8500 3150 8400 3250
Entry Wire Line
8500 3250 8400 3350
Entry Wire Line
8500 3350 8400 3450
Entry Wire Line
8500 3450 8400 3550
Entry Wire Line
8500 3550 8400 3650
Entry Wire Line
8500 3750 8400 3850
Entry Wire Line
8500 3850 8400 3950
Entry Wire Line
8500 3950 8400 4050
Entry Wire Line
8500 4050 8400 4150
Entry Wire Line
8500 4150 8400 4250
Entry Wire Line
8500 4250 8400 4350
Entry Wire Line
8500 4350 8400 4450
Entry Wire Line
8500 4450 8400 4550
$Comp
L power:GND #PWR017
U 1 1 60ECCE7F
P 9600 4600
F 0 "#PWR017" H 9600 4350 50 0001 C CNN
F 1 "GND" H 9605 4427 50 0000 C CNN
F 2 "" H 9600 4600 50 0001 C CNN
F 3 "" H 9600 4600 50 0001 C CNN
1 9600 4600
1 0 0 -1
$EndComp
Wire Wire Line
8500 2850 8900 2850
Wire Wire Line
8500 2950 8900 2950
Wire Wire Line
8500 3050 8900 3050
Wire Wire Line
8500 3150 8900 3150
Wire Wire Line
8500 3250 8900 3250
Wire Wire Line
8500 3350 8900 3350
Wire Wire Line
8500 3450 8900 3450
Wire Wire Line
8500 3550 8900 3550
Wire Wire Line
8500 3750 8900 3750
Wire Wire Line
8500 3850 8900 3850
Wire Wire Line
8500 3950 8900 3950
Wire Wire Line
8500 4050 8900 4050
Wire Wire Line
8500 4150 8900 4150
Wire Wire Line
8500 4250 8900 4250
Wire Wire Line
8500 4350 8900 4350
Wire Wire Line
8500 4450 8900 4450
Text Label 8600 2850 0 47 ~ 0
COL0
Text Label 8600 2950 0 47 ~ 0
COL1
Text Label 8600 3050 0 47 ~ 0
COL2
Text Label 8600 3150 0 47 ~ 0
COL3
Text Label 8600 3250 0 47 ~ 0
COL4
Text Label 8600 3350 0 47 ~ 0
COL5
Text Label 8600 3450 0 47 ~ 0
COL6
Text Label 8600 3550 0 47 ~ 0
COL7
Text Label 8600 3750 0 47 ~ 0
ROW0
Text Label 8600 3850 0 47 ~ 0
ROW1
Text Label 8600 3950 0 47 ~ 0
ROW2
Text Label 8600 4050 0 47 ~ 0
ROW3
Text Label 8600 4150 0 47 ~ 0
ROW4
Text Label 8600 4250 0 47 ~ 0
ROW5
Text Label 8600 4350 0 47 ~ 0
ROW6
Text Label 8600 4450 0 47 ~ 0
ROW7
$Comp
L power:VCC #PWR014
U 1 1 6138B5E2
P 7950 3950
F 0 "#PWR014" H 7950 3800 50 0001 C CNN
F 1 "VCC" H 7967 4123 50 0000 C CNN
F 2 "" H 7950 3950 50 0001 C CNN
F 3 "" H 7950 3950 50 0001 C CNN
1 7950 3950
1 0 0 -1
$EndComp
Wire Wire Line
8900 3650 8450 3650
Wire Wire Line
8450 3650 8450 3750
Wire Wire Line
8450 3750 8150 3750
Wire Wire Line
8150 3750 8150 3950
Wire Wire Line
8150 3950 7950 3950
Text Label 8600 3650 0 47 ~ 0
MTXVCC
$Comp
L Connector:DB9_Female_MountingHoles J2
U 1 1 60C1B7D7
P 9250 5250
F 0 "J2" H 9430 5252 50 0000 L CNN
F 1 "Joystick connector" H 9430 5161 50 0000 L CNN
F 2 "Connector_Dsub:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm" H 9250 5250 50 0001 C CNN
F 3 " ~" H 9250 5250 50 0001 C CNN
1 9250 5250
1 0 0 -1
$EndComp
Wire Bus Line
7250 3650 8400 3650
Wire Bus Line
7250 5600 8100 5600
Wire Bus Line
5200 5750 8400 5750
Entry Wire Line
8100 5450 8200 5350
Text Label 8600 5350 0 50 ~ 0
COL7
Wire Wire Line
8950 4850 8500 4850
Entry Wire Line
8400 4950 8500 4850
Wire Bus Line
8100 5600 8100 5450
Wire Wire Line
8950 5050 8500 5050
Entry Wire Line
8400 5150 8500 5050
Wire Wire Line
8950 5250 8500 5250
Entry Wire Line
8400 5350 8500 5250
Wire Wire Line
8950 5450 8500 5450
Entry Wire Line
8400 5550 8500 5450
Text Label 8600 4850 0 50 ~ 0
ROW0
Text Label 8600 5050 0 50 ~ 0
ROW1
Text Label 8600 5250 0 50 ~ 0
ROW2
Text Label 8600 5450 0 50 ~ 0
ROW3
Wire Wire Line
8950 4950 8500 4950
Entry Wire Line
8400 5050 8500 4950
Text Label 8600 4950 0 50 ~ 0
ROW4
Wire Wire Line
8950 5150 8500 5150
Wire Wire Line
8500 5150 8500 5200
Wire Wire Line
8500 5200 7950 5200
$Comp
L power:VCC #PWR015
U 1 1 60EC4111
P 7950 5200
F 0 "#PWR015" H 7950 5050 50 0001 C CNN
F 1 "VCC" H 7967 5373 50 0000 C CNN
F 2 "" H 7950 5200 50 0001 C CNN
F 3 "" H 7950 5200 50 0001 C CNN
1 7950 5200
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR016
U 1 1 60EC5968
P 9250 5850
F 0 "#PWR016" H 9250 5600 50 0001 C CNN
F 1 "GND" H 9255 5677 50 0000 C CNN
F 2 "" H 9250 5850 50 0001 C CNN
F 3 "" H 9250 5850 50 0001 C CNN
1 9250 5850
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR012
U 1 1 60F7D3B6
P 6300 4950
F 0 "#PWR012" H 6300 4700 50 0001 C CNN
F 1 "GND" H 6305 4777 50 0000 C CNN
F 2 "" H 6300 4950 50 0001 C CNN
F 3 "" H 6300 4950 50 0001 C CNN
1 6300 4950
1 0 0 -1
$EndComp
Wire Wire Line
6300 4950 6300 4600
$Comp
L Device:C C4
U 1 1 60FB4E9D
P 6650 3100
F 0 "C4" V 6398 3100 50 0000 C CNN
F 1 "56Pf" V 6489 3100 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 6688 2950 50 0001 C CNN
F 3 "~" H 6650 3100 50 0001 C CNN
1 6650 3100
0 1 1 0
$EndComp
Wire Wire Line
6800 2950 6800 2850
Connection ~ 6800 2950
Wire Wire Line
6900 2950 6800 2950
$Comp
L power:GND #PWR013
U 1 1 60FB4EA6
P 6900 2950
F 0 "#PWR013" H 6900 2700 50 0001 C CNN
F 1 "GND" H 6905 2777 50 0000 C CNN
F 2 "" H 6900 2950 50 0001 C CNN
F 3 "" H 6900 2950 50 0001 C CNN
1 6900 2950
1 0 0 -1
$EndComp
Wire Wire Line
6300 2950 6300 2800
Wire Wire Line
6500 2950 6500 2850
Connection ~ 6500 2950
Wire Wire Line
6500 2950 6300 2950
Wire Wire Line
6500 3100 6500 2950
Wire Wire Line
6800 3100 6800 2950
$Comp
L Device:C C3
U 1 1 60FB4EB3
P 6650 2850
F 0 "C3" V 6398 2850 50 0000 C CNN
F 1 "100Nf" V 6489 2850 50 0000 C CNN
F 2 "Capacitor_THT:CP_Radial_Tantal_D6.0mm_P5.00mm" H 6688 2700 50 0001 C CNN
F 3 "~" H 6650 2850 50 0001 C CNN
1 6650 2850
0 1 1 0
$EndComp
$Comp
L power:VCC #PWR011
U 1 1 60FB4EB9
P 6300 2800
F 0 "#PWR011" H 6300 2650 50 0001 C CNN
F 1 "VCC" H 6317 2973 50 0000 C CNN
F 2 "" H 6300 2800 50 0001 C CNN
F 3 "" H 6300 2800 50 0001 C CNN
1 6300 2800
1 0 0 -1
$EndComp
Wire Wire Line
6300 2950 6300 3300
Connection ~ 6300 2950
Wire Wire Line
8200 5350 8950 5350
Wire Bus Line
8400 2950 8400 3650
Wire Bus Line
5200 4200 5200 5750
Wire Bus Line
7250 3650 7250 5600
Wire Bus Line
8400 3850 8400 5750
Text Notes 7350 7550 0 118 ~ 0
Pat80 Keyboard and Joystick Controller
$EndSCHEMATC

View File

@ -0,0 +1,3 @@
(sym_lib_table
(lib (name pat80)(type Legacy)(uri /home/danieleverducci/git/pato-z80-home-computer/kicad-symbols/pat80.lib)(options "")(descr ""))
)

View File

@ -1,5 +1,24 @@
/** /**
* Terminal interface. * Terminal interface.
*
* * @language: AVR ASM
*
* This file is part of Pat80 IO Devices.
*
* Pat80 IO Devices is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 IO Devices is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
*
*
* This sketch allow an Arduino to be used as a terminal to log into Pat80. * This sketch allow an Arduino to be used as a terminal to log into Pat80.
* The Arduino is connected to the Pat80 I/O bus and to the terminal computer via USB. * The Arduino is connected to the Pat80 I/O bus and to the terminal computer via USB.
* The Python Terminal Monitor or the Arduino IDE serial monitor is used to send * The Python Terminal Monitor or the Arduino IDE serial monitor is used to send

View File

@ -4,6 +4,23 @@
""" @package docstring """ @package docstring
ARDUINO PARALLEL TERMINAL EMULATOR ARDUINO PARALLEL TERMINAL EMULATOR
* This file is part of Pat80 IO Devices.
*
* Pat80 IO Devices is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 IO Devices is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
USAGE: USAGE:
Connect the arduino to a Pat80 I/O port. Connect the arduino to a Pat80 I/O port.
Flash /arduino/arduino_terminal firmware into the Arduino. Flash /arduino/arduino_terminal firmware into the Arduino.

View File

@ -0,0 +1,18 @@
# UART
This folder contains the Pat80 UART decoding logic, schematics and PCB layout.
## License
All files contained in this folder are part of Pat80 Blueprints.
Pat80 Blueprints is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pat80 Blueprints is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pat80 Blueprints. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project source="2.7.1" version="1.0">
This file is intended to be loaded by Logisim (http://www.cburch.com/logisim/).
<lib desc="#Wiring" name="0">
<tool name="Splitter">
<a name="fanout" val="4"/>
<a name="incoming" val="4"/>
</tool>
</lib>
<lib desc="#Gates" name="1">
<tool name="AND Gate">
<a name="facing" val="west"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</tool>
</lib>
<lib desc="#Plexers" name="2"/>
<lib desc="#Arithmetic" name="3"/>
<lib desc="#Memory" name="4">
<tool name="Counter">
<a name="width" val="4"/>
<a name="max" val="0xf"/>
<a name="trigger" val="falling"/>
<a name="label" val="Clock demultiplier"/>
</tool>
<tool name="Shift Register">
<a name="parallel" val="false"/>
</tool>
</lib>
<lib desc="#I/O" name="5"/>
<lib desc="#Base" name="6">
<tool name="Text Tool">
<a name="text" val=""/>
<a name="font" val="SansSerif plain 12"/>
<a name="halign" val="center"/>
<a name="valign" val="base"/>
</tool>
</lib>
<main name="main"/>
<options>
<a name="gateUndefined" val="ignore"/>
<a name="simlimit" val="1000"/>
<a name="simrand" val="0"/>
</options>
<mappings>
<tool lib="6" map="Button2" name="Menu Tool"/>
<tool lib="6" map="Button3" name="Menu Tool"/>
<tool lib="6" map="Ctrl Button1" name="Menu Tool"/>
</mappings>
<toolbar>
<tool lib="6" name="Poke Tool"/>
<tool lib="6" name="Edit Tool"/>
<tool lib="6" name="Text Tool">
<a name="text" val=""/>
<a name="font" val="SansSerif plain 12"/>
<a name="halign" val="center"/>
<a name="valign" val="base"/>
</tool>
<sep/>
<tool lib="0" name="Pin">
<a name="tristate" val="false"/>
</tool>
<tool lib="0" name="Pin">
<a name="facing" val="west"/>
<a name="output" val="true"/>
<a name="labelloc" val="east"/>
</tool>
<tool lib="1" name="NOT Gate"/>
<tool lib="1" name="AND Gate"/>
<tool lib="1" name="OR Gate"/>
</toolbar>
<circuit name="main">
<a name="circuit" val="main"/>
<a name="clabel" val=""/>
<a name="clabelup" val="east"/>
<a name="clabelfont" val="SansSerif plain 12"/>
<wire from="(400,430)" to="(400,500)"/>
<wire from="(610,290)" to="(660,290)"/>
<wire from="(350,370)" to="(350,500)"/>
<wire from="(210,490)" to="(210,500)"/>
<wire from="(880,30)" to="(880,350)"/>
<wire from="(290,370)" to="(290,380)"/>
<wire from="(420,520)" to="(540,520)"/>
<wire from="(330,370)" to="(330,380)"/>
<wire from="(370,370)" to="(370,380)"/>
<wire from="(870,430)" to="(870,460)"/>
<wire from="(390,100)" to="(390,180)"/>
<wire from="(420,180)" to="(420,210)"/>
<wire from="(440,80)" to="(440,110)"/>
<wire from="(410,370)" to="(410,400)"/>
<wire from="(180,410)" to="(180,500)"/>
<wire from="(250,380)" to="(290,380)"/>
<wire from="(200,30)" to="(880,30)"/>
<wire from="(280,90)" to="(320,90)"/>
<wire from="(290,180)" to="(330,180)"/>
<wire from="(400,170)" to="(440,170)"/>
<wire from="(350,100)" to="(350,200)"/>
<wire from="(490,300)" to="(580,300)"/>
<wire from="(860,410)" to="(880,410)"/>
<wire from="(410,110)" to="(440,110)"/>
<wire from="(520,140)" to="(550,140)"/>
<wire from="(380,400)" to="(410,400)"/>
<wire from="(320,190)" to="(340,190)"/>
<wire from="(300,530)" to="(320,530)"/>
<wire from="(410,480)" to="(430,480)"/>
<wire from="(800,420)" to="(830,420)"/>
<wire from="(150,470)" to="(150,520)"/>
<wire from="(490,90)" to="(500,90)"/>
<wire from="(210,490)" to="(220,490)"/>
<wire from="(870,430)" to="(880,430)"/>
<wire from="(440,80)" to="(500,80)"/>
<wire from="(200,490)" to="(200,500)"/>
<wire from="(240,490)" to="(240,500)"/>
<wire from="(270,520)" to="(320,520)"/>
<wire from="(260,390)" to="(310,390)"/>
<wire from="(790,390)" to="(790,460)"/>
<wire from="(410,100)" to="(410,110)"/>
<wire from="(290,260)" to="(290,270)"/>
<wire from="(200,150)" to="(200,300)"/>
<wire from="(220,470)" to="(220,490)"/>
<wire from="(530,100)" to="(530,120)"/>
<wire from="(390,410)" to="(430,410)"/>
<wire from="(380,100)" to="(380,190)"/>
<wire from="(340,100)" to="(340,190)"/>
<wire from="(330,410)" to="(330,500)"/>
<wire from="(810,370)" to="(830,370)"/>
<wire from="(390,180)" to="(420,180)"/>
<wire from="(660,180)" to="(660,290)"/>
<wire from="(400,430)" to="(430,430)"/>
<wire from="(510,100)" to="(510,260)"/>
<wire from="(440,170)" to="(440,210)"/>
<wire from="(330,380)" to="(340,380)"/>
<wire from="(200,150)" to="(280,150)"/>
<wire from="(200,490)" to="(210,490)"/>
<wire from="(280,90)" to="(280,150)"/>
<wire from="(530,120)" to="(610,120)"/>
<wire from="(860,430)" to="(870,430)"/>
<wire from="(790,460)" to="(870,460)"/>
<wire from="(340,380)" to="(340,500)"/>
<wire from="(190,490)" to="(190,500)"/>
<wire from="(230,490)" to="(230,500)"/>
<wire from="(200,80)" to="(320,80)"/>
<wire from="(340,200)" to="(340,210)"/>
<wire from="(380,200)" to="(380,210)"/>
<wire from="(310,370)" to="(310,390)"/>
<wire from="(390,370)" to="(390,390)"/>
<wire from="(880,380)" to="(880,410)"/>
<wire from="(290,180)" to="(290,260)"/>
<wire from="(330,100)" to="(330,180)"/>
<wire from="(200,300)" to="(490,300)"/>
<wire from="(370,100)" to="(370,200)"/>
<wire from="(830,330)" to="(830,370)"/>
<wire from="(640,130)" to="(660,130)"/>
<wire from="(150,570)" to="(300,570)"/>
<wire from="(380,190)" to="(400,190)"/>
<wire from="(580,140)" to="(610,140)"/>
<wire from="(260,390)" to="(260,500)"/>
<wire from="(150,530)" to="(150,570)"/>
<wire from="(430,370)" to="(430,410)"/>
<wire from="(150,520)" to="(170,520)"/>
<wire from="(520,100)" to="(520,140)"/>
<wire from="(610,310)" to="(810,310)"/>
<wire from="(340,200)" to="(350,200)"/>
<wire from="(360,380)" to="(370,380)"/>
<wire from="(410,110)" to="(410,160)"/>
<wire from="(460,160)" to="(460,210)"/>
<wire from="(190,490)" to="(200,490)"/>
<wire from="(230,490)" to="(240,490)"/>
<wire from="(250,380)" to="(250,500)"/>
<wire from="(400,100)" to="(400,170)"/>
<wire from="(140,80)" to="(200,80)"/>
<wire from="(410,160)" to="(460,160)"/>
<wire from="(220,490)" to="(220,500)"/>
<wire from="(320,190)" to="(320,210)"/>
<wire from="(400,190)" to="(400,210)"/>
<wire from="(410,480)" to="(410,500)"/>
<wire from="(800,390)" to="(800,420)"/>
<wire from="(490,90)" to="(490,300)"/>
<wire from="(390,410)" to="(390,500)"/>
<wire from="(660,130)" to="(660,150)"/>
<wire from="(290,260)" to="(510,260)"/>
<wire from="(380,400)" to="(380,500)"/>
<wire from="(180,410)" to="(330,410)"/>
<wire from="(300,570)" to="(640,570)"/>
<wire from="(370,390)" to="(390,390)"/>
<wire from="(180,370)" to="(180,410)"/>
<wire from="(360,100)" to="(360,210)"/>
<wire from="(370,390)" to="(370,500)"/>
<wire from="(300,530)" to="(300,570)"/>
<wire from="(150,530)" to="(170,530)"/>
<wire from="(200,30)" to="(200,80)"/>
<wire from="(370,200)" to="(380,200)"/>
<wire from="(220,490)" to="(230,490)"/>
<wire from="(360,380)" to="(360,500)"/>
<comp lib="0" loc="(410,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(290,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="1" loc="(880,380)" name="NOT Gate">
<a name="facing" val="south"/>
</comp>
<comp lib="4" loc="(320,80)" name="Shift Register"/>
<comp lib="1" loc="(660,180)" name="NOT Gate">
<a name="facing" val="south"/>
</comp>
<comp lib="0" loc="(880,430)" name="Clock">
<a name="facing" val="west"/>
</comp>
<comp lib="0" loc="(180,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
<a name="label" val="Wr"/>
<a name="labelloc" val="north"/>
</comp>
<comp lib="0" loc="(150,470)" name="Power"/>
<comp lib="0" loc="(350,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(400,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(430,430)" name="Ground"/>
<comp lib="0" loc="(340,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(440,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="4" loc="(170,520)" name="Shift Register"/>
<comp lib="0" loc="(360,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(420,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(310,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="4" loc="(320,520)" name="Shift Register"/>
<comp lib="0" loc="(330,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(390,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(370,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="4" loc="(500,80)" name="Shift Register"/>
<comp lib="0" loc="(430,370)" name="Pin">
<a name="facing" val="south"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(140,80)" name="Pin">
<a name="tristate" val="false"/>
<a name="label" val="Rx"/>
</comp>
<comp lib="1" loc="(580,140)" name="NOT Gate"/>
<comp lib="1" loc="(640,130)" name="AND Gate">
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</comp>
<comp lib="0" loc="(540,520)" name="Pin">
<a name="facing" val="west"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
<a name="label" val="Tx"/>
<a name="labelloc" val="east"/>
</comp>
<comp lib="1" loc="(830,420)" name="AND Gate">
<a name="facing" val="west"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</comp>
<comp lib="0" loc="(320,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="1" loc="(580,300)" name="AND Gate">
<a name="facing" val="west"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</comp>
<comp lib="0" loc="(220,470)" name="Power"/>
<comp lib="4" loc="(810,370)" name="Counter">
<a name="width" val="4"/>
<a name="max" val="0xf"/>
<a name="trigger" val="falling"/>
<a name="label" val="Clock demultiplier"/>
<a name="labelfont" val="SansSerif plain 10"/>
</comp>
<comp lib="0" loc="(380,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(460,210)" name="Pin">
<a name="facing" val="north"/>
<a name="output" val="true"/>
<a name="tristate" val="false"/>
</comp>
<comp lib="0" loc="(290,270)" name="Pin">
<a name="facing" val="north"/>
<a name="tristate" val="false"/>
<a name="label" val="Clear"/>
</comp>
<comp lib="0" loc="(430,480)" name="Power"/>
<comp lib="0" loc="(830,330)" name="Splitter">
<a name="facing" val="west"/>
<a name="fanout" val="4"/>
<a name="incoming" val="4"/>
<a name="appear" val="right"/>
</comp>
</circuit>
</project>

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project source="2.7.1" version="1.0">
This file is intended to be loaded by Logisim (http://www.cburch.com/logisim/).
<lib desc="#Wiring" name="0"/>
<lib desc="#Gates" name="1">
<tool name="NAND Gate">
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</tool>
</lib>
<lib desc="#Plexers" name="2"/>
<lib desc="#Arithmetic" name="3"/>
<lib desc="#Memory" name="4"/>
<lib desc="#I/O" name="5"/>
<lib desc="#Base" name="6">
<tool name="Text Tool">
<a name="text" val=""/>
<a name="font" val="SansSerif plain 12"/>
<a name="halign" val="center"/>
<a name="valign" val="base"/>
</tool>
</lib>
<main name="main"/>
<options>
<a name="gateUndefined" val="ignore"/>
<a name="simlimit" val="1000"/>
<a name="simrand" val="0"/>
</options>
<mappings>
<tool lib="6" map="Button2" name="Menu Tool"/>
<tool lib="6" map="Button3" name="Menu Tool"/>
<tool lib="6" map="Ctrl Button1" name="Menu Tool"/>
</mappings>
<toolbar>
<tool lib="6" name="Poke Tool"/>
<tool lib="6" name="Edit Tool"/>
<tool lib="6" name="Text Tool">
<a name="text" val=""/>
<a name="font" val="SansSerif plain 12"/>
<a name="halign" val="center"/>
<a name="valign" val="base"/>
</tool>
<sep/>
<tool lib="0" name="Pin">
<a name="tristate" val="false"/>
</tool>
<tool lib="0" name="Pin">
<a name="facing" val="west"/>
<a name="output" val="true"/>
<a name="labelloc" val="east"/>
</tool>
<tool lib="1" name="NOT Gate"/>
<tool lib="1" name="AND Gate"/>
<tool lib="1" name="OR Gate"/>
</toolbar>
<circuit name="main">
<a name="circuit" val="main"/>
<a name="clabel" val=""/>
<a name="clabelup" val="east"/>
<a name="clabelfont" val="SansSerif plain 12"/>
<wire from="(180,160)" to="(340,160)"/>
<wire from="(160,210)" to="(170,210)"/>
<wire from="(180,150)" to="(180,160)"/>
<wire from="(190,130)" to="(230,130)"/>
<wire from="(260,140)" to="(260,250)"/>
<wire from="(340,130)" to="(340,160)"/>
<wire from="(260,140)" to="(300,140)"/>
<wire from="(250,120)" to="(300,120)"/>
<wire from="(170,150)" to="(170,210)"/>
<wire from="(160,250)" to="(260,250)"/>
<comp lib="0" loc="(160,210)" name="Clock"/>
<comp lib="0" loc="(160,250)" name="Pin">
<a name="tristate" val="false"/>
<a name="label" val="Rx"/>
</comp>
<comp lib="0" loc="(230,130)" name="Splitter">
<a name="fanout" val="8"/>
<a name="incoming" val="8"/>
</comp>
<comp lib="1" loc="(340,130)" name="NAND Gate">
<a name="size" val="30"/>
<a name="inputs" val="2"/>
</comp>
<comp lib="4" loc="(190,130)" name="Counter"/>
</circuit>
</project>

View File

@ -1,4 +1,21 @@
/** /**
*
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
*
*
* SN76489 sound chip test * SN76489 sound chip test
* *
* DATA BUS IS: 2, 3, 4, 5, 6, 7, 8, 9 (NOTE: 2 is D0, but D0 is the MSB) * DATA BUS IS: 2, 3, 4, 5, 6, 7, 8, 9 (NOTE: 2 is D0, but D0 is the MSB)

View File

@ -0,0 +1,57 @@
/**
* This file is part of Pat80 IO Devices.
*
* Pat80 IO Devices is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 IO Devices is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 IO Devices. If not, see <http://www.gnu.org/licenses/>.
*
*
* Composite pal adapter test.
* This sketch makes an Arduino send test data to tha Pat80 composite video pal adapter.
* Connect the video adapter directly to Arduino
*/
const byte CLK = 11; // output active low
const byte RS = 12; // output low = DATA register, high = COMMAND register
const byte BUSY = 13; // Input, Active low
// DATA BUS (Output, active high): 3, 4, 5, 6, 7, 8, 9, 10;
void setup() {
DDRD = DDRD | B11111000; // Port D (arduino pins 3 to 7) is output. In or to preserve serial pins and interrupt pin
DDRB = B00000111; // Port B (0,1,2) = pins 8,9,10 output
pinMode(CLK, OUTPUT);
pinMode(RS, OUTPUT);
pinMode(BUSY, INPUT);
digitalWrite(CLK, HIGH); // Inactive clock
}
void loop() {
delay(1000);
send();
}
void send() {
// Random char
char c = random(32, 126);
// Wait for BUSY to become inactive (HIGH)
//while(digitalRead(BUSY) == LOW) {}
// Split byte to two parts and write to ports
PORTD = c << 3;
PORTB = c >> 5;
// Clock pulse
digitalWrite(CLK, LOW);
delay(100);
digitalWrite(CLK, HIGH);
}

View File

@ -1,4 +1,23 @@
/* ************** EEPROM PROGRAMMER ****************** /* ************** EEPROM PROGRAMMER ******************
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
NOTE: This is not working and I'm not sure if it will be fixed or removed,
as I'm actually using an USB programmer.
HARDWARE: HARDWARE:

View File

@ -1,4 +1,23 @@
/* HD44780 Character display debugger */ /*
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
*
*
* HD44780 Character display debugger
* Used to intercept data sent from Pat80 to character display
*/
#define EN 2 #define EN 2
const byte DATA_BUS[] = {10, 9, 8, 7, 6, 5, 4, 3}; const byte DATA_BUS[] = {10, 9, 8, 7, 6, 5, 4, 3};

View File

@ -1,67 +0,0 @@
#include <TVout.h>
#include <TVoutfonts/fontALL.h>
TVout TV;
// Pins
#define RS 5
#define EN 4
const byte DATA [] = {A5, A4, A3, A2, 13, 12, 11, 10};
bool clkState = false;
void setup() {
Serial.begin(57600);
Serial.println("PAL debugger");
// Init comm pins
pinMode(EN, INPUT);
pinMode(RS, INPUT);
for(int pin = 0; pin < 8; pin++) {
pinMode(DATA[pin], INPUT);
}
// Init VGA
TV.begin(PAL,120,96);
TV.select_font(font4x6);
TV.println("TV init");
}
void loop() {
bool newClkState = digitalRead(EN);
if (newClkState == false && clkState == true) {
// Falling edge: read data from bus
onClk();
}
clkState = newClkState;
}
void onClk() {
bool isCommand = digitalRead(RS);
if (isCommand) {
//onCommandReceived();
onDataReceived();
} else {
onDataReceived();
}
}
void onCommandReceived() {
}
void onDataReceived() {
char ch = readByte();
TV.print(ch);
Serial.println(ch);
}
byte readByte() {
unsigned int data = 0;
for(int pin=0; pin < 8; pin++) {
byte b = digitalRead(DATA[pin]) ? 1 : 0;
data = (data << 1) + b; // Shifta di 1 e aggiunge il bit corrente. Serve per ricostruire il numero da binario
}
return data;
}

View File

@ -0,0 +1,54 @@
/*
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
*
*
* PS/2 Keyboard controller debugger
* Used to intercept data decoded from Pat80 PS/2 keyboard adapter
*/
#define EN 2
const byte DATA_BUS[] = {10, 9, 8, 7, 6, 5, 4, 3};
void setup() {
pinMode(EN, INPUT);
for(int pin=0; pin < 8; pin++) {
pinMode(DATA_BUS[pin], INPUT);
}
Serial.begin(57600);
Serial.println("PS/2 keyboard controller debugger");
Serial.println("DATA BUS HEX EN");
attachInterrupt(digitalPinToInterrupt(EN), onClk, FALLING);
}
void loop() {}
void onClk() {
unsigned int data = 0;
for(int pin=0; pin < 8; pin++) {
byte b = digitalRead(DATA_BUS[pin]) ? 1 : 0;
Serial.print(b);
data = (data << 1) + b; // Shifta di 1 e aggiunge il bit corrente. Serve per ricostruire il numero da binario
}
char output[50] = {};
sprintf(output, " 0x%02x %c",
data,
digitalRead(EN) ? 'D' : 'I'
);
Serial.println(output);
}

View File

@ -1,4 +1,21 @@
/** /**
*
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
*
*
* SPI SD-Card test sketch * SPI SD-Card test sketch
* Reads the first 128 bytes from sdcard and prints it out as ascii characters in serial monitor at 9200 baud * Reads the first 128 bytes from sdcard and prints it out as ascii characters in serial monitor at 9200 baud
* *

View File

@ -1,4 +1,20 @@
/* ************** DEBUGGER Zilog Z80 ****************** /* ************** DEBUGGER Zilog Z80 ******************
*
* This file is part of Pat80 Utils.
*
* Pat80 Utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pat80 Utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY * without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pat80 Utils. If not, see <http://www.gnu.org/licenses/>.
HARDWARE: HARDWARE: