]> git.sur5r.net Git - cc65/commitdiff
Merge pull request #269 from jbrandwood/squarebracket
authorOliver Schmidt <ol.sc@web.de>
Thu, 3 Mar 2016 08:07:21 +0000 (09:07 +0100)
committerOliver Schmidt <ol.sc@web.de>
Thu, 3 Mar 2016 08:07:21 +0000 (09:07 +0100)
New ".feature" to use brackets instead of parens for 6502 indirect addressing.

60 files changed:
README.md
asminc/c128.inc
asminc/gamate.inc [new file with mode: 0644]
cfg/c64-overlay.cfg
cfg/c64.cfg
cfg/gamate.cfg [new file with mode: 0644]
doc/c128.sgml
doc/c64.sgml
doc/gamate.sgml [new file with mode: 0644]
doc/index.sgml
include/conio.h
include/gamate.h [new file with mode: 0644]
include/time.h
libsrc/Makefile
libsrc/c128/emd/c128-efnram.s [new file with mode: 0755]
libsrc/c128/emd/c128-ifnram.s [new file with mode: 0755]
libsrc/c64/crt0.s
libsrc/c64/emd/c64-65816.s [new file with mode: 0644]
libsrc/common/moveinit.s [deleted file]
libsrc/gamate/_scrsize.s [new file with mode: 0644]
libsrc/gamate/chline.s [new file with mode: 0644]
libsrc/gamate/clock.s [new file with mode: 0644]
libsrc/gamate/clrscr.s [new file with mode: 0644]
libsrc/gamate/color.s [new file with mode: 0644]
libsrc/gamate/conio.s [new file with mode: 0644]
libsrc/gamate/cputc.s [new file with mode: 0644]
libsrc/gamate/crt0.s [new file with mode: 0644]
libsrc/gamate/ctype.s [new file with mode: 0644]
libsrc/gamate/cvline.s [new file with mode: 0644]
libsrc/gamate/extzp.inc [new file with mode: 0644]
libsrc/gamate/extzp.s [new file with mode: 0644]
libsrc/gamate/gotoxy.s [new file with mode: 0644]
libsrc/gamate/header.s [new file with mode: 0644]
libsrc/gamate/irq.s [new file with mode: 0644]
libsrc/gamate/joy/gamate-stdjoy.s [new file with mode: 0644]
libsrc/gamate/joy_stat_stddrv.s [new file with mode: 0644]
libsrc/gamate/joy_stddrv.s [new file with mode: 0644]
libsrc/gamate/kplot.s [new file with mode: 0644]
libsrc/gamate/libref.s [new file with mode: 0644]
libsrc/gamate/nmi.s [new file with mode: 0644]
libsrc/gamate/revers.s [new file with mode: 0644]
libsrc/gamate/ticktock.s [new file with mode: 0644]
libsrc/gamate/vga.inc [new file with mode: 0644]
libsrc/gamate/waitvblank.s [new file with mode: 0644]
libsrc/gamate/wherex.s [new file with mode: 0644]
libsrc/gamate/wherey.s [new file with mode: 0644]
samples/hello.c
src/ca65/main.c
src/cc65/main.c
src/common/target.c
src/common/target.h
testcode/lib/conio.c
testcode/lib/em-test.c
testcode/lib/gamate/Makefile [new file with mode: 0644]
testcode/lib/gamate/audiotest.s [new file with mode: 0644]
testcode/lib/gamate/cga2.chr [new file with mode: 0644]
testcode/lib/gamate/ctest.c [new file with mode: 0644]
testcode/lib/gamate/lcdtest.s [new file with mode: 0644]
testcode/lib/gamate/nachtm.c [new file with mode: 0644]
util/gamate/gamate-fixcart.c [new file with mode: 0644]

index a0455cbe6b99998b8e6728a6caefc73b6c1c590e..b62ac761dfad0bb3ec6722cd38ac572616a6fce8 100644 (file)
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ including
 - the Atari 8 bit machines.
 - the Atari 5200 console.
 - GEOS for the C64, C128 and Apple //e.
+- the Bit Corporation Gamate console.
 - the NEC PC-Engine (aka TurboGrafx-16).
 - the Nintendo Entertainment System (NES) console.
 - the Watara Supervision console.
index 6e3078297e082cd2f3157d7c2b2c50e79a1f7294..e6c89b07b021939896ad8d7e76657f77838f8fd8 100644 (file)
@@ -204,6 +204,8 @@ MMU_CFG_RAM0    := %00111111    ; Bank 0 full RAM
 MMU_CFG_RAM1    := %01111111    ; Bank 1 full RAM
 MMU_CFG_RAM2    := %10111111    ; Bank 2 full RAM
 MMU_CFG_RAM3    := %11111111    ; Bank 3 full RAM
+MMU_CFG_IFROM   := %01010111    ; Bank 1 with Internal Function RAM/ROM
+MMU_CFG_EFROM   := %01101011    ; Bank 1 with External Function RAM/ROM
 
 ; ---------------------------------------------------------------------------
 ; Super CPU
diff --git a/asminc/gamate.inc b/asminc/gamate.inc
new file mode 100644 (file)
index 0000000..4e7fee2
--- /dev/null
@@ -0,0 +1,64 @@
+;-------------------------------------------------------------------------------
+;                                gamate.inc
+;
+;                   Gamate system specific definitions
+;
+; (w) 2015 Groepaz/Hitmen (groepaz@gmx.net)
+;     based on technical reference by PeT (mess@utanet.at)
+;-------------------------------------------------------------------------------
+
+; look at gamate.h for comments, they are not duplicated here
+
+AUDIO_BASE      = $4000
+
+JOY_DATA        = $4400
+
+JOY_DATA_UP     = $01
+JOY_DATA_DOWN   = $02
+JOY_DATA_LEFT   = $04
+JOY_DATA_RIGHT  = $08
+JOY_DATA_FIRE_A = $10
+JOY_DATA_FIRE_B = $20
+JOY_DATA_START  = $40
+JOY_DATA_SELECT = $80
+
+LCD_WIDTH       = 160
+LCD_HEIGHT      = 152
+
+LCD_BASE        = $5000
+LCD_MODE        = $5001
+LCD_XPOS        = $5002
+LCD_YPOS        = $5003
+LCD_X           = $5004
+LCD_Y           = $5005
+LCD_READ        = $5006
+LCD_DATA        = $5007
+
+LCD_MODE_INC_X  = $00
+LCD_MODE_INC_Y  = $40
+LCD_XPOS_PLANE1 = $00
+LCD_XPOS_PLANE2 = $80
+
+; constants for the conio implementation
+charsperline    = (LCD_WIDTH / 8)
+screenrows      = (LCD_HEIGHT / 8)
+
+CH_HLINE        = 1
+CH_VLINE        = 2
+
+COLOR_WHITE     = 0
+COLOR_GREY2     = 1
+COLOR_GREY1     = 2
+COLOR_BLACK     = 3
+
+; bios zp usage:
+ZP_NMI_4800     = $0a
+ZP_IRQ_COUNT    = $0b
+ZP_IRQ_CTRL     = $0c
+
+ZP_IRQ_CNT1     = $0e
+ZP_IRQ_CNT2     = $0f
+ZP_IRQ_CNT3     = $10
+ZP_IRQ_CNT4     = $11
+
+ZP_NMI_FLAG     = $e8
index 1c3b19c09489f1a90b742ba82f36bdea3d186348..522a6d1a6e9c69bc5981dde24f580bc29e1e7f45 100644 (file)
@@ -15,8 +15,7 @@ MEMORY {
     LOADADDR: file = %O,               start = %S - 2,               size = $0002;
     HEADER:   file = %O, define = yes, start = %S,                   size = $000D;
     MAIN:     file = %O, define = yes, start = __HEADER_LAST__,      size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__;
-    MOVE:     file = %O,               start = __INITBSS_LOAD__,     size = __HIMEM__ - __BSS_RUN__;
-    INIT:     file = "",               start = __BSS_RUN__,          size = __HIMEM__ - __BSS_RUN__;
+    INIT:     file = %O,               start = __BSS_RUN__,          size = __HIMEM__ - __BSS_RUN__;
     OVL1ADDR: file = "%O.1",           start = __OVERLAYSTART__ - 2, size = $0002;
     OVL1:     file = "%O.1",           start = __OVERLAYSTART__,     size = __OVERLAYSIZE__;
     OVL2ADDR: file = "%O.2",           start = __OVERLAYSTART__ - 2, size = $0002;
@@ -37,35 +36,35 @@ MEMORY {
     OVL9:     file = "%O.9",           start = __OVERLAYSTART__,     size = __OVERLAYSIZE__;
 }
 SEGMENTS {
-    ZEROPAGE: load = ZP,               type = zp;
-    LOADADDR: load = LOADADDR,         type = ro;
-    EXEHDR:   load = HEADER,           type = ro;
-    STARTUP:  load = MAIN,             type = ro;
-    LOWCODE:  load = MAIN,             type = ro,                optional = yes;
-    CODE:     load = MAIN,             type = ro;
-    RODATA:   load = MAIN,             type = ro;
-    DATA:     load = MAIN,             type = rw;
-    INITBSS:  load = MAIN,             type = bss, define = yes;
-    BSS:      load = MAIN,             type = bss, define = yes;
-    INIT:     load = MOVE, run = INIT, type = ro,  define = yes;
-    OVL1ADDR: load = OVL1ADDR,         type = ro;
-    OVERLAY1: load = OVL1,             type = ro,  define = yes, optional = yes;
-    OVL2ADDR: load = OVL2ADDR,         type = ro;
-    OVERLAY2: load = OVL2,             type = ro,  define = yes, optional = yes;
-    OVL3ADDR: load = OVL3ADDR,         type = ro;
-    OVERLAY3: load = OVL3,             type = ro,  define = yes, optional = yes;
-    OVL4ADDR: load = OVL4ADDR,         type = ro;
-    OVERLAY4: load = OVL4,             type = ro,  define = yes, optional = yes;
-    OVL5ADDR: load = OVL5ADDR,         type = ro;
-    OVERLAY5: load = OVL5,             type = ro,  define = yes, optional = yes;
-    OVL6ADDR: load = OVL6ADDR,         type = ro;
-    OVERLAY6: load = OVL6,             type = ro,  define = yes, optional = yes;
-    OVL7ADDR: load = OVL7ADDR,         type = ro;
-    OVERLAY7: load = OVL7,             type = ro,  define = yes, optional = yes;
-    OVL8ADDR: load = OVL8ADDR,         type = ro;
-    OVERLAY8: load = OVL8,             type = ro,  define = yes, optional = yes;
-    OVL9ADDR: load = OVL9ADDR,         type = ro;
-    OVERLAY9: load = OVL9,             type = ro,  define = yes, optional = yes;
+    ZEROPAGE: load = ZP,       type = zp;
+    LOADADDR: load = LOADADDR, type = ro;
+    EXEHDR:   load = HEADER,   type = ro;
+    STARTUP:  load = MAIN,     type = ro;
+    LOWCODE:  load = MAIN,     type = ro,                optional = yes;
+    CODE:     load = MAIN,     type = ro;
+    RODATA:   load = MAIN,     type = ro;
+    DATA:     load = MAIN,     type = rw;
+    INITBSS:  load = MAIN,     type = rw;
+    BSS:      load = MAIN,     type = bss, define = yes;
+    INIT:     load = INIT,     type = ro;
+    OVL1ADDR: load = OVL1ADDR, type = ro;
+    OVERLAY1: load = OVL1,     type = ro,  define = yes, optional = yes;
+    OVL2ADDR: load = OVL2ADDR, type = ro;
+    OVERLAY2: load = OVL2,     type = ro,  define = yes, optional = yes;
+    OVL3ADDR: load = OVL3ADDR, type = ro;
+    OVERLAY3: load = OVL3,     type = ro,  define = yes, optional = yes;
+    OVL4ADDR: load = OVL4ADDR, type = ro;
+    OVERLAY4: load = OVL4,     type = ro,  define = yes, optional = yes;
+    OVL5ADDR: load = OVL5ADDR, type = ro;
+    OVERLAY5: load = OVL5,     type = ro,  define = yes, optional = yes;
+    OVL6ADDR: load = OVL6ADDR, type = ro;
+    OVERLAY6: load = OVL6,     type = ro,  define = yes, optional = yes;
+    OVL7ADDR: load = OVL7ADDR, type = ro;
+    OVERLAY7: load = OVL7,     type = ro,  define = yes, optional = yes;
+    OVL8ADDR: load = OVL8ADDR, type = ro;
+    OVERLAY8: load = OVL8,     type = ro,  define = yes, optional = yes;
+    OVL9ADDR: load = OVL9ADDR, type = ro;
+    OVERLAY9: load = OVL9,     type = ro,  define = yes, optional = yes;
 }
 FEATURES {
     CONDES: type    = constructor,
index 2a105c7f1cd9a35a1b5dd74b9469b22029865725..8ff7db03cf40bc3a84a5b62928b09b3ce793c4b5 100644 (file)
@@ -12,21 +12,20 @@ MEMORY {
     LOADADDR: file = %O,               start = %S - 2,           size = $0002;
     HEADER:   file = %O, define = yes, start = %S,               size = $000D;
     MAIN:     file = %O, define = yes, start = __HEADER_LAST__,  size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__;
-    MOVE:     file = %O,               start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
-    INIT:     file = "",               start = __BSS_RUN__,      size = __HIMEM__ - __BSS_RUN__;
+    INIT:     file = %O,               start = __BSS_RUN__,      size = __HIMEM__ - __BSS_RUN__;
 }
 SEGMENTS {
-    ZEROPAGE: load = ZP,               type = zp;
-    LOADADDR: load = LOADADDR,         type = ro;
-    EXEHDR:   load = HEADER,           type = ro;
-    STARTUP:  load = MAIN,             type = ro;
-    LOWCODE:  load = MAIN,             type = ro,                optional = yes;
-    CODE:     load = MAIN,             type = ro;
-    RODATA:   load = MAIN,             type = ro;
-    DATA:     load = MAIN,             type = rw;
-    INITBSS:  load = MAIN,             type = bss, define = yes;
-    BSS:      load = MAIN,             type = bss, define = yes;
-    INIT:     load = MOVE, run = INIT, type = ro,  define = yes;
+    ZEROPAGE: load = ZP,       type = zp;
+    LOADADDR: load = LOADADDR, type = ro;
+    EXEHDR:   load = HEADER,   type = ro;
+    STARTUP:  load = MAIN,     type = ro;
+    LOWCODE:  load = MAIN,     type = ro,                optional = yes;
+    CODE:     load = MAIN,     type = ro;
+    RODATA:   load = MAIN,     type = ro;
+    DATA:     load = MAIN,     type = rw;
+    INITBSS:  load = MAIN,     type = rw;
+    BSS:      load = MAIN,     type = bss, define = yes;
+    INIT:     load = INIT,     type = ro,  define = yes;
 }
 FEATURES {
     CONDES: type    = constructor,
diff --git a/cfg/gamate.cfg b/cfg/gamate.cfg
new file mode 100644 (file)
index 0000000..90ced1e
--- /dev/null
@@ -0,0 +1,41 @@
+# linker config to produce simple Gamate cartridge (.bin)
+
+SYMBOLS {
+        __STARTUP__:   type = import;
+        __STACKSIZE__: type = weak, value = $0080; # 1 page stack
+}
+
+MEMORY {
+        # 0000-03ff is RAM
+        # FIXME: what zp range can we actually use?
+        # $0a-$11 is used by IRQ/NMI, $e8 is used by NMI
+        ZP: start = $0012, size = $e8 - $12;
+        CPUSTACK: start = $0100, size =$100;
+        RAM: start = $0200, size = $200 - __STACKSIZE__, define = yes;
+
+        CARTHEADER:   file = %O, define = yes, start = %S,               size = $0029;
+        # 6000-e000 can be (Cartridge) ROM
+        # WARNING: fill value must be $00 else it will no more work
+        #ROM: start = $6000, size = $1000, fill = yes, fillval = $00, file = %O, define = yes;
+        #ROMFILL: start = $7000, size = $7000, fill = yes, fillval = $00, file = %O, define = yes;
+        # for images that have code >$6fff we must calculate the checksum!
+        ROM: start = $6000 + $29, size = $8000 - $29, fill = yes, fillval = $00, file = %O, define = yes;
+}
+
+SEGMENTS {
+        ZEROPAGE: load = ZP, type = zp, define = yes;
+        EXTZP: load = ZP, type = zp, define = yes, optional = yes;
+        APPZP: load = ZP, type = zp, define = yes, optional = yes;
+        STARTUP:   load = CARTHEADER,           type = ro, define=yes;
+        INIT:    load = ROM, type = ro, define = yes, optional = yes;
+        CODE: load = ROM, type = ro, define=yes;
+        RODATA: load = ROM, type = ro, define=yes;
+        DATA: load = ROM, run=RAM, type = rw, define = yes;
+        BSS: load = RAM, type = bss, define = yes;
+}
+
+FEATURES {
+        CONDES: segment = RODATA, type = constructor, label = __CONSTRUCTOR_TABLE__, count = __CONSTRUCTOR_COUNT__;
+        CONDES: segment = RODATA, type = destructor,  label = __DESTRUCTOR_TABLE__,  count = __DESTRUCTOR_COUNT__;
+        CONDES: segment = RODATA, type = interruptor, label = __INTERRUPTOR_TABLE__, count = __INTERRUPTOR_COUNT__, import  = __CALLIRQ__;
+}
index 4154c0a8d65f65e0a1bc7f59dfb1934588f43c68..a98b04f49a9b237b890c01b9f2d4b41e37717762 100644 (file)
@@ -191,11 +191,19 @@ missing on VDC, and are translated to the two colors missing from the VIC palett
 
 <descrip>
 
+  <tag><tt/c128-efnram.emd (c128_efnram_emd)/</tag>
+  Extended memory driver for the C128 External Function RAM.
+  Written and contributed by Marco van den Heuvel.
+
   <tag><tt/c128-georam.emd (c128_georam_emd)/</tag>
   A driver for the GeoRam cartridge. The driver will always assume 2048 pages
   of 256 bytes each. There are no checks, so if your program knows better,
   just go ahead.
 
+  <tag><tt/c128-ifnram.emd (c128_ifnram_emd)/</tag>
+  Extended memory driver for the C128 Internal Function RAM.
+  Written and contributed by Marco van den Heuvel.
+
   <tag><tt/c128-ram.emd (c128_ram_emd)/</tag>
   An extended memory driver for the RAM in page 1. The common memory area is
   excluded, so this driver supports 251 pages of 256 bytes each.
index 8767d212d181c2e06cf3b46613015d44abcf47bf..4bf43453dee016ed15615aa939a71049f6343171 100644 (file)
@@ -257,6 +257,10 @@ Note that the graphics drivers are incompatible with the
 
 <descrip>
 
+  <tag><tt/c64-65816.emd (c64_65816_emd)/</tag>
+  Extended memory driver for 65816 (eg SCPU) based extra RAM.
+  Written and contributed by Marco van den Heuvel.
+
   <tag><tt/c64-c256k.emd (c64_c256k_emd)/</tag>
   A driver for the C64 256K memory expansion. This driver offers 768 pages of
   256 bytes each. Written and contributed by Marco van den Heuvel.
diff --git a/doc/gamate.sgml b/doc/gamate.sgml
new file mode 100644 (file)
index 0000000..14b1a27
--- /dev/null
@@ -0,0 +1,159 @@
+<!doctype linuxdoc system>
+
+<article>
+
+<title>Gamate System specific information for cc65
+<author>
+<url url="mailto:groepaz@gmx.net" name="Groepaz/Hitmen">
+<date>2015-11-29
+
+<abstract>
+An overview over the Gamate runtime system as it is implemented for the
+cc65 C compiler.
+</abstract>
+
+<!-- Table of contents -->
+<toc>
+
+<!-- Begin the document -->
+
+<sect>Overview<p>
+
+This file contains an overview of the Gamate runtime system as it comes
+with the cc65 C compiler. It describes the memory layout, Gamate specific header
+files, available drivers, and any pitfalls specific to that platform.
+
+Please note that Gamate specific functions are just mentioned here, they are
+described in detail in the separate <url url="funcref.html" name="function
+reference">. Even functions marked as "platform dependent" may be available on
+more than one platform. Please see the function reference for more
+information.
+
+
+<sect>Binary format<p>
+
+The standard binary output format generated by the linker for the Gamate target
+is a cartridge image with header. It is of course possible to change this
+behaviour by using a modified startup file and linker config.
+
+Note: the first two bytes of the header contain a checksum that must be inserted
+by an external program. Such an utility is provided in util/gamate/gamate-fixcart.c
+
+<sect>Platform specific header files<p>
+
+Programs containing Gamate specific code may use the <tt/gamate.h/ header file.
+
+
+<sect1>Hardware access<p>
+
+The following pseudo variables declared in the <tt/gamate.inc/ include file do
+allow access to hardware located in the address space.
+
+<descrip>
+
+</descrip><p>
+
+
+
+<sect>Loadable drivers<p>
+
+All drivers must be statically linked because no file I/O is available.
+The names in the parentheses denote the symbols to be used for static linking of the drivers.
+
+
+<sect1>Graphics drivers<p>
+
+No TGI graphics drivers are currently available for the Gamate.
+
+
+<sect1>Extended memory drivers<p>
+
+No extended memory drivers are currently available for the Gamate.
+
+
+<sect1>Joystick drivers<p>
+
+<descrip>
+
+  <tag><tt/gamate-stdjoy.joy (gamate_stdjoy)/</tag>
+  A joystick driver for the standard two buttons joypad is available.
+
+</descrip><p>
+
+
+<sect1>Mouse drivers<p>
+
+No mouse drivers are currently available for the Gamate.
+
+
+<sect1>RS232 device drivers<p>
+
+No serial drivers are currently available for the Gamate.
+
+
+
+<sect>Limitations<p>
+
+<itemize>
+<item>When using the C-compiler, keep in mind that only 0x200 bytes RAM in total
+can be used for variables and the runtime stack.
+</itemize>
+
+<sect1>Disk I/O<p>
+
+The existing library for the Gamate doesn't implement C file
+I/O. There are no hacks for the <tt/read()/ and <tt/write()/ routines.
+
+To be more concrete, this limitation means that you cannot use any of the
+following functions (and a few others):
+
+<itemize>
+<item>printf
+<item>fclose
+<item>fopen
+<item>fread
+<item>fprintf
+<item>fputc
+<item>fscanf
+<item>fwrite
+<item>...
+</itemize>
+
+<sect>Other hints<p>
+
+<itemize>
+<item>The Gamate is emulated by MESS (<url url="http://www.mess.org/">),
+run like this: <tt>mess gamate -debug -window -skip_gameinfo -cart test.bin</tt>
+</itemize>
+
+some resources on the Gamate:
+
+<itemize>
+<item><url url="http://en.wikipedia.org/wiki/Gamate">
+</itemize>
+
+<sect>License<p>
+
+This software is provided 'as-is', without any expressed or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+<enum>
+<item> The origin of this software must not be misrepresented; you must not
+       claim that you wrote the original software. If you use this software
+       in a product, an acknowledgment in the product documentation would be
+       appreciated but is not required.
+<item> Altered source versions must be plainly marked as such, and must not
+       be misrepresented as being the original software.
+<item> This notice may not be removed or altered from any source
+       distribution.
+</enum>
+
+</article>
+
+
+
index b6ef06ef9b2972b98ea193b88fbfdfeb653729da..04e6a4c3a3903b94c7486f34ee5454b46de2b5fa 100644 (file)
   <tag><htmlurl url="pce.html" name="pce.html"></tag>
   Topics specific to NEC PC-Engine (TurboGrafx) Console.
 
+  <tag><htmlurl url="gamate.html" name="gamate.html"></tag>
+  Topics specific to Bit Corporation Gamate Console.
+
   <tag><htmlurl url="pet.html" name="pet.html"></tag>
   Topics specific to the Commodore PET machines.
 
index 8638e94d425b26ceaf4fab599eacc1204ee4e805..9eb68e565b05aa8ea1142175cc55a6cd0dd12119 100644 (file)
@@ -69,6 +69,8 @@
 #  include <atmos.h>
 #elif defined(__CBM__)
 #  include <cbm.h>
+#elif defined(__GAMATE__)
+#  include <gamate.h>
 #elif defined(__GEOS__)
 #  include <geos.h>
 #elif defined(__LUNIX__)
diff --git a/include/gamate.h b/include/gamate.h
new file mode 100644 (file)
index 0000000..82bca08
--- /dev/null
@@ -0,0 +1,200 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                gamate.h                                   */
+/*                                                                           */
+/*                   Gamate system specific definitions                      */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (w) 2015 Groepaz/Hitmen (groepaz@gmx.net)                                 */
+/*     based on technical reference by PeT (mess@utanet.at)                  */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+#ifndef _GAMATE_H
+#define _GAMATE_H
+
+/* Check for errors */
+#if !defined(__GAMATE__)
+#  error This module may only be used when compiling for the Gamate!
+#endif
+
+#define AUDIO_BASE      0x4000
+
+/*
+   base clock cpu clock/32 ?
+
+0/1: 1. channel(right): 12 bit frequency: right frequency 0 nothing, 1 high;
+  3 23khz; 4 17,3; 10 6,9; 15 4.6; $60 720hz; $eff 18,0; $fff 16,9 hz)
+ (delay clock/32)
+2/3: 2. channel(left): 12 bit frequency
+4/5: 3. channel(both): 12 bit frequency
+6: 0..5 noise frequency 0 fast 1f slow (about 500us) 15.6ns--> clock/32 counts
+7 control (hinibble right)
+ bit 0: right channel high (full cycle, else square pulse/tone)
+ bit 1: left channel high
+ bit 2: both channel high
+ bit 3: set right tone (else noise)
+ bit 4: set left channel normal
+ bit 5: set both normal
+ bits 30: 11 high, 10 square, 01 noise, 00 noise only when square high
+ noise means switches channel to ad converter based noise algorithmen
+ (white noise shift register 17bit wide, repeats after about 130000 cycles)
+ probably out=!bit16, bit0=bit16 xor bit13; runs through, so start value anything than 0
+8: 1st volume: 0..3 square volume; bit 4 envelope (higher priority)
+9: 2nd volume
+10: 3rd volume
+11/12: envelope delay time 0 fast, 0xffff slow/nearly no effect (2 22us, 4 56us)
+ frequency $800, envelope $10 2 times in pulse high time (4*16*16)
+13: envelope control
+ 0-3 one time falling
+ 4-7 one time rising
+ 8 falling
+ 9 one time falling
+ a starts with down falling, rising; same falling time, but double/longer cycle
+ b one time falling, on
+ c rising
+ d one time rising, on
+ e rising, falling (double cycle before restart)
+ f one time rising
+ bit 0: once only
+ bit 1: full tone
+ bit 2: start rising (else falling)
+ bit 3:
+*/
+
+#define JOY_DATA        0x4400
+
+#define JOY_DATA_UP     0x01
+#define JOY_DATA_DOWN   0x02
+#define JOY_DATA_LEFT   0x04
+#define JOY_DATA_RIGHT  0x08
+#define JOY_DATA_FIRE_A 0x10
+#define JOY_DATA_FIRE_B 0x20
+#define JOY_DATA_START  0x40
+#define JOY_DATA_SELECT 0x80
+
+/* LCD
+
+    resolution 160x152 in 4 greys/greens
+    2 256x256 sized bitplanes (2x 8kbyte ram)
+*/
+#define LCD_BASE        0x5000
+
+#define LCD_MODE        0x5001
+/*
+ bit 3..0 (from zeropage 15)
+        bit 0 set no normal screen display, seldom scrolling effects on screen;
+        bytes written to somewhat actual display refresh position!?
+    bytes read "random"
+  bit 1,2,3 no effect
+ bit 4 swaps plane intensity
+ bit 5 ? display effect
+ bit 6 on y auto increment (else auto x increment), reading
+ bit 7 ? lcd flickering
+*/
+#define LCD_MODE_INC_Y  0x40
+
+#define LCD_XPOS        0x5002  /* smooth scrolling X */
+#define LCD_YPOS        0x5003  /* smooth scrolling Y */
+/*
+ smooth scrolling until $c8 with 200 limit
+ after 200 display if ((value & 0xf) < 8) display of (value & 0xf) - 8
+ chaos lines from value + current line from plane 2 only then lines starting
+ with zero (problematic 200 limit/overrun implementation!?)
+*/
+#define LCD_X           0x5004  /* x-addr */
+/*
+ bit 5,6 no effect
+ bit 7 0 1st/1 2nd bitplane
+*/
+#define LCD_XPOS_PLANE1 0x00
+#define LCD_XPOS_PLANE2 0x80
+
+#define LCD_Y           0x5005  /* y-addr */
+
+#define LCD_READ        0x5006  /* read from RAM (no auto inc?) */
+#define LCD_DATA        0x5007  /* write to RAM */
+
+/* BIOS zeropage usage */
+
+/* locations 0x0a-0x0c, 0x0e-0x11 and 0xe8 are in use by the BIOS IRQ/NMI handlers */
+#define ZP_NMI_4800     0x0a    /* content of I/O reg 4800 gets copied here each NMI */
+
+#define ZP_IRQ_COUNT    0x0b    /* increments once per IRQ, used elsewhere in the
+                                   BIOS for synchronisation purposes */
+#define ZP_IRQ_CTRL     0x0c    /* if 0 then cartridge irq stubs will not get called */
+
+/* each of the following 4 increments by 1 per IRQ - it is _not_ a 32bit
+   counter (see code at $ffa6 in BIOS)
+   these are not used elsewhere in the bios and can be (re)set as needed by
+   the user.
+*/
+#define ZP_IRQ_CNT1     0x0e
+#define ZP_IRQ_CNT2     0x0f
+#define ZP_IRQ_CNT3     0x10
+#define ZP_IRQ_CNT4     0x11
+
+#define ZP_NMI_FLAG     0xe8    /* set to 0xff each NMI */
+
+/* constants for the conio implementation */
+#define COLOR_BLACK     0x03
+#define COLOR_WHITE     0x00
+
+#define CH_HLINE        1
+#define CH_VLINE        2
+#define CH_CROSS        3
+#define CH_ULCORNER     4
+#define CH_URCORNER     5
+#define CH_LLCORNER     6
+#define CH_LRCORNER     7
+#define CH_TTEE         8
+#define CH_BTEE         9
+
+#define CH_RTEE         11
+#define CH_LTEE         12
+
+#define CH_ENTER        13
+#define CH_PI           18
+
+#define TV_NTSC         0
+#define TV_PAL          1
+#define TV_OTHER        2
+
+/* No support for dynamically loadable drivers */
+#define DYN_DRV         0
+
+/* The addresses of the static drivers */
+extern void gamate_stdjoy_joy[];   /* Referred to by joy_static_stddrv[] */
+
+#define JOY_FIRE_B      5
+#define JOY_START       6
+#define JOY_SELECT      7
+
+void waitvblank (void);
+/* Wait for the vertical blanking */
+
+/* NOTE: all Gamate are "NTSC" */
+#define get_tv()        TV_NTSC
+/* Return the video mode the machine is using. */
+
+/* End of gamate.h */
+#endif
+
index 12f130f5235b4add8bc9752676f9811d6216d4cb..22e24a56e0ac8d5d44be23070c893d4da3387aeb 100644 (file)
@@ -102,6 +102,9 @@ unsigned _clocks_per_sec (void);
 #elif defined(__PCE__)
 #  define CLK_TCK               60      /* POSIX */
 #  define CLOCKS_PER_SEC        60      /* ANSI */
+#elif  defined(__GAMATE__)
+#  define CLK_TCK               135     /* POSIX */     /* FIXME */
+#  define CLOCKS_PER_SEC        135     /* ANSI */      /* FIXME */
 #elif  defined(__GEOS__)
 #  define CLK_TCK               1       /* POSIX */
 #  define CLOCKS_PER_SEC        1       /* ANSI */
index d70ad5a3156251e6dfb935a976d7599bae3f8a62..a4101aecd9eb3fba686b4f5078165081d72e25a2 100644 (file)
@@ -22,6 +22,7 @@ TARGETS = apple2    \
           atmos     \
           $(CBMS)   \
           $(GEOS)   \
+          gamate    \
           lynx      \
           nes       \
           osic1p    \
diff --git a/libsrc/c128/emd/c128-efnram.s b/libsrc/c128/emd/c128-efnram.s
new file mode 100755 (executable)
index 0000000..788c73e
--- /dev/null
@@ -0,0 +1,325 @@
+;
+; Extended memory driver for the C128 External Function RAM. Driver works
+; without problems when statically linked.
+;
+; Marco van den Heuvel, 2015-11-30
+;
+
+        .include        "zeropage.inc"
+
+        .include        "em-kernel.inc"
+        .include        "em-error.inc"
+        .include        "c128.inc"
+
+        .macpack        generic
+        .macpack        module
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+        module_header   _c128_efnram_emd
+
+; Driver signature
+
+        .byte   $65, $6d, $64           ; "emd"
+        .byte   EMD_API_VERSION         ; EM API version number
+
+; Library reference
+
+        .addr   $0000
+
+; Jump table
+
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   PAGECOUNT
+        .addr   MAP
+        .addr   USE
+        .addr   COMMIT
+        .addr   COPYFROM
+        .addr   COPYTO
+
+; ------------------------------------------------------------------------
+; Constants
+
+BASE    = $8000
+PAGES   = 127      ; Do not touch MMU
+
+; ------------------------------------------------------------------------
+; Data.
+
+.bss
+curpage:        .res    2               ; Current page number
+
+window:         .res    256             ; Memory "window"
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an EM_ERR_xx code in a/x.
+;
+
+INSTALL:
+        ldx     #0
+        stx     ptr1
+        ldx     #$80
+        stx     ptr1+1
+        ldx     #<ptr1
+        stx     FETVEC
+        stx     STAVEC
+        ldy     #0
+        ldx     #MMU_CFG_EFROM
+        sei
+        jsr     FETCH
+        tax
+        inx
+        txa
+        sta     tmp1
+        ldx     #MMU_CFG_EFROM
+        sei
+        jsr     STASH
+        ldx     #MMU_CFG_EFROM
+        jsr     FETCH
+        cli
+        cmp     tmp1
+        beq     @ram_present
+        lda     #<EM_ERR_NO_DEVICE
+        ldx     #>EM_ERR_NO_DEVICE
+        rts
+
+@ram_present:
+        ldx     #$FF
+        stx     curpage
+        stx     curpage+1               ; Invalidate the current page
+        inx
+        txa                             ; A = X = EM_ERR_OK
+;       rts                             ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+        rts
+
+
+; ------------------------------------------------------------------------
+; PAGECOUNT: Return the total number of available pages in a/x.
+;
+
+PAGECOUNT:
+        lda     #<PAGES
+        ldx     #>PAGES
+        rts
+
+; ------------------------------------------------------------------------
+; MAP: Map the page in a/x into memory and return a pointer to the page in
+; a/x. The contents of the currently mapped page (if any) may be discarded
+; by the driver.
+;
+
+MAP:    sta     curpage
+        stx     curpage+1               ; Remember the new page
+
+        clc
+        adc     #>BASE
+        sta     ptr1+1
+        ldy     #$00
+        sty     ptr1
+
+        lda     #<ptr1
+        sta     FETVEC
+        sei
+
+; Transfer one page
+
+@L1:    ldx     #MMU_CFG_EFROM
+        jsr     FETCH
+        sta     window,y
+        iny
+        bne     @L1
+
+; Return the memory window
+
+        cli
+        lda     #<window
+        ldx     #>window                ; Return the window address
+        rts
+
+; ------------------------------------------------------------------------
+; USE: Tell the driver that the window is now associated with a given page.
+
+USE:    sta     curpage
+        stx     curpage+1               ; Remember the page
+        lda     #<window
+        ldx     #>window                ; Return the window
+        rts
+
+; ------------------------------------------------------------------------
+; COMMIT: Commit changes in the memory window to extended storage.
+
+COMMIT: lda     curpage                 ; Get the current page
+        ldx     curpage+1
+        bmi     done                    ; Jump if no page mapped
+
+        clc
+        adc     #>BASE
+        sta     ptr1+1
+        ldy     #$00
+        sty     ptr1
+
+        lda     #<ptr1
+        sta     STAVEC
+        sei
+
+; Transfer one page. Y must be zero on entry
+
+@L1:    lda     window,y
+        ldx     #MMU_CFG_EFROM
+        jsr     STASH
+        iny
+        bne     @L1
+        cli
+
+; Done
+
+done:   rts
+
+; ------------------------------------------------------------------------
+; COPYFROM: Copy from extended into linear memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYFROM:
+        sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY::OFFS
+        lda     (ptr3),y
+        sta     ptr1
+        ldy     #EM_COPY::PAGE
+        lda     (ptr3),y
+        clc
+        adc     #>BASE
+        sta     ptr1+1                  ; From
+
+        ldy     #EM_COPY::BUF
+        lda     (ptr3),y
+        sta     ptr2
+        iny
+        lda     (ptr3),y
+        sta     ptr2+1                  ; To
+
+        lda     #<ptr1
+        sta     FETVEC
+
+        ldy     #EM_COPY::COUNT+1
+        lda     (ptr3),y                ; Get number of pages
+        beq     @L2                     ; Skip if no full pages
+        sta     tmp1
+
+; Copy full pages
+
+        ldy     #$00
+        sei
+@L1:    ldx     #MMU_CFG_EFROM
+        jsr     FETCH
+        sta     (ptr2),y
+        iny
+        bne     @L1
+        inc     ptr1+1
+        inc     ptr2+1
+        dec     tmp1
+        bne     @L1
+
+; Copy the remainder of the page
+
+@L2:    ldy     #EM_COPY::COUNT
+        lda     (ptr3),y                ; Get bytes in last page
+        beq     @L4
+        sta     tmp1
+
+        ldy     #$00
+@L3:    ldx     #MMU_CFG_EFROM
+        jsr     FETCH
+        sta     (ptr2),y
+        iny
+        dec     tmp1
+        bne     @L3
+; Done
+
+@L4:    cli
+        rts
+
+; ------------------------------------------------------------------------
+; COPYTO: Copy from linear into extended memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYTO: sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY::OFFS
+        lda     (ptr3),y
+        sta     ptr1
+        ldy     #EM_COPY::PAGE
+        lda     (ptr3),y
+        clc
+        adc     #>BASE
+        sta     ptr1+1                  ; To
+
+        ldy     #EM_COPY::BUF
+        lda     (ptr3),y
+        sta     ptr2
+        iny
+        lda     (ptr3),y
+        sta     ptr2+1                  ; From
+
+        lda     #<ptr1
+        sta     STAVEC
+
+        ldy     #EM_COPY::COUNT+1
+        lda     (ptr3),y                ; Get number of pages
+        beq     @L2                     ; Skip if no full pages
+        sta     tmp1
+
+; Copy full pages
+
+        sei
+        ldy     #$00
+@L1:    lda     (ptr2),y
+        ldx     #MMU_CFG_EFROM
+        jsr     STASH
+        iny
+        bne     @L1
+        inc     ptr1+1
+        inc     ptr2+1
+        dec     tmp1
+        bne     @L1
+
+; Copy the remainder of the page
+
+@L2:    ldy     #EM_COPY::COUNT
+        lda     (ptr3),y                ; Get bytes in last page
+        beq     @L4
+        sta     tmp1
+
+        ldy     #$00
+@L3:    lda     (ptr2),y
+        ldx     #MMU_CFG_EFROM
+        jsr     STASH
+        iny
+        dec     tmp1
+        bne     @L3
+
+; Done
+
+@L4:    cli
+        rts
diff --git a/libsrc/c128/emd/c128-ifnram.s b/libsrc/c128/emd/c128-ifnram.s
new file mode 100755 (executable)
index 0000000..01a4fdf
--- /dev/null
@@ -0,0 +1,325 @@
+;
+; Extended memory driver for the C128 Internal Function RAM. Driver works
+; without problems when statically linked.
+;
+; Marco van den Heuvel, 2015-11-30
+;
+
+        .include        "zeropage.inc"
+
+        .include        "em-kernel.inc"
+        .include        "em-error.inc"
+        .include        "c128.inc"
+
+        .macpack        generic
+        .macpack        module
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+        module_header   _c128_ifnram_emd
+
+; Driver signature
+
+        .byte   $65, $6d, $64           ; "emd"
+        .byte   EMD_API_VERSION         ; EM API version number
+
+; Library reference
+
+        .addr   $0000
+
+; Jump table
+
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   PAGECOUNT
+        .addr   MAP
+        .addr   USE
+        .addr   COMMIT
+        .addr   COPYFROM
+        .addr   COPYTO
+
+; ------------------------------------------------------------------------
+; Constants
+
+BASE    = $8000
+PAGES   = 127      ; Do not touch MMU
+
+; ------------------------------------------------------------------------
+; Data.
+
+.bss
+curpage:        .res    2               ; Current page number
+
+window:         .res    256             ; Memory "window"
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an EM_ERR_xx code in a/x.
+;
+
+INSTALL:
+        ldx     #0
+        stx     ptr1
+        ldx     #$80
+        stx     ptr1+1
+        ldx     #<ptr1
+        stx     FETVEC
+        stx     STAVEC
+        ldy     #0
+        ldx     #MMU_CFG_IFROM
+        sei
+        jsr     FETCH
+        tax
+        inx
+        txa
+        sta     tmp1
+        ldx     #MMU_CFG_IFROM
+        sei
+        jsr     STASH
+        ldx     #MMU_CFG_IFROM
+        jsr     FETCH
+        cli
+        cmp     tmp1
+        beq     @ram_present
+        lda     #<EM_ERR_NO_DEVICE
+        ldx     #>EM_ERR_NO_DEVICE
+        rts
+
+@ram_present:
+        ldx     #$FF
+        stx     curpage
+        stx     curpage+1               ; Invalidate the current page
+        inx
+        txa                             ; A = X = EM_ERR_OK
+;       rts                             ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+        rts
+
+
+; ------------------------------------------------------------------------
+; PAGECOUNT: Return the total number of available pages in a/x.
+;
+
+PAGECOUNT:
+        lda     #<PAGES
+        ldx     #>PAGES
+        rts
+
+; ------------------------------------------------------------------------
+; MAP: Map the page in a/x into memory and return a pointer to the page in
+; a/x. The contents of the currently mapped page (if any) may be discarded
+; by the driver.
+;
+
+MAP:    sta     curpage
+        stx     curpage+1               ; Remember the new page
+
+        clc
+        adc     #>BASE
+        sta     ptr1+1
+        ldy     #$00
+        sty     ptr1
+
+        lda     #<ptr1
+        sta     FETVEC
+        sei
+
+; Transfer one page
+
+@L1:    ldx     #MMU_CFG_IFROM
+        jsr     FETCH
+        sta     window,y
+        iny
+        bne     @L1
+
+; Return the memory window
+
+        cli
+        lda     #<window
+        ldx     #>window                ; Return the window address
+        rts
+
+; ------------------------------------------------------------------------
+; USE: Tell the driver that the window is now associated with a given page.
+
+USE:    sta     curpage
+        stx     curpage+1               ; Remember the page
+        lda     #<window
+        ldx     #>window                ; Return the window
+        rts
+
+; ------------------------------------------------------------------------
+; COMMIT: Commit changes in the memory window to extended storage.
+
+COMMIT: lda     curpage                 ; Get the current page
+        ldx     curpage+1
+        bmi     done                    ; Jump if no page mapped
+
+        clc
+        adc     #>BASE
+        sta     ptr1+1
+        ldy     #$00
+        sty     ptr1
+
+        lda     #<ptr1
+        sta     STAVEC
+        sei
+
+; Transfer one page. Y must be zero on entry
+
+@L1:    lda     window,y
+        ldx     #MMU_CFG_IFROM
+        jsr     STASH
+        iny
+        bne     @L1
+        cli
+
+; Done
+
+done:   rts
+
+; ------------------------------------------------------------------------
+; COPYFROM: Copy from extended into linear memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYFROM:
+        sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY::OFFS
+        lda     (ptr3),y
+        sta     ptr1
+        ldy     #EM_COPY::PAGE
+        lda     (ptr3),y
+        clc
+        adc     #>BASE
+        sta     ptr1+1                  ; From
+
+        ldy     #EM_COPY::BUF
+        lda     (ptr3),y
+        sta     ptr2
+        iny
+        lda     (ptr3),y
+        sta     ptr2+1                  ; To
+
+        lda     #<ptr1
+        sta     FETVEC
+
+        ldy     #EM_COPY::COUNT+1
+        lda     (ptr3),y                ; Get number of pages
+        beq     @L2                     ; Skip if no full pages
+        sta     tmp1
+
+; Copy full pages
+
+        ldy     #$00
+        sei
+@L1:    ldx     #MMU_CFG_IFROM
+        jsr     FETCH
+        sta     (ptr2),y
+        iny
+        bne     @L1
+        inc     ptr1+1
+        inc     ptr2+1
+        dec     tmp1
+        bne     @L1
+
+; Copy the remainder of the page
+
+@L2:    ldy     #EM_COPY::COUNT
+        lda     (ptr3),y                ; Get bytes in last page
+        beq     @L4
+        sta     tmp1
+
+        ldy     #$00
+@L3:    ldx     #MMU_CFG_IFROM
+        jsr     FETCH
+        sta     (ptr2),y
+        iny
+        dec     tmp1
+        bne     @L3
+; Done
+
+@L4:    cli
+        rts
+
+; ------------------------------------------------------------------------
+; COPYTO: Copy from linear into extended memory. A pointer to a structure
+; describing the request is passed in a/x.
+; The function must not return anything.
+;
+
+COPYTO: sta     ptr3
+        stx     ptr3+1                  ; Save the passed em_copy pointer
+
+        ldy     #EM_COPY::OFFS
+        lda     (ptr3),y
+        sta     ptr1
+        ldy     #EM_COPY::PAGE
+        lda     (ptr3),y
+        clc
+        adc     #>BASE
+        sta     ptr1+1                  ; To
+
+        ldy     #EM_COPY::BUF
+        lda     (ptr3),y
+        sta     ptr2
+        iny
+        lda     (ptr3),y
+        sta     ptr2+1                  ; From
+
+        lda     #<ptr1
+        sta     STAVEC
+
+        ldy     #EM_COPY::COUNT+1
+        lda     (ptr3),y                ; Get number of pages
+        beq     @L2                     ; Skip if no full pages
+        sta     tmp1
+
+; Copy full pages
+
+        sei
+        ldy     #$00
+@L1:    lda     (ptr2),y
+        ldx     #MMU_CFG_IFROM
+        jsr     STASH
+        iny
+        bne     @L1
+        inc     ptr1+1
+        inc     ptr2+1
+        dec     tmp1
+        bne     @L1
+
+; Copy the remainder of the page
+
+@L2:    ldy     #EM_COPY::COUNT
+        lda     (ptr3),y                ; Get bytes in last page
+        beq     @L4
+        sta     tmp1
+
+        ldy     #$00
+@L3:    lda     (ptr2),y
+        ldx     #MMU_CFG_IFROM
+        jsr     STASH
+        iny
+        dec     tmp1
+        bne     @L3
+
+; Done
+
+@L4:    cli
+        rts
index 78268422b0e4f9599597c0c82c80d6939c9e88b5..ea7867925f96fefaa971d941a10dfc5af9d2a9e7 100644 (file)
@@ -6,7 +6,7 @@
         .export         __STARTUP__ : absolute = 1      ; Mark as startup
 
         .import         initlib, donelib
-        .import         moveinit, zerobss, callmain
+        .import         zerobss, callmain
         .import         BSOUT
         .import         __MAIN_START__, __MAIN_SIZE__   ; Linker generated
         .import         __STACKSIZE__                   ; from configure file
 
 Start:
 
-; Switch to the second charset.
-
-        lda     #14
-        jsr     BSOUT
-
 ; Switch off the BASIC ROM.
 
         lda     $01
@@ -39,22 +34,10 @@ Start:
         tsx
         stx     spsave          ; Save the system stack ptr
 
-; Allow some re-entrancy by skipping the next task if it already was done.
-; This sometimes can let us rerun the program without reloading it.
-
-        ldx     move_init
-        beq     L0
-
-; Move the INIT segment from where it was loaded (over the bss segments)
-; into where it must be run (over the BSS segment).
-
-        jsr     moveinit
-        dec     move_init       ; Set to false
-
 ; Save space by putting some of the start-up code in the INIT segment,
 ; which can be re-used by the BSS segment, the heap and the C stack.
 
-L0:     jsr     runinit
+        jsr     init
 
 ; Clear the BSS data.
 
@@ -98,7 +81,7 @@ L2:     lda     zpsave,x
 
 .segment        "INIT"
 
-runinit:
+init:
 
 ; Save the zero-page locations that we need.
 
@@ -115,6 +98,11 @@ L1:     lda     sp,x
         sta     sp
         stx     sp+1            ; Set argument stack ptr
 
+; Switch to the second charset.
+
+        lda     #14
+        jsr     BSOUT
+
 ; Call the module constructors.
 
         jmp     initlib
@@ -123,17 +111,8 @@ L1:     lda     sp,x
 ; ------------------------------------------------------------------------
 ; Data
 
-.data
-
-; These two variables were moved out of the BSS segment, and into DATA, because
-; we need to use them before INIT is moved off of BSS, and before BSS is zeroed.
+.segment        "INITBSS"
 
 mmusave:.res    1
 spsave: .res    1
-
-move_init:
-        .byte   1
-
-.segment        "INITBSS"
-
 zpsave: .res    zpspace
diff --git a/libsrc/c64/emd/c64-65816.s b/libsrc/c64/emd/c64-65816.s
new file mode 100644 (file)
index 0000000..bf44a0e
--- /dev/null
@@ -0,0 +1,376 @@
+;\r
+; Extended memory driver for 65816 based extra RAM. Driver works without\r
+; problems when statically linked.\r
+;\r
+; Marco van den Heuvel, 2015-12-01\r
+;\r
+\r
+        .include        "zeropage.inc"\r
+\r
+        .include        "em-kernel.inc"\r
+        .include        "em-error.inc"\r
+\r
+\r
+        .macpack        generic\r
+        .macpack        module\r
+\r
+\r
+; ------------------------------------------------------------------------\r
+; Header. Includes jump table\r
+\r
+        module_header   _c64_65816_emd\r
+\r
+; Driver signature\r
+\r
+        .byte   $65, $6d, $64           ; "emd"\r
+        .byte   EMD_API_VERSION         ; EM API version number\r
+\r
+; Library reference\r
+\r
+        .addr   $0000\r
+\r
+; Jump table\r
+\r
+        .addr   INSTALL\r
+        .addr   UNINSTALL\r
+        .addr   PAGECOUNT\r
+        .addr   MAP\r
+        .addr   USE\r
+        .addr   COMMIT\r
+        .addr   COPYFROM\r
+        .addr   COPYTO\r
+\r
+; ------------------------------------------------------------------------\r
+; Data.\r
+\r
+.bss\r
+isnotscpu:      .res    1               ; SuperCPU not present\r
+curpage:        .res    1               ; Current page number\r
+curbank:        .res    1               ; Current bank number (+1)\r
+bankcount:      .res    1               ; Number of available banks (pages = banks * 256)\r
+window:         .res    256             ; Memory "window"\r
+\r
+.code\r
+\r
+; ------------------------------------------------------------------------\r
+; INSTALL routine. Is called after the driver is loaded into memory. If\r
+; possible, check if the hardware is present and determine the amount of\r
+; memory available.\r
+; Must return an EM_ERR_xx code in a/x.\r
+;\r
+\r
+INSTALL:\r
+        sei\r
+        clc\r
+        sed\r
+        lda     #$99\r
+        adc     #$01                    ; on 65C02, 65SC02, 65CE02, 65802 and 65816 sets the zero flag correctly\r
+        cld\r
+        bne     @not_present\r
+        clc\r
+.P816\r
+        sep     #$01                    ; nop #$01 on 65C02/65SC02 and lda ($01,s),y on 65CE02\r
+.P02\r
+        bcc     @not_present\r
+        lda     $d0bc\r
+        and     #$80\r
+        sta     isnotscpu\r
+        lda     $07e8\r
+        pha                             ; save value incase it was used somewhere else\r
+        ldx     #$ff\r
+@fillloop:                              ; fill from top (bank 255) to bottom\r
+        txa\r
+        pha\r
+.P816\r
+        plb                             ; pull dbr\r
+.P02\r
+        stx     $07e8\r
+        dex\r
+        cpx     #$ff\r
+        bne     @fillloop\r
+        inx\r
+@compareloop:                           ; check from bottom to top\r
+        txa\r
+        pha\r
+.P816\r
+        plb\r
+.P02\r
+        cmp     $07e8\r
+        bne     @found_pages\r
+.P816\r
+        inc\r
+.P02\r
+        sta     $07e8\r
+        cmp     $07e8\r
+        bne     @found_pages\r
+        inx\r
+        bne     @compareloop\r
+@found_pages:\r
+        dex\r
+        lda     #$00\r
+        pha\r
+.P816\r
+        plb\r
+.P02\r
+        pla\r
+        sta     $07e8\r
+        cli\r
+        lda     isnotscpu\r
+        bne     @noextradex\r
+        dex\r
+@noextradex:\r
+        stx     bankcount\r
+        lda     #<EM_ERR_OK\r
+        ldx     #>EM_ERR_OK\r
+        rts\r
+@not_present:\r
+        cli\r
+        lda     #<EM_ERR_NO_DEVICE\r
+        ldx     #>EM_ERR_NO_DEVICE\r
+;       rts                             ; Run into UNINSTALL instead\r
+\r
+\r
+; ------------------------------------------------------------------------\r
+; UNINSTALL routine. Is called before the driver is removed from memory.\r
+; Can do cleanup or whatever. Must not return anything.\r
+;\r
+\r
+UNINSTALL:\r
+        rts\r
+\r
+\r
+; ------------------------------------------------------------------------\r
+; PAGECOUNT: Return the total number of available pages in a/x.\r
+;\r
+\r
+PAGECOUNT:\r
+        lda     #$00                   ; a whole bank is either usable or not\r
+        ldx     bankcount\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; MAP: Map the page in a/x into memory and return a pointer to the page in\r
+; a/x. The contents of the currently mapped page (if any) may be discarded\r
+; by the driver.\r
+;\r
+\r
+MAP:    sta     curpage                 ; Remember the new page\r
+        stx     curbank                 ; Remember the new bank\r
+\r
+        sta     ptr2+1                  ; src address low\r
+        lda     #$00\r
+        sta     ptr2                    ; src address high\r
+        inx\r
+        ldy     isnotscpu               ; check if not scpu\r
+        bne     @notscpu\r
+        inx\r
+@notscpu:\r
+        stx     tmp2                    ; src bank\r
+\r
+        sta     tmp1                    ; dst bank\r
+\r
+        sta     ptr3+1                  ; length high\r
+        lda     #$ff\r
+        sta     ptr3                    ; length low\r
+\r
+        lda     #<window\r
+        sta     ptr1                    ; dst address low\r
+        ldx     #>window\r
+        stx     ptr1+1                  ; dst address high\r
+\r
+        jsr     transfer\r
+\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; USE: Tell the driver that the window is now associated with a given page.\r
+\r
+USE:    sta     curpage                 ; Remember the page\r
+        stx     curbank                 ; Remember the bank\r
+        lda     #<window\r
+        ldx     #>window                ; Return the window\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; COMMIT: Commit changes in the memory window to extended storage.\r
+\r
+COMMIT: lda     curpage                 ; Get the current page\r
+        sta     ptr1+1                  ; dst high\r
+        ldx     #$00\r
+        stx     ptr1                    ; dst low\r
+\r
+        lda     #<window\r
+        sta     ptr2                    ; src low\r
+        lda     #>window\r
+        sta     ptr2+1                  ; src high\r
+\r
+        stx     ptr3+1                  ; length high\r
+        lda     #$ff\r
+        sta     ptr3                    ; length low\r
+\r
+        stx     tmp2                    ; src bank\r
+        ldy     curbank                 ; Get the current bank\r
+        iny\r
+        ldx     isnotscpu\r
+        bne     @notascpu\r
+        iny\r
+@notascpu:\r
+        sty     tmp1                    ; dst bank\r
+\r
+        jsr     transfer\r
+\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; COPYFROM: Copy from extended into linear memory. A pointer to a structure\r
+; describing the request is passed in a/x.\r
+; The function must not return anything.\r
+;\r
+\r
+COPYFROM:\r
+        sta     ptr4\r
+        stx     ptr4+1                  ; Save the passed em_copy pointer\r
+\r
+        ldy     #EM_COPY::COUNT+1       ; start at the end of the struct\r
+        lda     (ptr4),y                ; get high byte of count\r
+        tax\r
+        dey\r
+        lda     (ptr4),y                ; get low byte of count\r
+        bne     @nodex\r
+        dex\r
+@nodex:\r
+.P816\r
+        dec\r
+.P02\r
+        sta     ptr3                    ; length low\r
+        stx     ptr3+1                  ; length high\r
+        dey\r
+        lda     (ptr4),y                ; get bank\r
+.P816\r
+        inc\r
+.P02\r
+        ldx     isnotscpu\r
+        bne     @notscpu64\r
+.P816\r
+        inc\r
+.P02\r
+@notscpu64:\r
+        sta     tmp2                    ; src bank\r
+        dey\r
+        lda     (ptr4),y                ; get page\r
+        sta     ptr2+1                  ; src high\r
+        dey\r
+        lda     (ptr4),y                ; get offset in page\r
+        sta     ptr2                    ; src low\r
+        dey\r
+        lda     (ptr4),y                ; get memory buffer high\r
+        sta     ptr1+1                  ; dst high\r
+        dey\r
+        lda     (ptr4),y                ; get memory buffer low\r
+        sta     ptr1                    ; dst low\r
+        lda     #$00\r
+        sta     tmp1                    ; dst bank\r
+\r
+        jsr     transfer\r
+\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; COPYTO: Copy from linear into extended memory. A pointer to a structure\r
+; describing the request is passed in a/x.\r
+; The function must not return anything.\r
+;\r
+\r
+COPYTO: sta     ptr4\r
+        stx     ptr4+1                  ; Save the passed em_copy pointer\r
+\r
+        ldy     #EM_COPY::COUNT+1       ; start at the end of the struct\r
+        lda     (ptr4),y                ; get high byte of count\r
+        tax\r
+        dey\r
+        lda     (ptr4),y                ; get low byte of count\r
+        bne     @nodex2\r
+        dex\r
+@nodex2:\r
+.P816\r
+        dec\r
+.P02\r
+        sta     ptr3                    ; length low\r
+        txa\r
+        sta     ptr3+1                  ; length high\r
+        dey\r
+        lda     (ptr4),y                ; get bank\r
+.P816\r
+        inc\r
+.P02\r
+        ldx     isnotscpu\r
+        bne     @notascpu64\r
+.P816\r
+        inc\r
+.P02\r
+@notascpu64:\r
+        sta     tmp1                    ; dst bank\r
+        dey\r
+        lda     (ptr4),y                ; get page\r
+        sta     ptr1+1                  ; dst high\r
+        dey\r
+        lda     (ptr4),y                ; get page offset\r
+        sta     ptr1                    ; dst low\r
+        dey\r
+        lda     (ptr4),y                ; get memory buffer high\r
+        sta     ptr2+1                  ; src low\r
+        dey\r
+        lda     (ptr4),y                ; get memory buffer low\r
+        sta     ptr2                    ; src high\r
+        lda     #$00\r
+        sta     tmp2                    ; src bank\r
+\r
+        jsr     transfer\r
+\r
+        rts\r
+\r
+; ------------------------------------------------------------------------\r
+; Helper function for moving a block, the following is used:\r
+; ptr1: dst\r
+; ptr2: src\r
+; ptr3: length\r
+; tmp1: dst bank\r
+; tmp2: src bank\r
+\r
+transfer:\r
+.P816\r
+.A8\r
+.I8\r
+        sei\r
+        pha\r
+        phx\r
+        phy\r
+        ldx     tmp1                    ; load srcbank\r
+        stx     @move+1                 ; store srcbank in move + 1\r
+        ldy     tmp2                    ; load dstbank\r
+        sty     @move+2                 ; store dstbank in move + 2\r
+        clc                             ; switch to native mode\r
+        xce\r
+        php                             ; save status bits\r
+        rep     #%00110000              ; set A and index to 16bit\r
+.A16\r
+.I16\r
+        ldy     ptr1\r
+        ldx     ptr2\r
+        lda     ptr3\r
+@move:\r
+        mvn 0,0\r
+        plp                             ; restore status bits\r
+.A8\r
+.I8\r
+        lda     #$00\r
+        pha\r
+        plb                             ; restore dbr\r
+        sec\r
+        xce                             ; switch to emul mode\r
+        ply\r
+        plx\r
+        pla\r
+        cli\r
+        rts\r
+.P02\r
diff --git a/libsrc/common/moveinit.s b/libsrc/common/moveinit.s
deleted file mode 100644 (file)
index 2b22be0..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-;
-; 2015-10-07, Greg King
-;
-
-        .export         moveinit
-
-        .import         __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
-
-        .macpack        cpu
-        .macpack        generic
-
-
-; Put this in the DATA segment because it is self-modifying code.
-
-.data
-
-; Move the INIT segment from where it was loaded (over the bss segments)
-; into where it must be run (over the BSS segment).  The two areas might overlap;
-; and, the segment is moved upwards.  Therefore, this code starts at the highest
-; address, and decrements to the lowest address.  The low bytes of the starting
-; pointers are not sums.  The high bytes are sums; but, they do not include the
-; carry.  Both the low-byte sums and the carries will be done when the pointers
-; are indexed by the .Y register.
-
-moveinit:
-
-; First, move the last, partial page.
-; Then, move all of the full pages.
-
-        ldy     #<__INIT_SIZE__         ; size of partial page
-        ldx     #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0)  ; number of pages, including partial
-
-L1:     dey
-init_load:
-        lda     __INIT_LOAD__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
-init_run:
-        sta     __INIT_RUN__  + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
-        tya
-        bnz     L1                      ; page not finished
-
-        dec     init_load+2
-        dec     init_run+2
-        dex
-        bnz     L1                      ; move next page
-        rts
diff --git a/libsrc/gamate/_scrsize.s b/libsrc/gamate/_scrsize.s
new file mode 100644 (file)
index 0000000..f26f22d
--- /dev/null
@@ -0,0 +1,16 @@
+;
+; Screen size variables
+;
+        .include        "gamate.inc"
+
+        .export screensize
+screensize:
+        ldx     xsize
+        ldy     ysize
+        rts
+
+.rodata
+        .export xsize, ysize
+
+xsize:  .byte   charsperline
+ysize:  .byte   screenrows
diff --git a/libsrc/gamate/chline.s b/libsrc/gamate/chline.s
new file mode 100644 (file)
index 0000000..2d96c9d
--- /dev/null
@@ -0,0 +1,32 @@
+;
+; Ullrich von Bassewitz, 08.08.1998
+;
+; void chlinexy (unsigned char x, unsigned char y, unsigned char length);
+; void chline (unsigned char length);
+;
+
+        .export         _chlinexy, _chline
+        .import         popa, _gotoxy, cputdirect
+        .importzp       tmp1
+
+        .include        "gamate.inc"
+
+_chlinexy:
+        pha                     ; Save the length
+        jsr     popa            ; Get y
+        jsr     _gotoxy         ; Call this one, will pop params
+        pla                     ; Restore the length
+
+_chline:
+        cmp     #0              ; Is the length zero?
+        beq     L9              ; Jump if done
+        sta     tmp1
+L1:     lda     #CH_HLINE       ; Horizontal line, screen code
+        jsr     cputdirect      ; Direct output
+        dec     tmp1
+        bne     L1
+L9:     rts
+
+
+
+
diff --git a/libsrc/gamate/clock.s b/libsrc/gamate/clock.s
new file mode 100644 (file)
index 0000000..223c079
--- /dev/null
@@ -0,0 +1,33 @@
+;
+; clock_t clock (void);
+;
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+        .export         _clock
+        .forceimport    ticktock
+        .importzp       sreg
+        .constructor    initclock
+
+
+.proc   _clock
+
+        lda     tickcount+3
+        sta     sreg+1
+        lda     tickcount+2
+        sta     sreg
+        ldx     tickcount+1
+        lda     tickcount
+        rts
+
+.endproc
+
+        .segment        "INIT"
+initclock:
+        lda     #0
+        ldx     #3
+@lp:    sta     tickcount,x
+        dex
+        bpl     @lp
+        rts
diff --git a/libsrc/gamate/clrscr.s b/libsrc/gamate/clrscr.s
new file mode 100644 (file)
index 0000000..31a7a18
--- /dev/null
@@ -0,0 +1,35 @@
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+        .import plot
+        .export _clrscr
+_clrscr:
+        ldy     #$0
+        tya
+rowloop:
+        sty     LCD_X
+
+        sta     LCD_Y
+
+        ldx     #$0
+colloop:
+        sta     LCD_DATA
+
+        inx
+        bne     colloop
+
+        iny
+        bne     rowloop
+
+; Go to the home position.
+
+        sta     CURS_X
+        sta     CURS_Y
+        jmp     plot
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+                .import initconio
+conio_init      = initconio
diff --git a/libsrc/gamate/color.s b/libsrc/gamate/color.s
new file mode 100644 (file)
index 0000000..07bc25a
--- /dev/null
@@ -0,0 +1,34 @@
+;
+; unsigned char __fastcall__ textcolor (unsigned char color);
+; unsigned char __fastcall__ bgcolor (unsigned char color);
+; unsigned char __fastcall__ bordercolor (unsigned char color);
+;
+
+
+        .export     _textcolor, _bgcolor, _bordercolor
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+_textcolor:
+        ldx     CHARCOLOR       ; get old value
+        sta     CHARCOLOR       ; set new value
+        txa
+        rts
+
+_bgcolor:
+        ldx     BGCOLOR         ; get old value
+        sta     BGCOLOR         ; set new value
+        txa
+        rts
+
+_bordercolor:
+        lda     #0
+        tax
+        rts
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import initconio
+conio_init      = initconio
diff --git a/libsrc/gamate/conio.s b/libsrc/gamate/conio.s
new file mode 100644 (file)
index 0000000..a43eeb1
--- /dev/null
@@ -0,0 +1,30 @@
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+        .import         colors
+        .importzp       ptr1, tmp1
+
+        .constructor    initconio
+
+        .macpack        longbranch
+
+        .segment        "INIT"
+initconio:
+        lda     #0
+        sta     LCD_XPOS
+        sta     LCD_YPOS
+
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+
+        lda     #COLOR_BLACK
+        sta     CHARCOLOR
+        lda     #COLOR_WHITE
+        sta     BGCOLOR
+        rts
+
+        .segment        "RODATA"
+
+        .export         fontdata
+fontdata:
+        .include        "vga.inc"
diff --git a/libsrc/gamate/cputc.s b/libsrc/gamate/cputc.s
new file mode 100644 (file)
index 0000000..c7b11c8
--- /dev/null
@@ -0,0 +1,143 @@
+;
+; void cputcxy (unsigned char x, unsigned char y, char c);
+; void cputc (char c);
+;
+
+        .export         _cputcxy, _cputc, cputdirect, putchar
+        .export         newline, plot
+        .import         popa, _gotoxy
+        .import         PLOT
+        .import         xsize
+        .import         fontdata
+        .import         _plotlo
+
+        .importzp       tmp3,tmp4
+        .importzp       ptr3
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+_cputcxy:
+        pha                     ; Save C
+        jsr     popa            ; Get Y
+        jsr     _gotoxy         ; Set cursor, drop x
+        pla                     ; Restore C
+
+; Plot a character - also used as internal function
+
+_cputc: cmp     #$0d            ; CR?
+        bne     L1
+        lda     #0
+        sta     CURS_X
+        beq     plot            ; Recalculate pointers
+
+L1:     cmp     #$0a            ; LF?
+        beq     newline         ; Recalculate pointers
+
+; Printable char of some sort
+
+cputdirect:
+        jsr     putchar         ; Write the character to the screen
+
+; Advance cursor position
+
+advance:
+        ldy     CURS_X
+        iny
+        cpy     xsize
+        bne     L3
+        jsr     newline         ; new line
+        ldy     #0              ; + cr
+L3:     sty     CURS_X
+        jmp     plot
+
+newline:
+        inc     CURS_Y
+
+; Set cursor position, calculate RAM pointers
+
+plot:   ldy     CURS_X
+        ldx     CURS_Y
+        clc
+        jmp     PLOT            ; Set the new cursor
+
+; Write one character to the screen without doing anything else, return X
+; position in Y
+
+putchar:
+        sta     ptr3
+
+        txa
+        pha
+
+        lda     #0
+        sta     ptr3+1
+
+        ; char index * 8
+        asl     ptr3
+        rol     ptr3+1
+        asl     ptr3
+        rol     ptr3+1
+        asl     ptr3
+        rol     ptr3+1
+
+        ; plus fontdata base address
+        lda     ptr3
+        clc
+        adc     #<(fontdata-$f8)
+        sta     ptr3
+        lda     ptr3+1
+        adc     #>(fontdata-$f8)
+        sta     ptr3+1
+
+        lda     CHARCOLOR
+        and     #1
+        beq     @skip_plane1
+
+        lda     #LCD_XPOS_PLANE1
+        clc
+        adc     CURS_X
+        sta     LCD_X
+
+        ldy     #$f8
+@copylp1:
+        lda     (ptr3),y
+        eor     RVS
+        sta     LCD_DATA
+        iny
+        bne     @copylp1
+
+@skip_plane1:
+
+        lda     CHARCOLOR
+        and     #2
+        beq     @skip_plane2
+
+        lda     #LCD_XPOS_PLANE2
+        clc
+        adc     CURS_X
+        sta     LCD_X
+
+        ldx     CURS_Y
+        lda     _plotlo,x
+        sta     LCD_Y
+
+        ldy     #$f8
+@copylp2:
+        lda     (ptr3),y
+        eor     RVS
+        sta     LCD_DATA
+        iny
+        bne     @copylp2
+
+@skip_plane2:
+        pla
+        tax
+        ldy     CURS_X
+        rts
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import initconio
+conio_init      = initconio
diff --git a/libsrc/gamate/crt0.s b/libsrc/gamate/crt0.s
new file mode 100644 (file)
index 0000000..ead45b7
--- /dev/null
@@ -0,0 +1,63 @@
+
+        .export         Start, _exit
+
+        .import         initlib, donelib, callmain
+        .import         push0, _main, zerobss, copydata
+
+        ; Linker generated symbols
+        .import         __RAM_START__, __RAM_SIZE__
+
+        .include        "zeropage.inc"
+        .include        "gamate.inc"
+
+Start:
+        ; setup the CPU and System-IRQ
+
+        ; Initialize CPU
+        sei
+        cld
+
+        ldx     #0
+        stx     ZP_IRQ_CTRL     ; disable calling cartridge IRQ/NMI handler
+
+        ; Setup stack and memory mapping
+        ;ldx     #$FF            ; Stack top ($01FF)
+        dex
+        txs
+
+        ; Clear the BSS data
+        jsr     zerobss
+
+        ; Copy the .data segment to RAM
+        jsr     copydata
+
+        ; setup the stack
+        lda     #<(__RAM_START__+__RAM_SIZE__)
+        sta     sp
+        lda     #>(__RAM_START__+__RAM_SIZE__)
+        sta     sp + 1
+
+        ; Call module constructors
+        jsr     initlib
+
+        lda     #1
+        sta     ZP_IRQ_CTRL     ; enable calling cartridge IRQ/NMI handler
+        cli     ; allow IRQ only after constructors have run
+
+        ; Pass an empty command line
+        jsr     push0           ; argc
+        jsr     push0           ; argv
+
+        ldy     #4              ; Argument size
+        jsr     _main           ; call the users code
+
+        ; Call module destructors. This is also the _exit entry.
+_exit:
+        jsr     donelib         ; Run module destructors
+
+        ; reset (start over)
+        jmp     Start
+
+        .export initmainargs
+initmainargs:
+        rts
diff --git a/libsrc/gamate/ctype.s b/libsrc/gamate/ctype.s
new file mode 100644 (file)
index 0000000..fa9a65c
--- /dev/null
@@ -0,0 +1,161 @@
+;
+; Stefan Haubenthal with minor changes from Ullrich von Bassewitz, 2003-05-02
+;
+; Character specification table.
+;
+
+        .include        "ctype.inc"
+
+; The tables are readonly, put them into the rodata segment
+
+.rodata
+
+; The following 256 byte wide table specifies attributes for the isxxx type
+; of functions. Doing it by a table means some overhead in space, but it
+; has major advantages:
+;
+;   * It is fast. If it were'nt for the slow parameter passing of cc65, one
+;     could even define macros for the isxxx functions (this is usually
+;     done on other platforms).
+;
+;   * It is highly portable. The only unportable part is the table itself,
+;     all real code goes into the common library.
+;
+;   * We save some code in the isxxx functions.
+
+
+__ctype:
+        .repeat 2
+        .byte   CT_CTRL                 ;   0/00 ___ctrl_@___
+        .byte   CT_CTRL                 ;   1/01 ___ctrl_A___
+        .byte   CT_CTRL                 ;   2/02 ___ctrl_B___
+        .byte   CT_CTRL                 ;   3/03 ___ctrl_C___
+        .byte   CT_CTRL                 ;   4/04 ___ctrl_D___
+        .byte   CT_CTRL                 ;   5/05 ___ctrl_E___
+        .byte   CT_CTRL                 ;   6/06 ___ctrl_F___
+        .byte   CT_CTRL                 ;   7/07 ___ctrl_G___
+        .byte   CT_CTRL                 ;   8/08 ___ctrl_H___
+        .byte   CT_CTRL | CT_OTHER_WS | CT_SPACE_TAB
+                                        ;   9/09 ___ctrl_I___
+        .byte   CT_CTRL | CT_OTHER_WS   ;  10/0a ___ctrl_J___
+        .byte   CT_CTRL | CT_OTHER_WS   ;  11/0b ___ctrl_K___
+        .byte   CT_CTRL | CT_OTHER_WS   ;  12/0c ___ctrl_L___
+        .byte   CT_CTRL | CT_OTHER_WS   ;  13/0d ___ctrl_M___
+        .byte   CT_CTRL                 ;  14/0e ___ctrl_N___
+        .byte   CT_CTRL                 ;  15/0f ___ctrl_O___
+        .byte   CT_CTRL                 ;  16/10 ___ctrl_P___
+        .byte   CT_CTRL                 ;  17/11 ___ctrl_Q___
+        .byte   CT_CTRL                 ;  18/12 ___ctrl_R___
+        .byte   CT_CTRL                 ;  19/13 ___ctrl_S___
+        .byte   CT_CTRL                 ;  20/14 ___ctrl_T___
+        .byte   CT_CTRL                 ;  21/15 ___ctrl_U___
+        .byte   CT_CTRL                 ;  22/16 ___ctrl_V___
+        .byte   CT_CTRL                 ;  23/17 ___ctrl_W___
+        .byte   CT_CTRL                 ;  24/18 ___ctrl_X___
+        .byte   CT_CTRL                 ;  25/19 ___ctrl_Y___
+        .byte   CT_CTRL                 ;  26/1a ___ctrl_Z___
+        .byte   CT_CTRL                 ;  27/1b ___ctrl_[___
+        .byte   CT_CTRL                 ;  28/1c ___ctrl_\___
+        .byte   CT_CTRL                 ;  29/1d ___ctrl_]___
+        .byte   CT_CTRL                 ;  30/1e ___ctrl_^___
+        .byte   CT_CTRL                 ;  31/1f ___ctrl_____
+        .byte   CT_SPACE | CT_SPACE_TAB ;  32/20 ___SPACE___
+        .byte   CT_NONE                 ;  33/21 _____!_____
+        .byte   CT_NONE                 ;  34/22 _____"_____
+        .byte   CT_NONE                 ;  35/23 _____#_____
+        .byte   CT_NONE                 ;  36/24 _____$_____
+        .byte   CT_NONE                 ;  37/25 _____%_____
+        .byte   CT_NONE                 ;  38/26 _____&_____
+        .byte   CT_NONE                 ;  39/27 _____'_____
+        .byte   CT_NONE                 ;  40/28 _____(_____
+        .byte   CT_NONE                 ;  41/29 _____)_____
+        .byte   CT_NONE                 ;  42/2a _____*_____
+        .byte   CT_NONE                 ;  43/2b _____+_____
+        .byte   CT_NONE                 ;  44/2c _____,_____
+        .byte   CT_NONE                 ;  45/2d _____-_____
+        .byte   CT_NONE                 ;  46/2e _____._____
+        .byte   CT_NONE                 ;  47/2f _____/_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  48/30 _____0_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  49/31 _____1_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  50/32 _____2_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  51/33 _____3_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  52/34 _____4_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  53/35 _____5_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  54/36 _____6_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  55/37 _____7_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  56/38 _____8_____
+        .byte   CT_DIGIT | CT_XDIGIT    ;  57/39 _____9_____
+        .byte   CT_NONE                 ;  58/3a _____:_____
+        .byte   CT_NONE                 ;  59/3b _____;_____
+        .byte   CT_NONE                 ;  60/3c _____<_____
+        .byte   CT_NONE                 ;  61/3d _____=_____
+        .byte   CT_NONE                 ;  62/3e _____>_____
+        .byte   CT_NONE                 ;  63/3f _____?_____
+
+        .byte   CT_NONE                 ;  64/40 _____@_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  65/41 _____A_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  66/42 _____B_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  67/43 _____C_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  68/44 _____D_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  69/45 _____E_____
+        .byte   CT_UPPER | CT_XDIGIT    ;  70/46 _____F_____
+        .byte   CT_UPPER                ;  71/47 _____G_____
+        .byte   CT_UPPER                ;  72/48 _____H_____
+        .byte   CT_UPPER                ;  73/49 _____I_____
+        .byte   CT_UPPER                ;  74/4a _____J_____
+        .byte   CT_UPPER                ;  75/4b _____K_____
+        .byte   CT_UPPER                ;  76/4c _____L_____
+        .byte   CT_UPPER                ;  77/4d _____M_____
+        .byte   CT_UPPER                ;  78/4e _____N_____
+        .byte   CT_UPPER                ;  79/4f _____O_____
+        .byte   CT_UPPER                ;  80/50 _____P_____
+        .byte   CT_UPPER                ;  81/51 _____Q_____
+        .byte   CT_UPPER                ;  82/52 _____R_____
+        .byte   CT_UPPER                ;  83/53 _____S_____
+        .byte   CT_UPPER                ;  84/54 _____T_____
+        .byte   CT_UPPER                ;  85/55 _____U_____
+        .byte   CT_UPPER                ;  86/56 _____V_____
+        .byte   CT_UPPER                ;  87/57 _____W_____
+        .byte   CT_UPPER                ;  88/58 _____X_____
+        .byte   CT_UPPER                ;  89/59 _____Y_____
+        .byte   CT_UPPER                ;  90/5a _____Z_____
+        .byte   CT_NONE                 ;  91/5b _____[_____
+        .byte   CT_NONE                 ;  92/5c _____\_____
+        .byte   CT_NONE                 ;  93/5d _____]_____
+        .byte   CT_NONE                 ;  94/5e _____^_____
+        .byte   CT_NONE                 ;  95/5f _UNDERLINE_
+        .byte   CT_NONE                 ;  96/60 ___grave___
+        .byte   CT_LOWER | CT_XDIGIT    ;  97/61 _____a_____
+        .byte   CT_LOWER | CT_XDIGIT    ;  98/62 _____b_____
+        .byte   CT_LOWER | CT_XDIGIT    ;  99/63 _____c_____
+        .byte   CT_LOWER | CT_XDIGIT    ; 100/64 _____d_____
+        .byte   CT_LOWER | CT_XDIGIT    ; 101/65 _____e_____
+        .byte   CT_LOWER | CT_XDIGIT    ; 102/66 _____f_____
+        .byte   CT_LOWER                ; 103/67 _____g_____
+        .byte   CT_LOWER                ; 104/68 _____h_____
+        .byte   CT_LOWER                ; 105/69 _____i_____
+        .byte   CT_LOWER                ; 106/6a _____j_____
+        .byte   CT_LOWER                ; 107/6b _____k_____
+        .byte   CT_LOWER                ; 108/6c _____l_____
+        .byte   CT_LOWER                ; 109/6d _____m_____
+        .byte   CT_LOWER                ; 110/6e _____n_____
+        .byte   CT_LOWER                ; 111/6f _____o_____
+        .byte   CT_LOWER                ; 112/70 _____p_____
+        .byte   CT_LOWER                ; 113/71 _____q_____
+        .byte   CT_LOWER                ; 114/72 _____r_____
+        .byte   CT_LOWER                ; 115/73 _____s_____
+        .byte   CT_LOWER                ; 116/74 _____t_____
+        .byte   CT_LOWER                ; 117/75 _____u_____
+        .byte   CT_LOWER                ; 118/76 _____v_____
+        .byte   CT_LOWER                ; 119/77 _____w_____
+        .byte   CT_LOWER                ; 120/78 _____x_____
+        .byte   CT_LOWER                ; 121/79 _____y_____
+        .byte   CT_LOWER                ; 122/7a _____z_____
+        .byte   CT_NONE                 ; 123/7b _____{_____
+        .byte   CT_NONE                 ; 124/7c _____|_____
+        .byte   CT_NONE                 ; 125/7d _____}_____
+        .byte   CT_NONE                 ; 126/7e _____~_____
+        .byte   CT_OTHER_WS             ; 127/7f ____DEL____
+        .endrepeat
+
+
diff --git a/libsrc/gamate/cvline.s b/libsrc/gamate/cvline.s
new file mode 100644 (file)
index 0000000..b228908
--- /dev/null
@@ -0,0 +1,32 @@
+;
+; Ullrich von Bassewitz, 08.08.1998
+;
+; void cvlinexy (unsigned char x, unsigned char y, unsigned char length);
+; void cvline (unsigned char length);
+;
+
+        .export         _cvlinexy, _cvline
+        .import         popa, _gotoxy, putchar, newline
+        .importzp       tmp1
+
+        .include        "gamate.inc"
+
+_cvlinexy:
+        pha                     ; Save the length
+        jsr     popa            ; Get y
+        jsr     _gotoxy         ; Call this one, will pop params
+        pla                     ; Restore the length and run into _cvline
+
+_cvline:
+        cmp     #0              ; Is the length zero?
+        beq     L9              ; Jump if done
+        sta     tmp1
+L1:     lda     #CH_VLINE       ; Vertical bar
+        jsr     putchar         ; Write, no cursor advance
+        jsr     newline         ; Advance cursor to next line
+        dec     tmp1
+        bne     L1
+L9:     rts
+
+
+
diff --git a/libsrc/gamate/extzp.inc b/libsrc/gamate/extzp.inc
new file mode 100644 (file)
index 0000000..b6f08bc
--- /dev/null
@@ -0,0 +1,16 @@
+;
+; extzp.inc for the Gamate
+;
+; Groepaz/Hitmen, 2015-11-27
+;
+; Assembler include file that imports the runtime zero page locations used
+; by the Gamate runtime, ready for usage in asm code.
+;
+
+        .global         CURS_X: zp
+        .global         CURS_Y: zp
+        .global         CHARCOLOR: zp
+        .global         RVS: zp
+        .global         BGCOLOR: zp
+        .global         tickcount: zp
+
diff --git a/libsrc/gamate/extzp.s b/libsrc/gamate/extzp.s
new file mode 100644 (file)
index 0000000..41f5592
--- /dev/null
@@ -0,0 +1,16 @@
+;
+; Groepaz/Hitmen, 2015-11-27
+;
+; zeropage locations for exclusive use by the library
+;
+
+        .include "extzp.inc"
+
+        .segment "EXTZP" : zeropage
+
+CURS_X:         .res 1
+CURS_Y:         .res 1
+CHARCOLOR:      .res 1
+RVS:            .res 1
+BGCOLOR:        .res 1
+tickcount:      .res 4
diff --git a/libsrc/gamate/gotoxy.s b/libsrc/gamate/gotoxy.s
new file mode 100644 (file)
index 0000000..407da1f
--- /dev/null
@@ -0,0 +1,22 @@
+;
+; void gotoxy (unsigned char x, unsigned char y);
+;
+
+        .export         _gotoxy
+        .import         popa, plot
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+_gotoxy:
+        sta     CURS_Y          ; Set Y
+        jsr     popa            ; Get X
+        sta     CURS_X          ; Set X
+        jmp     plot            ; Set the cursor position
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import initconio
+conio_init      = initconio
+
diff --git a/libsrc/gamate/header.s b/libsrc/gamate/header.s
new file mode 100644 (file)
index 0000000..da15a51
--- /dev/null
@@ -0,0 +1,16 @@
+        ; The following symbol is used by linker config to force the module
+        ; to get included into the output file
+        .export         __STARTUP__: absolute = 1
+
+        .import         Start, IRQStub, NMIStub
+
+
+        .segment "STARTUP"
+
+        .word 0                                         ; +00 checksum from 7000-7fff (simple 8bit adds)
+        .byte 1, 0, 1                                   ; +02 flags
+        .byte "COPYRIGHT BIT CORPORATION", 0, $ff       ; +05 copyright
+        ; system vectors
+        jmp     Start                                   ; +20 reset entry
+        jmp     NMIStub                                 ; +23 nmi entry
+        jmp     IRQStub                                 ; +26 irq entry (135 hz)
diff --git a/libsrc/gamate/irq.s b/libsrc/gamate/irq.s
new file mode 100644 (file)
index 0000000..862307f
--- /dev/null
@@ -0,0 +1,52 @@
+;
+; IRQ handling (Gamate version)
+;
+
+        .export         initirq, doneirq, IRQStub
+
+        .import         __INTERRUPTOR_COUNT__, callirq_y
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+; ------------------------------------------------------------------------
+.segment        "INIT"
+
+; a constructor
+;
+initirq:
+        rts
+
+; ------------------------------------------------------------------------
+.code
+
+; a destructor
+;
+doneirq:
+        rts
+
+; ------------------------------------------------------------------------
+; 256*32 interrupts in about 1minute 60s = 136hz
+; -> guess 16384 clock cycles = 135,28hz (might be audio signal 1/512?)
+
+IRQStub:
+        ; A and Y are saved by the BIOS
+        ;pha
+        ;tya
+        ;pha
+
+        ldy     #<(__INTERRUPTOR_COUNT__ * 2)
+        beq     @L1
+
+        txa
+        pha
+
+        jsr     callirq_y
+
+        pla
+        tax
+
+@L1:    ;pla
+        ;tay
+        ;pla
+        rts
diff --git a/libsrc/gamate/joy/gamate-stdjoy.s b/libsrc/gamate/joy/gamate-stdjoy.s
new file mode 100644 (file)
index 0000000..8b18bae
--- /dev/null
@@ -0,0 +1,95 @@
+
+;
+; Standard joystick driver for the Gamate
+;
+
+        .include        "joy-kernel.inc"
+        .include        "joy-error.inc"
+        .include        "gamate.inc"
+
+        .macpack        module
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+        module_header   _gamate_stdjoy_joy
+
+; Driver signature
+
+        .byte   $6A, $6F, $79           ; "joy"
+        .byte   JOY_API_VERSION         ; Driver API version number
+
+; Library reference
+
+        .addr   $0000
+
+; Button state masks (8 values)
+
+        .byte   $01                     ; JOY_UP
+        .byte   $02                     ; JOY_DOWN
+        .byte   $04                     ; JOY_LEFT
+        .byte   $08                     ; JOY_RIGHT
+        .byte   $10                     ; JOY_FIRE_A
+        .byte   $20                     ; JOY_FIRE_B
+        .byte   $80                     ; JOY_SELECT
+        .byte   $40                     ; JOY_START
+
+; Jump table.
+
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   COUNT
+        .addr   READJOY
+        .addr   0                       ; IRQ entry unused
+
+; ------------------------------------------------------------------------
+; Constants
+
+JOY_COUNT       = 1             ; Number of joysticks we support
+
+
+.code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an JOY_ERR_xx code in a/x.
+;
+
+INSTALL:
+        lda     #<JOY_ERR_OK
+        ldx     #>JOY_ERR_OK
+
+;        rts                     ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; DEINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+        rts
+
+
+; ------------------------------------------------------------------------
+; COUNT: Return the total number of available joysticks in a/x.
+;
+;unsigned char __fastcall__ joy_count (void);
+
+COUNT:
+        lda     #<JOY_COUNT
+        ldx     #>JOY_COUNT
+        rts
+
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+;unsigned char __fastcall__ joy_read (unsigned char joystick);
+
+READJOY:
+        lda     JOY_DATA
+        ldx     #0
+        rts
+
diff --git a/libsrc/gamate/joy_stat_stddrv.s b/libsrc/gamate/joy_stat_stddrv.s
new file mode 100644 (file)
index 0000000..7501645
--- /dev/null
@@ -0,0 +1,14 @@
+;
+; Address of the static standard joystick driver
+;
+; Oliver Schmidt, 2012-11-01
+;
+; const void joy_static_stddrv[];
+;
+
+        .export         _joy_static_stddrv
+        .import         _gamate_stdjoy_joy
+
+.rodata
+
+_joy_static_stddrv      := _gamate_stdjoy_joy
diff --git a/libsrc/gamate/joy_stddrv.s b/libsrc/gamate/joy_stddrv.s
new file mode 100644 (file)
index 0000000..b830d8d
--- /dev/null
@@ -0,0 +1,13 @@
+;
+; Name of the standard joystick driver
+;
+; Oliver Schmidt, 2012-11-01
+;
+; const char joy_stddrv[];
+;
+
+        .export         _joy_stddrv
+
+.rodata
+
+_joy_stddrv:    .asciiz "gamate-stdjoy.joy"
diff --git a/libsrc/gamate/kplot.s b/libsrc/gamate/kplot.s
new file mode 100644 (file)
index 0000000..9091109
--- /dev/null
@@ -0,0 +1,32 @@
+
+        .export         PLOT
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+PLOT:
+        bcs     @getpos
+
+        sty     LCD_X
+        ;clc                    ; already cleared
+        lda     _plotlo,x
+        sta     LCD_Y
+
+@getpos:
+        ldx     CURS_Y
+        ldy     CURS_X
+        rts
+
+        .export         _plotlo
+        .rodata
+
+_plotlo:
+        .repeat screenrows,line
+        .byte   <($0000+(line*$8))
+        .endrepeat
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import initconio
+conio_init      = initconio
diff --git a/libsrc/gamate/libref.s b/libsrc/gamate/libref.s
new file mode 100644 (file)
index 0000000..e4afa7e
--- /dev/null
@@ -0,0 +1,8 @@
+;
+; Oliver Schmidt, 2013-05-31
+;
+
+        .export         joy_libref
+        .import         _exit
+
+joy_libref      := _exit
diff --git a/libsrc/gamate/nmi.s b/libsrc/gamate/nmi.s
new file mode 100644 (file)
index 0000000..61db624
--- /dev/null
@@ -0,0 +1,21 @@
+;
+; NMI handling (Gamate version)
+;
+        .export NMIStub
+
+        .segment        "INIT"
+
+NMIStub:
+        ; A is saved by the BIOS
+        ;pha
+        ;txa
+        ;pha
+        ;tya
+        ;pha
+
+        ;pla
+        ;tay
+        ;pla
+        ;tax
+        ;pla
+        rts
diff --git a/libsrc/gamate/revers.s b/libsrc/gamate/revers.s
new file mode 100644 (file)
index 0000000..3b237e4
--- /dev/null
@@ -0,0 +1,28 @@
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+        .export _revers
+
+.proc   _revers
+
+        ldx     #$00            ; Assume revers off
+        tay                     ; Test onoff
+        beq     L1              ; Jump if off
+        ldx     #$ff            ; Load on value
+        ldy     #$00            ; Assume old value is zero
+L1:     lda     RVS             ; Load old value
+        stx     RVS             ; Set new value
+        beq     L2              ; Jump if old value zero
+        iny                     ; Make old value = 1
+L2:     ldx     #$00            ; Load high byte of result
+        tya                     ; Load low byte, set CC
+        rts
+
+.endproc
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import         initconio
+conio_init      = initconio
diff --git a/libsrc/gamate/ticktock.s b/libsrc/gamate/ticktock.s
new file mode 100644 (file)
index 0000000..81f64dc
--- /dev/null
@@ -0,0 +1,17 @@
+        .interruptor    ticktock, 24
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+ticktock:
+
+        ; Increment the system tick counter.
+        inc     tickcount
+        bne     @s1
+        inc     tickcount+1
+        bne     @s1
+        inc     tickcount+2
+        bne     @s1
+        inc     tickcount+3
+@s1:
+        rts
diff --git a/libsrc/gamate/vga.inc b/libsrc/gamate/vga.inc
new file mode 100644 (file)
index 0000000..da20dd4
--- /dev/null
@@ -0,0 +1,240 @@
+
+; VGA charset for the Gamate conio implementation
+
+        .byte   $00, $00, $00, $00, $00, $00, $00, $00
+
+        ; 1
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %11111111
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+
+        ; 2
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 3
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %11111111
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 4
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00011111
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 5
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %11110000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 6
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00011111
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+
+        ; 7
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %11110000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+
+        ; 8
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %11111111
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 9
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %11111111
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+
+        ; 10 (LF)
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+        .byte   %00000000
+
+        ; 11
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %11110000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        ; 12
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00011111
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+        .byte   %00010000
+
+        .byte   $3F, $33, $3F, $30, $30, $70, $F0, $E0
+        .byte   $7F, $63, $7F, $63, $63, $67, $E6, $C0
+        .byte   $99, $5A, $3C, $E7, $E7, $3C, $5A, $99
+        .byte   $80, $E0, $F8, $FE, $F8, $E0, $80, $00
+        .byte   $02, $0E, $3E, $FE, $3E, $0E, $02, $00
+        .byte   $18, $3C, $7E, $18, $18, $7E, $3C, $18
+        .byte   $66, $66, $66, $66, $66, $00, $66, $00
+        .byte   $7F, $DB, $DB, $7B, $1B, $1B, $1B, $00
+        .byte   $3E, $63, $38, $6C, $6C, $38, $CC, $78
+        .byte   $00, $00, $00, $00, $7E, $7E, $7E, $00
+        .byte   $18, $3C, $7E, $18, $7E, $3C, $18, $FF
+        .byte   $18, $3C, $7E, $18, $18, $18, $18, $00
+        .byte   $18, $18, $18, $18, $7E, $3C, $18, $00
+        .byte   $00, $18, $0C, $FE, $0C, $18, $00, $00
+        .byte   $00, $30, $60, $FE, $60, $30, $00, $00
+        .byte   $00, $00, $C0, $C0, $C0, $FE, $00, $00
+        .byte   $00, $24, $66, $FF, $66, $24, $00, $00
+        .byte   $00, $18, $3C, $7E, $FF, $FF, $00, $00
+        .byte   $00, $FF, $FF, $7E, $3C, $18, $00, $00
+        .byte   $00, $00, $00, $00, $00, $00, $00, $00
+        .byte   $30, $78, $78, $78, $30, $00, $30, $00
+        .byte   $6C, $6C, $6C, $00, $00, $00, $00, $00
+        .byte   $6C, $6C, $FE, $6C, $FE, $6C, $6C, $00
+        .byte   $30, $7C, $C0, $78, $0C, $F8, $30, $00
+        .byte   $00, $C6, $CC, $18, $30, $66, $C6, $00
+        .byte   $38, $6C, $38, $76, $DC, $CC, $76, $00
+        .byte   $60, $60, $C0, $00, $00, $00, $00, $00
+        .byte   $18, $30, $60, $60, $60, $30, $18, $00
+        .byte   $60, $30, $18, $18, $18, $30, $60, $00
+        .byte   $00, $66, $3C, $FF, $3C, $66, $00, $00
+        .byte   $00, $30, $30, $FC, $30, $30, $00, $00
+        .byte   $00, $00, $00, $00, $00, $30, $30, $60
+        .byte   $00, $00, $00, $FC, $00, $00, $00, $00
+        .byte   $00, $00, $00, $00, $00, $30, $30, $00
+        .byte   $06, $0C, $18, $30, $60, $C0, $80, $00
+        .byte   $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00
+        .byte   $30, $70, $30, $30, $30, $30, $FC, $00
+        .byte   $78, $CC, $0C, $38, $60, $CC, $FC, $00
+        .byte   $78, $CC, $0C, $38, $0C, $CC, $78, $00
+        .byte   $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00
+        .byte   $FC, $C0, $F8, $0C, $0C, $CC, $78, $00
+        .byte   $38, $60, $C0, $F8, $CC, $CC, $78, $00
+        .byte   $FC, $CC, $0C, $18, $30, $30, $30, $00
+        .byte   $78, $CC, $CC, $78, $CC, $CC, $78, $00
+        .byte   $78, $CC, $CC, $7C, $0C, $18, $70, $00
+        .byte   $00, $30, $30, $00, $00, $30, $30, $00
+        .byte   $00, $30, $30, $00, $00, $30, $30, $60
+        .byte   $18, $30, $60, $C0, $60, $30, $18, $00
+        .byte   $00, $00, $FC, $00, $00, $FC, $00, $00
+        .byte   $60, $30, $18, $0C, $18, $30, $60, $00
+        .byte   $78, $CC, $0C, $18, $30, $00, $30, $00
+        .byte   $7C, $C6, $DE, $DE, $DE, $C0, $78, $00
+        .byte   $30, $78, $CC, $CC, $FC, $CC, $CC, $00
+        .byte   $FC, $66, $66, $7C, $66, $66, $FC, $00
+        .byte   $3C, $66, $C0, $C0, $C0, $66, $3C, $00
+        .byte   $F8, $6C, $66, $66, $66, $6C, $F8, $00
+        .byte   $7E, $60, $60, $78, $60, $60, $7E, $00
+        .byte   $7E, $60, $60, $78, $60, $60, $60, $00
+        .byte   $3C, $66, $C0, $C0, $CE, $66, $3E, $00
+        .byte   $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00
+        .byte   $78, $30, $30, $30, $30, $30, $78, $00
+        .byte   $1E, $0C, $0C, $0C, $CC, $CC, $78, $00
+        .byte   $E6, $66, $6C, $78, $6C, $66, $E6, $00
+        .byte   $60, $60, $60, $60, $60, $60, $7E, $00
+        .byte   $C6, $EE, $FE, $FE, $D6, $C6, $C6, $00
+        .byte   $C6, $E6, $F6, $DE, $CE, $C6, $C6, $00
+        .byte   $38, $6C, $C6, $C6, $C6, $6C, $38, $00
+        .byte   $FC, $66, $66, $7C, $60, $60, $F0, $00
+        .byte   $78, $CC, $CC, $CC, $DC, $78, $1C, $00
+        .byte   $FC, $66, $66, $7C, $6C, $66, $E6, $00
+        .byte   $78, $CC, $E0, $70, $1C, $CC, $78, $00
+        .byte   $FC, $30, $30, $30, $30, $30, $30, $00
+        .byte   $CC, $CC, $CC, $CC, $CC, $CC, $FC, $00
+        .byte   $CC, $CC, $CC, $CC, $CC, $78, $30, $00
+        .byte   $C6, $C6, $C6, $D6, $FE, $EE, $C6, $00
+        .byte   $C6, $C6, $6C, $38, $38, $6C, $C6, $00
+        .byte   $CC, $CC, $CC, $78, $30, $30, $78, $00
+        .byte   $FE, $06, $0C, $18, $30, $60, $FE, $00
+        .byte   $78, $60, $60, $60, $60, $60, $78, $00
+        .byte   $C0, $60, $30, $18, $0C, $06, $02, $00
+        .byte   $78, $18, $18, $18, $18, $18, $78, $00
+        .byte   $10, $38, $6C, $C6, $00, $00, $00, $00
+        .byte   $00, $00, $00, $00, $00, $00, $00, $FF
+        .byte   $30, $30, $18, $00, $00, $00, $00, $00
+        .byte   $00, $00, $78, $0C, $7C, $CC, $76, $00
+        .byte   $E0, $60, $60, $7C, $66, $66, $DC, $00
+        .byte   $00, $00, $78, $CC, $C0, $CC, $78, $00
+        .byte   $1C, $0C, $0C, $7C, $CC, $CC, $76, $00
+        .byte   $00, $00, $78, $CC, $FC, $C0, $78, $00
+        .byte   $38, $6C, $60, $F0, $60, $60, $F0, $00
+        .byte   $00, $00, $76, $CC, $CC, $7C, $0C, $F8
+        .byte   $E0, $60, $6C, $76, $66, $66, $E6, $00
+        .byte   $30, $00, $70, $30, $30, $30, $78, $00
+        .byte   $0C, $00, $0C, $0C, $0C, $CC, $CC, $78
+        .byte   $E0, $60, $66, $6C, $78, $6C, $E6, $00
+        .byte   $70, $30, $30, $30, $30, $30, $78, $00
+        .byte   $00, $00, $CC, $FE, $FE, $D6, $C6, $00
+        .byte   $00, $00, $F8, $CC, $CC, $CC, $CC, $00
+        .byte   $00, $00, $78, $CC, $CC, $CC, $78, $00
+        .byte   $00, $00, $DC, $66, $66, $7C, $60, $F0
+        .byte   $00, $00, $76, $CC, $CC, $7C, $0C, $1E
+        .byte   $00, $00, $DC, $76, $66, $60, $F0, $00
+        .byte   $00, $00, $7C, $C0, $78, $0C, $F8, $00
+        .byte   $10, $30, $7C, $30, $30, $34, $18, $00
+        .byte   $00, $00, $CC, $CC, $CC, $CC, $76, $00
+        .byte   $00, $00, $CC, $CC, $CC, $78, $30, $00
+        .byte   $00, $00, $C6, $D6, $FE, $FE, $6C, $00
+        .byte   $00, $00, $C6, $6C, $38, $6C, $C6, $00
+        .byte   $00, $00, $CC, $CC, $CC, $7C, $0C, $F8
+        .byte   $00, $00, $FC, $98, $30, $64, $FC, $00
+        .byte   $1C, $30, $30, $E0, $30, $30, $1C, $00
+        .byte   $18, $18, $18, $00, $18, $18, $18, $00
+        .byte   $E0, $30, $30, $1C, $30, $30, $E0, $00
+        .byte   $76, $DC, $00, $00, $00, $00, $00, $00
+        .byte   $00, $10, $38, $6C, $C6, $C6, $FE, $00
diff --git a/libsrc/gamate/waitvblank.s b/libsrc/gamate/waitvblank.s
new file mode 100644 (file)
index 0000000..66686c0
--- /dev/null
@@ -0,0 +1,20 @@
+;
+; void waitvblank (void);
+;
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+        .forceimport    ticktock
+        .export         _waitvblank
+
+; FIXME: is this actually correct?
+
+.proc   _waitvblank
+
+        lda     tickcount
+@lp:    cmp     tickcount
+        beq     @lp
+        rts
+
+.endproc
diff --git a/libsrc/gamate/wherex.s b/libsrc/gamate/wherex.s
new file mode 100644 (file)
index 0000000..94d9ae7
--- /dev/null
@@ -0,0 +1,20 @@
+;
+; Ullrich von Bassewitz, 2003-05-02
+;
+; unsigned char wherex (void);
+;
+
+        .export         _wherex
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+.proc   _wherex
+
+        lda     CURS_X
+        ldx     #$00
+        rts
+
+.endproc
+
+
diff --git a/libsrc/gamate/wherey.s b/libsrc/gamate/wherey.s
new file mode 100644 (file)
index 0000000..70e2f54
--- /dev/null
@@ -0,0 +1,20 @@
+;
+; Ullrich von Bassewitz, 2003-05-02
+;
+; unsigned char wherey (void);
+;
+
+        .export         _wherey
+
+        .include        "gamate.inc"
+        .include        "extzp.inc"
+
+.proc   _wherey
+
+        lda     CURS_Y
+        ldx     #$00
+        rts
+
+.endproc
+
+
index 78c28af89ca6b1b705e70c60ae9361c58dd20910..385112367fac1e3ca1ddb6f1ca9f1e252a4aa446 100644 (file)
@@ -68,7 +68,7 @@ int main (void)
     gotoxy ((XSize - strlen (Text)) / 2, YSize / 2);
     cprintf ("%s", Text);
 
-#if defined(__NES__) || defined(__PCE__)
+#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
 
     /* Wait for the user to press a button */
     joy_install (joy_static_stddrv);
index d81a875778211560c3960f2179fdd4209197ac17..0016c46f3fe8b3eae76b205e9a9a431bb1189996 100644 (file)
@@ -264,6 +264,10 @@ static void SetSys (const char* Sys)
             NewSymbol ("__APPLE2ENH__", 1);
             break;
 
+        case TGT_GAMATE:
+            NewSymbol ("__GAMATE__", 1);
+            break;
+
         case TGT_GEOS_CBM:
             /* Do not handle as a CBM system */
             NewSymbol ("__GEOS__", 1);
index 1041b8fa2df57d33019dd5b88ed2e5fb7eb432b5..abe2af56ed8359cfb274bd9ac961afdfc01b6100 100644 (file)
@@ -220,6 +220,10 @@ static void SetSys (const char* Sys)
             DefineNumericMacro ("__APPLE2ENH__", 1);
             break;
 
+        case TGT_GAMATE:
+            DefineNumericMacro ("__GAMATE__", 1);
+            break;
+
         case TGT_GEOS_CBM:
             /* Do not handle as a CBM system */
             DefineNumericMacro ("__GEOS__", 1);
index 60b9af6603c1f75d4d3751c6d2c6c8e08169f532..e89010123f4cec03203675885b91c032df8e6506 100644 (file)
@@ -154,6 +154,7 @@ static const TargetEntry TargetMap[] = {
     {   "c64",          TGT_C64         },
     {   "cbm510",       TGT_CBM510      },
     {   "cbm610",       TGT_CBM610      },
+    {   "gamate",       TGT_GAMATE      },
     {   "geos",         TGT_GEOS_CBM    },
     {   "geos-apple",   TGT_GEOS_APPLE  },
     {   "geos-cbm",     TGT_GEOS_CBM    },
@@ -204,6 +205,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
     { "sim6502",        CPU_6502,       BINFMT_BINARY,      CTNone  },
     { "sim65c02",       CPU_65C02,      BINFMT_BINARY,      CTNone  },
     { "pce",            CPU_HUC6280,    BINFMT_BINARY,      CTNone  },
+    { "gamate",         CPU_6502,       BINFMT_BINARY,      CTNone  },
 };
 
 /* Target system */
index 3ea562aa6dc9c4d26761ad13533b40c5b22ab31f..6366b725f48bebda5bcf3b7fe8bc9c1ef16c7ce7 100644 (file)
@@ -79,6 +79,7 @@ typedef enum {
     TGT_SIM6502,
     TGT_SIM65C02,
     TGT_PCENGINE,
+    TGT_GAMATE,
     TGT_COUNT                   /* Number of target systems */
 } target_t;
 
index bdee122625fd2ef12c5f6c7fb8af6bae0241b546..fe977ec08ca2d11f45a7a32deb6e2359959732b7 100644 (file)
 #include <stdlib.h>
 #include <joystick.h>
 
+#if defined(__GAMATE__)
+/* there is not enough screen space to show all 256 characters at the bottom */
+#define NUMCHARS        128
+#define NUMCOLS           4
+#else
+#define NUMCHARS        256
+#define NUMCOLS          16
+#endif
+
 static char grid[5][5] = {
     { CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER },
     { CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE },
@@ -27,10 +36,15 @@ void main(void)
 {
         int i, j, n;
         unsigned char xsize, ysize, tcol, bgcol, bcol, inpos = 0;
+#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
+        unsigned char joy;
 
+        joy_install(joy_static_stddrv);
+#endif
         clrscr();
         screensize(&xsize, &ysize);
-        cputs("cc65 conio test\n\rInput: [        ]");
+        cputs("cc65 conio test\n\r");
+        cputs("Input:[        ]");
 
         cputsxy(0, 2, "Colors:" );
         tcol = textcolor(0); /* remember original textcolor */
@@ -39,14 +53,14 @@ void main(void)
         bgcolor(bgcol);bordercolor(bcol);
         for (i = 0; i < 3; ++i) {
                 gotoxy(i,3 + i);
-                for (j = 0; j < 16; ++j) {
+                for (j = 0; j < NUMCOLS; ++j) {
                         textcolor(j);
                         cputc('X');
                 }
         }
         textcolor(tcol);
 
-        cprintf("\n\n\r Screensize is: %dx%d", xsize, ysize);
+        cprintf("\n\n\r Screensize: %dx%d", xsize, ysize );
 
         chlinexy(0,6,xsize);
         cvlinexy(0,6,3);
@@ -64,13 +78,13 @@ void main(void)
                 }
         }
 
-        gotoxy(0,ysize - 2 - ((256 + xsize) / xsize));
+        gotoxy(0,ysize - 2 - ((NUMCHARS + xsize) / xsize));
         revers(1);
         for (i = 0; i < xsize; ++i) {
                 cputc('0' + i % 10);
         }
         revers(0);
-        for (i = 0; i < 256; ++i) {
+        for (i = 0; i < NUMCHARS; ++i) {
             if ((i != '\n') && (i != '\r')) {
                     cputc(i);
             } else {
@@ -89,23 +103,27 @@ void main(void)
         cursor(1);
         for (;;) {
 
+                /* do the "rvs" blinking */
+                i = textcolor(COLOR_BLACK);
                 gotoxy(8, 2);
-                j = n & 1;
+                j = n >> 4 & 1;
                 revers(j);
                 cputc(j ? 'R' : ' ');
                 revers(j ^ 1);
-                cputs(" revers");
+                cputs(" rvs");
                 revers(0);
+                textcolor(i);
 
-#if defined(__NES__) || defined(__PCE__)
-
-                joy_install(joy_static_stddrv);
-                while (!joy_read(JOY_1)) ;
-                joy_uninstall();
+                gotoxy(7 + inpos,1);
 
+#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
+                /* not all targets have waitvblank */
+                waitvblank();
+                /* for targets that do not have a keyboard, read the first
+                   joystick */
+                joy = joy_read(JOY_1);
+                cprintf("%02x", joy);
 #else
-
-                gotoxy(8 + inpos,1);
                 i = cgetc();
                 if ((i >= '0') && (i<='9')) {
                     textcolor(i - '0');
@@ -129,9 +147,7 @@ void main(void)
                     cputc(i);
                     inpos = (inpos + 1) & 7;
                 }
-
 #endif
-
                 ++n;
         }
 }
index f4a56029a2b13184f28933be4db5a2f9bcaf86e4..ecee6608c550b4606152aea193699fa6a66dd356 100644 (file)
@@ -87,6 +87,7 @@ static emd_test_t drivers[] = {
     { '6', "REU", "c64-reu.emd" },
     { '7', "C128 VDC (in C64 mode)", "c64-vdc.emd" },
     { '8', "C64DTV himem", "dtv-himem.emd" },
+    { '9', "65816 extra banks", "c64-65816.emd" },
 #endif
 
 #if defined(__C128__)
@@ -96,6 +97,8 @@ static emd_test_t drivers[] = {
     { '3', "RamCart", "c128-ramcart.emd" },
     { '4', "REU", "c128-reu.emd" },
     { '5', "VDC", "c128-vdc.emd" },
+    { '6', "Internal Function RAM", "c128-ifnram.emd" },
+    { '7', "External Function RAM", "c128-efnram.emd" },
 #endif
 
 #if defined(__CBM510__)
diff --git a/testcode/lib/gamate/Makefile b/testcode/lib/gamate/Makefile
new file mode 100644 (file)
index 0000000..2cf98d1
--- /dev/null
@@ -0,0 +1,25 @@
+
+all: audiotest.bin lcdtest.bin ctest.bin
+
+audiotest.bin: audiotest.s
+       ../../../bin/cl65 -l audiotest.lst -t gamate -o audiotest.bin audiotest.s
+lcdtest.bin: lcdtest.s
+       ../../../bin/cl65 -l lcdtest.lst -t gamate -o lcdtest.bin lcdtest.s
+ctest.bin: ctest.c
+       ../../../bin/cl65 -l ctest.lst -t gamate -o ctest.bin ctest.c
+nachtm.bin: nachtm.c
+       ../../../bin/cl65 -Os -l nachtm.lst -t gamate -o nachtm.bin nachtm.c
+       gamate-fixcart nachtm.bin
+
+test1: lcdtest.bin
+       cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/lcdtest.bin
+test2: audiotest.bin
+       cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/audiotest.bin
+testc: ctest.bin
+       cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/ctest.bin
+testn: nachtm.bin
+       cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/nachtm.bin
+
+clean:
+       rm -f lcdtest.o audiotest.o ctest.o
+       rm -f lcdtest.bin audiotest.bin ctest.bin nachtm.bin
diff --git a/testcode/lib/gamate/audiotest.s b/testcode/lib/gamate/audiotest.s
new file mode 100644 (file)
index 0000000..f401999
--- /dev/null
@@ -0,0 +1,457 @@
+;
+; original audiotest.s by PeT (mess@utanet.at)
+;
+; cl65 -t gamate -o audiotest.bin audiotest.s
+;
+
+        .include "gamate.inc"
+
+        .zeropage
+addr:           .word 0
+psa:            .word 0
+readaddr:       .word 0
+editbuffer1:    .byte 0,0,0,0, 0,0,0,0
+writeaddr:      .word 0
+editbuffer2:    .byte 0,0,0,0, 0,0,0,0
+cursor:         .byte 0
+controlslast:   .byte 0
+controlsedge:   .byte 0
+
+        .bss
+temp_x:         .byte 0
+temp_y:         .byte 0
+temp_a:         .byte 0
+irq_count:      .byte 0
+nmi_count:      .byte 0
+psx:            .byte 0
+psy:            .byte 0
+xpos:           .byte 0
+ypos:           .byte 0
+
+        .rodata
+
+chars:          .incbin "cga2.chr"
+hex2asc:        .byte "0123456789abcdef"
+
+        .code
+
+;-------------------------------------------------------------------------------
+        .export IRQStub, NMIStub
+
+.proc   NMIStub
+        inc nmi_count
+        rts
+.endproc
+
+.proc   IRQStub
+        inc irq_count
+        rts
+.endproc
+
+;-------------------------------------------------------------------------------
+        .export Start
+
+.proc   Start
+        sei
+        lda     #0
+        sta     ZP_IRQ_CTRL
+
+        lda     #>AUDIO_BASE
+        sta     writeaddr+1
+        sta     readaddr+1
+        lda     #<AUDIO_BASE
+        sta     writeaddr
+        sta     readaddr
+
+        lda     #$10
+        sta     editbuffer1+6
+        lda     #$e
+        sta     editbuffer2+5
+        lda     #$ff
+        sta     editbuffer2+3
+        lda     #$ff
+        sta     editbuffer2+4
+        lda     #$0f
+        sta     editbuffer2
+        lda     #$0f
+        sta     editbuffer2+1
+        lda     #$0e
+        sta     editbuffer2+2
+        lda     #$38
+        sta     editbuffer1+7
+
+        lda     #0
+        sta     LCD_XPOS
+        sta     LCD_YPOS
+        sta     irq_count
+        sta     cursor
+        lda     #1
+        sta     nmi_count
+        cli
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+
+        jsr     printy
+
+        lda     #1
+        sta     ZP_IRQ_CTRL
+
+loop:
+        lda     irq_count
+loop1:
+        cmp     irq_count
+        beq     loop1
+        lda     irq_count
+        and     #7
+        bne     loop1
+
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+
+        ldx     #3
+        ldy     #32
+        lda     irq_count
+        jsr     printhex
+
+        lda     cursor
+        ldy     #0
+        cmp     #20
+        bcc     firstline
+        sec
+        sbc     #20
+        ldy     #24
+firstline:
+        sta     LCD_X
+        sty     LCD_Y
+        lda     #' '
+        jsr     printsign
+norclearcursor:
+
+        jsr     inputs
+
+        lda     irq_count
+        and     #8
+        bne     nocursor
+        lda     cursor
+        ldy     #0
+        cmp     #20
+        bcc     firstline2
+        sec
+        sbc     #20
+        ldy     #24
+firstline2:
+        sta     LCD_X
+        sty     LCD_Y
+        lda     #'x'
+        jsr     printsign
+nocursor:
+
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+        jsr     printy
+        jmp     loop
+.endproc
+
+.proc printy
+
+        ldy     #0
+loop1: 
+        tya
+        pha
+        asl
+        tax
+        lda     readaddr,y
+        ldy     #8
+        jsr     printhex
+        pla
+        tay
+        iny
+        cpy     #10
+        bne     loop1
+
+loop2:
+        tya
+        pha
+        tya
+        sec
+        sbc     #10
+        asl
+        tax
+        lda     readaddr,y
+        ldy     #16
+        jsr     printhex
+        pla
+        tay
+        iny
+        cpy     #20
+        bne     loop2
+
+        ldx     #0
+        ldy     #32
+        lda     nmi_count
+        jsr     printhex
+
+        rts
+.endproc
+
+;-------------------------------------------------------------------------------
+
+.proc inputs
+        lda     controlslast
+        eor     JOY_DATA
+        and     controlslast
+        eor     #$ff
+        sta     controlsedge
+        and     #JOY_DATA_UP
+        bne     notup
+
+        lda     cursor
+        lsr
+        tay
+        bcs     uplow
+        lda     readaddr,y
+        clc
+        adc     #$10
+        sta     readaddr,y
+        jmp     notup
+uplow:
+        lda     readaddr,y
+        clc
+        adc     #1
+        sta     readaddr,y
+notup:
+        lda     controlsedge
+        and     #JOY_DATA_DOWN
+        bne     notdown
+        lda     cursor
+        lsr
+        tay
+        bcs     downlow
+        lda     readaddr,y
+        sec
+        sbc     #$10
+        sta     readaddr,y
+        jmp     notdown
+downlow:
+        lda     readaddr,y
+        sec
+        sbc     #1
+        sta     readaddr,y
+notdown:
+        lda     controlsedge
+        and     #JOY_DATA_LEFT
+        bne     notleft
+        lda     cursor
+        beq     notleft
+        dec     cursor
+notleft:
+        lda     controlsedge
+        and     #JOY_DATA_RIGHT
+        bne     notright
+        lda     cursor
+        cmp     #40
+        beq     notright
+        inc     cursor
+notright:
+        lda     controlsedge
+        and     #JOY_DATA_START
+        bne     notstart
+        lda     #0
+        sta     AUDIO_BASE
+        sta     AUDIO_BASE+1
+        sta     AUDIO_BASE+2
+        sta     AUDIO_BASE+3
+        sta     AUDIO_BASE+4
+        sta     AUDIO_BASE+5
+        sta     AUDIO_BASE+6
+        sta     AUDIO_BASE+8
+        sta     AUDIO_BASE+9
+        sta     AUDIO_BASE+10
+        sta     AUDIO_BASE+11
+        sta     AUDIO_BASE+12
+        sta     AUDIO_BASE+13
+        sta     AUDIO_BASE+7
+notstart:
+        lda     controlsedge
+        and     #JOY_DATA_SELECT
+        bne     notselect
+
+        lda     editbuffer1
+        sta     AUDIO_BASE
+        lda     editbuffer1+1
+        sta     AUDIO_BASE+1
+        lda     editbuffer1+2
+        sta     AUDIO_BASE+2
+        lda     editbuffer1+3
+        sta     AUDIO_BASE+3
+        lda     editbuffer1+4
+        sta     AUDIO_BASE+4
+        lda     editbuffer1+5
+        sta     AUDIO_BASE+5
+        lda     editbuffer1+6
+        sta     AUDIO_BASE+6
+        lda     editbuffer2
+        sta     AUDIO_BASE+8
+        lda     editbuffer2+1
+        sta     AUDIO_BASE+9
+        lda     editbuffer2+2
+        sta     AUDIO_BASE+10
+        lda     editbuffer2+3
+        sta     AUDIO_BASE+11
+        lda     editbuffer2+4
+        sta     AUDIO_BASE+12
+        lda     editbuffer2+5
+        sta     AUDIO_BASE+13
+        lda     editbuffer1+7
+        sta     AUDIO_BASE+7
+notselect:
+        lda     controlsedge
+        and     #JOY_DATA_FIRE_A
+        bne     notbuttona
+        ldy     #0
+        ldy     #0
+writea:
+        lda     editbuffer1,y
+        sta     (writeaddr),y
+        iny
+        cpy     #8
+        bne     writea
+writeb:
+        lda     editbuffer2-8,y
+        sta     (writeaddr),y
+        iny
+        cpy     #16
+        bne     writeb
+notbuttona:
+        lda     controlsedge
+        and     #JOY_DATA_FIRE_B
+        bne     notbuttonb
+        ldy     #0
+reada:
+        lda     (readaddr),y
+        sta     editbuffer1,y
+        iny
+        cpy     #8
+        bne     reada
+
+readb:  lda     (readaddr),y
+        sta     editbuffer2-8,y
+        iny
+        cpy     #16
+        bne readb
+notbuttonb:
+        lda     JOY_DATA
+        sta     controlslast
+        rts
+.endproc
+
+;-------------------------------------------------------------------------------
+
+.proc printstring
+        sta     psa
+        stx     psa+1
+        ldx     #0
+        stx     psx
+        sty     psy
+printstring2:
+        ldy     #0
+        lda     (psa),y
+        beq     printstring1
+        ldx     psx
+        stx     LCD_X
+        ldy     psy
+        sty     LCD_Y
+        jsr     printsign
+        inc     psx
+        lda     psa
+        clc
+        adc     #1
+        sta     psa
+        lda     psa+1
+        adc     #0
+        sta     psa+1
+        jmp     printstring2
+printstring1:
+        rts
+.endproc
+
+.proc printstringy
+        sta     psa
+        stx     psa+1
+printstring2:
+        ldy     #0
+        lda     (psa),y
+        beq     printstring1
+        jsr     printsign
+        lda     psa
+        clc
+        adc     #1
+        sta     psa
+        lda     psa+1
+        adc     #0
+        sta     psa+1
+        jmp     printstring2
+printstring1:
+        rts
+.endproc
+
+
+.proc printhex
+        pha
+        lsr
+        lsr
+        lsr
+        lsr
+        and     #$0f
+        stx     temp_x
+        tax
+        lda     hex2asc,x
+        ldx     temp_x
+        stx     LCD_X
+        sty     LCD_Y
+        jsr     printsign
+        pla
+        and     #$0f
+        inx
+        stx     temp_x
+        tax
+        lda     hex2asc,x
+        ldx     temp_x
+        stx     LCD_X
+        sty     LCD_Y
+        jmp     printsign
+.endproc
+
+.proc printsign
+        sty     temp_y
+        stx     temp_x
+        sta     temp_a
+        lda     temp_a
+        sta     addr
+        lda     #0
+        sta     addr+1
+        asl     addr
+        rol     addr+1
+        asl     addr
+        rol     addr+1
+        asl     addr
+        rol     addr+1
+        lda     addr
+        clc
+        adc     #<chars
+        sta     addr
+        lda     addr+1
+        adc     #>chars
+        sta     addr+1
+        ldx     #8
+        ldy     #0
+printsign1:
+        lda     (addr),y
+        sta     LCD_DATA
+        iny
+        dex
+        bne     printsign1
+        ldx     temp_x
+        ldy     temp_y
+        rts
+.endproc
diff --git a/testcode/lib/gamate/cga2.chr b/testcode/lib/gamate/cga2.chr
new file mode 100644 (file)
index 0000000..769f01f
Binary files /dev/null and b/testcode/lib/gamate/cga2.chr differ
diff --git a/testcode/lib/gamate/ctest.c b/testcode/lib/gamate/ctest.c
new file mode 100644 (file)
index 0000000..dfebd9b
--- /dev/null
@@ -0,0 +1,52 @@
+
+#include <gamate.h>
+#include <time.h>
+#include <conio.h>
+
+unsigned char y = 0;
+unsigned char x = 0;
+unsigned short n;
+
+int main(int argc, char *argv[])
+{
+    clrscr();
+    gotoxy(0,0);cputs("Gamate C-Test");
+
+    textcolor(0);gotoxy(0,5);cputs("abcdABCD 0");
+    textcolor(1);gotoxy(0,6);cputs("abcdABCD  1");
+    textcolor(2);gotoxy(0,7);cputs("abcdABCD   2");
+    textcolor(3);gotoxy(0,8);cputs("abcdABCD    3");
+
+    while(1) {
+        textcolor(COLOR_BLACK);
+
+        n = clock();
+
+        gotoxy(0,2);cprintf("%04x %02x %02x %02x", n, x, y, *((unsigned char*)JOY_DATA));
+
+        switch((*((unsigned char*)JOY_DATA))) {
+            case 0xff ^ JOY_DATA_UP:
+                ++y; if (y == 0xc8) y = 0;
+                break;
+            case 0xff ^ JOY_DATA_DOWN:
+                --y; if (y == 0xff) y = 0xc7;
+                break;
+            case 0xff ^ JOY_DATA_LEFT:
+                ++x;
+                break;
+            case 0xff ^ JOY_DATA_RIGHT:
+                --x;
+                break;
+            case 0xff ^ JOY_DATA_FIRE_A:
+                break;
+        }
+
+        waitvblank();
+
+        (*((unsigned char*)LCD_XPOS)) = x;
+        (*((unsigned char*)LCD_YPOS)) = y;
+
+    }
+
+    return 0;
+}
diff --git a/testcode/lib/gamate/lcdtest.s b/testcode/lib/gamate/lcdtest.s
new file mode 100644 (file)
index 0000000..3a8d722
--- /dev/null
@@ -0,0 +1,422 @@
+;
+; original lcdtest.s by PeT (mess@utanet.at)
+;
+; cl65 -t gamate -o lcdtest.bin lcdtest.s
+;
+
+        .include "gamate.inc"
+
+        .zeropage
+addr:           .word 0
+psa:            .word 0
+
+        .bss
+temp_x:         .byte 0
+temp_y:         .byte 0
+temp_a:                .byte 0
+irq_count:      .byte 0
+nmi_count:      .byte 0
+psx:            .byte 0
+psy:            .byte 0
+count:          .word 0
+counted:        .word 0
+xpos:           .byte 0
+ypos:           .byte 0
+
+        .rodata
+
+chars:          .incbin "cga2.chr"
+
+hex2asc:        .byte "0123456789abcdef"
+format:         .byte "IrqNmiCountXposYpos", 0
+xdesc:          .byte "0123456789abcdefghijklmnopqrstuv", 0
+ydesc:          .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
+
+        .code
+
+;-------------------------------------------------------------------------------
+        .export IRQStub, NMIStub
+
+
+.proc   NMIStub
+
+        inc     nmi_count
+        rts
+.endproc
+
+.proc   IRQStub
+
+        inc     irq_count
+        lda     count
+        sta     counted
+        lda     count+1
+        sta     counted+1
+        lda     #0
+        sta     count
+        sta     count+1
+        rts
+.endproc
+
+;-------------------------------------------------------------------------------
+        .export Start
+
+.proc   Start
+        sei
+        lda     #0
+        sta     ZP_IRQ_CTRL
+
+        lda #0
+        sta     LCD_XPOS
+        sta     LCD_YPOS
+        cli
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+
+        lda     #0
+        sta     LCD_X
+        lda     #<xdesc
+        ldx     #>xdesc
+        ldy     #0
+        jsr     printstring
+
+        lda     #LCD_XPOS_PLANE2
+        sta     LCD_X
+        lda     #<xdesc
+        ldx     #>xdesc
+        ldy     #128
+        jsr     printstring
+
+        lda     #0
+        sta     LCD_X
+        lda     #<ydesc
+        ldx     #>ydesc
+        ldy     #0
+        sty     LCD_Y
+        jsr     printstringy
+
+        lda     #(LCD_XPOS_PLANE2|(128/8))          ; ???
+        sta     LCD_X
+        lda     #<ydesc
+        ldx     #>ydesc
+        ldy     #0
+        sty     LCD_Y
+        jsr     printstringy
+
+        lda     #<format
+        ldx     #>format
+        ldy     #8
+        jsr     printstring
+
+        lda     #0
+        sta     LCD_MODE
+        lda     #24/8
+        sta     LCD_X
+        lda     #24
+        sta     LCD_Y
+        lda     #'X'
+        jsr     printsign
+
+        lda     #$80
+        sta     LCD_MODE
+        lda     #32/8
+        sta     LCD_X
+        lda     #32
+        sta     LCD_Y
+        lda     #'Y'
+        jsr     printsign
+
+        lda     #$c0
+        sta     LCD_MODE
+        lda     #40/8
+        sta     LCD_X
+        lda     #40
+        sta     LCD_Y
+        lda     #'Z'
+        jsr     printsign
+
+        lda     #0
+        sta     LCD_MODE
+        lda     #LCD_XPOS_PLANE2|(48/8)
+        sta     LCD_X
+        lda     #48
+        sta     LCD_Y
+        lda     #'x'
+        jsr     printsign
+
+        lda     #$80
+        sta     LCD_MODE
+        lda     #(LCD_XPOS_PLANE2|(56/8))
+        sta     LCD_X
+        lda     #56
+        sta     LCD_Y
+        lda     #'y'
+        jsr     printsign
+
+        lda     #$c0
+        sta     LCD_MODE
+        lda     #(LCD_XPOS_PLANE2|(64/8))
+        sta     LCD_X
+        lda     #64
+        sta     LCD_Y
+        lda     #'z'
+        jsr     printsign
+
+        lda     #LCD_MODE_INC_Y|1
+        sta     LCD_MODE
+        lda     #16/8
+        sta     LCD_X
+        lda     #72
+        sta     LCD_Y
+        lda     #'V'
+        jsr     printsign
+
+        lda     #LCD_MODE_INC_Y|2
+        sta     LCD_MODE
+        lda     #24/8
+        sta     LCD_X
+        lda     #72
+        sta     LCD_Y
+        lda     #'V'
+        jsr     printsign
+
+        lda     #LCD_MODE_INC_Y|4
+        sta     LCD_MODE
+        lda     #32/8
+        sta     LCD_X
+        lda     #72
+        sta     LCD_Y
+        lda     #'V'
+        jsr     printsign
+
+        lda     #LCD_MODE_INC_Y|8
+        sta     LCD_MODE
+        lda     #40/8
+        sta     LCD_X
+        lda     #72
+        sta     LCD_Y
+        lda     #'V'
+        jsr     printsign
+
+        lda     #1
+        sta     ZP_IRQ_CTRL
+
+loop:
+        lda     count
+        clc
+        adc     #1
+        sta     count
+        lda     count+1
+        adc     #0
+        sta     count+1
+
+        lda     irq_count
+        cmp     irq_count
+        beq     loop
+
+        jsr     inputs
+
+        lda     #LCD_MODE_INC_Y
+        sta     LCD_MODE
+        jsr     printy
+
+        jmp     loop
+.endproc
+
+
+;-------------------------------------------------------------------------------
+
+.proc printy
+        ldx     #0
+        ldy     #16
+        lda     irq_count
+        jsr     printhex
+
+        ldx     #3
+        ldy     #16
+        lda     nmi_count
+        jsr     printhex
+
+        ldx     #6
+        ldy     #16
+        lda     counted+1
+        jsr     printhex
+        ldx     #8
+        ldy     #16
+        lda     counted
+        jsr     printhex
+
+        ldx     #11
+        ldy     #16
+        lda     xpos
+        jsr     printhex
+        ldx     #14
+        ldy     #16
+        lda     ypos
+        jsr     printhex
+        rts
+.endproc
+
+.proc inputs
+        lda     JOY_DATA
+        and     #JOY_DATA_UP
+        bne     notup
+        dec     ypos
+        lda     ypos
+        sta     LCD_YPOS
+notup:
+        lda     JOY_DATA
+        and     #JOY_DATA_DOWN
+        bne     notdown
+        inc     ypos
+        lda     ypos
+        sta     LCD_YPOS
+notdown:
+        lda     JOY_DATA
+        and     #JOY_DATA_LEFT
+        bne     notleft
+        dec     xpos
+        lda     xpos
+        sta     LCD_XPOS
+notleft:
+        lda     JOY_DATA
+        and     #JOY_DATA_RIGHT
+        bne     notright
+        inc     xpos
+        lda     xpos
+        sta     LCD_XPOS
+notright:
+        lda     JOY_DATA
+        and     #JOY_DATA_START
+        bne     notstart
+notstart:
+        lda     JOY_DATA
+        and     #JOY_DATA_SELECT
+        bne     notselect
+notselect:
+        lda     JOY_DATA
+        and     #JOY_DATA_FIRE_A
+        bne     notbuttona
+notbuttona:
+        lda     JOY_DATA
+        and     #JOY_DATA_FIRE_B
+        bne     notbuttonb
+notbuttonb:
+        rts
+.endproc
+
+;-------------------------------------------------------------------------------
+
+.proc printstring
+        sta     psa
+        stx     psa+1
+        ldx     #0
+        stx     psx
+        sty     psy
+printstring2:
+        ldy     #0
+        lda     (psa),y
+        beq     printstring1
+        ldx     psx
+        stx     LCD_X
+        ldy      psy
+        sty     LCD_Y
+        jsr     printsign
+        inc     psx
+        lda     psa
+        clc
+        adc     #1
+        sta     psa
+        lda     psa+1
+        adc     #0
+        sta     psa+1
+        jmp     printstring2
+printstring1:
+        rts
+.endproc
+
+.proc printstringy
+        sta     psa
+        stx     psa+1
+printstring2:
+        ldy     #0
+        lda     (psa),y
+        beq     printstring1
+        jsr     printsign
+        lda     psa
+        clc
+        adc     #1
+        sta     psa
+        lda     psa+1
+        adc     #0
+        sta     psa+1
+        jmp     printstring2
+printstring1:
+        rts
+.endproc
+
+
+.proc printhex
+        pha
+        lsr
+        lsr
+        lsr
+        lsr
+        and     #$0f
+        stx     temp_x
+        tax
+        lda     hex2asc,x
+        ldx     temp_x
+        stx     LCD_X
+        sty     LCD_Y
+        jsr     printsign
+        pla
+        and     #$0f
+        inx
+        stx     temp_x
+        tax
+        lda     hex2asc,x
+        ldx     temp_x
+        stx     LCD_X
+        sty     LCD_Y
+        jmp     printsign
+.endproc
+
+.proc printsign
+        sty     temp_y
+        stx     temp_x
+        sta     temp_a
+
+        lda     temp_a
+        sta     addr
+
+        lda     #0
+        sta     addr+1
+        asl     addr
+        rol     addr+1
+        asl     addr
+        rol     addr+1
+        asl     addr
+        rol     addr+1
+
+        lda     addr
+        clc
+        adc     #<chars
+        sta     addr
+        lda     addr+1
+        adc     #>chars
+        sta     addr+1
+
+        ldx     #8
+        ldy     #0
+printsign1:
+        lda     (addr),y
+        sta     LCD_DATA
+        iny
+        dex
+        bne     printsign1
+
+        ldx     temp_x
+        ldy     temp_y
+        rts
+.endproc
+
diff --git a/testcode/lib/gamate/nachtm.c b/testcode/lib/gamate/nachtm.c
new file mode 100644 (file)
index 0000000..6cf8fe1
--- /dev/null
@@ -0,0 +1,1157 @@
+/*
+** "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart, KV 525
+**
+** First version in 1987 by
+**   Joachim von Bassewitz (joachim@von-bassewitz.de) and
+**   Ullrich von Bassewitz (ullrich@von-bassewitz.de).
+**
+** C conversion in 1998 by
+**   Ullrich von Bassewitz (ullrich@von-bassewitz.de)
+**
+*/
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <conio.h>
+#include <gamate.h>
+
+/*****************************************************************************/
+/*                                   Data                                    */
+/*****************************************************************************/
+
+
+
+/* Tables with voice data.
+**
+**  Bit     Description
+** -------------------------------------------
+**  15      Pause bit.
+**  12-14   Octave
+**  8-11    Tone (index into frequency table)
+**  7       Unused. Was thought as a control bit in the original version to
+**          change SID parameters, but this was never implemented.
+**  0-6     Length of the tone in ticks.
+**
+*/
+
+const unsigned Voice1 [] = {
+    0x5708,0x8004,0x5204,0x5708,0x8004,0x5204,0x5704,0x5204,0x5704,0x5B04,
+    0x6208,0x8008,0x6008,0x8004,0x5904,0x6008,0x8004,0x5904,0x6004,0x5904,
+    0x5604,0x5904,0x5208,0x8008,0x5704,0x8004,0x570C,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5904,0x5704,0x5704,0x5604,0x560C,0x5901,0x5901,0x5901,0x5901,
+    0x6004,0x5604,0x5901,0x5901,0x5901,0x5901,0x5704,0x570C,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x560C,
+    0x5901,0x5901,0x5901,0x5901,0x6004,0x5604,0x5704,0x5704,0x5601,0x5601,
+    0x5601,0x5601,0x5401,0x5401,0x5602,0x5704,0x5704,0x5901,0x5901,0x5901,
+    0x5901,0x5701,0x5701,0x5902,0x5B04,0x5B04,0x6001,0x6001,0x6001,0x6001,
+    0x5B01,0x5B01,0x6001,0x6001,0x6208,0x8008,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5410,0x5008,0x5008,0x4B08,0x4B08,0x4908,0x4908,0x4701,
+    0x4701,0x4701,0x4701,0x4604,0x4404,0x4604,0x4704,0x8004,0x4904,0x8004,
+    0x4B04,0x800C,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5410,0x5201,
+    0x5201,0x5201,0x5201,0x5004,0x5004,0x5004,0x5001,0x5001,0x5001,0x5001,
+    0x4B04,0x4B04,0x4B04,0x4B01,0x4B01,0x4B01,0x4B01,0x4904,0x4904,0x4904,
+    0x4701,0x4701,0x4701,0x4701,0x4601,0x4601,0x4601,0x4601,0x4401,0x4401,
+    0x4401,0x4401,0x4604,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,
+    0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4704,
+    0x4701,0x4701,0x4601,0x4701,0x4901,0x4901,0x4901,0x4901,0x4604,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B04,0x4B01,0x4B01,0x4901,0x4B01,
+    0x5001,0x5001,0x5001,0x5001,0x4904,0x5210,0x5408,0x5608,0x5708,0x5908,
+    0x5B08,0x6108,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x5904,0x6101,0x6101,0x6101,0x6101,0x6101,
+    0x6101,0x5902,0x6101,0x6101,0x6101,0x6101,0x6101,0x6101,0x5902,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x5904,0x6101,0x6101,0x6101,0x6101,0x6101,0x6101,0x5902,0x6101,
+    0x6101,0x6101,0x6101,0x6101,0x6101,0x5902,0x6204,0x6208,0x6208,0x6208,
+    0x6201,0x6201,0x6201,0x6201,0x6204,0x6208,0x6208,0x6208,0x6204,0x6104,
+    0x5904,0x6204,0x5904,0x6004,0x5904,0x6204,0x5904,0x6104,0x4904,0x4904,
+    0x4904,0x4908,0x8008,0x590A,0x5702,0x5602,0x5402,0x5204,0x8004,0x5B04,
+    0x8004,0x5704,0x8004,0x5404,0x8004,0x5B04,0x800C,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5201,
+    0x5201,0x5101,0x5101,0x4B04,0x8004,0x5704,0x8004,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5408,0x8008,0x5901,0x5901,0x5901,0x5901,0x5901,
+    0x5901,0x5901,0x5901,0x5901,0x5901,0x5701,0x5701,0x5601,0x5601,0x5401,
+    0x5401,0x5204,0x8004,0x5B04,0x8004,0x5704,0x8004,0x5404,0x8004,0x5908,
+    0x8004,0x5704,0x6104,0x6204,0x8004,0x5B04,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5904,0x8004,0x5104,0x5208,0x8004,0x5904,0x6201,0x6201,0x6201,0x6201,
+    0x6101,0x6101,0x6101,0x6101,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5B01,
+    0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,0x5904,0x5904,0x5904,0x5904,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,0x6204,0x6104,0x5B04,
+    0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,0x5904,0x5904,
+    0x5904,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8008,0x5B0A,0x5901,
+    0x5901,0x5701,0x5701,0x5601,0x5601,0x5708,0x8008,0x590A,0x5701,0x5701,
+    0x5601,0x5601,0x5401,0x5401,0x5608,0x8008,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x6101,0x6101,0x6201,0x6201,0x6104,0x5B04,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5904,0x5604,0x5904,0x5901,0x5901,0x5901,0x5901,0x5704,0x5604,0x5404,
+    0x5208,0x8004,0x5904,0x6201,0x6201,0x6201,0x6201,0x6101,0x6101,0x6101,
+    0x6101,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5904,0x8004,0x5904,0x5904,0x5904,0x5904,0x5904,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5904,0x8004,0x5904,0x6201,0x6201,0x6201,0x6201,0x6101,0x6101,
+    0x6101,0x6101,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5904,0x8004,0x5904,0x5904,0x5904,0x5904,0x5904,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x8008,0x5B0A,0x5901,0x5901,0x5701,0x5701,0x5601,
+    0x5601,0x5708,0x8008,0x590A,0x5701,0x5701,0x5601,0x5601,0x5401,0x5401,
+    0x5608,0x8008,0x5B01,0x5B01,0x5B01,0x5B01,0x6101,0x6101,0x6201,0x6201,
+    0x6104,0x5B04,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5604,0x5904,0x5901,
+    0x5901,0x5901,0x5901,0x5704,0x5604,0x5404,0x5204,0x4904,0x4B04,0x5104,
+    0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,0x5201,0x5201,0x5401,0x5401,
+    0x5604,0x5104,0x5204,0x5404,0x5604,0x5604,0x5701,0x5701,0x5701,0x5701,
+    0x5601,0x5601,0x5701,0x5701,0x5904,0x5904,0x5A04,0x5802,0x5A02,0x5B08,
+    0x8008,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x5404,0x5201,0x5201,0x5201,0x5201,0x5101,0x5101,
+    0x5101,0x5101,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,0x5901,0x5901,
+    0x6204,0x8004,0x6604,0x8004,0x6204,0x800C,0x5708,0x8004,0x5204,0x5708,
+    0x8004,0x5204,0x5704,0x5204,0x5704,0x5B04,0x6208,0x8008,0x6008,0x8004,
+    0x5904,0x6008,0x8004,0x5904,0x6004,0x5904,0x5604,0x5904,0x5208,0x8008,
+    0x5704,0x8004,0x570C,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5704,0x5704,
+    0x5604,0x560C,0x5901,0x5901,0x5901,0x5901,0x6004,0x5604,0x5901,0x5901,
+    0x5901,0x5901,0x5704,0x570C,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5704,
+    0x5701,0x5701,0x5701,0x5701,0x5604,0x560C,0x5901,0x5901,0x5901,0x5901,
+    0x6004,0x5604,0x5704,0x5704,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,
+    0x5602,0x5704,0x5704,0x5901,0x5901,0x5901,0x5901,0x5701,0x5701,0x5902,
+    0x5B04,0x5B04,0x6001,0x6001,0x6001,0x6001,0x5B01,0x5B01,0x6001,0x6001,
+    0x6208,0x8008,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5410,0x5008,
+    0x5008,0x4B08,0x4B08,0x4908,0x4908,0x4701,0x4701,0x4701,0x4701,0x4604,
+    0x4404,0x4604,0x4704,0x8004,0x4904,0x8004,0x4B04,0x800C,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5410,0x5201,0x5201,0x5201,0x5201,0x5004,
+    0x5004,0x5004,0x5001,0x5001,0x5001,0x5001,0x4B04,0x4B04,0x4B04,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4904,0x4904,0x4904,0x4701,0x4701,0x4701,0x4701,
+    0x4601,0x4601,0x4601,0x4601,0x4401,0x4401,0x4401,0x4401,0x4604,0x4701,
+    0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,0x4701,
+    0x4701,0x4701,0x4701,0x4701,0x4701,0x4704,0x4701,0x4701,0x4601,0x4701,
+    0x4901,0x4901,0x4901,0x4901,0x4604,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B04,0x4B01,0x4B01,0x4901,0x4B01,0x5001,0x5001,0x5001,0x5001,
+    0x4904,0x5210,0x5408,0x5608,0x5708,0x5908,0x5B08,0x6108,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x5904,0x6101,0x6101,0x6101,0x6101,0x6101,0x6101,0x5902,0x6101,0x6101,
+    0x6101,0x6101,0x6101,0x6101,0x5902,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x5904,0x6101,0x6101,
+    0x6101,0x6101,0x6101,0x6101,0x5902,0x6101,0x6101,0x6101,0x6101,0x6101,
+    0x6101,0x5902,0x6204,0x6208,0x6208,0x6208,0x6201,0x6201,0x6201,0x6201,
+    0x6204,0x6208,0x6208,0x6208,0x6204,0x6104,0x5904,0x6204,0x5904,0x6004,
+    0x5904,0x6204,0x5904,0x6104,0x4904,0x4904,0x4904,0x4908,0x8008,0x590A,
+    0x5702,0x5602,0x5402,0x5204,0x8004,0x5B04,0x8004,0x5704,0x8004,0x5404,
+    0x8004,0x5B04,0x800C,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5401,0x5401,0x5201,0x5201,0x5101,0x5101,0x4B04,
+    0x8004,0x5704,0x8004,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5408,
+    0x8008,0x5901,0x5901,0x5901,0x5901,0x5901,0x5901,0x5901,0x5901,0x5901,
+    0x5901,0x5701,0x5701,0x5601,0x5601,0x5401,0x5401,0x5204,0x8004,0x5B04,
+    0x8004,0x5704,0x8004,0x5404,0x8004,0x5908,0x8004,0x5704,0x6104,0x6204,
+    0x8004,0x5B04,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5104,0x5208,
+    0x8004,0x5904,0x6201,0x6201,0x6201,0x6201,0x6101,0x6101,0x6101,0x6101,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,
+    0x8004,0x5904,0x5904,0x5904,0x5904,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5904,0x8004,0x5904,0x6204,0x6104,0x5B04,0x5904,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5904,0x8004,0x5904,0x5904,0x5904,0x5904,0x5904,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x8008,0x5B0A,0x5901,0x5901,0x5701,0x5701,0x5601,
+    0x5601,0x5708,0x8008,0x590A,0x5701,0x5701,0x5601,0x5601,0x5401,0x5401,
+    0x5608,0x8008,0x5B01,0x5B01,0x5B01,0x5B01,0x6101,0x6101,0x6201,0x6201,
+    0x6104,0x5B04,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5604,0x5904,0x5901,
+    0x5901,0x5901,0x5901,0x5704,0x5604,0x5404,0x5208,0x8004,0x5904,0x6201,
+    0x6201,0x6201,0x6201,0x6101,0x6101,0x6101,0x6101,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,0x5904,
+    0x5904,0x5904,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,
+    0x6201,0x6201,0x6201,0x6201,0x6101,0x6101,0x6101,0x6101,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,
+    0x5904,0x5904,0x5904,0x5904,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8008,
+    0x5B0A,0x5901,0x5901,0x5701,0x5701,0x5601,0x5601,0x5708,0x8008,0x590A,
+    0x5701,0x5701,0x5601,0x5601,0x5401,0x5401,0x5608,0x8008,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x6101,0x6101,0x6201,0x6201,0x6104,0x5B04,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x5604,0x5904,0x5901,0x5901,0x5901,0x5901,0x5704,
+    0x5604,0x5404,0x5204,0x4904,0x4B04,0x5104,0x5204,0x5204,0x5401,0x5401,
+    0x5401,0x5401,0x5201,0x5201,0x5401,0x5401,0x5604,0x5104,0x5204,0x5404,
+    0x5604,0x5604,0x5701,0x5701,0x5701,0x5701,0x5601,0x5601,0x5701,0x5701,
+    0x5904,0x5904,0x5A04,0x5802,0x5A02,0x5B08,0x8008,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x5404,
+    0x5201,0x5201,0x5201,0x5201,0x5101,0x5101,0x5101,0x5101,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5901,0x5901,0x5901,0x5901,0x6204,0x8004,0x6604,0x8004,
+    0x6204,0x800C,0x5208,0x8004,0x4904,0x5208,0x8004,0x4904,0x5204,0x4904,
+    0x5204,0x5604,0x5908,0x8008,0x5908,0x8004,0x5604,0x5908,0x8004,0x5604,
+    0x5904,0x5604,0x5304,0x5604,0x4B08,0x8014,0x5704,0x6001,0x6001,0x6001,
+    0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,0x5901,0x5901,0x5704,
+    0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,0x5704,0x5704,0x5704,
+    0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,0x6001,0x6001,
+    0x6001,0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,0x5901,0x5901,
+    0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,0x5704,0x5704,
+    0x5704,0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,0x6001,
+    0x6001,0x6001,0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,0x5901,
+    0x5901,0x5704,0x5901,0x5901,0x5901,0x5901,0x5804,0x8004,0x5804,0x5804,
+    0x5804,0x5804,0x5804,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x8004,0x5904,
+    0x6001,0x6001,0x6001,0x6001,0x5A01,0x5A01,0x5A01,0x5A01,0x5901,0x5901,
+    0x5901,0x5901,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x8004,0x5604,
+    0x5604,0x5604,0x5604,0x5604,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,
+    0x5304,0x5704,0x5504,0x5304,0x5204,0x5201,0x5201,0x5201,0x5201,0x5104,
+    0x8004,0x5104,0x5104,0x5104,0x5104,0x5104,0x5401,0x5401,0x5401,0x5401,
+    0x5204,0x8004,0x4201,0x4201,0x4201,0x4201,0x4401,0x4401,0x4401,0x4401,
+    0x4601,0x4601,0x4601,0x4601,0x4701,0x4701,0x4701,0x4701,0x4901,0x4901,
+    0x4901,0x4901,0x5001,0x5001,0x5001,0x5001,0x4A04,0x8004,0x4601,0x4601,
+    0x4601,0x4601,0x4701,0x4701,0x4701,0x4701,0x4901,0x4901,0x4901,0x4901,
+    0x4A01,0x4A01,0x4A01,0x4A01,0x5101,0x5101,0x5101,0x5101,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x8004,0x5201,0x5201,0x5201,0x5201,0x5401,0x5401,
+    0x5401,0x5401,0x5601,0x5601,0x5601,0x5601,0x5701,0x5701,0x5701,0x5701,
+    0x5901,0x5901,0x5901,0x5901,0x5A01,0x5A01,0x5A01,0x5A01,0x5A01,0x5A01,
+    0x5A01,0x5A01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,0x6108,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6210,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5602,0x5708,0x8004,0x5204,
+    0x5708,0x8004,0x5204,0x5704,0x5204,0x5704,0x5B04,0x6208,0x8008,0x6008,
+    0x8004,0x5904,0x6008,0x8004,0x5904,0x6004,0x5904,0x5604,0x5904,0x5208,
+    0x8008,0x5704,0x8004,0x570C,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5704,
+    0x5701,0x5701,0x5701,0x5701,0x5604,0x560C,0x5901,0x5901,0x5901,0x5901,
+    0x6004,0x5604,0x5901,0x5901,0x5901,0x5901,0x5704,0x570C,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x560C,
+    0x5901,0x5901,0x5901,0x5901,0x6004,0x5604,0x5704,0x5704,0x5601,0x5601,
+    0x5601,0x5601,0x5401,0x5401,0x5602,0x5704,0x5704,0x5901,0x5901,0x5901,
+    0x5901,0x5701,0x5701,0x5902,0x5B04,0x5B04,0x6001,0x6001,0x6001,0x6001,
+    0x5B01,0x5B01,0x6001,0x6001,0x6208,0x8008,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5410,0x5008,0x5008,0x4B08,0x4B08,0x4908,0x4908,0x4701,
+    0x4701,0x4701,0x4701,0x4604,0x4404,0x4604,0x4704,0x8004,0x4904,0x8004,
+    0x4B04,0x800C,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5410,0x5201,
+    0x5201,0x5201,0x5201,0x5004,0x5004,0x5004,0x5001,0x5001,0x5001,0x5001,
+    0x4B04,0x4B04,0x4B04,0x4B01,0x4B01,0x4B01,0x4B01,0x4904,0x4904,0x4904,
+    0x4701,0x4701,0x4701,0x4701,0x4604,0x4404,0x4604,0x4714,0x4701,0x4701,
+    0x4601,0x4701,0x4901,0x4901,0x4901,0x4901,0x4604,0x4B14,0x4B01,0x4B01,
+    0x4901,0x4B01,0x5001,0x5001,0x5001,0x5001,0x4904,0x5210,0x5408,0x5608,
+    0x5708,0x5908,0x5B08,0x5108,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x5904,0x6101,0x6101,0x6101,
+    0x6101,0x6101,0x6101,0x5902,0x5101,0x5101,0x5101,0x5101,0x5101,0x5101,
+    0x5902,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x5904,0x6101,0x6101,0x6101,0x6101,0x6101,0x6101,
+    0x5902,0x5101,0x5101,0x5101,0x5101,0x5101,0x5101,0x5902,0x6204,0x5904,
+    0x6104,0x5904,0x6204,0x5904,0x6104,0x5904,0x6204,0x4204,0x4204,0x4204,
+    0x4208,0x8008,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,0x4704,0x8004,
+    0x5404,0x8004,0x5004,0x8004,0x4904,0x8004,0x5204,0x800C,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,
+    0x5701,0x5701,0x5601,0x5601,0x5404,0x8004,0x6004,0x8004,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5908,0x8008,0x8004,0x6204,0x6204,0x6204,
+    0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6201,0x6201,
+    0x6201,0x6201,0x6001,0x6001,0x6001,0x6001,0x5901,0x5901,0x5901,0x5901,
+    0x5604,0x5601,0x5601,0x5601,0x5601,0x5704,0x8004,0x5404,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x8004,0x4604,0x4708,0x8004,0x5204,0x5701,0x5701,
+    0x5701,0x5701,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5401,0x5401,
+    0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5204,0x5204,
+    0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5704,
+    0x5604,0x5404,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,
+    0x5204,0x5204,0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8008,
+    0x540A,0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x5008,0x8008,0x520A,
+    0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,0x4B08,0x8008,0x5401,0x5401,
+    0x5401,0x5401,0x5601,0x5601,0x5701,0x5701,0x5604,0x5404,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x4B04,0x5204,0x5201,0x5201,0x5201,0x5201,0x5004,
+    0x4B04,0x4904,0x4708,0x8004,0x5204,0x5701,0x5701,0x5701,0x5701,0x5601,
+    0x5601,0x5601,0x5601,0x5401,0x5401,0x5401,0x5401,0x5204,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x8004,0x5204,0x5204,0x5204,0x5204,0x5204,0x5401,
+    0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5701,0x5701,0x5701,0x5701,
+    0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5401,0x5401,0x5204,0x5401,
+    0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5204,0x5204,0x5204,0x5204,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x8008,0x640A,0x6201,0x6201,0x6001,
+    0x6001,0x5B01,0x5B01,0x6008,0x8008,0x620A,0x6001,0x6001,0x5B01,0x5B01,
+    0x5901,0x5901,0x5B08,0x8008,0x5401,0x5401,0x5401,0x5401,0x5601,0x5601,
+    0x5701,0x5701,0x5604,0x5404,0x5204,0x5704,0x5B04,0x6204,0x6201,0x6201,
+    0x6201,0x6201,0x6004,0x5B04,0x5904,0x5704,0x4204,0x4404,0x4604,0x4704,
+    0x4704,0x4901,0x4901,0x4901,0x4901,0x4701,0x4701,0x4901,0x4901,0x4B04,
+    0x4604,0x4704,0x4904,0x4B04,0x4B04,0x5001,0x5001,0x5001,0x5001,0x4B01,
+    0x4B01,0x5001,0x5001,0x5204,0x5204,0x5301,0x5301,0x5301,0x5301,0x5101,
+    0x5101,0x5301,0x5301,0x5408,0x8008,0x440C,0x4904,0x4704,0x4604,0x4404,
+    0x4204,0x5201,0x5201,0x5201,0x5201,0x5101,0x5101,0x5101,0x5101,0x5001,
+    0x5001,0x5001,0x5001,0x4B01,0x4B01,0x4B01,0x4B01,0x5201,0x5201,0x5201,
+    0x5201,0x5101,0x5101,0x5101,0x5101,0x5001,0x5001,0x5001,0x5001,0x4B04,
+    0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4904,0x4701,0x4701,0x4701,0x4701,0x4601,0x4601,0x4601,
+    0x4601,0x4401,0x4401,0x4401,0x4401,0x4204,0x5201,0x5201,0x5201,0x5201,
+    0x5401,0x5401,0x5401,0x5401,0x5601,0x5601,0x5601,0x5601,0x5701,0x5701,
+    0x5701,0x5701,0x5201,0x5201,0x5201,0x5201,0x5401,0x5401,0x5401,0x5401,
+    0x5601,0x5601,0x5601,0x5601,0x5704,0x5908,0x8008,0x6208,0x8008,0x5708,
+    0x8004,0x5204,0x4B04,0x4704,0x4B04,0x5204,0x5704,0x5204,0x5704,0x5B04,
+    0x6208,0x5608,0x5708,0x8004,0x5204,0x4B04,0x4704,0x4B04,0x5204,0x5704,
+    0x5204,0x5704,0x5B04,0x6208,0x5608,0x5708,0x8008,0x5708,0x8008,0x5708,
+    0x4706,0x4702,0x4708,0x8008,0x5208,0x8004,0x4904,0x5208,0x8004,0x4904,
+    0x5204,0x4904,0x5204,0x5604,0x5908,0x8008,0x5908,0x8004,0x5604,0x5908,
+    0x8004,0x5604,0x5904,0x5604,0x5304,0x5604,0x4B08,0x8014,0x5704,0x6001,
+    0x6001,0x6001,0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,0x5901,
+    0x5901,0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,0x5704,
+    0x5704,0x5704,0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,
+    0x6001,0x6001,0x6001,0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,0x5901,
+    0x5901,0x5901,0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,0x5704,
+    0x5704,0x5704,0x5704,0x5704,0x5901,0x5901,0x5901,0x5901,0x5704,0x8004,
+    0x5704,0x6001,0x6001,0x6001,0x6001,0x5B01,0x5B01,0x5B01,0x5B01,0x5901,
+    0x5901,0x5901,0x5901,0x5704,0x5901,0x5901,0x5901,0x5901,0x5804,0x8004,
+    0x5804,0x5804,0x5804,0x5804,0x5804,0x5B01,0x5B01,0x5B01,0x5B01,0x5904,
+    0x8004,0x5904,0x6001,0x6001,0x6001,0x6001,0x5A01,0x5A01,0x5A01,0x5A01,
+    0x5901,0x5901,0x5901,0x5901,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,
+    0x8004,0x5604,0x5604,0x5604,0x5604,0x5604,0x5901,0x5901,0x5901,0x5901,
+    0x5704,0x8004,0x5304,0x5704,0x5504,0x5304,0x5204,0x5201,0x5201,0x5201,
+    0x5201,0x5104,0x8004,0x5104,0x5104,0x5104,0x5104,0x5104,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x8004,0x4201,0x4201,0x4201,0x4201,0x4401,0x4401,
+    0x4401,0x4401,0x4601,0x4601,0x4601,0x4601,0x4701,0x4701,0x4701,0x4701,
+    0x4901,0x4901,0x4901,0x4901,0x5001,0x5001,0x5001,0x5001,0x4A04,0x8004,
+    0x4601,0x4601,0x4601,0x4601,0x4701,0x4701,0x4701,0x4701,0x4901,0x4901,
+    0x4901,0x4901,0x4A01,0x4A01,0x4A01,0x4A01,0x5101,0x5101,0x5101,0x5101,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5201,0x5201,0x5201,0x5201,
+    0x5401,0x5401,0x5401,0x5401,0x5601,0x5601,0x5601,0x5601,0x5701,0x5701,
+    0x5701,0x5701,0x5901,0x5901,0x5901,0x5901,0x5A01,0x5A01,0x5A01,0x5A01,
+    0x5A01,0x5A01,0x5A01,0x5A01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,0x6001,
+    0x6108,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6210,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5602,0x5708,
+    0x8004,0x5204,0x5708,0x8004,0x5204,0x5704,0x5204,0x5704,0x5B04,0x6208,
+    0x8008,0x6008,0x8004,0x5904,0x6008,0x8004,0x5904,0x6004,0x5904,0x5604,
+    0x5904,0x5208,0x8008,0x5704,0x8004,0x570C,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x560C,0x5901,0x5901,
+    0x5901,0x5901,0x6004,0x5604,0x5901,0x5901,0x5901,0x5901,0x5704,0x570C,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,
+    0x5604,0x560C,0x5901,0x5901,0x5901,0x5901,0x6004,0x5604,0x5704,0x5704,
+    0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5602,0x5704,0x5704,0x5901,
+    0x5901,0x5901,0x5901,0x5701,0x5701,0x5902,0x5B04,0x5B04,0x6001,0x6001,
+    0x6001,0x6001,0x5B01,0x5B01,0x6001,0x6001,0x6208,0x8008,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5410,0x5008,0x5008,0x4B08,0x4B08,0x4908,
+    0x4908,0x4701,0x4701,0x4701,0x4701,0x4604,0x4404,0x4604,0x4704,0x8004,
+    0x4904,0x8004,0x4B04,0x800C,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5410,0x5201,0x5201,0x5201,0x5201,0x5004,0x5004,0x5004,0x5001,0x5001,
+    0x5001,0x5001,0x4B04,0x4B04,0x4B04,0x4B01,0x4B01,0x4B01,0x4B01,0x4904,
+    0x4904,0x4904,0x4701,0x4701,0x4701,0x4701,0x4604,0x4404,0x4604,0x4714,
+    0x4701,0x4701,0x4601,0x4701,0x4901,0x4901,0x4901,0x4901,0x4604,0x4B14,
+    0x4B01,0x4B01,0x4901,0x4B01,0x5001,0x5001,0x5001,0x5001,0x4904,0x5210,
+    0x5408,0x5608,0x5708,0x5908,0x5B08,0x5108,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x5904,0x6101,
+    0x6101,0x6101,0x6101,0x6101,0x6101,0x5902,0x5101,0x5101,0x5101,0x5101,
+    0x5101,0x5101,0x5902,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,0x6201,
+    0x6201,0x6201,0x6201,0x6201,0x6201,0x5904,0x6101,0x6101,0x6101,0x6101,
+    0x6101,0x6101,0x5902,0x5101,0x5101,0x5101,0x5101,0x5101,0x5101,0x5902,
+    0x6204,0x5904,0x6104,0x5904,0x6204,0x5904,0x6104,0x5904,0x6204,0x4204,
+    0x4204,0x4204,0x4208,0x8008,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,
+    0x4704,0x8004,0x5404,0x8004,0x5004,0x8004,0x4904,0x8004,0x5204,0x800C,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5901,0x5901,0x5701,0x5701,0x5601,0x5601,0x5404,0x8004,0x6004,0x8004,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,
+    0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5B01,0x5908,0x8008,0x8004,0x6204,
+    0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,0x6204,
+    0x6201,0x6201,0x6201,0x6201,0x6001,0x6001,0x6001,0x6001,0x5901,0x5901,
+    0x5901,0x5901,0x5604,0x5601,0x5601,0x5601,0x5601,0x5704,0x8004,0x5404,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x4604,0x4708,0x8004,0x5204,
+    0x5701,0x5701,0x5701,0x5701,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,
+    0x5204,0x5204,0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,
+    0x5204,0x5704,0x5604,0x5404,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,
+    0x8004,0x5204,0x5204,0x5204,0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,
+    0x5204,0x8008,0x540A,0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x5008,
+    0x8008,0x520A,0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,0x4B08,0x8008,
+    0x5401,0x5401,0x5401,0x5401,0x5601,0x5601,0x5701,0x5701,0x5604,0x5404,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x4B04,0x5204,0x5201,0x5201,0x5201,
+    0x5201,0x5004,0x4B04,0x4904,0x4708,0x8004,0x5204,0x5701,0x5701,0x5701,
+    0x5701,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5401,0x5401,0x5204,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5204,0x5204,0x5204,
+    0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5701,0x5701,
+    0x5701,0x5701,0x5601,0x5601,0x5601,0x5601,0x5401,0x5401,0x5401,0x5401,
+    0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8004,0x5204,0x5204,0x5204,
+    0x5204,0x5204,0x5401,0x5401,0x5401,0x5401,0x5204,0x8008,0x640A,0x6201,
+    0x6201,0x6001,0x6001,0x5B01,0x5B01,0x6008,0x8008,0x620A,0x6001,0x6001,
+    0x5B01,0x5B01,0x5901,0x5901,0x5B08,0x8008,0x5401,0x5401,0x5401,0x5401,
+    0x5601,0x5601,0x5701,0x5701,0x5604,0x5404,0x5204,0x5704,0x5B04,0x6204,
+    0x6201,0x6201,0x6201,0x6201,0x6004,0x5B04,0x5904,0x5704,0x4204,0x4404,
+    0x4604,0x4704,0x4704,0x4901,0x4901,0x4901,0x4901,0x4701,0x4701,0x4901,
+    0x4901,0x4B04,0x4604,0x4704,0x4904,0x4B04,0x4B04,0x5001,0x5001,0x5001,
+    0x5001,0x4B01,0x4B01,0x5001,0x5001,0x5204,0x5204,0x5301,0x5301,0x5301,
+    0x5301,0x5101,0x5101,0x5301,0x5301,0x5408,0x8008,0x440C,0x4904,0x4704,
+    0x4604,0x4404,0x4204,0x5201,0x5201,0x5201,0x5201,0x5101,0x5101,0x5101,
+    0x5101,0x5001,0x5001,0x5001,0x5001,0x4B01,0x4B01,0x4B01,0x4B01,0x5201,
+    0x5201,0x5201,0x5201,0x5101,0x5101,0x5101,0x5101,0x5001,0x5001,0x5001,
+    0x5001,0x4B04,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4401,0x4401,0x4904,0x4701,0x4701,0x4701,0x4701,0x4601,
+    0x4601,0x4601,0x4601,0x4401,0x4401,0x4401,0x4401,0x4204,0x5201,0x5201,
+    0x5201,0x5201,0x5401,0x5401,0x5401,0x5401,0x5601,0x5601,0x5601,0x5601,
+    0x5701,0x5701,0x5701,0x5701,0x5201,0x5201,0x5201,0x5201,0x5401,0x5401,
+    0x5401,0x5401,0x5601,0x5601,0x5601,0x5601,0x5704,0x5908,0x8008,0x6208,
+    0x8008,0x5708,0x8004,0x5204,0x4B04,0x4704,0x4B04,0x5204,0x5704,0x5204,
+    0x5704,0x5B04,0x6208,0x5608,0x5708,0x8004,0x5204,0x4B04,0x4704,0x4B04,
+    0x5204,0x5704,0x5204,0x5704,0x5B04,0x6208,0x5608,0x5708,0x8008,0x5708,
+    0x8008,0x5708,0x4706,0x4702,0x4708,0x8008,
+    0x0000
+};
+
+const unsigned Voice2 [] = {
+    0x4708,0x8004,0x4204,0x4708,0x8004,0x4204,0x4704,0x4204,0x4704,0x4B04,
+    0x5208,0x8008,0x5008,0x8004,0x4904,0x5008,0x8004,0x4904,0x5004,0x4904,
+    0x4604,0x4904,0x4208,0x8008,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4904,0x4904,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,
+    0x5004,0x4601,0x4601,0x4601,0x4601,0x4904,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4904,0x4904,0x4904,0x4904,0x4901,0x4901,
+    0x4901,0x4901,0x5004,0x4601,0x4601,0x4601,0x4601,0x4904,0x4210,0x4210,
+    0x4210,0x4208,0x8028,0x3610,0x3710,0x4008,0x4008,0x3908,0x3208,0x3204,
+    0x8004,0x4204,0x8004,0x4208,0x8028,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4601,0x4710,0x4008,0x4004,0x4004,0x3908,0x3904,0x3904,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4904,0x4904,0x4704,0x4704,0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,
+    0x4210,0x4410,0x4210,0x4410,0x4604,0x4704,0x4904,0x4704,0x4604,0x4704,
+    0x4904,0x4604,0x4B04,0x4904,0x4704,0x4904,0x4B04,0x4904,0x4804,0x4B04,
+    0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x3904,
+    0x3904,0x3904,0x3908,0x8020,0x4604,0x8004,0x3B04,0x8004,0x4704,0x8004,
+    0x4404,0x8004,0x4104,0x800C,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4204,0x8004,0x4404,0x8004,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4201,0x4108,0x8010,0x4101,0x4101,0x4101,0x4101,0x4101,0x4101,
+    0x4101,0x4101,0x4204,0x8004,0x4604,0x8004,0x3B04,0x8004,0x3704,0x8004,
+    0x3408,0x8004,0x4404,0x4704,0x4604,0x8004,0x5704,0x5701,0x5701,0x5701,
+    0x5701,0x5604,0x8004,0x4704,0x4204,0x4204,0x4404,0x4404,0x4604,0x4604,
+    0x4204,0x4204,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4104,0x4104,
+    0x4204,0x4204,0x4404,0x4404,0x4604,0x4604,0x4204,0x4204,0x4104,0x4104,
+    0x4204,0x4204,0x4404,0x4404,0x4104,0x4104,0x4204,0x4204,0x4604,0x4404,
+    0x4304,0x3B04,0x4104,0x4304,0x4404,0x4704,0x4404,0x4204,0x4104,0x3904,
+    0x3B04,0x4104,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,
+    0x5204,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4704,0x4604,0x4204,
+    0x4404,0x4404,0x4604,0x4604,0x4204,0x4204,0x4104,0x4104,0x4204,0x4204,
+    0x4404,0x4404,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4604,0x4604,
+    0x4204,0x4204,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4104,0x4104,
+    0x4204,0x4204,0x4604,0x4404,0x4304,0x3B04,0x4104,0x4304,0x4404,0x4704,
+    0x4404,0x4204,0x4104,0x3904,0x3B04,0x4104,0x4204,0x5204,0x5204,0x5204,
+    0x5204,0x5204,0x5204,0x5204,0x5204,0x4904,0x4904,0x4904,0x4904,0x4904,
+    0x4904,0x4704,0x4604,0x3904,0x3B04,0x4104,0x4204,0x4204,0x4404,0x4404,
+    0x4604,0x4104,0x4204,0x4404,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,
+    0x4A04,0x4A04,0x4B08,0x8008,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4201,0x4201,
+    0x4201,0x4201,0x4104,0x5204,0x8004,0x5204,0x8004,0x5204,0x800C,0x4708,
+    0x8004,0x4204,0x4708,0x8004,0x4204,0x4704,0x4204,0x4704,0x4B04,0x5208,
+    0x8008,0x5008,0x8004,0x4904,0x5008,0x8004,0x4904,0x5004,0x4904,0x4604,
+    0x4904,0x4208,0x8008,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4904,0x4904,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,0x5004,
+    0x4601,0x4601,0x4601,0x4601,0x4904,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4904,0x4904,0x4904,0x4904,0x4901,0x4901,0x4901,
+    0x4901,0x5004,0x4601,0x4601,0x4601,0x4601,0x4904,0x4210,0x4210,0x4210,
+    0x4208,0x8028,0x3610,0x3710,0x4008,0x4008,0x3908,0x3208,0x3204,0x8004,
+    0x4204,0x8004,0x4208,0x8028,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4710,0x4008,0x4004,0x4004,0x3908,0x3904,0x3904,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4904,
+    0x4904,0x4704,0x4704,0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,0x4210,
+    0x4410,0x4210,0x4410,0x4604,0x4704,0x4904,0x4704,0x4604,0x4704,0x4904,
+    0x4604,0x4B04,0x4904,0x4704,0x4904,0x4B04,0x4904,0x4804,0x4B04,0x4904,
+    0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x3904,0x3904,
+    0x3904,0x3908,0x8020,0x4604,0x8004,0x3B04,0x8004,0x4704,0x8004,0x4404,
+    0x8004,0x4104,0x800C,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4204,0x8004,0x4404,0x8004,0x4201,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4108,0x8010,0x4101,0x4101,0x4101,0x4101,0x4101,0x4101,0x4101,
+    0x4101,0x4204,0x8004,0x4604,0x8004,0x3B04,0x8004,0x3704,0x8004,0x3408,
+    0x8004,0x4404,0x4704,0x4604,0x8004,0x5704,0x5701,0x5701,0x5701,0x5701,
+    0x5604,0x8004,0x4704,0x4204,0x4204,0x4404,0x4404,0x4604,0x4604,0x4204,
+    0x4204,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4104,0x4104,0x4204,
+    0x4204,0x4404,0x4404,0x4604,0x4604,0x4204,0x4204,0x4104,0x4104,0x4204,
+    0x4204,0x4404,0x4404,0x4104,0x4104,0x4204,0x4204,0x4604,0x4404,0x4304,
+    0x3B04,0x4104,0x4304,0x4404,0x4704,0x4404,0x4204,0x4104,0x3904,0x3B04,
+    0x4104,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,0x5204,
+    0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,0x4704,0x4604,0x4204,0x4404,
+    0x4404,0x4604,0x4604,0x4204,0x4204,0x4104,0x4104,0x4204,0x4204,0x4404,
+    0x4404,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4604,0x4604,0x4204,
+    0x4204,0x4104,0x4104,0x4204,0x4204,0x4404,0x4404,0x4104,0x4104,0x4204,
+    0x4204,0x4604,0x4404,0x4304,0x3B04,0x4104,0x4304,0x4404,0x4704,0x4404,
+    0x4204,0x4104,0x3904,0x3B04,0x4104,0x4204,0x5204,0x5204,0x5204,0x5204,
+    0x5204,0x5204,0x5204,0x5204,0x4904,0x4904,0x4904,0x4904,0x4904,0x4904,
+    0x4704,0x4604,0x3904,0x3B04,0x4104,0x4204,0x4204,0x4404,0x4404,0x4604,
+    0x4104,0x4204,0x4404,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,0x4A04,
+    0x4A04,0x4B08,0x8008,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,
+    0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4401,0x4201,0x4201,0x4201,
+    0x4201,0x4104,0x5204,0x8004,0x5204,0x8004,0x5204,0x800C,0x4208,0x8004,
+    0x3904,0x4208,0x8004,0x3904,0x4204,0x3904,0x4204,0x4604,0x4908,0x8008,
+    0x4908,0x8004,0x4604,0x4908,0x8004,0x4604,0x4904,0x4604,0x4304,0x4604,
+    0x3B08,0x8008,0x4004,0x4004,0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,
+    0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,0x3B04,0x4004,0x4004,
+    0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,0x3B04,0x3B04,0x4004,0x4004,
+    0x4204,0x4204,0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x4404,0x4404,
+    0x4004,0x4004,0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,0x3B04,
+    0x3904,0x3904,0x3B04,0x3B04,0x4004,0x4004,0x3904,0x3904,0x3904,0x3904,
+    0x3A04,0x3A04,0x4004,0x4004,0x3904,0x3904,0x3704,0x3704,0x3604,0x3604,
+    0x3704,0x3704,0x4604,0x4604,0x4704,0x4704,0x4604,0x4604,0x4704,0x3704,
+    0x3604,0x3704,0x3908,0x8004,0x3201,0x3201,0x3201,0x3201,0x3401,0x3401,
+    0x3401,0x3401,0x3601,0x3601,0x3601,0x3601,0x3701,0x3701,0x3701,0x3701,
+    0x3901,0x3901,0x3901,0x3901,0x4001,0x4001,0x4001,0x4001,0x3A04,0x8004,
+    0x3601,0x3601,0x3601,0x3601,0x3701,0x3701,0x3701,0x3701,0x3901,0x3901,
+    0x3901,0x3901,0x3A01,0x3A01,0x3A01,0x3A01,0x4101,0x4101,0x4101,0x4101,
+    0x4401,0x4401,0x4401,0x4401,0x4204,0x8038,0x4B04,0x4B04,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x5004,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,0x4B04,
+    0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4B04,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4904,0x4704,0x4204,0x3B08,0x8004,0x4204,0x4708,0x8004,0x4204,
+    0x4704,0x4204,0x4704,0x4B04,0x5208,0x8008,0x5008,0x8004,0x4904,0x5008,
+    0x8004,0x4904,0x5004,0x4904,0x4604,0x4904,0x4208,0x8008,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4701,0x4701,0x4701,0x4701,0x4B04,0x4401,0x4401,0x4401,0x4401,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4B04,0x4401,0x4401,0x4401,
+    0x4401,0x4704,0x4210,0x4210,0x4210,0x4208,0x8028,0x3610,0x3710,0x4008,
+    0x4008,0x3908,0x3908,0x3204,0x8004,0x4204,0x8004,0x4208,0x8028,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4710,0x4008,0x4004,0x4004,0x3908,
+    0x3904,0x3904,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4904,0x4904,0x4704,0x4704,0x4604,0x4604,
+    0x4704,0x4704,0x4404,0x4404,0x4210,0x4410,0x4210,0x4410,0x4208,0x4408,
+    0x4208,0x4408,0x4204,0x3204,0x3204,0x3204,0x3208,0x8020,0x3B04,0x8004,
+    0x3404,0x8004,0x4004,0x8004,0x3904,0x8004,0x3604,0x800C,0x4901,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4704,0x8004,0x4904,0x8004,
+    0x4B10,0x4908,0x8008,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,0x4704,
+    0x8004,0x5404,0x8004,0x5004,0x8004,0x4904,0x8004,0x5208,0x8004,0x5004,
+    0x5001,0x5001,0x5001,0x5001,0x4B04,0x8004,0x5004,0x5001,0x5001,0x5001,
+    0x5001,0x4B04,0x8004,0x4004,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,
+    0x3704,0x3704,0x3604,0x3604,0x3704,0x3704,0x3904,0x3904,0x3604,0x3604,
+    0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3604,0x3604,
+    0x3704,0x3704,0x3904,0x3904,0x3604,0x3604,0x3704,0x4704,0x4B04,0x4904,
+    0x4804,0x4404,0x4604,0x4804,0x4904,0x5004,0x4904,0x4704,0x4604,0x4204,
+    0x4404,0x4604,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4204,0x4204,0x4204,0x4204,0x4204,0x4204,0x4004,0x3B04,0x3704,
+    0x3904,0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3604,0x3604,0x3704,0x3704,
+    0x3904,0x3904,0x3604,0x3604,0x3704,0x4704,0x4904,0x4904,0x4B04,0x4B04,
+    0x4704,0x4704,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,
+    0x4704,0x4704,0x4B04,0x4904,0x4804,0x4404,0x4604,0x4804,0x4904,0x5004,
+    0x4904,0x4704,0x4604,0x4204,0x4404,0x4604,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4904,0x5004,
+    0x5004,0x5004,0x5004,0x5004,0x4B04,0x4904,0x4204,0x4404,0x4604,0x4704,
+    0x4704,0x4904,0x4904,0x4B04,0x3604,0x3704,0x3904,0x3B04,0x3B04,0x4004,
+    0x4004,0x4004,0x4004,0x4104,0x4104,0x4208,0x8008,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3701,0x3701,0x3701,0x3701,0x3604,0x3708,0x8018,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3701,0x3701,0x3701,0x3701,0x3604,0x3708,0x8008,0x4708,
+    0x8008,0x4408,0x8008,0x4708,0x8008,0x3710,0x3710,0x3710,0x3708,0x3908,
+    0x3710,0x3710,0x3710,0x3708,0x3908,0x3704,0x3B04,0x4204,0x4704,0x4B04,
+    0x4704,0x5204,0x4B04,0x4708,0x3706,0x3702,0x3708,0x8008,0x4208,0x8004,
+    0x3904,0x4208,0x8004,0x3904,0x4204,0x3904,0x4204,0x4604,0x4908,0x8008,
+    0x4908,0x8004,0x4604,0x4908,0x8004,0x4604,0x4904,0x4604,0x4304,0x4604,
+    0x3B08,0x8008,0x4004,0x4004,0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,
+    0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,0x3B04,0x4004,0x4004,
+    0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,0x3B04,0x3B04,0x4004,0x4004,
+    0x4204,0x4204,0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x4404,0x4404,
+    0x4004,0x4004,0x3B04,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,0x3B04,
+    0x3904,0x3904,0x3B04,0x3B04,0x4004,0x4004,0x3904,0x3904,0x3904,0x3904,
+    0x3A04,0x3A04,0x4004,0x4004,0x3904,0x3904,0x3704,0x3704,0x3604,0x3604,
+    0x3704,0x3704,0x4604,0x4604,0x4704,0x4704,0x4604,0x4604,0x4704,0x3704,
+    0x3604,0x3704,0x3908,0x8004,0x3201,0x3201,0x3201,0x3201,0x3401,0x3401,
+    0x3401,0x3401,0x3601,0x3601,0x3601,0x3601,0x3701,0x3701,0x3701,0x3701,
+    0x3901,0x3901,0x3901,0x3901,0x4001,0x4001,0x4001,0x4001,0x3A04,0x8004,
+    0x3601,0x3601,0x3601,0x3601,0x3701,0x3701,0x3701,0x3701,0x3901,0x3901,
+    0x3901,0x3901,0x3A01,0x3A01,0x3A01,0x3A01,0x4101,0x4101,0x4101,0x4101,
+    0x4401,0x4401,0x4401,0x4401,0x4204,0x8038,0x4B04,0x4B04,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x5004,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,0x4B04,
+    0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4B04,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4904,0x4704,0x4204,0x3B08,0x8004,0x4204,0x4708,0x8004,0x4204,
+    0x4704,0x4204,0x4704,0x4B04,0x5208,0x8008,0x5008,0x8004,0x4904,0x5008,
+    0x8004,0x4904,0x5004,0x4904,0x4604,0x4904,0x4208,0x8008,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4701,0x4701,0x4701,0x4701,0x4B04,0x4401,0x4401,0x4401,0x4401,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4B04,0x4401,0x4401,0x4401,
+    0x4401,0x4704,0x4210,0x4210,0x4210,0x4208,0x8028,0x3610,0x3710,0x4008,
+    0x4008,0x3908,0x3908,0x3204,0x8004,0x4204,0x8004,0x4208,0x8028,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,0x4601,
+    0x4601,0x4601,0x4601,0x4601,0x4601,0x4710,0x4008,0x4004,0x4004,0x3908,
+    0x3904,0x3904,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4904,0x4904,0x4704,0x4704,0x4604,0x4604,
+    0x4704,0x4704,0x4404,0x4404,0x4210,0x4410,0x4210,0x4410,0x4208,0x4408,
+    0x4208,0x4408,0x4204,0x3204,0x3204,0x3204,0x3208,0x8020,0x3B04,0x8004,
+    0x3404,0x8004,0x4004,0x8004,0x3904,0x8004,0x3604,0x800C,0x4901,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4704,0x8004,0x4904,0x8004,
+    0x4B10,0x4908,0x8008,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,0x5201,
+    0x5201,0x5201,0x5201,0x5001,0x5001,0x4B01,0x4B01,0x4901,0x4901,0x4704,
+    0x8004,0x5404,0x8004,0x5004,0x8004,0x4904,0x8004,0x5208,0x8004,0x5004,
+    0x5001,0x5001,0x5001,0x5001,0x4B04,0x8004,0x5004,0x5001,0x5001,0x5001,
+    0x5001,0x4B04,0x8004,0x4004,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,
+    0x3704,0x3704,0x3604,0x3604,0x3704,0x3704,0x3904,0x3904,0x3604,0x3604,
+    0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3604,0x3604,
+    0x3704,0x3704,0x3904,0x3904,0x3604,0x3604,0x3704,0x4704,0x4B04,0x4904,
+    0x4804,0x4404,0x4604,0x4804,0x4904,0x5004,0x4904,0x4704,0x4604,0x4204,
+    0x4404,0x4604,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4204,0x4204,0x4204,0x4204,0x4204,0x4204,0x4004,0x3B04,0x3704,
+    0x3904,0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3604,0x3604,0x3704,0x3704,
+    0x3904,0x3904,0x3604,0x3604,0x3704,0x4704,0x4904,0x4904,0x4B04,0x4B04,
+    0x4704,0x4704,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,
+    0x4704,0x4704,0x4B04,0x4904,0x4804,0x4404,0x4604,0x4804,0x4904,0x5004,
+    0x4904,0x4704,0x4604,0x4204,0x4404,0x4604,0x4704,0x4704,0x4704,0x4704,
+    0x4704,0x4704,0x4704,0x4704,0x4701,0x4701,0x4701,0x4701,0x4904,0x5004,
+    0x5004,0x5004,0x5004,0x5004,0x4B04,0x4904,0x4204,0x4404,0x4604,0x4704,
+    0x4704,0x4904,0x4904,0x4B04,0x3604,0x3704,0x3904,0x3B04,0x3B04,0x4004,
+    0x4004,0x4004,0x4004,0x4104,0x4104,0x4208,0x8008,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3701,0x3701,0x3701,0x3701,0x3604,0x3708,0x8018,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3701,0x3701,0x3701,0x3701,0x3604,0x3708,0x8008,0x4708,
+    0x8008,0x4408,0x8008,0x4708,0x8008,0x3710,0x3710,0x3710,0x3708,0x3908,
+    0x3710,0x3710,0x3710,0x3708,0x3908,0x3704,0x3B04,0x4204,0x4704,0x4B04,
+    0x4704,0x5204,0x4B04,0x4708,0x3706,0x3702,0x3708,0x8008,
+    0x0000
+};
+
+const unsigned Voice3 [] = {
+    0x3708,0x8004,0x3204,0x3708,0x8004,0x3204,0x3704,0x3204,0x3704,0x3B04,
+    0x3208,0x8008,0x4008,0x8004,0x3904,0x4008,0x8004,0x3904,0x4004,0x3904,
+    0x3604,0x4904,0x4208,0x8008,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3904,0x3904,
+    0x3B04,0x3B04,0x3604,0x3604,0x3704,0x3704,0x3904,0x3904,0x3B08,0x8028,
+    0x3210,0x3410,0x3008,0x3008,0x3208,0x3208,0x2B04,0x8004,0x3204,0x8004,
+    0x3708,0x8008,0x4B10,0x5010,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,
+    0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,
+    0x3410,0x3008,0x3008,0x3208,0x3208,0x3B14,0x3B02,0x3901,0x3B01,0x4004,
+    0x3904,0x4714,0x4702,0x4601,0x4701,0x4904,0x4604,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3604,0x3604,0x3704,
+    0x3704,0x3404,0x3404,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,
+    0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,
+    0x3404,0x3604,0x3404,0x3204,0x3404,0x3604,0x3204,0x3704,0x3904,0x3B04,
+    0x3904,0x3704,0x3904,0x3B04,0x3804,0x3904,0x3904,0x3904,0x3904,0x3904,
+    0x3904,0x3904,0x3904,0x3904,0x2904,0x2904,0x2904,0x2908,0x8008,0x490A,
+    0x4702,0x4602,0x4402,0x4204,0x8004,0x3304,0x8004,0x3404,0x8004,0x3204,
+    0x8004,0x3104,0x8004,0x2904,0x800C,0x2A01,0x2A01,0x2A01,0x2A01,0x2A01,
+    0x2A01,0x2A01,0x2A01,0x2B04,0x8004,0x2704,0x8004,0x2908,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,
+    0x3801,0x3801,0x3801,0x3801,0x3701,0x3701,0x3701,0x3701,0x3401,0x3401,
+    0x3401,0x3401,0x3204,0x8004,0x3404,0x8004,0x3604,0x8004,0x3304,0x8004,
+    0x3404,0x8004,0x3204,0x8004,0x3104,0x8004,0x2904,0x8004,0x2B04,0x8004,
+    0x3704,0x8004,0x3904,0x8004,0x2904,0x8004,0x4604,0x4604,0x4704,0x4704,
+    0x4904,0x4904,0x4604,0x4604,0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,
+    0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,
+    0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,0x4608,0x8008,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5408,0x8008,0x5401,0x5401,
+    0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,
+    0x5401,0x5401,0x5401,0x5401,0x5204,0x5604,0x5704,0x5904,0x5701,0x5701,
+    0x5701,0x5701,0x5901,0x5901,0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,
+    0x5701,0x5701,0x5604,0x5204,0x5604,0x5601,0x5601,0x5601,0x5601,0x5404,
+    0x5204,0x5104,0x5204,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,
+    0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,0x4604,0x4604,
+    0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,0x4404,0x4404,0x4604,0x4604,
+    0x4704,0x4704,0x4404,0x4404,0x4608,0x8008,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5408,0x8008,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,
+    0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,
+    0x5204,0x5504,0x5704,0x5904,0x5701,0x5701,0x5701,0x5701,0x5901,0x5901,
+    0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x5204,
+    0x5604,0x5601,0x5601,0x5601,0x5601,0x5404,0x5204,0x5104,0x3204,0x2904,
+    0x2B04,0x3104,0x3204,0x3204,0x3404,0x3404,0x3604,0x3104,0x3204,0x3404,
+    0x3604,0x3604,0x3704,0x3704,0x3904,0x3904,0x3A04,0x3A04,0x3B08,0x8008,
+    0x3710,0x3910,0x4204,0x8004,0x4204,0x8004,0x4204,0x800C,0x3708,0x8004,
+    0x3204,0x3708,0x8004,0x3204,0x3704,0x3204,0x3704,0x3B04,0x3208,0x8008,
+    0x4008,0x8004,0x3904,0x4008,0x8004,0x3904,0x4004,0x3904,0x3604,0x4904,
+    0x4208,0x8008,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,
+    0x3604,0x3604,0x3704,0x3704,0x3904,0x3904,0x3B08,0x8028,0x3210,0x3410,
+    0x3008,0x3008,0x3208,0x3208,0x2B04,0x8004,0x3204,0x8004,0x3708,0x8008,
+    0x4B10,0x5010,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,
+    0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3201,0x3410,0x3008,
+    0x3008,0x3208,0x3208,0x3B14,0x3B02,0x3901,0x3B01,0x4004,0x3904,0x4714,
+    0x4702,0x4601,0x4701,0x4904,0x4604,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3604,0x3604,0x3704,0x3704,0x3404,
+    0x3404,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,
+    0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3204,0x3404,0x3604,
+    0x3404,0x3204,0x3404,0x3604,0x3204,0x3704,0x3904,0x3B04,0x3904,0x3704,
+    0x3904,0x3B04,0x3804,0x3904,0x3904,0x3904,0x3904,0x3904,0x3904,0x3904,
+    0x3904,0x3904,0x2904,0x2904,0x2904,0x2908,0x8008,0x490A,0x4702,0x4602,
+    0x4402,0x4204,0x8004,0x3304,0x8004,0x3404,0x8004,0x3204,0x8004,0x3104,
+    0x8004,0x2904,0x800C,0x2A01,0x2A01,0x2A01,0x2A01,0x2A01,0x2A01,0x2A01,
+    0x2A01,0x2B04,0x8004,0x2704,0x8004,0x2908,0x3901,0x3901,0x3901,0x3901,
+    0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3901,0x3801,0x3801,
+    0x3801,0x3801,0x3701,0x3701,0x3701,0x3701,0x3401,0x3401,0x3401,0x3401,
+    0x3204,0x8004,0x3404,0x8004,0x3604,0x8004,0x3304,0x8004,0x3404,0x8004,
+    0x3204,0x8004,0x3104,0x8004,0x2904,0x8004,0x2B04,0x8004,0x3704,0x8004,
+    0x3904,0x8004,0x2904,0x8004,0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,
+    0x4604,0x4604,0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,
+    0x4604,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,0x4404,0x4404,
+    0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,0x4608,0x8008,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5408,0x8008,0x5401,0x5401,0x5401,0x5401,
+    0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,
+    0x5401,0x5401,0x5204,0x5604,0x5704,0x5904,0x5701,0x5701,0x5701,0x5701,
+    0x5901,0x5901,0x5B01,0x5B01,0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,
+    0x5604,0x5204,0x5604,0x5601,0x5601,0x5601,0x5601,0x5404,0x5204,0x5104,
+    0x5204,0x4604,0x4704,0x4704,0x4904,0x4904,0x4604,0x4604,0x4404,0x4404,
+    0x4604,0x4604,0x4704,0x4704,0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,
+    0x4904,0x4904,0x4604,0x4604,0x4404,0x4404,0x4604,0x4604,0x4704,0x4704,
+    0x4404,0x4404,0x4608,0x8008,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,0x5601,
+    0x5408,0x8008,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,
+    0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5401,0x5204,0x5504,
+    0x5704,0x5904,0x5701,0x5701,0x5701,0x5701,0x5901,0x5901,0x5B01,0x5B01,
+    0x5904,0x5704,0x5701,0x5701,0x5701,0x5701,0x5604,0x5204,0x5604,0x5601,
+    0x5601,0x5601,0x5601,0x5404,0x5204,0x5104,0x3204,0x2904,0x2B04,0x3104,
+    0x3204,0x3204,0x3404,0x3404,0x3604,0x3104,0x3204,0x3404,0x3604,0x3604,
+    0x3704,0x3704,0x3904,0x3904,0x3A04,0x3A04,0x3B08,0x8008,0x3710,0x3910,
+    0x4204,0x8004,0x4204,0x8004,0x4204,0x800C,0x3208,0x8004,0x2904,0x3208,
+    0x8004,0x2904,0x3204,0x2904,0x3204,0x3604,0x4908,0x8008,0x3908,0x8004,
+    0x3604,0x3908,0x8004,0x3604,0x3904,0x3604,0x3304,0x3604,0x2B08,0x8008,
+    0x4404,0x4404,0x4504,0x4504,0x4704,0x4704,0x4404,0x4404,0x4204,0x4204,
+    0x4404,0x4404,0x4504,0x4504,0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,
+    0x4704,0x4704,0x4404,0x4404,0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,
+    0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,0x4704,0x4704,0x4404,0x4404,
+    0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,0x4204,0x4204,0x4004,0x4004,
+    0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,0x4004,0x4004,0x4204,0x4204,
+    0x4304,0x4304,0x4004,0x4004,0x3A04,0x3A04,0x3904,0x3904,0x3A04,0x3A04,
+    0x4904,0x4904,0x4A04,0x4A04,0x4904,0x4904,0x4A04,0x4A04,0x4904,0x4704,
+    0x4608,0x8004,0x2201,0x2201,0x2201,0x2201,0x2401,0x2401,0x2401,0x2401,
+    0x2601,0x2601,0x2601,0x2601,0x2701,0x2701,0x2701,0x2701,0x2901,0x2901,
+    0x2901,0x2901,0x3001,0x3001,0x3001,0x3001,0x2A04,0x8004,0x2601,0x2601,
+    0x2601,0x2601,0x2701,0x2701,0x2701,0x2701,0x2901,0x2901,0x2901,0x2901,
+    0x2A01,0x2A01,0x2A01,0x2A01,0x2101,0x2101,0x2101,0x2101,0x3401,0x3401,
+    0x3401,0x3401,0x3204,0x8004,0x4204,0x4404,0x4504,0x4704,0x4904,0x4A08,
+    0x4B08,0x5008,0x5108,0x5204,0x5204,0x5201,0x5201,0x5201,0x5201,0x5404,
+    0x5004,0x5004,0x5001,0x5001,0x5001,0x5001,0x5204,0x4B04,0x4B04,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x5204,0x5201,0x5201,0x5201,0x5201,0x5004,0x4B04,
+    0x4904,0x4708,0x8004,0x3204,0x3708,0x8004,0x3204,0x3704,0x3204,0x3704,
+    0x3B04,0x4208,0x8008,0x4008,0x8004,0x3904,0x4008,0x8004,0x3904,0x4004,
+    0x3904,0x3604,0x3904,0x3208,0x8008,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3904,
+    0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,0x4008,
+    0x8008,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x5010,0x4908,0x4908,
+    0x4708,0x4708,0x4408,0x4408,0x4008,0x3908,0x4204,0x8004,0x4604,0x8004,
+    0x4704,0x800C,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x5010,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4904,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,
+    0x4704,0x4704,0x4704,0x4408,0x4404,0x4404,0x4008,0x4004,0x4004,0x3B14,
+    0x3B01,0x3B01,0x3901,0x3B01,0x4001,0x4001,0x4001,0x4001,0x3904,0x4714,
+    0x4701,0x4701,0x4601,0x4701,0x4901,0x4901,0x4901,0x4901,0x4604,0x4B10,
+    0x5010,0x4B08,0x5210,0x5708,0x5610,0x5710,0x5610,0x5710,0x5608,0x5708,
+    0x5608,0x5708,0x5604,0x4204,0x4204,0x4204,0x4208,0x8008,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4001,0x4001,
+    0x3B01,0x3B01,0x3901,0x3901,0x3704,0x8004,0x4404,0x8004,0x4004,0x8004,
+    0x3904,0x8004,0x4204,0x800C,0x4B0A,0x4902,0x4702,0x4602,0x5404,0x8004,
+    0x5004,0x8004,0x3208,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4101,0x4101,0x4101,0x4101,0x4001,
+    0x4001,0x4001,0x4001,0x3901,0x3901,0x3901,0x3901,0x3704,0x8004,0x3904,
+    0x8004,0x3B04,0x8004,0x3804,0x8004,0x3904,0x8004,0x3704,0x8004,0x3604,
+    0x8004,0x3204,0x8004,0x3404,0x8004,0x3004,0x8004,0x3204,0x8004,0x3204,
+    0x8004,0x2708,0x8018,0x3208,0x8018,0x2708,0x8018,0x3208,0x8018,0x3B08,
+    0x8008,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4908,0x8008,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4704,0x4B04,0x5004,0x5204,0x5001,
+    0x5001,0x5001,0x5001,0x5201,0x5201,0x5401,0x5401,0x5204,0x5004,0x5001,
+    0x5001,0x5001,0x5001,0x4B04,0x4704,0x4B04,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4904,0x4704,0x4604,0x4704,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,
+    0x3B04,0x3904,0x3904,0x3B04,0x3B04,0x4004,0x4004,0x3904,0x3904,0x3B04,
+    0x4B04,0x5004,0x5004,0x5204,0x5204,0x4B04,0x4B04,0x4904,0x4904,0x4B04,
+    0x4B04,0x5004,0x5004,0x4904,0x4904,0x8004,0x3704,0x3B04,0x3904,0x3804,
+    0x3404,0x3604,0x3804,0x3904,0x4004,0x3904,0x3704,0x3604,0x3204,0x3404,
+    0x3604,0x3704,0x3704,0x3904,0x3B04,0x4004,0x4004,0x4004,0x4004,0x4204,
+    0x4204,0x4204,0x4204,0x3204,0x3204,0x3204,0x3204,0x3704,0x3204,0x3404,
+    0x3604,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3604,0x3704,0x3904,0x3B04,
+    0x3B04,0x4004,0x4004,0x4204,0x4204,0x4304,0x4304,0x4408,0x8008,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3210,0x2708,0x8018,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3210,0x2708,0x8018,0x3008,0x8008,0x3208,
+    0x8008,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2B04,0x3204,0x3704,0x3B04,0x3704,0x4204,
+    0x3B04,0x3708,0x2706,0x2702,0x2708,0x8008,0x3208,0x8004,0x2904,0x3208,
+    0x8004,0x2904,0x3204,0x2904,0x3204,0x3604,0x4908,0x8008,0x3908,0x8004,
+    0x3604,0x3908,0x8004,0x3604,0x3904,0x3604,0x3304,0x3604,0x2B08,0x8008,
+    0x4404,0x4404,0x4504,0x4504,0x4704,0x4704,0x4404,0x4404,0x4204,0x4204,
+    0x4404,0x4404,0x4504,0x4504,0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,
+    0x4704,0x4704,0x4404,0x4404,0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,
+    0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,0x4704,0x4704,0x4404,0x4404,
+    0x4204,0x4204,0x4404,0x4404,0x4504,0x4504,0x4204,0x4204,0x4004,0x4004,
+    0x4204,0x4204,0x4404,0x4404,0x4004,0x4004,0x4004,0x4004,0x4204,0x4204,
+    0x4304,0x4304,0x4004,0x4004,0x3A04,0x3A04,0x3904,0x3904,0x3A04,0x3A04,
+    0x4904,0x4904,0x4A04,0x4A04,0x4904,0x4904,0x4A04,0x4A04,0x4904,0x4704,
+    0x4608,0x8004,0x2201,0x2201,0x2201,0x2201,0x2401,0x2401,0x2401,0x2401,
+    0x2601,0x2601,0x2601,0x2601,0x2701,0x2701,0x2701,0x2701,0x2901,0x2901,
+    0x2901,0x2901,0x3001,0x3001,0x3001,0x3001,0x2A04,0x8004,0x2601,0x2601,
+    0x2601,0x2601,0x2701,0x2701,0x2701,0x2701,0x2901,0x2901,0x2901,0x2901,
+    0x2A01,0x2A01,0x2A01,0x2A01,0x2101,0x2101,0x2101,0x2101,0x3401,0x3401,
+    0x3401,0x3401,0x3204,0x8004,0x4204,0x4404,0x4504,0x4704,0x4904,0x4A08,
+    0x4B08,0x5008,0x5108,0x5204,0x5204,0x5201,0x5201,0x5201,0x5201,0x5404,
+    0x5004,0x5004,0x5001,0x5001,0x5001,0x5001,0x5204,0x4B04,0x4B04,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x5204,0x5201,0x5201,0x5201,0x5201,0x5004,0x4B04,
+    0x4904,0x4708,0x8004,0x3204,0x3708,0x8004,0x3204,0x3704,0x3204,0x3704,
+    0x3B04,0x4208,0x8008,0x4008,0x8004,0x3904,0x4008,0x8004,0x3904,0x4004,
+    0x3904,0x3604,0x3904,0x3208,0x8008,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,
+    0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3704,0x3904,
+    0x3904,0x3B04,0x3B04,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3B04,0x4008,
+    0x8008,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x5010,0x4908,0x4908,
+    0x4708,0x4708,0x4408,0x4408,0x4008,0x3908,0x4204,0x8004,0x4604,0x8004,
+    0x4704,0x800C,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x5010,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4904,0x4904,0x4904,0x4901,0x4901,0x4901,0x4901,
+    0x4704,0x4704,0x4704,0x4408,0x4404,0x4404,0x4008,0x4004,0x4004,0x3B14,
+    0x3B01,0x3B01,0x3901,0x3B01,0x4001,0x4001,0x4001,0x4001,0x3904,0x4714,
+    0x4701,0x4701,0x4601,0x4701,0x4901,0x4901,0x4901,0x4901,0x4604,0x4B10,
+    0x5010,0x4B08,0x5210,0x5708,0x5610,0x5710,0x5610,0x5710,0x5608,0x5708,
+    0x5608,0x5708,0x5604,0x4204,0x4204,0x4204,0x4208,0x8008,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4001,0x4001,
+    0x3B01,0x3B01,0x3901,0x3901,0x3704,0x8004,0x4404,0x8004,0x4004,0x8004,
+    0x3904,0x8004,0x4204,0x800C,0x4B0A,0x4902,0x4702,0x4602,0x5404,0x8004,
+    0x5004,0x8004,0x3208,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,0x4201,
+    0x4201,0x4201,0x4201,0x4201,0x4201,0x4101,0x4101,0x4101,0x4101,0x4001,
+    0x4001,0x4001,0x4001,0x3901,0x3901,0x3901,0x3901,0x3704,0x8004,0x3904,
+    0x8004,0x3B04,0x8004,0x3804,0x8004,0x3904,0x8004,0x3704,0x8004,0x3604,
+    0x8004,0x3204,0x8004,0x3404,0x8004,0x3004,0x8004,0x3204,0x8004,0x3204,
+    0x8004,0x2708,0x8018,0x3208,0x8018,0x2708,0x8018,0x3208,0x8018,0x3B08,
+    0x8008,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4B01,0x4908,0x8008,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,0x4901,
+    0x4901,0x4901,0x4901,0x4901,0x4901,0x4704,0x4B04,0x5004,0x5204,0x5001,
+    0x5001,0x5001,0x5001,0x5201,0x5201,0x5401,0x5401,0x5204,0x5004,0x5001,
+    0x5001,0x5001,0x5001,0x4B04,0x4704,0x4B04,0x4B01,0x4B01,0x4B01,0x4B01,
+    0x4904,0x4704,0x4604,0x4704,0x3B04,0x4004,0x4004,0x4204,0x4204,0x3B04,
+    0x3B04,0x3904,0x3904,0x3B04,0x3B04,0x4004,0x4004,0x3904,0x3904,0x3B04,
+    0x4B04,0x5004,0x5004,0x5204,0x5204,0x4B04,0x4B04,0x4904,0x4904,0x4B04,
+    0x4B04,0x5004,0x5004,0x4904,0x4904,0x8004,0x3704,0x3B04,0x3904,0x3804,
+    0x3404,0x3604,0x3804,0x3904,0x4004,0x3904,0x3704,0x3604,0x3204,0x3404,
+    0x3604,0x3704,0x3704,0x3904,0x3B04,0x4004,0x4004,0x4004,0x4004,0x4204,
+    0x4204,0x4204,0x4204,0x3204,0x3204,0x3204,0x3204,0x3704,0x3204,0x3404,
+    0x3604,0x3704,0x3704,0x3904,0x3904,0x3B04,0x3604,0x3704,0x3904,0x3B04,
+    0x3B04,0x4004,0x4004,0x4204,0x4204,0x4304,0x4304,0x4408,0x8008,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3210,0x2708,0x8018,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,0x3001,
+    0x3001,0x3001,0x3001,0x3001,0x3210,0x2708,0x8018,0x3008,0x8008,0x3208,
+    0x8008,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,0x2704,
+    0x2704,0x2704,0x2704,0x2704,0x2B04,0x3204,0x3704,0x3B04,0x3704,0x4204,
+    0x3B04,0x3708,0x2706,0x2702,0x2708,0x8008,
+    0x0000
+};
+
+
+
+const unsigned long FreqTab [12] = {
+    6848,6464,6100,5760,5428,5124,4836,4564,4308,4068,3844,3628, // FIXME
+};
+
+typedef struct {
+    unsigned char       DoneMask;       /* Set this if we're done */
+    unsigned char       Trigger;        /* Trigger value */
+    unsigned char       Ticks;          /* Ticks for this tone */
+    unsigned short      Freq;           /* Actual frequency value */
+    unsigned short      SoftEnv;
+    const unsigned*     Data;           /* Pointer to data */
+    int                 DecVal;
+} VoiceCtrl;
+
+/* Control structs for all three voices */
+static VoiceCtrl V1 = {
+    0x01, 0x11, 0, 0, 0, Voice1, 0,
+};
+static VoiceCtrl V2 = {
+    0x02, 0x41, 0, 0, 0, Voice2, 0,
+};
+static VoiceCtrl V3 = {
+    0x04, 0x11, 0, 0, 0, Voice3, 0,
+};
+
+/* Pointers to the structs for easy reference */
+static VoiceCtrl* V [3] = {
+    &V1, &V2, &V3
+};
+
+/* Screen dimensions */
+static unsigned char XSize, YSize;
+
+/* Variable that contains the time of the next clock tick to play a note */
+static unsigned char NextClock;
+
+/* Start- and runtime */
+static clock_t StartTime;
+
+/* Number of ticks for each tone */
+#define TICKS_PER_TONE  10
+
+/* Done flag. Contains one bit for each voice. Will contain 0x07 if all
+** voices have finished playing.
+*/
+static unsigned char Done;
+
+#  define outb(addr,val)        (*(addr)) = (val)
+#  define outw(addr,val)        (*(addr)) = (val)
+
+unsigned char       I, N, Offs;
+unsigned char       Tone;
+unsigned char       Octave;
+unsigned            Val;
+
+/*****************************************************************************/
+/*                                   Code                                    */
+/*****************************************************************************/
+
+static void MakeTeeLine (unsigned char Y)
+/* Make a divider line */
+{
+    cputcxy (0, Y, CH_LTEE);
+    chline (XSize - 2);
+    cputc (CH_RTEE);
+}
+
+static void MakeNiceScreen (void)
+/* Make a nice screen */
+{
+    typedef struct {
+        unsigned char   Y;
+        char*           Msg;
+    } TextDesc;
+    static TextDesc Text [] = {
+              /*12345678901234567890*/
+        {   1, "Wolfgang A. Mozart"  },
+        {   2, "Eine kleine"         },
+        {   3, "Nachtmusik"          },
+        {   4, "(KV 525)"            },
+        {   6, "Ported to Gamate"    },
+        {   7, "Groepaz / Hitmen"},
+    };
+
+    register const TextDesc* T;
+    unsigned char I;
+    unsigned char X;
+
+    /* Clear the screen hide the cursor, set colors */
+    textcolor (COLOR_BLACK);
+    bgcolor (COLOR_WHITE);
+    clrscr ();
+    cursor (0);
+
+    /* Top line */
+    cputcxy (0, 0, CH_ULCORNER);
+    chline (XSize - 2);
+    cputc (CH_URCORNER);
+
+    /* Left line */
+    cvlinexy (0, 1, YSize - 2);
+
+    /* Bottom line */
+    cputc (CH_LLCORNER);
+    chline (XSize - 2);
+    cputc (CH_LRCORNER);
+
+    /* Right line */
+    cvlinexy (XSize - 1, 1, YSize - 2);
+
+    /* Several divider lines */
+    MakeTeeLine (5);
+    MakeTeeLine (8);
+
+    /* Write something into the frame */
+    for (I = 0, T = Text; I < sizeof (Text) / sizeof (Text [0]); ++I) {
+        X = (XSize - strlen (T->Msg)) / 2;
+        cputsxy (X, T->Y, T->Msg);
+        ++T;
+    }
+}
+
+void UpdateScreen(void)
+{
+    register VoiceCtrl* VC;
+    /* Play all three voices */
+    for (I = 0; I < 3; ++I) {
+        /* Get a pointer to this voice */
+        VC = V [I];
+        Offs = (I * 6) + 1;
+        textcolor(1);
+        gotoxy(Offs, 9); cprintf("%02x", VC->SoftEnv >> 8);
+        textcolor(COLOR_BLACK);
+        for (N = 0; N < 0x8; ++N) {
+            gotoxy(Offs, 10 + N);
+            cputc((VC->SoftEnv >> (8+5)) >= (N ^ 0x7) ? '#' : '.' );
+        }
+    }
+}
+
+void DoEffects(void)
+{
+    register VoiceCtrl* VC;
+    /* Play all three voices */
+    for (I = 0; I < 3; ++I) {
+        /* Get a pointer to this voice */
+        VC = V [I];
+        /* do soft envelope */
+        if (VC->DecVal != 0) {
+        if (VC->DecVal < 0) {
+//          VC->DecVal = - 0x400;
+            if ((VC->SoftEnv + VC->DecVal) > 0) {
+                VC->SoftEnv += VC->DecVal;
+//                VC->SoftEnv >>= 1;
+                VC->SoftEnv = (VC->SoftEnv >> 1) + (VC->SoftEnv >> 2);
+            } else {
+                VC->SoftEnv = 0;
+                VC->DecVal = 0;
+            }
+        } else if (VC->DecVal > 0) {
+            VC->DecVal = 0x800;
+            if (VC->SoftEnv < (0xffff - VC->DecVal)) {
+//                VC->SoftEnv += VC->DecVal;
+                VC->SoftEnv += VC->DecVal;
+            } else {
+                VC->SoftEnv = 0xffff;
+                VC->DecVal = -VC->DecVal;
+            }
+        }
+        }
+//        outb ((unsigned char*)(AUDIO_BASE + 8 + I), (VC->SoftEnv & 0xf0 ) | 0x0f);      // volume
+        outb ((unsigned char*)(AUDIO_BASE + 8 + I),(VC->SoftEnv >> 8));      // volume
+    }
+}
+
+static void TimeSync (void)
+/* Sync the time for the next tone */
+{
+    static unsigned char Clock, LastClock;
+
+    while ((Clock = clock ()) < NextClock) {
+        while ((Clock = clock ()) == LastClock) {};
+        LastClock = Clock;
+
+        DoEffects();
+    }
+    UpdateScreen();
+    NextClock = Clock + TICKS_PER_TONE;
+}
+
+unsigned char getbits(void)
+{
+    return rand() >> 8;
+}
+
+const unsigned char Tone1[12] = {
+    'c','c','d','d','e','f','f','g','g','a','a','h'
+};
+const unsigned char Tone2[12] = {
+    '-','#','-','#','-','-','#','-','#','-','#','-'
+};
+
+int main (void)
+{
+    register VoiceCtrl* VC;
+    /* Get the screen dimensions */
+    screensize (&XSize, &YSize);
+
+    /* Make a nice screen */
+    MakeNiceScreen ();
+
+    /* init the sound */
+    memset((unsigned char*)(AUDIO_BASE), 0, 8);
+    outb ((unsigned char*)(AUDIO_BASE + 7), 0x3f);
+    outw ((unsigned char*)(AUDIO_BASE + 12), 0xff);     // env delay
+    outb ((unsigned char*)(AUDIO_BASE + 13), 0x13);     // env ctrl
+
+    /* Sync the clock */
+    NextClock = StartTime = clock ();
+    NextClock += TICKS_PER_TONE;
+
+    /* Play each voice until all three are done */
+    while (Done != 0x07) {
+#if 0
+        /* Display the time in the lower left corner */
+        DisplayTime ();
+#endif
+        /* Wait for the next run */
+        TimeSync ();
+
+        /* Play all three voices */
+        for (I = 0; I < 3; ++I) {
+
+            /* Get a pointer to this voice */
+            VC = V [I];
+
+            /* Is this voice done? */
+            if (Done & VC->DoneMask) {
+                /* Voice already done */
+                continue;
+            }
+
+            Offs = (I * 6) + 2;
+
+            /* Do we have any more ticks to play? */
+            if (VC->Ticks == 0) {
+                /* We need new data */
+                if ((Val = *VC->Data) == 0) {
+                    /* End of data. Mark the voice as done */
+                    Done |= VC->DoneMask;
+                    continue;
+                }
+                ++VC->Data;
+
+                /* Get the ticks from the data */
+                VC->Ticks = (Val & 0x7F) - 1;
+
+                /* Check if this is a tone or a pause */
+                if (Val & 0x8000) {
+                        /* This is a pause.  */
+                        gotoxy(Offs + 1, 9); cprintf("---");
+                        VC->DecVal =  -11 - (getbits() & 0x07);
+                } else {
+                    /* This is a tone. Extract the attributes. */
+                    Tone = (Val >> 8) & 0x0F;
+                    Octave = ((Val >> 12) & 0x07) ^ 0x07;
+                    /* Calculate the frequency */
+                    VC->Freq = FreqTab [Tone] >> Octave;
+                    /* Set the frequency */
+
+                    /* ~ 0xb00 is max value (lowest note) */
+                    VC->Freq >>= 1;
+                    VC->Freq &= 0x0fff;
+
+                    outb ((unsigned char*)(AUDIO_BASE + (I << 1) + 1), VC->Freq >> 8);
+                    outb ((unsigned char*)(AUDIO_BASE + (I << 1)), VC->Freq & 0xff);
+                    /* Start the tone */
+                    VC->DecVal =  1 + (getbits() & 0x07);
+                    gotoxy(Offs + 1, 9); cprintf("%c%c%d", Tone1[Tone], Tone2[Tone], Octave);
+                }
+            } else {
+                /* Decrement the ticks. If this is the last tick of a tone,
+                ** reset bit 0 of the trigger value and write it back to the
+                ** SID to start the release phase.
+                */
+                if (--(VC->Ticks) == 0) {
+                    VC->DecVal =  -11 - (getbits() & 0x07);
+                    gotoxy(Offs + 1, 9); cprintf("---");
+                }
+            }
+
+            gotoxy(Offs, 10); cprintf("%04x", VC->Freq);
+        }
+    }
+
+    /* Done */
+    return 0;
+}
+
+
+
diff --git a/util/gamate/gamate-fixcart.c b/util/gamate/gamate-fixcart.c
new file mode 100644 (file)
index 0000000..ba09ac0
--- /dev/null
@@ -0,0 +1,37 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+
+FILE *in;
+unsigned int n, i, c;
+
+void usage(char *arg)
+{
+    printf("usage: %s [file]\n", arg);
+    exit(-1);
+}
+
+int main(int argc, char *argv[]) {
+    if (argc < 2) {
+        usage(argv[0]);
+        exit(-1);
+    }
+
+    if (!(in = fopen(argv[1], "r+b"))) {
+        fprintf(stderr, "couldnt open: '%s'\n", argv[1]);
+        exit(-1);
+    }
+    /* read 0x1000 bytes from 0x7000-0x7fff (offset 0x1000) */
+    fseek(in, 0x1000, SEEK_SET);
+    n = 0; for (i = 0; i < 0x1000; i++) {
+        c =  fgetc(in);
+        n += c;
+    }
+    /* write checksum to header */
+    fseek(in, 0, SEEK_SET);
+    fputc(n & 0xff, in);
+    fputc((n >> 8) & 0xff, in);
+
+    fclose(in);
+    return (0);
+}