diff --git a/.gitignore b/.gitignore index ded309c..2b62c57 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ *.bin bug/* cc65/* +.vscode/* diff --git a/README.md b/README.md index d20e94b..08737b7 100644 --- a/README.md +++ b/README.md @@ -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 `. + +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. diff --git a/bug/bug1.c b/bug/bug1.c deleted file mode 100644 index 65cde19..0000000 --- a/bug/bug1.c +++ /dev/null @@ -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; -} -*/ \ No newline at end of file diff --git a/cc65/c.bat b/cc65/c.bat deleted file mode 100644 index 1819642..0000000 --- a/cc65/c.bat +++ /dev/null @@ -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 - - diff --git a/cc65/cbm_ascii_charmap.h b/cc65/cbm_ascii_charmap.h deleted file mode 100644 index f1381ab..0000000 --- a/cc65/cbm_ascii_charmap.h +++ /dev/null @@ -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) diff --git a/cc65/env.bat b/cc65/env.bat deleted file mode 100644 index 76e393d..0000000 --- a/cc65/env.bat +++ /dev/null @@ -1 +0,0 @@ -PATH %PATH%;C:\Programmi\cc65-snapshot-win32\bin \ No newline at end of file diff --git a/cc65/laser500_font.ascii.c b/cc65/laser500_font.ascii.c deleted file mode 100644 index 9621711..0000000 --- a/cc65/laser500_font.ascii.c +++ /dev/null @@ -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 -}; diff --git a/cc65/screen1.c b/cc65/screen1.c deleted file mode 100644 index e2cc607..0000000 --- a/cc65/screen1.c +++ /dev/null @@ -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> (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--); -// } -// } diff --git a/cc65/test.c b/cc65/test.c deleted file mode 100644 index 30f18ae..0000000 --- a/cc65/test.c +++ /dev/null @@ -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(); -} - diff --git a/demo/demo_screen1.h b/demo/demo_screen1.h deleted file mode 100644 index cfe3283..0000000 --- a/demo/demo_screen1.h +++ /dev/null @@ -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(); -} - diff --git a/demo/demo_screen2.h b/demo/demo_screen2.h deleted file mode 100644 index 9ef1862..0000000 --- a/demo/demo_screen2.h +++ /dev/null @@ -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); -} diff --git a/demo/m.bat b/demo/m.bat deleted file mode 100644 index fc6f548..0000000 --- a/demo/m.bat +++ /dev/null @@ -1,2 +0,0 @@ -@call ..\tools\build demo - diff --git a/demo/demo.c b/demos/demo/demo.c similarity index 70% rename from demo/demo.c rename to demos/demo/demo.c index 66e7c74..b1f8de0 100644 --- a/demo/demo.c +++ b/demos/demo/demo.c @@ -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 #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; diff --git a/demo/demo_amiga_hand.h b/demos/demo/demo_amiga_hand.h similarity index 87% rename from demo/demo_amiga_hand.h rename to demos/demo/demo_amiga_hand.h index 58d79a6..ce75025 100644 --- a/demo/demo_amiga_hand.h +++ b/demos/demo/demo_amiga_hand.h @@ -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)); } diff --git a/demo/demo_blank.h b/demos/demo/demo_blank.h similarity index 100% rename from demo/demo_blank.h rename to demos/demo/demo_blank.h diff --git a/demos/demo/demo_end_of_frame.h b/demos/demo/demo_end_of_frame.h new file mode 100644 index 0000000..7f54199 --- /dev/null +++ b/demos/demo/demo_end_of_frame.h @@ -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!"); +} + diff --git a/demo/demo_extvid.h b/demos/demo/demo_extvid.h similarity index 92% rename from demo/demo_extvid.h rename to demos/demo/demo_extvid.h index 78d8f37..3973364 100644 --- a/demo/demo_extvid.h +++ b/demos/demo/demo_extvid.h @@ -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)); } diff --git a/demo/demo_interrupt.h b/demos/demo/demo_interrupt.h similarity index 100% rename from demo/demo_interrupt.h rename to demos/demo/demo_interrupt.h diff --git a/demos/demo/demo_screen1.h b/demos/demo/demo_screen1.h new file mode 100644 index 0000000..3176f9f --- /dev/null +++ b/demos/demo/demo_screen1.h @@ -0,0 +1,50 @@ +#include + +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("'"); + } +} + diff --git a/demos/demo/demo_screen2.h b/demos/demo/demo_screen2.h new file mode 100644 index 0000000..b5aec3b --- /dev/null +++ b/demos/demo/demo_screen2.h @@ -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); +} diff --git a/demos/demo/m.bat b/demos/demo/m.bat new file mode 100644 index 0000000..77c5a24 --- /dev/null +++ b/demos/demo/m.bat @@ -0,0 +1,2 @@ +@call ..\..\tools\build demo + diff --git a/demos/picshow/m.bat b/demos/picshow/m.bat new file mode 100644 index 0000000..5b7586e --- /dev/null +++ b/demos/picshow/m.bat @@ -0,0 +1,2 @@ +@call ..\..\tools\build picshow + diff --git a/demos/picshow/pic_c.h b/demos/picshow/pic_c.h new file mode 100644 index 0000000..01c782f --- /dev/null +++ b/demos/picshow/pic_c.h @@ -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 +}; \ No newline at end of file diff --git a/demos/picshow/pic_p.h b/demos/picshow/pic_p.h new file mode 100644 index 0000000..614f927 --- /dev/null +++ b/demos/picshow/pic_p.h @@ -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 +}; \ No newline at end of file diff --git a/demos/picshow/picshow.c b/demos/picshow/picshow.c new file mode 100644 index 0000000..dc0011e --- /dev/null +++ b/demos/picshow/picshow.c @@ -0,0 +1,38 @@ +// image converted with: Convert9918 - A simple image converter for the TMS9918A +// http://harmlesslion.com + +#include + +#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; tx + 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;t0;line--) { for(byte x=0;xpiece, 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;linex + 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 #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 diff --git a/docs/TMS9918 VDP Programmer's Guide.pdf b/docs/TMS9918 VDP Programmer's Guide.pdf new file mode 100644 index 0000000..7518e52 Binary files /dev/null and b/docs/TMS9918 VDP Programmer's Guide.pdf differ diff --git a/kickc/apple1.ld b/kickc/apple1.ld index ed73a93..69b9717 100644 --- a/kickc/apple1.ld +++ b/kickc/apple1.ld @@ -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"] diff --git a/kickc/apple1.tgt b/kickc/apple1.tgt index 2c4e65e..5604e4f 100644 --- a/kickc/apple1.tgt +++ b/kickc/apple1.tgt @@ -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 + } } diff --git a/kickc/apple1_jukebox.ld b/kickc/apple1_jukebox.ld new file mode 100644 index 0000000..c927331 --- /dev/null +++ b/kickc/apple1_jukebox.ld @@ -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"] + diff --git a/kickc/apple1_jukebox.tgt b/kickc/apple1_jukebox.tgt new file mode 100644 index 0000000..b2a99db --- /dev/null +++ b/kickc/apple1_jukebox.tgt @@ -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 + } +} + + + diff --git a/kickc/vic20_8k.tgt b/kickc/vic20_8k.tgt index eca4740..ba110dd 100644 --- a/kickc/vic20_8k.tgt +++ b/kickc/vic20_8k.tgt @@ -7,6 +7,8 @@ "interrupt": "rom_min_vic20", "emulator": "xvic", "defines": { - "__VIC20__": 1 + "__VIC20__": 1, + "VIC20": 1, + "__KICKC__": 1 } } \ No newline at end of file diff --git a/lib/apple1.h b/lib/apple1.h index 96291de..fb298cd 100644 --- a/lib/apple1.h +++ b/lib/apple1.h @@ -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) diff --git a/lib/screen1.h b/lib/screen1.h new file mode 100644 index 0000000..34094ea --- /dev/null +++ b/lib/screen1.h @@ -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); + } + } + } +} diff --git a/lib/tms_screen2.h b/lib/screen2.h similarity index 65% rename from lib/tms_screen2.h rename to lib/screen2.h index e2361e3..aa2a083 100644 --- a/lib/tms_screen2.h +++ b/lib/screen2.h @@ -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