Merge pull request #2 from nippur72/main

Update branch
This commit is contained in:
Francesco Sblendorio 2021-12-21 20:02:41 +01:00 committed by GitHub
commit 84eed957e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 1597 additions and 1805 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@
*.bin
bug/*
cc65/*
.vscode/*

276
README.md
View File

@ -1,24 +1,272 @@
# apple1-videocard-lib
Library and demos for the Apple-1 TMS9918 video card by P-LAB.
Library and demos for the "Apple-1 Graphic Card" by P-LAB,
featuring the TMS9918 Video Display Processor by Texas Instruments.
## Repo structure
# Building for the "Juke Box" EPROM expansion
```
demos/
demo/ demo program that makes use of the library
picshow/ demo program that shows a picture in bitmap mode
tetris/ a game
docs/ TMS9918 and Apple-1 manuals
kickc/ target configuration files for KickC
lib/ the library files to include in your project
tools/ some build tools
```
The demo contained in the repo are meant to be launched from the Apple-1 "Juke Box"
EPROM expansion at address $4000. The executables are built according to the
following memory map:
## Introduction
$0000-$00FF zero page: holds most of C program variables
$0280-$0FFF low RAM space: C program "Data" segment
$4000-$7581 EPROM (Juke Box): C program "Code" segment
$7582-$7FFF EPROM (Juke Box): C program "Data" segment (startup values)
The library is a set of C routines that make very easy
to use the TMS9918 on the Apple-1. It is intended to work
with the "Apple-1 Graphic Card" board by [P-LAB]() or any
other video card that maps the TMS9918 in the `$CC00`-`$CC01`
memory range of the Apple-1.
The build script "mkeprom.js" creates a 16K binary file to be placed on the
EPROM where the "Data" segment startup values are put at the end of the file itself.
The user program need to manually copy such data from EPROM to low RAM once after
the `main()` is launched. That can be easily done by simply calling the library
function `apple1_eprom_init()`.
The library is written in C with [KickC](https://gitlab.com/camelot/kickc/-/releases), a very efficient 6502 C compiler.
## Choice of the screen mode
The library supports screen modes 1 and 2 only (screen 0 and screen 3 not
being very useful). Both are 256x192 pixels but there are some differences
you should consider when evaluating which mode to use:
- Screen 1: there are 256 tiles that can be written very quickly on the
screen, but the color choice is limited to 8 consecutive tiles for each
color in the palette. It's commonly used for text applications with
limited colors.
- Screen 2: you can address every pixel on the screen with a limitation
of 2 colors per line within an 8x8 tile grid. It's commonly used for bitmapped
graphic or slow-but-colorful text.
Both screen modes support 32 sprites.
### Working with screen 1
Some example code:
```c
// *** first we set the SCREEN 1 mode
tms_init_regs(SCREEN1_TABLE); // initializes the registers with SCREEN 1 precalculated values
screen1_prepare(); // prepares the screen to be used, loads a useful 8x8 ASCII font
tms_set_color(COLOR_VIOLET); // sets border color to violet (see tms9918.h for the list of all colors)
// *** then we can use it
screen1_cls(); // clears the screen
screen1_putc('A'); // writes the character "A"
screen1_putc(CHR_BACKSPACE); // goes back 1 character
screen1_putc('B'); // overwrites a "B" over it
// writes "A" in the bottom-right corner, causing the screen to scroll
screen1_locate(31,23);
screen1_putc("A");
// some printing
screen1_puts(CLS "Hello world"); // CLS, REVERSE_ON, REVERSE_OFF
screen1_puts(REVERSE_ON "reverse" REVERSE_OFF); // are macros defined in tms_screen1.h
screen1_puts("Line1\nLine2"); // '\n' is also supported
// simple string input from the keyboard (editing with CTRL-H is also supported)
char buffer[32];
screen1_strinput(buffer, 32);
screen1_prints("you wrote:");
screen1_prints(buffer);
```
### Working with screen 2
Some example code:
```c
// initializes the registers with SCREEN 2 precalculated values
tms_init_regs(SCREEN2_TABLE);
// sometimes two colors need to be packed into a single byte
// you can easily do that with the FG_BG() macro:
byte mycolor = FG_BG(COLOR_BLACK,COLOR_WHITE);
// prepares the screeen to be used as a bitmap with default colors black on white
screen2_init_bitmap(mycolor);
// plots a pixel in the middle of the screen
screen2_plot(128,96);
// and erases it:
screen2_plot_mode = PLOT_MODE_RESET; // PLOT_MODE_INVERT is also supported
screen2_plot(128,96);
screen2_plot_mode = PLOT_MODE_SET;
// draws a diagonal line
screen2_line(0,0,255,191);
// writes a character from the embedded FONT
byte col = FB_BG(COLOR_DARK_RED,COLOR_LIGH_YELLOW);
screen2_putc('A', 31, 23, col);
// writes a string
screen2_puts("HELLO", 16, 12, col);
// note: screen2_putc() and screen2_puts() are fast but they
// can only print characters aligned within the 8x8 grid
```
### Working with VRAM directly
Some example code:
```c
// writes the value 42 at VRAM location 8000
tms_set_vram_write_addr(8000);
TMS_WRITE_DATA_PORT(42);
// and re-reads it
tms_set_vram_read_addr(8000);
byte val = TMS_READ_DATA_PORT;
```
When using the default values that came with `SCREEN1_TABLE[]` and `SCREEN2_TABLE[]`,
VRAM is organized according the following memory map:
```c
// ZONE RANGE NAME YOU CAN USE IN C
// ===========================================================
// pattern table $0000-$17FF TMS_PATTERN_TABLE
// sprite patterns $1800-$19FF TMS_SPRITE_PATTERNS
// color table $2000-$27FF TMS_COLOR_TABLE
// name table $3800-$3AFF TMS_NAME_TABLE
// sprite attributes $3B00-$3BFF TMS_SPRITE_ATTRS
// example: writes the bitmap value 10101010 on row 3 of pattern 4
tms_set_vram_write_addr(TMS_PATTERN_TABLE+4*8+3);
TMS_WRITE_DATA_PORT(0b10101010);
```
### Working on a more low-level
#### Setting the TMS9918 registers
```c
// you can set a TMS9918 register directly with:
tms_write_reg(7, 0x1F);
// which also saves the written value to a buffer
// because the TMS does not allow to read from
// its registers (they are write-only)
byte oldvalue = tms_regs_latch[7];
```
#### Working directly with the I/O chip interface
If you want to program the VDP directly you can use the following utility functions:
```c
TMS_WRITE_CTRL_PORT(value); // writes a byte to the control port ($CC01)
TMS_WRITE_DATA_PORT(value); // writes a byte to the data port ($CC00)
byte value = TMS_READ_CTRL_PORT; // reads the status register ($CC01)
byte value = TMS_READ_DATA_PORT; // reads a byte from the data port ($CC00)
```
### Miscellaneous functions
```
tms_wait_end_of_frame(); // waits the end of video frame, for timimng or sync video updates
tms_set_blank(1); // turns on video blanking (0 restores normal view)
tms_set_external_video(1); // turns on/off external video input
tms_set_interrupt_bit(1); // enable end of frame interrupts generation
(TODO: interrupt functions)
```
### Apple-1 utility functions
There are also utility functions to interact with the Apple-1
screen and keyboard:
```c
// prints hex "F3" on the Apple-1 screen
woz_print_hex(0xF3)
// prints "A" on the Apple-1 screen
woz_putc('A');
// prints "HELLO" on the Apple-1 screen
woz_puts("HELLO");
// gets a key from the keyboard (waits for it)
byte k = apple1_getkey();
// non blocking keyboard read: do something until RETURN is hit
while(1) {
if(apple1_iskeypressed()) {
if(apple1_readkey()==0x0d) break;
}
else do_something_else();
}
```
### Building the source code
To link the library, simply `#include` the `tms9918.h` file
in your C sources. The recommended way is to add the KickC
command line switch `-includedir=thisrepo/lib` to your
build script and then include the file with `#include <tms9918.h>`.
The the `tools/` directory contains a simple `build.bat` script
example (for Windows) that you can customize to your needs.
### Setting a machine target
There are three configurations you can target with
the switches `-t target -targetdir thisrepo/kickc`
of the KickC compiler:
- `apple1`
- `apple1_jukebox`
- `vic20`
#### Target "apple1"
With this target, the compiled program will start at `$0280` in
the free RAM of the Apple-1 (please make sure you have enough RAM).
(TODO: add reference to `hexdump.js`)
#### Target "apple1_jukebox"
This target is for expansion cards that provide a ROM storage in
the range `$4000`-`$7FFF`, as:
- the "CodeTank" EEPROM daughterboard of the "Apple-1 Graphic Card"
- "Juke-Box Card" FLASH
In this target configuration, the program is split into two segments:
- the `Code` that resides in ROM at `$4000`
- the `Data` that resides in RAM at `$0280`
The split is required because the program needs to write on the `Data` segment (e.g. when changing the value of a variable).
The only issue is that the "Data" segment needs to be initialized
with the correct startup values (for example, the value that
a global `int` variable takes before it's used).
The "Data" initialization needs to be done manually in the C program
by explicitly calling `apple1_eprom_init()` in `main()`. The function
will copy the ROM portion $7582-$7FFF into the "Data" segment at $0280-$0FFF.
The initialization values in the ROM range $7582-$7FFF are generated with
the build script `mkeprom.js` which creates a fixed-length 16K binary file
to be put on the EEPROM/FLASH.
Below is a recap of the memory map for this target:
$0000-$00FF zero page: holds some C program variables
$0280-$0FFF RAM: C program "Data" segment
$4000-$7581 ROM: C program "Code" segment
$7582-$7FFF ROM: C program "Data" segment (startup values)
#### Target "vic20"
This target has been used during the development of the library
where a custom made VIC-20 emulator was interfaced with
an emulated TMS9918, thus allowing running tests when
the real Apple-1 machine was not available.

View File

@ -1,28 +0,0 @@
#pragma zp_reserve(0,1,2)
volatile word tick_counts;
__interrupt(hardware_all) void interrupt_handler() {
tick_counts++;
}
void install_interrupt() {
*((word *)0x0001) = (word) &interrupt_handler;
}
void main() {
// make some use of "tick_counts"
*((word *)0x0001) = tick_counts;
install_interrupt();
}
/*
const byte *VDP_DATA = 0xA000; // TMS9918 data port (VRAM)
#define TMS_READ_DATA (*VDP_DATA);
void main() {
byte x = TMS_READ_DATA();
*((byte *)0xFFFF) = x;
}
*/

View File

@ -1,4 +0,0 @@
cl65 -D APPLE1 --target none --start-addr $4000 -O test.c -o test_apple1.prg
cl65 --listing test.lst -D VIC20 --target vic20 -O test.c -o test_vic20.prg

View File

@ -1,262 +0,0 @@
// modified CC65 charmap to allow pure ASCII on VIC20
#pragma warn (remap-zero, push, off)
#pragma charmap (0x00, 0x00)
#pragma charmap (0x01, 0x01)
#pragma charmap (0x02, 0x02)
#pragma charmap (0x03, 0x03)
#pragma charmap (0x04, 0x04)
#pragma charmap (0x05, 0x05)
#pragma charmap (0x06, 0x06)
#pragma charmap (0x07, 0x07)
#pragma charmap (0x08, 0x08)
#pragma charmap (0x09, 0x09)
#pragma charmap (0x0A, 0x0A)
#pragma charmap (0x0B, 0x0B)
#pragma charmap (0x0C, 0x0C)
#pragma charmap (0x0D, 0x0D)
#pragma charmap (0x0E, 0x0E)
#pragma charmap (0x0F, 0x0F)
#pragma charmap (0x10, 0x10)
#pragma charmap (0x11, 0x11)
#pragma charmap (0x12, 0x12)
#pragma charmap (0x13, 0x13)
#pragma charmap (0x14, 0x14)
#pragma charmap (0x15, 0x15)
#pragma charmap (0x16, 0x16)
#pragma charmap (0x17, 0x17)
#pragma charmap (0x18, 0x18)
#pragma charmap (0x19, 0x19)
#pragma charmap (0x1A, 0x1A)
#pragma charmap (0x1B, 0x1B)
#pragma charmap (0x1C, 0x1C)
#pragma charmap (0x1D, 0x1D)
#pragma charmap (0x1E, 0x1E)
#pragma charmap (0x1F, 0x1F)
#pragma charmap (0x20, 0x20)
#pragma charmap (0x21, 0x21)
#pragma charmap (0x22, 0x22)
#pragma charmap (0x23, 0x23)
#pragma charmap (0x24, 0x24)
#pragma charmap (0x25, 0x25)
#pragma charmap (0x26, 0x26)
#pragma charmap (0x27, 0x27)
#pragma charmap (0x28, 0x28)
#pragma charmap (0x29, 0x29)
#pragma charmap (0x2A, 0x2A)
#pragma charmap (0x2B, 0x2B)
#pragma charmap (0x2C, 0x2C)
#pragma charmap (0x2D, 0x2D)
#pragma charmap (0x2E, 0x2E)
#pragma charmap (0x2F, 0x2F)
#pragma charmap (0x30, 0x30)
#pragma charmap (0x31, 0x31)
#pragma charmap (0x32, 0x32)
#pragma charmap (0x33, 0x33)
#pragma charmap (0x34, 0x34)
#pragma charmap (0x35, 0x35)
#pragma charmap (0x36, 0x36)
#pragma charmap (0x37, 0x37)
#pragma charmap (0x38, 0x38)
#pragma charmap (0x39, 0x39)
#pragma charmap (0x3A, 0x3A)
#pragma charmap (0x3B, 0x3B)
#pragma charmap (0x3C, 0x3C)
#pragma charmap (0x3D, 0x3D)
#pragma charmap (0x3E, 0x3E)
#pragma charmap (0x3F, 0x3F)
#pragma charmap (0x40, 0x40)
#pragma charmap (0x41, 0x41)
#pragma charmap (0x42, 0x42)
#pragma charmap (0x43, 0x43)
#pragma charmap (0x44, 0x44)
#pragma charmap (0x45, 0x45)
#pragma charmap (0x46, 0x46)
#pragma charmap (0x47, 0x47)
#pragma charmap (0x48, 0x48)
#pragma charmap (0x49, 0x49)
#pragma charmap (0x4A, 0x4A)
#pragma charmap (0x4B, 0x4B)
#pragma charmap (0x4C, 0x4C)
#pragma charmap (0x4D, 0x4D)
#pragma charmap (0x4E, 0x4E)
#pragma charmap (0x4F, 0x4F)
#pragma charmap (0x50, 0x50)
#pragma charmap (0x51, 0x51)
#pragma charmap (0x52, 0x52)
#pragma charmap (0x53, 0x53)
#pragma charmap (0x54, 0x54)
#pragma charmap (0x55, 0x55)
#pragma charmap (0x56, 0x56)
#pragma charmap (0x57, 0x57)
#pragma charmap (0x58, 0x58)
#pragma charmap (0x59, 0x59)
#pragma charmap (0x5A, 0x5A)
#pragma charmap (0x5B, 0x5B)
#pragma charmap (0x5C, 0x5C)
#pragma charmap (0x5D, 0x5D)
#pragma charmap (0x5E, 0x5E)
#pragma charmap (0x5F, 0x5F)
#pragma charmap (0x60, 0x60)
#pragma charmap (0x61, 0x61)
#pragma charmap (0x62, 0x62)
#pragma charmap (0x63, 0x63)
#pragma charmap (0x64, 0x64)
#pragma charmap (0x65, 0x65)
#pragma charmap (0x66, 0x66)
#pragma charmap (0x67, 0x67)
#pragma charmap (0x68, 0x68)
#pragma charmap (0x69, 0x69)
#pragma charmap (0x6A, 0x6A)
#pragma charmap (0x6B, 0x6B)
#pragma charmap (0x6C, 0x6C)
#pragma charmap (0x6D, 0x6D)
#pragma charmap (0x6E, 0x6E)
#pragma charmap (0x6F, 0x6F)
#pragma charmap (0x70, 0x70)
#pragma charmap (0x71, 0x71)
#pragma charmap (0x72, 0x72)
#pragma charmap (0x73, 0x73)
#pragma charmap (0x74, 0x74)
#pragma charmap (0x75, 0x75)
#pragma charmap (0x76, 0x76)
#pragma charmap (0x77, 0x77)
#pragma charmap (0x78, 0x78)
#pragma charmap (0x79, 0x79)
#pragma charmap (0x7A, 0x7A)
#pragma charmap (0x7B, 0x7B)
#pragma charmap (0x7C, 0x7C)
#pragma charmap (0x7D, 0x7D)
#pragma charmap (0x7E, 0x7E)
#pragma charmap (0x7F, 0x7F)
#pragma charmap (0x80, 0x80)
#pragma charmap (0x81, 0x81)
#pragma charmap (0x82, 0x82)
#pragma charmap (0x83, 0x83)
#pragma charmap (0x84, 0x84)
#pragma charmap (0x85, 0x85)
#pragma charmap (0x86, 0x86)
#pragma charmap (0x87, 0x87)
#pragma charmap (0x88, 0x88)
#pragma charmap (0x89, 0x89)
#pragma charmap (0x8A, 0x8A)
#pragma charmap (0x8B, 0x8B)
#pragma charmap (0x8C, 0x8C)
#pragma charmap (0x8D, 0x8D)
#pragma charmap (0x8E, 0x8E)
#pragma charmap (0x8F, 0x8F)
#pragma charmap (0x90, 0x90)
#pragma charmap (0x91, 0x91)
#pragma charmap (0x92, 0x92)
#pragma charmap (0x93, 0x93)
#pragma charmap (0x94, 0x94)
#pragma charmap (0x95, 0x95)
#pragma charmap (0x96, 0x96)
#pragma charmap (0x97, 0x97)
#pragma charmap (0x98, 0x98)
#pragma charmap (0x99, 0x99)
#pragma charmap (0x9A, 0x9A)
#pragma charmap (0x9B, 0x9B)
#pragma charmap (0x9C, 0x9C)
#pragma charmap (0x9D, 0x9D)
#pragma charmap (0x9E, 0x9E)
#pragma charmap (0x9F, 0x9F)
#pragma charmap (0xA0, 0xA0)
#pragma charmap (0xA1, 0xA1)
#pragma charmap (0xA2, 0xA2)
#pragma charmap (0xA3, 0xA3)
#pragma charmap (0xA4, 0xA4)
#pragma charmap (0xA5, 0xA5)
#pragma charmap (0xA6, 0xA6)
#pragma charmap (0xA7, 0xA7)
#pragma charmap (0xA8, 0xA8)
#pragma charmap (0xA9, 0xA9)
#pragma charmap (0xAA, 0xAA)
#pragma charmap (0xAB, 0xAB)
#pragma charmap (0xAC, 0xAC)
#pragma charmap (0xAD, 0xAD)
#pragma charmap (0xAE, 0xAE)
#pragma charmap (0xAF, 0xAF)
#pragma charmap (0xB0, 0xB0)
#pragma charmap (0xB1, 0xB1)
#pragma charmap (0xB2, 0xB2)
#pragma charmap (0xB3, 0xB3)
#pragma charmap (0xB4, 0xB4)
#pragma charmap (0xB5, 0xB5)
#pragma charmap (0xB6, 0xB6)
#pragma charmap (0xB7, 0xB7)
#pragma charmap (0xB8, 0xB8)
#pragma charmap (0xB9, 0xB9)
#pragma charmap (0xBA, 0xBA)
#pragma charmap (0xBB, 0xBB)
#pragma charmap (0xBC, 0xBC)
#pragma charmap (0xBD, 0xBD)
#pragma charmap (0xBE, 0xBE)
#pragma charmap (0xBF, 0xBF)
#pragma charmap (0xC0, 0xC0)
#pragma charmap (0xC1, 0xC1)
#pragma charmap (0xC2, 0xC2)
#pragma charmap (0xC3, 0xC3)
#pragma charmap (0xC4, 0xC4)
#pragma charmap (0xC5, 0xC5)
#pragma charmap (0xC6, 0xC6)
#pragma charmap (0xC7, 0xC7)
#pragma charmap (0xC8, 0xC8)
#pragma charmap (0xC9, 0xC9)
#pragma charmap (0xCA, 0xCA)
#pragma charmap (0xCB, 0xCB)
#pragma charmap (0xCC, 0xCC)
#pragma charmap (0xCD, 0xCD)
#pragma charmap (0xCE, 0xCE)
#pragma charmap (0xCF, 0xCF)
#pragma charmap (0xD0, 0xD0)
#pragma charmap (0xD1, 0xD1)
#pragma charmap (0xD2, 0xD2)
#pragma charmap (0xD3, 0xD3)
#pragma charmap (0xD4, 0xD4)
#pragma charmap (0xD5, 0xD5)
#pragma charmap (0xD6, 0xD6)
#pragma charmap (0xD7, 0xD7)
#pragma charmap (0xD8, 0xD8)
#pragma charmap (0xD9, 0xD9)
#pragma charmap (0xDA, 0xDA)
#pragma charmap (0xDB, 0xDB)
#pragma charmap (0xDC, 0xDC)
#pragma charmap (0xDD, 0xDD)
#pragma charmap (0xDE, 0xDE)
#pragma charmap (0xDF, 0xDF)
#pragma charmap (0xE0, 0xE0)
#pragma charmap (0xE1, 0xE1)
#pragma charmap (0xE2, 0xE2)
#pragma charmap (0xE3, 0xE3)
#pragma charmap (0xE4, 0xE4)
#pragma charmap (0xE5, 0xE5)
#pragma charmap (0xE6, 0xE6)
#pragma charmap (0xE7, 0xE7)
#pragma charmap (0xE8, 0xE8)
#pragma charmap (0xE9, 0xE9)
#pragma charmap (0xEA, 0xEA)
#pragma charmap (0xEB, 0xEB)
#pragma charmap (0xEC, 0xEC)
#pragma charmap (0xED, 0xED)
#pragma charmap (0xEE, 0xEE)
#pragma charmap (0xEF, 0xEF)
#pragma charmap (0xF0, 0xF0)
#pragma charmap (0xF1, 0xF1)
#pragma charmap (0xF2, 0xF2)
#pragma charmap (0xF3, 0xF3)
#pragma charmap (0xF4, 0xF4)
#pragma charmap (0xF5, 0xF5)
#pragma charmap (0xF6, 0xF6)
#pragma charmap (0xF7, 0xF7)
#pragma charmap (0xF8, 0xF8)
#pragma charmap (0xF9, 0xF9)
#pragma charmap (0xFA, 0xFA)
#pragma charmap (0xFB, 0xFB)
#pragma charmap (0xFC, 0xFC)
#pragma charmap (0xFD, 0xFD)
#pragma charmap (0xFE, 0xFE)
#pragma charmap (0xFF, 0xFF)
#pragma warn (remap-zero, pop)

View File

@ -1 +0,0 @@
PATH %PATH%;C:\Programmi\cc65-snapshot-win32\bin

View File

@ -1,856 +0,0 @@
byte FONT[768] = {
0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 8
, 8
, 8
, 8
, 8
, 0
, 8
, 0
, 20
, 20
, 20
, 0
, 0
, 0
, 0
, 0
, 20
, 20
, 62
, 20
, 62
, 20
, 20
, 0
, 8
, 30
, 40
, 28
, 10
, 60
, 8
, 0
, 48
, 50
, 4
, 8
, 16
, 38
, 6
, 0
, 16
, 40
, 40
, 16
, 42
, 36
, 26
, 0
, 8
, 8
, 8
, 0
, 0
, 0
, 0
, 0
, 8
, 16
, 32
, 32
, 32
, 16
, 8
, 0
, 8
, 4
, 2
, 2
, 2
, 4
, 8
, 0
, 8
, 42
, 28
, 8
, 28
, 42
, 8
, 0
, 0
, 8
, 8
, 62
, 8
, 8
, 0
, 0
, 0
, 0
, 0
, 0
, 8
, 8
, 16
, 0
, 0
, 0
, 0
, 62
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 8
, 0
, 0
, 2
, 4
, 8
, 16
, 32
, 0
, 0
, 28
, 34
, 38
, 42
, 50
, 34
, 28
, 0
, 8
, 24
, 8
, 8
, 8
, 8
, 28
, 0
, 28
, 34
, 2
, 12
, 16
, 32
, 62
, 0
, 62
, 2
, 4
, 12
, 2
, 34
, 28
, 0
, 4
, 12
, 20
, 36
, 62
, 4
, 4
, 0
, 62
, 32
, 60
, 2
, 2
, 34
, 28
, 0
, 14
, 16
, 32
, 60
, 34
, 34
, 28
, 0
, 62
, 2
, 4
, 8
, 16
, 32
, 32
, 0
, 28
, 34
, 34
, 28
, 34
, 34
, 28
, 0
, 28
, 34
, 34
, 30
, 2
, 4
, 56
, 0
, 0
, 0
, 8
, 0
, 8
, 0
, 0
, 0
, 0
, 0
, 8
, 0
, 8
, 8
, 16
, 0
, 4
, 8
, 16
, 32
, 16
, 8
, 4
, 0
, 0
, 0
, 62
, 0
, 62
, 0
, 0
, 0
, 16
, 8
, 4
, 2
, 4
, 8
, 16
, 0
, 28
, 34
, 4
, 8
, 8
, 0
, 8
, 0
, 28
, 34
, 42
, 46
, 44
, 32
, 28
, 0
, 8
, 20
, 34
, 34
, 62
, 34
, 34
, 0
, 60
, 34
, 34
, 60
, 34
, 34
, 60
, 0
, 28
, 34
, 32
, 32
, 32
, 34
, 28
, 0
, 56
, 36
, 34
, 34
, 34
, 36
, 56
, 0
, 62
, 32
, 32
, 56
, 32
, 32
, 62
, 0
, 62
, 32
, 32
, 56
, 32
, 32
, 32
, 0
, 30
, 32
, 32
, 32
, 38
, 34
, 30
, 0
, 34
, 34
, 34
, 62
, 34
, 34
, 34
, 0
, 28
, 8
, 8
, 8
, 8
, 8
, 28
, 0
, 2
, 2
, 2
, 2
, 2
, 34
, 28
, 0
, 34
, 36
, 40
, 48
, 40
, 36
, 34
, 0
, 32
, 32
, 32
, 32
, 32
, 32
, 62
, 0
, 34
, 54
, 42
, 42
, 34
, 34
, 34
, 0
, 34
, 34
, 50
, 42
, 38
, 34
, 34
, 0
, 28
, 34
, 34
, 34
, 34
, 34
, 28
, 0
, 60
, 34
, 34
, 60
, 32
, 32
, 32
, 0
, 28
, 34
, 34
, 34
, 42
, 36
, 26
, 0
, 60
, 34
, 34
, 60
, 40
, 36
, 34
, 0
, 28
, 34
, 32
, 28
, 2
, 34
, 28
, 0
, 62
, 8
, 8
, 8
, 8
, 8
, 8
, 0
, 34
, 34
, 34
, 34
, 34
, 34
, 28
, 0
, 34
, 34
, 34
, 34
, 34
, 20
, 8
, 0
, 34
, 34
, 34
, 42
, 42
, 54
, 34
, 0
, 34
, 34
, 20
, 8
, 20
, 34
, 34
, 0
, 34
, 34
, 20
, 8
, 8
, 8
, 8
, 0
, 62
, 2
, 4
, 8
, 16
, 32
, 62
, 0
, 62
, 48
, 48
, 48
, 48
, 48
, 62
, 0
, 0
, 32
, 16
, 8
, 4
, 2
, 0
, 0
, 62
, 6
, 6
, 6
, 6
, 6
, 62
, 0
, 8
, 20
, 34
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 62
, 16
, 8
, 4
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 28
, 2
, 30
, 34
, 30
, 0
, 32
, 32
, 60
, 34
, 34
, 34
, 60
, 0
, 0
, 0
, 30
, 32
, 32
, 32
, 30
, 0
, 2
, 2
, 30
, 34
, 34
, 34
, 30
, 0
, 0
, 0
, 28
, 34
, 62
, 32
, 30
, 0
, 12
, 18
, 16
, 60
, 16
, 16
, 16
, 0
, 0
, 0
, 28
, 34
, 34
, 30
, 2
, 28
, 32
, 32
, 60
, 34
, 34
, 34
, 34
, 0
, 8
, 0
, 24
, 8
, 8
, 8
, 28
, 0
, 2
, 0
, 6
, 2
, 2
, 2
, 18
, 12
, 32
, 32
, 34
, 36
, 56
, 36
, 34
, 0
, 24
, 8
, 8
, 8
, 8
, 8
, 28
, 0
, 0
, 0
, 52
, 42
, 42
, 42
, 34
, 0
, 0
, 0
, 60
, 34
, 34
, 34
, 34
, 0
, 0
, 0
, 28
, 34
, 34
, 34
, 28
, 0
, 0
, 0
, 60
, 34
, 34
, 60
, 32
, 32
, 0
, 0
, 30
, 34
, 34
, 30
, 2
, 2
, 0
, 0
, 46
, 48
, 32
, 32
, 32
, 0
, 0
, 0
, 30
, 32
, 28
, 2
, 60
, 0
, 16
, 16
, 60
, 16
, 16
, 18
, 12
, 0
, 0
, 0
, 34
, 34
, 34
, 38
, 26
, 0
, 0
, 0
, 34
, 34
, 34
, 20
, 8
, 0
, 0
, 0
, 34
, 34
, 42
, 42
, 20
, 0
, 0
, 0
, 34
, 20
, 8
, 20
, 34
, 0
, 0
, 0
, 34
, 36
, 20
, 24
, 8
, 48
, 0
, 0
, 62
, 4
, 8
, 16
, 62
, 0
, 6
, 8
, 8
, 48
, 8
, 8
, 6
, 0
, 8
, 8
, 8
, 8
, 8
, 8
, 8
, 8
, 48
, 8
, 8
, 6
, 8
, 8
, 48
, 0
, 26
, 44
, 0
, 0
, 0
, 0
, 0
, 0
};

View File

@ -1,104 +0,0 @@
// SCREEN 1 VALUES
// sprite patterns: $0000
// pattern table: $0800 (256*8)
// sprite attributes: $1000
// unused: $1080
// name table: $1400 (32*24)
// unused: $1800
// color table: $2000 (32)
// unused $2020-$3FFF
#define SCREEN1_PATTERN_TABLE 0x0800
#define SCREEN1_NAME_TABLE 0x1400
#define SCREEN1_COLOR_TABLE 0x2000
#define SCREEN1_SPRITE_PATTERNS 0x0000
#define SCREEN1_SPRITE_ATTRS 0x1000
#define SCREEN1_SIZE (32*24)
byte SCREEN1_TABLE[8] = {
0x00, 0xc0, 0x05, 0x80, 0x01, 0x20, 0x00, 0x25
};
// loads the Laser 500 font on the pattern table
void SCREEN1_LOAD_FONT() {
static byte *source = FONT;
static word i;
// start writing into VRAM from "space" character
set_vram_addr(SCREEN1_PATTERN_TABLE+(32*8));
for(i=0;i<768;i++) {
POKE(VDP_DATA, *source);
source++;
}
source = FONT;
set_vram_addr(SCREEN1_PATTERN_TABLE+((128+32)*8));
for(i=0;i<768;i++) {
POKE(VDP_DATA, ~(*source));
source++;
}
// TODO: inverted characters ?
}
// prints character to TMS (SCREEN 1 MODE)
void fastcall SCREEN1_PUTCHAR(byte c) {
set_vram_addr(tms_cursor);
POKE(VDP_DATA, c);
tms_cursor++;
}
// prints 0 terminated string pointed by YA
void SCREEN1_PUTS(char *s) {
byte c;
while(1) {
c = *s;
// c = *s & 127; // TODO: explain why???
if(c==0) return;
SCREEN1_PUTCHAR(c);
s++;
}
}
void SCREEN1_HOME() {
tms_cursor = SCREEN1_NAME_TABLE;
}
void SCREEN1_LOCATEXY(byte x, byte y) {
tms_cursor = SCREEN1_NAME_TABLE + ((word)y)*32 + x;
}
void SCREEN1_INIT() {
static byte i;
for(i=0;i<8;i++) {
write_reg(i, SCREEN1_TABLE[i]);
}
}
void SCREEN1_FILL() {
static word i;
// fills name table with spaces (32)
set_vram_addr(SCREEN1_NAME_TABLE);
for(i=0;i<SCREEN1_SIZE;i++) {
POKE(VDP_DATA, 32);
// nops here?
}
// fill pattern table with 0
set_vram_addr(SCREEN1_PATTERN_TABLE);
for(i=0;i<256*8;i++) {
POKE(VDP_DATA, 0);
// nops here?
}
// fill color table with $1F
set_vram_addr(SCREEN1_COLOR_TABLE);
for(i=0;i<32;i++) {
POKE(VDP_DATA, 0x1f);
// nops here?
}
}

View File

@ -1,115 +0,0 @@
// SCREEN 2 VALUES
// pattern table: $0000-$17FF (256*8*3)
// sprite patterns: $1800-$19FF
// color table: $2000-$27FF (256*8*3)
// name table: $3800-$3AFF (32*24 = 256*3 = 768)
// sprite attributes: $3B00-$3BFF
// unused $3C00-$3FFF
//
#define SCREEN2_PATTERN_TABLE 0x0000
#define SCREEN2_NAME_TABLE 0x3800
#define SCREEN2_COLOR_TABLE 0x2000
#define SCREEN2_SPRITE_PATTERNS 0x1800
#define SCREEN2_SPRITE_ATTRS 0x3b00
#define SCREEN2_SIZE (32*24)
byte SCREEN2_TABLE[8] = {
0x02, 0xc0, 0x0e, 0xff, 0x03, 0x76, 0x03, 0x25
};
void SCREEN2_INIT() {
static byte i;
for(i=0;i<8;i++) {
write_reg(i, SCREEN2_TABLE[i]);
}
}
void SCREEN2_FILL() {
static word i;
// fills name table x3 with increasing numbers
set_vram_addr(SCREEN2_NAME_TABLE);
for(i=0;i<SCREEN2_SIZE;i++) {
POKE(VDP_DATA, i & 0xFF);
}
// fill pattern table with 0 (clear screen)
set_vram_addr(SCREEN2_PATTERN_TABLE);
for(i=0;i<768*8;i++) {
POKE(VDP_DATA, 0);
}
// fill color table with $1F
set_vram_addr(SCREEN2_COLOR_TABLE);
for(i=0;i<768*8;i++) {
POKE(VDP_DATA, 0x1f);
}
}
void SCREEN2_PUTC(byte ch, byte x, byte y, byte col) {
byte *source = &FONT[(ch-32)*8];
byte i;
word paddr = SCREEN2_PATTERN_TABLE + x*8 + y*256;
word caddr = SCREEN2_COLOR_TABLE + x*8 + y*256;
set_vram_addr(paddr); for(i=0;i<8;i++) POKE(VDP_DATA, source[i]);
set_vram_addr(caddr); for(i=0;i<8;i++) POKE(VDP_DATA, col);
}
void SCREEN2_PUTS(byte x, byte y, byte col, char *s) {
while(*s) {
SCREEN2_PUTC(*s++, x++, y, col);
}
}
void SCREEN2_PSET(byte x, byte y) {
word paddr = SCREEN2_PATTERN_TABLE + (x & 0b11111000) + (y & 0b11111000)*32 + y%8;
byte pattern = 128 >> (x%8);
byte data;
set_vram_read_addr(paddr);
data = PEEK(VDP_DATA);
set_vram_addr(paddr);
POKE(VDP_DATA,data | pattern);
}
// int vti_abs(int x) {
// return x < 0 ? -x : x;
// }
//
// // http://members.chello.at/~easyfilter/bresenham.html
// void vti_ellipse_rect(int x0, int y0, int x1, int y1)
// {
// long a,b,b1,dx,dy,e2,err;
//
// a = vti_abs(x1-x0);
// b = vti_abs(y1-y0);
// b1 = b&1; /* values of diameter */
// dx = 4*(1-a)*b*b;
// dy = 4*(b1+1)*a*a; /* error increment */
// err = dx+dy+b1*a*a; /* error of 1.step */
//
// if (x0 > x1) { x0 = x1; x1 += a; } /* if called with swapped points */
// if (y0 > y1) y0 = y1; /* .. exchange them */
// y0 += (b+1)/2; y1 = y0-b1; /* starting pixel */
// a *= 8*a; b1 = 8*b*b;
//
// do {
// SCREEN2_PSET(x1, y0); /* I. Quadrant */
// SCREEN2_PSET(x0, y0); /* II. Quadrant */
// SCREEN2_PSET(x0, y1); /* III. Quadrant */
// SCREEN2_PSET(x1, y1); /* IV. Quadrant */
// e2 = 2*err;
// if (e2 <= dy) { y0++; y1--; err += dy += a; } /* y step */
// if (e2 >= dx || 2*err > dy) { x0++; x1--; err += dx += b1; } /* x step */
// } while (x0 <= x1);
//
// while (y0-y1 < b) { /* too early stop of flat ellipses a=1 */
// SCREEN2_PSET(x0-1, y0); /* -> finish tip of ellipse */
// SCREEN2_PSET(x1+1, y0++);
// SCREEN2_PSET(x0-1, y1);
// SCREEN2_PSET(x1+1, y1--);
// }
// }

View File

@ -1,157 +0,0 @@
#ifdef APPLE1
#define WOZMON 0xFF1F // enters monitor
#define ECHO 0xFFEF // output ascii character in A (A not destroyed)
#define PRBYTE 0xFFDC // print hex byte in A (A destroyed)
#define VDP_DATA 0xC000 // TMS9918 data port (VRAM)
#define VDP_REG 0xC001 // TMS9918 register port (write) or status (read)
#endif
#ifdef VIC20
#define ECHO 0xFFD2 // chrout routine in kernal rom
#define VDP_DATA 0xA000 // TMS9918 data port (VRAM)
#define VDP_REG 0xA001 // TMS9918 register port (write) or status (read)
#include "cbm_ascii_charmap.h" // allow VIC-20 to work with pure ASCII
#endif
// TMS9918 interface flags
#define WRITE_TO_REG 0b10000000
#define WRITE_TO_VRAM 0b01000000
#define READ_FROM_VRAM 0b00000000
// utils
typedef unsigned char byte;
typedef unsigned int word;
#define POKE(a,b) (*((byte *)(a))=(byte)(b))
#define PEEK(a) (*((byte *)(a)))
// puts a character on the apple1 screen using the WOZMON routine
void fastcall woz_putc(byte c) {
asm("jsr %w", ECHO);
}
// returns to WOZMON prompt
void woz_mon() {
#ifdef APPLE1
asm("jmp %w", WOZMON);
#endif
}
// sets the VRAM address on the TMS9918
void fastcall set_vram_addr(word addr) {
asm("sta %w", VDP_REG); // write address low byte
// nops here ?
asm("txa"); // X = addres high byte
asm("and #%b", 0b00111111); // mask address high byte
asm("ora #%b", WRITE_TO_VRAM); // set "write to vram" flag bits "01" upper bits ("00" for read)
asm("sta %w", VDP_REG); // write flags and address high byte
// nops here ?
}
// sets the VRAM address on the TMS9918
void fastcall set_vram_read_addr(word addr) {
asm("sta %w", VDP_REG); // write address low byte
// nops here ?
asm("txa"); // X = addres high byte
asm("and #%b", 0b00111111); // mask address high byte
asm("ora #%b", READ_FROM_VRAM); // set "write to vram" flag bits "01" upper bits ("00" for read)
asm("sta %w", VDP_REG); // write flags and address high byte
// nops here ?
}
// writes a value to a TMS9918 register (0-7)
void write_reg(byte regnum, byte val) {
// nops are not required
POKE(VDP_REG, val);
POKE(VDP_REG, (regnum & 0b00001111)|WRITE_TO_REG);
}
static word tms_cursor;
#include "laser500_font.ascii.c"
#include "screen1.c"
#include "screen2.c"
void screen1_square_sprites() {
static byte i;
// fills first sprite pattern with 255
set_vram_addr(SCREEN1_SPRITE_PATTERNS); // start writing in the sprite patterns
for(i=0;i<8;i++) {
POKE(VDP_DATA, 255);
}
// set sprite coordinates
set_vram_addr(SCREEN1_SPRITE_ATTRS); // start writing in the sprite attribute
for(i=0;i<32;i++) {
POKE(VDP_DATA,(6+i)*8); // y coordinate
POKE(VDP_DATA,(6+i)*8); // x coordinate
POKE(VDP_DATA,0); // name
POKE(VDP_DATA,i); // color
}
}
void screen2_square_sprites() {
static byte i;
// fills first sprite pattern with 255
set_vram_addr(SCREEN2_SPRITE_PATTERNS); // start writing in the sprite patterns
for(i=0;i<8;i++) {
POKE(VDP_DATA, 0);
}
// set sprite coordinates
set_vram_addr(SCREEN2_SPRITE_ATTRS); // start writing in the sprite attribute
for(i=0;i<32;i++) {
POKE(VDP_DATA,0); // y coordinate
POKE(VDP_DATA,0); // x coordinate
POKE(VDP_DATA,0); // name
POKE(VDP_DATA,i); // color
}
}
void main() {
word i;
if(0) {
SCREEN1_INIT();
SCREEN1_FILL();
SCREEN1_LOAD_FONT();
SCREEN1_HOME(); SCREEN1_PUTS("*** P-LAB VIDEO CARD SYSTEM ***");
SCREEN1_LOCATEXY(0, 2); SCREEN1_PUTS("16K VRAM BYTES FREE");
SCREEN1_LOCATEXY(0, 4); SCREEN1_PUTS("READY.");
SCREEN1_LOCATEXY(0, 10);
for(i=0;i<256;i++) SCREEN1_PUTCHAR(i);
screen1_square_sprites();
}
if(1) {
SCREEN2_INIT();
SCREEN2_FILL();
screen2_square_sprites();
//SCREEN2_PUTC(65,1,1,0x1F);
SCREEN2_PUTS(0,0,0x1F,"*** P-LAB VIDEO CARD SYSTEM ***");
SCREEN2_PUTS(0,2,0x1F,"16K VRAM BYTES FREE");
SCREEN2_PUTS(0,4,0x1F,"READY.");
for(i=0;i<16;i++) {
SCREEN2_PUTS(5,6+i,((15-i)<<4)+i," COLOR ");
}
for(i=0;i<192;i++) {
SCREEN2_PSET(i,i/2);
SCREEN2_PSET(i,i);
SCREEN2_PSET(i/2,i);
}
}
woz_putc(42);
woz_mon();
}

View File

@ -1,32 +0,0 @@
void screen1_square_sprites() {
// fills first sprite pattern with 255
tms_set_vram_write_addr(SCREEN1_SPRITE_PATTERNS); // start writing in the sprite patterns
for(byte i=0;i<8;i++) {
TMS_WRITE_DATA_PORT(255);
}
// set sprite coordinates
tms_set_vram_write_addr(SCREEN1_SPRITE_ATTRS); // start writing in the sprite attribute
for(byte i=0;i<32;i++) {
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // y coordinate
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // x coordinate
TMS_WRITE_DATA_PORT(0); NOP; NOP; NOP; NOP; // name
TMS_WRITE_DATA_PORT(i); NOP; NOP; NOP; NOP; // color
}
}
void prova_screen1() {
tms_init_regs(SCREEN1_TABLE);
screen1_prepare();
screen1_load_font();
screen1_home(); screen1_puts("*** P-LAB VIDEO CARD SYSTEM ***");
screen1_locate(0, 2); screen1_puts("16K VRAM BYTES FREE");
screen1_locate(0, 4); screen1_puts("READY.");
screen1_locate(0, 10);
for(word i=0;i<256;i++) screen1_putc((byte)i);
screen1_square_sprites();
}

View File

@ -1,32 +0,0 @@
void prova_screen2() {
tms_init_regs(SCREEN2_TABLE);
byte text_color = FG_BG(COLOR_BLACK,COLOR_WHITE);
screen2_init_bitmap(text_color);
screen2_puts(0, 0, text_color, "*** P-LAB VIDEO CARD SYSTEM ***");
screen2_puts(0, 2, text_color, "16K VRAM BYTES FREE");
screen2_puts(0, 4, text_color, "READY.");
// display all colors in the palette
for(byte i=0;i<16;i++) {
screen2_puts(5,(byte)(6+i),(byte)(((15-i)<<4)+i)," SCREEN 2 ");
}
vti_line(18, 45,232,187);
vti_line(18,187,232, 45);
SCREEN2_PLOT_MODE = PLOT_MODE_RESET;
vti_line(18+5, 45,232+5,187);
vti_line(18+5,187,232+5, 45);
SCREEN2_PLOT_MODE = PLOT_MODE_INVERT;
vti_line(18+5+5, 45,232+5+5,187);
vti_line(18+5+5,187,232+5+5, 45);
SCREEN2_PLOT_MODE = PLOT_MODE_SET;
//vti_ellipse_rect(7,9,202,167);
}

View File

@ -1,2 +0,0 @@
@call ..\tools\build demo

View File

@ -1,12 +1,4 @@
// TODO make screen tables parametric (fixed values calculated by macros)
#include "../lib/utils.h"
#include "../lib/apple1.h"
#include "../lib/tms9918.h"
#include "../lib/font8x8.h"
#include "../lib/tms_screen1.h"
#include "../lib/tms_screen2.h"
#include "../lib/interrupt.h"
#include <tms9918.h>
#include "demo_screen1.h"
#include "demo_screen2.h"
@ -14,6 +6,7 @@
#include "demo_interrupt.h"
#include "demo_extvid.h"
#include "demo_blank.h"
#include "demo_end_of_frame.h"
void help() {
woz_puts(
@ -24,6 +17,7 @@ void help() {
"A AMIGA HAND\r"
"I INTERRUPT\r"
"E FLIP EXT VIDEO\r"
"F TEST END-OF-FRAME\r"
"B BLANK ON/OFF\r"
"H HELP\r"
"0 EXITS\r\r"
@ -38,11 +32,12 @@ void main() {
byte key = 'H';
for(;;) {
if(key == '1') prova_screen1();
else if(key == '2') prova_screen2();
if(key == '1') demo_screen1();
else if(key == '2') demo_screen2();
else if(key == 'A') demo_amiga_hand();
else if(key == 'I') demo_interrupt();
else if(key == 'E') flip_external_input();
else if(key == 'F') demo_end_of_frame();
else if(key == 'B') flip_blank();
else if(key == 'H') help();
else if(key == '0') break;

View File

@ -158,12 +158,12 @@ void demo_amiga_hand() {
tms_init_regs(SCREEN2_TABLE);
screen2_init_bitmap(FG_BG(COLOR_BLACK,COLOR_WHITE));
screen2_puts(0, 0, FG_BG(COLOR_BLACK,COLOR_WHITE), "*** P-LAB VIDEO CARD SYSTEM ***");
screen2_puts(0, 2, FG_BG(COLOR_BLACK,COLOR_WHITE), "16K VRAM BYTES FREE");
screen2_puts(0, 4, FG_BG(COLOR_BLACK,COLOR_WHITE), "READY.");
screen2_puts("*** P-LAB VIDEO CARD SYSTEM ***", 0, 0, FG_BG(COLOR_BLACK,COLOR_WHITE));
screen2_puts("16K VRAM BYTES FREE" , 0, 2, FG_BG(COLOR_BLACK,COLOR_WHITE));
screen2_puts("READY." , 0, 4, FG_BG(COLOR_BLACK,COLOR_WHITE));
for(word p=0;p<612;p+=4) {
vti_line(amiga_data[p],amiga_data[p+1],amiga_data[p+2],amiga_data[p+3]);
screen2_line(amiga_data[p],amiga_data[p+1],amiga_data[p+2],amiga_data[p+3]);
}
screen2_puts(18, 12, FG_BG(COLOR_DARK_BLUE, COLOR_WHITE), "APPLE1");
screen2_puts("APPLE1", 18, 12, FG_BG(COLOR_DARK_BLUE, COLOR_WHITE));
}

View File

@ -0,0 +1,26 @@
void demo_end_of_frame() {
tms_init_regs(SCREEN1_TABLE);
screen1_prepare();
screen1_load_font();
screen1_puts(
CLS "\n"
"Waitining for 600 ticks by\n"
"counting the " REVERSE_ON "END-OF-FRAME" REVERSE_OFF " bit.\n\n"
"It will take about 10 seconds.\n\n"
);
word secs = 0;
word ticks = 0;
while(secs<10) {
tms_wait_end_of_frame();
ticks++;
if(ticks==60) {
secs++;
ticks = 0;
screen1_puts("60 ticks!\n");
}
}
screen1_puts("\n\nDONE!");
}

View File

@ -8,7 +8,7 @@ void flip_external_input() {
else woz_puts("EXT INPUT OFF\r");
// fill color table with transparent color so that external input can be seen
tms_set_vram_write_addr(SCREEN1_COLOR_TABLE);
tms_set_vram_write_addr(TMS_COLOR_TABLE);
for(byte i=32;i!=0;i--) {
TMS_WRITE_DATA_PORT(FG_BG(COLOR_DARK_YELLOW, COLOR_TRANSPARENT));
}

50
demos/demo/demo_screen1.h Normal file
View File

@ -0,0 +1,50 @@
#include <string.h>
void screen1_square_sprites() {
// fills first sprite pattern with 255
tms_set_vram_write_addr(TMS_SPRITE_PATTERNS); // start writing in the sprite patterns
for(byte i=0;i<8;i++) {
TMS_WRITE_DATA_PORT(255);
}
// set sprite coordinates
tms_set_vram_write_addr(TMS_SPRITE_ATTRS); // start writing in the sprite attribute
for(byte i=0;i<32;i++) {
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // y coordinate
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // x coordinate
TMS_WRITE_DATA_PORT(0); NOP; NOP; NOP; NOP; // name
TMS_WRITE_DATA_PORT(i); NOP; NOP; NOP; NOP; // color
}
}
byte buffer[32];
void demo_screen1() {
tms_init_regs(SCREEN1_TABLE);
screen1_prepare();
screen1_load_font();
screen1_putc(CHR_CLS);
screen1_puts(
"*** P-LAB VIDEO CARD SYSTEM ***\n"
"16K VRAM BYTES FREE\n\n"
"READY.\n\n\n"
);
screen1_puts("what about " REVERSE_ON " REVERSE text " REVERSE_OFF " ?\n\n\n\n");
for(word i=32;i<128;i++) screen1_putc((byte)i);
screen1_puts("\n\n" REVERSE_ON);
for(word i=32;i<128;i++) screen1_putc((byte)i);
screen1_square_sprites();
while(1) {
screen1_puts(REVERSE_OFF "\n\nWRITE HERE: >");
screen1_strinput(buffer,16);
if(strlen(buffer)==0) break;
screen1_puts("\n\n\nyou wrote: '");
screen1_puts(buffer);
screen1_puts("'");
}
}

32
demos/demo/demo_screen2.h Normal file
View File

@ -0,0 +1,32 @@
void demo_screen2() {
tms_init_regs(SCREEN2_TABLE);
byte text_color = FG_BG(COLOR_BLACK,COLOR_WHITE);
screen2_init_bitmap(text_color);
screen2_puts("*** P-LAB VIDEO CARD SYSTEM ***", 0, 0, text_color);
screen2_puts("16K VRAM BYTES FREE" , 0, 2, text_color);
screen2_puts("READY." , 0, 4, text_color);
// display all colors in the palette
for(byte i=0;i<16;i++) {
screen2_puts(" SCREEN 2 ",5,(byte)(6+i),(byte)(((15-i)<<4)+i));
}
screen2_line(18, 45,232,187);
screen2_line(18,187,232, 45);
screen2_plot_mode = PLOT_MODE_RESET;
screen2_line(18+5, 45,232+5,187);
screen2_line(18+5,187,232+5, 45);
screen2_plot_mode = PLOT_MODE_INVERT;
screen2_line(18+5+5, 45,232+5+5,187);
screen2_line(18+5+5,187,232+5+5, 45);
screen2_plot_mode = PLOT_MODE_SET;
//vti_ellipse_rect(7,9,202,167);
}

2
demos/demo/m.bat Normal file
View File

@ -0,0 +1,2 @@
@call ..\..\tools\build demo

2
demos/picshow/m.bat Normal file
View File

@ -0,0 +1,2 @@
@call ..\..\tools\build picshow

388
demos/picshow/pic_c.h Normal file
View File

@ -0,0 +1,388 @@
// file generated automatically by 'bin2js'. Do not edit
const byte pic_c[] = {
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xd3,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xd3,
0x1e,0xfe,0xfe,0xfe,0x1e,0x1e,0x3e,0xcd,0xfe,0xfe,0xfe,0x1e,0x1e,0x1e,0x3e,0xcd,
0xfe,0xef,0xef,0xfe,0xfe,0x1e,0x1e,0xd3,0xfe,0xfe,0xef,0xef,0xfe,0x1e,0x1e,0x3e,
0xef,0xfe,0xfe,0xef,0xef,0xfe,0x1e,0x1e,0x1f,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,
0x1f,0x1f,0xfe,0x1e,0xfe,0xfe,0x1e,0x1e,0x1f,0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1f,0x1f,0x1f,0xef,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x1f,0xef,0x1e,0x1e,0x1e,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0x1e,0x1e,
0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0xfe,0x1e,0xfe,0xef,0x1f,0x1f,0x1f,0x1f,0xef,0x1e,
0xfe,0xfe,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0x36,0xcd,
0x1e,0xfe,0xfe,0xfe,0x1e,0x1e,0x9e,0xdc,0xde,0xde,0x6e,0xde,0xce,0xde,0xde,0xd3,
0xcd,0xcd,0xcd,0x3d,0x3d,0xcd,0x3d,0x3d,0xcd,0x3d,0x3d,0xcd,0xcd,0x1d,0xc1,0xd1,
0x3d,0x3d,0xcd,0x46,0x41,0x41,0x41,0x41,0x3d,0xcd,0xcd,0xcd,0x41,0x41,0x41,0x41,
0xde,0xce,0xde,0xce,0x6e,0x1e,0xe4,0x31,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0x1e,0x3e,0x1e,0x1e,0x1e,0x1e,
0xde,0xce,0xde,0xd3,0xce,0xde,0xce,0xde,0x16,0x14,0x16,0xd1,0x1d,0x46,0x61,0x1d,
0x3e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xcd,0xec,0xde,0x4e,0x1e,0x1e,0x1e,0x1e,
0xdc,0xcd,0xcd,0x6c,0x11,0x41,0x41,0x11,0xcd,0xcd,0xdc,0xcd,0x41,0x41,0x41,0x41,
0xcd,0xdc,0xdc,0xdc,0x64,0x11,0x41,0x41,0xd3,0xcd,0xd3,0xd3,0xce,0x4f,0x1d,0xc1,
0x3e,0xd3,0xd3,0x3d,0xfe,0xfe,0xed,0x41,0x1e,0x3e,0xd3,0xd3,0xde,0xce,0xde,0x4c,
0x1e,0x3e,0x3e,0xd3,0x3e,0x3e,0x3e,0xde,0x1e,0x1e,0x1e,0x3e,0x1e,0xfe,0x6f,0xcf,
0x1e,0x1e,0x1e,0x3e,0x3e,0x39,0x3d,0xc6,0x1e,0x1e,0x1e,0x1e,0x3e,0x3e,0xcd,0x1d,
0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xcd,0x14,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xd3,0x1d,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xce,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x36,0xcd,
0x1e,0x1e,0x1e,0x1e,0x1e,0x3d,0xcd,0xcd,0xcd,0xcd,0x3d,0x3d,0x3d,0x3d,0xcd,0xcd,
0xcd,0x3d,0xcd,0x3d,0x3d,0x3d,0xcd,0xc6,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0xcd,0x46,
0x3d,0x3d,0x3d,0x1d,0x13,0x1d,0x16,0xc1,0x61,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x61,0x61,0x14,0x61,0x41,0xd1,0x1d,0x1c,0x1d,0x16,
0xd1,0x14,0x41,0x41,0x41,0x41,0x41,0x41,0x1e,0xae,0xce,0x6e,0xce,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xce,0xde,0xce,0xde,0xce,0x5e,0xce,0xde,0x1d,0xd1,0x1d,0x41,0x41,0x41,0x41,0x41,
0x3e,0xd3,0xcd,0xe1,0x1e,0xe1,0xa4,0x1d,0x1e,0xc1,0x41,0x11,0x41,0x11,0x41,0x11,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0xd1,
0x41,0x41,0xd1,0x41,0x16,0x41,0x61,0x14,0x41,0x41,0x61,0x14,0xc1,0x64,0x61,0x14,
0x41,0x61,0x41,0x41,0x61,0x41,0xc1,0x41,0x11,0x11,0x41,0x41,0x41,0x41,0x41,0x41,
0x6e,0xce,0x1e,0x4e,0x1a,0x1d,0xec,0x1d,0xdf,0xce,0xfe,0xfe,0xfe,0xfe,0xfe,0x3e,
0xcd,0xcd,0xcd,0xcd,0x1d,0x36,0xe4,0xe6,0xc4,0x46,0xcd,0x64,0xcd,0x46,0xcd,0x64,
0x14,0x46,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xdc,0xcd,0xcd,0xd3,0xce,0xed,0xca,0xde,
0xda,0xde,0xda,0xce,0xad,0xcd,0xcd,0x46,0xcd,0x46,0x46,0x16,0x64,0x16,0x64,0x64,
0x46,0x64,0xd1,0x64,0xd1,0x64,0xd1,0x64,0x46,0x1d,0x14,0x61,0x14,0x16,0x14,0x61,
0x14,0x41,0xd1,0x41,0x41,0xd1,0x41,0xd1,0x41,0x41,0xd1,0x41,0x41,0x41,0xd1,0x41,
0xd1,0xd1,0xc1,0xd1,0xd1,0xc1,0xd1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x61,0x16,0x16,0x16,0x16,0x16,0xa6,0x16,0xa4,0x16,0x1a,0xe6,0x1a,0x36,0x16,0x16,
0x41,0x41,0x41,0x11,0x41,0x11,0x41,0x41,0xe1,0xe4,0xe1,0xe1,0xe1,0xe1,0xe1,0xd1,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x4e,0xce,0xde,0x4e,0x4e,0xce,0x4e,0x4e,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x1c,0x61,0x41,0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41,0xd1,
0x16,0x14,0x61,0x14,0x16,0x41,0xc1,0x1d,0x16,0x14,0xc6,0x14,0x46,0x41,0x46,0x1c,
0xd1,0xc1,0x41,0x61,0x41,0x61,0x64,0x46,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x1c,0x16,0x1d,0xcd,0x1d,0x1c,0x1d,0x41,0xae,0xde,0xce,0x6e,0x4e,0xe6,0x34,0xcd,
0x4e,0x6e,0xce,0xfe,0xfe,0x1e,0x1e,0x1e,0xcd,0x46,0x46,0xdc,0xcd,0xcd,0xed,0xdc,
0xed,0xec,0x3d,0xce,0xed,0xce,0xde,0x3e,0xca,0x3d,0xca,0xed,0xac,0x3d,0xad,0xdc,
0xcd,0x64,0xcd,0x46,0xcd,0xcd,0xcd,0xcd,0xd1,0x64,0x64,0x64,0x16,0xc4,0x46,0xdc,
0x1d,0x14,0x16,0x14,0x16,0x14,0xcd,0xcd,0x14,0xd1,0x41,0xd1,0x14,0x16,0xcd,0xdc,
0x14,0x41,0x14,0xd1,0x41,0x1d,0xdc,0xcd,0x41,0x14,0xd1,0x41,0x41,0x46,0xdc,0xcd,
0x61,0xc1,0xd1,0x41,0x61,0xc1,0xd1,0xc1,0x61,0x61,0x41,0xd1,0x16,0x61,0x61,0x16,
0x16,0x16,0x16,0x16,0xc6,0x19,0x6e,0x6b,0x16,0x61,0x61,0x16,0xe6,0xa6,0xb6,0xca,
0x61,0x61,0x61,0x1c,0x1b,0x6b,0xcb,0x6b,0xc1,0xe1,0xe1,0x41,0xc1,0x41,0x41,0x61,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xce,0xde,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0xef,0xfe,0xfe,0xfe,
0x4e,0x4e,0xce,0x4e,0x4e,0x4e,0xce,0x4e,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x11,0x41,0x41,0x11,0x41,0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x61,0x41,0x14,0x61,0x14,
0x14,0x61,0x14,0xc1,0x64,0x14,0x46,0xc1,0x64,0xd1,0xc1,0x14,0x61,0x41,0xc1,0x41,
0x1c,0x14,0x61,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x61,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x3d,0x1e,0x1d,0x31,0xd1,0xc1,0x41,0x41,
0x1e,0x1e,0x3e,0x1e,0xbe,0x1e,0x1e,0xae,0xed,0xe3,0xae,0x9e,0x3e,0x9e,0x3e,0xae,
0x9e,0xce,0xde,0xce,0xde,0xce,0xde,0xce,0xd3,0xae,0xd3,0x3e,0x93,0x93,0xde,0xe3,
0xcd,0xd3,0xd3,0xd3,0x3d,0x3d,0xd3,0xec,0xcd,0xd3,0x3d,0xdc,0xcd,0xdc,0xd3,0xdc,
0xdc,0x3d,0xd3,0xcd,0x3d,0xdc,0x3d,0xd3,0xcd,0xd3,0x3d,0xcd,0xcd,0x3d,0xcd,0xd3,
0xd3,0xd3,0x3d,0xd3,0xcd,0xd3,0x3d,0xd3,0x3d,0xd3,0x3d,0xd3,0xcd,0xd3,0x3d,0xd3,
0xd1,0x31,0x1d,0x13,0x1d,0x1c,0x1d,0x43,0xc6,0xda,0x1a,0x19,0x9c,0x19,0x16,0x1a,
0xdb,0xcb,0x6b,0x6b,0xa6,0xc6,0x16,0x16,0xea,0x9a,0x6a,0xa6,0xc6,0x6a,0x6a,0xc6,
0x9a,0xda,0x9a,0xda,0x6a,0x6a,0xda,0x6a,0x61,0x61,0x61,0xc1,0x91,0x91,0xc1,0x91,
0xce,0xdb,0xca,0x6a,0x6c,0x6a,0xc6,0x1a,0xbe,0xab,0x6a,0xc6,0x6a,0x6c,0xa6,0xc6,
0xbe,0x3a,0xc6,0x16,0x16,0x16,0x16,0x61,0xfe,0xce,0x6e,0xce,0x1e,0x6e,0x1e,0x6e,
0x4e,0x4e,0xce,0x4e,0x4e,0x4e,0xce,0x4e,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x11,0x41,0x11,0x41,0x11,0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0xd1,0x41,0x14,0xc1,0x14,0x1d,0x14,0x1c,0x64,0x41,0xd1,
0x64,0xc1,0x64,0x1d,0x4c,0x46,0x14,0x41,0x61,0x41,0x61,0x41,0x41,0xc1,0x41,0x41,
0x41,0x41,0x41,0x41,0x16,0x1d,0x36,0x1a,0x41,0x41,0x41,0x61,0x61,0x16,0x16,0xa6,
0x61,0x1d,0x16,0x1a,0xa6,0x1a,0x6a,0xe6,0x41,0x61,0x61,0x61,0x61,0x61,0x61,0xa1,
0xce,0xde,0x1e,0x1e,0x4a,0x1e,0x1e,0x1e,0x3e,0xae,0x3e,0xae,0x1e,0x3e,0xae,0x3e,
0x6e,0xce,0xce,0xde,0xce,0x9e,0xce,0xde,0xde,0x3e,0xde,0x3e,0xae,0x3e,0x1e,0x3e,
0x3d,0x3d,0xd3,0xce,0x3d,0xce,0xd3,0xd3,0xd3,0xd3,0xd3,0x3d,0xd3,0xd3,0xd3,0xd3,
0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,
0xd3,0xd3,0xd3,0xd3,0xd3,0x3d,0xd3,0xd3,0x3d,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,
0x3d,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0x3d,0x16,0x1c,0x46,0x16,0x1c,0x16,0x1d,0x6c,
0x36,0x16,0xc6,0x16,0x16,0x16,0x16,0xc6,0x16,0x16,0x16,0xa6,0xa6,0xc6,0xa6,0xc6,
0xc9,0x6a,0xc6,0xa6,0xc6,0x16,0x16,0x16,0x91,0x61,0x61,0xc1,0x61,0x61,0x31,0x91,
0x6a,0xca,0xa6,0x6a,0x6a,0x6e,0x6e,0xe6,0x6a,0xc6,0xa6,0xac,0xda,0xce,0x3e,0xde,
0x16,0x16,0x16,0xc6,0x6c,0x1d,0x1c,0xd1,0x1e,0xcd,0xcd,0xdc,0x41,0x11,0x41,0x11,
0x4e,0xce,0x4e,0x13,0x1d,0xc1,0x11,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x11,0x41,0x41,0x41,0x11,0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x11,0x41,0x41,0x41,
0x1c,0x14,0x16,0x14,0x1c,0x14,0x16,0x14,0x31,0xe4,0xec,0xed,0xe4,0xcd,0xe4,0xec,
0x41,0x41,0xc4,0x64,0xc4,0x64,0x4c,0xcd,0x41,0x41,0x41,0xc1,0x41,0x41,0x41,0x41,
0x1e,0x6a,0x1e,0x19,0x36,0x1d,0x36,0xa6,0x6a,0x39,0x6a,0xc6,0x61,0x16,0x61,0x61,
0xca,0xe9,0x6a,0xc6,0x61,0x16,0x16,0xa1,0x1a,0x19,0x13,0x16,0x16,0x6c,0x16,0x36,
0x1a,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0xae,0x1e,0x3e,0xae,0x1e,0xae,0x3e,0xbe,
0xce,0xde,0xce,0xde,0xce,0x6e,0xce,0xce,0x3e,0xae,0x3e,0x3e,0x9e,0x3e,0xde,0xde,
0xde,0xec,0xd3,0xd3,0xce,0xd3,0xde,0xce,0xd3,0xd3,0xd3,0x3d,0xd3,0x3d,0x3d,0x93,
0xd3,0xd3,0x39,0xda,0xea,0x6b,0x6a,0xa6,0x3d,0xd3,0xd3,0xda,0xea,0xb6,0x6a,0x6a,
0xd3,0x3d,0xd3,0xd3,0xd3,0xd3,0x39,0xd3,0x3d,0xd3,0xd3,0x3d,0xd3,0xd3,0x3d,0xd3,
0xd3,0xd3,0xd3,0xd3,0xd3,0x3d,0xd3,0xd3,0x1d,0x63,0x1d,0x63,0x6d,0x36,0x1d,0x36,
0xc6,0xc6,0x16,0x16,0x16,0x61,0x61,0x61,0x6a,0xc6,0x16,0x16,0x16,0x16,0x16,0x16,
0x16,0x16,0x16,0x16,0x16,0x16,0x16,0xc6,0xa1,0x16,0x1a,0x16,0x1a,0x16,0xa1,0x16,
0x36,0x36,0x16,0xe6,0xe6,0xa6,0x96,0xa6,0x93,0xde,0xec,0xde,0x3e,0xcd,0x1d,0xe1,
0xc1,0x41,0x61,0x14,0x1c,0x14,0xc1,0x41,0x11,0x41,0x41,0x41,0x41,0x11,0x11,0x11,
0x11,0x11,0x41,0x15,0x4e,0x1e,0x15,0xc1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x1c,0x14,0x14,0x14,0x41,0x41,0x14,0x41,0xed,0x54,0x41,0x11,0x41,0x41,0x41,0x41,
0x3d,0xc4,0x41,0x41,0x41,0x61,0x14,0x41,0x41,0xc1,0x41,0x61,0x61,0x61,0xd1,0x16,
0x36,0x6a,0x6a,0xde,0xda,0xda,0xc9,0x36,0x61,0x16,0xa6,0xa6,0xca,0x6a,0xa6,0x96,
0xe6,0xa6,0xe6,0xba,0xeb,0x6b,0x6b,0x6a,0xa6,0xca,0x6e,0x6b,0xab,0x9a,0xa6,0x16,
0x1d,0xa1,0x13,0x1d,0xa4,0x1c,0xe6,0xa4,0xae,0x3e,0xae,0xae,0x3e,0xae,0x1e,0xae,
0xde,0xce,0x6e,0xce,0xde,0xce,0x3e,0x1e,0xce,0xce,0xde,0xce,0xde,0xce,0x6e,0xce,
0xd3,0x3e,0xde,0xd3,0x3e,0xed,0xe3,0xde,0xad,0x63,0x39,0xd3,0x39,0x3d,0xcd,0xd3,
0xa6,0x96,0x16,0x16,0x16,0x16,0x16,0x16,0xb6,0x96,0x96,0x16,0x16,0x16,0x16,0xa6,
0x63,0x59,0x63,0xad,0x63,0x3d,0x3e,0xde,0xd3,0x3d,0xd3,0xd3,0xd3,0x3d,0xd3,0x1e,
0x3d,0xd3,0xd3,0x3d,0x3e,0xce,0xef,0xef,0x36,0x36,0xe6,0x6e,0x6f,0xef,0x1f,0x1f,
0x16,0x16,0x16,0x16,0x16,0x16,0xe6,0xe6,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,
0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0xc6,0x16,0x16,0x16,0x16,0x16,
0x96,0xb6,0xf6,0xf6,0x6f,0x6f,0x6f,0xef,0x1e,0xfe,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,
0x41,0x41,0xd1,0xe1,0xdf,0xef,0x1f,0x1f,0x11,0x14,0x4e,0x1e,0xce,0x6e,0x1e,0xfe,
0x41,0xc1,0x1e,0x4e,0x4e,0xce,0x5e,0x4c,0x11,0x11,0x11,0x11,0x41,0x41,0x41,0x11,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x14,0x41,0x41,0x41,0x41,0x41,0x41,0xc1,0x1d,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0xc1,0x41,0x41,0x41,0x41,0x41,0xd1,0x41,0x51,0x41,0x41,0x41,0x41,0x41,
0x16,0x16,0x46,0x16,0x16,0x61,0x41,0x61,0x16,0x16,0x61,0x61,0x61,0x16,0x16,0x16,
0xc6,0x16,0x61,0x61,0x61,0x16,0x16,0x36,0x16,0x16,0x1c,0x16,0x61,0x61,0x41,0x61,
0x1c,0x1d,0x4c,0x1d,0xec,0xed,0xd3,0xcb,0xae,0x3e,0xae,0x3e,0xea,0x3e,0x9e,0x3e,
0xae,0x3e,0x1e,0xae,0x3e,0x1e,0x3e,0x1e,0xde,0xce,0xda,0xec,0x63,0xc9,0x63,0xce,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xae,0x1e,0x3e,0xde,0x3e,0x9e,0x3e,0x9e,0x3e,0x3e,
0x6e,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0x9e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xfe,
0x1e,0x1e,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0x1e,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0xe1,0xf6,0xfe,0xfe,0xef,0x1f,0x1f,0x1f,0xc6,0xe6,0x6e,0x1f,0x6e,0x6e,0xce,0xfe,
0x16,0x16,0x6a,0x6e,0x1e,0x1e,0x1e,0x1e,0xe6,0xe6,0x6f,0xfe,0xfe,0xef,0xef,0xef,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xcf,0xdf,0xcf,0xef,0x1f,0x1f,0x1f,0x1f,
0x41,0x1c,0x14,0xc1,0xd1,0xe1,0xe1,0xe1,0x41,0x11,0x41,0x41,0x41,0x41,0x11,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x11,0x41,0x41,0x41,0x11,0x41,0x41,
0x14,0x1c,0x4d,0xdc,0x1d,0x4c,0x1d,0xc5,0x14,0x1c,0x1d,0xc4,0x1d,0x1c,0x4d,0x15,
0x41,0x61,0x14,0xc1,0xd1,0x51,0x15,0xc1,0xd1,0x51,0xe1,0xe4,0xe1,0x1e,0x4f,0xcf,
0xd1,0x41,0x61,0x31,0xd1,0xa1,0xd1,0xa1,0x16,0x16,0x16,0x16,0x61,0x41,0x61,0x41,
0x36,0x16,0xc6,0xc6,0x61,0x61,0x41,0x41,0xd1,0xc1,0xd1,0x1c,0x1d,0x43,0x19,0x63,
0xce,0x39,0x93,0xd3,0x93,0x93,0x3e,0x39,0x3e,0x1e,0xef,0xef,0xef,0xfe,0x3e,0xae,
0x1e,0xfe,0xef,0xef,0xef,0xfe,0xce,0xde,0x1e,0xef,0x1f,0x1f,0xfe,0x1e,0xdc,0xcd,
0x1e,0x1e,0xfe,0xfe,0x1e,0x3e,0xcd,0xdc,0xae,0x3e,0x1e,0x1e,0xfe,0xde,0xce,0xce,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xef,0xef,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xfe,0xfe,0x1e,0x1e,0x1e,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xfe,
0xfe,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,
0xe1,0xf1,0xe1,0xf1,0xf1,0x1f,0x1f,0x1f,0x41,0x41,0x11,0x11,0x11,0x11,0x11,0x11,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x11,0x41,0x41,0x11,0x41,0x11,
0x14,0x14,0x4c,0x1d,0x1c,0xd4,0x1c,0x4d,0xc1,0xcd,0xcd,0xdc,0xcd,0xe4,0x6f,0xef,
0x64,0xed,0xce,0xdf,0xef,0x1f,0xef,0xef,0xdf,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0xe6,0xe1,0xe6,0xe1,0xf6,0xf6,0x6f,0xdf,0x41,0x41,0x11,0x41,0x61,0x61,0x16,0x16,
0x41,0x41,0x41,0x61,0x61,0x16,0x16,0xc6,0x1d,0xec,0xf6,0xfd,0xfc,0xf6,0xfd,0xfc,
0x3e,0x39,0x93,0xde,0xfe,0xef,0x1f,0x1f,0x93,0x3d,0xd3,0xcd,0xdc,0xd3,0xed,0xf3,
0x1e,0x6e,0xec,0xcd,0xcd,0x6c,0xcd,0xcd,0xd3,0x1e,0xfe,0xae,0xd3,0xd1,0xc1,0x11,
0xde,0x1e,0xfe,0x1e,0x4c,0x11,0x11,0x11,0xfe,0xfe,0x1e,0xec,0x41,0x11,0x41,0xd1,
0xef,0xfe,0x1e,0xdc,0xe1,0x4e,0xce,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0x1e,0x1e,0xce,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xfe,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0xef,0xef,0xef,0xef,0xfe,0xef,0xfe,0xfe,0xef,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x1f,0x1f,0x1f,0x4f,0x1f,0x1f,0xef,0xef,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xd1,0xe1,0xe1,0xf4,0x1f,
0x1d,0xcf,0xdf,0xef,0x1f,0x1f,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xfe,
0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0x1f,0x1f,0xef,0x1f,0xef,0xef,0xfe,0xfe,
0xcf,0x6f,0xfe,0xfd,0xec,0xed,0xdc,0xd3,0x16,0x16,0x16,0x36,0xe1,0x6e,0xed,0x1e,
0x16,0xc6,0x1d,0xc6,0xc6,0xed,0xec,0xe6,0xfd,0x6f,0x1e,0x1e,0xde,0x3d,0xcd,0xd3,
0xef,0x1f,0x1f,0x1f,0xef,0xef,0x3f,0xde,0xef,0xef,0xef,0x1f,0xef,0xef,0xef,0xef,
0x1c,0x1d,0x1e,0x4f,0xef,0xef,0x1f,0xef,0x11,0x11,0x41,0x11,0x41,0xd1,0xed,0xfc,
0x11,0x11,0x41,0x11,0x41,0x41,0x16,0x41,0x31,0x41,0x41,0x11,0x41,0x41,0x61,0x41,
0x3e,0x41,0x41,0x14,0x6c,0xc1,0xd1,0x41,0xc4,0x41,0xcd,0xdc,0x3d,0xdc,0xcd,0xcd,
0xfe,0xfe,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xfe,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x1f,0xef,0x1f,0xef,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,
0xef,0x1f,0xef,0xef,0xef,0xef,0xef,0x1f,0xef,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xef,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0xfe,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x41,0xc1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x1e,0x1f,0x4f,0x1f,0x1f,0x1f,0xdf,0xcf,
0xef,0xef,0xef,0xef,0xfe,0xfe,0xef,0xef,0xfe,0xef,0xfe,0xfe,0xfe,0xef,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xef,0xef,0xef,0x3e,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,
0xde,0x3e,0x1e,0x1e,0x1e,0xfe,0xef,0xef,0x1e,0xde,0xfe,0xfe,0xfe,0xef,0xef,0xef,
0xe6,0x1e,0xde,0xce,0xde,0xce,0xef,0xef,0xd3,0xde,0x3e,0x1e,0x1e,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,
0xef,0xef,0xef,0xfe,0xfe,0xef,0xfe,0xef,0xe1,0xf1,0x1e,0x1e,0x1e,0x1e,0x1e,0x4e,
0x41,0x41,0x41,0x41,0x41,0xd1,0x41,0x41,0x61,0x1c,0x1d,0x16,0xc4,0x16,0x1c,0x64,
0x61,0xcd,0x16,0xc1,0xd1,0xd1,0xcd,0x6c,0xec,0xed,0xec,0xe4,0x1e,0xf1,0xe4,0xf6,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xfe,0x1e,0xfe,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1f,0x1f,0xef,0xef,0xef,0xef,0xef,0xfe,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xfe,0xfe,0xef,0xfe,0xfe,
0x1e,0x3e,0x1e,0x1e,0x1e,0xae,0xce,0x6e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xe1,0xe1,0xe1,0xf1,0xe1,0xe1,0xe1,0xe1,
0x14,0x1c,0x14,0x61,0x41,0x1d,0xdc,0x3e,0x6e,0x6f,0x6e,0xcf,0xde,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xef,0xfe,0xfe,0xfe,
0xef,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,
0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xfe,0xef,0xef,0xef,0xef,0xfe,0xef,0xef,
0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1e,0x4e,0xce,0x1e,0x1e,0x1e,0x1e,0x1e,
0x11,0x11,0x41,0x41,0x61,0xd1,0xd1,0xd1,0xc1,0x41,0x61,0x11,0x41,0x61,0x14,0x16,
0x64,0x1c,0x46,0x6c,0x1d,0x6c,0xc6,0xcd,0xfc,0xfd,0xcf,0xdf,0xcf,0xdf,0xdf,0xcf,
0xfe,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,0x1e,0x1e,0x1e,0x1e,0x1e,0x3e,0xae,0x3e,
0xfe,0xfe,0xfe,0xce,0x6e,0x3e,0xfe,0xfe,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,
0x1f,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,
0xef,0xfe,0xef,0xfe,0xfe,0xfe,0xfe,0x1e,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xce,0x6e,0xfe,0x3e,0xae,0x3e,0x6e,0xce,0x1e,0x1e,0x1e,0x1e,0xfe,0x1e,0xfe,0x1e,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xe1,0xf1,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xae,0x3e,0x9e,0x93,0x3e,0xae,0x3e,0x9e,0x1e,0xfe,0x1e,0xfe,0xfe,0xfe,0xfe,0x1e,
0xfe,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0x1e,0x1e,0xfe,0x1e,
0x1f,0xef,0xef,0xef,0xef,0xef,0xfe,0x1e,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,
0x1f,0xef,0x1f,0x1f,0xef,0xef,0xef,0xef,0xef,0x1f,0xef,0xef,0x1f,0xef,0xef,0xef,
0xef,0xef,0xef,0xef,0xef,0x1f,0xef,0x1f,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xfe,0xef,0xef,
0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0x1e,0x1e,0x3e,0x5e,0xce,0x5e,
0x1c,0xd1,0xed,0xce,0x5e,0x3e,0xce,0xd3,0x41,0x16,0x14,0x4c,0x3d,0xc5,0x53,0xe5,
0xc6,0xcd,0xcd,0xdc,0x35,0x53,0x3e,0x35,0xdf,0xce,0x5e,0xce,0xc5,0x5c,0xc5,0xc5,
0xef,0xef,0x1e,0xe3,0xc5,0xc5,0x5c,0xc5,0xae,0x3e,0x3e,0xd3,0xc5,0x5c,0x35,0xc5,
0x3e,0xfe,0x3e,0x35,0xc5,0xc4,0x15,0x1c,0xfe,0x1e,0x75,0xc5,0xc4,0x14,0x41,0x41,
0x1f,0xfe,0x5e,0xe5,0xe4,0x34,0x14,0x41,0xdf,0xcf,0x1e,0x1e,0x1e,0x34,0xd1,0x13,
0xce,0x1e,0x15,0xd1,0x1d,0x13,0x1d,0xc1,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0xfe,
0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,0x1f,0xfe,0xfe,0xef,0xfe,0xef,0xfe,0xfe,0xfe,
0x6e,0xce,0x6e,0xce,0xde,0x3e,0x6e,0xfe,0x1e,0x1e,0x1e,0x1e,0x3e,0x9e,0x3e,0xce,
0xfe,0xef,0xef,0xef,0xfe,0x1e,0x1e,0x1e,0x1e,0x1f,0x1e,0x4e,0x1f,0x1e,0x1e,0x1f,
0x3e,0x9e,0x3e,0x9e,0x3e,0xae,0x3e,0x9e,0x1e,0xfe,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,
0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0x3e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x1e,0x1e,0x1e,0x3e,0x5e,0x1e,0x3e,0x5e,0xfe,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xef,0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0x1e,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,
0xef,0xef,0x1f,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,
0xef,0xef,0xef,0xfe,0xfe,0xfe,0x1e,0xe6,0xef,0xfe,0xfe,0xef,0xef,0xfe,0xef,0xef,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xce,0x5e,0xce,0x5e,0xce,0x5e,0xce,0xce,
0x35,0xc5,0xc4,0xc4,0x14,0xc1,0x41,0xc4,0x53,0xc5,0xc4,0xc4,0x14,0x41,0x41,0xc4,
0xc5,0x5c,0xc5,0xc5,0xcd,0xc4,0x14,0xc4,0xc5,0xc4,0x15,0xc4,0x14,0xc1,0x14,0x14,
0xc4,0xc4,0xc4,0x1d,0xc1,0x14,0x14,0xc4,0xc4,0xc4,0xc5,0x34,0x4c,0x41,0xc4,0xc4,
0x15,0xc4,0x14,0xc1,0x14,0x14,0x4c,0xc4,0x41,0x14,0xc4,0xc4,0xc4,0x14,0xc4,0xc4,
0x41,0x41,0x14,0x14,0x1c,0x14,0x35,0xc5,0x1d,0xc1,0x15,0x14,0x5c,0xe5,0x35,0x15,
0x51,0xe1,0xe1,0x14,0xe5,0xec,0x5e,0x5e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0x1f,0x1f,0x1f,0xef,0xef,0xfe,0xef,0xfe,0xfe,0xef,0xef,0xef,0xfe,0xef,0xef,0xfe,
0x6e,0xce,0xde,0xce,0x6e,0x1e,0x6e,0xcf,0xce,0xde,0x6e,0xef,0xef,0xfe,0xfe,0xde,
0x1e,0x1e,0x1e,0xfe,0xfe,0x1f,0x1f,0xef,0x4e,0x1e,0x1e,0x1e,0x1e,0x4e,0x1e,0x1e,
0x3e,0x9e,0xe3,0x6e,0xce,0x9e,0xe3,0x9e,0xfe,0xfe,0xfe,0xfe,0xef,0xef,0xef,0xef,
0xfe,0xfe,0xfe,0xfe,0x1e,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x1e,0x3e,0x1e,0x1e,0x5e,0xce,0x5e,0xce,0x1e,0x1e,0x1e,0x1e,0x3e,0x1e,0x1e,0x3e,
0xfe,0x1e,0x1e,0x1e,0xfe,0x1e,0xfe,0x1e,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,
0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1f,0xef,0x1f,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,
0xed,0xec,0xed,0xed,0xce,0xfe,0xfe,0xfe,0x6f,0x3f,0xdf,0xce,0xde,0xef,0xfe,0xfe,
0x5e,0xce,0xfe,0xde,0x3e,0xfe,0xde,0xce,0xde,0xd3,0xce,0x3d,0x5e,0xd3,0x5e,0xd3,
0xc4,0x14,0x4c,0x14,0x1c,0xc4,0x14,0x4c,0x14,0xc4,0xc4,0xc5,0x15,0x4c,0x51,0xc4,
0x41,0xc4,0x14,0x4c,0x41,0x41,0x14,0xc4,0xc4,0x14,0xc4,0x14,0x14,0x41,0x14,0x14,
0xc4,0xc4,0xc4,0x1c,0x14,0x41,0x14,0xc4,0xc4,0xc4,0xc4,0x15,0xc4,0x14,0x14,0xc4,
0xc4,0x14,0x1c,0x14,0x41,0x14,0x14,0x4c,0x14,0xc4,0x14,0xc4,0x41,0x41,0xc4,0xc4,
0xc4,0xc4,0x4c,0x15,0x4c,0x14,0xc4,0x14,0xc5,0xc4,0xc4,0xc5,0x35,0xc5,0x14,0x14,
0xe5,0xe4,0x34,0xc5,0x15,0x34,0xe4,0xe4,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xef,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,
0xdf,0x6f,0xcf,0xdf,0xcf,0xdf,0xfe,0xfe,0xce,0x6e,0x4e,0xce,0x9f,0xfe,0xfe,0x1f,
0x1e,0x1e,0xfe,0xef,0xef,0xef,0xef,0xef,0x4f,0xce,0xef,0xfe,0x1e,0x3e,0x3e,0xde,
0x93,0x9e,0xe3,0x6e,0x3e,0x93,0x3e,0x6e,0xfe,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,
0xfe,0xef,0xef,0xef,0x1e,0x1e,0x1e,0x1e,0xfe,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xef,
0xde,0x3e,0x5e,0x3e,0x3e,0x5e,0xfe,0xfe,0x1e,0x1e,0x3e,0x1e,0x1e,0x3e,0x5e,0x1e,
0x1e,0x1e,0x1e,0xfe,0x1e,0x1e,0x1e,0x1e,0xef,0xef,0xef,0xfe,0xfe,0xfe,0xfe,0xef,
0xef,0xef,0x1f,0xef,0xef,0x1f,0xef,0xef,0x1f,0xef,0x1f,0x1f,0x1f,0xef,0xef,0xef,
0xfe,0xfe,0xfe,0xfe,0xef,0xfe,0xbe,0xeb,0xfe,0x1e,0x1e,0xbe,0xeb,0xeb,0xeb,0xeb,
0xde,0xce,0x4e,0x6e,0xce,0xdb,0xae,0xea,0xd3,0xd3,0xcd,0xc5,0xcd,0xcd,0x3d,0xce,
0xc5,0x53,0xc5,0xc4,0xc4,0x5c,0x4d,0x41,0xc4,0xe4,0x4c,0xc4,0x15,0x1c,0x14,0x14,
0xc4,0xc4,0x14,0x4c,0x15,0xc4,0x41,0x14,0xc4,0xc4,0xc4,0xc4,0xc5,0x15,0xc1,0x14,
0xc4,0x34,0x5c,0xc4,0x15,0x1c,0x41,0x14,0xc4,0x35,0xdc,0x41,0x41,0x41,0x41,0x14,
0xc4,0xc4,0x14,0x41,0x14,0xc1,0x14,0x14,0x14,0x4c,0x41,0x41,0x41,0x41,0x41,0xc4,
0x14,0x41,0x41,0x41,0x41,0x41,0x14,0xc4,0x41,0x11,0x41,0x11,0x41,0x41,0x14,0xc4,
0x31,0xd1,0xc1,0xd1,0xc1,0x64,0xc1,0xc4,0x1e,0x1e,0xbe,0xbe,0x1e,0x1e,0x1e,0xae,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xef,
0xef,0xef,0x1f,0xef,0xef,0xef,0xef,0xef,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xef,0xfe,
0x1f,0x1f,0xef,0xef,0xfe,0xfe,0xfe,0xfe,0xce,0x1e,0x4f,0x1e,0x1e,0x1e,0x4e,0x1e,
0x3e,0x1e,0x1e,0x1e,0x1e,0x3e,0xcd,0xc1,0x1e,0x3e,0x3e,0x1e,0x3e,0xde,0xce,0x4e,
0x1e,0x1e,0x3e,0x1e,0x1e,0x1e,0x1e,0x1e,0xef,0xef,0xef,0xef,0xfe,0x1e,0x1e,0x1e,
0x1f,0x1f,0x1f,0xef,0xfe,0xfe,0xfe,0xfe,0x1e,0x1f,0x1f,0x1f,0xef,0xef,0xef,0xfe,
0x1e,0xef,0x1f,0x1f,0x1f,0xef,0xef,0xef,0x1f,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0xef,0xbf,0xbf,0xbf,0xaf,0xaf,0x9f,0xfa,
0xeb,0xeb,0xab,0xea,0xa9,0x6a,0x6a,0xa6,0xea,0x69,0x36,0x6a,0x39,0x6a,0xc6,0xc6,
0x9a,0x36,0x16,0x61,0x16,0x9a,0xa6,0xc6,0xbe,0x9a,0xe6,0xc6,0x1d,0x3d,0xda,0x93,
0xc4,0xe4,0xb4,0xc1,0x14,0x4c,0x15,0x43,0xc4,0xc4,0x14,0x14,0x14,0xc4,0xc4,0x14,
0xc4,0xc4,0xc4,0x14,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5c,0xfe,0xef,0xfe,
0xc4,0xc4,0xc4,0xc4,0xcd,0x4f,0xfc,0x1e,0xc4,0xc4,0xc4,0xc4,0x14,0xc4,0x41,0x14,
0xc4,0xc4,0x41,0xc4,0x14,0x41,0x14,0x41,0xc4,0x14,0xc4,0x14,0xc4,0x41,0x41,0x41,
0xc4,0xc4,0x14,0xc4,0x14,0x14,0x41,0x41,0xc4,0xc4,0x41,0x14,0xc1,0x41,0x41,0x91,
0x14,0xa4,0x1e,0x4a,0xcb,0xe6,0xe6,0xa6,0xae,0xbe,0xeb,0x9b,0x6b,0x6e,0xcb,0xae,
0xfe,0xfe,0xfe,0xfe,0xbe,0xeb,0x6b,0x6e,0xef,0xef,0xef,0xde,0x1e,0x6e,0x4b,0xce,
0x1f,0x1f,0x1f,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xfe,0xfe,0xfe,0xfe,
0x1e,0x1e,0x1e,0xfe,0x1e,0x1e,0x3e,0x5e,0x1e,0x4e,0x1e,0x1e,0x43,0x1e,0x15,0x13,
0x41,0x41,0x41,0x1d,0x1c,0x4d,0xdc,0xcd,0x1e,0x6e,0xce,0xde,0xce,0xd3,0x1e,0x1e,
0x3e,0x3e,0xde,0x3e,0x3e,0xde,0xd3,0x1e,0x1e,0x3e,0x1e,0x3e,0x3e,0xde,0x3e,0xde,
0x1e,0x1e,0x1e,0x3e,0x5e,0x3e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xfe,0x1e,0x1e,0x3e,
0xef,0xfe,0xfe,0xfe,0x1e,0x1e,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x1e,
0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x6f,0x6e,0x6e,0x6e,0x6e,0x1e,0x1e,0xed,
0xc6,0xa6,0xc6,0xc6,0xc6,0xc6,0xc6,0xcd,0x16,0xc6,0x6a,0xc6,0xc6,0x16,0xdc,0xde,
0xc6,0x1d,0x1e,0xda,0xe6,0xa6,0xc6,0x3d,0x46,0xc6,0xd5,0xec,0x3d,0xce,0xad,0x63,
0x14,0x41,0xc4,0x14,0x4c,0x53,0xce,0xde,0x41,0x41,0x14,0xc4,0xc4,0xde,0xa6,0xc6,
0x41,0x41,0xc4,0xc4,0xcd,0xad,0x16,0x36,0x1c,0x14,0xc4,0xc4,0xdc,0xde,0x19,0x36,
0x14,0x41,0xc4,0xc5,0x5e,0x3e,0xde,0xec,0x41,0xc4,0x14,0xc4,0xcd,0x6e,0xce,0x6e,
0x41,0x14,0x14,0x4c,0xd3,0x3e,0x1e,0x3e,0x41,0x14,0xc4,0x4c,0x3d,0xd3,0xde,0x3e,
0x14,0x14,0x41,0x5c,0x3d,0x3e,0xd3,0x3e,0xa4,0xe1,0x46,0x6c,0xcd,0x63,0xed,0x36,
0xe6,0x36,0xc9,0xe6,0xc9,0x6e,0x6e,0x63,0x6a,0xa6,0x16,0xc6,0xe6,0x36,0xc6,0x16,
0x6b,0xce,0x9a,0xda,0x6e,0x6a,0x1a,0x6d,0x6b,0x6e,0xea,0xea,0x39,0x93,0x9a,0x36,
0xdf,0xce,0x1e,0x1e,0x6e,0x1e,0x1e,0x6e,0xfe,0x1e,0xde,0xce,0xe4,0xd3,0x3e,0x3e,
0xec,0x31,0xd1,0x41,0x14,0x35,0x3e,0x5e,0x14,0x11,0x41,0x41,0x14,0x53,0x3e,0x5e,
0xc4,0x1d,0x1c,0x1d,0x13,0xed,0x3e,0xde,0xe1,0x31,0xd1,0xe1,0xd1,0xc1,0x41,0xe1,
0x5e,0xde,0xd3,0x3d,0xd3,0xcd,0xcd,0x1d,0x1e,0x3e,0x3d,0xd3,0x3d,0xde,0x3e,0xd3,
0x3e,0xde,0xd3,0x5e,0x3e,0x3e,0x1e,0xd3,0xde,0x3e,0x1e,0x1e,0x1e,0x1e,0x3e,0xde,
0xfe,0xfe,0xfe,0x1e,0x1e,0xd1,0xc6,0xcd,0x1e,0x1e,0x1e,0x1e,0xde,0xcd,0xcd,0xcd,
0x1e,0x1e,0x1e,0x3e,0xd3,0xde,0xec,0xde,0xed,0xec,0xed,0xdc,0x3d,0x3d,0xd3,0x3d,
0xde,0xdc,0x3d,0xcd,0x3d,0x3d,0x3d,0xd3,0xd3,0xde,0xd3,0xd3,0x3d,0xd3,0x3d,0xd3,
0xce,0x3d,0xde,0xd3,0x5e,0xd3,0xde,0xd3,0xcd,0xd3,0xec,0x4d,0xce,0xde,0x1e,0xde,
0xd3,0xde,0xde,0x3e,0x3d,0xce,0x1d,0x43,0xcd,0x3e,0xde,0xde,0xd3,0xde,0xd3,0xce,
0xe6,0xce,0xde,0x13,0xd1,0xc1,0x1d,0xdc,0xde,0x1e,0xc1,0x11,0xd1,0xcd,0xdc,0x3d,
0x51,0x11,0x41,0x46,0x6c,0xcd,0xcd,0xdc,0x1e,0xda,0xce,0xda,0x3d,0xca,0x3d,0xe6,
0xde,0x3e,0x6e,0xe6,0x36,0x36,0x3d,0xae,0xd3,0x9e,0xd3,0x6e,0x93,0xde,0x3e,0xd3,
0xde,0xd3,0xde,0x93,0x3e,0xd3,0x93,0x93,0xcd,0x6e,0xd3,0xd3,0x3d,0x93,0x9e,0xd3,
0xe6,0x36,0x1d,0x36,0xa1,0x36,0xe6,0xd3,0x16,0x16,0x16,0x16,0x16,0x36,0x1e,0x39,
0xc6,0xc6,0xc6,0xc6,0x3e,0x3e,0x3e,0x3e,0xc6,0x36,0x6e,0xce,0x9e,0x3e,0xde,0x3e,
0xce,0xde,0x3e,0x1e,0x13,0xde,0xce,0x5e,0xe5,0x31,0xd1,0x11,0x11,0x41,0x41,0x41,
0xc5,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xc5,0x41,0x11,0x41,0x41,0x11,0x41,0x11,
0xce,0x3d,0xdc,0xcd,0xcd,0xc6,0xdc,0xec,0xe1,0xde,0x3e,0xce,0x3d,0xdc,0x3d,0xdc,
0xdc,0x1e,0xde,0x3e,0x1e,0x1e,0xce,0x6e,0xed,0xec,0xed,0xd3,0xe5,0xd3,0xde,0x3e,
0xcd,0x1d,0x14,0xc6,0x64,0xdc,0xcd,0x35,0x3d,0xcd,0x1d,0xc4,0x46,0xcd,0xcd,0xcd,
0xcd,0xcd,0xcd,0xcd,0x3d,0xcd,0xde,0xd3,0xcd,0xcd,0xcd,0xd3,0xde,0x3e,0xde,0xde,
0xd3,0xde,0x3e,0xde,0xde,0x3e,0xde,0x3e,0xd3,0xce,0xed,0x3e,0xde,0x3e,0xde,0x3e,
0xde,0x3e,0xde,0x3e,0xde,0x3e,0x3e,0xde,0x3d,0xd3,0xde,0xd3,0xde,0x3e,0x3d,0xde,
0xde,0xd3,0x3d,0x1e,0x3d,0xd3,0xe5,0xd3,0xce,0x51,0x11,0xd1,0x1d,0xac,0x9e,0x93,
0x1e,0x1e,0x3d,0xce,0x93,0x9e,0x93,0x39,0x3d,0xce,0x39,0x93,0x3e,0x39,0x36,0x61,
0x3d,0x93,0x93,0x3d,0x9c,0xc1,0x11,0x11,0x63,0x3d,0xdc,0x16,0xc1,0x41,0x11,0x11,
0xcd,0x61,0x41,0x11,0x41,0x61,0x41,0x1d,0x1d,0x13,0x16,0x19,0x1e,0x16,0x1d,0xc6,
0x9e,0x6e,0xe6,0xe6,0xe6,0x36,0x1d,0xe6,0xde,0x3e,0x1e,0x1e,0x1e,0x3e,0x3d,0xd3,
0xd3,0xde,0xd3,0xde,0xe3,0xde,0x3e,0xde,0x9e,0x93,0x39,0xd3,0x3d,0x93,0xde,0x3e,
0x39,0x39,0x3e,0x93,0xd3,0x9e,0x3e,0x3e,0x3e,0x9e,0x3e,0x9e,0x3e,0xd3,0x3e,0x9e,
0x3e,0x3e,0x3e,0x3e,0xde,0x3e,0x1e,0x3e,0xde,0x3e,0x1e,0x1e,0x1e,0x1e,0x1e,0x5e,
0x1e,0x1e,0x1e,0xce,0x4e,0xe4,0xc4,0x14,0x41,0xc1,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x11,0x41,0x41,0x11,0x41,0x41,0x41,
0xde,0xce,0xce,0xde,0x1e,0x1e,0xec,0xd1,0xdc,0xd3,0x6e,0xce,0xde,0xdc,0x1c,0x1d,
0xd3,0x3d,0xce,0x3d,0xc9,0xd3,0xcd,0xcd,0xde,0x3e,0x5e,0xce,0xcd,0xc1,0x61,0x11,
0x3d,0x3e,0xde,0x3e,0x5e,0x3d,0x1d,0x11,0x3d,0x5e,0x3e,0xde,0x3e,0x5e,0xcd,0x11,
0xd3,0xde,0x3e,0x1e,0x1e,0xd3,0x41,0x11,0x3e,0xde,0x3e,0xed,0x1d,0xc1,0x11,0x61,
0xde,0xd3,0x3d,0xcd,0x16,0x16,0x61,0x36,0xde,0xd3,0xcd,0x41,0x61,0xc1,0x61,0x61,
0x3e,0x3e,0x3d,0xc1,0x41,0x41,0x11,0x41,0xde,0x3d,0xd1,0x11,0x11,0x11,0x11,0x11,
0x1d,0xc1,0x11,0x11,0x11,0x11,0x11,0x11,0xae,0x93,0xed,0x1c,0x11,0x11,0x41,0x11,
0xe6,0xc1,0x11,0x11,0x41,0x11,0x11,0x41,0x41,0x41,0x11,0x41,0x41,0x11,0x11,0x11,
0x41,0x41,0x41,0x11,0x41,0x41,0x11,0x11,0x41,0x41,0x41,0x41,0x61,0x61,0x41,0x11,
0xcd,0x1d,0x6c,0x1d,0x6c,0x1d,0x61,0x41,0x16,0xcd,0x46,0xc6,0xd1,0xd1,0x1d,0xdc,
0xe4,0x14,0x64,0x15,0xc4,0x15,0xc4,0x14,0x1d,0xc1,0x41,0x41,0x14,0x14,0x14,0x14,
0xce,0x1d,0x41,0x41,0x41,0x41,0x41,0x41,0x9e,0x3e,0xcd,0x41,0x41,0x41,0x41,0x41,
0x3e,0xde,0x1c,0x41,0x41,0x41,0x41,0x41,0x3e,0xcd,0x41,0x41,0x41,0x41,0x14,0x14,
0xd3,0x64,0x14,0xc4,0x14,0xc4,0x14,0x14,0xc5,0xc4,0xc4,0x45,0xc4,0x54,0xc4,0xc4,
0xc4,0x14,0x54,0xc4,0xc4,0xc5,0xc5,0xc5,0x41,0x41,0xc1,0x41,0xc1,0x41,0x51,0x51,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
0x41,0x41,0xd1,0x1e,0x1e,0x1d,0x34,0xcd,0xc1,0x41,0xcd,0x3e,0x3e,0x3e,0x1d,0xc1,
0x1c,0x11,0x4d,0x3e,0x1e,0xd1,0x11,0x11,0x11,0x11,0x41,0xd1,0x41,0x41,0x41,0x41,
0x11,0x11,0x41,0x41,0x11,0x41,0x11,0x41,0x11,0x11,0x11,0x41,0x11,0x41,0x41,0x41,
0x41,0x11,0x11,0x11,0x41,0x11,0x41,0x11,0x41,0x61,0x61,0x41,0x11,0x11,0x11,0x41,
0xca,0x6a,0x6a,0xca,0xc6,0x16,0xc1,0x41,0x61,0xc1,0x61,0x61,0x61,0x61,0x11,0x41,
0x11,0x11,0x11,0x11,0x41,0x11,0x11,0x41,0x11,0x11,0x11,0x11,0x11,0x41,0x41,0x41,
0x11,0x11,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x11,0x41,0x11,0x41,0x41,0x11,0x41,
0x41,0x11,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x61,0x61,0x41,0x41,0x61,0x41,
0x41,0x61,0x61,0x41,0x61,0xd1,0x61,0x41,0x41,0x16,0xd1,0xc1,0x16,0x1d,0x1c,0x61,
0xc6,0x1d,0x6c,0x1d,0xdc,0x1d,0x6c,0x1d,0xcd,0xcd,0xdc,0xcd,0xc5,0x3d,0xcd,0xdc,
0x14,0x14,0x14,0x14,0x41,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x41,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x41,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x41,0x41,0x14,0x14,0x14,0xc4,0x41,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x41,0x14,0x14,0x14,0x14,0xc4,0x14,0xc4,0xc4,0x14,0x14,0xc4,
0x45,0xc4,0xc4,0xc4,0xc4,0xc4,0xc5,0xc5,0x41,0xc1,0x14,0x51,0xc4,0xc5,0x5e,0x5e,
0x41,0x41,0x41,0x41,0x14,0xc5,0x3e,0x1e,0x41,0x11,0x41,0x11,0x41,0x51,0xe1,0x31
};

388
demos/picshow/pic_p.h Normal file
View File

@ -0,0 +1,388 @@
// file generated automatically by 'bin2js'. Do not edit
const byte pic_p[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x92,
0x00,0x44,0x11,0x44,0x00,0x00,0x92,0x92,0x04,0x07,0x07,0x00,0x00,0x00,0x44,0x99,
0x91,0x01,0x10,0x20,0x81,0x00,0x00,0x48,0x12,0x48,0x07,0xe0,0x03,0x00,0x00,0x20,
0xac,0x04,0x80,0x01,0x83,0x01,0x00,0x00,0x00,0x25,0x80,0x92,0x94,0x20,0x00,0x00,
0x00,0x00,0x07,0x00,0x90,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,
0x00,0x02,0x00,0x00,0x00,0x00,0x02,0x00,0xa9,0x11,0x00,0x00,0x00,0x00,0xb0,0x00,
0xa4,0x29,0x05,0x07,0x03,0x03,0x91,0x04,0x24,0x91,0x54,0x44,0x00,0x00,0x8d,0x60,
0x00,0x24,0x90,0x80,0x00,0x00,0x40,0x99,0x07,0x03,0x03,0x07,0x03,0x07,0x07,0x99,
0x88,0xa2,0x24,0x88,0x22,0x49,0x94,0x92,0x84,0x31,0x84,0x91,0x44,0x03,0xf0,0xe0,
0x44,0x11,0x44,0x32,0x86,0x32,0x8a,0x28,0x40,0x19,0x44,0x92,0x89,0xa2,0x8e,0x60,
0xe0,0x60,0xf0,0xd0,0xf0,0xe0,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x00,0x00,0x00,
0x07,0x07,0x07,0x13,0x03,0x07,0x03,0x03,0x49,0x4a,0x92,0x4a,0xa5,0x4a,0xa5,0x92,
0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x92,0xf0,0x07,0x07,0x07,0x03,0x03,0x07,
0x93,0x25,0x92,0xa5,0x00,0x04,0x90,0x00,0xa6,0xa9,0xd2,0xd1,0x25,0x84,0x10,0x40,
0x54,0xaa,0xaa,0xaa,0xb2,0x00,0x20,0x84,0x64,0x64,0xb2,0xcc,0xe0,0xe0,0xe0,0x05,
0x48,0x64,0x99,0x19,0x80,0xe0,0xc1,0x80,0x00,0x64,0xb2,0x4c,0x44,0x02,0x03,0xd8,
0x00,0x80,0x24,0x92,0x80,0x10,0xc0,0x80,0x00,0x00,0x00,0x24,0x00,0x30,0x03,0x03,
0x00,0x00,0x00,0x80,0x24,0x95,0x54,0x42,0x00,0x00,0x00,0x00,0x80,0x24,0x44,0x0b,
0x00,0x00,0x00,0x00,0x00,0x90,0x92,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xa0,
0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x12,
0x00,0x00,0x00,0x00,0x00,0xa4,0x29,0x89,0x4a,0x92,0x84,0xb1,0x04,0x49,0x22,0x28,
0x91,0x94,0x44,0x52,0x12,0x88,0x22,0x92,0x90,0x15,0xc4,0x32,0x89,0xa4,0x24,0x49,
0x48,0x22,0xa8,0x03,0x03,0x07,0x07,0xf0,0xc8,0x92,0x20,0x08,0x82,0x20,0x88,0x02,
0x89,0x22,0x88,0x22,0x09,0x84,0x03,0x0b,0x8e,0x60,0x89,0x30,0x0b,0x07,0x07,0x07,
0x13,0xb4,0x49,0x64,0x92,0xb0,0xa5,0x24,0x00,0x80,0x80,0xc0,0xe0,0xe0,0xe0,0xf0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xa4,0xd2,0xc9,0xc9,0x09,0x26,0x24,0x49,
0x04,0x26,0x26,0xe0,0x07,0xf0,0xf0,0x07,0x07,0xe0,0x24,0x00,0x48,0x00,0x24,0x00,
0x44,0x10,0x82,0x28,0x89,0x22,0x08,0x42,0x04,0x91,0x44,0x49,0x92,0x26,0x88,0x22,
0x11,0x44,0x12,0x9a,0x9a,0x95,0x92,0x94,0x24,0x93,0xcc,0x89,0x92,0x52,0x49,0x89,
0x24,0x80,0x90,0xc4,0x40,0x50,0x80,0xa4,0x00,0x00,0x84,0x20,0x08,0x80,0x20,0x04,
0xc0,0xe0,0xc0,0xf0,0xe0,0xc0,0x03,0xc0,0x03,0x01,0x18,0x0c,0x06,0x02,0x01,0x80,
0x29,0xa4,0x12,0xd2,0x14,0xe0,0xe0,0xf0,0xf0,0x04,0x4a,0x26,0x94,0xa6,0xa9,0xa6,
0x95,0x88,0x4a,0x92,0x94,0x44,0x11,0x4c,0x49,0x93,0x4c,0xcc,0x9c,0xc3,0x70,0x70,
0x81,0x81,0x07,0x07,0xe0,0x9a,0x62,0x0a,0xc4,0x25,0xac,0x0b,0x89,0x95,0x52,0x54,
0x24,0x52,0x25,0x29,0x9a,0x52,0xa5,0xa5,0x92,0x96,0x91,0xb2,0x25,0x95,0x92,0x54,
0x99,0x98,0x52,0xc6,0x99,0x64,0x95,0x92,0xa4,0x91,0x49,0x4a,0x92,0x64,0x89,0x32,
0x70,0x60,0x70,0x70,0xe0,0xa0,0x60,0x64,0x40,0x08,0x80,0x04,0x20,0x80,0x04,0x40,
0x0b,0xd8,0xe0,0xe0,0xc0,0x90,0x03,0x40,0x70,0x07,0x07,0x38,0x03,0x98,0x01,0x70,
0x09,0x42,0x12,0x00,0x48,0x00,0x24,0x80,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x40,0x10,0x44,0x11,
0x01,0x03,0x03,0x01,0x01,0x03,0x01,0x01,0x12,0x92,0x24,0x25,0x49,0x4a,0x12,0x24,
0x07,0xd8,0x22,0x08,0x00,0x20,0x04,0x10,0x10,0x84,0x20,0x08,0x40,0x10,0x84,0x20,
0x12,0x84,0x24,0x88,0x23,0x08,0x92,0x04,0x49,0x95,0x92,0x4a,0x22,0x8c,0x31,0x86,
0xb2,0xaa,0x92,0x54,0x52,0xa6,0x92,0xa4,0x49,0x64,0xa4,0x92,0x49,0x96,0xb2,0x92,
0xc0,0x40,0x64,0xc0,0xd2,0xc4,0x91,0x99,0x80,0x08,0x23,0x88,0xa2,0x82,0x10,0x44,
0xc0,0xc0,0xc2,0x9a,0x61,0x98,0xcc,0x98,0x80,0x80,0xe0,0xe0,0xf0,0x07,0x07,0xd8,
0x07,0x03,0x01,0x10,0x04,0x00,0x00,0x00,0xc6,0xa6,0xa9,0xa6,0x44,0x92,0xc0,0x92,
0x07,0x0e,0x0c,0xc3,0x38,0x87,0x86,0x8e,0xe1,0x1c,0xc1,0x70,0xe8,0xc8,0xf0,0xc9,
0x99,0xca,0x64,0x4a,0x13,0xc4,0x99,0x22,0xb2,0xa9,0xa9,0x26,0x26,0x48,0x94,0xa9,
0xa6,0x29,0xc8,0x92,0x25,0x24,0x92,0xc9,0x29,0x29,0xaa,0x92,0x8a,0x32,0x49,0x99,
0x95,0x8a,0x96,0x49,0x96,0x49,0x49,0x92,0xc6,0xa6,0x49,0x26,0xb2,0x99,0x49,0xa5,
0xe0,0x60,0x60,0x64,0xe0,0xe0,0xf0,0xf0,0x03,0x0d,0x85,0x10,0x87,0x62,0x64,0x80,
0x03,0x02,0x02,0x83,0x30,0xc1,0xc3,0xc0,0xc8,0x45,0x05,0xd8,0x03,0x07,0x07,0x20,
0x80,0xe0,0xf0,0x03,0x03,0x03,0x03,0x05,0x83,0x01,0x01,0x91,0x01,0x09,0x20,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x54,0x11,0x44,0xaa,0x11,0x04,0x05,
0x01,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x25,0x49,0x12,0x92,0x24,0x25,0x19,0x42,
0x00,0x04,0x40,0x00,0x04,0x10,0x00,0x02,0x88,0x22,0x08,0x40,0x10,0x84,0x30,0x42,
0x24,0x89,0x22,0x8a,0x08,0x62,0x09,0x24,0xa9,0x29,0x46,0x92,0x99,0x99,0x99,0x94,
0xb2,0xa6,0xc4,0xca,0x99,0xca,0x99,0x4a,0x92,0x16,0xd4,0x06,0xb0,0xb4,0xe0,0xe2,
0xb2,0x99,0x08,0x12,0x64,0x80,0x90,0x04,0x20,0x88,0xc2,0x10,0x84,0x21,0x08,0x80,
0x08,0x46,0x11,0x85,0x21,0x08,0x42,0x10,0x03,0xf0,0xd0,0x07,0x93,0x23,0x49,0x09,
0x00,0x00,0x80,0x00,0x04,0x00,0x00,0x80,0xe1,0xc9,0x91,0x04,0x24,0x12,0x19,0x44,
0x86,0x0c,0x18,0x1c,0x0c,0x0c,0x08,0x0c,0x32,0xc8,0x4c,0x0c,0x9a,0x62,0x09,0x95,
0xaa,0x96,0xa9,0xaa,0xb4,0xa6,0x96,0xf0,0x52,0x64,0x64,0x4a,0x94,0x2c,0xb2,0xca,
0xd2,0xa5,0x4a,0x96,0x52,0xa5,0x4a,0x95,0x18,0x94,0xaa,0xaa,0xaa,0xaa,0xaa,0x24,
0x25,0x99,0x99,0x49,0xa5,0x52,0xa9,0x91,0xac,0x4c,0x9a,0x94,0xac,0xcc,0xcc,0xa4,
0xf0,0xf0,0x07,0x07,0x03,0x01,0x01,0x01,0x64,0xc6,0x80,0x80,0x15,0xc0,0xc0,0xe0,
0xe0,0xc0,0xe0,0x60,0x96,0xc0,0x12,0x06,0x8a,0x92,0x60,0x83,0x24,0x8e,0x0e,0x24,
0x91,0x24,0x80,0x92,0x20,0x48,0x42,0x90,0xa0,0xf0,0xf0,0xf0,0xc0,0xc0,0xc0,0xc0,
0x80,0x80,0x80,0xe4,0x95,0xc1,0x91,0xc0,0x40,0x03,0x01,0x92,0x07,0xb2,0xd8,0x32,
0x24,0x44,0x92,0x49,0x49,0x26,0x99,0x99,0x01,0xc0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x12,0x44,0x11,0x44,0x12,0x48,0x22,0x8a,
0x00,0x10,0x00,0x04,0x00,0x20,0x00,0x02,0x08,0xa0,0x24,0x10,0xc2,0x08,0x20,0x84,
0x93,0x49,0x26,0x99,0x25,0x26,0x9a,0xb4,0x26,0x4a,0xb2,0x95,0x54,0x49,0x92,0xf0,
0x89,0x95,0x24,0xa5,0xaa,0xaa,0xd4,0x80,0xc0,0xc8,0x80,0x90,0xc4,0x80,0x90,0x04,
0x20,0x80,0x04,0x11,0xc1,0xc1,0x1c,0xc0,0x04,0x40,0x12,0x84,0x14,0x26,0x40,0x28,
0x07,0xd0,0xc0,0xe0,0x07,0xf0,0xf0,0x07,0x20,0x80,0xc0,0xc0,0xe0,0xe0,0xf0,0xf0,
0x80,0x80,0x80,0xc0,0xe0,0xe0,0xf0,0xf0,0x40,0x80,0x88,0x40,0x00,0x80,0x80,0x40,
0x04,0x04,0x04,0x04,0x06,0x02,0x02,0x02,0x10,0x94,0x04,0x49,0x40,0x12,0x00,0x88,
0xb2,0xaa,0x94,0x0d,0xb1,0x06,0x96,0x31,0x2a,0xa9,0xa5,0x4a,0x94,0xd2,0x4a,0xaa,
0x54,0x52,0x4a,0x2a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa9,0xa4,0x96,0x51,
0xac,0xa2,0x9a,0x62,0x8c,0x4c,0x4c,0x52,0x52,0xa9,0xa2,0x9a,0xca,0x29,0xa4,0x95,
0x92,0x24,0x93,0xcc,0x32,0x92,0x4c,0x9a,0x60,0x60,0x60,0x20,0x30,0x10,0x18,0x0b,
0xc0,0x03,0x20,0x2c,0x20,0x01,0x01,0x88,0x04,0x0c,0xc0,0x0c,0x0c,0x22,0x0a,0x49,
0x92,0x49,0x49,0x48,0x92,0x02,0x06,0x0c,0xc0,0xe1,0xe1,0xe0,0xf0,0xf0,0xf0,0xf0,
0xd2,0x92,0x32,0xd1,0xe0,0xe0,0xf0,0x0b,0x93,0x49,0xd8,0x68,0x13,0x01,0x05,0x01,
0x99,0x26,0x4c,0x52,0xac,0x0d,0x07,0xf0,0xe0,0x9a,0xaa,0xd4,0xd0,0x00,0x80,0x00,
0x01,0x41,0xe1,0xe1,0xf0,0x06,0x00,0x00,0x20,0x25,0x84,0x92,0x12,0x44,0x49,0x22,
0x00,0x10,0x45,0x54,0x00,0x08,0x00,0x20,0x30,0x42,0x98,0xa4,0x00,0x40,0x04,0x80,
0xd2,0xc8,0xe4,0x90,0xd2,0x48,0xe4,0x80,0x70,0x60,0x60,0x60,0x70,0x96,0x70,0x30,
0x04,0x21,0x24,0xa9,0xaa,0x52,0x2a,0x15,0x40,0x10,0x04,0x80,0x90,0x04,0x20,0x80,
0xc0,0xe0,0xc0,0xc0,0x18,0x81,0x34,0x30,0x01,0x52,0xa0,0x24,0x07,0x2c,0x99,0x25,
0xe0,0x0d,0x0b,0x92,0xf0,0x0c,0x07,0xe0,0x07,0x03,0x03,0x83,0x01,0xb2,0x81,0x0c,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x80,
0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x22,0x80,0x04,0x90,0x80,0x84,0x80,0x80,
0x0e,0xe8,0x26,0x9a,0x06,0x26,0x09,0x06,0x2a,0xca,0x92,0x4a,0xa4,0xb4,0xa5,0x13,
0xa9,0xa5,0xca,0xc8,0x03,0xf0,0x38,0xc1,0xb2,0x32,0xca,0x0a,0xc0,0xe1,0x18,0x18,
0x52,0xb2,0xb1,0xa6,0x99,0x64,0x19,0x99,0xaa,0x51,0x4c,0xcc,0xa4,0x99,0x99,0x91,
0x19,0x4a,0x62,0x9a,0x49,0x99,0x12,0x9a,0x06,0x07,0x03,0x07,0x07,0xf0,0x03,0xf0,
0x22,0x88,0x80,0xe1,0xe4,0x46,0xc2,0x99,0x89,0x90,0x41,0x16,0x52,0x49,0x24,0x91,
0x18,0x70,0x94,0xd0,0x50,0x90,0x20,0x02,0xf0,0x03,0x07,0x06,0x07,0x05,0xf0,0x02,
0x03,0x05,0x80,0x07,0x03,0x07,0x07,0x07,0x94,0x07,0xe8,0x03,0x8b,0x2a,0x0b,0xe0,
0xe0,0xe0,0xc0,0x18,0x38,0x61,0x0c,0x48,0x00,0x90,0xa0,0x20,0x80,0x00,0x00,0x00,
0x00,0x00,0x24,0xc1,0xc1,0xe1,0xe0,0x07,0x98,0x24,0x0c,0x22,0x08,0x48,0x10,0x04,
0x00,0x44,0x10,0x42,0x48,0x20,0xa4,0x24,0x20,0x04,0x80,0x08,0x40,0x10,0x84,0x20,
0xc9,0x80,0x83,0x8d,0x98,0x24,0x9a,0x18,0x30,0x30,0x90,0x00,0x44,0x11,0xa4,0x2c,
0x64,0x89,0x13,0x40,0x11,0x01,0x8b,0x90,0x80,0x80,0x10,0x08,0x88,0xcc,0xc6,0xb1,
0x60,0x87,0x81,0x90,0x80,0xa4,0xc4,0x30,0x25,0x24,0x01,0x83,0x04,0x8c,0x83,0x07,
0x60,0xf0,0xf0,0x70,0x06,0x03,0x03,0x43,0x0c,0xc1,0xe1,0x01,0xe1,0xc9,0x0d,0x80,
0xe0,0x07,0xd0,0xd0,0x07,0xb0,0x03,0x03,0x80,0x40,0x40,0x80,0x40,0x40,0x00,0x40,
0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x00,0x80,0x80,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,
0x26,0x07,0x06,0x11,0x03,0xf0,0xf0,0x01,0x13,0x83,0xd0,0xa9,0xd8,0x26,0xa8,0x44,
0xc1,0x81,0x00,0x00,0x24,0x20,0x4a,0x00,0xe1,0xe0,0xc0,0x00,0x00,0x90,0x44,0x03,
0xe4,0x06,0xc8,0xe4,0xa0,0x51,0x96,0x10,0x94,0x9a,0x4c,0x32,0xc9,0xb2,0xb2,0x00,
0x9a,0x94,0x93,0x93,0x50,0x40,0xf0,0xc0,0x50,0xd0,0xf0,0x03,0x03,0x01,0x00,0x00,
0x9a,0x8b,0x26,0x95,0x11,0x05,0xc0,0xe0,0xc4,0x10,0x42,0x88,0x21,0x44,0x50,0xc2,
0x40,0x10,0x80,0x08,0x20,0x04,0x91,0x04,0x06,0x0c,0xc0,0x18,0x00,0x20,0x00,0x00,
0x07,0x03,0x03,0x07,0xf0,0xe0,0xc0,0xc0,0x07,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,
0x40,0x10,0xc0,0xf0,0x07,0x03,0x00,0x00,0x00,0xe2,0xe0,0xc0,0xe0,0xe0,0x00,0xe0,
0x40,0xf0,0x03,0x03,0x01,0x03,0x07,0x31,0x00,0x00,0x00,0x00,0x40,0x40,0x08,0x00,
0x98,0x52,0x48,0xaa,0xa8,0x24,0xd2,0x52,0x80,0x04,0x40,0x10,0x84,0x80,0x20,0x84,
0x92,0x24,0xb2,0x54,0x11,0x84,0x20,0x49,0x42,0x07,0xd8,0x48,0x02,0x10,0x44,0x52,
0x02,0xc8,0x80,0x92,0x48,0x22,0x88,0x29,0x26,0xa2,0x20,0x64,0x90,0x12,0x50,0x14,
0x80,0x80,0xe0,0xc3,0xd8,0x16,0x92,0x8a,0x30,0xc3,0x4c,0x58,0x4a,0xd4,0x50,0x70,
0x80,0xc9,0x01,0x41,0x14,0x49,0x00,0xd8,0xc0,0x60,0xf0,0x91,0x8c,0xb0,0x92,0xc1,
0x50,0xd0,0xe8,0xb0,0x07,0x07,0xa0,0xc0,0x40,0x20,0x92,0x12,0x92,0x64,0x92,0x12,
0x01,0x01,0x00,0x02,0x81,0x00,0x81,0x00,0xe0,0x70,0x70,0x87,0xb8,0x38,0x38,0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x80,0xc0,0x40,0xc0,0x40,0x40,0x40,
0x14,0x00,0x00,0x08,0x20,0x84,0x10,0x48,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x00,0x04,0x20,0x88,0x82,0x00,0x01,0x03,0x07,0xb0,0xe0,0xe0,0xc0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xf0,0xf0,0xe0,0xe1,0x0c,0x00,0x00,0x00,0x08,0x30,0x07,0x07,0x07,0x06,0x02,0x80,
0x40,0x88,0x87,0x81,0x00,0x00,0x00,0x00,0x01,0x07,0xf0,0x07,0x07,0xf0,0xe0,0x88,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x00,
0x9c,0xc3,0x07,0xf0,0xe0,0xc0,0xc0,0xe0,0x44,0x00,0x82,0x08,0x40,0x04,0x00,0x02,
0x48,0x22,0xa8,0x8a,0x62,0x48,0x11,0x44,0x90,0x00,0x84,0x20,0x88,0x00,0x22,0x08,
0xa2,0xca,0xc9,0x34,0x80,0xc8,0x80,0xcc,0xa4,0x62,0x60,0x0b,0x60,0x60,0x60,0x60,
0xa0,0xc0,0x13,0xe0,0xe0,0xe4,0x1a,0xe4,0x11,0x93,0x03,0x03,0x07,0xf0,0xf0,0xe0,
0x80,0x91,0xc0,0xc0,0xe4,0xe0,0xf0,0xf0,0x8c,0xc0,0xc0,0x60,0x0e,0xa2,0x0a,0x48,
0x02,0x80,0x04,0x01,0x86,0x92,0x0a,0x48,0xc9,0x83,0x87,0xf0,0xe0,0xf0,0xe0,0xf0,
0x90,0x26,0x26,0xaa,0x29,0xa5,0xc9,0xa5,0x80,0x00,0xc0,0xc0,0xc0,0x09,0x80,0x20,
0x00,0x08,0x54,0x10,0x07,0xf0,0x03,0x01,0x00,0x45,0x00,0x00,0x40,0x00,0x99,0x99,
0x00,0x00,0xe0,0xf0,0x00,0x93,0x49,0x93,0x40,0x40,0x00,0x00,0x04,0x80,0xc0,0x70,
0x48,0x90,0x84,0x20,0x08,0xd0,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x44,0x00,0x00,0x00,0x01,0x01,0x03,0x80,0x80,0x08,0x1a,0x1c,0xc2,0xe2,0xc2,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x03,0xe0,
0xe1,0x03,0x06,0x06,0x0c,0x1c,0x70,0xe0,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0x40,0x20,0x60,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,
0xe0,0xe0,0xf0,0xf0,0xf0,0x07,0x07,0x07,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x50,0x12,0x40,0x49,0x20,0x84,0x10,0x40,0x80,0x24,0x00,0x10,0x44,0x00,0x92,0x00,
0xc4,0xb2,0xd4,0xc0,0xe0,0x07,0xc8,0xd0,0x9c,0x91,0x24,0x99,0x99,0x07,0xf0,0xe0,
0x90,0x01,0xf0,0xe0,0xc0,0x00,0x08,0x30,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc0,0xe0,0xe0,0xf0,0xf0,0xf0,0x07,0x07,0x01,0x24,0x00,0x90,0xa4,0x29,0x94,0x64,
0x02,0x20,0x88,0x03,0x13,0x20,0x90,0x06,0xc0,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0xb4,0x93,0x93,0x0d,0xe0,0x03,0x00,0x00,0x92,0xa5,0x4a,0x96,0x26,0x99,0xe8,0xf0,
0x00,0x80,0x07,0x26,0x99,0x99,0x99,0xa6,0x1a,0x00,0x11,0x80,0x49,0xe0,0x80,0x00,
0xe8,0x00,0x20,0x00,0x26,0x00,0x00,0x00,0x03,0x07,0x00,0xd8,0x40,0x00,0x02,0x03,
0x01,0xf0,0x00,0xc9,0x07,0xf0,0xc0,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x06,
0x03,0x03,0x07,0x07,0x07,0x0c,0x0c,0x0c,0xc2,0xc2,0xc2,0x42,0xc0,0x40,0x40,0x40,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x60,0x30,0xb0,0x58,0x87,0x98,0x32,0xa2,0xc2,0x1c,0x38,0x18,0x18,0x10,0x10,0x10,
0x03,0x03,0x03,0x03,0x01,0x01,0xc3,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x10,0x04,0x20,0x02,0x10,0x04,0x48,0x01,0x84,0x03,0x03,0x07,0x07,0xf0,
0x90,0xf0,0xc0,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x01,0x49,0x43,0xcc,
0x10,0x10,0xb0,0xa8,0x98,0x23,0x31,0x34,0x00,0x00,0x40,0x00,0xa0,0x81,0x9c,0xf0,
0x03,0x03,0xf0,0xf0,0xe1,0x80,0x9a,0xa2,0x49,0x99,0x26,0xc0,0xf0,0x07,0x38,0x03,
0x40,0x19,0xc0,0x26,0x08,0x07,0x07,0x07,0x07,0xf0,0xc0,0xc0,0x04,0xd2,0x16,0x26,
0x02,0x00,0x00,0x00,0x80,0xe0,0xe0,0xc0,0x07,0x80,0x80,0x00,0x40,0x10,0x02,0x20,
0x03,0x07,0x07,0x03,0x0b,0x80,0x00,0xc0,0x00,0x00,0x80,0x00,0x88,0xe2,0xc0,0xe0,
0x00,0x00,0x80,0x00,0x24,0xc9,0x0d,0x10,0x03,0x01,0x40,0x00,0x89,0x22,0x0b,0x99,
0x01,0xb4,0x04,0xac,0xb2,0x83,0x81,0xa1,0xb1,0x93,0x4a,0x95,0x0b,0x93,0x93,0x94,
0x1c,0x1c,0x18,0x38,0x38,0x87,0x87,0x07,0x40,0x00,0x20,0x20,0x01,0x21,0x01,0x01,
0x00,0x40,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x01,0x00,0x60,0x12,0x86,0x30,0x20,0x00,0xe0,0x00,0x00,0x00,0x01,0x09,0x81,0x04,
0x22,0x22,0x22,0x02,0x40,0x02,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc1,0xc1,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x80,0x80,0x80,0x80,0xc0,0xc0,0xc0,0xc0,
0x20,0x02,0x10,0x04,0x20,0x02,0x08,0x22,0xe0,0xe0,0xe0,0xc0,0xc0,0xc0,0xc0,0xc0,
0x38,0x18,0x1c,0x0e,0xb1,0xb8,0x93,0xb2,0x58,0x23,0xcc,0x4c,0xcc,0xa6,0x4c,0x0c,
0x31,0x19,0x18,0x38,0x2c,0xc9,0xc8,0x42,0x01,0x60,0xc0,0xb8,0x93,0xa9,0x23,0x89,
0xa0,0xa0,0x00,0x00,0x00,0x03,0xe8,0x60,0x01,0x01,0x04,0x02,0x70,0x23,0x01,0x11,
0x07,0xf0,0xf0,0xe0,0xe0,0x40,0xe0,0xc0,0x98,0x41,0x88,0x00,0x00,0x40,0x10,0xc6,
0x03,0x03,0x03,0x03,0x01,0x04,0x12,0xc9,0x08,0x11,0x11,0x08,0x28,0x08,0x92,0x90,
0xb8,0xaa,0xb8,0x12,0x4a,0x95,0xa2,0x49,0xf0,0xf0,0x07,0x07,0x03,0x03,0x03,0x03,
0x44,0x11,0x84,0x24,0x21,0x08,0x42,0x10,0x0d,0xd8,0x64,0xd1,0x9a,0xe0,0xe4,0xa6,
0xc6,0xa4,0x38,0xc2,0xc0,0xcc,0xcc,0xcc,0x03,0x03,0x03,0x07,0xf0,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0xe0,0xa0,0xe0,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x11,0x4c,0xc9,0xc9,0x1a,0xb1,0xc8,
0x00,0x10,0x00,0x00,0x00,0x10,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0xa0,0x80,0x91,0xa0,0x20,0x48,0xe0,0xe0,0xe0,0xe0,0xf0,0xf0,0xf0,0xf0,
0x64,0x9a,0x9a,0x08,0x12,0xa8,0x54,0xa8,0x80,0x80,0x80,0x80,0x80,0x10,0x22,0x08,
0x86,0xc1,0x40,0x20,0x10,0x08,0x00,0x80,0x0c,0x87,0x0d,0x87,0xf0,0x0b,0x07,0x03,
0x90,0x84,0x40,0x40,0x04,0x00,0x00,0x00,0x20,0x04,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x09,0x01,0x05,0x04,0x01,0x00,
0xc1,0xc0,0x80,0x80,0x81,0xc0,0x80,0xc0,0xd0,0xca,0x9a,0x25,0x24,0xb4,0x48,0x92,
0x25,0x95,0x95,0x98,0x45,0x54,0x92,0x24,0x84,0x80,0x88,0x20,0x80,0x10,0x44,0x00,
0x09,0x25,0x81,0x09,0x01,0x11,0x05,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x89,0x24,0x85,0x90,0xc6,0x05,0x25,0x01,0x00,0x43,0x91,0x9a,0x9c,
0xb2,0xa0,0x92,0x49,0xc8,0xa4,0xd2,0x95,0x07,0x07,0xf0,0xe0,0xc0,0xc0,0xc0,0xc0,
0xd8,0xe8,0xf0,0xf0,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x08,
0x07,0x03,0x01,0xc0,0x60,0x60,0x03,0x03,0x10,0x02,0x08,0x22,0x19,0xa9,0xa9,0xa4,
0x00,0x40,0x80,0x20,0x80,0xc0,0x80,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,
0x22,0x51,0x99,0xa9,0xc8,0x41,0xa0,0x00,0x40,0xc0,0x80,0x60,0xc0,0x50,0x60,0xa0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0xa4,0x90,0x48,0x48,0x90,0xe0,0xc8,
0x10,0x10,0x80,0x12,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
0x10,0x44,0x50,0x52,0x64,0xb4,0xf0,0xd4,0xf0,0xf0,0x07,0x07,0x07,0x07,0x07,0x07,
0x64,0x52,0x48,0x52,0x20,0x4c,0x54,0x28,0x00,0x10,0x00,0x04,0x04,0x02,0x43,0x00,
0x80,0x00,0x20,0x0c,0x06,0x03,0x80,0xe8,0x03,0x01,0x00,0x00,0x00,0x00,0x80,0x00,
0x00,0x02,0x11,0x05,0x81,0x8d,0x08,0x00,0x80,0x20,0x84,0x11,0xc4,0x8d,0x25,0x11,
0x00,0x80,0x00,0x00,0x22,0x88,0x62,0x92,0x02,0x00,0x02,0x02,0x00,0x81,0x25,0x84,
0xc0,0x80,0xc0,0xc0,0x40,0x00,0x80,0x00,0x12,0x44,0x44,0x12,0x48,0x22,0x24,0x10,
0x89,0xa2,0x88,0x22,0x88,0x22,0x89,0x81,0x20,0x08,0xc0,0x12,0xc2,0x07,0xf0,0xf0,
0x09,0x81,0x05,0x11,0x1c,0x04,0x96,0x94,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,
0x26,0xd2,0xc0,0x07,0x07,0x87,0x94,0xa4,0x92,0x38,0x98,0x98,0x99,0xa6,0x86,0x31,
0xa4,0xa9,0xaa,0xd4,0x9c,0x2a,0x23,0x9a,0xe0,0xc0,0xc0,0xe1,0x2c,0x54,0x2a,0xc9,
0x01,0x01,0x00,0x32,0x52,0x52,0xb2,0x99,0x02,0x04,0x11,0x29,0x52,0xa5,0x4a,0x29,
0x40,0x04,0xa0,0xac,0xa4,0xb0,0x05,0x05,0x11,0x00,0xc8,0x02,0x90,0x00,0x92,0x91,
0x00,0x03,0x68,0x03,0x03,0x03,0xb0,0x87,0x03,0x07,0x03,0x07,0xc6,0x38,0x38,0x87,
0x4c,0x06,0x06,0x81,0x06,0x06,0x06,0x21,0xd8,0xf0,0xb8,0xe8,0x07,0x03,0x03,0x01,
0x00,0x00,0x00,0x00,0x04,0x06,0x03,0x00,0x01,0xf0,0x09,0xd8,0x06,0xaa,0x22,0xc1,
0x0c,0x0c,0x04,0x04,0x06,0x06,0x02,0xc0,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,
0x0b,0xe2,0xc8,0xc5,0x09,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x07,
0x68,0x50,0xb4,0x28,0x58,0xd4,0x64,0x68,0x00,0x40,0x00,0x00,0x24,0x20,0x02,0x20,
0x80,0x88,0xc2,0xe0,0xf0,0x0b,0x06,0x04,0x01,0xc0,0xe0,0x70,0xf0,0xe0,0xf0,0x70,
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x94,0x9a,0x12,0x44,0x11,0x00,0x00,0x00,0x91,0x44,0x45,0xd1,0xc2,0x62,0xe1,0xa4,
0x80,0x40,0x00,0x80,0x40,0x40,0x80,0x80,0x42,0x28,0x21,0x04,0x12,0x01,0x24,0x00,
0x43,0x41,0x01,0x38,0x98,0x98,0x00,0xf0,0xf0,0x02,0x07,0xe0,0xf0,0x07,0xe0,0xc4,
0xf0,0x70,0xf0,0xe0,0xe0,0xc0,0xe0,0xc0,0x01,0x01,0x01,0x01,0x41,0xc1,0xc1,0xc1,
0x9a,0x64,0x94,0x91,0x42,0xb0,0xcc,0x44,0x61,0xa3,0x29,0x85,0x4c,0x07,0x4c,0x46,
0x62,0xb2,0x25,0x24,0x52,0xd2,0x99,0x24,0x64,0x31,0x8c,0xe2,0x0e,0x31,0x90,0x44,
0x62,0x2c,0x70,0x87,0xcc,0x32,0xc4,0x92,0xa6,0x9a,0x52,0x18,0x93,0x38,0x98,0x42,
0x09,0xe4,0x18,0x96,0x88,0x98,0x9c,0x4c,0x84,0x13,0xc4,0x31,0xe1,0x8e,0x31,0x44,
0x93,0xa4,0xd2,0x46,0x60,0x30,0x89,0x64,0x87,0x38,0x43,0x12,0x93,0xe1,0xb2,0x00,
0x09,0x01,0x01,0x98,0x03,0x07,0xf0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x98,0x8c,0x31,0xc6,0x1c,0xe4,0x0e,0x0a,0x0a,0xd8,0x85,0x96,0xb4,
0x03,0x03,0x03,0x03,0x03,0x01,0x03,0x03,0x80,0x80,0x80,0xf0,0xf0,0x07,0x01,0x80,
0x00,0x00,0x00,0x80,0xf0,0x00,0x00,0xb0,0x07,0x03,0x03,0x03,0x03,0x03,0x01,0x01,
0xd8,0x90,0x93,0xc8,0xd0,0x64,0x93,0x58,0x24,0x60,0x32,0x30,0xc3,0xc3,0xe1,0xf0,
0x07,0x83,0x03,0x20,0x00,0x00,0x00,0x80,0x38,0x1c,0xcc,0xc4,0xe0,0x20,0x30,0xb8,
0x00,0x80,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,
0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xe0,0xa1,0x60,0x68,0xe0,0xb0,0x60,0xd8,
0x40,0x80,0x40,0x40,0x80,0x40,0x40,0x00,0x11,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
0xe2,0xe2,0xe0,0xe0,0x0e,0x80,0x80,0x80,0xc0,0xc0,0xc0,0x80,0x80,0xe8,0x10,0x06,
0x01,0x03,0xc0,0x03,0x07,0xc0,0x07,0x07,0xc1,0x94,0x81,0x96,0xc1,0x94,0xe1,0xaa,
0x54,0x49,0x51,0x20,0x60,0x81,0x60,0x61,0x52,0xa9,0xaa,0xa2,0x04,0x26,0xc4,0xa0,
0xac,0x92,0x08,0x16,0xc9,0xd2,0x89,0x62,0x92,0xb0,0x24,0x0e,0x52,0xa9,0xcc,0x22,
0x92,0xa1,0x4c,0x06,0x92,0x4c,0xb2,0x89,0x4a,0x8a,0x62,0x07,0xd8,0x19,0x32,0xa6,
0x91,0x8a,0x88,0x19,0xca,0x8d,0x48,0x99,0x92,0x92,0x0c,0x61,0xb1,0x99,0x99,0x24,
0x92,0x48,0x8b,0x86,0xc6,0x07,0xa4,0x06,0x44,0x11,0x80,0x24,0x40,0x12,0x00,0x89,
0x03,0x03,0x03,0xac,0x06,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xe1,0xe0,0xf0,0xf0,0xf0,0xf0,0x07,0x07,0x0d,0xa6,0x80,0x20,0x00,0x00,0x00,0x00,
0x07,0x03,0x07,0x07,0x07,0x07,0xe0,0xe0,0x98,0xf0,0xc0,0xc0,0xc0,0x07,0x03,0x00,
0x00,0x00,0x05,0x07,0x07,0x01,0x04,0x01,0x01,0x01,0x03,0x06,0x00,0x40,0x11,0x01,
0x44,0x30,0x93,0x48,0xd8,0xb4,0x68,0x48,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xe0,0x03,0xc0,0xe0,0x00,0x00,0x00,0x00,0x24,0x00,0x10,0x80,0xe0,0x38,0x03,0xf0,
0x60,0x60,0x20,0x04,0x10,0x04,0x80,0xe0,0x00,0x00,0x80,0x00,0x00,0x80,0x80,0x00,
0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x70,0x70,0xd8,0x06,0x46,0x02,0x06,0xc0,
0x20,0x80,0x00,0x40,0x40,0x00,0xc0,0x20,0x00,0x04,0x00,0x00,0x00,0x04,0x10,0x03,
0x80,0x80,0xe0,0x70,0x23,0x60,0x07,0xe2,0x01,0x00,0x00,0x08,0xe4,0x48,0x42,0x10,
0x07,0x07,0x07,0x07,0x07,0x03,0xc9,0xc9,0xb2,0xd4,0xa2,0x8c,0x21,0x26,0xc9,0x09,
0x62,0xc4,0xcc,0x92,0x93,0x93,0xe8,0x88,0xa9,0xf0,0x29,0x16,0x43,0x13,0x51,0x38,
0x08,0xa2,0x91,0xb2,0xe1,0x0c,0x1c,0x8c,0x92,0x49,0x49,0x26,0x30,0x18,0xa5,0xc2,
0x24,0x07,0x8d,0x4c,0x83,0x87,0x98,0x19,0x29,0xac,0x4c,0x26,0x03,0x0a,0x22,0x31,
0x90,0x12,0x4c,0x38,0x1a,0x31,0x44,0x08,0x98,0x34,0x9c,0x58,0x9a,0x2a,0x98,0x88,
0x52,0xe4,0xd2,0x92,0xc4,0x95,0x2a,0x88,0x44,0x00,0x20,0x00,0x89,0x22,0x8d,0xa2,
0x03,0x07,0x07,0x07,0x07,0x03,0x03,0x43,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x80,
0x07,0x03,0x07,0x07,0x07,0x07,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,
0x38,0x20,0x00,0x04,0x08,0x20,0xe0,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0x23,0xc6,
0x00,0x00,0x03,0x07,0xf0,0xf0,0x30,0x08,0x01,0x01,0x03,0x01,0x01,0x03,0x03,0x01,
0xd0,0x00,0x00,0x00,0x00,0x04,0x32,0xc0,0x00,0x80,0x80,0x00,0x40,0x40,0xc0,0xc0,
0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0xe0,0xe1,0x28,0x00,0x00,0x00,
0x00,0x00,0x00,0xe8,0x16,0x11,0x43,0x0b,0x00,0x00,0x00,0x00,0x80,0x06,0x0c,0x06,
0x00,0x60,0x00,0x00,0x00,0x03,0x07,0x61,0x00,0x08,0x06,0x02,0x03,0xf0,0x03,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0xf0,
0x88,0x02,0x03,0x05,0x26,0x06,0x13,0x38,0x94,0x0c,0x60,0x07,0x96,0x68,0x20,0x88,
0x8c,0x88,0x00,0x91,0x01,0x0b,0xc3,0x08,0xe8,0x4c,0x01,0x4c,0xa1,0x8e,0x13,0xcc,
0x89,0xc0,0xc0,0xc9,0xc0,0xc9,0x80,0xcc,0xa6,0x20,0x88,0x22,0x88,0x4a,0x92,0x40,
0x52,0x92,0x84,0x40,0x93,0x44,0x51,0x84,0x48,0x92,0x84,0x24,0x4c,0x18,0x87,0x20,
0xc8,0x13,0x94,0x94,0x23,0x07,0xf0,0x07,0x44,0x12,0x4a,0x48,0x09,0xb2,0x9c,0x09,
0xb2,0x84,0x96,0x92,0xc6,0x32,0x95,0x18,0x22,0x48,0xcc,0x23,0x92,0x0c,0x92,0x9a,
0x22,0xc8,0xa2,0x32,0x38,0xa9,0x42,0x4a,0x28,0x89,0x99,0x88,0x31,0x45,0x93,0x03,
0x18,0x03,0xf0,0xe0,0xe0,0x30,0xe0,0xc1,0x80,0x8a,0xc4,0x0c,0x68,0xf0,0x80,0x0b,
0x03,0x03,0x01,0x01,0xb0,0x07,0x70,0x70,0x07,0x04,0x0c,0x06,0x07,0x07,0x03,0x03,
0x00,0x00,0x00,0x80,0xc0,0xe0,0xb0,0x90,0x1c,0x0c,0x06,0x07,0xf0,0xf0,0xe0,0xe0,
0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x02,0x03,0x03,0x01,0x03,0x03,0x03,0x01,0x03,
0x12,0x44,0x11,0xb4,0xd0,0xc0,0xa4,0x44,0xc0,0xe0,0xe0,0xe1,0xd0,0xd8,0xf0,0xf0,
0x10,0xc0,0x40,0xa0,0x82,0x42,0x92,0x00,0x00,0x20,0x00,0x80,0x24,0x90,0x90,0x40,
0x00,0x00,0x00,0x40,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,
0xc9,0x60,0x80,0x80,0x00,0x00,0x03,0x07,0x03,0x06,0x08,0x38,0x70,0xe0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x07,0x07,0x07,0x07,0xf0,
0x92,0x90,0x44,0x11,0x80,0x08,0x22,0x92,0x02,0x20,0xe0,0x40,0x08,0x40,0xac,0x06,
0x22,0x03,0x03,0x0b,0x0e,0x03,0x48,0x48,0x01,0x45,0xac,0x0e,0x06,0x19,0x60,0xf0,
0x4c,0x0c,0x12,0xcc,0x92,0xd2,0xc1,0x25,0x80,0x61,0x30,0xc6,0x19,0xc3,0x30,0xc3,
0x01,0xc5,0xc0,0x13,0xe8,0x07,0x30,0x60,0x06,0x90,0x16,0x4a,0x95,0xf0,0x60,0xc3,
0x49,0x8d,0x96,0xc9,0xc0,0x01,0x01,0xf0,0x62,0x64,0x34,0x93,0x4c,0xc0,0xe0,0xe0,
0x91,0xc8,0x95,0xc9,0x26,0x02,0x00,0x01,0x8c,0x8a,0xa9,0x52,0xa5,0x89,0x21,0x89,
0x19,0x51,0x29,0x8a,0x96,0xd8,0xb4,0x68,0x03,0x07,0xf0,0x03,0x21,0x13,0x90,0xd8,
0x03,0x0e,0xe0,0x38,0x06,0xb8,0xf0,0xc3,0x03,0xc0,0x0c,0xa1,0xc0,0x82,0x28,0x80,
0xc0,0xc0,0x84,0x34,0x38,0xf0,0xc0,0xe8,0x01,0x01,0x10,0xd4,0x52,0xa9,0x22,0xac,
0xc0,0xd0,0x70,0x38,0xb8,0x30,0x30,0xf0,0x80,0x00,0x01,0x03,0xf0,0x13,0x01,0x10,
0xf0,0xe0,0x80,0x04,0x88,0x25,0x20,0x24,0x0b,0x00,0x02,0x48,0x00,0x99,0x10,0x44,
0xb4,0x07,0x07,0x13,0x07,0xe8,0x03,0x80,0x07,0x07,0x07,0x03,0x03,0x01,0xc0,0xe0,
0x40,0x90,0x25,0x93,0xd2,0xa4,0x99,0xe0,0x00,0x92,0x49,0x92,0xa6,0x44,0x50,0x99,
0x92,0x92,0x92,0x68,0xb0,0x80,0x00,0xa4,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x03,
0x1c,0x50,0x40,0x00,0x00,0xe8,0xd1,0x44,0x00,0x00,0x00,0x00,0x21,0x52,0x49,0x2c,
0x00,0x00,0x00,0x02,0x26,0xf0,0x0d,0xf0,0xf0,0xe0,0xc0,0x92,0xa4,0x99,0x99,0x58,
0xf0,0x93,0x13,0xd0,0x46,0x32,0x89,0x13,0x52,0x19,0xa5,0x2c,0x95,0x9a,0x99,0x99,
0x03,0xb4,0x23,0xa5,0x83,0x99,0x43,0x24,0xa0,0xf0,0x07,0xc0,0xc8,0xc3,0x03,0x07,
0x91,0x18,0x82,0x8d,0x89,0xf0,0xc0,0xe0,0x18,0xc2,0x10,0x84,0x91,0x44,0x25,0x03,
0xe0,0x06,0x01,0x07,0xc0,0x80,0xf0,0xb1,0x0c,0x07,0xc0,0x00,0x07,0x26,0x26,0x96,
0xe0,0x00,0x06,0xd8,0x48,0xa4,0x99,0x99,0x80,0xe4,0xc4,0xd2,0x29,0xc0,0x14,0x06,
0x01,0x01,0x40,0x87,0x83,0x19,0xcc,0xb0,0x96,0x10,0x49,0x06,0x91,0x04,0x95,0x4a,
0xd8,0x24,0xa4,0x49,0x90,0xb2,0x9a,0xca,0x23,0x07,0x21,0xac,0xd4,0xca,0x12,0xa4,
0x38,0xe0,0x0e,0xc0,0xe0,0xa0,0xb8,0x91,0x80,0xa4,0x10,0xd0,0x90,0x07,0xc0,0x9a,
0x92,0x04,0x60,0x8b,0x88,0x20,0x04,0x41,0x21,0x96,0xe8,0xe0,0xc0,0x8a,0x12,0x24,
0xe0,0x80,0x04,0x01,0x01,0x93,0x01,0x01,0xc0,0xc0,0x80,0x00,0x00,0x12,0x40,0x0c,
0x92,0x34,0x04,0x10,0x44,0x10,0x92,0x48,0x44,0x44,0x00,0x88,0x20,0x00,0x44,0x00,
0xd0,0x0b,0x95,0x9a,0x52,0x4c,0x96,0xf0,0xf0,0x08,0x10,0xc0,0x8b,0x45,0x26,0x96,
0xc8,0x03,0x01,0x01,0x00,0x00,0xc0,0x50,0x60,0x60,0x60,0x25,0xf0,0x52,0x06,0x16,
0xc4,0x60,0x19,0x92,0xa4,0x9a,0x94,0xb0,0x52,0x92,0x92,0x2c,0x24,0x91,0x64,0x89,
0x19,0xc2,0x9a,0xa2,0x09,0x64,0xf0,0x64,0xa1,0x25,0xcc,0xcc,0x40,0xc8,0xa4,0x80,
0x92,0xe0,0x70,0x20,0x80,0x20,0x40,0x90,0x34,0x18,0xa5,0x32,0x24,0x24,0x10,0x12,
0xc8,0x12,0x06,0x45,0x81,0x82,0x10,0x80,0x9a,0x95,0x94,0x49,0x22,0x4a,0xa9,0x10,
0x26,0x4a,0xa4,0x03,0xd2,0xa5,0xe8,0x52,0x07,0xf0,0x00,0x02,0xe0,0x25,0x90,0x52,
0xe0,0xc0,0x0d,0xe0,0x64,0x09,0x89,0x99,0x64,0x06,0x99,0x9a,0x14,0xd2,0xd8,0xf0,
0x32,0x32,0xca,0xa4,0xd4,0xe0,0x00,0x00,0x4a,0xa4,0xd4,0x07,0x40,0x04,0x00,0x00,
0x93,0xf0,0x40,0x00,0x20,0x40,0x40,0xcc,0xc0,0xc0,0xc0,0xe0,0xe4,0xe0,0xc6,0xb1,
0xb0,0xb0,0x07,0x07,0x13,0x83,0x28,0x07,0x12,0x0a,0x00,0x00,0x00,0x12,0xd2,0x25,
0x32,0x84,0x49,0x0b,0xb4,0x12,0x94,0x64,0x89,0x52,0xa9,0x49,0x95,0x92,0x80,0x92,
0x4a,0xb2,0x04,0xa6,0x29,0xc8,0x48,0x02,0xa2,0x10,0xd4,0x48,0x2a,0x54,0x80,0x80,
0x10,0x84,0x21,0x88,0x90,0x24,0x00,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x03,
0x00,0x00,0x00,0x01,0x07,0xe0,0x92,0x04,0xa1,0x80,0x92,0x44,0x11,0x04,0xa2,0x88,
0x20,0xa4,0x90,0x48,0x22,0x90,0x44,0x50,0x88,0x00,0x22,0x08,0x00,0x84,0x10,0x02,
0x01,0x80,0xe0,0x80,0x00,0x00,0xf0,0xd0,0xb2,0x2a,0x0b,0x0e,0x07,0x99,0xe0,0xc0,
0xc4,0xca,0xd8,0x25,0xac,0x54,0x2a,0xc9,0x09,0x04,0x02,0xc0,0x32,0xc3,0x80,0x00,
0xca,0x0b,0x4a,0xa4,0x24,0x26,0xf0,0x00,0x32,0x90,0xc9,0x40,0x80,0x24,0xa9,0x00,
0x99,0x24,0x99,0x00,0x00,0x99,0xc4,0x00,0x52,0x62,0x24,0xf0,0x0b,0xc0,0x00,0x01,
0x80,0x32,0x32,0xc2,0xe4,0x38,0x0c,0x0c,0x24,0x49,0x24,0xb4,0x20,0x80,0xc0,0x60,
0x84,0x21,0x8c,0xb0,0x04,0x08,0x00,0x04,0x81,0xd8,0xe0,0x00,0x00,0x00,0x00,0x00,
0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0xa5,0x70,0x07,0x00,0x00,0x80,0x00,
0xe8,0xe8,0x00,0x00,0x04,0x00,0x00,0x80,0x80,0x08,0x00,0x40,0x04,0x00,0x00,0x00,
0x88,0x02,0x40,0x00,0x88,0x22,0x00,0x00,0x40,0x12,0x80,0x24,0x84,0x14,0x12,0x00,
0x52,0xc0,0xd1,0xc0,0xa4,0xc3,0x60,0x62,0x02,0xd2,0x61,0xa9,0xc3,0x03,0xe8,0xb4,
0x43,0x30,0xe4,0x20,0x49,0x06,0xc0,0x13,0x0b,0xc0,0xa2,0xe0,0x0b,0x06,0x85,0x90,
0xf0,0xf0,0x20,0x88,0x23,0x28,0x4a,0x52,0x40,0xc8,0x92,0x08,0x04,0x44,0x46,0x8c,
0x90,0x25,0x8d,0x02,0x88,0xa0,0x92,0x52,0x48,0x93,0x80,0x83,0x62,0x16,0x68,0xb0,
0x92,0x40,0xa0,0x04,0x50,0x12,0x80,0x20,0x42,0x10,0x85,0xf0,0x52,0x13,0x84,0x21,
0x48,0x02,0xe0,0x48,0x42,0x90,0x04,0x21,0x81,0xa4,0x80,0xca,0xc0,0xd1,0xc4,0xe0,
0x90,0x24,0x80,0x48,0x48,0x20,0x84,0x90,0x88,0x04,0x44,0x08,0x02,0x88,0x04,0x14,
0x02,0x01,0x07,0xf0,0xc0,0xf0,0x07,0x49,0x03,0xc8,0x94,0x81,0x20,0x80,0x03,0xe0,
0x87,0x00,0x13,0x44,0x03,0xe0,0x00,0x00,0x00,0x00,0xe0,0xc0,0x04,0x10,0x02,0x48,
0x00,0x00,0x80,0x10,0x00,0x84,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x48,0x08,0x20,
0x02,0x00,0x00,0x00,0x08,0x00,0x80,0x00,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x80,
0xc1,0xe1,0xc3,0xc1,0x10,0x81,0x20,0x01,0x60,0x20,0x20,0x20,0x80,0x40,0x00,0x20,
0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x24,0x80,0x12,
0x00,0x00,0x00,0x04,0x40,0x10,0x84,0x20,0x24,0x00,0x48,0x00,0x04,0x80,0x00,0x12,
0x24,0x00,0x88,0x20,0x02,0x80,0x04,0x20,0x88,0x20,0x84,0x10,0x42,0x08,0x80,0x22,
0x88,0x22,0x89,0x24,0x45,0x11,0x87,0x25,0x48,0xa5,0xb4,0xb4,0x25,0x95,0x93,0xb4,
0x49,0xc0,0xc0,0xc0,0xa1,0xc0,0xc8,0x80,0x1a,0xe2,0xd2,0xa5,0xb4,0x93,0x4c,0x96,
0x1c,0x16,0x26,0x09,0xe8,0x15,0x04,0x11,0x92,0x30,0x64,0xc9,0x32,0xc4,0x51,0x54,
0x54,0xaa,0xa9,0x26,0x58,0x93,0x24,0x49,0xa6,0x58,0xb1,0x99,0x58,0x49,0x98,0x91,
0x4c,0xa3,0x91,0x24,0x49,0x80,0xcc,0x48,0x84,0x20,0x82,0x48,0x42,0x12,0xa4,0x25,
0x49,0x12,0x16,0xc0,0xd2,0xa5,0x94,0x51,0x90,0x04,0x40,0x12,0x40,0xcc,0x20,0x02,
0x03,0xd2,0x08,0x22,0x82,0x18,0xc0,0x05,0xe2,0x60,0x8b,0x70,0x20,0x8a,0xf0,0xf0,
0x40,0x08,0x80,0x24,0x44,0x24,0x90,0x00,0x02,0x00,0x80,0x00,0x40,0xe0,0xe0,0xe0
};

38
demos/picshow/picshow.c Normal file
View File

@ -0,0 +1,38 @@
// image converted with: Convert9918 - A simple image converter for the TMS9918A
// http://harmlesslion.com
#include <tms9918.h>
#pragma data_seg(Code)
#include "pic_c.h"
#include "pic_p.h"
#pragma data_seg(Data)
void main() {
#ifdef APPLE1
apple1_eprom_init();
#endif
woz_puts("DISPLAYING PICTURE...\r\r");
// in screen 2
tms_init_regs(SCREEN2_TABLE);
screen2_init_bitmap(FG_BG(COLOR_WHITE,COLOR_BLACK));
// bulk copy color table to VRAM
tms_set_vram_write_addr(TMS_COLOR_TABLE);
for(word t=0; t<sizeof(pic_c); t++) {
TMS_WRITE_DATA_PORT(pic_c[t]);
}
// bulk copy pattern table to VRAM
tms_set_vram_write_addr(TMS_PATTERN_TABLE);
for(word t=0; t<sizeof(pic_p); t++) {
TMS_WRITE_DATA_PORT(pic_p[t]);
}
// bye
while(apple1_getkey()!=CHR_RETURN);
woz_puts("BYE!\r");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

View File

@ -9,15 +9,16 @@
#define BCOLS 10 // number of board columns
#define BROWS 20 // number of board rows
#define EMPTY NUMPIECES // the empty character is the character after all tetrominoes
#define MARKED 255 // mark position on the board while moving (to reduce flickering)
// TODO KickC doesn't allow double arrays[][]
//byte board[32 /*BROWS*/ ][16 /*BCOLS*/]; // the board
byte board[16*BROWS];
#define BOARD_INDEX(x,y) (((int)(y))*16+((int)(x)))
#define WRITE_BOARD(x,y,c) board[BOARD_INDEX(x,y)]=(c)
#define READ_BOARD(x,y) board[BOARD_INDEX(x,y)]
#define BOARD_INDEX(y,x) (((int)(y))*16+((int)(x)))
#define WRITE_BOARD(y,x,c) board[BOARD_INDEX(y,x)]=(c)
#define READ_BOARD(y,x) board[BOARD_INDEX(y,x)]
// prototypes
void ck_init();
@ -45,7 +46,7 @@ void ck_drawpiece(sprite *pl) {
int x = pl->x + d->offset_x;
int y = pl->y + d->offset_y;
*/
WRITE_BOARD(x,y,pl->piece);
WRITE_BOARD(y,x,pl->piece);
data++;
}
}
@ -60,7 +61,22 @@ void ck_erasepiece(sprite *pl) {
int x = pl->x + (int) data->offset_x;
int y = pl->y + (int) data->offset_y;
*/
WRITE_BOARD(x,y,EMPTY);
WRITE_BOARD(y,x,EMPTY);
data++;
}
}
// draw a piece on the check board, marking it with high bit set
void ck_markpiece(sprite *pl) {
tile_offset *data = get_piece_offsets(pl->piece, pl->angle);
for(byte t=0; t<4; t++) {
int x = pl->x; byte x1 = data->offset_x; x+= (int) x1;
int y = pl->y; byte y1 = data->offset_y; y+= (int) y1;
/*
int x = pl->x + (int) data->offset_x;
int y = pl->y + (int) data->offset_y;
*/
WRITE_BOARD(y,x,MARKED);
data++;
}
}
@ -77,7 +93,7 @@ int collides(sprite *pl) {
if(x<0) return 1; // does it collide with left border?
if(x>=BCOLS) return 1; // does it collide with right border?
if(y>=BROWS) return 1; // does it collide with bottom?
if(READ_BOARD(x,y) != EMPTY) return 1; // does it collide with something?
if(READ_BOARD(y,x) != EMPTY) return 1; // does it collide with something?
data++;
}
return 0;
@ -86,7 +102,7 @@ int collides(sprite *pl) {
// returns 1 if the line is all filled
byte is_line_filled(byte line) {
for(byte t=0;t<BCOLS;t++) {
if(READ_BOARD(t,line)==EMPTY) return 0;
if(READ_BOARD(line,t)==EMPTY) return 0;
}
return 1;
}
@ -94,7 +110,7 @@ byte is_line_filled(byte line) {
// fills the specified line with an empty character
void ck_erase_line(byte line) {
for(byte t=0; t<BCOLS; t++) {
WRITE_BOARD(t,line,EMPTY);
WRITE_BOARD(line,t,EMPTY);
}
}
@ -102,7 +118,7 @@ void ck_erase_line(byte line) {
void ck_scroll_down(byte endline) {
for(byte line=endline;line>0;line--) {
for(byte x=0;x<BCOLS;x++) {
WRITE_BOARD(x,line,READ_BOARD(x,line-1));
WRITE_BOARD(line,x,READ_BOARD(line-1,x));
}
}
// clears the top line

View File

@ -37,8 +37,8 @@
void draw_tile(byte x, byte y, byte ch, byte col) {
byte *source = &FONTS[(word)ch*8];
word addr = x*8 + y*256;
tms_set_vram_write_addr(SCREEN2_PATTERN_TABLE + addr); for(byte i=0;i<8;i++) { TMS_WRITE_DATA_PORT(source[i]); NOP; /*NOP;*/ /*NOP; NOP;*/ /*NOP; NOP; NOP; NOP;*/ }
tms_set_vram_write_addr(SCREEN2_COLOR_TABLE + addr); for(byte i=0;i<8;i++) { TMS_WRITE_DATA_PORT(col); NOP; /*NOP;*/ /*NOP; NOP;*/ /*NOP; NOP; NOP; NOP;*/ }
tms_set_vram_write_addr(TMS_PATTERN_TABLE + addr); for(byte i=0;i<8;i++) { TMS_WRITE_DATA_PORT(source[i]); NOP; /*NOP;*/ /*NOP; NOP;*/ /*NOP; NOP; NOP; NOP;*/ }
tms_set_vram_write_addr(TMS_COLOR_TABLE + addr); for(byte i=0;i<8;i++) { TMS_WRITE_DATA_PORT(col); NOP; /*NOP;*/ /*NOP; NOP;*/ /*NOP; NOP; NOP; NOP;*/ }
}
void draw_string(byte x, byte y, byte *s, byte color) {

View File

@ -195,6 +195,33 @@ void gr_erasepiece(sprite *p) {
}
}
// erase piece from the screen
void gr_erasepiece_unmarked(sprite *p) {
tile_offset *data = get_piece_offsets(p->piece, p->angle);
int px = p->x;
int py = p->y;
int zx = px;
int zy = py;
px += STARTBOARD_X;
py += STARTBOARD_Y;
for(byte t=0; t<4; t++) {
int x = px; byte x1 = data->offset_x; x+= (int) x1;
int y = py; byte y1 = data->offset_y; y+= (int) y1;
int cx = p->x; cx += (int) x1;
int cy = p->y; cy += (int) y1;
data++;
if(READ_BOARD(cy,cx) != MARKED) {
draw_tile((byte)x,(byte)y,EMPTY_GR_CHAR,EMPTY_GR_COLOR);
}
}
}
// draw a piece on the screen
void gr_drawpiece(sprite *p) {
tile_offset *data = get_piece_offsets(p->piece, p->angle);
@ -237,7 +264,7 @@ void gr_update_board() {
byte tile,ch,col;
for(byte line=0;line<BROWS;line++) {
for(byte column=0;column<BCOLS;column++) {
tile = READ_BOARD(column,line);
tile = READ_BOARD(line,column);
ch = piece_chars[tile];
col = piece_colors[tile];
draw_tile(STARTBOARD_X+column, STARTBOARD_Y+line, ch, col);

2
demos/tetris/m.bat Normal file
View File

@ -0,0 +1,2 @@
@rem === BUILD TETRIS ===
call ..\..\tools\build tetris

View File

@ -1,9 +1,3 @@
// TODO-KICKC: NPE when -t VIC20_8K is missing
// TODO-KICKC: NPE when array initializer contains unesisting macro
// TODO-KICKC: #include "keyboard.h" switches to c64 ?
// TODO-KICKC: conflict parameter if prototype has different parameter names
// TODO-KICKC: missing fragment: int x = pl->x + data[t].offset_x; oppure int x = pl->x + d->offset_x;
// TODO: solve division by counter_factor
// TODO: interrupt and wait_interrupt()
@ -25,13 +19,7 @@
// TODO solve division by counter_factor
#include "../lib/utils.h"
#include "../lib/apple1.h"
#include "../lib/tms9918.h"
#include "../lib/font8x8.h"
#include "../lib/tms_screen1.h"
#include "../lib/tms_screen2.h"
#include "../lib/interrupt.h"
#include <tms9918.h>
#include "draw.h"
#include "pieces.h"
@ -78,8 +66,8 @@ word drop_counter_max; // maximum value of the counter
unsigned long score; // player's score
unsigned int level; // level
unsigned int lines_remaining; // lines to complete the level
unsigned int total_lines; // total number of lines
int lines_remaining; // lines to complete the level
// game files
#include "pieces.h"
@ -164,8 +152,14 @@ void handle_player_input() {
if(collides(&new_pos)) {
break;
}
gr_erasepiece(&player);
gr_drawpiece(&new_pos);
// gr_erasepiece(&player);
// gr_drawpiece(&new_pos);
// flicker-free version
ck_markpiece(&new_pos);
gr_erasepiece_unmarked(&player);
gr_drawpiece(&new_pos);
ck_drawpiece(&new_pos);
sprite_copy(&player,&new_pos);
}
@ -174,8 +168,14 @@ void handle_player_input() {
}
if(allowed == 1) {
gr_erasepiece(&player);
gr_drawpiece(&new_pos);
// gr_erasepiece(&player);
// gr_drawpiece(&new_pos);
// flicker-free version
ck_markpiece(&new_pos);
gr_erasepiece_unmarked(&player);
gr_drawpiece(&new_pos);
sprite_copy(&player, &new_pos);
}
ck_drawpiece(&player);
@ -207,10 +207,16 @@ void gameLoop() {
}
else {
// automatic drop does not collide, simply draw it
gr_erasepiece(&player); // erase and draw are as close as possible
gr_drawpiece(&new_pos);
ck_drawpiece(&new_pos);
sprite_copy(&player, &new_pos); // make player new pos
// gr_erasepiece(&player); // erase and draw are as close as possible
// gr_drawpiece(&new_pos);
// flicker-free version
ck_markpiece(&new_pos);
gr_erasepiece_unmarked(&player);
gr_drawpiece(&new_pos);
sprite_copy(&player, &new_pos);
ck_drawpiece(&player);
}
}
else {
@ -253,7 +259,7 @@ void check_crunched_lines() {
score += (unsigned long) s;
// score += scores[num_lines_crunched] * (level+1);
lines_remaining -= num_lines_crunched;
lines_remaining -= (int) num_lines_crunched;
total_lines += num_lines_crunched;
// advance level

Binary file not shown.

View File

@ -1,6 +1,6 @@
// Apple 1
.file [name="%O", type="prg", segments="Program"]
.segmentdef Program [segments="Code, Data"]
.segmentdef Code [start=%P,outBin="apple1_codeseg.bin"]
.segmentdef Data [start=$0280,min=$0280,max=$0fff,outBin="apple1_dataseg.bin"]
.segmentdef Code [start=%P]
.segmentdef Data [startAfter="Code"]

View File

@ -1,10 +1,15 @@
{
"extension": "prg",
"link": "apple1.ld",
"start_address": "0x2000",
"start_address": "0x280",
"cpu": "MOS6502X",
"interrupt": "hardware_all",
"emulator": "x64sc"
"emulator": "x64sc",
"defines": {
"__APPLE1__": 1,
"APPLE1": 1,
"__KICKC__": 1
}
}

6
kickc/apple1_jukebox.ld Normal file
View File

@ -0,0 +1,6 @@
// Apple 1
.file [name="%O", type="prg", segments="Program"]
.segmentdef Program [segments="Code, Data"]
.segmentdef Code [start=$4000,min=$4000,max=$7fff,outBin="apple1_codeseg.bin"]
.segmentdef Data [start=$0280,min=$0280,max=$0fff,outBin="apple1_dataseg.bin"]

17
kickc/apple1_jukebox.tgt Normal file
View File

@ -0,0 +1,17 @@
{
"extension": "prg",
"link": "apple1_jukebox.ld",
"start_address": "0x4000",
"cpu": "MOS6502X",
"interrupt": "hardware_all",
"emulator": "x64sc",
"defines": {
"__APPLE1__": 1,
"APPLE1": 1,
"APPLE1_JUKEBOX": 1,
"__KICKC__": 1
}
}

View File

@ -7,6 +7,8 @@
"interrupt": "rom_min_vic20",
"emulator": "xvic",
"defines": {
"__VIC20__": 1
"__VIC20__": 1,
"VIC20": 1,
"__KICKC__": 1
}
}

View File

@ -1,6 +1,5 @@
#ifdef APPLE1
// APPLE1
#pragma start_address(0x4000)
// APPLE1
const word WOZMON = 0xFF1F; // enters monitor
const word ECHO = 0xFFEF; // output ascii character in A (A not destroyed)
const word PRBYTE = 0xFFDC; // print hex byte in A (A destroyed)

181
lib/screen1.h Normal file
View File

@ -0,0 +1,181 @@
byte SCREEN1_TABLE[8] = { 0x00, 0xc0, 0x0e, 0x80, 0x00, 0x76, 0x03, 0x25 };
const word SCREEN1_SIZE = (32*24);
// loads the font on the pattern table
void screen1_load_font() {
byte *source = FONT;
// start writing into VRAM from space character (32..127)
tms_set_vram_write_addr(TMS_PATTERN_TABLE+(32*8));
for(word i=768;i!=0;i--) {
TMS_WRITE_DATA_PORT(*source++);
}
// reverse font (32..127)
source = FONT;
tms_set_vram_write_addr(TMS_PATTERN_TABLE+((128+32)*8));
for(word i=768;i!=0;i--) {
TMS_WRITE_DATA_PORT(~(*source++));
}
}
void screen1_cls() {
// fills name table with spaces (32)
tms_set_vram_write_addr(TMS_NAME_TABLE);
for(word i=SCREEN1_SIZE;i!=0;i--) {
TMS_WRITE_DATA_PORT(32);
}
tms_cursor_x = 0;
tms_cursor_y = 0;
}
void screen1_scroll_up() {
word source = TMS_NAME_TABLE + 1*32;
word dest = TMS_NAME_TABLE + 0*32;
word count = 768-32;
for(;count!=0;source++,dest++,count--) {
tms_set_vram_read_addr(source);
byte c = TMS_READ_DATA_PORT;
tms_set_vram_write_addr(dest);
TMS_WRITE_DATA_PORT(c);
}
// fill last line with spaces
for(word i=0;i<32;i++) {
TMS_WRITE_DATA_PORT(32); NOP; NOP; NOP; NOP;
}
}
void screen1_prepare() {
// fill name table with spaces (32)
screen1_cls();
// clear all the sprites
tms_clear_sprites();
// fill pattern table with 0
tms_set_vram_write_addr(TMS_PATTERN_TABLE);
for(word i=256*8;i!=0;i--) {
TMS_WRITE_DATA_PORT(0);
}
// fill color table with black on white
tms_set_vram_write_addr(TMS_COLOR_TABLE);
for(byte i=32;i!=0;i--) {
TMS_WRITE_DATA_PORT(FG_BG(COLOR_BLACK,COLOR_WHITE));
}
}
#ifdef VIC20
#define CHR_BACKSPACE 20
#else
#define CHR_BACKSPACE 8
#endif
#define CHR_HOME 11
#define CHR_CLS 12
#define CHR_REVERSE_ON 15
#define CHR_RETURN 13
#define CHR_REVERSE_OFF 14
#define CHR_SPACE 32
#define CHR_REVSPACE (32+128)
#define HOME "\x0b"
#define CLS "\x0c"
#define REVERSE_OFF "\x0e"
#define REVERSE_ON "\x0f"
// prints character to TMS (SCREEN 1 MODE)
void screen1_putc(byte c) {
if(c==CHR_CLS) {
screen1_cls();
}
else if(c==CHR_HOME) {
tms_cursor_x = 0;
tms_cursor_y = 0;
}
else if(c==CHR_REVERSE_OFF) {
// shift out as reverse off
tms_reverse = 0;
}
else if(c==CHR_REVERSE_ON) {
// shift in as reverse on
tms_reverse = 1;
}
else if(c==CHR_BACKSPACE) {
// backspace
if(tms_cursor_x!=0) {
tms_cursor_x--;
}
else {
if(tms_cursor_y!=0) {
tms_cursor_y--;
tms_cursor_x = 31;
}
}
}
else {
if(c=='\r'||c=='\n') {
tms_cursor_x=31;
}
else {
if(tms_reverse) c |= 128;
word addr = TMS_NAME_TABLE + (word) tms_cursor_y * 32 + tms_cursor_x;
tms_set_vram_write_addr(addr);
TMS_WRITE_DATA_PORT(c);
}
if(tms_cursor_x==31) {
tms_cursor_x=0;
if(tms_cursor_y==23) screen1_scroll_up();
else tms_cursor_y++;
}
else tms_cursor_x++;
}
}
// prints a 0 terminated string to TMS (SCREEN 1 MODE)
void screen1_puts(byte *s) {
byte c;
while(c=*s++) {
screen1_putc(c);
}
}
inline void screen1_locate(byte x, byte y) {
tms_cursor_x = x;
tms_cursor_y = y;
}
void screen1_strinput(byte *buffer, byte max_length) {
byte pos=0;
screen1_putc(CHR_REVSPACE);
screen1_putc(CHR_BACKSPACE);
while(1) {
byte key = apple1_getkey();
if(key==CHR_RETURN) {
buffer[pos] = 0;
screen1_putc(CHR_SPACE);
screen1_putc(CHR_BACKSPACE);
return;
}
else if(key==CHR_BACKSPACE) {
if(pos!=0) {
pos--;
screen1_putc(CHR_BACKSPACE);
screen1_putc(CHR_REVSPACE);
screen1_putc(CHR_SPACE);
screen1_putc(CHR_BACKSPACE);
screen1_putc(CHR_BACKSPACE);
}
}
else if(key>=32 && key<=128) {
if(pos < max_length) {
buffer[pos++] = key;
screen1_putc(key);
screen1_putc(CHR_REVSPACE);
screen1_putc(CHR_BACKSPACE);
}
}
}
}

View File

@ -1,57 +1,28 @@
byte SCREEN2_TABLE[8] = {
0x02, 0xc0, 0x0e, 0xff, 0x03, 0x76, 0x03, 0x25
};
byte SCREEN2_TABLE[8] = { 0x02, 0xc0, 0x0e, 0xff, 0x03, 0x76, 0x03, 0x25 };
// SCREEN 2 VALUES
// pattern table: $0000-$17FF (256*8*3)
// sprite patterns: $1800-$19FF
// color table: $2000-$27FF (256*8*3)
// name table: $3800-$3AFF (32*24 = 256*3 = 768)
// sprite attributes: $3B00-$3BFF
// unused $3C00-$3FFF
//
const word SCREEN2_PATTERN_TABLE = 0x0000;
const word SCREEN2_NAME_TABLE = 0x3800;
const word SCREEN2_COLOR_TABLE = 0x2000;
const word SCREEN2_SPRITE_PATTERNS = 0x1800;
const word SCREEN2_SPRITE_ATTRS = 0x3b00;
const word SCREEN2_SIZE = (32*24);
const word SCREEN2_SIZE = (32*24);
// prepare the screen 2 to be used as a bitmap
void screen2_init_bitmap(byte color) {
// erase the first sprite pattern
tms_set_vram_write_addr(SCREEN2_SPRITE_PATTERNS); // start writing in the sprite patterns
for(byte i=0;i<8;i++) {
TMS_WRITE_DATA_PORT(0); NOP;
}
// set all sprite coordinates to 0
tms_set_vram_write_addr(SCREEN2_SPRITE_ATTRS); // start writing in the sprite attribute
for(byte i=0;i<32;i++) {
TMS_WRITE_DATA_PORT(0); NOP; // y coordinate
TMS_WRITE_DATA_PORT(0); NOP; // x coordinate
TMS_WRITE_DATA_PORT(0); NOP; // name
TMS_WRITE_DATA_PORT(i); NOP; // color
}
// erases all the sprites
tms_clear_sprites();
// fill pattern table with 0 (clear screen)
tms_set_vram_write_addr(SCREEN2_PATTERN_TABLE);
tms_set_vram_write_addr(TMS_PATTERN_TABLE);
for(word i=768*8;i!=0;i--) {
TMS_WRITE_DATA_PORT(0);
NOP;
}
// fill color table with black on white
tms_set_vram_write_addr(SCREEN2_COLOR_TABLE);
tms_set_vram_write_addr(TMS_COLOR_TABLE);
for(word i=768*8;i!=0;i--) {
TMS_WRITE_DATA_PORT(color);
NOP;
}
// fills name table x3 with increasing numbers
tms_set_vram_write_addr(SCREEN2_NAME_TABLE);
tms_set_vram_write_addr(TMS_NAME_TABLE);
for(word i=0;i<SCREEN2_SIZE;i++) {
TMS_WRITE_DATA_PORT(i & 0xFF);
NOP;
@ -61,11 +32,11 @@ void screen2_init_bitmap(byte color) {
void screen2_putc(byte ch, byte x, byte y, byte col) {
byte *source = &FONT[(word)(ch-32)*8];
word addr = x*8 + y*256;
tms_set_vram_write_addr(SCREEN2_PATTERN_TABLE + addr); for(byte i=0;i<8;i++) TMS_WRITE_DATA_PORT(source[i]);
tms_set_vram_write_addr(SCREEN2_COLOR_TABLE + addr); for(byte i=0;i<8;i++) TMS_WRITE_DATA_PORT(col);
tms_set_vram_write_addr(TMS_PATTERN_TABLE + addr); for(byte i=0;i<8;i++) TMS_WRITE_DATA_PORT(source[i]);
tms_set_vram_write_addr(TMS_COLOR_TABLE + addr); for(byte i=0;i<8;i++) TMS_WRITE_DATA_PORT(col);
}
void screen2_puts(byte x, byte y, byte col, char *s) {
void screen2_puts(char *s, byte x, byte y, byte col) {
byte c;
while(c=*s++) {
screen2_putc(c, x++, y, col);
@ -76,16 +47,16 @@ void screen2_puts(byte x, byte y, byte col, char *s) {
#define PLOT_MODE_SET 1
#define PLOT_MODE_INVERT 2
byte SCREEN2_PLOT_MODE = PLOT_MODE_SET;
byte screen2_plot_mode = PLOT_MODE_SET;
void screen2_plot(byte x, byte y) {
byte pow2_table_reversed[8] = { 128,64,32,16,8,4,2,1 };
word paddr = SCREEN2_PATTERN_TABLE + (word)(x & 0b11111000) + (word)(y & 0b11111000)*32 + y%8;
word paddr = TMS_PATTERN_TABLE + (word)(x & 0b11111000) + (word)(y & 0b11111000)*32 + y%8;
tms_set_vram_read_addr(paddr);
byte data = TMS_READ_DATA_PORT;
byte mask = pow2_table_reversed[x%8];
tms_set_vram_write_addr(paddr);
switch(SCREEN2_PLOT_MODE) {
switch(screen2_plot_mode) {
case PLOT_MODE_RESET:
data &= ~mask;
break;
@ -105,7 +76,7 @@ signed int vti_abs(signed int x) {
}
// http://members.chello.at/~easyfilter/bresenham.html
void vti_line(byte _x0, byte _y0, byte _x1, byte _y1) {
void screen2_line(byte _x0, byte _y0, byte _x1, byte _y1) {
signed int x0 = (signed int) _x0;
signed int x1 = (signed int) _x1;

17
lib/sprites.h Normal file
View File

@ -0,0 +1,17 @@
// clears all the sprites
void tms_clear_sprites() {
// fills first sprite pattern with 0
tms_set_vram_write_addr(TMS_SPRITE_PATTERNS);
for(byte i=0;i<8;i++) {
TMS_WRITE_DATA_PORT(0);
}
// set sprite coordinates to (0,0) and set pattern name 0
tms_set_vram_write_addr(TMS_SPRITE_ATTRS);
for(byte i=0;i<32;i++) {
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // y coordinate
TMS_WRITE_DATA_PORT((6+i)*8); NOP; NOP; NOP; NOP; // x coordinate
TMS_WRITE_DATA_PORT(0); NOP; NOP; NOP; NOP; // name
TMS_WRITE_DATA_PORT(i); NOP; NOP; NOP; NOP; // color
}
}

View File

@ -1,5 +1,19 @@
// TODO a bitmapped text writing routine (double size ecc)
// TODO console like text output in screen 2
// TODO more fonts (C64 and PET/VIC20)
// TODO how to switch fonts?
// TODO do fonts need to start from 32 or 0?
// TODO sprite routines
// TODO test the interrupt routines
// TODO finalize hexdump.js and update README.md
// TODO allow redefinition of I/O ports
// TODO wait_end_of_frame()
// TODO screen1() and screen2() helpers
#pragma encoding(ascii) // encode strings in plain ascii
#include "utils.h"
#ifdef APPLE1
const byte *VDP_DATA = 0xCC00; // TMS9918 data port (VRAM)
const byte *VDP_REG = 0xCC01; // TMS9918 register port (write) or status (read)
@ -47,6 +61,22 @@ const byte COLOR_MAGENTA = 0xD;
const byte COLOR_GREY = 0xE;
const byte COLOR_WHITE = 0xF;
// The library has a fixed VRAM memory layout valid for SCREEN 1 and 2
//
// pattern table: $0000-$17FF (256*8*3)
// sprite patterns: $1800-$19FF
// color table: $2000-$27FF (256*8*3)
// name table: $3800-$3AFF (32*24 = 256*3 = 768)
// sprite attributes: $3B00-$3BFF
// unused $3C00-$3FFF
//
const word TMS_NAME_TABLE = 0x3800;
const word TMS_COLOR_TABLE = 0x2000;
const word TMS_PATTERN_TABLE = 0x0000;
const word TMS_SPRITE_ATTRS = 0x3b00;
const word TMS_SPRITE_PATTERNS = 0x1800;
// macro for combining foreground and background into a single byte value
#define FG_BG(f,b) (((f)<<4)|(b))
@ -59,8 +89,16 @@ const byte COLOR_WHITE = 0xF;
// read/write to TMS9918 macros
#define TMS_WRITE_CTRL_PORT(a) (*VDP_REG=(byte)(a))
#define TMS_WRITE_DATA_PORT(a) (*VDP_DATA=(byte)(a))
#define TMS_READ_CTRL_PORT (*VDP_REG);
#define TMS_READ_DATA_PORT (*VDP_DATA);
#define TMS_READ_CTRL_PORT (*VDP_REG)
#define TMS_READ_DATA_PORT (*VDP_DATA)
// buffer containing the last register values, because TMS registers are write only
byte tms_regs_latch[8];
// cursor coordinates for the console functions
byte tms_cursor_x;
byte tms_cursor_y;
byte tms_reverse;
// sets the VRAM address on the TMS9918 for a write operation
void tms_set_vram_write_addr(word addr) {
@ -74,9 +112,6 @@ void tms_set_vram_read_addr(word addr) {
TMS_WRITE_CTRL_PORT((HIBYTE(addr) & HIADDRESS_MASK)|READ_FROM_VRAM);
}
// buffer containing the last register values, because TMS registers are write only
byte tms_regs_latch[8];
// writes a value to a TMS9918 register (0-7)
void tms_write_reg(byte regnum, byte val) {
TMS_WRITE_CTRL_PORT(val);
@ -122,3 +157,14 @@ void tms_set_external_video(byte val) {
if(val) regvalue |= REG0_EXTVID_MASK;
tms_write_reg(0, regvalue);
}
inline void tms_wait_end_of_frame() {
while(!FRAME_BIT(TMS_READ_CTRL_PORT));
}
#include "apple1.h"
#include "font8x8.h"
#include "sprites.h"
#include "screen1.h"
#include "screen2.h"
#include "interrupt.h"

View File

@ -1,86 +0,0 @@
byte SCREEN1_TABLE[8] = {
0x00, 0xc0, 0x05, 0x80, 0x01, 0x20, 0x00, 0x25
};
// SCREEN 1 VALUES
// sprite patterns: $0000
// pattern table: $0800 (256*8)
// sprite attributes: $1000
// unused: $1080
// name table: $1400 (32*24)
// unused: $1800
// color table: $2000 (32)
// unused $2020-$3FFF
const word SCREEN1_PATTERN_TABLE = 0x0800;
const word SCREEN1_NAME_TABLE = 0x1400;
const word SCREEN1_COLOR_TABLE = 0x2000;
const word SCREEN1_SPRITE_PATTERNS = 0x0000;
const word SCREEN1_SPRITE_ATTRS = 0x1000;
const word SCREEN1_SIZE = (32*24);
// loads the font on the pattern table
void screen1_load_font() {
byte *source = FONT;
// start writing into VRAM from space character (32..127)
tms_set_vram_write_addr(SCREEN1_PATTERN_TABLE+(32*8));
for(word i=768;i!=0;i--) {
TMS_WRITE_DATA_PORT(*source++);
}
// reverse font (32..127)
source = FONT;
tms_set_vram_write_addr(SCREEN1_PATTERN_TABLE+((128+32)*8));
for(word i=768;i!=0;i--) {
TMS_WRITE_DATA_PORT(~(*source++));
}
}
// holds the cursor location for the putchar routine
word screen1_cursor;
// prints character to TMS (SCREEN 1 MODE)
void screen1_putc(byte c) {
tms_set_vram_write_addr(screen1_cursor++);
TMS_WRITE_DATA_PORT(c);
}
// prints a 0 terminated string to TMS (SCREEN 1 MODE)
void screen1_puts(byte *s) {
byte c;
while(c=*s++) {
screen1_putc(c);
}
}
void screen1_home() {
screen1_cursor = SCREEN1_NAME_TABLE;
}
void screen1_locate(byte x, byte y) {
screen1_cursor = SCREEN1_NAME_TABLE + ((word)y)*32 + x;
}
void screen1_prepare() {
// fills name table with spaces (32)
tms_set_vram_write_addr(SCREEN1_NAME_TABLE);
for(word i=SCREEN1_SIZE;i!=0;i--) {
TMS_WRITE_DATA_PORT(32);
}
// fill pattern table with 0
tms_set_vram_write_addr(SCREEN1_PATTERN_TABLE);
for(word i=256*8;i!=0;i--) {
TMS_WRITE_DATA_PORT(0);
}
// fill color table with black on white
tms_set_vram_write_addr(SCREEN1_COLOR_TABLE);
for(byte i=32;i!=0;i--) {
TMS_WRITE_DATA_PORT(FG_BG(COLOR_BLACK,COLOR_WHITE));
}
}

View File

@ -5,3 +5,10 @@
#define LOBYTE(c) (<(c))
#define NOP asm { nop }
#ifndef __KICKC__
// KickC defaults these, while other C compilers do not
// this makes syntax highlight work in common C editors
typedef unsigned char byte;
typedef unsigned int word;
#endif

View File

@ -1,2 +0,0 @@
@rem === BUILD TETRIS ===
call ..\tools\build tetris

View File

@ -1,16 +1,17 @@
@rem === BUILD SCRIPT ===
@SET TARGET=%1
@SET TMS9918=..\..
@echo ======================== VIC20 ===================================================
call kickc -targetdir ..\kickc\ -t VIC20_8K -D=VIC20 %TARGET%.c -o out\%TARGET%_vic20.prg -e
call kickc -includedir %TMS9918%\lib -targetdir %TMS9918%\kickc\ -t VIC20_8K %TARGET%.c -o out\%TARGET%_vic20.prg -e
copy out\%TARGET%.prg out\%TARGET%_vic20.prg
@echo ======================== APPLE 1 =================================================
call kickc -targetdir ..\kickc\ -t apple1 -D=APPLE1 %TARGET%.c -o out\%TARGET%_apple1.prg -e
call kickc -includedir %TMS9918%\lib -targetdir %TMS9918%\kickc\ -t apple1_jukebox %TARGET%.c -o out\%TARGET%_apple1.prg -e
@rem builds the apple1 eprom file
call node ..\tools\mkeprom out out\%TARGET%_apple1.bin
call node %TMS9918%\tools\mkeprom out out\%TARGET%_apple1.bin
@rem clean up files
@del out\apple1_codeseg.bin