diff --git a/AT28 Programmer wiring.odg b/AT28 Programmer wiring.odg new file mode 100644 index 0000000..5e38569 Binary files /dev/null and b/AT28 Programmer wiring.odg differ diff --git a/AT28 Programmer wiring.pdf b/AT28 Programmer wiring.pdf new file mode 100644 index 0000000..9abe20c Binary files /dev/null and b/AT28 Programmer wiring.pdf differ diff --git a/AT28 programmer.jpg b/AT28 programmer.jpg new file mode 100755 index 0000000..8c5c5e7 Binary files /dev/null and b/AT28 programmer.jpg differ diff --git a/AT28 programmer.odg b/AT28 programmer.odg new file mode 100644 index 0000000..378c964 Binary files /dev/null and b/AT28 programmer.odg differ diff --git a/AT28 programmer.pdf b/AT28 programmer.pdf new file mode 100644 index 0000000..b3e32b0 Binary files /dev/null and b/AT28 programmer.pdf differ diff --git a/ProgData.h b/ProgData.h new file mode 100644 index 0000000..3a7f086 --- /dev/null +++ b/ProgData.h @@ -0,0 +1,520 @@ +// Use PROGMEM to put into Arduino flash memory +// /Users/chris/Desktop/BOOTI/tmp/FIRMWARE.BIN, created by applechargen.py +// Mon, 21 Oct 2019 21:06:48 +// #define __PROG_TYPES_COMPAT__ +// #include "avr/pgmspace.h" +#define ADDRESS_MAX 8192 +const unsigned char values[ADDRESS_MAX] PROGMEM = { +169,32,201,0,169,3,169,60,176,107,56,176,1,24,141,255, +207,32,205,206,176,17,104,168,201,253,104,170,105,0,72,152, +105,3,72,142,248,6,24,162,13,181,66,72,202,16,250,169, +0,133,72,176,58,132,70,173,248,6,133,71,160,1,177,70, +133,66,200,177,70,133,69,200,177,70,133,70,160,1,177,69, +133,67,200,177,69,133,68,200,177,69,72,200,177,69,72,200, +177,69,133,71,200,177,69,133,72,104,133,70,104,133,69,110, +248,4,76,12,201,141,255,207,110,248,4,32,205,206,76,7, +206,141,255,207,32,205,206,56,110,248,4,165,67,72,132,67, +32,0,201,42,168,104,133,67,152,106,96,160,5,208,226,160, +6,208,222,160,7,208,218,160,8,208,214,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +213,194,64,207,0,0,0,0,0,0,0,0,0,0,191,10, +162,13,181,66,72,202,16,250,169,0,133,72,169,1,141,248, +6,172,248,7,169,0,153,56,4,32,92,201,172,248,7,185, +56,4,240,10,48,8,153,56,7,206,248,6,16,230,162,0, +104,149,66,232,224,14,208,248,185,56,4,41,127,141,248,6, +173,248,4,16,4,165,66,208,8,185,184,4,170,185,56,5, +168,173,120,6,72,40,173,248,6,201,1,96,165,66,240,38, +201,1,240,25,201,2,240,24,201,3,240,23,201,255,240,25, +201,254,240,24,172,248,7,169,161,153,56,4,96,76,149,203, +76,191,202,76,159,202,76,232,201,76,98,206,76,143,201,173, +7,200,240,12,32,223,205,162,140,160,201,169,3,32,216,207, +96,152,160,2,145,68,136,138,145,68,200,200,165,72,145,68, +160,0,169,248,145,68,32,72,205,152,41,7,9,48,160,10, +145,68,160,4,185,207,201,240,2,145,68,200,192,25,208,244, +152,208,66,6,66,79,79,84,73,0,32,32,32,32,32,32, +32,32,32,32,2,32,0,16,32,87,202,173,248,4,48,74, +165,70,240,6,201,3,240,169,208,84,165,67,208,25,32,223, +205,160,0,145,68,200,169,0,145,68,200,169,0,145,68,200, +192,8,208,249,152,208,23,152,72,160,0,169,248,145,68,200, +138,145,68,200,104,145,68,200,165,72,145,68,169,4,172,248, +7,153,184,4,169,0,153,56,5,96,165,72,240,4,162,255, +160,255,152,172,248,7,153,56,5,138,153,184,4,96,172,248, +7,169,161,153,56,4,96,32,87,204,176,49,165,67,208,5, +162,0,160,0,96,32,227,204,176,35,169,12,157,129,192,169, +104,157,128,192,189,128,192,189,128,192,72,189,128,192,72,189, +128,192,24,106,133,72,104,106,168,104,106,170,96,169,168,208, +6,169,39,208,2,169,171,172,248,7,153,56,4,56,96,165, +70,72,165,71,72,169,0,133,70,133,71,32,191,202,176,8, +230,70,165,70,201,27,208,243,104,133,70,104,133,71,96,172, +248,7,165,68,72,165,69,72,169,0,153,184,4,153,56,5, +169,39,153,56,4,32,87,204,32,227,204,144,3,76,105,203, +32,112,203,169,60,157,129,192,169,0,157,128,192,169,2,157, +128,192,32,153,205,76,0,203,169,61,157,129,192,32,153,205, +32,200,205,176,100,201,20,240,76,169,45,157,129,192,189,128, +192,133,73,160,0,165,66,201,3,208,12,169,0,157,128,192, +200,196,73,208,248,240,10,177,68,157,128,192,200,196,73,208, +246,172,248,7,165,73,24,121,184,4,153,184,4,185,56,5, +105,0,153,56,5,165,68,24,101,73,133,68,165,69,105,0, +133,69,76,248,202,32,124,205,185,184,4,208,12,185,56,5, +201,2,208,5,169,0,153,56,4,104,133,69,104,133,68,96, +169,57,157,129,192,32,10,204,157,128,192,24,165,70,42,157, +128,192,165,71,42,157,128,192,165,72,42,157,128,192,32,149, +205,32,200,205,96,165,68,72,165,69,72,169,39,172,248,7, +153,56,4,169,0,153,184,4,153,56,5,32,87,204,176,83, +32,227,204,176,78,32,112,203,176,73,169,58,157,129,192,169, +0,157,128,192,169,2,157,128,192,32,153,205,76,215,203,169, +59,157,129,192,32,153,205,32,200,205,176,39,201,20,240,15, +201,29,208,31,169,39,157,129,192,32,36,204,76,207,203,172, +248,7,185,184,4,208,12,185,56,5,201,2,208,5,169,0, +153,56,4,104,133,69,104,133,68,96,32,72,205,152,10,10, +10,10,24,105,8,168,185,64,207,201,50,208,4,169,64,208, +2,169,0,96,189,128,192,133,73,240,43,172,248,7,24,121, +184,4,153,184,4,185,56,5,105,0,153,56,5,160,0,189, +128,192,145,68,200,196,73,208,246,165,68,24,101,73,133,68, +165,69,105,0,133,69,96,172,248,7,174,120,7,169,49,157, +129,192,32,153,205,176,25,32,200,205,201,20,208,9,185,56, +7,201,170,208,2,24,96,169,255,153,184,3,153,56,4,24, +160,10,152,72,176,46,169,21,157,129,192,169,6,157,128,192, +160,10,169,2,32,211,205,169,49,157,129,192,32,153,205,176, +19,32,200,205,201,21,240,33,201,20,240,29,169,120,32,211, +205,136,208,222,32,200,205,169,5,157,129,192,169,120,32,211, +205,24,104,168,136,208,187,56,96,169,47,157,129,192,169,0, +157,128,192,104,172,248,7,169,170,153,56,7,169,0,153,56, +4,24,96,172,248,7,165,67,217,184,3,240,81,169,255,153, +184,3,32,72,205,152,10,10,10,10,168,185,64,207,240,59, +169,47,157,129,192,169,47,157,128,192,185,64,207,201,32,240, +3,157,128,192,200,152,41,15,201,11,240,11,201,8,208,234, +169,46,157,128,192,208,227,169,0,157,128,192,169,50,157,129, +192,32,153,205,32,200,205,201,20,240,3,76,141,202,172,248, +7,165,67,153,184,3,24,96,173,248,4,16,41,160,0,165, +67,48,4,201,9,144,31,41,127,205,120,7,240,2,160,2, +165,67,16,1,200,192,0,208,5,172,244,200,16,7,204,244, +200,208,2,160,0,96,164,67,136,16,234,96,172,248,7,169, +255,153,184,3,169,54,157,129,192,169,1,157,128,192,32,153, +205,32,200,205,96,169,255,208,2,169,80,133,78,133,79,208, +13,169,5,32,211,205,198,78,208,4,198,79,240,7,189,129, +192,48,238,24,96,152,72,172,248,7,169,0,153,56,7,169, +255,153,184,3,104,168,56,96,169,34,157,129,192,189,128,192, +201,31,96,56,72,233,1,208,252,104,233,1,208,246,96,160, +112,162,8,185,64,207,208,8,202,152,56,233,16,168,208,243, +138,141,120,5,174,120,7,96,162,22,160,202,169,2,32,216, +207,172,248,7,76,116,206,32,157,206,201,177,144,10,201,185, +176,6,56,233,177,141,120,4,72,173,120,4,205,244,200,240, +9,162,87,160,205,169,1,32,216,207,104,201,206,240,69,201, +194,240,92,201,195,240,43,32,87,204,176,188,169,1,133,66, +173,120,7,133,67,169,0,133,70,133,71,133,68,169,8,133, +69,32,0,201,172,248,7,185,56,4,208,6,174,120,7,76, +1,8,162,0,160,200,169,1,141,243,3,141,244,3,32,216, +207,76,98,250,160,5,198,1,165,1,201,192,240,17,141,248, +7,177,0,217,151,206,208,236,136,136,16,245,108,0,0,160, +3,140,242,3,76,0,224,69,32,255,0,255,3,172,248,7, +169,255,153,184,3,169,0,141,120,4,169,192,133,6,133,7, +169,0,198,6,208,4,198,7,240,18,173,0,192,16,241,201, +225,144,6,201,251,176,2,41,223,141,16,192,96,8,120,216, +104,141,120,6,104,170,104,141,248,7,72,8,10,10,10,10, +141,120,7,40,138,72,96,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,176,185,175,178,179, +175,177,185,160,160,160,181,186,179,176,186,180,185,160,208,205, +83,77,65,82,84,32,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,50,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,51,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,52,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,53,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,54,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,55,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,56,32,32,50,77,71,64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,141,248,5,169,0,72,169,207, +72,169,241,72,152,72,138,72,174,120,7,173,248,5,157,132, +192,96,234,174,120,7,104,157,132,192,96,0,0,0,0,0, +234,234,160,15,169,0,153,112,2,136,16,250,172,248,7,141, +16,192,132,7,169,0,133,6,153,56,7,141,248,5,141,120, +6,165,70,72,165,71,72,165,68,72,165,69,72,141,12,192, +141,14,192,169,149,32,237,253,32,147,254,32,137,254,32,132, +254,32,47,251,32,88,252,32,127,204,32,96,200,32,43,202, +104,133,69,104,133,68,104,133,71,104,133,70,174,120,7,96, +162,0,160,0,32,96,206,32,128,254,160,0,185,220,201,32, +237,253,200,192,40,208,245,162,0,160,23,32,96,206,160,0, +185,4,202,32,237,253,200,192,39,208,245,169,11,141,247,7, +162,3,160,2,32,96,206,160,0,185,188,201,240,6,32,237, +253,200,208,245,160,3,162,3,32,96,206,169,160,32,237,253, +162,17,32,96,206,169,160,32,237,253,200,192,21,208,231,162, +3,32,96,206,160,14,169,160,32,237,253,136,16,248,162,20, +160,2,32,96,206,160,0,185,204,201,240,6,32,237,253,200, +208,245,160,3,162,20,32,96,206,152,56,233,2,9,176,32, +237,253,162,34,32,96,206,169,160,32,237,253,200,192,11,208, +227,162,20,32,96,206,160,14,169,160,32,237,253,136,16,248, +32,132,254,162,20,160,13,32,96,206,169,20,133,32,160,0, +185,89,201,240,6,32,237,253,200,208,245,169,0,133,32,32, +51,201,96,162,25,160,13,32,96,206,165,250,208,14,160,0, +185,168,201,240,6,32,237,253,200,208,245,96,160,0,185,178, +201,240,248,32,237,253,200,208,245,13,207,196,197,186,141,2, +204,193,206,203,160,195,213,210,210,197,206,212,160,213,206,201, +212,141,49,173,56,186,193,211,211,201,199,206,160,212,207,160, +213,206,201,212,141,20,1,2,175,19,16,3,186,206,197,216, +212,160,213,206,201,212,141,18,197,173,210,197,193,196,160,213, +211,194,141,197,24,201,212,0,211,205,193,210,212,208,207,210, +212,0,194,204,207,195,203,160,160,160,160,0,160,160,160,198, +201,204,197,160,204,201,211,212,160,160,160,0,160,160,160,211, +197,204,197,195,212,197,196,160,160,160,160,0,194,207,207,212, +201,160,195,207,206,198,201,199,213,210,193,212,201,207,206,160, +213,212,201,204,201,212,217,160,160,160,160,160,160,160,160,160, +214,176,174,184,168,195,169,178,176,177,185,160,160,160,160,160, +160,160,160,160,160,160,205,193,210,203,181,160,198,210,207,205, +160,212,200,197,160,198,174,170,174,195,174,169,1,141,120,4, +169,0,133,8,133,9,141,120,6,32,6,204,160,0,173,248, +6,240,48,169,0,24,101,8,133,68,169,16,101,9,133,69, +162,4,152,24,105,3,32,97,206,32,65,204,165,68,24,105, +32,133,68,165,69,105,0,133,69,200,192,18,176,29,204,248, +6,208,221,162,4,152,24,105,3,32,97,206,162,12,169,160, +32,237,253,202,16,250,200,192,18,144,232,173,0,192,16,251, +141,16,192,201,177,144,11,201,185,176,7,41,15,141,120,4, +169,141,201,225,144,6,201,251,176,2,41,223,32,178,202,76, +57,202,162,0,221,207,202,240,10,232,224,12,208,246,104,104, +76,139,202,138,10,170,189,220,202,72,189,219,202,72,96,136, +139,149,138,160,137,141,216,217,205,194,210,15,203,15,203,46, +203,46,203,92,203,92,203,108,203,153,203,4,203,156,203,214, +203,242,202,169,0,133,6,141,248,5,141,120,6,133,8,133, +9,32,127,204,96,169,25,141,4,4,169,21,141,243,7,96, +206,248,5,16,25,165,8,5,9,240,16,206,120,6,165,8, +56,233,32,133,8,165,9,233,0,133,9,238,248,5,96,238, +248,5,173,248,5,24,109,120,6,205,248,6,144,4,206,248, +5,96,173,248,5,201,18,144,19,206,248,5,238,120,6,165, +8,24,105,32,133,8,165,9,105,0,133,9,96,238,120,4, +173,120,4,201,9,208,5,169,1,141,120,4,96,173,248,6, +240,250,174,120,7,165,70,133,68,165,71,133,69,172,120,4, +136,152,10,10,10,10,24,105,64,133,70,169,207,133,71,32, +223,204,169,15,133,10,32,128,2,96,104,104,96,165,68,72, +165,69,72,165,70,72,165,71,72,165,250,73,60,133,250,32, +51,201,169,250,133,68,169,0,133,69,133,10,169,7,133,70, +169,200,133,71,32,223,204,32,128,2,104,133,71,104,133,70, +104,133,69,104,133,68,96,165,68,72,165,69,72,165,70,72, +165,71,72,169,112,133,70,169,2,133,71,32,109,203,104,133, +71,104,133,70,104,133,69,104,133,68,96,32,37,205,160,7, +32,128,2,133,250,96,32,251,203,173,248,5,72,172,120,4, +136,140,248,5,169,0,133,68,169,8,133,69,160,0,152,10, +10,10,10,24,105,0,133,68,152,24,105,3,162,21,32,97, +206,32,65,204,200,192,8,208,229,32,51,201,104,141,248,5, +96,152,72,204,248,5,208,14,165,68,133,70,165,69,133,71, +32,128,254,169,190,44,169,160,32,237,253,32,132,254,160,0, +192,11,240,24,177,68,208,2,169,32,9,128,32,237,253,200, +192,8,208,236,169,174,32,237,253,76,96,204,104,168,96,169, +0,141,248,6,162,86,160,204,169,0,32,216,207,172,248,7, +185,56,4,208,70,169,47,157,129,192,160,255,200,185,102,206, +157,128,192,208,247,169,0,133,68,169,16,133,69,169,50,157, +129,192,32,7,206,32,75,206,201,29,208,28,169,39,157,129, +192,32,136,205,169,51,157,129,192,32,7,206,32,75,206,201, +29,240,233,201,66,240,1,0,32,119,205,173,248,6,96,160, +58,185,235,204,153,128,2,136,16,247,96,174,120,7,169,2, +157,132,192,169,170,141,85,205,169,1,157,132,192,169,85,141, +170,202,169,2,157,132,192,169,160,141,85,205,169,0,157,132, +192,164,10,177,68,145,70,136,16,249,169,255,32,168,252,169, +1,157,132,192,96,160,39,185,49,205,153,128,2,136,16,247, +96,174,120,7,169,0,157,132,192,177,6,72,160,242,177,6, +133,70,200,177,6,133,71,160,127,177,70,153,0,8,136,16, +248,169,1,157,132,192,104,96,169,120,133,68,169,4,133,69, +169,244,133,70,169,200,133,71,169,0,133,10,32,223,204,32, +128,2,104,104,133,68,96,169,54,157,129,192,169,1,157,128, +192,32,7,206,32,75,206,96,189,128,192,133,73,240,31,160, +0,189,128,192,145,68,200,196,73,208,246,32,175,205,176,14, +165,68,24,101,73,133,68,165,69,105,0,133,69,24,96,162, +0,160,8,177,68,221,224,205,208,22,232,200,192,11,208,243, +238,248,6,169,64,224,3,240,2,169,0,145,68,24,144,12, +138,41,252,24,105,4,170,224,24,208,214,56,174,120,7,96, +50,77,71,42,72,68,86,42,68,83,75,42,80,79,32,42, +68,79,32,42,73,83,79,42,160,0,136,240,5,32,3,206, +176,248,96,169,255,208,2,169,48,133,78,133,79,173,39,4, +72,208,13,169,20,32,84,206,198,78,208,4,198,79,240,18, +165,78,69,79,141,39,4,189,129,192,48,231,104,141,39,4, +24,96,104,141,39,4,56,96,152,72,172,248,7,169,0,153, +56,7,169,255,153,184,3,104,168,56,96,169,34,157,129,192, +189,128,192,96,56,72,233,1,208,252,104,233,1,208,246,96, +152,134,36,76,91,251,47,42,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,141,248,5,169,1,72,169,207, +72,169,241,72,152,72,138,72,174,120,7,173,248,5,157,132, +192,96,234,174,120,7,104,157,132,192,96,0,0,0,0,0, +234,32,95,201,44,16,192,56,96,169,3,24,109,37,4,141, +97,66,32,44,201,32,92,201,201,197,208,229,32,92,201,205, +97,66,208,221,32,92,201,197,70,208,214,32,92,201,197,71, +208,207,32,92,201,141,144,191,77,36,4,141,36,4,32,92, +201,141,145,191,77,36,4,141,36,4,32,92,201,141,146,191, +77,36,4,141,36,4,32,92,201,141,147,191,77,36,4,141, +36,4,32,92,201,205,36,4,208,88,173,144,191,141,146,191, +173,145,191,141,147,191,173,146,191,141,144,191,173,147,191,141, +145,191,173,39,4,141,35,4,162,0,160,0,142,39,4,32, +92,201,176,46,145,68,200,208,246,230,69,232,142,39,4,224, +2,208,236,198,69,198,69,173,35,4,141,39,4,32,92,201, +176,16,72,162,0,32,99,201,104,205,36,4,208,4,169,0, +24,96,32,95,201,44,16,192,56,96,169,2,24,109,37,4, +141,97,66,32,44,201,162,0,142,36,4,160,0,177,68,32, +89,201,200,208,248,230,69,232,224,2,208,241,198,69,198,69, +32,99,201,173,36,4,32,89,201,32,92,201,176,196,201,197, +208,192,32,92,201,176,187,205,97,66,208,182,32,92,201,176, +177,197,70,208,173,32,92,201,176,168,197,71,208,164,32,92, +201,176,159,205,36,4,208,154,169,0,24,96,72,169,197,32, +89,201,141,36,4,104,32,89,201,77,36,4,141,36,4,165, +70,32,89,201,77,36,4,141,36,4,165,71,32,89,201,77, +36,4,141,36,4,32,89,201,96,76,165,201,76,187,201,32, +123,201,96,169,0,170,168,81,68,141,36,4,200,208,248,230, +69,232,224,2,208,241,198,69,198,69,96,160,2,10,10,10, +10,105,136,170,169,11,157,2,192,160,1,185,21,202,157,3, +192,142,243,201,142,184,201,142,224,201,232,142,174,201,142,196, +201,32,246,201,96,72,173,0,192,201,155,240,55,173,169,192, +41,80,201,16,208,240,104,141,168,192,96,169,0,141,33,4, +141,34,4,173,169,192,41,104,201,8,240,19,173,0,192,201, +155,240,17,238,33,4,208,235,238,34,4,208,230,56,96,173, +168,192,24,96,76,231,201,0,169,240,141,34,4,32,195,201, +144,246,44,168,192,96,169,165,141,90,201,169,201,141,91,201, +169,187,141,93,201,169,201,141,94,201,169,232,141,96,201,169, +201,141,97,201,96,31,16,169,149,32,237,253,141,12,192,141, +14,192,32,147,254,32,137,254,32,132,254,32,47,251,32,88, +252,160,19,185,70,202,153,178,5,185,90,202,153,50,6,136, +16,241,136,16,253,96,206,207,160,213,211,194,160,211,212,207, +210,193,199,197,160,198,207,213,206,196,160,194,207,207,212,201, +206,199,160,206,197,216,212,160,211,204,207,212,160,160,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; diff --git a/Prog_Booti.h b/Prog_Booti.h new file mode 100644 index 0000000..3a7f086 --- /dev/null +++ b/Prog_Booti.h @@ -0,0 +1,520 @@ +// Use PROGMEM to put into Arduino flash memory +// /Users/chris/Desktop/BOOTI/tmp/FIRMWARE.BIN, created by applechargen.py +// Mon, 21 Oct 2019 21:06:48 +// #define __PROG_TYPES_COMPAT__ +// #include "avr/pgmspace.h" +#define ADDRESS_MAX 8192 +const unsigned char values[ADDRESS_MAX] PROGMEM = { +169,32,201,0,169,3,169,60,176,107,56,176,1,24,141,255, +207,32,205,206,176,17,104,168,201,253,104,170,105,0,72,152, +105,3,72,142,248,6,24,162,13,181,66,72,202,16,250,169, +0,133,72,176,58,132,70,173,248,6,133,71,160,1,177,70, +133,66,200,177,70,133,69,200,177,70,133,70,160,1,177,69, +133,67,200,177,69,133,68,200,177,69,72,200,177,69,72,200, +177,69,133,71,200,177,69,133,72,104,133,70,104,133,69,110, +248,4,76,12,201,141,255,207,110,248,4,32,205,206,76,7, +206,141,255,207,32,205,206,56,110,248,4,165,67,72,132,67, +32,0,201,42,168,104,133,67,152,106,96,160,5,208,226,160, +6,208,222,160,7,208,218,160,8,208,214,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +213,194,64,207,0,0,0,0,0,0,0,0,0,0,191,10, +162,13,181,66,72,202,16,250,169,0,133,72,169,1,141,248, +6,172,248,7,169,0,153,56,4,32,92,201,172,248,7,185, +56,4,240,10,48,8,153,56,7,206,248,6,16,230,162,0, +104,149,66,232,224,14,208,248,185,56,4,41,127,141,248,6, +173,248,4,16,4,165,66,208,8,185,184,4,170,185,56,5, +168,173,120,6,72,40,173,248,6,201,1,96,165,66,240,38, +201,1,240,25,201,2,240,24,201,3,240,23,201,255,240,25, +201,254,240,24,172,248,7,169,161,153,56,4,96,76,149,203, +76,191,202,76,159,202,76,232,201,76,98,206,76,143,201,173, +7,200,240,12,32,223,205,162,140,160,201,169,3,32,216,207, +96,152,160,2,145,68,136,138,145,68,200,200,165,72,145,68, +160,0,169,248,145,68,32,72,205,152,41,7,9,48,160,10, +145,68,160,4,185,207,201,240,2,145,68,200,192,25,208,244, +152,208,66,6,66,79,79,84,73,0,32,32,32,32,32,32, +32,32,32,32,2,32,0,16,32,87,202,173,248,4,48,74, +165,70,240,6,201,3,240,169,208,84,165,67,208,25,32,223, +205,160,0,145,68,200,169,0,145,68,200,169,0,145,68,200, +192,8,208,249,152,208,23,152,72,160,0,169,248,145,68,200, +138,145,68,200,104,145,68,200,165,72,145,68,169,4,172,248, +7,153,184,4,169,0,153,56,5,96,165,72,240,4,162,255, +160,255,152,172,248,7,153,56,5,138,153,184,4,96,172,248, +7,169,161,153,56,4,96,32,87,204,176,49,165,67,208,5, +162,0,160,0,96,32,227,204,176,35,169,12,157,129,192,169, +104,157,128,192,189,128,192,189,128,192,72,189,128,192,72,189, +128,192,24,106,133,72,104,106,168,104,106,170,96,169,168,208, +6,169,39,208,2,169,171,172,248,7,153,56,4,56,96,165, +70,72,165,71,72,169,0,133,70,133,71,32,191,202,176,8, +230,70,165,70,201,27,208,243,104,133,70,104,133,71,96,172, +248,7,165,68,72,165,69,72,169,0,153,184,4,153,56,5, +169,39,153,56,4,32,87,204,32,227,204,144,3,76,105,203, +32,112,203,169,60,157,129,192,169,0,157,128,192,169,2,157, +128,192,32,153,205,76,0,203,169,61,157,129,192,32,153,205, +32,200,205,176,100,201,20,240,76,169,45,157,129,192,189,128, +192,133,73,160,0,165,66,201,3,208,12,169,0,157,128,192, +200,196,73,208,248,240,10,177,68,157,128,192,200,196,73,208, +246,172,248,7,165,73,24,121,184,4,153,184,4,185,56,5, +105,0,153,56,5,165,68,24,101,73,133,68,165,69,105,0, +133,69,76,248,202,32,124,205,185,184,4,208,12,185,56,5, +201,2,208,5,169,0,153,56,4,104,133,69,104,133,68,96, +169,57,157,129,192,32,10,204,157,128,192,24,165,70,42,157, +128,192,165,71,42,157,128,192,165,72,42,157,128,192,32,149, +205,32,200,205,96,165,68,72,165,69,72,169,39,172,248,7, +153,56,4,169,0,153,184,4,153,56,5,32,87,204,176,83, +32,227,204,176,78,32,112,203,176,73,169,58,157,129,192,169, +0,157,128,192,169,2,157,128,192,32,153,205,76,215,203,169, +59,157,129,192,32,153,205,32,200,205,176,39,201,20,240,15, +201,29,208,31,169,39,157,129,192,32,36,204,76,207,203,172, +248,7,185,184,4,208,12,185,56,5,201,2,208,5,169,0, +153,56,4,104,133,69,104,133,68,96,32,72,205,152,10,10, +10,10,24,105,8,168,185,64,207,201,50,208,4,169,64,208, +2,169,0,96,189,128,192,133,73,240,43,172,248,7,24,121, +184,4,153,184,4,185,56,5,105,0,153,56,5,160,0,189, +128,192,145,68,200,196,73,208,246,165,68,24,101,73,133,68, +165,69,105,0,133,69,96,172,248,7,174,120,7,169,49,157, +129,192,32,153,205,176,25,32,200,205,201,20,208,9,185,56, +7,201,170,208,2,24,96,169,255,153,184,3,153,56,4,24, +160,10,152,72,176,46,169,21,157,129,192,169,6,157,128,192, +160,10,169,2,32,211,205,169,49,157,129,192,32,153,205,176, +19,32,200,205,201,21,240,33,201,20,240,29,169,120,32,211, +205,136,208,222,32,200,205,169,5,157,129,192,169,120,32,211, +205,24,104,168,136,208,187,56,96,169,47,157,129,192,169,0, +157,128,192,104,172,248,7,169,170,153,56,7,169,0,153,56, +4,24,96,172,248,7,165,67,217,184,3,240,81,169,255,153, +184,3,32,72,205,152,10,10,10,10,168,185,64,207,240,59, +169,47,157,129,192,169,47,157,128,192,185,64,207,201,32,240, +3,157,128,192,200,152,41,15,201,11,240,11,201,8,208,234, +169,46,157,128,192,208,227,169,0,157,128,192,169,50,157,129, +192,32,153,205,32,200,205,201,20,240,3,76,141,202,172,248, +7,165,67,153,184,3,24,96,173,248,4,16,41,160,0,165, +67,48,4,201,9,144,31,41,127,205,120,7,240,2,160,2, +165,67,16,1,200,192,0,208,5,172,244,200,16,7,204,244, +200,208,2,160,0,96,164,67,136,16,234,96,172,248,7,169, +255,153,184,3,169,54,157,129,192,169,1,157,128,192,32,153, +205,32,200,205,96,169,255,208,2,169,80,133,78,133,79,208, +13,169,5,32,211,205,198,78,208,4,198,79,240,7,189,129, +192,48,238,24,96,152,72,172,248,7,169,0,153,56,7,169, +255,153,184,3,104,168,56,96,169,34,157,129,192,189,128,192, +201,31,96,56,72,233,1,208,252,104,233,1,208,246,96,160, +112,162,8,185,64,207,208,8,202,152,56,233,16,168,208,243, +138,141,120,5,174,120,7,96,162,22,160,202,169,2,32,216, +207,172,248,7,76,116,206,32,157,206,201,177,144,10,201,185, +176,6,56,233,177,141,120,4,72,173,120,4,205,244,200,240, +9,162,87,160,205,169,1,32,216,207,104,201,206,240,69,201, +194,240,92,201,195,240,43,32,87,204,176,188,169,1,133,66, +173,120,7,133,67,169,0,133,70,133,71,133,68,169,8,133, +69,32,0,201,172,248,7,185,56,4,208,6,174,120,7,76, +1,8,162,0,160,200,169,1,141,243,3,141,244,3,32,216, +207,76,98,250,160,5,198,1,165,1,201,192,240,17,141,248, +7,177,0,217,151,206,208,236,136,136,16,245,108,0,0,160, +3,140,242,3,76,0,224,69,32,255,0,255,3,172,248,7, +169,255,153,184,3,169,0,141,120,4,169,192,133,6,133,7, +169,0,198,6,208,4,198,7,240,18,173,0,192,16,241,201, +225,144,6,201,251,176,2,41,223,141,16,192,96,8,120,216, +104,141,120,6,104,170,104,141,248,7,72,8,10,10,10,10, +141,120,7,40,138,72,96,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,176,185,175,178,179, +175,177,185,160,160,160,181,186,179,176,186,180,185,160,208,205, +83,77,65,82,84,32,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,50,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,51,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,52,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,53,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,54,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,55,32,32,50,77,71,64,0,0,0,0, +83,77,65,82,84,56,32,32,50,77,71,64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,141,248,5,169,0,72,169,207, +72,169,241,72,152,72,138,72,174,120,7,173,248,5,157,132, +192,96,234,174,120,7,104,157,132,192,96,0,0,0,0,0, +234,234,160,15,169,0,153,112,2,136,16,250,172,248,7,141, +16,192,132,7,169,0,133,6,153,56,7,141,248,5,141,120, +6,165,70,72,165,71,72,165,68,72,165,69,72,141,12,192, +141,14,192,169,149,32,237,253,32,147,254,32,137,254,32,132, +254,32,47,251,32,88,252,32,127,204,32,96,200,32,43,202, +104,133,69,104,133,68,104,133,71,104,133,70,174,120,7,96, +162,0,160,0,32,96,206,32,128,254,160,0,185,220,201,32, +237,253,200,192,40,208,245,162,0,160,23,32,96,206,160,0, +185,4,202,32,237,253,200,192,39,208,245,169,11,141,247,7, +162,3,160,2,32,96,206,160,0,185,188,201,240,6,32,237, +253,200,208,245,160,3,162,3,32,96,206,169,160,32,237,253, +162,17,32,96,206,169,160,32,237,253,200,192,21,208,231,162, +3,32,96,206,160,14,169,160,32,237,253,136,16,248,162,20, +160,2,32,96,206,160,0,185,204,201,240,6,32,237,253,200, +208,245,160,3,162,20,32,96,206,152,56,233,2,9,176,32, +237,253,162,34,32,96,206,169,160,32,237,253,200,192,11,208, +227,162,20,32,96,206,160,14,169,160,32,237,253,136,16,248, +32,132,254,162,20,160,13,32,96,206,169,20,133,32,160,0, +185,89,201,240,6,32,237,253,200,208,245,169,0,133,32,32, +51,201,96,162,25,160,13,32,96,206,165,250,208,14,160,0, +185,168,201,240,6,32,237,253,200,208,245,96,160,0,185,178, +201,240,248,32,237,253,200,208,245,13,207,196,197,186,141,2, +204,193,206,203,160,195,213,210,210,197,206,212,160,213,206,201, +212,141,49,173,56,186,193,211,211,201,199,206,160,212,207,160, +213,206,201,212,141,20,1,2,175,19,16,3,186,206,197,216, +212,160,213,206,201,212,141,18,197,173,210,197,193,196,160,213, +211,194,141,197,24,201,212,0,211,205,193,210,212,208,207,210, +212,0,194,204,207,195,203,160,160,160,160,0,160,160,160,198, +201,204,197,160,204,201,211,212,160,160,160,0,160,160,160,211, +197,204,197,195,212,197,196,160,160,160,160,0,194,207,207,212, +201,160,195,207,206,198,201,199,213,210,193,212,201,207,206,160, +213,212,201,204,201,212,217,160,160,160,160,160,160,160,160,160, +214,176,174,184,168,195,169,178,176,177,185,160,160,160,160,160, +160,160,160,160,160,160,205,193,210,203,181,160,198,210,207,205, +160,212,200,197,160,198,174,170,174,195,174,169,1,141,120,4, +169,0,133,8,133,9,141,120,6,32,6,204,160,0,173,248, +6,240,48,169,0,24,101,8,133,68,169,16,101,9,133,69, +162,4,152,24,105,3,32,97,206,32,65,204,165,68,24,105, +32,133,68,165,69,105,0,133,69,200,192,18,176,29,204,248, +6,208,221,162,4,152,24,105,3,32,97,206,162,12,169,160, +32,237,253,202,16,250,200,192,18,144,232,173,0,192,16,251, +141,16,192,201,177,144,11,201,185,176,7,41,15,141,120,4, +169,141,201,225,144,6,201,251,176,2,41,223,32,178,202,76, +57,202,162,0,221,207,202,240,10,232,224,12,208,246,104,104, +76,139,202,138,10,170,189,220,202,72,189,219,202,72,96,136, +139,149,138,160,137,141,216,217,205,194,210,15,203,15,203,46, +203,46,203,92,203,92,203,108,203,153,203,4,203,156,203,214, +203,242,202,169,0,133,6,141,248,5,141,120,6,133,8,133, +9,32,127,204,96,169,25,141,4,4,169,21,141,243,7,96, +206,248,5,16,25,165,8,5,9,240,16,206,120,6,165,8, +56,233,32,133,8,165,9,233,0,133,9,238,248,5,96,238, +248,5,173,248,5,24,109,120,6,205,248,6,144,4,206,248, +5,96,173,248,5,201,18,144,19,206,248,5,238,120,6,165, +8,24,105,32,133,8,165,9,105,0,133,9,96,238,120,4, +173,120,4,201,9,208,5,169,1,141,120,4,96,173,248,6, +240,250,174,120,7,165,70,133,68,165,71,133,69,172,120,4, +136,152,10,10,10,10,24,105,64,133,70,169,207,133,71,32, +223,204,169,15,133,10,32,128,2,96,104,104,96,165,68,72, +165,69,72,165,70,72,165,71,72,165,250,73,60,133,250,32, +51,201,169,250,133,68,169,0,133,69,133,10,169,7,133,70, +169,200,133,71,32,223,204,32,128,2,104,133,71,104,133,70, +104,133,69,104,133,68,96,165,68,72,165,69,72,165,70,72, +165,71,72,169,112,133,70,169,2,133,71,32,109,203,104,133, +71,104,133,70,104,133,69,104,133,68,96,32,37,205,160,7, +32,128,2,133,250,96,32,251,203,173,248,5,72,172,120,4, +136,140,248,5,169,0,133,68,169,8,133,69,160,0,152,10, +10,10,10,24,105,0,133,68,152,24,105,3,162,21,32,97, +206,32,65,204,200,192,8,208,229,32,51,201,104,141,248,5, +96,152,72,204,248,5,208,14,165,68,133,70,165,69,133,71, +32,128,254,169,190,44,169,160,32,237,253,32,132,254,160,0, +192,11,240,24,177,68,208,2,169,32,9,128,32,237,253,200, +192,8,208,236,169,174,32,237,253,76,96,204,104,168,96,169, +0,141,248,6,162,86,160,204,169,0,32,216,207,172,248,7, +185,56,4,208,70,169,47,157,129,192,160,255,200,185,102,206, +157,128,192,208,247,169,0,133,68,169,16,133,69,169,50,157, +129,192,32,7,206,32,75,206,201,29,208,28,169,39,157,129, +192,32,136,205,169,51,157,129,192,32,7,206,32,75,206,201, +29,240,233,201,66,240,1,0,32,119,205,173,248,6,96,160, +58,185,235,204,153,128,2,136,16,247,96,174,120,7,169,2, +157,132,192,169,170,141,85,205,169,1,157,132,192,169,85,141, +170,202,169,2,157,132,192,169,160,141,85,205,169,0,157,132, +192,164,10,177,68,145,70,136,16,249,169,255,32,168,252,169, +1,157,132,192,96,160,39,185,49,205,153,128,2,136,16,247, +96,174,120,7,169,0,157,132,192,177,6,72,160,242,177,6, +133,70,200,177,6,133,71,160,127,177,70,153,0,8,136,16, +248,169,1,157,132,192,104,96,169,120,133,68,169,4,133,69, +169,244,133,70,169,200,133,71,169,0,133,10,32,223,204,32, +128,2,104,104,133,68,96,169,54,157,129,192,169,1,157,128, +192,32,7,206,32,75,206,96,189,128,192,133,73,240,31,160, +0,189,128,192,145,68,200,196,73,208,246,32,175,205,176,14, +165,68,24,101,73,133,68,165,69,105,0,133,69,24,96,162, +0,160,8,177,68,221,224,205,208,22,232,200,192,11,208,243, +238,248,6,169,64,224,3,240,2,169,0,145,68,24,144,12, +138,41,252,24,105,4,170,224,24,208,214,56,174,120,7,96, +50,77,71,42,72,68,86,42,68,83,75,42,80,79,32,42, +68,79,32,42,73,83,79,42,160,0,136,240,5,32,3,206, +176,248,96,169,255,208,2,169,48,133,78,133,79,173,39,4, +72,208,13,169,20,32,84,206,198,78,208,4,198,79,240,18, +165,78,69,79,141,39,4,189,129,192,48,231,104,141,39,4, +24,96,104,141,39,4,56,96,152,72,172,248,7,169,0,153, +56,7,169,255,153,184,3,104,168,56,96,169,34,157,129,192, +189,128,192,96,56,72,233,1,208,252,104,233,1,208,246,96, +152,134,36,76,91,251,47,42,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,141,248,5,169,1,72,169,207, +72,169,241,72,152,72,138,72,174,120,7,173,248,5,157,132, +192,96,234,174,120,7,104,157,132,192,96,0,0,0,0,0, +234,32,95,201,44,16,192,56,96,169,3,24,109,37,4,141, +97,66,32,44,201,32,92,201,201,197,208,229,32,92,201,205, +97,66,208,221,32,92,201,197,70,208,214,32,92,201,197,71, +208,207,32,92,201,141,144,191,77,36,4,141,36,4,32,92, +201,141,145,191,77,36,4,141,36,4,32,92,201,141,146,191, +77,36,4,141,36,4,32,92,201,141,147,191,77,36,4,141, +36,4,32,92,201,205,36,4,208,88,173,144,191,141,146,191, +173,145,191,141,147,191,173,146,191,141,144,191,173,147,191,141, +145,191,173,39,4,141,35,4,162,0,160,0,142,39,4,32, +92,201,176,46,145,68,200,208,246,230,69,232,142,39,4,224, +2,208,236,198,69,198,69,173,35,4,141,39,4,32,92,201, +176,16,72,162,0,32,99,201,104,205,36,4,208,4,169,0, +24,96,32,95,201,44,16,192,56,96,169,2,24,109,37,4, +141,97,66,32,44,201,162,0,142,36,4,160,0,177,68,32, +89,201,200,208,248,230,69,232,224,2,208,241,198,69,198,69, +32,99,201,173,36,4,32,89,201,32,92,201,176,196,201,197, +208,192,32,92,201,176,187,205,97,66,208,182,32,92,201,176, +177,197,70,208,173,32,92,201,176,168,197,71,208,164,32,92, +201,176,159,205,36,4,208,154,169,0,24,96,72,169,197,32, +89,201,141,36,4,104,32,89,201,77,36,4,141,36,4,165, +70,32,89,201,77,36,4,141,36,4,165,71,32,89,201,77, +36,4,141,36,4,32,89,201,96,76,165,201,76,187,201,32, +123,201,96,169,0,170,168,81,68,141,36,4,200,208,248,230, +69,232,224,2,208,241,198,69,198,69,96,160,2,10,10,10, +10,105,136,170,169,11,157,2,192,160,1,185,21,202,157,3, +192,142,243,201,142,184,201,142,224,201,232,142,174,201,142,196, +201,32,246,201,96,72,173,0,192,201,155,240,55,173,169,192, +41,80,201,16,208,240,104,141,168,192,96,169,0,141,33,4, +141,34,4,173,169,192,41,104,201,8,240,19,173,0,192,201, +155,240,17,238,33,4,208,235,238,34,4,208,230,56,96,173, +168,192,24,96,76,231,201,0,169,240,141,34,4,32,195,201, +144,246,44,168,192,96,169,165,141,90,201,169,201,141,91,201, +169,187,141,93,201,169,201,141,94,201,169,232,141,96,201,169, +201,141,97,201,96,31,16,169,149,32,237,253,141,12,192,141, +14,192,32,147,254,32,137,254,32,132,254,32,47,251,32,88, +252,160,19,185,70,202,153,178,5,185,90,202,153,50,6,136, +16,241,136,16,253,96,206,207,160,213,211,194,160,211,212,207, +210,193,199,197,160,198,207,213,206,196,160,194,207,207,212,201, +206,199,160,206,197,216,212,160,211,204,207,212,160,160,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; diff --git a/ProgrammerAT28.h b/ProgrammerAT28.h new file mode 100644 index 0000000..45fd3a6 --- /dev/null +++ b/ProgrammerAT28.h @@ -0,0 +1,28 @@ +#define SER_Pin A3 // 75HC595 pin 14, serial input +#define STCP_Pin A2 // 75HC595 pin 12, STCP storage register clock +#define SHCP_Pin A1 // 75HC595 pin 11, SHCP shift register clock + +#define AT28_CE_Pin 10 // AT28 CE, chip enable +#define AT28_WE_Pin 11 // AT28 WE, write enable +#define AT28_OE_Pin 12 // AT28 OE, output enable + +#define numOfRegisterPins 16 + +// Fast way of setting/reading/writing pins on the Arduino +// http://masteringarduino.blogspot.com/2013_10_01_archive.html +#define portOfPin(P)\ + (((P)>=0&&(P)<8)?&PORTD:(((P)>7&&(P)<14)?&PORTB:&PORTC)) +#define pinOfPin(P)\ + (((P)>=0&&(P)<8)?&PIND:(((P)>7&&(P)<14)?&PINB:&PINC)) +#define pinIndex(P) ((uint8_t)(P>13?P-14:P&7)) +#define pinMask(P) ((uint8_t)(1<0) +#define isLow(P) ((*(pinOfPin(P))& pinMask(P))==0) + +void testShiftRegister(); +int writeEEPROM(); +void verifyEEPROM(); +void readEEPROM(); +void setupAT28(); diff --git a/ProgrammerAT28.ino b/ProgrammerAT28.ino new file mode 100644 index 0000000..44f17f9 --- /dev/null +++ b/ProgrammerAT28.ino @@ -0,0 +1,39 @@ +// Arduino Uno Programmer for AT28 EEPROM +// Chris Torrence, 2015 +// ideas from: http://forum.6502.org/viewtopic.php?f=4&t=2491 +// + +#include "ProgrammerAT28.h" + + +void setup() +{ + Serial.begin(115200); + + setupAT28(); + + Serial.println("***** TESTING *****"); + testShiftRegister(); + + // Wait until user hits return. + if (1) { + Serial.println("***** Hit to start WRITE/VERIFY *****"); + while (Serial.available() == 0) {}; + Serial.read(); + int success = writeEEPROM(); + if (success) { + verifyEEPROM(); + } + } else { + Serial.println("***** Hit to read & dump EEPROM *****"); + while (Serial.available() == 0) {}; + Serial.read(); + readEEPROM(); + } +} + + +void loop() +{ + // Do nothing +} diff --git a/ProgrammerAT28Main.cpp b/ProgrammerAT28Main.cpp new file mode 100644 index 0000000..90b5b57 --- /dev/null +++ b/ProgrammerAT28Main.cpp @@ -0,0 +1,235 @@ + +#include +#include "ProgrammerAT28.h" + +#include "ProgData.h" + + +// Procedure to set and display registers: +// STCP low +// For each address bit (high to low): SHCP low, write bit, SHCP high +// STCP high to transfer to the storage register (and the output) +// +void writeShiftRegister(long val) +{ + digitalWrite(STCP_Pin, LOW); + + // From highest bit to lowest bit + for(int i = 15; i >= 0; i--) + { + digitalWrite(SHCP_Pin, LOW); + digitalWrite(SER_Pin, (val >> i) & 1); // Write the next highest bit + digitalWrite(SHCP_Pin, HIGH); // Left shift the register 1 bit + + } + digitalWrite(STCP_Pin, HIGH); +} + + +// Light up the LEDs using each valid address +void testShiftRegister() +{ + // Just light up the LEDs in order. + writeShiftRegister(0); + delay(100); + for (int i=0; i < numOfRegisterPins; i++) + { + writeShiftRegister(1 << i); + delay(50); + } + // Light them all up, then turn them off. + writeShiftRegister(8191); + delay(50); + writeShiftRegister(0); +} + + +void printValue(int address, byte value, int debug) +{ + if (address % 32 == 0 || debug) + { + Serial.println(""); + Serial.print("$"); + if (address < 4096) Serial.print("0"); + if (address < 256) Serial.print("0"); + if (address < 16) Serial.print("0"); + Serial.print(address, HEX); + Serial.print(":"); + } + + Serial.print(" "); + if (value < 16) Serial.print("0"); + Serial.print(value, HEX); +} + +byte readValue(int address) +{ + // Now read the value. + // Set the AT28 for "READ", WE high, OE low + // Set the data pins for input + digitalWrite(AT28_WE_Pin, HIGH); + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + + writeShiftRegister(address); + digitalWrite(AT28_OE_Pin, LOW); + + int actualValue = 0; + // the (9 - i) translates from bit # to pin # + for (int i=0; i <= 7; i++) { + if (digitalRead(9 - i)) actualValue += (1 << i); + } + + digitalWrite(AT28_OE_Pin, HIGH); + return actualValue; +} + +// Procedure to write to the AT28: +// Set OE and WE high +// For each address, write the address and data, then pulse WE low +int writeEEPROM() +{ + Serial.println(""); + Serial.println("***** WRITE *****"); + digitalWrite(AT28_CE_Pin, LOW); + byte currentValue; + + for (int address=0; address < ADDRESS_MAX; address++) + { + byte value = pgm_read_byte_near(values + address); + printValue(address, value, 0); + + currentValue = readValue(address); + if (currentValue != value) + { + + for (int l=0; l < 10; l++) + { + for (int i=2; i <= 9; i++) pinMode(i, OUTPUT); + digitalWrite(AT28_OE_Pin, HIGH); + digitalWrite(AT28_WE_Pin, HIGH); + writeShiftRegister(address); + + // the (9 - i) translates from bit # to pin # + for (int i=0; i <= 7; i++) { + if (value & (1 << i)) digitalHigh(9 - i); else digitalLow(9 - i); + } + + // Send a pulse to the AT28 to write the data + digitalLow(AT28_WE_Pin); + delay(1); + digitalHigh(AT28_WE_Pin); + currentValue = readValue(address); + if (currentValue == value) break; + } + + for (int i=0; i <= 7; i++) { + digitalLow(9 - i); + } + currentValue = readValue(address); + if (currentValue == value) + { + currentValue = readValue(address); + if (currentValue != value) + { + Serial.println(""); + Serial.println("Error writing value!"); + return 0; + } + } + } + + } + + writeShiftRegister(0); + return 1; +} + + +// Procedure to read from the AT28: +// Set OE low and WE high +// For each address, write the address, then read the data +void verifyEEPROM() +{ + Serial.println(""); + Serial.println("***** READ *****"); + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + digitalWrite(AT28_CE_Pin, LOW); + + for (int address=0; address < ADDRESS_MAX; address++) + { + int value = readValue(address); + + byte expectvalue = pgm_read_byte_near(values + address); + + if (expectvalue != value) { + printValue(address, value, 1); + Serial.print(" <-- Wrong value, should be: "); + if (expectvalue < 16) Serial.print("0"); + Serial.println(expectvalue, HEX); + } + else + { + printValue(address, value, 0); + } + delay(1); + } + + writeShiftRegister(0); + Serial.println(""); +} + + +// Procedure to read from the AT28: +// Set OE low and WE high +// For each address, write the address, then read the data +void readEEPROM() +{ + Serial.println(""); + Serial.println("***** READ *****"); + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + digitalWrite(AT28_CE_Pin, LOW); + + for (int address=0; address < ADDRESS_MAX; address++) + { + if (address % 32 == 0) Serial.println(""); + int value = readValue(address); + Serial.print(value); + Serial.print(","); + + delay(1); + } + + writeShiftRegister(0); + Serial.println(""); +} + + +// Initial setup of all of the AT28C16/C64 pins. +void setupAT28() +{ + + pinMode(SER_Pin, OUTPUT); + pinMode(STCP_Pin, OUTPUT); + pinMode(SHCP_Pin, OUTPUT); + + pinMode(AT28_CE_Pin, OUTPUT); + pinMode(AT28_WE_Pin, OUTPUT); + pinMode(AT28_OE_Pin, OUTPUT); + + // Disable the AT28 + digitalWrite(AT28_CE_Pin, HIGH); + digitalWrite(AT28_WE_Pin, HIGH); + digitalWrite(AT28_OE_Pin, HIGH); + + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + + if (ADDRESS_MAX > 2048) + { + Serial.println("***** Is the switch in the UP position?! *****"); + } + else + { + Serial.println("***** Is the switch in the DOWN position?! *****"); + } + +} diff --git a/ProgrammerAT28Main.cpp.old b/ProgrammerAT28Main.cpp.old new file mode 100644 index 0000000..268b284 --- /dev/null +++ b/ProgrammerAT28Main.cpp.old @@ -0,0 +1,163 @@ + +#include +#include "ProgrammerAT28.h" + +// Data to be written to the AT28. +#include "at28c16.h" +// #include "at28c64.h" + +// Procedure to set and display registers: +// STCP low +// For each address bit (high to low): SHCP low, write bit, SHCP high +// STCP high to transfer to the storage register (and the output) +// +void writeShiftRegister(long val) +{ + digitalWrite(STCP_Pin, LOW); + + // From highest bit to lowest bit + for(int i = 15; i >= 0; i--) + { + digitalWrite(SHCP_Pin, LOW); + digitalWrite(SER_Pin, (val >> i) & 1); // Write the next highest bit + digitalWrite(SHCP_Pin, HIGH); // Left shift the register 1 bit + + } + digitalWrite(STCP_Pin, HIGH); +} + + +// Light up the LEDs using each valid address +void testShiftRegister() +{ + // Just light up the LEDs in order. + writeShiftRegister(0); + delay(200); + for (int i=0; i < numOfRegisterPins; i++) + { + writeShiftRegister(1 << i); + delay(100); + } + // Light them all up, then turn them off. + writeShiftRegister(8191); + delay(100); + writeShiftRegister(0); +} + + +void printValue(int address, byte value) +{ + if (address % 32 == 0) + { + Serial.println(""); + Serial.print("$"); + if (address < 4096) Serial.print("0"); + if (address < 256) Serial.print("0"); + if (address < 16) Serial.print("0"); + Serial.print(address, HEX); + Serial.print(":"); + } + + Serial.print(" "); + if (value < 16) Serial.print("0"); + Serial.print(value, HEX); +} + + +// Procedure to write to the AT28: +// Set OE and WE high +// For each address, write the address and data, then pulse WE low +void writeEEPROM() +{ + Serial.println(""); + Serial.println("***** WRITE *****"); + digitalWrite(AT28_CE_Pin, LOW); + digitalWrite(AT28_OE_Pin, HIGH); + + // Set the data pins for output + for (int i=2; i <= 9; i++) pinMode(i, OUTPUT); + + for (int address=0; address < ADDRESS_MAX; address++) + { + byte value = pgm_read_byte_near(values + address); + printValue(address, value); + + writeShiftRegister(address); + + // the (9 - i) translates from bit # to pin # + for (int i=0; i <= 7; i++) { + if (value & (1 << i)) digitalHigh(9 - i); else digitalLow(9 - i); + } + + // Send a pulse to the AT28 to write the data + digitalLow(AT28_WE_Pin); + digitalHigh(AT28_WE_Pin); + delay(5); + } + + writeShiftRegister(0); + +} + + +// Procedure to read from the AT28: +// Set OE low and WE high +// For each address, write the address, then read the data +void readEEPROM() +{ + Serial.println(""); + Serial.println("***** READ *****"); + // Now read each address value and print out. + // Set the AT28 for "READ", WE high, OE low + // Set the data pins for input + digitalWrite(AT28_CE_Pin, LOW); + digitalWrite(AT28_WE_Pin, HIGH); + digitalWrite(AT28_OE_Pin, LOW); + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + + for (int address=0; address < ADDRESS_MAX; address++) + { + writeShiftRegister(address); + int value = 0; + // the (9 - i) translates from bit # to pin # + for (int i=0; i <= 7; i++) { + if (digitalRead(9 - i)) value += (1 << i); + } + + printValue(address, value); + } + + writeShiftRegister(0); + Serial.println(""); +} + +// Initial setup of all of the AT28C16/C64 pins. +void setupAT28() +{ + + pinMode(SER_Pin, OUTPUT); + pinMode(STCP_Pin, OUTPUT); + pinMode(SHCP_Pin, OUTPUT); + + pinMode(AT28_CE_Pin, OUTPUT); + pinMode(AT28_WE_Pin, OUTPUT); + pinMode(AT28_OE_Pin, OUTPUT); + + // Disable the AT28 + digitalWrite(AT28_CE_Pin, HIGH); + digitalWrite(AT28_WE_Pin, HIGH); + digitalWrite(AT28_OE_Pin, HIGH); + + for (int i=2; i <= 9; i++) pinMode(i, INPUT); + + if (ADDRESS_MAX > 2048) + { + Serial.println("***** Is the switch in the UP position?! *****"); + } + else + { + Serial.println("***** Is the switch in the DOWN position?! *****"); + } + +} + diff --git a/at28c16.h b/at28c16.h new file mode 100644 index 0000000..b9da298 --- /dev/null +++ b/at28c16.h @@ -0,0 +1,136 @@ +// Use PROGMEM to put into Arduino flash memory +// APPLE II+/APPLE II+ - 341-0020 - APPLESOFT BASIC AUTOSTART MONITOR F800 - 2716.bin, created by applechargen.py +// Mon, 09 Jul 2018 22:23:48 +// #define __PROG_TYPES_COMPAT__ +// #include "avr/pgmspace.h" +#define ADDRESS_MAX 2048 +const unsigned char values[ADDRESS_MAX] PROGMEM = { +74,8,32,71,248,40,169,15,144,2,105,224,133,46,177,38, +69,48,37,46,81,38,145,38,96,32,0,248,196,44,176,17, +200,32,14,248,144,246,105,1,72,32,0,248,104,197,45,144, +245,96,160,47,208,2,160,39,132,45,160,39,169,0,133,48, +32,40,248,136,16,246,96,72,74,41,3,9,4,133,39,104, +41,24,144,2,105,127,133,38,10,10,5,38,133,38,96,165, +48,24,105,3,41,15,133,48,10,10,10,10,5,48,133,48, +96,74,8,32,71,248,177,38,40,144,4,74,74,74,74,41, +15,96,166,58,164,59,32,150,253,32,72,249,161,58,168,74, +144,9,106,176,16,201,162,240,12,41,135,74,170,189,98,249, +32,121,248,208,4,160,128,169,0,170,189,166,249,133,46,41, +3,133,47,152,41,143,170,152,160,3,224,138,240,11,74,144, +8,74,74,9,32,136,208,250,200,136,208,242,96,255,255,255, +32,130,248,72,177,58,32,218,253,162,1,32,74,249,196,47, +200,144,241,162,3,192,4,144,242,104,168,185,192,249,133,44, +185,0,250,133,45,169,0,160,5,6,45,38,44,42,136,208, +248,105,191,32,237,253,202,208,236,32,72,249,164,47,162,6, +224,3,240,28,6,46,144,14,189,179,249,32,237,253,189,185, +249,240,3,32,237,253,202,208,231,96,136,48,231,32,218,253, +165,46,201,232,177,58,144,242,32,86,249,170,232,208,1,200, +152,32,218,253,138,76,218,253,162,3,169,160,32,237,253,202, +208,248,96,56,165,47,164,59,170,16,1,136,101,58,144,1, +200,96,4,32,84,48,13,128,4,144,3,34,84,51,13,128, +4,144,4,32,84,51,13,128,4,144,4,32,84,59,13,128, +4,144,0,34,68,51,13,200,68,0,17,34,68,51,13,200, +68,169,1,34,68,51,13,128,4,144,1,34,68,51,13,128, +4,144,38,49,135,154,0,33,129,130,0,0,89,77,145,146, +134,74,133,157,172,169,172,163,168,164,217,0,216,164,164,0, +28,138,28,35,93,139,27,161,157,138,29,35,157,139,29,161, +0,41,25,174,105,168,25,35,36,83,27,35,36,83,25,161, +0,26,91,91,165,105,36,36,174,174,168,173,41,0,124,0, +21,156,109,156,165,105,41,83,132,19,52,17,165,105,35,160, +216,98,90,72,38,98,148,136,84,68,200,84,104,68,232,148, +0,180,8,132,116,180,40,110,116,244,204,74,114,242,164,138, +0,170,162,162,116,116,116,114,68,104,178,50,178,0,34,0, +26,26,38,38,114,114,136,200,196,202,38,72,68,68,162,200, +133,69,104,72,10,10,10,48,3,108,254,3,40,32,76,255, +104,133,58,104,133,59,108,240,3,32,130,248,32,218,250,76, +101,255,216,32,132,254,32,47,251,32,147,254,32,137,254,173, +88,192,173,90,192,173,93,192,173,95,192,173,255,207,44,16, +192,216,32,58,255,173,243,3,73,165,205,244,3,208,23,173, +242,3,208,15,169,224,205,243,3,208,8,160,3,140,242,3, +76,0,224,108,242,3,32,96,251,162,5,189,252,250,157,239, +3,202,208,247,169,200,134,0,133,1,160,7,198,1,165,1, +201,192,240,215,141,248,7,177,0,217,1,251,208,236,136,136, +16,245,108,0,0,234,234,32,142,253,169,69,133,64,169,0, +133,65,162,251,169,160,32,237,253,189,30,250,32,237,253,169, +189,32,237,253,181,74,32,218,253,232,48,232,96,89,250,0, +224,69,32,255,0,255,3,255,60,193,208,208,204,197,160,221, +219,196,194,193,255,195,255,255,255,193,216,217,208,211,173,112, +192,160,0,234,234,189,100,192,16,4,200,208,248,136,96,169, +0,133,72,173,86,192,173,84,192,173,81,192,169,0,240,11, +173,80,192,173,83,192,32,54,248,169,20,133,34,169,0,133, +32,169,40,133,33,169,24,133,35,169,23,133,37,76,34,252, +32,88,252,160,8,185,8,251,153,14,4,136,208,247,96,173, +243,3,73,165,141,244,3,96,201,141,208,24,172,0,192,16, +19,192,147,208,15,44,16,192,172,0,192,16,251,192,131,240, +3,44,16,192,76,253,251,56,76,44,252,168,185,72,250,32, +151,251,32,12,253,201,206,176,238,201,201,144,234,201,204,240, +230,208,232,234,41,127,201,32,208,2,9,64,96,234,234,234, +234,72,74,41,3,9,4,133,41,104,41,24,144,2,105,127, +133,40,10,10,5,40,133,40,96,201,135,208,18,169,64,32, +168,252,160,192,169,12,32,168,252,173,48,192,136,208,245,96, +164,36,145,40,230,36,165,36,197,33,176,102,96,201,160,176, +239,168,16,236,201,141,240,90,201,138,240,90,201,136,208,201, +198,36,16,232,165,33,133,36,198,36,165,34,197,37,176,11, +198,37,165,37,32,193,251,101,32,133,40,96,73,192,240,40, +105,253,144,192,240,218,105,253,144,44,240,222,105,253,144,92, +208,233,164,36,165,37,72,32,36,252,32,158,252,160,0,104, +105,0,197,35,144,240,176,202,165,34,133,37,160,0,132,36, +240,228,169,0,133,36,230,37,165,37,197,35,144,182,198,37, +165,34,72,32,36,252,165,40,133,42,165,41,133,43,164,33, +136,104,105,1,197,35,176,13,72,32,36,252,177,40,145,42, +136,16,249,48,225,160,0,32,158,252,176,134,164,36,169,160, +145,40,200,196,33,144,249,96,56,72,233,1,208,252,104,233, +1,208,246,96,230,66,208,2,230,67,165,60,197,62,165,61, +229,63,230,60,208,2,230,61,96,160,75,32,219,252,208,249, +105,254,176,245,160,33,32,219,252,200,200,136,208,253,144,5, +160,50,136,208,253,172,32,192,160,44,202,96,162,8,72,32, +250,252,104,42,160,58,202,208,245,96,32,253,252,136,173,96, +192,69,47,16,248,69,47,133,47,192,128,96,164,36,177,40, +72,32,180,251,234,145,40,104,108,56,0,230,78,208,2,230, +79,44,0,192,16,245,145,40,173,0,192,44,16,192,96,32, +12,253,32,165,251,32,12,253,201,155,240,243,96,165,50,72, +169,255,133,50,189,0,2,32,237,253,104,133,50,189,0,2, +201,136,240,29,201,152,240,10,224,248,144,3,32,58,255,232, +208,19,169,220,32,237,253,32,142,253,165,51,32,237,253,162, +1,138,240,243,202,32,53,253,201,149,208,2,177,40,201,224, +144,2,41,255,157,0,2,201,141,208,178,32,156,252,169,141, +208,91,164,61,166,60,32,142,253,32,64,249,160,0,169,173, +76,237,253,165,60,9,7,133,62,165,61,133,63,165,60,41, +7,208,3,32,146,253,169,160,32,237,253,177,60,32,218,253, +32,186,252,144,232,96,74,144,234,74,74,165,62,144,2,73, +255,101,60,72,169,189,32,237,253,104,72,74,74,74,74,32, +229,253,104,41,15,9,176,201,186,144,2,105,6,108,54,0, +201,160,144,2,37,50,132,53,72,32,120,251,104,164,53,96, +198,52,240,159,202,208,22,201,186,208,187,133,49,165,62,145, +64,230,64,208,2,230,65,96,164,52,185,255,1,133,49,96, +162,1,181,62,149,66,149,68,202,16,247,96,177,60,145,66, +32,180,252,144,247,96,177,60,209,66,240,28,32,146,253,177, +60,32,218,253,169,160,32,237,253,169,168,32,237,253,177,66, +32,218,253,169,169,32,237,253,32,180,252,144,217,96,32,117, +254,169,20,72,32,208,248,32,83,249,133,58,132,59,104,56, +233,1,208,239,96,138,240,7,181,60,149,58,202,16,249,96, +160,63,208,2,160,255,132,50,96,169,0,133,62,162,56,160, +27,208,8,169,0,133,62,162,54,160,240,165,62,41,15,240, +6,9,192,160,0,240,2,169,253,148,0,149,1,96,234,234, +76,0,224,76,3,224,32,117,254,32,63,255,108,58,0,76, +215,250,96,234,96,234,234,234,234,234,76,248,3,169,64,32, +201,252,160,39,162,0,65,60,72,161,60,32,237,254,32,186, +252,160,29,104,144,238,160,34,32,237,254,240,77,162,16,10, +32,214,252,208,250,96,32,0,254,104,104,208,108,32,250,252, +169,22,32,201,252,133,46,32,250,252,160,36,32,253,252,176, +249,32,253,252,160,59,32,236,252,129,60,69,46,133,46,32, +186,252,160,53,144,240,32,236,252,197,46,240,13,169,197,32, +237,253,169,210,32,237,253,32,237,253,169,135,76,237,253,165, +72,72,165,69,166,70,164,71,40,96,133,69,134,70,132,71, +8,104,133,72,186,134,73,216,96,32,132,254,32,47,251,32, +147,254,32,137,254,216,32,58,255,169,170,133,51,32,103,253, +32,199,255,32,167,255,132,52,160,23,136,48,232,217,204,255, +208,248,32,190,255,164,52,76,115,255,162,3,10,10,10,10, +10,38,62,38,63,202,16,248,165,49,208,6,181,63,149,61, +149,65,232,240,243,208,6,162,0,134,62,134,63,185,0,2, +200,73,176,201,10,144,211,105,136,201,250,176,205,96,169,254, +72,185,227,255,72,165,49,160,0,132,49,96,188,178,190,178, +239,196,178,169,187,166,164,6,149,7,2,5,240,0,235,147, +167,198,153,178,201,190,193,53,140,196,150,175,23,23,43,31, +131,127,93,204,181,252,23,23,245,3,251,3,98,250,64,250, +}; diff --git a/at28c64 Apple IIe CD ROM.h b/at28c64 Apple IIe CD ROM.h new file mode 100644 index 0000000..569bb5c --- /dev/null +++ b/at28c64 Apple IIe CD ROM.h @@ -0,0 +1,520 @@ +// Use PROGMEM to put into Arduino flash memory +// Apple IIe CD Enhanced - 342-0304-A - 2764.bin, created by applechargen.py +// Sat, 20 Jan 2018 11:23:14 +// #define __PROG_TYPES_COMPAT__ +// #include "avr/pgmspace.h" +#define ADDRESS_MAX 8192 +const unsigned char values[ADDRESS_MAX] PROGMEM = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +76,19,194,164,36,165,37,72,32,3,206,32,244,193,160,0, +104,105,0,197,35,144,240,176,52,165,34,133,37,160,0,132, +36,240,228,165,34,72,32,3,206,165,40,133,42,165,41,133, +43,164,33,136,104,105,1,197,35,176,13,72,32,3,206,177, +40,145,42,136,16,249,48,225,160,0,32,244,193,165,37,76, +3,206,169,40,133,33,169,24,133,35,169,23,133,37,208,239, +164,42,76,244,193,76,235,203,76,154,204,164,42,76,157,204, +76,116,204,76,160,194,76,176,194,76,242,194,32,144,204,173, +123,5,133,36,141,123,4,76,254,205,180,0,240,15,192,27, +240,14,32,128,205,180,0,240,4,169,253,149,1,181,1,96, +165,55,201,195,208,243,76,50,200,164,36,177,40,72,41,63, +9,64,145,40,104,96,168,165,40,32,186,202,144,76,32,20, +206,160,3,217,238,194,208,3,185,164,201,136,16,245,48,58, +32,112,200,76,10,194,138,41,3,133,47,165,42,41,143,76, +113,202,32,240,252,138,133,52,96,172,123,5,32,68,206,9, +128,96,164,36,169,160,44,30,192,16,6,36,50,48,2,169, +32,76,168,204,168,165,40,32,3,206,40,48,3,76,197,254, +76,200,254,136,48,186,136,48,165,136,48,154,136,48,61,136, +48,226,169,194,72,169,9,72,173,251,4,41,214,208,13,152, +24,105,12,72,32,80,200,32,254,205,104,168,169,193,72,185, +68,194,72,96,24,34,241,95,117,2,168,81,225,148,232,213, +123,100,103,106,117,111,120,114,225,137,232,213,44,31,192,16, +6,32,116,200,76,10,194,168,138,72,152,72,72,104,201,255, +240,4,169,255,208,2,104,72,72,164,36,145,40,230,78,208, +10,165,79,230,79,69,79,41,64,208,226,173,0,192,16,237, +104,104,164,36,145,40,104,170,173,0,192,141,16,192,48,196, +32,82,193,44,31,192,16,2,6,33,165,37,141,251,5,96, +169,255,141,251,4,173,93,192,173,95,192,173,98,192,16,3, +76,0,198,173,97,192,16,26,160,176,169,0,133,60,169,191, +56,133,61,72,169,160,145,60,136,145,60,104,233,1,201,1, +208,239,141,11,192,32,137,202,208,3,141,10,192,96,136,149, +138,139,164,36,177,40,44,31,192,48,242,76,38,206,0,0, +44,67,206,112,18,56,144,24,184,80,12,1,136,74,80,86, +92,76,118,195,76,195,195,141,123,6,152,72,138,72,8,173, +251,4,44,248,7,48,5,9,8,141,251,4,32,109,195,40, +112,21,144,16,170,16,13,32,91,205,104,170,104,168,173,123, +6,108,56,0,76,124,200,76,3,200,32,109,195,76,180,201, +32,109,195,76,214,201,32,109,195,76,240,201,170,240,8,202, +208,7,44,0,192,16,4,56,96,162,3,24,96,162,195,142, +248,7,174,255,207,96,72,152,72,173,19,192,72,173,20,192, +72,144,8,141,2,192,141,5,192,176,6,141,4,192,141,3, +192,160,0,177,60,145,66,230,66,208,2,230,67,165,60,197, +62,165,61,229,63,230,60,208,2,230,61,144,230,141,4,192, +104,16,3,141,5,192,141,2,192,104,16,3,141,3,192,104, +168,104,96,72,173,237,3,72,173,238,3,72,144,8,141,3, +192,141,5,192,176,6,141,2,192,141,4,192,104,141,238,3, +104,141,237,3,104,112,5,141,8,192,80,3,141,9,192,108, +237,3,0,0,141,129,192,76,122,252,44,21,192,141,7,192, +216,56,48,1,24,72,72,72,138,186,232,232,232,232,72,152, +72,189,0,1,41,16,168,173,24,192,45,28,192,41,128,240, +5,169,32,141,84,192,42,44,19,192,16,5,141,2,192,9, +32,44,20,192,16,5,141,4,192,9,16,44,18,192,16,12, +9,12,44,17,192,16,2,73,6,141,129,192,44,22,192,16, +13,186,142,1,1,174,0,1,154,141,8,192,9,128,136,48, +12,133,68,104,168,104,170,104,104,104,76,71,250,72,173,248, +7,72,169,195,72,169,244,72,8,76,116,252,173,129,192,104, +16,7,141,9,192,174,1,1,154,160,6,16,6,190,193,196, +254,0,192,136,48,3,10,208,242,10,10,104,168,186,169,64, +72,169,192,72,169,6,105,0,72,169,141,72,154,138,105,3, +170,56,233,7,157,0,1,232,169,1,157,0,1,104,170,104, +96,131,139,139,5,3,85,0,32,19,255,132,52,221,180,249, +208,19,32,19,255,221,186,249,240,13,189,186,249,240,7,201, +164,240,3,164,52,24,136,38,68,224,3,208,13,32,167,255, +165,63,240,1,232,134,53,162,3,136,134,61,202,16,201,96, +144,72,169,0,133,61,133,63,160,80,132,60,200,132,62,32, +209,197,24,165,115,170,202,134,62,229,80,72,165,116,168,232, +208,1,136,132,63,229,81,197,110,144,2,208,2,56,96,133, +116,133,112,133,61,133,233,104,133,232,133,115,133,111,133,60, +32,152,197,169,3,32,214,197,24,96,165,155,101,80,133,62, +165,156,101,81,133,63,160,4,177,155,32,239,224,165,148,133, +60,165,149,133,61,24,96,160,75,32,121,197,208,249,105,254, +176,245,160,33,32,121,197,200,200,136,208,253,144,5,160,50, +136,208,253,172,32,192,160,44,202,96,162,8,72,32,152,197, +104,42,160,58,202,208,245,96,32,155,197,136,173,96,192,69, +47,16,248,69,47,133,47,192,128,96,32,103,197,160,39,162, +0,65,60,72,161,60,32,200,197,32,186,252,160,29,104,144, +238,160,34,32,200,197,240,8,162,16,10,32,116,197,208,250, +96,32,152,197,169,22,32,103,197,133,46,32,152,197,160,36, +32,155,197,176,249,32,155,197,160,59,32,138,197,129,60,69, +46,133,46,32,186,252,160,53,144,240,32,138,197,197,46,96, +141,80,192,160,4,162,0,24,121,180,199,149,0,232,208,247, +24,121,180,199,213,0,208,16,232,208,245,106,44,25,192,16, +2,73,165,136,16,225,48,6,85,0,24,76,205,198,134,1, +134,2,134,3,162,4,134,4,230,1,168,141,131,192,141,131, +192,165,1,41,240,201,192,208,12,173,139,192,173,139,192,165, +1,105,15,208,2,165,1,133,3,152,160,0,24,125,180,199, +145,2,202,16,2,162,4,200,208,242,230,1,208,204,230,1, +168,173,131,192,173,131,192,165,1,41,240,201,192,208,9,173, +139,192,165,1,105,15,208,2,165,1,133,3,152,160,0,24, +125,180,199,81,2,208,53,177,2,202,16,2,162,4,200,208, +238,230,1,208,203,106,44,25,192,16,2,73,165,198,4,16, +135,170,32,141,201,208,7,14,0,12,10,205,0,12,208,118, +205,0,8,240,113,138,141,9,192,76,3,198,56,170,173,19, +192,184,16,3,44,180,199,169,160,160,6,153,254,191,153,6, +192,136,136,208,246,141,81,192,141,84,192,153,0,4,153,0, +5,153,0,6,153,0,7,200,208,241,138,240,39,160,3,176, +2,160,5,169,170,80,3,141,176,5,185,234,199,153,177,5, +136,16,247,160,16,138,74,170,169,88,42,153,182,5,136,136, +208,243,240,254,160,2,185,240,199,144,3,185,243,199,153,184, +5,136,16,242,48,254,160,1,169,127,106,190,185,199,240,15, +144,3,190,201,199,157,255,191,200,208,239,174,48,192,42,136, +190,217,199,240,19,48,244,42,144,7,30,0,192,144,23,176, +238,30,0,192,176,16,144,231,42,200,56,233,1,176,203,136, +208,11,160,9,208,194,162,0,192,10,76,215,198,70,128,208, +181,169,160,160,0,153,0,4,153,0,5,153,0,6,153,0, +7,200,208,241,173,97,192,45,98,192,10,230,255,165,255,144, +3,76,0,198,173,81,192,160,8,185,246,199,153,184,5,136, +16,247,48,224,83,67,43,41,7,0,137,49,3,5,9,11, +1,0,131,81,83,85,87,15,13,0,129,49,4,6,10,12, +2,0,132,82,84,86,88,16,14,0,17,255,19,20,22,23, +24,0,18,26,27,28,29,30,31,0,210,193,205,160,218,208, +205,205,213,201,207,213,211,249,243,244,229,237,160,207,203,0, +76,176,201,32,244,206,32,42,200,32,46,205,169,1,141,251, +4,32,144,202,208,8,6,33,141,1,192,141,13,192,141,15, +192,32,144,204,172,123,5,76,126,200,169,7,133,54,169,195, +133,55,169,5,133,56,169,195,133,57,96,230,78,208,2,230, +79,173,0,192,16,245,141,16,192,96,0,0,0,76,80,195, +165,37,141,251,5,164,36,204,123,4,240,3,140,123,5,165, +33,24,237,123,5,176,5,160,0,140,123,5,172,123,5,96, +164,53,24,176,56,141,123,6,152,72,138,72,176,94,32,80, +200,173,123,6,201,141,208,24,174,0,192,16,19,224,147,208, +15,44,16,192,174,0,192,16,251,224,131,240,3,44,16,192, +41,127,201,32,176,6,32,210,202,76,189,200,173,123,6,32, +56,206,200,140,123,5,196,33,144,3,32,81,203,173,251,4, +41,247,141,251,4,173,123,5,44,31,192,16,2,169,0,133, +36,141,123,4,104,170,104,168,173,123,6,96,164,36,173,123, +6,145,40,32,80,200,32,38,206,32,59,200,141,123,6,32, +38,206,168,173,251,4,41,8,240,203,192,141,208,8,173,251, +4,41,247,141,251,4,192,155,240,17,192,149,208,183,172,123, +5,32,68,206,9,128,141,123,6,208,170,32,177,206,32,59, +200,32,196,206,32,20,206,41,127,160,16,217,124,201,240,5, +136,16,248,48,15,185,107,201,41,127,32,214,202,185,107,201, +48,217,16,162,168,173,251,4,192,17,208,11,32,77,205,169, +152,141,123,6,76,197,200,192,5,208,8,41,223,141,251,4, +76,230,200,192,4,208,249,9,32,208,242,12,28,8,10,31, +29,11,159,136,156,138,17,18,136,138,159,156,64,65,66,67, +68,69,70,73,74,75,77,52,56,8,10,11,21,44,19,192, +48,17,169,238,141,5,192,141,3,192,141,0,12,141,0,8, +205,0,12,96,202,203,205,201,0,0,173,123,6,76,86,195, +169,131,208,2,169,129,72,32,144,202,240,4,104,162,9,96, +104,141,251,4,141,1,192,141,13,192,141,15,192,32,212,206, +32,144,204,76,31,202,32,212,206,32,59,200,41,127,141,123, +6,162,0,173,251,4,41,2,240,2,162,195,173,123,6,96, +41,127,170,32,212,206,169,8,44,251,4,208,50,138,44,46, +202,240,80,172,123,5,36,50,16,2,9,128,32,112,206,200, +140,123,5,196,33,144,8,169,0,141,123,5,32,216,203,165, +40,141,123,7,165,41,141,251,7,32,31,206,162,0,96,32, +31,206,138,56,233,32,44,251,6,48,48,141,251,5,133,37, +32,186,202,173,251,6,141,123,5,169,247,45,251,4,141,251, +4,208,204,32,31,206,138,201,30,240,6,32,214,202,76,31, +202,169,8,13,251,4,141,251,4,169,255,141,251,6,76,41, +202,170,165,42,160,3,224,138,240,11,74,144,8,74,74,9, +32,136,208,250,200,136,208,242,96,32,183,248,208,2,200,96, +173,28,192,10,169,136,44,24,192,141,1,192,8,141,85,192, +172,0,4,141,0,4,173,0,4,140,0,4,40,176,3,141, +84,192,48,3,141,0,192,201,136,96,72,74,41,3,9,4, +133,41,104,41,24,144,2,105,127,133,40,10,10,5,40,133, +40,96,44,6,203,80,184,141,123,7,72,152,72,172,123,7, +192,5,144,19,185,180,203,240,14,80,18,48,16,141,123,7, +173,251,4,41,40,240,3,56,176,9,173,123,7,9,128,32, +7,203,24,104,168,104,96,72,185,153,203,72,96,173,251,4, +16,5,41,239,141,251,4,96,173,251,4,16,250,9,16,208, +243,169,64,32,52,203,160,192,169,12,32,52,203,173,48,192, +136,208,245,96,56,72,233,1,208,252,104,233,1,208,246,96, +206,123,5,16,11,165,33,141,123,5,206,123,5,32,121,203, +96,169,0,141,123,5,173,251,4,48,3,32,216,203,96,165, +34,133,37,169,0,141,123,5,76,254,205,238,123,5,173,123, +5,197,33,144,3,32,81,203,96,165,34,197,37,176,30,198, +37,76,254,205,173,251,4,16,2,41,251,160,255,208,9,173, +251,4,16,2,9,4,160,127,141,251,4,132,50,96,12,23, +32,63,0,215,115,143,80,131,142,0,233,251,0,0,76,211, +234,60,94,149,67,106,153,0,120,75,75,203,203,0,203,76, +76,203,75,75,0,76,76,0,0,77,75,75,77,75,76,77, +75,76,0,75,160,0,240,21,230,37,165,37,141,251,5,197, +35,176,3,76,3,206,206,251,5,198,37,160,1,138,72,140, +123,7,165,33,72,44,31,192,16,28,141,1,192,74,170,165, +32,74,184,144,3,44,6,203,42,69,33,74,112,3,176,1, +202,134,33,173,31,192,8,166,34,152,208,3,166,35,202,138, +32,3,206,165,40,133,42,165,41,133,43,173,123,7,240,50, +232,228,35,176,50,138,32,3,206,164,33,40,8,16,30,173, +85,192,152,240,7,177,40,145,42,136,208,249,112,4,177,40, +145,42,173,84,192,164,33,176,4,177,40,145,42,136,16,249, +48,193,202,228,34,16,206,40,104,133,33,32,150,204,32,254, +205,104,170,96,32,154,204,165,37,72,16,6,32,3,206,32, +150,204,230,37,165,37,197,35,144,242,104,133,37,76,254,205, +32,95,203,76,116,204,160,0,240,3,172,123,5,165,50,41, +128,9,32,44,31,192,48,21,145,40,200,196,33,144,249,96, +134,42,162,216,160,20,165,50,41,160,76,213,204,134,42,72, +152,72,56,229,33,170,152,74,168,104,69,32,106,176,3,16, +1,200,104,176,11,44,85,192,145,40,44,84,192,232,240,6, +145,40,200,232,208,239,166,42,56,96,173,251,4,48,77,32, +49,205,44,31,192,16,18,32,145,205,144,13,32,144,202,208, +59,44,31,192,48,3,32,196,205,173,123,5,24,101,32,44, +31,192,48,6,201,40,144,2,169,39,141,123,5,133,36,165, +37,32,186,202,44,31,192,16,5,32,113,205,240,3,32,109, +205,169,0,44,26,192,48,2,169,20,133,34,96,173,251,4, +9,1,208,5,173,251,4,41,254,141,251,4,96,173,251,4, +48,26,32,46,205,32,128,205,32,100,205,169,253,133,57,169, +27,133,56,96,169,253,133,55,169,240,133,54,96,169,40,208, +2,169,80,133,33,169,24,133,35,169,0,133,34,133,32,96, +44,31,192,16,3,32,239,204,141,14,192,169,255,141,251,4, +96,138,72,162,23,141,1,192,138,32,186,202,160,39,132,42, +152,74,176,3,44,85,192,168,177,40,44,84,192,164,42,145, +40,136,16,234,202,48,4,228,34,176,221,141,0,192,141,12, +192,76,248,205,138,72,162,23,138,32,186,202,160,0,141,1, +192,177,40,132,42,72,152,74,176,3,141,85,192,168,104,145, +40,141,84,192,164,42,200,192,40,144,230,32,176,204,202,48, +4,228,34,176,211,141,13,192,32,254,205,104,170,96,165,37, +141,251,5,32,186,202,165,32,44,31,192,16,1,74,24,101, +40,133,40,96,201,225,144,6,201,251,176,2,41,223,96,173, +251,4,41,16,208,17,72,152,72,172,123,5,32,68,206,73, +128,32,112,206,104,168,104,96,72,36,50,48,2,41,127,32, +112,206,104,96,177,40,44,31,192,16,25,141,1,192,132,42, +152,69,32,106,176,4,173,85,192,200,152,74,168,177,40,44, +84,192,164,42,44,30,192,16,6,201,32,176,2,9,64,96, +72,41,255,48,22,173,251,4,106,104,72,144,14,44,30,192, +16,9,73,64,44,172,206,240,2,73,64,44,31,192,16,29, +141,1,192,72,132,42,152,69,32,74,176,4,173,85,192,200, +152,74,168,104,145,40,173,84,192,164,42,104,96,145,40,104, +96,72,152,72,172,123,5,32,68,206,141,123,6,41,128,73, +171,76,205,206,72,152,72,172,123,5,173,123,6,32,112,206, +104,168,104,96,32,113,205,169,255,133,50,173,251,4,41,4, +240,2,70,50,173,123,7,133,40,173,251,7,133,41,173,251, +5,133,37,96,44,18,192,16,61,169,6,205,179,251,240,54, +162,3,44,17,192,48,2,162,11,141,179,251,44,128,192,173, +179,251,201,6,240,1,232,44,129,192,44,129,192,160,0,169, +248,133,55,132,54,177,54,145,54,200,208,249,230,55,208,245, +189,128,192,189,128,192,96,0,0,0,233,129,74,208,20,164, +63,166,62,208,1,136,202,138,24,229,58,133,62,16,1,200, +152,229,59,208,64,164,47,185,61,0,145,58,136,16,248,32, +72,249,32,26,252,32,26,252,76,227,252,165,61,32,142,248, +170,189,0,250,197,66,208,19,189,192,249,197,67,208,12,165, +68,164,46,192,157,240,179,197,46,240,202,198,61,208,220,230, +68,198,53,240,214,164,52,152,170,76,210,252,32,199,255,173, +0,2,201,160,240,18,201,141,208,1,96,32,167,255,201,147, +208,229,138,240,226,32,120,254,169,3,133,61,32,19,255,10, +233,190,201,194,144,209,10,10,162,4,10,38,66,38,67,202, +16,248,198,61,240,244,16,228,162,5,32,200,196,165,68,10, +10,5,53,201,32,176,6,166,53,240,2,9,128,133,68,132, +52,185,0,2,201,187,240,4,201,141,208,180,76,107,207,223, +111,216,101,215,248,220,148,217,177,219,48,243,216,223,225,219, +143,243,152,243,228,241,221,241,212,241,36,242,49,242,64,242, +215,243,225,243,232,246,253,246,104,247,110,247,230,247,87,252, +32,247,38,247,116,247,108,242,110,242,114,242,118,242,127,242, +78,242,106,217,85,242,133,242,165,242,202,242,23,243,187,243, +158,243,97,242,69,218,61,217,17,217,200,217,72,216,244,3, +32,217,106,217,219,217,109,216,235,217,131,231,200,216,175,216, +18,227,122,231,212,218,149,216,164,214,105,214,159,219,72,214, +144,235,35,236,175,235,10,0,222,226,18,212,205,223,255,226, +141,238,174,239,65,233,9,239,234,239,241,239,58,240,158,240, +100,231,214,230,197,227,7,231,229,230,70,230,90,230,134,230, +145,230,121,192,231,121,169,231,123,129,233,123,104,234,125,150, +238,80,84,223,70,78,223,127,207,238,127,151,222,100,100,223, +69,78,196,70,79,210,78,69,88,212,68,65,84,193,73,78, +80,85,212,68,69,204,68,73,205,82,69,65,196,71,210,84, +69,88,212,80,82,163,73,78,163,67,65,76,204,80,76,79, +212,72,76,73,206,86,76,73,206,72,71,82,178,72,71,210, +72,67,79,76,79,82,189,72,80,76,79,212,68,82,65,215, +88,68,82,65,215,72,84,65,194,72,79,77,197,82,79,84, +189,83,67,65,76,69,189,83,72,76,79,65,196,84,82,65, +67,197,78,79,84,82,65,67,197,78,79,82,77,65,204,73, +78,86,69,82,83,197,70,76,65,83,200,67,79,76,79,82, +189,80,79,208,86,84,65,194,72,73,77,69,77,186,76,79, +77,69,77,186,79,78,69,82,210,82,69,83,85,77,197,82, +69,67,65,76,204,83,84,79,82,197,83,80,69,69,68,189, +76,69,212,71,79,84,207,82,85,206,73,198,82,69,83,84, +79,82,197,166,71,79,83,85,194,82,69,84,85,82,206,82, +69,205,83,84,79,208,79,206,87,65,73,212,76,79,65,196, +83,65,86,197,68,69,198,80,79,75,197,80,82,73,78,212, +67,79,78,212,76,73,83,212,67,76,69,65,210,71,69,212, +78,69,215,84,65,66,168,84,207,70,206,83,80,67,168,84, +72,69,206,65,212,78,79,212,83,84,69,208,171,173,170,175, +222,65,78,196,79,210,190,189,188,83,71,206,73,78,212,65, +66,211,85,83,210,70,82,197,83,67,82,78,168,80,68,204, +80,79,211,83,81,210,82,78,196,76,79,199,69,88,208,67, +79,211,83,73,206,84,65,206,65,84,206,80,69,69,203,76, +69,206,83,84,82,164,86,65,204,65,83,195,67,72,82,164, +76,69,70,84,164,82,73,71,72,84,164,77,73,68,164,0, +78,69,88,84,32,87,73,84,72,79,85,84,32,70,79,210, +83,89,78,84,65,216,82,69,84,85,82,78,32,87,73,84, +72,79,85,84,32,71,79,83,85,194,79,85,84,32,79,70, +32,68,65,84,193,73,76,76,69,71,65,76,32,81,85,65, +78,84,73,84,217,79,86,69,82,70,76,79,215,79,85,84, +32,79,70,32,77,69,77,79,82,217,85,78,68,69,70,39, +68,32,83,84,65,84,69,77,69,78,212,66,65,68,32,83, +85,66,83,67,82,73,80,212,82,69,68,73,77,39,68,32, +65,82,82,65,217,68,73,86,73,83,73,79,78,32,66,89, +32,90,69,82,207,73,76,76,69,71,65,76,32,68,73,82, +69,67,212,84,89,80,69,32,77,73,83,77,65,84,67,200, +83,84,82,73,78,71,32,84,79,79,32,76,79,78,199,70, +79,82,77,85,76,65,32,84,79,79,32,67,79,77,80,76, +69,216,67,65,78,39,84,32,67,79,78,84,73,78,85,197, +85,78,68,69,70,39,68,32,70,85,78,67,84,73,79,206, +32,69,82,82,79,82,7,0,32,73,78,32,0,13,66,82, +69,65,75,7,0,186,232,232,232,232,189,1,1,201,129,208, +33,165,134,208,10,189,2,1,133,133,189,3,1,133,134,221, +3,1,208,7,165,133,221,2,1,240,7,138,24,105,18,170, +208,216,96,32,227,211,133,109,132,110,56,165,150,229,155,133, +94,168,165,151,229,156,170,232,152,240,35,165,150,56,229,94, +133,150,176,3,198,151,56,165,148,229,94,133,148,176,8,198, +149,144,4,177,150,145,148,136,208,249,177,150,145,148,198,151, +198,149,202,208,242,96,10,105,54,176,53,133,94,186,228,94, +144,46,96,196,112,144,40,208,4,197,111,144,34,72,162,9, +152,72,181,147,202,16,250,32,132,228,162,247,104,149,157,232, +48,250,104,168,104,196,112,144,6,208,5,197,111,176,1,96, +162,77,36,216,16,3,76,233,242,32,251,218,32,90,219,189, +96,210,72,32,92,219,232,104,16,245,32,131,214,169,80,160, +211,32,58,219,164,118,200,240,3,32,25,237,32,251,218,162, +221,32,46,213,134,184,132,185,70,216,32,177,0,170,240,236, +162,255,134,118,144,6,32,89,213,76,5,216,166,175,134,105, +166,176,134,106,32,12,218,32,89,213,132,15,32,26,214,144, +68,160,1,177,155,133,95,165,105,133,94,165,156,133,97,165, +155,136,241,155,24,101,105,133,105,133,96,165,106,105,255,133, +106,229,156,170,56,165,155,229,105,168,176,3,232,198,97,24, +101,94,144,3,198,95,24,177,94,145,96,200,208,249,230,95, +230,97,202,208,242,173,0,2,240,56,165,115,164,116,133,111, +132,112,165,105,133,150,101,15,133,148,164,106,132,151,144,1, +200,132,149,32,147,211,165,80,164,81,141,254,1,140,255,1, +165,109,164,110,133,105,132,106,164,15,185,251,1,136,145,155, +208,248,32,101,214,165,103,164,104,133,94,132,95,24,160,1, +177,94,208,11,165,105,133,175,165,106,133,176,76,60,212,160, +4,200,177,94,208,251,200,152,101,94,170,160,0,145,94,165, +95,105,0,200,145,94,134,94,133,95,144,210,162,128,134,51, +32,106,253,224,239,144,2,162,239,169,0,157,0,2,138,240, +11,189,255,1,41,127,157,255,1,202,208,245,169,0,162,255, +160,1,96,32,12,253,41,127,96,166,184,202,160,4,132,19, +36,214,16,8,104,104,32,101,214,76,210,215,232,32,140,247, +36,19,112,4,201,32,240,244,133,14,201,34,240,116,112,77, +201,63,208,4,169,186,208,69,201,48,144,4,201,60,144,61, +132,173,169,208,133,157,169,207,133,158,160,0,132,15,136,134, +184,202,200,208,2,230,158,232,32,140,247,201,32,240,248,56, +241,157,240,238,201,128,208,65,5,15,201,197,208,13,32,135, +247,201,78,240,52,201,79,240,48,169,197,164,173,232,200,153, +251,1,185,251,1,240,57,56,233,58,240,4,201,73,208,2, +133,19,56,233,120,208,134,133,14,32,140,247,240,223,197,14, +240,219,200,153,251,1,232,208,240,166,184,230,15,177,157,200, +208,2,230,158,10,144,246,177,157,208,157,32,154,247,16,187, +153,253,1,198,185,169,255,133,184,96,165,103,166,104,160,1, +133,155,134,156,177,155,240,31,200,200,165,81,209,155,144,24, +240,3,136,208,9,165,80,136,209,155,144,12,240,10,136,177, +155,170,136,177,155,176,215,24,96,208,253,169,0,133,214,168, +145,103,200,145,103,165,103,105,2,133,105,133,175,165,104,105, +0,133,106,133,176,32,151,214,169,0,208,42,165,115,164,116, +133,111,132,112,165,105,164,106,133,107,132,108,133,109,132,110, +32,73,216,162,85,134,82,104,168,104,162,248,154,72,152,72, +169,0,133,122,133,20,96,24,165,103,105,255,133,184,165,104, +105,255,133,185,96,144,10,240,8,201,201,240,4,201,44,208, +229,32,12,218,32,26,214,32,183,0,240,16,201,201,240,4, +201,44,208,132,32,177,0,32,12,218,208,202,104,104,165,80, +5,81,208,6,169,255,133,80,133,81,160,1,177,155,240,68, +32,88,216,32,251,218,200,177,155,170,200,177,155,197,81,208, +4,228,80,240,2,176,45,132,133,32,170,247,169,32,164,133, +41,127,32,92,219,32,180,247,234,144,7,32,251,218,169,5, +133,36,200,177,155,208,29,168,177,155,170,200,177,155,134,155, +133,156,208,182,169,13,32,92,219,76,210,215,200,208,2,230, +158,177,157,96,16,204,56,233,127,170,132,133,160,208,132,157, +160,207,132,158,160,255,202,240,7,32,44,215,16,251,48,246, +169,32,32,92,219,32,44,215,48,5,32,92,219,208,246,32, +92,219,169,32,208,152,169,128,133,20,32,70,218,32,101,211, +208,5,138,105,15,170,154,104,104,169,9,32,214,211,32,163, +217,24,152,101,184,72,165,185,105,0,72,165,118,72,165,117, +72,169,193,32,192,222,32,106,221,32,103,221,165,162,9,127, +37,158,133,158,169,175,160,215,133,94,132,95,76,32,222,169, +19,160,233,32,249,234,32,183,0,201,199,208,6,32,177,0, +32,103,221,32,130,235,32,21,222,165,134,72,165,133,72,169, +129,72,186,134,248,32,88,216,165,184,164,185,166,118,232,240, +4,133,121,132,122,160,0,177,184,208,87,160,2,177,184,24, +240,52,200,177,184,133,117,200,177,184,133,118,152,101,184,133, +184,144,2,230,185,36,242,16,20,166,118,232,240,15,169,35, +32,92,219,166,117,165,118,32,36,237,32,87,219,32,177,0, +32,40,216,76,210,215,240,98,240,45,233,128,144,17,201,64, +176,20,10,168,185,1,208,72,185,0,208,72,76,177,0,76, +70,218,201,58,240,191,76,201,222,56,165,103,233,1,164,104, +176,1,136,133,125,132,126,96,173,0,192,201,131,240,1,96, +32,83,213,162,255,36,216,16,3,76,233,242,201,3,176,1, +24,208,60,165,184,164,185,166,118,232,240,12,133,121,132,122, +165,117,164,118,133,119,132,120,104,104,169,93,160,211,144,3, +76,49,212,76,60,212,208,23,162,210,164,122,208,3,76,18, +212,165,121,133,184,132,185,165,119,164,120,133,117,132,118,96, +56,165,175,229,103,133,80,165,176,229,104,133,81,32,240,216, +32,205,254,32,1,217,76,205,254,32,240,216,32,253,254,24, +165,103,101,80,133,105,165,104,101,81,133,106,165,82,133,214, +32,1,217,32,253,254,36,214,16,3,76,101,214,76,242,212, +169,80,160,0,133,60,132,61,169,82,133,62,132,63,132,214, +96,165,103,164,104,133,60,132,61,165,105,164,106,133,62,132, +63,96,8,198,118,40,208,3,76,101,214,32,108,214,76,53, +217,169,3,32,214,211,165,185,72,165,184,72,165,118,72,165, +117,72,169,176,72,32,183,0,32,62,217,76,210,215,32,12, +218,32,166,217,165,118,197,81,176,11,152,56,101,184,166,185, +144,7,232,176,4,165,103,166,104,32,30,214,144,30,165,155, +233,1,133,184,165,156,233,0,133,185,96,208,253,169,255,133, +133,32,101,211,154,201,176,240,11,162,22,44,162,90,76,18, +212,76,201,222,104,104,192,66,240,59,133,117,104,133,118,104, +133,184,104,133,185,32,163,217,152,24,101,184,133,184,144,2, +230,185,96,162,58,44,162,0,134,13,160,0,132,14,165,14, +166,13,133,13,134,14,177,184,240,232,197,14,240,228,200,201, +34,208,243,240,233,104,104,104,96,32,123,221,32,183,0,201, +171,240,5,169,196,32,192,222,165,157,208,5,32,166,217,240, +183,32,183,0,176,3,76,62,217,76,40,216,32,248,230,72, +201,176,240,4,201,171,208,137,198,161,208,4,104,76,42,216, +32,177,0,32,12,218,201,44,240,238,104,96,162,0,134,80, +134,81,176,247,233,47,133,13,165,81,133,94,201,25,176,212, +165,80,10,38,94,10,38,94,101,80,133,80,165,94,101,81, +133,81,6,80,38,81,165,80,101,13,133,80,144,2,230,81, +32,177,0,76,18,218,32,227,223,133,133,132,134,169,208,32, +192,222,165,18,72,165,17,72,32,123,221,104,42,32,109,221, +208,24,104,16,18,32,114,235,32,12,225,160,0,165,160,145, +133,200,165,161,145,133,96,76,39,235,104,160,2,177,160,197, +112,144,23,208,7,136,177,160,197,111,144,14,164,161,196,106, +144,8,208,13,165,160,197,105,176,7,165,160,164,161,76,183, +218,160,0,177,160,32,213,227,165,140,164,141,133,171,132,172, +32,212,229,169,157,160,0,133,140,132,141,32,53,230,160,0, +177,140,145,133,200,177,140,145,133,200,177,140,145,133,96,32, +61,219,32,183,0,240,36,240,41,201,192,240,60,201,195,24, +240,55,201,44,24,240,28,201,59,240,68,32,123,221,36,17, +48,221,32,52,237,32,231,227,76,207,218,169,13,32,92,219, +73,255,96,32,180,247,48,9,201,24,144,5,32,251,218,208, +30,105,16,41,240,170,56,176,12,8,32,245,230,201,41,208, +98,40,144,7,202,32,195,247,144,5,170,232,202,208,6,32, +177,0,76,215,218,32,87,219,208,242,32,231,227,32,0,230, +170,160,0,232,202,240,187,177,94,32,92,219,200,201,13,208, +243,32,0,219,76,68,219,169,32,44,169,63,9,128,201,160, +144,2,5,243,32,237,253,41,127,72,165,241,32,168,252,104, +96,165,21,240,18,48,4,160,255,208,4,165,123,164,124,133, +117,132,118,76,201,222,104,36,216,16,5,162,254,76,233,242, +169,239,160,220,32,58,219,165,121,164,122,133,184,132,185,96, +32,6,227,162,1,160,2,169,0,141,1,2,169,64,32,235, +219,96,201,34,208,14,32,129,222,169,59,32,192,222,32,61, +219,76,199,219,32,90,219,32,6,227,169,44,141,255,1,32, +44,213,173,0,2,201,3,208,16,76,99,216,32,90,219,76, +44,213,166,125,164,126,169,152,44,169,0,133,21,134,127,132, +128,32,227,223,133,133,132,134,165,184,164,185,133,135,132,136, +166,127,164,128,134,184,132,185,32,183,0,208,30,36,21,80, +14,32,12,253,41,127,141,0,2,162,255,160,1,208,8,48, +127,32,90,219,32,220,219,134,184,132,185,32,177,0,36,17, +16,49,36,21,80,9,232,134,184,169,0,133,13,240,12,133, +13,201,34,240,7,169,58,133,13,169,44,24,133,14,165,184, +164,185,105,0,144,1,200,32,237,227,32,61,231,32,123,218, +76,114,220,72,173,0,2,240,48,104,32,74,236,165,18,32, +99,218,32,183,0,240,7,201,44,240,3,76,113,219,165,184, +164,185,133,127,132,128,165,135,164,136,133,184,132,185,32,183, +0,240,51,32,190,222,76,241,219,165,21,208,204,76,134,219, +32,163,217,200,170,208,18,162,42,200,177,184,240,95,200,177, +184,133,123,200,177,184,200,133,124,177,184,170,32,152,217,224, +131,208,221,76,43,220,165,127,164,128,166,21,16,3,76,83, +216,160,0,177,127,240,7,169,223,160,220,76,58,219,96,63, +69,88,84,82,65,32,73,71,78,79,82,69,68,13,0,63, +82,69,69,78,84,69,82,13,0,208,4,160,0,240,3,32, +227,223,133,133,132,134,32,101,211,240,4,162,0,240,105,154, +232,232,232,232,138,232,232,232,232,232,232,134,96,160,1,32, +249,234,186,189,9,1,133,162,165,133,164,134,32,190,231,32, +39,235,160,1,32,180,235,186,56,253,9,1,240,23,189,15, +1,133,117,189,16,1,133,118,189,18,1,133,184,189,17,1, +133,185,76,210,215,138,105,17,170,154,32,183,0,201,44,208, +241,32,177,0,32,255,220,32,123,221,24,36,56,36,17,48, +3,176,3,96,176,253,162,163,76,18,212,166,184,208,2,198, +185,198,184,162,0,36,72,138,72,169,1,32,214,211,32,96, +222,169,0,133,137,32,183,0,56,233,207,144,23,201,3,176, +19,201,1,42,73,1,69,137,197,137,144,97,133,137,32,177, +0,76,152,221,166,137,208,44,176,123,105,7,144,119,101,17, +208,3,76,151,229,105,255,133,94,10,101,94,168,104,217,178, +208,176,103,32,106,221,72,32,253,221,104,164,135,16,23,170, +240,86,208,95,70,17,138,42,166,184,208,2,198,185,198,184, +160,27,133,137,208,215,217,178,208,176,72,144,217,185,180,208, +72,185,179,208,72,32,16,222,165,137,76,134,221,76,201,222, +165,162,190,178,208,168,104,133,94,230,94,104,133,95,152,72, +32,114,235,165,161,72,165,160,72,165,159,72,165,158,72,165, +157,72,108,94,0,160,255,104,240,35,201,100,240,3,32,106, +221,132,135,104,74,133,22,104,133,165,104,133,166,104,133,167, +104,133,168,104,133,169,104,133,170,69,162,133,171,165,157,96, +169,0,133,17,32,177,0,176,3,76,74,236,32,125,224,176, +100,201,46,240,244,201,201,240,85,201,200,240,231,201,34,208, +15,165,184,164,185,105,0,144,1,200,32,231,227,76,61,231, +201,198,208,16,160,24,208,56,165,157,208,3,160,1,44,160, +0,76,1,227,201,194,208,3,76,84,227,201,210,144,3,76, +12,223,32,187,222,32,123,221,169,41,44,169,40,44,169,44, +160,0,209,184,208,3,76,177,0,162,16,76,18,212,160,21, +104,104,76,215,221,32,227,223,133,160,132,161,166,17,240,5, +162,0,134,172,96,166,18,16,13,160,0,177,160,170,200,177, +160,168,138,76,242,226,76,249,234,32,177,0,32,236,241,138, +164,240,32,113,248,168,32,1,227,76,184,222,201,215,240,233, +10,72,170,32,177,0,224,207,144,32,32,187,222,32,123,221, +32,190,222,32,108,221,104,170,165,161,72,165,160,72,138,72, +32,248,230,104,168,138,72,76,63,223,32,178,222,104,168,185, +220,207,133,145,185,221,207,133,146,32,144,0,76,106,221,165, +165,5,157,208,11,165,165,240,4,165,157,208,3,160,0,44, +160,1,76,1,227,32,109,221,176,19,165,170,9,127,37,166, +133,166,169,165,160,0,32,178,235,170,76,176,223,169,0,133, +17,198,137,32,0,230,133,157,134,158,132,159,165,168,164,169, +32,4,230,134,168,132,169,170,56,229,157,240,8,169,1,144, +4,166,157,169,255,133,162,160,255,232,200,202,208,7,166,162, +48,15,24,144,12,177,168,209,158,240,239,162,255,176,2,162, +1,232,138,42,37,22,240,2,169,1,76,147,235,32,251,230, +32,30,251,76,1,227,32,190,222,170,32,232,223,32,183,0, +208,244,96,162,0,32,183,0,134,16,133,129,32,183,0,32, +125,224,176,3,76,201,222,162,0,134,17,134,18,76,7,224, +}; diff --git a/at28c64 Apple IIe EF ROM.h b/at28c64 Apple IIe EF ROM.h new file mode 100644 index 0000000..3848063 --- /dev/null +++ b/at28c64 Apple IIe EF ROM.h @@ -0,0 +1,267 @@ +// Use PROGMEM to put into Arduino flash memory +// /Users/chris/AppleII/ROMs/Apple IIe EF Enhanced - 342-0303-A - 2764.bin +// +// #define __PROG_TYPES_COMPAT__ +// #include "avr/pgmspace.h" + +#define ADDRESS_MAX 8192 + +const unsigned char values[ADDRESS_MAX] PROGMEM = { + 76, 40,241, 76, 60,212,196, 32,177, 0,144, 5, 32,125,224,144, 11,170, 32,177, 0,144,251, 32,125,224,176,246,201, 36,208, 6, +169,255,133, 17,208, 16,201, 37,208, 19,165, 20, 48,198,169,128,133, 18, 5,129,133,129,138, 9,128,170, 32,177, 0,134,130, 56, + 5, 20,233, 40,208, 3, 76, 30,225, 36, 20, 48, 2,112,247,169, 0,133, 20,165,105,166,106,160, 0,134,156,133,155,228,108,208, + 4,197,107,240, 34,165,129,209,155,208, 8,165,130,200,209,155,240,108,136, 24,165,155,105, 7,144,225,232,208,220,201, 65,144, + 5,233, 91, 56,233,165, 96,104, 72,201,215,208, 15,186,189, 2, 1,201,222,208, 7,169,154,160,224, 96, 0, 0,165,107,164,108, +133,155,132,156,165,109,164,110,133,150,132,151, 24,105, 7,144, 1,200,133,148,132,149, 32,147,211,165,148,164,149,200,133,107, +132,108,160, 0,165,129,145,155,200,165,130,145,155,169, 0,200,145,155,200,145,155,200,145,155,200,145,155,200,145,155,165,155, + 24,105, 2,164,156,144, 1,200,133,131,132,132, 96,165, 15, 10,105, 5,101,155,164,156,144, 1,200,133,148,132,149, 96,144,128, + 0, 0, 32,177, 0, 32,103,221,165,162, 48, 13,165,157,201,144,144, 9,169,254,160,224, 32,178,235,208,126, 76,242,235,165, 20, +208, 71,165, 16, 5, 18, 72,165, 17, 72,160, 0,152, 72,165,130, 72,165,129, 72, 32, 2,225,104,133,129,104,133,130,104,168,186, +189, 2, 1, 72,189, 1, 1, 72,165,160,157, 2, 1,165,161,157, 1, 1,200, 32,183, 0,201, 44,240,210,132, 15, 32,184,222,104, +133, 17,104,133, 18, 41,127,133, 16,166,107,165,108,134,155,133,156,197,110,208, 4,228,109,240, 63,160, 0,177,155,200,197,129, +208, 6,165,130,209,155,240, 22,200,177,155, 24,101,155,170,200,177,155,101,156,144,215,162,107, 44,162, 53, 76, 18,212,162,120, +165, 16,208,247,165, 20,240, 2, 56, 96, 32,237,224,165, 15,160, 4,209,155,208,225, 76, 75,226,165, 20,240, 5,162, 42, 76, 18, +212, 32,237,224, 32,227,211,169, 0,168,133,174,162, 5,165,129,145,155, 16, 1,202,200,165,130,145,155, 16, 2,202,202,134,173, +165, 15,200,200,200,145,155,162, 11,169, 0, 36, 16, 80, 8,104, 24,105, 1,170,104,105, 0,200,145,155,200,138,145,155, 32,173, +226,134,173,133,174,164, 94,198, 15,208,220,101,149,176, 93,133,149,168,138,101,148,144, 3,200,240, 82, 32,227,211,133,109,132, +110,169, 0,230,174,164,173,240, 5,136,145,148,208,251,198,149,198,174,208,245,230,149, 56,165,109,229,155,160, 2,145,155,165, +110,200,229,156,145,155,165, 16,208, 98,200,177,155,133, 15,169, 0,133,173,133,174,200,104,170,133,160,104,133,161,209,155,144, + 14,208, 6,200,138,209,155,144, 7, 76,150,225, 76, 16,212,200,165,174, 5,173, 24,240, 10, 32,173,226,138,101,160,170,152,164, + 94,101,161,134,173,198, 15,208,202,133,174,162, 5,165,129, 16, 1,202,165,130, 16, 2,202,202,134,100,169, 0, 32,182,226,138, +101,148,133,131,152,101,149,133,132,168,165,131, 96,132, 94,177,155,133,100,136,177,155,133,101,169, 16,133,153,162, 0,160, 0, +138, 10,170,152, 42,168,176,164, 6,173, 38,174,144, 11, 24,138,101,100,170,152,101,101,168,176,147,198,153,208,227, 96,165, 17, +240, 3, 32, 0,230, 32,132,228, 56,165,111,229,109,168,165,112,229,110,162, 0,134, 17,133,158,132,159,162,144, 76,155,235,164, + 36,169, 0, 56,240,236,166,118,232,208,161,162,149, 44,162,224, 76, 18,212, 32, 65,227, 32, 6,227, 32,187,222,169,128,133, 20, + 32,227,223, 32,106,221, 32,184,222,169,208, 32,192,222, 72,165,132, 72,165,131, 72,165,185, 72,165,184, 72, 32,149,217, 76,175, +227,169,194, 32,192,222, 9,128,133, 20, 32,234,223,133,138,132,139, 76,106,221, 32, 65,227,165,139, 72,165,138, 72, 32,178,222, + 32,106,221,104,133,138,104,133,139,160, 2,177,138,133,131,170,200,177,138,240,153,133,132,200,177,131, 72,136, 16,250,164,132, + 32, 43,235,165,185, 72,165,184, 72,177,138,133,184,200,177,138,133,185,165,132, 72,165,131, 72, 32,103,221,104,133,138,104,133, +139, 32,183, 0,240, 3, 76,201,222,104,133,184,104,133,185,160, 0,104,145,138,104,200,145,138,104,200,145,138,104,200,145,138, +104,200,145,138, 96, 32,106,221,160, 0, 32, 54,237,104,104,169,255,160, 0,240, 18,166,160,164,161,134,140,132,141, 32, 82,228, +134,158,132,159,133,157, 96,162, 34,134, 13,134, 14,133,171,132,172,133,158,132,159,160,255,200,177,171,240, 12,197, 13,240, 4, +197, 14,208,243,201, 34,240, 1, 24,132,157,152,101,171,133,173,166,172,144, 1,232,134,174,165,172,240, 4,201, 2,208, 11,152, + 32,213,227,166,171,164,172, 32,226,229,166, 82,224, 94,208, 5,162,191, 76, 18,212,165,157,149, 0,165,158,149, 1,165,159,149, + 2,160, 0,134,160,132,161,136,132, 17,134, 83,232,232,232,134, 82, 96, 70, 19, 72, 73,255, 56,101,111,164,112,176, 1,136,196, +110,144, 17,208, 4,197,109,144, 11,133,111,132,112,133,113,132,114,170,104, 96,162, 77,165, 19, 48,184, 32,132,228,169,128,133, + 19,104,208,208,166,115,165,116,134,111,133,112,160, 0,132,139,165,109,166,110,133,155,134,156,169, 85,162, 0,133, 94,134, 95, +197, 82,240, 5, 32, 35,229,240,247,169, 7,133,143,165,105,166,106,133, 94,134, 95,228,108,208, 4,197,107,240, 5, 32, 25,229, +240,243,133,148,134,149,169, 3,133,143,165,148,166,149,228,110,208, 7,197,109,208, 3, 76, 98,229,133, 94,134, 95,160, 0,177, + 94,170,200,177, 94, 8,200,177, 94,101,148,133,148,200,177, 94,101,149,133,149, 40, 16,211,138, 48,208,200,177, 94,160, 0, 10, +105, 5,101, 94,133, 94,144, 2,230, 95,166, 95,228,149,208, 4,197,148,240,186, 32, 35,229,240,243,177, 94, 48, 53,200,177, 94, + 16, 48,200,177, 94,240, 43,200,177, 94,170,200,177, 94,197,112,144, 6,208, 30,228,111,176, 26,197,156,144, 22,208, 4,228,155, +144, 16,134,155,133,156,165, 94,166, 95,133,138,134,139,165,143,133,145,165,143, 24,101, 94,133, 94,144, 2,230, 95,166, 95,160, + 0, 96,166,139,240,247,165,145, 41, 4, 74,168,133,145,177,138,101,155,133,150,165,156,105, 0,133,151,165,111,166,112,133,148, +134,149, 32,154,211,164,145,200,165,148,145,138,170,230,149,165,149,200,145,138, 76,136,228,165,161, 72,165,160, 72, 32, 96,222, + 32,108,221,104,133,171,104,133,172,160, 0,177,171, 24,113,160,144, 5,162,176, 76, 18,212, 32,213,227, 32,212,229,165,140,164, +141, 32, 4,230, 32,230,229,165,171,164,172, 32, 4,230, 32, 42,228, 76,149,221,160, 0,177,171, 72,200,177,171,170,200,177,171, +168,104,134, 94,132, 95,168,240, 10, 72,136,177, 94,145,113,152,208,248,104, 24,101,113,133,113,144, 2,230,114, 96, 32,108,221, +165,160,164,161,133, 94,132, 95, 32, 53,230, 8,160, 0,177, 94, 72,200,177, 94,170,200,177, 94,168,104, 40,208, 19,196,112,208, + 15,228,111,208, 11, 72, 24,101,111,133,111,144, 2,230,112,104,134, 94,132, 95, 96,196, 84,208, 12,197, 83,208, 8,133, 82,233, + 3,133, 83,160, 0, 96, 32,251,230,138, 72,169, 1, 32,221,227,104,160, 0,145,158,104,104, 76, 42,228, 32,185,230,209,140,152, +144, 4,177,140,170,152, 72,138, 72, 32,221,227,165,140,164,141, 32, 4,230,104,168,104, 24,101, 94,133, 94,144, 2,230, 95,152, + 32,230,229, 76, 42,228, 32,185,230, 24,241,140, 73,255, 76, 96,230,169,255,133,161, 32,183, 0,201, 41,240, 6, 32,190,222, 32, +248,230, 32,185,230,202,138, 72, 24,162, 0,241,140,176,184, 73,255,197,161,144,179,165,161,176,175, 32,184,222,104,168,104,133, +145,104,104,104,170,104,133,140,104,133,141,165,145, 72,152, 72,160, 0,138,240, 29, 96, 32,220,230, 76, 1,227, 32,253,229,162, + 0,134, 17,168, 96, 32,220,230,240, 8,160, 0,177, 94,168, 76, 1,227, 76,153,225, 32,177, 0, 32,103,221, 32, 8,225,166,160, +208,240,166,161, 76,183, 0, 32,220,230,208, 3, 76, 78,232,166,184,164,185,134,173,132,174,166, 94,134,184, 24,101, 94,133, 96, +166, 95,134,185,144, 1,232,134, 97,160, 0,177, 96, 72,169, 0,145, 96, 32,183, 0, 32, 74,236,104,160, 0,145, 96,166,173,164, +174,134,184,132,185, 96, 32,103,221, 32, 82,231, 32,190,222, 76,248,230,165,157,201,145,176,154, 32,242,235,165,160,164,161,132, + 80,133, 81, 96,165, 80, 72,165, 81, 72, 32, 82,231,160, 0,177, 80,168,104,133, 81,104,133, 80, 76, 1,227, 32, 70,231,138,160, + 0,145, 80, 96, 32, 70,231,134,133,162, 0, 32,183, 0,240, 3, 32, 76,231,134,134,160, 0,177, 80, 69,134, 37,133,240,248, 96, +169,100,160,238, 76,190,231, 32,227,233,165,162, 73,255,133,162, 69,170,133,171,165,157, 76,193,231, 32,240,232,144, 60, 32,227, +233,208, 3, 76, 83,235,166,172,134,146,162,165,165,165,168,240,206, 56,229,157,240, 36,144, 18,132,157,164,170,132,162, 73,255, +105, 0,160, 0,132,146,162,157,208, 4,160, 0,132,172,201,249, 48,199,168,165,172, 86, 1, 32, 7,233, 36,171, 16, 87,160,157, +224,165,240, 2,160,165, 56, 73,255,101,146,133,172,185, 4, 0,245, 4,133,161,185, 3, 0,245, 3,133,160,185, 2, 0,245, 2, +133,159,185, 1, 0,245, 1,133,158,176, 3, 32,158,232,160, 0,152, 24,166,158,208, 74,166,159,134,158,166,160,134,159,166,161, +134,160,166,172,134,161,132,172,105, 8,201, 32,208,228,169, 0,133,157,133,162, 96,101,146,133,172,165,161,101,169,133,161,165, +160,101,168,133,160,165,159,101,167,133,159,165,158,101,166,133,158, 76,141,232,105, 1, 6,172, 38,161, 38,160, 38,159, 38,158, + 16,242, 56,229,157,176,199, 73,255,105, 1,133,157,144, 14,230,157,240, 66,102,158,102,159,102,160,102,161,102,172, 96,165,162, + 73,255,133,162,165,158, 73,255,133,158,165,159, 73,255,133,159,165,160, 73,255,133,160,165,161, 73,255,133,161,165,172, 73,255, +133,172,230,172,208, 14,230,161,208, 10,230,160,208, 6,230,159,208, 2,230,158, 96,162, 69, 76, 18,212,162, 97,180, 4,132,172, +180, 3,148, 4,180, 2,148, 3,180, 1,148, 2,164,164,148, 1,105, 8, 48,232,240,230,233, 8,168,165,172,176, 20, 22, 1,144, + 2,246, 1,118, 1,118, 1,118, 2,118, 3,118, 4,106,200,208,236, 24, 96,129, 0, 0, 0, 0, 3,127, 94, 86,203,121,128, 19, +155, 11,100,128,118, 56,147, 22,130, 56,170, 59, 32,128, 53, 4,243, 52,129, 53, 4,243, 52,128,128, 0, 0, 0,128, 49,114, 23, +248, 32,130,235,240, 2, 16, 3, 76,153,225,165,157,233,127, 72,169,128,133,157,169, 45,160,233, 32,190,231,169, 50,160,233, 32, +102,234,169, 19,160,233, 32,167,231,169, 24,160,233, 32, 92,239,169, 55,160,233, 32,190,231,104, 32,213,236,169, 60,160,233, 32, +227,233,208, 3, 76,226,233, 32, 14,234,169, 0,133, 98,133, 99,133,100,133,101,165,172, 32,176,233,165,161, 32,176,233,165,160, + 32,176,233,165,159, 32,176,233,165,158, 32,181,233, 76,230,234,208, 3, 76,218,232, 74, 9,128,168,144, 25, 24,165,101,101,169, +133,101,165,100,101,168,133,100,165, 99,101,167,133, 99,165, 98,101,166,133, 98,102, 98,102, 99,102,100,102,101,102,172,152, 74, +208,214, 96,133, 94,132, 95,160, 4,177, 94,133,169,136,177, 94,133,168,136,177, 94,133,167,136,177, 94,133,170, 69,162,133,171, +165,170, 9,128,133,166,136,177, 94,133,165,165,157, 96,165,165,240, 31, 24,101,157,144, 4, 48, 29, 24, 44, 16, 20,105,128,133, +157,208, 3, 76, 82,232,165,171,133,162, 96,165,162, 73,255, 48, 5,104,104, 76, 78,232, 76,213,232, 32, 99,235,170,240, 16, 24, +105, 2,176,242,162, 0,134,171, 32,206,231,230,157,240,231, 96,132, 32, 0, 0, 0, 32, 99,235,169, 80,160,234,162, 0,134,171, + 32,249,234, 76,105,234, 32,227,233,240,118, 32,114,235,169, 0, 56,229,157,133,157, 32, 14,234,230,157,240,186,162,252,169, 1, +164,166,196,158,208, 16,164,167,196,159,208, 10,164,168,196,160,208, 4,164,169,196,161, 8, 42,144, 9,232,149,101,240, 50, 16, + 52,169, 1, 40,176, 14, 6,169, 38,168, 38,167, 38,166,176,230, 48,206, 16,226,168,165,169,229,161,133,169,165,168,229,160,133, +168,165,167,229,159,133,167,165,166,229,158,133,166,152, 76,166,234,169, 64,208,206, 10, 10, 10, 10, 10, 10,133,172, 40, 76,230, +234,162,133, 76, 18,212,165, 98,133,158,165, 99,133,159,165,100,133,160,165,101,133,161, 76, 46,232,133, 94,132, 95,160, 4,177, + 94,133,161,136,177, 94,133,160,136,177, 94,133,159,136,177, 94,133,162, 9,128,133,158,136,177, 94,133,157,132,172, 96,162,152, + 44,162,147,160, 0,240, 4,166,133,164,134, 32,114,235,134, 94,132, 95,160, 4,165,161,145, 94,136,165,160,145, 94,136,165,159, +145, 94,136,165,162, 9,127, 37,158,145, 94,136,165,157,145, 94,132,172, 96,165,170,133,162,162, 5,181,164,149,156,202,208,249, +134,172, 96, 32,114,235,162, 6,181,156,149,164,202,208,249,134,172, 96,165,157,240,251, 6,172,144,247, 32,198,232,208,242, 76, +143,232,165,157,240, 9,165,162, 42,169,255,176, 2,169, 1, 96, 32,130,235,133,158,169, 0,133,159,162,136,165,158, 73,255, 42, +169, 0,133,161,133,160,134,157,133,172,133,162, 76, 41,232, 70,162, 96,133, 96,132, 97,160, 0,177, 96,200,170,240,196,177, 96, + 69,162, 48,194,228,157,208, 33,177, 96, 9,128,197,158,208, 25,200,177, 96,197,159,208, 18,200,177, 96,197,160,208, 11,200,169, +127,197,172,177, 96,229,161,240, 40,165,162,144, 2, 73,255, 76,136,235,165,157,240, 74, 56,233,160, 36,162, 16, 9,170,169,255, +133,164, 32,164,232,138,162,157,201,249, 16, 6, 32,240,232,132,164, 96,168,165,162, 41,128, 70,158, 5,158,133,158, 32, 7,233, +132,164, 96,165,157,201,160,176, 32, 32,242,235,132,172,165,162,132,162, 73,128, 42,169,160,133,157,165,161,133, 13, 76, 41,232, +133,158,133,159,133,160,133,161,168, 96,160, 0,162, 10,148,153,202, 16,251,144, 15,201, 45,208, 4,134,163,240, 4,201, 43,208, + 5, 32,177, 0,144, 91,201, 46,240, 46,201, 69,208, 48, 32,177, 0,144, 23,201,201,240, 14,201, 45,240, 10,201,200,240, 8,201, + 43,240, 4,208, 7,102,156, 32,177, 0,144, 92, 36,156, 16, 14,169, 0, 56,229,154, 76,160,236,102,155, 36,155, 80,195,165,154, + 56,229,153,133,154,240, 18, 16, 9, 32, 85,234,230,154,208,249,240, 7, 32, 57,234,198,154,208,249,165,163, 48, 1, 96, 76,208, +238, 72, 36,155, 16, 2,230,153, 32, 57,234,104, 56,233, 48, 32,213,236, 76, 97,236, 72, 32, 99,235,104, 32,147,235,165,170, 69, +162,133,171,166,157, 76,193,231,165,154,201, 10,144, 9,169,100, 36,156, 48, 17, 76,213,232, 10, 10, 24,101,154, 10, 24,160, 0, +113,184, 56,233, 48,133,154, 76,135,236,155, 62,188, 31,253,158,110,107, 39,253,158,110,107, 40, 0,169, 88,160,211, 32, 49,237, +165,118,166,117,133,158,134,159,162,144, 56, 32,160,235, 32, 52,237, 76, 58,219,160, 1,169, 45,136, 36,162, 16, 4,200,153,255, + 0,133,162,132,173,200,169, 48,166,157,208, 3, 76, 87,238,169, 0,224,128,240, 2,176, 9,169, 20,160,237, 32,127,233,169,247, +133,153,169, 15,160,237, 32,178,235,240, 30, 16, 18,169, 10,160,237, 32,178,235,240, 2, 16, 14, 32, 57,234,198,153,208,238, 32, + 85,234,230,153,208,220, 32,160,231, 32,242,235,162, 1,165,153, 24,105, 10, 48, 9,201, 11,176, 6,105,255,170,169, 2, 56,233, + 2,133,154,134,153,138,240, 2, 16, 19,164,173,169, 46,200,153,255, 0,138,240, 6,169, 48,200,153,255, 0,132,173,160, 0,162, +128,165,161, 24,121,108,238,133,161,165,160,121,107,238,133,160,165,159,121,106,238,133,159,165,158,121,105,238,133,158,232,176, + 4, 16,222, 48, 2, 48,218,138,144, 4, 73,255,105, 10,105, 47,200,200,200,200,132,131,164,173,200,170, 41,127,153,255, 0,198, +153,208, 6,169, 46,200,153,255, 0,132,173,164,131,138, 73,255, 41,128,170,192, 36,208,170,164,173,185,255, 0,136,201, 48,240, +248,201, 46,240, 1,200,169, 43,166,154,240, 46, 16, 8,169, 0, 56,229,154,170,169, 45,153, 1, 1,169, 69,153, 0, 1,138,162, + 47, 56,232,233, 10,176,251,105, 58,153, 3, 1,138,153, 2, 1,169, 0,153, 4, 1,240, 8,153,255, 0,169, 0,153, 0, 1,169, + 0,160, 1, 96,128, 0, 0, 0, 0,250, 10, 31, 0, 0,152,150,128,255,240,189,192, 0, 1,134,160,255,255,216,240, 0, 0, 3, +232,255,255,255,156, 0, 0, 0, 10,255,255,255,255, 32, 99,235,169,100,160,238, 32,249,234,240,112,165,165,208, 3, 76, 80,232, +162,138,160, 0, 32, 43,235,165,170, 16, 15, 32, 35,236,169,138,160, 0, 32,178,235,208, 3,152,164, 13, 32, 85,235,152, 72, 32, + 65,233,169,138,160, 0, 32,127,233, 32, 9,239,104, 74,144, 10,165,157,240, 6,165,162, 73,255,133,162, 96,129, 56,170, 59, 41, + 7,113, 52, 88, 62, 86,116, 22,126,179, 27,119, 47,238,227,133,122, 29,132, 28, 42,124, 99, 89, 88, 10,126,117,253,231,198,128, + 49,114, 24, 16,129, 0, 0, 0, 0,169,219,160,238, 32,127,233,165,172,105, 80,144, 3, 32,122,235,133,146, 32,102,235,165,157, +201,136,144, 3, 32, 43,234, 32, 35,236,165, 13, 24,105,129,240,243, 56,233, 1, 72,162, 5,181,165,180,157,149,157,148,165,202, + 16,245,165,146,133,172, 32,170,231, 32,208,238,169,224,160,238, 32,114,239,169, 0,133,171,104, 32, 16,234, 96,133,173,132,174, + 32, 33,235,169,147, 32,127,233, 32,118,239,169,147,160, 0, 76,127,233,133,173,132,174, 32, 30,235,177,173,133,163,164,173,200, +152,208, 2,230,174,133,173,164,174, 32,127,233,165,173,164,174, 24,105, 5,144, 1,200,133,173,132,174, 32,190,231,169,152,160, + 0,198,163,208,228, 96,152, 53, 68,122,104, 40,177, 70, 32,130,235,170, 48, 24,169,201,160, 0, 32,249,234,138,240,231,169,166, +160,239, 32,127,233,169,170,160,239, 32,190,231,166,161,165,158,133,161,134,158,169, 0,133,162,165,157,133,172,169,128,133,157, + 32, 46,232,162,201,160, 0, 76, 43,235,169,102,160,240, 32,190,231, 32, 99,235,169,107,160,240,166,170, 32, 94,234, 32, 99,235, + 32, 35,236,169, 0,133,171, 32,170,231,169,112,160,240, 32,167,231,165,162, 72, 16, 13, 32,160,231,165,162, 48, 9,165, 22, 73, +255,133, 22, 32,208,238,169,112,160,240, 32,190,231,104, 16, 3, 32,208,238,169,117,160,240, 76, 92,239, 32, 33,235,169, 0,133, + 22, 32,241,239,162,138,160, 0, 32,231,239,169,147,160, 0, 32,249,234,169, 0,133,162,165, 22, 32, 98,240,169,138,160, 0, 76, +102,234, 72, 76, 35,240,129, 73, 15,218,162,131, 73, 15,218,162,127, 0, 0, 0, 0, 5,132,230, 26, 45, 27,134, 40, 7,251,248, +135,153,104,137, 1,135, 35, 53,223,225,134,165, 93,231, 40,131, 73, 15,218,162,166,211,193,200,212,200,213,196,206,202,165,162, + 72, 16, 3, 32,208,238,165,157, 72,201,129,144, 7,169, 19,160,233, 32,102,234,169,206,160,240, 32, 92,239,104,201,129,144, 7, +169,102,160,240, 32,167,231,104, 16, 3, 76,208,238, 96, 11,118,179,131,189,211,121, 30,244,166,245,123,131,252,176, 16,124, 12, + 31,103,202,124,222, 83,203,193,125, 20,100,112, 76,125,183,234, 81,122,125, 99, 48,136,126,126,146, 68,153, 58,126, 76,204,145, +199,127,170,170,170, 19,129, 0, 0, 0, 0,230,184,208, 2,230,185,173, 96,234,201, 58,176, 10,201, 32,240,239, 56,233, 48, 56, +233,208, 96,128, 79,199, 82, 88,162,255,134,118,162,251,154,169, 40,160,241,133, 1,132, 2,133, 4,132, 5, 32,115,242,169, 76, +133, 0,133, 3,133,144,133, 10,169,153,160,225,133, 11,132, 12,162, 28,189, 10,241,149,176,134,241,202,208,246,134,242,138,133, +164,133, 84, 72,169, 3,133,143, 32,251,218,169, 1,141,253, 1,141,252, 1,162, 85,134, 82,169, 0,160, 8,133, 80,132, 81,160, + 0,230, 81,177, 80, 73,255,145, 80,209, 80,208, 8, 73,255,145, 80,209, 80,240,236,164, 80,165, 81, 41,240,132,115,133,116,132, +111,133,112,162, 0,160, 8,134,103,132,104,160, 0,132,214,152,145,103,230,103,208, 2,230,104,165,103,164,104, 32,227,211, 32, + 75,214,169, 58,160,219,133, 4,132, 5,169, 60,160,212,133, 1,132, 2,108, 1, 0, 32,103,221, 32, 82,231,108, 80, 0, 32,248, +230,138, 76,139,254, 32,248,230,138, 76,149,254, 32,248,230,224, 48,176, 19,134,240,169, 44, 32,192,222, 32,248,230,224, 48,176, + 5,134, 44,134, 45, 96, 76,153,225, 32,236,241,228,240,176, 8,165,240,133, 44,133, 45,134,240,169,197, 32,192,222, 32,248,230, +224, 48,176,226, 96, 32,236,241,138,164,240,192, 40,176,215, 76, 0,248, 32, 9,242,138,164, 44,192, 40,176,202,164,240, 76, 25, +248, 32, 9,242,138,168,192, 40,176,188,165,240, 76, 40,248, 32,248,230,138, 76,100,248, 32,248,230,202,138,201, 24,176,167, 76, + 91,251, 32,248,230,138, 73,255,170,232,134,241, 96, 56,144, 24,102,242, 96,169,255,208, 2,169, 63,162, 0,133, 50,134,243, 96, +169,127,162, 64,208,245, 32,103,221, 32, 82,231,165, 80,197,109,165, 81,229,110,176, 3, 76, 16,212,165, 80,133,115,133,111,165, + 81,133,116,133,112, 96, 32,103,221, 32, 82,231,165, 80,197,115,165, 81,229,116,176,224,165, 80,197,105,165, 81,229,106,144,214, +165, 80,133,105,165, 81,133,106, 76,108,214,169,171, 32,192,222,165,184,133,244,165,185,133,245, 56,102,216,165,117,133,246,165, +118,133,247, 32,166,217, 76,152,217,134,222,166,248,134,223,165,117,133,218,165,118,133,219,165,121,133,220,165,122,133,221,165, +244,133,184,165,245,133,185,165,246,133,117,165,247,133,118, 32,183, 0, 32, 62,217, 76,210,215,165,218,133,117,165,219,133,118, +165,220,133,184,165,221,133,185,166,223,154, 76,210,215, 76,201,222,176,251,166,175,134,105,166,176,134,106, 32, 12,218, 32, 26, +214,165,155,133, 96,165,156,133, 97,169, 44, 32,192,222, 32, 12,218,230, 80,208, 2,230, 81, 32, 26,214,165,155,197, 96,165,156, +229, 97,176, 1, 96,160, 0,177,155,145, 96,230,155,208, 2,230,156,230, 96,208, 2,230, 97,165,105,197,155,165,106,229,156,176, +230,166, 97,164, 96,208, 1,202,136,134,106,132,105, 76,242,212,173, 86,192,173, 83,192, 76, 64,251,173, 84,192, 76, 57,251, 32, +217,247,160, 3,177,155,170,136,177,155,233, 1,176, 1,202,133, 80,134, 81, 32,205,254, 32,119,247, 76,205,254, 32,217,247, 32, +253,254,160, 2,177,155,197, 80,200,177,155,229, 81,176, 3, 76, 16,212, 32,119,247, 76,253,254, 44, 85,192, 44, 82,192,169, 64, +208, 8,169, 32, 44, 84,192, 44, 83,192,133,230,173, 87,192,173, 80,192,169, 0,133, 28,165,230,133, 27,160, 0,132, 26,165, 28, +145, 26, 32,126,244,200,208,246,230, 27,165, 27, 41, 31,208,238, 96,133,226,134,224,132,225, 72, 41,192,133, 38, 74, 74, 5, 38, +133, 38,104,133, 39, 10, 10, 10, 38, 39, 10, 38, 39, 10,102, 38,165, 39, 41, 31, 5,230,133, 39,138,192, 0,240, 5,160, 35,105, + 4,200,233, 7,176,251,132,229,170,189,185,244,133, 48,152, 74,165,228,133, 28,176, 40, 96, 32, 17,244,165, 28, 81, 38, 37, 48, + 81, 38,145, 38, 96, 16, 35,165, 48, 74,176, 5, 73,192,133, 48, 96,136, 16, 2,160, 39,169,192,133, 48,132,229,165, 28, 10,201, +192, 16, 6,165, 28, 73,127,133, 28, 96,165, 48, 10, 73,128, 48,221,169,129,200,192, 40,144,224,160, 0,176,220, 24,165,209, 41, + 4,240, 37,169,127, 37, 48, 49, 38,208, 25,230,234,169,127, 37, 48, 16, 17, 24,165,209, 41, 4,240, 14,177, 38, 69, 28, 37, 48, +208, 2,230,234, 81, 38,145, 38,165,209,101,211, 41, 3,201, 2,106,176,146, 48, 48, 24,165, 39, 44,185,245,208, 34, 6, 38,176, + 26, 44,205,244,240, 5,105, 31, 56,176, 18,105, 35, 72,165, 38,105,176,176, 2,105,240,133, 38,104,176, 2,105, 31,102, 38,105, +252,133, 39, 96, 24,165, 39,105, 4, 44,185,245,208,243, 6, 38,144, 24,105,224, 24, 44, 8,245,240, 18,165, 38,105, 80, 73,240, +240, 2, 73,240,133, 38,165,230,144, 2,105,224,102, 38,144,209, 72,169, 0,133,224,133,225,133,226,104, 72, 56,229,224, 72,138, +229,225,133,211,176, 10,104, 73,255,105, 1, 72,169, 0,229,211,133,209,133,213,104,133,208,133,212,104,133,224,134,225,152, 24, +229,226,144, 4, 73,255,105,254,133,210,132,226,102,211, 56,229,208,170,169,255,229,209,133, 29,164,229,176, 5, 10, 32,101,244, + 56,165,212,101,210,133,212,165,213,233, 0,133,213,177, 38, 69, 28, 37, 48, 81, 38,145, 38,232,208, 4,230, 29,240, 98,165,211, +176,218, 32,211,244, 24,165,212,101,208,133,212,165,213,101,209, 80,217,129,130,132,136,144,160,192, 28,255,254,250,244,236,225, +212,197,180,161,141,120, 97, 73, 49, 24,255,165, 38, 10,165, 39, 41, 3, 42, 5, 38, 10, 10, 10,133,226,165, 39, 74, 74, 41, 7, + 5,226,133,226,165,229, 10,101,229, 10,170,202,165, 48, 41,127,232, 74,208,252,133,225,138, 24,101,229,144, 2,230,225,133,224, + 96,134, 26,132, 27,170, 74, 74, 74, 74,133,211,138, 41, 15,170,188,186,245,132,208, 73, 15,170,188,187,245,200,132,210,164,229, +162, 0,134,234,161, 26,133,209,162,128,134,212,134,213,166,231,165,212, 56,101,208,133,212,144, 4, 32,179,244, 24,165,213,101, +210,133,213,144, 3, 32,180,244,202,208,229,165,209, 74, 74, 74,208,212,230, 26,208, 2,230, 27,161, 26,208,202, 96,134, 26,132, + 27,170, 74, 74, 74, 74,133,211,138, 41, 15,170,188,186,245,132,208, 73, 15,170,188,187,245,200,132,210,164,229,162, 0,134,234, +161, 26,133,209,162,128,134,212,134,213,166,231,165,212, 56,101,208,133,212,144, 4, 32,156,244, 24,165,213,101,210,133,213,144, + 3, 32,157,244,202,208,229,165,209, 74, 74, 74,208,212,230, 26,208, 2,230, 27,161, 26,208,202, 96, 32,103,221, 32, 82,231,164, + 81,166, 80,192, 1,144, 6,208, 29,224, 24,176, 25,138, 72,152, 72,169, 44, 32,192,222, 32,248,230,224,192,176, 9,134,157,104, +168,104,170,165,157, 96, 76, 6,242, 32,248,230,224, 8,176,246,189,246,246,133,228, 96, 0, 42, 85,127,128,170,213,255,201,193, +240, 13, 32,185,246, 32, 87,244, 32,183, 0,201,193,208,230, 32,192,222, 32,185,246,132,157,168,138,166,157, 32, 58,245, 76, 8, +247, 32,248,230,134,249, 96, 32,248,230,134,231, 96, 32,248,230,165,232,133, 26,165,233,133, 27,138,162, 0,193, 26,240, 2,176, +165, 10,144, 3,230, 27, 24,168,177, 26,101, 26,170,200,177, 26,101,233,133, 27,134, 26, 32,183, 0,201,197,208, 9, 32,192,222, + 32,185,246, 32, 17,244,165,249, 96, 32, 45,247, 76, 5,246, 32, 45,247, 76, 97,246, 56,144, 24,141, 7,192, 32, 0,197,141, 6, +192,176, 1, 96, 76, 16,212,189, 1, 2, 16, 17,165, 14,240, 22,201, 34,240, 18,165, 19,201, 73,240, 12,189, 0, 2, 8,201, 97, +144, 2, 41, 95, 40, 96,189, 0, 2, 96, 72,169, 32, 32, 92,219,104, 76, 36,237,165, 36,201, 33, 44, 31,192, 16, 5,173,123, 5, +201, 73, 96,138, 44, 31,192, 48, 8, 44,133, 36, 56,138,229, 36, 96,237,123, 5, 96, 0, 0, 0, 0,169, 64,133, 20, 32,227,223, +169, 0,133, 20, 76,240,216, 32,248,230,202,169, 40,197, 33,176, 2,165, 33, 32,202,247,134, 36,144,214,170, 32,251,218,208,235, + 74, 8, 32, 71,248, 40,169, 15,144, 2,105,224,133, 46,177, 38, 69, 48, 37, 46, 81, 38,145, 38, 96, 32, 0,248,196, 44,176, 17, +200, 32, 14,248,144,246,105, 1, 72, 32, 0,248,104,197, 45,144,245, 96,160, 47,208, 2,160, 39,132, 45,160, 39,169, 0,133, 48, + 32, 40,248,136, 16,246, 96, 72, 74, 41, 3, 9, 4,133, 39,104, 41, 24,144, 2,105,127,133, 38, 10, 10, 5, 38,133, 38, 96,165, + 48, 24,105, 3, 41, 15,133, 48, 10, 10, 10, 10, 5, 48,133, 48, 96, 74, 8, 32, 71,248,177, 38, 40,144, 4, 74, 74, 74, 74, 41, + 15, 96,166, 58,164, 59, 32,150,253, 32, 72,249,161, 58,168, 74,144, 9,106,176, 16,201,162,240, 12, 41,135, 74,170,189, 98,249, + 32,121,248,208, 4,160,128,169, 0,170,189,166,249,133, 46,170,132, 42,160, 16, 76,180,251,141, 6,192,162, 2,189, 5,195,221, +156,252,208, 7,202,202, 16,244,136,208,239,141, 7,192, 96, 0, 32,130,248, 72,177, 58, 32,218,253,162, 1, 32, 74,249,196, 47, +200,144,241,162, 3,192, 4,144,242,104,168,185,192,249,133, 44,185, 0,250,133, 45,169, 0,160, 5, 6, 45, 38, 44, 42,136,208, +248,105,191, 32,237,253,202,208,236, 32, 72,249,164, 47,162, 6,224, 3,240, 28, 6, 46,144, 14,189,179,249, 32,237,253,189,185, +249,240, 3, 32,237,253,202,208,231, 96,136, 48,231, 32,218,253,165, 46,201,232,177, 58,144,242, 32, 86,249,170,232,208, 1,200, +152, 32,218,253,138, 76,218,253,162, 3,169,160, 32,237,253,202,208,248, 96, 56,165, 47,164, 59,170, 16, 1,136,101, 58,144, 1, +200, 96, 4, 32, 84, 48, 13,128, 4,144, 3, 34, 84, 51, 13,128, 4,144, 4, 32, 84, 51, 13,128, 4,144, 4, 32, 84, 59, 13,128, + 4,144, 0, 34, 68, 51, 13,200, 68, 0, 17, 34, 68, 51, 13,200, 68,169, 1, 34, 68, 51, 13,128, 4,144, 1, 34, 68, 51, 13,128, + 4,144, 38, 49,135,154, 0, 33,129,130, 0, 0, 89, 77,145,146,134, 74,133,157,172,169,172,163,168,164,217, 0,216,164,164, 0, + 28,138, 28, 35, 93,139, 27,161,157,138, 29, 35,157,139, 29,161, 0, 41, 25,174,105,168, 25, 35, 36, 83, 27, 35, 36, 83, 25,161, + 0, 26, 91, 91,165,105, 36, 36,174,174,168,173, 41, 0,124, 0, 21,156,109,156,165,105, 41, 83,132, 19, 52, 17,165,105, 35,160, +216, 98, 90, 72, 38, 98,148,136, 84, 68,200, 84,104, 68,232,148, 0,180, 8,132,116,180, 40,110,116,244,204, 74,114,242,164,138, + 0,170,162,162,116,116,116,114, 68,104,178, 50,178, 0, 34, 0, 26, 26, 38, 38,114,114,136,200,196,202, 38, 72, 68, 68,162,200, +133, 69,165, 69, 76,250,195,141, 6,192,133, 69, 40, 32, 76,255,104,133, 58,104,133, 59,108,240, 3, 32,130,248, 32,218,250, 76, +101,255,216, 32,132,254, 32, 47,251, 32,147,254, 32,137,254,173, 88,192,173, 90,192,160, 9, 32,180,251,234,173,255,207, 44, 16, +192,216, 32, 58,255,173,243, 3, 73,165,205,244, 3,208, 23,173,242, 3,208, 15,169,224,205,243, 3,208, 8,160, 3,140,242, 3, + 76, 0,224,108,242, 3, 32, 96,251,162, 5,189,252,250,157,239, 3,202,208,247,169,200,134, 0,133, 1,160, 5,198, 1,165, 1, +201,192,240,215,141,248, 7,177, 0,217, 1,251,208,236,136,136, 16,245,108, 0, 0, 0, 0, 32,142,253,169, 69,133, 64,169, 0, +133, 65,162,251,169,160, 32,237,253,189, 30,250, 32,237,253,169,189, 32,237,253,181, 74, 32,218,253,232, 48,232, 96, 89,250, 0, +224, 69, 32,255, 0,255, 3,255, 60,193,240,240,236,229,160,221,219,196,194,193,255,195,255,255,255,193,216,217,208,211,173,112, +192,160, 0,234,234,189,100,192, 16, 4,200,208,248,136, 96,169, 0,133, 72,173, 86,192,173, 84,192,173, 81,192,169, 0,240, 11, +173, 80,192,173, 83,192, 32, 54,248,169, 20,133, 34,169, 0,133, 32,160, 12,208, 95,169, 24,133, 35,169, 23,133, 37, 76, 34,252, + 32, 88,252,160, 9,185, 9,255,153, 14, 4,136,208,247, 96,173,243, 3, 73,165,141,244, 3, 96,201,141,208, 24,172, 0,192, 16, + 19,192,147,208, 15, 44, 16,192,172, 0,192, 16,251,192,131,240, 3, 44, 16,192, 76,253,251, 56, 76, 44,252,168,185, 72,250, 32, +151,251, 32, 33,253,201,206,176,238,201,201,144,234,201,204,240,230,208,232, 6, 44, 21,192, 8,141, 7,192, 76, 0,193, 0, 0, +224, 72, 74, 41, 3, 9, 4,133, 41,104, 41, 24,144, 2,105,127,133, 40, 10, 10, 5, 40,133, 40, 96,201,135,208, 18,169, 64, 32, +168,252,160,192,169, 12, 32,168,252,173, 48,192,136,208,245, 96,164, 36,145, 40,230, 36,165, 36,197, 33,176,102, 96,201,160,176, +239,168, 16,236,201,141,240, 90,201,138,240, 90,201,136,208,201,198, 36, 16,232,165, 33,133, 36,198, 36,165, 34,197, 37,176,220, +198, 37,165, 37,133, 40,152,160, 4,208,137, 0, 73,192,240, 40,105,253,144,192,240,218,105,253,144, 44,240,222,105,253,144, 92, +208,186,160, 10,208,227, 44, 31,192, 16, 4,160, 0,240, 11,152, 72, 32,120,251,104,164, 53, 96,160, 5, 76,180,251, 83, 92, 92, + 0, 0,169, 0,133, 36,230, 37,165, 37,197, 35,144,182,198, 37,160, 6,208,181,141, 6,192,108,254, 3,104,141,248, 7,201,193, +144, 13,141,255,207,160, 0,166, 1,133, 1,177, 0,134, 1,141, 7,192, 76,124,196,144, 2, 37, 50, 76,247,253, 56,144, 24,132, + 42,160, 7,176,120,200,208,117, 56, 72,233, 1,208,252,104,233, 1,208,246, 96,230, 66,208, 2,230, 67,165, 60,197, 62,165, 61, +229, 63,230, 60,208, 2,230, 61, 96,141, 7,192, 32,103,197, 76,197,254,141, 6,192, 32, 74,249,169,222, 32,237,253, 32, 58,255, + 76,240,252,141, 6,192, 32,208,248, 32, 83,249,132, 59,133, 58,169,161,133, 51, 32,103,253,141, 7,192, 76,156,207,185, 0, 2, +200,201,225,144, 6,201,251,176, 2, 41,223, 96,160, 11,208, 3, 76, 24,253, 32,180,251,234,234,108, 56, 0,160, 3, 76,180,251, +234, 32, 12,253,160, 1,208,245, 78,248, 7, 76, 12,253,234, 32, 33,253, 32,165,251, 32, 40,253,201,155,240,243, 96,160, 15, 32, +180,251,164, 36,157, 0, 2, 32,237,253,234,234,234,189, 0, 2,201,136,240, 29,201,152,240, 10,224,248,144, 3, 32, 58,255,232, +208, 19,169,220, 32,237,253, 32,142,253,165, 51, 32,237,253,162, 1,138,240,243,202, 32, 53,253,201,149,208, 8,177, 40, 44, 31, +192, 48,186,234,157, 0, 2,201,141,208,188, 32,156,252,169,141,208, 91,164, 61,166, 60, 32,142,253, 32, 64,249,160, 0,169,173, + 76,237,253,165, 60, 9, 7,133, 62,165, 61,133, 63,165, 60, 41, 7,208, 3, 32,146,253,169,160, 32,237,253,177, 60, 32,218,253, + 32,186,252,144,232, 96, 74,144,234, 74, 74,165, 62,144, 2, 73,255,101, 60, 72,169,189, 32,237,253,104, 72, 74, 74, 74, 74, 32, +229,253,104, 41, 15, 9,176,201,186,144, 2,105, 6,108, 54, 0, 72,201,160, 76,149,252, 72,132, 53,168,104, 76, 70,252,234,234, +198, 52,240,159,202,208, 22,201,186,208,187,133, 49,165, 62,145, 64,230, 64,208, 2,230, 65, 96,164, 52,185,255, 1,133, 49, 96, +162, 1,181, 62,149, 66,149, 68,202, 16,247, 96,177, 60,145, 66, 32,180,252,144,247, 96,177, 60,209, 66,240, 28, 32,146,253,177, + 60, 32,218,253,169,160, 32,237,253,169,168, 32,237,253,177, 66, 32,218,253,169,169, 32,237,253, 32,180,252,144,217, 96, 32,117, +254,169, 20, 72, 32,208,248, 32, 83,249,133, 58,132, 59,104, 56,233, 1,208,239, 96,138,240, 7,181, 60,149, 58,202, 16,249, 96, +160, 63,208, 2,160,255,132, 50, 96,169, 0,133, 62,162, 56,160, 27,208, 8,169, 0,133, 62,162, 54,160,240,165, 62, 41, 15,240, + 4, 9,192,160, 0,148, 0,149, 1,160, 14, 76,180,251,234, 0, 76, 0,224, 76, 3,224, 32,117,254, 32, 63,255,108, 58, 0, 76, +215,250, 96,234, 96,141, 6,192, 96,234, 76,248, 3,169, 64,141, 7,192, 32,170,197,240, 44,160, 1,165, 67,240, 4,209, 60,208, + 10,136,165, 66,209, 60,208, 3, 32,146,253, 32,186,252,144,231, 96,160, 13, 32,180,251, 32, 0,254,104,104,208,108,141, 7,192, + 32,209,197,141, 6,192,240, 50,208, 35,193,240,240,236,229,160,175,175,229, 32,253,252,201,160,240,249, 96,176,109,201,160,208, + 40,185, 0, 2,162, 7,201,141,240,125,200,208, 99,169,197, 32,237,253,169,210, 32,237,253, 32,237,253,169,135, 76,237,253,165, + 72, 72,165, 69,166, 70,164, 71, 40, 96,133, 69,134, 70,132, 71, 8,104,133, 72,186,134, 73,216, 96, 32,132,254, 32, 47,251, 32, +147,254, 32,137,254,216, 32, 58,255,169,170,133, 51, 32,103,253, 32,199,255, 32,167,255,132, 52,160, 23,136, 48,232,217,204,255, +208,248, 32,190,255,164, 52, 76,115,255,162, 3, 10, 10, 10, 10, 10, 38, 62, 38, 63,202, 16,248,165, 49,208, 6,181, 63,149, 61, +149, 65,232,240,243,208, 6,162, 0,134, 62,134, 63, 32,253,252,234, 73,176,201, 10,144,211,105,136,201,250, 76, 27,255,169,254, + 72,185,227,255, 72,165, 49,160, 0,132, 49, 96,188,178,190,154,239,196,236,169,187,166,164, 6,149, 7, 2, 5,240, 0,235,147, +167,198,153,178,201,190,240, 53,140,214,150,175, 23, 23, 43, 31,131,127, 93,204,181,252, 23, 23,245, 3,251, 3, 98,250,250,195, +}; + diff --git a/convert_2e_2plus_chargen.py b/convert_2e_2plus_chargen.py new file mode 100644 index 0000000..5e0b72b --- /dev/null +++ b/convert_2e_2plus_chargen.py @@ -0,0 +1,60 @@ +# CT, March 2018 +# Combine the Apple //e and II+ character ROMs to create a new +# Apple II+ character ROM that has lowercase characters in $C0-$FF +# and inverse lowercase characters in the "flashing" range $60-$7F +# Use along with my hack for the system ROM where it displays lowercase +# characters correctly and where backspace uses inverse characters +# instead of flashing. +import numpy as np +from convert_roms_arduino import * + +dir = '/Users/chris/AppleII/ROMs/' +inputFile = 'AppleIIeVideoEnhanced-342-0265-a-2732.bin' +f = open(dir + inputFile, 'rb') +dataIn = f.read() +f.close() +dataIn = np.fromstring(dataIn,dtype=np.uint8) + +inputFile = 'AppleIIPlusCharacters.bin' +f = open(dir + inputFile, 'rb') +dataOut = f.read() +f.close() +dataOut = np.fromstring(dataOut,dtype=np.uint8) + +# Copy the "solid Apple" character to the end of the inverse lowercase row. +# Be sure to invert the bits since the Apple //e char rom has a different format. +dataIn[0x3F8:0x400] = ~dataIn[0x200:0x208] + +# Shift all Apple II+ characters up by 1 row so they line up with +# the new lowercase characters from the //e. +for char in range(0x0, 0x100): + c = char*8 + firstRow = dataOut[c] + if firstRow == 0 or firstRow == 128: + dataOut[c:c+7] = dataOut[c+1:c+8] + dataOut[c+7] = firstRow + +for char in range(0x60, 0x80): + for row in range(0,8): + i = char*8 + row + # //e and II+ have a different character rom format + # Need to reverse the bit order and right shift by 1 bit + character = int('{:08b}'.format(dataIn[i])[::-1], 2) >> 1 + if char != 0x60: + dataOut[i] = character + # Turn on the high bit for the "normal" lowercase $C0-$FF + # Not strictly necessary (ignored by the II+) but matches the uppercase + dataOut[i + 0x400] = character | 128 + +# Turn flashing off (the high bit) for all characters except "space" at 0x300 +for i in range(0x200, 0x300): + dataOut[i] = dataOut[i] & ~128 + +dataOut = dataOut.tostring() +file = dir + 'AppleIIPlusTorrenceLowercase.bin' +f = open(file, 'wb') +f.write(dataOut) +f.close() + +drawCharacters(dataOut) +writeHeaderFile(file, 'ProgData.h', dataOut) diff --git a/convert_apple_rev0.py b/convert_apple_rev0.py new file mode 100644 index 0000000..986f5bb --- /dev/null +++ b/convert_apple_rev0.py @@ -0,0 +1,29 @@ +# Read in an Apple II ROM, do some optional modifications, +# then write out the bytes as an Arduino header file +# Chris Torrence, May 2016 +from convert_roms_arduino import * + +dir = '' +inputFile = '/Users/chris/AppleII/Apple2o.rom' +inputFile = '/Users/chris/Desktop/BOOTI/tmp/FIRMWARE.BIN' +f = open(dir + inputFile, 'rb') +data = f.read() +f.close() +data = np.fromstring(data,dtype=np.uint8) +print(dir + inputFile) + +if 0: + data = data[-2048:] + + # FBE5: make BELL frequency lower, shorter + data[0xFBE5 - 0xF800] = 0x0E + data[0xFBE3 - 0xF800] = 0x70 + + # + # FF69: LDA #$AA --> JMP $FF59 + i = 0xFD28 - 0xF800 + data[i:i+3] = [0xA9, 0xB0, 0xEA] + # i = 0xFF69 - 0xF800 + # data[i:i+6] = [0xAD, 0x10, 0xC0, 0x4C, 0x6C, 0xFF] + +writeHeaderFile(inputFile, 'ProgData.h', data) diff --git a/convert_apple_rom.py b/convert_apple_rom.py new file mode 100644 index 0000000..763924a --- /dev/null +++ b/convert_apple_rom.py @@ -0,0 +1,36 @@ +# Read in an Apple II ROM, do some optional modifications, +# then write out the bytes as an Arduino header file +# Chris Torrence, May 2016 +from convert_roms_arduino import * + +dir = '/Users/chris/AppleII/ROMs/' +inputFile = 'AppleIIPlus-341-0020-ApplesoftBasicAutostartMonitorF800-2716.bin' +# inputFile = 'Apple IIe CD Enhanced - 342-0304-A - 2764.bin' +f = open(dir + inputFile, 'rb') +data = f.read() +f.close() +data = np.fromstring(data,dtype=np.uint8) +print(dir + inputFile) + +# Hack adapted from the Videx Enhancer ][ manual, p. A-4 + +# FD83: AND #$DF --> AND #$FF +data[0xFD83 - 0xF800] = 0xFF + +# +# FD11: AND #$3F --> JSR $FBB4 +# FD13: ORA #$40 --> NOP +i = 0xFD11 - 0xF800 +data[i:i+4] = [0x20, 0xB4, 0xFB, 0xEA] + +# +# FBB4: AND #$7F +# CMP #$20 ; character +# BNE SKIP +# ORA #$40 ; turn on flashing for +# SKIP: RTS +i = 0xFBB4 - 0xF800 +new = [0x29, 0x7F, 0xC9, 0x20, 0xD0, 0x02, 0x09, 0x40, 0x60] +data[i:i+len(new)] = new + +writeHeaderFile(inputFile, 'ProgData.h', data) diff --git a/convert_roms_arduino.py b/convert_roms_arduino.py new file mode 100644 index 0000000..796ae2b --- /dev/null +++ b/convert_roms_arduino.py @@ -0,0 +1,62 @@ +# Read in an Apple II character generator ROM, +# make an image of the characters, +# then write out the bytes as an Arduino header file +# Chris Torrence, May 2016 +import numpy as np +import matplotlib.pyplot as plt +from time import localtime, strftime + +def drawCharacters(data): + """ + Create a character map image from a Apple II character generator ROM. + Each character is 8 bytes. Each byte is one line in the character, + with each bit indicating an off/on pixel in that line, in reverse order. + """ + # Number of characters + n = 256 # len(data)//8 + + # Create a new array to hold our character map image. + # Make it 32 characters across by n/8 characters high. + # Include an extra row and column pyplot.imshow clips the top and left sides. + arr = np.ndarray(((n//32)*8 + 1, 32*8 + 1), dtype=np.uint8) + + # Loop over the "n" characters + for i in range(0,n): + x = 8*(i % 32) + 1 + y = 8*(i//32) + 1 + # Each byte is one line in one character + for charline in range(0,8): + dataIndex = i*8 + charline + # Each bit is one dot in one line ordered from MSB to LSB + for bit in range(0,8): + arr[y + charline, x + 7 - bit] = (data[dataIndex] & 2**bit) != 0 + + plt.figure(figsize=(15,5)) + plt.imshow(arr, cmap='Greys_r', interpolation='nearest', + aspect=1/32, extent=[0,32,256,-1]) + plt.yticks([32,96,160,224], ['$00','$40','$80','$C0'], va='bottom', size=16) + plt.xticks([0,8,16,24], ['$00','$08','$10','$18'], ha='center', size=16) + plt.show() + + +def writeHeaderFile(inputFile, outputFile, data): + """ + Convert the data in an Apple II ROM + into a form suitable for an Arduino header file. + """ + f = open(outputFile, 'w') + f.write('// Use PROGMEM to put into Arduino flash memory\n') + f.write('// ' + inputFile + ', created by applechargen.py\n') + f.write(strftime("// %a, %d %b %Y %H:%M:%S\n", localtime())) + f.write('// #define __PROG_TYPES_COMPAT__\n') + f.write('// #include "avr/pgmspace.h"\n') + f.write('#define ADDRESS_MAX ' + str(len(data)) + '\n') + f.write('const unsigned char values[ADDRESS_MAX] PROGMEM = {\n') + for i in range(0,len(data)//16): + for j in range(0,16): + f.write(str(data[i*16 + j]) + ",") + f.write('\n') + f.write('};\n') + f.close() + print('Output written to: ' + outputFile) +