├── LICENSE ├── README.md ├── images ├── NP25.jpg ├── np25_01.jpg ├── np25_parts.jpg ├── np25_pcb.jpg ├── np25_solder01.jpg ├── np25_solder02.jpg ├── np25_solder03.jpg └── np25_solder04.jpg ├── index.md ├── np25.c ├── np25.h ├── np25.hex ├── np25.lst ├── np25.txt ├── rom_21.h ├── rom_25.h ├── rom_33c.h ├── rom_34c.h └── ti30s_v7s2.fzz /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | NP25 and Nonpareil are free software; you can redistribute it and/or modify it 3 | under the terms of the GNU General Public License version 2 as 4 | published by the Free Software Foundation. Note that I am not 5 | granting permission to redistribute or modify Nonpareil under the 6 | terms of any later version of the General Public License. 7 | 8 | NP25 and Nonpareil is distributed in the hope that it will be useful, but 9 | WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 | General Public License for more details. 12 | 13 | You should have received a copy of the GNU General Public License 14 | along with this program (in the file "COPYING"); if not, write to the 15 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 16 | MA 02111, USA. 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | NP Calculator Emulator 4 | ====================== 5 | Nonpariel Physical (NP) is an standalone calculator microcode emulator 6 | 7 | Features 8 | _________________ 9 | * selectable rom from HP-21, HP-25C and HP-33C. 10 | * press-n-hold + switch on to select one of the three ROMSs. 11 | * a setup menu to set the default ROM to use, plus ability to set speed (fast / slow). 12 | * both 25C and 33C programs are stored separately. 13 | * a greetings message set and show, handy as a gift item 14 | 15 | Description 16 | ___________ 17 | 18 | Compile w/ (example only, substitute w/ your setup path) 19 | 20 | /msp430-gcc -Os -Wall -ffunction-sections -fdata-sections -fno-inline-small-functions -Wl,-Map=np25.map,--cref -Wl,--relax -Wl,--gc-sections -I /cygdrive/c/mspgcc-20120406-p20120502/bin/../msp430/include -mmcu=msp430g2553 -o np25.elf np25.c 21 | 22 | October 2014, cc 23 | * major code clean-up 24 | * includes power-on switchable roms for 21, 25C and 33C 25 | * allow defaults (rom and speed) be saved 26 | * add greeting message 27 | * rom_34c.h, rom for 34C is included for further development only, not emulated at this version 28 | 29 | September 2014, cc 30 | * this is a preview release upon request, project is not bugs free. 31 | * based on TI msp430g25x3 mcu, 16KB flash, 512B ram 32 | * based on work from Eric Smith's nonpariel 33 | * emualtes woodstock or spice core 34 | * this is a hobby project not suitable for any use. 35 | * please observe same GPL licensing terms as the original Nonpariel package 36 | * notice from orignal Nonpareil package 37 | 38 | Copyright 1995, 2003, 2004, 2005 Eric L. Smith 39 | 40 | Nonpareil is free software; you can redistribute it and/or modify it 41 | under the terms of the GNU General Public License version 2 as 42 | published by the Free Software Foundation. Note that I am not 43 | granting permission to redistribute or modify Nonpareil under the 44 | terms of any later version of the General Public License. 45 | 46 | Nonpareil is distributed in the hope that it will be useful, but 47 | WITHOUT ANY WARRANTY; without even the implied warranty of 48 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 49 | General Public License for more details. 50 | 51 | You should have received a copy of the GNU General Public License 52 | along with this program (in the file "COPYING"); if not, write to the 53 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 54 | MA 02111, USA. 55 | 56 | 57 | Parts list 58 | __________ 59 | 60 | * msp430g2553 (or other G series dip 20pin devices w/ 16k flash) 61 | * 2x sparkfun 4 digit bubble led module 62 | * 32x tactile buttons 63 | * 1x CR2032 SMD battery holder 64 | * 1x 47k, 1x 1k resistors 65 | * 2x 100nF (104), 1x 1nF (102) capacitor 66 | 67 | Application Notes 68 | _________________ 69 | 70 | * press-n-hold 1st row, 5th column (from top) for hp33C 71 | * press-n-hold 2nd row, 5th column for hp25C 72 | * press-n-hold 3nd row, 5th column for hp21 73 | * press-n-hold 4th row, 4th column for version info 74 | * press-n-hold 1st row, 4th column to show greetings 75 | * press-n-hold 1st row, 3rd column to edit greetings, use 0-9 to enter numbers and letters, Run/Stop to advance digit, Cls to abandon entry 76 | * press-n-hold Pgm/Run toggle button to edit default startup settings, use 'F' key to select rom, 'G' key to select speed, Pgm/Run will save setting and exit setup 77 | 78 | 79 | Schematic 80 | _________ 81 | 82 | 83 | * runs off 3V button cell 84 | 85 | MSP430G25x3 86 | ----------------- 87 | /|\| | 88 | | | | 89 | --|RST digit 0 P2.6|--\ 90 | | digit 1 P1.0|--\ digits bus (12) 91 | | digit 2 P2.7|-----//--+---------+ 92 | | digit 3 P1.1|--/ | ~ 3 units of 4 digits bubble led 93 | | digit 4 P1.2|--/ | | 94 | | digit 5 P1.3|--/ | +---------+ +---------+ +---------+ 95 | | digit 6 P2.0|--/ | | % % % % | | % % % % | | % % % % |----+ 96 | | digit 7 P1.4|--/ ~ +---------+ +---------+ +---------+ | 97 | | digit 8 P1.5|--/ | | 98 | | digit 9 P2.1|--/ | digits bus x 3 scan lines | 99 | | digit a P1.6|--/ +-----+-----+---/ ~~ /--+-----+-----+-----+ | 100 | | digit b P1.7|--/ _=_ | _=_ | _=_ | _/ ~~ /=_ | _=_ | _=_ | _=_ | | 101 | | scan X P2.5|-----o o-+-o o-+-o o-+-/ ~~ /o o-+-o o-+-o o-+-o o-+ | 102 | | scan Y P2.4|-----o o-+-o o-+-o o-+/ ~~ /-o o-+-o o-+-o o-+-o o-+ | 103 | | scan Z P2.3|-----o o-+-o o-+-o o-/ ~~ /+-o o-+-o o-+-o o-+-o o-+ | 104 | | | ~ 105 | | | (32 tactile button) | 106 | | | | 107 | | | +--------+ | 108 | | P2.2|--+---->|CLK ~CLR|---+---- Vcc | 109 | | | | | B|---+ | 110 | | | | | 0(d)QA|-\ | 111 | | | | | 1(f)QB|-\ segments bus (8) | 112 | | | - | 2(b)QC|--------------//-------------------+ 113 | | | | | | 3(a)QD|-/ 114 | | | | |1k | 4(g)QE|-/ 74hc164 segment driver 115 | | | - | 5(e)QF|-/ 116 | | | | | 6(c)QG|-/ 117 | | | +---->|A 7(h)QH|-/ 118 | | | | +--------+ 119 | | | === (102) 1 wire shift register via RC delay 120 | | | === 1nF to shift 1, Hi-Low-Hi 121 | +-----------------+ | to shift 0, Hi-Looooooow-Hi (>20us Lo) 122 | ___ 123 | /// 124 | 125 | 126 | Additional Notes 127 | ________________ 128 | 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /images/NP25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/NP25.jpg -------------------------------------------------------------------------------- /images/np25_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_01.jpg -------------------------------------------------------------------------------- /images/np25_parts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_parts.jpg -------------------------------------------------------------------------------- /images/np25_pcb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_pcb.jpg -------------------------------------------------------------------------------- /images/np25_solder01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_solder01.jpg -------------------------------------------------------------------------------- /images/np25_solder02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_solder02.jpg -------------------------------------------------------------------------------- /images/np25_solder03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_solder03.jpg -------------------------------------------------------------------------------- /images/np25_solder04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/images/np25_solder04.jpg -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## NP25 Calculator 4 | 5 | 6 | 7 | **msp430 Based Calculator Emulator for the HP-21, HP-25C, and HP-33C Calculators.** 8 | 9 | 10 | 11 | 12 |

13 | 14 | 15 | IMG IMG 16 | 17 | 18 | 19 | ### Description 20 | 21 | This is a hardware realization of Eric Smith's Nonpareil microcode simulator. 22 | 23 | The objective of the project is to re-create popular 70's RPN calculators such as the HP Woodstock and Spice series. 24 | 25 | Another goal of this project is to have the design as simple as possible so that the project can be re-produced by the average electronic hobbyist. 26 | 27 | A low power MSP430G2553 is used in this project. The DIP profile allows easy soldering. Only through-hole components are used. LED multiplexing is done w/ a 74hc164 shift register. LED modules are direct driven w/ pulsing to eliminate the need of current drivers. 28 | 29 | LED modules are used to mimic the original 70's calculators and gives a retro look to the end product. 30 | 31 | ### Application Notes 32 | 33 | 34 | 35 | - press-n-hold 1st row, 5th column (from top) for hp33C 36 | - press-n-hold 2nd row, 5th column for hp25C 37 | - press-n-hold 3nd row, 5th column for hp21 38 | - press-n-hold 4th row, 4th column for version info 39 | - press-n-hold 1st row, 4th column to show greetings 40 | - press-n-hold 1st row, 3rd column to edit greetings, use 0-9 to enter numbers and letters, Run/Stop to advance digit, Cls to abandon entry 41 | - press-n-hold Pgm/Run toggle button to edit default startup settings, use 'F' key to select rom, 'G' key to select speed, Pgm/Run will save setting and exit setup 42 | 43 | 44 | ### Parts and Components 45 | 46 | IMG 47 | 48 | 49 | 50 | - 1× MSP430G25x3, TI 16bit MCU w/ 16K Flash 512 byte RAM 51 | - 1× 74HC164, TTL shift register 52 | - 3× HP QDSP-6064 LED Module from Sparkfun, 4 digit 7 segment led module 53 | - 32× SMT Tactile Button 6x3mm, May be substituted w/ through-hole buttons 54 | - 1× CR2032 Battery Holder 55 | 56 | 57 | ### Schematic 58 | 59 | 60 | 61 | ``` 62 | * runs off 3V button cell 63 | 64 | MSP430G25x3 65 | ----------------- 66 | /|\| | 67 | | | | 68 | --|RST digit 0 P2.6|--\ 69 | | digit 1 P1.0|--\ digits bus (12) 70 | | digit 2 P2.7|-----//--+---------+ 71 | | digit 3 P1.1|--/ | ~ 3 units of 4 digits bubble led 72 | | digit 4 P1.2|--/ | | 73 | | digit 5 P1.3|--/ | +---------+ +---------+ +---------+ 74 | | digit 6 P2.0|--/ | | % % % % | | % % % % | | % % % % |----+ 75 | | digit 7 P1.4|--/ ~ +---------+ +---------+ +---------+ | 76 | | digit 8 P1.5|--/ | | 77 | | digit 9 P2.1|--/ | digits bus x 3 scan lines | 78 | | digit a P1.6|--/ +-----+-----+---/ ~~ /--+-----+-----+-----+ | 79 | | digit b P1.7|--/ _=_ | _=_ | _=_ | _/ ~~ /=_ | _=_ | _=_ | _=_ | | 80 | | scan X P2.5|-----o o-+-o o-+-o o-+-/ ~~ /o o-+-o o-+-o o-+-o o-+ | 81 | | scan Y P2.4|-----o o-+-o o-+-o o-+/ ~~ /-o o-+-o o-+-o o-+-o o-+ | 82 | | scan Z P2.3|-----o o-+-o o-+-o o-/ ~~ /+-o o-+-o o-+-o o-+-o o-+ | 83 | | | ~ 84 | | | (32 tactile button) | 85 | | | | 86 | | | +--------+ | 87 | | P2.2|--+---->|CLK ~CLR|---+---- Vcc | 88 | | | | | B|---+ | 89 | | | | | 0(d)QA|-\ | 90 | | | | | 1(f)QB|-\ segments bus (8) | 91 | | | - | 2(b)QC|--------------//-------------------+ 92 | | | | | | 3(a)QD|-/ 93 | | | | |1k | 4(g)QE|-/ 74hc164 segment driver 94 | | | - | 5(e)QF|-/ 95 | | | | | 6(c)QG|-/ 96 | | | +---->|A 7(h)QH|-/ 97 | | | | +--------+ 98 | | | === (102) 1 wire shift register via RC delay 99 | | | === 1nF to shift 1, Hi-Low-Hi 100 | +-----------------+ | to shift 0, Hi-Looooooow-Hi (>20us Lo) 101 | ___ 102 | /// 103 | ``` 104 | 105 | 106 | ### Printed Circuit Board 107 | 108 | 109 | 110 | IMG 111 | 112 | 113 | 114 | Create PCB board from the Fritzing design file included in my [github repository](https://github.com/simpleavr/NP25). 115 | 116 | You will need to install [Fritzing](http://fritzing.org/home/) and learn how to use it. 117 | 118 | Fabricate PCB yourself or order from a FAB house (export Gerber files from Fritzing). 119 | 120 | Acquire parts from the components list. 121 | 122 | 123 | 124 | ### Soldering 125 | 126 | 127 | 128 | The two layer PCB was designed to minimize component space, and as such, components are placed on both side of the PCB. The ICs and LED modules actually intrudes into each other's footprint as they are through hole components. To address this issue, both the ICs and the LED modules need to have their pins trimmed so that they do not protrude into the other side of the PCB. 129 | 130 | IMG 131 | 132 | 133 | 134 | It is best to place and solder the LED modules first. There are three of them and when finished soldering, use a wire cutter / trimmer to trim off the pins on the other side. This will allow proper placement of the ICs. 135 | 136 | IMG 137 | 138 | 139 | 140 | Next we need to trim the IC pins before placing them onto the PCB. As the other side of the through holes are blocked by the LED modules, they will not fit without trimming the pins. 141 | 142 | IMG 143 | 144 | 145 | 146 | With the ICs placed on the PCB. We could commence soldering them. This has to be done on the IC component (back) side instead of the usual solder (front) side. This is because the LED modules on the front side block the holes. 147 | 148 | IMG 149 | 150 | 151 | 152 | The rest of the components including the tactile switches and other passive components can be soldered the usual way. 153 | 154 | 155 | 156 | ### Software and Programming Tools 157 | 158 | 159 | 160 | Acquire a MSP430 MCU programmer. We need this to program the MCU. Easiest and least expensive way is to get a [TI LaunchPad G2](http://www.ti.com/tool/MSP-EXP430G2) and use it as a programmer. 161 | 162 | Download and install GCC compiler for MSP430. There are instructions on the web. You can also [install Energia](http://energia.nu) and use the GCC compiler in the bundle. 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /np25.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Chris Chung August 2014, simpleavr@gmail.com 4 | nonpariel physical (NP) is an standalone calculator microcode emulator; 5 | 6 | Compile w/ (example only, substitute w/ your setup path) 7 | 8 | /msp430-gcc -Os -Wall -ffunction-sections -fdata-sections -fno-inline-small-functions -Wl,-Map=np25.map,--cref -Wl,--relax -Wl,--gc-sections -I /cygdrive/c/mspgcc-20120406-p20120502/bin/../msp430/include -mmcu=msp430g2553 -o np25.elf np25.c 9 | 10 | September 2014, cc 11 | . this is a preview release upon request, project is not bugs free. 12 | 13 | . based on TI msp430g25x3 mcu, 16KB flash, 512B ram 14 | . based on work from Eric Smith's nonpariel 15 | . emualtes woodstock or spice core 16 | . this is a hobby project not suitable for any use. 17 | . please observe same GPL licensing terms as the original Nonpariel package 18 | . notice from orignal Nonpareil package 19 | 20 | Copyright 1995, 2003, 2004, 2005 Eric L. Smith 21 | 22 | Nonpareil is free software; you can redistribute it and/or modify it 23 | under the terms of the GNU General Public License version 2 as 24 | published by the Free Software Foundation. Note that I am not 25 | granting permission to redistribute or modify Nonpareil under the 26 | terms of any later version of the General Public License. 27 | 28 | Nonpareil is distributed in the hope that it will be useful, but 29 | WITHOUT ANY WARRANTY; without even the implied warranty of 30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 31 | General Public License for more details. 32 | 33 | You should have received a copy of the GNU General Public License 34 | along with this program (in the file "COPYING"); if not, write to the 35 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 36 | MA 02111, USA. 37 | */ 38 | 39 | //#define C_SPICE 40 | #define EMBEDDED 41 | #define C_STANDALONE 42 | 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | 50 | #ifdef EMBEDDED 51 | 52 | #define G2553 53 | #define MHZ 12 54 | 55 | #include 56 | //#include "../local/common.h" 57 | // 58 | #define ___use_cal_clk(x) \ 59 | BCSCTL1 = CALBC1_##x##MHZ; \ 60 | DCOCTL = CALDCO_##x##MHZ; 61 | 62 | #define __use_cal_clk(x) ___use_cal_clk(x) 63 | // 64 | 65 | #ifdef C_STANDALONE 66 | static volatile uint16_t _ticks = 0; 67 | static volatile uint8_t _clicks = 1; 68 | 69 | /* 70 | 71 | MSP430G25x3 72 | ----------------- 73 | /|\| | 74 | | | | 75 | --|RST digit 0 P2.6|--\ 76 | | digit 1 P1.0|--\ digits bus (12) 77 | | digit 2 P2.7|-----//--+---------+ 78 | | digit 3 P1.1|--/ | ~ 3 units of 4 digits bubble led 79 | | digit 4 P1.2|--/ | | 80 | | digit 5 P1.3|--/ | +---------+ +---------+ +---------+ 81 | | digit 6 P2.0|--/ | | % % % % | | % % % % | | % % % % |----+ 82 | | digit 7 P1.4|--/ ~ +---------+ +---------+ +---------+ | 83 | | digit 8 P1.5|--/ | | 84 | | digit 9 P2.1|--/ | digits bus x 3 scan lines | 85 | | digit a P1.6|--/ +-----+-----+---/ ~~ /--+-----+-----+-----+ | 86 | | digit b P1.7|--/ _=_ | _=_ | _=_ | _/ ~~ /=_ | _=_ | _=_ | _=_ | | 87 | | scan X P2.5|-----o o-+-o o-+-o o-+-/ ~~ /o o-+-o o-+-o o-+-o o-+ | 88 | | scan Y P2.4|-----o o-+-o o-+-o o-+/ ~~ /-o o-+-o o-+-o o-+-o o-+ | 89 | | scan Z P2.3|-----o o-+-o o-+-o o-/ ~~ /+-o o-+-o o-+-o o-+-o o-+ | 90 | | | ~ 91 | | | (32 tactile button) | 92 | | | | 93 | | | +--------+ | 94 | | P2.2|--+---->|CLK ~CLR|---+---- Vcc | 95 | | | | | B|---+ | 96 | | | | | 0(d)QA|-\ | 97 | | | | | 1(f)QB|-\ segments bus (8) | 98 | | | - | 2(b)QC|--------------//-------------------+ 99 | | | | | | 3(a)QD|-/ 100 | | | | |1k | 4(g)QE|-/ 74hc164 segment driver 101 | | | - | 5(e)QF|-/ 102 | | | | | 6(c)QG|-/ 103 | | | +---->|A 7(h)QH|-/ 104 | | | | +--------+ 105 | | | === (102) 1 wire shift register via RC delay 106 | | | === 1nF to shift 1, Hi-Low-Hi 107 | +-----------------+ | to shift 0, Hi-Looooooow-Hi (>20us Lo) 108 | ___ 109 | /// 110 | 111 | 74hc164 112 | o---------+ 113 | |A Vcc| 114 | |B QH| 115 | |QA QG| 116 | |QB QF| 117 | |QC QE| 118 | |QD ~CLR| 119 | |Gnd CLK| 120 | +---------+ 121 | 122 | 4 digit bubble led from sparkfun 123 | +--+--+--+--+--+ 124 | |a b 2 f d g| 125 | |1 e c 3 h 4| 126 | +--+--+--+--+--+ 127 | 128 | msp430g25x3 pinout (a=port1, b=port2) 129 | +--+--+--+--+--+--+--+--+--+ 130 | |- b6 b7 CK IO a7 a6 b5 b4 b3| 131 | | | 132 | |+ a0 a1 a2 a3 a4 a5 b0 b1 b2| 133 | o--+--+--+--+--+--+--+--+--+ 134 | */ 135 | 136 | 137 | #define C_PCB 138 | 139 | #ifdef C_PCB 140 | 141 | static const 142 | //__attribute__ ((section (".data_fe"))) 143 | uint8_t digit_map_p1[] = { 144 | 0x00, 1<<0, 0x00, 1<<1, 145 | 1<<2, 1<<3, 0x00, 1<<4, 146 | 1<<5, 0x00, 1<<6, 1<<7, 147 | }; 148 | 149 | static const 150 | //__attribute__ ((section (".data_fe"))) 151 | const uint8_t digit_map_p2[] = { 152 | 1<<6, 0x00, 1<<7, 0x00, 153 | 0x00, 0x00, 1<<0, 0x00, 154 | 0x00, 1<<1, 0x00, 0x00, 155 | }; 156 | 157 | #define CLK_LOW P2OUT &= ~BIT2 158 | #define CLK_HI P2OUT |= BIT2 159 | 160 | #define SPIN P2IN 161 | #define SPOUT P2OUT 162 | #define SPREN P2REN 163 | #define SPDIR P2DIR 164 | 165 | #define SCANX BIT5 166 | #define SCANY BIT4 167 | #define SCANZ BIT3 168 | #define ALL_SCANS (SCANX|SCANY|SCANZ) 169 | 170 | #define SEG_D BIT0 171 | #define SEG_F BIT1 172 | #define SEG_B BIT2 173 | #define SEG_A BIT3 174 | #define SEG_G BIT4 175 | #define SEG_E BIT5 176 | #define SEG_C BIT6 177 | #define SEG_H BIT7 178 | 179 | #else 180 | 181 | static const uint8_t digit_map_p1[] = { 182 | 1<<0, 1<<7, 1<<1, 1<<2, 183 | 0, 0, 0, 0, 184 | 0, 0, 0, 0, 185 | }; 186 | 187 | static const uint8_t digit_map_p2[] = { 188 | 0, 0, 0, 0, 189 | 1<<0, 1<<1, 1<<2, 1<<3, 190 | 1<<4, 1<<5, 1<<6, 1<<7, 191 | }; 192 | 193 | #define CLK_LOW P1OUT &= ~BIT3 194 | #define CLK_HI P1OUT |= BIT3 195 | 196 | #define SPIN P1IN 197 | #define SPOUT P1OUT 198 | #define SPREN P1REN 199 | #define SPDIR P1DIR 200 | #define SCANX BIT4 201 | #define SCANY BIT5 202 | #define SCANZ BIT6 203 | #define ALL_SCANS (SCANX|SCANY|SCANZ) 204 | 205 | #define SEG_A BIT0 206 | #define SEG_B BIT5 207 | #define SEG_C BIT2 208 | #define SEG_D BIT6 209 | #define SEG_E BIT3 210 | #define SEG_F BIT4 211 | #define SEG_G BIT7 212 | #define SEG_H BIT1 213 | 214 | #endif 215 | 216 | #define ALL_DIGITS_P1 \ 217 | (digit_map_p1[0]|digit_map_p1[1]|digit_map_p1[2]|digit_map_p1[3]| \ 218 | digit_map_p1[4]|digit_map_p1[5]|digit_map_p1[6]|digit_map_p1[7]| \ 219 | digit_map_p1[8]|digit_map_p1[9]|digit_map_p1[10]|digit_map_p1[11]) 220 | #define ALL_DIGITS_P2 \ 221 | (digit_map_p2[0]|digit_map_p2[1]|digit_map_p2[2]|digit_map_p2[3]| \ 222 | digit_map_p2[4]|digit_map_p2[5]|digit_map_p2[6]|digit_map_p2[7]| \ 223 | digit_map_p2[8]|digit_map_p2[9]|digit_map_p2[10]|digit_map_p2[11]) 224 | 225 | static const 226 | //__attribute__ ((section (".data_fe"))) 227 | uint8_t seg_map[] = { 228 | SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F, 229 | SEG_B|SEG_C, 230 | SEG_A|SEG_B|SEG_D|SEG_E|SEG_G, 231 | SEG_A|SEG_B|SEG_C|SEG_D|SEG_G, 232 | SEG_B|SEG_C|SEG_F|SEG_G, 233 | SEG_A|SEG_C|SEG_D|SEG_F|SEG_G, 234 | SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G, 235 | SEG_A|SEG_B|SEG_C, 236 | SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G, 237 | SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G, 238 | SEG_E|SEG_G, // r, H/F, o, p, e, blank 239 | //#ifdef C_SPICE 240 | //#else 241 | SEG_A|SEG_E|SEG_F|SEG_G, 242 | //#endif 243 | SEG_C|SEG_D|SEG_E|SEG_G, 244 | SEG_A|SEG_B|SEG_E|SEG_F|SEG_G, 245 | SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, 246 | 0x00, 247 | SEG_B|SEG_C|SEG_E|SEG_F|SEG_G, // for spice as 0xb 248 | //________________ a to z 249 | SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G, // A 250 | SEG_C|SEG_D|SEG_E|SEG_F|SEG_G, // b 251 | SEG_D|SEG_E|SEG_G, // c 252 | SEG_B|SEG_C|SEG_D|SEG_E|SEG_G, // d 253 | SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, // E 254 | SEG_A|SEG_E|SEG_F|SEG_G, // F 255 | SEG_A|SEG_C|SEG_D|SEG_E|SEG_F, // G 256 | SEG_C|SEG_E|SEG_F|SEG_G, // h 257 | SEG_E|SEG_F, // i 258 | SEG_B|SEG_C|SEG_D, // j 259 | SEG_D|SEG_F|SEG_G, // k 260 | SEG_D|SEG_E|SEG_F, // L 261 | SEG_A|SEG_C|SEG_E, // m 262 | SEG_C|SEG_E|SEG_G, // n 263 | SEG_C|SEG_D|SEG_E|SEG_G, // o 264 | SEG_A|SEG_B|SEG_E|SEG_F|SEG_G, // P 265 | SEG_A|SEG_B|SEG_C|SEG_F|SEG_G, // q 266 | SEG_E|SEG_G, // r 267 | SEG_A|SEG_C|SEG_D|SEG_F|SEG_G, // S 268 | SEG_D|SEG_E|SEG_F|SEG_G, // t 269 | SEG_C|SEG_D|SEG_E, // u 270 | SEG_C|SEG_D|SEG_E|SEG_F, // v 271 | SEG_B|SEG_D|SEG_F, // w 272 | SEG_B|SEG_C|SEG_E|SEG_F|SEG_G, // X 273 | SEG_B|SEG_C|SEG_D|SEG_F|SEG_G, // y 274 | SEG_A|SEG_B|SEG_D|SEG_E|SEG_G, // Z 275 | SEG_A|SEG_D|SEG_E|SEG_F|SEG_G, // [ 276 | SEG_A|SEG_B|SEG_F, // ^ 277 | SEG_A|SEG_B|SEG_C|SEG_D|SEG_G, // ] 278 | SEG_C|SEG_F|SEG_G, // blackslash 279 | SEG_D, // _ 280 | SEG_B, // ' 281 | }; 282 | 283 | /* 284 | keys layout 285 | // 25 286 | " SST BST GTO F G ", // 0xb3, 0xb2, 0xb1, 0xb0, 0xb4 287 | " X.Y RV STO RCL E+ ", // 0x43, 0x42, 0x41, 0x40, 0x44 288 | " ETR ETR CHS EEX CLX", // 0xd3, 0xd1, 0xd0, 0xd4 289 | " - 7 8 9 ", // 0x63, 0x62, 0x61, 0x60 290 | " + 4 5 6 ", // 0x93, 0x92, 0x91, 0x90 291 | " x 1 2 3 ", // 0x73, 0x72, 0x71, 0x70 292 | " / 0 . R/S ", // 0xa3, 0xa2, 0xa1, 0xa0 293 | 294 | // 34c 295 | " A B GSB F G ", // 0x34, 0x33, 0x32, 0x31, 0x30 296 | " X.Y GTO STO RCL h ", // 0x94, 0x93, 0x92, 0x91, 0x90 297 | " ETR ETR CHS EEX CLX", // 0x73, 0x72, 0x71, 0x70 298 | " - 7 8 9 ", // 0xa3, 0xa2, 0xa1, 0xa0 299 | " + 4 5 6 ", // 0x43, 0x42, 0x41, 0x40 300 | " x 1 2 3 ", // 0xd3, 0xd2, 0xd1, 0xd0 301 | " / 0 . R/S ", // 0x63, 0x62, 0x61, 0x60 302 | 303 | raw scancode on pcb version, code is digit * 4 + [123] for [XYZ] 304 | 305 | [8Z] ,35, 306 | [1X] [3X] [4X] [8X] [8Y] , 5,13,17,33,34, 307 | [1Y] [3Y] [4Y] [7Y] [aY] , 6,14,18,30,42, 308 | [1Z] [3Z] [4Z] [7X] [aX] , 7,15,19,29,41, 309 | [5Y] [5Z] [7Z] [aZ] ,22, 23,31,43, 310 | [0Z] [2Z] [bZ] [9Z] , 3, 11,47,39, 311 | [0X] [2X] [bX] [9X] , 1, 9,45,37, 312 | [0Y] [2Y] [bY] [9Y] , 2, 10,46,38, 313 | scan lines X, Y, Z 314 | 315 | */ 316 | #else 317 | 318 | #include "../local/uart.h" 319 | #define putchar(x) uart_putc(x) 320 | 321 | #endif 322 | 323 | #else 324 | 325 | #include 326 | #include 327 | #include 328 | 329 | #endif 330 | 331 | #ifdef C_STANDALONE 332 | #else 333 | 334 | static const uint8_t key_map[256] = { 335 | // 25c 336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, // 0x0f 337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x1f 338 | 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xa3, 0x00, 0x63, 0x91, 0x93, // 0x2f 339 | 0x92, 0x72, 0x71, 0x70, 0xa2, 0xa1, 0xa0, 0x62, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x3f 340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x4f 341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x5f 342 | 0x00, 0xb3, 0x00, 0xd4, 0xb1, 0x41, 0xb0, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x6f 343 | 0x00, 0x43, 0x40, 0xb2, 0x44, 0x00, 0x00, 0x42, 0xd0, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x7f 344 | // 34c 345 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, // 0x0f 346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x1f 347 | 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x63, 0x00, 0xa3, 0x41, 0x43, // 0x2f 348 | 0x42, 0xd2, 0xd1, 0xd0, 0x62, 0x61, 0x60, 0xa2, 0xa1, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x3f 349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x4f 350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x5f 351 | 0x00, 0x34, 0x00, 0x70, 0x32, 0x92, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x6f 352 | 0x00, 0x94, 0x91, 0x33, 0x90, 0x00, 0x00, 0x93, 0x71, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x7f 353 | }; 354 | 355 | #endif 356 | 357 | #define __USE_RAM 32 // our highest model 33c has 32 units 358 | 359 | #include "rom_21.h" 360 | #include "rom_25.h" 361 | #include "rom_33c.h" 362 | #include "np25.h" 363 | 364 | static volatile uint8_t _pgm_run=1; 365 | static volatile uint8_t _state=0; 366 | static volatile uint8_t _key=0; 367 | static int8_t _greetings[12]; 368 | 369 | #define ST_RAM_LOADED BIT7 370 | #define ST_KEY_PRESSED BIT6 371 | #define ST_KEY_RELEASED BIT5 372 | #define ST_ALPHA_MSG BIT4 373 | #define ST_HW_SLOW BIT3 374 | #define ST_HW_TEST BIT2 375 | #define ST_ROM_BIT1 BIT1 376 | #define ST_ROM_BIT0 BIT0 377 | #define ST_ROM (ST_ROM_BIT1|ST_ROM_BIT0) 378 | 379 | /* 380 | base=142 381 | 64+64+64 382 | 4 blocks 112+112+112+112=448 383 | 142 + [224] = 366 used + 32 ram_reserve = 392 384 | > offset 224 385 | get block 2+3 (224) write 192 to info BCD, 32 into ram_reserve 386 | */ 387 | 388 | //________________________________________________________________________________ 389 | void flash_write(uint8_t bank, char *src, uint8_t cnt) { 390 | char *flash = (char*) 0x1040; 391 | if (bank) flash += 0x40; 392 | FCTL2 = FWKEY+FSSEL0+FN2; 393 | FCTL1 = FWKEY+ERASE; 394 | FCTL3 = FWKEY; 395 | *flash = 0; 396 | 397 | FCTL1 = FWKEY+WRT; 398 | 399 | uint8_t i; 400 | for (i=0;if 410 | #define _MSG_LEN act_reg->p 411 | #define _EDIT_POS act_reg->key_buf 412 | #define _MSG_PTR act_reg->rom 413 | #define _LAST_KEY act_reg->flags 414 | 415 | //volatile uint8_t _MSG_POS=0, _MSG_LEN=0; 416 | //volatile const char *_MSG_PTR=0; 417 | 418 | /* 419 | hp-25 5 420 | pos 11 digit 0(x)....... 11(h) 421 | pos 10 digit 0(x).......10(h)11(p) 422 | pos 2 digit 0(x)...9(h)10(p)11(-) 423 | */ 424 | 425 | 426 | //________________________________________________________________________________ 427 | uint8_t char_at_digit(uint8_t digit) { 428 | uint8_t seg=0; 429 | if ((digit==_EDIT_POS) && (_ticks&0x200)) return 0; 430 | if (digit>=_MSG_POS) { 431 | uint8_t i = digit-_MSG_POS; 432 | if (i < _MSG_LEN) { 433 | if (_MSG_PTR[i] >= '0') { if (i >= 'A') 434 | seg = seg_map[_MSG_PTR[i] - 32 - '0']; 435 | else 436 | seg = seg_map[_MSG_PTR[i] - '0']; 437 | }//if 438 | }//if 439 | }//if 440 | return seg; 441 | } 442 | //________________________________________________________________________________ 443 | void show_msg(const uint8_t *msg, uint8_t delay_units) { 444 | 445 | _MSG_PTR = msg; 446 | while (*msg++) _MSG_LEN++; 447 | _MSG_POS = 11; 448 | _state |= ST_ALPHA_MSG; 449 | //______ accelerate.....brake 6,5,4,3,2,1,2,3,4,5,6 450 | // b,a,9,8,7,6,5,4,3,2,1 451 | while (_MSG_POS--) { 452 | _clicks = _MSG_POS>=6 ? _MSG_POS-5 : 6-_MSG_POS; 453 | LPM0; 454 | }//while 455 | _MSG_POS = 0; 456 | 457 | if (delay_units) _clicks = delay_units; 458 | LPM0; 459 | _state &= ~ST_ALPHA_MSG; 460 | } 461 | 462 | //________________________________________________________________________________ 463 | int main() { 464 | 465 | #ifdef EMBEDDED 466 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT 467 | __use_cal_clk(MHZ); 468 | //FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator 469 | FCTL2 = FWKEY + FSSEL0 + FN2; // for 12Mhz 470 | 471 | #ifdef C_STANDALONE 472 | 473 | TA0CCR0 = MHZ * 1000; // start w/ 1ms 474 | TA0CCTL0 = CCIE; 475 | TA0CTL = TASSEL_2 + MC_2; // SMCLK, cont. 476 | 477 | P1SEL = P2SEL = 0; 478 | 479 | P1OUT = ALL_DIGITS_P1; 480 | P2OUT = ALL_DIGITS_P2; 481 | P1DIR = P2DIR = 0xff; 482 | 483 | SPOUT |= ALL_SCANS; 484 | SPREN |= ALL_SCANS; 485 | SPDIR &= ~ALL_SCANS; 486 | 487 | #else 488 | uint8_t usage = 0; 489 | uart_init(); 490 | #endif 491 | 492 | __bis_SR_register(GIE); 493 | 494 | #else 495 | set_conio_terminal_mode(); 496 | 497 | #endif 498 | 499 | 500 | /* 501 | key_map['0'] = 0x92; key_map['1'] = 0x72; key_map['2'] = 0x71; key_map['3'] = 0x70; 502 | key_map['4'] = 0xa2; key_map['5'] = 0xa1; key_map['6'] = 0xa0; key_map['7'] = 0x62; 503 | key_map['8'] = 0x61; key_map['9'] = 0x60; key_map['.'] = 0x91; key_map['-'] = 0x63; 504 | key_map['+'] = 0xa3; key_map['*'] = 0x73; key_map['/'] = 0x93; key_map['\r'] = 0x90; // run/stop 505 | key_map['a'] = 0xb3; key_map['s'] = 0xb2; key_map['d'] = 0xb1; key_map['f'] = 0xb0; key_map['g'] = 0xb4; // SST BST GTO F G 506 | key_map['q'] = 0x43; key_map['w'] = 0x42; key_map['e'] = 0x41; key_map['r'] = 0x40; key_map['t'] = 0x44; // X.Y RV STO RCL E+ 507 | key_map[' '] = 0xd3; key_map['z'] = 0xd1; key_map['x'] = 0xd0; key_map['c'] = 0xd4; // ETR ETR CHS EEX CLX 508 | */ 509 | #define RAM_OFFSET (7*9) 510 | #define RAM_SIZE (7*7) // 49 program steps 511 | 512 | woodstock_clear_memory(); 513 | //______ load from flash, we just need the status config, but we load everything since 514 | // we might need to write it back and flash always write in full blocks 515 | uint8_t idx = RAM_SIZE + 1 + 12; // 49 program steps + config byte + 12 byte greeting 516 | while (idx--) ((char*) act_reg->ram)[idx+RAM_OFFSET] = *((char*) (0x1040+idx)); 517 | _state = ((char*) (act_reg->ram))[RAM_OFFSET+RAM_SIZE] & (ST_HW_SLOW|ST_ROM); 518 | 519 | for (idx=0;idx<12;idx++) _greetings[idx] = ((uint8_t*) act_reg->ram)[RAM_OFFSET+50+idx]; 520 | _MSG_PTR = (uint8_t*) _greetings; 521 | 522 | LPM0; 523 | 524 | while (_key == 35) _state |= ST_HW_TEST; // pgm key pressed, enter setup 525 | 526 | _EDIT_POS = 99; 527 | uint8_t save_state = _state; 528 | switch (_key) { 529 | // 530 | case 17: // "goto" key for edit easter egg message 531 | while (!(_state&ST_KEY_RELEASED)) __asm("nop"); 532 | _state &= ~ST_KEY_RELEASED; 533 | { 534 | uint8_t *p= (uint8_t*) _MSG_PTR; 535 | //uint8_t i=0; 536 | _EDIT_POS = 0; 537 | _MSG_POS = 0; 538 | _MSG_LEN = 12; 539 | _LAST_KEY = 99; 540 | _state |= ST_ALPHA_MSG; // start show 541 | while (1) { 542 | LPM0; // wait key 543 | uint8_t k = _key; 544 | if (k == 41) break; 545 | if (k == 38) { 546 | _EDIT_POS++; 547 | p++; 548 | _LAST_KEY = 99; 549 | if (_EDIT_POS>=12) { 550 | //__________ the last 12 bytes are the greetings 551 | flash_write(0, (char*) act_reg->ram + RAM_OFFSET, RAM_SIZE); 552 | break; 553 | }//if 554 | }//if 555 | switch (k) { 556 | case 10: k = 0; break; 557 | case 9: k = 1; break; 558 | case 45: k = 2; break; 559 | case 37: k = 3; break; 560 | case 11: k = 4; break; 561 | case 47: k = 5; break; 562 | case 39: k = 6; break; 563 | case 23: k = 7; break; 564 | case 31: k = 8; break; 565 | case 43: k = 9; break; 566 | default: k = 10; break; 567 | }//switch 568 | const uint8_t key_adv[] = { 'A', 'D', 'G', 'J', 'M', 'P', 'T', 'W', '[', }; 569 | if (k < 10) { 570 | if (k == _LAST_KEY) { 571 | if (k >= 2) { 572 | if (*p <= '9') { 573 | *p = key_adv[k-2]; 574 | }//if 575 | else { 576 | *p = *p + 1; 577 | if (*p == key_adv[k-1]) 578 | *p = '0' + k; 579 | }//else 580 | }//if 581 | else { 582 | if (k == 0) { 583 | *p = *p == '0' ? '?' : '0'; 584 | }//if 585 | }//else 586 | }//if 587 | else { 588 | if (k < 10) { 589 | *p = '0' + k; 590 | _LAST_KEY = k; 591 | }//if 592 | }//else 593 | }//if 594 | }//while 595 | } 596 | _state &= ~ST_ALPHA_MSG; 597 | break; 598 | // 599 | case 33: // F key, show secret message 600 | show_msg(_MSG_PTR, 100); 601 | break; 602 | // right top, going down on same column 603 | case 34: 604 | _state = 1; 605 | show_msg((const uint8_t*) "HP33C ROM", 100); 606 | break; 607 | case 42: 608 | _state = 2; 609 | show_msg((const uint8_t*) "HP25C ROM", 100); 610 | break; 611 | case 41: 612 | _state = 3; 613 | show_msg((const uint8_t*) "HP21 ROM", 100); 614 | break; 615 | case 43: 616 | show_msg((const uint8_t*) "NP25 VER 3", 100); 617 | break; 618 | }//switch 619 | if (save_state&ST_HW_SLOW) _state |= ST_HW_SLOW; 620 | 621 | while (_state&ST_HW_TEST) { 622 | LPM0; 623 | switch (_key) { 624 | case 35: // pgm/run key 625 | _state &= ~ST_HW_TEST; 626 | flash_write(0, (char*) act_reg->ram + RAM_OFFSET, RAM_SIZE); 627 | break; 628 | case 33: // F key to rotate rom 629 | // 00..01, 01..10, 10..11, 11..01 630 | if ((_state&ST_ROM)==0x03) 631 | _state &= ~ST_ROM; 632 | _state++; 633 | break; 634 | case 34: // G key to toggle fast and slow cpu 635 | _state ^= ST_HW_SLOW; 636 | break; 637 | }//switch 638 | }//while 639 | 640 | /* 641 | if ((_state&ST_ROM)==0x02) { // 25c use alternate rom 642 | uint8_t i = 7*16 + 1; 643 | while (i--) ((char*) act_reg->ram)[i] = *((char*) (0x1040+i)); 644 | }//if 645 | */ 646 | 647 | woodstock_set_rom(_state&ST_ROM); 648 | woodstock_new_processor(); 649 | 650 | _state &= ~(ST_RAM_LOADED|ST_KEY_PRESSED|ST_KEY_RELEASED); 651 | 652 | uint8_t done=0; 653 | #ifdef C_STANDALONE 654 | #else 655 | uint8_t c=0; 656 | #endif 657 | uint8_t release_in=0; 658 | 659 | woodstock_set_ext_flag (3, _pgm_run); // set run mode 660 | 661 | while (!done) { 662 | #ifdef C_STANDALONE 663 | if (_state) { 664 | if (_state & ST_KEY_PRESSED) { 665 | if (!(_state&ST_RAM_LOADED)) { 666 | //______ lets load ram from flash (pretend continous memory) at 1st key 667 | // need to do it here after cpu initialized 668 | if (_pgm_run && ((_state&ST_ROM) != 0x03)) { 669 | _state |= ST_RAM_LOADED; 670 | char *src = (char*) 0x1040; 671 | uint8_t c = RAM_SIZE; 672 | if (!(_state&ST_ROM_BIT0)) src += 0x40; // next infomem block for hp25 673 | while (c--) ((char*) act_reg->ram)[c+RAM_OFFSET] = *(src + c); 674 | }//if 675 | }//if 676 | if (_key == 35) { 677 | woodstock_set_ext_flag (3, _pgm_run ^= 1); // pgm-run toggle 678 | //___ to run mode, write flash 679 | if (_pgm_run && ((_state&ST_ROM) != 0x03)) { 680 | uint16_t des = 0x1040; 681 | if (!(_state&ST_ROM_BIT0)) des += 0x40; 682 | flash_write(_state&ST_ROM_BIT0 ? 0 : 1, 683 | (char*) act_reg->ram + RAM_OFFSET, RAM_SIZE); 684 | }//if 685 | }//if 686 | else { 687 | //if (session_key_map[_key]) woodstock_press_key(session_key_map[_key]); 688 | sim_check_key(_key); 689 | }//else 690 | _state &= ~ST_KEY_PRESSED; 691 | }//if 692 | else if (_state & ST_KEY_RELEASED) { 693 | woodstock_release_key(); 694 | _state &= ~ST_KEY_RELEASED; 695 | }//if 696 | }//if 697 | #else 698 | #ifdef EMBEDDED 699 | if (c || uart_getc(&c)) { 700 | //P1OUT ^= BIT0; 701 | if (!usage) { 702 | usage = 1; 703 | uart_puts("\x1b[1;1H"); 704 | uart_puts("\x1b[0J"); 705 | uart_puts("\n\r\n\r\n\r"); 706 | uart_puts(" SST BST GTO F G \n\r"); 707 | uart_puts(" X.Y RV STO RCL E+ \n\r"); 708 | uart_puts(" ETR ETR CHS EEX CLX\n\r"); 709 | uart_puts(" - 7 8 9 \n\r"); 710 | uart_puts(" + 4 5 6 \n\r"); 711 | uart_puts(" x 1 2 4 \n\r"); 712 | uart_puts(" / 0 . R/S \n\r\n\r"); 713 | uart_puts("\x1b[9A"); 714 | }//if 715 | #else 716 | if (kbhit()) { 717 | c = getch(); 718 | #endif 719 | switch (c) { 720 | case 27: 721 | done = 1; 722 | break; 723 | case '\\': 724 | woodstock_new_processor(); 725 | _pgm_run = 0; 726 | break; 727 | case '=': 728 | woodstock_set_ext_flag (3, _pgm_run ^= 1); // pgm-run toggle 729 | //if (_pgm_run) flash_write(0xfc00, (char*)act_reg->ram, 7*__USE_RAM); 730 | break; 731 | default: 732 | #ifdef C_SPICE 733 | c += 128; 734 | #endif 735 | if (key_map[c]) { 736 | woodstock_press_key(key_map[c]); 737 | release_in = 10; 738 | }//if 739 | break; 740 | }//switch 741 | c = 0; 742 | }//if 743 | #endif 744 | if (!woodstock_execute_instruction()) break; 745 | if (release_in) { 746 | if (release_in == 1) woodstock_release_key(); 747 | release_in--; 748 | }//if 749 | 750 | #ifdef EMBEDDED 751 | if (_state&ST_HW_SLOW) __delay_cycles(MHZ*150); 752 | #else 753 | //usleep(100); 754 | #endif 755 | }//while 756 | 757 | return 0; 758 | 759 | } 760 | 761 | #ifdef EMBEDDED 762 | #ifdef C_STANDALONE 763 | 764 | volatile uint8_t _data=0; 765 | volatile uint8_t _digit=0; 766 | volatile uint8_t _keyscan=0; 767 | 768 | //________________________________________________________________________________ 769 | uint8_t hwtest_load_segments(uint8_t digit) { 770 | uint8_t res = 0x0f; 771 | 772 | switch (digit) { 773 | case 0: res = 'H'-'0'; break; 774 | case 1: res = 'P'-'0'; break; 775 | case 2: res = _state&ST_ROM_BIT1 ? 2 : 3; break; 776 | case 3: 777 | res = _state&ST_ROM_BIT0 ? (_state&ST_ROM_BIT1 ? 1 : 3) : 5; 778 | break; 779 | case 5: res = _state&ST_HW_SLOW ? 'S'-'0' : 'F'-'0'; break; 780 | case 6: res = _state&ST_HW_SLOW ? 'L'-'0' : 'A'-'0'; break; 781 | case 7: res = _state&ST_HW_SLOW ? 'O'-'0' : 'S'-'0'; break; 782 | case 8: res = _state&ST_HW_SLOW ? 'W'-'0' : 'T'-'0'; break; 783 | //case 7: res = _clicks/10; break; 784 | //case 8: res = _clicks%10; break; 785 | case 10: res = _key/10; break; 786 | case 11: res = _key%10; break; 787 | }//switch 788 | 789 | return seg_map[res]; 790 | } 791 | //________________________________________________________________________________ 792 | #pragma vector=TIMER0_A0_VECTOR 793 | __interrupt void Timer0_A0_iSR(void) { 794 | 795 | P1OUT |= ALL_DIGITS_P1; // 74hc164 friedly, all digit off 796 | P2OUT |= ALL_DIGITS_P2; 797 | 798 | uint8_t clock=8,segs=8; 799 | while (clock--) { 800 | if ((_data&0x01)) { 801 | CLK_LOW; 802 | CLK_HI; 803 | }//if 804 | else { 805 | CLK_LOW; 806 | //__delay_cycles((MHZ*3)/4); 807 | __delay_cycles(MHZ); 808 | segs--; 809 | CLK_HI; 810 | }//else 811 | _data >>= 1; 812 | //__delay_cycles(25); 813 | }//while 814 | 815 | if (_digit == 12) { // key scanning cycle 816 | uint8_t i; 817 | if (_key) { 818 | //_____ check for key release 819 | i = _key>>2; 820 | P2OUT &= ~digit_map_p2[i]; 821 | P1OUT &= ~digit_map_p1[i]; 822 | if ((SPIN&ALL_SCANS) == ALL_SCANS) { 823 | if (_key != 35) _state |= ST_KEY_RELEASED; 824 | _key = 0; 825 | }//if 826 | __delay_cycles(MHZ*100); 827 | }//if 828 | else { 829 | //for (i=0;i<12;!_key&&i++) { 830 | for (i=0;i<12;i++) { 831 | if (i!=6) { 832 | //P2OUT |= ALL_DIGITS_P2; 833 | //P1OUT |= ALL_DIGITS_P1; 834 | P2OUT &= ~digit_map_p2[i]; 835 | P1OUT &= ~digit_map_p1[i]; 836 | 837 | if ((SPIN&ALL_SCANS) != ALL_SCANS) { 838 | if (!(SPIN&SCANY)) _key = 2+(i<<2); 839 | else if (!(SPIN&SCANZ)) _key = 3+(i<<2); 840 | else if (!(SPIN&SCANX)) _key = 1+(i<<2); 841 | // SCAN XYZ BIT 5,4,3 842 | if (_key) { 843 | _state |= ST_KEY_PRESSED; 844 | LPM0_EXIT; 845 | //_key = key; 846 | break; 847 | }//if 848 | }//if 849 | P2OUT |= digit_map_p2[i]; 850 | P1OUT |= digit_map_p1[i]; 851 | }//if 852 | }//for 853 | }//else 854 | }//if 855 | else { 856 | //______ done shifting segments, turn on digit if register says so 857 | // 858 | // 859 | if (act_reg->flags&F_DISPLAY_ON || _state&(ST_ALPHA_MSG|ST_HW_TEST)) { 860 | P1OUT &= ~digit_map_p1[_digit]; 861 | P2OUT &= ~digit_map_p2[_digit]; 862 | }//if 863 | // 864 | // 865 | //TA0CCR0 += MHZ * 1000; // time till next, 1ms per digit 866 | // load balance led brightness 867 | segs += 6; // 7..15 868 | TA0CCR0 += MHZ * segs * 60; 869 | }//else 870 | 871 | //______ prepare for next digit 872 | if (_digit>=12) { 873 | _digit = 0; 874 | TA0CCR0 += MHZ * 50; // for quick turn-around 875 | }//if 876 | else { 877 | _digit++; 878 | // less frequent key scanning for led brightness 879 | if (_digit==12 && _keyscan++&0x03) _digit = 0; 880 | }//else 881 | 882 | 883 | //if (_key && !digit) _data = seg_map[_key/3]; 884 | //if (_key) _data = seg_map[0xe]; 885 | 886 | if (_digit == 12) { 887 | _data = 0; // key scan cycle, blank all segments 888 | }//if 889 | else { 890 | if (_state&ST_ALPHA_MSG) { 891 | //_data = _alpha_msg[_digit]; 892 | _data = char_at_digit(_digit); 893 | }//if 894 | else { 895 | if (_state&ST_HW_TEST) 896 | _data = hwtest_load_segments(_digit); 897 | else 898 | _data = sim_load_segments(_digit); 899 | }//else 900 | }//else 901 | 902 | // 903 | _ticks++; 904 | if (!(_ticks%50) && _clicks) { 905 | _clicks--; 906 | if (!_clicks) LPM0_EXIT; 907 | }//if 908 | // 909 | } 910 | 911 | #else 912 | 913 | //________________________________________________________________________________ 914 | #pragma vector=PORT1_VECTOR 915 | __interrupt void PORT1_ISR (void) { 916 | uart_port1_isr(); 917 | } 918 | 919 | //_______________________________________________________________________________ 920 | #pragma vector=TIMER0_A0_VECTOR 921 | __interrupt void Timer0_A0_ISR (void) { 922 | uart_timera0_isr(); 923 | } 924 | 925 | //________________________________________________________________________________ 926 | #pragma vector=WDT_VECTOR 927 | __interrupt void WDT_ISR (void) { 928 | //_ticks++; 929 | } 930 | #endif 931 | 932 | #endif 933 | 934 | -------------------------------------------------------------------------------- /np25.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Chris Chung August 2014 4 | nonpariel physical (NP) is an standalone calculator microcode emulator; 5 | 6 | $Id: proc_woodstock.h 686 2005-05-26 09:06:45Z eric $ 7 | Copyright 1995, 2003, 2004, 2005 Eric L. Smith 8 | 9 | Nonpareil is free software; you can redistribute it and/or modify it 10 | under the terms of the GNU General Public License version 2 as 11 | published by the Free Software Foundation. Note that I am not 12 | granting permission to redistribute or modify Nonpareil under the 13 | terms of any later version of the General Public License. 14 | 15 | Nonpareil is distributed in the hope that it will be useful, but 16 | WITHOUT ANY WARRANTY; without even the implied warranty of 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 | General Public License for more details. 19 | 20 | You should have received a copy of the GNU General Public License 21 | along with this program (in the file "COPYING"); if not, write to the 22 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 23 | MA 02111, USA. 24 | */ 25 | 26 | 27 | #define WSIZE 14 28 | #define EXPSIZE 3 // two exponent and one exponent sign digit 29 | 30 | typedef uint8_t digit_t; 31 | typedef digit_t reg_t [WSIZE]; 32 | typedef digit_t creg_t [WSIZE/2]; 33 | 34 | #ifdef C_SPICE 35 | 36 | #define C_LEFT_SCAN (WSIZE-2) 37 | #define C_RIGHT_SCAN 3 38 | 39 | #else 40 | 41 | #define C_LEFT_SCAN (WSIZE-1) 42 | #define C_RIGHT_SCAN 2 43 | 44 | #endif 45 | 46 | 47 | #define SSIZE 16 48 | #define STACK_SIZE 2 49 | 50 | #define EXT_FLAG_SIZE 16 51 | 52 | #define PAGE_SIZE 1024 53 | #define MAX_PAGE 4 54 | #define MAX_BANK 2 55 | 56 | typedef uint16_t rom_addr_t; 57 | 58 | 59 | typedef enum { 60 | norm, 61 | branch, 62 | selftest 63 | } inst_state_t; 64 | 65 | 66 | #define F_DECIMAL (1<<0) 67 | #define F_CARRY (1<<1) 68 | #define F_PREV_CARRY (1<<2) 69 | #define F_DEL_ROM (1<<3) 70 | #define F_KEY (1<<4) 71 | #define F_DISPLAY_ON (1<<5) 72 | #define F_DISPLAY_14 (1<<6) 73 | #define F_BANK (1<<7) 74 | 75 | typedef struct { 76 | reg_t a; 77 | reg_t b; 78 | reg_t c; 79 | creg_t y; 80 | creg_t z; 81 | creg_t t; 82 | creg_t m1; 83 | creg_t m2; 84 | 85 | digit_t f; 86 | digit_t p; 87 | 88 | uint8_t flags; 89 | /* 90 | bool decimal; 91 | bool carry, prev_carry; 92 | bool del_rom_flag; 93 | bool key_flag; // true if a key is down 94 | bool display_enable; 95 | bool display_14_digit; // true after RESET TWF instruction 96 | */ 97 | 98 | //bool s [SSIZE]; // ACT flags (status bits) 99 | //bool ext_flag [EXT_FLAG_SIZE]; // external flags, cause status or CRC bits to get set 100 | uint16_t ext_flag; // external flags, cause status or CRC 101 | uint16_t s; // ACT flags (status bits) 102 | 103 | uint16_t pc; 104 | 105 | uint16_t del_rom; 106 | 107 | inst_state_t inst_state; 108 | 109 | int16_t sp; /* stack pointer */ 110 | int16_t stack [STACK_SIZE]; 111 | 112 | int16_t prev_pc; /* used to store complete five-digit octal address of instruction */ 113 | //int crc; 114 | // keyboard 115 | 116 | uint8_t key_buf; /* most recently pressed key */ 117 | 118 | // display 119 | 120 | //uint8_t left_scan; 121 | //uint8_t right_scan; 122 | #ifdef C_STANDALONE 123 | #else 124 | uint8_t display_scan_position; /* word index, left_scan down to right_scan */ 125 | uint8_t display_digit_position; /* character index, 0 to MAX_DIGIT_POSITION-1 */ 126 | #endif 127 | 128 | //void (* display_scan_fn) (void); 129 | 130 | //void (* op_fcn [1024])(int opcode); 131 | 132 | // ROM: 133 | /* 134 | uint8_t bank_exists [MAX_PAGE]; // bitmap 135 | bool bank; // only a single global bank bit 136 | */ 137 | const uint8_t *rom; 138 | const uint8_t *rom_ex; 139 | /* 140 | bool *rom_exists; 141 | bool *rom_breakpoint; 142 | */ 143 | 144 | // RAM: 145 | int16_t ram_addr; /* selected RAM address */ 146 | creg_t ram[__USE_RAM]; 147 | } act_reg_t; 148 | 149 | //FIXES 150 | /* 151 | 152 | gcc wood.c digit_ops.c 153 | 154 | keys layout 155 | " SST BST GTO F G ", // 0xb3, 0xb2, 0xb1, 0xb0, 0xb4 156 | " X.Y RV STO RCL E+ ", // 0x43, 0x42, 0x41, 0x40, 0x44 157 | " ETR ETR CHS EEX CLX", // 0xd3, 0xd1, 0xd0, 0xd4 158 | " - 7 8 9 ", // 0x63, 0x62, 0x61, 0x60 159 | " + 4 5 6 ", // 0xa3, 0xa2, 0xa1, 0xa0 160 | " x 1 2 4 ", // 0x73, 0x72, 0x71, 0x70 161 | " / 0 . R/S ", // 0x93, 0x92, 0x91, 0x90 162 | 163 | */ 164 | #define MAX_DIGIT_POSITION 15 /* Classic, Topcat, 67, maybe 19C */ 165 | 166 | 167 | #ifdef C_STANDALONE 168 | 169 | typedef uint8_t segment_bitmap_t; // 8 segments for our led 170 | #define CHAR_MINUS SEG_G 171 | #define CHAR_DOT SEG_H 172 | 173 | #else 174 | 175 | typedef uint16_t segment_bitmap_t; // 16bit 176 | #define CHAR_MINUS 0x40 177 | #define CHAR_DOT 0x80 178 | //static segment_bitmap_t last_display_segments[MAX_DIGIT_POSITION]; 179 | static segment_bitmap_t _display_segments[MAX_DIGIT_POSITION]; 180 | static uint16_t last_seg_crc=0; 181 | 182 | #endif 183 | 184 | static act_reg_t _act_reg, *act_reg=&_act_reg; 185 | 186 | static inline uint8_t arithmetic_base (act_reg_t *act_reg) { 187 | return (act_reg->flags & F_DECIMAL ? 10 : 16); 188 | } 189 | 190 | static void bad_op (int opcode) { } 191 | 192 | void reg_zero (digit_t *dest, int first, int last) { 193 | int i; 194 | for (i = first; i <= last; i++) dest [i] = 0; 195 | } 196 | 197 | void reg_copy (digit_t *dest, const digit_t *src, int first, int last) { 198 | int i; 199 | for (i = first; i <= last; i++) dest [i] = src [i]; 200 | } 201 | 202 | void reg_exch (digit_t *dest, digit_t *src, int first, int last) { 203 | int i, t; 204 | for (i = first; i <= last; i++) { 205 | t = dest [i]; 206 | dest [i] = src [i]; 207 | src [i] = t; 208 | }//for 209 | } 210 | 211 | static digit_t do_add (digit_t x, digit_t y, uint8_t carry, uint8_t base) { 212 | int res; 213 | 214 | res = x + y + ((act_reg->flags&carry)?1:0); 215 | if (res >= base) { 216 | res -= base; 217 | act_reg->flags |= carry; 218 | }//if 219 | else { 220 | act_reg->flags &= ~carry; 221 | }//else 222 | return (res); 223 | } 224 | 225 | 226 | static digit_t do_sub (digit_t x, digit_t y, uint8_t carry, uint8_t base) { 227 | int res; 228 | 229 | res = (x - y) - ((act_reg->flags&carry)?1:0); 230 | if (res < 0) { 231 | res += base; 232 | act_reg->flags |= carry; 233 | }//if 234 | else { 235 | act_reg->flags &= ~carry; 236 | }//else 237 | return (res); 238 | } 239 | 240 | void reg_add (digit_t *dest, const digit_t *src1, const digit_t *src2, int first, int last, uint8_t carry, uint8_t base) { 241 | int i; 242 | 243 | for (i = first; i <= last; i++) { 244 | int s2 = src2 ? src2[i] : 0; 245 | dest [i] = do_add (src1[i], s2, carry, base); 246 | }//for 247 | } 248 | 249 | 250 | void reg_sub (digit_t *dest, const digit_t *src1, const digit_t *src2, int first, int last, uint8_t carry, uint8_t base) { 251 | int i; 252 | 253 | for (i = first; i <= last; i++) { 254 | int s1 = src1 ? src1[i] : 0; 255 | int s2 = src2 ? src2[i] : 0; 256 | int d = do_sub (s1, s2, carry, base); 257 | if (dest) dest [i] = d; 258 | }//for 259 | } 260 | 261 | 262 | // $$$ if in decimal mode, do illegal digits get normalized? 263 | void reg_test_equal (const digit_t *src1, const digit_t *src2, int first, int last, uint8_t carry) { 264 | int i; 265 | 266 | act_reg->flags |= carry; 267 | for (i = first; i <= last; i++) { 268 | int s2 = src2 ? src2 [i] : 0; 269 | //(*carry) &= (src1 [i] == s2); 270 | if ((act_reg->flags & carry) && (src1 [i] != s2)) 271 | act_reg->flags &= ~carry; 272 | }//for 273 | } 274 | 275 | 276 | // $$$ if in decimal mode, do illegal digits get normalized? 277 | void reg_test_nonequal (const digit_t *src1, const digit_t *src2, int first, int last, uint8_t carry) { 278 | int i; 279 | 280 | //*carry = false; 281 | act_reg->flags &= ~carry; 282 | for (i = first; i <= last; i++) { 283 | int s2 = src2 ? src2 [i] : 0; 284 | //(*carry) |= (src1 [i] != s2); 285 | if (src1 [i] != s2) 286 | act_reg->flags |= carry; 287 | }//for 288 | } 289 | 290 | 291 | void reg_shift_right (digit_t *reg, int first, int last) { 292 | int i; 293 | for (i = first; i <= last; i++) reg [i] = (i == last) ? 0 : reg [i+1]; 294 | } 295 | 296 | 297 | void reg_shift_left (digit_t *reg, int first, int last) { 298 | int i; 299 | for (i = last; i >= first; i--) reg [i] = (i == first) ? 0 : reg [i-1]; 300 | } 301 | 302 | static void op_arith (int opcode) { 303 | uint8_t op, field; 304 | int first = 0; 305 | int last = 0; 306 | 307 | op = opcode >> 5; 308 | field = (opcode >> 2) & 7; 309 | 310 | switch (field) { 311 | case 0: /* p */ 312 | first = act_reg->p; last = act_reg->p; 313 | if (act_reg->p >= WSIZE) last = 0; /* don't do anything */ 314 | break; 315 | case 1: /* wp */ 316 | first = 0; last = act_reg->p; 317 | if (act_reg->p >= WSIZE) last = WSIZE - 1; 318 | break; 319 | case 2: /* xs */ first = EXPSIZE - 1; last = EXPSIZE - 1; break; 320 | case 3: /* x */ first = 0; last = EXPSIZE - 1; break; 321 | case 4: /* s */ first = WSIZE - 1; last = WSIZE - 1; break; 322 | case 5: /* m */ first = EXPSIZE; last = WSIZE - 2; break; 323 | case 6: /* w */ first = 0; last = WSIZE - 1; break; 324 | case 7: /* ms */ first = EXPSIZE; last = WSIZE - 1; break; 325 | }//switch 326 | 327 | //act_reg->carry = 0; 328 | act_reg->flags &= ~F_CARRY; 329 | 330 | switch (op) { 331 | case 0x00: /* 0 -> a[f] */ 332 | reg_zero (act_reg->a, first, last); break; 333 | case 0x01: /* 0 -> b[f] */ 334 | reg_zero (act_reg->b, first, last); break; 335 | case 0x02: /* a exchange b[f] */ 336 | reg_exch (act_reg->a, act_reg->b, first, last); break; 337 | case 0x03: /* a -> b[f] */ 338 | reg_copy (act_reg->b, act_reg->a, first, last); break; 339 | case 0x04: /* a exchange c[f] */ 340 | reg_exch (act_reg->a, act_reg->c, first, last); break; 341 | case 0x05: /* c -> a[f] */ 342 | reg_copy (act_reg->a, act_reg->c, first, last); break; 343 | case 0x06: /* b -> c[f] */ 344 | reg_copy (act_reg->c, act_reg->b, first, last); break; 345 | case 0x07: /* b exchange c[f] */ 346 | reg_exch (act_reg->b, act_reg->c, first, last); break; 347 | case 0x08: /* 0 -> c[f] */ 348 | reg_zero (act_reg->c, first, last); break; 349 | case 0x09: /* a + b -> a[f] */ 350 | reg_add (act_reg->a, act_reg->a, act_reg->b, first, last, F_CARRY, arithmetic_base (act_reg)); break; 351 | case 0x0a: /* a + c -> a[f] */ 352 | reg_add (act_reg->a, act_reg->a, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 353 | case 0x0b: /* c + c -> c[f] */ 354 | reg_add (act_reg->c, act_reg->c, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 355 | case 0x0c: /* a + c -> c[f] */ 356 | reg_add (act_reg->c, act_reg->a, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 357 | case 0x0d: /* a + 1 -> a[f] */ 358 | //act_reg->carry = 1; 359 | act_reg->flags |= F_CARRY; 360 | reg_add (act_reg->a, act_reg->a, NULL, first, last, F_CARRY, arithmetic_base (act_reg)); break; 361 | case 0x0e: /* shift left a[f] */ 362 | reg_shift_left (act_reg->a, first, last); break; 363 | case 0x0f: /* c + 1 -> c[f] */ 364 | //act_reg->carry = 1; 365 | act_reg->flags |= F_CARRY; 366 | reg_add (act_reg->c, act_reg->c, NULL, first, last, F_CARRY, arithmetic_base (act_reg)); 367 | break; 368 | case 0x10: /* a - b -> a[f] */ 369 | reg_sub (act_reg->a, act_reg->a, act_reg->b, first, last, F_CARRY, arithmetic_base (act_reg)); break; 370 | case 0x11: /* a - c -> c[f] */ 371 | reg_sub (act_reg->c, act_reg->a, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 372 | case 0x12: /* a - 1 -> a[f] */ 373 | //act_reg->carry = 1; 374 | act_reg->flags |= F_CARRY; 375 | reg_sub (act_reg->a, act_reg->a, NULL, first, last, F_CARRY, arithmetic_base (act_reg)); 376 | break; 377 | case 0x13: /* c - 1 -> c[f] */ 378 | //act_reg->carry = 1; 379 | act_reg->flags |= F_CARRY; 380 | reg_sub (act_reg->c, act_reg->c, NULL, first, last, F_CARRY, arithmetic_base (act_reg)); 381 | break; 382 | case 0x14: /* 0 - c -> c[f] */ 383 | reg_sub (act_reg->c, NULL, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 384 | case 0x15: /* 0 - c - 1 -> c[f] */ 385 | //act_reg->carry = 1; 386 | act_reg->flags |= F_CARRY; 387 | reg_sub (act_reg->c, NULL, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); 388 | break; 389 | case 0x16: /* if b[f] = 0 */ 390 | act_reg->inst_state = branch; 391 | reg_test_nonequal (act_reg->b, NULL, first, last, F_CARRY); 392 | break; 393 | case 0x17: /* if c[f] = 0 */ 394 | act_reg->inst_state = branch; 395 | reg_test_nonequal (act_reg->c, NULL, first, last, F_CARRY); 396 | break; 397 | case 0x18: /* if a >= c[f] */ 398 | act_reg->inst_state = branch; 399 | reg_sub (NULL, act_reg->a, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); 400 | break; 401 | case 0x19: /* if a >= b[f] */ 402 | act_reg->inst_state = branch; 403 | reg_sub (NULL, act_reg->a, act_reg->b, first, last, F_CARRY, arithmetic_base (act_reg)); 404 | break; 405 | case 0x1a: /* if a[f] # 0 */ 406 | act_reg->inst_state = branch; 407 | reg_test_equal (act_reg->a, NULL, first, last, F_CARRY); 408 | break; 409 | case 0x1b: /* if c[f] # 0 */ 410 | act_reg->inst_state = branch; 411 | reg_test_equal (act_reg->c, NULL, first, last, F_CARRY); 412 | break; 413 | case 0x1c: /* a - c -> a[f] */ 414 | reg_sub (act_reg->a, act_reg->a, act_reg->c, first, last, F_CARRY, arithmetic_base (act_reg)); break; 415 | case 0x1d: /* shift right a[f] */ 416 | reg_shift_right (act_reg->a, first, last); break; 417 | case 0x1e: /* shift right b[f] */ 418 | reg_shift_right (act_reg->b, first, last); break; 419 | case 0x1f: /* shift right c[f] */ 420 | reg_shift_right (act_reg->c, first, last); break; 421 | }//switch 422 | } 423 | 424 | 425 | static void handle_del_rom (act_reg_t *act_reg) { 426 | //if (act_reg->del_rom_flag) { 427 | if (act_reg->flags & F_DEL_ROM) { 428 | act_reg->pc = (act_reg->del_rom << 8) + (act_reg->pc & 0377); 429 | //act_reg->del_rom_flag = 0; 430 | act_reg->flags &= ~F_DEL_ROM; 431 | }//if 432 | } 433 | 434 | 435 | static void op_goto (int opcode) { 436 | //if (! act_reg->prev_carry) { 437 | if (!(act_reg->flags & F_PREV_CARRY)) { 438 | act_reg->pc = (act_reg->pc & ~0377) | (opcode >> 2); 439 | handle_del_rom (act_reg); 440 | }//if 441 | } 442 | 443 | 444 | static void op_jsb (int opcode) { 445 | act_reg->stack [act_reg->sp] = act_reg->pc; 446 | act_reg->sp++; 447 | if (act_reg->sp >= STACK_SIZE) act_reg->sp = 0; 448 | act_reg->pc = (act_reg->pc & ~0377) | (opcode >> 2); 449 | handle_del_rom (act_reg); 450 | } 451 | 452 | static void op_return (int opcode) { 453 | act_reg->sp--; 454 | if (act_reg->sp < 0) act_reg->sp = STACK_SIZE - 1; 455 | act_reg->pc = act_reg->stack [act_reg->sp]; 456 | } 457 | 458 | static void op_nop (int opcode) { } 459 | 460 | static void op_binary (int opcode) { 461 | //act_reg->decimal = false; 462 | act_reg->flags &= ~(F_DECIMAL); 463 | } 464 | 465 | static void op_decimal (int opcode) { 466 | //act_reg->decimal = true; 467 | act_reg->flags |= F_DECIMAL; 468 | } 469 | 470 | /* $$$ woodstock doc says when increment or decrement P wraps, 471 | * P "disappears for one word time". */ 472 | 473 | static void op_dec_p (int opcode) { 474 | if (act_reg->p) 475 | act_reg->p--; 476 | else 477 | act_reg->p = WSIZE - 1; 478 | } 479 | 480 | static void op_inc_p (int opcode) { 481 | act_reg->p++; 482 | if (act_reg->p >= WSIZE) act_reg->p = 0; 483 | } 484 | 485 | static void op_clear_s (int opcode) { 486 | int i; 487 | for (i = 0; i < SSIZE; i++) 488 | if ((i != 1) && (i != 2) && (i != 5) && (i != 15)) act_reg->s &= ~(1<>= 6; 495 | digit_t *target = opcode&0x02 ? act_reg->m2 : act_reg->m1; 496 | opcode &= 0x01; 497 | int i; 498 | int t=0; 499 | for (i=0;ic[i]<<4; 502 | act_reg->c[i] = (target[i/2]>>4); 503 | act_reg->c[i-1] = (target[i/2]&0x0f); 504 | if (!opcode) target[i/2] = t; 505 | }//if 506 | else { 507 | t = act_reg->c[i]&0x0f; 508 | }//else 509 | }//for 510 | } 511 | 512 | 513 | static void op_f_to_a (int opcode) { 514 | act_reg->a [0] = act_reg->f; 515 | } 516 | 517 | static void op_f_exch_a (int opcode) { 518 | int t; 519 | t = act_reg->a [0]; 520 | act_reg->a [0] = act_reg->f; 521 | act_reg->f = t; 522 | } 523 | 524 | static void op_circulate_a_left (int opcode) { 525 | int i, t; 526 | t = act_reg->a [WSIZE - 1]; 527 | for (i = WSIZE - 1; i >= 1; i--) 528 | act_reg->a [i] = act_reg->a [i - 1]; 529 | act_reg->a [0] = t; 530 | } 531 | 532 | static void op_bank_switch (int opcode) { 533 | //act_reg->bank ^= 1; 534 | act_reg->flags ^= F_BANK; 535 | } 536 | 537 | static void op_rom_selftest(int opcode) { 538 | //act_reg->crc = 01777; 539 | act_reg->inst_state = selftest; 540 | act_reg->pc &= ~ 01777; // start from beginning of current 1K ROM bank 541 | //printf ("starting ROM CRC of bank %d addr %04o\n\r", act_reg->bank, act_reg->pc); 542 | } 543 | 544 | static void rom_selftest_done() { 545 | // ROM self-test completed, return and set S5 if error 546 | //printf ("ROM CRC done, crc = %03x: %s\n\r", act_reg->crc, act_reg->crc == 0x078 ? "good" : "bad"); 547 | //if (act_reg->crc != 0x078) act_reg->s [5] = 1; // indicate error 548 | act_reg->inst_state = norm; 549 | op_return (0); 550 | } 551 | 552 | static void op_c_to_addr (int opcode) { 553 | act_reg->ram_addr = (act_reg->c [1] << 4) + act_reg->c [0]; 554 | } 555 | 556 | 557 | static void op_c_to_data (int opcode) { 558 | int i; 559 | if (act_reg->ram_addr >= __USE_RAM) return; 560 | //for (i = 0; i < WSIZE; i++) act_reg->ram [act_reg->ram_addr] [i] = act_reg->c [i]; 561 | for (i=0;iram[act_reg->ram_addr][i] = (act_reg->c[i*2+1]<<4) | (act_reg->c[i*2]&0x0f); 562 | } 563 | 564 | /* 565 | static void op_data_to_c (int opcode) { 566 | int i; 567 | if (act_reg->ram_addr >= __USE_RAM) { 568 | for (i = 0; i < WSIZE; i++) act_reg->c [i] = 0; 569 | return; 570 | }//if 571 | //for (i = 0; i < WSIZE; i++) act_reg->c [i] = act_reg->ram [act_reg->ram_addr] [i]; 572 | for (i=0;ic[i*2+1] = act_reg->ram[act_reg->ram_addr][i]>>4; 574 | act_reg->c[i*2] = act_reg->ram[act_reg->ram_addr][i]&0x0f; 575 | }//for 576 | } 577 | */ 578 | 579 | static void op_c_to_register (int opcode) { 580 | int i; 581 | act_reg->ram_addr &= ~017; 582 | act_reg->ram_addr += (opcode >> 6); 583 | if (act_reg->ram_addr >= __USE_RAM) return; 584 | //for (i = 0; i < WSIZE; i++) act_reg->ram [act_reg->ram_addr] [i] = act_reg->c [i]; 585 | for (i=0;iram[act_reg->ram_addr][i] = (act_reg->c[i*2+1]<<4) | (act_reg->c[i*2]&0x0f); 586 | } 587 | 588 | static void op_register_to_c (int opcode) { 589 | int i; 590 | if (opcode>>6) { 591 | act_reg->ram_addr &= ~017; 592 | act_reg->ram_addr += (opcode >> 6); 593 | }//if 594 | else { 595 | // this is the same as op_data_to_c() 596 | }//else 597 | if (act_reg->ram_addr >= __USE_RAM) { 598 | for (i = 0; i < WSIZE; i++) act_reg->c [i] = 0; 599 | return; 600 | }//if 601 | //for (i = 0; i < WSIZE; i++) act_reg->c [i] = act_reg->ram [act_reg->ram_addr] [i]; 602 | for (i=0;ic[i*2+1] = act_reg->ram[act_reg->ram_addr][i]>>4; 604 | act_reg->c[i*2] = act_reg->ram[act_reg->ram_addr][i]&0x0f; 605 | }//for 606 | } 607 | 608 | static void op_clear_data_regs (int opcode) { 609 | int base; 610 | int i, j; 611 | base = act_reg->ram_addr & ~ 017; 612 | for (i = base; i <= base + 15; i++) 613 | for (j = 0; j < WSIZE/2; j++) act_reg->ram [i] [j] = 0; 614 | } 615 | 616 | static void op_c_to_stack (int opcode) 617 | { 618 | int i; 619 | 620 | for (i = 0; i < WSIZE/2; i++) 621 | { 622 | act_reg->t [i] = act_reg->z [i]; 623 | act_reg->z [i] = act_reg->y [i]; 624 | act_reg->y [i] = (act_reg->c[i*2]&0x0f) | (act_reg->c[i*2+1]<<4); 625 | } 626 | } 627 | 628 | 629 | static void op_stack_to_a (int opcode) 630 | { 631 | int i; 632 | 633 | for (i = 0; i < WSIZE/2; i++) 634 | { 635 | act_reg->a [i*2] = act_reg->y[i]&0x0f; 636 | act_reg->a [i*2+1] = act_reg->y[i]>>4; 637 | act_reg->y [i] = act_reg->z [i]; 638 | act_reg->z [i] = act_reg->t [i]; 639 | } 640 | } 641 | 642 | 643 | static void op_y_to_a (int opcode) 644 | { 645 | int i; 646 | 647 | for (i = 0; i < WSIZE/2; i++) 648 | { 649 | //act_reg->a [i] = act_reg->y [i]; 650 | act_reg->a [i*2] = act_reg->y[i]&0x0f; 651 | act_reg->a [i*2+1] = act_reg->y[i]>>4; 652 | } 653 | } 654 | 655 | 656 | static void op_down_rotate (int opcode) 657 | { 658 | int i, t; 659 | 660 | for (i = 0; i < WSIZE/2; i++) 661 | { 662 | //t = act_reg->c [i]; 663 | //act_reg->c [i] = act_reg->y [i]; 664 | t = (act_reg->c[i*2]&0x0f) | (act_reg->c[i*2+1]<<4); 665 | act_reg->c [i*2] = act_reg->y[i]&0x0f; 666 | act_reg->c [i*2+1] = act_reg->y[i]>>4; 667 | act_reg->y [i] = act_reg->z [i]; 668 | act_reg->z [i] = act_reg->t [i]; 669 | act_reg->t [i] = t; 670 | } 671 | } 672 | 673 | 674 | static void op_clear_reg (int opcode) 675 | { 676 | int i; 677 | 678 | for (i = 0; i < WSIZE; i++) 679 | act_reg->a [i] = act_reg->b [i] = act_reg->c [i]; // = act_reg->y [i] = act_reg->z [i] = act_reg->t [i] = 0; 680 | for (i = 0; i < WSIZE/2; i++) 681 | act_reg->y [i] = act_reg->z [i] = act_reg->t [i] = 0; 682 | // Apparently we're not supposed to clear F, or the HP-21 CLR function 683 | // resets the display format. 684 | // Should this clear P? Probably not. 685 | } 686 | 687 | static void op_load_constant (int opcode) { 688 | if (act_reg->p < WSIZE) act_reg->c [act_reg->p] = opcode >> 6; 689 | if (act_reg->p) act_reg->p--; 690 | else act_reg->p = WSIZE - 1; 691 | } 692 | 693 | static void op_set_s (int opcode) { 694 | if ((opcode >> 6) < SSIZE) act_reg->s |= (1<<(opcode >> 6)); 695 | } 696 | 697 | static void op_clr_s (int opcode) { 698 | if ((opcode >> 6) < SSIZE) act_reg->s &= ~(1<<(opcode >> 6)); 699 | } 700 | 701 | static void op_test_s_eq_0 (int opcode) { 702 | act_reg->inst_state = branch; 703 | //act_reg->carry = act_reg->s & (1<<(opcode >> 6)) ? true : false; 704 | if (act_reg->s & (1<<(opcode >> 6))) 705 | act_reg->flags |= F_CARRY; 706 | else 707 | act_reg->flags &= ~F_CARRY; 708 | } 709 | 710 | static void op_test_s_eq_1 (int opcode) { 711 | act_reg->inst_state = branch; 712 | //act_reg->carry = act_reg->s & (1<<(opcode >> 6)) ? false : true; 713 | if (act_reg->s & (1<<(opcode >> 6))) 714 | act_reg->flags &= ~F_CARRY; 715 | else 716 | act_reg->flags |= F_CARRY; 717 | } 718 | 719 | static const 720 | //__attribute__ ((section (".data_fe"))) 721 | uint8_t p_set_map[16] = { 14, 4, 7, 8, 11, 2, 10, 12, 1, 3, 13, 6, 0, 9, 5, 14 }; 722 | static const 723 | //__attribute__ ((section (".data_fe"))) 724 | uint8_t p_test_map[16] = { 4, 8, 12, 2, 9, 1, 6, 3, 1, 13, 5, 0, 11, 10, 7, 4 }; 725 | 726 | static void op_set_p (int opcode) { 727 | act_reg->p = p_set_map [opcode >> 6]; 728 | } 729 | 730 | static void op_test_p_eq (int opcode) { 731 | act_reg->inst_state = branch; 732 | //act_reg->carry = ! (act_reg->p == p_test_map [opcode >> 6]); 733 | if (act_reg->p == p_test_map [opcode >> 6]) 734 | act_reg->flags &= ~F_CARRY; 735 | else 736 | act_reg->flags |= F_CARRY; 737 | } 738 | 739 | static void op_test_p_ne (int opcode) { 740 | act_reg->inst_state = branch; 741 | //act_reg->carry = ! (act_reg->p != p_test_map [opcode >> 6]); 742 | if (act_reg->p != p_test_map [opcode >> 6]) 743 | act_reg->flags &= ~F_CARRY; 744 | else 745 | act_reg->flags |= F_CARRY; 746 | } 747 | 748 | static void op_sel_rom (int opcode) { 749 | act_reg->pc = ((opcode & 01700) << 2) + (act_reg->pc & 0377); 750 | } 751 | 752 | static void op_del_sel_rom (int opcode) { 753 | act_reg->del_rom = opcode >> 6; 754 | //act_reg->del_rom_flag = 1; 755 | act_reg->flags |= F_DEL_ROM; 756 | } 757 | 758 | static void op_keys_to_rom_addr (int opcode) { 759 | act_reg->pc = act_reg->pc & ~0377; 760 | handle_del_rom (act_reg); 761 | if (!act_reg->key_buf) return; 762 | act_reg->pc += act_reg->key_buf; 763 | } 764 | 765 | static void op_keys_to_a (int opcode) { 766 | if (!act_reg->key_buf) { 767 | act_reg->a [2] = 0; 768 | act_reg->a [1] = 0; 769 | return; 770 | }//if 771 | act_reg->a [2] = act_reg->key_buf >> 4; 772 | act_reg->a [1] = act_reg->key_buf & 0x0f; 773 | } 774 | 775 | static void op_a_to_rom_addr (int opcode) { 776 | act_reg->pc = act_reg->pc & ~0377; 777 | handle_del_rom (act_reg); 778 | act_reg->pc += ((act_reg->a [2] << 4) + act_reg->a [1]); 779 | } 780 | 781 | static void op_display_off (int opcode) { 782 | //act_reg->display_enable = 0; 783 | act_reg->flags &= ~F_DISPLAY_ON; 784 | } 785 | 786 | static void op_display_toggle (int opcode) { 787 | //act_reg->display_enable = ! act_reg->display_enable; 788 | act_reg->flags ^= F_DISPLAY_ON; 789 | } 790 | 791 | /* doesn't seem to be in use, I need flash / ram 792 | static void op_display_reset_twf (int opcode) { 793 | //act_reg->display_14_digit = true; 794 | act_reg->flags |= F_DISPLAY_14; 795 | C_RIGHT_SCAN = 0; 796 | } 797 | */ 798 | 799 | static void op_crc_clear_f1 (int opcode) { 800 | // don't do anything, as CRC F1 is controlled by hardware 801 | // (in our case, ext_flag [1]) 802 | ; 803 | } 804 | 805 | static void op_crc_test_f1 (int opcode) { 806 | if (act_reg->ext_flag & (1<<1)) act_reg->s |= (1<<3); 807 | } 808 | 809 | static void (* const _op_fcn [64])(int) = { 810 | op_nop, op_keys_to_rom_addr, op_sel_rom, bad_op, 811 | bad_op, op_keys_to_a, op_sel_rom, bad_op, 812 | bad_op, op_a_to_rom_addr, op_sel_rom, bad_op, 813 | op_crc_test_f1, op_nop/*op_display_reset_twf*/, op_sel_rom, bad_op, 814 | op_nop, op_binary, op_sel_rom, bad_op, 815 | bad_op, op_circulate_a_left, op_sel_rom, op_nop, 816 | bad_op, op_dec_p, op_sel_rom, bad_op, 817 | bad_op, op_inc_p, op_sel_rom, bad_op, 818 | op_nop, op_return, op_sel_rom, op_bank_switch, 819 | bad_op, bad_op, op_sel_rom, op_c_to_addr, 820 | bad_op, bad_op, op_sel_rom, op_clear_data_regs, 821 | op_nop, bad_op, op_sel_rom, op_c_to_data, 822 | bad_op, bad_op, op_sel_rom, op_rom_selftest, 823 | op_crc_clear_f1, bad_op, op_sel_rom, bad_op, 824 | bad_op, bad_op, op_sel_rom, bad_op, 825 | bad_op, bad_op, op_sel_rom, op_nop, 826 | }; 827 | 828 | #ifdef C_STANDALONE 829 | 830 | static const uint8_t *_key_map=0; 831 | 832 | static void sim_check_key(uint8_t key) { 833 | if (_key_map[key]) { 834 | //woodstock_press_key(_key_map[key]); 835 | act_reg->key_buf = _key_map[key]; 836 | act_reg->flags |= F_KEY; 837 | }//if 838 | } 839 | 840 | static uint8_t sim_load_segments_woodstock(uint8_t digit) { 841 | if (!(act_reg->flags & F_DISPLAY_ON)) return 0; 842 | uint8_t segs=0, i=13-digit; 843 | if (act_reg->b[i] & 0x02) { 844 | if (act_reg->a[i] == 9) segs = CHAR_MINUS; 845 | }//if 846 | else { 847 | segs = seg_map[act_reg->a[i]]; 848 | if (act_reg->b[i] & 0x01) segs |= CHAR_DOT; 849 | }//else 850 | return segs; 851 | } 852 | 853 | static uint8_t sim_load_segments_spice(uint8_t digit) { 854 | if (!(act_reg->flags & F_DISPLAY_ON)) return 0; 855 | uint8_t segs=0, i=13-digit; 856 | if (digit < 11) { // 12th digit blank? 857 | if (digit == 0) { 858 | if (act_reg->b[12] & 0x04) segs = CHAR_MINUS; 859 | }//if 860 | else { 861 | if (act_reg->b[i] == 6) { 862 | if (act_reg->a[i] == 9) segs |= CHAR_MINUS; 863 | }//if 864 | else { 865 | segs = act_reg->a[i]; 866 | if (segs==0x0b) segs = 0x10; // show 'H' instead of 'F' 867 | segs = seg_map[segs]; 868 | if (act_reg->b[i] & 0x01) segs |= CHAR_DOT; // should be dot and comma, oh well 869 | }//else 870 | }//else 871 | }//if 872 | return segs; 873 | } 874 | 875 | static uint8_t (*sim_load_segments) (uint8_t digit) = sim_load_segments_woodstock; 876 | 877 | #else 878 | 879 | static void display_scan_advance () { 880 | if ((--act_reg->display_scan_position) < C_RIGHT_SCAN) { 881 | while (act_reg->display_digit_position < MAX_DIGIT_POSITION) 882 | _display_segments [act_reg->display_digit_position++] = 0; 883 | uint16_t seg_crc=0; 884 | uint8_t i; 885 | for (i=0;i%02d\n\r", C_LEFT_SCAN, C_RIGHT_SCAN); 898 | putchar(' '); putchar(' '); putchar(' '); 899 | for (i=0;i<14;i++) { putchar("0123456789abcdef"[act_reg->a[i]&0x0f]); putchar(' '); } 900 | putchar('\n'); putchar('\r'); 901 | putchar(' '); putchar(' '); putchar(' '); 902 | for (i=0;i<14;i++) { putchar("0123456789abcdef"[act_reg->b[i]&0x0f]); putchar(' '); } 903 | putchar('\n'); putchar('\r'); 904 | #endif 905 | // 906 | putchar(act_reg->flags & F_DISPLAY_ON ? '*' : ' '); 907 | #ifdef C_SPICE 908 | putchar('3'); 909 | #else 910 | putchar('2'); 911 | #endif 912 | putchar('>'); 913 | for (i=0;idisplay_digit_position = 0; 927 | act_reg->display_scan_position = C_LEFT_SCAN; 928 | }//if 929 | } 930 | 931 | static void woodstock_display_scan () { 932 | int a = act_reg->a [act_reg->display_scan_position]; 933 | int b = act_reg->b [act_reg->display_scan_position]; 934 | segment_bitmap_t segs = 0; 935 | 936 | if ((act_reg->flags & F_DISPLAY_14) && (act_reg->display_digit_position == 0)) 937 | // save room for mantissa sign 938 | _display_segments [act_reg->display_digit_position++] = 0; 939 | 940 | if (act_reg->flags & F_DISPLAY_ON) { 941 | if (b & 2) { 942 | if ((a >= 2) && ((a & 7) != 7)) 943 | segs = CHAR_MINUS; 944 | }//if 945 | else { 946 | segs = a+1; 947 | }//else 948 | if ((act_reg->flags & F_DISPLAY_14) && (act_reg->display_digit_position == 12)) { 949 | if (segs & (1 << 4)) _display_segments[0] = CHAR_MINUS; 950 | // exponent sign digit only has G segment 951 | segs &= CHAR_MINUS; 952 | }//if 953 | if (b & 1) segs |= CHAR_DOT; 954 | }//if 955 | 956 | _display_segments[act_reg->display_digit_position++] = segs; 957 | display_scan_advance (); 958 | } 959 | 960 | static void spice_display_scan() { 961 | int a = act_reg->a [act_reg->display_scan_position]; 962 | int b = act_reg->b [act_reg->display_scan_position]; 963 | segment_bitmap_t segs = 0; 964 | 965 | if (!act_reg->display_digit_position) 966 | _display_segments [act_reg->display_digit_position++] = 0; /* make room for sign */ 967 | 968 | if (act_reg->flags & F_DISPLAY_ON) { 969 | if ((act_reg->display_scan_position == /*C_LEFT_SCAN*/14-1) && (b & 4)) 970 | _display_segments[0] = CHAR_MINUS; 971 | if (b == 6) { 972 | if (a == 9) segs = CHAR_MINUS; 973 | }//if 974 | else { 975 | segs = a+1; 976 | }//else 977 | if (b & 1) segs |= CHAR_DOT; // we don't have comma segment 978 | //segs |= sim->char_gen [(b & 2) ? ',' : '.']; 979 | }//if 980 | _display_segments [act_reg->display_digit_position++] = segs; 981 | display_scan_advance (); 982 | } 983 | 984 | #endif 985 | 986 | static bool woodstock_execute_cycle () { 987 | uint16_t opcode; 988 | inst_state_t prev_inst_state; 989 | 990 | act_reg->prev_pc = act_reg->pc; 991 | uint16_t idx = act_reg->pc; 992 | if (act_reg->flags&F_BANK) idx += 4096; 993 | opcode = (act_reg->rom_ex[idx/4] >> ((idx%4)*2)) & 0x03; 994 | opcode |= act_reg->rom[idx]<<2; 995 | 996 | prev_inst_state = act_reg->inst_state; 997 | if (act_reg->inst_state == branch) act_reg->inst_state = norm; 998 | 999 | if (act_reg->flags & F_CARRY) 1000 | act_reg->flags |= F_PREV_CARRY; 1001 | else 1002 | act_reg->flags &= ~F_PREV_CARRY; 1003 | act_reg->flags &= ~F_CARRY; 1004 | 1005 | if (act_reg->flags & F_KEY) act_reg->s |= (1<<15); 1006 | if (act_reg->ext_flag & (1<<3)) act_reg->s |= (1<<3); 1007 | if (act_reg->ext_flag & (1<<5)) act_reg->s |= (1<<5); 1008 | act_reg->pc++; 1009 | 1010 | static void (* const _op_fcn_0100 [])(int) = { op_set_s, op_test_s_eq_1, op_test_p_eq, op_del_sel_rom, }; 1011 | static void (* const _op_fcn_0300 [])(int) = { op_clr_s, op_test_s_eq_0, op_test_p_ne, op_set_p, }; 1012 | static void (* const _op_fcn_02xx [])(int) = { op_nop, op_load_constant, op_c_to_register, op_register_to_c, }; 1013 | static void (* const _op_fcn_0200 [])(int) = { 1014 | op_clear_reg, op_clear_s, op_display_toggle, op_display_off, op_mx, op_mx, op_mx, op_mx, 1015 | op_stack_to_a, op_down_rotate, op_y_to_a, op_c_to_stack, op_decimal, bad_op, op_f_to_a, op_f_exch_a, 1016 | }; 1017 | 1018 | switch (prev_inst_state) { 1019 | case norm: 1020 | //(* act_reg->op_fcn [opcode]) (opcode); 1021 | switch (opcode&0x0003) { 1022 | case 0: 1023 | switch ((opcode>>2)&0x0003) { 1024 | case 0: _op_fcn [(opcode>>4)] (opcode); break; 1025 | case 1: _op_fcn_0100 [(opcode>>4)&0x03] (opcode); break; 1026 | //case 2: _op_fcn [(opcode>>4)*2+1] (opcode); break; 1027 | case 2: 1028 | if ((opcode>>4)&0x0003) 1029 | _op_fcn_02xx [(opcode>>4)&0x03] (opcode); 1030 | else 1031 | _op_fcn_0200 [(opcode>>6)] (opcode); 1032 | break; 1033 | case 3: _op_fcn_0300 [(opcode>>4)&0x03] (opcode); break; 1034 | }//switch 1035 | break; 1036 | //case 0: _op_fcn [opcode>>2] (opcode); break; 1037 | case 1: op_jsb(opcode); break; 1038 | case 2: op_arith(opcode); break; 1039 | case 3: op_goto(opcode); break; 1040 | }//switch 1041 | break; 1042 | case branch: 1043 | if (!(act_reg->flags & F_PREV_CARRY)) 1044 | act_reg->pc = (act_reg->pc & ~01777) | opcode; 1045 | break; 1046 | case selftest: 1047 | //crc_update(opcode); 1048 | if (opcode == 01060) op_bank_switch(opcode); 1049 | if (!(act_reg->pc & 01777)) rom_selftest_done(); 1050 | break; 1051 | }//switch 1052 | 1053 | //act_reg->display_scan_fn (); 1054 | #ifdef C_STANDALONE 1055 | // pcb version led scanning handled via call-back 1056 | #else 1057 | 1058 | #ifdef C_SPICE 1059 | spice_display_scan (); 1060 | #else 1061 | woodstock_display_scan (); 1062 | #endif 1063 | 1064 | #endif 1065 | 1066 | return (true); /* never sleeps */ 1067 | } 1068 | 1069 | static bool woodstock_execute_instruction () { 1070 | do { 1071 | if (! woodstock_execute_cycle ()) return false; 1072 | } while (act_reg->inst_state != norm); 1073 | return true; 1074 | } 1075 | 1076 | /* 1077 | static void woodstock_press_key (uint8_t keycode) { 1078 | act_reg->key_buf = keycode; 1079 | act_reg->flags |= F_KEY; 1080 | } 1081 | */ 1082 | 1083 | static void woodstock_release_key () { 1084 | act_reg->flags &= ~F_KEY; 1085 | } 1086 | 1087 | static void woodstock_set_ext_flag (int flag, bool state) { 1088 | if (state) 1089 | act_reg->ext_flag |= (1<ext_flag &= ~(1<ext_flag [flag] = state; 1093 | } 1094 | 1095 | static void woodstock_reset () { 1096 | //act_reg->decimal = true; 1097 | act_reg->flags = 0x00; 1098 | act_reg->flags |= F_DECIMAL; 1099 | 1100 | act_reg->pc = 0; 1101 | //act_reg->del_rom_flag = 0; 1102 | act_reg->flags |= F_DEL_ROM; 1103 | 1104 | act_reg->inst_state = norm; 1105 | act_reg->sp = 0; 1106 | 1107 | op_clear_reg(0); 1108 | op_clear_s(0); 1109 | act_reg->p = 0; 1110 | 1111 | act_reg->flags &= ~F_DISPLAY_ON; 1112 | #ifdef C_STANDALONE 1113 | #else 1114 | act_reg->display_digit_position = 0; 1115 | act_reg->display_scan_position = WSIZE - 1; 1116 | #endif 1117 | 1118 | act_reg->key_buf = 0; // no key has been pressed 1119 | act_reg->flags &= ~F_KEY; 1120 | act_reg->ext_flag |= (1<<5); // force battery ok 1121 | } 1122 | 1123 | static void woodstock_clear_memory () { 1124 | int addr; 1125 | for (addr = 0; addr < __USE_RAM; addr++) 1126 | reg_zero (act_reg->ram [addr], 0, WSIZE/2 - 1); 1127 | } 1128 | 1129 | static uint8_t _is_spice=0; 1130 | static void woodstock_set_rom(uint8_t which) { 1131 | switch (which) { 1132 | case 3: // 21 1133 | _is_spice = 0; 1134 | _key_map = key_map_21; 1135 | act_reg->rom = rom_21; 1136 | act_reg->rom_ex = rom_21_ex; 1137 | break; 1138 | case 2: // 25 1139 | _is_spice = 0; 1140 | _key_map = key_map_25c; 1141 | act_reg->rom = rom_25c; 1142 | act_reg->rom_ex = rom_25c_ex; 1143 | break; 1144 | default: 1145 | case 1: // 33 1146 | _is_spice = 1; 1147 | _key_map = key_map_33c; 1148 | act_reg->rom = rom_33c; 1149 | act_reg->rom_ex = rom_33c_ex; 1150 | break; 1151 | }//switch 1152 | } 1153 | 1154 | static void woodstock_new_processor() { 1155 | //act_reg = malloc (sizeof (act_reg_t)); 1156 | #ifdef C_SPICE 1157 | //C_display_scan_fn = spice_display_scan; 1158 | //C_LEFT_SCAN = WSIZE - 2; 1159 | //C_RIGHT_SCAN = 3; 1160 | #else 1161 | //act_reg->display_scan_fn = woodstock_display_scan; 1162 | //C_LEFT_SCAN = WSIZE - 1; 1163 | //C_RIGHT_SCAN = 2; 1164 | #endif 1165 | 1166 | #ifdef C_STANDALONE 1167 | sim_load_segments = _is_spice ? sim_load_segments_spice : sim_load_segments_woodstock; 1168 | #else 1169 | act_reg->display_scan_position = C_LEFT_SCAN; 1170 | act_reg->display_digit_position = 0; 1171 | #endif 1172 | woodstock_reset(); 1173 | /* retired, now runtime slect 1174 | #ifdef C_SPICE 1175 | act_reg->rom = rom_33c; 1176 | act_reg->rom_ex = rom_33c_ex; 1177 | #else 1178 | act_reg->rom = rom_25c; 1179 | act_reg->rom_ex = rom_25c_ex; 1180 | #endif 1181 | */ 1182 | woodstock_clear_memory(); 1183 | } 1184 | 1185 | #ifdef EMBEDDED 1186 | 1187 | #ifdef C_STANDALONE 1188 | void set_conio_terminal_mode() { } 1189 | #endif 1190 | int kbhit() { return 0; } 1191 | int getch() { return 0; } 1192 | 1193 | #else 1194 | //_______________________________ stuff for key catching 1195 | struct termios orig_termios; 1196 | 1197 | void reset_terminal_mode() { 1198 | tcsetattr(0, TCSANOW, &orig_termios); 1199 | } 1200 | 1201 | void set_conio_terminal_mode() { 1202 | struct termios new_termios; 1203 | 1204 | /* take two copies - one for now, one for later */ 1205 | tcgetattr(0, &orig_termios); 1206 | memcpy(&new_termios, &orig_termios, sizeof(new_termios)); 1207 | 1208 | /* register cleanup handler, and set the new terminal mode */ 1209 | atexit(reset_terminal_mode); 1210 | cfmakeraw(&new_termios); 1211 | tcsetattr(0, TCSANOW, &new_termios); 1212 | } 1213 | 1214 | int kbhit() { 1215 | struct timeval tv = { 0L, 0L }; 1216 | fd_set fds; 1217 | FD_ZERO(&fds); 1218 | FD_SET(0, &fds); 1219 | return select(1, &fds, NULL, NULL, &tv); 1220 | } 1221 | 1222 | int getch() { 1223 | int r; 1224 | unsigned char c; 1225 | if ((r = read(0, &c, sizeof(c))) < 0) { 1226 | return r; 1227 | } else { 1228 | return c; 1229 | } 1230 | } 1231 | 1232 | #endif 1233 | -------------------------------------------------------------------------------- /np25.hex: -------------------------------------------------------------------------------- 1 | :10C000005542200135D0085A824570033140000462 2 | :10C010003F400E000F9308249242700320012F83AB 3 | :10C020009F4FA2FF0002F8233F4062010F930724B5 4 | :10C030009242700320011F83CF430E02F923315037 5 | :10C04000F6FFB240805A2001D242FB105700D24284 6 | :10C05000FA105600B24044A52A01B240E02E720107 7 | :10C06000B24010006201B24020026001C2432E00C3 8 | :10C07000C2432600F2432100F240C3FF2900F243ED 9 | :10C080002A00F2432200F2D038002900F2D0380012 10 | :10C090002F00F2F0C7FF2A0032D2B0127CD27F40CC 11 | :10C0A0003E007F534E4FDE4E4010BF02FA235F42E8 12 | :10C0B000F0027FF00B00C24F12020F43DF4FF1027C 13 | :10C0C00060031F533F900C00F923B24060037A02D3 14 | :10C0D00032D01000023CE2D212025F4211027F9085 15 | :10C0E0002300F927F24063007802594212025F42AE 16 | :10C0F00011027F9022009E247F902300072C7F90C6 17 | :10C1000011000F247F902100B7208D3C7F902A00E2 18 | :10C110009A247F902B00AA247F902900AD209C3C7C 19 | :10C1200003435F4212023FF02000FA27F2F0DFFFE4 20 | :10C1300012021B427A02C2437802C2436302F240F7 21 | :10C140000C006402F24063006502F2D0100012029B 22 | :10C150000841288332D010005F4211027F902900ED 23 | :10C160005E247F90260015205E4278025E53C24E08 24 | :10C170007802F240630065027E900C00022C1B5393 25 | :10C18000083C7D4031003E40BF024F43B012A0D476 26 | :10C19000463C7F50F7FF7F902700042C4F4F5A4FAB 27 | :10C1A000FBDA023C7A400A003D4009003E400002B2 28 | :10C1B0000F41B01240D97A900A00CC2F5A926502F2 29 | :10C1C00026206A9316286E4B4F4A7E903A00042C24 30 | :10C1D0000F58EB4F0000BE3F5E53CB4E00003D4377 31 | :10C1E0000D510F5D6E9FB6237A503000CB4A000090 32 | :10C1F000B13F4A93AF23FB903000000003207F4003 33 | :10C200003F00023C7F403000CB4F0000A33F4F4A2D 34 | :10C210007F503000CB4F0000C24A65029B3FF2F0D6 35 | :10C22000EFFF1202293C7E4064001F427A02B012E6 36 | :10C2300068D5223CD24312027E4064003F403CDA83 37 | :10C24000B01268D5193CE24312027E4064003F40C0 38 | :10C2500046DAB01268D5103CF240030012027E406C 39 | :10C2600064003F4050DAB01268D5063C7E4064005E 40 | :10C270003F4059DAB01268D539B22B24F2D21202FB 41 | :10C28000283C32D010005F4211027F9022001F2410 42 | :10C290007F90230004247F9021001B200B3CF2F0B0 43 | :10C2A000FBFF12027D4031003E40BF024F43B012FF 44 | :10C2B000A0D40F3C5F4212023FF003003F90030006 45 | :10C2C0000320F2F0FCFF1202D2531202023CF2E20F 46 | :10C2D00012025F4212022FF2D4235F4212027FF059 47 | :10C2E00003006F930F247F9003001820C2436C0358 48 | :10C2F000B24022DB6E03B24052DB7A02B24052DF20 49 | :10C300007C02173CC2436C03B24052E06E03B24061 50 | :10C3100082E07A02B24082E87C020B3CD2436C039A 51 | :10C32000B24082EA6E03B240B2EA7A02B240B2FA96 52 | :10C330007C02C2936C0303243F40F0D1023C3F4097 53 | :10C34000B0D1824F0C0282436A02F24009006502BA 54 | :10C3500082436E02824370020F43B01274CF0F43C8 55 | :10C36000B0128CCBC2436402C2437802F2F0CFFF1A 56 | :10C370006502B2D020006602B0127CD2F2F01F003B 57 | :10C3800012025E4209025F434E9301204F43B012F6 58 | :10C3900058D23040E8CA5F4212023FF040005F24AA 59 | :10C3A0005F4212024F9321385F4209024F931D24CE 60 | :10C3B0005F4212023FF003003F9003001624F2D0C8 61 | :10C3C00080FF12025F4212021FF303243D4040101F 62 | :10C3D000023C3D4080107F4031007F534E4F0C4D5A 63 | :10C3E0000C5EEE4CBF024F93F8235F4211027F9028 64 | :10C3F000230024205E4209025EE3C24E09025F432D 65 | :10C4000001204F43B01258D25F4209024F932324B8 66 | :10C410005F4212023FF003003F9003001C245F4282 67 | :10C4200012025E4212021EF35F4301244F437D401D 68 | :10C4300031003E40BF02B012A0D40D3C5F42110259 69 | :10C440004F4F1F526E036F4F4F930524C24F780218 70 | :10C45000F2D010006502F2F0BFFF12020B3C5F4207 71 | :10C4600012023FF020000624F2F0EFFF6502F2F026 72 | :10C47000DFFF12021D426A02824D76025B426502B4 73 | :10C480004B9304340C4D3C500010013C0C4D0F4CB0 74 | :10C4900012C30F1012C30F101F527C020E4C3EF03D 75 | :10C4A00003000E5E6F4F4E4E4E9303240F117E53CA 76 | :10C4B000FD233FF003001C527A026E4C0E5E0E5EAE 77 | :10C4C0000FDE1C426E021C93022082436E022BB3CD 78 | :10C4D00004246BD2C24B6502043C7BF0FBFFC24BD1 79 | :10C4E00065025B4265027BF0FDFFC24B65024E4B6D 80 | :10C4F0003EB010000324B2D0008068021A426602E7 81 | :10C500003AB20224B2D268023AF020000324B2D038 82 | :10C51000200068021D53824D6A021C9302203040A5 83 | :10C52000A0CA06282C9302243040CCCA3040B0CA9E 84 | :10C530000C4F3CF003002C9376243C900300022027 85 | :10C54000304084CA1C9352240E4F12C30E1012C3E3 86 | :10C550000E103EF003002E931F243E90030039245A 87 | :10C560001E930D240E4F12C30E1012C30E1012C3D1 88 | :10C570000E103EF0FE039E12B2FE3040CCCA0E4FAB 89 | :10C5800012C30E1012C30E1012C30E103EF006009E 90 | :10C590009E1232FF3040CCCA0E4F12C30E1012C38F 91 | :10C5A0000E1012C30E1012C30E103EF0030005242D 92 | :10C5B0000E5E9E123AFF3040CCCA0E4F7D40060000 93 | :10C5C00012C30E107D53FC230E5E9E1242FF3040BC 94 | :10C5D000CCCA0E4F12C30E1012C30E1012C30E108F 95 | :10C5E0003EF006009E1262FF3040CCCA1C42700230 96 | :10C5F0000E4C3E502E000E5E8E4D16020E4C1E53FB 97 | :10C60000824E70022E930238824370020F110F1176 98 | :10C610003DF000FF0FDD824F6A023F401602B0126C 99 | :10C6200004CB3040CCCA0E4F0E110E110E110E115C 100 | :10C630000E114A4E0F110F117FF007007F537F90AC 101 | :10C640000700072C4D4F0D5D104D64DA2C432E432F 102 | :10C650002B3C5F4264024E4F7F900E00202C0C4E0C 103 | :10C66000233C5C4264027C900E001B2C4C4C0E431D 104 | :10C670001B3C3C400D003E400D00163C3C400C0075 105 | :10C680003E400300113C3C400D000E430D3C3C403D 106 | :10C690000D003E400300083C2C430E43053C0C4378 107 | :10C6A000033C3C400D000E434F4B7FF0FDFFC24F5B 108 | :10C6B00065020D4A3DF01F000D5D104D72DA0D4C04 109 | :10C6C0003F401602B0126AD23040CCCA0D4C3F40F7 110 | :10C6D0002402B0126AD23040CCCA0D4E3E40240231 111 | :10C6E0003F401602B012C6D23040CCCA0D4E3E407A 112 | :10C6F00016020F4E3F500E00B012A8D23040CCCAE6 113 | :10C700000D4E3E4032023F401602B012C6D23040BB 114 | :10C71000CCCA0D4E3E4032023F401602B012A8D2A3 115 | :10C720003040CCCA0D4E3E4024020F4E3F500E000A 116 | :10C73000B012A8D23040CCCA0D4E3E4032020F4E4D 117 | :10C740003F50F2FFB012C6D23040CCCA0D4C3F4031 118 | :10C750003202B0126AD23040CCCA1FF303247F40A9 119 | :10C760000A00023C7F4010004F1263120C120C4E64 120 | :10C770003D4024023E4016020F4EB012EED2315020 121 | :10C7800006003040CCCA1FF303247F400A00023C5D 122 | :10C790007F4010004F1263120C120C4E3D403202CB 123 | :10C7A0003E4016020F4EB012EED23150060030401D 124 | :10C7B000CCCA1FF303247F400A00023C7F401000D4 125 | :10C7C0004F1263120C120C4E3D4032020E4D0F4DB3 126 | :10C7D000B012EED2315006003040CCCA1FF3032411 127 | :10C7E0007F400A00023C7F4010004F1263120C127F 128 | :10C7F0000C4E3D4032023E4016020F4DB012EED2BA 129 | :10C80000315006003040CCCA6FD3C24F65021FF3CF 130 | :10C8100003247F400A00023C7F4010004F12631245 131 | :10C820000C120C4E0D433E4016020F4EB012EED2CB 132 | :10C83000315006003040CCCA0D4C3F401602B012B9 133 | :10C840007ED43040CCCA6FD3C24F65021FF303249D 134 | :10C850007F400A00023C7F4010004F1263120C120E 135 | :10C860000C4E0D433E4032020F4EB012EED231500C 136 | :10C8700006003040CCCA1FF303247F400A00023C6C 137 | :10C880007F4010004F1263120C120C4E3D402402E8 138 | :10C890003E4016020F4EB0125AD3315006003040BF 139 | :10C8A000CCCA1FF303247F400A00023C7F401000E3 140 | :10C8B0004F1263120C120C4E3D4032023E401602E3 141 | :10C8C0000F4DB0125AD3315006003040CCCA6FD34E 142 | :10C8D000C24F65021FF303247F400A00023C7F40E1 143 | :10C8E00010004F1263120C120C4E0D433E40160204 144 | :10C8F0000F4EB0125AD3315006003040CCCA6FD31D 145 | :10C90000C24F65021FF303247F400A00023C7F40B0 146 | :10C9100010004F1263120C120C4E0D433E403202B7 147 | :10C920000F4EB0125AD331500600D03C1FF30324EF 148 | :10C930007F400A00023C7F4010004F1263120C122D 149 | :10C940000C4E3D4032020E430F4DB0125AD33150BF 150 | :10C950000600BC3C6FD3C24F65021FF303247F4027 151 | :10C960000A00023C7F4010004F1263120C120C4E62 152 | :10C970003D4032020E430F4DB0125AD331500600E3 153 | :10C98000A53C92436E0263120D4E0E433F402402BB 154 | :10C99000B01222D421539A3C92436E0263120D4E80 155 | :10C9A0000E433F403202B01222D421538F3C9243B7 156 | :10C9B0006E021FF303247F400A00023C7F401000F8 157 | :10C9C0004F1263120C120C4E3D4032023E401602D2 158 | :10C9D0000F43B0125AD331500600783C92436E0296 159 | :10C9E0001FF303247F400A00023C7F4010004F12D7 160 | :10C9F00063120C120C4E3D4024023E4016020F43BF 161 | :10CA0000B0125AD331500600613C92436E02631259 162 | :10CA10000D4E0E433F401602B012D2D32153563C66 163 | :10CA200092436E0263120D4E0E433F403202B0122B 164 | :10CA3000D2D321534B3C1FF303247F400A00023C16 165 | :10CA40007F4010004F1263120C120C4E3D40320218 166 | :10CA50003E4016020F4EB0125AD331500600363CFB 167 | :10CA60000D4C3F401602B0125CD4303C0D4C3F40A0 168 | :10CA70002402B0125CD42A3C0D4C3F403202B0126A 169 | :10CA80005CD4243C2EF222200F110F113DF000FF48 170 | :10CA90000FDD824F6A023F401602B01204CB163CF3 171 | :10CAA0002EF214203DF000FC0FDD824F6A020E3C96 172 | :10CAB0003F9030020220B01288CC1F426A023FF041 173 | :10CAC000FF03042082436E02B0122ACB82936E02CF 174 | :10CAD0000224304074C45F4212023FF205243F40FA 175 | :10CAE00057021F83FE2303435F4212024F93022427 176 | :10CAF000304096C3304074C432D0F000FD3F304027 177 | :10CB00003ADA30415D4F4F003DB20E241C4F5400C5 178 | :10CB10003CF0FF005E4F56008E100C5E8F4C5400B0 179 | :10CB20007DF0F7FFCF4D4F0030411F4270023F5361 180 | :10CB3000824F70020F930234924370021F427002C0 181 | :10CB40003F502E000F5F924F16026A023041304173 182 | :10CB5000F2F0FEFF65023041D2D3650230415F4200 183 | :10CB600064024F9304247F53C24F64023041F24069 184 | :10CB70000D00640230415F4264025F53C24F6402A1 185 | :10CB80007F900E000228C243640230411C426802BA 186 | :10CB90000F430E4F3E532E9310283F9005000D2457 187 | :10CBA0003F900F000A241E434D4F7DF00F004D9320 188 | :10CBB00003240E5E7D53FB3F0CCE1F533F901000AD 189 | :10CBC000E823824C680230410B120A1209127E409F 190 | :10CBD00006000F117E53FD232FB3032439405C025E 191 | :10CBE000023C394055021FF33D4032020A430B43D9 192 | :10CBF0001BB31F246E4D0E5E0E5E0E5E0E5E0ADED1 193 | :10CC00000E4B0E110C490C5E6E4C12C34E1012C32B 194 | :10CC10004E1012C34E1012C34E10CD4E00006E4C7B 195 | :10CC20007EF00F00CD4EFFFF0F930620CC4A000090 196 | :10CC3000033C6A4D3AF00F001B531D533B900E000E 197 | :10CC4000D72339413A413B4130413F401602DF4F43 198 | :10CC50004D00000030413F4016026D4F0E4F3E50D8 199 | :10CC60004D00EF4E0000CE4D000030415E422302E9 200 | :10CC70003F402302DF4FFFFF00003F533F9016026B 201 | :10CC8000F923C24E16023041F25080FF6502304156 202 | :10CC90003F406E02AF430000BFF000FCFCFF30419C 203 | :10CCA0003E407E025F4EB5FF0F5F0F5F0F5F0F5F6D 204 | :10CCB0005D4EB4FF0F5D8E4F000030410B120A1223 205 | :10CCC0001B427E023B9020001B343E4033020D434A 206 | :10CCD0000F4B0F5F0F5F0F5F0C4F0C8B0C5D6F4E98 207 | :10CCE0000F5F0F5F0F5F0F5F5A4EFFFF7AF00F006D 208 | :10CCF0004ADFCC4A80021D532E533D900700E823A3 209 | :10CD00003A413B4130410B120A121D427E023DF076 210 | :10CD1000F0FF7E4006000F117E53FD230F5D824F12 211 | :10CD20007E023F9020001B343D4033020C430E4FE7 212 | :10CD30000E5E0E5E0E5E0B4E0B8F0B5C6E4D0E5E2E 213 | :10CD40000E5E0E5E0E5E5A4DFFFF7AF00F004ADE59 214 | :10CD5000CB4A80021C532D533C900700E8233A41F4 215 | :10CD60003B4130417E4006000F117E53FD230F935F 216 | :10CD700007241E427E023EF0F0FF0E5F824E7E02CE 217 | :10CD80001C427E023C9020000B383F4032020E4392 218 | :10CD9000CF4300001E531F533E900E00F923304135 219 | :10CDA0003E4033020D430F4C0F5F0F5F0F5F0F8C40 220 | :10CDB0003F5016020F5D5F4F6A00CE4F000012C356 221 | :10CDC0006E1012C36E1012C36E1012C36E107FF07D 222 | :10CDD0000F00CE4FFFFF1D532E533D900700E3235E 223 | :10CDE00030411D427E023DF0F0FF0F4D0F5F0F5F9F 224 | :10CDF0000F5F0F8D3F506B003F5016020C4D3C50A3 225 | :10CE000010000D9C17240E4D0E5E0E5E0E5E0E8DF4 226 | :10CE1000CE438002CF430000CF430100CF43020046 227 | :10CE2000CF430300CF430400CF4305001D533F50C1 228 | :10CE30000700E73F30410B123E4047020D4E3D5088 229 | :10CE4000EBFF0C43EE4E0700DE4EF9FF00005F4D96 230 | :10CE500001000F5F0F5F0F5F0F5F6B4D7BF00F00E7 231 | :10CE60004BDFCE4BF9FF1C531E532D533C90070054 232 | :10CE7000E9233B4130413F4016020E4F3E50310006 233 | :10CE80005D4EF9FF4C4D7CF00F00CF4C0000CF4DB4 234 | :10CE9000010012C35F10010012C35F10010012C332 235 | :10CEA0005F10010012C35F100100EE4EF9FFDE4E6D 236 | :10CEB000070000002F531E533F902402E12330410E 237 | :10CEC0000B123E4040023F4016020D437C4E4B4C3D 238 | :10CED0007BF00F00CF4B0000CF4C010012C35F105E 239 | :10CEE000010012C35F10010012C35F10010012C3E2 240 | :10CEF0005F1001001D532F533D900700E7233B4176 241 | :10CF000030410B120A1209123E4016020D4E0C431C 242 | :10CF10005F4E1D000F5F0F5F0F5F0F5F5B4E1C00CA 243 | :10CF20003BF00F005A4D2A00494A79F00F00CE49D4 244 | :10CF30001C00CE4A1D0012C35E101D0012C35E10FD 245 | :10CF40001D0012C35E101D0012C35E101D00DD4DDA 246 | :10CF500031002A00DD4D380031004FDBCD4F380065 247 | :10CF60001C532E531D533C900700D22339413A41A4 248 | :10CF70003B4130413F4032020E436D4FCF4DF2FFF7 249 | :10CF8000CF4DE4FF1E531F533E900E00F6233F404B 250 | :10CF90004E020E43CF430000CF43F9FFCF43F2FFD1 251 | :10CFA0001E531F533E900700F52330415E4264023A 252 | :10CFB0007E900E000A2C4C4E7D4006000F117D53D2 253 | :10CFC000FD23CC4F32024E9304247E53C24E6402A2 254 | :10CFD0003041F2400D00640230417E4006000F11E6 255 | :10CFE0007E53FD233F9010000A341E437FF00F0054 256 | :10CFF0004F9303240E5E7F53FB3F82DE6802304175 257 | :10D000007E4006000F117E53FD233F9010000A342E 258 | :10D010001E437FF00F004F9303240E5E7F53FB3FB0 259 | :10D0200082CE6802304192436E027E4006000F11AC 260 | :10D030007E53FD231E437FF00F004F9303240E5EAB 261 | :10D040007F53FB3F1EB268020324E2D365023041E6 262 | :10D05000F2F0FDFF6502304192436E027E40060011 263 | :10D060000F117E53FD231E437FF00F004F930324C7 264 | :10D070000E5E7F53FB3F1EB268020424F2F0FDFFF8 265 | :10D0800065023041E2D3650230417E4006000F1157 266 | :10D090007E53FD23D24F6AFF6402304192436E02F9 267 | :10D0A0007E4006000F117E53FD23D29F7AFF64025B 268 | :10D0B0000420F2F0FDFF65023041E2D36502304109 269 | :10D0C00092436E027E4006000F117E53FD23D29FD5 270 | :10D0D0007AFF64020424F2F0FDFF65023041E2D3DE 271 | :10D0E000650230413FF0C0030F5F0F5F5E426A028E 272 | :10D0F0000E5F824E6A023041824F6C027F40060012 273 | :10D1000012116C027F53FC23F2D265023041B2F05F 274 | :10D1100000FF6A023F401602B01204CB5F42780261 275 | :10D120004F9303244F4F825F6A0230415F4278027F 276 | :10D130004F930520C2431802C24317023041C24F29 277 | :10D14000180212C35210180212C35210180212C34E 278 | :10D150005210180212C3521018027FF00F00C24F73 279 | :10D16000170230410B123B406A02BBF000FF000087 280 | :10D170003F401602B01204CB5F4BAEFF0F5F0F5F54 281 | :10D180000F5F0F5F5E4BADFF0F5E8B5F00003B419B 282 | :10D190003041F2F0DFFF65023041F2E0200065022D 283 | :10D1A00030413041A2B366020224B2D2680230415B 284 | :10D1B0005E4265023EF0200016247E400D004E8F38 285 | :10D1C0004F4E5E4F24022EB30524FF900900160235 286 | :10D1D0000A200B3C5F4F16025F4FCADA1EF307248A 287 | :10D1E0007FD080FF30414F4330417F4010003041BD 288 | :10D1F0005E4265023EF0200027247F900B00242C25 289 | :10D200004F9305205F4230022FF2202030417E40B4 290 | :10D210000D004E8F4F4E5E4F24027E90060005207B 291 | :10D22000FF90090016021020143C5F4F16027F90F9 292 | :10D230000B0002207F4010004F4F5F4FCADA1EF3F1 293 | :10D240000A247FD080FF30414F4330417F4010009F 294 | :10D2500030417F40100030414F930324B2D2660228 295 | :10D260003041B2F0F7FF66023041053C0C4F0C5ED6 296 | :10D27000CC4300001E530D9EF93730410B120B4377 297 | :10D280000F4B0F5F0F5F0F5F0F8B3F506A003D40EA 298 | :10D2900006000E433F501602B0126AD21B533B9059 299 | :10D2A0002000EE233B4130410B120A12073C0A4E8C 300 | :10D2B0000A5D0B4F0B5DEB4A00001D530C9DF737C9 301 | :10D2C0003A413B4130410B120A1209120A3C0A4F03 302 | :10D2D0000A5D694A0B4E0B5DEA4B0000CB4900002A 303 | :10D2E0001D530C9DF43739413A413B4130410B12FB 304 | :10D2F0000A1209120812071206125741100059416A 305 | :10D300001200464776E31F3C0D9304240B4D0B5C43 306 | :10D31000684B013C08435A4265020B4E0B5C6B4B59 307 | :10D320000B58184347BA012008430B580B99033890 308 | :10D330000B894AD7013C4AF6C24A65020A4F0A5C89 309 | :10D34000CA4B00001C53819C0E00DE37364137412A 310 | :10D35000384139413A413B4130410B120A1209121E 311 | :10D3600008120712061257411000464776E358414B 312 | :10D370001200253C0E9304240B4E0B5C6B4B013CBE 313 | :10D380000B430D9304240A4D0A5C694A013C09438E 314 | :10D390005A4265020B89194347BA012009430B8998 315 | :10D3A0000B9303340B584AD7013C4AF6C24A650234 316 | :10D3B0000F9304240A4F0A5CCA4B00001C53819C43 317 | :10D3C0000E00D83736413741384139413A413B4167 318 | :10D3D00030410B120A120912081207125A410C00AE 319 | :10D3E000C2DA6502474A77E3143C0E9304240B4EDD 320 | :10D3F0000B5D6B4B013C0B43594265024AB9082453 321 | :10D40000084F085D6848089B032449F7C249650234 322 | :10D410001D530C9DEA373741384139413A413B4170 323 | :10D4200030410B120A12091259410800C2C96502A3 324 | :10D430000F3C0E9304240B4E0B5D6B4B013C0B43D6 325 | :10D440000A4F0A5D6A4A0A9B0224C2D965021D532B 326 | :10D450000C9DEF3739413A413B4130410B120B3CB7 327 | :10D460000C4F0C5E0E9D03245B4C0100013C4B43B2 328 | :10D47000CC4B00001E530D9EF3373B4130410B1245 329 | :10D480000B3C0C4F0C5D0D9E03245B4CFFFF013CDD 330 | :10D490004B43CC4B00003D530D9EF3373B41304195 331 | :10D4A0000B120A1209124F9303203C404010023C19 332 | :10D4B0003C408010B24044A52A01B24002A5280198 333 | :10D4C000B24000A52C01CC430000B24040A5280189 334 | :10D4D0000A4C0B4E033CFA4B00001A53494B498E41 335 | :10D4E000499DF92B4D4D0D5CDD42120200004F931A 336 | :10D4F0000A200F430E4D0E5FDE4F600301001F53E5 337 | :10D500003F900C00F723B24000A52801B24010A5BF 338 | :10D510002C0139413A413B4130415F92780205206C 339 | :10D520001E4214023EB000021B205E4263024F9E68 340 | :10D5300017284F8E5F926402132C4E4F1E527A02B0 341 | :10D540006E4E7E9030000E284E4E3E50CADA7F90CE 342 | :10D55000410003285F4EB0FF30415F4ED0FF3041A5 343 | :10D560004F4330414F433041824F7A02023CD25305 344 | :10D5700064027D4F4D93FB23F2400B006302F2D017 345 | :10D58000100012020E3C7D90060004284D4F7D5085 346 | :10D59000FAFF033C7D4007004D8FC24D0A0232D096 347 | :10D5A00010005F4263024D4F7D53C24D63024F93A3 348 | :10D5B000EA23C24363024E930224C24E0A0232D0CF 349 | :10D5C0001000F2F0EFFF120230410B127F900C00BE 350 | :10D5D000042C4F4F0F5F104FB2DA7F400F00643CB6 351 | :10D5E0007F402000613C5F4212022FF34F246F43C3 352 | :10D5F0005B3C5F4212021FF346245F4212022FF38C 353 | :10D6000045245F43513C5F4212023FF24224473CB3 354 | :10D610005F4212023FF240247F401C00453C5F42C3 355 | :10D6200012023FF23C247F401F003E3C5F42120248 356 | :10D630003FF238247F402700373C5F4211027E4092 357 | :10D64000CDFFB012FED88F1012C34F1012C34F106F 358 | :10D6500012C34F10293C5B4211027E40CDFF4F4B5D 359 | :10D66000B012FED88F1012C34F1012C34F107FF0AC 360 | :10D67000FEFF4E4F4E5E4E5E4F5E4B8F4F4B143C47 361 | :10D680007F401800113C7F4005000E3C7F400300A6 362 | :10D690000B3C7F401600083C7F401100053C7F405A 363 | :10D6A0002300023C7F4024004F4F5F4FCADA3B41CA 364 | :10D6B00030410F120E120D120C120B125F4221009C 365 | :10D6C000F2432100F2D0C3FF29007F4009007D42D0 366 | :10D6D000193C5E4210021EF30424F2F0FBFF290005 367 | :10D6E000093CF2F0FBFF29003E4003001E83FE23AD 368 | :10D6F00003437D53E2D229005E42100212C34E1052 369 | :10D70000C24E10027F53E5235F420F027F900C0050 370 | :10D7100073205F4211024F9327245F4211025E4241 371 | :10D72000290012C34F1012C34F104F4F5ECF8AFF14 372 | :10D73000C24E2900D2CF96FF21005F4228003FF061 373 | :10D7400038003F9038000A205F4211027F9023008A 374 | :10D750000324F2D020001202C24311023F408F0185 375 | :10D760001F83FE230343703C3C408AFF3D4096FFED 376 | :10D770004E437E9006003924E2CC2900E2CD210000 377 | :10D780005F4228003FF038003F9038002A245F4273 378 | :10D7900028003FF0100005204F4E4F5F4F5F6F5342 379 | :10D7A000133C5F4228003FF206204F4E4F5F4F5F11 380 | :10D7B0007F500300093C5F4228003FF02000062014 381 | :10D7C0004F4E4F5F4F5F5F53C24F11025F421102D6 382 | :10D7D0004F930724F2D040001202B1C010000A009B 383 | :10D7E000333CE2DC2900E2DD21005E531C531D5373 384 | :10D7F0007E900C00BE23283C5F4265023FF0200073 385 | :10D8000005205F4212023FB0140012245F42210043 386 | :10D810005E420F024E4E5FCE96FFC24F21005F4226 387 | :10D8200029005E420F024E4E5FCE8AFFC24F290092 388 | :10D830001B4272017D5006003E40D0024F4DB01297 389 | :10D8400006D90F5B824F72015F420F027F900C007E 390 | :10D850000628C2430F02B25058027201123CD25342 391 | :10D860000F025F420F027F900C000B205F420E02FE 392 | :10D870004E4F5E53C24E0E023FF003000224C243DD 393 | :10D880000F025F420F027F900C000320C243100280 394 | :10D89000193C5F4212023FF0100005245F420F0264 395 | :10D8A000B0121AD50D3C5F4212022FF205245F42DE 396 | :10D8B0000F02B012CAD5043C5F420F0292120C0252 397 | :10D8C000C24F1002925314021F4214023E40320013 398 | :10D8D000B01238D90F930D205F420A024F930924EA 399 | :10D8E000F2530A025F420A024F930320B1C01000B4 400 | :10D8F0000A003B413C413D413E413F4100134E4EF9 401 | :10D900004F4F304006D90D4F0F430E93072412C3DB 402 | :10D910000D1001280F5E0E5E0D93F72330417C4001 403 | :10D9200010000D4E0E430F5F0E6E0E9D02280E8DE1 404 | :10D930001FD31C83F8233041B0121ED90F4E304143 405 | :10D940000B120A120912081207120D9370240F9E6F 406 | :10D950006E24342C0C4E0CDF1CF31B240C4E0CEFED 407 | :10D960001CF307202D9307280B4E1BF32C430C8B25 408 | :10D97000033C0C4D013C1C430D8C0A4C094E0B4FD3 409 | :10D98000FB4900001B533A53FB230A4F0A5C0E5C11 410 | :10D99000013C0A4F0B4D12C30B100B24094B084ED0 411 | :10D9A0000C4ABC4800002C533953FB230B5B0E5B25 412 | :10D9B0000A5B1DF33C24EA4E0000393C0E5D0C4F1F 413 | :10D9C0000C5D0B4C0BDE1BF31B240B4C0BEE1BF303 414 | :10D9D00006203D90030003280B4E1BF3013C0B4D2A 415 | :10D9E0000D8B094E0A4C084B088C3A533953EA49BF 416 | :10D9F0000000074A0758F9233BE31B530C5B0E5BFF 417 | :10DA00000B4D12C30B100E240A4B084E094C2883F1 418 | :10DA10002983A94800003A53FA230A8B0B4A0B5B6F 419 | :10DA20000E5B0C5B1DF30324DC4EFFFFFFFF374151 420 | :0CDA3000384139413A413B41304100137C 421 | :10DA3C00485033334320524F4D0048503235432029 422 | :10DA4C00524F4D004850323120524F4D004E503203 423 | :10DA5C00352056455220330062C64CC698C672C655 424 | :10DA6C007CC686C68EC6BEC6CCC6DAC6ECC600C799 425 | :10DA7C0012C724C738C74CC75AC786C7B2C7DCC73A 426 | :10DA8C0008C838C846C876C8A2C8CEC8FEC82CC9B3 427 | :10DA9C0054C982C998C9AEC9DCC90ACA20CA36CAD7 428 | :10DAAC0060CA6CCA78CA80D6E0D5E6D5F2D5DAD58C 429 | :10DABC0006D610D61ED62CD6DAD53AD656D66F4404 430 | :10DACC003D5D565B7B4C7F5F303A713E3B00767E12 431 | :10DADC007331753B3A6B72224513236870713E5E4D 432 | :10DAEC00305B3361630776573D3B0E5D5201040199 433 | :10DAFC0000040A0A0A0A0A0A0A0A0A0A0A070A0A8D 434 | :10DB0C000A0A0A0A0A080A0A0A0A0A030A060A0A76 435 | :10DB1C000A090A020A05007494A400B444D40073E0 436 | :10DB2C0093A300B343D400B242D20000646300005C 437 | :10DB3C00000000D1416200B1B000007191A100D091 438 | :10DB4C004061007292A26E6EF24246231232E7DD01 439 | :10DB5C0003460E49E217148392D22D2EBC01E9F331 440 | :10DB6C008F719F711FE9E9262BBA0942A3BE271FAB 441 | :10DB7C00E72901184426E6A6A6C6A6260D125D9531 442 | :10DB8C001BF56DCC135B2710B221467FCC041E060F 443 | :10DB9C006CEE6C6C16845383D228CC138FD02B93E1 444 | :10DBAC00D10313535777F440E537FE448F689C71CB 445 | :10DBBC00749B196464262E9923C2D5390727E3F385 446 | :10DBCC00391E62392164937D867F6B8006295590BE 447 | :10DBDC006CEF6B1524641B8493F339241395261175 448 | :10DBEC00F206907B0E91036EED6BA203E27F6493C1 449 | :10DBFC00A801D50F1F861212D107CC1323BA2EA35E 450 | :10DC0C009A23E95DAF647BB02F7F9BD83464E531F8 451 | :10DC1C0075C4014491C284F559D56FE73C1F20A807 452 | :10DC2C00201EDD384478281FB10578BE7718001FF8 453 | :10DC3C007171091068681084ACD32C22F32F64BB6B 454 | :10DC4C003EF53DFCF73F32CF0004086133D3D7E4F7 455 | :10DC5C0067C5AC2438D55D929B915F84D565E18412 456 | :10DC6C0082B2268477660668BD7062DC72DBE8C51A 457 | :10DC7C007F0E6A6A7A7AC34C2625BD4D263DC3EECB 458 | :10DC8C00F66BB6EE3808A6F8FB0FD757D371D31A3C 459 | :10DC9C00B27F5A6C468438464F7686563696861630 460 | :10DCAC006636567F841A9B6868A0F0AC2AD766E863 461 | :10DCBC00429B41994284686868D8F0DB6771BC5E0E 462 | :10DCCC00416272A2D560BD667FDCE862DA1ADA8244 463 | :10DCDC002A9292D26FE8C00813847FF0B93F515E4C 464 | :10DCEC005E210D0642AA68686870F06681D5923F85 465 | :10DCFC00529BD701029B0806A105D57D067F688142 466 | :10DD0C00DC67D3507766B262066226A2DBE8477204 467 | :10DD1C00AC82B272DB9BAC160828D53CB20468848A 468 | :10DD2C002E288B287F38A838640918DF8284BA7BA8 469 | :10DD3C009B7A9A4B7B84D779422E52841AA1D7674F 470 | :10DD4C006181D79306E5E8EE9CE87F7C1EFB90058D 471 | :10DD5C00114C7B2FAF3F38DF37D86F37804F37648C 472 | :10DD6C0037F03773268EB2888E1664765B8926BCA4 473 | :10DD7C008BAD7B4FBEA5B6676673DD9A38EE3E3B26 474 | :10DD8C004E9C3A267726AF261E2D5AA07AEE7B475C 475 | :10DD9C00A972DC7241F04F36646F3680DF36D83FA3 476 | :10DDAC00363636BF01AF3E266694DF36160616763B 477 | :10DDBC009686065656B9A2D62E467F263606265687 478 | :10DDCC0084146CFF71062F36360686560699A29679 479 | :10DDDC0036D6FB681E9C8CE9267726948E1668C571 480 | :10DDEC001887A86BD2BE879B4F769B9EEE4123BCB7 481 | :10DDFC00AB1686AEEE3E469D87AE467DBB665BADF2 482 | :10DE0C00FEFE844E98BDEE749BAF7B047F0ED0B3A8 483 | :10DE1C00769BD6B2461B4ED4B0252E0E7F84EF8156 484 | :10DE2C00824C9F638CE1A40E15062BAFDDBB850BDA 485 | :10DE3C0031957A392538669636164676166B6DA668 486 | :10DE4C00E994FA044E84162E4C2E4CA7C22667C5B4 487 | :10DE5C00BCC34144DBECDA27514CDBD74706681DC9 488 | :10DE6C00259BF1BAC6E97B1FEEF6EC3E5B06681803 489 | :10DE7C00644FDC08EC26B8CCA62E33C42876F73ECB 490 | :10DE8C003C7C863B4E282878E641567664F9BBD01C 491 | :10DE9C00403326722684183E1FDFF194547C1161A6 492 | :10DEAC00161EE1554CEE211671EC6C6C25460BEFF1 493 | :10DEBC00EF984C261F3FBF363F365F866F36F836DD 494 | :10DECC0050763636C4505EA5E247E35E262C26AC6F 495 | :10DEDC0029505E2635E626DB46987BD7E6DA755761 496 | :10DEEC001835E8DB505EDA505E5E5E40506F37F8F6 497 | :10DEFC003F385F86BF371F373716FEAF56D49A9A16 498 | :10DF0C0003E4D4EF28CDF0AC168628F1F19CC56162 499 | :10DF1C0081393694C7214CB4C07621ECF19C3CCCB1 500 | :10DF2C0018184BDF987CBBCA2303D8F9EEFE3B4391 501 | :10DF3C007F476272847887EF4F7764BBFC33BF8670 502 | :10DF4C006656264696840A028906A4B88588AA6B6A 503 | :10DF5C00129E002893E70C92AA2AA689BA82058100 504 | :10DF6C000B832AA604233EAEAE02420CC212AE0BA9 505 | :10DF7C00B846C3A9AB0D3A0AE0223820EA96E2373C 506 | :10DF8C00A0AA220200822040C80A33C000C2EA4480 507 | :10DF9C008DAAAEAEA232FF1C342E08000040EB1945 508 | :10DFAC00C72AEA350EA04E51914A337429CCEA0D9A 509 | :10DFBC00C7C0CC28D2C530522CD00FCC22820A0C30 510 | :10DFCC00AE2E881008A4EB68AE13511455A5AE08FC 511 | :10DFDC008A12728DAEABABAE7E5514455121CA0080 512 | :10DFEC000000AE00B0EA0000C3A9ABBA0628AEAE82 513 | :10DFFC00AAAA0A38ACE8828AAEA28A0ACCE8AA6835 514 | :10E00C00A82A00C0AE2B5681605855A1AABAAEB949 515 | :10E01C008293AE8EBA2EE88AE822C8BAAA9E6ABA51 516 | :10E02C009A494440955902A95A0AA6720C95A5160C 517 | :10E03C00454094C2AA8EABA8ABBA89A60EAEA8AEC8 518 | :10E04C00CA80AEC00000007393A300B343D3007228 519 | :10E05C0092A200B242D300B141D100006362000031 520 | :10E06C00000000D0406100B0B400007090A000D45B 521 | :10E07C004460007191A19E20A820458A5B3268EE15 522 | :10E08C0072DD067101D512F67F4678383062E11FD9 523 | :10E09C00B10336750FEE368F78DA76749B086421EF 524 | :10E0AC00642E9923C2D50107276216E11615FB16BB 525 | :10E0BC0037EE1D75CF10168F719F711FE9E972260F 526 | :10E0CC002BC2BA1442A327E071275B27C662B5FAAC 527 | :10E0DC00361303E2637FD83A9B6475187560161F7C 528 | :10E0EC007500AC2C87F9331F006868187171846552 529 | :10E0FC000AF26BF22800469C9AAABACADAEAFA84A7 530 | :10E10C0077231261870735377695F8A5F843113DCB 531 | :10E11C009CF5E9009CAC7B7A7C5E42466232C20E76 532 | :10E12C0006F2E1522B022D837F41994284B15AB2FF 533 | :10E13C004684170E22467E7EBD303772C2CFBD2E6E 534 | :10E14C00BA349B7A9AB77B8497750635D3803D4F4A 535 | :10E15C00987B1E61432A16066CEE6C6C17E2CF900E 536 | :10E16C009B130B84853F4662273DB22146449EF2A9 537 | :10E17C0006F2443E8184455916CF26C6CF2050FB6B 538 | :10E18C003553768F468F506B76764C7B7B7B16287F 539 | :10E19C00A2FA35627676EB6A87469E9F8444466285 540 | :10E1AC00729E237FE6A6A6C6A61226460E38F32F2D 541 | :10E1BC0064BB4EF54E8446C67BA57B42232646A9FE 542 | :10E1CC009FB6E8D5652B73FE8B2E7557BA5746CF85 543 | :10E1DC00562653682E847B9D9FE5408FF6BE97F89C 544 | :10E1EC002E7D82017B7B7B7BA77BA393A3BA95457A 545 | :10E1FC00231636A9E8056F1628FA35627676E823D9 546 | :10E20C0043FEFB633D5608D9847B7312BC23164630 547 | :10E21C001291B9D17B7B7B6D6F7B637BD47B843517 548 | :10E22C006B3E061646849778383823165612A1A9E9 549 | :10E23C00E3E98FC68FA571976398988E232636A92C 550 | :10E24C0012E19FA6E94DD50800DC7B7B7B7B7B7BB9 551 | :10E25C0041939578A77535F83337EEF778F212229B 552 | :10E26C0038FC35783529F77B3244CF4316D304007C 553 | :10E27C002676767626844141414141605F5E1D27BA 554 | :10E28C0091A17E91A1631C20787878C2A89898EF10 555 | :10E29C0016DF2636265826461E787A317A7A7A3058 556 | :10E2AC007A797878787878787A78265A322B474445 557 | :10E2BC009FBF93A3E36CE17302C26B44D294E594C9 558 | :10E2CC0016369F2671594024F916DF7427029F7168 559 | :10E2DC0044523D2178787878846DAB2B73029F4142 560 | :10E2EC006A6A24A79D959D1656761646F6847A7A08 561 | :10E2FC007A8400006D26730258E39A8AE16B6B8C6A 562 | :10E30C009AC572F192D2A42EA6C013E7A81B3BBAF1 563 | :10E31C00A7429B9BB63323BAA9A39A230B0D712C4E 564 | :10E32C001253552F7F38A83864092FAF9BB9BD9B6A 565 | :10E33C009D93F593F59F440191C2847253D1F1D210 566 | :10E34C00B5C0138FD0B993D50313A9F5D0ED6BD706 567 | :10E35C00422B42027F6493DF01D5BA1FF48EC013A7 568 | :10E36C00D239BD6493EBF47F6BEE062955FE6CEF4E 569 | :10E37C006BD7BF641B8448484848484848484848BD 570 | :10E38C00A985181818188F8F8F8F8F7A7AA25D2015 571 | :10E39C007A58087A7A4D30DDC906965F267476CBAA 572 | :10E3AC00C921463E375D221D383245293EEC8A088C 573 | :10E3BC00522E46CF869F76CFC295C1139E8499E587 574 | :10E3CC0016760776765225DDD51342E335FD3EFAF7 575 | :10E3DC003A167DA60E20742064BCBBC2E5C19C26F7 576 | :10E3EC002E6DAC840E11F66F4E640BDC84C252BDE4 577 | :10E3FC00FF9DFDFE64F295457741BA6227E2B2E2D9 578 | :10E40C0017E37713841BFB9C0E73022452EB12232D 579 | :10E41C0042E352DDE87D42BAAF3A429076765C72C6 580 | :10E42C00BCE274746BFE64BC008095454335E7FA1E 581 | :10E43C003A0EBBEB422D3644786552454213E34D00 582 | :10E44C00E3166E6E6DC5E14DE36F0E111676716DB0 583 | :10E45C00C54636667F5DDC6221120DC5622BFA8AD9 584 | :10E46C001729F5F1223AFA0EBBDF4732422B6A2408 585 | :10E47C00C2527D42448477877CCA08851D0808D027 586 | :10E48C00D6DCAAEBEBEB91C5919EA7E2EB6C6CF89A 587 | :10E49C005B2DE2B223E291C2919CDEA5EBEBEDCFBA 588 | :10E4AC009538890668CB7322727FC2049324FC7E54 589 | :10E4BC002EDA903E817FDB906E26D3623E2E46781C 590 | :10E4CC00D30668DB72DA90447D51E0F66B5506BFDB 591 | :10E4DC0084A28A9B9BDA9B06DA1C261B64391B934D 592 | :10E4EC00662133032797266DC59526469B8AAC82F9 593 | :10E4FC00D4E0828ADAE0000000000013E28A792E70 594 | :10E50C008AAC6272A1AD0DC6293884FC7E263E8190 595 | :10E51C00DBE0A2D3DD3197383DFAE21208FC5DD482 596 | :10E52C002E8AA3DA916E5DE17E5D4D72A2DA5E5D9C 597 | :10E53C00E1A2262EA730AC58A226D3BC289728E2FD 598 | :10E54C00828A81DBE00246621EAC5D2A82B226E042 599 | :10E55C00585892E0FC8E6221382E3D43CF56E6D2BD 600 | :10E56C00151D27469C0A1A2A3A4A5A6A7AE242240C 601 | :10E57C0042E2273FB284D05FD1D27271734B49A86B 602 | :10E58C003DC9DE4D63670A608BF9949395FDFC9150 603 | :10E59C000DC67322728A0E7F12C2240018977684DD 604 | :10E5AC007F0E6A6A7A7AC34C2625BD4D263DC3EE92 605 | :10E5BC00F66BB6EE38422C427F946D06686BA281E6 606 | :10E5CC006881682E72E178464F76865636968616A6 607 | :10E5DC006636567F84914800002E72DBE22E727FE5 608 | :10E5EC0081DCE294A0D18471E13F911D537FE7C59A 609 | :10E5FC00AC247D0F6226A2DB1AC761AC82B272DB3F 610 | :10E60C00D750A775B26273A1A471E13FD56726DC20 611 | :10E61C00515EDB1D537806906B8482B22684A1BCBC 612 | :10E62C006BC16272A2D56CBD757FDC1A62DAA4DA9A 613 | :10E63C00822A9292D2621A8E264EE17F4678A77277 614 | :10E64C00AC263EE14DD138DA44D7515E5E624DE1E5 615 | :10E65C002E688B682E72AC2A1ABC2B4946449E0637 616 | :10E66C00B61D33A7750668BD5F62DC72DB1A80824B 617 | :10E67C0026B1618106E5E8EE9CE87F7C1EFB9005E7 618 | :10E68C00114C7B2FAF3F38DF37D86F37804F376453 619 | :10E69C0037F03773268EB2888E1664765B8926BC6B 620 | :10E6AC008BAD7B4FBEB5B6677573DD9A78EE3E3B8E 621 | :10E6BC004E9C3A267726AF261E2D5AA07AEE7B4723 622 | :10E6CC00A972DC7241F04F36646F3680DF36D83F6A 623 | :10E6DC00363636BF01AF3E266694DF361606167602 624 | :10E6EC009686065656B9A2D62E467F26360626564E 625 | :10E6FC0084146CFF71062F36360686560699A29640 626 | :10E70C0036D6FB681E9C8CE9267726948E1668C537 627 | :10E71C004887A86BD2BE879B4F769B9EEE4123BC4D 628 | :10E72C00AB1686AEEE3E469D87AE467DBB665BADB8 629 | :10E73C00FEFE844E98BDEE749BAF7B047F0ED0B36F 630 | :10E74C00769BD6B2461B4ED4B0252E0E7F84EF811D 631 | :10E75C00724C9F638CE1A40E15062BAFDDBB854973 632 | :10E76C0031957A392578669636164676166B6DA6EF 633 | :10E77C00E994FA044E84162E4C2E4C77C226E7C52B 634 | :10E78C00BCC3C144DBECDA27514CDB977B06681D1C 635 | :10E79C00259BF1BAC6E97B1FEEF6EC3E5E06685887 636 | :10E7AC0082B2269AEC26B8CCA62E33C46876F73EF5 637 | :10E7BC003C7C863B4E686878E641567664F9BBD063 638 | :10E7CC00403326722684582E0E3E1FDF00F19457DC 639 | :10E7DC007C1161161EE1584CEE211671EC6C6C2507 640 | :10E7EC00460BEFEF984C261F3FBF363F365F866FC8 641 | :10E7FC0036F83650763636C4505E75E2C7E45E267F 642 | :10E80C002C26AC29505E26D5E626DB5D3FDAA5CA60 643 | :10E81C0048644FDC1D272E505E5E5E40506F37F80B 644 | :10E82C003F385F86BF371F373716FEAF56D49A9ADC 645 | :10E83C0003E4D4EF68CDF0AC168668F1F19CC561A9 646 | :10E84C0081393694C7214CB4C07621ECF19C3CCC78 647 | :10E85C0058584BDF987CBBE62303D8F9EEFE3B43BC 648 | :10E86C007F476272847887EF4F7764BBFC33BF8637 649 | :10E87C00665626469684ABDF87A0842A6163E282C3 650 | :10E88C00888A2A26888C22A228A29619B4222EE0E5 651 | :10E89C00428AA3AA0032020040C00333B003AA0884 652 | :10E8AC0028A18C0A2E882A036AEA82722CE1AA2AF1 653 | :10E8BC00B8824220220A24820602AAAB5AA0BA02CB 654 | :10E8CC008200002A0002EF1E0491BAEC822E3EC098 655 | :10E8DC0024A3BAC3141468A0A9CA8C7300A3BEBB2A 656 | :10E8EC00902A0F014400A01E04D0C3AACAC00CE297 657 | :10E8FC0010C80828A02AFFFF0CC3AFA202E070AE1C 658 | :10E90C006EAAAA8E2240282208E822A408AC4AAAA1 659 | :10E91C00A830C0002A903A8EEEA47B829ABA9A2A2A 660 | :10E92C0009800AECBBEA28207962AEBB8E08AED017 661 | :10E93C0039E0E3EA2A22FFFFFFFFFFEB2C289B22A2 662 | :10E94C00B24A10EC81028003A82A0A8C968E08E346 663 | :10E95C00A8A3220898CB18434C818282CA988CAE0B 664 | :10E96C00C3B0CC0C142CE308934553AA91000104BA 665 | :10E97C00C64C41A20202FF3CFCFFCCBFFEC3CCFF45 666 | :10E98C00FFEB0A08610185819A4649EB0268EB0AA4 667 | :10E99C00B82A133BD2D000308BC00484D0E4484357 668 | :10E9AC002C040441104A82090E34B20C0E1C800A4D 669 | :10E9BC001A0B00C0C80CFFFFCFFFFFFFCF0A0200ED 670 | :10E9CC0080AAAEAEA23282AB03C80800000080B4AD 671 | :10E9DC00403B4010AC8C140A740C134496112A2042 672 | :10E9EC0008803B4545EA2DA1ACC4E4292C22162C09 673 | :10E9FC0002B32A5123A0EB68AE13511455A5AE08EF 674 | :10EA0C008A12728DAEABABAE7E5514455121CA0045 675 | :10EA1C000000AE00B0EA0000C3A9ABBA0628AEAE47 676 | :10EA2C00AAAA0A38ACE8828AAEA28A0ACCE8AA68FA 677 | :10EA3C00A82A00C0AE2B568160585591AABAAEB91F 678 | :10EA4C00029EAE8EBA2EE88AE822A88CAEAAA79AAD 679 | :10EA5C00AE6612115065960CAA96825108CEA61677 680 | :10EA6C00454094C2AA8EABA8ABBA89A60EAEACAE8A 681 | :10EA7C00CA80AEC0000000D343630034947300D24C 682 | :10EA8C00426200339373003292720000A3A2000022 683 | :10EA9C000000007191A10031300000D04060007086 684 | :10EAAC0090A000D141616D02CC06BC84DD0246C24F 685 | :10EABC007FBA049B7A9A137B845A17461B4199425E 686 | :10EACC00B1AF84067F68BD406528A293932B6D007F 687 | :10EADC00825A0E153A577F0E1B49377B68252E84B8 688 | :10EAEC00639F8C3FA40644CF3F4E9843291374EE8A 689 | :10EAFC00447BEE8416415257423641525BD4128409 690 | :10EB0C006272842E2BBD4066BD40825A68300E3D29 691 | :10EB1C008C6DA48B0304457FCE1E9B76787886770C 692 | :10EB2C004E643B216F3B438397CE20769B1E06267B 693 | :10EB3C00243BBC066CA3EE70829826D726AC9A3088 694 | :10EB4C007F0E6A6A7A7AC3282625BD29263DC32BF7 695 | :10EB5C00F66BB62BA89A9A03E4D42D4E57CD2EAC57 696 | :10EB6C0016867FD1314384446CC29BD03071C1472F 697 | :10EB7C0033ACBC30DC405A0625D5CC1E3E5E5E66FE 698 | :10EB8C003E472E5BE09D5B63CFD839F6FE234616DD 699 | :10EB9C00AF56FEF478E6EE567664F9BB3B40263E63 700 | :10EBAC00844E30281682576D01469E442945C9B3C0 701 | :10EBBC00D9B549B719B8CF762F846F666686665675 702 | :10EBCC002646961616667F84467F465620060D5AB4 703 | :10EBDC00253EEF3E816B3EA23E61AB4CAF76243EB0 704 | :10EBEC003E1E9C4AE9267726943B16680DC97FE9A0 705 | :10EBFC009449044E683BE9683E26EF3E46260D5A82 706 | :10EC0C000D3A452B447CC2865E4E76FF3E64847B77 707 | :10EC1C00EEBA63D45AA3BA6045065B8441DC5F9EAE 708 | :10EC2C0042B1455F446D00EE9B8143BC621686ABDE 709 | :10EC3C0047842671717126937B86924E9D99852609 710 | :10EC4C007326768764DA5D934629789E467E44FE69 711 | :10EC5C00D975496D1970E972697374842FD1068660 712 | :10EC6C00563616766F84EFD136068646DF849FD1F2 713 | :10EC7C00D13F848FD12F84363684DF361606167634 714 | :10EC8C0096860646364F844F669636164676168618 715 | :10EC9C000656667F84467F26360626568656069688 716 | :10ECAC00269696467F847FBE95DC990D5ABBA17B38 717 | :10ECBC0006E5BBA5E91CAF64941114471AEE781451 718 | :10ECCC001E4454422476EE9C20C2424E7694172C5D 719 | :10ECDC0094543016763A598B7C64161476199C74BD 720 | :10ECEC003E1DA2EE3E414E9840DC8E29A646C60D36 721 | :10ECFC00BC047793ACA53F65AF0D306D00A7408287 722 | :10ED0C00D598B2261D01D497260D5A4655A7408298 723 | :10ED1C001ED2976B9377D5A0D39F242C5C5C64BCDC 724 | :10ED2C009F41443EB23E07D39B165C2E90D5A24623 725 | :10ED3C004F0DBC430D68DBA49C24430E710DBC9499 726 | :10ED4C00BB929E3E0D1DEF268EB2A98E263EBAAA10 727 | :10ED5C00AE2164765BAB7FD0AF7526240D440D5786 728 | :10ED6C00454F6B64B43E1DEF3E0D7053749B2BB13D 729 | :10ED7C008466B944CB3FCBCF561F864F84BFCBCFD5 730 | :10ED8C00966F841FCBDF845FCB3F847B7B0D7042FF 731 | :10ED9C001D220DFB261D227B7B0D68423DEEECA255 732 | :10EDAC006272BDD0BCC071A1440D680D09B39BD17A 733 | :10EDBC00DEC48272B246060E2DBCC741D7C7A7C7A8 734 | :10EDCC00A371437FBAE55667E7EA461E3EEE68A19B 735 | :10EDDC003616260DBC42260D4F9B0DD53E167226BF 736 | :10EDEC000D6ADAE7169C7A24D6C116823EB23E0D25 737 | :10EDFC00525D311626720D2E82B25213D516841E18 738 | :10EE0C00B6D990D6E62667D9E34666EE2656462D49 739 | :10EE1C00C73EEE5EFE3EA7DFEB3E268E263E460D3F 740 | :10EE2C00BC0477E0EB4E44C5E37B7B0D70E5E31E41 741 | :10EE3C00F6860DC9D59582B204266D00BBD6166533 742 | :10EE4C0040560D8DE37F4252477BBBEB7C646BE8F5 743 | :10EE5C00526B42467CFEBD2642782C42F6F694B6A6 744 | :10EE6C00044E261EE6B1427C421676646BEF3E528F 745 | :10EE7C000D7004D07BE9DBF342432F3E1D033EDBD8 746 | :10EE8C004E98DAEE40BDDA74D5A5F9A184A384EED0 747 | :10EE9C007BDBFA847F467686563696861666363641 748 | :10EEAC009676567F84EAD161A182062E6226060EE2 749 | :10EEBC0025BC0471A50441443EC516E706262EFE6A 750 | :10EECC00E61D223E9BDA099B257BEE3E42525E5E9E 751 | :10EEDC005EFE3EDA0F1D6B463E525E76C70EEEFEB0 752 | :10EEEC003E86474E3E523EC718DB187662A714A3E7 753 | :10EEFC004513413B433BA167127715733B713B3D77 754 | :10EF0C00EE2616863DE3677BDA1A865C4E0DBC0452 755 | :10EF1C00C51D3E523E0D70423DEE0D4E9B42527B46 756 | :10EF2C009A769C4606680DC9957F52A546D7203E19 757 | :10EF3C00725D4FB272160D2E4725AC6D00646920C0 758 | :10EF4C007B97463E1D033E1D616B273E42EEEE460F 759 | :10EF5C007F1642AF66BAE9E994B00442268E4E425F 760 | :10EF6C001E2C98B2267526BD329C04EEBA7B9CC72B 761 | :10EF7C004442269652A534A316B6430D706720164C 762 | :10EF8C0026BDF5361A260D525D313E16D740722637 763 | :10EF9C000D6A264263B252265D4D82B272241E2641 764 | :10EFAC00420D4E0D3000542B52268B261E260D7012 765 | :10EFBC0044544D804665459E42B1446D00D71F4672 766 | :10EFCC00296548160D8D0CD71F3E16720D2E4FB2AB 767 | :10EFDC00724D92000000000E3B7F365B43363DE9DC 768 | :10EFEC00683E743A0D570E0DD5369B48363A64BBC5 769 | :10EFFC005136400D307754AC0D063E439C3E849FF9 770 | :10F00C002DEE9F06253E3DEE3E2DE59F3E6E1551A5 771 | :10F01C00F9D95A84B55E7F337B7BDA6764BB5E3685 772 | :10F02C00849B7646358763749B61F38974F36464BF 773 | :10F03C00F32E369A06F174996574F176563E0D5797 774 | :10F04C000DCCB25E7D0D5AADCCCC469C33356C9A52 775 | :10F05C00AABACADAEAFA8E2ACDEF3337B80E522E94 776 | :10F06C003222F3F56F435F669BC2326D1A45E3673C 777 | :10F07C00767775E5BB202171F9207D1B8573D485CE 778 | :10F08C0078A5F177E3CDA5B5D5BAA17DE2D87BEF14 779 | :10F09C00B8966FF9F96DDFF96129F9595989875AD1 780 | :10F0AC00062B6643840012E6321202423662369C0C 781 | :10F0BC008E7F282A4620ED000D0642B786231312B8 782 | :10F0CC00C33A3825AF13B33337AE8DFA3222F3F58A 783 | :10F0DC008A1333378CB78DB31AB7AEF5C02B7D0AB4 784 | :10F0EC00258F17928E9FC278471F7858498A848E35 785 | :10F0FC00789F06472596158621C3F2DB9D3E543E2C 786 | :10F10C0023E1F2BB9DC28F998E9F98681F988AF25B 787 | :10F11C007411F2BB9C33359D3EF2162B8F76742BFB 788 | :10F12C009D6F4491DBA43E0E322233378AF3F5A156 789 | :10F13C003245B826F21698C8988D20829DA9964221 790 | :10F14C0054549B9A26843B3EF2BBAE96168F767433 791 | :10F15C009BAA42BBAD9BEEEE6464AD1064103EBC4A 792 | :10F16C0038B1F274F2BBB3C5B1F5961698221638C5 793 | :10F17C00CD308EBFD8B4EFB8962ACDEF75C62B1F05 794 | :10F18C007171718E21228AC31C42911ACF9DC31AB0 795 | :10F19C001FE75FE78F607D1B8E1FF9F9F984DD088F 796 | :10F1AC008AC354000000328E8FD5C10A4144D30467 797 | :10F1BC0043637383A3D3E384A6B68F47C67865C62F 798 | :10F1CC00780A3337A86DC90A250A614141D18A6D85 799 | :10F1DC00260A718126002123544B479A6797F60A19 800 | :10F1EC0061062756061B12B4D6A57B7B7B7B5BC5C1 801 | :10F1FC00E247D467CFE6390AA12647CA67D6D63983 802 | :10F20C00F6B61B7BE17B7BCDCFA546D6F614D6F9A3 803 | :10F21C0047DB6569D69C65686A45DF67DE75DE8508 804 | :10F22C0068E6D61B676D0A2645E267E277E296F63A 805 | :10F23C001BD6C614A61482D8E7F247E665E6F6A6F6 806 | :10F24C001B86D614D6997B5D5FA54745EB67EB759E 807 | :10F25C00EB85ECA6B6840A71F98445F065F077F07D 808 | :10F26C0087F0A5F00A8126A6A61475F2D5BA71E22C 809 | :10F27C00B9BAFB7BD17B7B7BD5A5457B5DC747F7BB 810 | :10F28C00C6B6140A7106A6618F2171212747FB6748 811 | :10F29C00E786890A06B681E147FE65FEE69986E6B1 812 | :10F2AC001420566DEE75141113090DDF899A14DFB5 813 | :10F2BC0089D414DF89A7148614E09F36A23626372A 814 | :10F2CC00E6609898983725446F96422B8FA6A6CF68 815 | :10F2DC00C00F8FC00F568FC0152FD41F522D466FE5 816 | :10F2EC00663E84E0248FC01A868FC03DA6DFD77699 817 | :10F2FC00169F5329EB6ABF247171712184E0D117D9 818 | :10F30C00E2A7372FA73563D737DF41999F20BF84FA 819 | :10F31C00E0368FC024D0201F761676712A1F240069 820 | :10F32C00EBEE98989837888F90D03E71BF892F1646 821 | :10F33C00466484C2C68861768F5073E21F2488B4F9 822 | :10F34C0016168BC1C52FDAB8DF41991F8416268B90 823 | :10F35C0061E9B716B3A2364637A2363637A2DD3787 824 | :10F36C00C6E7D2F19888B08826163788262637004B 825 | :10F37C00C2D0B817B4B0D43788B816368B26368BB3 826 | :10F38C0026468B26568BBFE32F16568B63DA3788AF 827 | :10F39C00E7763637764637A2361637CC7377E27176 828 | :10F3AC00523EC559C28E03E3BA429A01BA42E136C3 829 | :10F3BC002E0549DA468F1606C34803E24BC348268E 830 | :10F3CC0003E26B5323269B2B260103E236447F6416 831 | :10F3DC009329054CBA4C740629570127BC50075485 832 | :10F3EC007BBA509ABA557AFF2F44912BC20756E537 833 | :10F3FC0063BA54C2A39A23F8647B6441362E044B3F 834 | :10F40C0004D261606C93D357449346242C446A8392 835 | :10F41C0092B45B7F46AF64947078296074296074F1 836 | :10F42C002960747878732C3E84EF666ABF48EE7B53 837 | :10F43C00DB62623B6A938F4336E39353FBE3975350 838 | :10F44C00337F9E9093A14B6CC29B6444689D9E2B12 839 | :10F45C005F8606768F447AB401BAC2E1AF51D16FA0 840 | :10F46C00449AFBFB9C0E26C284469C449E02B973B4 841 | :10F47C006A64C876761F204FE6A6A6C6A6260E138B 842 | :10F48C00233222F3F577B3333579B133377AB77B3F 843 | :10F49C00EFB77BF779B332849F6DE7DB6D02EF71C9 844 | :10F4AC00717184000000C7815E458F2509549D73DE 845 | :10F4BC00739F71781675742B83781621987B8771DE 846 | :10F4CC00432275876C64ED612D2B6491BD8A6D426E 847 | :10F4DC0031478B9DF86D1B8E4F40778E78478E7819 848 | :10F4EC008A8423EFE9E9CF20731FE9232BC2BA9357 849 | :10F4FC0042A36D0D069B8A236D00959652B293C163 850 | :10F50C00462F4484523E8E4FB89A9871B89A413621 851 | :10F51C00444384C21E03541725637FD89F9B6445C4 852 | :10F52C009D7575251384C5A2547F162E91034171C8 853 | :10F53C00295E45A7BDA9252DEF41BDA7AF76C4A770 854 | :10F54C0036879F422F360345A993845883C5AA71E9 855 | :10F55C00075E719F312FC7B15EC245AFBD8AAC4407 856 | :10F56C00A0339DEFE9E9E922AA2A4552BD8BC2AC32 857 | :10F57C000052027E4246426262929292923E16F291 858 | :10F58C00F296DDAF2ED32EBDF20D5FBDF92E0D5FC1 859 | :10F59C00DC7C0DD1D594D10D06F7BDECE02E95BFDA 860 | :10F5AC0052B226B284002EBD7C265E262E1BD5942C 861 | :10F5BC00D11DE23E050D940D970D980D2C0D030DEC 862 | :10F5CC00D10D5F0D060D062EF526BC84D1623E26AC 863 | :10F5DC00720D9517722E154E0F175EA20F17A226DD 864 | :10F5EC002E156E0F17A272157E0F17E40F176DE311 865 | :10F5FC004150714F4161E4D10FDC7CBD7C4E262E15 866 | :10F60C00151F85DCF93E2E15F20F1D85DFDDDB475E 867 | :10F61C007C657C1A81F96E58A5DDF95E60F93E2E89 868 | :10F62C005E61A5E02AA1F97E583AF9E40F1F45F076 869 | :10F63C0067E575EA3E261E1B1DE206AB1E2E2EBD8F 870 | :10F64C007C151D191D3E52CDD4163E261BBFE05213 871 | :10F65C002EF92E153E11E9151FF95E2EEC15F2133D 872 | :10F66C001E1BF92E1BF9266D0067B73EBE7CDDF91B 873 | :10F67C002E2E72155E11EC151FF9522E3E15F2133B 874 | :10F68C00521BBC42628452DEADF7067F682E84F5B5 875 | :10F69C003E84F51E84F52E84F50E84438F16FA43B2 876 | :10F6AC009C840000000F484E4E0000CFC04404DC88 877 | :10F6BC005254565C5E61677877758B716E8786885D 878 | :10F6CC00D8C4B2B5A9A4647B7D6A8E736F81808225 879 | :10F6DC00CB6CBBBCABA6422B448FA6A68FC011CF64 880 | :10F6EC00C0458F568FC03AD111236DD9E024CFC0BD 881 | :10F6FC001352AD0073C25224ADA76D4E91AC0D9256 882 | :10F70C006D0091580D2A5A0D625A0D5D5A0DCE5A44 883 | :10F71C000D1D0D24815D655D595D5C93A161812D8D 884 | :10F72C00001D27811D53A161D1973D10A161974DFB 885 | :10F73C0005974D00972DF90D5A82B226843E8EC343 886 | :10F74C00BC289CBC28E1A2C13E84A28EBE2CADA2DA 887 | :10F75C008EDE2C6D3EB36D1AA2D1B7A226AC0D98DD 888 | :10F76C00BCACDD30D52CADBC2CADC38DFA32225DDA 889 | :10F77C00BFD43DEE5E5EFE7D435A9535B284D472A5 890 | :10F78C005A6C90DB8F50E26A68E18E22EF7FDD9439 891 | :10F79C00E08E2AD13E6F153D253E416DDF23BF5DC6 892 | :10F7AC00E76F15402540416DF86D3E086DE0212551 893 | :10F7BC0022736F717125847352C2248F868FC0445B 894 | :10F7CC00E68F20FB9C0E3E1104280429046C6C8EE1 895 | :10F7DC00248AAD66030DBC9B25F4160D5F7EBD4AD5 896 | :10F7EC0026894541434648ADB0AD80BD27B26DE397 897 | :10F7FC00228B5347A4024252F4BD26CD93F492F4CB 898 | :10F80C0024AD38622DF644F4664123F4F62E7FBA0B 899 | :10F81C005B7B847BBB5D9B7564D55B84BD4EBD4CB3 900 | :10F82C00AC160D980D06B564BC52F4160D2C7EBDAD 901 | :10F83C004FBD005558BD508F6DE720288A7654F285 902 | :10F84C00AD000076785EADF73EF4460A1A2A3A4AC5 903 | :10F85C005A6A7A6D1AD69E467F784244028F1646B3 904 | :10F86C00B2B2569B6FB25E92929C3E0E56264E26BC 905 | :10F87C00929292BC460E92BC369BC3923E26922E1E 906 | :10F88C0092ED3A467F263B773E365D5D269DF50030 907 | :10F89C00F0827A7B8534957CB23E6D006272840076 908 | :10F8AC0000000000000022288A5454F246449E7F37 909 | :10F8BC00D6A6DFE6A6A6C6A626468F169C4E26E63C 910 | :10F8CC00D688469C6D0006428F16F69C3EBC3E9B2D 911 | :10F8DC0025467F468A8F169C46424A269DDB6D0242 912 | :10F8EC005EE6D69E92369C3E0E56268626929292C6 913 | :10F8FC00BC460E92BC369B4092E6468FD626E6D688 914 | :10F90C009E9282E6D69E527F7842469E9C530D0272 915 | :10F91C00559E4278425DA3559E8DF5559E80577736 916 | :10F92C007D4642DF6DE7CC000000000000000000C7 917 | :10F93C0000000000000000000000000000000000BB 918 | :10F94C0000000000000000000000000000000000AB 919 | :10F95C00000000000000000000000000000000009B 920 | :10F96C00000000000000000000000000000000008B 921 | :10F97C00000000000000000000000000000000007B 922 | :10F98C00000000000000000000000000000000006B 923 | :10F99C00000000000000000000000000000000005B 924 | :10F9AC00000000000000000000000000000000004B 925 | :10F9BC00000000000000000000000000000000003B 926 | :10F9CC00000000000000000000000000000000002B 927 | :10F9DC00000000000000000000000000000000001B 928 | :10F9EC00000000000000000000000000000000000B 929 | :10F9FC0000000000000000000000000000000000FB 930 | :10FA0C0000000000000000000000000000000000EA 931 | :10FA1C0000000000000000000000000000000000DA 932 | :10FA2C0000000000000000000000000000000000CA 933 | :10FA3C0000000000000000000000000000000000BA 934 | :10FA4C0000000000000000000000000000000000AA 935 | :10FA5C00000000000000000000000000000000009A 936 | :10FA6C00000000000000000000000000000000008A 937 | :10FA7C00000000000000000000000000000000007A 938 | :10FA8C00000000000000000000000000000000006A 939 | :10FA9C00000000000000000000000000000000005A 940 | :10FAAC0000000000005E4C6082AA8BBB0A88D668FE 941 | :10FABC004C5AA8AB22AEB34EB8628CA103B86DD42D 942 | :10FACC00EAAA22BA2EA4AE0AAAABCE828DAAAEAEF8 943 | :10FADC00AEBEAABBAB98208A836D69ABAABA8AAAC0 944 | :10FAEC000AAE2BB24A2DB30ACC440000000020B061 945 | :10FAFC00A4496604BAAEEA4AEBEABAA9448EB82A1B 946 | :10FB0C00A898AAAE2A2CEBAA2AAAAEEBABB22E89E5 947 | :10FB1C000A0840400000040014100000000000001F 948 | :10FB2C00008000000000B893A9AAE0BA2AA23AA863 949 | :10FB3C00ABEB24EA22E9BAA0912C323121C822394C 950 | :10FB4C00A1A826AA1A8AABAB3B49AE0E6D2AA9AA6C 951 | :10FB5C00AE08884AE4B2248D083401000110102844 952 | :10FB6C00412C294103E220112080AA4104A071AA52 953 | :10FB7C00BA1292A448EE6A221229048CA89A9467AD 954 | :10FB8C0092A990AA92908212A844A06C5214A0221E 955 | :10FB9C00CCA88BA2AEEA884242AE8A48AEAB310307 956 | :10FBAC00A881000000C0008BAA4228B12AA9B90A7A 957 | :10FBBC00AA2A298AAA2BA23980CC2033D34A6B2EAD 958 | :10FBCC0089224124B8AB343008814432EC4A128A81 959 | :10FBDC000AC0EAA2A2AE8ABA2E0AAB122889448ABB 960 | :10FBEC004822488008118D8A642C2B323949934263 961 | :10FBFC00010328BAE44CB2EE8013CA8AC4A9246764 962 | :10FC0C00AB61A8028B2B824D906E00A9C4363302D7 963 | :10FC1C000000C8900880E0301282AA4C03E088B043 964 | :10FC2C006028ABAAA40A0F2002AA4C104021C004E1 965 | :10FC3C00003031C28C00383A204C0849C709088E74 966 | :10FC4C003429508A30A80A000C991DCD092E96270C 967 | :10FC5C00029A0A8B129D101AC6E0A8CCA2A2300CF4 968 | :10FC6C00CD8C0C2A04030027000000B06C00772018 969 | :10FC7C007030FF0C04C37FAA3011C78C0C8B7EC371 970 | :10FC8C008CC03F32130CCDCC30CCFFCC30CC7E139F 971 | :10FC9C00110021444414C388AC8B7ACB0407803AFE 972 | :10FCAC0021070CC0B030FF535353771CFCEA020AF7 973 | :10FCBC00E018389182080A0A01A9A08A56D3358A1D 974 | :10FCCC0020980028F0EAA1CC007C83060D3F8D0221 975 | :10FCDC00FC7F7070FD7F0707F3FFDD300CC30C5CFD 976 | :10FCEC00370C07E38D0060622828E0A22CFA3AA2B8 977 | :10FCFC00E064A8AAACA92A0A92A0B6ACAEAE8A2A35 978 | :10FD0C00AE03B80000E80AEC2AAB88AB2BEB8BE017 979 | :10FD1C000B00EEB8820A82A0242B0280024040C065 980 | :10FD2C00341300C7A8001C782ABA902FE02CAA68BC 981 | :10FD3C00111383280AA2282AA211C100A080606294 982 | :10FD4C0088A0A898902B1CA870608A02E2B182341B 983 | :10FD5C0073D4146492A3AAE3C8880080820C121195 984 | :10FD6C00A48450B40002A84848313333333399008B 985 | :10FD7C000885515068144455CC0C912A5218568160 986 | :10FD8C002142CC71C80C31558C80548E689590D81A 987 | :10FD9C0061445558455132A2854455484503CC22FF 988 | :10FDAC00044110080B003F60FEFFFFFFFFFFFFFF49 989 | :10FDBC00FFFF0A8062800A2C282CC09CC44DD334CF 990 | :10FDCC00CD0C330730C3400C711C3388A01A232888 991 | :10FDDC00A3100CA3B406CB1070A4EA0CB18EEB28C4 992 | :10FDEC002C3A0C3230CC32C5A8A80800060AEEAE6C 993 | :10FDFC002227E9D2FCBF3333FC3F30D3FC7F9E9EDD 994 | :10FE0C0098688AC2AC44044B333FC38A303CC4026A 995 | :10FE1C0000B08B00000002A20A20A0A3080BAC2AA1 996 | :10FE2C00F3FF8C0C00000A200200A0002AC2022062 997 | :10FE3C00BA002048AC8A882A80808E022AA8200A20 998 | :10FE4C0084082161B4C00000000000000000000024 999 | :10FE5C000000000000000000000000000000000096 1000 | :10FE6C000000000000000000000000000000000086 1001 | :10FE7C000000000000000000000000000000000076 1002 | :10FE8C000000000000000000000000000000000066 1003 | :10FE9C000000000000000000000000000000000056 1004 | :10FEAC000000000000804ECB0ED1E4D002CB02CB80 1005 | :10FEBC002CD1E4D002CB02CB64D1E4D002CBA4D1C0 1006 | :10FECC004ECBE4D002CB4ECB50CBE4D002CB02CB0A 1007 | :10FEDC006CCCE4D04ECB02CB5ECBE4D002CB02CBCD 1008 | :10FEEC0076CBE4D002CB4ECB2ACBE4D088CC02CB61 1009 | :10FEFC0002CBE4D0A0CC02CB02CBE4D0E2CD4ECBF3 1010 | :10FF0C0002CBE4D0BCCC02CB02CBE4D090CCA2D1BF 1011 | :10FF1C0002CBE4D002CB02CB02CBE4D002CB02CB9F 1012 | :10FF2C0002CBE4D04ECBDACF58D09CD0F8D04ECB0D 1013 | :10FF3C00ACCF06CD64CD74CF8CCB9AD192D1C8CB3B 1014 | :10FF4C00C8CBC8CBC8CB76CE02CFC0CE36CE58CB22 1015 | :10FF5C0002CB4ACC56CC00D026D0C0D08AD00E04CE 1016 | :10FF6C0007080B020A0C01030D060009050E040814 1017 | :10FF7C000C0209010603010D05000B0A07044000E1 1018 | :10FF8C0080000000010000020000000100020408D3 1019 | :06FF9C000010200040806F 1020 | :0EFFA2004144474A4D5054575B010100B0D115 1021 | :10FFE000FECAFECAFECAFECAFECAFECAFECAFECAD1 1022 | :10FFF000FECAB2D6FECAFECAFECAFECAFECA00C009 1023 | :040000030000C00039 1024 | :00000001FF 1025 | -------------------------------------------------------------------------------- /rom_21.h: -------------------------------------------------------------------------------- 1 | #define __ROM21 2 | 3 | static const uint8_t key_map_21[] = { 4 | 0x00, 0x74, 0x94, 0xa4, 5 | 0x00, 0xb4, 0x44, 0xd4, 6 | 0x00, 0x73, 0x93, 0xa3, 7 | 0x00, 0xb3, 0x43, 0xd4, //0xd3, 8 | 0x00, 0xb2, 0x42, 0xd2, 9 | 0x00, 0x00, 0x64, 0x63, 10 | 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0xd1, 0x41, 0x62, 12 | 0x00, 0xb1, 0xb0, 0x00, 13 | 0x00, 0x71, 0x91, 0xa1, 14 | 0x00, 0xd0, 0x40, 0x61, 15 | 0x00, 0x72, 0x92, 0xa2, 16 | }; 17 | 18 | static const uint8_t rom_21[] = { 19 | 0x6e, 0x6e, 0xf2, 0x42, 0x46, 0x23, 0x12, 0x32, 0xe7, 0xdd, 0x03, 0x46, 0x0e, 0x49, 0xe2, 0x17, 20 | 0x14, 0x83, 0x92, 0xd2, 0x2d, 0x2e, 0xbc, 0x01, 0xe9, 0xf3, 0x8f, 0x71, 0x9f, 0x71, 0x1f, 0xe9, 21 | 0xe9, 0x26, 0x2b, 0xba, 0x09, 0x42, 0xa3, 0xbe, 0x27, 0x1f, 0xe7, 0x29, 0x01, 0x18, 0x44, 0x26, 22 | 0xe6, 0xa6, 0xa6, 0xc6, 0xa6, 0x26, 0x0d, 0x12, 0x5d, 0x95, 0x1b, 0xf5, 0x6d, 0xcc, 0x13, 0x5b, 23 | 0x27, 0x10, 0xb2, 0x21, 0x46, 0x7f, 0xcc, 0x04, 0x1e, 0x06, 0x6c, 0xee, 0x6c, 0x6c, 0x16, 0x84, 24 | 0x53, 0x83, 0xd2, 0x28, 0xcc, 0x13, 0x8f, 0xd0, 0x2b, 0x93, 0xd1, 0x03, 0x13, 0x53, 0x57, 0x77, 25 | 0xf4, 0x40, 0xe5, 0x37, 0xfe, 0x44, 0x8f, 0x68, 0x9c, 0x71, 0x74, 0x9b, 0x19, 0x64, 0x64, 0x26, 26 | 0x2e, 0x99, 0x23, 0xc2, 0xd5, 0x39, 0x07, 0x27, 0xe3, 0xf3, 0x39, 0x1e, 0x62, 0x39, 0x21, 0x64, 27 | 0x93, 0x7d, 0x86, 0x7f, 0x6b, 0x80, 0x06, 0x29, 0x55, 0x90, 0x6c, 0xef, 0x6b, 0x15, 0x24, 0x64, 28 | 0x1b, 0x84, 0x93, 0xf3, 0x39, 0x24, 0x13, 0x95, 0x26, 0x11, 0xf2, 0x06, 0x90, 0x7b, 0x0e, 0x91, 29 | 0x03, 0x6e, 0xed, 0x6b, 0xa2, 0x03, 0xe2, 0x7f, 0x64, 0x93, 0xa8, 0x01, 0xd5, 0x0f, 0x1f, 0x86, 30 | 0x12, 0x12, 0xd1, 0x07, 0xcc, 0x13, 0x23, 0xba, 0x2e, 0xa3, 0x9a, 0x23, 0xe9, 0x5d, 0xaf, 0x64, 31 | 0x7b, 0xb0, 0x2f, 0x7f, 0x9b, 0xd8, 0x34, 0x64, 0xe5, 0x31, 0x75, 0xc4, 0x01, 0x44, 0x91, 0xc2, 32 | 0x84, 0xf5, 0x59, 0xd5, 0x6f, 0xe7, 0x3c, 0x1f, 0x20, 0xa8, 0x20, 0x1e, 0xdd, 0x38, 0x44, 0x78, 33 | 0x28, 0x1f, 0xb1, 0x05, 0x78, 0xbe, 0x77, 0x18, 0x00, 0x1f, 0x71, 0x71, 0x09, 0x10, 0x68, 0x68, 34 | 0x10, 0x84, 0xac, 0xd3, 0x2c, 0x22, 0xf3, 0x2f, 0x64, 0xbb, 0x3e, 0xf5, 0x3d, 0xfc, 0xf7, 0x3f, 35 | 0x32, 0xcf, 0x00, 0x04, 0x08, 0x61, 0x33, 0xd3, 0xd7, 0xe4, 0x67, 0xc5, 0xac, 0x24, 0x38, 0xd5, 36 | 0x5d, 0x92, 0x9b, 0x91, 0x5f, 0x84, 0xd5, 0x65, 0xe1, 0x84, 0x82, 0xb2, 0x26, 0x84, 0x77, 0x66, 37 | 0x06, 0x68, 0xbd, 0x70, 0x62, 0xdc, 0x72, 0xdb, 0xe8, 0xc5, 0x7f, 0x0e, 0x6a, 0x6a, 0x7a, 0x7a, 38 | 0xc3, 0x4c, 0x26, 0x25, 0xbd, 0x4d, 0x26, 0x3d, 0xc3, 0xee, 0xf6, 0x6b, 0xb6, 0xee, 0x38, 0x08, 39 | 0xa6, 0xf8, 0xfb, 0x0f, 0xd7, 0x57, 0xd3, 0x71, 0xd3, 0x1a, 0xb2, 0x7f, 0x5a, 0x6c, 0x46, 0x84, 40 | 0x38, 0x46, 0x4f, 0x76, 0x86, 0x56, 0x36, 0x96, 0x86, 0x16, 0x66, 0x36, 0x56, 0x7f, 0x84, 0x1a, 41 | 0x9b, 0x68, 0x68, 0xa0, 0xf0, 0xac, 0x2a, 0xd7, 0x66, 0xe8, 0x42, 0x9b, 0x41, 0x99, 0x42, 0x84, 42 | 0x68, 0x68, 0x68, 0xd8, 0xf0, 0xdb, 0x67, 0x71, 0xbc, 0x5e, 0x41, 0x62, 0x72, 0xa2, 0xd5, 0x60, 43 | 0xbd, 0x66, 0x7f, 0xdc, 0xe8, 0x62, 0xda, 0x1a, 0xda, 0x82, 0x2a, 0x92, 0x92, 0xd2, 0x6f, 0xe8, 44 | 0xc0, 0x08, 0x13, 0x84, 0x7f, 0xf0, 0xb9, 0x3f, 0x51, 0x5e, 0x5e, 0x21, 0x0d, 0x06, 0x42, 0xaa, 45 | 0x68, 0x68, 0x68, 0x70, 0xf0, 0x66, 0x81, 0xd5, 0x92, 0x3f, 0x52, 0x9b, 0xd7, 0x01, 0x02, 0x9b, 46 | 0x08, 0x06, 0xa1, 0x05, 0xd5, 0x7d, 0x06, 0x7f, 0x68, 0x81, 0xdc, 0x67, 0xd3, 0x50, 0x77, 0x66, 47 | 0xb2, 0x62, 0x06, 0x62, 0x26, 0xa2, 0xdb, 0xe8, 0x47, 0x72, 0xac, 0x82, 0xb2, 0x72, 0xdb, 0x9b, 48 | 0xac, 0x16, 0x08, 0x28, 0xd5, 0x3c, 0xb2, 0x04, 0x68, 0x84, 0x2e, 0x28, 0x8b, 0x28, 0x7f, 0x38, 49 | 0xa8, 0x38, 0x64, 0x09, 0x18, 0xdf, 0x82, 0x84, 0xba, 0x7b, 0x9b, 0x7a, 0x9a, 0x4b, 0x7b, 0x84, 50 | 0xd7, 0x79, 0x42, 0x2e, 0x52, 0x84, 0x1a, 0xa1, 0xd7, 0x67, 0x61, 0x81, 0xd7, 0x93, 0x06, 0xe5, 51 | 0xe8, 0xee, 0x9c, 0xe8, 0x7f, 0x7c, 0x1e, 0xfb, 0x90, 0x05, 0x11, 0x4c, 0x7b, 0x2f, 0xaf, 0x3f, 52 | 0x38, 0xdf, 0x37, 0xd8, 0x6f, 0x37, 0x80, 0x4f, 0x37, 0x64, 0x37, 0xf0, 0x37, 0x73, 0x26, 0x8e, 53 | 0xb2, 0x88, 0x8e, 0x16, 0x64, 0x76, 0x5b, 0x89, 0x26, 0xbc, 0x8b, 0xad, 0x7b, 0x4f, 0xbe, 0xa5, 54 | 0xb6, 0x67, 0x66, 0x73, 0xdd, 0x9a, 0x38, 0xee, 0x3e, 0x3b, 0x4e, 0x9c, 0x3a, 0x26, 0x77, 0x26, 55 | 0xaf, 0x26, 0x1e, 0x2d, 0x5a, 0xa0, 0x7a, 0xee, 0x7b, 0x47, 0xa9, 0x72, 0xdc, 0x72, 0x41, 0xf0, 56 | 0x4f, 0x36, 0x64, 0x6f, 0x36, 0x80, 0xdf, 0x36, 0xd8, 0x3f, 0x36, 0x36, 0x36, 0xbf, 0x01, 0xaf, 57 | 0x3e, 0x26, 0x66, 0x94, 0xdf, 0x36, 0x16, 0x06, 0x16, 0x76, 0x96, 0x86, 0x06, 0x56, 0x56, 0xb9, 58 | 0xa2, 0xd6, 0x2e, 0x46, 0x7f, 0x26, 0x36, 0x06, 0x26, 0x56, 0x84, 0x14, 0x6c, 0xff, 0x71, 0x06, 59 | 0x2f, 0x36, 0x36, 0x06, 0x86, 0x56, 0x06, 0x99, 0xa2, 0x96, 0x36, 0xd6, 0xfb, 0x68, 0x1e, 0x9c, 60 | 0x8c, 0xe9, 0x26, 0x77, 0x26, 0x94, 0x8e, 0x16, 0x68, 0xc5, 0x18, 0x87, 0xa8, 0x6b, 0xd2, 0xbe, 61 | 0x87, 0x9b, 0x4f, 0x76, 0x9b, 0x9e, 0xee, 0x41, 0x23, 0xbc, 0xab, 0x16, 0x86, 0xae, 0xee, 0x3e, 62 | 0x46, 0x9d, 0x87, 0xae, 0x46, 0x7d, 0xbb, 0x66, 0x5b, 0xad, 0xfe, 0xfe, 0x84, 0x4e, 0x98, 0xbd, 63 | 0xee, 0x74, 0x9b, 0xaf, 0x7b, 0x04, 0x7f, 0x0e, 0xd0, 0xb3, 0x76, 0x9b, 0xd6, 0xb2, 0x46, 0x1b, 64 | 0x4e, 0xd4, 0xb0, 0x25, 0x2e, 0x0e, 0x7f, 0x84, 0xef, 0x81, 0x82, 0x4c, 0x9f, 0x63, 0x8c, 0xe1, 65 | 0xa4, 0x0e, 0x15, 0x06, 0x2b, 0xaf, 0xdd, 0xbb, 0x85, 0x0b, 0x31, 0x95, 0x7a, 0x39, 0x25, 0x38, 66 | 0x66, 0x96, 0x36, 0x16, 0x46, 0x76, 0x16, 0x6b, 0x6d, 0xa6, 0xe9, 0x94, 0xfa, 0x04, 0x4e, 0x84, 67 | 0x16, 0x2e, 0x4c, 0x2e, 0x4c, 0xa7, 0xc2, 0x26, 0x67, 0xc5, 0xbc, 0xc3, 0x41, 0x44, 0xdb, 0xec, 68 | 0xda, 0x27, 0x51, 0x4c, 0xdb, 0xd7, 0x47, 0x06, 0x68, 0x1d, 0x25, 0x9b, 0xf1, 0xba, 0xc6, 0xe9, 69 | 0x7b, 0x1f, 0xee, 0xf6, 0xec, 0x3e, 0x5b, 0x06, 0x68, 0x18, 0x64, 0x4f, 0xdc, 0x08, 0xec, 0x26, 70 | 0xb8, 0xcc, 0xa6, 0x2e, 0x33, 0xc4, 0x28, 0x76, 0xf7, 0x3e, 0x3c, 0x7c, 0x86, 0x3b, 0x4e, 0x28, 71 | 0x28, 0x78, 0xe6, 0x41, 0x56, 0x76, 0x64, 0xf9, 0xbb, 0xd0, 0x40, 0x33, 0x26, 0x72, 0x26, 0x84, 72 | 0x18, 0x3e, 0x1f, 0xdf, 0xf1, 0x94, 0x54, 0x7c, 0x11, 0x61, 0x16, 0x1e, 0xe1, 0x55, 0x4c, 0xee, 73 | 0x21, 0x16, 0x71, 0xec, 0x6c, 0x6c, 0x25, 0x46, 0x0b, 0xef, 0xef, 0x98, 0x4c, 0x26, 0x1f, 0x3f, 74 | 0xbf, 0x36, 0x3f, 0x36, 0x5f, 0x86, 0x6f, 0x36, 0xf8, 0x36, 0x50, 0x76, 0x36, 0x36, 0xc4, 0x50, 75 | 0x5e, 0xa5, 0xe2, 0x47, 0xe3, 0x5e, 0x26, 0x2c, 0x26, 0xac, 0x29, 0x50, 0x5e, 0x26, 0x35, 0xe6, 76 | 0x26, 0xdb, 0x46, 0x98, 0x7b, 0xd7, 0xe6, 0xda, 0x75, 0x57, 0x18, 0x35, 0xe8, 0xdb, 0x50, 0x5e, 77 | 0xda, 0x50, 0x5e, 0x5e, 0x5e, 0x40, 0x50, 0x6f, 0x37, 0xf8, 0x3f, 0x38, 0x5f, 0x86, 0xbf, 0x37, 78 | 0x1f, 0x37, 0x37, 0x16, 0xfe, 0xaf, 0x56, 0xd4, 0x9a, 0x9a, 0x03, 0xe4, 0xd4, 0xef, 0x28, 0xcd, 79 | 0xf0, 0xac, 0x16, 0x86, 0x28, 0xf1, 0xf1, 0x9c, 0xc5, 0x61, 0x81, 0x39, 0x36, 0x94, 0xc7, 0x21, 80 | 0x4c, 0xb4, 0xc0, 0x76, 0x21, 0xec, 0xf1, 0x9c, 0x3c, 0xcc, 0x18, 0x18, 0x4b, 0xdf, 0x98, 0x7c, 81 | 0xbb, 0xca, 0x23, 0x03, 0xd8, 0xf9, 0xee, 0xfe, 0x3b, 0x43, 0x7f, 0x47, 0x62, 0x72, 0x84, 0x78, 82 | 0x87, 0xef, 0x4f, 0x77, 0x64, 0xbb, 0xfc, 0x33, 0xbf, 0x86, 0x66, 0x56, 0x26, 0x46, 0x96, 0x84, 83 | }; 84 | 85 | static const uint8_t rom_21_ex[] = { 86 | 0x0a, 0x02, 0x89, 0x06, 0xa4, 0xb8, 0x85, 0x88, 0xaa, 0x6b, 0x12, 0x9e, 0x00, 0x28, 0x93, 0xe7, 87 | 0x0c, 0x92, 0xaa, 0x2a, 0xa6, 0x89, 0xba, 0x82, 0x05, 0x81, 0x0b, 0x83, 0x2a, 0xa6, 0x04, 0x23, 88 | 0x3e, 0xae, 0xae, 0x02, 0x42, 0x0c, 0xc2, 0x12, 0xae, 0x0b, 0xb8, 0x46, 0xc3, 0xa9, 0xab, 0x0d, 89 | 0x3a, 0x0a, 0xe0, 0x22, 0x38, 0x20, 0xea, 0x96, 0xe2, 0x37, 0xa0, 0xaa, 0x22, 0x02, 0x00, 0x82, 90 | 0x20, 0x40, 0xc8, 0x0a, 0x33, 0xc0, 0x00, 0xc2, 0xea, 0x44, 0x8d, 0xaa, 0xae, 0xae, 0xa2, 0x32, 91 | 0xff, 0x1c, 0x34, 0x2e, 0x08, 0x00, 0x00, 0x40, 0xeb, 0x19, 0xc7, 0x2a, 0xea, 0x35, 0x0e, 0xa0, 92 | 0x4e, 0x51, 0x91, 0x4a, 0x33, 0x74, 0x29, 0xcc, 0xea, 0x0d, 0xc7, 0xc0, 0xcc, 0x28, 0xd2, 0xc5, 93 | 0x30, 0x52, 0x2c, 0xd0, 0x0f, 0xcc, 0x22, 0x82, 0x0a, 0x0c, 0xae, 0x2e, 0x88, 0x10, 0x08, 0xa4, 94 | 0xeb, 0x68, 0xae, 0x13, 0x51, 0x14, 0x55, 0xa5, 0xae, 0x08, 0x8a, 0x12, 0x72, 0x8d, 0xae, 0xab, 95 | 0xab, 0xae, 0x7e, 0x55, 0x14, 0x45, 0x51, 0x21, 0xca, 0x00, 0x00, 0x00, 0xae, 0x00, 0xb0, 0xea, 96 | 0x00, 0x00, 0xc3, 0xa9, 0xab, 0xba, 0x06, 0x28, 0xae, 0xae, 0xaa, 0xaa, 0x0a, 0x38, 0xac, 0xe8, 97 | 0x82, 0x8a, 0xae, 0xa2, 0x8a, 0x0a, 0xcc, 0xe8, 0xaa, 0x68, 0xa8, 0x2a, 0x00, 0xc0, 0xae, 0x2b, 98 | 0x56, 0x81, 0x60, 0x58, 0x55, 0xa1, 0xaa, 0xba, 0xae, 0xb9, 0x82, 0x93, 0xae, 0x8e, 0xba, 0x2e, 99 | 0xe8, 0x8a, 0xe8, 0x22, 0xc8, 0xba, 0xaa, 0x9e, 0x6a, 0xba, 0x9a, 0x49, 0x44, 0x40, 0x95, 0x59, 100 | 0x02, 0xa9, 0x5a, 0x0a, 0xa6, 0x72, 0x0c, 0x95, 0xa5, 0x16, 0x45, 0x40, 0x94, 0xc2, 0xaa, 0x8e, 101 | 0xab, 0xa8, 0xab, 0xba, 0x89, 0xa6, 0x0e, 0xae, 0xa8, 0xae, 0xca, 0x80, 0xae, 0xc0, 0x00, 0x00, 102 | }; 103 | -------------------------------------------------------------------------------- /rom_25.h: -------------------------------------------------------------------------------- 1 | #define __ROM25C 2 | static const uint8_t key_map_25c[] = { // 12 digits (no digit 6) x 3 scan lines 3 | 0x00, 0x73, 0x93, 0xa3, 4 | 0x00, 0xb3, 0x43, 0xd3, 5 | 0x00, 0x72, 0x92, 0xa2, 6 | 0x00, 0xb2, 0x42, 0xd3, //0xd2, 7 | 0x00, 0xb1, 0x41, 0xd1, 8 | 0x00, 0x00, 0x63, 0x62, 9 | 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0xd0, 0x40, 0x61, 11 | 0x00, 0xb0, 0xb4, 0x00, 12 | 0x00, 0x70, 0x90, 0xa0, 13 | 0x00, 0xd4, 0x44, 0x60, 14 | 0x00, 0x71, 0x91, 0xa1, 15 | }; 16 | 17 | static const uint8_t rom_25c[] = { 18 | 0x9e, 0x20, 0xa8, 0x20, 0x45, 0x8a, 0x5b, 0x32, 0x68, 0xee, 0x72, 0xdd, 0x06, 0x71, 0x01, 0xd5, 19 | 0x12, 0xf6, 0x7f, 0x46, 0x78, 0x38, 0x30, 0x62, 0xe1, 0x1f, 0xb1, 0x03, 0x36, 0x75, 0x0f, 0xee, 20 | 0x36, 0x8f, 0x78, 0xda, 0x76, 0x74, 0x9b, 0x08, 0x64, 0x21, 0x64, 0x2e, 0x99, 0x23, 0xc2, 0xd5, 21 | 0x01, 0x07, 0x27, 0x62, 0x16, 0xe1, 0x16, 0x15, 0xfb, 0x16, 0x37, 0xee, 0x1d, 0x75, 0xcf, 0x10, 22 | 0x16, 0x8f, 0x71, 0x9f, 0x71, 0x1f, 0xe9, 0xe9, 0x72, 0x26, 0x2b, 0xc2, 0xba, 0x14, 0x42, 0xa3, 23 | 0x27, 0xe0, 0x71, 0x27, 0x5b, 0x27, 0xc6, 0x62, 0xb5, 0xfa, 0x36, 0x13, 0x03, 0xe2, 0x63, 0x7f, 24 | 0xd8, 0x3a, 0x9b, 0x64, 0x75, 0x18, 0x75, 0x60, 0x16, 0x1f, 0x75, 0x00, 0xac, 0x2c, 0x87, 0xf9, 25 | 0x33, 0x1f, 0x00, 0x68, 0x68, 0x18, 0x71, 0x71, 0x84, 0x65, 0x0a, 0xf2, 0x6b, 0xf2, 0x28, 0x00, 26 | 0x46, 0x9c, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0x84, 0x77, 0x23, 0x12, 0x61, 0x87, 0x07, 27 | 0x35, 0x37, 0x76, 0x95, 0xf8, 0xa5, 0xf8, 0x43, 0x11, 0x3d, 0x9c, 0xf5, 0xe9, 0x00, 0x9c, 0xac, 28 | 0x7b, 0x7a, 0x7c, 0x5e, 0x42, 0x46, 0x62, 0x32, 0xc2, 0x0e, 0x06, 0xf2, 0xe1, 0x52, 0x2b, 0x02, 29 | 0x2d, 0x83, 0x7f, 0x41, 0x99, 0x42, 0x84, 0xb1, 0x5a, 0xb2, 0x46, 0x84, 0x17, 0x0e, 0x22, 0x46, 30 | 0x7e, 0x7e, 0xbd, 0x30, 0x37, 0x72, 0xc2, 0xcf, 0xbd, 0x2e, 0xba, 0x34, 0x9b, 0x7a, 0x9a, 0xb7, 31 | 0x7b, 0x84, 0x97, 0x75, 0x06, 0x35, 0xd3, 0x80, 0x3d, 0x4f, 0x98, 0x7b, 0x1e, 0x61, 0x43, 0x2a, 32 | 0x16, 0x06, 0x6c, 0xee, 0x6c, 0x6c, 0x17, 0xe2, 0xcf, 0x90, 0x9b, 0x13, 0x0b, 0x84, 0x85, 0x3f, 33 | 0x46, 0x62, 0x27, 0x3d, 0xb2, 0x21, 0x46, 0x44, 0x9e, 0xf2, 0x06, 0xf2, 0x44, 0x3e, 0x81, 0x84, 34 | 0x45, 0x59, 0x16, 0xcf, 0x26, 0xc6, 0xcf, 0x20, 0x50, 0xfb, 0x35, 0x53, 0x76, 0x8f, 0x46, 0x8f, 35 | 0x50, 0x6b, 0x76, 0x76, 0x4c, 0x7b, 0x7b, 0x7b, 0x16, 0x28, 0xa2, 0xfa, 0x35, 0x62, 0x76, 0x76, 36 | 0xeb, 0x6a, 0x87, 0x46, 0x9e, 0x9f, 0x84, 0x44, 0x46, 0x62, 0x72, 0x9e, 0x23, 0x7f, 0xe6, 0xa6, 37 | 0xa6, 0xc6, 0xa6, 0x12, 0x26, 0x46, 0x0e, 0x38, 0xf3, 0x2f, 0x64, 0xbb, 0x4e, 0xf5, 0x4e, 0x84, 38 | 0x46, 0xc6, 0x7b, 0xa5, 0x7b, 0x42, 0x23, 0x26, 0x46, 0xa9, 0x9f, 0xb6, 0xe8, 0xd5, 0x65, 0x2b, 39 | 0x73, 0xfe, 0x8b, 0x2e, 0x75, 0x57, 0xba, 0x57, 0x46, 0xcf, 0x56, 0x26, 0x53, 0x68, 0x2e, 0x84, 40 | 0x7b, 0x9d, 0x9f, 0xe5, 0x40, 0x8f, 0xf6, 0xbe, 0x97, 0xf8, 0x2e, 0x7d, 0x82, 0x01, 0x7b, 0x7b, 41 | 0x7b, 0x7b, 0xa7, 0x7b, 0xa3, 0x93, 0xa3, 0xba, 0x95, 0x45, 0x23, 0x16, 0x36, 0xa9, 0xe8, 0x05, 42 | 0x6f, 0x16, 0x28, 0xfa, 0x35, 0x62, 0x76, 0x76, 0xe8, 0x23, 0x43, 0xfe, 0xfb, 0x63, 0x3d, 0x56, 43 | 0x08, 0xd9, 0x84, 0x7b, 0x73, 0x12, 0xbc, 0x23, 0x16, 0x46, 0x12, 0x91, 0xb9, 0xd1, 0x7b, 0x7b, 44 | 0x7b, 0x6d, 0x6f, 0x7b, 0x63, 0x7b, 0xd4, 0x7b, 0x84, 0x35, 0x6b, 0x3e, 0x06, 0x16, 0x46, 0x84, 45 | 0x97, 0x78, 0x38, 0x38, 0x23, 0x16, 0x56, 0x12, 0xa1, 0xa9, 0xe3, 0xe9, 0x8f, 0xc6, 0x8f, 0xa5, 46 | 0x71, 0x97, 0x63, 0x98, 0x98, 0x8e, 0x23, 0x26, 0x36, 0xa9, 0x12, 0xe1, 0x9f, 0xa6, 0xe9, 0x4d, 47 | 0xd5, 0x08, 0x00, 0xdc, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x41, 0x93, 0x95, 0x78, 0xa7, 0x75, 48 | 0x35, 0xf8, 0x33, 0x37, 0xee, 0xf7, 0x78, 0xf2, 0x12, 0x22, 0x38, 0xfc, 0x35, 0x78, 0x35, 0x29, 49 | 0xf7, 0x7b, 0x32, 0x44, 0xcf, 0x43, 0x16, 0xd3, 0x04, 0x00, 0x26, 0x76, 0x76, 0x76, 0x26, 0x84, 50 | 0x41, 0x41, 0x41, 0x41, 0x41, 0x60, 0x5f, 0x5e, 0x1d, 0x27, 0x91, 0xa1, 0x7e, 0x91, 0xa1, 0x63, 51 | 0x1c, 0x20, 0x78, 0x78, 0x78, 0xc2, 0xa8, 0x98, 0x98, 0xef, 0x16, 0xdf, 0x26, 0x36, 0x26, 0x58, 52 | 0x26, 0x46, 0x1e, 0x78, 0x7a, 0x31, 0x7a, 0x7a, 0x7a, 0x30, 0x7a, 0x79, 0x78, 0x78, 0x78, 0x78, 53 | 0x78, 0x78, 0x7a, 0x78, 0x26, 0x5a, 0x32, 0x2b, 0x47, 0x44, 0x9f, 0xbf, 0x93, 0xa3, 0xe3, 0x6c, 54 | 0xe1, 0x73, 0x02, 0xc2, 0x6b, 0x44, 0xd2, 0x94, 0xe5, 0x94, 0x16, 0x36, 0x9f, 0x26, 0x71, 0x59, 55 | 0x40, 0x24, 0xf9, 0x16, 0xdf, 0x74, 0x27, 0x02, 0x9f, 0x71, 0x44, 0x52, 0x3d, 0x21, 0x78, 0x78, 56 | 0x78, 0x78, 0x84, 0x6d, 0xab, 0x2b, 0x73, 0x02, 0x9f, 0x41, 0x6a, 0x6a, 0x24, 0xa7, 0x9d, 0x95, 57 | 0x9d, 0x16, 0x56, 0x76, 0x16, 0x46, 0xf6, 0x84, 0x7a, 0x7a, 0x7a, 0x84, 0x00, 0x00, 0x6d, 0x26, 58 | 0x73, 0x02, 0x58, 0xe3, 0x9a, 0x8a, 0xe1, 0x6b, 0x6b, 0x8c, 0x9a, 0xc5, 0x72, 0xf1, 0x92, 0xd2, 59 | 0xa4, 0x2e, 0xa6, 0xc0, 0x13, 0xe7, 0xa8, 0x1b, 0x3b, 0xba, 0xa7, 0x42, 0x9b, 0x9b, 0xb6, 0x33, 60 | 0x23, 0xba, 0xa9, 0xa3, 0x9a, 0x23, 0x0b, 0x0d, 0x71, 0x2c, 0x12, 0x53, 0x55, 0x2f, 0x7f, 0x38, 61 | 0xa8, 0x38, 0x64, 0x09, 0x2f, 0xaf, 0x9b, 0xb9, 0xbd, 0x9b, 0x9d, 0x93, 0xf5, 0x93, 0xf5, 0x9f, 62 | 0x44, 0x01, 0x91, 0xc2, 0x84, 0x72, 0x53, 0xd1, 0xf1, 0xd2, 0xb5, 0xc0, 0x13, 0x8f, 0xd0, 0xb9, 63 | 0x93, 0xd5, 0x03, 0x13, 0xa9, 0xf5, 0xd0, 0xed, 0x6b, 0xd7, 0x42, 0x2b, 0x42, 0x02, 0x7f, 0x64, 64 | 0x93, 0xdf, 0x01, 0xd5, 0xba, 0x1f, 0xf4, 0x8e, 0xc0, 0x13, 0xd2, 0x39, 0xbd, 0x64, 0x93, 0xeb, 65 | 0xf4, 0x7f, 0x6b, 0xee, 0x06, 0x29, 0x55, 0xfe, 0x6c, 0xef, 0x6b, 0xd7, 0xbf, 0x64, 0x1b, 0x84, 66 | 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0xa9, 0x85, 0x18, 0x18, 0x18, 0x18, 67 | 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x7a, 0x7a, 0xa2, 0x5d, 0x20, 0x7a, 0x58, 0x08, 0x7a, 0x7a, 0x4d, 68 | 0x30, 0xdd, 0xc9, 0x06, 0x96, 0x5f, 0x26, 0x74, 0x76, 0xcb, 0xc9, 0x21, 0x46, 0x3e, 0x37, 0x5d, 69 | 0x22, 0x1d, 0x38, 0x32, 0x45, 0x29, 0x3e, 0xec, 0x8a, 0x08, 0x52, 0x2e, 0x46, 0xcf, 0x86, 0x9f, 70 | 0x76, 0xcf, 0xc2, 0x95, 0xc1, 0x13, 0x9e, 0x84, 0x99, 0xe5, 0x16, 0x76, 0x07, 0x76, 0x76, 0x52, 71 | 0x25, 0xdd, 0xd5, 0x13, 0x42, 0xe3, 0x35, 0xfd, 0x3e, 0xfa, 0x3a, 0x16, 0x7d, 0xa6, 0x0e, 0x20, 72 | 0x74, 0x20, 0x64, 0xbc, 0xbb, 0xc2, 0xe5, 0xc1, 0x9c, 0x26, 0x2e, 0x6d, 0xac, 0x84, 0x0e, 0x11, 73 | 0xf6, 0x6f, 0x4e, 0x64, 0x0b, 0xdc, 0x84, 0xc2, 0x52, 0xbd, 0xff, 0x9d, 0xfd, 0xfe, 0x64, 0xf2, 74 | 0x95, 0x45, 0x77, 0x41, 0xba, 0x62, 0x27, 0xe2, 0xb2, 0xe2, 0x17, 0xe3, 0x77, 0x13, 0x84, 0x1b, 75 | 0xfb, 0x9c, 0x0e, 0x73, 0x02, 0x24, 0x52, 0xeb, 0x12, 0x23, 0x42, 0xe3, 0x52, 0xdd, 0xe8, 0x7d, 76 | 0x42, 0xba, 0xaf, 0x3a, 0x42, 0x90, 0x76, 0x76, 0x5c, 0x72, 0xbc, 0xe2, 0x74, 0x74, 0x6b, 0xfe, 77 | 0x64, 0xbc, 0x00, 0x80, 0x95, 0x45, 0x43, 0x35, 0xe7, 0xfa, 0x3a, 0x0e, 0xbb, 0xeb, 0x42, 0x2d, 78 | 0x36, 0x44, 0x78, 0x65, 0x52, 0x45, 0x42, 0x13, 0xe3, 0x4d, 0xe3, 0x16, 0x6e, 0x6e, 0x6d, 0xc5, 79 | 0xe1, 0x4d, 0xe3, 0x6f, 0x0e, 0x11, 0x16, 0x76, 0x71, 0x6d, 0xc5, 0x46, 0x36, 0x66, 0x7f, 0x5d, 80 | 0xdc, 0x62, 0x21, 0x12, 0x0d, 0xc5, 0x62, 0x2b, 0xfa, 0x8a, 0x17, 0x29, 0xf5, 0xf1, 0x22, 0x3a, 81 | 0xfa, 0x0e, 0xbb, 0xdf, 0x47, 0x32, 0x42, 0x2b, 0x6a, 0x24, 0xc2, 0x52, 0x7d, 0x42, 0x44, 0x84, 82 | 0x77, 0x87, 0x7c, 0xca, 0x08, 0x85, 0x1d, 0x08, 0x08, 0xd0, 0xd6, 0xdc, 0xaa, 0xeb, 0xeb, 0xeb, 83 | 0x91, 0xc5, 0x91, 0x9e, 0xa7, 0xe2, 0xeb, 0x6c, 0x6c, 0xf8, 0x5b, 0x2d, 0xe2, 0xb2, 0x23, 0xe2, 84 | 0x91, 0xc2, 0x91, 0x9c, 0xde, 0xa5, 0xeb, 0xeb, 0xed, 0xcf, 0x95, 0x38, 0x89, 0x06, 0x68, 0xcb, 85 | 0x73, 0x22, 0x72, 0x7f, 0xc2, 0x04, 0x93, 0x24, 0xfc, 0x7e, 0x2e, 0xda, 0x90, 0x3e, 0x81, 0x7f, 86 | 0xdb, 0x90, 0x6e, 0x26, 0xd3, 0x62, 0x3e, 0x2e, 0x46, 0x78, 0xd3, 0x06, 0x68, 0xdb, 0x72, 0xda, 87 | 0x90, 0x44, 0x7d, 0x51, 0xe0, 0xf6, 0x6b, 0x55, 0x06, 0xbf, 0x84, 0xa2, 0x8a, 0x9b, 0x9b, 0xda, 88 | 0x9b, 0x06, 0xda, 0x1c, 0x26, 0x1b, 0x64, 0x39, 0x1b, 0x93, 0x66, 0x21, 0x33, 0x03, 0x27, 0x97, 89 | 0x26, 0x6d, 0xc5, 0x95, 0x26, 0x46, 0x9b, 0x8a, 0xac, 0x82, 0xd4, 0xe0, 0x82, 0x8a, 0xda, 0xe0, 90 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xe2, 0x8a, 0x79, 0x2e, 0x8a, 0xac, 0x62, 0x72, 0xa1, 0xad, 91 | 0x0d, 0xc6, 0x29, 0x38, 0x84, 0xfc, 0x7e, 0x26, 0x3e, 0x81, 0xdb, 0xe0, 0xa2, 0xd3, 0xdd, 0x31, 92 | 0x97, 0x38, 0x3d, 0xfa, 0xe2, 0x12, 0x08, 0xfc, 0x5d, 0xd4, 0x2e, 0x8a, 0xa3, 0xda, 0x91, 0x6e, 93 | 0x5d, 0xe1, 0x7e, 0x5d, 0x4d, 0x72, 0xa2, 0xda, 0x5e, 0x5d, 0xe1, 0xa2, 0x26, 0x2e, 0xa7, 0x30, 94 | 0xac, 0x58, 0xa2, 0x26, 0xd3, 0xbc, 0x28, 0x97, 0x28, 0xe2, 0x82, 0x8a, 0x81, 0xdb, 0xe0, 0x02, 95 | 0x46, 0x62, 0x1e, 0xac, 0x5d, 0x2a, 0x82, 0xb2, 0x26, 0xe0, 0x58, 0x58, 0x92, 0xe0, 0xfc, 0x8e, 96 | 0x62, 0x21, 0x38, 0x2e, 0x3d, 0x43, 0xcf, 0x56, 0xe6, 0xd2, 0x15, 0x1d, 0x27, 0x46, 0x9c, 0x0a, 97 | 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0xe2, 0x42, 0x24, 0x42, 0xe2, 0x27, 0x3f, 0xb2, 0x84, 98 | 0xd0, 0x5f, 0xd1, 0xd2, 0x72, 0x71, 0x73, 0x4b, 0x49, 0xa8, 0x3d, 0xc9, 0xde, 0x4d, 0x63, 0x67, 99 | 0x0a, 0x60, 0x8b, 0xf9, 0x94, 0x93, 0x95, 0xfd, 0xfc, 0x91, 0x0d, 0xc6, 0x73, 0x22, 0x72, 0x8a, 100 | 0x0e, 0x7f, 0x12, 0xc2, 0x24, 0x00, 0x18, 0x97, 0x76, 0x84, 0x7f, 0x0e, 0x6a, 0x6a, 0x7a, 0x7a, 101 | 0xc3, 0x4c, 0x26, 0x25, 0xbd, 0x4d, 0x26, 0x3d, 0xc3, 0xee, 0xf6, 0x6b, 0xb6, 0xee, 0x38, 0x42, 102 | 0x2c, 0x42, 0x7f, 0x94, 0x6d, 0x06, 0x68, 0x6b, 0xa2, 0x81, 0x68, 0x81, 0x68, 0x2e, 0x72, 0xe1, 103 | 0x78, 0x46, 0x4f, 0x76, 0x86, 0x56, 0x36, 0x96, 0x86, 0x16, 0x66, 0x36, 0x56, 0x7f, 0x84, 0x91, 104 | 0x48, 0x00, 0x00, 0x2e, 0x72, 0xdb, 0xe2, 0x2e, 0x72, 0x7f, 0x81, 0xdc, 0xe2, 0x94, 0xa0, 0xd1, 105 | 0x84, 0x71, 0xe1, 0x3f, 0x91, 0x1d, 0x53, 0x7f, 0xe7, 0xc5, 0xac, 0x24, 0x7d, 0x0f, 0x62, 0x26, 106 | 0xa2, 0xdb, 0x1a, 0xc7, 0x61, 0xac, 0x82, 0xb2, 0x72, 0xdb, 0xd7, 0x50, 0xa7, 0x75, 0xb2, 0x62, 107 | 0x73, 0xa1, 0xa4, 0x71, 0xe1, 0x3f, 0xd5, 0x67, 0x26, 0xdc, 0x51, 0x5e, 0xdb, 0x1d, 0x53, 0x78, 108 | 0x06, 0x90, 0x6b, 0x84, 0x82, 0xb2, 0x26, 0x84, 0xa1, 0xbc, 0x6b, 0xc1, 0x62, 0x72, 0xa2, 0xd5, 109 | 0x6c, 0xbd, 0x75, 0x7f, 0xdc, 0x1a, 0x62, 0xda, 0xa4, 0xda, 0x82, 0x2a, 0x92, 0x92, 0xd2, 0x62, 110 | 0x1a, 0x8e, 0x26, 0x4e, 0xe1, 0x7f, 0x46, 0x78, 0xa7, 0x72, 0xac, 0x26, 0x3e, 0xe1, 0x4d, 0xd1, 111 | 0x38, 0xda, 0x44, 0xd7, 0x51, 0x5e, 0x5e, 0x62, 0x4d, 0xe1, 0x2e, 0x68, 0x8b, 0x68, 0x2e, 0x72, 112 | 0xac, 0x2a, 0x1a, 0xbc, 0x2b, 0x49, 0x46, 0x44, 0x9e, 0x06, 0xb6, 0x1d, 0x33, 0xa7, 0x75, 0x06, 113 | 0x68, 0xbd, 0x5f, 0x62, 0xdc, 0x72, 0xdb, 0x1a, 0x80, 0x82, 0x26, 0xb1, 0x61, 0x81, 0x06, 0xe5, 114 | 0xe8, 0xee, 0x9c, 0xe8, 0x7f, 0x7c, 0x1e, 0xfb, 0x90, 0x05, 0x11, 0x4c, 0x7b, 0x2f, 0xaf, 0x3f, 115 | 0x38, 0xdf, 0x37, 0xd8, 0x6f, 0x37, 0x80, 0x4f, 0x37, 0x64, 0x37, 0xf0, 0x37, 0x73, 0x26, 0x8e, 116 | 0xb2, 0x88, 0x8e, 0x16, 0x64, 0x76, 0x5b, 0x89, 0x26, 0xbc, 0x8b, 0xad, 0x7b, 0x4f, 0xbe, 0xb5, 117 | 0xb6, 0x67, 0x75, 0x73, 0xdd, 0x9a, 0x78, 0xee, 0x3e, 0x3b, 0x4e, 0x9c, 0x3a, 0x26, 0x77, 0x26, 118 | 0xaf, 0x26, 0x1e, 0x2d, 0x5a, 0xa0, 0x7a, 0xee, 0x7b, 0x47, 0xa9, 0x72, 0xdc, 0x72, 0x41, 0xf0, 119 | 0x4f, 0x36, 0x64, 0x6f, 0x36, 0x80, 0xdf, 0x36, 0xd8, 0x3f, 0x36, 0x36, 0x36, 0xbf, 0x01, 0xaf, 120 | 0x3e, 0x26, 0x66, 0x94, 0xdf, 0x36, 0x16, 0x06, 0x16, 0x76, 0x96, 0x86, 0x06, 0x56, 0x56, 0xb9, 121 | 0xa2, 0xd6, 0x2e, 0x46, 0x7f, 0x26, 0x36, 0x06, 0x26, 0x56, 0x84, 0x14, 0x6c, 0xff, 0x71, 0x06, 122 | 0x2f, 0x36, 0x36, 0x06, 0x86, 0x56, 0x06, 0x99, 0xa2, 0x96, 0x36, 0xd6, 0xfb, 0x68, 0x1e, 0x9c, 123 | 0x8c, 0xe9, 0x26, 0x77, 0x26, 0x94, 0x8e, 0x16, 0x68, 0xc5, 0x48, 0x87, 0xa8, 0x6b, 0xd2, 0xbe, 124 | 0x87, 0x9b, 0x4f, 0x76, 0x9b, 0x9e, 0xee, 0x41, 0x23, 0xbc, 0xab, 0x16, 0x86, 0xae, 0xee, 0x3e, 125 | 0x46, 0x9d, 0x87, 0xae, 0x46, 0x7d, 0xbb, 0x66, 0x5b, 0xad, 0xfe, 0xfe, 0x84, 0x4e, 0x98, 0xbd, 126 | 0xee, 0x74, 0x9b, 0xaf, 0x7b, 0x04, 0x7f, 0x0e, 0xd0, 0xb3, 0x76, 0x9b, 0xd6, 0xb2, 0x46, 0x1b, 127 | 0x4e, 0xd4, 0xb0, 0x25, 0x2e, 0x0e, 0x7f, 0x84, 0xef, 0x81, 0x72, 0x4c, 0x9f, 0x63, 0x8c, 0xe1, 128 | 0xa4, 0x0e, 0x15, 0x06, 0x2b, 0xaf, 0xdd, 0xbb, 0x85, 0x49, 0x31, 0x95, 0x7a, 0x39, 0x25, 0x78, 129 | 0x66, 0x96, 0x36, 0x16, 0x46, 0x76, 0x16, 0x6b, 0x6d, 0xa6, 0xe9, 0x94, 0xfa, 0x04, 0x4e, 0x84, 130 | 0x16, 0x2e, 0x4c, 0x2e, 0x4c, 0x77, 0xc2, 0x26, 0xe7, 0xc5, 0xbc, 0xc3, 0xc1, 0x44, 0xdb, 0xec, 131 | 0xda, 0x27, 0x51, 0x4c, 0xdb, 0x97, 0x7b, 0x06, 0x68, 0x1d, 0x25, 0x9b, 0xf1, 0xba, 0xc6, 0xe9, 132 | 0x7b, 0x1f, 0xee, 0xf6, 0xec, 0x3e, 0x5e, 0x06, 0x68, 0x58, 0x82, 0xb2, 0x26, 0x9a, 0xec, 0x26, 133 | 0xb8, 0xcc, 0xa6, 0x2e, 0x33, 0xc4, 0x68, 0x76, 0xf7, 0x3e, 0x3c, 0x7c, 0x86, 0x3b, 0x4e, 0x68, 134 | 0x68, 0x78, 0xe6, 0x41, 0x56, 0x76, 0x64, 0xf9, 0xbb, 0xd0, 0x40, 0x33, 0x26, 0x72, 0x26, 0x84, 135 | 0x58, 0x2e, 0x0e, 0x3e, 0x1f, 0xdf, 0x00, 0xf1, 0x94, 0x57, 0x7c, 0x11, 0x61, 0x16, 0x1e, 0xe1, 136 | 0x58, 0x4c, 0xee, 0x21, 0x16, 0x71, 0xec, 0x6c, 0x6c, 0x25, 0x46, 0x0b, 0xef, 0xef, 0x98, 0x4c, 137 | 0x26, 0x1f, 0x3f, 0xbf, 0x36, 0x3f, 0x36, 0x5f, 0x86, 0x6f, 0x36, 0xf8, 0x36, 0x50, 0x76, 0x36, 138 | 0x36, 0xc4, 0x50, 0x5e, 0x75, 0xe2, 0xc7, 0xe4, 0x5e, 0x26, 0x2c, 0x26, 0xac, 0x29, 0x50, 0x5e, 139 | 0x26, 0xd5, 0xe6, 0x26, 0xdb, 0x5d, 0x3f, 0xda, 0xa5, 0xca, 0x48, 0x64, 0x4f, 0xdc, 0x1d, 0x27, 140 | 0x2e, 0x50, 0x5e, 0x5e, 0x5e, 0x40, 0x50, 0x6f, 0x37, 0xf8, 0x3f, 0x38, 0x5f, 0x86, 0xbf, 0x37, 141 | 0x1f, 0x37, 0x37, 0x16, 0xfe, 0xaf, 0x56, 0xd4, 0x9a, 0x9a, 0x03, 0xe4, 0xd4, 0xef, 0x68, 0xcd, 142 | 0xf0, 0xac, 0x16, 0x86, 0x68, 0xf1, 0xf1, 0x9c, 0xc5, 0x61, 0x81, 0x39, 0x36, 0x94, 0xc7, 0x21, 143 | 0x4c, 0xb4, 0xc0, 0x76, 0x21, 0xec, 0xf1, 0x9c, 0x3c, 0xcc, 0x58, 0x58, 0x4b, 0xdf, 0x98, 0x7c, 144 | 0xbb, 0xe6, 0x23, 0x03, 0xd8, 0xf9, 0xee, 0xfe, 0x3b, 0x43, 0x7f, 0x47, 0x62, 0x72, 0x84, 0x78, 145 | 0x87, 0xef, 0x4f, 0x77, 0x64, 0xbb, 0xfc, 0x33, 0xbf, 0x86, 0x66, 0x56, 0x26, 0x46, 0x96, 0x84, 146 | }; 147 | 148 | static const uint8_t rom_25c_ex[] = { 149 | 0xab, 0xdf, 0x87, 0xa0, 0x84, 0x2a, 0x61, 0x63, 0xe2, 0x82, 0x88, 0x8a, 0x2a, 0x26, 0x88, 0x8c, 150 | 0x22, 0xa2, 0x28, 0xa2, 0x96, 0x19, 0xb4, 0x22, 0x2e, 0xe0, 0x42, 0x8a, 0xa3, 0xaa, 0x00, 0x32, 151 | 0x02, 0x00, 0x40, 0xc0, 0x03, 0x33, 0xb0, 0x03, 0xaa, 0x08, 0x28, 0xa1, 0x8c, 0x0a, 0x2e, 0x88, 152 | 0x2a, 0x03, 0x6a, 0xea, 0x82, 0x72, 0x2c, 0xe1, 0xaa, 0x2a, 0xb8, 0x82, 0x42, 0x20, 0x22, 0x0a, 153 | 0x24, 0x82, 0x06, 0x02, 0xaa, 0xab, 0x5a, 0xa0, 0xba, 0x02, 0x82, 0x00, 0x00, 0x2a, 0x00, 0x02, 154 | 0xef, 0x1e, 0x04, 0x91, 0xba, 0xec, 0x82, 0x2e, 0x3e, 0xc0, 0x24, 0xa3, 0xba, 0xc3, 0x14, 0x14, 155 | 0x68, 0xa0, 0xa9, 0xca, 0x8c, 0x73, 0x00, 0xa3, 0xbe, 0xbb, 0x90, 0x2a, 0x0f, 0x01, 0x44, 0x00, 156 | 0xa0, 0x1e, 0x04, 0xd0, 0xc3, 0xaa, 0xca, 0xc0, 0x0c, 0xe2, 0x10, 0xc8, 0x08, 0x28, 0xa0, 0x2a, 157 | 0xff, 0xff, 0x0c, 0xc3, 0xaf, 0xa2, 0x02, 0xe0, 0x70, 0xae, 0x6e, 0xaa, 0xaa, 0x8e, 0x22, 0x40, 158 | 0x28, 0x22, 0x08, 0xe8, 0x22, 0xa4, 0x08, 0xac, 0x4a, 0xaa, 0xa8, 0x30, 0xc0, 0x00, 0x2a, 0x90, 159 | 0x3a, 0x8e, 0xee, 0xa4, 0x7b, 0x82, 0x9a, 0xba, 0x9a, 0x2a, 0x09, 0x80, 0x0a, 0xec, 0xbb, 0xea, 160 | 0x28, 0x20, 0x79, 0x62, 0xae, 0xbb, 0x8e, 0x08, 0xae, 0xd0, 0x39, 0xe0, 0xe3, 0xea, 0x2a, 0x22, 161 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x2c, 0x28, 0x9b, 0x22, 0xb2, 0x4a, 0x10, 0xec, 0x81, 0x02, 162 | 0x80, 0x03, 0xa8, 0x2a, 0x0a, 0x8c, 0x96, 0x8e, 0x08, 0xe3, 0xa8, 0xa3, 0x22, 0x08, 0x98, 0xcb, 163 | 0x18, 0x43, 0x4c, 0x81, 0x82, 0x82, 0xca, 0x98, 0x8c, 0xae, 0xc3, 0xb0, 0xcc, 0x0c, 0x14, 0x2c, 164 | 0xe3, 0x08, 0x93, 0x45, 0x53, 0xaa, 0x91, 0x00, 0x01, 0x04, 0xc6, 0x4c, 0x41, 0xa2, 0x02, 0x02, 165 | 0xff, 0x3c, 0xfc, 0xff, 0xcc, 0xbf, 0xfe, 0xc3, 0xcc, 0xff, 0xff, 0xeb, 0x0a, 0x08, 0x61, 0x01, 166 | 0x85, 0x81, 0x9a, 0x46, 0x49, 0xeb, 0x02, 0x68, 0xeb, 0x0a, 0xb8, 0x2a, 0x13, 0x3b, 0xd2, 0xd0, 167 | 0x00, 0x30, 0x8b, 0xc0, 0x04, 0x84, 0xd0, 0xe4, 0x48, 0x43, 0x2c, 0x04, 0x04, 0x41, 0x10, 0x4a, 168 | 0x82, 0x09, 0x0e, 0x34, 0xb2, 0x0c, 0x0e, 0x1c, 0x80, 0x0a, 0x1a, 0x0b, 0x00, 0xc0, 0xc8, 0x0c, 169 | 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xcf, 0x0a, 0x02, 0x00, 0x80, 0xaa, 0xae, 0xae, 0xa2, 0x32, 170 | 0x82, 0xab, 0x03, 0xc8, 0x08, 0x00, 0x00, 0x00, 0x80, 0xb4, 0x40, 0x3b, 0x40, 0x10, 0xac, 0x8c, 171 | 0x14, 0x0a, 0x74, 0x0c, 0x13, 0x44, 0x96, 0x11, 0x2a, 0x20, 0x08, 0x80, 0x3b, 0x45, 0x45, 0xea, 172 | 0x2d, 0xa1, 0xac, 0xc4, 0xe4, 0x29, 0x2c, 0x22, 0x16, 0x2c, 0x02, 0xb3, 0x2a, 0x51, 0x23, 0xa0, 173 | 0xeb, 0x68, 0xae, 0x13, 0x51, 0x14, 0x55, 0xa5, 0xae, 0x08, 0x8a, 0x12, 0x72, 0x8d, 0xae, 0xab, 174 | 0xab, 0xae, 0x7e, 0x55, 0x14, 0x45, 0x51, 0x21, 0xca, 0x00, 0x00, 0x00, 0xae, 0x00, 0xb0, 0xea, 175 | 0x00, 0x00, 0xc3, 0xa9, 0xab, 0xba, 0x06, 0x28, 0xae, 0xae, 0xaa, 0xaa, 0x0a, 0x38, 0xac, 0xe8, 176 | 0x82, 0x8a, 0xae, 0xa2, 0x8a, 0x0a, 0xcc, 0xe8, 0xaa, 0x68, 0xa8, 0x2a, 0x00, 0xc0, 0xae, 0x2b, 177 | 0x56, 0x81, 0x60, 0x58, 0x55, 0x91, 0xaa, 0xba, 0xae, 0xb9, 0x02, 0x9e, 0xae, 0x8e, 0xba, 0x2e, 178 | 0xe8, 0x8a, 0xe8, 0x22, 0xa8, 0x8c, 0xae, 0xaa, 0xa7, 0x9a, 0xae, 0x66, 0x12, 0x11, 0x50, 0x65, 179 | 0x96, 0x0c, 0xaa, 0x96, 0x82, 0x51, 0x08, 0xce, 0xa6, 0x16, 0x45, 0x40, 0x94, 0xc2, 0xaa, 0x8e, 180 | 0xab, 0xa8, 0xab, 0xba, 0x89, 0xa6, 0x0e, 0xae, 0xac, 0xae, 0xca, 0x80, 0xae, 0xc0, 0x00, 0x00, 181 | }; 182 | 183 | -------------------------------------------------------------------------------- /rom_33c.h: -------------------------------------------------------------------------------- 1 | #define __ROM33C 2 | static const uint8_t key_map_33c[] = { 3 | 0x00, 0xd3, 0x43, 0x63, 4 | 0x00, 0x34, 0x94, 0x73, 5 | 0x00, 0xd2, 0x42, 0x62, 6 | 0x00, 0x33, 0x93, 0x73, //0x72, 7 | 0x00, 0x32, 0x92, 0x72, 8 | 0x00, 0x00, 0xa3, 0xa2, 9 | 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x71, 0x91, 0xa1, 11 | 0x00, 0x31, 0x30, 0x00, 12 | 0x00, 0xd0, 0x40, 0x60, 13 | 0x00, 0x70, 0x90, 0xa0, 14 | 0x00, 0xd1, 0x41, 0x61, 15 | }; 16 | 17 | static const uint8_t rom_33c[] = { 18 | 0x6d, 0x02, 0xcc, 0x06, 0xbc, 0x84, 0xdd, 0x02, 0x46, 0xc2, 0x7f, 0xba, 0x04, 0x9b, 0x7a, 0x9a, 19 | 0x13, 0x7b, 0x84, 0x5a, 0x17, 0x46, 0x1b, 0x41, 0x99, 0x42, 0xb1, 0xaf, 0x84, 0x06, 0x7f, 0x68, 20 | 0xbd, 0x40, 0x65, 0x28, 0xa2, 0x93, 0x93, 0x2b, 0x6d, 0x00, 0x82, 0x5a, 0x0e, 0x15, 0x3a, 0x57, 21 | 0x7f, 0x0e, 0x1b, 0x49, 0x37, 0x7b, 0x68, 0x25, 0x2e, 0x84, 0x63, 0x9f, 0x8c, 0x3f, 0xa4, 0x06, 22 | 0x44, 0xcf, 0x3f, 0x4e, 0x98, 0x43, 0x29, 0x13, 0x74, 0xee, 0x44, 0x7b, 0xee, 0x84, 0x16, 0x41, 23 | 0x52, 0x57, 0x42, 0x36, 0x41, 0x52, 0x5b, 0xd4, 0x12, 0x84, 0x62, 0x72, 0x84, 0x2e, 0x2b, 0xbd, 24 | 0x40, 0x66, 0xbd, 0x40, 0x82, 0x5a, 0x68, 0x30, 0x0e, 0x3d, 0x8c, 0x6d, 0xa4, 0x8b, 0x03, 0x04, 25 | 0x45, 0x7f, 0xce, 0x1e, 0x9b, 0x76, 0x78, 0x78, 0x86, 0x77, 0x4e, 0x64, 0x3b, 0x21, 0x6f, 0x3b, 26 | 0x43, 0x83, 0x97, 0xce, 0x20, 0x76, 0x9b, 0x1e, 0x06, 0x26, 0x24, 0x3b, 0xbc, 0x06, 0x6c, 0xa3, 27 | 0xee, 0x70, 0x82, 0x98, 0x26, 0xd7, 0x26, 0xac, 0x9a, 0x30, 0x7f, 0x0e, 0x6a, 0x6a, 0x7a, 0x7a, 28 | 0xc3, 0x28, 0x26, 0x25, 0xbd, 0x29, 0x26, 0x3d, 0xc3, 0x2b, 0xf6, 0x6b, 0xb6, 0x2b, 0xa8, 0x9a, 29 | 0x9a, 0x03, 0xe4, 0xd4, 0x2d, 0x4e, 0x57, 0xcd, 0x2e, 0xac, 0x16, 0x86, 0x7f, 0xd1, 0x31, 0x43, 30 | 0x84, 0x44, 0x6c, 0xc2, 0x9b, 0xd0, 0x30, 0x71, 0xc1, 0x47, 0x33, 0xac, 0xbc, 0x30, 0xdc, 0x40, 31 | 0x5a, 0x06, 0x25, 0xd5, 0xcc, 0x1e, 0x3e, 0x5e, 0x5e, 0x66, 0x3e, 0x47, 0x2e, 0x5b, 0xe0, 0x9d, 32 | 0x5b, 0x63, 0xcf, 0xd8, 0x39, 0xf6, 0xfe, 0x23, 0x46, 0x16, 0xaf, 0x56, 0xfe, 0xf4, 0x78, 0xe6, 33 | 0xee, 0x56, 0x76, 0x64, 0xf9, 0xbb, 0x3b, 0x40, 0x26, 0x3e, 0x84, 0x4e, 0x30, 0x28, 0x16, 0x82, 34 | 0x57, 0x6d, 0x01, 0x46, 0x9e, 0x44, 0x29, 0x45, 0xc9, 0xb3, 0xd9, 0xb5, 0x49, 0xb7, 0x19, 0xb8, 35 | 0xcf, 0x76, 0x2f, 0x84, 0x6f, 0x66, 0x66, 0x86, 0x66, 0x56, 0x26, 0x46, 0x96, 0x16, 0x16, 0x66, 36 | 0x7f, 0x84, 0x46, 0x7f, 0x46, 0x56, 0x20, 0x06, 0x0d, 0x5a, 0x25, 0x3e, 0xef, 0x3e, 0x81, 0x6b, 37 | 0x3e, 0xa2, 0x3e, 0x61, 0xab, 0x4c, 0xaf, 0x76, 0x24, 0x3e, 0x3e, 0x1e, 0x9c, 0x4a, 0xe9, 0x26, 38 | 0x77, 0x26, 0x94, 0x3b, 0x16, 0x68, 0x0d, 0xc9, 0x7f, 0xe9, 0x94, 0x49, 0x04, 0x4e, 0x68, 0x3b, 39 | 0xe9, 0x68, 0x3e, 0x26, 0xef, 0x3e, 0x46, 0x26, 0x0d, 0x5a, 0x0d, 0x3a, 0x45, 0x2b, 0x44, 0x7c, 40 | 0xc2, 0x86, 0x5e, 0x4e, 0x76, 0xff, 0x3e, 0x64, 0x84, 0x7b, 0xee, 0xba, 0x63, 0xd4, 0x5a, 0xa3, 41 | 0xba, 0x60, 0x45, 0x06, 0x5b, 0x84, 0x41, 0xdc, 0x5f, 0x9e, 0x42, 0xb1, 0x45, 0x5f, 0x44, 0x6d, 42 | 0x00, 0xee, 0x9b, 0x81, 0x43, 0xbc, 0x62, 0x16, 0x86, 0xab, 0x47, 0x84, 0x26, 0x71, 0x71, 0x71, 43 | 0x26, 0x93, 0x7b, 0x86, 0x92, 0x4e, 0x9d, 0x99, 0x85, 0x26, 0x73, 0x26, 0x76, 0x87, 0x64, 0xda, 44 | 0x5d, 0x93, 0x46, 0x29, 0x78, 0x9e, 0x46, 0x7e, 0x44, 0xfe, 0xd9, 0x75, 0x49, 0x6d, 0x19, 0x70, 45 | 0xe9, 0x72, 0x69, 0x73, 0x74, 0x84, 0x2f, 0xd1, 0x06, 0x86, 0x56, 0x36, 0x16, 0x76, 0x6f, 0x84, 46 | 0xef, 0xd1, 0x36, 0x06, 0x86, 0x46, 0xdf, 0x84, 0x9f, 0xd1, 0xd1, 0x3f, 0x84, 0x8f, 0xd1, 0x2f, 47 | 0x84, 0x36, 0x36, 0x84, 0xdf, 0x36, 0x16, 0x06, 0x16, 0x76, 0x96, 0x86, 0x06, 0x46, 0x36, 0x4f, 48 | 0x84, 0x4f, 0x66, 0x96, 0x36, 0x16, 0x46, 0x76, 0x16, 0x86, 0x06, 0x56, 0x66, 0x7f, 0x84, 0x46, 49 | 0x7f, 0x26, 0x36, 0x06, 0x26, 0x56, 0x86, 0x56, 0x06, 0x96, 0x26, 0x96, 0x96, 0x46, 0x7f, 0x84, 50 | 0x7f, 0xbe, 0x95, 0xdc, 0x99, 0x0d, 0x5a, 0xbb, 0xa1, 0x7b, 0x06, 0xe5, 0xbb, 0xa5, 0xe9, 0x1c, 51 | 0xaf, 0x64, 0x94, 0x11, 0x14, 0x47, 0x1a, 0xee, 0x78, 0x14, 0x1e, 0x44, 0x54, 0x42, 0x24, 0x76, 52 | 0xee, 0x9c, 0x20, 0xc2, 0x42, 0x4e, 0x76, 0x94, 0x17, 0x2c, 0x94, 0x54, 0x30, 0x16, 0x76, 0x3a, 53 | 0x59, 0x8b, 0x7c, 0x64, 0x16, 0x14, 0x76, 0x19, 0x9c, 0x74, 0x3e, 0x1d, 0xa2, 0xee, 0x3e, 0x41, 54 | 0x4e, 0x98, 0x40, 0xdc, 0x8e, 0x29, 0xa6, 0x46, 0xc6, 0x0d, 0xbc, 0x04, 0x77, 0x93, 0xac, 0xa5, 55 | 0x3f, 0x65, 0xaf, 0x0d, 0x30, 0x6d, 0x00, 0xa7, 0x40, 0x82, 0xd5, 0x98, 0xb2, 0x26, 0x1d, 0x01, 56 | 0xd4, 0x97, 0x26, 0x0d, 0x5a, 0x46, 0x55, 0xa7, 0x40, 0x82, 0x1e, 0xd2, 0x97, 0x6b, 0x93, 0x77, 57 | 0xd5, 0xa0, 0xd3, 0x9f, 0x24, 0x2c, 0x5c, 0x5c, 0x64, 0xbc, 0x9f, 0x41, 0x44, 0x3e, 0xb2, 0x3e, 58 | 0x07, 0xd3, 0x9b, 0x16, 0x5c, 0x2e, 0x90, 0xd5, 0xa2, 0x46, 0x4f, 0x0d, 0xbc, 0x43, 0x0d, 0x68, 59 | 0xdb, 0xa4, 0x9c, 0x24, 0x43, 0x0e, 0x71, 0x0d, 0xbc, 0x94, 0xbb, 0x92, 0x9e, 0x3e, 0x0d, 0x1d, 60 | 0xef, 0x26, 0x8e, 0xb2, 0xa9, 0x8e, 0x26, 0x3e, 0xba, 0xaa, 0xae, 0x21, 0x64, 0x76, 0x5b, 0xab, 61 | 0x7f, 0xd0, 0xaf, 0x75, 0x26, 0x24, 0x0d, 0x44, 0x0d, 0x57, 0x45, 0x4f, 0x6b, 0x64, 0xb4, 0x3e, 62 | 0x1d, 0xef, 0x3e, 0x0d, 0x70, 0x53, 0x74, 0x9b, 0x2b, 0xb1, 0x84, 0x66, 0xb9, 0x44, 0xcb, 0x3f, 63 | 0xcb, 0xcf, 0x56, 0x1f, 0x86, 0x4f, 0x84, 0xbf, 0xcb, 0xcf, 0x96, 0x6f, 0x84, 0x1f, 0xcb, 0xdf, 64 | 0x84, 0x5f, 0xcb, 0x3f, 0x84, 0x7b, 0x7b, 0x0d, 0x70, 0x42, 0x1d, 0x22, 0x0d, 0xfb, 0x26, 0x1d, 65 | 0x22, 0x7b, 0x7b, 0x0d, 0x68, 0x42, 0x3d, 0xee, 0xec, 0xa2, 0x62, 0x72, 0xbd, 0xd0, 0xbc, 0xc0, 66 | 0x71, 0xa1, 0x44, 0x0d, 0x68, 0x0d, 0x09, 0xb3, 0x9b, 0xd1, 0xde, 0xc4, 0x82, 0x72, 0xb2, 0x46, 67 | 0x06, 0x0e, 0x2d, 0xbc, 0xc7, 0x41, 0xd7, 0xc7, 0xa7, 0xc7, 0xa3, 0x71, 0x43, 0x7f, 0xba, 0xe5, 68 | 0x56, 0x67, 0xe7, 0xea, 0x46, 0x1e, 0x3e, 0xee, 0x68, 0xa1, 0x36, 0x16, 0x26, 0x0d, 0xbc, 0x42, 69 | 0x26, 0x0d, 0x4f, 0x9b, 0x0d, 0xd5, 0x3e, 0x16, 0x72, 0x26, 0x0d, 0x6a, 0xda, 0xe7, 0x16, 0x9c, 70 | 0x7a, 0x24, 0xd6, 0xc1, 0x16, 0x82, 0x3e, 0xb2, 0x3e, 0x0d, 0x52, 0x5d, 0x31, 0x16, 0x26, 0x72, 71 | 0x0d, 0x2e, 0x82, 0xb2, 0x52, 0x13, 0xd5, 0x16, 0x84, 0x1e, 0xb6, 0xd9, 0x90, 0xd6, 0xe6, 0x26, 72 | 0x67, 0xd9, 0xe3, 0x46, 0x66, 0xee, 0x26, 0x56, 0x46, 0x2d, 0xc7, 0x3e, 0xee, 0x5e, 0xfe, 0x3e, 73 | 0xa7, 0xdf, 0xeb, 0x3e, 0x26, 0x8e, 0x26, 0x3e, 0x46, 0x0d, 0xbc, 0x04, 0x77, 0xe0, 0xeb, 0x4e, 74 | 0x44, 0xc5, 0xe3, 0x7b, 0x7b, 0x0d, 0x70, 0xe5, 0xe3, 0x1e, 0xf6, 0x86, 0x0d, 0xc9, 0xd5, 0x95, 75 | 0x82, 0xb2, 0x04, 0x26, 0x6d, 0x00, 0xbb, 0xd6, 0x16, 0x65, 0x40, 0x56, 0x0d, 0x8d, 0xe3, 0x7f, 76 | 0x42, 0x52, 0x47, 0x7b, 0xbb, 0xeb, 0x7c, 0x64, 0x6b, 0xe8, 0x52, 0x6b, 0x42, 0x46, 0x7c, 0xfe, 77 | 0xbd, 0x26, 0x42, 0x78, 0x2c, 0x42, 0xf6, 0xf6, 0x94, 0xb6, 0x04, 0x4e, 0x26, 0x1e, 0xe6, 0xb1, 78 | 0x42, 0x7c, 0x42, 0x16, 0x76, 0x64, 0x6b, 0xef, 0x3e, 0x52, 0x0d, 0x70, 0x04, 0xd0, 0x7b, 0xe9, 79 | 0xdb, 0xf3, 0x42, 0x43, 0x2f, 0x3e, 0x1d, 0x03, 0x3e, 0xdb, 0x4e, 0x98, 0xda, 0xee, 0x40, 0xbd, 80 | 0xda, 0x74, 0xd5, 0xa5, 0xf9, 0xa1, 0x84, 0xa3, 0x84, 0xee, 0x7b, 0xdb, 0xfa, 0x84, 0x7f, 0x46, 81 | 0x76, 0x86, 0x56, 0x36, 0x96, 0x86, 0x16, 0x66, 0x36, 0x36, 0x96, 0x76, 0x56, 0x7f, 0x84, 0xea, 82 | 0xd1, 0x61, 0xa1, 0x82, 0x06, 0x2e, 0x62, 0x26, 0x06, 0x0e, 0x25, 0xbc, 0x04, 0x71, 0xa5, 0x04, 83 | 0x41, 0x44, 0x3e, 0xc5, 0x16, 0xe7, 0x06, 0x26, 0x2e, 0xfe, 0xe6, 0x1d, 0x22, 0x3e, 0x9b, 0xda, 84 | 0x09, 0x9b, 0x25, 0x7b, 0xee, 0x3e, 0x42, 0x52, 0x5e, 0x5e, 0x5e, 0xfe, 0x3e, 0xda, 0x0f, 0x1d, 85 | 0x6b, 0x46, 0x3e, 0x52, 0x5e, 0x76, 0xc7, 0x0e, 0xee, 0xfe, 0x3e, 0x86, 0x47, 0x4e, 0x3e, 0x52, 86 | 0x3e, 0xc7, 0x18, 0xdb, 0x18, 0x76, 0x62, 0xa7, 0x14, 0xa3, 0x45, 0x13, 0x41, 0x3b, 0x43, 0x3b, 87 | 0xa1, 0x67, 0x12, 0x77, 0x15, 0x73, 0x3b, 0x71, 0x3b, 0x3d, 0xee, 0x26, 0x16, 0x86, 0x3d, 0xe3, 88 | 0x67, 0x7b, 0xda, 0x1a, 0x86, 0x5c, 0x4e, 0x0d, 0xbc, 0x04, 0xc5, 0x1d, 0x3e, 0x52, 0x3e, 0x0d, 89 | 0x70, 0x42, 0x3d, 0xee, 0x0d, 0x4e, 0x9b, 0x42, 0x52, 0x7b, 0x9a, 0x76, 0x9c, 0x46, 0x06, 0x68, 90 | 0x0d, 0xc9, 0x95, 0x7f, 0x52, 0xa5, 0x46, 0xd7, 0x20, 0x3e, 0x72, 0x5d, 0x4f, 0xb2, 0x72, 0x16, 91 | 0x0d, 0x2e, 0x47, 0x25, 0xac, 0x6d, 0x00, 0x64, 0x69, 0x20, 0x7b, 0x97, 0x46, 0x3e, 0x1d, 0x03, 92 | 0x3e, 0x1d, 0x61, 0x6b, 0x27, 0x3e, 0x42, 0xee, 0xee, 0x46, 0x7f, 0x16, 0x42, 0xaf, 0x66, 0xba, 93 | 0xe9, 0xe9, 0x94, 0xb0, 0x04, 0x42, 0x26, 0x8e, 0x4e, 0x42, 0x1e, 0x2c, 0x98, 0xb2, 0x26, 0x75, 94 | 0x26, 0xbd, 0x32, 0x9c, 0x04, 0xee, 0xba, 0x7b, 0x9c, 0xc7, 0x44, 0x42, 0x26, 0x96, 0x52, 0xa5, 95 | 0x34, 0xa3, 0x16, 0xb6, 0x43, 0x0d, 0x70, 0x67, 0x20, 0x16, 0x26, 0xbd, 0xf5, 0x36, 0x1a, 0x26, 96 | 0x0d, 0x52, 0x5d, 0x31, 0x3e, 0x16, 0xd7, 0x40, 0x72, 0x26, 0x0d, 0x6a, 0x26, 0x42, 0x63, 0xb2, 97 | 0x52, 0x26, 0x5d, 0x4d, 0x82, 0xb2, 0x72, 0x24, 0x1e, 0x26, 0x42, 0x0d, 0x4e, 0x0d, 0x30, 0x00, 98 | 0x54, 0x2b, 0x52, 0x26, 0x8b, 0x26, 0x1e, 0x26, 0x0d, 0x70, 0x44, 0x54, 0x4d, 0x80, 0x46, 0x65, 99 | 0x45, 0x9e, 0x42, 0xb1, 0x44, 0x6d, 0x00, 0xd7, 0x1f, 0x46, 0x29, 0x65, 0x48, 0x16, 0x0d, 0x8d, 100 | 0x0c, 0xd7, 0x1f, 0x3e, 0x16, 0x72, 0x0d, 0x2e, 0x4f, 0xb2, 0x72, 0x4d, 0x92, 0x00, 0x00, 0x00, 101 | 0x00, 0x0e, 0x3b, 0x7f, 0x36, 0x5b, 0x43, 0x36, 0x3d, 0xe9, 0x68, 0x3e, 0x74, 0x3a, 0x0d, 0x57, 102 | 0x0e, 0x0d, 0xd5, 0x36, 0x9b, 0x48, 0x36, 0x3a, 0x64, 0xbb, 0x51, 0x36, 0x40, 0x0d, 0x30, 0x77, 103 | 0x54, 0xac, 0x0d, 0x06, 0x3e, 0x43, 0x9c, 0x3e, 0x84, 0x9f, 0x2d, 0xee, 0x9f, 0x06, 0x25, 0x3e, 104 | 0x3d, 0xee, 0x3e, 0x2d, 0xe5, 0x9f, 0x3e, 0x6e, 0x15, 0x51, 0xf9, 0xd9, 0x5a, 0x84, 0xb5, 0x5e, 105 | 0x7f, 0x33, 0x7b, 0x7b, 0xda, 0x67, 0x64, 0xbb, 0x5e, 0x36, 0x84, 0x9b, 0x76, 0x46, 0x35, 0x87, 106 | 0x63, 0x74, 0x9b, 0x61, 0xf3, 0x89, 0x74, 0xf3, 0x64, 0x64, 0xf3, 0x2e, 0x36, 0x9a, 0x06, 0xf1, 107 | 0x74, 0x99, 0x65, 0x74, 0xf1, 0x76, 0x56, 0x3e, 0x0d, 0x57, 0x0d, 0xcc, 0xb2, 0x5e, 0x7d, 0x0d, 108 | 0x5a, 0xad, 0xcc, 0xcc, 0x46, 0x9c, 0x33, 0x35, 0x6c, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 109 | 0x8e, 0x2a, 0xcd, 0xef, 0x33, 0x37, 0xb8, 0x0e, 0x52, 0x2e, 0x32, 0x22, 0xf3, 0xf5, 0x6f, 0x43, 110 | 0x5f, 0x66, 0x9b, 0xc2, 0x32, 0x6d, 0x1a, 0x45, 0xe3, 0x67, 0x76, 0x77, 0x75, 0xe5, 0xbb, 0x20, 111 | 0x21, 0x71, 0xf9, 0x20, 0x7d, 0x1b, 0x85, 0x73, 0xd4, 0x85, 0x78, 0xa5, 0xf1, 0x77, 0xe3, 0xcd, 112 | 0xa5, 0xb5, 0xd5, 0xba, 0xa1, 0x7d, 0xe2, 0xd8, 0x7b, 0xef, 0xb8, 0x96, 0x6f, 0xf9, 0xf9, 0x6d, 113 | 0xdf, 0xf9, 0x61, 0x29, 0xf9, 0x59, 0x59, 0x89, 0x87, 0x5a, 0x06, 0x2b, 0x66, 0x43, 0x84, 0x00, 114 | 0x12, 0xe6, 0x32, 0x12, 0x02, 0x42, 0x36, 0x62, 0x36, 0x9c, 0x8e, 0x7f, 0x28, 0x2a, 0x46, 0x20, 115 | 0xed, 0x00, 0x0d, 0x06, 0x42, 0xb7, 0x86, 0x23, 0x13, 0x12, 0xc3, 0x3a, 0x38, 0x25, 0xaf, 0x13, 116 | 0xb3, 0x33, 0x37, 0xae, 0x8d, 0xfa, 0x32, 0x22, 0xf3, 0xf5, 0x8a, 0x13, 0x33, 0x37, 0x8c, 0xb7, 117 | 0x8d, 0xb3, 0x1a, 0xb7, 0xae, 0xf5, 0xc0, 0x2b, 0x7d, 0x0a, 0x25, 0x8f, 0x17, 0x92, 0x8e, 0x9f, 118 | 0xc2, 0x78, 0x47, 0x1f, 0x78, 0x58, 0x49, 0x8a, 0x84, 0x8e, 0x78, 0x9f, 0x06, 0x47, 0x25, 0x96, 119 | 0x15, 0x86, 0x21, 0xc3, 0xf2, 0xdb, 0x9d, 0x3e, 0x54, 0x3e, 0x23, 0xe1, 0xf2, 0xbb, 0x9d, 0xc2, 120 | 0x8f, 0x99, 0x8e, 0x9f, 0x98, 0x68, 0x1f, 0x98, 0x8a, 0xf2, 0x74, 0x11, 0xf2, 0xbb, 0x9c, 0x33, 121 | 0x35, 0x9d, 0x3e, 0xf2, 0x16, 0x2b, 0x8f, 0x76, 0x74, 0x2b, 0x9d, 0x6f, 0x44, 0x91, 0xdb, 0xa4, 122 | 0x3e, 0x0e, 0x32, 0x22, 0x33, 0x37, 0x8a, 0xf3, 0xf5, 0xa1, 0x32, 0x45, 0xb8, 0x26, 0xf2, 0x16, 123 | 0x98, 0xc8, 0x98, 0x8d, 0x20, 0x82, 0x9d, 0xa9, 0x96, 0x42, 0x54, 0x54, 0x9b, 0x9a, 0x26, 0x84, 124 | 0x3b, 0x3e, 0xf2, 0xbb, 0xae, 0x96, 0x16, 0x8f, 0x76, 0x74, 0x9b, 0xaa, 0x42, 0xbb, 0xad, 0x9b, 125 | 0xee, 0xee, 0x64, 0x64, 0xad, 0x10, 0x64, 0x10, 0x3e, 0xbc, 0x38, 0xb1, 0xf2, 0x74, 0xf2, 0xbb, 126 | 0xb3, 0xc5, 0xb1, 0xf5, 0x96, 0x16, 0x98, 0x22, 0x16, 0x38, 0xcd, 0x30, 0x8e, 0xbf, 0xd8, 0xb4, 127 | 0xef, 0xb8, 0x96, 0x2a, 0xcd, 0xef, 0x75, 0xc6, 0x2b, 0x1f, 0x71, 0x71, 0x71, 0x8e, 0x21, 0x22, 128 | 0x8a, 0xc3, 0x1c, 0x42, 0x91, 0x1a, 0xcf, 0x9d, 0xc3, 0x1a, 0x1f, 0xe7, 0x5f, 0xe7, 0x8f, 0x60, 129 | 0x7d, 0x1b, 0x8e, 0x1f, 0xf9, 0xf9, 0xf9, 0x84, 0xdd, 0x08, 0x8a, 0xc3, 0x54, 0x00, 0x00, 0x00, 130 | 0x32, 0x8e, 0x8f, 0xd5, 0xc1, 0x0a, 0x41, 0x44, 0xd3, 0x04, 0x43, 0x63, 0x73, 0x83, 0xa3, 0xd3, 131 | 0xe3, 0x84, 0xa6, 0xb6, 0x8f, 0x47, 0xc6, 0x78, 0x65, 0xc6, 0x78, 0x0a, 0x33, 0x37, 0xa8, 0x6d, 132 | 0xc9, 0x0a, 0x25, 0x0a, 0x61, 0x41, 0x41, 0xd1, 0x8a, 0x6d, 0x26, 0x0a, 0x71, 0x81, 0x26, 0x00, 133 | 0x21, 0x23, 0x54, 0x4b, 0x47, 0x9a, 0x67, 0x97, 0xf6, 0x0a, 0x61, 0x06, 0x27, 0x56, 0x06, 0x1b, 134 | 0x12, 0xb4, 0xd6, 0xa5, 0x7b, 0x7b, 0x7b, 0x7b, 0x5b, 0xc5, 0xe2, 0x47, 0xd4, 0x67, 0xcf, 0xe6, 135 | 0x39, 0x0a, 0xa1, 0x26, 0x47, 0xca, 0x67, 0xd6, 0xd6, 0x39, 0xf6, 0xb6, 0x1b, 0x7b, 0xe1, 0x7b, 136 | 0x7b, 0xcd, 0xcf, 0xa5, 0x46, 0xd6, 0xf6, 0x14, 0xd6, 0xf9, 0x47, 0xdb, 0x65, 0x69, 0xd6, 0x9c, 137 | 0x65, 0x68, 0x6a, 0x45, 0xdf, 0x67, 0xde, 0x75, 0xde, 0x85, 0x68, 0xe6, 0xd6, 0x1b, 0x67, 0x6d, 138 | 0x0a, 0x26, 0x45, 0xe2, 0x67, 0xe2, 0x77, 0xe2, 0x96, 0xf6, 0x1b, 0xd6, 0xc6, 0x14, 0xa6, 0x14, 139 | 0x82, 0xd8, 0xe7, 0xf2, 0x47, 0xe6, 0x65, 0xe6, 0xf6, 0xa6, 0x1b, 0x86, 0xd6, 0x14, 0xd6, 0x99, 140 | 0x7b, 0x5d, 0x5f, 0xa5, 0x47, 0x45, 0xeb, 0x67, 0xeb, 0x75, 0xeb, 0x85, 0xec, 0xa6, 0xb6, 0x84, 141 | 0x0a, 0x71, 0xf9, 0x84, 0x45, 0xf0, 0x65, 0xf0, 0x77, 0xf0, 0x87, 0xf0, 0xa5, 0xf0, 0x0a, 0x81, 142 | 0x26, 0xa6, 0xa6, 0x14, 0x75, 0xf2, 0xd5, 0xba, 0x71, 0xe2, 0xb9, 0xba, 0xfb, 0x7b, 0xd1, 0x7b, 143 | 0x7b, 0x7b, 0xd5, 0xa5, 0x45, 0x7b, 0x5d, 0xc7, 0x47, 0xf7, 0xc6, 0xb6, 0x14, 0x0a, 0x71, 0x06, 144 | 0xa6, 0x61, 0x8f, 0x21, 0x71, 0x21, 0x27, 0x47, 0xfb, 0x67, 0xe7, 0x86, 0x89, 0x0a, 0x06, 0xb6, 145 | 0x81, 0xe1, 0x47, 0xfe, 0x65, 0xfe, 0xe6, 0x99, 0x86, 0xe6, 0x14, 0x20, 0x56, 0x6d, 0xee, 0x75, 146 | 0x14, 0x11, 0x13, 0x09, 0x0d, 0xdf, 0x89, 0x9a, 0x14, 0xdf, 0x89, 0xd4, 0x14, 0xdf, 0x89, 0xa7, 147 | 0x14, 0x86, 0x14, 0xe0, 0x9f, 0x36, 0xa2, 0x36, 0x26, 0x37, 0xe6, 0x60, 0x98, 0x98, 0x98, 0x37, 148 | 0x25, 0x44, 0x6f, 0x96, 0x42, 0x2b, 0x8f, 0xa6, 0xa6, 0xcf, 0xc0, 0x0f, 0x8f, 0xc0, 0x0f, 0x56, 149 | 0x8f, 0xc0, 0x15, 0x2f, 0xd4, 0x1f, 0x52, 0x2d, 0x46, 0x6f, 0x66, 0x3e, 0x84, 0xe0, 0x24, 0x8f, 150 | 0xc0, 0x1a, 0x86, 0x8f, 0xc0, 0x3d, 0xa6, 0xdf, 0xd7, 0x76, 0x16, 0x9f, 0x53, 0x29, 0xeb, 0x6a, 151 | 0xbf, 0x24, 0x71, 0x71, 0x71, 0x21, 0x84, 0xe0, 0xd1, 0x17, 0xe2, 0xa7, 0x37, 0x2f, 0xa7, 0x35, 152 | 0x63, 0xd7, 0x37, 0xdf, 0x41, 0x99, 0x9f, 0x20, 0xbf, 0x84, 0xe0, 0x36, 0x8f, 0xc0, 0x24, 0xd0, 153 | 0x20, 0x1f, 0x76, 0x16, 0x76, 0x71, 0x2a, 0x1f, 0x24, 0x00, 0xeb, 0xee, 0x98, 0x98, 0x98, 0x37, 154 | 0x88, 0x8f, 0x90, 0xd0, 0x3e, 0x71, 0xbf, 0x89, 0x2f, 0x16, 0x46, 0x64, 0x84, 0xc2, 0xc6, 0x88, 155 | 0x61, 0x76, 0x8f, 0x50, 0x73, 0xe2, 0x1f, 0x24, 0x88, 0xb4, 0x16, 0x16, 0x8b, 0xc1, 0xc5, 0x2f, 156 | 0xda, 0xb8, 0xdf, 0x41, 0x99, 0x1f, 0x84, 0x16, 0x26, 0x8b, 0x61, 0xe9, 0xb7, 0x16, 0xb3, 0xa2, 157 | 0x36, 0x46, 0x37, 0xa2, 0x36, 0x36, 0x37, 0xa2, 0xdd, 0x37, 0xc6, 0xe7, 0xd2, 0xf1, 0x98, 0x88, 158 | 0xb0, 0x88, 0x26, 0x16, 0x37, 0x88, 0x26, 0x26, 0x37, 0x00, 0xc2, 0xd0, 0xb8, 0x17, 0xb4, 0xb0, 159 | 0xd4, 0x37, 0x88, 0xb8, 0x16, 0x36, 0x8b, 0x26, 0x36, 0x8b, 0x26, 0x46, 0x8b, 0x26, 0x56, 0x8b, 160 | 0xbf, 0xe3, 0x2f, 0x16, 0x56, 0x8b, 0x63, 0xda, 0x37, 0x88, 0xe7, 0x76, 0x36, 0x37, 0x76, 0x46, 161 | 0x37, 0xa2, 0x36, 0x16, 0x37, 0xcc, 0x73, 0x77, 0xe2, 0x71, 0x52, 0x3e, 0xc5, 0x59, 0xc2, 0x8e, 162 | 0x03, 0xe3, 0xba, 0x42, 0x9a, 0x01, 0xba, 0x42, 0xe1, 0x36, 0x2e, 0x05, 0x49, 0xda, 0x46, 0x8f, 163 | 0x16, 0x06, 0xc3, 0x48, 0x03, 0xe2, 0x4b, 0xc3, 0x48, 0x26, 0x03, 0xe2, 0x6b, 0x53, 0x23, 0x26, 164 | 0x9b, 0x2b, 0x26, 0x01, 0x03, 0xe2, 0x36, 0x44, 0x7f, 0x64, 0x93, 0x29, 0x05, 0x4c, 0xba, 0x4c, 165 | 0x74, 0x06, 0x29, 0x57, 0x01, 0x27, 0xbc, 0x50, 0x07, 0x54, 0x7b, 0xba, 0x50, 0x9a, 0xba, 0x55, 166 | 0x7a, 0xff, 0x2f, 0x44, 0x91, 0x2b, 0xc2, 0x07, 0x56, 0xe5, 0x63, 0xba, 0x54, 0xc2, 0xa3, 0x9a, 167 | 0x23, 0xf8, 0x64, 0x7b, 0x64, 0x41, 0x36, 0x2e, 0x04, 0x4b, 0x04, 0xd2, 0x61, 0x60, 0x6c, 0x93, 168 | 0xd3, 0x57, 0x44, 0x93, 0x46, 0x24, 0x2c, 0x44, 0x6a, 0x83, 0x92, 0xb4, 0x5b, 0x7f, 0x46, 0xaf, 169 | 0x64, 0x94, 0x70, 0x78, 0x29, 0x60, 0x74, 0x29, 0x60, 0x74, 0x29, 0x60, 0x74, 0x78, 0x78, 0x73, 170 | 0x2c, 0x3e, 0x84, 0xef, 0x66, 0x6a, 0xbf, 0x48, 0xee, 0x7b, 0xdb, 0x62, 0x62, 0x3b, 0x6a, 0x93, 171 | 0x8f, 0x43, 0x36, 0xe3, 0x93, 0x53, 0xfb, 0xe3, 0x97, 0x53, 0x33, 0x7f, 0x9e, 0x90, 0x93, 0xa1, 172 | 0x4b, 0x6c, 0xc2, 0x9b, 0x64, 0x44, 0x68, 0x9d, 0x9e, 0x2b, 0x5f, 0x86, 0x06, 0x76, 0x8f, 0x44, 173 | 0x7a, 0xb4, 0x01, 0xba, 0xc2, 0xe1, 0xaf, 0x51, 0xd1, 0x6f, 0x44, 0x9a, 0xfb, 0xfb, 0x9c, 0x0e, 174 | 0x26, 0xc2, 0x84, 0x46, 0x9c, 0x44, 0x9e, 0x02, 0xb9, 0x73, 0x6a, 0x64, 0xc8, 0x76, 0x76, 0x1f, 175 | 0x20, 0x4f, 0xe6, 0xa6, 0xa6, 0xc6, 0xa6, 0x26, 0x0e, 0x13, 0x23, 0x32, 0x22, 0xf3, 0xf5, 0x77, 176 | 0xb3, 0x33, 0x35, 0x79, 0xb1, 0x33, 0x37, 0x7a, 0xb7, 0x7b, 0xef, 0xb7, 0x7b, 0xf7, 0x79, 0xb3, 177 | 0x32, 0x84, 0x9f, 0x6d, 0xe7, 0xdb, 0x6d, 0x02, 0xef, 0x71, 0x71, 0x71, 0x84, 0x00, 0x00, 0x00, 178 | 0xc7, 0x81, 0x5e, 0x45, 0x8f, 0x25, 0x09, 0x54, 0x9d, 0x73, 0x73, 0x9f, 0x71, 0x78, 0x16, 0x75, 179 | 0x74, 0x2b, 0x83, 0x78, 0x16, 0x21, 0x98, 0x7b, 0x87, 0x71, 0x43, 0x22, 0x75, 0x87, 0x6c, 0x64, 180 | 0xed, 0x61, 0x2d, 0x2b, 0x64, 0x91, 0xbd, 0x8a, 0x6d, 0x42, 0x31, 0x47, 0x8b, 0x9d, 0xf8, 0x6d, 181 | 0x1b, 0x8e, 0x4f, 0x40, 0x77, 0x8e, 0x78, 0x47, 0x8e, 0x78, 0x8a, 0x84, 0x23, 0xef, 0xe9, 0xe9, 182 | 0xcf, 0x20, 0x73, 0x1f, 0xe9, 0x23, 0x2b, 0xc2, 0xba, 0x93, 0x42, 0xa3, 0x6d, 0x0d, 0x06, 0x9b, 183 | 0x8a, 0x23, 0x6d, 0x00, 0x95, 0x96, 0x52, 0xb2, 0x93, 0xc1, 0x46, 0x2f, 0x44, 0x84, 0x52, 0x3e, 184 | 0x8e, 0x4f, 0xb8, 0x9a, 0x98, 0x71, 0xb8, 0x9a, 0x41, 0x36, 0x44, 0x43, 0x84, 0xc2, 0x1e, 0x03, 185 | 0x54, 0x17, 0x25, 0x63, 0x7f, 0xd8, 0x9f, 0x9b, 0x64, 0x45, 0x9d, 0x75, 0x75, 0x25, 0x13, 0x84, 186 | 0xc5, 0xa2, 0x54, 0x7f, 0x16, 0x2e, 0x91, 0x03, 0x41, 0x71, 0x29, 0x5e, 0x45, 0xa7, 0xbd, 0xa9, 187 | 0x25, 0x2d, 0xef, 0x41, 0xbd, 0xa7, 0xaf, 0x76, 0xc4, 0xa7, 0x36, 0x87, 0x9f, 0x42, 0x2f, 0x36, 188 | 0x03, 0x45, 0xa9, 0x93, 0x84, 0x58, 0x83, 0xc5, 0xaa, 0x71, 0x07, 0x5e, 0x71, 0x9f, 0x31, 0x2f, 189 | 0xc7, 0xb1, 0x5e, 0xc2, 0x45, 0xaf, 0xbd, 0x8a, 0xac, 0x44, 0xa0, 0x33, 0x9d, 0xef, 0xe9, 0xe9, 190 | 0xe9, 0x22, 0xaa, 0x2a, 0x45, 0x52, 0xbd, 0x8b, 0xc2, 0xac, 0x00, 0x52, 0x02, 0x7e, 0x42, 0x46, 191 | 0x42, 0x62, 0x62, 0x92, 0x92, 0x92, 0x92, 0x3e, 0x16, 0xf2, 0xf2, 0x96, 0xdd, 0xaf, 0x2e, 0xd3, 192 | 0x2e, 0xbd, 0xf2, 0x0d, 0x5f, 0xbd, 0xf9, 0x2e, 0x0d, 0x5f, 0xdc, 0x7c, 0x0d, 0xd1, 0xd5, 0x94, 193 | 0xd1, 0x0d, 0x06, 0xf7, 0xbd, 0xec, 0xe0, 0x2e, 0x95, 0xbf, 0x52, 0xb2, 0x26, 0xb2, 0x84, 0x00, 194 | 0x2e, 0xbd, 0x7c, 0x26, 0x5e, 0x26, 0x2e, 0x1b, 0xd5, 0x94, 0xd1, 0x1d, 0xe2, 0x3e, 0x05, 0x0d, 195 | 0x94, 0x0d, 0x97, 0x0d, 0x98, 0x0d, 0x2c, 0x0d, 0x03, 0x0d, 0xd1, 0x0d, 0x5f, 0x0d, 0x06, 0x0d, 196 | 0x06, 0x2e, 0xf5, 0x26, 0xbc, 0x84, 0xd1, 0x62, 0x3e, 0x26, 0x72, 0x0d, 0x95, 0x17, 0x72, 0x2e, 197 | 0x15, 0x4e, 0x0f, 0x17, 0x5e, 0xa2, 0x0f, 0x17, 0xa2, 0x26, 0x2e, 0x15, 0x6e, 0x0f, 0x17, 0xa2, 198 | 0x72, 0x15, 0x7e, 0x0f, 0x17, 0xe4, 0x0f, 0x17, 0x6d, 0xe3, 0x41, 0x50, 0x71, 0x4f, 0x41, 0x61, 199 | 0xe4, 0xd1, 0x0f, 0xdc, 0x7c, 0xbd, 0x7c, 0x4e, 0x26, 0x2e, 0x15, 0x1f, 0x85, 0xdc, 0xf9, 0x3e, 200 | 0x2e, 0x15, 0xf2, 0x0f, 0x1d, 0x85, 0xdf, 0xdd, 0xdb, 0x47, 0x7c, 0x65, 0x7c, 0x1a, 0x81, 0xf9, 201 | 0x6e, 0x58, 0xa5, 0xdd, 0xf9, 0x5e, 0x60, 0xf9, 0x3e, 0x2e, 0x5e, 0x61, 0xa5, 0xe0, 0x2a, 0xa1, 202 | 0xf9, 0x7e, 0x58, 0x3a, 0xf9, 0xe4, 0x0f, 0x1f, 0x45, 0xf0, 0x67, 0xe5, 0x75, 0xea, 0x3e, 0x26, 203 | 0x1e, 0x1b, 0x1d, 0xe2, 0x06, 0xab, 0x1e, 0x2e, 0x2e, 0xbd, 0x7c, 0x15, 0x1d, 0x19, 0x1d, 0x3e, 204 | 0x52, 0xcd, 0xd4, 0x16, 0x3e, 0x26, 0x1b, 0xbf, 0xe0, 0x52, 0x2e, 0xf9, 0x2e, 0x15, 0x3e, 0x11, 205 | 0xe9, 0x15, 0x1f, 0xf9, 0x5e, 0x2e, 0xec, 0x15, 0xf2, 0x13, 0x1e, 0x1b, 0xf9, 0x2e, 0x1b, 0xf9, 206 | 0x26, 0x6d, 0x00, 0x67, 0xb7, 0x3e, 0xbe, 0x7c, 0xdd, 0xf9, 0x2e, 0x2e, 0x72, 0x15, 0x5e, 0x11, 207 | 0xec, 0x15, 0x1f, 0xf9, 0x52, 0x2e, 0x3e, 0x15, 0xf2, 0x13, 0x52, 0x1b, 0xbc, 0x42, 0x62, 0x84, 208 | 0x52, 0xde, 0xad, 0xf7, 0x06, 0x7f, 0x68, 0x2e, 0x84, 0xf5, 0x3e, 0x84, 0xf5, 0x1e, 0x84, 0xf5, 209 | 0x2e, 0x84, 0xf5, 0x0e, 0x84, 0x43, 0x8f, 0x16, 0xfa, 0x43, 0x9c, 0x84, 0x00, 0x00, 0x00, 0x0f, 210 | 0x48, 0x4e, 0x4e, 0x00, 0x00, 0xcf, 0xc0, 0x44, 0x04, 0xdc, 0x52, 0x54, 0x56, 0x5c, 0x5e, 0x61, 211 | 0x67, 0x78, 0x77, 0x75, 0x8b, 0x71, 0x6e, 0x87, 0x86, 0x88, 0xd8, 0xc4, 0xb2, 0xb5, 0xa9, 0xa4, 212 | 0x64, 0x7b, 0x7d, 0x6a, 0x8e, 0x73, 0x6f, 0x81, 0x80, 0x82, 0xcb, 0x6c, 0xbb, 0xbc, 0xab, 0xa6, 213 | 0x42, 0x2b, 0x44, 0x8f, 0xa6, 0xa6, 0x8f, 0xc0, 0x11, 0xcf, 0xc0, 0x45, 0x8f, 0x56, 0x8f, 0xc0, 214 | 0x3a, 0xd1, 0x11, 0x23, 0x6d, 0xd9, 0xe0, 0x24, 0xcf, 0xc0, 0x13, 0x52, 0xad, 0x00, 0x73, 0xc2, 215 | 0x52, 0x24, 0xad, 0xa7, 0x6d, 0x4e, 0x91, 0xac, 0x0d, 0x92, 0x6d, 0x00, 0x91, 0x58, 0x0d, 0x2a, 216 | 0x5a, 0x0d, 0x62, 0x5a, 0x0d, 0x5d, 0x5a, 0x0d, 0xce, 0x5a, 0x0d, 0x1d, 0x0d, 0x24, 0x81, 0x5d, 217 | 0x65, 0x5d, 0x59, 0x5d, 0x5c, 0x93, 0xa1, 0x61, 0x81, 0x2d, 0x00, 0x1d, 0x27, 0x81, 0x1d, 0x53, 218 | 0xa1, 0x61, 0xd1, 0x97, 0x3d, 0x10, 0xa1, 0x61, 0x97, 0x4d, 0x05, 0x97, 0x4d, 0x00, 0x97, 0x2d, 219 | 0xf9, 0x0d, 0x5a, 0x82, 0xb2, 0x26, 0x84, 0x3e, 0x8e, 0xc3, 0xbc, 0x28, 0x9c, 0xbc, 0x28, 0xe1, 220 | 0xa2, 0xc1, 0x3e, 0x84, 0xa2, 0x8e, 0xbe, 0x2c, 0xad, 0xa2, 0x8e, 0xde, 0x2c, 0x6d, 0x3e, 0xb3, 221 | 0x6d, 0x1a, 0xa2, 0xd1, 0xb7, 0xa2, 0x26, 0xac, 0x0d, 0x98, 0xbc, 0xac, 0xdd, 0x30, 0xd5, 0x2c, 222 | 0xad, 0xbc, 0x2c, 0xad, 0xc3, 0x8d, 0xfa, 0x32, 0x22, 0x5d, 0xbf, 0xd4, 0x3d, 0xee, 0x5e, 0x5e, 223 | 0xfe, 0x7d, 0x43, 0x5a, 0x95, 0x35, 0xb2, 0x84, 0xd4, 0x72, 0x5a, 0x6c, 0x90, 0xdb, 0x8f, 0x50, 224 | 0xe2, 0x6a, 0x68, 0xe1, 0x8e, 0x22, 0xef, 0x7f, 0xdd, 0x94, 0xe0, 0x8e, 0x2a, 0xd1, 0x3e, 0x6f, 225 | 0x15, 0x3d, 0x25, 0x3e, 0x41, 0x6d, 0xdf, 0x23, 0xbf, 0x5d, 0xe7, 0x6f, 0x15, 0x40, 0x25, 0x40, 226 | 0x41, 0x6d, 0xf8, 0x6d, 0x3e, 0x08, 0x6d, 0xe0, 0x21, 0x25, 0x22, 0x73, 0x6f, 0x71, 0x71, 0x25, 227 | 0x84, 0x73, 0x52, 0xc2, 0x24, 0x8f, 0x86, 0x8f, 0xc0, 0x44, 0xe6, 0x8f, 0x20, 0xfb, 0x9c, 0x0e, 228 | 0x3e, 0x11, 0x04, 0x28, 0x04, 0x29, 0x04, 0x6c, 0x6c, 0x8e, 0x24, 0x8a, 0xad, 0x66, 0x03, 0x0d, 229 | 0xbc, 0x9b, 0x25, 0xf4, 0x16, 0x0d, 0x5f, 0x7e, 0xbd, 0x4a, 0x26, 0x89, 0x45, 0x41, 0x43, 0x46, 230 | 0x48, 0xad, 0xb0, 0xad, 0x80, 0xbd, 0x27, 0xb2, 0x6d, 0xe3, 0x22, 0x8b, 0x53, 0x47, 0xa4, 0x02, 231 | 0x42, 0x52, 0xf4, 0xbd, 0x26, 0xcd, 0x93, 0xf4, 0x92, 0xf4, 0x24, 0xad, 0x38, 0x62, 0x2d, 0xf6, 232 | 0x44, 0xf4, 0x66, 0x41, 0x23, 0xf4, 0xf6, 0x2e, 0x7f, 0xba, 0x5b, 0x7b, 0x84, 0x7b, 0xbb, 0x5d, 233 | 0x9b, 0x75, 0x64, 0xd5, 0x5b, 0x84, 0xbd, 0x4e, 0xbd, 0x4c, 0xac, 0x16, 0x0d, 0x98, 0x0d, 0x06, 234 | 0xb5, 0x64, 0xbc, 0x52, 0xf4, 0x16, 0x0d, 0x2c, 0x7e, 0xbd, 0x4f, 0xbd, 0x00, 0x55, 0x58, 0xbd, 235 | 0x50, 0x8f, 0x6d, 0xe7, 0x20, 0x28, 0x8a, 0x76, 0x54, 0xf2, 0xad, 0x00, 0x00, 0x76, 0x78, 0x5e, 236 | 0xad, 0xf7, 0x3e, 0xf4, 0x46, 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x6d, 0x1a, 0xd6, 237 | 0x9e, 0x46, 0x7f, 0x78, 0x42, 0x44, 0x02, 0x8f, 0x16, 0x46, 0xb2, 0xb2, 0x56, 0x9b, 0x6f, 0xb2, 238 | 0x5e, 0x92, 0x92, 0x9c, 0x3e, 0x0e, 0x56, 0x26, 0x4e, 0x26, 0x92, 0x92, 0x92, 0xbc, 0x46, 0x0e, 239 | 0x92, 0xbc, 0x36, 0x9b, 0xc3, 0x92, 0x3e, 0x26, 0x92, 0x2e, 0x92, 0xed, 0x3a, 0x46, 0x7f, 0x26, 240 | 0x3b, 0x77, 0x3e, 0x36, 0x5d, 0x5d, 0x26, 0x9d, 0xf5, 0x00, 0xf0, 0x82, 0x7a, 0x7b, 0x85, 0x34, 241 | 0x95, 0x7c, 0xb2, 0x3e, 0x6d, 0x00, 0x62, 0x72, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 242 | 0x22, 0x28, 0x8a, 0x54, 0x54, 0xf2, 0x46, 0x44, 0x9e, 0x7f, 0xd6, 0xa6, 0xdf, 0xe6, 0xa6, 0xa6, 243 | 0xc6, 0xa6, 0x26, 0x46, 0x8f, 0x16, 0x9c, 0x4e, 0x26, 0xe6, 0xd6, 0x88, 0x46, 0x9c, 0x6d, 0x00, 244 | 0x06, 0x42, 0x8f, 0x16, 0xf6, 0x9c, 0x3e, 0xbc, 0x3e, 0x9b, 0x25, 0x46, 0x7f, 0x46, 0x8a, 0x8f, 245 | 0x16, 0x9c, 0x46, 0x42, 0x4a, 0x26, 0x9d, 0xdb, 0x6d, 0x02, 0x5e, 0xe6, 0xd6, 0x9e, 0x92, 0x36, 246 | 0x9c, 0x3e, 0x0e, 0x56, 0x26, 0x86, 0x26, 0x92, 0x92, 0x92, 0xbc, 0x46, 0x0e, 0x92, 0xbc, 0x36, 247 | 0x9b, 0x40, 0x92, 0xe6, 0x46, 0x8f, 0xd6, 0x26, 0xe6, 0xd6, 0x9e, 0x92, 0x82, 0xe6, 0xd6, 0x9e, 248 | 0x52, 0x7f, 0x78, 0x42, 0x46, 0x9e, 0x9c, 0x53, 0x0d, 0x02, 0x55, 0x9e, 0x42, 0x78, 0x42, 0x5d, 249 | 0xa3, 0x55, 0x9e, 0x8d, 0xf5, 0x55, 0x9e, 0x80, 0x57, 0x77, 0x7d, 0x46, 0x42, 0xdf, 0x6d, 0xe7, 250 | 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 257 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 265 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 272 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 274 | }; 275 | 276 | static const uint8_t rom_33c_ex[] = { 277 | 0x4c, 0x60, 0x82, 0xaa, 0x8b, 0xbb, 0x0a, 0x88, 0xd6, 0x68, 0x4c, 0x5a, 0xa8, 0xab, 0x22, 0xae, 278 | 0xb3, 0x4e, 0xb8, 0x62, 0x8c, 0xa1, 0x03, 0xb8, 0x6d, 0xd4, 0xea, 0xaa, 0x22, 0xba, 0x2e, 0xa4, 279 | 0xae, 0x0a, 0xaa, 0xab, 0xce, 0x82, 0x8d, 0xaa, 0xae, 0xae, 0xae, 0xbe, 0xaa, 0xbb, 0xab, 0x98, 280 | 0x20, 0x8a, 0x83, 0x6d, 0x69, 0xab, 0xaa, 0xba, 0x8a, 0xaa, 0x0a, 0xae, 0x2b, 0xb2, 0x4a, 0x2d, 281 | 0xb3, 0x0a, 0xcc, 0x44, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb0, 0xa4, 0x49, 0x66, 0x04, 0xba, 0xae, 282 | 0xea, 0x4a, 0xeb, 0xea, 0xba, 0xa9, 0x44, 0x8e, 0xb8, 0x2a, 0xa8, 0x98, 0xaa, 0xae, 0x2a, 0x2c, 283 | 0xeb, 0xaa, 0x2a, 0xaa, 0xae, 0xeb, 0xab, 0xb2, 0x2e, 0x89, 0x0a, 0x08, 0x40, 0x40, 0x00, 0x00, 284 | 0x04, 0x00, 0x14, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 285 | 0xb8, 0x93, 0xa9, 0xaa, 0xe0, 0xba, 0x2a, 0xa2, 0x3a, 0xa8, 0xab, 0xeb, 0x24, 0xea, 0x22, 0xe9, 286 | 0xba, 0xa0, 0x91, 0x2c, 0x32, 0x31, 0x21, 0xc8, 0x22, 0x39, 0xa1, 0xa8, 0x26, 0xaa, 0x1a, 0x8a, 287 | 0xab, 0xab, 0x3b, 0x49, 0xae, 0x0e, 0x6d, 0x2a, 0xa9, 0xaa, 0xae, 0x08, 0x88, 0x4a, 0xe4, 0xb2, 288 | 0x24, 0x8d, 0x08, 0x34, 0x01, 0x00, 0x01, 0x10, 0x10, 0x28, 0x41, 0x2c, 0x29, 0x41, 0x03, 0xe2, 289 | 0x20, 0x11, 0x20, 0x80, 0xaa, 0x41, 0x04, 0xa0, 0x71, 0xaa, 0xba, 0x12, 0x92, 0xa4, 0x48, 0xee, 290 | 0x6a, 0x22, 0x12, 0x29, 0x04, 0x8c, 0xa8, 0x9a, 0x94, 0x67, 0x92, 0xa9, 0x90, 0xaa, 0x92, 0x90, 291 | 0x82, 0x12, 0xa8, 0x44, 0xa0, 0x6c, 0x52, 0x14, 0xa0, 0x22, 0xcc, 0xa8, 0x8b, 0xa2, 0xae, 0xea, 292 | 0x88, 0x42, 0x42, 0xae, 0x8a, 0x48, 0xae, 0xab, 0x31, 0x03, 0xa8, 0x81, 0x00, 0x00, 0x00, 0xc0, 293 | 0x00, 0x8b, 0xaa, 0x42, 0x28, 0xb1, 0x2a, 0xa9, 0xb9, 0x0a, 0xaa, 0x2a, 0x29, 0x8a, 0xaa, 0x2b, 294 | 0xa2, 0x39, 0x80, 0xcc, 0x20, 0x33, 0xd3, 0x4a, 0x6b, 0x2e, 0x89, 0x22, 0x41, 0x24, 0xb8, 0xab, 295 | 0x34, 0x30, 0x08, 0x81, 0x44, 0x32, 0xec, 0x4a, 0x12, 0x8a, 0x0a, 0xc0, 0xea, 0xa2, 0xa2, 0xae, 296 | 0x8a, 0xba, 0x2e, 0x0a, 0xab, 0x12, 0x28, 0x89, 0x44, 0x8a, 0x48, 0x22, 0x48, 0x80, 0x08, 0x11, 297 | 0x8d, 0x8a, 0x64, 0x2c, 0x2b, 0x32, 0x39, 0x49, 0x93, 0x42, 0x01, 0x03, 0x28, 0xba, 0xe4, 0x4c, 298 | 0xb2, 0xee, 0x80, 0x13, 0xca, 0x8a, 0xc4, 0xa9, 0x24, 0x67, 0xab, 0x61, 0xa8, 0x02, 0x8b, 0x2b, 299 | 0x82, 0x4d, 0x90, 0x6e, 0x00, 0xa9, 0xc4, 0x36, 0x33, 0x02, 0x00, 0x00, 0xc8, 0x90, 0x08, 0x80, 300 | 0xe0, 0x30, 0x12, 0x82, 0xaa, 0x4c, 0x03, 0xe0, 0x88, 0xb0, 0x60, 0x28, 0xab, 0xaa, 0xa4, 0x0a, 301 | 0x0f, 0x20, 0x02, 0xaa, 0x4c, 0x10, 0x40, 0x21, 0xc0, 0x04, 0x00, 0x30, 0x31, 0xc2, 0x8c, 0x00, 302 | 0x38, 0x3a, 0x20, 0x4c, 0x08, 0x49, 0xc7, 0x09, 0x08, 0x8e, 0x34, 0x29, 0x50, 0x8a, 0x30, 0xa8, 303 | 0x0a, 0x00, 0x0c, 0x99, 0x1d, 0xcd, 0x09, 0x2e, 0x96, 0x27, 0x02, 0x9a, 0x0a, 0x8b, 0x12, 0x9d, 304 | 0x10, 0x1a, 0xc6, 0xe0, 0xa8, 0xcc, 0xa2, 0xa2, 0x30, 0x0c, 0xcd, 0x8c, 0x0c, 0x2a, 0x04, 0x03, 305 | 0x00, 0x27, 0x00, 0x00, 0x00, 0xb0, 0x6c, 0x00, 0x77, 0x20, 0x70, 0x30, 0xff, 0x0c, 0x04, 0xc3, 306 | 0x7f, 0xaa, 0x30, 0x11, 0xc7, 0x8c, 0x0c, 0x8b, 0x7e, 0xc3, 0x8c, 0xc0, 0x3f, 0x32, 0x13, 0x0c, 307 | 0xcd, 0xcc, 0x30, 0xcc, 0xff, 0xcc, 0x30, 0xcc, 0x7e, 0x13, 0x11, 0x00, 0x21, 0x44, 0x44, 0x14, 308 | 0xc3, 0x88, 0xac, 0x8b, 0x7a, 0xcb, 0x04, 0x07, 0x80, 0x3a, 0x21, 0x07, 0x0c, 0xc0, 0xb0, 0x30, 309 | 0xff, 0x53, 0x53, 0x53, 0x77, 0x1c, 0xfc, 0xea, 0x02, 0x0a, 0xe0, 0x18, 0x38, 0x91, 0x82, 0x08, 310 | 0x0a, 0x0a, 0x01, 0xa9, 0xa0, 0x8a, 0x56, 0xd3, 0x35, 0x8a, 0x20, 0x98, 0x00, 0x28, 0xf0, 0xea, 311 | 0xa1, 0xcc, 0x00, 0x7c, 0x83, 0x06, 0x0d, 0x3f, 0x8d, 0x02, 0xfc, 0x7f, 0x70, 0x70, 0xfd, 0x7f, 312 | 0x07, 0x07, 0xf3, 0xff, 0xdd, 0x30, 0x0c, 0xc3, 0x0c, 0x5c, 0x37, 0x0c, 0x07, 0xe3, 0x8d, 0x00, 313 | 0x60, 0x62, 0x28, 0x28, 0xe0, 0xa2, 0x2c, 0xfa, 0x3a, 0xa2, 0xe0, 0x64, 0xa8, 0xaa, 0xac, 0xa9, 314 | 0x2a, 0x0a, 0x92, 0xa0, 0xb6, 0xac, 0xae, 0xae, 0x8a, 0x2a, 0xae, 0x03, 0xb8, 0x00, 0x00, 0xe8, 315 | 0x0a, 0xec, 0x2a, 0xab, 0x88, 0xab, 0x2b, 0xeb, 0x8b, 0xe0, 0x0b, 0x00, 0xee, 0xb8, 0x82, 0x0a, 316 | 0x82, 0xa0, 0x24, 0x2b, 0x02, 0x80, 0x02, 0x40, 0x40, 0xc0, 0x34, 0x13, 0x00, 0xc7, 0xa8, 0x00, 317 | 0x1c, 0x78, 0x2a, 0xba, 0x90, 0x2f, 0xe0, 0x2c, 0xaa, 0x68, 0x11, 0x13, 0x83, 0x28, 0x0a, 0xa2, 318 | 0x28, 0x2a, 0xa2, 0x11, 0xc1, 0x00, 0xa0, 0x80, 0x60, 0x62, 0x88, 0xa0, 0xa8, 0x98, 0x90, 0x2b, 319 | 0x1c, 0xa8, 0x70, 0x60, 0x8a, 0x02, 0xe2, 0xb1, 0x82, 0x34, 0x73, 0xd4, 0x14, 0x64, 0x92, 0xa3, 320 | 0xaa, 0xe3, 0xc8, 0x88, 0x00, 0x80, 0x82, 0x0c, 0x12, 0x11, 0xa4, 0x84, 0x50, 0xb4, 0x00, 0x02, 321 | 0xa8, 0x48, 0x48, 0x31, 0x33, 0x33, 0x33, 0x33, 0x99, 0x00, 0x08, 0x85, 0x51, 0x50, 0x68, 0x14, 322 | 0x44, 0x55, 0xcc, 0x0c, 0x91, 0x2a, 0x52, 0x18, 0x56, 0x81, 0x21, 0x42, 0xcc, 0x71, 0xc8, 0x0c, 323 | 0x31, 0x55, 0x8c, 0x80, 0x54, 0x8e, 0x68, 0x95, 0x90, 0xd8, 0x61, 0x44, 0x55, 0x58, 0x45, 0x51, 324 | 0x32, 0xa2, 0x85, 0x44, 0x55, 0x48, 0x45, 0x03, 0xcc, 0x22, 0x04, 0x41, 0x10, 0x08, 0x0b, 0x00, 325 | 0x3f, 0x60, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x80, 0x62, 0x80, 326 | 0x0a, 0x2c, 0x28, 0x2c, 0xc0, 0x9c, 0xc4, 0x4d, 0xd3, 0x34, 0xcd, 0x0c, 0x33, 0x07, 0x30, 0xc3, 327 | 0x40, 0x0c, 0x71, 0x1c, 0x33, 0x88, 0xa0, 0x1a, 0x23, 0x28, 0xa3, 0x10, 0x0c, 0xa3, 0xb4, 0x06, 328 | 0xcb, 0x10, 0x70, 0xa4, 0xea, 0x0c, 0xb1, 0x8e, 0xeb, 0x28, 0x2c, 0x3a, 0x0c, 0x32, 0x30, 0xcc, 329 | 0x32, 0xc5, 0xa8, 0xa8, 0x08, 0x00, 0x06, 0x0a, 0xee, 0xae, 0x22, 0x27, 0xe9, 0xd2, 0xfc, 0xbf, 330 | 0x33, 0x33, 0xfc, 0x3f, 0x30, 0xd3, 0xfc, 0x7f, 0x9e, 0x9e, 0x98, 0x68, 0x8a, 0xc2, 0xac, 0x44, 331 | 0x04, 0x4b, 0x33, 0x3f, 0xc3, 0x8a, 0x30, 0x3c, 0xc4, 0x02, 0x00, 0xb0, 0x8b, 0x00, 0x00, 0x00, 332 | 0x02, 0xa2, 0x0a, 0x20, 0xa0, 0xa3, 0x08, 0x0b, 0xac, 0x2a, 0xf3, 0xff, 0x8c, 0x0c, 0x00, 0x00, 333 | 0x0a, 0x20, 0x02, 0x00, 0xa0, 0x00, 0x2a, 0xc2, 0x02, 0x20, 0xba, 0x00, 0x20, 0x48, 0xac, 0x8a, 334 | 0x88, 0x2a, 0x80, 0x80, 0x8e, 0x02, 0x2a, 0xa8, 0x20, 0x0a, 0x84, 0x08, 0x21, 0x61, 0xb4, 0xc0, 335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 341 | }; 342 | 343 | -------------------------------------------------------------------------------- /ti30s_v7s2.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpleavr/NP25/e04614cfd1d4ddd48786ed587db09b8002cbff57/ti30s_v7s2.fzz --------------------------------------------------------------------------------