summaryrefslogtreecommitdiffstats
path: root/zpu
diff options
context:
space:
mode:
Diffstat (limited to 'zpu')
-rw-r--r--zpu/.cvsignore1
-rw-r--r--zpu/.project11
-rw-r--r--zpu/COPYING16
-rw-r--r--zpu/ChangeLog90
-rw-r--r--zpu/STATUS11
-rw-r--r--zpu/docs/images/GCC_logo.pngbin0 -> 23450 bytes
-rw-r--r--zpu/docs/images/codesize1.PNGbin0 -> 9329 bytes
-rw-r--r--zpu/docs/images/codesize2.PNGbin0 -> 16967 bytes
-rw-r--r--zpu/docs/images/compile.PNGbin0 -> 17735 bytes
-rw-r--r--zpu/docs/images/ecos.gifbin0 -> 1660 bytes
-rw-r--r--zpu/docs/images/elizadebug1.PNGbin0 -> 72126 bytes
-rw-r--r--zpu/docs/images/elizadebug2.PNGbin0 -> 67822 bytes
-rw-r--r--zpu/docs/images/gccgdb.PNGbin0 -> 34473 bytes
-rw-r--r--zpu/docs/images/simulator.PNGbin0 -> 42848 bytes
-rw-r--r--zpu/docs/images/simulator2.PNGbin0 -> 42623 bytes
-rw-r--r--zpu/docs/images/simulator3.PNGbin0 -> 69583 bytes
-rw-r--r--zpu/docs/images/spi_read_timing.pngbin0 -> 12075 bytes
-rw-r--r--zpu/docs/images/spi_readfast_timing.pngbin0 -> 7745 bytes
-rw-r--r--zpu/docs/images/spi_timing_overview.pngbin0 -> 10241 bytes
-rw-r--r--zpu/docs/images/zpusim.PNGbin0 -> 17817 bytes
-rw-r--r--zpu/docs/presentations/zpu.odpbin0 -> 60715 bytes
-rw-r--r--zpu/docs/presentations/zpu.pdfbin0 -> 112765 bytes
-rw-r--r--zpu/docs/presentations/zpudemo.odpbin0 -> 222644 bytes
-rw-r--r--zpu/docs/presentations/zpudemo.pdfbin0 -> 254156 bytes
-rw-r--r--zpu/docs/zpu_arch.html2443
-rw-r--r--zpu/hdl/avalanche/core/zpu_core.v749
-rw-r--r--zpu/hdl/avalanche/core/zpu_core_defines.v322
-rw-r--r--zpu/hdl/avalanche/core/zpu_core_rom.v1017
-rw-r--r--zpu/hdl/avalanche/readme.txt91
-rw-r--r--zpu/hdl/example/.cvsignore3
-rw-r--r--zpu/hdl/example/bram_dmips.vhd3356
-rw-r--r--zpu/hdl/example/helloworld.vhd3154
-rw-r--r--zpu/hdl/example/interrupt.vhd3156
-rw-r--r--zpu/hdl/example/log.txt20
-rw-r--r--zpu/hdl/example/sim_small_fpga_top.vhd197
-rw-r--r--zpu/hdl/example/sim_small_fpga_top_noint.vhd184
-rw-r--r--zpu/hdl/example/simzpu_dmips.do29
-rw-r--r--zpu/hdl/example/simzpu_interrupt.do29
-rw-r--r--zpu/hdl/example/simzpu_small.do29
-rw-r--r--zpu/hdl/example/zpu_config.vhd55
-rw-r--r--zpu/hdl/example/zpuromgen.c59
-rw-r--r--zpu/hdl/example/zpuromgen.exebin0 -> 10274 bytes
-rw-r--r--zpu/hdl/example_ghdl/README44
-rw-r--r--zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh24
-rw-r--r--zpu/hdl/example_ghdl/dmipstrace_ghdl.sh24
-rw-r--r--zpu/hdl/example_ghdl/ghdl_import.sh16
-rw-r--r--zpu/hdl/example_ghdl/ghdl_make.sh4
-rw-r--r--zpu/hdl/example_ghdl/ghdl_options.sh2
-rw-r--r--zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh24
-rw-r--r--zpu/hdl/example_medium/.cvsignore4
-rw-r--r--zpu/hdl/example_medium/dram_dmips.vhd3308
-rw-r--r--zpu/hdl/example_medium/dram_hello.vhd3107
-rw-r--r--zpu/hdl/example_medium/sim_fpga_top.vhd194
-rw-r--r--zpu/hdl/example_medium/simzpu_medium.do28
-rw-r--r--zpu/hdl/example_medium/zpu_config_trace.vhd17
-rw-r--r--zpu/hdl/sim/dmipssmalltrace.do26
-rw-r--r--zpu/hdl/sim/dmipstrace.do30
-rw-r--r--zpu/hdl/spi/spi_controller.v235
-rw-r--r--zpu/hdl/wishbone/wishbone_pkg.vhd86
-rw-r--r--zpu/hdl/wishbone/zpu_system.vhd104
-rw-r--r--zpu/hdl/wishbone/zpu_wb_bridge.vhd83
-rw-r--r--zpu/hdl/zealot/0README.txt195
-rw-r--r--zpu/hdl/zealot/BSD20
-rw-r--r--zpu/hdl/zealot/GPL_V2341
-rw-r--r--zpu/hdl/zealot/devices/br_gen.vhdl91
-rw-r--r--zpu/hdl/zealot/devices/gpio.vhdl107
-rw-r--r--zpu/hdl/zealot/devices/phi_io.vhdl257
-rw-r--r--zpu/hdl/zealot/devices/rx_unit.vhdl108
-rw-r--r--zpu/hdl/zealot/devices/timer.vhdl91
-rw-r--r--zpu/hdl/zealot/devices/trace.vhdl258
-rw-r--r--zpu/hdl/zealot/devices/tx_unit.vhdl109
-rw-r--r--zpu/hdl/zealot/devices/txt_util.vhdl541
-rwxr-xr-xzpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/clean_up.sh16
-rwxr-xr-xzpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation.sh49
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/run.do2
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/wave.do30
-rwxr-xr-xzpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis.sh36
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/altium-livedesign-xc3s1000.ucf397
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.prj19
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.ut29
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.xst56
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top.vhd372
-rw-r--r--zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top_tb.vhd194
-rwxr-xr-xzpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/clean_up.sh16
-rwxr-xr-xzpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation.sh49
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/run.do2
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/wave.do30
-rwxr-xr-xzpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis.sh36
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/avnet-eval-xc5vfx30t.ucf482
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.prj19
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.ut39
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.xst60
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top.vhd444
-rw-r--r--zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top_tb.vhd271
-rwxr-xr-xzpu/hdl/zealot/fpga/digilent-starter-xc3s500e/clean_up.sh16
-rwxr-xr-xzpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation.sh49
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/run.do2
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/wave.do30
-rwxr-xr-xzpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis.sh36
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/digilent-starter-xc3s500e.ucf356
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.prj19
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.ut22
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.xst56
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top.vhd464
-rw-r--r--zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top_tb.vhd281
-rw-r--r--zpu/hdl/zealot/fpga/dmips_med1.vhdl119
-rw-r--r--zpu/hdl/zealot/fpga/dmips_small1.vhdl120
-rw-r--r--zpu/hdl/zealot/fpga/hello_med1.vhdl119
-rw-r--r--zpu/hdl/zealot/fpga/hello_small1.vhdl120
-rwxr-xr-xzpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/clean_up.sh16
-rwxr-xr-xzpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation.sh49
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/run.do2
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/wave.do163
-rwxr-xr-xzpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis.sh36
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.prj19
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.ut30
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.xst53
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/xilinx-sp601-xc6slx16.ucf303
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top.vhd574
-rw-r--r--zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top_tb.vhd402
-rw-r--r--zpu/hdl/zealot/helpers/zpu_med1.vhdl187
-rw-r--r--zpu/hdl/zealot/helpers/zpu_small1.vhdl153
-rw-r--r--zpu/hdl/zealot/roms/dmips_bram.vhdl4462
-rw-r--r--zpu/hdl/zealot/roms/dmips_dbram.vhdl4485
-rw-r--r--zpu/hdl/zealot/roms/hello_bram.vhdl3056
-rw-r--r--zpu/hdl/zealot/roms/hello_dbram.vhdl3035
-rw-r--r--zpu/hdl/zealot/roms/rom_pkg.vhdl80
-rw-r--r--zpu/hdl/zealot/testbenches/dmips_med1_tb.vhdl134
-rw-r--r--zpu/hdl/zealot/testbenches/small1_tb.vhdl134
-rw-r--r--zpu/hdl/zealot/zpu_medium.vhdl948
-rw-r--r--zpu/hdl/zealot/zpu_pkg.vhdl292
-rw-r--r--zpu/hdl/zealot/zpu_small.vhdl472
-rw-r--r--zpu/hdl/zpu4/core/histogram.perl218
-rw-r--r--zpu/hdl/zpu4/core/zpu_config.vhd58
-rw-r--r--zpu/hdl/zpu4/core/zpu_core.vhd1014
-rw-r--r--zpu/hdl/zpu4/core/zpu_core_small.vhd602
-rw-r--r--zpu/hdl/zpu4/core/zpupkg.vhd218
-rw-r--r--zpu/hdl/zpu4/src/.cvsignore5
-rw-r--r--zpu/hdl/zpu4/src/clocks.vhd198
-rw-r--r--zpu/hdl/zpu4/src/io.vhd119
-rw-r--r--zpu/hdl/zpu4/src/timer.vhd61
-rw-r--r--zpu/hdl/zpu4/src/trace.vhd107
-rw-r--r--zpu/hdl/zpu4/src/txt_util.vhd539
-rw-r--r--zpu/hdl/zpu4/src/zpuio.vhd218
-rwxr-xr-xzpu/hdl/zpu4/test/dmips/build.sh4
-rw-r--r--zpu/hdl/zpu4/test/dmips/dmips.binbin0 -> 13028 bytes
-rw-r--r--zpu/hdl/zpu4/test/dmips/dmips.elfbin0 -> 82460 bytes
-rw-r--r--zpu/hdl/zpu4/test/dmips/dmips.ram3256
-rwxr-xr-xzpu/hdl/zpu4/test/gpiotest/build.sh4
-rw-r--r--zpu/hdl/zpu4/test/gpiotest/gpiotest.c72
-rwxr-xr-xzpu/hdl/zpu4/test/hello/build.sh4
-rw-r--r--zpu/hdl/zpu4/test/hello/hello.binbin0 -> 12224 bytes
-rw-r--r--zpu/hdl/zpu4/test/hello/hello.c47
-rw-r--r--zpu/hdl/zpu4/test/hello/hello.elfbin0 -> 150384 bytes
-rw-r--r--zpu/hdl/zpu4/test/hello/hello.ram3055
-rwxr-xr-xzpu/hdl/zpu4/test/interrupt/build.sh4
-rw-r--r--zpu/hdl/zpu4/test/interrupt/int.binbin0 -> 12232 bytes
-rw-r--r--zpu/hdl/zpu4/test/interrupt/int.c40
-rw-r--r--zpu/hdl/zpu4/test/interrupt/int.elfbin0 -> 150458 bytes
-rw-r--r--zpu/hdl/zpu4/test/interrupt/int.ram3057
-rw-r--r--zpu/hdl/zy2000/timer.vhd137
-rw-r--r--zpu/hdl/zy2000/trace.vhd84
-rw-r--r--zpu/hdl/zy2000/txt_util.vhd587
-rw-r--r--zpu/hdl/zy2000/zpu_config.vhd20
-rw-r--r--zpu/hdl/zy2000/zpu_config_fast.vhd20
-rw-r--r--zpu/hdl/zy2000/zpu_core.vhd948
-rw-r--r--zpu/hdl/zy2000/zpupkg.vhd168
-rw-r--r--zpu/roadshow/roadshow/build/makefirmware.sh13
-rw-r--r--zpu/roadshow/roadshow/codesize/.cvsignore1
-rw-r--r--zpu/roadshow/roadshow/codesize/crt0_phi.S178
-rw-r--r--zpu/roadshow/roadshow/codesize/hello.c9
-rw-r--r--zpu/roadshow/roadshow/codesize/small.c9
-rw-r--r--zpu/roadshow/roadshow/codesize/small.elfbin0 -> 1577 bytes
-rw-r--r--zpu/roadshow/roadshow/codesize/smallstd.c9
-rw-r--r--zpu/roadshow/roadshow/dhrystone/.cvsignore2
-rw-r--r--zpu/roadshow/roadshow/dhrystone/RATIONALE361
-rw-r--r--zpu/roadshow/roadshow/dhrystone/README_C78
-rw-r--r--zpu/roadshow/roadshow/dhrystone/VARIATIONS157
-rw-r--r--zpu/roadshow/roadshow/dhrystone/build.sh7
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhry-c1779
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhry.h423
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhry_1.c533
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhry_2.c192
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhry_c.dif141
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhrystone.binbin0 -> 13028 bytes
-rw-r--r--zpu/roadshow/roadshow/dhrystone/dhrystone.zpubin0 -> 13069 bytes
-rw-r--r--zpu/roadshow/roadshow/dhrystone/submit.frm17
-rw-r--r--zpu/roadshow/roadshow/ecos/codesize/zpuarmcodesize.htm1049
-rw-r--r--zpu/roadshow/roadshow/ecos/repository.tar.bz2bin0 -> 28572 bytes
-rw-r--r--zpu/roadshow/roadshow/games/.cvsignore5
-rw-r--r--zpu/roadshow/roadshow/games/build.sh7
-rw-r--r--zpu/roadshow/roadshow/games/eliza.binbin0 -> 46920 bytes
-rw-r--r--zpu/roadshow/roadshow/games/eliza.elfbin0 -> 342451 bytes
-rw-r--r--zpu/roadshow/roadshow/games/eliza.zpubin0 -> 46961 bytes
-rw-r--r--zpu/roadshow/roadshow/games/eliza/eliza.c269
-rw-r--r--zpu/roadshow/roadshow/games/eliza/parse.c719
-rw-r--r--zpu/roadshow/roadshow/games/eliza/parse.h33
-rw-r--r--zpu/roadshow/roadshow/games/eliza/response.c365
-rw-r--r--zpu/roadshow/roadshow/games/eliza/response.h41
-rw-r--r--zpu/roadshow/roadshow/games/sumeria.binbin0 -> 42324 bytes
-rw-r--r--zpu/roadshow/roadshow/games/sumeria.c444
-rw-r--r--zpu/roadshow/roadshow/games/sumeria.zpubin0 -> 42365 bytes
-rw-r--r--zpu/roadshow/roadshow/helloworld/build.sh6
-rw-r--r--zpu/roadshow/roadshow/helloworld/test.binbin0 -> 49836 bytes
-rw-r--r--zpu/roadshow/roadshow/helloworld/test.c12
-rw-r--r--zpu/roadshow/roadshow/helloworld/test.elfbin0 -> 279826 bytes
-rw-r--r--zpu/roadshow/roadshow/helloworld/test.zpubin0 -> 262353 bytes
-rw-r--r--zpu/roadshow/roadshow/hwtest/build.sh6
-rw-r--r--zpu/roadshow/roadshow/hwtest/test.S19
-rw-r--r--zpu/roadshow/roadshow/hwtest/test.binbin0 -> 48 bytes
-rw-r--r--zpu/roadshow/roadshow/hwtest/test.elfbin0 -> 1343 bytes
-rw-r--r--zpu/roadshow/roadshow/hwtest/test.zpubin0 -> 212562 bytes
-rw-r--r--zpu/roadshow/roadshow/images/bootloader.phibin0 -> 167015 bytes
-rw-r--r--zpu/roadshow/roadshow/images/dhrystone.zpubin0 -> 13069 bytes
-rw-r--r--zpu/roadshow/roadshow/images/eliza.zpubin0 -> 46961 bytes
-rw-r--r--zpu/roadshow/roadshow/images/ic300.bitbin0 -> 212463 bytes
-rw-r--r--zpu/roadshow/roadshow/images/net_test.zpubin0 -> 206210 bytes
-rw-r--r--zpu/roadshow/roadshow/images/sumeria.zpubin0 -> 42365 bytes
-rw-r--r--zpu/roadshow/roadshow/iss/index.html14
-rw-r--r--zpu/roadshow/roadshow/iss/simulator.jarbin0 -> 54378 bytes
-rw-r--r--zpu/roadshow/roadshow/loop/looptest.c68
-rw-r--r--zpu/roadshow/roadshow/net_test/.cvsignore8
-rw-r--r--zpu/roadshow/roadshow/net_test/http_pages.c206
-rw-r--r--zpu/roadshow/roadshow/net_test/init.cpp52
-rw-r--r--zpu/roadshow/roadshow/net_test/makefile41
-rw-r--r--zpu/roadshow/roadshow/net_test/net_test.ecm237
-rw-r--r--zpu/roadshow/roadshow/net_test/ping_test.c585
-rw-r--r--zpu/snapshot.sh7
-rw-r--r--zpu/sw/ecos/repository/dev/eth/opencores/ethermac/current/cdl/opencores_ethermac_drivers.cdl149
-rw-r--r--zpu/sw/ecos/repository/dev/eth/zpu/opencores/phi/current/cdl/phi_opencores_ethmac_drivers.cdl127
-rw-r--r--zpu/sw/ecos/repository/dev/eth/zpu/opencores/phi/current/include/devs_eth_zpu_opencores_phi.inl92
-rw-r--r--zpu/sw/ecos/repository/dev/eth/zpu/opencores/phi/current/src/if_opencores.c112
-rw-r--r--zpu/sw/ecos/repository/ecos.db128
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/ChangeLog39
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/cdl/hal_zylin.cdl108
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/include/arch.inc79
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/include/basetype.h83
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/include/hal_arch.h255
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/include/hal_intr.h261
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/include/hal_io.h305
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/src/context.S324
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/src/hal_misc.c177
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/src/hal_mk_defs.c102
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/src/vectors.c116
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/arch/current/src/zylin.ld226
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/ChangeLog39
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/cdl/hal_zylin_zpu_abel.cdl298
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/include/hal_platform_ints.h79
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/include/pkgconf/mlt_zylin_zpu_abel_ram.h17
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/include/pkgconf/mlt_zylin_zpu_abel_ram.ldi27
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/include/plf_io.h64
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/misc/redboot_RAM.ecm53
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/abel/current/src/abel_misc.c61
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/ChangeLog39
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/cdl/hal_zylin_zpu_phi.cdl292
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/include/hal_platform_ints.h81
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/include/pkgconf/mlt_zylin_zpu_phi_ram.h17
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/include/pkgconf/mlt_zylin_zpu_phi_ram.ldi27
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/include/plf_io.h58
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/phi/current/src/phi_misc.c72
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/ChangeLog38
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/cdl/hal_zylin_zpu.cdl83
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/include/hal_cache.h192
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/include/hal_diag.h90
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/include/plf_stub.h85
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/include/var_arch.h73
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/include/var_io.h73
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/src/hal_diag.c88
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/var/current/src/zpu_misc.c252
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/ChangeLog39
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/cdl/hal_zylin_zpu_zeta.cdl298
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/include/hal_platform_ints.h79
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/include/pkgconf/mlt_zylin_zpu_zeta_ram.h17
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/include/pkgconf/mlt_zylin_zpu_zeta_ram.ldi27
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/include/plf_io.h58
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/misc/redboot_RAM.ecm53
-rw-r--r--zpu/sw/ecos/repository/hal/zylin/zpu/zeta/current/src/zeta_misc.c64
-rw-r--r--zpu/sw/ecos/repository/net/zylin/current/cdl/phi_net.cdl56
-rw-r--r--zpu/sw/ecos/repository/net/zylin/current/src/phi_network_support.c368
-rw-r--r--zpu/sw/ecos/repository/pkgconf/rules.mak210
-rw-r--r--zpu/sw/env.sh2
-rw-r--r--zpu/sw/freertos/port/port.c271
-rw-r--r--zpu/sw/freertos/port/portasm.s142
-rw-r--r--zpu/sw/freertos/port/portmacro.h125
-rw-r--r--zpu/sw/freertos/readme.txt40
-rw-r--r--zpu/sw/freertos/sample/FreeRTOSConfig.h96
-rw-r--r--zpu/sw/freertos/sample/Makefile50
-rw-r--r--zpu/sw/freertos/sample/test1.c67
-rw-r--r--zpu/sw/helloworld/gmon.outbin0 -> 120053 bytes
-rw-r--r--zpu/sw/helloworld/hello.binbin0 -> 49768 bytes
-rw-r--r--zpu/sw/helloworld/hello.bram12441
-rw-r--r--zpu/sw/helloworld/hello.c6
-rw-r--r--zpu/sw/helloworld/hello.elfbin0 -> 279938 bytes
-rw-r--r--zpu/sw/setup.sh6
-rw-r--r--zpu/sw/simulator/.classpath7
-rw-r--r--zpu/sw/simulator/.project28
-rw-r--r--zpu/sw/simulator/.settings/org.eclipse.jdt.core.prefs66
-rw-r--r--zpu/sw/simulator/ChangeLog6
-rw-r--r--zpu/sw/simulator/META-INF/MANIFEST.MF11
-rw-r--r--zpu/sw/simulator/build.properties3
-rw-r--r--zpu/sw/simulator/build.xml7
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Abel.java109
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/FileTracer.java285
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Host.java46
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Machine.java17
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Phi.java126
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/PhiFeeble.java34
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Sim.java62
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/SimApp.java177
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/SimFactory.java8
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Simulator.java2065
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/State.java9
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/Tracer.java21
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/ZPU.java14
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/applet/ZPUApplet.java281
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/BadPacketException.java22
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/CPUException.java23
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/DebuggerBreakpointException.java10
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/EndSessionException.java46
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/GDBServerException.java25
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/HardwareWatchPointException.java12
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/IllegalInstructionException.java23
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/InterruptException.java23
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/MemoryAccessException.java23
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/NoAckException.java22
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/TraceException.java22
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/UnknownPacketException.java10
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/exceptions/UnsupportedSyscallException.java12
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/gdb/GDBServer.java364
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/gdb/Packet.java472
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/tools/MakeDRAM.java39
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/simulator/tools/MakeRam.java39
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/stats/CountSequences.java94
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/stats/DumpIt.java17
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/stats/Instruction.java62
-rw-r--r--zpu/sw/simulator/com/zylin/zpu/stats/StatKeeper.java52
-rw-r--r--zpu/sw/simulator/zpusim.jarbin0 -> 68039 bytes
-rw-r--r--zpu/sw/startup/crt0.S957
-rw-r--r--zpu/sw/startup/crt_io.c91
-rw-r--r--zpu/sw/startup/nextgen_crt0.S894
-rw-r--r--zpu/sw/startup/time.c32
341 files changed, 97172 insertions, 0 deletions
diff --git a/zpu/.cvsignore b/zpu/.cvsignore
new file mode 100644
index 0000000..7c32f55
--- /dev/null
+++ b/zpu/.cvsignore
@@ -0,0 +1 @@
+install
diff --git a/zpu/.project b/zpu/.project
new file mode 100644
index 0000000..55b1cb8
--- /dev/null
+++ b/zpu/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>zpu</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/zpu/COPYING b/zpu/COPYING
new file mode 100644
index 0000000..4212a5b
--- /dev/null
+++ b/zpu/COPYING
@@ -0,0 +1,16 @@
+About ZPU licensing:
+
+The license for HDL implementations is FreeBSD to be
+friendly towards commercial projects and other open source
+projects, however the architecture, documentation and tools will be GPL.
+
+This means that all updates to the architecture must be shared, but actual
+implementations(which are small and can be very project speific) can
+be friendly towards commercial considerations.
+
+Patches to update files w/correct licensing info will be most appreciated!
+
+The ZPU and all the files are per 1/1-2008 Copyright Zylin AS, i.e.
+Zylin is free to decide upon the BSD license for HDL implementation
+and GPL for architecture, tools and documentation.
+ \ No newline at end of file
diff --git a/zpu/ChangeLog b/zpu/ChangeLog
new file mode 100644
index 0000000..2ed7369
--- /dev/null
+++ b/zpu/ChangeLog
@@ -0,0 +1,90 @@
+2008-11-12 Álvaro Lopes <alvieboy@alvie.com>
+ * zpu/hdl/zpu4/core/zpu_core.vhd: Basic interrupt implementation
+ for zpu4 core.
+2008-09-16 Salvador Eduardo Tropea <salvador@inti.gob.ar>
+ * zpu/hdl/zealot: added small ZPU core, testbenches and FPGA implementation
+2008-09-11 Salvador Eduardo Tropea <salvador@inti.gob.ar>
+ * zpu/docs/zpu_arch.html: added Zealot information.
+2008-09-08 Salvador Eduardo Tropea <salvador@inti.gob.ar>
+ * zpu/hdl/zealot: a complete ZPU implementation cleaned up and
+ with a UART.
+2008-08-25 Salvador Eduardo Tropea <salvador@inti.gov.ar>
+ * zpu/docs/arch_html: Fix typo in zpu_arch.html w.r.t. ZPU UART/Debug channel
+2008-08-18 Øyvind Harboe
+ * duplicated crt0.s and some other stuff from libgloss into
+ sw/startup. This makes it easier to tinker w/startup code.
+2008-08-08 Salvador E. Tropea
+ * zpu/hdl/zpu4/core/histogram.perl - generate opcode histogram from
+ HDL simulation output
+2008-06-25 Øyvind Harboe
+ * do not enable interrupts for simzpu_small.do. hello world
+ does not have an interrupt handler, so this caused a BREAK
+ instruction to be executed.
+2008-06-18 Miguel Freitas
+ * zpu_config.vhd: Fixed startSp calculation (address in bytes not words)
+2008-06-18 Miguel Freitas
+ * Removed unisim/roc dependency (it was used just to pulse the areset)
+ and fixes paths for building the ghdl examples out of the box.
+ One should check if the areset change doesn't break modelsim.
+2008-06-16 Miguel Freitas
+ * io.vhd: fix address comparsion and added numerous outputs
+ during simulation to make things a bit easier
+ * zpu_config.vhd: do not use hardcoded startSp, allows more easily
+ tinkering w/RAM size
+2008-05-06 Øyvind Harboe
+ * Small ZPU now supports interrupts
+ * added simulation example demonstrating interrupts
+2008-05-05 Øyvind Harboe
+ * added eCos HAL for ZPU
+ zpu/zpu/sw/ecos/repository
+2008-05-04 Øyvind Harboe
+ * moved ZPU core files to seperate folder
+ * deleted some obsolete files
+2008-05-04 jurij kostasenko
+ * Make code synthesize on Synopsis
+ zpu/hdl/zpu4/src/zpu_core_small.vhd
+ zpu/hdl/zpu4/src/io.vhd
+2008-05-01 Øyvind Harboe
+ * zpu/hdl/zy2000 - ZPU implementation used on the zy2000 dev kit
+2008-04-17 Arnim Läuger
+ * zpu/hdl/example_ghdl/ghdl_import.sh, zpu/hdl/example_ghdl/ghdl_make.sh,
+ zpu/hdl/example_ghdl/ghdl_options.sh, zpu/hdl/example_ghdl/README: GHDL example
+ * zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh: testcase for GHDL
+ * zpu/hdl/zpu4/src/dmipstrace_ghdl.sh: testcase for GHDL
+ * zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh: testcase for GHDL
+ * zpu/hdl/example/helloworld.vhd, zpu/hdl/zpu4/src/bram_dmips.vhd,
+ zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh, zpu/hdl/zpu4/src/dram_dmips.vhd,
+ zpu/hdl/zpu4/src/dram_hello.vhd, zpu/hdl/zpu4/src/io.vhd,
+ zpu/hdl/zpu4/src/sim_fpga_top.vhd, zpu/hdl/zpu4/src/sim_small_fpga_top.vhd,
+ zpu/hdl/zpu4/src/timer.vhd, zpu/hdl/zpu4/src/trace.vhd,
+ zpu/hdl/zpu4/src/zpu_config_trace.vhd, zpu/hdl/zpu4/src/zpu_core_small.vhd,
+ zpu/hdl/zpu4/src/zpu_core.vhd, zpu/hdl/zpu4/src/zpupkg.vhd: conversion to numeric_std
+2008-04-17 Øyvind Harboe
+ * deleted duplicate files from example folder.
+ * retired Xilinx synthesizing example. It messes up the zpu4 directory.
+2008-04-16 Øyvind Harboe
+ * zpu/doc/zpupresentation_old.odt: interesting bits moved into zpu_arch.html
+ * zpu/doc/zpupresentation.*: interesting bits moved into zpu_arch.html
+ * zpu/docs/zpu_arch.html: added Phi memory map to end of zpu_arch.html
+ * zpu/docs/zpuphiregs.odt: retired
+ * zpu/docs/zpu_arch.html: added. Need to define instruction set.
+ * zpu/docs/zpu_arch.odt: retired
+2008-04-15 Øyvind Harboe
+ * zpu/docs/zpu_arch.odt - a short summary of the architecture
+ * zpu/simzpu_bram.do - retired.
+ * zpu/zpu_core_bram.vhd - retired
+ * zpu/hdl/zpu3 - retired
+2008-04-05 Øyvind Harboe
+ * zpu/docs/zpuphiregs.odt - ZPU Phi register overview
+2008-03-06 Adam Pierce
+ * zpu/zpu/hdl/example/zpuromgen.c - generate rom files
+ without java
+2008-02-21 Øyvind Harboe
+ * zpu/zpu/sw/index.html. Changed it a bit to make installation easier.
+ * zpu/zpu/hdl/index.html. Sharpened instructions and shows two working
+ examples. Small & medium ZPU.
+ * got zpu4/src/simzpu_medium.do working again.
+2008-02-11 Øyvind Harboe
+ * hdl/index.html. Fixed typo. Use objcopy and not objdump.
+2008-01-02 Øyvind Harboe
+ * Moved to www.opencores.org
diff --git a/zpu/STATUS b/zpu/STATUS
new file mode 100644
index 0000000..e28f191
--- /dev/null
+++ b/zpu/STATUS
@@ -0,0 +1,11 @@
+The current state of the ZPU:
+
+- Patches welcome!
+- Zylin is rummaging up the various files that might be of interest
+ to the open source ZPU project.
+- The ZPU, GCC toolchain and HDL works. Zylin eCosBoard 1.1 ships w/a
+ ZPU(see http://www.zylin.com), if you need a development board before
+ implementing on your own system.
+- The docs leave a lot to be desired at this point.
+- Licensing needs to be ironed out. After which lots of files will have
+ to be updated, strictly speaking. Patches welcome!
diff --git a/zpu/docs/images/GCC_logo.png b/zpu/docs/images/GCC_logo.png
new file mode 100644
index 0000000..7b3435f
--- /dev/null
+++ b/zpu/docs/images/GCC_logo.png
Binary files differ
diff --git a/zpu/docs/images/codesize1.PNG b/zpu/docs/images/codesize1.PNG
new file mode 100644
index 0000000..874ee9d
--- /dev/null
+++ b/zpu/docs/images/codesize1.PNG
Binary files differ
diff --git a/zpu/docs/images/codesize2.PNG b/zpu/docs/images/codesize2.PNG
new file mode 100644
index 0000000..caa8c14
--- /dev/null
+++ b/zpu/docs/images/codesize2.PNG
Binary files differ
diff --git a/zpu/docs/images/compile.PNG b/zpu/docs/images/compile.PNG
new file mode 100644
index 0000000..8a00c07
--- /dev/null
+++ b/zpu/docs/images/compile.PNG
Binary files differ
diff --git a/zpu/docs/images/ecos.gif b/zpu/docs/images/ecos.gif
new file mode 100644
index 0000000..3dad40c
--- /dev/null
+++ b/zpu/docs/images/ecos.gif
Binary files differ
diff --git a/zpu/docs/images/elizadebug1.PNG b/zpu/docs/images/elizadebug1.PNG
new file mode 100644
index 0000000..f3c3f5f
--- /dev/null
+++ b/zpu/docs/images/elizadebug1.PNG
Binary files differ
diff --git a/zpu/docs/images/elizadebug2.PNG b/zpu/docs/images/elizadebug2.PNG
new file mode 100644
index 0000000..13f046e
--- /dev/null
+++ b/zpu/docs/images/elizadebug2.PNG
Binary files differ
diff --git a/zpu/docs/images/gccgdb.PNG b/zpu/docs/images/gccgdb.PNG
new file mode 100644
index 0000000..afdfc31
--- /dev/null
+++ b/zpu/docs/images/gccgdb.PNG
Binary files differ
diff --git a/zpu/docs/images/simulator.PNG b/zpu/docs/images/simulator.PNG
new file mode 100644
index 0000000..9765366
--- /dev/null
+++ b/zpu/docs/images/simulator.PNG
Binary files differ
diff --git a/zpu/docs/images/simulator2.PNG b/zpu/docs/images/simulator2.PNG
new file mode 100644
index 0000000..070084e
--- /dev/null
+++ b/zpu/docs/images/simulator2.PNG
Binary files differ
diff --git a/zpu/docs/images/simulator3.PNG b/zpu/docs/images/simulator3.PNG
new file mode 100644
index 0000000..34e0540
--- /dev/null
+++ b/zpu/docs/images/simulator3.PNG
Binary files differ
diff --git a/zpu/docs/images/spi_read_timing.png b/zpu/docs/images/spi_read_timing.png
new file mode 100644
index 0000000..f412562
--- /dev/null
+++ b/zpu/docs/images/spi_read_timing.png
Binary files differ
diff --git a/zpu/docs/images/spi_readfast_timing.png b/zpu/docs/images/spi_readfast_timing.png
new file mode 100644
index 0000000..3cd2e35
--- /dev/null
+++ b/zpu/docs/images/spi_readfast_timing.png
Binary files differ
diff --git a/zpu/docs/images/spi_timing_overview.png b/zpu/docs/images/spi_timing_overview.png
new file mode 100644
index 0000000..1e42156
--- /dev/null
+++ b/zpu/docs/images/spi_timing_overview.png
Binary files differ
diff --git a/zpu/docs/images/zpusim.PNG b/zpu/docs/images/zpusim.PNG
new file mode 100644
index 0000000..d8fc277
--- /dev/null
+++ b/zpu/docs/images/zpusim.PNG
Binary files differ
diff --git a/zpu/docs/presentations/zpu.odp b/zpu/docs/presentations/zpu.odp
new file mode 100644
index 0000000..e2a6554
--- /dev/null
+++ b/zpu/docs/presentations/zpu.odp
Binary files differ
diff --git a/zpu/docs/presentations/zpu.pdf b/zpu/docs/presentations/zpu.pdf
new file mode 100644
index 0000000..4bdd25b
--- /dev/null
+++ b/zpu/docs/presentations/zpu.pdf
Binary files differ
diff --git a/zpu/docs/presentations/zpudemo.odp b/zpu/docs/presentations/zpudemo.odp
new file mode 100644
index 0000000..d0085a8
--- /dev/null
+++ b/zpu/docs/presentations/zpudemo.odp
Binary files differ
diff --git a/zpu/docs/presentations/zpudemo.pdf b/zpu/docs/presentations/zpudemo.pdf
new file mode 100644
index 0000000..067cc78
--- /dev/null
+++ b/zpu/docs/presentations/zpudemo.pdf
Binary files differ
diff --git a/zpu/docs/zpu_arch.html b/zpu/docs/zpu_arch.html
new file mode 100644
index 0000000..62acdfa
--- /dev/null
+++ b/zpu/docs/zpu_arch.html
@@ -0,0 +1,2443 @@
+<html>
+<body>
+<h1>This Document</h1>
+This is a snapshot of the zpu/zpu/docs/zpu_arch.html document in CVS.
+<p>
+Several of the links will only work if you have checked out the zpu/zpu tree from opencores CVS. See <a href="#download">Download</a> below.
+<h1>Index</h1>
+<ul>
+<li> <a href="#introduction">Introduction</a>
+ <ul>
+ <li> <a href="#license">License</a>
+ <li> <a href="#features">Features</a>
+ <li> <a href="#status">Status</a>
+ <li> <a href="#download">Download</a>
+ <li> <a href="#patch">Creating a patch</a>
+ <li> <a href="#mailinglist">Getting help - mailing list</a>
+ </ul>
+<li> <a href="#architecture">Core Architecture</a>
+ <ul>
+ <li> <a href="#instructionset">Instruction set</a>
+ <li> <a href="#interrupts">Interrupts</a>
+ <li> <a href="#startup">Startup code (aka crt0.s)</a>
+ <li> <a href="#vectors">Jump vectors</a>
+ </ul>
+<li> <a href="#implementations">Core Implementations</a>
+ <ul>
+ <li> <a href="#performance">Performance Summary</a>
+ <li> <a href="#zpu4_small">zpu4 small</a>
+ <li> <a href="#zpu4_medium">zpu4 medium</a>
+ <li> <a href="#alzpu_pipe">alzpu pipelined</a>
+ <li> <a href="#zealot">Zealot medium and small</a>
+ <li> <a href="#zy2000">ZY2000 SOC</a>
+ <li> <a href="#verilogwip">Un-named verilog translation</a>
+ <li> <a href="#implementing">Implementing your own ZPU</a>
+ </ul>
+<li> <a href="#refdesign">Reference Designs</a>
+ <ul>
+ <li> <a href="#ref_min">SOC - Minimal (core+RAM)</a>
+ <li> <a href="#ref_basic">SOC - Basic (core+RAM+UART)</a>
+ <li> <a href="#ref_soc">SOC - Board (core+RAM+Wishbone+++)</a>
+ <li> <a href="#rams">Common - RAM models</a>
+ <li> <a href="#wishbone">Common - Wishbone</a>
+ <li> <a href="#uart">Common - UART</a>
+ <li> <a href="#spicontroller">Common - SPI flash controller</a>
+ </ul>
+<li> <a href="#tools">Working with tools and core</a>
+ <ul>
+ <li> <a href="#setuplinux">Setup - Linux toolchain</a>
+ <li> <a href="#setupcygwin">Setup - Cygwin toolchain</a>
+ <li> <a href="#gcc2ram">GCC to RAM</a>
+ <li> <a href="#hdlsim">HDL simulation (ZPU4)</a>
+ <li> <a href="#gdbsim">GDB simulation (ZPU4)</a>
+ <li> <a href="#simulator">Instruction Set Simulator</a>
+ </ul>
+<li> <a href="#misc">Miscellaneous</a>
+ <ul>
+ <li> <a href="#tuning">Speeding up the ZPU</a>
+ <li> <a href="#codesize">Optimizing for code size</a>
+ <li> <a href="#ecos">Installing eCos build tools</a>
+ <li> <a href="#memorymap">Memory map</a>
+ </ul>
+<li> <a href="#todo">TODO</a>
+ <ul>
+ <li> <a href="#todolist">TODO list</a>
+ <li> <a href="#repository">Repository Re-org</a>
+ <li> <a href="#nextgen">Next generation ZPU</a>
+ <li> <a href="#float">Floating point support</a>
+ </ul>
+</ul>
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<a name="introduction"/>
+<h1>Introduction</h1>
+<P>The worlds smallest 32 bit CPU with GCC toolchain.
+<P>The ZPU is a small CPU in two ways: it takes up very little resources and
+the architecture itself is small. The latter can be important when learning
+about CPU architectures and implementing variations of the ZPU where
+aspects of CPU design is examined. In academia students can learn VHDL,
+CPU architecture in general and complete exercises in the course of a year.</P>
+<P>
+The current ZPU instruction set and architecture has not changed for
+the last couple of years and can be considered quite stable. There is
+a lot of discussion about various modifications to the ZPU architecture
+in the zylin-zpu mailing list, but currently no actual modifications are
+planned as the improvements that have been identified are relatively
+slight(&lt;30% performance/size improvement).
+</P>
+<P>
+There are a handful of implementations of the ZPU. Most of these usually
+have some strong points and there is some movement in the direction of
+consolidating improvements into a few officially recommended ZPU
+implementations.
+</P>
+<P>
+For those that are interested in the Zylin ZPU, I recommend joining
+up on the zylin-zpu mailing list and participating in the discussion
+there. The zylin-zpu is a friendly place where people of different
+skills, hardware, software, tools meet to exchange ideas about the ZPU
+and microprocessor architecture in general.
+</P>
+
+<P>Sincerely,</P>
+<P>&Oslash;yvind Harboe <BR>Zylin AS
+</P>
+
+<a name="license"/>
+<h2>License</h2>
+<P>The project includes HDL, GCC toolchain and eCos HAL.
+
+<P>The ZPU has a BSD license for the HDL and GPL for the rest.
+This allows users to implement any version of the ZPU they want in
+commercial products, but if improvements are done to the architecture
+as such, then they need to be contributed back.
+</P>
+
+<P>Per Jan 1. 2008, Zylin has the Copyright for the ZPU, i.e. Zylin
+is free to decide that the ZPU shall have a BSD license for HDL + GPL
+for the rest.</P>
+
+<a name="features"/>
+<h2>Features</h2>
+<UL>
+ <LI>Small size: (See <a href="#implementations">performance summary</a>)
+ <LI>Code size 80% of ARM Thumb
+ <LI>GCC toolchain(GDB, newlib, libstdc+)
+ <LI>eCos embedded operating system support
+</UL>
+
+<a name="status"/>
+<h2>Status</h2>
+<UL>
+ <LI>HDL works
+ <LI>GCC toolchain works
+ <LI>eCos HAL works
+</UL>
+<P>... but there is a long <a href="#todo">TODO</a> list</P>
+<P>Expect churn as we converge onto a shorter list of <a href="#implementations">implementations</a>.
+
+<a name="download"/>
+<h2>Download source code</h2>
+The ZPU HDL source code is available as a GIT repository from <a href="http://repo.or.cz/w/zpu.git" target="_blank">http://repo.or.cz/w/zpu.git</a>.
+You can download the latest sourcecode as a snapshot without installing GIT.
+<p>
+Previously the ZPU repository was hosted as a CVS repository at www.opencores.org,
+but that ZPU CVS repository is there only for historical reference at this point.
+Once www.opencores.org grows a GIT hosting service, the plan is to replicate
+the GIT repository there.
+
+<p>
+The GCC ZPU toolchain is available from <a href ="http://repo.or.cz/w/zpugcc.git" target ="_blank">http://repo.or.cz/w/zpugcc.git</a>. The ZPU GCC toolchain is BIG (over 100 MBytes).
+<a name="patch"/>
+<h2>GIT</h2>
+For more advanced use of GIT, you will need to hit the books and read up
+on the GIT documentation.
+<p/>
+That said, you can ask "silly" newbie questions about GIT on the <a href="#mailinglist">zylin-zpu mailing
+list</a> and you should receive some friendly prodding in the right direction
+w.r.t. finding reading material.
+<a name="mailinglist"/>
+<h2>Getting help - mailing list</h2>
+<P>The place to get help is the <a href="http://www.zylin.com/mailinglist.html">zylin-zpu mailing list</a>
+
+<P>
+The ZPU is an open source project and if you demonstrate that you have
+made an effort to read the documentation and googled, then you will
+normally get some help from this list if you ask clear questions.
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+
+<a name="architecture"/>
+<h1>Architecture</h1>
+The ZPU is a zero operand, or stack based CPU. The opcodes have a fixed width of 8 bits.
+<p>
+Example:
+<p>
+<div style="white-space:pre;background-color:#dddddd;">
+ <code style="white-space:pre;background-color:#dddddd;">
+ IM 5 ; push 5 onto the stack
+ LOADSP 20 ; push value at memory location SP+20
+ ADD ; pop 2 values on the stack and push the result
+ </code>
+</div>
+As can be seen, a lot of information is packed into the 8 bits, e.g. the IM instruction pushes a 7 bit signed integer onto the stack.
+<p>
+The choice of opcodes is intimately tied to the GCC toolchain capabilities.
+<p>
+<div style="white-space:pre;background-color:#dddddd;">
+ <code style="white-space:pre;background-color:#dddddd;">
+ /* simple program showing some interesting qualities of the ZPU toolchain */
+ void bar(int);
+ int j;
+ void foo(int a, int b, int c)
+ {
+ a++;
+ b+=a;
+ j=c;
+ bar(b);
+ }
+
+foo:
+ loadsp 4 ; a is at memory location SP+4
+ im 1
+ add
+ loadsp 12 ; b is now at memory location SP+12
+ add
+ loadsp 16 ; c is now at memory location SP+16
+ im 24 ; «j» is at absolute memory location 24.
+; Notice how the ZPU toolchain is using link-time relaxation
+; to squeeze the address into a single no-op
+ store
+ im 22 ; the fn bar is at address 22
+ call
+ im 12
+ return ; 12 bytes of arguments + return from fn
+</code>
+</div>
+
+<a name="instructionset"/>
+<h2>Instruction set</h2>
+<p>A base set of instructions must be implemented in RTL, but the rest may be implemented as RTL or as microcode. This allows a tradeoff of core size vs code size and performance.
+<p>The instructions that may be implemented in RTL or microcode are referred to as emulated instructions. The microcode is in crt0.s. The <a href="#implementations">implementation</a> determines which instructions run as microcode.
+<p>All operations are 32 bit wide.
+<p>TODO Is the table broken? Fix it.
+
+<table border="1">
+ <tr><td>Name</td><td>Opcode</td><td>Description</td><td>Definition</td></tr>
+ <tr>
+ <td>
+ BREAKPOINT
+ </td>
+ <td>
+ 00000000
+ </td>
+ <td>
+ The debugger sets a memory location to this value to set a breakpoint. Once a JTAG-like
+ debugger interface is added, it will be convenient to be able to distinguish
+ between a breakpoint and an illegal(possibly emulated) instruction.
+ </td>
+ <td>
+ No effect on registers
+ </td>
+ </tr>
+ <tr>
+ <td>
+ IM
+ </td>
+ <td>
+ 1xxx xxxx
+ </td>
+ <td>
+ Pushes 7 bit sign extended integer and sets the a «instruction decode interrupt mask» flag(IDIM).
+ <p>
+ If the IDIM flag is already set, this instruction shifts the value on the stack left by 7 bits and stores the 7 bit immediate value into the lower 7 bits.
+ <p>
+ Unless an instruction is listed as treating the IDIM flag specially, it should be assumed to clear the IDIM flag.
+ <p>
+ To push a 14 bit integer onto the stack, use two consecutive IM instructions.
+ <p>
+ If multiple immediate integers are to be pushed onto the stack, they must be interleaved with another instruction, typically NOP.
+ </td>
+ <td>
+ <code style="white-space:pre;">
+pc <= pc + 1 <br>
+idim <= 1 <br>
+if (idim=0) then <br>
+ sp <= sp - 1; <br>
+ for i in wordSize-1 downto 7 loop <br>
+ mem(sp)(i) <= opcode(6) <br>
+ end loop <br>
+ mem(sp)(6 downto 0) <= opcode(6 downto 0) <br>
+else <br>
+ mem(sp)(wordSize-1 downto 7) <= mem(sp)(wordSize-8 downto 0) <br>
+ mem(sp)(6 downto 0) <= opcode(6 downto 0) <br>
+end if
+ </code>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ STORESP
+ </td>
+ <td>
+ 010x xxxx
+ </td>
+ <td>
+ Pop value off stack and store it in the SP+xxxxx*4 memory location, where xxxxx is a positive integer.
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LOADSP
+ </td>
+ <td>
+ 011x xxxx
+ </td>
+ <td>
+ Push value of memory location SP+xxxxx*4, where xxxxx is a positive integer, onto stack.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ADDSP
+ </td>
+ <td>
+ 0001 xxxx
+ </td>
+ <td>
+ Add value of memory location SP+xxxx*4 to value on top of stack.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ EMULATE
+ </td>
+ <td>
+ 001x xxxx
+ </td>
+ <td>
+ Push PC to stack and set PC to 0x0+xxxxx*32. This is used to emulate opcodes. See
+ zpupgk.vhd for list of emulate opcode values used. zpu_core.vhd contains
+ reference implementations of these instructions rather than letting the ZPU execute the EMULATE instruction
+ <p>
+ One way to improve performance of the ZPU is to implement some of
+ the EMULATE instructions.
+
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ PUSHPC
+ </td>
+ <td>
+ emulated
+ </td>
+ <td>
+ Pushes program counter onto the stack.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ POPPC
+ </td>
+ <td>
+ 0000 0100
+ </td>
+ <td>
+ Pops address off stack and sets PC
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LOAD
+ </td>
+ <td>
+ 0000 1000
+ </td>
+ <td>
+ Pops address stored on stack and loads the value of that address onto stack.
+ <p>
+ Bit 0 and 1 of address are always treated as 0(i.e. ignored) by
+ the HDL implementations and C code is guaranteed by the programming
+ model never to use 32 bit LOAD on non-32 bit aligned addresses(i.e.
+ if a program does this, then it has a bug).
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ STORE
+ </td>
+ <td>
+ 0000 1100
+ </td>
+ <td>
+ Pops address, then value from stack and stores the value into the memory location of the address.
+ <p>
+ Bit 0 and 1 of address are always treated as 0
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ PUSHSP
+ </td>
+ <td>
+ 0000 0010
+ </td>
+ <td>
+ Pushes stack pointer.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ POPSP
+ </td>
+ <td>
+ 0000 1101
+ </td>
+ <td>
+ Pops value off top of stack and sets SP to that value. Used to allocate/deallocate space on stack for variables or when changing threads.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ADD
+ </td>
+ <td>
+ 0000 0101
+ </td>
+ <td>
+ Pops two values on stack adds them and pushes the result
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ AND
+ </td>
+ <td>
+ 0000 0110
+ </td>
+ <td>
+ Pops two values off the stack and does a bitwise-and & pushes the result onto the stack
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ OR
+ </td>
+ <td>
+ 0000 0111
+ </td>
+ <td>
+ Pops two integers, does a bitwise or and pushes result
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ NOT
+ </td>
+ <td>
+ 0000 1001
+ </td>
+ <td>
+ Bitwise inverse of value on stack
+
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ FLIP
+ </td>
+ <td>
+ 0000 1010
+ </td>
+ <td>
+ Reverses the bit order of the value on the stack, i.e. abc->cba, 100->001, 110->011, etc.
+ <p>
+ The raison d'etre for this instruction is mainly to emulate other instructions.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ NOP
+ </td>
+ <td>
+ 0000 1011
+ </td>
+ <td>
+ No operation, clears IDIM flag as side effect, i.e. used between two
+ consecutive IM instructions to push two values onto the stack.
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ PUSHSPADD
+ </td>
+ <td>
+ 61
+ </td>
+ <td>
+ a=sp; <br>
+ b=popIntStack()*4;<br>
+ pushIntStack(a+b);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ POPPCREL
+ </td>
+ <td>
+ 57
+ </td>
+ <td>
+ setPc(popIntStack()+getPc());
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ SUB
+ </td>
+ <td>
+ 49
+ </td>
+ <td>
+ int a=popIntStack();<br>
+ int b=popIntStack();<br>
+ pushIntStack(b-a);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ XOR
+ </td>
+ <td>
+ 50
+ </td>
+ <td>
+pushIntStack(popIntStack() ^ popIntStack());
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LOADB
+ </td>
+ <td>
+ 51
+ </td>
+ <td>
+ 8 bit load instruction. Really only here for compatibility with
+ C programming model. Also it has a big impact on DMIPS test.
+ <p>
+ pushIntStack(cpuReadByte(popIntStack())&0xff);
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ STOREB
+ </td>
+ <td>
+ 52
+ </td>
+ <td>
+ 8 bit store instruction. Really only here for compatibility with
+ C programming model. Also it has a big impact on DMIPS test.
+ <p>
+ addr = popIntStack();<br>
+ val = popIntStack();<br>
+ cpuWriteByte(addr, val);
+</td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LOADH
+ </td>
+ <td>
+ 34
+ </td>
+ <td>
+
+ 16 bit load instruction. Really only here for compatibility with
+ C programming model.
+ <p>
+
+ pushIntStack(cpuReadWord(popIntStack()));
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ STOREH
+ </td>
+ <td>
+ 35
+ </td>
+ <td>
+ 16 bit store instruction. Really only here for compatibility with
+ C programming model.
+ <p>
+addr = popIntStack();<br>
+ val = popIntStack();<br>
+ cpuWriteWord(addr, val);
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LESSTHAN
+ </td>
+ <td>
+ 36
+ </td>
+ <td>
+ Signed comparison<br>
+ a = popIntStack();<br>
+ b = popIntStack();<br>
+ pushIntStack((a < b) ? 1 : 0);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LESSTHANOREQUAL
+ </td>
+ <td>
+ 37
+ </td>
+ <td>
+ Signed comparison<br>
+ a = popIntStack();<br>
+ b = popIntStack();<br>
+ pushIntStack((a <= b) ? 1 : 0);
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ULESSTHAN
+ </td>
+ <td>
+ 38
+ </td>
+ <td>
+ Unsigned comparison<br>
+ long a;//long is here 64 bit signed integer<br>
+ long b;<br>
+ a = ((long) popIntStack()) & INTMASK; // INTMASK is unsigned 0x00000000ffffffff<br>
+ b = ((long) popIntStack()) & INTMASK;<br>
+ pushIntStack((a < b) ? 1 : 0);
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ULESSTHANOREQUAL
+ </td>
+ <td>
+ 39
+ </td>
+ <td>
+ Unsigned comparison<br>
+ long a;//long is here 64 bit signed integer<br>
+ long b;<br>
+ a = ((long) popIntStack()) & INTMASK; // INTMASK is unsigned 0x00000000ffffffff<br>
+ b = ((long) popIntStack()) & INTMASK;<br>
+ pushIntStack((a <= b) ? 1 : 0);
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ EQBRANCH
+ </td>
+ <td>
+ 55
+ </td>
+ <td>
+ int compare;<br>
+ int target;<br>
+ target = popIntStack() + pc;<br>
+ compare = popIntStack();<br>
+ if (compare == 0)<br>
+ {<br>
+ setPc(target);<br>
+ } else<br>
+ {<br>
+ setPc(pc + 1);<br>
+ }
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ NEQBRANCH
+ </td>
+ <td>
+ 56
+ </td>
+ <td>
+ int compare;<br>
+ int target;<br>
+ target = popIntStack() + pc;<br>
+ compare = popIntStack();<br>
+ if (compare != 0)<br>
+ {<br>
+ setPc(target);<br>
+ } else<br>
+ {<br>
+ setPc(pc + 1);<br>
+ }<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ MULT
+ </td>
+ <td>
+ 41
+ </td>
+ <td>
+ Signed 32 bit multiply <br>
+ pushIntStack(popIntStack() * popIntStack());
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ DIV
+ </td>
+ <td>
+ 53
+ </td>
+ <td>
+ Signed 32 bit integer divide.<br>
+ a = popIntStack();<br>
+ b = popIntStack();<br>
+ if (b == 0)<br>
+ {<br>
+ // undefined<br>
+ }
+ pushIntStack(a / b);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ MOD
+ </td>
+ <td>
+ 54
+ </td>
+ <td>
+ Signed 32 bit integer modulo.<br>
+ a = popIntStack(); <br>
+ b = popIntStack();<br>
+ if (b == 0)<br>
+ {<br>
+ // undefined <br>
+ }<br>
+ pushIntStack(a % b); <br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ LSHIFTRIGHT
+ </td>
+ <td>
+ 42
+ </td>
+ <td>
+ unsigned shift right.<br>
+ long shift;<br>
+ long valX;<br>
+ int t;<br>
+ shift = ((long) popIntStack()) & INTMASK;<br>
+ valX = ((long) popIntStack()) & INTMASK;<br>
+ t = (int) (valX >> (shift & 0x3f));<br>
+ pushIntStack(t);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ASHIFTLEFT
+ </td>
+ <td>
+ 43
+ </td>
+ <td>
+ arithmetic(signed) shift left.<br>
+
+ long shift;<br>
+ long valX;<br>
+ shift = ((long) popIntStack()) & INTMASK;<br>
+ valX = ((long) popIntStack()) & INTMASK;<br>
+ int t = (int) (valX << (shift & 0x3f));<br>
+ pushIntStack(t);<br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ ASHIFTRIGHT
+ </td>
+ <td>
+ 43
+ </td>
+ <td>
+ arithmetic(signed) shift left.<br>
+ long shift;<br>
+ int valX;<br>
+ shift = ((long) popIntStack()) & INTMASK;<br>
+ valX = popIntStack();<br>
+ int t = valX >> (shift & 0x3f);<br>
+ pushIntStack(t);<br>
+
+ </td>
+ <td>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ CALL
+ </td>
+ <td>
+ 45
+ </td>
+ <td>
+ call procedure.<br>
+ <br>
+ int address = pop();<br>
+ push(pc + 1);<br>
+ setPc(address); <br>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ CALLPCREL
+ </td>
+ <td>
+ 63
+ </td>
+ <td>
+ call procedure pc relative<br>
+ <br>
+int address = pop();<br>
+ push(pc + 1);<br>
+ setPc(address+pc); </td>
+ <td>
+
+ </td>
+ </tr>
+
+
+ <tr>
+ <td>
+ EQ
+ </td>
+ <td>
+ 46
+ </td>
+ <td>
+ pushIntStack((popIntStack() == popIntStack()) ? 1 : 0); <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ NEQ
+ </td>
+ <td>
+ 47
+ </td>
+ <td>
+ pushIntStack((popIntStack() != popIntStack()) ? 1 : 0); <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ NEG
+ </td>
+ <td>
+ 48
+ </td>
+ <td>
+ pushIntStack(-popIntStack());<td>
+
+ </td>
+ </tr>
+
+
+</table>
+
+<a name="interrupts"/>
+<h2>Interrupts</h2>
+The ZPU supports interrupts.
+<p>
+To trigger an interrupt, the interrupt signal must be asserted. The ZPU does
+not define any interrupt disabling mechanism, this must be implemented by the
+interrupt controller and controlled via memory mapped IO.
+<p>
+Interrupts are masked when the IDIM flag is set, i.e.
+with consecutive IM instructions.
+<p>
+The ZPU has an edge triggered interrupt. As the ZPU notices that the interrupt
+is asserted, it will execute the interrupt instruction. The interrupt signal
+must stay asserted until the ZPU acknowledges it.
+<p>
+When the interrupt instruction is executed, the PC will be pushed onto the
+stack and the PC will be set to the interrupt vector address (0x20).
+<p>
+Note that the GCC compiler requires three registers r0,r1,r2,r3 for some
+rather uncommon operations. These 32 registers are mapped to memory locations 0x0,
+0x4, 0x8, 0xc. The default interrupt vector at address 0x20 will load the
+value of these memory locations onto the stack, call _zpu_interrupt and
+restore them.
+<p>
+See <a href="../hdl/zpu4/test/interrupt/">zpu/hdl/zpu4/test/interrupt/</a> for C code and <a href ="../hdl/example/simzpu_interrupt.do">zpu/hdl/example/simzpu_interrupt.do</a>
+for simulation example.
+
+<a name="startup"/>
+<h2>Custom startup code (aka crt0.s)</h2>
+To minimize the size of an application, one important trick is to
+strip down the startup code. The startup code contains microcode for emulation
+of instructions that may never be used by a particular application, or are made redundant because the instructions are implemented in RTL.
+<p>
+The startup code is found in the GCC source code under gcc/libgloss/zpu,
+but to make the startup code more available, it has been duplicated
+into <a href="../sw/startup">zpu/sw/startup</a>
+<p>
+On the <a href="#todo">TODO</a> list is work to make it easier to reduce code size.
+<p>
+TODO is the following actually useful? if not remove or elaborate.
+<p>
+To minimize startup size, see <a href="../roadshow/roadshow/codesize/">codesize</a>
+demo. This is pretty standard GCC stuff and simple enough once you've
+been over it a couple of times.
+
+
+<a name="vectors"/>
+<h3>Vectors</h3>
+<table border="1">
+ <tr><td>Address</td><td>Name</td><td>Description</td></tr>
+ <tr>
+ <td>0x000</td>
+ <td>Reset</td>
+ <td>
+ 1.When the ZPU boots, this is the first instruction to be executed.
+ <br>
+ 2.The stack pointer is initialised to maximum RAM address
+ </td>
+ </tr>
+ <tr>
+ <td>0x020</td>
+ <td>Interrupt</td>
+ <td>
+ This is the entry point for interrupts.
+ </td>
+ </tr>
+ <tr>
+ <td>0x040-</td>
+ <td>Emulated instructions</td>
+ <td>
+ Emulated opcode 34. Note that opcode 32 and opcode 33 are not normally used to emulate instructions as these memory addresses are already used by boot vector, GCC registers and the interrupt vector.
+ </td>
+ </tr>
+</table>
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<a name="implementations"/>
+<h1>Core Implementations</h1>
+zpu4 (superseding zpu3) are original work by &Oslash;yvind Harboe. All other implementations derive from zpu4.
+<p>
+High on the <a href="#todo">TODO</a> list is to reduce the number of implementations taking the best from all. For example interrupts are not universally implemented, IO naming is inconsistent and memory architectures differ.
+<p>
+Ultimately we should try to get closer to the opencores coding standard. You can find the document in the opencores cvsroot/common.
+<p>
+For now if you are starting a design, zpu4 or zealot are probably the safest. zealot offers more customization through generics, but lacks interrupts. zpu4 gets more attention. Take your pick.
+
+<a name="performance"/>
+<h2>Performance Summary</h2>
+
+<a href="#todo">TODO</a> fill in performance table for Altera.
+<p>
+Tests are done with the <a href="#zealot">Zealot</a>
+ SoC-System and Xilinx ISE 12.2 with standard settings.
+ For the MachXO2 device Lattice Diamond 3.1 with Synplify Pro I-2013.09L was used.
+<p>
+<TABLE WIDTH=604 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=7 CELLSPACING=0 STYLE="page-break-after: avoid">
+ <TR VALIGN=TOP>
+ <TD WIDTH=85> <P><B>CORE/Config</B></P> </TD>
+ <TD WIDTH=85> <P><B>Spartan-3</B></P> </TD>
+ <TD WIDTH=85> <P><B>Spartan-3E</B></P> </TD>
+ <TD WIDTH=85> <P><B>Spartan-6</B></P> </TD>
+ <TD WIDTH=85> <P><B>Virtex-5</B></P> </TD>
+ <TD WIDTH=85> <P><B>MachXO2</B></P> </TD>
+ <TD WIDTH=85> <P><B>DMIPS</B></P> </TD>
+ </TR>
+
+<TR VALIGN=TOP>
+<TD WIDTH=85> <P>
+zpu4 small
+maxAddrBit=16
+</P> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-3 -->
+591 LUT
+389 REG
+ 0 MULT18x18
+ 16 BRAM
+ 90 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-3E -->
+626 LUT
+389 REG
+ 0 MULT18x18
+ 16 BRAM
+100 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-6 -->
+639 LUT
+372 REG
+ 0 MULT18x18
+ 16 BRAM
+100 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Virtex-5 -->
+561 LUT
+391 REG
+ 0 MULT18x18
+ 8 BRAM (RAMB36)
+175 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- MachXO2 -->
+886 LUT4
+459 REG
+
+4 EBR
+75 fmax
+</PRE> </TD>
+<TD WIDTH=85> <!-- DMIPS --> <P>0.5</P> </TD>
+</TR>
+
+<TR VALIGN=TOP> <TD WIDTH=85> <P>zpu4 medium</P> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-3 -->
+1760 LUT
+ 514 REG
+ 3 MULT18x18
+ 16 BRAM (RAMB16)
+ 75 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-3E -->
+1754 LUT
+ 509 REG
+ 3 MULT18x18
+ 16 BRAM (RAMB16)
+ 75 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Spartan-6 -->
+1162 LUT
+ 481 REG
+ 3 MULT (DSP48A1)
+ 16 BRAM (RAMB16)
+ 80 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- Virtex-5 -->
+1299 LUT
+ 490 REG
+ 3 MULT (DSP48E)
+ 8 BRAM (RAMB36)
+ 125 fmax
+</PRE> </TD>
+<TD WIDTH=85> <PRE>
+<!-- MachXO2 -->
+2429 LUT4
+755 REG
+
+4 EBR
+65 fmax
+</PRE> </TD>
+<TD WIDTH=85><!-- DMIPS --><P>2.6</P> </TD>
+</TR>
+
+ </TABLE>
+
+<a name="zpu4_small"/>
+<h2>zpu4 small</h2>
+Found in <a href="../hdl/zpu4/core/zpu_core_small.vhd">zpu/zpu/hdl/zpu4/core/zpu_core_small.vhd</a>
+<p>
+The small ZPU4 implements the minimum instruction set. It is optimized for size and simplicity
+serving as a reference in both regards.
+<p>
+It uses a RAM (dual port RAM w/read/write to both ports) as data & code storage and
+is implemented as a simple state machine.
+<p>
+Essentially it has three states:
+<ol>
+<li>Fetch - starts fetch of next instruction
+<li>FetchNext - sets up operands for execute cycle
+<li>Decode - decodes instruction
+<li>Execute - well.. executes instruction
+</ol>
+The tricky bit is that there is a tiny bit of interleaving of
+states since the BRAM takes a cycle to perform a fetch/store. The above is the
+normal states the ZPU cycles through unless memory fetch, jumps, etc. take
+place.
+
+<a name="zpu4_medium"/>
+<h2>zpu4 medium</h2>
+Found in <a href="../hdl/zpu4/core/zpu_core.vhd">zpu/zpu/hdl/zpu4/core/zpu_core.vhd</a>
+<p>
+The medium ZPU4 has a single port memory interface. All data, code and IO is
+accessed through this memory interface.
+<p>
+It performs better(despite having less memory bandwidth than zpu_core_small.vhd)
+since it implements many more instructions.
+
+<a name="alzpu_pipe"/>
+<h2>Alvaro's pipelined ZPU</h2>
+All the rave in the mailing list. TBA.
+
+<a name="zealot"/>
+<h2>Zealot</h2>
+Small found in <a href="../hdl/zealot/zpu_small.vhdl">zpu/zpu/hdl/zealot/zpu_small.vhdl</a>
+<p>
+Medium found in <a href="../hdl/zealot/zpu_medium.vhdl">zpu/zpu/hdl/zealot/zpu_medium.vhdl</a>
+<p>
+README found in <a href="../hdl/zealot/0README.txt">zpu/zpu/hdl/zealot/0README.txt</a>
+<p>
+The Zealot version of ZPU was contributed by Salvador E. Tropea.
+<p>
+The key features are:
+
+
+<ul>
+<li>Includes a very basic <a href="#memorymap">PHI I/O</a> synthesizable core.
+It implements the 64 bits clocks counter (timer), GPIO and the UART. This is enough
+to run the DMIPS benchmark and a hello world application. I tested the UART
+@ 9600 bps and @ 115200 bps.</li>
+<li>The ZPU can be customized using generics. It allows the use of more
+than one core in the same project without problems.</li>
+<li>Implements the lshiftright instruction in hardware, this gives around
+10% boost in the DMIPS benchmark (Medium version).</li>
+<li>You can disable various instructions groups and let them to the
+emulation soft, so you can experiment with various LUTs vs DMIPS
+configurations (Medium version).</li>
+<li>The medium version provides aprox. 2.6 DMIPS @ 50 MHz and the small
+0.5 DMIPS @ 50 MHz.</li>
+<li>Enhanced trace module, it includes the assembler for the executed
+instruction and can also measure how much stack was consumed during the
+execution.</li>
+<li>Includes ready to use memory images for a hello world program and the
+DMIPS benchmark.</li>
+<li>Memory and trace blocks outside ZPU. This provides better modularity.</li>
+<li>Much better documented code than the original version.</li>
+</ul>
+
+Simulation and implementation files are provided. You need 16 kB of BRAMs
+for the "hello world" example and 32 kB for the DMIPS benchmark. The medium
+version takes around 1030 slices and 3 multipliers and the small version
+around 430 slices.<p>
+
+The generics for the Zealot Medium ZPU are:<p>
+
+<ul>
+<li><b>WORD_SIZE</b> (integer:=32) Data width, only 32 bits are really
+tested/supported. Adding support for 16 bits should be simple, but the
+toolchain needs to support it.</li>
+<li><b>ADDR_W</b> (integer:=16) Address bus width memory+I/O space. The MSB
+selects the address space (1=I/O).</li>
+<li><b>MEM_W</b> (integer:=15) Memory address bus width. It includes program,
+data and stack sections.</li>
+<li><b>D_CARE_VAL</b> (std_logic:='X') Value used to fill the unsused bits.
+For simulations this should be '0', for synthesis this is a value that your
+tools interprets as "don't care". Xilinx tools could get benefit from using
+'X'. This is particularly true to assign default values and for unreached
+cases. Note that I didn't find it useful.</li>
+<li><b>MULT_PIPE</b> (boolean:=false) Enables the multiplication pipeline.
+This can allow faster clocks but will make the mult instruction slower (more
+clocks consumed).</li>
+<li><b>BINOP_PIPE</b> (integer range 0 to 2:=0) Enables the pipeline for
+the -, =, &lt; and &lt;= operations. This can allow faster clocks but will
+make these instruction slower (more clocks consumed). This value is the
+amount of extra clocks added.</li>
+<li><b>ENA_LEVEL0</b> (boolean:=true) Enables the hardware implementation of
+eq, neqbranch, loadb and pushspadd instructions.</li>
+<li><b>ENA_LEVEL1</b> (boolean:=true) Enables the hardware implementation of
+lessthan, ulessthan, mult, storeb, callpcrel and sub instructions.</li>
+<li><b>ENA_LEVEL2</b> (boolean:=false) Enables the hardware implementation of
+lessthanorequal, ulessthanorequal, call and poppcrel instructions.</li>
+<li><b>ENA_LSHR</b> (boolean:=true) Enables the hardware implementation of
+lshiftright instruction.</li>
+<li><b>ENA_IDLE</b> (boolean:=false) Enables the enable_i usage. This signal
+can hold the CPU in an idle state if after reset this signal remains active.
+When disabled the enable_i signal isn't used and the idle state is removed.</li>
+<li><b>FAST_FETCH</b> (boolean:=true) This version of the ZPU fetches 4
+instructions at ones (32 bits), then they are decoded (2 cycles) and finally
+executed. The decoded instructions are stored in a "decode cache", the first
+instruction is immediately moved to the "current instruction" register and a
+"special instruction" replaces the first slot. This "special instruction"
+makes the CPU go to the fetch state. When you enable this generic the FSM
+does the fetch instead of waiting one clock cycle to go to the fetch state.
+This makes instructions run a little bit faster, but it can cost area and/or
+frequency.</li>
+</ul>
+
+
+<a name="zy2000"/>
+<h2>ZY2000</h2>
+Found in <a href="../hdl/zy2000/zpu_core.vhd">zpu/zpu/hdl/zy2000/zpu_core.vhd</a>
+Modified version of zpu4 medium for use with a wishbone bridge.
+<p>
+The ZY2000 is a complete implementation including: ZPU, DRAM, soft-MAC, wishbone bridges, GPIO subsystem, etc. This also included an eCos HAL w/TCP/IP support.
+
+<a name="verilogwip"/>
+<h2>Verilog translation</h2>
+Found in <a href="../../wip/ZPU_CORE/src/zpu_core.v">zpu/wip/ZPU_CORE/src/zpu_core.v</a>
+<p>
+The verilog version of ZPU (zpu4) was contributed by Jurij Kostasenko. No-one appears to be maintaining it, but it should be a useful starting point for further work. There are some useful scripts there.
+
+<a name="implementing"/>
+<h2>Implementing your own ZPU</h2>
+One of the neat things about the ZPU is that the instruction set and architecture
+is very small and it is easy to implement a ZPU from scratch or modify the
+existing ZPU implementations.
+<p>
+Implementing a ZPU can be done without understanding the toolchain in
+detail, i.e. using exclusively HDL skills and only a rudimentary
+understanding of standard GCC/GDB usage is sufficient.
+<p>
+A few tips:
+<ul>
+<li>Run zpu_core.vhd or zpu_core_small.vhd and generate an instruction trace
+from ModelSim or similar. To check that you own implementation is correctly
+implemented, verify that the instruction trace for the new and old
+ZPU implementations match. This gives you a simple way to do regression
+tests as you develop your ZPU.
+<li>To improve performance, you can add more instructions. The EMULATE instructions
+are optional in HDL since they will be emulated in software if they are not
+implemented in HDL. This allows you to run the ZPU executables unmodified
+regardless of which EMULATE instructions you implement.
+<li>Run the DMIPS test to measure your overall performance
+<li>Run the histogram.perl script on the instruction trace to generate
+histograms of the instructions. Profiling is essential to making
+the right choices w.r.t. optimization for your application.
+</ul>
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+
+<a name="refdesign"/>
+<h1>Reference Designs</h1>
+The zpu core is independent of IO and memory architecture. Here are three levels of reference designs a user can refer to in order to get started in their own design, regardless of chosen core.
+<p>
+TODO converge on a single IO structure for core implementations.
+<p>
+TODO re-org CVS to make it easy to keep appropriate SW, RTL(verilog and VHDL) , scripts, verification stuff together.
+<p>
+
+<a name="ref_min"/>
+<h2>Minimal (core+RAM)</h2>
+The minimum design is a zpu core with true dual port RAMs attached. This is handy for size/fmax trial in a particular FPGA, and maybe HDL regression. Maybe not a very useful starting point, unless you can DMA all you IO.
+<p>
+TODO provide FPGA scripts.
+<p>
+TODO provide HDL regression environment.
+
+<a name="ref_basic"/>
+<h2>Basic (core+RAM+UART+Timer)</h2>
+The minimum design required for hello_world and DMIPS applications. Requires more RAM and a UART (or something) for stdio. This is handy as a starting point for a new users design, and to run DMIPS evaluation, and maybe HDL regression.
+<p>
+TODO provide FPGA scripts.
+<p>
+TODO provide HDL regression environment.
+
+<a name="ref_soc"/>
+<h2>SOC (core+RAM+Wishbone+++)</h2>
+Large design(s) for one or more chosen eval board. Features dictated by board and available IP.
+
+<a name="rams"/>
+<h2>Common - RAM models</h2>
+single (1RW), simple dual(1R+1W), true dual(1RW+1RW), and xilinx distributed dual(1RW+1R) RAM models. Parameterized depth / width, and loadable from file. The goal is that ROM be independent of verilog/VHDL implementation of RAM.
+<p>
+TODO RAM model contribution needed. What is in opencore/common is not adequate.
+
+<a name="wishbone"/>
+<h2>Common - Wishbone</h2>
+In <a href="../hdl/wishbone" target="_blank">hdl/wishbone</a> there is an implementation
+of a wishbone bridge. It was designed to work with <a href="#zy2000">ZY2000</a>
+<p>
+TODO make wishbone bridge re-usable with all cores
+
+<a name="uart"/>
+<h2>Common - UART</h2>
+
+All self respecting embedded projects should have a debug channel
+to print stuff to. Typically this is a standard RS232 or UART, but
+it can also be something more exotic like a DCC JTAG channel.
+<p>
+The point is that characters(bytes) are sent to/from the ZPU
+via some terminal.
+<p>
+The ZPU defines in the memory map a UART / debug channel. This
+should be implemented by some suitable debug channel for
+the device in which the ZPU is implemented.
+<p>
+www.opencores.org has several UART implementations. This is one
+of the simpler ones:
+
+<a href="http://www.opencores.org/projects.cgi/web/uart/overview">
+http://www.opencores.org/projects.cgi/web/uart/overview</a>
+<h3>Implementing your own UART / debug channel</h3>
+The first thing you need to do is to choose a debug channel for your
+hardware. This could be a UART, but it doesn't have to be.
+<p>
+Secondly you should write a small HDL module that interface between
+the ZPU memory map of debug channel to the UART. This should
+ be relatively simple as all you need to do is to let the ZPU
+ query the FIFO in/out for busy flag and allow the ZPU to read/write
+ data to the UART via the memory map.
+
+<p>
+TODO explicit example with UART from opencores in the above ref designs.
+
+<!-- SPI controller -->
+<a name="spicontroller">
+<h2>SPI flash controller (read-only)</h2>
+This is a simple read-only SPI flash controller, with the following characteristics:
+
+<dl>
+ <li>Fast-READ only implementation.
+ <li>32-bit only access
+ <li>Fast sequential read access - Uses low-clock approach</li>
+</dl>
+
+<h3>Version</h3>
+The current version is 1.2. This is also the first public version available.
+
+<h3>Timing overview</h3>
+
+<p>Simple timing overview, with one nonsequential access to address 0x0, followed by a sequential access to address 0x4.
+This simulation was done with Xilinx tools, after post-routing, and using a ZPU to access the SPI</p>
+<div>
+<img src="images/spi_timing_overview.png">
+</a>
+<p>Image 1: Timing overview</p>
+</div>
+
+On Image 2, you can see the clock almost perfectly centered on data, when we write to the SPI flash.
+
+<div>
+<img src="images/spi_readfast_timing.png">
+<p>Image 2: Issuing commands to the SPI</p>
+</div>
+
+As you can see from Image 3, I assume the worst-case read delay from SPI (which is 15ns, as you can see from the marker).
+
+<div>
+<img src="images/spi_read_timing.png">
+<p>Image 3: Reading from the SPI</p>
+</div>
+
+<h3>Usage</h3>
+
+Simple description of SPI controller interface:
+
+<table border="1">
+<tr>
+ <th>Symbol</th>
+ <th>Direction</th>
+ <th>Bit width</th>
+ <th>Purpose</th>
+</tr>
+<tr><td>adr</td><td>Input</td><td>24</td><td>Address where to read from SPI</td></tr>
+<tr><td>dat_o</td><td>Output</td><td>32</td><td>Data read from SPI</td></tr>
+<tr><td>clk</td><td>Input</td><td>1</td><td>Input clock. Used for both interface and SPI</td></tr>
+<tr><td>ce</td><td>Input</td><td>1</td><td>Chip Enable</td></tr>
+<tr><td>rst</td><td>Input</td><td>1</td><td>Asynchronous reset</td></tr>
+<tr><td>ack</td><td>Output</td><td>1</td><td>Data valid ACK</td></tr>
+<tr><td>SPI_CLK</td><td>Output</td><td>1</td><td>SPI output clock</td></tr>
+<tr><td>SPI_MOSI</td><td>Output</td><td>1</td><td>SPI output data from controller to chip</td></tr>
+<tr><td>SPI_MISO</td><td>Input</td><td>1</td><td>SPI input data from chip to controller</td></tr>
+<tr><td>SPI_SELN</td><td>Output</td><td>1</td><td>SPI nSEL (deselect, active low) signal</td></tr>
+</table>
+
+<h3>License</h3>
+The Verilog implementation is released under BSD license. See the file itself for more licensing details.
+
+<h3>Dowload</h3>
+Download the Verilog code here: <a href="/files/electronics/spi/spi_controller.v">spi_controller.v</a>
+
+<h3>Troubleshooting</h3>
+The current implementation is timed and optimized for myself. Your parameters might not be the same
+as those I defaulted, so read the code carefully. If you have any issue let me know.
+
+
+
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<a name="tools"/>
+<h1>Working with the tools and core</h1>
+TODO discussion of tools needed and choose some to be supported by project. Need to deal with cygwin vs linux, VHDL vs verilog, open vs closed.... plus language support in simulators is sometimes lacking.
+<p>
+Xilinx ISE webpack is available for windows and linux
+<br>
+Altera Quartus web edition is windows only.
+<br>
+Lattice ispLEVER starter edition is windows only.
+<p>
+None appear to come with a standalone simulator anymore. Not sure if any built in simulators are worth looking at... never have been in the past.
+
+<p>
+Popular Simulation tools for this kind of project: Modelsim, GHDL, veriwell, cver, icarus, gtkwave... others?
+<p>
+
+<a name="setuplinux"/>
+<h2>Setup - Linux toolchain</h2>
+You will need Java installed to run the simulator and some other stuff.
+<p>
+TODO setup.sh script needs to detect linux/cygwin, and should have install path option.
+<pre>
+$ cd zpu/zpu/sw # path as appropriate
+$ sh setup.sh # untars the tool chain to ... TODO
+$ . env.sh # puts the tools in you path
+</pre>
+
+<a name="setupcygwin"/>
+<h2>Setup - Cygwin toolchain</h2>
+Install <a href="http://www.cygwin.com">Cygwin</a>
+You will need Java installed to run the simulator and some other stuff.
+<pre>
+$ cd zpu/zpu/sw # path as appropriate
+$ sh setup.sh # unzips the tool chain to /tmp/zpu/install/bin
+$ . env.sh # puts the tools in you path
+</pre>
+
+<a name="gcc2ram"/>
+<h2>GCC to RAM</h2>
+TODO some of this is generic, some is zpu4 specific. Should move to refdesign section when ref designs exist.
+<p>
+The instructions are stored big endian. That is the first instruction is stored in the most significant byte, and the forth is in the least significant byte.
+<p>
+<h3>Generating VHDL BRAM initialization </h3>
+<pre>
+$ zpu-elf-objcopy -O binary hello.elf hello.bin
+$ java -classpath ../simulator/zpusim.jar com.zylin.zpu.simulator.tools.MakeRam hello.bin &gt;hello.bram
+</pre>
+<h3>Build another test application for example simulation</h3>
+Here is how to build a rom image for an application using the
+zpu/example simulation files.
+<pre>
+$ cd zpu/roadshow/roadshow/dhrystone
+$ sh build.sh
+$ cd zpu/hdl/example
+$ gcc zpuromgen.c
+$ ./a
+Usage: ./a binary_file
+$ ./a ../../roadshow/roadshow/dhrystone/dhrystone.bin >app.txt
+</pre>
+Copy and paste app.txt into helloworld.vhd.
+
+<p>
+TODO need to merge following with above.
+<p>
+
+The ZPU comes with a standard GCC toolchain and an instruction set simulator. This allows compiling, running & debugging simple test programs. The Simulator has
+some very basic peripherals defined: counter, timer interrupt and a debug output port.
+
+<h3>Hello world example</h3>
+The ZPU toolchain comes with newlib & libstdc++ support which means that many C/C++ programs can be compiled without modification.
+<p>
+<pre>
+$ cd zpu/sw/helloworld
+$ zpu-elf-gcc -Os -phi hello.c -o hello.elf -Wl,--relax -Wl,--gc-sections
+or ? TODO which one
+$ zpu-elf-gcc -phi hello.c -o hello.elf
+$ zpu-elf-size hello.elf
+</pre>
+
+
+<a name="hdlsim"/>
+<h2>HDL simulation (ZPU4)</h2>
+TODO some of this is generic, some is zpu4 specific. Should move to refdesign section when ref design exists.
+<p>
+For new users you will also find scripts in the zealot area that may be useful.
+<p>
+You'll find a working simulation script in hdl/example/simzpu_small.do and hdl/example_medium/simzpu_medium.do, which
+show simulation of the small(zpu_core_small.vhd) and medium sized ZPU(zpu_core.vhd). hdl/example/simzpu_interrupt.do
+shows use of interrupts.
+<p>
+When implementing the ZPU, copy the following files and modify them to your needs:
+<ol>
+ <li>hdl/example/zpu_config.vhd - set up RAM size here
+ <li>hdl/example/helloworld.vhd - dual port BRAM implementation.
+</ol>
+Obviously you must also connect the ZPU to the rest of your IO subsystem. IO is memory mapped(read/write) in the ZPU.
+
+<h3>Running example simulation</h3>
+The hdl/example directory has a simulation written for Xilinx WebPack ModelSim. From the ModelSim command prompt:
+<ol>
+<li>cd c:/&lt;installfolder&gt;/hdl/example
+<li>do zpusim_small.do
+</ol>
+<p>
+After running the hello world simulation (see zpusim.do), two files are written to the hdl/example directory:
+<ol>
+<li>log.txt - contains the "Hello world!" text written to the debug channel/simplified UART.
+<li>trace.txt - a trace file for the CPU. The instruction set simulator has the capability of taking
+this file as input in order to verify that the HDL implementation matches the instruction set simulator.
+When a mismatch is found, the GDB debugger will break. Very handy for debugging custom ZPU implementations.
+</ol>
+
+
+<a name="gdbsim"/>
+<h2>GDB simulation</h2>
+<ol>
+<li>cd zpu/sw/helloworld
+<li>Launch the simulator from a seperate bash shell:<p>
+java -classpath ../simulator/zpusim.jar -Xmx512m com.zylin.zpu.simulator.Phi 4444
+<p>
+<img src="images/zpusim.PNG" border=0>
+<li>Launch GDB:<p>
+../install/bin/zpu-elf-gdb hello.elf
+<li>Connect to target, load and run application:<p>
+<pre>
+(gdb) target remote localhost:4444<br>
+(gdb) load<br>
+(gdb) continue<br>
+</pre>
+<p>
+<img src="images/gccgdb.PNG">
+
+</ol>
+
+
+<a name="simulator"/>
+<h1>Simulator</h1>
+<P>The ZPU simulator is integrated into the Zylin Embedded CDT plugin
+to ease debugging of ZPU applications:</P>
+<P><A HREF="http://www.zylin.com/embeddedcdt.html">http://www.zylin.com/embeddedcdt.html</A></P>
+<P>The ZPU simulator has many features besides debugging an
+application:</P>
+<UL>
+ <LI><P STYLE="margin-bottom: 0in">taking output from simulation(e.g.
+ ModelSim) and matching that against the Java simulator, thus making
+ it much easier to debug HDL implementations and also getting real
+ world timing information
+ </P>
+ <LI><P STYLE="margin-bottom: 0in">can generate gprof output
+ </P>
+ <LI><P>generate various statistics
+ </P>
+</UL>
+<P>The plugin is still pretty rough around the edges, and needs to
+get GUI support for enabling the ModelSim trace input feature.</P>
+<P ALIGN=CENTER><IMG SRC="images/compile.PNG" NAME="graphics7" ALIGN=BOTTOM WIDTH=669 HEIGHT=302 BORDER=0><BR><I>Compiling
+ZPU application</I></P>
+<P ALIGN=CENTER><IMG SRC="images/simulator.PNG" NAME="graphics9" ALIGN=BOTTOM WIDTH=722 HEIGHT=583 BORDER=0><BR><I>Setting
+up the simulator</I></P>
+<P ALIGN=CENTER><IMG SRC="images/simulator2.PNG" NAME="graphics11" ALIGN=BOTTOM WIDTH=722 HEIGHT=583 BORDER=0><BR><I>Choosing
+ZPU executable</I></P>
+<P ALIGN=CENTER STYLE="margin-bottom: 0in"><IMG SRC="images/simulator3.PNG" NAME="graphics13" ALIGN=BOTTOM WIDTH=1100 HEIGHT=720 BORDER=0><BR><I>Debug
+session</I></P>
+<P STYLE="margin-bottom: 0in"><BR>
+</P>
+
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<a name="misc"/>
+<h1>Misc</h1>
+TODO Stuff that could probably find a better home.
+
+<a name="tuning"/>
+<h2>Speeding up the ZPU</h2>
+There are two aspects of speeding up the ZPU: making it perform better
+for a particular application and toying around with the ZPU architecture.
+<h3>Performance tips</h3>
+<ol>
+<li>Profile. Create a small sample and run in a simulator that is as close
+to the real deployment as possible. zpu4/core/histogram.perl is a script
+that will tell you which instructions take the most time.
+<li> Using the profile output, decide on which emulated instructions that
+it makes sense to implement in HDL for your particular application. Modifying
+zpu_core_small.vhd is not particularly hard. Most instructions can be
+transliterated into zpu_core_small.vhd from zpu_core.vhd without too much
+problem.
+<li>The memory subsystem may well turn out to be where you should concentrate
+your efforts.
+</ol>
+<h3>Toying around with the architecture</h3>
+Again: profile 90% of the time and spend the remaining 10% tinkering
+with the architecture.
+<ul>
+<li>There is a DMIPS program you can use to measure the performance of
+the ZPU in lieu of profiling a real application. The latter is obviously
+a superior solution.
+<li>Again: use histogram.perl to figure out which instructions you should add
+in HDL.
+<li>Tinker a bit with Fmax to find the maximum speed rating for your design.
+<li>zpu_core_small.vhd should be ca. 1 DMIPS and zpu_core.vhd should yield
+about 5-10 DMIPS before adding instructions runs out of steam.
+</ul>
+If you need to get ca. 20-50 DMIPS out of the ZPU you will have to
+write a heavily pipelined architecture with caches(if you are running
+against DRAM). This is *tricky*, but some proof of concept work was
+done to show 20 DMIPS w/the ZPU(the actual result was discarded since
+it was not complete and contained fatal flaws).
+<p>
+Achieving above 50-100 DMIPS with the current ZPU architecture is probably
+a non-starter and a more conventional RISC design makes more sense here.
+<p>
+The unique advantages of the ZPU is size in terms of HDL & code size.
+
+
+
+<a name="codesize"/>
+<h2>Optimizing for code size</h2>
+The ZPU toolchain produces highly compact code.
+<ol>
+<li>Since the ZPU GCC toolchain supports standard ANSI C, it is easy to stumble across
+functionality that takes up a lot of space. E.g. the standard printf() function is a beast. Some compilers drop e.g. floating point support
+from the printf() function and thus boast a "smaller" printf() when in fact they have a non-standard printf(). newlib has a standard printf() function
+and an alternative iprintf() function that works only on integers.
+<li>The ZPU ships with default startup code that works across various configurations of the ZPU, so be warned that there is some overhead that will
+not occur in the final application(anywhere between 1-4kBytes).
+<li>Compilation and linker options matter. The ZPU benefits greatly from the "-Wl,--relax -Wl,--gc-sections" options which is not used by
+all architectures(e.g. GCC ARM does not implement/need -Wl,--relax).
+</ol>
+<h3>Small code example</h3>
+<code>
+zpu-elf-gcc -Os -abel smallstd.c -o smallstd.elf -Wl,--relax -Wl,--gc-sections<br>
+zpu-elf-size small.elf<br>
+<br>
+$ zpu-elf-size small.elf<br>
+ text data bss dec hex filename<br>
+ 2845 952 36 3833 ef9 small.elf<br>
+<br>
+</code>
+
+<h3>Even smaller code example</h3>
+If the ZPU implements the optional instructions, the RAM overhead can be reduced significantly.
+<p>
+<code>
+zpu-elf-gcc -Os -abel crt0_phi.S small.c -o small.elf -Wl,--relax -Wl,--gc-sections -nostdlib <br>
+zpu-elf-size small.elf<br>
+<br>
+$ zpu-elf-size small.elf<br>
+ text data bss dec hex filename<br>
+ 56 8 0 64 40 small.elf<br>
+ <br>
+</code>
+
+<a name="ecos"/>
+<h2>Installing eCos build tools</h2>
+<code>
+tar -xjvf ecossnapshot.tar.bz2<br>
+tar -xjvf repository.tar.bz2<br>
+tar -xjvf ecostools.tar.bz2<br>
+# run this every time you open the shell<br>
+export PATH=$PATH:`pwd`/ecos-install<br>
+export ECOS_REPOSITORY=`pwd`/ecos/packages:`pwd`/repository<br>
+</code>
+<h3>Compiling eCos tests</h3>
+<code>
+ecosconfig new phi default<br>
+ecosconfig tree<br>
+make<br>
+cd kernel/current<br>
+make tests<br>
+</code>
+
+<h2>Code size ZPU</h2>
+<pre>
+$ zpu-elf-size *
+ text data bss dec hex filename
+ 15761 1504 12060 29325 728d bin_sem0
+ 16907 1512 14436 32855 8057 bin_sem1
+ 17105 1524 30032 48661 be15 bin_sem2
+ 17186 1512 14436 33134 816e bin_sem3
+ 18986 1500 12036 32522 7f0a clock0
+ 15812 1504 13236 30552 7758 clock1
+ 25095 1972 13224 40291 9d63 clockcnv
+ 16437 1500 13224 31161 79b9 clocktruth
+ 15762 1504 12060 29326 728e cnt_sem0
+ 17124 1512 14436 33072 8130 cnt_sem1
+ 35947 1564 22512 60023 ea77 dhrystone
+ 16428 1500 13228 31156 79b4 except1
+ 15751 1504 12052 29307 727b flag0
+ 19145 1512 15624 36281 8db9 flag1
+ 20053 1516 102908 124477 1e63d fptest
+ 15998 1496 12092 29586 7392 intr0
+ 16080 1496 12200 29776 7450 kalarm0
+ 15327 1496 12036 28859 70bb kcache1
+ 15549 1496 13224 30269 763d kcache2
+ 18291 1500 12260 32051 7d33 kclock0
+ 16231 1500 13232 30963 78f3 kclock1
+ 16572 1496 13228 31296 7a40 kexcept1
+ 15618 1496 12060 29174 71f6 kflag0
+ 19287 1500 15624 36411 8e3b kflag1
+ 16887 1516 15628 34031 84ef kill
+ 16186 1496 12128 29810 7472 kintr0
+ 19724 1504 14516 35744 8ba0 klock
+ 18283 1500 14592 34375 8647 kmbox1
+ 15539 1496 12064 29099 71ab kmutex0
+ 16524 1504 15664 33692 839c kmutex1
+ 18272 1712 20348 40332 9d8c kmutex3
+ 18682 1608 20352 40642 9ec2 kmutex4
+ 15619 1496 14412 31527 7b27 ksched1
+ 15567 1496 12060 29123 71c3 ksem0
+ 17063 1500 14436 32999 80e7 ksem1
+ 15504 1496 13228 30228 7614 kthread0
+ 16167 1496 14412 32075 7d4b kthread1
+ 18281 1512 14580 34373 8645 mbox1
+ 20611 1508 14940 37059 90c3 mqueue1
+ 15672 1504 12064 29240 7238 mutex0
+ 16678 1516 15664 33858 8442 mutex1
+ 17694 1508 16868 36070 8ce6 mutex2
+ 18203 1720 20344 40267 9d4b mutex3
+ 16352 1508 14428 32288 7e20 release
+ 15890 1500 14412 31802 7c3a sched1
+ 44196 1612 286332 332140 5116c stress_threads
+ 17891 1524 16864 36279 8db7 sync2
+ 16943 1512 15644 34099 8533 sync3
+ 15467 1496 13064 30027 754b thread0
+ 16134 1496 14420 32050 7d32 thread1
+ 17560 1512 15636 34708 8794 thread2
+ 16279 1500 24028 41807 a34f thread_gdb
+ 17051 1504 20376 38931 9813 timeslice
+ 17146 1504 21564 40214 9d16 timeslice2
+ 37313 1512 422380 461205 70995 tm_basic
+</pre>
+<h3>Code size ARM (non-thumb)</h3>
+Thumb does not compile out of the box w/AT91 EB40a for which this test was made.<p>
+<pre>
+$ arm-elf-size *
+ text data bss dec hex filename
+ 25204 692 16976 42872 a778 bin_sem0
+ 26644 700 22096 49440 c120 bin_sem1
+ 26996 712 55584 83292 1455c bin_sem2
+ 27008 700 22100 49808 c290 bin_sem3
+ 28992 688 16944 46624 b620 clock0
+ 25456 692 19532 45680 b270 clock1
+ 34572 1160 19520 55252 d7d4 clockcnv
+ 26224 688 19508 46420 b554 clocktruth
+ 25204 692 16976 42872 a778 cnt_sem0
+ 26888 700 22108 49696 c220 cnt_sem1
+ 44180 752 27416 72348 11a9c dhrystone
+ 26088 688 19520 46296 b4d8 except1
+ 25236 692 16968 42896 a790 flag0
+ 29532 700 24668 54900 d674 flag1
+ 29508 704 109652 139864 22258 fptest
+ 25932 684 17016 43632 aa70 intr0
+ 25824 684 17112 43620 aa64 kalarm0
+ 24728 684 16956 42368 a580 kcache1
+ 25168 684 19512 45364 b134 kcache2
+ 28112 688 17168 45968 b390 kclock0
+ 25976 688 19524 46188 b46c kclock1
+ 26372 684 19512 46568 b5e8 kexcept1
+ 25140 684 16968 42792 a728 kflag0
+ 29824 688 24660 55172 d784 kflag1
+ 26896 704 24656 52256 cc20 kill
+ 26088 684 17028 43800 ab18 kintr0
+ 30812 692 22176 53680 d1b0 klock
+ 28504 688 22260 51452 c8fc kmbox1
+ 24984 684 16984 42652 a69c kmutex0
+ 26504 692 24704 51900 cabc kmutex1
+ 28792 900 34892 64584 fc48 kmutex3
+ 29264 796 34896 64956 fdbc kmutex4
+ 25240 684 22084 48008 bb88 ksched1
+ 25044 684 16968 42696 a6c8 ksem0
+ 26988 688 22100 49776 c270 ksem1
+ 25028 684 19512 45224 b0a8 kthread0
+ 25996 684 22080 48760 be78 kthread1
+ 28552 700 22252 51504 c930 mbox1
+ 31324 696 22612 54632 d568 mqueue1
+ 25108 692 16980 42780 a71c mutex0
+ 26464 704 24700 51868 ca9c mutex1
+ 27624 696 27280 55600 d930 mutex2
+ 28596 908 34884 64388 fb84 mutex3
+ 26156 696 22100 48952 bf38 release
+ 25460 688 22084 48232 bc68 sched1
+ 56356 828 45892 103076 192a4 stress_threads
+ 27900 712 27288 55900 da5c sync2
+ 26760 700 24692 52152 cbb8 sync3
+ 24924 684 19356 44964 afa4 thread0
+ 25868 684 22084 48636 bdfc thread1
+ 27452 700 24680 52832 ce60 thread2
+ 26136 688 42704 69528 10f98 thread_gdb
+ 27212 692 34916 62820 f564 timeslice
+ 52728 700 123332 176760 2b278 tm_basic
+</pre>
+
+<a name="memorymap"/>
+<h2>Phi memory map</h2>
+TODO This probably belongs in the refdesign section. For now leaving it here because zealot refers to it. Not sure what else uses it.
+<p>
+The ZPU architecture does not define a memory map as such, but the GCC + libgloss + ecos hal library uses the
+memory map below. "Phi" is just a three letter word for the particular memory layout below that came about
+while developing the ZPU.
+<p>
+ <TABLE WIDTH=604 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=7 CELLSPACING=0 STYLE="page-break-after: avoid">
+ <COL WIDTH=85>
+ <COL WIDTH=42>
+ <COL WIDTH=136>
+ <COL WIDTH=283>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2><B>Address</B></FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2><B>Type</B></FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2><B>Name</B></FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2><B>Description</B></FONT></FONT></P>
+ </TD>
+ </TR>
+
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0000</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">ZPU
+ enable</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:1] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Enable ZPU operations</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 ZPU
+ is held in Idle mode</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 ZPU
+ running</FONT></FONT></P>
+ </TD>
+ </TR>
+
+
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0004</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read/</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">GPIO data</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit [31:0] input data 31:0</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit [31:0] output data 31:0</FONT></FONT></P>
+ </TD>
+ </TR>
+
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0008</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read/</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">GPIO direction</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit [31:0] data direction 31:0</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0 output</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">1 input (default)</FONT></FONT></P>
+ </TD>
+ </TR>
+
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A000C</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read/</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">ZPU
+ Debug channel / UART to ARM7 TX</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"><B>NOTE!
+ ZPU side</B></FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:9] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [8] TX buffer ready (valid on ready)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 TX
+ buffer not ready (full)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 TX
+ buffer ready</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [7:0] TX byte (valid on write)</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0010</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">ZPU
+ Debug channel / UART to ARM7 RX</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"><B>NOTE!
+ ZPU side</B></FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:9] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [8] RX buffer data valid</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 RX
+ buffer not valid</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 RX
+ buffer valid</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [7:0] RX byte (when valid)</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0014</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read/</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Counter(1)</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Reset counter (valid for write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 N/A</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Reset
+ counter</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [1] Sample counter (valid for write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 N/A</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Sample
+ counter</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:0] Counter bit 31:0</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0018</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Counter(2)</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:0] Counter bit 63:32</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0020</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read
+ / Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Global_Interrupt_mask</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:1] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Global intr. Mask</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 Interrupts
+ enabled</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupts
+ disabled</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0024</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">UART_INTERRUPT_ENABLE</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:1] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Debug channel / UART RX interrupt enable</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 Interrupt
+ disable</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ enable</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0028</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">UART_interrupt</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:1] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Debug channel / UART RX interrupt pending (Read)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 No
+ interrupt pending</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ pending</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Clear UART interrupt (Write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 N/A</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ cleared</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A002C</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Timer_Interrupt_enable</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:1] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Timer interrupt enable</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 Interrupt
+ disable</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ enable</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0030</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read
+ /</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Timer_interrupt</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:2] Not used</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Timer interrupt pending (Read)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 No
+ interrupt pending</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ pending</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [1] Reset Timer counter (Write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 N/A</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Timer
+ counter reset</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [0] Clear Timer interrupt (Write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 0 N/A</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> 1 Interrupt
+ cleared</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">0x080A0034</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Write</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Timer_Period</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:0] Interrupt period (write)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> Number
+ of clock cycles</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"> between
+ timer interrupts</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt"><B>NOTE!
+ </B>The timer will start at Timer_Periode value and count <B>down</B>
+ to zero, and generate an interrupt</FONT></FONT></P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">.0x080A0038</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Read</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Timer_Counter</FONT></FONT></P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><FONT FACE="Arial, sans-serif"><FONT SIZE=2 STYLE="font-size: 9pt">Bit
+ [31:0] Timer counter (read)</FONT></FONT></P>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ </TR>
+ <TR VALIGN=TOP>
+ <TD WIDTH=85>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ <TD WIDTH=42>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=136>
+ <P LANG="en-US" CLASS="western" ALIGN=CENTER><BR>
+ </P>
+ </TD>
+ <TD WIDTH=283>
+ <P LANG="en-US" CLASS="western"><BR>
+ </P>
+ </TD>
+ </TR>
+ </TABLE>
+
+<hr> <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<a name="todo"/>
+<h1>TODO</h1>
+
+<a name="todolist"/>
+<h2>TODO list</h2>
+<ul>
+<li>fix the TODO in this doc that are just doc fixes
+<li>organize the TODO list by priority and assign responsibility... if there are takers.
+<li>converge on a single IO for core implementations.
+<li>fill in performance table for Altera and Lattice.
+<li>re-org CVS to make it easy to keep appropriate SW, RTL(verilog and VHDL) , scripts, verification stuff together. separation of tools, core, common, and ref design
+<li>provide FPGA scripts.
+<li>provide HDL regression environment.
+<li>RAM model contribution needed. What is in opencore/common is not adequate.
+<li>make wishbone bridge re-usable with all cores
+<li>explicit example with UART from opencores in the above ref designs.
+<li>discussion of tools needed and choose some to be supported by project. Need to deal with cygwin vs linux, VHDL vs verilog, open vs closed.... plus language support in simulators is sometimes lacking.
+<li>setup.sh script needs to detect linux/cygwin, and should have install path option.
+<li>shaping up the www.opencores.org pages.
+<li>BSD and GPL licenses in the appropriate places.
+<li>Currently there exists some pages at <A HREF="http://www.zylin.com/zpu.htm">http://www.zylin.com/zpu.htm</A> that explains about the ZPU. According to OpenCores policy this information should be moved to www.opencores.org. Patches gratefully accepted to do so!
+<li>eCos HAL could be less RAM hungry
+<li>Needs GDB stub support in eCos
+<li>Could do with a Verilog implementation(ca. 600 lines to translate)
+<li>Make little endian throughout. Currently instructions are stored big endian, loadb and storeb are big endian, but the data bus is treated as little endian. Creates some problems in type conversion.
+</ul>
+
+<a name="repository"/>
+<h2>Repository Re-org</h2>
+I am proposing the following structure for the repository. It follows somewhat the way I've organized this document with seperation of core, common, and three SOC ref designs. New users go straight to the SOC that best matches their needs.
+<pre>
+zpu/bin # scripts and toolchain? Want toolchain installed with project. Tidier when working in multi user / multi project environment
+zpu/doc #
+zpu/core/rtl # RTL for the various core implementations.
+zpu/core/sw # crt0.s ?
+zpu/common/rtl # Re-use RTL such as RAM and UART
+zpu/common/sim # Re-use RTL and tools for regresion testing
+zpu/common/sw # ?
+zpu/soc/minimal # Three levels of ref designs described above
+ /basic
+ /board
+zpu/soc/*/rtl # top level, arbiter, etc
+zpu/soc/*/sw # helloworld, dmips, etc. makefile/ROMS
+zpu/soc/*/sim # regression test area. makefile/scripts
+zpu/soc/*/fpga # syn and par area. makefile/scripts
+zpu/tools # zip/tarball of tool chains, simulator
+</pre>
+Not sure where ecos fits.
+
+<a name="nextgen"/>
+<h2>Next generation ZPU</h2>
+Based on feedback here is a list of a tenuous "consensus" for the next generation
+of the ZPU with some tentative ideas on implementation.
+<h3>Goals</h3>
+<ol>
+<li>Reduce minimum code size footprint, i.e. BRAM code overhead. Non-trivial
+usable applications in 4kBytes of BRAM (single BRAM block).
+<li>Reduce minimum FPGA logic footprint by 20% or more. Goal &lt;300 LUT for
+32 bit ZPU
+<li>Weed out unnecessary ZPU variations and merge in useful
+features to a few recommeneded ZPU implementations.
+<li>Will someone be willing to contribute a heavily pipelined ZPU?
+Performance goal of 10 DMIPS w/DRAM & cache.
+This ZPU could run a TCP/IP stack with relevant performance to compete
+with stripped down ARM7 type systems.
+</ol>
+<h2>GCC changes</h2>
+The GCC changes planned are 100% backwards compatible with default
+options. However, a raft of options will be added to disable
+functionality so as to allow study and experimentation with the
+ZPU architecture.
+<ol>
+<li>Add options that allow defining single entry for all unknown instructions. Precisely
+how unknown instructions are handled will be defined by the HDL implementation.
+Currently the GCC backend places relatively strict limitations on how unknown/emulated
+instructions are handled. This will allow HDL implementations to have
+sparser instruction set support. Also this can allow sparse implementations
+of emualted instructions. This is especially important to reduce minimal
+BRAM requirements for small applications.
+<li>GCC needs 4 "hard" registers. These are today mapped to memory. GCC
+will allow specifying what address to use or alternatively not to use
+memory mapped hard registers at all.
+<li>Strip away unused instructions from GCC and add options to GCC for not
+emitting more advanced instructions. This will e.g. convert MULT/DIV into
+function calls to libgcc and thus make it easier to determine that
+microcode is not needed.
+</ol>
+
+<a name="float"/>
+<h1>Floating point support</h1>
+The ZPU does not currently have floating point support. Feedback
+from users indicates that single precision floating point support for
+addition, multiplication and float-to-integer convesion would
+be useful for small ZPU programs that sit in a tight control
+loop. Essentially the ZPU is then measuring something, doing a
+few calculations and then modifying the control signal.
+<p>
+Such control loops can be written in fixed point math, but that
+adds to the engineering effort and reduces clarity of the software
+implementation and the performance will probably be worse than
+for a hardware floating point version.
+<h2>Pipelined floating point module</h2>
+Design needs to be nailed down.
+<b>Goals:</b>
+<ul>
+<li> 32 bit single precision floating point
+<li> FADD => add two floats
+<li> FMULT => multiply two floats
+<li> FINT => convert float to int
+</ul>
+The problem is divided into two:
+
+<ol>
+<li>One top level VHDL module for each of the operations above.
+<li>Integration into ZPU's are a separate problem that will not be
+addressed in this project.
+<li>add a memory mapped coprocessor interface to the above. This
+yields an example of a coprocessor which can be used for any
+custom calculations and allows interest to be gauged.
+</ol>
+
+Throughput:
+
+<ol>
+<li>pipelined design where throughput is one operation per cycle
+with a fixed number of cycles delay.
+<li>there is no flow control or enable signal.
+</ol>
+
+
+
+GCC support is not hard, but modifying GCC should considered after
+interest in this feature beyond a coprocessor has been gauged.
+
+<h2>VHDL module interface</h2>
+
+Patches anyone???
+
+</body>
+<html>
diff --git a/zpu/hdl/avalanche/core/zpu_core.v b/zpu/hdl/avalanche/core/zpu_core.v
new file mode 100644
index 0000000..e704fbc
--- /dev/null
+++ b/zpu/hdl/avalanche/core/zpu_core.v
@@ -0,0 +1,749 @@
+`timescale 1ns / 1ps
+`include "zpu_core_defines.v"
+
+/* MODULE: zpu_core
+ DESCRIPTION: Contains ZPU cpu
+ AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com)
+
+REVISION HISTORY:
+Revision 1.0, 14/09/2009
+Initial public release
+
+COPYRIGHT:
+Copyright (c) 2009 Antonio J. Anton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.*/
+
+// --------- MICROPROGRAMMED ZPU CORE ---------------
+// all signals are polled on clk rising edge
+// all signals positive
+
+module zpu_core (
+`ifdef ENABLE_CPU_INTERRUPTS
+ interrupt, // interrupt request
+`endif
+ clk, // clock on rising edge
+ reset, // reset on rising edge
+ mem_read, // request memory read
+ mem_write, // request memory write
+ mem_done, // memory operation completed
+ mem_addr, // memory address
+ mem_data_read, // data readed
+ mem_data_write, // data written
+ byte_select // byte select on memory operation
+);
+
+input clk;
+input reset;
+output mem_read;
+output mem_write;
+input mem_done;
+input [31:0] mem_data_read;
+output [31:0] mem_data_write;
+output [31:0] mem_addr;
+output [3:0] byte_select;
+`ifdef ENABLE_CPU_INTERRUPTS
+input interrupt;
+`endif
+
+wire clk;
+wire reset;
+wire mem_read;
+wire mem_write;
+wire mem_done;
+wire [31:0] mem_data_read;
+wire [31:0] mem_data_write;
+wire [31:0] mem_addr;
+`ifdef ENABLE_CPU_INTERRUPTS
+wire interrupt;
+`endif
+
+`ifdef ENABLE_BYTE_SELECT
+// ------ unaligned byte/halfword memory operations -----
+/// TODO: think rewriting into microcode or in a less resource wasting way
+
+reg [3:0] byte_select;
+wire byte_op;
+wire halfw_op;
+
+reg [31:0] mem_data_read_int; // aligned data from memory
+reg [31:0] mem_data_write_out; // write data already aligned
+wire [31:0] mem_data_write_int; // write data from cpu to be aligned
+
+// --- byte select logic ---
+always @(mem_addr[1:0] or byte_op or halfw_op)
+begin
+ casez( { mem_addr[1:0], byte_op, halfw_op } )
+ 4'b00_1_? : byte_select <= 4'b0001; // byte select
+ 4'b01_1_? : byte_select <= 4'b0010;
+ 4'b10_1_? : byte_select <= 4'b0100;
+ 4'b11_1_? : byte_select <= 4'b1000;
+ 4'b0?_0_1 : byte_select <= 4'b0011; // half word select
+ 4'b1?_0_1 : byte_select <= 4'b1100;
+ default : byte_select <= 4'b1111; // word select
+ endcase
+end
+
+// --- input data to cpu ---
+always @(mem_data_read or mem_addr[1:0] or byte_op or halfw_op)
+begin
+ casez( { mem_addr[1:0], byte_op, halfw_op } )
+ 4'b00_1_? : mem_data_read_int <= { 24'b0, mem_data_read[7:0] }; // 8 bit read
+ 4'b01_1_? : mem_data_read_int <= { 24'b0, mem_data_read[15:8] };
+ 4'b10_1_? : mem_data_read_int <= { 24'b0, mem_data_read[23:16] };
+ 4'b11_1_? : mem_data_read_int <= { 24'b0, mem_data_read[31:24] };
+ 4'b0?_0_1 : mem_data_read_int <= { 16'b0, mem_data_read[7:0], mem_data_read[15:8] }; // 16 bit read
+ 4'b1?_0_1 : mem_data_read_int <= { 16'b0, mem_data_read[23:16], mem_data_read[31:24] };
+ default : mem_data_read_int <= { mem_data_read[7:0], mem_data_read[15:8], mem_data_read[23:16], mem_data_read[31:24] }; // 32 bit access (default)
+ endcase
+end
+
+// --- output data from cpu ---
+assign mem_data_write = mem_data_write_out;
+
+always @(mem_data_write_int or mem_addr[1:0] or byte_op or halfw_op)
+begin
+ casez( {mem_addr[1:0], byte_op, halfw_op } )
+ 4'b00_1_? : mem_data_write_out <= { 24'bX, mem_data_write_int[7:0] }; // 8 bit write
+ 4'b01_1_? : mem_data_write_out <= { 16'bX, mem_data_write_int[7:0], 8'bX };
+ 4'b10_1_? : mem_data_write_out <= { 8'bX, mem_data_write_int[7:0], 16'bX };
+ 4'b11_1_? : mem_data_write_out <= { mem_data_write_int[7:0], 24'bX };
+ 4'b0?_0_1 : mem_data_write_out <= { 16'bX, mem_data_write_int[7:0], mem_data_write_int[15:8] }; // 16 bit write
+ 4'b1?_0_1 : mem_data_write_out <= { mem_data_write_int[7:0], mem_data_write_int[15:8], 16'bX };
+ default : mem_data_write_out <= { mem_data_write_int[7:0], mem_data_write_int[15:8], mem_data_write_int[23:16], mem_data_write_int[31:24] };
+ endcase
+end
+`else
+// -------- only 32 bit memory access --------
+wire [3:0] byte_select = 4'b1111; // all memory operations are 32 bit wide
+wire [31:0] mem_data_read_int; // no byte/halfword memory access by HW
+wire [31:0] mem_data_write_int; // byte and halfword memory access must be emulated
+
+// ----- reorder bytes due to MSB-LSB configuration -----
+assign mem_data_read_int = { mem_data_read[7:0], mem_data_read[15:8], mem_data_read[23:16], mem_data_read[31:24] };
+assign mem_data_write = { mem_data_write_int[7:0], mem_data_write_int[15:8], mem_data_write_int[23:16], mem_data_write_int[31:24] };
+`endif
+
+// ------ datapath registers and connections -----------
+reg [31:0] pc; // program counter (byte align)
+reg [31:0] sp; // stack counter (word align)
+reg [31:0] a; // operand (address_out, data_out, alu_in)
+reg [31:0] b; // operand (address_out)
+reg idim; // im opcode being processed
+reg [7:0] opcode; // opcode being processed
+reg [31:2] pc_cached; // cached PC
+reg [31:0] opcode_cache; // cached opcodes (current word)
+`ifdef ENABLE_CPU_INTERRUPTS
+ reg int_requested; // interrupt has been requested
+ reg on_interrupt; // serving interrupt
+ wire exit_interrupt; // microcode says this is poppc_interrupt
+ wire enter_interrupt; // microcode says we are entering interrupt
+`endif
+wire [1:0] sel_opcode = pc[1:0]; // which opcode is selected
+wire sel_read; // mux for data-in
+wire [1:0] sel_alu; // mux for alu
+wire [1:0] sel_addr; // mux for addr
+wire w_pc; // write PC
+`ifdef ENABLE_PC_INCREMENT
+ wire w_pc_increment; // write PC+1
+`endif
+wire w_sp; // write SP
+wire w_a; // write A (from ALU result)
+wire w_a_mem; // write A (from MEM read)
+wire w_b; // write B
+wire w_op; // write OPCODE (opcode cache)
+wire set_idim; // set IDIM
+wire clear_idim; // clear IDIM
+wire is_op_cached = (pc[31:2] == pc_cached) ? 1'b1 : 1'b0; // is opcode available?
+wire a_is_zero; // A == 0
+wire a_is_neg; // A[31] == 1
+wire busy; // busy signal to microcode sequencer (stalls cpu)
+
+reg [`MC_MEM_BITS-1:0] mc_pc; // microcode PC
+initial mc_pc <= `MC_ADDR_RESET-1;
+wire [`MC_BITS-1:0] mc_op; // current microcode operation
+
+// memory addr / write ports
+assign mem_addr = (sel_addr == `SEL_ADDR_SP) ? sp :
+ (sel_addr == `SEL_ADDR_A) ? a :
+ (sel_addr == `SEL_ADDR_B) ? b : pc;
+assign mem_data_write_int = a; // only A can be written to memory
+
+// ------- alu instantiation -------
+wire [31:0] alu_a;
+wire [31:0] alu_b;
+wire [31:0] alu_r;
+wire [`ALU_OP_WIDTH-1:0] alu_op;
+wire alu_done;
+
+// alu inputs multiplexors
+// constant in microcode is sign extended (in order to implement substractions like adds)
+assign alu_a = (sel_read == `SEL_READ_DATA) ? mem_data_read_int : mem_addr;
+assign alu_b = (sel_alu == `SEL_ALU_MC_CONST) ? { {25{mc_op[`P_ADDR+6]}} , mc_op[`P_ADDR+6:`P_ADDR] } : // most priority
+ (sel_alu == `SEL_ALU_A) ? a :
+ (sel_alu == `SEL_ALU_B) ? b : { {24{1'b0}} , opcode }; // `SEL_ALU_OPCODE is less priority
+
+zpu_core_alu alu(
+ .alu_a(alu_a),
+ .alu_b(alu_b),
+ .alu_r(alu_r),
+ .alu_op(alu_op),
+ .flag_idim(idim),
+ .clk(clk),
+ .done(alu_done)
+);
+
+// -------- pc : program counter --------
+always @(posedge clk)
+begin
+ if(w_pc) pc <= alu_r;
+`ifdef ENABLE_PC_INCREMENT // microcode optimization
+ else if(w_pc_increment) pc <= pc + 1; // usually pc=pc+1
+`endif
+end
+
+// -------- sp : stack pointer --------
+always @(posedge clk)
+begin
+ if(w_sp) sp <= alu_r;
+end
+
+// -------- a : acumulator register ---------
+always @(posedge clk)
+begin
+ if(w_a) a <= alu_r;
+ else if(w_a_mem) a <= mem_data_read_int;
+end
+
+// alu results over a register instead of alu result
+// in order to improve speed
+assign a_is_zero = (a == 0);
+assign a_is_neg = a[31];
+
+// -------- b : auxiliary register ---------
+always @(posedge clk)
+begin
+ if(w_b) b <= alu_r;
+end
+
+// -------- opcode and opcode_cache --------
+always @(posedge clk)
+begin
+ if(w_op)
+ begin
+ opcode_cache <= alu_r; // store all opcodes in the word
+ pc_cached <= pc[31:2]; // store PC address of cached opcodes
+ end
+end
+
+// -------- opcode : based on pc[1:0] ---------
+always @(sel_opcode or opcode_cache) // select current opcode from
+begin // the cached opcode word
+ case(sel_opcode)
+ 0 : opcode <= opcode_cache[31:24];
+ 1 : opcode <= opcode_cache[23:16];
+ 2 : opcode <= opcode_cache[15:8];
+ 3 : opcode <= opcode_cache[7:0];
+ endcase
+end
+
+// ------- idim : immediate opcode handling ----------
+always @(posedge clk)
+begin
+ if(set_idim) idim <= 1'b1;
+ else if(clear_idim) idim <= 1'b0;
+end
+
+`ifdef ENABLE_CPU_INTERRUPTS
+// ------ on interrupt status bit -----
+always @(posedge clk)
+begin
+ if(reset | exit_interrupt) on_interrupt <= 1'b0;
+ else if(enter_interrupt) on_interrupt <= 1'b1;
+end
+`endif
+
+// ------ microcode execution unit --------
+assign sel_read = mc_op[`P_SEL_READ]; // map datapath signals with microcode program bits
+assign sel_alu = mc_op[`P_SEL_ALU+1:`P_SEL_ALU];
+assign sel_addr = mc_op[`P_SEL_ADDR+1:`P_SEL_ADDR];
+assign alu_op = mc_op[`P_ALU+3:`P_ALU];
+assign w_sp = mc_op[`P_W_SP] & ~busy;
+assign w_pc = mc_op[`P_W_PC] & ~busy;
+assign w_a = mc_op[`P_W_A] & ~busy;
+assign w_a_mem = mc_op[`P_W_A_MEM] & ~busy;
+assign w_b = mc_op[`P_W_B] & ~busy;
+assign w_op = mc_op[`P_W_OPCODE] & ~busy;
+assign mem_read = mc_op[`P_MEM_R];
+assign mem_write = mc_op[`P_MEM_W];
+assign set_idim = mc_op[`P_SET_IDIM] & ~busy;
+assign clear_idim= mc_op[`P_CLEAR_IDIM] & ~busy;
+`ifdef ENABLE_BYTE_SELECT
+assign byte_op = mc_op[`P_BYTE];
+assign halfw_op = mc_op[`P_HALFWORD];
+`endif
+`ifdef ENABLE_PC_INCREMENT
+ assign w_pc_increment = mc_op[`P_PC_INCREMENT] & ~busy;
+`endif
+`ifdef ENABLE_CPU_INTERRUPTS
+ assign exit_interrupt = mc_op[`P_EXIT_INT] & ~busy;
+ assign enter_interrupt = mc_op[`P_ENTER_INT] & ~busy;
+`endif
+
+wire cond_op_not_cached = mc_op[`P_OP_NOT_CACHED]; // conditional: true if opcode not cached
+wire cond_a_zero = mc_op[`P_A_ZERO]; // conditional: true if A is zero
+wire cond_a_neg = mc_op[`P_A_NEG]; // conditional: true if A is negative
+wire decode = mc_op[`P_DECODE]; // decode means jumps to apropiate microcode based on zpu opcode
+wire branch = mc_op[`P_BRANCH]; // unconditional jump inside microcode
+
+wire [`MC_MEM_BITS-1:0] mc_goto = { mc_op[`P_ADDR+6:`P_ADDR], 2'b00 }; // microcode goto (goto = high 7 bits)
+wire [`MC_MEM_BITS-1:0] mc_entry = { opcode[6:0], 2'b00 }; // microcode entry point for opcode
+reg [`MC_MEM_BITS-1:0] next_mc_pc; // next microcode operation to be executed
+initial next_mc_pc <= `MC_ADDR_RESET-1;
+
+wire cond_branch = (cond_op_not_cached & ~is_op_cached) | // sum of all conditionals
+ (cond_a_zero & a_is_zero) |
+ (cond_a_neg & a_is_neg);
+
+assign busy = ((mem_read | mem_write) & ~mem_done) | ~alu_done; // busy signal for microcode sequencer
+
+// ------- handle interrupts ---------
+`ifdef ENABLE_CPU_INTERRUPTS
+always @(posedge clk)
+begin
+ if(reset | on_interrupt) int_requested <= 0;
+ else if(interrupt & ~on_interrupt & ~int_requested) int_requested <= 1; // interrupt requested
+end
+`endif
+
+// ----- calculate next microcode address (next, decode, branch, specific opcode, etc.) -----
+always @(reset or mc_pc or mc_goto or opcode[7:4] or idim or
+ decode or branch or cond_branch or mc_entry or busy
+`ifdef ENABLE_CPU_INTERRUPTS
+ or int_requested
+`endif
+)
+begin
+ // default, next microcode instruction
+ next_mc_pc <= mc_pc + 1;
+ if(reset) next_mc_pc <= `MC_ADDR_RESET;
+ else if(~busy)
+ begin
+ // get next microcode instruction
+ if(branch | cond_branch) next_mc_pc <= mc_goto;
+ else if(decode) // decode: entry point of a new zpu opcode
+ begin
+`ifdef ENABLE_CPU_INTERRUPTS
+ if(int_requested & ~idim) next_mc_pc <= `MC_ADDR_INTERRUPT; // microde to enter interrupt mode
+ else
+`endif
+ if(opcode[7] == `OP_IM) next_mc_pc <= (idim ? `MC_ADDR_IM_IDIM : `MC_ADDR_IM_NOIDIM);
+ else if(opcode[7:5] == `OP_STORESP) next_mc_pc <= `MC_ADDR_STORESP;
+ else if(opcode[7:5] == `OP_LOADSP) next_mc_pc <= `MC_ADDR_LOADSP;
+ else if(opcode[7:4] == `OP_ADDSP) next_mc_pc <= `MC_ADDR_ADDSP;
+ else next_mc_pc <= mc_entry; // includes EMULATE opcodes
+ end
+ end
+ else next_mc_pc <= mc_pc; // in case of cpu stalled (busy=1)
+end
+
+// set microcode program counter
+always @(posedge clk) mc_pc <= next_mc_pc;
+
+// ----- microcode program ------
+zpu_core_rom microcode (
+ .addr(next_mc_pc),
+ .data(mc_op),
+ .clk(clk)
+);
+
+// -------------- ZPU debugger --------------------
+`ifdef ZPU_CORE_DEBUG
+//synthesis translate_off
+// ---- register operation dump ----
+always @(posedge clk)
+begin
+ if(~reset)
+ begin
+ if(w_pc) $display("zpu_core: set PC=0x%h", alu.alu_r);
+`ifdef ENABLE_PC_INCREMENT
+ if(w_pc_increment) $display("zpu_core: set PC=0x%h (PC+1)", pc);
+`endif
+ if(w_sp) $display("zpu_core: set SP=0x%h", alu.alu_r);
+ if(w_a) $display("zpu_core: set A=0x%h", alu.alu_r);
+ if(w_a_mem) $display("zpu_core: set A=0x%h (from MEM)", mem_data_read_int);
+ if(w_b) $display("zpu_core: set B=0x%h", alu.alu_r);
+ if(w_op & ~is_op_cached) $display("zpu_core: set opcode_cache=0x%h, pc_cached=0x%h", alu.alu_r, {pc[31:2], 2'b0});
+`ifdef ENABLE_CPU_INTERRUPTS
+ if(~busy & mc_pc == `MC_ADDR_INTERRUPT) $display("zpu_core: ***** ENTERING INTERRUPT MICROCODE ******");
+ if(~busy & exit_interrupt) $display("zpu_core: ***** INTERRUPT FLAG CLEARED *****");
+ if(~busy & enter_interrupt) $display("zpu_core: ***** INTERRUPT FLAG SET *****");
+`endif
+ if(set_idim & ~idim) $display("zpu_core: IDIM=1");
+ if(clear_idim & idim) $display("zpu_core: IDIM=0");
+
+// ---- microcode debug ----
+`ifdef ZPU_CORE_DEBUG_MICROCODE
+ if(~busy)
+ begin
+ $display("zpu_core: mc_op[%d]=0b%b", mc_pc, mc_op);
+ if(branch) $display("zpu_core: microcode: branch=%d", mc_goto);
+ if(cond_branch) $display("zpu_core: microcode: CONDITION branch=%d", mc_goto);
+ if(decode) $display("zpu_core: decoding opcode=0x%h (0b%b) : branch to=%d ", opcode, opcode, mc_entry);
+ end
+ else $display("zpu_core: busy");
+`endif
+
+// ---- cpu abort in case of unaligned memory access ---
+`ifdef ASSERT_NON_ALIGNMENT
+ /* unaligned word access (except PC) */
+ if(sel_addr != `SEL_ADDR_PC & mem_addr[1:0] != 2'b00 & (mem_read | mem_write) & !byte_op & !halfw_op)
+ begin
+ $display("zpu_core: unaligned word operation at addr=0x%x", mem_addr);
+ $finish;
+ end
+
+ /* unaligned halfword access */
+ if(mem_addr[0] & (mem_read | mem_write) & !byte_op & halfw_op)
+ begin
+ $display("zpu_core: unaligned halfword operation at addr=0x%x", mem_addr);
+ $finish;
+ end
+`endif
+
+ end
+end
+
+// ----- opcode dissasembler ------
+always @(posedge clk)
+begin
+if(~busy)
+case(mc_pc)
+0 : begin
+ $display("zpu_core: ------ breakpoint ------");
+ $finish;
+ end
+4 : $display("zpu_core: ------ shiftleft ------");
+8 : $display("zpu_core: ------ pushsp ------");
+12 : $display("zpu_core: ------ popint ------");
+16 : $display("zpu_core: ------ poppc ------");
+20 : $display("zpu_core: ------ add ------");
+24 : $display("zpu_core: ------ and ------");
+28 : $display("zpu_core: ------ or ------");
+32 : $display("zpu_core: ------ load ------");
+36 : $display("zpu_core: ------ not ------");
+40 : $display("zpu_core: ------ flip ------");
+44 : $display("zpu_core: ------ nop ------");
+48 : $display("zpu_core: ------ store ------");
+52 : $display("zpu_core: ------ popsp ------");
+56 : $display("zpu_core: ------ ipsum ------");
+60 : $display("zpu_core: ------ sncpy ------");
+
+`MC_ADDR_IM_NOIDIM : $display("zpu_core: ------ im 0x%h (1st) ------", opcode[6:0] );
+`MC_ADDR_IM_IDIM : $display("zpu_core: ------ im 0x%h (cont) ------", opcode[6:0] );
+`MC_ADDR_STORESP : $display("zpu_core: ------ storesp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } );
+`MC_ADDR_LOADSP : $display("zpu_core: ------ loadsp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } );
+`MC_ADDR_ADDSP : $display("zpu_core: ------ addsp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } );
+`MC_ADDR_EMULATE : $display("zpu_core: ------ emulate 0x%h ------", b[2:0]); // opcode[5:0] );
+
+128 : $display("zpu_core: ------ mcpy ------");
+132 : $display("zpu_core: ------ mset ------");
+136 : $display("zpu_core: ------ loadh ------");
+140 : $display("zpu_core: ------ storeh ------");
+144 : $display("zpu_core: ------ lessthan ------");
+148 : $display("zpu_core: ------ lessthanorequal ------");
+152 : $display("zpu_core: ------ ulessthan ------");
+156 : $display("zpu_core: ------ ulessthanorequal ------");
+160 : $display("zpu_core: ------ swap ------");
+164 : $display("zpu_core: ------ mult ------");
+168 : $display("zpu_core: ------ lshiftright ------");
+172 : $display("zpu_core: ------ ashiftleft ------");
+176 : $display("zpu_core: ------ ashiftright ------");
+180 : $display("zpu_core: ------ call ------");
+184 : $display("zpu_core: ------ eq ------");
+188 : $display("zpu_core: ------ neq ------");
+192 : $display("zpu_core: ------ neg ------");
+196 : $display("zpu_core: ------ sub ------");
+200 : $display("zpu_core: ------ xor ------");
+204 : $display("zpu_core: ------ loadb ------");
+208 : $display("zpu_core: ------ storeb ------");
+212 : $display("zpu_core: ------ div ------");
+216 : $display("zpu_core: ------ mod ------");
+220 : $display("zpu_core: ------ eqbranch ------");
+224 : $display("zpu_core: ------ neqbranch ------");
+228 : $display("zpu_core: ------ poppcrel ------");
+232 : $display("zpu_core: ------ config ------");
+236 : $display("zpu_core: ------ pushpc ------");
+240 : $display("zpu_core: ------ syscall_emulate ------");
+244 : $display("zpu_core: ------ pushspadd ------");
+248 : $display("zpu_core: ------ halfmult ------");
+252 : $display("zpu_core: ------ callpcrel ------");
+//default : $display("zpu_core: mc_pc=0x%h", decode_mcpc);
+endcase
+end
+//synthesis translate_on
+`endif
+endmodule
+
+// --------- ZPU CORE ALU UNIT ---------------
+module zpu_core_alu(
+ alu_a, // parameter A
+ alu_b, // parameter B
+ alu_r, // computed result
+ flag_idim, // for IMM alu op
+ alu_op, // ALU operation
+ clk, // clock for syncronous multicycle operations
+ done // done signal for alu operation
+);
+
+input [31:0] alu_a;
+input [31:0] alu_b;
+input [`ALU_OP_WIDTH-1:0] alu_op;
+input flag_idim;
+output [31:0] alu_r;
+input clk;
+output done;
+
+wire [31:0] alu_a;
+wire [31:0] alu_b;
+wire [`ALU_OP_WIDTH-1:0] alu_op;
+wire flag_idim;
+reg [31:0] alu_r;
+wire clk;
+reg done;
+
+`ifdef ENABLE_MULT
+// implement 32 bit pipeline multiplier
+reg mul_running;
+reg [2:0] mul_counter;
+wire mul_done = (mul_counter == 3);
+reg [31:0] mul_result, mul_tmp1;
+reg [31:0] a_in, b_in;
+
+always@(posedge clk)
+begin
+ a_in <= 0;
+ b_in <= 0;
+ mul_tmp1 <= 0;
+ mul_result <= 0;
+ mul_counter <= 0;
+ if(mul_running)
+ begin // infer pipeline multiplier
+ a_in <= alu_a;
+ b_in <= alu_b;
+ mul_tmp1 <= a_in * b_in;
+ mul_result <= mul_tmp1;
+ mul_counter <= mul_counter + 1;
+ end
+end
+`endif
+
+`ifdef ENABLE_DIV
+// implement 32 bit divider
+// Unsigned/Signed division based on Patterson and Hennessy's algorithm.
+// Description: Calculates quotient. The "sign" input determines whether
+// signs (two's complement) should be taken into consideration.
+// references: http://www.ece.lsu.edu/ee3755/2002/l07.html
+reg [63:0] qr;
+wire [33:0] diff;
+wire [31:0] quotient;
+wire [31:0] dividend;
+wire [31:0] divider;
+reg [6:0] bit;
+wire div_done;
+reg div_running;
+reg divide_sign;
+reg negative_output;
+
+assign div_done = !bit;
+assign diff = qr[63:31] - {1'b0, divider};
+assign quotient = (!negative_output) ? qr[31:0] : ~qr[31:0] + 1'b1;
+assign dividend = (!divide_sign || !alu_a[31]) ? alu_a : ~alu_a + 1'b1;
+assign divider = (!divide_sign || !alu_b[31]) ? alu_b : ~alu_b + 1'b1;
+
+always@(posedge clk)
+begin
+ bit <= 7'b1_000000; // divider stopped
+ if(div_running)
+ begin
+ if(bit[6]) // divider started: initialize registers
+ begin
+ bit <= 7'd32;
+ qr <= { 32'd0, dividend };
+ negative_output <= divide_sign && ((alu_b[31] && !alu_a[31]) || (!alu_b[31] && alu_a[31]));
+ end
+ else // step by step divide
+ begin
+ if( diff[32] ) qr <= { qr[62:0], 1'd0 };
+ else qr <= { diff[31:0], qr[30:0], 1'd1 };
+ bit <= bit - 1;
+ end
+ end
+end
+`endif
+
+`ifdef ENABLE_BARREL
+// implement 32 bit barrel shift
+// alu_b[6] == 1 ? left(only arithmetic) : right
+// alu_b[5] == 1 ? logical : arithmetic
+reg bs_running;
+reg [31:0] bs_result;
+reg [4:0] bs_counter; // 5 bits
+wire bs_left = alu_b[6];
+wire bs_logical = alu_b[5];
+wire [4:0] bs_moves = alu_b[4:0];
+wire bs_done = (bs_counter == bs_moves);
+
+always @(posedge clk)
+begin
+ bs_counter <= 0;
+ bs_result <= alu_a;
+ if(bs_running)
+ begin
+ if(bs_left) bs_result <= { bs_result[30:0], 1'b0 }; // shift left
+ else
+ begin
+ if(bs_logical) bs_result <= { 1'b0, bs_result[31:1] }; // shift logical right
+ else bs_result <= { bs_result[31], bs_result[31], bs_result[30:1] };// shift arithmetic right
+ end
+ bs_counter <= bs_counter + 1;
+ end
+end
+`endif
+
+// ----- alu add/sub -----
+reg [31:0] alu_b_tmp;
+always @(alu_b or alu_op)
+begin
+ alu_b_tmp <= alu_b; // by default, ALU_B as is
+ if(alu_op == `ALU_PLUS_OFFSET) alu_b_tmp <= { {25{1'b0}}, ~alu_b[4], alu_b[3:0], 2'b0 }; // ALU_B is an offset if ALU_PLUS_OFFSET operation
+end
+
+reg [31:0] alu_r_addsub; // compute R=A+B or A-B based on opcode (ALU_PLUSxx / ALU_SUB-CMP)
+always @(alu_a or alu_b_tmp or alu_op)
+begin
+`ifdef ENABLE_CMP
+ if(alu_op == `ALU_CMP_SIGNED || alu_op == `ALU_CMP_UNSIGNED) // in case of sub or cmp --> operation is '-'
+ begin
+ alu_r_addsub <= alu_a - alu_b_tmp;
+ end
+ else
+`endif
+ begin
+ alu_r_addsub <= alu_a + alu_b_tmp; // by default '+' operation
+ end
+end
+
+`ifdef ENABLE_CMP
+// handle overflow/underflow exceptions in ALU_CMP_SIGNED
+reg cmp_exception;
+always @(alu_a[31] or alu_b[31] or alu_r_addsub[31])
+begin
+ cmp_exception <= 0;
+ if( (alu_a[31] == 0 && alu_b[31] == 1 && alu_r_addsub[31] == 1) ||
+ (alu_a[31] == 1 && alu_b[31] == 0 && alu_r_addsub[31] == 0) ) cmp_exception <= 1;
+end
+`endif
+
+// ----- alu operation selection -----
+always @(alu_a or alu_b or alu_op or flag_idim or alu_r_addsub
+`ifdef ENABLE_CMP
+ or cmp_exception
+`endif
+`ifdef ENABLE_MULT
+ or mul_done or mul_result
+`endif
+`ifdef ENABLE_BARREL
+ or bs_done or bs_result
+`endif
+`ifdef ENABLE_DIV
+ or div_done or div_result
+`endif
+)
+begin
+ done <= 1; // default alu operations are 1 cycle
+`ifdef ENABLE_MULT
+ mul_running <= 0;
+`endif
+`ifdef ENABLE_BARREL
+ bs_running <= 0;
+`endif
+`ifdef ENABLE_DIV
+ div_running <= 0;
+`endif
+ alu_r <= alu_r_addsub; // ALU_PLUS, ALU_PLUS_OFFSET, ALU_SUB and part of ALU_CMP
+ case(alu_op)
+ `ALU_NOP : alu_r <= alu_a;
+ `ALU_NOP_B : alu_r <= alu_b;
+ `ALU_AND : alu_r <= alu_a & alu_b;
+ `ALU_OR : alu_r <= alu_a | alu_b;
+ `ALU_NOT : alu_r <= ~alu_a;
+ `ALU_FLIP : alu_r <= { alu_a[0], alu_a[1], alu_a[2], alu_a[3], alu_a[4], alu_a[5], alu_a[6], alu_a[7],
+ alu_a[8],alu_a[9],alu_a[10],alu_a[11],alu_a[12],alu_a[13],alu_a[14],alu_a[15],
+ alu_a[16],alu_a[17],alu_a[18],alu_a[19],alu_a[20],alu_a[21],alu_a[22],alu_a[23],
+ alu_a[24],alu_a[25],alu_a[26],alu_a[27],alu_a[28],alu_a[29],alu_a[30],alu_a[31] };
+ `ALU_IM : if(flag_idim) alu_r <= { alu_a[24:0], alu_b[6:0] };
+ else alu_r <= { {25{alu_b[6]}}, alu_b[6:0] };
+`ifdef ENABLE_CMP
+ `ALU_CMP_UNSIGNED:if( (alu_a[31] == alu_b[31] && cmp_exception) ||
+ (alu_a[31] != alu_b[31] && ~cmp_exception) )
+ begin
+ alu_r[31] <= ~alu_r_addsub[31];
+ end
+ `ALU_CMP_SIGNED : if(cmp_exception)
+ begin
+ alu_r[31] <= ~alu_r_addsub[31];
+ end
+`endif
+`ifdef ENABLE_XOR
+ `ALU_XOR : alu_r <= alu_a ^ alu_b;
+`endif
+`ifdef ENABLE_A_SHIFT
+ `ALU_A_SHIFT_RIGHT: alu_r <= { alu_a[31], alu_a[31], alu_a[30:1] }; // arithmetic shift left
+`endif
+`ifdef ENABLE_MULT
+ `ALU_MULT : begin
+ mul_running <= ~mul_done;
+ done <= mul_done;
+ alu_r <= mul_result;
+ end
+`endif
+`ifdef ENABLE_BARREL
+ `ALU_BARREL : begin
+ bs_running <= ~bs_done;
+ done <= bs_done;
+ alu_r <= bs_result;
+ end
+`endif
+`ifdef ENABLE_DIV
+ `ALU_DIV : begin
+ div_running<= ~div_done;
+ done <= div_done;
+ alu_r <= quotient;
+ end
+ `ALU_MOD : begin
+ div_running<= ~div_done;
+ done <= div_done;
+ alu_r <= qr[31:0];
+ end
+`endif
+ endcase
+end
+
+endmodule
diff --git a/zpu/hdl/avalanche/core/zpu_core_defines.v b/zpu/hdl/avalanche/core/zpu_core_defines.v
new file mode 100644
index 0000000..228f46b
--- /dev/null
+++ b/zpu/hdl/avalanche/core/zpu_core_defines.v
@@ -0,0 +1,322 @@
+/* MODULE: zpu_core_defines
+ DESCRIPTION: Contains ZPU parameters and other cpu related definitions
+ AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com)
+
+REVISION HISTORY:
+Revision 1.0, 14/09/2009
+Initial public release
+
+COPYRIGHT:
+Copyright (c) 2009 Antonio J. Anton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.*/
+
+/* --------------- ISA DOCUMENTATION ------------------
+ stack: top of stack = sp, mem[sp]=valid data
+ push: sp=sp-1, then mem[sp]=data
+ pop: data=mem[sp], then sp=sp+1
+
+ immediates: any opcode instead of im sets idim=0
+
+ MNEMONIC OPCODE HEX OPERATION
+- im x 1_xxxxxxx if(~idim) { idim=1; sp=sp-1; mem[sp]={{25{b[6]}},b[6:0]} }
+ else { idim=1; mem[sp]={mem[sp][24:0], b[6:0]} }
+- emulate x 001_xxxxx sp=sp-1; mem[sp]=pc+1; pc=mem[@VECTOR_EMULATE + <b>]; fetch (used only by microcode)
+- storesp x 010_xxxxx mem[sp+x<<2] = mem[sp]; sp=sp+1
+- loadsp x 011_xxxxx mem[sp-1] = mem [sp+x<<2]; sp=sp-1
+- addsp x 0001_xxxx (1x) mem[sp] = mem[sp]+mem[sp+x<<2]
+
+- breakpoint 0000_0000 (00) call exception vector
+ shiftleft 0000_0001 (01)
+- pushsp 0000_0010 (02) mem[sp-1] = sp; sp = sp - 1
+- popint 0000_0011 (03) pc=mem[sp]; sp = sp + 1 ; fetch ; decode ; clear_interrupt_flag
+- poppc 0000_0100 (04) pc=mem[sp]; sp = sp + 1
+- add 0000_0101 (05) mem[sp+1] = mem[sp+1] + mem[sp]; sp = sp + 1
+- and 0000_0110 (06) mem[sp+1] = mem[sp+1] & mem[sp]; sp = sp + 1
+- or 0000_0111 (07) mem[sp+1] = mem[sp+1] | mem[sp]; sp = sp + 1
+- load 0000_1000 (08) mem[sp] = mem[ mem[sp] ]
+- not 0000_1001 (09) mem[sp] = ~mem[sp]
+- flip 0000_1010 (0a) mem[sp] = flip(mem[sp])
+- nop 0000_1011 (0b) -
+- store 0000_1100 (0c) mem[mem[sp]] = mem[sp+1]; sp = sp + 2
+- popsp 0000_1101 (0d) sp = mem[sp]
+ compare 0000_1110 (0e) ???? --> opcode recycled (see below)
+ popint 0000_1111 (0f) duplicated of 0x03 ????? --> opcode recycled (see below)
+
+- ipsum 0000_1110 (0e) c=mem[sp],s=mem[sp+1]; sum=0; while(c-->0) {sum+=halfword(mem[s],s);s+=2}; sp=sp+1; mem[sp]=sum (overwrites mem[0] & mem[4] words)
+- sncpy 0000_1111 (0f) c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while( *(char*)s != 0 && c>0 ) {*((char*)d++)=*((char*)s++));c--}; sp=sp+3 (overwrites mem[0] & mem[4] words)
+- wcpy 001_00000 (20) c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while(c-->0) mem[d++]=mem[s++]; sp=sp+3 (overwrites mem[0] & mem[4] words)
+- wset 001_00001 (21) v=mem[sp],c=mem[sp+1],d=mem[sp+2]; while(c-->0) mem[d++]=v; sp=sp+3 (overwrites mem[0] & mem[4] words)
+
+- loadh 001_00010 (22) mem[sp] = halfword[ mem[sp] ]
+- storeh 001_00011 (23) halfword[mem[sp]] = (mem[sp+1] & 0xFFFF); sp = sp + 2
+- lessthan 001_00100 (24) (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1
+- lessthanorequal 001_00101 (25) (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1
+- ulessthan 001_00110 (26) (unsigned(mem[sp])-unsigned(mem[sp+1])) < 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1
+- ulessthanorequal 001_00111 (27) (unsigned(mem[sp])-unsigned(mem[sp+1])) <= 0 || == 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1
+ swap 001_01000 (28)
+- mult 001_01001 (29) mem[sp+1] = mem[sp+1] * mem[sp]; sp = sp + 1
+- lshiftright 001_01010 (2a) mem[sp+1] = mem[sp+1] >> (mem[sp] & 0x1f); sp = sp + 1
+- ashiftleft 001_01011 (2b) mem[sp+1] = mem[sp+1] << (mem[sp] & 0x1f); sp = sp + 1
+- ashiftright 001_01100 (2c) mem[sp+1] = mem[sp+1] signed>> (mem[sp] & 0x1f); sp = sp + 1
+- call 001_01101 (2d) a = mem[sp]; mem[sp]=pc + 1; pc = a
+- eq 001_01110 (2e) mem[sp+1] = (mem[sp] == mem[sp+1]) ? 1 : 0; sp = sp + 1
+- neq 001_01111 (2f) mem[sp+1] = (mem[sp] != mem[sp+1]) ? 1 : 0; sp = sp + 1
+- neg 001_10000 (30) mem[sp] = NOT(mem[sp])+1
+- sub 001_10001 (31) mem[sp+1]=mem[sp+1]-mem[sp]; sp=sp+1
+- xor 001_10010 (32) mem[sp+1]=mem[sp] ^ mem[sp+1]; sp=sp+1
+- loadb 001_10011 (33) mem[sp] = byte[ mem[sp] ]
+- storeb 001_10100 (34) byte[mem[sp]] = (mem[sp+1] & 0xFF); sp = sp + 2
+ div 001_10101 (35)
+ mod 001_10110 (36)
+- eqbranch 001_10111 (37) mem[sp+1] == 0 ? pc = pc + mem[sp]; sp = sp + 2
+- neqbranch 001_11000 (38) mem[sp+1] != 0 ? pc = pc + mem[sp]; sp = sp + 2
+- poppcrel 001_11001 (39) pc = pc + mem[sp]; sp = sp + 1
+ config 001_11010 (3a)
+- pushpc 001_11011 (3b) sp=sp-1; mem[sp]=pc
+ syscall 001_11100 (3c)
+- pushspadd 001_11101 (3d) mem[sp] = sp + (mem[sp] << 2)
+- halfmult 001_11110 (3e) mem[sp+1] = 16bits(mem[sp]) * 16bits(mem[sp+1]); sp = sp + 1
+- callpcrel 001_11111 (3f) a = mem[sp]; mem[sp]=pc+1; pc = pc + a;
+
+ gcc seems to be using only:
+
+ add, addsp, and, ashiftleft, ashiftright, call, callpcrel, div, eq, flip, im, lessthan,
+ lessthanorequal, loadb, loadh, load, loadsp, lshiftright, mod, mult, neg, neqbranch,
+ not, or, poppc, poppcrel, popsp, pushpc, pushspadd, pushsp, storeb, storeh, store, storesp,
+ sub, ulessthan, ulessthanorequal, xor
+
+ --------- memory access ----------------------------
+
+ data is stored in big-endian format into memory:
+ 00 MSB .. .. LSB
+ 05 .. .. .. ..
+
+ ---------------------------------------------------- */
+`define SP_START 32'h10 // after reset change in startup code
+`define EMULATION_VECTOR 32'h10 // table of emulated opcodes (interrupt & exception vectors plus up to 5 emulated opcodes)
+`define RESET_VECTOR 32'h20 // reset entry point (can be moved up to 0x3c as per emulation table needs)
+
+// ---- zpu core optimizations/features ----
+`define ZPU_CORE_DEBUG
+//`define ZPU_CORE_DEBUG_MICROCODE
+`define ASSERT_NON_ALIGNMENT /* abort cpu in case of non-aligned memory access (only simulation) */
+
+`define ENABLE_BYTE_SELECT /* allow byte / halfword memory accesses */
+`define ENABLE_CPU_INTERRUPTS /* enable interrupts to cpu */
+//`define ENABLE_PC_INCREMENT /* gain 1 clk per opcode but requires microcode changes ** not done at the moment ** */
+//`define ENABLE_A_SHIFT /* 1 bit arithmetic shift (right) mutual exclusive with barrel shift */
+//`define ENABLE_XOR /* 1 cycle x-or */
+//`define ENABLE_MULT /* 32 bit pipelined (3 stages) multiplier */
+//`define ENABLE_DIV /* 32 bit, up to 32 cycles serial divider */
+`define ENABLE_BARREL /* n bit logical & arithmetic shift mutual exclusive with 1 bit shift */
+`define ENABLE_CMP /* enable ALU_CMP_SIGNED and ALU_CMP_UNSIGNED */
+
+// ------- microcode zpu core datapath selectors --------
+`define SEL_READ_DATA 0
+`define SEL_READ_ADDR 1
+
+`define SEL_ALU_A 0
+`define SEL_ALU_OPCODE 1
+`define SEL_ALU_MC_CONST 2
+`define SEL_ALU_B 3
+
+`define SEL_ADDR_PC 0
+`define SEL_ADDR_SP 1
+`define SEL_ADDR_A 2
+`define SEL_ADDR_B 3
+
+`define ALU_OP_WIDTH 4 // alu operation is 4 bits
+
+`define ALU_NOP 0 // r = a
+`define ALU_NOP_B 1 // r = b
+`define ALU_PLUS 2 // r = a + b
+`define ALU_PLUS_OFFSET 3 // r = a + { 27'b0, ~b[4], b[3:0] }
+`define ALU_AND 4 // r = a AND b
+`define ALU_OR 5 // r = a OR b
+`define ALU_NOT 6 // r = NOT a
+`define ALU_FLIP 7 // r = FLIP a
+`define ALU_IM 8 // r = IDIM ? { a[24:0], b[6:0] } : { 25{b[6]}, b[6:0] }
+`ifdef ENABLE_CMP
+ `define ALU_CMP_UNSIGNED 9 // r = (unsigned)a - (unsigned)b (r[31] is overflow/underflow adjusted)
+ `define ALU_CMP_SIGNED 10 // r = (signed)a - (signed)b (r[31] is overflow/underflow adjusted)
+`endif
+`ifdef ENABLE_BARREL
+ `define ALU_BARREL 11 // r = a <<|>> b (logical, arithmetical)
+`endif
+`ifdef ENABLE_A_SHIFT
+ `define ALU_A_SHIFT_RIGHT 11 // r = { a[31], a[31], a[30:29] } = (signed)a >> 1
+`endif
+`ifdef ENABLE_XOR
+ `define ALU_XOR 12 // r = a XOR b
+`endif
+`ifdef ENABLE_MULT
+ `define ALU_MULT 13 // r = a * b
+`endif
+`ifdef ENABLE_DIV
+ `define ALU_DIV 14 // r = a / b
+ `define ALU_MOD 15 // r = a mod b
+`endif
+
+// ------- special zpu opcodes ------
+`define OP_NOP 8'b0000_1011 // default value for opcode cache on reset
+`define OP_IM 1'b1
+`define OP_EMULATE 3'b001
+`define OP_STORESP 3'b010
+`define OP_LOADSP 3'b011
+`define OP_ADDSP 4'b0001
+
+// ------- microcode memory settings ------
+`define MC_MEM_BITS 9 // 512 microcode operations
+`define MC_BITS 36 // microcode opcode width
+
+// ------- microcode labels for opcode execution -------
+// based on microcode program
+`define MC_ADDR_IM_NOIDIM 488
+`define MC_ADDR_IM_IDIM 491
+`define MC_ADDR_STORESP 493
+`define MC_ADDR_LOADSP 496
+`define MC_ADDR_ADDSP 500
+`define MC_ADDR_EMULATE 504
+`define MC_ADDR_INTERRUPT 484
+`define MC_ADDR_FETCH_NEXT 480
+`define MC_ADDR_FETCH 476
+`define MC_ADDR_RESET 474
+
+// ---------- microcode settings --------------------
+`define P_SEL_READ 0 // alu-A multiplexor between data-in and addr-out (1 bit)
+`define P_SEL_ALU 1 // alu-B multiplexor between a, b, mc_const or opcode (2 bits)
+`define P_SEL_ADDR 3 // addr-out multiplexor between sp, pc, a, b (2 bits)
+`define P_ALU 5 // alu operation (4 bits)
+`define P_W_SP 9 // write sp (from alu-out)
+`define P_W_PC 10 // write pc (from alu-out)
+`define P_W_A 11 // write a (from alu-out)
+`define P_W_B 12 // write b (from alu-out)
+`define P_SET_IDIM 13 // set idim flag
+`define P_CLEAR_IDIM 14 // clear idim flag
+`define P_W_OPCODE 15 // write opcode (from alu-out) : check if can be written directly from data-in
+`define P_DECODE 16 // jump to microcode entry point based on current opcode
+`define P_MEM_R 17 // request memory read
+`define P_MEM_W 18 // request memory write
+`define P_ADDR 19 // microcode address (7 bits (granularity is 4 words)) or constant to be used at microcode level
+`define P_BRANCH 26 // microcode inconditional branch to address
+`define P_OP_NOT_CACHED 27 // microcode branch if byte[pc] is not cached at opcode
+`define P_A_ZERO 28 // microcode branch if a is zero
+`define P_A_NEG 29 // microcode branch if a is negative a[31]=1
+`define P_W_A_MEM 30 // write a directly from data-in (alu datapath is free to perform any other operation in parallel)
+`ifdef ENABLE_BYTE_SELECT
+ `define P_BYTE 31 // byte memory operation
+ `define P_HALFWORD 32 // half word memory operation
+`endif
+`ifdef ENABLE_PC_INCREMENT
+ `define P_PC_INCREMENT 33 // autoincrement PC bypassing ALU (1 clock gain per opcode) : not implemented at microcode level
+`endif
+`ifdef ENABLE_CPU_INTERRUPTS
+ `define P_EXIT_INT 34 // clear interrupt flag (exit from interrupt)
+ `define P_ENTER_INT 35 // set interrupt flag (enter interrupt)
+`endif
+
+`define MC_SEL_READ_DATA (`SEL_READ_DATA << `P_SEL_READ) // 1 bit
+`define MC_SEL_READ_ADDR (`SEL_READ_ADDR << `P_SEL_READ)
+
+`define MC_SEL_ALU_A (`SEL_ALU_A << `P_SEL_ALU) // 2 bit
+`define MC_SEL_ALU_OPCODE (`SEL_ALU_OPCODE << `P_SEL_ALU)
+`define MC_SEL_ALU_MC_CONST (`SEL_ALU_MC_CONST << `P_SEL_ALU)
+`define MC_SEL_ALU_B (`SEL_ALU_B << `P_SEL_ALU)
+
+`define MC_SEL_ADDR_PC (`SEL_ADDR_PC << `P_SEL_ADDR) // 2 bits
+`define MC_SEL_ADDR_SP (`SEL_ADDR_SP << `P_SEL_ADDR)
+`define MC_SEL_ADDR_A (`SEL_ADDR_A << `P_SEL_ADDR)
+`define MC_SEL_ADDR_B (`SEL_ADDR_B << `P_SEL_ADDR)
+
+`define MC_ALU_NOP (`ALU_NOP << `P_ALU) // 4 bits
+`define MC_ALU_NOP_B (`ALU_NOP_B << `P_ALU)
+`define MC_ALU_PLUS (`ALU_PLUS << `P_ALU)
+`define MC_ALU_AND (`ALU_AND << `P_ALU)
+`define MC_ALU_OR (`ALU_OR << `P_ALU)
+`define MC_ALU_NOT (`ALU_NOT << `P_ALU)
+`define MC_ALU_FLIP (`ALU_FLIP << `P_ALU)
+`define MC_ALU_IM (`ALU_IM << `P_ALU)
+`define MC_ALU_PLUS_OFFSET (`ALU_PLUS_OFFSET << `P_ALU)
+`ifdef ENABLE_CMP
+ `define MC_ALU_CMP_SIGNED (`ALU_CMP_SIGNED << `P_ALU)
+ `define MC_ALU_CMP_UNSIGNED (`ALU_CMP_UNSIGNED << `P_ALU)
+`endif
+`ifdef ENABLE_XOR
+ `define MC_ALU_XOR (`ALU_XOR << `P_ALU)
+`endif
+`ifdef ENABLE_A_SHIFT
+ `define MC_ALU_A_SHIFT_RIGHT (`ALU_A_SHIFT_RIGHT << `P_ALU)
+`endif
+`ifdef ENABLE_MULT
+ `define MC_ALU_MULT (`ALU_MULT << `P_ALU)
+`endif
+`ifdef ENABLE_DIV
+ `define MC_ALU_DIV (`ALU_DIV << `P_ALU)
+ `define MC_ALU_MOD (`ALU_MOD << `P_ALU)
+`endif
+`ifdef ENABLE_BARREL
+ `define MC_ALU_BARREL (`ALU_BARREL << `P_ALU)
+`endif
+
+`define MC_W_SP (1 << `P_W_SP)
+`define MC_W_PC (1 << `P_W_PC)
+`define MC_W_A (1 << `P_W_A)
+`define MC_W_A_MEM (1 << `P_W_A_MEM)
+`define MC_W_B (1 << `P_W_B)
+`define MC_W_OPCODE (1 << `P_W_OPCODE)
+`define MC_SET_IDIM (1 << `P_SET_IDIM)
+`define MC_CLEAR_IDIM (1 << `P_CLEAR_IDIM)
+`ifdef ENABLE_BYTE_SELECT
+ `define MC_BYTE (1 << `P_BYTE)
+ `define MC_HALFWORD (1 << `P_HALFWORD)
+`endif
+`ifdef ENABLE_PC_INCREMENT
+ `define MC_PC_INCREMENT (1 << `P_PC_INCREMENT)
+`endif
+`ifdef ENABLE_CPU_INTERRUPTS
+ `define MC_EXIT_INTERRUPT (1 << `P_EXIT_INT)
+ `define MC_ENTER_INTERRUPT (1 << `P_ENTER_INT)
+`endif
+
+`define MC_MEM_R (1 << `P_MEM_R)
+`define MC_MEM_W (1 << `P_MEM_W)
+
+`define MC_DECODE (1 << `P_DECODE)
+`define MC_BRANCH (1 << `P_BRANCH)
+`define MC_BRANCHIF_OP_NOT_CACHED (1 << `P_OP_NOT_CACHED)
+`define MC_BRANCHIF_A_ZERO (1 << `P_A_ZERO)
+`define MC_BRANCHIF_A_NEG (1 << `P_A_NEG)
+
+// microcode common operations
+
+`define MC_ADDR_FETCH_OP ( (`MC_ADDR_FETCH >> 2) << `P_ADDR) // fetch opcode from memory then decode
+`define MC_ADDR_NEXT_OP ( (`MC_ADDR_FETCH_NEXT >> 2) << `P_ADDR) // go to next opcode
+`define MC_ADDR_EMULATE_OP ( (`MC_ADDR_EMULATE >> 2) << `P_ADDR) // EMULATE opcode
+
+`define MC_PC_PLUS_1 (`MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | (1 << `P_ADDR) | `MC_W_PC)
+`define MC_SP_MINUS_4 (`MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | ((-4 & 127) << `P_ADDR) | `MC_W_SP)
+`define MC_SP_PLUS_4 (`MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | (4 << `P_ADDR) | `MC_W_SP)
+`define MC_EMULATE (`MC_BRANCH | `MC_ADDR_EMULATE_OP)
+
+`define MC_FETCH (`MC_BRANCHIF_OP_NOT_CACHED | `MC_ADDR_FETCH_OP | `MC_DECODE) // fetch and decode current PC opcode
+`define MC_GO_NEXT (`MC_BRANCH | `MC_ADDR_NEXT_OP) // go to next opcode (PC=PC+1, fetch, decode)
+`define MC_GO_FETCH (`MC_BRANCH | `MC_ADDR_FETCH_OP) // go to fetch opcode at PC, then decode
+`define MC_GO_BREAKPOINT (`MC_BRANCH | ((0 >> 2) << `P_ADDR)) // go to breakpoint opcode
+
diff --git a/zpu/hdl/avalanche/core/zpu_core_rom.v b/zpu/hdl/avalanche/core/zpu_core_rom.v
new file mode 100644
index 0000000..62b7229
--- /dev/null
+++ b/zpu/hdl/avalanche/core/zpu_core_rom.v
@@ -0,0 +1,1017 @@
+`timescale 1ns / 1ps
+`include "zpu_core_defines.v"
+
+/* MODULE: zpu_core_rom
+ DESCRIPTION: Contains microcode program
+ AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com)
+
+REVISION HISTORY:
+Revision 1.0, 14/09/2009
+Initial public release
+
+COPYRIGHT:
+Copyright (c) 2009 Antonio J. Anton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.*/
+
+module zpu_core_rom (
+ clk,
+ addr,
+ data
+);
+
+input [`MC_MEM_BITS-1:0] addr;
+output [`MC_BITS-1:0] data;
+input clk;
+
+wire [`MC_MEM_BITS-1:0] addr;
+reg [`MC_BITS-1:0] data;
+reg [`MC_BITS-1:0] memory[(1<<`MC_MEM_BITS)-1:0];
+
+initial data <= 0;
+always @(posedge clk) data <= memory[addr];
+
+// --- clear all memory at startup; for any reason, xilinx xst
+// will not syntetize as block ram if not all memory is initialized ---
+integer n;
+initial begin
+// initialize all memory array
+for(n = 0; n < (1<<`MC_MEM_BITS); n = n + 1) memory[n] = 0;
+
+// ------------------------- MICROCODE MEMORY START -----------------------------------
+
+// As per zpu_core.v, each opcode is executed by microcode. Each opcode microcode entry point
+// is at <opcode> << 2 (example pushsp = 0x02 has microcode entry point of 0x08); this leaves
+// room of 4 microcode operations per opcode; if the opcode microcode needs more space,
+// it can jump & link to other microcode address (with the two lower bits at 0). The lower 256 addresses
+// of microcode memory are entry points and code for 0..127 opcodes; other specific opcodes like im, storesp, etc.
+// are directly hardwired to specific microcode addresses at the memory end. Upper 256 addresses are
+// used by microcode continuation (eg. opcodes which needs more microcode operations), entry points, initializations, etc.
+// the idea is to fit the microcode program in a xilinx blockram 512x36.
+
+// ----- OPCODES WITHOUT CONSTANT ------
+
+// 0000_0000 (00) breakpoint -------------------------------------
+memory[0] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | // b = 4 (#1 in emulate table)
+ `MC_W_B;
+memory[1] = `MC_EMULATE; // emulate #1 (exception)
+
+// 0000_0001 (01) shiftleft -------------------------------------
+memory[4] = `MC_GO_BREAKPOINT;
+
+// 0000_0010 (02) pushsp -------------------------------------
+// mem[sp-1] = sp
+// sp = sp - 1
+memory[8] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp
+ `MC_ALU_NOP | `MC_W_A;
+memory[9] = `MC_SP_MINUS_4; // sp = sp - 1
+memory[10] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp]=a
+
+// 0000_0011 (03) popint -------------------------------------
+`ifdef ENABLE_CPU_INTERRUPTS
+// pc=mem[sp]-1 (emulate stores pc+1 but we must return to
+// sp=sp+1 pc because interrupt takes precedence to decode)
+// fetch & decode, then clear_interrupt_flag
+// this guarantees that a continous interrupt allows to execute at least one
+// opcode of mainstream program before reentry to interrupt handler
+memory[12] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // pc = mem[sp]-1
+ `MC_MEM_R | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST |
+ ((-1 & 127) << `P_ADDR) | `MC_W_PC;
+memory[13] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc]
+ `MC_W_OPCODE;
+memory[14] = `MC_SP_PLUS_4 | `MC_DECODE | `MC_EXIT_INTERRUPT; // sp=sp+1, decode opcode, exit_interrupt
+`else
+memory[12] = `MC_GO_BREAKPOINT;
+`endif
+
+// 0000_0100 (04) poppc -------------------------------------
+// pc=mem[sp]
+// sp = sp + 1
+memory[16] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // pc = mem[sp]
+ `MC_MEM_R | `MC_W_PC;
+memory[17] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[18] = `MC_FETCH; // opcode cached ? decode : fetch,decode
+
+// 0000_0101 (05) add -------------------------------------
+// mem[sp+1] = mem[sp+1] + mem[sp]
+// sp = sp + 1
+memory[20] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[21] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a + mem[sp]
+ `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A;
+memory[22] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_0110 (06) and -------------------------------------
+// mem[sp+1] = mem[sp+1] & mem[sp]
+// sp = sp + 1
+memory[24] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[25] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a & mem[sp]
+ `MC_ALU_AND |`MC_SEL_ALU_A | `MC_W_A;
+memory[26] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_0111 (07) or -------------------------------------
+// mem[sp+1] = mem[sp+1] | mem[sp]
+// sp = sp + 1
+memory[28] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[29] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a | mem[sp]
+ `MC_ALU_OR | `MC_SEL_ALU_A | `MC_W_A;
+memory[30] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_1000 (08) load -------------------------------------
+// mem[sp] = mem[ mem[sp] ]
+memory[32] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp]
+ `MC_MEM_R | `MC_W_A;
+memory[33] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a]
+memory[34] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_1001 (09) not -------------------------------------
+// mem[sp] = ~mem[sp]
+memory[36] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = ~mem[sp]
+ `MC_MEM_R | `MC_ALU_NOT | `MC_W_A;
+memory[37] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_1010 (0a) flip -------------------------------------
+// mem[sp] = flip(mem[sp])
+memory[40] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = FLIP(mem[sp])
+ `MC_MEM_R | `MC_ALU_FLIP | `MC_W_A;
+memory[41] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0000_1011 (0b) nop -------------------------------------
+memory[44] = `MC_CLEAR_IDIM | `MC_PC_PLUS_1; // IDIM=0
+memory[45] = `MC_FETCH;
+
+// 0000_1100 (0c) store -------------------------------------
+// mem[mem[sp]] <= mem[sp+1]
+// sp = sp + 2
+memory[48] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp]
+ `MC_MEM_R | `MC_W_B;
+memory[49] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[50] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | `MC_SP_PLUS_4; // a = mem[sp] || sp = sp + 1
+memory[51] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_GO_NEXT; // mem[b] = a
+
+// 0000_1101 (0d) popsp -------------------------------------
+// sp = mem[sp]
+memory[52] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // sp = mem[sp]
+ `MC_W_SP | `MC_GO_NEXT;
+
+// 0000_1110 (0e) ipsum ------------------------------------
+// compare: opcode recycled --> ipsum
+// c=mem[sp];s=mem[sp+1]; sum=0;
+// while(c-->0) {sum+=halfword(mem[s],s);s++};
+// sp=sp+1; mem[sp]=sum (overwrites mem[0] & mem[4] words)
+// requires HALFWORD memory access
+`ifdef ENABLE_BYTE_SELECT
+memory[56] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0
+ (0 << `P_ADDR) | `MC_W_B;
+memory[57] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 save next pc on mem[0]
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[58] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4
+ `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR);
+memory[59] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @ipsum_continue1
+ `MC_BRANCH | ((116 >> 2) << `P_ADDR);
+`else
+memory[56] = `MC_GO_BREAKPOINT;
+`endif
+
+// 0000_1111 (0f) sncpy ---------------------------------------
+// c=mem[sp],d=mem[sp+1],s=mem[sp+2];
+// while( *(char*)s != 0 && c>0 ) { *((char*)d++)=*((char*)s++)); c-- };
+// sp=sp+1; mem[sp+1]=d; mem[sp]=c
+// (overwrites mem[0] & mem[4] words)
+// requires BYTE memory access
+`ifdef ENABLE_BYTE_SELECT
+memory[60] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0
+ (0 << `P_ADDR) | `MC_W_B;
+memory[61] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 save next pc on mem[0]
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[62] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4
+ `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR);
+memory[63] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @sncpy_continue1
+ `MC_BRANCH | ((100 >> 2) << `P_ADDR);
+`else
+memory[60] = `MC_GO_BREAKPOINT;
+`endif
+
+// ------------- microcode opcode continuations ---------------
+// wset_continue1: ------------------------
+memory[64] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12 save clear stack on mem[4]
+ `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A;
+memory[65] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a
+memory[66] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (data)
+memory[67] = `MC_SP_PLUS_4; // sp=sp+4
+memory[68] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B; // b=mem[sp] (count)
+memory[69] = `MC_SP_PLUS_4; // sp=sp+4
+memory[70] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (destination @)
+memory[71] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count)
+// wset_loop:
+memory[72] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @wset_end
+memory[73] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count)
+ `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B;
+memory[74] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_W_A; // a=pc (data)
+memory[75] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_SP_PLUS_4; // mem[sp]=a || sp=sp+4 (sp=destination@)
+memory[76] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @wset_loop
+ `MC_BRANCH | ((72 >> 2) << `P_ADDR);
+// wset_end: wcpy_end: sncpy_end:
+memory[80] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC; // pc=mem[a] (a is 0)
+memory[81] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | // b=4
+ `MC_W_B;
+memory[82] = `MC_SEL_ADDR_B | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[b] || goto @fetch
+ `MC_W_SP | `MC_FETCH;
+
+// wcpy_continue1: ------------------------
+memory[84] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12 save clear stack on mem[4]
+ `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A;
+memory[85] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a
+memory[86] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B; // b=mem[sp] (count)
+memory[87] = `MC_SP_PLUS_4; // sp=sp+4
+memory[88] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (destination @)
+memory[89] = `MC_SP_PLUS_4; // sp=sp+4
+memory[90] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (source @)
+memory[91] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count)
+// wcpy_loop:
+memory[92] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @wcpy_end
+memory[93] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count)
+ `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B;
+memory[94] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+4 (sp=source@)
+ `MC_SP_PLUS_4;
+memory[95] = `MC_SEL_ADDR_PC | `MC_MEM_W | `MC_SEL_READ_ADDR | // mem[pc]=a || pc=pc+4 (pc=destination@)
+ `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | `MC_W_PC;
+memory[96] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @wcpy_loop
+ `MC_BRANCH | ((92 >> 2) << `P_ADDR);
+
+`ifdef ENABLE_BYTE_SELECT
+// sncpy_continue1: ---------------------
+memory[100] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12
+ `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A;
+memory[101] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a
+memory[102] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B;// b=mem[sp] (count)
+memory[103] = `MC_SP_PLUS_4; // sp=sp+4
+memory[104] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (destination @)
+memory[105] = `MC_SP_PLUS_4; // sp=sp+4
+memory[106] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (source @)
+memory[107] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count)
+// sncpy_loop:
+memory[108] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @sncpy_end (count==0?)
+memory[109] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_BYTE | `MC_W_A_MEM | // a=BYTE(mem[sp],sp) || sp=sp+1 (sp=source@)
+ `MC_SEL_READ_ADDR | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST |
+ (1 << `P_ADDR) | `MC_W_SP;
+memory[110] = `MC_SEL_ADDR_PC | `MC_MEM_W | `MC_SEL_READ_ADDR | // BYTE(mem[pc],pc)=a || pc=pc+1 (pc=destination@)
+ `MC_BYTE | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST |
+ (1 << `P_ADDR) | `MC_W_PC;
+memory[111] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @sncpy_end (mem[src]==0?)
+memory[112] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count)
+ `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B;
+memory[113] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @sncpy_loop
+ `MC_BRANCH | ((108 >> 2) << `P_ADDR);
+
+// ipsum_continue1: -------------------
+memory[116] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+4
+ `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | `MC_W_A;
+memory[117] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a save return sp on mem[4]
+memory[118] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // pc=mem[sp] (count)
+ `MC_W_PC;
+memory[119] = `MC_SP_PLUS_4; // sp=sp+4
+memory[120] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[sp] (start @)
+ `MC_W_SP;
+memory[121] = `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | `MC_W_B | // b=0 (sum)
+ `MC_ALU_NOP_B;
+memory[122] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_W_A; // a=pc (count)
+// ipsum_loop:
+memory[124] = `MC_BRANCHIF_A_ZERO | ((392 >> 2) << `P_ADDR); // a == 0 ? goto @ipsum_end
+
+memory[125] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_HALFWORD | // b=mem[sp]+b
+ `MC_SEL_READ_DATA | `MC_ALU_PLUS | `MC_SEL_ALU_B | `MC_W_B;
+memory[126] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp=sp+2
+ `MC_SEL_ALU_MC_CONST | (2 << `P_ADDR) | `MC_W_SP;
+memory[127] = `MC_BRANCH | ((408 >> 2) << `P_ADDR); // goto @ipsum_continue2
+`endif
+
+// -------------------------------------------------------------
+
+// 001_00000 (20) wcpy -----------------------------------------
+// before using this opcode you must save mem[0] & mem[4] words, then wcpy, then restore mems
+// c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while(c-->0) mem[d++]=mem[s++]; sp=sp+3
+memory[128] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0
+ (0 << `P_ADDR) | `MC_W_B;
+memory[129] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[130] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4
+ `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR);
+memory[131] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @wcpy_continue1
+ `MC_BRANCH | ((84 >> 2) << `P_ADDR);
+
+// 001_00001 (21) wset ----------------------------------------
+// before using this opcode you must save mem[0] & mem[4] words, then wset, then restore mems
+// v=mem[sp],c=mem[sp+1],d=mem[sp+2]; while(c-->0) mem[d++]=v; sp=sp+3
+memory[132] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0
+ (0 << `P_ADDR) | `MC_W_B;
+memory[133] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[134] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4
+ `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR);
+memory[135] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @wset_continue1
+ `MC_BRANCH | ((64 >> 2) << `P_ADDR);
+
+// 001_00010 (22) loadh -------------------------------------
+`ifdef ENABLE_BYTE_SELECT
+// mem[sp] = HALFWORD(mem[sp], mem[mem[sp]])
+memory[136] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp]
+ `MC_MEM_R | `MC_W_A;
+memory[137] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | // a = halfword(a, mem[a])
+ `MC_W_A | `MC_HALFWORD;
+memory[138] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+memory[136] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_00011 (23) storeh -------------------------------------
+`ifdef ENABLE_BYTE_SELECT
+// HALFWORD( mem[mem[sp]] <= mem[sp+1] )
+// sp = sp + 2
+memory[140] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp]
+ `MC_MEM_R | `MC_W_B;
+memory[141] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[142] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a = mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[143] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_HALFWORD | `MC_GO_NEXT; // HALFWORD(mem[b] = a)
+`else
+memory[140] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_00100 (24) lessthan -------------------------------------
+// (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0
+// sp=sp+1
+`ifdef ENABLE_CMP
+memory[144] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[145] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_B; // b=mem[sp]
+memory[146] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthan_check
+ `MC_ALU_CMP_SIGNED | `MC_W_A | ((424>>2) << `P_ADDR) | `MC_BRANCH;
+`else
+memory[144] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_00101 (25) lessthanorequal -------------------------------------
+// (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0
+// sp=sp+1
+`ifdef ENABLE_CMP
+memory[148] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[149] = `MC_SEL_ADDR_SP | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_B; // b=mem[sp]
+memory[150] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthanorequal_check
+ `MC_ALU_CMP_SIGNED | `MC_W_A | ((420>>2) << `P_ADDR) | `MC_BRANCH;
+`else
+memory[148] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_00110 (26) ulessthan -------------------------------------
+// signA!=signB -> (unsigA < unsigB) == ~(sigA < sigA)
+// signA==signB -> (unsigA < unsigB) == (sigA < sigB)
+// (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0
+// sp=sp+1
+`ifdef ENABLE_CMP
+memory[152] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[153] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_B; // b=mem[sp]
+memory[154] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthan_check
+ `MC_ALU_CMP_UNSIGNED | `MC_W_A | ((424>>2) << `P_ADDR) | `MC_BRANCH;
+`else
+memory[152] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_00111 (27) ulessthanorequal -------------------------------------
+// (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0
+// sp=sp+1
+`ifdef ENABLE_CMP
+memory[156] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[157] = `MC_SEL_ADDR_SP | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_B; // b=mem[sp]
+memory[158] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthanorequal_check
+ `MC_ALU_CMP_UNSIGNED | `MC_W_A | ((420>>2) << `P_ADDR) | `MC_BRANCH;
+`else
+memory[156] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_01000 (28) swap -------------------------------------
+memory[160] = `MC_GO_BREAKPOINT;
+
+// 001_01001 (29) mult -------------------------------------
+`ifdef ENABLE_MULT
+// mem[sp+1] = mem[sp+1] * mem[sp]
+// sp = sp + 1
+memory[164] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[165] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp]
+ `MC_W_B;
+memory[166] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a * b DON'T COMBINE MULTICYCLE ALU
+ `MC_ALU_MULT | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE
+memory[167] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+memory[164] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | // b = 8 (#2 in emulate table)
+ `MC_W_B;
+memory[165] = `MC_EMULATE; // emulate #2 (mult opcode)
+`endif
+
+// 001_01010 (2a) lshiftright -------------------------------------
+`ifdef ENABLE_BARREL
+// b = mem[sp] & 5'b1111 : limit to 5 bits (max 31 shifts)
+// b = b | 7'b01_00000 : shift right, logical
+// sp=sp+1
+// a = mem[sp]
+// a = a >> b
+// mem[sp] = a
+memory[168] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B;
+memory[169] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_OR | // b = b | 7'b01_00000 (shift right, logical)
+ `MC_SEL_ALU_MC_CONST | (32 << `P_ADDR) | `MC_W_B;
+memory[170] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[171] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont
+ `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR);
+`else
+ `ifdef ENABLE_A_SHIFT
+// a = mem[sp] & 5'b11111
+// sp=sp+1
+// b = FLIP(mem[sp])
+// label: a <= 0 ? goto @fin
+// b = b << 1
+// a = a - 1 || goto @label
+// fin: a = FLIP(b)
+// mem[sp]=a
+memory[168] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST |
+ (31 << `P_ADDR) | `MC_W_A;
+memory[169] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[170] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = FLIP(mem[sp])
+ `MC_ALU_FLIP | `MC_W_B;
+memory[171] = `MC_BRANCH | ((448 >> 2) << `P_ADDR); // goto @lshiftleft_loop
+ `else
+ memory[168] = `MC_GO_BREAKPOINT;
+ `endif
+`endif
+
+// 001_01011 (2b) ashiftleft -------------------------------------
+`ifdef ENABLE_BARREL
+// b = mem[sp] & 5'b11111 : 5 bit shift
+// b = b | 7'b10_00000 : shift left, arithmetic
+// sp=sp+1
+// a = mem[sp]
+// a = a <<signed b
+// mem[sp] = a
+memory[172] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B;
+memory[173] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_OR | // b = b | 7'b10_00000 (shift left, arithmetic)
+ `MC_SEL_ALU_MC_CONST | (64 << `P_ADDR) | `MC_W_B;
+memory[174] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[175] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont
+ `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR);
+`else
+// a = mem[sp] & 5'b11111
+// sp = sp + 1
+// b = mem[sp]
+// label: a <= 0 ? goto @fin
+// b = b << 1
+// a = a - 1 || goto @label
+// fin: a = b
+// mem[sp] = a
+memory[172] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST |
+ (31 << `P_ADDR) | `MC_W_A;
+memory[173] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[174] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp]
+ `MC_W_B;
+memory[175] = `MC_BRANCH | ((440 >> 2) << `P_ADDR); // goto @ashiftleft_loop
+`endif
+
+// 001_01100 (2c) ashiftright -------------------------------------
+`ifdef ENABLE_BARREL
+// b = mem[sp] & 5'b11111 : 5 bit shift
+// b = b | 7'b00_00000 : shift right, arithmetic
+// sp=sp+1
+// a = mem[sp]
+// a = a >>signed b
+// mem[sp] = a
+memory[176] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B;
+memory[177] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[178] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont
+ `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR);
+`else
+ `ifdef ENABLE_A_SHIFT
+// a = mem[sp] & 5'b11111
+// sp = sp + 1
+// b = FLIP(mem[sp])
+// label: a <= 0 ? goto @fin
+// b = b signed_<< 1
+// a = a - 1 || goto @label
+// fin: a = FLIP(b)
+// mem[sp] = a
+memory[176] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111
+ `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST |
+ (31 << `P_ADDR) | `MC_W_A;
+memory[177] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[178] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = FLIP(mem[sp])
+ `MC_ALU_FLIP | `MC_W_B;
+memory[179] = `MC_BRANCH | ((432 >> 2) << `P_ADDR); // goto @ashiftright_loop
+ `else
+memory[176] = `MC_GO_BREAKPOINT;
+ `endif
+`endif
+
+// 001_01101 (2d) call -------------------------------------
+// a = mem[sp]
+// mem[sp]=pc+1
+// pc = a
+memory[180] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp]
+ `MC_MEM_R | `MC_W_B;
+memory[181] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS |
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; // a = pc + 1
+memory[182] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_ALU_NOP_B | // mem[sp] = a || pc = b
+ `MC_SEL_ALU_B | `MC_W_PC;
+memory[183] = `MC_FETCH; // op_cached? decode : goto next
+
+// 001_01110 (2e) eq -------------------------------------
+// a = mem[sp]
+// sp = sp + 1
+// (mem[sp] - a == 0) ? mem[sp] = 1 : mem[sp] = 0
+memory[184] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = NOT(mem[sp])
+ `MC_SEL_READ_DATA | `MC_ALU_NOT | `MC_W_A;
+memory[185] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR |`MC_ALU_PLUS | // a = a + 1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[186] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[187] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @eq_check
+ `MC_ALU_PLUS |`MC_SEL_ALU_A | `MC_W_A |
+ ( (416 >> 2) << `P_ADDR) | `MC_BRANCH;
+
+// 001_01111 (2f) neq -------------------------------------
+// a = mem[sp]
+// sp = sp + 1
+// (mem[sp] - a != 0) ? mem[sp] = 1 : mem[sp] = 0
+memory[188] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp])
+ `MC_MEM_R | `MC_ALU_NOT | `MC_W_A;
+memory[189] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR |`MC_ALU_PLUS | // a = a + 1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[190] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[191] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @neq_check
+ `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A |
+ ( (412 >> 2) << `P_ADDR) | `MC_BRANCH;
+
+// 001_10000 (30) neg -------------------------------------
+// a = NOT(mem[sp])
+// a = a + 1
+// mem[sp] = a
+memory[192] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp])
+ `MC_MEM_R | `MC_ALU_NOT | `MC_W_A;
+memory[193] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + 1
+ (1 << `P_ADDR) | `MC_SEL_ALU_MC_CONST | `MC_W_A;
+memory[194] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 001_10001 (31) sub -------------------------------------
+// mem[sp+1] = mem[sp+1] - mem[sp]
+// sp = sp + 1
+memory[196] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp])
+ `MC_MEM_R | `MC_ALU_NOT | `MC_W_A;
+memory[197] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + 1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[198] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[199] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @sub_cont (set_mem[sp]=a)
+ `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A | ((400>>2) << `P_ADDR) |
+ `MC_BRANCH;
+
+// 001_10010 (32) xor -------------------------------------
+`ifdef ENABLE_XOR
+// mem[sp+1] = mem[sp+1] ^ mem[sp]
+// sp = sp + 1
+memory[200] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[201] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a ^ mem[sp]
+ `MC_ALU_XOR |`MC_SEL_ALU_A | `MC_W_A;
+memory[202] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+// ALU doesn't perform XOR operation
+// mem[sp+1] = mem[sp] ^ mem[sp+1] -> A^B=(A&~B)|(~A&B)
+// a = ~mem[sp] --> a = ~A
+// sp = sp + 1
+// a = mem[sp] & a --> a = ~A&B
+// b = ~a --> b = A&~B
+// a = a | b --> a = ~A&B | A&~B
+// mem[sp] = a
+memory[200] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = ~mem[sp] --> a=~A
+ `MC_ALU_NOT | `MC_W_A;
+memory[201] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[202] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] & a --> a = ~A&B
+ `MC_ALU_AND | `MC_SEL_ALU_A | `MC_W_A;
+memory[203] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_NOT | // b = ~a || goto @xor_cont --> b = A&~B
+ `MC_W_B | `MC_BRANCH | ((428 >> 2) << `P_ADDR);
+`endif
+
+// 001_10011 (33) loadb -------------------------------------
+`ifdef ENABLE_BYTE_SELECT
+// mem[sp] = BYTE(mem[sp], mem[mem[sp]])
+memory[204] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp]
+ `MC_MEM_R | `MC_W_A;
+memory[205] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | // a = byte(a, mem[a])
+ `MC_W_A | `MC_BYTE;
+memory[206] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+// b=pc
+// pc = mem[sp]
+// opcode_cache=mem[pc]
+// a = opcode
+// mem[sp]=a
+// pc=b
+// fetch
+memory[204] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | // b = pc
+ `MC_W_B;
+memory[205] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // pc = mem[sp]
+ `MC_W_PC;
+memory[206] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc]
+ `MC_W_OPCODE;
+memory[207] = `MC_SEL_ALU_OPCODE | `MC_ALU_NOP_B | `MC_W_A | // a = opcode -> byte(pc, mem[pc]) || goto @loadb_continued
+ `MC_BRANCH | ( (396 >> 2) << `P_ADDR);
+`endif
+
+// 001_10100 (34) storeb -------------------------------------
+`ifdef ENABLE_BYTE_SELECT
+// BYTE( mem[mem[sp]] <= mem[sp+1] )
+// sp = sp + 2
+memory[208] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp]
+ `MC_MEM_R | `MC_W_B;
+memory[209] = `MC_SP_PLUS_4; // sp = sp + 1
+memory[210] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a = mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[211] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_BYTE | `MC_GO_NEXT; // BYTE(mem[b] = a)
+`else
+memory[208] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_10101 (35) div -------------------------------------
+`ifdef ENABLE_DIV
+// *** TODO: CHECK IF DIVIDE BY ZERO AND RAISE EXCEPTION ***
+// mem[sp+1] = mem[sp+1] / mem[sp]
+// sp = sp + 1
+memory[212] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[213] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp]
+ `MC_W_B;
+memory[214] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a / b DON'T COMBINE MULTICYCLE ALU
+ `MC_ALU_DIV | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE
+memory[215] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+memory[212] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_10110 (36) mod -------------------------------------
+`ifdef ENABLE_DIV
+// mem[sp+1] = mem[sp+1] % mem[sp]
+// sp = sp + 1
+memory[216] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[217] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp]
+ `MC_W_B;
+memory[218] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a % b DON'T COMBINE MULTICYCLE ALU
+ `MC_ALU_MOD | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE
+memory[219] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+memory[216] = `MC_GO_BREAKPOINT;
+`endif
+
+// 001_10111 (37) eqbranch -------------------------------------
+// a = sp + 1
+// a = mem[a]
+// a = mem[sp] || a == 0 ? { pc = pc + a; sp = sp + 2 }
+// else { sp = sp + 2, pc = pc + 1 }
+memory[220] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + 1
+ `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) |
+ `MC_W_A;
+memory[221] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_W_A; // a = mem[a]
+memory[222] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A | // a = mem[sp] || a == 0 ? goto 456 (sp=sp+2, pc=pc+a)
+ `MC_BRANCHIF_A_ZERO | ((456>>2) << `P_ADDR);
+memory[223] = `MC_BRANCH | ((460>>2) << `P_ADDR); // else goto 460 (sp=sp+2, pc=pc+1)
+
+// 001_11000 (38) neqbranch -------------------------------------
+// a = sp + 1
+// a = mem[a]
+// a = mem[sp] || a == 0 ? { sp = sp + 2, pc = pc + 1 }
+// else { sp = sp + 2, pc = pc + a }
+memory[224] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + 1
+ `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) |
+ `MC_W_A;
+memory[225] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_W_A; // a = mem[a]
+memory[226] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A | // a = mem[sp] || a == 0 ? goto 460 (sp=sp+2, pc=pc+1)
+ `MC_BRANCHIF_A_ZERO | ((460>>2) << `P_ADDR);
+memory[227] = `MC_BRANCH | ((456>>2) << `P_ADDR); // else goto 456 (sp=sp+2, pc=pc+a)
+
+// 001_11001 (39) poppcrel -------------------------------------
+// a = mem[sp]
+// sp = sp + 1
+// pc = pc + a
+memory[228] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a=mem[sp] || sp=sp+1
+ `MC_W_A_MEM | `MC_SP_PLUS_4;
+memory[229] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // pc = pc + a
+ `MC_ALU_PLUS | `MC_W_PC;
+memory[230] = `MC_FETCH; // op_cached? decode : goto next
+
+// 001_11010 (3a) config -------------------------------------
+memory[232] = `MC_GO_BREAKPOINT;
+
+// 001_11011 (3b) pushpc -------------------------------------
+// sp = sp - 1
+// mem[sp] = pc
+memory[236] = `MC_CLEAR_IDIM | `MC_SP_MINUS_4 | `MC_W_A; // a = sp = sp - 1
+memory[237] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 001_11100 (3c) syscall_emulate ------------------------------
+memory[240] = `MC_GO_BREAKPOINT;
+
+// 001_11101 (3d) pushspadd -------------------------------------
+// a = mem[sp] << 2
+// mem[sp] = a + sp
+`ifdef ENABLE_BARREL
+memory[244] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp]
+ `MC_W_A_MEM;
+memory[245] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_BARREL | // a = a << 2 (left,arithmetic->10_00010)
+ `MC_SEL_ALU_MC_CONST | ( 66 << `P_ADDR) | `MC_W_A;
+memory[246] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + sp
+ `MC_ALU_PLUS | `MC_W_A;
+memory[247] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+memory[244] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM; // a = mem[sp]
+memory[245] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + a
+ `MC_ALU_PLUS | `MC_W_A;
+memory[246] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + a
+ `MC_ALU_PLUS | `MC_W_A;
+memory[247] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + sp || goto @cont (->mem[sp] = a)
+ `MC_ALU_PLUS | `MC_W_A | ((400>>2) << `P_ADDR) | `MC_BRANCH;
+`endif
+
+// 001_11110 (3e) halfmult -------------------------------------
+memory[248] = `MC_GO_BREAKPOINT;
+
+// 001_11111 (3f) callpcrel -------------------------------------
+// a = mem[sp]
+// mem[sp]=pc+1
+// pc = pc + a
+memory[252] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp]
+ `MC_MEM_R | `MC_W_B;
+memory[253] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = pc + 1
+ `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[254] = `MC_SEL_ADDR_SP | `MC_MEM_W; // mem[sp] = a;
+memory[255] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // pc = pc + b, goto @fetch
+ `MC_ALU_PLUS | `MC_W_PC | `MC_GO_FETCH;
+
+// --------------------- MICROCODE HOLE -----------------------------------
+
+
+
+
+// --------------------- CONTINUATION OF COMPLEX OPCODES ------------------
+
+`ifdef ENABLE_BYTE_SELECT
+// ipsum_end: ----------
+memory[392] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | // sp=0
+ `MC_W_SP;
+memory[393] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // pc=mem[sp] restore next pc
+ `MC_W_PC;
+memory[394] = `MC_SP_PLUS_4; // sp=sp+4
+memory[395] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[sp] restore sp
+ `MC_W_SP;
+memory[396] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (sum)
+memory[397] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_FETCH; // mem[sp]=a || fetch (return sum)
+`endif
+
+`ifndef ENABLE_BYTE_SELECT
+// loadb continued microcode -----
+// mem[sp]=a || pc=b
+// opcode_cache=mem[pc] || go next
+memory[396] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_SEL_ALU_B | // mem[sp]=a || pc=b
+ `MC_ALU_NOP_B | `MC_W_PC;
+memory[397] = `MC_SEL_ADDR_PC | `MC_MEM_R | `MC_W_OPCODE | `MC_GO_NEXT; // opcode_cache=mem[pc] || go next
+`endif
+
+// sub/pushspadd continued microcode ----------------
+memory[400] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// ----- hole ------
+
+`ifdef ENABLE_BYTE_SELECT
+// ipsum_continue2: ------------
+memory[408] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // pc=pc-1; a=pc
+ `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_PC |
+ `MC_W_A;
+memory[409] = `MC_BRANCH | ((124 >> 2) << `P_ADDR); // goto @ipsum_loop
+`endif
+
+// neqcheck ----------
+memory[412] = `MC_BRANCHIF_A_ZERO | ((468 >> 2) << `P_ADDR); // a == 0 ? goto @set_mem[sp]=0
+memory[413] = `MC_BRANCH | ((464 >> 2) << `P_ADDR); // else goto @set_mem[sp]=1
+
+// eqcheck ----------
+memory[416] = `MC_BRANCHIF_A_ZERO | ((464 >> 2) << `P_ADDR); // a == 0 ? goto @set_mem[sp]=1
+memory[417] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0
+
+// lessthanorequal_check ----
+memory[420] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((464 >> 2) << `P_ADDR); // a <= 0 ? goto @set_mem[sp]=1
+memory[421] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0
+
+// lessthan_check ----
+memory[424] = `MC_BRANCHIF_A_NEG | ((464 >> 2) << `P_ADDR); // a < 0 ? goto @set_mem[sp]=1
+memory[425] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0
+
+// xor_cont continued microcode -----------------------------------
+`ifndef ENABLE_XOR
+memory[428] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_OR | // a = a | b --> a = ~A&B | A&~B
+ `MC_SEL_ALU_B | `MC_W_A;
+memory[429] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`endif
+
+// ashiftright_loop continued microcode -----------------------------------
+`ifdef ENABLE_BARREL
+memory[432] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_BARREL | // a = a {<<|>>} b
+ `MC_SEL_ALU_B | `MC_W_A;
+memory[433] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`else
+ `ifdef ENABLE_A_SHIFT
+memory[432] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((436 >> 2) << `P_ADDR); // (a <= 0) ? goto @ashiftright_exit
+memory[433] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1)
+ `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A;
+memory[434] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b signed_<< 1 || goto @ashiftright_loop
+ `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((432 >>2) << `P_ADDR);
+// ashiftright_exit
+memory[436] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_FLIP | // a = FLIP(b)
+ `MC_W_A;
+memory[437] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+ `endif
+`endif
+
+// ashiftleft_loop continued microcode -----------------------------------
+`ifndef ENABLE_BARREL
+memory[440] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((444 >> 2) << `P_ADDR);// (a <= 0) ? goto @ashiftleft_exit
+memory[441] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1)
+ `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A;
+memory[442] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b << 1 || goto @ashiftleft_loop
+ `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((440 >>2) << `P_ADDR);
+// ashiftleft_exit
+memory[444] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_NOP | // a = b
+ `MC_W_A;
+memory[445] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`endif
+
+// lshiftright_loop continued microcode -----------------------------------
+`ifdef ENABLE_A_SHIFT
+memory[448] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((452 >> 2) << `P_ADDR);// (a <= 0) ? goto @lshiftright_exit
+memory[449] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1)
+ `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A;
+memory[450] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b << 1 || goto @lshiftright_loop
+ `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((448 >>2) << `P_ADDR);
+// lshiftright_exit
+memory[452] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_FLIP | // a = FLIP(b)
+ `MC_W_A;
+memory[453] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+`endif
+
+// neqbranch / eqbranch --- continued microcode -------------------------------------
+// sp = sp + 2
+// pc = pc + a
+memory[456] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp = sp + 2
+ `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | `MC_W_SP;
+memory[457] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // pc = pc + a
+ `MC_ALU_PLUS | `MC_W_PC;
+memory[458] = `MC_FETCH; // op_cached? decode : goto fetch
+
+// neqbranch / eqbranch --- continued microcode -------------------------------------
+// sp = sp + 2
+// pc = pc + 1
+memory[460] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp = sp + 2
+ `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | `MC_W_SP;
+memory[461] = `MC_PC_PLUS_1; // pc = pc + 1
+memory[462] = `MC_FETCH; // op_cached? decode : goto fetch
+
+// neq / eq / lessthan_1 --- continued microcode --------------------
+// mem[sp] = 1
+memory[464] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | (1 << `P_ADDR) | // a = 1
+ `MC_W_A;
+memory[465] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// neq / eq / lessthan_0 --- continued microcode --------------------
+// mem[sp] = 0
+memory[468] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | (0 << `P_ADDR) | // a = 0
+ `MC_W_A;
+memory[469] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// MICROCODE ENTRY POINT AFTER RESET -------------------------------
+// initialize cpu registers
+// sp = @SP_START
+// pc = @RESET_VECTOR
+memory[473] = 0; // reserved and empty for correct cpu startup
+memory[474] = `MC_CLEAR_IDIM |`MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | // sp = @SP_START
+ (`SP_START << `P_ADDR) | `MC_W_SP;
+memory[475] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | `MC_W_PC | // pc = @RESET
+ (`RESET_VECTOR << `P_ADDR) | `MC_EXIT_INTERRUPT; // enable interrupts on reset
+// fall throught fetch/decode
+
+// FETCH / DECODE -------------------------------------
+// opcode=mem[pc]
+// decode (goto microcode entry point for opcode)
+memory[476] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc]
+ `MC_W_OPCODE;
+memory[477] = `MC_DECODE; // decode jump to microcode
+
+// NEXT OPCODE -------------------------------------
+// pc = pc + 1
+// opcode cached ? decode : goto fetch
+memory[480] = `MC_PC_PLUS_1; // pc = pc + 1
+memory[481] = `MC_FETCH; // pc_cached ? decode else fetch,decode
+
+// INTERRUPT REQUEST -------------------------------------
+// sp = sp - 1
+// mem[sp] = pc
+// pc = mem[EMULATED_VECTORS + 0]
+memory[484] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | // b = 0 (#0 in emulate table) || disable interrupts
+ `MC_W_B | `MC_ENTER_INTERRUPT;
+memory[485] = `MC_EMULATE; // emulate #0 (interrupt)
+
+// ---------------- OPCODES WITH PARAMETER IN OPCODE ----------------
+
+// im x (idim=0) 1_xxxxxxx -------------------------------------
+// sp = sp - 1
+// mem[sp] = IMM(IDIM, opcode)
+// idim = 1
+memory[488] = `MC_SP_MINUS_4; // sp = sp - 1
+memory[489] = `MC_SEL_ALU_OPCODE | `MC_ALU_IM | `MC_W_A; // a = IMM(IDIM, opcode)
+memory[490] = `MC_SET_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_W | // MEM[sp] = a; IDIM=1
+ `MC_GO_NEXT;
+
+// 1_xxxxxxx im x (idim=1) -------------------------------------
+// mem[sp] = IMM(IDIM, mem[sp], opcode)
+memory[491] = `MC_SET_IDIM | `MC_SEL_READ_DATA | `MC_SEL_ADDR_SP | // a = IMM(IDIM, MEM[sp], opcode)
+ `MC_MEM_R | `MC_SEL_ALU_OPCODE | `MC_ALU_IM | `MC_W_A;
+memory[492] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // MEM[sp] = a
+
+// 010_xxxxx storesp x
+// mem[sp + x<<2] = mem[sp]
+// sp = sp + 1
+memory[493] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // b = sp + offset
+ `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_B;
+memory[494] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1
+ `MC_SP_PLUS_4;
+memory[495] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_GO_NEXT; // mem[b] = a
+
+// 011_xxxxx loadsp x -------------------------------------
+// mem[sp-1] = mem [sp + x<<2]
+// sp = sp - 1
+memory[496] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + offset
+ `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_A;
+memory[497] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a]
+memory[498] = `MC_SP_MINUS_4; // sp = sp - 1
+memory[499] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 0001_xxxx addsp x -------------------------------------
+// mem[sp] = mem[sp] + mem[sp + x<<2]
+memory[500] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + offset
+ `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_A;
+memory[501] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a]
+memory[502] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R |
+ `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A; // a = a + mem[sp]
+memory[503] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a
+
+// 001_xxxxx emulate x -------------------------------------
+// <expects b = offset into table for emulated opcode>
+// sp = sp - 1
+// mem[sp] = pc + 1 emulated opcode microcode must set b to
+// a=@EMULATION_TABLE offset inside emulated_table prior to
+// pc = mem[a + b] calling the emulate microcode
+// fetch
+memory[504] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | // a = pc + 1
+ `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A;
+memory[505] = `MC_SP_MINUS_4; // sp = sp - 1
+memory[506] = `MC_SEL_ADDR_SP | `MC_MEM_W; // mem[sp] = a
+memory[507] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | `MC_W_A | // a = @vector_emulated
+ (`EMULATION_VECTOR << `P_ADDR);
+memory[508] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + b
+ `MC_SEL_ALU_B | `MC_W_A;
+memory[509] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_SEL_READ_DATA | // pc = mem[a]
+ `MC_ALU_NOP | `MC_W_PC;
+memory[510] = `MC_FETCH;
+
+// --------------------- END OF MICROCODE PROGRAM --------------------------
+end
+
+endmodule
diff --git a/zpu/hdl/avalanche/readme.txt b/zpu/hdl/avalanche/readme.txt
new file mode 100644
index 0000000..3eb1baf
--- /dev/null
+++ b/zpu/hdl/avalanche/readme.txt
@@ -0,0 +1,91 @@
+This ZPU implementation, codenamed "avalanche" was
+contributed by Antonio Anton <antonio.anton@anro-ingenieros.com>.
+
+It's most interesting aspects are it's implementation using
+microcode, small size, reduced code size overhead and that
+it's implemented in Verilog.
+
+Please direct any questions to the zylin-zpu mailing list.
+
+The most urgently needed patches would be to provide working
+simulation examples and improved documentation.
+
+
+Øyvind Harboe
+
+
+Notes from Antonio:
+
+Hi,
+
+attached goes my zpu implementation in verilog in case anybody is
+interested in. Code is quite commented. Also microcode and opcodes are
+exhaustive commented (and more accurate that the HTML documentation in
+some cases :-) ).
+
+At the moment I have no time to send a working environment but I will
+get some time in next days and prepare a clean environment
+(software/hardware) and send to the list. The target HW is spartan3
+starter kit board (all peripherals working: vga, sram, uarts, etc.).
+
+Feel free to ask any question to the list I will do my best to answer
+quickly.
+
+Regards
+Antonio
+
+Hi,
+
+the zpu_core is complete and lot of bugs has been solved in the past but
+extensive testing and a complete test program has not been
+defined/executed; anyway I'm quite confident it works: this core
+executes eCos, FreeRTOS, Forth and other applications.
+
+Regarding FPGA resources for a "balanced" implementation (not the
+smallest, not the fastest):
+
+-cpu+alu+microcode rom: 671 LUT + 239 FF + 1 BRAM (50% of LUT is ALU)
+-complete soc (cpu, vga, uart, memory controller, interrupt controller,
+timers, gpio, spi, etc.): 1317 LUT + 716 FF + 1 BRAM
+
+Regarding "modelsim hello world"; I'm sorry but I don't modelsim;
+instead I use Icarus Verilog & gtkwave. The core has a "debug" facility
+which displays all opcode and registers (memory changes, sp, pc, etc..)
+during simulation execution.
+
+Regards
+Antonio
+
+
+> > Regarding FPGA resources for a "balanced" implementation (not the
+> > smallest, not the fastest):
+> >
+> > -cpu+alu+microcode rom: 671 LUT + 239 FF + 1 BRAM (50% of LUT is ALU)
+>
+> Are there any emulated instructions not implemented in
+> microcode?
+>
+
+*All* zpu opcodes are microcoded. For some opcodes (like *shift*),
+there are two versions; 32 bit barrel shift in HDL (up to 32 clocks) or
+1 bit shift in HDL microcode drived (up to ~130 clocks). They are
+selectable via `DEFINES in the zpu_core_defines.v
+
+Other opcodes like mult and div are 32 bit HDL only at the moment (there
+are enough room in microcode memory to implement as microcode) and
+software emulable as well.
+
+For the above figures (671 LUT + 239 FF): *shift* are 32 bit HDL and
+mult/div are software implemented.
+
+There are new opcodes (as per my needs) like memory bulk copy (sncpy,
+wcpy, wset) and ip checksum calculation (ipsum). There are room in
+microccode memory to define new opcodes using the holes in the ISA (for
+a complete list of opcodes and its function please see
+zpu_core_defines.v).
+
+Some future ideas (easy to implement in microcode)
+-on-chip debug
+-microcode update via software
+
+Regards
diff --git a/zpu/hdl/example/.cvsignore b/zpu/hdl/example/.cvsignore
new file mode 100644
index 0000000..8238018
--- /dev/null
+++ b/zpu/hdl/example/.cvsignore
@@ -0,0 +1,3 @@
+work
+vsim.wlf
+install
diff --git a/zpu/hdl/example/bram_dmips.vhd b/zpu/hdl/example/bram_dmips.vhd
new file mode 100644
index 0000000..07b19f4
--- /dev/null
+++ b/zpu/hdl/example/bram_dmips.vhd
@@ -0,0 +1,3356 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+entity dualport_ram is
+port (clk : in std_logic;
+ memAWriteEnable : in std_logic;
+ memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memAWrite : in std_logic_vector(wordSize-1 downto 0);
+ memARead : out std_logic_vector(wordSize-1 downto 0);
+ memBWriteEnable : in std_logic;
+ memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memBWrite : in std_logic_vector(wordSize-1 downto 0);
+ memBRead : out std_logic_vector(wordSize-1 downto 0));
+end dualport_ram;
+
+architecture dualport_ram_arch of dualport_ram is
+
+
+type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0);
+
+shared variable ram : ram_type :=
+(
+ 0 => x"0b0b0b0b",
+ 1 => x"82700b0b",
+ 2 => x"80d5f40c",
+ 3 => x"3a0b0b80",
+ 4 => x"c4fb0400",
+ 5 => x"00000000",
+ 6 => x"00000000",
+ 7 => x"00000000",
+ 8 => x"80088408",
+ 9 => x"88080b0b",
+ 10 => x"80c5c22d",
+ 11 => x"880c840c",
+ 12 => x"800c0400",
+ 13 => x"00000000",
+ 14 => x"00000000",
+ 15 => x"00000000",
+ 16 => x"71fd0608",
+ 17 => x"72830609",
+ 18 => x"81058205",
+ 19 => x"832b2a83",
+ 20 => x"ffff0652",
+ 21 => x"04000000",
+ 22 => x"00000000",
+ 23 => x"00000000",
+ 24 => x"71fd0608",
+ 25 => x"83ffff73",
+ 26 => x"83060981",
+ 27 => x"05820583",
+ 28 => x"2b2b0906",
+ 29 => x"7383ffff",
+ 30 => x"0b0b0b0b",
+ 31 => x"83a70400",
+ 32 => x"72098105",
+ 33 => x"72057373",
+ 34 => x"09060906",
+ 35 => x"73097306",
+ 36 => x"070a8106",
+ 37 => x"53510400",
+ 38 => x"00000000",
+ 39 => x"00000000",
+ 40 => x"72722473",
+ 41 => x"732e0753",
+ 42 => x"51040000",
+ 43 => x"00000000",
+ 44 => x"00000000",
+ 45 => x"00000000",
+ 46 => x"00000000",
+ 47 => x"00000000",
+ 48 => x"71737109",
+ 49 => x"71068106",
+ 50 => x"30720a10",
+ 51 => x"0a720a10",
+ 52 => x"0a31050a",
+ 53 => x"81065151",
+ 54 => x"53510400",
+ 55 => x"00000000",
+ 56 => x"72722673",
+ 57 => x"732e0753",
+ 58 => x"51040000",
+ 59 => x"00000000",
+ 60 => x"00000000",
+ 61 => x"00000000",
+ 62 => x"00000000",
+ 63 => x"00000000",
+ 64 => x"00000000",
+ 65 => x"00000000",
+ 66 => x"00000000",
+ 67 => x"00000000",
+ 68 => x"00000000",
+ 69 => x"00000000",
+ 70 => x"00000000",
+ 71 => x"00000000",
+ 72 => x"0b0b0b88",
+ 73 => x"c3040000",
+ 74 => x"00000000",
+ 75 => x"00000000",
+ 76 => x"00000000",
+ 77 => x"00000000",
+ 78 => x"00000000",
+ 79 => x"00000000",
+ 80 => x"720a722b",
+ 81 => x"0a535104",
+ 82 => x"00000000",
+ 83 => x"00000000",
+ 84 => x"00000000",
+ 85 => x"00000000",
+ 86 => x"00000000",
+ 87 => x"00000000",
+ 88 => x"72729f06",
+ 89 => x"0981050b",
+ 90 => x"0b0b88a6",
+ 91 => x"05040000",
+ 92 => x"00000000",
+ 93 => x"00000000",
+ 94 => x"00000000",
+ 95 => x"00000000",
+ 96 => x"72722aff",
+ 97 => x"739f062a",
+ 98 => x"0974090a",
+ 99 => x"8106ff05",
+ 100 => x"06075351",
+ 101 => x"04000000",
+ 102 => x"00000000",
+ 103 => x"00000000",
+ 104 => x"71715351",
+ 105 => x"020d0406",
+ 106 => x"73830609",
+ 107 => x"81058205",
+ 108 => x"832b0b2b",
+ 109 => x"0772fc06",
+ 110 => x"0c515104",
+ 111 => x"00000000",
+ 112 => x"72098105",
+ 113 => x"72050970",
+ 114 => x"81050906",
+ 115 => x"0a810653",
+ 116 => x"51040000",
+ 117 => x"00000000",
+ 118 => x"00000000",
+ 119 => x"00000000",
+ 120 => x"72098105",
+ 121 => x"72050970",
+ 122 => x"81050906",
+ 123 => x"0a098106",
+ 124 => x"53510400",
+ 125 => x"00000000",
+ 126 => x"00000000",
+ 127 => x"00000000",
+ 128 => x"71098105",
+ 129 => x"52040000",
+ 130 => x"00000000",
+ 131 => x"00000000",
+ 132 => x"00000000",
+ 133 => x"00000000",
+ 134 => x"00000000",
+ 135 => x"00000000",
+ 136 => x"72720981",
+ 137 => x"05055351",
+ 138 => x"04000000",
+ 139 => x"00000000",
+ 140 => x"00000000",
+ 141 => x"00000000",
+ 142 => x"00000000",
+ 143 => x"00000000",
+ 144 => x"72097206",
+ 145 => x"73730906",
+ 146 => x"07535104",
+ 147 => x"00000000",
+ 148 => x"00000000",
+ 149 => x"00000000",
+ 150 => x"00000000",
+ 151 => x"00000000",
+ 152 => x"71fc0608",
+ 153 => x"72830609",
+ 154 => x"81058305",
+ 155 => x"1010102a",
+ 156 => x"81ff0652",
+ 157 => x"04000000",
+ 158 => x"00000000",
+ 159 => x"00000000",
+ 160 => x"71fc0608",
+ 161 => x"0b0b80d5",
+ 162 => x"e0738306",
+ 163 => x"10100508",
+ 164 => x"060b0b0b",
+ 165 => x"88a90400",
+ 166 => x"00000000",
+ 167 => x"00000000",
+ 168 => x"80088408",
+ 169 => x"88087575",
+ 170 => x"0b0b0bad",
+ 171 => x"aa2d5050",
+ 172 => x"80085688",
+ 173 => x"0c840c80",
+ 174 => x"0c510400",
+ 175 => x"00000000",
+ 176 => x"80088408",
+ 177 => x"88087575",
+ 178 => x"0b0b0bad",
+ 179 => x"ee2d5050",
+ 180 => x"80085688",
+ 181 => x"0c840c80",
+ 182 => x"0c510400",
+ 183 => x"00000000",
+ 184 => x"72097081",
+ 185 => x"0509060a",
+ 186 => x"8106ff05",
+ 187 => x"70547106",
+ 188 => x"73097274",
+ 189 => x"05ff0506",
+ 190 => x"07515151",
+ 191 => x"04000000",
+ 192 => x"72097081",
+ 193 => x"0509060a",
+ 194 => x"098106ff",
+ 195 => x"05705471",
+ 196 => x"06730972",
+ 197 => x"7405ff05",
+ 198 => x"06075151",
+ 199 => x"51040000",
+ 200 => x"05ff0504",
+ 201 => x"00000000",
+ 202 => x"00000000",
+ 203 => x"00000000",
+ 204 => x"00000000",
+ 205 => x"00000000",
+ 206 => x"00000000",
+ 207 => x"00000000",
+ 208 => x"810b0b0b",
+ 209 => x"80d5f00c",
+ 210 => x"51040000",
+ 211 => x"00000000",
+ 212 => x"00000000",
+ 213 => x"00000000",
+ 214 => x"00000000",
+ 215 => x"00000000",
+ 216 => x"71810552",
+ 217 => x"04000000",
+ 218 => x"00000000",
+ 219 => x"00000000",
+ 220 => x"00000000",
+ 221 => x"00000000",
+ 222 => x"00000000",
+ 223 => x"00000000",
+ 224 => x"00000000",
+ 225 => x"00000000",
+ 226 => x"00000000",
+ 227 => x"00000000",
+ 228 => x"00000000",
+ 229 => x"00000000",
+ 230 => x"00000000",
+ 231 => x"00000000",
+ 232 => x"02840572",
+ 233 => x"10100552",
+ 234 => x"04000000",
+ 235 => x"00000000",
+ 236 => x"00000000",
+ 237 => x"00000000",
+ 238 => x"00000000",
+ 239 => x"00000000",
+ 240 => x"00000000",
+ 241 => x"00000000",
+ 242 => x"00000000",
+ 243 => x"00000000",
+ 244 => x"00000000",
+ 245 => x"00000000",
+ 246 => x"00000000",
+ 247 => x"00000000",
+ 248 => x"717105ff",
+ 249 => x"05715351",
+ 250 => x"020d0400",
+ 251 => x"00000000",
+ 252 => x"00000000",
+ 253 => x"00000000",
+ 254 => x"00000000",
+ 255 => x"00000000",
+ 256 => x"82fd3fbf",
+ 257 => x"a03f0410",
+ 258 => x"10101010",
+ 259 => x"10101010",
+ 260 => x"10101010",
+ 261 => x"10101010",
+ 262 => x"10101010",
+ 263 => x"10101010",
+ 264 => x"10101010",
+ 265 => x"10105351",
+ 266 => x"047381ff",
+ 267 => x"06738306",
+ 268 => x"09810583",
+ 269 => x"05101010",
+ 270 => x"2b0772fc",
+ 271 => x"060c5151",
+ 272 => x"043c0472",
+ 273 => x"72807281",
+ 274 => x"06ff0509",
+ 275 => x"72060571",
+ 276 => x"1052720a",
+ 277 => x"100a5372",
+ 278 => x"ed385151",
+ 279 => x"535104ff",
+ 280 => x"3d0d0b0b",
+ 281 => x"80e5e408",
+ 282 => x"52710870",
+ 283 => x"882a8132",
+ 284 => x"70810651",
+ 285 => x"515170f1",
+ 286 => x"3873720c",
+ 287 => x"833d0d04",
+ 288 => x"80d5f008",
+ 289 => x"802ea438",
+ 290 => x"80d5f408",
+ 291 => x"822ebd38",
+ 292 => x"8380800b",
+ 293 => x"0b0b80e5",
+ 294 => x"e40c82a0",
+ 295 => x"800b80e5",
+ 296 => x"e80c8290",
+ 297 => x"800b80e5",
+ 298 => x"ec0c04f8",
+ 299 => x"808080a4",
+ 300 => x"0b0b0b80",
+ 301 => x"e5e40cf8",
+ 302 => x"80808280",
+ 303 => x"0b80e5e8",
+ 304 => x"0cf88080",
+ 305 => x"84800b80",
+ 306 => x"e5ec0c04",
+ 307 => x"80c0a880",
+ 308 => x"8c0b0b0b",
+ 309 => x"80e5e40c",
+ 310 => x"80c0a880",
+ 311 => x"940b80e5",
+ 312 => x"e80c0b0b",
+ 313 => x"80c7d00b",
+ 314 => x"80e5ec0c",
+ 315 => x"04f23d0d",
+ 316 => x"6080e5e8",
+ 317 => x"08565d82",
+ 318 => x"750c8059",
+ 319 => x"805a800b",
+ 320 => x"8f3d5d5b",
+ 321 => x"7a101015",
+ 322 => x"70087108",
+ 323 => x"719f2c7e",
+ 324 => x"852b5855",
+ 325 => x"557d5359",
+ 326 => x"5799993f",
+ 327 => x"7d7f7a72",
+ 328 => x"077c7207",
+ 329 => x"71716081",
+ 330 => x"05415f5d",
+ 331 => x"5b595755",
+ 332 => x"817b278f",
+ 333 => x"38767d0c",
+ 334 => x"77841e0c",
+ 335 => x"7c800c90",
+ 336 => x"3d0d0480",
+ 337 => x"e5e80855",
+ 338 => x"ffba3970",
+ 339 => x"7080e5f0",
+ 340 => x"335170a7",
+ 341 => x"3880d5fc",
+ 342 => x"08700852",
+ 343 => x"5270802e",
+ 344 => x"94388412",
+ 345 => x"80d5fc0c",
+ 346 => x"702d80d5",
+ 347 => x"fc087008",
+ 348 => x"525270ee",
+ 349 => x"38810b80",
+ 350 => x"e5f03450",
+ 351 => x"50040470",
+ 352 => x"0b0b80e5",
+ 353 => x"e008802e",
+ 354 => x"8e380b0b",
+ 355 => x"0b0b800b",
+ 356 => x"802e0981",
+ 357 => x"06833850",
+ 358 => x"040b0b80",
+ 359 => x"e5e0510b",
+ 360 => x"0b0bf4dc",
+ 361 => x"3f500404",
+ 362 => x"ff3d0d02",
+ 363 => x"8f053352",
+ 364 => x"718a2e8a",
+ 365 => x"387151fd",
+ 366 => x"a63f833d",
+ 367 => x"0d048d51",
+ 368 => x"fd9d3f71",
+ 369 => x"51fd983f",
+ 370 => x"833d0d04",
+ 371 => x"ce3d0db5",
+ 372 => x"3d707084",
+ 373 => x"0552088b",
+ 374 => x"a85c56a5",
+ 375 => x"3d5e5c80",
+ 376 => x"75708105",
+ 377 => x"5733765b",
+ 378 => x"55587378",
+ 379 => x"2e80c138",
+ 380 => x"8e3d5b73",
+ 381 => x"a52e0981",
+ 382 => x"0680c538",
+ 383 => x"78708105",
+ 384 => x"5a335473",
+ 385 => x"80e42e81",
+ 386 => x"b6387380",
+ 387 => x"e42480c6",
+ 388 => x"387380e3",
+ 389 => x"2ea13880",
+ 390 => x"52a55179",
+ 391 => x"2d805273",
+ 392 => x"51792d82",
+ 393 => x"18587870",
+ 394 => x"81055a33",
+ 395 => x"5473c438",
+ 396 => x"77800cb4",
+ 397 => x"3d0d047b",
+ 398 => x"841d8312",
+ 399 => x"33565d57",
+ 400 => x"80527351",
+ 401 => x"792d8118",
+ 402 => x"79708105",
+ 403 => x"5b335558",
+ 404 => x"73ffa038",
+ 405 => x"db397380",
+ 406 => x"f32e0981",
+ 407 => x"06ffb838",
+ 408 => x"7b841d71",
+ 409 => x"08595d56",
+ 410 => x"80773355",
+ 411 => x"5673762e",
+ 412 => x"8d388116",
+ 413 => x"70187033",
+ 414 => x"57555674",
+ 415 => x"f538ff16",
+ 416 => x"55807625",
+ 417 => x"ffa03876",
+ 418 => x"70810558",
+ 419 => x"33548052",
+ 420 => x"7351792d",
+ 421 => x"811875ff",
+ 422 => x"17575758",
+ 423 => x"807625ff",
+ 424 => x"85387670",
+ 425 => x"81055833",
+ 426 => x"54805273",
+ 427 => x"51792d81",
+ 428 => x"1875ff17",
+ 429 => x"57575875",
+ 430 => x"8024cc38",
+ 431 => x"fee8397b",
+ 432 => x"841d7108",
+ 433 => x"70719f2c",
+ 434 => x"5953595d",
+ 435 => x"56807524",
+ 436 => x"81913875",
+ 437 => x"7d7c5856",
+ 438 => x"54805773",
+ 439 => x"772e0981",
+ 440 => x"06b638b0",
+ 441 => x"7b3402b5",
+ 442 => x"05567a76",
+ 443 => x"2e9738ff",
+ 444 => x"16567533",
+ 445 => x"75708105",
+ 446 => x"57348117",
+ 447 => x"577a762e",
+ 448 => x"098106eb",
+ 449 => x"38807534",
+ 450 => x"767dff12",
+ 451 => x"57585675",
+ 452 => x"8024fef3",
+ 453 => x"38fe8f39",
+ 454 => x"8a527351",
+ 455 => x"9fd03f80",
+ 456 => x"0880c7d4",
+ 457 => x"05337670",
+ 458 => x"81055834",
+ 459 => x"8a527351",
+ 460 => x"9ef83f80",
+ 461 => x"08548008",
+ 462 => x"802effae",
+ 463 => x"388a5273",
+ 464 => x"519fab3f",
+ 465 => x"800880c7",
+ 466 => x"d4053376",
+ 467 => x"70810558",
+ 468 => x"348a5273",
+ 469 => x"519ed33f",
+ 470 => x"80085480",
+ 471 => x"08ffb938",
+ 472 => x"ff883974",
+ 473 => x"527653b4",
+ 474 => x"3dffb805",
+ 475 => x"51949a3f",
+ 476 => x"a33d0856",
+ 477 => x"fedd3980",
+ 478 => x"3d0d80c1",
+ 479 => x"0b81b4bc",
+ 480 => x"34800b81",
+ 481 => x"b6980c70",
+ 482 => x"800c823d",
+ 483 => x"0d04ff3d",
+ 484 => x"0d800b81",
+ 485 => x"b4bc3352",
+ 486 => x"527080c1",
+ 487 => x"2e993871",
+ 488 => x"81b69808",
+ 489 => x"0781b698",
+ 490 => x"0c80c20b",
+ 491 => x"81b4c034",
+ 492 => x"70800c83",
+ 493 => x"3d0d0481",
+ 494 => x"0b81b698",
+ 495 => x"080781b6",
+ 496 => x"980c80c2",
+ 497 => x"0b81b4c0",
+ 498 => x"3470800c",
+ 499 => x"833d0d04",
+ 500 => x"fd3d0d75",
+ 501 => x"70088a05",
+ 502 => x"535381b4",
+ 503 => x"bc335170",
+ 504 => x"80c12e8b",
+ 505 => x"3873f338",
+ 506 => x"70800c85",
+ 507 => x"3d0d04ff",
+ 508 => x"127081b4",
+ 509 => x"b8083174",
+ 510 => x"0c800c85",
+ 511 => x"3d0d04fc",
+ 512 => x"3d0d81b4",
+ 513 => x"c4085574",
+ 514 => x"802e8c38",
+ 515 => x"76750871",
+ 516 => x"0c81b4c4",
+ 517 => x"0856548c",
+ 518 => x"155381b4",
+ 519 => x"b808528a",
+ 520 => x"518fd43f",
+ 521 => x"73800c86",
+ 522 => x"3d0d04fb",
+ 523 => x"3d0d7770",
+ 524 => x"085656b0",
+ 525 => x"5381b4c4",
+ 526 => x"08527451",
+ 527 => x"ab943f85",
+ 528 => x"0b8c170c",
+ 529 => x"850b8c16",
+ 530 => x"0c750875",
+ 531 => x"0c81b4c4",
+ 532 => x"08547380",
+ 533 => x"2e8a3873",
+ 534 => x"08750c81",
+ 535 => x"b4c40854",
+ 536 => x"8c145381",
+ 537 => x"b4b80852",
+ 538 => x"8a518f8b",
+ 539 => x"3f841508",
+ 540 => x"ad38860b",
+ 541 => x"8c160c88",
+ 542 => x"15528816",
+ 543 => x"08518e97",
+ 544 => x"3f81b4c4",
+ 545 => x"08700876",
+ 546 => x"0c548c15",
+ 547 => x"7054548a",
+ 548 => x"52730851",
+ 549 => x"8ee13f73",
+ 550 => x"800c873d",
+ 551 => x"0d047508",
+ 552 => x"54b05373",
+ 553 => x"527551aa",
+ 554 => x"a93f7380",
+ 555 => x"0c873d0d",
+ 556 => x"04d93d0d",
+ 557 => x"b0519dcf",
+ 558 => x"3f800881",
+ 559 => x"b4b40cb0",
+ 560 => x"519dc43f",
+ 561 => x"800881b4",
+ 562 => x"c40c81b4",
+ 563 => x"b4088008",
+ 564 => x"0c800b80",
+ 565 => x"0884050c",
+ 566 => x"820b8008",
+ 567 => x"88050ca8",
+ 568 => x"0b80088c",
+ 569 => x"050c9f53",
+ 570 => x"80c7e052",
+ 571 => x"80089005",
+ 572 => x"51a9df3f",
+ 573 => x"a13d5e9f",
+ 574 => x"5380c880",
+ 575 => x"527d51a9",
+ 576 => x"d13f8a0b",
+ 577 => x"80f2f80c",
+ 578 => x"80d2a451",
+ 579 => x"f9be3f80",
+ 580 => x"c8a051f9",
+ 581 => x"b73f80d2",
+ 582 => x"a451f9b0",
+ 583 => x"3f80d684",
+ 584 => x"08802e89",
+ 585 => x"d33880c8",
+ 586 => x"d051f9a0",
+ 587 => x"3f80d2a4",
+ 588 => x"51f9993f",
+ 589 => x"80d68008",
+ 590 => x"5280c8fc",
+ 591 => x"51f98d3f",
+ 592 => x"80e69451",
+ 593 => x"b2ff3f81",
+ 594 => x"0b9a3d5e",
+ 595 => x"5b800b80",
+ 596 => x"d6800825",
+ 597 => x"82d43890",
+ 598 => x"3d5f80c1",
+ 599 => x"0b81b4bc",
+ 600 => x"34810b81",
+ 601 => x"b6980c80",
+ 602 => x"c20b81b4",
+ 603 => x"c0348240",
+ 604 => x"835a9f53",
+ 605 => x"80c9ac52",
+ 606 => x"7c51a8d6",
+ 607 => x"3f814180",
+ 608 => x"7d537e52",
+ 609 => x"568e943f",
+ 610 => x"8008762e",
+ 611 => x"09810683",
+ 612 => x"38815675",
+ 613 => x"81b6980c",
+ 614 => x"7f705856",
+ 615 => x"758325a2",
+ 616 => x"38751010",
+ 617 => x"16fd0542",
+ 618 => x"a93dffa4",
+ 619 => x"05538352",
+ 620 => x"76518cc3",
+ 621 => x"3f7f8105",
+ 622 => x"70417058",
+ 623 => x"56837624",
+ 624 => x"e0386154",
+ 625 => x"755380e6",
+ 626 => x"9c5281b4",
+ 627 => x"d0518cb7",
+ 628 => x"3f81b4c4",
+ 629 => x"08700858",
+ 630 => x"58b05377",
+ 631 => x"527651a7",
+ 632 => x"f13f850b",
+ 633 => x"8c190c85",
+ 634 => x"0b8c180c",
+ 635 => x"7708770c",
+ 636 => x"81b4c408",
+ 637 => x"5675802e",
+ 638 => x"8a387508",
+ 639 => x"770c81b4",
+ 640 => x"c408568c",
+ 641 => x"165381b4",
+ 642 => x"b808528a",
+ 643 => x"518be83f",
+ 644 => x"84170887",
+ 645 => x"ea38860b",
+ 646 => x"8c180c88",
+ 647 => x"17528818",
+ 648 => x"08518af3",
+ 649 => x"3f81b4c4",
+ 650 => x"08700878",
+ 651 => x"0c568c17",
+ 652 => x"7054598a",
+ 653 => x"52780851",
+ 654 => x"8bbd3f80",
+ 655 => x"c10b81b4",
+ 656 => x"c0335757",
+ 657 => x"767626a2",
+ 658 => x"3880c352",
+ 659 => x"76518ca1",
+ 660 => x"3f800861",
+ 661 => x"2e89e438",
+ 662 => x"81177081",
+ 663 => x"ff0681b4",
+ 664 => x"c0335858",
+ 665 => x"58757727",
+ 666 => x"e0387960",
+ 667 => x"29627054",
+ 668 => x"71535b59",
+ 669 => x"98b43f80",
+ 670 => x"0840787a",
+ 671 => x"31708729",
+ 672 => x"80083180",
+ 673 => x"088a0581",
+ 674 => x"b4bc3381",
+ 675 => x"b4b8085e",
+ 676 => x"5b525a56",
+ 677 => x"7780c12e",
+ 678 => x"89ce387b",
+ 679 => x"f738811b",
+ 680 => x"5b80d680",
+ 681 => x"087b25fd",
+ 682 => x"b13881b4",
+ 683 => x"ac51b095",
+ 684 => x"3f80c9cc",
+ 685 => x"51f6953f",
+ 686 => x"80d2a451",
+ 687 => x"f68e3f80",
+ 688 => x"c9dc51f6",
+ 689 => x"873f80d2",
+ 690 => x"a451f680",
+ 691 => x"3f81b4b8",
+ 692 => x"085280ca",
+ 693 => x"9451f5f4",
+ 694 => x"3f855280",
+ 695 => x"cab051f5",
+ 696 => x"eb3f81b6",
+ 697 => x"98085280",
+ 698 => x"cacc51f5",
+ 699 => x"df3f8152",
+ 700 => x"80cab051",
+ 701 => x"f5d63f81",
+ 702 => x"b4bc3352",
+ 703 => x"80cae851",
+ 704 => x"f5ca3f80",
+ 705 => x"c15280cb",
+ 706 => x"8451f5c0",
+ 707 => x"3f81b4c0",
+ 708 => x"335280cb",
+ 709 => x"a051f5b4",
+ 710 => x"3f80c252",
+ 711 => x"80cb8451",
+ 712 => x"f5aa3f81",
+ 713 => x"b4f00852",
+ 714 => x"80cbbc51",
+ 715 => x"f59e3f87",
+ 716 => x"5280cab0",
+ 717 => x"51f5953f",
+ 718 => x"80f2f808",
+ 719 => x"5280cbd8",
+ 720 => x"51f5893f",
+ 721 => x"80cbf451",
+ 722 => x"f5823f80",
+ 723 => x"cca051f4",
+ 724 => x"fb3f81b4",
+ 725 => x"c4087008",
+ 726 => x"535a80cc",
+ 727 => x"ac51f4ec",
+ 728 => x"3f80ccc8",
+ 729 => x"51f4e53f",
+ 730 => x"81b4c408",
+ 731 => x"84110853",
+ 732 => x"5680ccfc",
+ 733 => x"51f4d53f",
+ 734 => x"805280ca",
+ 735 => x"b051f4cc",
+ 736 => x"3f81b4c4",
+ 737 => x"08881108",
+ 738 => x"535880cd",
+ 739 => x"9851f4bc",
+ 740 => x"3f825280",
+ 741 => x"cab051f4",
+ 742 => x"b33f81b4",
+ 743 => x"c4088c11",
+ 744 => x"08535780",
+ 745 => x"cdb451f4",
+ 746 => x"a33f9152",
+ 747 => x"80cab051",
+ 748 => x"f49a3f81",
+ 749 => x"b4c40890",
+ 750 => x"055280cd",
+ 751 => x"d051f48c",
+ 752 => x"3f80cdec",
+ 753 => x"51f4853f",
+ 754 => x"80cea451",
+ 755 => x"f3fe3f81",
+ 756 => x"b4b40870",
+ 757 => x"08535f80",
+ 758 => x"ccac51f3",
+ 759 => x"ef3f80ce",
+ 760 => x"b851f3e8",
+ 761 => x"3f81b4b4",
+ 762 => x"08841108",
+ 763 => x"535b80cc",
+ 764 => x"fc51f3d8",
+ 765 => x"3f805280",
+ 766 => x"cab051f3",
+ 767 => x"cf3f81b4",
+ 768 => x"b4088811",
+ 769 => x"08535c80",
+ 770 => x"cd9851f3",
+ 771 => x"bf3f8152",
+ 772 => x"80cab051",
+ 773 => x"f3b63f81",
+ 774 => x"b4b4088c",
+ 775 => x"1108535a",
+ 776 => x"80cdb451",
+ 777 => x"f3a63f92",
+ 778 => x"5280cab0",
+ 779 => x"51f39d3f",
+ 780 => x"81b4b408",
+ 781 => x"90055280",
+ 782 => x"cdd051f3",
+ 783 => x"8f3f80cd",
+ 784 => x"ec51f388",
+ 785 => x"3f7f5280",
+ 786 => x"cef851f2",
+ 787 => x"ff3f8552",
+ 788 => x"80cab051",
+ 789 => x"f2f63f78",
+ 790 => x"5280cf94",
+ 791 => x"51f2ed3f",
+ 792 => x"8d5280ca",
+ 793 => x"b051f2e4",
+ 794 => x"3f615280",
+ 795 => x"cfb051f2",
+ 796 => x"db3f8752",
+ 797 => x"80cab051",
+ 798 => x"f2d23f60",
+ 799 => x"5280cfcc",
+ 800 => x"51f2c93f",
+ 801 => x"815280ca",
+ 802 => x"b051f2c0",
+ 803 => x"3f7d5280",
+ 804 => x"cfe851f2",
+ 805 => x"b73f80d0",
+ 806 => x"8451f2b0",
+ 807 => x"3f7c5280",
+ 808 => x"d0bc51f2",
+ 809 => x"a73f80d0",
+ 810 => x"d851f2a0",
+ 811 => x"3f80d2a4",
+ 812 => x"51f2993f",
+ 813 => x"81b4ac08",
+ 814 => x"81b4b008",
+ 815 => x"80e69408",
+ 816 => x"80e69808",
+ 817 => x"72713170",
+ 818 => x"74267574",
+ 819 => x"31707231",
+ 820 => x"80e68c0c",
+ 821 => x"444480e6",
+ 822 => x"900c80e6",
+ 823 => x"90085680",
+ 824 => x"d190555c",
+ 825 => x"595758f1",
+ 826 => x"e33f80e6",
+ 827 => x"8c085680",
+ 828 => x"762582a3",
+ 829 => x"3880d680",
+ 830 => x"0870719f",
+ 831 => x"2c9a3d53",
+ 832 => x"565680e6",
+ 833 => x"8c0880e6",
+ 834 => x"90084153",
+ 835 => x"7f547052",
+ 836 => x"5a89eb3f",
+ 837 => x"66685f80",
+ 838 => x"e5fc0c7d",
+ 839 => x"80e6800c",
+ 840 => x"80d68008",
+ 841 => x"709f2c58",
+ 842 => x"568058bd",
+ 843 => x"84c07855",
+ 844 => x"55765275",
+ 845 => x"53795187",
+ 846 => x"d13f953d",
+ 847 => x"80e68c08",
+ 848 => x"80e69008",
+ 849 => x"41557f56",
+ 850 => x"67694053",
+ 851 => x"7e547052",
+ 852 => x"5c89ab3f",
+ 853 => x"64665e80",
+ 854 => x"e6840c7c",
+ 855 => x"80e6880c",
+ 856 => x"80d68008",
+ 857 => x"709f2c40",
+ 858 => x"58805783",
+ 859 => x"dceb9480",
+ 860 => x"7755557e",
+ 861 => x"5277537b",
+ 862 => x"51878f3f",
+ 863 => x"64665d5b",
+ 864 => x"805e8ddd",
+ 865 => x"7e555580",
+ 866 => x"e68c0880",
+ 867 => x"e6900859",
+ 868 => x"52775379",
+ 869 => x"5186f33f",
+ 870 => x"66684054",
+ 871 => x"7e557a52",
+ 872 => x"7b53a93d",
+ 873 => x"ffa80551",
+ 874 => x"88d43f62",
+ 875 => x"645e81b4",
+ 876 => x"c80c7c81",
+ 877 => x"b4cc0c80",
+ 878 => x"d1a051f0",
+ 879 => x"8f3f80e6",
+ 880 => x"80085280",
+ 881 => x"d1d051f0",
+ 882 => x"833f80d1",
+ 883 => x"d851effc",
+ 884 => x"3f80e688",
+ 885 => x"085280d1",
+ 886 => x"d051eff0",
+ 887 => x"3f81b4cc",
+ 888 => x"085280d2",
+ 889 => x"8851efe4",
+ 890 => x"3f80d2a4",
+ 891 => x"51efdd3f",
+ 892 => x"800b800c",
+ 893 => x"a93d0d04",
+ 894 => x"80d2a851",
+ 895 => x"f6ac3977",
+ 896 => x"0857b053",
+ 897 => x"76527751",
+ 898 => x"9fc83f80",
+ 899 => x"c10b81b4",
+ 900 => x"c0335757",
+ 901 => x"f8ae3975",
+ 902 => x"8a3880e6",
+ 903 => x"90088126",
+ 904 => x"fdd33880",
+ 905 => x"d2d851ef",
+ 906 => x"a33f80d3",
+ 907 => x"9051ef9c",
+ 908 => x"3f80d2a4",
+ 909 => x"51ef953f",
+ 910 => x"80d68008",
+ 911 => x"70719f2c",
+ 912 => x"9a3d5356",
+ 913 => x"5680e68c",
+ 914 => x"0880e690",
+ 915 => x"0841537f",
+ 916 => x"5470525a",
+ 917 => x"87a83f66",
+ 918 => x"685f80e5",
+ 919 => x"fc0c7d80",
+ 920 => x"e6800c80",
+ 921 => x"d6800870",
+ 922 => x"9f2c5856",
+ 923 => x"8058bd84",
+ 924 => x"c0785555",
+ 925 => x"76527553",
+ 926 => x"7951858e",
+ 927 => x"3f953d80",
+ 928 => x"e68c0880",
+ 929 => x"e6900841",
+ 930 => x"557f5667",
+ 931 => x"6940537e",
+ 932 => x"5470525c",
+ 933 => x"86e83f64",
+ 934 => x"665e80e6",
+ 935 => x"840c7c80",
+ 936 => x"e6880c80",
+ 937 => x"d6800870",
+ 938 => x"9f2c4058",
+ 939 => x"805783dc",
+ 940 => x"eb948077",
+ 941 => x"55557e52",
+ 942 => x"77537b51",
+ 943 => x"84cc3f64",
+ 944 => x"665d5b80",
+ 945 => x"5e8ddd7e",
+ 946 => x"555580e6",
+ 947 => x"8c0880e6",
+ 948 => x"90085952",
+ 949 => x"77537951",
+ 950 => x"84b03f66",
+ 951 => x"6840547e",
+ 952 => x"557a527b",
+ 953 => x"53a93dff",
+ 954 => x"a8055186",
+ 955 => x"913f6264",
+ 956 => x"5e81b4c8",
+ 957 => x"0c7c81b4",
+ 958 => x"cc0c80d1",
+ 959 => x"a051edcc",
+ 960 => x"3f80e680",
+ 961 => x"085280d1",
+ 962 => x"d051edc0",
+ 963 => x"3f80d1d8",
+ 964 => x"51edb93f",
+ 965 => x"80e68808",
+ 966 => x"5280d1d0",
+ 967 => x"51edad3f",
+ 968 => x"81b4cc08",
+ 969 => x"5280d288",
+ 970 => x"51eda13f",
+ 971 => x"80d2a451",
+ 972 => x"ed9a3f80",
+ 973 => x"0b800ca9",
+ 974 => x"3d0d04a9",
+ 975 => x"3dffa005",
+ 976 => x"52805180",
+ 977 => x"d23f9f53",
+ 978 => x"80d3b052",
+ 979 => x"7c519d82",
+ 980 => x"3f7a7b81",
+ 981 => x"b4b80c81",
+ 982 => x"187081ff",
+ 983 => x"0681b4c0",
+ 984 => x"33595959",
+ 985 => x"5af5fe39",
+ 986 => x"ff16707b",
+ 987 => x"31600c5c",
+ 988 => x"800b811c",
+ 989 => x"5c5c80d6",
+ 990 => x"80087b25",
+ 991 => x"f3dc38f6",
+ 992 => x"a939ff3d",
+ 993 => x"0d738232",
+ 994 => x"70307072",
+ 995 => x"07802580",
+ 996 => x"0c525283",
+ 997 => x"3d0d04fe",
+ 998 => x"3d0d7476",
+ 999 => x"71535452",
+ 1000 => x"71822e83",
+ 1001 => x"38835171",
+ 1002 => x"812e9a38",
+ 1003 => x"8172269f",
+ 1004 => x"3871822e",
+ 1005 => x"b8387184",
+ 1006 => x"2ea93870",
+ 1007 => x"730c7080",
+ 1008 => x"0c843d0d",
+ 1009 => x"0480e40b",
+ 1010 => x"81b4b808",
+ 1011 => x"258b3880",
+ 1012 => x"730c7080",
+ 1013 => x"0c843d0d",
+ 1014 => x"0483730c",
+ 1015 => x"70800c84",
+ 1016 => x"3d0d0482",
+ 1017 => x"730c7080",
+ 1018 => x"0c843d0d",
+ 1019 => x"0481730c",
+ 1020 => x"70800c84",
+ 1021 => x"3d0d0480",
+ 1022 => x"3d0d7474",
+ 1023 => x"14820571",
+ 1024 => x"0c800c82",
+ 1025 => x"3d0d04f7",
+ 1026 => x"3d0d7b7d",
+ 1027 => x"7f618512",
+ 1028 => x"70822b75",
+ 1029 => x"11707471",
+ 1030 => x"70840553",
+ 1031 => x"0c5a5a5d",
+ 1032 => x"5b760c79",
+ 1033 => x"80f8180c",
+ 1034 => x"79861252",
+ 1035 => x"57585a5a",
+ 1036 => x"76762499",
+ 1037 => x"3876b329",
+ 1038 => x"822b7911",
+ 1039 => x"51537673",
+ 1040 => x"70840555",
+ 1041 => x"0c811454",
+ 1042 => x"757425f2",
+ 1043 => x"387681cc",
+ 1044 => x"2919fc11",
+ 1045 => x"088105fc",
+ 1046 => x"120c7a19",
+ 1047 => x"70089fa0",
+ 1048 => x"130c5856",
+ 1049 => x"850b81b4",
+ 1050 => x"b80c7580",
+ 1051 => x"0c8b3d0d",
+ 1052 => x"04fe3d0d",
+ 1053 => x"02930533",
+ 1054 => x"51800284",
+ 1055 => x"05970533",
+ 1056 => x"54527073",
+ 1057 => x"2e883871",
+ 1058 => x"800c843d",
+ 1059 => x"0d047081",
+ 1060 => x"b4bc3481",
+ 1061 => x"0b800c84",
+ 1062 => x"3d0d04f8",
+ 1063 => x"3d0d7a7c",
+ 1064 => x"5956820b",
+ 1065 => x"83195555",
+ 1066 => x"74167033",
+ 1067 => x"75335b51",
+ 1068 => x"5372792e",
+ 1069 => x"80c63880",
+ 1070 => x"c10b8116",
+ 1071 => x"81165656",
+ 1072 => x"57827525",
+ 1073 => x"e338ffa9",
+ 1074 => x"177081ff",
+ 1075 => x"06555973",
+ 1076 => x"82268338",
+ 1077 => x"87558153",
+ 1078 => x"7680d22e",
+ 1079 => x"98387752",
+ 1080 => x"75519bc3",
+ 1081 => x"3f805372",
+ 1082 => x"80082589",
+ 1083 => x"38871581",
+ 1084 => x"b4b80c81",
+ 1085 => x"5372800c",
+ 1086 => x"8a3d0d04",
+ 1087 => x"7281b4bc",
+ 1088 => x"34827525",
+ 1089 => x"ffa238ff",
+ 1090 => x"bd39ef3d",
+ 1091 => x"0d636567",
+ 1092 => x"5b427943",
+ 1093 => x"67695940",
+ 1094 => x"77415a80",
+ 1095 => x"5d805e61",
+ 1096 => x"7083ffff",
+ 1097 => x"0671902a",
+ 1098 => x"627083ff",
+ 1099 => x"ff067190",
+ 1100 => x"2a747229",
+ 1101 => x"74732975",
+ 1102 => x"73297774",
+ 1103 => x"2973902a",
+ 1104 => x"05721151",
+ 1105 => x"5856535f",
+ 1106 => x"5a575a58",
+ 1107 => x"55587373",
+ 1108 => x"27863884",
+ 1109 => x"80801656",
+ 1110 => x"73902a16",
+ 1111 => x"5b7883ff",
+ 1112 => x"ff067484",
+ 1113 => x"80802905",
+ 1114 => x"5c7a7c5a",
+ 1115 => x"5d785e77",
+ 1116 => x"7f296178",
+ 1117 => x"29057d05",
+ 1118 => x"5d7c7e56",
+ 1119 => x"7a0c7484",
+ 1120 => x"1b0c7980",
+ 1121 => x"0c933d0d",
+ 1122 => x"04f93d0d",
+ 1123 => x"797b7d54",
+ 1124 => x"58725977",
+ 1125 => x"30797030",
+ 1126 => x"7072079f",
+ 1127 => x"2a737131",
+ 1128 => x"5a525977",
+ 1129 => x"7956730c",
+ 1130 => x"53738413",
+ 1131 => x"0c54800c",
+ 1132 => x"893d0d04",
+ 1133 => x"f93d0d79",
+ 1134 => x"7b7d7f56",
+ 1135 => x"54525472",
+ 1136 => x"802ea038",
+ 1137 => x"70577158",
+ 1138 => x"a0733152",
+ 1139 => x"807225a1",
+ 1140 => x"38777074",
+ 1141 => x"2b577073",
+ 1142 => x"2a78752b",
+ 1143 => x"07565174",
+ 1144 => x"76535170",
+ 1145 => x"740c7184",
+ 1146 => x"150c7380",
+ 1147 => x"0c893d0d",
+ 1148 => x"04805677",
+ 1149 => x"72302b55",
+ 1150 => x"74765351",
+ 1151 => x"e639e43d",
+ 1152 => x"0d6ea13d",
+ 1153 => x"08a33d08",
+ 1154 => x"59575f80",
+ 1155 => x"764d774e",
+ 1156 => x"a33d08a5",
+ 1157 => x"3d08574b",
+ 1158 => x"754c5e7d",
+ 1159 => x"6c2486fb",
+ 1160 => x"38806a24",
+ 1161 => x"878f3869",
+ 1162 => x"6b58566b",
+ 1163 => x"6d5d467b",
+ 1164 => x"47754476",
+ 1165 => x"45646468",
+ 1166 => x"685c5c56",
+ 1167 => x"567481e7",
+ 1168 => x"38787627",
+ 1169 => x"82c73875",
+ 1170 => x"81ff2683",
+ 1171 => x"2b5583ff",
+ 1172 => x"ff76278c",
+ 1173 => x"389055fe",
+ 1174 => x"800a7627",
+ 1175 => x"83389855",
+ 1176 => x"75752a80",
+ 1177 => x"d3d00570",
+ 1178 => x"33a07731",
+ 1179 => x"71315755",
+ 1180 => x"5774802e",
+ 1181 => x"95387575",
+ 1182 => x"2ba07631",
+ 1183 => x"7a772b7c",
+ 1184 => x"722a077c",
+ 1185 => x"782b5d5b",
+ 1186 => x"59567590",
+ 1187 => x"2a7683ff",
+ 1188 => x"ff067154",
+ 1189 => x"7a535957",
+ 1190 => x"88803f80",
+ 1191 => x"085b87ea",
+ 1192 => x"3f800880",
+ 1193 => x"0879297c",
+ 1194 => x"902b7c90",
+ 1195 => x"2a075656",
+ 1196 => x"59737527",
+ 1197 => x"94388008",
+ 1198 => x"ff057615",
+ 1199 => x"55597574",
+ 1200 => x"26873874",
+ 1201 => x"742687b9",
+ 1202 => x"38765273",
+ 1203 => x"75315187",
+ 1204 => x"c93f8008",
+ 1205 => x"5587b33f",
+ 1206 => x"80088008",
+ 1207 => x"79297b83",
+ 1208 => x"ffff0677",
+ 1209 => x"902b0756",
+ 1210 => x"59577378",
+ 1211 => x"27963880",
+ 1212 => x"08ff0576",
+ 1213 => x"15555775",
+ 1214 => x"74268938",
+ 1215 => x"77742677",
+ 1216 => x"71315856",
+ 1217 => x"78902b77",
+ 1218 => x"0758805b",
+ 1219 => x"7a407741",
+ 1220 => x"7f615654",
+ 1221 => x"7d80d938",
+ 1222 => x"737f0c74",
+ 1223 => x"7f84050c",
+ 1224 => x"7e800c9e",
+ 1225 => x"3d0d0480",
+ 1226 => x"705c5874",
+ 1227 => x"7926dd38",
+ 1228 => x"7481ff26",
+ 1229 => x"832b5774",
+ 1230 => x"83ffff26",
+ 1231 => x"82a53874",
+ 1232 => x"772a80d3",
+ 1233 => x"d0057033",
+ 1234 => x"a0793171",
+ 1235 => x"31595c5d",
+ 1236 => x"7682b338",
+ 1237 => x"76547479",
+ 1238 => x"27833881",
+ 1239 => x"54797627",
+ 1240 => x"74075981",
+ 1241 => x"5878ffa2",
+ 1242 => x"38765880",
+ 1243 => x"5bff9d39",
+ 1244 => x"73527453",
+ 1245 => x"9e3de805",
+ 1246 => x"51fc8e3f",
+ 1247 => x"6769567f",
+ 1248 => x"0c747f84",
+ 1249 => x"050c7e80",
+ 1250 => x"0c9e3d0d",
+ 1251 => x"0475802e",
+ 1252 => x"81c43875",
+ 1253 => x"81ff2683",
+ 1254 => x"2b5583ff",
+ 1255 => x"ff76278c",
+ 1256 => x"389055fe",
+ 1257 => x"800a7627",
+ 1258 => x"83389855",
+ 1259 => x"75752a80",
+ 1260 => x"d3d00570",
+ 1261 => x"33a07731",
+ 1262 => x"7131575e",
+ 1263 => x"54748491",
+ 1264 => x"38787631",
+ 1265 => x"54817690",
+ 1266 => x"2a7783ff",
+ 1267 => x"ff065f5d",
+ 1268 => x"5b7b5273",
+ 1269 => x"5185c33f",
+ 1270 => x"80085785",
+ 1271 => x"ad3f8008",
+ 1272 => x"80087e29",
+ 1273 => x"78902b7c",
+ 1274 => x"902a0756",
+ 1275 => x"56597375",
+ 1276 => x"27943880",
+ 1277 => x"08ff0576",
+ 1278 => x"15555975",
+ 1279 => x"74268738",
+ 1280 => x"74742684",
+ 1281 => x"f3387b52",
+ 1282 => x"73753151",
+ 1283 => x"858c3f80",
+ 1284 => x"085584f6",
+ 1285 => x"3f800880",
+ 1286 => x"087e297b",
+ 1287 => x"83ffff06",
+ 1288 => x"77902b07",
+ 1289 => x"56595773",
+ 1290 => x"78279638",
+ 1291 => x"8008ff05",
+ 1292 => x"76155557",
+ 1293 => x"75742689",
+ 1294 => x"38777426",
+ 1295 => x"77713158",
+ 1296 => x"5a78902b",
+ 1297 => x"77077b41",
+ 1298 => x"417f6156",
+ 1299 => x"547d802e",
+ 1300 => x"fdc638fe",
+ 1301 => x"9b397552",
+ 1302 => x"815184ae",
+ 1303 => x"3f800856",
+ 1304 => x"feb13990",
+ 1305 => x"57fe800a",
+ 1306 => x"7527fdd3",
+ 1307 => x"38987571",
+ 1308 => x"2a80d3d0",
+ 1309 => x"057033a0",
+ 1310 => x"73317131",
+ 1311 => x"535d5e57",
+ 1312 => x"76802efd",
+ 1313 => x"cf38a077",
+ 1314 => x"3175782b",
+ 1315 => x"77722a07",
+ 1316 => x"77792b7b",
+ 1317 => x"7a2b7d74",
+ 1318 => x"2a077d7b",
+ 1319 => x"2b73902a",
+ 1320 => x"7483ffff",
+ 1321 => x"0671597f",
+ 1322 => x"772a585e",
+ 1323 => x"5c415f58",
+ 1324 => x"5c5483e6",
+ 1325 => x"3f800854",
+ 1326 => x"83d03f80",
+ 1327 => x"08800879",
+ 1328 => x"2975902b",
+ 1329 => x"7e902a07",
+ 1330 => x"56565973",
+ 1331 => x"75279938",
+ 1332 => x"8008ff05",
+ 1333 => x"7b155559",
+ 1334 => x"7a74268c",
+ 1335 => x"38737527",
+ 1336 => x"8738ff19",
+ 1337 => x"7b155559",
+ 1338 => x"76527375",
+ 1339 => x"315183aa",
+ 1340 => x"3f800855",
+ 1341 => x"83943f80",
+ 1342 => x"08800879",
+ 1343 => x"297d83ff",
+ 1344 => x"ff067790",
+ 1345 => x"2b075659",
+ 1346 => x"57737827",
+ 1347 => x"99388008",
+ 1348 => x"ff057b15",
+ 1349 => x"55577a74",
+ 1350 => x"268c3873",
+ 1351 => x"78278738",
+ 1352 => x"ff177b15",
+ 1353 => x"55577378",
+ 1354 => x"3179902b",
+ 1355 => x"78077083",
+ 1356 => x"ffff0671",
+ 1357 => x"902a7983",
+ 1358 => x"ffff067a",
+ 1359 => x"902a7372",
+ 1360 => x"29737329",
+ 1361 => x"74732976",
+ 1362 => x"74297390",
+ 1363 => x"2a057205",
+ 1364 => x"5755435f",
+ 1365 => x"5b585a57",
+ 1366 => x"595a747c",
+ 1367 => x"27863884",
+ 1368 => x"80801757",
+ 1369 => x"74902a17",
+ 1370 => x"7983ffff",
+ 1371 => x"06768480",
+ 1372 => x"80290557",
+ 1373 => x"57767a26",
+ 1374 => x"9a38767a",
+ 1375 => x"32703070",
+ 1376 => x"72078025",
+ 1377 => x"565a5b7c",
+ 1378 => x"7627fafe",
+ 1379 => x"3873802e",
+ 1380 => x"faf838ff",
+ 1381 => x"1858805b",
+ 1382 => x"faf239ff",
+ 1383 => x"76537754",
+ 1384 => x"9f3de805",
+ 1385 => x"525ef7e1",
+ 1386 => x"3f676957",
+ 1387 => x"4c754d69",
+ 1388 => x"8025f8f3",
+ 1389 => x"387d096a",
+ 1390 => x"6c5c537a",
+ 1391 => x"549f3de8",
+ 1392 => x"05525ef7",
+ 1393 => x"c43f6769",
+ 1394 => x"714c704d",
+ 1395 => x"5856f8db",
+ 1396 => x"39a07531",
+ 1397 => x"76762b7a",
+ 1398 => x"772b7c73",
+ 1399 => x"2a077c78",
+ 1400 => x"2b72902a",
+ 1401 => x"7383ffff",
+ 1402 => x"0671587e",
+ 1403 => x"762a5742",
+ 1404 => x"405d5d57",
+ 1405 => x"5881a33f",
+ 1406 => x"80085781",
+ 1407 => x"8d3f8008",
+ 1408 => x"80087e29",
+ 1409 => x"78902b7d",
+ 1410 => x"902a0756",
+ 1411 => x"56597375",
+ 1412 => x"27993880",
+ 1413 => x"08ff0576",
+ 1414 => x"15555975",
+ 1415 => x"74268c38",
+ 1416 => x"73752787",
+ 1417 => x"38ff1976",
+ 1418 => x"1555597b",
+ 1419 => x"52737531",
+ 1420 => x"5180e73f",
+ 1421 => x"80085580",
+ 1422 => x"d13f8008",
+ 1423 => x"80087e29",
+ 1424 => x"7c83ffff",
+ 1425 => x"06707890",
+ 1426 => x"2b075156",
+ 1427 => x"58587377",
+ 1428 => x"27993880",
+ 1429 => x"08ff0576",
+ 1430 => x"15555875",
+ 1431 => x"74268c38",
+ 1432 => x"73772787",
+ 1433 => x"38ff1876",
+ 1434 => x"15555878",
+ 1435 => x"902b7807",
+ 1436 => x"74783155",
+ 1437 => x"5bfada39",
+ 1438 => x"ff197615",
+ 1439 => x"5559fb86",
+ 1440 => x"39ff1976",
+ 1441 => x"155559f8",
+ 1442 => x"c0397070",
+ 1443 => x"70805375",
+ 1444 => x"52745181",
+ 1445 => x"913f5050",
+ 1446 => x"50047070",
+ 1447 => x"70815375",
+ 1448 => x"52745181",
+ 1449 => x"813f5050",
+ 1450 => x"5004fb3d",
+ 1451 => x"0d777955",
+ 1452 => x"55805675",
+ 1453 => x"7524ab38",
+ 1454 => x"8074249d",
+ 1455 => x"38805373",
+ 1456 => x"52745180",
+ 1457 => x"e13f8008",
+ 1458 => x"5475802e",
+ 1459 => x"85388008",
+ 1460 => x"30547380",
+ 1461 => x"0c873d0d",
+ 1462 => x"04733076",
+ 1463 => x"81325754",
+ 1464 => x"dc397430",
+ 1465 => x"55815673",
+ 1466 => x"8025d238",
+ 1467 => x"ec39fa3d",
+ 1468 => x"0d787a57",
+ 1469 => x"55805776",
+ 1470 => x"7524a438",
+ 1471 => x"759f2c54",
+ 1472 => x"81537574",
+ 1473 => x"32743152",
+ 1474 => x"74519b3f",
+ 1475 => x"80085476",
+ 1476 => x"802e8538",
+ 1477 => x"80083054",
+ 1478 => x"73800c88",
+ 1479 => x"3d0d0474",
+ 1480 => x"30558157",
+ 1481 => x"d739fc3d",
+ 1482 => x"0d767853",
+ 1483 => x"54815380",
+ 1484 => x"74732652",
+ 1485 => x"5572802e",
+ 1486 => x"98387080",
+ 1487 => x"2eab3880",
+ 1488 => x"7224a638",
+ 1489 => x"71107310",
+ 1490 => x"75722653",
+ 1491 => x"545272ea",
+ 1492 => x"38735178",
+ 1493 => x"83387451",
+ 1494 => x"70800c86",
+ 1495 => x"3d0d0472",
+ 1496 => x"0a100a72",
+ 1497 => x"0a100a53",
+ 1498 => x"5372802e",
+ 1499 => x"e4387174",
+ 1500 => x"26ed3873",
+ 1501 => x"72317574",
+ 1502 => x"07740a10",
+ 1503 => x"0a740a10",
+ 1504 => x"0a555556",
+ 1505 => x"54e33970",
+ 1506 => x"70735280",
+ 1507 => x"decc0851",
+ 1508 => x"933f5050",
+ 1509 => x"04707073",
+ 1510 => x"5280decc",
+ 1511 => x"085190ce",
+ 1512 => x"3f505004",
+ 1513 => x"f43d0d7e",
+ 1514 => x"608b1170",
+ 1515 => x"f8065b55",
+ 1516 => x"555d7296",
+ 1517 => x"26833890",
+ 1518 => x"58807824",
+ 1519 => x"74792607",
+ 1520 => x"55805474",
+ 1521 => x"742e0981",
+ 1522 => x"0680ca38",
+ 1523 => x"7c518d9e",
+ 1524 => x"3f7783f7",
+ 1525 => x"2680c538",
+ 1526 => x"77832a70",
+ 1527 => x"10101080",
+ 1528 => x"d6c4058c",
+ 1529 => x"11085858",
+ 1530 => x"5475772e",
+ 1531 => x"81f03884",
+ 1532 => x"1608fc06",
+ 1533 => x"8c170888",
+ 1534 => x"1808718c",
+ 1535 => x"120c8812",
+ 1536 => x"0c5b7605",
+ 1537 => x"84110881",
+ 1538 => x"0784120c",
+ 1539 => x"537c518c",
+ 1540 => x"de3f8816",
+ 1541 => x"5473800c",
+ 1542 => x"8e3d0d04",
+ 1543 => x"77892a78",
+ 1544 => x"832a5854",
+ 1545 => x"73802ebf",
+ 1546 => x"3877862a",
+ 1547 => x"b8055784",
+ 1548 => x"7427b438",
+ 1549 => x"80db1457",
+ 1550 => x"947427ab",
+ 1551 => x"38778c2a",
+ 1552 => x"80ee0557",
+ 1553 => x"80d47427",
+ 1554 => x"9e38778f",
+ 1555 => x"2a80f705",
+ 1556 => x"5782d474",
+ 1557 => x"27913877",
+ 1558 => x"922a80fc",
+ 1559 => x"05578ad4",
+ 1560 => x"74278438",
+ 1561 => x"80fe5776",
+ 1562 => x"10101080",
+ 1563 => x"d6c4058c",
+ 1564 => x"11085653",
+ 1565 => x"74732ea3",
+ 1566 => x"38841508",
+ 1567 => x"fc067079",
+ 1568 => x"31555673",
+ 1569 => x"8f2488e4",
+ 1570 => x"38738025",
+ 1571 => x"88e6388c",
+ 1572 => x"15085574",
+ 1573 => x"732e0981",
+ 1574 => x"06df3881",
+ 1575 => x"175980d6",
+ 1576 => x"d4085675",
+ 1577 => x"80d6cc2e",
+ 1578 => x"82cc3884",
+ 1579 => x"1608fc06",
+ 1580 => x"70793155",
+ 1581 => x"55738f24",
+ 1582 => x"bb3880d6",
+ 1583 => x"cc0b80d6",
+ 1584 => x"d80c80d6",
+ 1585 => x"cc0b80d6",
+ 1586 => x"d40c8074",
+ 1587 => x"2480db38",
+ 1588 => x"74168411",
+ 1589 => x"08810784",
+ 1590 => x"120c53fe",
+ 1591 => x"b0398816",
+ 1592 => x"8c110857",
+ 1593 => x"5975792e",
+ 1594 => x"098106fe",
+ 1595 => x"82388214",
+ 1596 => x"59ffab39",
+ 1597 => x"77167881",
+ 1598 => x"0784180c",
+ 1599 => x"7080d6d8",
+ 1600 => x"0c7080d6",
+ 1601 => x"d40c80d6",
+ 1602 => x"cc0b8c12",
+ 1603 => x"0c8c1108",
+ 1604 => x"88120c74",
+ 1605 => x"81078412",
+ 1606 => x"0c740574",
+ 1607 => x"710c5b7c",
+ 1608 => x"518acc3f",
+ 1609 => x"881654fd",
+ 1610 => x"ec3983ff",
+ 1611 => x"75278391",
+ 1612 => x"3874892a",
+ 1613 => x"75832a54",
+ 1614 => x"5473802e",
+ 1615 => x"bf387486",
+ 1616 => x"2ab80553",
+ 1617 => x"847427b4",
+ 1618 => x"3880db14",
+ 1619 => x"53947427",
+ 1620 => x"ab38748c",
+ 1621 => x"2a80ee05",
+ 1622 => x"5380d474",
+ 1623 => x"279e3874",
+ 1624 => x"8f2a80f7",
+ 1625 => x"055382d4",
+ 1626 => x"74279138",
+ 1627 => x"74922a80",
+ 1628 => x"fc05538a",
+ 1629 => x"d4742784",
+ 1630 => x"3880fe53",
+ 1631 => x"72101010",
+ 1632 => x"80d6c405",
+ 1633 => x"88110855",
+ 1634 => x"5773772e",
+ 1635 => x"868b3884",
+ 1636 => x"1408fc06",
+ 1637 => x"5b747b27",
+ 1638 => x"8d388814",
+ 1639 => x"08547377",
+ 1640 => x"2e098106",
+ 1641 => x"ea388c14",
+ 1642 => x"0880d6c4",
+ 1643 => x"0b840508",
+ 1644 => x"718c190c",
+ 1645 => x"7588190c",
+ 1646 => x"7788130c",
+ 1647 => x"5c57758c",
+ 1648 => x"150c7853",
+ 1649 => x"80792483",
+ 1650 => x"98387282",
+ 1651 => x"2c81712b",
+ 1652 => x"5656747b",
+ 1653 => x"2680ca38",
+ 1654 => x"7a750657",
+ 1655 => x"7682a338",
+ 1656 => x"78fc0684",
+ 1657 => x"05597410",
+ 1658 => x"707c0655",
+ 1659 => x"55738292",
+ 1660 => x"38841959",
+ 1661 => x"f13980d6",
+ 1662 => x"c40b8405",
+ 1663 => x"0879545b",
+ 1664 => x"788025c6",
+ 1665 => x"3882da39",
+ 1666 => x"74097b06",
+ 1667 => x"7080d6c4",
+ 1668 => x"0b84050c",
+ 1669 => x"5b741055",
+ 1670 => x"747b2685",
+ 1671 => x"387485bc",
+ 1672 => x"3880d6c4",
+ 1673 => x"0b880508",
+ 1674 => x"70841208",
+ 1675 => x"fc06707b",
+ 1676 => x"317b7226",
+ 1677 => x"8f722507",
+ 1678 => x"5d575c5c",
+ 1679 => x"5578802e",
+ 1680 => x"80d93879",
+ 1681 => x"1580d6bc",
+ 1682 => x"08199011",
+ 1683 => x"59545680",
+ 1684 => x"d6b808ff",
+ 1685 => x"2e8838a0",
+ 1686 => x"8f13e080",
+ 1687 => x"06577652",
+ 1688 => x"7c51888c",
+ 1689 => x"3f800854",
+ 1690 => x"8008ff2e",
+ 1691 => x"90388008",
+ 1692 => x"762782a7",
+ 1693 => x"387480d6",
+ 1694 => x"c42e829f",
+ 1695 => x"3880d6c4",
+ 1696 => x"0b880508",
+ 1697 => x"55841508",
+ 1698 => x"fc067079",
+ 1699 => x"31797226",
+ 1700 => x"8f722507",
+ 1701 => x"5d555a7a",
+ 1702 => x"83f23877",
+ 1703 => x"81078416",
+ 1704 => x"0c771570",
+ 1705 => x"80d6c40b",
+ 1706 => x"88050c74",
+ 1707 => x"81078412",
+ 1708 => x"0c567c51",
+ 1709 => x"87b93f88",
+ 1710 => x"15547380",
+ 1711 => x"0c8e3d0d",
+ 1712 => x"0474832a",
+ 1713 => x"70545480",
+ 1714 => x"7424819b",
+ 1715 => x"3872822c",
+ 1716 => x"81712b80",
+ 1717 => x"d6c80807",
+ 1718 => x"7080d6c4",
+ 1719 => x"0b84050c",
+ 1720 => x"75101010",
+ 1721 => x"80d6c405",
+ 1722 => x"88110871",
+ 1723 => x"8c1b0c70",
+ 1724 => x"881b0c79",
+ 1725 => x"88130c57",
+ 1726 => x"555c5575",
+ 1727 => x"8c150cfd",
+ 1728 => x"c1397879",
+ 1729 => x"10101080",
+ 1730 => x"d6c40570",
+ 1731 => x"565b5c8c",
+ 1732 => x"14085675",
+ 1733 => x"742ea338",
+ 1734 => x"841608fc",
+ 1735 => x"06707931",
+ 1736 => x"5853768f",
+ 1737 => x"2483f138",
+ 1738 => x"76802584",
+ 1739 => x"af388c16",
+ 1740 => x"08567574",
+ 1741 => x"2e098106",
+ 1742 => x"df388814",
+ 1743 => x"811a7083",
+ 1744 => x"06555a54",
+ 1745 => x"72c9387b",
+ 1746 => x"83065675",
+ 1747 => x"802efdb8",
+ 1748 => x"38ff1cf8",
+ 1749 => x"1b5b5c88",
+ 1750 => x"1a087a2e",
+ 1751 => x"ea38fdb5",
+ 1752 => x"39831953",
+ 1753 => x"fce43983",
+ 1754 => x"1470822c",
+ 1755 => x"81712b80",
+ 1756 => x"d6c80807",
+ 1757 => x"7080d6c4",
+ 1758 => x"0b84050c",
+ 1759 => x"76101010",
+ 1760 => x"80d6c405",
+ 1761 => x"88110871",
+ 1762 => x"8c1c0c70",
+ 1763 => x"881c0c7a",
+ 1764 => x"88130c58",
+ 1765 => x"535d5653",
+ 1766 => x"fee13980",
+ 1767 => x"d6880817",
+ 1768 => x"59800876",
+ 1769 => x"2e818b38",
+ 1770 => x"80d6b808",
+ 1771 => x"ff2e848e",
+ 1772 => x"38737631",
+ 1773 => x"1980d688",
+ 1774 => x"0c738706",
+ 1775 => x"70565372",
+ 1776 => x"802e8838",
+ 1777 => x"88733170",
+ 1778 => x"15555576",
+ 1779 => x"149fff06",
+ 1780 => x"a0807131",
+ 1781 => x"1670547e",
+ 1782 => x"53515385",
+ 1783 => x"933f8008",
+ 1784 => x"568008ff",
+ 1785 => x"2e819e38",
+ 1786 => x"80d68808",
+ 1787 => x"137080d6",
+ 1788 => x"880c7475",
+ 1789 => x"80d6c40b",
+ 1790 => x"88050c77",
+ 1791 => x"76311581",
+ 1792 => x"07555659",
+ 1793 => x"7a80d6c4",
+ 1794 => x"2e83c038",
+ 1795 => x"798f2682",
+ 1796 => x"ef38810b",
+ 1797 => x"84150c84",
+ 1798 => x"1508fc06",
+ 1799 => x"70793179",
+ 1800 => x"72268f72",
+ 1801 => x"25075d55",
+ 1802 => x"5a7a802e",
+ 1803 => x"fced3880",
+ 1804 => x"db398008",
+ 1805 => x"9fff0655",
+ 1806 => x"74feed38",
+ 1807 => x"7880d688",
+ 1808 => x"0c80d6c4",
+ 1809 => x"0b880508",
+ 1810 => x"7a188107",
+ 1811 => x"84120c55",
+ 1812 => x"80d6b408",
+ 1813 => x"79278638",
+ 1814 => x"7880d6b4",
+ 1815 => x"0c80d6b0",
+ 1816 => x"087927fc",
+ 1817 => x"a0387880",
+ 1818 => x"d6b00c84",
+ 1819 => x"1508fc06",
+ 1820 => x"70793179",
+ 1821 => x"72268f72",
+ 1822 => x"25075d55",
+ 1823 => x"5a7a802e",
+ 1824 => x"fc993888",
+ 1825 => x"39807457",
+ 1826 => x"53fedd39",
+ 1827 => x"7c5183df",
+ 1828 => x"3f800b80",
+ 1829 => x"0c8e3d0d",
+ 1830 => x"04807324",
+ 1831 => x"a5387282",
+ 1832 => x"2c81712b",
+ 1833 => x"80d6c808",
+ 1834 => x"077080d6",
+ 1835 => x"c40b8405",
+ 1836 => x"0c5c5a76",
+ 1837 => x"8c170c73",
+ 1838 => x"88170c75",
+ 1839 => x"88180cf9",
+ 1840 => x"fd398313",
+ 1841 => x"70822c81",
+ 1842 => x"712b80d6",
+ 1843 => x"c8080770",
+ 1844 => x"80d6c40b",
+ 1845 => x"84050c5d",
+ 1846 => x"5b53d839",
+ 1847 => x"7a75065c",
+ 1848 => x"7bfc9f38",
+ 1849 => x"84197510",
+ 1850 => x"5659f139",
+ 1851 => x"ff178105",
+ 1852 => x"59f7ab39",
+ 1853 => x"8c150888",
+ 1854 => x"1608718c",
+ 1855 => x"120c8812",
+ 1856 => x"0c597515",
+ 1857 => x"84110881",
+ 1858 => x"0784120c",
+ 1859 => x"587c5182",
+ 1860 => x"de3f8815",
+ 1861 => x"54fba339",
+ 1862 => x"77167881",
+ 1863 => x"0784180c",
+ 1864 => x"8c170888",
+ 1865 => x"1808718c",
+ 1866 => x"120c8812",
+ 1867 => x"0c5c7080",
+ 1868 => x"d6d80c70",
+ 1869 => x"80d6d40c",
+ 1870 => x"80d6cc0b",
+ 1871 => x"8c120c8c",
+ 1872 => x"11088812",
+ 1873 => x"0c778107",
+ 1874 => x"84120c77",
+ 1875 => x"0577710c",
+ 1876 => x"557c5182",
+ 1877 => x"9a3f8816",
+ 1878 => x"54f5ba39",
+ 1879 => x"72168411",
+ 1880 => x"08810784",
+ 1881 => x"120c588c",
+ 1882 => x"16088817",
+ 1883 => x"08718c12",
+ 1884 => x"0c88120c",
+ 1885 => x"577c5181",
+ 1886 => x"f63f8816",
+ 1887 => x"54f59639",
+ 1888 => x"7284150c",
+ 1889 => x"f41af806",
+ 1890 => x"70841d08",
+ 1891 => x"81060784",
+ 1892 => x"1d0c701c",
+ 1893 => x"5556850b",
+ 1894 => x"84150c85",
+ 1895 => x"0b88150c",
+ 1896 => x"8f7627fd",
+ 1897 => x"ab38881b",
+ 1898 => x"527c5184",
+ 1899 => x"c13f80d6",
+ 1900 => x"c40b8805",
+ 1901 => x"0880d688",
+ 1902 => x"085a55fd",
+ 1903 => x"93397880",
+ 1904 => x"d6880c73",
+ 1905 => x"80d6b80c",
+ 1906 => x"fbef3972",
+ 1907 => x"84150cfc",
+ 1908 => x"ff39fb3d",
+ 1909 => x"0d77707a",
+ 1910 => x"7c585553",
+ 1911 => x"568f7527",
+ 1912 => x"80e63872",
+ 1913 => x"76078306",
+ 1914 => x"517080dc",
+ 1915 => x"38757352",
+ 1916 => x"54707084",
+ 1917 => x"05520874",
+ 1918 => x"70840556",
+ 1919 => x"0c737170",
+ 1920 => x"84055308",
+ 1921 => x"71708405",
+ 1922 => x"530c7170",
+ 1923 => x"84055308",
+ 1924 => x"71708405",
+ 1925 => x"530c7170",
+ 1926 => x"84055308",
+ 1927 => x"71708405",
+ 1928 => x"530cf016",
+ 1929 => x"5654748f",
+ 1930 => x"26c73883",
+ 1931 => x"75279538",
+ 1932 => x"70708405",
+ 1933 => x"52087470",
+ 1934 => x"8405560c",
+ 1935 => x"fc155574",
+ 1936 => x"8326ed38",
+ 1937 => x"73715452",
+ 1938 => x"ff155170",
+ 1939 => x"ff2e9838",
+ 1940 => x"72708105",
+ 1941 => x"54337270",
+ 1942 => x"81055434",
+ 1943 => x"ff115170",
+ 1944 => x"ff2e0981",
+ 1945 => x"06ea3875",
+ 1946 => x"800c873d",
+ 1947 => x"0d040404",
+ 1948 => x"70707070",
+ 1949 => x"800b81b6",
+ 1950 => x"9c0c7651",
+ 1951 => x"87cc3f80",
+ 1952 => x"08538008",
+ 1953 => x"ff2e8938",
+ 1954 => x"72800c50",
+ 1955 => x"50505004",
+ 1956 => x"81b69c08",
+ 1957 => x"5473802e",
+ 1958 => x"ef387574",
+ 1959 => x"710c5272",
+ 1960 => x"800c5050",
+ 1961 => x"505004fb",
+ 1962 => x"3d0d7779",
+ 1963 => x"70720783",
+ 1964 => x"06535452",
+ 1965 => x"70933871",
+ 1966 => x"73730854",
+ 1967 => x"56547173",
+ 1968 => x"082e80c4",
+ 1969 => x"38737554",
+ 1970 => x"52713370",
+ 1971 => x"81ff0652",
+ 1972 => x"5470802e",
+ 1973 => x"9d387233",
+ 1974 => x"5570752e",
+ 1975 => x"09810695",
+ 1976 => x"38811281",
+ 1977 => x"14713370",
+ 1978 => x"81ff0654",
+ 1979 => x"56545270",
+ 1980 => x"e5387233",
+ 1981 => x"557381ff",
+ 1982 => x"067581ff",
+ 1983 => x"06717131",
+ 1984 => x"800c5552",
+ 1985 => x"873d0d04",
+ 1986 => x"7109f7fb",
+ 1987 => x"fdff1306",
+ 1988 => x"f8848281",
+ 1989 => x"80065271",
+ 1990 => x"97388414",
+ 1991 => x"84167108",
+ 1992 => x"54565471",
+ 1993 => x"75082ee0",
+ 1994 => x"38737554",
+ 1995 => x"52ff9a39",
+ 1996 => x"800b800c",
+ 1997 => x"873d0d04",
+ 1998 => x"fb3d0d77",
+ 1999 => x"705256fe",
+ 2000 => x"ad3f80d6",
+ 2001 => x"c40b8805",
+ 2002 => x"08841108",
+ 2003 => x"fc06707b",
+ 2004 => x"319fef05",
+ 2005 => x"e08006e0",
+ 2006 => x"80055255",
+ 2007 => x"55a08075",
+ 2008 => x"24943880",
+ 2009 => x"527551fe",
+ 2010 => x"873f80d6",
+ 2011 => x"cc081453",
+ 2012 => x"7280082e",
+ 2013 => x"8f387551",
+ 2014 => x"fdf53f80",
+ 2015 => x"5372800c",
+ 2016 => x"873d0d04",
+ 2017 => x"74305275",
+ 2018 => x"51fde53f",
+ 2019 => x"8008ff2e",
+ 2020 => x"a83880d6",
+ 2021 => x"c40b8805",
+ 2022 => x"08747631",
+ 2023 => x"81078412",
+ 2024 => x"0c5380d6",
+ 2025 => x"88087531",
+ 2026 => x"80d6880c",
+ 2027 => x"7551fdbf",
+ 2028 => x"3f810b80",
+ 2029 => x"0c873d0d",
+ 2030 => x"04805275",
+ 2031 => x"51fdb13f",
+ 2032 => x"80d6c40b",
+ 2033 => x"88050880",
+ 2034 => x"08713154",
+ 2035 => x"548f7325",
+ 2036 => x"ffa43880",
+ 2037 => x"0880d6b8",
+ 2038 => x"083180d6",
+ 2039 => x"880c7281",
+ 2040 => x"0784150c",
+ 2041 => x"7551fd87",
+ 2042 => x"3f8053ff",
+ 2043 => x"9039f73d",
+ 2044 => x"0d7b7d54",
+ 2045 => x"5a72802e",
+ 2046 => x"82833879",
+ 2047 => x"51fcef3f",
+ 2048 => x"f8138411",
+ 2049 => x"0870fe06",
+ 2050 => x"70138411",
+ 2051 => x"08fc065c",
+ 2052 => x"57585457",
+ 2053 => x"80d6cc08",
+ 2054 => x"742e82de",
+ 2055 => x"38778415",
+ 2056 => x"0c807381",
+ 2057 => x"06565974",
+ 2058 => x"792e81d5",
+ 2059 => x"38771484",
+ 2060 => x"11088106",
+ 2061 => x"565374a0",
+ 2062 => x"38771656",
+ 2063 => x"7881e638",
+ 2064 => x"88140855",
+ 2065 => x"7480d6cc",
+ 2066 => x"2e82f938",
+ 2067 => x"8c140870",
+ 2068 => x"8c170c75",
+ 2069 => x"88120c58",
+ 2070 => x"75810784",
+ 2071 => x"180c7517",
+ 2072 => x"76710c54",
+ 2073 => x"78819138",
+ 2074 => x"83ff7627",
+ 2075 => x"81c83875",
+ 2076 => x"892a7683",
+ 2077 => x"2a545473",
+ 2078 => x"802ebf38",
+ 2079 => x"75862ab8",
+ 2080 => x"05538474",
+ 2081 => x"27b43880",
+ 2082 => x"db145394",
+ 2083 => x"7427ab38",
+ 2084 => x"758c2a80",
+ 2085 => x"ee055380",
+ 2086 => x"d474279e",
+ 2087 => x"38758f2a",
+ 2088 => x"80f70553",
+ 2089 => x"82d47427",
+ 2090 => x"91387592",
+ 2091 => x"2a80fc05",
+ 2092 => x"538ad474",
+ 2093 => x"27843880",
+ 2094 => x"fe537210",
+ 2095 => x"101080d6",
+ 2096 => x"c4058811",
+ 2097 => x"08555573",
+ 2098 => x"752e82bf",
+ 2099 => x"38841408",
+ 2100 => x"fc065975",
+ 2101 => x"79278d38",
+ 2102 => x"88140854",
+ 2103 => x"73752e09",
+ 2104 => x"8106ea38",
+ 2105 => x"8c140870",
+ 2106 => x"8c190c74",
+ 2107 => x"88190c77",
+ 2108 => x"88120c55",
+ 2109 => x"768c150c",
+ 2110 => x"7951faf3",
+ 2111 => x"3f8b3d0d",
+ 2112 => x"04760877",
+ 2113 => x"71315876",
+ 2114 => x"05881808",
+ 2115 => x"56567480",
+ 2116 => x"d6cc2e80",
+ 2117 => x"e0388c17",
+ 2118 => x"08708c17",
+ 2119 => x"0c758812",
+ 2120 => x"0c53fe89",
+ 2121 => x"39881408",
+ 2122 => x"8c150870",
+ 2123 => x"8c130c59",
+ 2124 => x"88190cfe",
+ 2125 => x"a3397583",
+ 2126 => x"2a705454",
+ 2127 => x"80742481",
+ 2128 => x"98387282",
+ 2129 => x"2c81712b",
+ 2130 => x"80d6c808",
+ 2131 => x"0780d6c4",
+ 2132 => x"0b84050c",
+ 2133 => x"74101010",
+ 2134 => x"80d6c405",
+ 2135 => x"88110871",
+ 2136 => x"8c1b0c70",
+ 2137 => x"881b0c79",
+ 2138 => x"88130c56",
+ 2139 => x"5a55768c",
+ 2140 => x"150cff84",
+ 2141 => x"398159fd",
+ 2142 => x"b4397716",
+ 2143 => x"73810654",
+ 2144 => x"55729838",
+ 2145 => x"76087771",
+ 2146 => x"31587505",
+ 2147 => x"8c180888",
+ 2148 => x"1908718c",
+ 2149 => x"120c8812",
+ 2150 => x"0c555574",
+ 2151 => x"81078418",
+ 2152 => x"0c7680d6",
+ 2153 => x"c40b8805",
+ 2154 => x"0c80d6c0",
+ 2155 => x"087526fe",
+ 2156 => x"c73880d6",
+ 2157 => x"bc085279",
+ 2158 => x"51fafd3f",
+ 2159 => x"7951f9af",
+ 2160 => x"3ffeba39",
+ 2161 => x"81778c17",
+ 2162 => x"0c778817",
+ 2163 => x"0c758c19",
+ 2164 => x"0c758819",
+ 2165 => x"0c59fd80",
+ 2166 => x"39831470",
+ 2167 => x"822c8171",
+ 2168 => x"2b80d6c8",
+ 2169 => x"080780d6",
+ 2170 => x"c40b8405",
+ 2171 => x"0c751010",
+ 2172 => x"1080d6c4",
+ 2173 => x"05881108",
+ 2174 => x"718c1c0c",
+ 2175 => x"70881c0c",
+ 2176 => x"7a88130c",
+ 2177 => x"575b5653",
+ 2178 => x"fee43980",
+ 2179 => x"7324a338",
+ 2180 => x"72822c81",
+ 2181 => x"712b80d6",
+ 2182 => x"c8080780",
+ 2183 => x"d6c40b84",
+ 2184 => x"050c5874",
+ 2185 => x"8c180c73",
+ 2186 => x"88180c76",
+ 2187 => x"88160cfd",
+ 2188 => x"c3398313",
+ 2189 => x"70822c81",
+ 2190 => x"712b80d6",
+ 2191 => x"c8080780",
+ 2192 => x"d6c40b84",
+ 2193 => x"050c5953",
+ 2194 => x"da397070",
+ 2195 => x"7080e5f4",
+ 2196 => x"08893881",
+ 2197 => x"b6a00b80",
+ 2198 => x"e5f40c80",
+ 2199 => x"e5f40875",
+ 2200 => x"115252ff",
+ 2201 => x"537087fb",
+ 2202 => x"80802688",
+ 2203 => x"387080e5",
+ 2204 => x"f40c7153",
+ 2205 => x"72800c50",
+ 2206 => x"505004fd",
+ 2207 => x"3d0d800b",
+ 2208 => x"80d5f408",
+ 2209 => x"54547281",
+ 2210 => x"2e9b3873",
+ 2211 => x"80e5f80c",
+ 2212 => x"c3ee3fc2",
+ 2213 => x"eb3f80e5",
+ 2214 => x"cc528151",
+ 2215 => x"cc933f80",
+ 2216 => x"085180dd",
+ 2217 => x"3f7280e5",
+ 2218 => x"f80cc3d4",
+ 2219 => x"3fc2d13f",
+ 2220 => x"80e5cc52",
+ 2221 => x"8151cbf9",
+ 2222 => x"3f800851",
+ 2223 => x"80c33f00",
+ 2224 => x"ff3900ff",
+ 2225 => x"39f43d0d",
+ 2226 => x"7e80e5ec",
+ 2227 => x"08700870",
+ 2228 => x"81ff0692",
+ 2229 => x"3df80555",
+ 2230 => x"515a5759",
+ 2231 => x"c48f3f80",
+ 2232 => x"5477557b",
+ 2233 => x"7d585276",
+ 2234 => x"538e3df0",
+ 2235 => x"0551de8e",
+ 2236 => x"3f797b58",
+ 2237 => x"790c7684",
+ 2238 => x"1a0c7880",
+ 2239 => x"0c8e3d0d",
+ 2240 => x"04f73d0d",
+ 2241 => x"7b80decc",
+ 2242 => x"0882c811",
+ 2243 => x"085a545a",
+ 2244 => x"77802e80",
+ 2245 => x"da388188",
+ 2246 => x"18841908",
+ 2247 => x"ff058171",
+ 2248 => x"2b595559",
+ 2249 => x"80742480",
+ 2250 => x"ea388074",
+ 2251 => x"24b53873",
+ 2252 => x"822b7811",
+ 2253 => x"88055656",
+ 2254 => x"81801908",
+ 2255 => x"77065372",
+ 2256 => x"802eb638",
+ 2257 => x"78167008",
+ 2258 => x"53537951",
+ 2259 => x"74085372",
+ 2260 => x"2dff14fc",
+ 2261 => x"17fc1779",
+ 2262 => x"812c5a57",
+ 2263 => x"57547380",
+ 2264 => x"25d63877",
+ 2265 => x"085877ff",
+ 2266 => x"ad3880de",
+ 2267 => x"cc0853bc",
+ 2268 => x"1308a538",
+ 2269 => x"7951fec7",
+ 2270 => x"3f740853",
+ 2271 => x"722dff14",
+ 2272 => x"fc17fc17",
+ 2273 => x"79812c5a",
+ 2274 => x"57575473",
+ 2275 => x"8025ffa8",
+ 2276 => x"38d13980",
+ 2277 => x"57ff9339",
+ 2278 => x"7251bc13",
+ 2279 => x"0854732d",
+ 2280 => x"7951fe9b",
+ 2281 => x"3f707080",
+ 2282 => x"e5d40bfc",
+ 2283 => x"05700852",
+ 2284 => x"5270ff2e",
+ 2285 => x"9138702d",
+ 2286 => x"fc127008",
+ 2287 => x"525270ff",
+ 2288 => x"2e098106",
+ 2289 => x"f1385050",
+ 2290 => x"0404c2ff",
+ 2291 => x"3f040000",
+ 2292 => x"00000040",
+ 2293 => x"30313233",
+ 2294 => x"34353637",
+ 2295 => x"38390000",
+ 2296 => x"44485259",
+ 2297 => x"53544f4e",
+ 2298 => x"45205052",
+ 2299 => x"4f475241",
+ 2300 => x"4d2c2053",
+ 2301 => x"4f4d4520",
+ 2302 => x"53545249",
+ 2303 => x"4e470000",
+ 2304 => x"44485259",
+ 2305 => x"53544f4e",
+ 2306 => x"45205052",
+ 2307 => x"4f475241",
+ 2308 => x"4d2c2031",
+ 2309 => x"27535420",
+ 2310 => x"53545249",
+ 2311 => x"4e470000",
+ 2312 => x"44687279",
+ 2313 => x"73746f6e",
+ 2314 => x"65204265",
+ 2315 => x"6e63686d",
+ 2316 => x"61726b2c",
+ 2317 => x"20566572",
+ 2318 => x"73696f6e",
+ 2319 => x"20322e31",
+ 2320 => x"20284c61",
+ 2321 => x"6e677561",
+ 2322 => x"67653a20",
+ 2323 => x"43290a00",
+ 2324 => x"50726f67",
+ 2325 => x"72616d20",
+ 2326 => x"636f6d70",
+ 2327 => x"696c6564",
+ 2328 => x"20776974",
+ 2329 => x"68202772",
+ 2330 => x"65676973",
+ 2331 => x"74657227",
+ 2332 => x"20617474",
+ 2333 => x"72696275",
+ 2334 => x"74650a00",
+ 2335 => x"45786563",
+ 2336 => x"7574696f",
+ 2337 => x"6e207374",
+ 2338 => x"61727473",
+ 2339 => x"2c202564",
+ 2340 => x"2072756e",
+ 2341 => x"73207468",
+ 2342 => x"726f7567",
+ 2343 => x"68204468",
+ 2344 => x"72797374",
+ 2345 => x"6f6e650a",
+ 2346 => x"00000000",
+ 2347 => x"44485259",
+ 2348 => x"53544f4e",
+ 2349 => x"45205052",
+ 2350 => x"4f475241",
+ 2351 => x"4d2c2032",
+ 2352 => x"274e4420",
+ 2353 => x"53545249",
+ 2354 => x"4e470000",
+ 2355 => x"45786563",
+ 2356 => x"7574696f",
+ 2357 => x"6e20656e",
+ 2358 => x"64730a00",
+ 2359 => x"46696e61",
+ 2360 => x"6c207661",
+ 2361 => x"6c756573",
+ 2362 => x"206f6620",
+ 2363 => x"74686520",
+ 2364 => x"76617269",
+ 2365 => x"61626c65",
+ 2366 => x"73207573",
+ 2367 => x"65642069",
+ 2368 => x"6e207468",
+ 2369 => x"65206265",
+ 2370 => x"6e63686d",
+ 2371 => x"61726b3a",
+ 2372 => x"0a000000",
+ 2373 => x"496e745f",
+ 2374 => x"476c6f62",
+ 2375 => x"3a202020",
+ 2376 => x"20202020",
+ 2377 => x"20202020",
+ 2378 => x"2025640a",
+ 2379 => x"00000000",
+ 2380 => x"20202020",
+ 2381 => x"20202020",
+ 2382 => x"73686f75",
+ 2383 => x"6c642062",
+ 2384 => x"653a2020",
+ 2385 => x"2025640a",
+ 2386 => x"00000000",
+ 2387 => x"426f6f6c",
+ 2388 => x"5f476c6f",
+ 2389 => x"623a2020",
+ 2390 => x"20202020",
+ 2391 => x"20202020",
+ 2392 => x"2025640a",
+ 2393 => x"00000000",
+ 2394 => x"43685f31",
+ 2395 => x"5f476c6f",
+ 2396 => x"623a2020",
+ 2397 => x"20202020",
+ 2398 => x"20202020",
+ 2399 => x"2025630a",
+ 2400 => x"00000000",
+ 2401 => x"20202020",
+ 2402 => x"20202020",
+ 2403 => x"73686f75",
+ 2404 => x"6c642062",
+ 2405 => x"653a2020",
+ 2406 => x"2025630a",
+ 2407 => x"00000000",
+ 2408 => x"43685f32",
+ 2409 => x"5f476c6f",
+ 2410 => x"623a2020",
+ 2411 => x"20202020",
+ 2412 => x"20202020",
+ 2413 => x"2025630a",
+ 2414 => x"00000000",
+ 2415 => x"4172725f",
+ 2416 => x"315f476c",
+ 2417 => x"6f625b38",
+ 2418 => x"5d3a2020",
+ 2419 => x"20202020",
+ 2420 => x"2025640a",
+ 2421 => x"00000000",
+ 2422 => x"4172725f",
+ 2423 => x"325f476c",
+ 2424 => x"6f625b38",
+ 2425 => x"5d5b375d",
+ 2426 => x"3a202020",
+ 2427 => x"2025640a",
+ 2428 => x"00000000",
+ 2429 => x"20202020",
+ 2430 => x"20202020",
+ 2431 => x"73686f75",
+ 2432 => x"6c642062",
+ 2433 => x"653a2020",
+ 2434 => x"204e756d",
+ 2435 => x"6265725f",
+ 2436 => x"4f665f52",
+ 2437 => x"756e7320",
+ 2438 => x"2b203130",
+ 2439 => x"0a000000",
+ 2440 => x"5074725f",
+ 2441 => x"476c6f62",
+ 2442 => x"2d3e0a00",
+ 2443 => x"20205074",
+ 2444 => x"725f436f",
+ 2445 => x"6d703a20",
+ 2446 => x"20202020",
+ 2447 => x"20202020",
+ 2448 => x"2025640a",
+ 2449 => x"00000000",
+ 2450 => x"20202020",
+ 2451 => x"20202020",
+ 2452 => x"73686f75",
+ 2453 => x"6c642062",
+ 2454 => x"653a2020",
+ 2455 => x"2028696d",
+ 2456 => x"706c656d",
+ 2457 => x"656e7461",
+ 2458 => x"74696f6e",
+ 2459 => x"2d646570",
+ 2460 => x"656e6465",
+ 2461 => x"6e74290a",
+ 2462 => x"00000000",
+ 2463 => x"20204469",
+ 2464 => x"7363723a",
+ 2465 => x"20202020",
+ 2466 => x"20202020",
+ 2467 => x"20202020",
+ 2468 => x"2025640a",
+ 2469 => x"00000000",
+ 2470 => x"2020456e",
+ 2471 => x"756d5f43",
+ 2472 => x"6f6d703a",
+ 2473 => x"20202020",
+ 2474 => x"20202020",
+ 2475 => x"2025640a",
+ 2476 => x"00000000",
+ 2477 => x"2020496e",
+ 2478 => x"745f436f",
+ 2479 => x"6d703a20",
+ 2480 => x"20202020",
+ 2481 => x"20202020",
+ 2482 => x"2025640a",
+ 2483 => x"00000000",
+ 2484 => x"20205374",
+ 2485 => x"725f436f",
+ 2486 => x"6d703a20",
+ 2487 => x"20202020",
+ 2488 => x"20202020",
+ 2489 => x"2025730a",
+ 2490 => x"00000000",
+ 2491 => x"20202020",
+ 2492 => x"20202020",
+ 2493 => x"73686f75",
+ 2494 => x"6c642062",
+ 2495 => x"653a2020",
+ 2496 => x"20444852",
+ 2497 => x"5953544f",
+ 2498 => x"4e452050",
+ 2499 => x"524f4752",
+ 2500 => x"414d2c20",
+ 2501 => x"534f4d45",
+ 2502 => x"20535452",
+ 2503 => x"494e470a",
+ 2504 => x"00000000",
+ 2505 => x"4e657874",
+ 2506 => x"5f507472",
+ 2507 => x"5f476c6f",
+ 2508 => x"622d3e0a",
+ 2509 => x"00000000",
+ 2510 => x"20202020",
+ 2511 => x"20202020",
+ 2512 => x"73686f75",
+ 2513 => x"6c642062",
+ 2514 => x"653a2020",
+ 2515 => x"2028696d",
+ 2516 => x"706c656d",
+ 2517 => x"656e7461",
+ 2518 => x"74696f6e",
+ 2519 => x"2d646570",
+ 2520 => x"656e6465",
+ 2521 => x"6e74292c",
+ 2522 => x"2073616d",
+ 2523 => x"65206173",
+ 2524 => x"2061626f",
+ 2525 => x"76650a00",
+ 2526 => x"496e745f",
+ 2527 => x"315f4c6f",
+ 2528 => x"633a2020",
+ 2529 => x"20202020",
+ 2530 => x"20202020",
+ 2531 => x"2025640a",
+ 2532 => x"00000000",
+ 2533 => x"496e745f",
+ 2534 => x"325f4c6f",
+ 2535 => x"633a2020",
+ 2536 => x"20202020",
+ 2537 => x"20202020",
+ 2538 => x"2025640a",
+ 2539 => x"00000000",
+ 2540 => x"496e745f",
+ 2541 => x"335f4c6f",
+ 2542 => x"633a2020",
+ 2543 => x"20202020",
+ 2544 => x"20202020",
+ 2545 => x"2025640a",
+ 2546 => x"00000000",
+ 2547 => x"456e756d",
+ 2548 => x"5f4c6f63",
+ 2549 => x"3a202020",
+ 2550 => x"20202020",
+ 2551 => x"20202020",
+ 2552 => x"2025640a",
+ 2553 => x"00000000",
+ 2554 => x"5374725f",
+ 2555 => x"315f4c6f",
+ 2556 => x"633a2020",
+ 2557 => x"20202020",
+ 2558 => x"20202020",
+ 2559 => x"2025730a",
+ 2560 => x"00000000",
+ 2561 => x"20202020",
+ 2562 => x"20202020",
+ 2563 => x"73686f75",
+ 2564 => x"6c642062",
+ 2565 => x"653a2020",
+ 2566 => x"20444852",
+ 2567 => x"5953544f",
+ 2568 => x"4e452050",
+ 2569 => x"524f4752",
+ 2570 => x"414d2c20",
+ 2571 => x"31275354",
+ 2572 => x"20535452",
+ 2573 => x"494e470a",
+ 2574 => x"00000000",
+ 2575 => x"5374725f",
+ 2576 => x"325f4c6f",
+ 2577 => x"633a2020",
+ 2578 => x"20202020",
+ 2579 => x"20202020",
+ 2580 => x"2025730a",
+ 2581 => x"00000000",
+ 2582 => x"20202020",
+ 2583 => x"20202020",
+ 2584 => x"73686f75",
+ 2585 => x"6c642062",
+ 2586 => x"653a2020",
+ 2587 => x"20444852",
+ 2588 => x"5953544f",
+ 2589 => x"4e452050",
+ 2590 => x"524f4752",
+ 2591 => x"414d2c20",
+ 2592 => x"32274e44",
+ 2593 => x"20535452",
+ 2594 => x"494e470a",
+ 2595 => x"00000000",
+ 2596 => x"55736572",
+ 2597 => x"2074696d",
+ 2598 => x"653a2025",
+ 2599 => x"640a0000",
+ 2600 => x"4d696372",
+ 2601 => x"6f736563",
+ 2602 => x"6f6e6473",
+ 2603 => x"20666f72",
+ 2604 => x"206f6e65",
+ 2605 => x"2072756e",
+ 2606 => x"20746872",
+ 2607 => x"6f756768",
+ 2608 => x"20446872",
+ 2609 => x"7973746f",
+ 2610 => x"6e653a20",
+ 2611 => x"00000000",
+ 2612 => x"2564200a",
+ 2613 => x"00000000",
+ 2614 => x"44687279",
+ 2615 => x"73746f6e",
+ 2616 => x"65732070",
+ 2617 => x"65722053",
+ 2618 => x"65636f6e",
+ 2619 => x"643a2020",
+ 2620 => x"20202020",
+ 2621 => x"20202020",
+ 2622 => x"20202020",
+ 2623 => x"20202020",
+ 2624 => x"20202020",
+ 2625 => x"00000000",
+ 2626 => x"56415820",
+ 2627 => x"4d495053",
+ 2628 => x"20726174",
+ 2629 => x"696e6720",
+ 2630 => x"2a203130",
+ 2631 => x"3030203d",
+ 2632 => x"20256420",
+ 2633 => x"0a000000",
+ 2634 => x"50726f67",
+ 2635 => x"72616d20",
+ 2636 => x"636f6d70",
+ 2637 => x"696c6564",
+ 2638 => x"20776974",
+ 2639 => x"686f7574",
+ 2640 => x"20277265",
+ 2641 => x"67697374",
+ 2642 => x"65722720",
+ 2643 => x"61747472",
+ 2644 => x"69627574",
+ 2645 => x"650a0000",
+ 2646 => x"4d656173",
+ 2647 => x"75726564",
+ 2648 => x"2074696d",
+ 2649 => x"6520746f",
+ 2650 => x"6f20736d",
+ 2651 => x"616c6c20",
+ 2652 => x"746f206f",
+ 2653 => x"62746169",
+ 2654 => x"6e206d65",
+ 2655 => x"616e696e",
+ 2656 => x"6766756c",
+ 2657 => x"20726573",
+ 2658 => x"756c7473",
+ 2659 => x"0a000000",
+ 2660 => x"506c6561",
+ 2661 => x"73652069",
+ 2662 => x"6e637265",
+ 2663 => x"61736520",
+ 2664 => x"6e756d62",
+ 2665 => x"6572206f",
+ 2666 => x"66207275",
+ 2667 => x"6e730a00",
+ 2668 => x"44485259",
+ 2669 => x"53544f4e",
+ 2670 => x"45205052",
+ 2671 => x"4f475241",
+ 2672 => x"4d2c2033",
+ 2673 => x"27524420",
+ 2674 => x"53545249",
+ 2675 => x"4e470000",
+ 2676 => x"00010202",
+ 2677 => x"03030303",
+ 2678 => x"04040404",
+ 2679 => x"04040404",
+ 2680 => x"05050505",
+ 2681 => x"05050505",
+ 2682 => x"05050505",
+ 2683 => x"05050505",
+ 2684 => x"06060606",
+ 2685 => x"06060606",
+ 2686 => x"06060606",
+ 2687 => x"06060606",
+ 2688 => x"06060606",
+ 2689 => x"06060606",
+ 2690 => x"06060606",
+ 2691 => x"06060606",
+ 2692 => x"07070707",
+ 2693 => x"07070707",
+ 2694 => x"07070707",
+ 2695 => x"07070707",
+ 2696 => x"07070707",
+ 2697 => x"07070707",
+ 2698 => x"07070707",
+ 2699 => x"07070707",
+ 2700 => x"07070707",
+ 2701 => x"07070707",
+ 2702 => x"07070707",
+ 2703 => x"07070707",
+ 2704 => x"07070707",
+ 2705 => x"07070707",
+ 2706 => x"07070707",
+ 2707 => x"07070707",
+ 2708 => x"08080808",
+ 2709 => x"08080808",
+ 2710 => x"08080808",
+ 2711 => x"08080808",
+ 2712 => x"08080808",
+ 2713 => x"08080808",
+ 2714 => x"08080808",
+ 2715 => x"08080808",
+ 2716 => x"08080808",
+ 2717 => x"08080808",
+ 2718 => x"08080808",
+ 2719 => x"08080808",
+ 2720 => x"08080808",
+ 2721 => x"08080808",
+ 2722 => x"08080808",
+ 2723 => x"08080808",
+ 2724 => x"08080808",
+ 2725 => x"08080808",
+ 2726 => x"08080808",
+ 2727 => x"08080808",
+ 2728 => x"08080808",
+ 2729 => x"08080808",
+ 2730 => x"08080808",
+ 2731 => x"08080808",
+ 2732 => x"08080808",
+ 2733 => x"08080808",
+ 2734 => x"08080808",
+ 2735 => x"08080808",
+ 2736 => x"08080808",
+ 2737 => x"08080808",
+ 2738 => x"08080808",
+ 2739 => x"08080808",
+ 2740 => x"43000000",
+ 2741 => x"64756d6d",
+ 2742 => x"792e6578",
+ 2743 => x"65000000",
+ 2744 => x"00ffffff",
+ 2745 => x"ff00ffff",
+ 2746 => x"ffff00ff",
+ 2747 => x"ffffff00",
+ 2748 => x"00000000",
+ 2749 => x"00000000",
+ 2750 => x"00000000",
+ 2751 => x"000032dc",
+ 2752 => x"0000c350",
+ 2753 => x"00000000",
+ 2754 => x"00000000",
+ 2755 => x"00000000",
+ 2756 => x"00000000",
+ 2757 => x"00000000",
+ 2758 => x"00000000",
+ 2759 => x"00000000",
+ 2760 => x"00000000",
+ 2761 => x"00000000",
+ 2762 => x"00000000",
+ 2763 => x"00000000",
+ 2764 => x"00000000",
+ 2765 => x"00000000",
+ 2766 => x"ffffffff",
+ 2767 => x"00000000",
+ 2768 => x"00020000",
+ 2769 => x"00000000",
+ 2770 => x"00000000",
+ 2771 => x"00002b44",
+ 2772 => x"00002b44",
+ 2773 => x"00002b4c",
+ 2774 => x"00002b4c",
+ 2775 => x"00002b54",
+ 2776 => x"00002b54",
+ 2777 => x"00002b5c",
+ 2778 => x"00002b5c",
+ 2779 => x"00002b64",
+ 2780 => x"00002b64",
+ 2781 => x"00002b6c",
+ 2782 => x"00002b6c",
+ 2783 => x"00002b74",
+ 2784 => x"00002b74",
+ 2785 => x"00002b7c",
+ 2786 => x"00002b7c",
+ 2787 => x"00002b84",
+ 2788 => x"00002b84",
+ 2789 => x"00002b8c",
+ 2790 => x"00002b8c",
+ 2791 => x"00002b94",
+ 2792 => x"00002b94",
+ 2793 => x"00002b9c",
+ 2794 => x"00002b9c",
+ 2795 => x"00002ba4",
+ 2796 => x"00002ba4",
+ 2797 => x"00002bac",
+ 2798 => x"00002bac",
+ 2799 => x"00002bb4",
+ 2800 => x"00002bb4",
+ 2801 => x"00002bbc",
+ 2802 => x"00002bbc",
+ 2803 => x"00002bc4",
+ 2804 => x"00002bc4",
+ 2805 => x"00002bcc",
+ 2806 => x"00002bcc",
+ 2807 => x"00002bd4",
+ 2808 => x"00002bd4",
+ 2809 => x"00002bdc",
+ 2810 => x"00002bdc",
+ 2811 => x"00002be4",
+ 2812 => x"00002be4",
+ 2813 => x"00002bec",
+ 2814 => x"00002bec",
+ 2815 => x"00002bf4",
+ 2816 => x"00002bf4",
+ 2817 => x"00002bfc",
+ 2818 => x"00002bfc",
+ 2819 => x"00002c04",
+ 2820 => x"00002c04",
+ 2821 => x"00002c0c",
+ 2822 => x"00002c0c",
+ 2823 => x"00002c14",
+ 2824 => x"00002c14",
+ 2825 => x"00002c1c",
+ 2826 => x"00002c1c",
+ 2827 => x"00002c24",
+ 2828 => x"00002c24",
+ 2829 => x"00002c2c",
+ 2830 => x"00002c2c",
+ 2831 => x"00002c34",
+ 2832 => x"00002c34",
+ 2833 => x"00002c3c",
+ 2834 => x"00002c3c",
+ 2835 => x"00002c44",
+ 2836 => x"00002c44",
+ 2837 => x"00002c4c",
+ 2838 => x"00002c4c",
+ 2839 => x"00002c54",
+ 2840 => x"00002c54",
+ 2841 => x"00002c5c",
+ 2842 => x"00002c5c",
+ 2843 => x"00002c64",
+ 2844 => x"00002c64",
+ 2845 => x"00002c6c",
+ 2846 => x"00002c6c",
+ 2847 => x"00002c74",
+ 2848 => x"00002c74",
+ 2849 => x"00002c7c",
+ 2850 => x"00002c7c",
+ 2851 => x"00002c84",
+ 2852 => x"00002c84",
+ 2853 => x"00002c8c",
+ 2854 => x"00002c8c",
+ 2855 => x"00002c94",
+ 2856 => x"00002c94",
+ 2857 => x"00002c9c",
+ 2858 => x"00002c9c",
+ 2859 => x"00002ca4",
+ 2860 => x"00002ca4",
+ 2861 => x"00002cac",
+ 2862 => x"00002cac",
+ 2863 => x"00002cb4",
+ 2864 => x"00002cb4",
+ 2865 => x"00002cbc",
+ 2866 => x"00002cbc",
+ 2867 => x"00002cc4",
+ 2868 => x"00002cc4",
+ 2869 => x"00002ccc",
+ 2870 => x"00002ccc",
+ 2871 => x"00002cd4",
+ 2872 => x"00002cd4",
+ 2873 => x"00002cdc",
+ 2874 => x"00002cdc",
+ 2875 => x"00002ce4",
+ 2876 => x"00002ce4",
+ 2877 => x"00002cec",
+ 2878 => x"00002cec",
+ 2879 => x"00002cf4",
+ 2880 => x"00002cf4",
+ 2881 => x"00002cfc",
+ 2882 => x"00002cfc",
+ 2883 => x"00002d04",
+ 2884 => x"00002d04",
+ 2885 => x"00002d0c",
+ 2886 => x"00002d0c",
+ 2887 => x"00002d14",
+ 2888 => x"00002d14",
+ 2889 => x"00002d1c",
+ 2890 => x"00002d1c",
+ 2891 => x"00002d24",
+ 2892 => x"00002d24",
+ 2893 => x"00002d2c",
+ 2894 => x"00002d2c",
+ 2895 => x"00002d34",
+ 2896 => x"00002d34",
+ 2897 => x"00002d3c",
+ 2898 => x"00002d3c",
+ 2899 => x"00002d44",
+ 2900 => x"00002d44",
+ 2901 => x"00002d4c",
+ 2902 => x"00002d4c",
+ 2903 => x"00002d54",
+ 2904 => x"00002d54",
+ 2905 => x"00002d5c",
+ 2906 => x"00002d5c",
+ 2907 => x"00002d64",
+ 2908 => x"00002d64",
+ 2909 => x"00002d6c",
+ 2910 => x"00002d6c",
+ 2911 => x"00002d74",
+ 2912 => x"00002d74",
+ 2913 => x"00002d7c",
+ 2914 => x"00002d7c",
+ 2915 => x"00002d84",
+ 2916 => x"00002d84",
+ 2917 => x"00002d8c",
+ 2918 => x"00002d8c",
+ 2919 => x"00002d94",
+ 2920 => x"00002d94",
+ 2921 => x"00002d9c",
+ 2922 => x"00002d9c",
+ 2923 => x"00002da4",
+ 2924 => x"00002da4",
+ 2925 => x"00002dac",
+ 2926 => x"00002dac",
+ 2927 => x"00002db4",
+ 2928 => x"00002db4",
+ 2929 => x"00002dbc",
+ 2930 => x"00002dbc",
+ 2931 => x"00002dc4",
+ 2932 => x"00002dc4",
+ 2933 => x"00002dcc",
+ 2934 => x"00002dcc",
+ 2935 => x"00002dd4",
+ 2936 => x"00002dd4",
+ 2937 => x"00002ddc",
+ 2938 => x"00002ddc",
+ 2939 => x"00002de4",
+ 2940 => x"00002de4",
+ 2941 => x"00002dec",
+ 2942 => x"00002dec",
+ 2943 => x"00002df4",
+ 2944 => x"00002df4",
+ 2945 => x"00002dfc",
+ 2946 => x"00002dfc",
+ 2947 => x"00002e04",
+ 2948 => x"00002e04",
+ 2949 => x"00002e0c",
+ 2950 => x"00002e0c",
+ 2951 => x"00002e14",
+ 2952 => x"00002e14",
+ 2953 => x"00002e1c",
+ 2954 => x"00002e1c",
+ 2955 => x"00002e24",
+ 2956 => x"00002e24",
+ 2957 => x"00002e2c",
+ 2958 => x"00002e2c",
+ 2959 => x"00002e34",
+ 2960 => x"00002e34",
+ 2961 => x"00002e3c",
+ 2962 => x"00002e3c",
+ 2963 => x"00002e44",
+ 2964 => x"00002e44",
+ 2965 => x"00002e4c",
+ 2966 => x"00002e4c",
+ 2967 => x"00002e54",
+ 2968 => x"00002e54",
+ 2969 => x"00002e5c",
+ 2970 => x"00002e5c",
+ 2971 => x"00002e64",
+ 2972 => x"00002e64",
+ 2973 => x"00002e6c",
+ 2974 => x"00002e6c",
+ 2975 => x"00002e74",
+ 2976 => x"00002e74",
+ 2977 => x"00002e7c",
+ 2978 => x"00002e7c",
+ 2979 => x"00002e84",
+ 2980 => x"00002e84",
+ 2981 => x"00002e8c",
+ 2982 => x"00002e8c",
+ 2983 => x"00002e94",
+ 2984 => x"00002e94",
+ 2985 => x"00002e9c",
+ 2986 => x"00002e9c",
+ 2987 => x"00002ea4",
+ 2988 => x"00002ea4",
+ 2989 => x"00002eac",
+ 2990 => x"00002eac",
+ 2991 => x"00002eb4",
+ 2992 => x"00002eb4",
+ 2993 => x"00002ebc",
+ 2994 => x"00002ebc",
+ 2995 => x"00002ec4",
+ 2996 => x"00002ec4",
+ 2997 => x"00002ecc",
+ 2998 => x"00002ecc",
+ 2999 => x"00002ed4",
+ 3000 => x"00002ed4",
+ 3001 => x"00002edc",
+ 3002 => x"00002edc",
+ 3003 => x"00002ee4",
+ 3004 => x"00002ee4",
+ 3005 => x"00002eec",
+ 3006 => x"00002eec",
+ 3007 => x"00002ef4",
+ 3008 => x"00002ef4",
+ 3009 => x"00002efc",
+ 3010 => x"00002efc",
+ 3011 => x"00002f04",
+ 3012 => x"00002f04",
+ 3013 => x"00002f0c",
+ 3014 => x"00002f0c",
+ 3015 => x"00002f14",
+ 3016 => x"00002f14",
+ 3017 => x"00002f1c",
+ 3018 => x"00002f1c",
+ 3019 => x"00002f24",
+ 3020 => x"00002f24",
+ 3021 => x"00002f2c",
+ 3022 => x"00002f2c",
+ 3023 => x"00002f34",
+ 3024 => x"00002f34",
+ 3025 => x"00002f3c",
+ 3026 => x"00002f3c",
+ 3027 => x"00002f50",
+ 3028 => x"00000000",
+ 3029 => x"000031b8",
+ 3030 => x"00003214",
+ 3031 => x"00003270",
+ 3032 => x"00000000",
+ 3033 => x"00000000",
+ 3034 => x"00000000",
+ 3035 => x"00000000",
+ 3036 => x"00000000",
+ 3037 => x"00000000",
+ 3038 => x"00000000",
+ 3039 => x"00000000",
+ 3040 => x"00000000",
+ 3041 => x"00002ad0",
+ 3042 => x"00000000",
+ 3043 => x"00000000",
+ 3044 => x"00000000",
+ 3045 => x"00000000",
+ 3046 => x"00000000",
+ 3047 => x"00000000",
+ 3048 => x"00000000",
+ 3049 => x"00000000",
+ 3050 => x"00000000",
+ 3051 => x"00000000",
+ 3052 => x"00000000",
+ 3053 => x"00000000",
+ 3054 => x"00000000",
+ 3055 => x"00000000",
+ 3056 => x"00000000",
+ 3057 => x"00000000",
+ 3058 => x"00000000",
+ 3059 => x"00000000",
+ 3060 => x"00000000",
+ 3061 => x"00000000",
+ 3062 => x"00000000",
+ 3063 => x"00000000",
+ 3064 => x"00000000",
+ 3065 => x"00000000",
+ 3066 => x"00000000",
+ 3067 => x"00000000",
+ 3068 => x"00000000",
+ 3069 => x"00000000",
+ 3070 => x"00000001",
+ 3071 => x"330eabcd",
+ 3072 => x"1234e66d",
+ 3073 => x"deec0005",
+ 3074 => x"000b0000",
+ 3075 => x"00000000",
+ 3076 => x"00000000",
+ 3077 => x"00000000",
+ 3078 => x"00000000",
+ 3079 => x"00000000",
+ 3080 => x"00000000",
+ 3081 => x"00000000",
+ 3082 => x"00000000",
+ 3083 => x"00000000",
+ 3084 => x"00000000",
+ 3085 => x"00000000",
+ 3086 => x"00000000",
+ 3087 => x"00000000",
+ 3088 => x"00000000",
+ 3089 => x"00000000",
+ 3090 => x"00000000",
+ 3091 => x"00000000",
+ 3092 => x"00000000",
+ 3093 => x"00000000",
+ 3094 => x"00000000",
+ 3095 => x"00000000",
+ 3096 => x"00000000",
+ 3097 => x"00000000",
+ 3098 => x"00000000",
+ 3099 => x"00000000",
+ 3100 => x"00000000",
+ 3101 => x"00000000",
+ 3102 => x"00000000",
+ 3103 => x"00000000",
+ 3104 => x"00000000",
+ 3105 => x"00000000",
+ 3106 => x"00000000",
+ 3107 => x"00000000",
+ 3108 => x"00000000",
+ 3109 => x"00000000",
+ 3110 => x"00000000",
+ 3111 => x"00000000",
+ 3112 => x"00000000",
+ 3113 => x"00000000",
+ 3114 => x"00000000",
+ 3115 => x"00000000",
+ 3116 => x"00000000",
+ 3117 => x"00000000",
+ 3118 => x"00000000",
+ 3119 => x"00000000",
+ 3120 => x"00000000",
+ 3121 => x"00000000",
+ 3122 => x"00000000",
+ 3123 => x"00000000",
+ 3124 => x"00000000",
+ 3125 => x"00000000",
+ 3126 => x"00000000",
+ 3127 => x"00000000",
+ 3128 => x"00000000",
+ 3129 => x"00000000",
+ 3130 => x"00000000",
+ 3131 => x"00000000",
+ 3132 => x"00000000",
+ 3133 => x"00000000",
+ 3134 => x"00000000",
+ 3135 => x"00000000",
+ 3136 => x"00000000",
+ 3137 => x"00000000",
+ 3138 => x"00000000",
+ 3139 => x"00000000",
+ 3140 => x"00000000",
+ 3141 => x"00000000",
+ 3142 => x"00000000",
+ 3143 => x"00000000",
+ 3144 => x"00000000",
+ 3145 => x"00000000",
+ 3146 => x"00000000",
+ 3147 => x"00000000",
+ 3148 => x"00000000",
+ 3149 => x"00000000",
+ 3150 => x"00000000",
+ 3151 => x"00000000",
+ 3152 => x"00000000",
+ 3153 => x"00000000",
+ 3154 => x"00000000",
+ 3155 => x"00000000",
+ 3156 => x"00000000",
+ 3157 => x"00000000",
+ 3158 => x"00000000",
+ 3159 => x"00000000",
+ 3160 => x"00000000",
+ 3161 => x"00000000",
+ 3162 => x"00000000",
+ 3163 => x"00000000",
+ 3164 => x"00000000",
+ 3165 => x"00000000",
+ 3166 => x"00000000",
+ 3167 => x"00000000",
+ 3168 => x"00000000",
+ 3169 => x"00000000",
+ 3170 => x"00000000",
+ 3171 => x"00000000",
+ 3172 => x"00000000",
+ 3173 => x"00000000",
+ 3174 => x"00000000",
+ 3175 => x"00000000",
+ 3176 => x"00000000",
+ 3177 => x"00000000",
+ 3178 => x"00000000",
+ 3179 => x"00000000",
+ 3180 => x"00000000",
+ 3181 => x"00000000",
+ 3182 => x"00000000",
+ 3183 => x"00000000",
+ 3184 => x"00000000",
+ 3185 => x"00000000",
+ 3186 => x"00000000",
+ 3187 => x"00000000",
+ 3188 => x"00000000",
+ 3189 => x"00000000",
+ 3190 => x"00000000",
+ 3191 => x"00000000",
+ 3192 => x"00000000",
+ 3193 => x"00000000",
+ 3194 => x"00000000",
+ 3195 => x"00000000",
+ 3196 => x"00000000",
+ 3197 => x"00000000",
+ 3198 => x"00000000",
+ 3199 => x"00000000",
+ 3200 => x"00000000",
+ 3201 => x"00000000",
+ 3202 => x"00000000",
+ 3203 => x"00000000",
+ 3204 => x"00000000",
+ 3205 => x"00000000",
+ 3206 => x"00000000",
+ 3207 => x"00000000",
+ 3208 => x"00000000",
+ 3209 => x"00000000",
+ 3210 => x"00000000",
+ 3211 => x"00000000",
+ 3212 => x"00000000",
+ 3213 => x"00000000",
+ 3214 => x"00000000",
+ 3215 => x"00000000",
+ 3216 => x"00000000",
+ 3217 => x"00000000",
+ 3218 => x"00000000",
+ 3219 => x"00000000",
+ 3220 => x"00000000",
+ 3221 => x"00000000",
+ 3222 => x"00000000",
+ 3223 => x"00000000",
+ 3224 => x"00000000",
+ 3225 => x"00000000",
+ 3226 => x"00000000",
+ 3227 => x"00000000",
+ 3228 => x"00000000",
+ 3229 => x"00000000",
+ 3230 => x"00000000",
+ 3231 => x"00000000",
+ 3232 => x"00000000",
+ 3233 => x"00000000",
+ 3234 => x"00000000",
+ 3235 => x"00000000",
+ 3236 => x"00000000",
+ 3237 => x"00000000",
+ 3238 => x"00000000",
+ 3239 => x"00000000",
+ 3240 => x"00000000",
+ 3241 => x"00000000",
+ 3242 => x"00000000",
+ 3243 => x"00000000",
+ 3244 => x"00000000",
+ 3245 => x"00000000",
+ 3246 => x"00000000",
+ 3247 => x"00000000",
+ 3248 => x"00000000",
+ 3249 => x"00000000",
+ 3250 => x"00000000",
+ 3251 => x"00002ad4",
+ 3252 => x"ffffffff",
+ 3253 => x"00000000",
+ 3254 => x"ffffffff",
+ 3255 => x"00000000",
+ 3256 => x"00000000",
+ others => x"00000000"
+);
+
+begin
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memAWriteEnable = '1') and (memBWriteEnable = '1') and (memAAddr=memBAddr) and (memAWrite/=memBWrite) then
+ report "write collision" severity failure;
+ end if;
+
+ if (memAWriteEnable = '1') then
+ ram(to_integer(unsigned(memAAddr))) := memAWrite;
+ memARead <= memAWrite;
+ else
+ memARead <= ram(to_integer(unsigned(memAAddr)));
+ end if;
+ end if;
+end process;
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memBWriteEnable = '1') then
+ ram(to_integer(unsigned(memBAddr))) := memBWrite;
+ memBRead <= memBWrite;
+ else
+ memBRead <= ram(to_integer(unsigned(memBAddr)));
+ end if;
+ end if;
+end process;
+
+
+
+
+end dualport_ram_arch;
diff --git a/zpu/hdl/example/helloworld.vhd b/zpu/hdl/example/helloworld.vhd
new file mode 100644
index 0000000..cc8d8c6
--- /dev/null
+++ b/zpu/hdl/example/helloworld.vhd
@@ -0,0 +1,3154 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+entity dualport_ram is
+port (clk : in std_logic;
+ memAWriteEnable : in std_logic;
+ memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memAWrite : in std_logic_vector(wordSize-1 downto 0);
+ memARead : out std_logic_vector(wordSize-1 downto 0);
+ memBWriteEnable : in std_logic;
+ memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memBWrite : in std_logic_vector(wordSize-1 downto 0);
+ memBRead : out std_logic_vector(wordSize-1 downto 0));
+end dualport_ram;
+
+architecture dualport_ram_arch of dualport_ram is
+
+
+type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0);
+
+shared variable ram : ram_type :=
+(
+0 => x"0b0b0b0b",
+1 => x"82700b0b",
+2 => x"80cfd80c",
+3 => x"3a0b0b80",
+4 => x"c6d00400",
+5 => x"00000000",
+6 => x"00000000",
+7 => x"00000000",
+8 => x"80088408",
+9 => x"88080b0b",
+10 => x"80c7972d",
+11 => x"880c840c",
+12 => x"800c0400",
+13 => x"00000000",
+14 => x"00000000",
+15 => x"00000000",
+16 => x"71fd0608",
+17 => x"72830609",
+18 => x"81058205",
+19 => x"832b2a83",
+20 => x"ffff0652",
+21 => x"04000000",
+22 => x"00000000",
+23 => x"00000000",
+24 => x"71fd0608",
+25 => x"83ffff73",
+26 => x"83060981",
+27 => x"05820583",
+28 => x"2b2b0906",
+29 => x"7383ffff",
+30 => x"0b0b0b0b",
+31 => x"83a70400",
+32 => x"72098105",
+33 => x"72057373",
+34 => x"09060906",
+35 => x"73097306",
+36 => x"070a8106",
+37 => x"53510400",
+38 => x"00000000",
+39 => x"00000000",
+40 => x"72722473",
+41 => x"732e0753",
+42 => x"51040000",
+43 => x"00000000",
+44 => x"00000000",
+45 => x"00000000",
+46 => x"00000000",
+47 => x"00000000",
+48 => x"71737109",
+49 => x"71068106",
+50 => x"30720a10",
+51 => x"0a720a10",
+52 => x"0a31050a",
+53 => x"81065151",
+54 => x"53510400",
+55 => x"00000000",
+56 => x"72722673",
+57 => x"732e0753",
+58 => x"51040000",
+59 => x"00000000",
+60 => x"00000000",
+61 => x"00000000",
+62 => x"00000000",
+63 => x"00000000",
+64 => x"00000000",
+65 => x"00000000",
+66 => x"00000000",
+67 => x"00000000",
+68 => x"00000000",
+69 => x"00000000",
+70 => x"00000000",
+71 => x"00000000",
+72 => x"0b0b0b88",
+73 => x"c4040000",
+74 => x"00000000",
+75 => x"00000000",
+76 => x"00000000",
+77 => x"00000000",
+78 => x"00000000",
+79 => x"00000000",
+80 => x"720a722b",
+81 => x"0a535104",
+82 => x"00000000",
+83 => x"00000000",
+84 => x"00000000",
+85 => x"00000000",
+86 => x"00000000",
+87 => x"00000000",
+88 => x"72729f06",
+89 => x"0981050b",
+90 => x"0b0b88a7",
+91 => x"05040000",
+92 => x"00000000",
+93 => x"00000000",
+94 => x"00000000",
+95 => x"00000000",
+96 => x"72722aff",
+97 => x"739f062a",
+98 => x"0974090a",
+99 => x"8106ff05",
+100 => x"06075351",
+101 => x"04000000",
+102 => x"00000000",
+103 => x"00000000",
+104 => x"71715351",
+105 => x"020d0406",
+106 => x"73830609",
+107 => x"81058205",
+108 => x"832b0b2b",
+109 => x"0772fc06",
+110 => x"0c515104",
+111 => x"00000000",
+112 => x"72098105",
+113 => x"72050970",
+114 => x"81050906",
+115 => x"0a810653",
+116 => x"51040000",
+117 => x"00000000",
+118 => x"00000000",
+119 => x"00000000",
+120 => x"72098105",
+121 => x"72050970",
+122 => x"81050906",
+123 => x"0a098106",
+124 => x"53510400",
+125 => x"00000000",
+126 => x"00000000",
+127 => x"00000000",
+128 => x"71098105",
+129 => x"52040000",
+130 => x"00000000",
+131 => x"00000000",
+132 => x"00000000",
+133 => x"00000000",
+134 => x"00000000",
+135 => x"00000000",
+136 => x"72720981",
+137 => x"05055351",
+138 => x"04000000",
+139 => x"00000000",
+140 => x"00000000",
+141 => x"00000000",
+142 => x"00000000",
+143 => x"00000000",
+144 => x"72097206",
+145 => x"73730906",
+146 => x"07535104",
+147 => x"00000000",
+148 => x"00000000",
+149 => x"00000000",
+150 => x"00000000",
+151 => x"00000000",
+152 => x"71fc0608",
+153 => x"72830609",
+154 => x"81058305",
+155 => x"1010102a",
+156 => x"81ff0652",
+157 => x"04000000",
+158 => x"00000000",
+159 => x"00000000",
+160 => x"71fc0608",
+161 => x"0b0b80cf",
+162 => x"c4738306",
+163 => x"10100508",
+164 => x"060b0b0b",
+165 => x"88aa0400",
+166 => x"00000000",
+167 => x"00000000",
+168 => x"80088408",
+169 => x"88087575",
+170 => x"0b0b0b8b",
+171 => x"9f2d5050",
+172 => x"80085688",
+173 => x"0c840c80",
+174 => x"0c510400",
+175 => x"00000000",
+176 => x"80088408",
+177 => x"88087575",
+178 => x"0b0b0b8b",
+179 => x"e32d5050",
+180 => x"80085688",
+181 => x"0c840c80",
+182 => x"0c510400",
+183 => x"00000000",
+184 => x"72097081",
+185 => x"0509060a",
+186 => x"8106ff05",
+187 => x"70547106",
+188 => x"73097274",
+189 => x"05ff0506",
+190 => x"07515151",
+191 => x"04000000",
+192 => x"72097081",
+193 => x"0509060a",
+194 => x"098106ff",
+195 => x"05705471",
+196 => x"06730972",
+197 => x"7405ff05",
+198 => x"06075151",
+199 => x"51040000",
+200 => x"05ff0504",
+201 => x"00000000",
+202 => x"00000000",
+203 => x"00000000",
+204 => x"00000000",
+205 => x"00000000",
+206 => x"00000000",
+207 => x"00000000",
+208 => x"810b0b0b",
+209 => x"80cfd40c",
+210 => x"51040000",
+211 => x"00000000",
+212 => x"00000000",
+213 => x"00000000",
+214 => x"00000000",
+215 => x"00000000",
+216 => x"71810552",
+217 => x"04000000",
+218 => x"00000000",
+219 => x"00000000",
+220 => x"00000000",
+221 => x"00000000",
+222 => x"00000000",
+223 => x"00000000",
+224 => x"00000000",
+225 => x"00000000",
+226 => x"00000000",
+227 => x"00000000",
+228 => x"00000000",
+229 => x"00000000",
+230 => x"00000000",
+231 => x"00000000",
+232 => x"02840572",
+233 => x"10100552",
+234 => x"04000000",
+235 => x"00000000",
+236 => x"00000000",
+237 => x"00000000",
+238 => x"00000000",
+239 => x"00000000",
+240 => x"00000000",
+241 => x"00000000",
+242 => x"00000000",
+243 => x"00000000",
+244 => x"00000000",
+245 => x"00000000",
+246 => x"00000000",
+247 => x"00000000",
+248 => x"717105ff",
+249 => x"05715351",
+250 => x"020d0400",
+251 => x"00000000",
+252 => x"00000000",
+253 => x"00000000",
+254 => x"00000000",
+255 => x"00000000",
+256 => x"82c53f80",
+257 => x"c6d93f04",
+258 => x"10101010",
+259 => x"10101010",
+260 => x"10101010",
+261 => x"10101010",
+262 => x"10101010",
+263 => x"10101010",
+264 => x"10101010",
+265 => x"10101053",
+266 => x"51047381",
+267 => x"ff067383",
+268 => x"06098105",
+269 => x"83051010",
+270 => x"102b0772",
+271 => x"fc060c51",
+272 => x"51043c04",
+273 => x"72728072",
+274 => x"8106ff05",
+275 => x"09720605",
+276 => x"71105272",
+277 => x"0a100a53",
+278 => x"72ed3851",
+279 => x"51535104",
+280 => x"fe3d0d0b",
+281 => x"0b80dfc0",
+282 => x"08538413",
+283 => x"0870882a",
+284 => x"70810651",
+285 => x"52527080",
+286 => x"2ef03871",
+287 => x"81ff0680",
+288 => x"0c843d0d",
+289 => x"04ff3d0d",
+290 => x"0b0b80df",
+291 => x"c0085271",
+292 => x"0870882a",
+293 => x"81327081",
+294 => x"06515151",
+295 => x"70f13873",
+296 => x"720c833d",
+297 => x"0d0480cf",
+298 => x"d408802e",
+299 => x"a43880cf",
+300 => x"d808822e",
+301 => x"bd388380",
+302 => x"800b0b0b",
+303 => x"80dfc00c",
+304 => x"82a0800b",
+305 => x"80dfc40c",
+306 => x"8290800b",
+307 => x"80dfc80c",
+308 => x"04f88080",
+309 => x"80a40b0b",
+310 => x"0b80dfc0",
+311 => x"0cf88080",
+312 => x"82800b80",
+313 => x"dfc40cf8",
+314 => x"80808480",
+315 => x"0b80dfc8",
+316 => x"0c0480c0",
+317 => x"a8808c0b",
+318 => x"0b0b80df",
+319 => x"c00c80c0",
+320 => x"a880940b",
+321 => x"80dfc40c",
+322 => x"0b0b80cf",
+323 => x"8c0b80df",
+324 => x"c80c0470",
+325 => x"7080dfcc",
+326 => x"335170a7",
+327 => x"3880cfe0",
+328 => x"08700852",
+329 => x"5270802e",
+330 => x"94388412",
+331 => x"80cfe00c",
+332 => x"702d80cf",
+333 => x"e0087008",
+334 => x"525270ee",
+335 => x"38810b80",
+336 => x"dfcc3450",
+337 => x"50040470",
+338 => x"0b0b80df",
+339 => x"bc08802e",
+340 => x"8e380b0b",
+341 => x"0b0b800b",
+342 => x"802e0981",
+343 => x"06833850",
+344 => x"040b0b80",
+345 => x"dfbc510b",
+346 => x"0b0bf594",
+347 => x"3f500404",
+348 => x"fe3d0d89",
+349 => x"5380cf90",
+350 => x"5182c13f",
+351 => x"80cfa051",
+352 => x"82ba3f81",
+353 => x"0a0b80df",
+354 => x"d80cff0b",
+355 => x"80dfdc0c",
+356 => x"ff135372",
+357 => x"8025de38",
+358 => x"72800c84",
+359 => x"3d0d04fb",
+360 => x"3d0d7779",
+361 => x"55558056",
+362 => x"757524ab",
+363 => x"38807424",
+364 => x"9d388053",
+365 => x"73527451",
+366 => x"80e13f80",
+367 => x"08547580",
+368 => x"2e853880",
+369 => x"08305473",
+370 => x"800c873d",
+371 => x"0d047330",
+372 => x"76813257",
+373 => x"54dc3974",
+374 => x"30558156",
+375 => x"738025d2",
+376 => x"38ec39fa",
+377 => x"3d0d787a",
+378 => x"57558057",
+379 => x"767524a4",
+380 => x"38759f2c",
+381 => x"54815375",
+382 => x"74327431",
+383 => x"5274519b",
+384 => x"3f800854",
+385 => x"76802e85",
+386 => x"38800830",
+387 => x"5473800c",
+388 => x"883d0d04",
+389 => x"74305581",
+390 => x"57d739fc",
+391 => x"3d0d7678",
+392 => x"53548153",
+393 => x"80747326",
+394 => x"52557280",
+395 => x"2e983870",
+396 => x"802eab38",
+397 => x"807224a6",
+398 => x"38711073",
+399 => x"10757226",
+400 => x"53545272",
+401 => x"ea387351",
+402 => x"78833874",
+403 => x"5170800c",
+404 => x"863d0d04",
+405 => x"720a100a",
+406 => x"720a100a",
+407 => x"53537280",
+408 => x"2ee43871",
+409 => x"7426ed38",
+410 => x"73723175",
+411 => x"7407740a",
+412 => x"100a740a",
+413 => x"100a5555",
+414 => x"5654e339",
+415 => x"f73d0d7c",
+416 => x"70525380",
+417 => x"f93f7254",
+418 => x"80085580",
+419 => x"cfb05681",
+420 => x"57800881",
+421 => x"055a8b3d",
+422 => x"e4115953",
+423 => x"8259f413",
+424 => x"527b8811",
+425 => x"08525381",
+426 => x"b23f8008",
+427 => x"30708008",
+428 => x"079f2c8a",
+429 => x"07800c53",
+430 => x"8b3d0d04",
+431 => x"f63d0d7c",
+432 => x"80cfe408",
+433 => x"71535553",
+434 => x"b53f7255",
+435 => x"80085680",
+436 => x"cfb05781",
+437 => x"58800881",
+438 => x"055b8c3d",
+439 => x"e4115a53",
+440 => x"825af413",
+441 => x"52881408",
+442 => x"5180f03f",
+443 => x"80083070",
+444 => x"8008079f",
+445 => x"2c8a0780",
+446 => x"0c548c3d",
+447 => x"0d047070",
+448 => x"70707570",
+449 => x"71830653",
+450 => x"555270b4",
+451 => x"38717008",
+452 => x"7009f7fb",
+453 => x"fdff1206",
+454 => x"f8848281",
+455 => x"80065452",
+456 => x"53719b38",
+457 => x"84137008",
+458 => x"7009f7fb",
+459 => x"fdff1206",
+460 => x"f8848281",
+461 => x"80065452",
+462 => x"5371802e",
+463 => x"e7387252",
+464 => x"71335372",
+465 => x"802e8a38",
+466 => x"81127033",
+467 => x"545272f8",
+468 => x"38717431",
+469 => x"800c5050",
+470 => x"505004f2",
+471 => x"3d0d6062",
+472 => x"88110870",
+473 => x"58565f5a",
+474 => x"73802e81",
+475 => x"8c388c1a",
+476 => x"2270832a",
+477 => x"81328106",
+478 => x"56587486",
+479 => x"38901a08",
+480 => x"91387951",
+481 => x"90b73fff",
+482 => x"55800880",
+483 => x"ec388c1a",
+484 => x"22587d08",
+485 => x"55807883",
+486 => x"ffff0670",
+487 => x"0a100a81",
+488 => x"06415c57",
+489 => x"7e772e80",
+490 => x"d7387690",
+491 => x"38740884",
+492 => x"16088817",
+493 => x"57585676",
+494 => x"802ef238",
+495 => x"76548880",
+496 => x"77278438",
+497 => x"88805473",
+498 => x"5375529c",
+499 => x"1a0851a4",
+500 => x"1a085877",
+501 => x"2d800b80",
+502 => x"082582e0",
+503 => x"38800816",
+504 => x"77800831",
+505 => x"7f880508",
+506 => x"80083170",
+507 => x"6188050c",
+508 => x"5b585678",
+509 => x"ffb43880",
+510 => x"5574800c",
+511 => x"903d0d04",
+512 => x"7a813281",
+513 => x"06774056",
+514 => x"75802e81",
+515 => x"bd387690",
+516 => x"38740884",
+517 => x"16088817",
+518 => x"57585976",
+519 => x"802ef238",
+520 => x"881a0878",
+521 => x"83ffff06",
+522 => x"70892a81",
+523 => x"06565956",
+524 => x"73802e82",
+525 => x"f8387577",
+526 => x"278b3877",
+527 => x"872a8106",
+528 => x"5c7b82b5",
+529 => x"38767627",
+530 => x"83387656",
+531 => x"75537852",
+532 => x"79085185",
+533 => x"833f881a",
+534 => x"08763188",
+535 => x"1b0c7908",
+536 => x"167a0c76",
+537 => x"56751977",
+538 => x"77317f88",
+539 => x"05087831",
+540 => x"70618805",
+541 => x"0c415859",
+542 => x"7e802efe",
+543 => x"fa388c1a",
+544 => x"2258ff8a",
+545 => x"39787954",
+546 => x"7c537b52",
+547 => x"5684c93f",
+548 => x"881a0879",
+549 => x"31881b0c",
+550 => x"7908197a",
+551 => x"0c7c7631",
+552 => x"5d7c8e38",
+553 => x"79518ff2",
+554 => x"3f800881",
+555 => x"8f388008",
+556 => x"5f751c77",
+557 => x"77317f88",
+558 => x"05087831",
+559 => x"70618805",
+560 => x"0c5d585c",
+561 => x"7a802efe",
+562 => x"ae387681",
+563 => x"83387408",
+564 => x"84160888",
+565 => x"1757585c",
+566 => x"76802ef2",
+567 => x"3876538a",
+568 => x"527b5182",
+569 => x"d33f8008",
+570 => x"7c318105",
+571 => x"5d800884",
+572 => x"3881175d",
+573 => x"815f7c59",
+574 => x"767d2783",
+575 => x"38765994",
+576 => x"1a08881b",
+577 => x"08115758",
+578 => x"807a085c",
+579 => x"54901a08",
+580 => x"7b278338",
+581 => x"81547579",
+582 => x"25843873",
+583 => x"ba387779",
+584 => x"24fee238",
+585 => x"77537b52",
+586 => x"9c1a0851",
+587 => x"a41a0859",
+588 => x"782d8008",
+589 => x"56800880",
+590 => x"24fee238",
+591 => x"8c1a2280",
+592 => x"c0075e7d",
+593 => x"8c1b23ff",
+594 => x"5574800c",
+595 => x"903d0d04",
+596 => x"7effa338",
+597 => x"ff873975",
+598 => x"537b527a",
+599 => x"5182f93f",
+600 => x"7908167a",
+601 => x"0c79518e",
+602 => x"b13f8008",
+603 => x"cf387c76",
+604 => x"315d7cfe",
+605 => x"bc38feac",
+606 => x"39901a08",
+607 => x"7a087131",
+608 => x"78117056",
+609 => x"5a575280",
+610 => x"cfe40851",
+611 => x"84943f80",
+612 => x"08802eff",
+613 => x"a7388008",
+614 => x"901b0c80",
+615 => x"08167a0c",
+616 => x"77941b0c",
+617 => x"76881b0c",
+618 => x"7656fd99",
+619 => x"39790858",
+620 => x"901a0878",
+621 => x"27833881",
+622 => x"54757727",
+623 => x"843873b3",
+624 => x"38941a08",
+625 => x"54737726",
+626 => x"80d33873",
+627 => x"5378529c",
+628 => x"1a0851a4",
+629 => x"1a085877",
+630 => x"2d800856",
+631 => x"80088024",
+632 => x"fd83388c",
+633 => x"1a2280c0",
+634 => x"075e7d8c",
+635 => x"1b23ff55",
+636 => x"fed73975",
+637 => x"53785277",
+638 => x"5181dd3f",
+639 => x"7908167a",
+640 => x"0c79518d",
+641 => x"953f8008",
+642 => x"802efcd9",
+643 => x"388c1a22",
+644 => x"80c0075e",
+645 => x"7d8c1b23",
+646 => x"ff55fead",
+647 => x"39767754",
+648 => x"79537852",
+649 => x"5681b13f",
+650 => x"881a0877",
+651 => x"31881b0c",
+652 => x"7908177a",
+653 => x"0cfcae39",
+654 => x"fa3d0d7a",
+655 => x"79028805",
+656 => x"a7053355",
+657 => x"53548374",
+658 => x"2780df38",
+659 => x"71830651",
+660 => x"7080d738",
+661 => x"71715755",
+662 => x"83517582",
+663 => x"802913ff",
+664 => x"12525670",
+665 => x"8025f338",
+666 => x"837427bc",
+667 => x"38740876",
+668 => x"327009f7",
+669 => x"fbfdff12",
+670 => x"06f88482",
+671 => x"81800651",
+672 => x"5170802e",
+673 => x"98387451",
+674 => x"80527033",
+675 => x"5772772e",
+676 => x"b9388111",
+677 => x"81135351",
+678 => x"837227ee",
+679 => x"38fc1484",
+680 => x"16565473",
+681 => x"8326c638",
+682 => x"7452ff14",
+683 => x"5170ff2e",
+684 => x"97387133",
+685 => x"5472742e",
+686 => x"98388112",
+687 => x"ff125252",
+688 => x"70ff2e09",
+689 => x"8106eb38",
+690 => x"80517080",
+691 => x"0c883d0d",
+692 => x"0471800c",
+693 => x"883d0d04",
+694 => x"fa3d0d78",
+695 => x"7a7c7272",
+696 => x"72595755",
+697 => x"58565774",
+698 => x"7727b238",
+699 => x"75155176",
+700 => x"7127aa38",
+701 => x"707618ff",
+702 => x"18535353",
+703 => x"70ff2e96",
+704 => x"38ff12ff",
+705 => x"14545272",
+706 => x"337234ff",
+707 => x"115170ff",
+708 => x"2e098106",
+709 => x"ec387680",
+710 => x"0c883d0d",
+711 => x"048f7627",
+712 => x"80e63874",
+713 => x"77078306",
+714 => x"517080dc",
+715 => x"38767552",
+716 => x"53707084",
+717 => x"05520873",
+718 => x"70840555",
+719 => x"0c727170",
+720 => x"84055308",
+721 => x"71708405",
+722 => x"530c7170",
+723 => x"84055308",
+724 => x"71708405",
+725 => x"530c7170",
+726 => x"84055308",
+727 => x"71708405",
+728 => x"530cf015",
+729 => x"5553738f",
+730 => x"26c73883",
+731 => x"74279538",
+732 => x"70708405",
+733 => x"52087370",
+734 => x"8405550c",
+735 => x"fc145473",
+736 => x"8326ed38",
+737 => x"72715452",
+738 => x"ff145170",
+739 => x"ff2eff86",
+740 => x"38727081",
+741 => x"05543372",
+742 => x"70810554",
+743 => x"34ff1151",
+744 => x"ea39ef3d",
+745 => x"0d636567",
+746 => x"405d427b",
+747 => x"802e8582",
+748 => x"386151a9",
+749 => x"e73ff81c",
+750 => x"70841208",
+751 => x"70fc0670",
+752 => x"628b0570",
+753 => x"f8064159",
+754 => x"455c5f41",
+755 => x"57967427",
+756 => x"82c53880",
+757 => x"7b247e7c",
+758 => x"26075880",
+759 => x"5477742e",
+760 => x"09810682",
+761 => x"ab38787b",
+762 => x"2581fe38",
+763 => x"781780d7",
+764 => x"a00b8805",
+765 => x"085b5679",
+766 => x"762e84c5",
+767 => x"38841608",
+768 => x"70fe0617",
+769 => x"84110881",
+770 => x"06415555",
+771 => x"7e828d38",
+772 => x"74fc0658",
+773 => x"79762e84",
+774 => x"e3387818",
+775 => x"5f7e7b25",
+776 => x"81ff387c",
+777 => x"81065473",
+778 => x"82c13876",
+779 => x"77083184",
+780 => x"1108fc06",
+781 => x"56577580",
+782 => x"2e913879",
+783 => x"762e84f0",
+784 => x"38741819",
+785 => x"58777b25",
+786 => x"84913876",
+787 => x"802e829b",
+788 => x"38781556",
+789 => x"7a762482",
+790 => x"92388c17",
+791 => x"08881808",
+792 => x"718c120c",
+793 => x"88120c5e",
+794 => x"75598817",
+795 => x"61fc055b",
+796 => x"5679a426",
+797 => x"85ff387b",
+798 => x"76595593",
+799 => x"7a2780c9",
+800 => x"387b7084",
+801 => x"055d087c",
+802 => x"56760c74",
+803 => x"70840556",
+804 => x"088c180c",
+805 => x"9017589b",
+806 => x"7a27ae38",
+807 => x"74708405",
+808 => x"5608780c",
+809 => x"74708405",
+810 => x"56089418",
+811 => x"0c981758",
+812 => x"a37a2795",
+813 => x"38747084",
+814 => x"05560878",
+815 => x"0c747084",
+816 => x"0556089c",
+817 => x"180ca017",
+818 => x"58747084",
+819 => x"05560875",
+820 => x"5f787084",
+821 => x"055a0c77",
+822 => x"7e708405",
+823 => x"40087170",
+824 => x"8405530c",
+825 => x"7e08710c",
+826 => x"5d787b31",
+827 => x"56758f26",
+828 => x"80c93884",
+829 => x"17088106",
+830 => x"79078418",
+831 => x"0c781784",
+832 => x"11088107",
+833 => x"84120c5b",
+834 => x"6151a791",
+835 => x"3f881754",
+836 => x"73800c93",
+837 => x"3d0d0490",
+838 => x"5bfdb839",
+839 => x"7756fe83",
+840 => x"398c1608",
+841 => x"88170871",
+842 => x"8c120c88",
+843 => x"120c587e",
+844 => x"707c3157",
+845 => x"598f7627",
+846 => x"ffb9387a",
+847 => x"17841808",
+848 => x"81067c07",
+849 => x"84190c76",
+850 => x"81078412",
+851 => x"0c761184",
+852 => x"11088107",
+853 => x"84120c5b",
+854 => x"88055261",
+855 => x"518fda3f",
+856 => x"6151a6b9",
+857 => x"3f881754",
+858 => x"ffa6397d",
+859 => x"52615197",
+860 => x"d73f8008",
+861 => x"5a800880",
+862 => x"2e81ab38",
+863 => x"8008f805",
+864 => x"60840508",
+865 => x"fe066105",
+866 => x"58557477",
+867 => x"2e83f238",
+868 => x"fc195877",
+869 => x"a42681b0",
+870 => x"387b8008",
+871 => x"56579378",
+872 => x"2780dc38",
+873 => x"7b707084",
+874 => x"05520880",
+875 => x"08708405",
+876 => x"800c0c80",
+877 => x"08717084",
+878 => x"0553085d",
+879 => x"567b7670",
+880 => x"8405580c",
+881 => x"579b7827",
+882 => x"b6387670",
+883 => x"84055808",
+884 => x"75708405",
+885 => x"570c7670",
+886 => x"84055808",
+887 => x"75708405",
+888 => x"570ca378",
+889 => x"27993876",
+890 => x"70840558",
+891 => x"08757084",
+892 => x"05570c76",
+893 => x"70840558",
+894 => x"08757084",
+895 => x"05570c76",
+896 => x"70840558",
+897 => x"08775e75",
+898 => x"70840557",
+899 => x"0c747d70",
+900 => x"84055f08",
+901 => x"71708405",
+902 => x"530c7d08",
+903 => x"710c5f7b",
+904 => x"5261518e",
+905 => x"943f6151",
+906 => x"a4f33f79",
+907 => x"800c933d",
+908 => x"0d047d52",
+909 => x"61519690",
+910 => x"3f800880",
+911 => x"0c933d0d",
+912 => x"04841608",
+913 => x"55fbc939",
+914 => x"77537b52",
+915 => x"800851a2",
+916 => x"a53f7b52",
+917 => x"61518de1",
+918 => x"3fcc398c",
+919 => x"16088817",
+920 => x"08718c12",
+921 => x"0c88120c",
+922 => x"5d8c1708",
+923 => x"88180871",
+924 => x"8c120c88",
+925 => x"120c5977",
+926 => x"59fbef39",
+927 => x"7818901c",
+928 => x"40557e75",
+929 => x"24fb9c38",
+930 => x"7a177080",
+931 => x"d7a00b88",
+932 => x"050c757c",
+933 => x"31810784",
+934 => x"120c5684",
+935 => x"17088106",
+936 => x"7b078418",
+937 => x"0c6151a3",
+938 => x"f43f8817",
+939 => x"54fce139",
+940 => x"74181990",
+941 => x"1c5e5a7c",
+942 => x"7a24fb8f",
+943 => x"388c1708",
+944 => x"88180871",
+945 => x"8c120c88",
+946 => x"120c5e88",
+947 => x"1761fc05",
+948 => x"575975a4",
+949 => x"2681b638",
+950 => x"7b795955",
+951 => x"93762780",
+952 => x"c9387b70",
+953 => x"84055d08",
+954 => x"7c56790c",
+955 => x"74708405",
+956 => x"56088c18",
+957 => x"0c901758",
+958 => x"9b7627ae",
+959 => x"38747084",
+960 => x"05560878",
+961 => x"0c747084",
+962 => x"05560894",
+963 => x"180c9817",
+964 => x"58a37627",
+965 => x"95387470",
+966 => x"84055608",
+967 => x"780c7470",
+968 => x"84055608",
+969 => x"9c180ca0",
+970 => x"17587470",
+971 => x"84055608",
+972 => x"75417870",
+973 => x"84055a0c",
+974 => x"77607084",
+975 => x"05420871",
+976 => x"70840553",
+977 => x"0c600871",
+978 => x"0c5e7a17",
+979 => x"7080d7a0",
+980 => x"0b88050c",
+981 => x"7a7c3181",
+982 => x"0784120c",
+983 => x"58841708",
+984 => x"81067b07",
+985 => x"84180c61",
+986 => x"51a2b23f",
+987 => x"78547380",
+988 => x"0c933d0d",
+989 => x"0479537b",
+990 => x"5275519f",
+991 => x"f93ffae9",
+992 => x"39841508",
+993 => x"fc061960",
+994 => x"5859fadd",
+995 => x"3975537b",
+996 => x"5278519f",
+997 => x"e13f7a17",
+998 => x"7080d7a0",
+999 => x"0b88050c",
+1000 => x"7a7c3181",
+1001 => x"0784120c",
+1002 => x"58841708",
+1003 => x"81067b07",
+1004 => x"84180c61",
+1005 => x"51a1e63f",
+1006 => x"7854ffb2",
+1007 => x"39fa3d0d",
+1008 => x"7880cfe4",
+1009 => x"085455b8",
+1010 => x"1308802e",
+1011 => x"81af388c",
+1012 => x"15227083",
+1013 => x"ffff0670",
+1014 => x"832a8132",
+1015 => x"81065555",
+1016 => x"5672802e",
+1017 => x"80da3873",
+1018 => x"842a8132",
+1019 => x"810657ff",
+1020 => x"537680f2",
+1021 => x"3873822a",
+1022 => x"81065473",
+1023 => x"802eb938",
+1024 => x"b0150854",
+1025 => x"73802e9c",
+1026 => x"3880c015",
+1027 => x"5373732e",
+1028 => x"8f387352",
+1029 => x"80cfe408",
+1030 => x"518a9e3f",
+1031 => x"8c152256",
+1032 => x"76b0160c",
+1033 => x"75db0657",
+1034 => x"768c1623",
+1035 => x"800b8416",
+1036 => x"0c901508",
+1037 => x"750c7656",
+1038 => x"75880754",
+1039 => x"738c1623",
+1040 => x"90150880",
+1041 => x"2ebf388c",
+1042 => x"15227081",
+1043 => x"06555373",
+1044 => x"9c38720a",
+1045 => x"100a8106",
+1046 => x"56758538",
+1047 => x"94150854",
+1048 => x"7388160c",
+1049 => x"80537280",
+1050 => x"0c883d0d",
+1051 => x"04800b88",
+1052 => x"160c9415",
+1053 => x"08309816",
+1054 => x"0c8053ea",
+1055 => x"39725182",
+1056 => x"a63ffecb",
+1057 => x"3974518f",
+1058 => x"bc3f8c15",
+1059 => x"22708106",
+1060 => x"55537380",
+1061 => x"2effbb38",
+1062 => x"d439f83d",
+1063 => x"0d7a5776",
+1064 => x"802e8197",
+1065 => x"3880cfe4",
+1066 => x"0854b814",
+1067 => x"08802e80",
+1068 => x"eb388c17",
+1069 => x"2270902b",
+1070 => x"70902c70",
+1071 => x"832a8132",
+1072 => x"81065b5b",
+1073 => x"57557780",
+1074 => x"cb389017",
+1075 => x"08567580",
+1076 => x"2e80c138",
+1077 => x"76087631",
+1078 => x"76780c79",
+1079 => x"83065555",
+1080 => x"73853894",
+1081 => x"17085877",
+1082 => x"88180c80",
+1083 => x"7525a538",
+1084 => x"74537552",
+1085 => x"9c170851",
+1086 => x"a4170854",
+1087 => x"732d800b",
+1088 => x"80082580",
+1089 => x"c9388008",
+1090 => x"16758008",
+1091 => x"31565674",
+1092 => x"8024dd38",
+1093 => x"800b800c",
+1094 => x"8a3d0d04",
+1095 => x"73518187",
+1096 => x"3f8c1722",
+1097 => x"70902b70",
+1098 => x"902c7083",
+1099 => x"2a813281",
+1100 => x"065b5b57",
+1101 => x"5577dd38",
+1102 => x"ff9039a1",
+1103 => x"9a5280cf",
+1104 => x"e408518c",
+1105 => x"d03f8008",
+1106 => x"800c8a3d",
+1107 => x"0d048c17",
+1108 => x"2280c007",
+1109 => x"58778c18",
+1110 => x"23ff0b80",
+1111 => x"0c8a3d0d",
+1112 => x"04fa3d0d",
+1113 => x"797080dc",
+1114 => x"298c1154",
+1115 => x"7a535657",
+1116 => x"8fd63f80",
+1117 => x"08800855",
+1118 => x"56800880",
+1119 => x"2ea23880",
+1120 => x"088c0554",
+1121 => x"800b8008",
+1122 => x"0c768008",
+1123 => x"84050c73",
+1124 => x"80088805",
+1125 => x"0c745380",
+1126 => x"5273519c",
+1127 => x"f53f7554",
+1128 => x"73800c88",
+1129 => x"3d0d0470",
+1130 => x"707074a8",
+1131 => x"e60bbc12",
+1132 => x"0c53810b",
+1133 => x"b8140c80",
+1134 => x"0b84dc14",
+1135 => x"0c830b84",
+1136 => x"e0140c84",
+1137 => x"e81384e4",
+1138 => x"140c8413",
+1139 => x"08518070",
+1140 => x"720c7084",
+1141 => x"130c7088",
+1142 => x"130c5284",
+1143 => x"0b8c1223",
+1144 => x"718e1223",
+1145 => x"7190120c",
+1146 => x"7194120c",
+1147 => x"7198120c",
+1148 => x"709c120c",
+1149 => x"80c1d50b",
+1150 => x"a0120c80",
+1151 => x"c2a10ba4",
+1152 => x"120c80c3",
+1153 => x"9d0ba812",
+1154 => x"0c80c3ee",
+1155 => x"0bac120c",
+1156 => x"88130872",
+1157 => x"710c7284",
+1158 => x"120c7288",
+1159 => x"120c5189",
+1160 => x"0b8c1223",
+1161 => x"810b8e12",
+1162 => x"23719012",
+1163 => x"0c719412",
+1164 => x"0c719812",
+1165 => x"0c709c12",
+1166 => x"0c80c1d5",
+1167 => x"0ba0120c",
+1168 => x"80c2a10b",
+1169 => x"a4120c80",
+1170 => x"c39d0ba8",
+1171 => x"120c80c3",
+1172 => x"ee0bac12",
+1173 => x"0c8c1308",
+1174 => x"72710c72",
+1175 => x"84120c72",
+1176 => x"88120c51",
+1177 => x"8a0b8c12",
+1178 => x"23820b8e",
+1179 => x"12237190",
+1180 => x"120c7194",
+1181 => x"120c7198",
+1182 => x"120c709c",
+1183 => x"120c80c1",
+1184 => x"d50ba012",
+1185 => x"0c80c2a1",
+1186 => x"0ba4120c",
+1187 => x"80c39d0b",
+1188 => x"a8120c80",
+1189 => x"c3ee0bac",
+1190 => x"120c5050",
+1191 => x"5004f83d",
+1192 => x"0d7a80cf",
+1193 => x"e408b811",
+1194 => x"08575758",
+1195 => x"7481ec38",
+1196 => x"a8e60bbc",
+1197 => x"170c810b",
+1198 => x"b8170c74",
+1199 => x"84dc170c",
+1200 => x"830b84e0",
+1201 => x"170c84e8",
+1202 => x"1684e417",
+1203 => x"0c841608",
+1204 => x"75710c75",
+1205 => x"84120c75",
+1206 => x"88120c59",
+1207 => x"840b8c1a",
+1208 => x"23748e1a",
+1209 => x"2374901a",
+1210 => x"0c74941a",
+1211 => x"0c74981a",
+1212 => x"0c789c1a",
+1213 => x"0c80c1d5",
+1214 => x"0ba01a0c",
+1215 => x"80c2a10b",
+1216 => x"a41a0c80",
+1217 => x"c39d0ba8",
+1218 => x"1a0c80c3",
+1219 => x"ee0bac1a",
+1220 => x"0c881608",
+1221 => x"75710c75",
+1222 => x"84120c75",
+1223 => x"88120c57",
+1224 => x"890b8c18",
+1225 => x"23810b8e",
+1226 => x"18237490",
+1227 => x"180c7494",
+1228 => x"180c7498",
+1229 => x"180c769c",
+1230 => x"180c80c1",
+1231 => x"d50ba018",
+1232 => x"0c80c2a1",
+1233 => x"0ba4180c",
+1234 => x"80c39d0b",
+1235 => x"a8180c80",
+1236 => x"c3ee0bac",
+1237 => x"180c8c16",
+1238 => x"0875710c",
+1239 => x"7584120c",
+1240 => x"7588120c",
+1241 => x"548a0b8c",
+1242 => x"1523820b",
+1243 => x"8e152374",
+1244 => x"90150c74",
+1245 => x"94150c74",
+1246 => x"98150c73",
+1247 => x"9c150c80",
+1248 => x"c1d50ba0",
+1249 => x"150c80c2",
+1250 => x"a10ba415",
+1251 => x"0c80c39d",
+1252 => x"0ba8150c",
+1253 => x"80c3ee0b",
+1254 => x"ac150c84",
+1255 => x"dc168811",
+1256 => x"08841208",
+1257 => x"ff055757",
+1258 => x"57807524",
+1259 => x"9f388c16",
+1260 => x"2270902b",
+1261 => x"70902c51",
+1262 => x"55597380",
+1263 => x"2e80ed38",
+1264 => x"80dc16ff",
+1265 => x"16565674",
+1266 => x"8025e338",
+1267 => x"76085574",
+1268 => x"802e8f38",
+1269 => x"74881108",
+1270 => x"841208ff",
+1271 => x"05575757",
+1272 => x"c83982fc",
+1273 => x"5277518a",
+1274 => x"df3f8008",
+1275 => x"80085556",
+1276 => x"8008802e",
+1277 => x"a3388008",
+1278 => x"8c057580",
+1279 => x"080c5484",
+1280 => x"0b800884",
+1281 => x"050c7380",
+1282 => x"0888050c",
+1283 => x"82f05374",
+1284 => x"52735197",
+1285 => x"fd3f7554",
+1286 => x"7374780c",
+1287 => x"5573ffb4",
+1288 => x"388c780c",
+1289 => x"800b800c",
+1290 => x"8a3d0d04",
+1291 => x"810b8c17",
+1292 => x"2373760c",
+1293 => x"7388170c",
+1294 => x"7384170c",
+1295 => x"7390170c",
+1296 => x"7394170c",
+1297 => x"7398170c",
+1298 => x"ff0b8e17",
+1299 => x"2373b017",
+1300 => x"0c73b417",
+1301 => x"0c7380c4",
+1302 => x"170c7380",
+1303 => x"c8170c75",
+1304 => x"800c8a3d",
+1305 => x"0d047070",
+1306 => x"a19a5273",
+1307 => x"5186a63f",
+1308 => x"50500470",
+1309 => x"70a19a52",
+1310 => x"80cfe408",
+1311 => x"5186963f",
+1312 => x"505004fb",
+1313 => x"3d0d7770",
+1314 => x"52569890",
+1315 => x"3f80d7a0",
+1316 => x"0b880508",
+1317 => x"841108fc",
+1318 => x"06707b31",
+1319 => x"9fef05e0",
+1320 => x"8006e080",
+1321 => x"05525555",
+1322 => x"a0807524",
+1323 => x"94388052",
+1324 => x"755197ea",
+1325 => x"3f80d7a8",
+1326 => x"08145372",
+1327 => x"80082e8f",
+1328 => x"38755197",
+1329 => x"d83f8053",
+1330 => x"72800c87",
+1331 => x"3d0d0474",
+1332 => x"30527551",
+1333 => x"97c83f80",
+1334 => x"08ff2ea8",
+1335 => x"3880d7a0",
+1336 => x"0b880508",
+1337 => x"74763181",
+1338 => x"0784120c",
+1339 => x"5380d6e4",
+1340 => x"08753180",
+1341 => x"d6e40c75",
+1342 => x"5197a23f",
+1343 => x"810b800c",
+1344 => x"873d0d04",
+1345 => x"80527551",
+1346 => x"97943f80",
+1347 => x"d7a00b88",
+1348 => x"05088008",
+1349 => x"71315454",
+1350 => x"8f7325ff",
+1351 => x"a4388008",
+1352 => x"80d79408",
+1353 => x"3180d6e4",
+1354 => x"0c728107",
+1355 => x"84150c75",
+1356 => x"5196ea3f",
+1357 => x"8053ff90",
+1358 => x"39f73d0d",
+1359 => x"7b7d545a",
+1360 => x"72802e82",
+1361 => x"83387951",
+1362 => x"96d23ff8",
+1363 => x"13841108",
+1364 => x"70fe0670",
+1365 => x"13841108",
+1366 => x"fc065c57",
+1367 => x"58545780",
+1368 => x"d7a80874",
+1369 => x"2e82de38",
+1370 => x"7784150c",
+1371 => x"80738106",
+1372 => x"56597479",
+1373 => x"2e81d538",
+1374 => x"77148411",
+1375 => x"08810656",
+1376 => x"5374a038",
+1377 => x"77165678",
+1378 => x"81e63888",
+1379 => x"14085574",
+1380 => x"80d7a82e",
+1381 => x"82f9388c",
+1382 => x"1408708c",
+1383 => x"170c7588",
+1384 => x"120c5875",
+1385 => x"81078418",
+1386 => x"0c751776",
+1387 => x"710c5478",
+1388 => x"81913883",
+1389 => x"ff762781",
+1390 => x"c8387589",
+1391 => x"2a76832a",
+1392 => x"54547380",
+1393 => x"2ebf3875",
+1394 => x"862ab805",
+1395 => x"53847427",
+1396 => x"b43880db",
+1397 => x"14539474",
+1398 => x"27ab3875",
+1399 => x"8c2a80ee",
+1400 => x"055380d4",
+1401 => x"74279e38",
+1402 => x"758f2a80",
+1403 => x"f7055382",
+1404 => x"d4742791",
+1405 => x"3875922a",
+1406 => x"80fc0553",
+1407 => x"8ad47427",
+1408 => x"843880fe",
+1409 => x"53721010",
+1410 => x"1080d7a0",
+1411 => x"05881108",
+1412 => x"55557375",
+1413 => x"2e82bf38",
+1414 => x"841408fc",
+1415 => x"06597579",
+1416 => x"278d3888",
+1417 => x"14085473",
+1418 => x"752e0981",
+1419 => x"06ea388c",
+1420 => x"1408708c",
+1421 => x"190c7488",
+1422 => x"190c7788",
+1423 => x"120c5576",
+1424 => x"8c150c79",
+1425 => x"5194d63f",
+1426 => x"8b3d0d04",
+1427 => x"76087771",
+1428 => x"31587605",
+1429 => x"88180856",
+1430 => x"567480d7",
+1431 => x"a82e80e0",
+1432 => x"388c1708",
+1433 => x"708c170c",
+1434 => x"7588120c",
+1435 => x"53fe8939",
+1436 => x"8814088c",
+1437 => x"1508708c",
+1438 => x"130c5988",
+1439 => x"190cfea3",
+1440 => x"3975832a",
+1441 => x"70545480",
+1442 => x"74248198",
+1443 => x"3872822c",
+1444 => x"81712b80",
+1445 => x"d7a40807",
+1446 => x"80d7a00b",
+1447 => x"84050c74",
+1448 => x"10101080",
+1449 => x"d7a00588",
+1450 => x"1108718c",
+1451 => x"1b0c7088",
+1452 => x"1b0c7988",
+1453 => x"130c565a",
+1454 => x"55768c15",
+1455 => x"0cff8439",
+1456 => x"8159fdb4",
+1457 => x"39771673",
+1458 => x"81065455",
+1459 => x"72983876",
+1460 => x"08777131",
+1461 => x"5875058c",
+1462 => x"18088819",
+1463 => x"08718c12",
+1464 => x"0c88120c",
+1465 => x"55557481",
+1466 => x"0784180c",
+1467 => x"7680d7a0",
+1468 => x"0b88050c",
+1469 => x"80d79c08",
+1470 => x"7526fec7",
+1471 => x"3880d798",
+1472 => x"08527951",
+1473 => x"fafd3f79",
+1474 => x"5193923f",
+1475 => x"feba3981",
+1476 => x"778c170c",
+1477 => x"7788170c",
+1478 => x"758c190c",
+1479 => x"7588190c",
+1480 => x"59fd8039",
+1481 => x"83147082",
+1482 => x"2c81712b",
+1483 => x"80d7a408",
+1484 => x"0780d7a0",
+1485 => x"0b84050c",
+1486 => x"75101010",
+1487 => x"80d7a005",
+1488 => x"88110871",
+1489 => x"8c1c0c70",
+1490 => x"881c0c7a",
+1491 => x"88130c57",
+1492 => x"5b5653fe",
+1493 => x"e4398073",
+1494 => x"24a33872",
+1495 => x"822c8171",
+1496 => x"2b80d7a4",
+1497 => x"080780d7",
+1498 => x"a00b8405",
+1499 => x"0c58748c",
+1500 => x"180c7388",
+1501 => x"180c7688",
+1502 => x"160cfdc3",
+1503 => x"39831370",
+1504 => x"822c8171",
+1505 => x"2b80d7a4",
+1506 => x"080780d7",
+1507 => x"a00b8405",
+1508 => x"0c5953da",
+1509 => x"39f93d0d",
+1510 => x"797b5853",
+1511 => x"800b80cf",
+1512 => x"e4085356",
+1513 => x"72722ebc",
+1514 => x"3884dc13",
+1515 => x"5574762e",
+1516 => x"b3388815",
+1517 => x"08841608",
+1518 => x"ff055454",
+1519 => x"80732499",
+1520 => x"388c1422",
+1521 => x"70902b53",
+1522 => x"587180d4",
+1523 => x"3880dc14",
+1524 => x"ff145454",
+1525 => x"728025e9",
+1526 => x"38740855",
+1527 => x"74d43880",
+1528 => x"cfe40852",
+1529 => x"84dc1255",
+1530 => x"74802ead",
+1531 => x"38881508",
+1532 => x"841608ff",
+1533 => x"05545480",
+1534 => x"73249838",
+1535 => x"8c142270",
+1536 => x"902b5358",
+1537 => x"71ad3880",
+1538 => x"dc14ff14",
+1539 => x"54547280",
+1540 => x"25ea3874",
+1541 => x"085574d5",
+1542 => x"3875800c",
+1543 => x"893d0d04",
+1544 => x"7351762d",
+1545 => x"75800807",
+1546 => x"80dc15ff",
+1547 => x"15555556",
+1548 => x"ffa23973",
+1549 => x"51762d75",
+1550 => x"80080780",
+1551 => x"dc15ff15",
+1552 => x"555556ca",
+1553 => x"39ea3d0d",
+1554 => x"688c1122",
+1555 => x"700a100a",
+1556 => x"81065758",
+1557 => x"567480e4",
+1558 => x"388e1622",
+1559 => x"70902b70",
+1560 => x"902c5155",
+1561 => x"58807424",
+1562 => x"b138983d",
+1563 => x"c4055373",
+1564 => x"5280cfe4",
+1565 => x"08519481",
+1566 => x"3f800b80",
+1567 => x"08249738",
+1568 => x"7983e080",
+1569 => x"06547380",
+1570 => x"c0802e81",
+1571 => x"8f387382",
+1572 => x"80802e81",
+1573 => x"91388c16",
+1574 => x"22577690",
+1575 => x"80075473",
+1576 => x"8c172388",
+1577 => x"805280cf",
+1578 => x"e4085181",
+1579 => x"9b3f8008",
+1580 => x"9d388c16",
+1581 => x"22820755",
+1582 => x"748c1723",
+1583 => x"80c31670",
+1584 => x"770c9017",
+1585 => x"0c810b94",
+1586 => x"170c983d",
+1587 => x"0d0480cf",
+1588 => x"e408a8e6",
+1589 => x"0bbc120c",
+1590 => x"588c1622",
+1591 => x"81800754",
+1592 => x"738c1723",
+1593 => x"8008760c",
+1594 => x"80089017",
+1595 => x"0c88800b",
+1596 => x"94170c74",
+1597 => x"802ed338",
+1598 => x"8e162270",
+1599 => x"902b7090",
+1600 => x"2c535654",
+1601 => x"9afe3f80",
+1602 => x"08802eff",
+1603 => x"bd388c16",
+1604 => x"22810757",
+1605 => x"768c1723",
+1606 => x"983d0d04",
+1607 => x"810b8c17",
+1608 => x"225855fe",
+1609 => x"f539a816",
+1610 => x"0880c39d",
+1611 => x"2e098106",
+1612 => x"fee4388c",
+1613 => x"16228880",
+1614 => x"0754738c",
+1615 => x"17238880",
+1616 => x"0b80cc17",
+1617 => x"0cfedc39",
+1618 => x"f43d0d7e",
+1619 => x"608b1170",
+1620 => x"f8065b55",
+1621 => x"555d7296",
+1622 => x"26833890",
+1623 => x"58807824",
+1624 => x"74792607",
+1625 => x"55805474",
+1626 => x"742e0981",
+1627 => x"0680ca38",
+1628 => x"7c518ea8",
+1629 => x"3f7783f7",
+1630 => x"2680c538",
+1631 => x"77832a70",
+1632 => x"10101080",
+1633 => x"d7a0058c",
+1634 => x"11085858",
+1635 => x"5475772e",
+1636 => x"81f03884",
+1637 => x"1608fc06",
+1638 => x"8c170888",
+1639 => x"1808718c",
+1640 => x"120c8812",
+1641 => x"0c5b7605",
+1642 => x"84110881",
+1643 => x"0784120c",
+1644 => x"537c518d",
+1645 => x"e83f8816",
+1646 => x"5473800c",
+1647 => x"8e3d0d04",
+1648 => x"77892a78",
+1649 => x"832a5854",
+1650 => x"73802ebf",
+1651 => x"3877862a",
+1652 => x"b8055784",
+1653 => x"7427b438",
+1654 => x"80db1457",
+1655 => x"947427ab",
+1656 => x"38778c2a",
+1657 => x"80ee0557",
+1658 => x"80d47427",
+1659 => x"9e38778f",
+1660 => x"2a80f705",
+1661 => x"5782d474",
+1662 => x"27913877",
+1663 => x"922a80fc",
+1664 => x"05578ad4",
+1665 => x"74278438",
+1666 => x"80fe5776",
+1667 => x"10101080",
+1668 => x"d7a0058c",
+1669 => x"11085653",
+1670 => x"74732ea3",
+1671 => x"38841508",
+1672 => x"fc067079",
+1673 => x"31555673",
+1674 => x"8f2488e4",
+1675 => x"38738025",
+1676 => x"88e6388c",
+1677 => x"15085574",
+1678 => x"732e0981",
+1679 => x"06df3881",
+1680 => x"175980d7",
+1681 => x"b0085675",
+1682 => x"80d7a82e",
+1683 => x"82cc3884",
+1684 => x"1608fc06",
+1685 => x"70793155",
+1686 => x"55738f24",
+1687 => x"bb3880d7",
+1688 => x"a80b80d7",
+1689 => x"b40c80d7",
+1690 => x"a80b80d7",
+1691 => x"b00c8074",
+1692 => x"2480db38",
+1693 => x"74168411",
+1694 => x"08810784",
+1695 => x"120c53fe",
+1696 => x"b0398816",
+1697 => x"8c110857",
+1698 => x"5975792e",
+1699 => x"098106fe",
+1700 => x"82388214",
+1701 => x"59ffab39",
+1702 => x"77167881",
+1703 => x"0784180c",
+1704 => x"7080d7b4",
+1705 => x"0c7080d7",
+1706 => x"b00c80d7",
+1707 => x"a80b8c12",
+1708 => x"0c8c1108",
+1709 => x"88120c74",
+1710 => x"81078412",
+1711 => x"0c740574",
+1712 => x"710c5b7c",
+1713 => x"518bd63f",
+1714 => x"881654fd",
+1715 => x"ec3983ff",
+1716 => x"75278391",
+1717 => x"3874892a",
+1718 => x"75832a54",
+1719 => x"5473802e",
+1720 => x"bf387486",
+1721 => x"2ab80553",
+1722 => x"847427b4",
+1723 => x"3880db14",
+1724 => x"53947427",
+1725 => x"ab38748c",
+1726 => x"2a80ee05",
+1727 => x"5380d474",
+1728 => x"279e3874",
+1729 => x"8f2a80f7",
+1730 => x"055382d4",
+1731 => x"74279138",
+1732 => x"74922a80",
+1733 => x"fc05538a",
+1734 => x"d4742784",
+1735 => x"3880fe53",
+1736 => x"72101010",
+1737 => x"80d7a005",
+1738 => x"88110855",
+1739 => x"5773772e",
+1740 => x"868b3884",
+1741 => x"1408fc06",
+1742 => x"5b747b27",
+1743 => x"8d388814",
+1744 => x"08547377",
+1745 => x"2e098106",
+1746 => x"ea388c14",
+1747 => x"0880d7a0",
+1748 => x"0b840508",
+1749 => x"718c190c",
+1750 => x"7588190c",
+1751 => x"7788130c",
+1752 => x"5c57758c",
+1753 => x"150c7853",
+1754 => x"80792483",
+1755 => x"98387282",
+1756 => x"2c81712b",
+1757 => x"5656747b",
+1758 => x"2680ca38",
+1759 => x"7a750657",
+1760 => x"7682a338",
+1761 => x"78fc0684",
+1762 => x"05597410",
+1763 => x"707c0655",
+1764 => x"55738292",
+1765 => x"38841959",
+1766 => x"f13980d7",
+1767 => x"a00b8405",
+1768 => x"0879545b",
+1769 => x"788025c6",
+1770 => x"3882da39",
+1771 => x"74097b06",
+1772 => x"7080d7a0",
+1773 => x"0b84050c",
+1774 => x"5b741055",
+1775 => x"747b2685",
+1776 => x"387485bc",
+1777 => x"3880d7a0",
+1778 => x"0b880508",
+1779 => x"70841208",
+1780 => x"fc06707b",
+1781 => x"317b7226",
+1782 => x"8f722507",
+1783 => x"5d575c5c",
+1784 => x"5578802e",
+1785 => x"80d93879",
+1786 => x"1580d798",
+1787 => x"08199011",
+1788 => x"59545680",
+1789 => x"d79408ff",
+1790 => x"2e8838a0",
+1791 => x"8f13e080",
+1792 => x"06577652",
+1793 => x"7c518996",
+1794 => x"3f800854",
+1795 => x"8008ff2e",
+1796 => x"90388008",
+1797 => x"762782a7",
+1798 => x"387480d7",
+1799 => x"a02e829f",
+1800 => x"3880d7a0",
+1801 => x"0b880508",
+1802 => x"55841508",
+1803 => x"fc067079",
+1804 => x"31797226",
+1805 => x"8f722507",
+1806 => x"5d555a7a",
+1807 => x"83f23877",
+1808 => x"81078416",
+1809 => x"0c771570",
+1810 => x"80d7a00b",
+1811 => x"88050c74",
+1812 => x"81078412",
+1813 => x"0c567c51",
+1814 => x"88c33f88",
+1815 => x"15547380",
+1816 => x"0c8e3d0d",
+1817 => x"0474832a",
+1818 => x"70545480",
+1819 => x"7424819b",
+1820 => x"3872822c",
+1821 => x"81712b80",
+1822 => x"d7a40807",
+1823 => x"7080d7a0",
+1824 => x"0b84050c",
+1825 => x"75101010",
+1826 => x"80d7a005",
+1827 => x"88110871",
+1828 => x"8c1b0c70",
+1829 => x"881b0c79",
+1830 => x"88130c57",
+1831 => x"555c5575",
+1832 => x"8c150cfd",
+1833 => x"c1397879",
+1834 => x"10101080",
+1835 => x"d7a00570",
+1836 => x"565b5c8c",
+1837 => x"14085675",
+1838 => x"742ea338",
+1839 => x"841608fc",
+1840 => x"06707931",
+1841 => x"5853768f",
+1842 => x"2483f138",
+1843 => x"76802584",
+1844 => x"af388c16",
+1845 => x"08567574",
+1846 => x"2e098106",
+1847 => x"df388814",
+1848 => x"811a7083",
+1849 => x"06555a54",
+1850 => x"72c9387b",
+1851 => x"83065675",
+1852 => x"802efdb8",
+1853 => x"38ff1cf8",
+1854 => x"1b5b5c88",
+1855 => x"1a087a2e",
+1856 => x"ea38fdb5",
+1857 => x"39831953",
+1858 => x"fce43983",
+1859 => x"1470822c",
+1860 => x"81712b80",
+1861 => x"d7a40807",
+1862 => x"7080d7a0",
+1863 => x"0b84050c",
+1864 => x"76101010",
+1865 => x"80d7a005",
+1866 => x"88110871",
+1867 => x"8c1c0c70",
+1868 => x"881c0c7a",
+1869 => x"88130c58",
+1870 => x"535d5653",
+1871 => x"fee13980",
+1872 => x"d6e40817",
+1873 => x"59800876",
+1874 => x"2e818b38",
+1875 => x"80d79408",
+1876 => x"ff2e848e",
+1877 => x"38737631",
+1878 => x"1980d6e4",
+1879 => x"0c738706",
+1880 => x"70565372",
+1881 => x"802e8838",
+1882 => x"88733170",
+1883 => x"15555576",
+1884 => x"149fff06",
+1885 => x"a0807131",
+1886 => x"1670547e",
+1887 => x"53515386",
+1888 => x"9d3f8008",
+1889 => x"568008ff",
+1890 => x"2e819e38",
+1891 => x"80d6e408",
+1892 => x"137080d6",
+1893 => x"e40c7475",
+1894 => x"80d7a00b",
+1895 => x"88050c77",
+1896 => x"76311581",
+1897 => x"07555659",
+1898 => x"7a80d7a0",
+1899 => x"2e83c038",
+1900 => x"798f2682",
+1901 => x"ef38810b",
+1902 => x"84150c84",
+1903 => x"1508fc06",
+1904 => x"70793179",
+1905 => x"72268f72",
+1906 => x"25075d55",
+1907 => x"5a7a802e",
+1908 => x"fced3880",
+1909 => x"db398008",
+1910 => x"9fff0655",
+1911 => x"74feed38",
+1912 => x"7880d6e4",
+1913 => x"0c80d7a0",
+1914 => x"0b880508",
+1915 => x"7a188107",
+1916 => x"84120c55",
+1917 => x"80d79008",
+1918 => x"79278638",
+1919 => x"7880d790",
+1920 => x"0c80d78c",
+1921 => x"087927fc",
+1922 => x"a0387880",
+1923 => x"d78c0c84",
+1924 => x"1508fc06",
+1925 => x"70793179",
+1926 => x"72268f72",
+1927 => x"25075d55",
+1928 => x"5a7a802e",
+1929 => x"fc993888",
+1930 => x"39807457",
+1931 => x"53fedd39",
+1932 => x"7c5184e9",
+1933 => x"3f800b80",
+1934 => x"0c8e3d0d",
+1935 => x"04807324",
+1936 => x"a5387282",
+1937 => x"2c81712b",
+1938 => x"80d7a408",
+1939 => x"077080d7",
+1940 => x"a00b8405",
+1941 => x"0c5c5a76",
+1942 => x"8c170c73",
+1943 => x"88170c75",
+1944 => x"88180cf9",
+1945 => x"fd398313",
+1946 => x"70822c81",
+1947 => x"712b80d7",
+1948 => x"a4080770",
+1949 => x"80d7a00b",
+1950 => x"84050c5d",
+1951 => x"5b53d839",
+1952 => x"7a75065c",
+1953 => x"7bfc9f38",
+1954 => x"84197510",
+1955 => x"5659f139",
+1956 => x"ff178105",
+1957 => x"59f7ab39",
+1958 => x"8c150888",
+1959 => x"1608718c",
+1960 => x"120c8812",
+1961 => x"0c597515",
+1962 => x"84110881",
+1963 => x"0784120c",
+1964 => x"587c5183",
+1965 => x"e83f8815",
+1966 => x"54fba339",
+1967 => x"77167881",
+1968 => x"0784180c",
+1969 => x"8c170888",
+1970 => x"1808718c",
+1971 => x"120c8812",
+1972 => x"0c5c7080",
+1973 => x"d7b40c70",
+1974 => x"80d7b00c",
+1975 => x"80d7a80b",
+1976 => x"8c120c8c",
+1977 => x"11088812",
+1978 => x"0c778107",
+1979 => x"84120c77",
+1980 => x"0577710c",
+1981 => x"557c5183",
+1982 => x"a43f8816",
+1983 => x"54f5ba39",
+1984 => x"72168411",
+1985 => x"08810784",
+1986 => x"120c588c",
+1987 => x"16088817",
+1988 => x"08718c12",
+1989 => x"0c88120c",
+1990 => x"577c5183",
+1991 => x"803f8816",
+1992 => x"54f59639",
+1993 => x"7284150c",
+1994 => x"f41af806",
+1995 => x"70841d08",
+1996 => x"81060784",
+1997 => x"1d0c701c",
+1998 => x"5556850b",
+1999 => x"84150c85",
+2000 => x"0b88150c",
+2001 => x"8f7627fd",
+2002 => x"ab38881b",
+2003 => x"527c51eb",
+2004 => x"e83f80d7",
+2005 => x"a00b8805",
+2006 => x"0880d6e4",
+2007 => x"085a55fd",
+2008 => x"93397880",
+2009 => x"d6e40c73",
+2010 => x"80d7940c",
+2011 => x"fbef3972",
+2012 => x"84150cfc",
+2013 => x"ff39fb3d",
+2014 => x"0d77707a",
+2015 => x"7c585553",
+2016 => x"568f7527",
+2017 => x"80e63872",
+2018 => x"76078306",
+2019 => x"517080dc",
+2020 => x"38757352",
+2021 => x"54707084",
+2022 => x"05520874",
+2023 => x"70840556",
+2024 => x"0c737170",
+2025 => x"84055308",
+2026 => x"71708405",
+2027 => x"530c7170",
+2028 => x"84055308",
+2029 => x"71708405",
+2030 => x"530c7170",
+2031 => x"84055308",
+2032 => x"71708405",
+2033 => x"530cf016",
+2034 => x"5654748f",
+2035 => x"26c73883",
+2036 => x"75279538",
+2037 => x"70708405",
+2038 => x"52087470",
+2039 => x"8405560c",
+2040 => x"fc155574",
+2041 => x"8326ed38",
+2042 => x"73715452",
+2043 => x"ff155170",
+2044 => x"ff2e9838",
+2045 => x"72708105",
+2046 => x"54337270",
+2047 => x"81055434",
+2048 => x"ff115170",
+2049 => x"ff2e0981",
+2050 => x"06ea3875",
+2051 => x"800c873d",
+2052 => x"0d04fb3d",
+2053 => x"0d777a71",
+2054 => x"028c05a3",
+2055 => x"05335854",
+2056 => x"54568373",
+2057 => x"2780d438",
+2058 => x"75830651",
+2059 => x"7080cc38",
+2060 => x"74882b75",
+2061 => x"07707190",
+2062 => x"2b075551",
+2063 => x"8f7327a7",
+2064 => x"38737270",
+2065 => x"8405540c",
+2066 => x"71747170",
+2067 => x"8405530c",
+2068 => x"74717084",
+2069 => x"05530c74",
+2070 => x"71708405",
+2071 => x"530cf014",
+2072 => x"5452728f",
+2073 => x"26db3883",
+2074 => x"73279038",
+2075 => x"73727084",
+2076 => x"05540cfc",
+2077 => x"13537283",
+2078 => x"26f238ff",
+2079 => x"135170ff",
+2080 => x"2e933874",
+2081 => x"72708105",
+2082 => x"5434ff11",
+2083 => x"5170ff2e",
+2084 => x"098106ef",
+2085 => x"3875800c",
+2086 => x"873d0d04",
+2087 => x"04047070",
+2088 => x"7070800b",
+2089 => x"80dfe00c",
+2090 => x"765184f3",
+2091 => x"3f800853",
+2092 => x"8008ff2e",
+2093 => x"89387280",
+2094 => x"0c505050",
+2095 => x"500480df",
+2096 => x"e0085473",
+2097 => x"802eef38",
+2098 => x"7574710c",
+2099 => x"5272800c",
+2100 => x"50505050",
+2101 => x"04f93d0d",
+2102 => x"797c557b",
+2103 => x"548e1122",
+2104 => x"70902b70",
+2105 => x"902c5557",
+2106 => x"80cfe408",
+2107 => x"53585683",
+2108 => x"f63f8008",
+2109 => x"57800b80",
+2110 => x"08249338",
+2111 => x"80d01608",
+2112 => x"80080580",
+2113 => x"d0170c76",
+2114 => x"800c893d",
+2115 => x"0d048c16",
+2116 => x"2283dfff",
+2117 => x"0655748c",
+2118 => x"17237680",
+2119 => x"0c893d0d",
+2120 => x"04fa3d0d",
+2121 => x"788c1122",
+2122 => x"70882a70",
+2123 => x"81065157",
+2124 => x"585674a9",
+2125 => x"388c1622",
+2126 => x"83dfff06",
+2127 => x"55748c17",
+2128 => x"237a5479",
+2129 => x"538e1622",
+2130 => x"70902b70",
+2131 => x"902c5456",
+2132 => x"80cfe408",
+2133 => x"525681b2",
+2134 => x"3f883d0d",
+2135 => x"04825480",
+2136 => x"538e1622",
+2137 => x"70902b70",
+2138 => x"902c5456",
+2139 => x"80cfe408",
+2140 => x"525782bb",
+2141 => x"3f8c1622",
+2142 => x"83dfff06",
+2143 => x"55748c17",
+2144 => x"237a5479",
+2145 => x"538e1622",
+2146 => x"70902b70",
+2147 => x"902c5456",
+2148 => x"80cfe408",
+2149 => x"525680f2",
+2150 => x"3f883d0d",
+2151 => x"04f93d0d",
+2152 => x"797c557b",
+2153 => x"548e1122",
+2154 => x"70902b70",
+2155 => x"902c5557",
+2156 => x"80cfe408",
+2157 => x"53585681",
+2158 => x"f63f8008",
+2159 => x"578008ff",
+2160 => x"2e99388c",
+2161 => x"1622a080",
+2162 => x"0755748c",
+2163 => x"17238008",
+2164 => x"80d0170c",
+2165 => x"76800c89",
+2166 => x"3d0d048c",
+2167 => x"162283df",
+2168 => x"ff065574",
+2169 => x"8c172376",
+2170 => x"800c893d",
+2171 => x"0d047070",
+2172 => x"70748e11",
+2173 => x"2270902b",
+2174 => x"70902c55",
+2175 => x"51515380",
+2176 => x"cfe40851",
+2177 => x"bd3f5050",
+2178 => x"5004fb3d",
+2179 => x"0d800b80",
+2180 => x"dfe00c7a",
+2181 => x"53795278",
+2182 => x"5182ff3f",
+2183 => x"80085580",
+2184 => x"08ff2e88",
+2185 => x"3874800c",
+2186 => x"873d0d04",
+2187 => x"80dfe008",
+2188 => x"5675802e",
+2189 => x"f0387776",
+2190 => x"710c5474",
+2191 => x"800c873d",
+2192 => x"0d047070",
+2193 => x"7070800b",
+2194 => x"80dfe00c",
+2195 => x"765184cc",
+2196 => x"3f800853",
+2197 => x"8008ff2e",
+2198 => x"89387280",
+2199 => x"0c505050",
+2200 => x"500480df",
+2201 => x"e0085473",
+2202 => x"802eef38",
+2203 => x"7574710c",
+2204 => x"5272800c",
+2205 => x"50505050",
+2206 => x"04fc3d0d",
+2207 => x"800b80df",
+2208 => x"e00c7852",
+2209 => x"775187b3",
+2210 => x"3f800854",
+2211 => x"8008ff2e",
+2212 => x"88387380",
+2213 => x"0c863d0d",
+2214 => x"0480dfe0",
+2215 => x"08557480",
+2216 => x"2ef03876",
+2217 => x"75710c53",
+2218 => x"73800c86",
+2219 => x"3d0d04fb",
+2220 => x"3d0d800b",
+2221 => x"80dfe00c",
+2222 => x"7a537952",
+2223 => x"7851848e",
+2224 => x"3f800855",
+2225 => x"8008ff2e",
+2226 => x"88387480",
+2227 => x"0c873d0d",
+2228 => x"0480dfe0",
+2229 => x"08567580",
+2230 => x"2ef03877",
+2231 => x"76710c54",
+2232 => x"74800c87",
+2233 => x"3d0d04fb",
+2234 => x"3d0d800b",
+2235 => x"80dfe00c",
+2236 => x"7a537952",
+2237 => x"78518296",
+2238 => x"3f800855",
+2239 => x"8008ff2e",
+2240 => x"88387480",
+2241 => x"0c873d0d",
+2242 => x"0480dfe0",
+2243 => x"08567580",
+2244 => x"2ef03877",
+2245 => x"76710c54",
+2246 => x"74800c87",
+2247 => x"3d0d0470",
+2248 => x"707080df",
+2249 => x"d0088938",
+2250 => x"80dfe40b",
+2251 => x"80dfd00c",
+2252 => x"80dfd008",
+2253 => x"75115252",
+2254 => x"ff537087",
+2255 => x"fb808026",
+2256 => x"88387080",
+2257 => x"dfd00c71",
+2258 => x"5372800c",
+2259 => x"50505004",
+2260 => x"fd3d0d80",
+2261 => x"0b80cfd8",
+2262 => x"08545472",
+2263 => x"812e9b38",
+2264 => x"7380dfd4",
+2265 => x"0cc2bf3f",
+2266 => x"c1963f80",
+2267 => x"dfa85281",
+2268 => x"51c3fd3f",
+2269 => x"80085186",
+2270 => x"c23f7280",
+2271 => x"dfd40cc2",
+2272 => x"a53fc0fc",
+2273 => x"3f80dfa8",
+2274 => x"528151c3",
+2275 => x"e33f8008",
+2276 => x"5186a83f",
+2277 => x"00ff3900",
+2278 => x"ff39f53d",
+2279 => x"0d7e6080",
+2280 => x"dfd40870",
+2281 => x"5b585b5b",
+2282 => x"7580c238",
+2283 => x"777a25a1",
+2284 => x"38771b70",
+2285 => x"337081ff",
+2286 => x"06585859",
+2287 => x"758a2e98",
+2288 => x"387681ff",
+2289 => x"0651c1bd",
+2290 => x"3f811858",
+2291 => x"797824e1",
+2292 => x"3879800c",
+2293 => x"8d3d0d04",
+2294 => x"8d51c1a9",
+2295 => x"3f783370",
+2296 => x"81ff0652",
+2297 => x"57c19e3f",
+2298 => x"811858e0",
+2299 => x"3979557a",
+2300 => x"547d5385",
+2301 => x"528d3dfc",
+2302 => x"0551c0c6",
+2303 => x"3f800856",
+2304 => x"85b23f7b",
+2305 => x"80080c75",
+2306 => x"800c8d3d",
+2307 => x"0d04f63d",
+2308 => x"0d7d7f80",
+2309 => x"dfd40870",
+2310 => x"5b585a5a",
+2311 => x"7580c138",
+2312 => x"777925b3",
+2313 => x"38c0b93f",
+2314 => x"800881ff",
+2315 => x"06708d32",
+2316 => x"7030709f",
+2317 => x"2a515157",
+2318 => x"57768a2e",
+2319 => x"80c43875",
+2320 => x"802ebf38",
+2321 => x"771a5676",
+2322 => x"76347651",
+2323 => x"c0b73f81",
+2324 => x"18587878",
+2325 => x"24cf3877",
+2326 => x"5675800c",
+2327 => x"8c3d0d04",
+2328 => x"78557954",
+2329 => x"7c538452",
+2330 => x"8c3dfc05",
+2331 => x"51ffbfd2",
+2332 => x"3f800856",
+2333 => x"84be3f7a",
+2334 => x"80080c75",
+2335 => x"800c8c3d",
+2336 => x"0d04771a",
+2337 => x"598a7934",
+2338 => x"8118588d",
+2339 => x"51ffbff5",
+2340 => x"3f8a51ff",
+2341 => x"bfef3f77",
+2342 => x"56ffbe39",
+2343 => x"fb3d0d80",
+2344 => x"dfd40870",
+2345 => x"56547388",
+2346 => x"3874800c",
+2347 => x"873d0d04",
+2348 => x"77538352",
+2349 => x"873dfc05",
+2350 => x"51ffbf86",
+2351 => x"3f800854",
+2352 => x"83f23f75",
+2353 => x"80080c73",
+2354 => x"800c873d",
+2355 => x"0d04fa3d",
+2356 => x"0d80dfd4",
+2357 => x"08802ea3",
+2358 => x"387a5579",
+2359 => x"54785386",
+2360 => x"52883dfc",
+2361 => x"0551ffbe",
+2362 => x"d93f8008",
+2363 => x"5683c53f",
+2364 => x"7680080c",
+2365 => x"75800c88",
+2366 => x"3d0d0483",
+2367 => x"b73f9d0b",
+2368 => x"80080cff",
+2369 => x"0b800c88",
+2370 => x"3d0d04f7",
+2371 => x"3d0d7b7d",
+2372 => x"5b59bc53",
+2373 => x"80527951",
+2374 => x"f5f83f80",
+2375 => x"70565798",
+2376 => x"56741970",
+2377 => x"3370782b",
+2378 => x"79078118",
+2379 => x"f81a5a58",
+2380 => x"59555884",
+2381 => x"7524ea38",
+2382 => x"767a2384",
+2383 => x"19588070",
+2384 => x"56579856",
+2385 => x"74187033",
+2386 => x"70782b79",
+2387 => x"078118f8",
+2388 => x"1a5a5859",
+2389 => x"51548475",
+2390 => x"24ea3876",
+2391 => x"821b2388",
+2392 => x"19588070",
+2393 => x"56579856",
+2394 => x"74187033",
+2395 => x"70782b79",
+2396 => x"078118f8",
+2397 => x"1a5a5859",
+2398 => x"51548475",
+2399 => x"24ea3876",
+2400 => x"841b0c8c",
+2401 => x"19588070",
+2402 => x"56579856",
+2403 => x"74187033",
+2404 => x"70782b79",
+2405 => x"078118f8",
+2406 => x"1a5a5859",
+2407 => x"51548475",
+2408 => x"24ea3876",
+2409 => x"881b2390",
+2410 => x"19588070",
+2411 => x"56579856",
+2412 => x"74187033",
+2413 => x"70782b79",
+2414 => x"078118f8",
+2415 => x"1a5a5859",
+2416 => x"51548475",
+2417 => x"24ea3876",
+2418 => x"8a1b2394",
+2419 => x"19588070",
+2420 => x"56579856",
+2421 => x"74187033",
+2422 => x"70782b79",
+2423 => x"078118f8",
+2424 => x"1a5a5859",
+2425 => x"51548475",
+2426 => x"24ea3876",
+2427 => x"8c1b2398",
+2428 => x"19588070",
+2429 => x"56579856",
+2430 => x"74187033",
+2431 => x"70782b79",
+2432 => x"078118f8",
+2433 => x"1a5a5859",
+2434 => x"51548475",
+2435 => x"24ea3876",
+2436 => x"8e1b239c",
+2437 => x"19588070",
+2438 => x"5657b856",
+2439 => x"74187033",
+2440 => x"70782b79",
+2441 => x"078118f8",
+2442 => x"1a5a5859",
+2443 => x"5a548875",
+2444 => x"24ea3876",
+2445 => x"901b0c8b",
+2446 => x"3d0d04e9",
+2447 => x"3d0d6a80",
+2448 => x"dfd40857",
+2449 => x"57759338",
+2450 => x"80c0800b",
+2451 => x"84180c75",
+2452 => x"ac180c75",
+2453 => x"800c993d",
+2454 => x"0d04893d",
+2455 => x"70556a54",
+2456 => x"558a5299",
+2457 => x"3dffbc05",
+2458 => x"51ffbbd6",
+2459 => x"3f800877",
+2460 => x"53755256",
+2461 => x"fd953fbc",
+2462 => x"3f778008",
+2463 => x"0c75800c",
+2464 => x"993d0d04",
+2465 => x"fc3d0d81",
+2466 => x"5480dfd4",
+2467 => x"08883873",
+2468 => x"800c863d",
+2469 => x"0d047653",
+2470 => x"97b95286",
+2471 => x"3dfc0551",
+2472 => x"ffbb9f3f",
+2473 => x"8008548c",
+2474 => x"3f748008",
+2475 => x"0c73800c",
+2476 => x"863d0d04",
+2477 => x"80cfe408",
+2478 => x"800c04f7",
+2479 => x"3d0d7b80",
+2480 => x"cfe40882",
+2481 => x"c811085a",
+2482 => x"545a7780",
+2483 => x"2e80da38",
+2484 => x"81881884",
+2485 => x"1908ff05",
+2486 => x"81712b59",
+2487 => x"55598074",
+2488 => x"2480ea38",
+2489 => x"807424b5",
+2490 => x"3873822b",
+2491 => x"78118805",
+2492 => x"56568180",
+2493 => x"19087706",
+2494 => x"5372802e",
+2495 => x"b6387816",
+2496 => x"70085353",
+2497 => x"79517408",
+2498 => x"53722dff",
+2499 => x"14fc17fc",
+2500 => x"1779812c",
+2501 => x"5a575754",
+2502 => x"738025d6",
+2503 => x"38770858",
+2504 => x"77ffad38",
+2505 => x"80cfe408",
+2506 => x"53bc1308",
+2507 => x"a5387951",
+2508 => x"f8e23f74",
+2509 => x"0853722d",
+2510 => x"ff14fc17",
+2511 => x"fc177981",
+2512 => x"2c5a5757",
+2513 => x"54738025",
+2514 => x"ffa838d1",
+2515 => x"398057ff",
+2516 => x"93397251",
+2517 => x"bc130854",
+2518 => x"732d7951",
+2519 => x"f8b63f70",
+2520 => x"7080dfb0",
+2521 => x"0bfc0570",
+2522 => x"08525270",
+2523 => x"ff2e9138",
+2524 => x"702dfc12",
+2525 => x"70085252",
+2526 => x"70ff2e09",
+2527 => x"8106f138",
+2528 => x"50500404",
+2529 => x"ffbb8c3f",
+2530 => x"04000000",
+2531 => x"00000040",
+2532 => x"48656c6c",
+2533 => x"6f20776f",
+2534 => x"726c6420",
+2535 => x"310a0000",
+2536 => x"48656c6c",
+2537 => x"6f20776f",
+2538 => x"726c6420",
+2539 => x"320a0000",
+2540 => x"0a000000",
+2541 => x"43000000",
+2542 => x"64756d6d",
+2543 => x"792e6578",
+2544 => x"65000000",
+2545 => x"00ffffff",
+2546 => x"ff00ffff",
+2547 => x"ffff00ff",
+2548 => x"ffffff00",
+2549 => x"00000000",
+2550 => x"00000000",
+2551 => x"00000000",
+2552 => x"00002fb8",
+2553 => x"000027e8",
+2554 => x"00000000",
+2555 => x"00002a50",
+2556 => x"00002aac",
+2557 => x"00002b08",
+2558 => x"00000000",
+2559 => x"00000000",
+2560 => x"00000000",
+2561 => x"00000000",
+2562 => x"00000000",
+2563 => x"00000000",
+2564 => x"00000000",
+2565 => x"00000000",
+2566 => x"00000000",
+2567 => x"000027b4",
+2568 => x"00000000",
+2569 => x"00000000",
+2570 => x"00000000",
+2571 => x"00000000",
+2572 => x"00000000",
+2573 => x"00000000",
+2574 => x"00000000",
+2575 => x"00000000",
+2576 => x"00000000",
+2577 => x"00000000",
+2578 => x"00000000",
+2579 => x"00000000",
+2580 => x"00000000",
+2581 => x"00000000",
+2582 => x"00000000",
+2583 => x"00000000",
+2584 => x"00000000",
+2585 => x"00000000",
+2586 => x"00000000",
+2587 => x"00000000",
+2588 => x"00000000",
+2589 => x"00000000",
+2590 => x"00000000",
+2591 => x"00000000",
+2592 => x"00000000",
+2593 => x"00000000",
+2594 => x"00000000",
+2595 => x"00000000",
+2596 => x"00000001",
+2597 => x"330eabcd",
+2598 => x"1234e66d",
+2599 => x"deec0005",
+2600 => x"000b0000",
+2601 => x"00000000",
+2602 => x"00000000",
+2603 => x"00000000",
+2604 => x"00000000",
+2605 => x"00000000",
+2606 => x"00000000",
+2607 => x"00000000",
+2608 => x"00000000",
+2609 => x"00000000",
+2610 => x"00000000",
+2611 => x"00000000",
+2612 => x"00000000",
+2613 => x"00000000",
+2614 => x"00000000",
+2615 => x"00000000",
+2616 => x"00000000",
+2617 => x"00000000",
+2618 => x"00000000",
+2619 => x"00000000",
+2620 => x"00000000",
+2621 => x"00000000",
+2622 => x"00000000",
+2623 => x"00000000",
+2624 => x"00000000",
+2625 => x"00000000",
+2626 => x"00000000",
+2627 => x"00000000",
+2628 => x"00000000",
+2629 => x"00000000",
+2630 => x"00000000",
+2631 => x"00000000",
+2632 => x"00000000",
+2633 => x"00000000",
+2634 => x"00000000",
+2635 => x"00000000",
+2636 => x"00000000",
+2637 => x"00000000",
+2638 => x"00000000",
+2639 => x"00000000",
+2640 => x"00000000",
+2641 => x"00000000",
+2642 => x"00000000",
+2643 => x"00000000",
+2644 => x"00000000",
+2645 => x"00000000",
+2646 => x"00000000",
+2647 => x"00000000",
+2648 => x"00000000",
+2649 => x"00000000",
+2650 => x"00000000",
+2651 => x"00000000",
+2652 => x"00000000",
+2653 => x"00000000",
+2654 => x"00000000",
+2655 => x"00000000",
+2656 => x"00000000",
+2657 => x"00000000",
+2658 => x"00000000",
+2659 => x"00000000",
+2660 => x"00000000",
+2661 => x"00000000",
+2662 => x"00000000",
+2663 => x"00000000",
+2664 => x"00000000",
+2665 => x"00000000",
+2666 => x"00000000",
+2667 => x"00000000",
+2668 => x"00000000",
+2669 => x"00000000",
+2670 => x"00000000",
+2671 => x"00000000",
+2672 => x"00000000",
+2673 => x"00000000",
+2674 => x"00000000",
+2675 => x"00000000",
+2676 => x"00000000",
+2677 => x"00000000",
+2678 => x"00000000",
+2679 => x"00000000",
+2680 => x"00000000",
+2681 => x"00000000",
+2682 => x"00000000",
+2683 => x"00000000",
+2684 => x"00000000",
+2685 => x"00000000",
+2686 => x"00000000",
+2687 => x"00000000",
+2688 => x"00000000",
+2689 => x"00000000",
+2690 => x"00000000",
+2691 => x"00000000",
+2692 => x"00000000",
+2693 => x"00000000",
+2694 => x"00000000",
+2695 => x"00000000",
+2696 => x"00000000",
+2697 => x"00000000",
+2698 => x"00000000",
+2699 => x"00000000",
+2700 => x"00000000",
+2701 => x"00000000",
+2702 => x"00000000",
+2703 => x"00000000",
+2704 => x"00000000",
+2705 => x"00000000",
+2706 => x"00000000",
+2707 => x"00000000",
+2708 => x"00000000",
+2709 => x"00000000",
+2710 => x"00000000",
+2711 => x"00000000",
+2712 => x"00000000",
+2713 => x"00000000",
+2714 => x"00000000",
+2715 => x"00000000",
+2716 => x"00000000",
+2717 => x"00000000",
+2718 => x"00000000",
+2719 => x"00000000",
+2720 => x"00000000",
+2721 => x"00000000",
+2722 => x"00000000",
+2723 => x"00000000",
+2724 => x"00000000",
+2725 => x"00000000",
+2726 => x"00000000",
+2727 => x"00000000",
+2728 => x"00000000",
+2729 => x"00000000",
+2730 => x"00000000",
+2731 => x"00000000",
+2732 => x"00000000",
+2733 => x"00000000",
+2734 => x"00000000",
+2735 => x"00000000",
+2736 => x"00000000",
+2737 => x"00000000",
+2738 => x"00000000",
+2739 => x"00000000",
+2740 => x"00000000",
+2741 => x"00000000",
+2742 => x"00000000",
+2743 => x"00000000",
+2744 => x"00000000",
+2745 => x"00000000",
+2746 => x"00000000",
+2747 => x"00000000",
+2748 => x"00000000",
+2749 => x"00000000",
+2750 => x"00000000",
+2751 => x"00000000",
+2752 => x"00000000",
+2753 => x"00000000",
+2754 => x"00000000",
+2755 => x"00000000",
+2756 => x"00000000",
+2757 => x"00000000",
+2758 => x"00000000",
+2759 => x"00000000",
+2760 => x"00000000",
+2761 => x"00000000",
+2762 => x"00000000",
+2763 => x"00000000",
+2764 => x"00000000",
+2765 => x"00000000",
+2766 => x"00000000",
+2767 => x"00000000",
+2768 => x"00000000",
+2769 => x"00000000",
+2770 => x"00000000",
+2771 => x"00000000",
+2772 => x"00000000",
+2773 => x"00000000",
+2774 => x"00000000",
+2775 => x"00000000",
+2776 => x"00000000",
+2777 => x"00000000",
+2778 => x"00000000",
+2779 => x"00000000",
+2780 => x"00000000",
+2781 => x"00000000",
+2782 => x"00000000",
+2783 => x"00000000",
+2784 => x"00000000",
+2785 => x"00000000",
+2786 => x"00000000",
+2787 => x"00000000",
+2788 => x"00000000",
+2789 => x"ffffffff",
+2790 => x"00000000",
+2791 => x"00020000",
+2792 => x"00000000",
+2793 => x"00000000",
+2794 => x"00002ba0",
+2795 => x"00002ba0",
+2796 => x"00002ba8",
+2797 => x"00002ba8",
+2798 => x"00002bb0",
+2799 => x"00002bb0",
+2800 => x"00002bb8",
+2801 => x"00002bb8",
+2802 => x"00002bc0",
+2803 => x"00002bc0",
+2804 => x"00002bc8",
+2805 => x"00002bc8",
+2806 => x"00002bd0",
+2807 => x"00002bd0",
+2808 => x"00002bd8",
+2809 => x"00002bd8",
+2810 => x"00002be0",
+2811 => x"00002be0",
+2812 => x"00002be8",
+2813 => x"00002be8",
+2814 => x"00002bf0",
+2815 => x"00002bf0",
+2816 => x"00002bf8",
+2817 => x"00002bf8",
+2818 => x"00002c00",
+2819 => x"00002c00",
+2820 => x"00002c08",
+2821 => x"00002c08",
+2822 => x"00002c10",
+2823 => x"00002c10",
+2824 => x"00002c18",
+2825 => x"00002c18",
+2826 => x"00002c20",
+2827 => x"00002c20",
+2828 => x"00002c28",
+2829 => x"00002c28",
+2830 => x"00002c30",
+2831 => x"00002c30",
+2832 => x"00002c38",
+2833 => x"00002c38",
+2834 => x"00002c40",
+2835 => x"00002c40",
+2836 => x"00002c48",
+2837 => x"00002c48",
+2838 => x"00002c50",
+2839 => x"00002c50",
+2840 => x"00002c58",
+2841 => x"00002c58",
+2842 => x"00002c60",
+2843 => x"00002c60",
+2844 => x"00002c68",
+2845 => x"00002c68",
+2846 => x"00002c70",
+2847 => x"00002c70",
+2848 => x"00002c78",
+2849 => x"00002c78",
+2850 => x"00002c80",
+2851 => x"00002c80",
+2852 => x"00002c88",
+2853 => x"00002c88",
+2854 => x"00002c90",
+2855 => x"00002c90",
+2856 => x"00002c98",
+2857 => x"00002c98",
+2858 => x"00002ca0",
+2859 => x"00002ca0",
+2860 => x"00002ca8",
+2861 => x"00002ca8",
+2862 => x"00002cb0",
+2863 => x"00002cb0",
+2864 => x"00002cb8",
+2865 => x"00002cb8",
+2866 => x"00002cc0",
+2867 => x"00002cc0",
+2868 => x"00002cc8",
+2869 => x"00002cc8",
+2870 => x"00002cd0",
+2871 => x"00002cd0",
+2872 => x"00002cd8",
+2873 => x"00002cd8",
+2874 => x"00002ce0",
+2875 => x"00002ce0",
+2876 => x"00002ce8",
+2877 => x"00002ce8",
+2878 => x"00002cf0",
+2879 => x"00002cf0",
+2880 => x"00002cf8",
+2881 => x"00002cf8",
+2882 => x"00002d00",
+2883 => x"00002d00",
+2884 => x"00002d08",
+2885 => x"00002d08",
+2886 => x"00002d10",
+2887 => x"00002d10",
+2888 => x"00002d18",
+2889 => x"00002d18",
+2890 => x"00002d20",
+2891 => x"00002d20",
+2892 => x"00002d28",
+2893 => x"00002d28",
+2894 => x"00002d30",
+2895 => x"00002d30",
+2896 => x"00002d38",
+2897 => x"00002d38",
+2898 => x"00002d40",
+2899 => x"00002d40",
+2900 => x"00002d48",
+2901 => x"00002d48",
+2902 => x"00002d50",
+2903 => x"00002d50",
+2904 => x"00002d58",
+2905 => x"00002d58",
+2906 => x"00002d60",
+2907 => x"00002d60",
+2908 => x"00002d68",
+2909 => x"00002d68",
+2910 => x"00002d70",
+2911 => x"00002d70",
+2912 => x"00002d78",
+2913 => x"00002d78",
+2914 => x"00002d80",
+2915 => x"00002d80",
+2916 => x"00002d88",
+2917 => x"00002d88",
+2918 => x"00002d90",
+2919 => x"00002d90",
+2920 => x"00002d98",
+2921 => x"00002d98",
+2922 => x"00002da0",
+2923 => x"00002da0",
+2924 => x"00002da8",
+2925 => x"00002da8",
+2926 => x"00002db0",
+2927 => x"00002db0",
+2928 => x"00002db8",
+2929 => x"00002db8",
+2930 => x"00002dc0",
+2931 => x"00002dc0",
+2932 => x"00002dc8",
+2933 => x"00002dc8",
+2934 => x"00002dd0",
+2935 => x"00002dd0",
+2936 => x"00002dd8",
+2937 => x"00002dd8",
+2938 => x"00002de0",
+2939 => x"00002de0",
+2940 => x"00002de8",
+2941 => x"00002de8",
+2942 => x"00002df0",
+2943 => x"00002df0",
+2944 => x"00002df8",
+2945 => x"00002df8",
+2946 => x"00002e00",
+2947 => x"00002e00",
+2948 => x"00002e08",
+2949 => x"00002e08",
+2950 => x"00002e10",
+2951 => x"00002e10",
+2952 => x"00002e18",
+2953 => x"00002e18",
+2954 => x"00002e20",
+2955 => x"00002e20",
+2956 => x"00002e28",
+2957 => x"00002e28",
+2958 => x"00002e30",
+2959 => x"00002e30",
+2960 => x"00002e38",
+2961 => x"00002e38",
+2962 => x"00002e40",
+2963 => x"00002e40",
+2964 => x"00002e48",
+2965 => x"00002e48",
+2966 => x"00002e50",
+2967 => x"00002e50",
+2968 => x"00002e58",
+2969 => x"00002e58",
+2970 => x"00002e60",
+2971 => x"00002e60",
+2972 => x"00002e68",
+2973 => x"00002e68",
+2974 => x"00002e70",
+2975 => x"00002e70",
+2976 => x"00002e78",
+2977 => x"00002e78",
+2978 => x"00002e80",
+2979 => x"00002e80",
+2980 => x"00002e88",
+2981 => x"00002e88",
+2982 => x"00002e90",
+2983 => x"00002e90",
+2984 => x"00002e98",
+2985 => x"00002e98",
+2986 => x"00002ea0",
+2987 => x"00002ea0",
+2988 => x"00002ea8",
+2989 => x"00002ea8",
+2990 => x"00002eb0",
+2991 => x"00002eb0",
+2992 => x"00002eb8",
+2993 => x"00002eb8",
+2994 => x"00002ec0",
+2995 => x"00002ec0",
+2996 => x"00002ec8",
+2997 => x"00002ec8",
+2998 => x"00002ed0",
+2999 => x"00002ed0",
+3000 => x"00002ed8",
+3001 => x"00002ed8",
+3002 => x"00002ee0",
+3003 => x"00002ee0",
+3004 => x"00002ee8",
+3005 => x"00002ee8",
+3006 => x"00002ef0",
+3007 => x"00002ef0",
+3008 => x"00002ef8",
+3009 => x"00002ef8",
+3010 => x"00002f00",
+3011 => x"00002f00",
+3012 => x"00002f08",
+3013 => x"00002f08",
+3014 => x"00002f10",
+3015 => x"00002f10",
+3016 => x"00002f18",
+3017 => x"00002f18",
+3018 => x"00002f20",
+3019 => x"00002f20",
+3020 => x"00002f28",
+3021 => x"00002f28",
+3022 => x"00002f30",
+3023 => x"00002f30",
+3024 => x"00002f38",
+3025 => x"00002f38",
+3026 => x"00002f40",
+3027 => x"00002f40",
+3028 => x"00002f48",
+3029 => x"00002f48",
+3030 => x"00002f50",
+3031 => x"00002f50",
+3032 => x"00002f58",
+3033 => x"00002f58",
+3034 => x"00002f60",
+3035 => x"00002f60",
+3036 => x"00002f68",
+3037 => x"00002f68",
+3038 => x"00002f70",
+3039 => x"00002f70",
+3040 => x"00002f78",
+3041 => x"00002f78",
+3042 => x"00002f80",
+3043 => x"00002f80",
+3044 => x"00002f88",
+3045 => x"00002f88",
+3046 => x"00002f90",
+3047 => x"00002f90",
+3048 => x"00002f98",
+3049 => x"00002f98",
+3050 => x"000027b8",
+3051 => x"ffffffff",
+3052 => x"00000000",
+3053 => x"ffffffff",
+3054 => x"00000000",
+ others => x"00000000"
+);
+
+begin
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memAWriteEnable = '1') and (memBWriteEnable = '1') and (memAAddr=memBAddr) and (memAWrite/=memBWrite) then
+ report "write collision" severity failure;
+ end if;
+
+ if (memAWriteEnable = '1') then
+ ram(to_integer(unsigned(memAAddr))) := memAWrite;
+ memARead <= memAWrite;
+ else
+ memARead <= ram(to_integer(unsigned(memAAddr)));
+ end if;
+ end if;
+end process;
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memBWriteEnable = '1') then
+ ram(to_integer(unsigned(memBAddr))) := memBWrite;
+ memBRead <= memBWrite;
+ else
+ memBRead <= ram(to_integer(unsigned(memBAddr)));
+ end if;
+ end if;
+end process;
+
+
+
+
+end dualport_ram_arch;
diff --git a/zpu/hdl/example/interrupt.vhd b/zpu/hdl/example/interrupt.vhd
new file mode 100644
index 0000000..d2bc709
--- /dev/null
+++ b/zpu/hdl/example/interrupt.vhd
@@ -0,0 +1,3156 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+entity dualport_ram is
+port (clk : in std_logic;
+ memAWriteEnable : in std_logic;
+ memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memAWrite : in std_logic_vector(wordSize-1 downto 0);
+ memARead : out std_logic_vector(wordSize-1 downto 0);
+ memBWriteEnable : in std_logic;
+ memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit);
+ memBWrite : in std_logic_vector(wordSize-1 downto 0);
+ memBRead : out std_logic_vector(wordSize-1 downto 0));
+end dualport_ram;
+
+architecture dualport_ram_arch of dualport_ram is
+
+
+type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0);
+
+shared variable ram : ram_type :=
+(
+0 => x"0b0b0b0b",
+1 => x"82700b0b",
+2 => x"80cfe00c",
+3 => x"3a0b0b80",
+4 => x"c6e00400",
+5 => x"00000000",
+6 => x"00000000",
+7 => x"00000000",
+8 => x"80088408",
+9 => x"88080b0b",
+10 => x"0b8af02d",
+11 => x"880c840c",
+12 => x"800c0400",
+13 => x"00000000",
+14 => x"00000000",
+15 => x"00000000",
+16 => x"71fd0608",
+17 => x"72830609",
+18 => x"81058205",
+19 => x"832b2a83",
+20 => x"ffff0652",
+21 => x"04000000",
+22 => x"00000000",
+23 => x"00000000",
+24 => x"71fd0608",
+25 => x"83ffff73",
+26 => x"83060981",
+27 => x"05820583",
+28 => x"2b2b0906",
+29 => x"7383ffff",
+30 => x"0b0b0b0b",
+31 => x"83a70400",
+32 => x"72098105",
+33 => x"72057373",
+34 => x"09060906",
+35 => x"73097306",
+36 => x"070a8106",
+37 => x"53510400",
+38 => x"00000000",
+39 => x"00000000",
+40 => x"72722473",
+41 => x"732e0753",
+42 => x"51040000",
+43 => x"00000000",
+44 => x"00000000",
+45 => x"00000000",
+46 => x"00000000",
+47 => x"00000000",
+48 => x"71737109",
+49 => x"71068106",
+50 => x"30720a10",
+51 => x"0a720a10",
+52 => x"0a31050a",
+53 => x"81065151",
+54 => x"53510400",
+55 => x"00000000",
+56 => x"72722673",
+57 => x"732e0753",
+58 => x"51040000",
+59 => x"00000000",
+60 => x"00000000",
+61 => x"00000000",
+62 => x"00000000",
+63 => x"00000000",
+64 => x"00000000",
+65 => x"00000000",
+66 => x"00000000",
+67 => x"00000000",
+68 => x"00000000",
+69 => x"00000000",
+70 => x"00000000",
+71 => x"00000000",
+72 => x"0b0b0b88",
+73 => x"c4040000",
+74 => x"00000000",
+75 => x"00000000",
+76 => x"00000000",
+77 => x"00000000",
+78 => x"00000000",
+79 => x"00000000",
+80 => x"720a722b",
+81 => x"0a535104",
+82 => x"00000000",
+83 => x"00000000",
+84 => x"00000000",
+85 => x"00000000",
+86 => x"00000000",
+87 => x"00000000",
+88 => x"72729f06",
+89 => x"0981050b",
+90 => x"0b0b88a7",
+91 => x"05040000",
+92 => x"00000000",
+93 => x"00000000",
+94 => x"00000000",
+95 => x"00000000",
+96 => x"72722aff",
+97 => x"739f062a",
+98 => x"0974090a",
+99 => x"8106ff05",
+100 => x"06075351",
+101 => x"04000000",
+102 => x"00000000",
+103 => x"00000000",
+104 => x"71715351",
+105 => x"020d0406",
+106 => x"73830609",
+107 => x"81058205",
+108 => x"832b0b2b",
+109 => x"0772fc06",
+110 => x"0c515104",
+111 => x"00000000",
+112 => x"72098105",
+113 => x"72050970",
+114 => x"81050906",
+115 => x"0a810653",
+116 => x"51040000",
+117 => x"00000000",
+118 => x"00000000",
+119 => x"00000000",
+120 => x"72098105",
+121 => x"72050970",
+122 => x"81050906",
+123 => x"0a098106",
+124 => x"53510400",
+125 => x"00000000",
+126 => x"00000000",
+127 => x"00000000",
+128 => x"71098105",
+129 => x"52040000",
+130 => x"00000000",
+131 => x"00000000",
+132 => x"00000000",
+133 => x"00000000",
+134 => x"00000000",
+135 => x"00000000",
+136 => x"72720981",
+137 => x"05055351",
+138 => x"04000000",
+139 => x"00000000",
+140 => x"00000000",
+141 => x"00000000",
+142 => x"00000000",
+143 => x"00000000",
+144 => x"72097206",
+145 => x"73730906",
+146 => x"07535104",
+147 => x"00000000",
+148 => x"00000000",
+149 => x"00000000",
+150 => x"00000000",
+151 => x"00000000",
+152 => x"71fc0608",
+153 => x"72830609",
+154 => x"81058305",
+155 => x"1010102a",
+156 => x"81ff0652",
+157 => x"04000000",
+158 => x"00000000",
+159 => x"00000000",
+160 => x"71fc0608",
+161 => x"0b0b80cf",
+162 => x"cc738306",
+163 => x"10100508",
+164 => x"060b0b0b",
+165 => x"88aa0400",
+166 => x"00000000",
+167 => x"00000000",
+168 => x"80088408",
+169 => x"88087575",
+170 => x"0b0b0b8b",
+171 => x"ab2d5050",
+172 => x"80085688",
+173 => x"0c840c80",
+174 => x"0c510400",
+175 => x"00000000",
+176 => x"80088408",
+177 => x"88087575",
+178 => x"0b0b0b8b",
+179 => x"ef2d5050",
+180 => x"80085688",
+181 => x"0c840c80",
+182 => x"0c510400",
+183 => x"00000000",
+184 => x"72097081",
+185 => x"0509060a",
+186 => x"8106ff05",
+187 => x"70547106",
+188 => x"73097274",
+189 => x"05ff0506",
+190 => x"07515151",
+191 => x"04000000",
+192 => x"72097081",
+193 => x"0509060a",
+194 => x"098106ff",
+195 => x"05705471",
+196 => x"06730972",
+197 => x"7405ff05",
+198 => x"06075151",
+199 => x"51040000",
+200 => x"05ff0504",
+201 => x"00000000",
+202 => x"00000000",
+203 => x"00000000",
+204 => x"00000000",
+205 => x"00000000",
+206 => x"00000000",
+207 => x"00000000",
+208 => x"810b0b0b",
+209 => x"80cfdc0c",
+210 => x"51040000",
+211 => x"00000000",
+212 => x"00000000",
+213 => x"00000000",
+214 => x"00000000",
+215 => x"00000000",
+216 => x"71810552",
+217 => x"04000000",
+218 => x"00000000",
+219 => x"00000000",
+220 => x"00000000",
+221 => x"00000000",
+222 => x"00000000",
+223 => x"00000000",
+224 => x"00000000",
+225 => x"00000000",
+226 => x"00000000",
+227 => x"00000000",
+228 => x"00000000",
+229 => x"00000000",
+230 => x"00000000",
+231 => x"00000000",
+232 => x"02840572",
+233 => x"10100552",
+234 => x"04000000",
+235 => x"00000000",
+236 => x"00000000",
+237 => x"00000000",
+238 => x"00000000",
+239 => x"00000000",
+240 => x"00000000",
+241 => x"00000000",
+242 => x"00000000",
+243 => x"00000000",
+244 => x"00000000",
+245 => x"00000000",
+246 => x"00000000",
+247 => x"00000000",
+248 => x"717105ff",
+249 => x"05715351",
+250 => x"020d0400",
+251 => x"00000000",
+252 => x"00000000",
+253 => x"00000000",
+254 => x"00000000",
+255 => x"00000000",
+256 => x"82c53f80",
+257 => x"c6e63f04",
+258 => x"10101010",
+259 => x"10101010",
+260 => x"10101010",
+261 => x"10101010",
+262 => x"10101010",
+263 => x"10101010",
+264 => x"10101010",
+265 => x"10101053",
+266 => x"51047381",
+267 => x"ff067383",
+268 => x"06098105",
+269 => x"83051010",
+270 => x"102b0772",
+271 => x"fc060c51",
+272 => x"51043c04",
+273 => x"72728072",
+274 => x"8106ff05",
+275 => x"09720605",
+276 => x"71105272",
+277 => x"0a100a53",
+278 => x"72ed3851",
+279 => x"51535104",
+280 => x"fe3d0d0b",
+281 => x"0b80dfc8",
+282 => x"08538413",
+283 => x"0870882a",
+284 => x"70810651",
+285 => x"52527080",
+286 => x"2ef03871",
+287 => x"81ff0680",
+288 => x"0c843d0d",
+289 => x"04ff3d0d",
+290 => x"0b0b80df",
+291 => x"c8085271",
+292 => x"0870882a",
+293 => x"81327081",
+294 => x"06515151",
+295 => x"70f13873",
+296 => x"720c833d",
+297 => x"0d0480cf",
+298 => x"dc08802e",
+299 => x"a43880cf",
+300 => x"e008822e",
+301 => x"bd388380",
+302 => x"800b0b0b",
+303 => x"80dfc80c",
+304 => x"82a0800b",
+305 => x"80dfcc0c",
+306 => x"8290800b",
+307 => x"80dfd00c",
+308 => x"04f88080",
+309 => x"80a40b0b",
+310 => x"0b80dfc8",
+311 => x"0cf88080",
+312 => x"82800b80",
+313 => x"dfcc0cf8",
+314 => x"80808480",
+315 => x"0b80dfd0",
+316 => x"0c0480c0",
+317 => x"a8808c0b",
+318 => x"0b0b80df",
+319 => x"c80c80c0",
+320 => x"a880940b",
+321 => x"80dfcc0c",
+322 => x"0b0b80cf",
+323 => x"980b80df",
+324 => x"d00c0470",
+325 => x"7080dfd4",
+326 => x"335170a7",
+327 => x"3880cfe8",
+328 => x"08700852",
+329 => x"5270802e",
+330 => x"94388412",
+331 => x"80cfe80c",
+332 => x"702d80cf",
+333 => x"e8087008",
+334 => x"525270ee",
+335 => x"38810b80",
+336 => x"dfd43450",
+337 => x"50040470",
+338 => x"0b0b80df",
+339 => x"c408802e",
+340 => x"8e380b0b",
+341 => x"0b0b800b",
+342 => x"802e0981",
+343 => x"06833850",
+344 => x"040b0b80",
+345 => x"dfc4510b",
+346 => x"0b0bf594",
+347 => x"3f500404",
+348 => x"803d0d80",
+349 => x"dfe00881",
+350 => x"1180dfe0",
+351 => x"0c51823d",
+352 => x"0d04fe3d",
+353 => x"0d80dfe0",
+354 => x"085380df",
+355 => x"e0085272",
+356 => x"722e8f38",
+357 => x"80cf9c51",
+358 => x"82b03f80",
+359 => x"dfe00853",
+360 => x"e93980cf",
+361 => x"ac5182a2",
+362 => x"3fe039fb",
+363 => x"3d0d7779",
+364 => x"55558056",
+365 => x"757524ab",
+366 => x"38807424",
+367 => x"9d388053",
+368 => x"73527451",
+369 => x"80e13f80",
+370 => x"08547580",
+371 => x"2e853880",
+372 => x"08305473",
+373 => x"800c873d",
+374 => x"0d047330",
+375 => x"76813257",
+376 => x"54dc3974",
+377 => x"30558156",
+378 => x"738025d2",
+379 => x"38ec39fa",
+380 => x"3d0d787a",
+381 => x"57558057",
+382 => x"767524a4",
+383 => x"38759f2c",
+384 => x"54815375",
+385 => x"74327431",
+386 => x"5274519b",
+387 => x"3f800854",
+388 => x"76802e85",
+389 => x"38800830",
+390 => x"5473800c",
+391 => x"883d0d04",
+392 => x"74305581",
+393 => x"57d739fc",
+394 => x"3d0d7678",
+395 => x"53548153",
+396 => x"80747326",
+397 => x"52557280",
+398 => x"2e983870",
+399 => x"802eab38",
+400 => x"807224a6",
+401 => x"38711073",
+402 => x"10757226",
+403 => x"53545272",
+404 => x"ea387351",
+405 => x"78833874",
+406 => x"5170800c",
+407 => x"863d0d04",
+408 => x"720a100a",
+409 => x"720a100a",
+410 => x"53537280",
+411 => x"2ee43871",
+412 => x"7426ed38",
+413 => x"73723175",
+414 => x"7407740a",
+415 => x"100a740a",
+416 => x"100a5555",
+417 => x"5654e339",
+418 => x"f73d0d7c",
+419 => x"70525380",
+420 => x"fd3f7254",
+421 => x"8008550b",
+422 => x"0b80cfb8",
+423 => x"56815780",
+424 => x"0881055a",
+425 => x"8b3de411",
+426 => x"59538259",
+427 => x"f413527b",
+428 => x"88110852",
+429 => x"5381b43f",
+430 => x"80083070",
+431 => x"8008079f",
+432 => x"2c8a0780",
+433 => x"0c538b3d",
+434 => x"0d04f63d",
+435 => x"0d7c80cf",
+436 => x"ec087153",
+437 => x"5553b73f",
+438 => x"72558008",
+439 => x"560b0b80",
+440 => x"cfb85781",
+441 => x"58800881",
+442 => x"055b8c3d",
+443 => x"e4115a53",
+444 => x"825af413",
+445 => x"52881408",
+446 => x"5180f03f",
+447 => x"80083070",
+448 => x"8008079f",
+449 => x"2c8a0780",
+450 => x"0c548c3d",
+451 => x"0d047070",
+452 => x"70707570",
+453 => x"71830653",
+454 => x"555270b4",
+455 => x"38717008",
+456 => x"7009f7fb",
+457 => x"fdff1206",
+458 => x"f8848281",
+459 => x"80065452",
+460 => x"53719b38",
+461 => x"84137008",
+462 => x"7009f7fb",
+463 => x"fdff1206",
+464 => x"f8848281",
+465 => x"80065452",
+466 => x"5371802e",
+467 => x"e7387252",
+468 => x"71335372",
+469 => x"802e8a38",
+470 => x"81127033",
+471 => x"545272f8",
+472 => x"38717431",
+473 => x"800c5050",
+474 => x"505004f2",
+475 => x"3d0d6062",
+476 => x"88110870",
+477 => x"58565f5a",
+478 => x"73802e81",
+479 => x"8c388c1a",
+480 => x"2270832a",
+481 => x"81328106",
+482 => x"56587486",
+483 => x"38901a08",
+484 => x"91387951",
+485 => x"90b73fff",
+486 => x"55800880",
+487 => x"ec388c1a",
+488 => x"22587d08",
+489 => x"55807883",
+490 => x"ffff0670",
+491 => x"0a100a81",
+492 => x"06415c57",
+493 => x"7e772e80",
+494 => x"d7387690",
+495 => x"38740884",
+496 => x"16088817",
+497 => x"57585676",
+498 => x"802ef238",
+499 => x"76548880",
+500 => x"77278438",
+501 => x"88805473",
+502 => x"5375529c",
+503 => x"1a0851a4",
+504 => x"1a085877",
+505 => x"2d800b80",
+506 => x"082582e0",
+507 => x"38800816",
+508 => x"77800831",
+509 => x"7f880508",
+510 => x"80083170",
+511 => x"6188050c",
+512 => x"5b585678",
+513 => x"ffb43880",
+514 => x"5574800c",
+515 => x"903d0d04",
+516 => x"7a813281",
+517 => x"06774056",
+518 => x"75802e81",
+519 => x"bd387690",
+520 => x"38740884",
+521 => x"16088817",
+522 => x"57585976",
+523 => x"802ef238",
+524 => x"881a0878",
+525 => x"83ffff06",
+526 => x"70892a81",
+527 => x"06565956",
+528 => x"73802e82",
+529 => x"f8387577",
+530 => x"278b3877",
+531 => x"872a8106",
+532 => x"5c7b82b5",
+533 => x"38767627",
+534 => x"83387656",
+535 => x"75537852",
+536 => x"79085185",
+537 => x"833f881a",
+538 => x"08763188",
+539 => x"1b0c7908",
+540 => x"167a0c76",
+541 => x"56751977",
+542 => x"77317f88",
+543 => x"05087831",
+544 => x"70618805",
+545 => x"0c415859",
+546 => x"7e802efe",
+547 => x"fa388c1a",
+548 => x"2258ff8a",
+549 => x"39787954",
+550 => x"7c537b52",
+551 => x"5684c93f",
+552 => x"881a0879",
+553 => x"31881b0c",
+554 => x"7908197a",
+555 => x"0c7c7631",
+556 => x"5d7c8e38",
+557 => x"79518ff2",
+558 => x"3f800881",
+559 => x"8f388008",
+560 => x"5f751c77",
+561 => x"77317f88",
+562 => x"05087831",
+563 => x"70618805",
+564 => x"0c5d585c",
+565 => x"7a802efe",
+566 => x"ae387681",
+567 => x"83387408",
+568 => x"84160888",
+569 => x"1757585c",
+570 => x"76802ef2",
+571 => x"3876538a",
+572 => x"527b5182",
+573 => x"d33f8008",
+574 => x"7c318105",
+575 => x"5d800884",
+576 => x"3881175d",
+577 => x"815f7c59",
+578 => x"767d2783",
+579 => x"38765994",
+580 => x"1a08881b",
+581 => x"08115758",
+582 => x"807a085c",
+583 => x"54901a08",
+584 => x"7b278338",
+585 => x"81547579",
+586 => x"25843873",
+587 => x"ba387779",
+588 => x"24fee238",
+589 => x"77537b52",
+590 => x"9c1a0851",
+591 => x"a41a0859",
+592 => x"782d8008",
+593 => x"56800880",
+594 => x"24fee238",
+595 => x"8c1a2280",
+596 => x"c0075e7d",
+597 => x"8c1b23ff",
+598 => x"5574800c",
+599 => x"903d0d04",
+600 => x"7effa338",
+601 => x"ff873975",
+602 => x"537b527a",
+603 => x"5182f93f",
+604 => x"7908167a",
+605 => x"0c79518e",
+606 => x"b13f8008",
+607 => x"cf387c76",
+608 => x"315d7cfe",
+609 => x"bc38feac",
+610 => x"39901a08",
+611 => x"7a087131",
+612 => x"78117056",
+613 => x"5a575280",
+614 => x"cfec0851",
+615 => x"84943f80",
+616 => x"08802eff",
+617 => x"a7388008",
+618 => x"901b0c80",
+619 => x"08167a0c",
+620 => x"77941b0c",
+621 => x"76881b0c",
+622 => x"7656fd99",
+623 => x"39790858",
+624 => x"901a0878",
+625 => x"27833881",
+626 => x"54757727",
+627 => x"843873b3",
+628 => x"38941a08",
+629 => x"54737726",
+630 => x"80d33873",
+631 => x"5378529c",
+632 => x"1a0851a4",
+633 => x"1a085877",
+634 => x"2d800856",
+635 => x"80088024",
+636 => x"fd83388c",
+637 => x"1a2280c0",
+638 => x"075e7d8c",
+639 => x"1b23ff55",
+640 => x"fed73975",
+641 => x"53785277",
+642 => x"5181dd3f",
+643 => x"7908167a",
+644 => x"0c79518d",
+645 => x"953f8008",
+646 => x"802efcd9",
+647 => x"388c1a22",
+648 => x"80c0075e",
+649 => x"7d8c1b23",
+650 => x"ff55fead",
+651 => x"39767754",
+652 => x"79537852",
+653 => x"5681b13f",
+654 => x"881a0877",
+655 => x"31881b0c",
+656 => x"7908177a",
+657 => x"0cfcae39",
+658 => x"fa3d0d7a",
+659 => x"79028805",
+660 => x"a7053355",
+661 => x"53548374",
+662 => x"2780df38",
+663 => x"71830651",
+664 => x"7080d738",
+665 => x"71715755",
+666 => x"83517582",
+667 => x"802913ff",
+668 => x"12525670",
+669 => x"8025f338",
+670 => x"837427bc",
+671 => x"38740876",
+672 => x"327009f7",
+673 => x"fbfdff12",
+674 => x"06f88482",
+675 => x"81800651",
+676 => x"5170802e",
+677 => x"98387451",
+678 => x"80527033",
+679 => x"5772772e",
+680 => x"b9388111",
+681 => x"81135351",
+682 => x"837227ee",
+683 => x"38fc1484",
+684 => x"16565473",
+685 => x"8326c638",
+686 => x"7452ff14",
+687 => x"5170ff2e",
+688 => x"97387133",
+689 => x"5472742e",
+690 => x"98388112",
+691 => x"ff125252",
+692 => x"70ff2e09",
+693 => x"8106eb38",
+694 => x"80517080",
+695 => x"0c883d0d",
+696 => x"0471800c",
+697 => x"883d0d04",
+698 => x"fa3d0d78",
+699 => x"7a7c7272",
+700 => x"72595755",
+701 => x"58565774",
+702 => x"7727b238",
+703 => x"75155176",
+704 => x"7127aa38",
+705 => x"707618ff",
+706 => x"18535353",
+707 => x"70ff2e96",
+708 => x"38ff12ff",
+709 => x"14545272",
+710 => x"337234ff",
+711 => x"115170ff",
+712 => x"2e098106",
+713 => x"ec387680",
+714 => x"0c883d0d",
+715 => x"048f7627",
+716 => x"80e63874",
+717 => x"77078306",
+718 => x"517080dc",
+719 => x"38767552",
+720 => x"53707084",
+721 => x"05520873",
+722 => x"70840555",
+723 => x"0c727170",
+724 => x"84055308",
+725 => x"71708405",
+726 => x"530c7170",
+727 => x"84055308",
+728 => x"71708405",
+729 => x"530c7170",
+730 => x"84055308",
+731 => x"71708405",
+732 => x"530cf015",
+733 => x"5553738f",
+734 => x"26c73883",
+735 => x"74279538",
+736 => x"70708405",
+737 => x"52087370",
+738 => x"8405550c",
+739 => x"fc145473",
+740 => x"8326ed38",
+741 => x"72715452",
+742 => x"ff145170",
+743 => x"ff2eff86",
+744 => x"38727081",
+745 => x"05543372",
+746 => x"70810554",
+747 => x"34ff1151",
+748 => x"ea39ef3d",
+749 => x"0d636567",
+750 => x"405d427b",
+751 => x"802e8582",
+752 => x"386151a9",
+753 => x"e73ff81c",
+754 => x"70841208",
+755 => x"70fc0670",
+756 => x"628b0570",
+757 => x"f8064159",
+758 => x"455c5f41",
+759 => x"57967427",
+760 => x"82c53880",
+761 => x"7b247e7c",
+762 => x"26075880",
+763 => x"5477742e",
+764 => x"09810682",
+765 => x"ab38787b",
+766 => x"2581fe38",
+767 => x"781780d7",
+768 => x"a80b8805",
+769 => x"085b5679",
+770 => x"762e84c5",
+771 => x"38841608",
+772 => x"70fe0617",
+773 => x"84110881",
+774 => x"06415555",
+775 => x"7e828d38",
+776 => x"74fc0658",
+777 => x"79762e84",
+778 => x"e3387818",
+779 => x"5f7e7b25",
+780 => x"81ff387c",
+781 => x"81065473",
+782 => x"82c13876",
+783 => x"77083184",
+784 => x"1108fc06",
+785 => x"56577580",
+786 => x"2e913879",
+787 => x"762e84f0",
+788 => x"38741819",
+789 => x"58777b25",
+790 => x"84913876",
+791 => x"802e829b",
+792 => x"38781556",
+793 => x"7a762482",
+794 => x"92388c17",
+795 => x"08881808",
+796 => x"718c120c",
+797 => x"88120c5e",
+798 => x"75598817",
+799 => x"61fc055b",
+800 => x"5679a426",
+801 => x"85ff387b",
+802 => x"76595593",
+803 => x"7a2780c9",
+804 => x"387b7084",
+805 => x"055d087c",
+806 => x"56760c74",
+807 => x"70840556",
+808 => x"088c180c",
+809 => x"9017589b",
+810 => x"7a27ae38",
+811 => x"74708405",
+812 => x"5608780c",
+813 => x"74708405",
+814 => x"56089418",
+815 => x"0c981758",
+816 => x"a37a2795",
+817 => x"38747084",
+818 => x"05560878",
+819 => x"0c747084",
+820 => x"0556089c",
+821 => x"180ca017",
+822 => x"58747084",
+823 => x"05560875",
+824 => x"5f787084",
+825 => x"055a0c77",
+826 => x"7e708405",
+827 => x"40087170",
+828 => x"8405530c",
+829 => x"7e08710c",
+830 => x"5d787b31",
+831 => x"56758f26",
+832 => x"80c93884",
+833 => x"17088106",
+834 => x"79078418",
+835 => x"0c781784",
+836 => x"11088107",
+837 => x"84120c5b",
+838 => x"6151a791",
+839 => x"3f881754",
+840 => x"73800c93",
+841 => x"3d0d0490",
+842 => x"5bfdb839",
+843 => x"7756fe83",
+844 => x"398c1608",
+845 => x"88170871",
+846 => x"8c120c88",
+847 => x"120c587e",
+848 => x"707c3157",
+849 => x"598f7627",
+850 => x"ffb9387a",
+851 => x"17841808",
+852 => x"81067c07",
+853 => x"84190c76",
+854 => x"81078412",
+855 => x"0c761184",
+856 => x"11088107",
+857 => x"84120c5b",
+858 => x"88055261",
+859 => x"518fda3f",
+860 => x"6151a6b9",
+861 => x"3f881754",
+862 => x"ffa6397d",
+863 => x"52615197",
+864 => x"d73f8008",
+865 => x"5a800880",
+866 => x"2e81ab38",
+867 => x"8008f805",
+868 => x"60840508",
+869 => x"fe066105",
+870 => x"58557477",
+871 => x"2e83f238",
+872 => x"fc195877",
+873 => x"a42681b0",
+874 => x"387b8008",
+875 => x"56579378",
+876 => x"2780dc38",
+877 => x"7b707084",
+878 => x"05520880",
+879 => x"08708405",
+880 => x"800c0c80",
+881 => x"08717084",
+882 => x"0553085d",
+883 => x"567b7670",
+884 => x"8405580c",
+885 => x"579b7827",
+886 => x"b6387670",
+887 => x"84055808",
+888 => x"75708405",
+889 => x"570c7670",
+890 => x"84055808",
+891 => x"75708405",
+892 => x"570ca378",
+893 => x"27993876",
+894 => x"70840558",
+895 => x"08757084",
+896 => x"05570c76",
+897 => x"70840558",
+898 => x"08757084",
+899 => x"05570c76",
+900 => x"70840558",
+901 => x"08775e75",
+902 => x"70840557",
+903 => x"0c747d70",
+904 => x"84055f08",
+905 => x"71708405",
+906 => x"530c7d08",
+907 => x"710c5f7b",
+908 => x"5261518e",
+909 => x"943f6151",
+910 => x"a4f33f79",
+911 => x"800c933d",
+912 => x"0d047d52",
+913 => x"61519690",
+914 => x"3f800880",
+915 => x"0c933d0d",
+916 => x"04841608",
+917 => x"55fbc939",
+918 => x"77537b52",
+919 => x"800851a2",
+920 => x"a53f7b52",
+921 => x"61518de1",
+922 => x"3fcc398c",
+923 => x"16088817",
+924 => x"08718c12",
+925 => x"0c88120c",
+926 => x"5d8c1708",
+927 => x"88180871",
+928 => x"8c120c88",
+929 => x"120c5977",
+930 => x"59fbef39",
+931 => x"7818901c",
+932 => x"40557e75",
+933 => x"24fb9c38",
+934 => x"7a177080",
+935 => x"d7a80b88",
+936 => x"050c757c",
+937 => x"31810784",
+938 => x"120c5684",
+939 => x"17088106",
+940 => x"7b078418",
+941 => x"0c6151a3",
+942 => x"f43f8817",
+943 => x"54fce139",
+944 => x"74181990",
+945 => x"1c5e5a7c",
+946 => x"7a24fb8f",
+947 => x"388c1708",
+948 => x"88180871",
+949 => x"8c120c88",
+950 => x"120c5e88",
+951 => x"1761fc05",
+952 => x"575975a4",
+953 => x"2681b638",
+954 => x"7b795955",
+955 => x"93762780",
+956 => x"c9387b70",
+957 => x"84055d08",
+958 => x"7c56790c",
+959 => x"74708405",
+960 => x"56088c18",
+961 => x"0c901758",
+962 => x"9b7627ae",
+963 => x"38747084",
+964 => x"05560878",
+965 => x"0c747084",
+966 => x"05560894",
+967 => x"180c9817",
+968 => x"58a37627",
+969 => x"95387470",
+970 => x"84055608",
+971 => x"780c7470",
+972 => x"84055608",
+973 => x"9c180ca0",
+974 => x"17587470",
+975 => x"84055608",
+976 => x"75417870",
+977 => x"84055a0c",
+978 => x"77607084",
+979 => x"05420871",
+980 => x"70840553",
+981 => x"0c600871",
+982 => x"0c5e7a17",
+983 => x"7080d7a8",
+984 => x"0b88050c",
+985 => x"7a7c3181",
+986 => x"0784120c",
+987 => x"58841708",
+988 => x"81067b07",
+989 => x"84180c61",
+990 => x"51a2b23f",
+991 => x"78547380",
+992 => x"0c933d0d",
+993 => x"0479537b",
+994 => x"5275519f",
+995 => x"f93ffae9",
+996 => x"39841508",
+997 => x"fc061960",
+998 => x"5859fadd",
+999 => x"3975537b",
+1000 => x"5278519f",
+1001 => x"e13f7a17",
+1002 => x"7080d7a8",
+1003 => x"0b88050c",
+1004 => x"7a7c3181",
+1005 => x"0784120c",
+1006 => x"58841708",
+1007 => x"81067b07",
+1008 => x"84180c61",
+1009 => x"51a1e63f",
+1010 => x"7854ffb2",
+1011 => x"39fa3d0d",
+1012 => x"7880cfec",
+1013 => x"085455b8",
+1014 => x"1308802e",
+1015 => x"81af388c",
+1016 => x"15227083",
+1017 => x"ffff0670",
+1018 => x"832a8132",
+1019 => x"81065555",
+1020 => x"5672802e",
+1021 => x"80da3873",
+1022 => x"842a8132",
+1023 => x"810657ff",
+1024 => x"537680f2",
+1025 => x"3873822a",
+1026 => x"81065473",
+1027 => x"802eb938",
+1028 => x"b0150854",
+1029 => x"73802e9c",
+1030 => x"3880c015",
+1031 => x"5373732e",
+1032 => x"8f387352",
+1033 => x"80cfec08",
+1034 => x"518a9e3f",
+1035 => x"8c152256",
+1036 => x"76b0160c",
+1037 => x"75db0657",
+1038 => x"768c1623",
+1039 => x"800b8416",
+1040 => x"0c901508",
+1041 => x"750c7656",
+1042 => x"75880754",
+1043 => x"738c1623",
+1044 => x"90150880",
+1045 => x"2ebf388c",
+1046 => x"15227081",
+1047 => x"06555373",
+1048 => x"9c38720a",
+1049 => x"100a8106",
+1050 => x"56758538",
+1051 => x"94150854",
+1052 => x"7388160c",
+1053 => x"80537280",
+1054 => x"0c883d0d",
+1055 => x"04800b88",
+1056 => x"160c9415",
+1057 => x"08309816",
+1058 => x"0c8053ea",
+1059 => x"39725182",
+1060 => x"a63ffecb",
+1061 => x"3974518f",
+1062 => x"bc3f8c15",
+1063 => x"22708106",
+1064 => x"55537380",
+1065 => x"2effbb38",
+1066 => x"d439f83d",
+1067 => x"0d7a5776",
+1068 => x"802e8197",
+1069 => x"3880cfec",
+1070 => x"0854b814",
+1071 => x"08802e80",
+1072 => x"eb388c17",
+1073 => x"2270902b",
+1074 => x"70902c70",
+1075 => x"832a8132",
+1076 => x"81065b5b",
+1077 => x"57557780",
+1078 => x"cb389017",
+1079 => x"08567580",
+1080 => x"2e80c138",
+1081 => x"76087631",
+1082 => x"76780c79",
+1083 => x"83065555",
+1084 => x"73853894",
+1085 => x"17085877",
+1086 => x"88180c80",
+1087 => x"7525a538",
+1088 => x"74537552",
+1089 => x"9c170851",
+1090 => x"a4170854",
+1091 => x"732d800b",
+1092 => x"80082580",
+1093 => x"c9388008",
+1094 => x"16758008",
+1095 => x"31565674",
+1096 => x"8024dd38",
+1097 => x"800b800c",
+1098 => x"8a3d0d04",
+1099 => x"73518187",
+1100 => x"3f8c1722",
+1101 => x"70902b70",
+1102 => x"902c7083",
+1103 => x"2a813281",
+1104 => x"065b5b57",
+1105 => x"5577dd38",
+1106 => x"ff9039a1",
+1107 => x"aa5280cf",
+1108 => x"ec08518c",
+1109 => x"d03f8008",
+1110 => x"800c8a3d",
+1111 => x"0d048c17",
+1112 => x"2280c007",
+1113 => x"58778c18",
+1114 => x"23ff0b80",
+1115 => x"0c8a3d0d",
+1116 => x"04fa3d0d",
+1117 => x"797080dc",
+1118 => x"298c1154",
+1119 => x"7a535657",
+1120 => x"8fd63f80",
+1121 => x"08800855",
+1122 => x"56800880",
+1123 => x"2ea23880",
+1124 => x"088c0554",
+1125 => x"800b8008",
+1126 => x"0c768008",
+1127 => x"84050c73",
+1128 => x"80088805",
+1129 => x"0c745380",
+1130 => x"5273519c",
+1131 => x"f53f7554",
+1132 => x"73800c88",
+1133 => x"3d0d0470",
+1134 => x"707074a8",
+1135 => x"f60bbc12",
+1136 => x"0c53810b",
+1137 => x"b8140c80",
+1138 => x"0b84dc14",
+1139 => x"0c830b84",
+1140 => x"e0140c84",
+1141 => x"e81384e4",
+1142 => x"140c8413",
+1143 => x"08518070",
+1144 => x"720c7084",
+1145 => x"130c7088",
+1146 => x"130c5284",
+1147 => x"0b8c1223",
+1148 => x"718e1223",
+1149 => x"7190120c",
+1150 => x"7194120c",
+1151 => x"7198120c",
+1152 => x"709c120c",
+1153 => x"80c1e50b",
+1154 => x"a0120c80",
+1155 => x"c2b10ba4",
+1156 => x"120c80c3",
+1157 => x"ad0ba812",
+1158 => x"0c80c3fe",
+1159 => x"0bac120c",
+1160 => x"88130872",
+1161 => x"710c7284",
+1162 => x"120c7288",
+1163 => x"120c5189",
+1164 => x"0b8c1223",
+1165 => x"810b8e12",
+1166 => x"23719012",
+1167 => x"0c719412",
+1168 => x"0c719812",
+1169 => x"0c709c12",
+1170 => x"0c80c1e5",
+1171 => x"0ba0120c",
+1172 => x"80c2b10b",
+1173 => x"a4120c80",
+1174 => x"c3ad0ba8",
+1175 => x"120c80c3",
+1176 => x"fe0bac12",
+1177 => x"0c8c1308",
+1178 => x"72710c72",
+1179 => x"84120c72",
+1180 => x"88120c51",
+1181 => x"8a0b8c12",
+1182 => x"23820b8e",
+1183 => x"12237190",
+1184 => x"120c7194",
+1185 => x"120c7198",
+1186 => x"120c709c",
+1187 => x"120c80c1",
+1188 => x"e50ba012",
+1189 => x"0c80c2b1",
+1190 => x"0ba4120c",
+1191 => x"80c3ad0b",
+1192 => x"a8120c80",
+1193 => x"c3fe0bac",
+1194 => x"120c5050",
+1195 => x"5004f83d",
+1196 => x"0d7a80cf",
+1197 => x"ec08b811",
+1198 => x"08575758",
+1199 => x"7481ec38",
+1200 => x"a8f60bbc",
+1201 => x"170c810b",
+1202 => x"b8170c74",
+1203 => x"84dc170c",
+1204 => x"830b84e0",
+1205 => x"170c84e8",
+1206 => x"1684e417",
+1207 => x"0c841608",
+1208 => x"75710c75",
+1209 => x"84120c75",
+1210 => x"88120c59",
+1211 => x"840b8c1a",
+1212 => x"23748e1a",
+1213 => x"2374901a",
+1214 => x"0c74941a",
+1215 => x"0c74981a",
+1216 => x"0c789c1a",
+1217 => x"0c80c1e5",
+1218 => x"0ba01a0c",
+1219 => x"80c2b10b",
+1220 => x"a41a0c80",
+1221 => x"c3ad0ba8",
+1222 => x"1a0c80c3",
+1223 => x"fe0bac1a",
+1224 => x"0c881608",
+1225 => x"75710c75",
+1226 => x"84120c75",
+1227 => x"88120c57",
+1228 => x"890b8c18",
+1229 => x"23810b8e",
+1230 => x"18237490",
+1231 => x"180c7494",
+1232 => x"180c7498",
+1233 => x"180c769c",
+1234 => x"180c80c1",
+1235 => x"e50ba018",
+1236 => x"0c80c2b1",
+1237 => x"0ba4180c",
+1238 => x"80c3ad0b",
+1239 => x"a8180c80",
+1240 => x"c3fe0bac",
+1241 => x"180c8c16",
+1242 => x"0875710c",
+1243 => x"7584120c",
+1244 => x"7588120c",
+1245 => x"548a0b8c",
+1246 => x"1523820b",
+1247 => x"8e152374",
+1248 => x"90150c74",
+1249 => x"94150c74",
+1250 => x"98150c73",
+1251 => x"9c150c80",
+1252 => x"c1e50ba0",
+1253 => x"150c80c2",
+1254 => x"b10ba415",
+1255 => x"0c80c3ad",
+1256 => x"0ba8150c",
+1257 => x"80c3fe0b",
+1258 => x"ac150c84",
+1259 => x"dc168811",
+1260 => x"08841208",
+1261 => x"ff055757",
+1262 => x"57807524",
+1263 => x"9f388c16",
+1264 => x"2270902b",
+1265 => x"70902c51",
+1266 => x"55597380",
+1267 => x"2e80ed38",
+1268 => x"80dc16ff",
+1269 => x"16565674",
+1270 => x"8025e338",
+1271 => x"76085574",
+1272 => x"802e8f38",
+1273 => x"74881108",
+1274 => x"841208ff",
+1275 => x"05575757",
+1276 => x"c83982fc",
+1277 => x"5277518a",
+1278 => x"df3f8008",
+1279 => x"80085556",
+1280 => x"8008802e",
+1281 => x"a3388008",
+1282 => x"8c057580",
+1283 => x"080c5484",
+1284 => x"0b800884",
+1285 => x"050c7380",
+1286 => x"0888050c",
+1287 => x"82f05374",
+1288 => x"52735197",
+1289 => x"fd3f7554",
+1290 => x"7374780c",
+1291 => x"5573ffb4",
+1292 => x"388c780c",
+1293 => x"800b800c",
+1294 => x"8a3d0d04",
+1295 => x"810b8c17",
+1296 => x"2373760c",
+1297 => x"7388170c",
+1298 => x"7384170c",
+1299 => x"7390170c",
+1300 => x"7394170c",
+1301 => x"7398170c",
+1302 => x"ff0b8e17",
+1303 => x"2373b017",
+1304 => x"0c73b417",
+1305 => x"0c7380c4",
+1306 => x"170c7380",
+1307 => x"c8170c75",
+1308 => x"800c8a3d",
+1309 => x"0d047070",
+1310 => x"a1aa5273",
+1311 => x"5186a63f",
+1312 => x"50500470",
+1313 => x"70a1aa52",
+1314 => x"80cfec08",
+1315 => x"5186963f",
+1316 => x"505004fb",
+1317 => x"3d0d7770",
+1318 => x"52569890",
+1319 => x"3f80d7a8",
+1320 => x"0b880508",
+1321 => x"841108fc",
+1322 => x"06707b31",
+1323 => x"9fef05e0",
+1324 => x"8006e080",
+1325 => x"05525555",
+1326 => x"a0807524",
+1327 => x"94388052",
+1328 => x"755197ea",
+1329 => x"3f80d7b0",
+1330 => x"08145372",
+1331 => x"80082e8f",
+1332 => x"38755197",
+1333 => x"d83f8053",
+1334 => x"72800c87",
+1335 => x"3d0d0474",
+1336 => x"30527551",
+1337 => x"97c83f80",
+1338 => x"08ff2ea8",
+1339 => x"3880d7a8",
+1340 => x"0b880508",
+1341 => x"74763181",
+1342 => x"0784120c",
+1343 => x"5380d6ec",
+1344 => x"08753180",
+1345 => x"d6ec0c75",
+1346 => x"5197a23f",
+1347 => x"810b800c",
+1348 => x"873d0d04",
+1349 => x"80527551",
+1350 => x"97943f80",
+1351 => x"d7a80b88",
+1352 => x"05088008",
+1353 => x"71315454",
+1354 => x"8f7325ff",
+1355 => x"a4388008",
+1356 => x"80d79c08",
+1357 => x"3180d6ec",
+1358 => x"0c728107",
+1359 => x"84150c75",
+1360 => x"5196ea3f",
+1361 => x"8053ff90",
+1362 => x"39f73d0d",
+1363 => x"7b7d545a",
+1364 => x"72802e82",
+1365 => x"83387951",
+1366 => x"96d23ff8",
+1367 => x"13841108",
+1368 => x"70fe0670",
+1369 => x"13841108",
+1370 => x"fc065c57",
+1371 => x"58545780",
+1372 => x"d7b00874",
+1373 => x"2e82de38",
+1374 => x"7784150c",
+1375 => x"80738106",
+1376 => x"56597479",
+1377 => x"2e81d538",
+1378 => x"77148411",
+1379 => x"08810656",
+1380 => x"5374a038",
+1381 => x"77165678",
+1382 => x"81e63888",
+1383 => x"14085574",
+1384 => x"80d7b02e",
+1385 => x"82f9388c",
+1386 => x"1408708c",
+1387 => x"170c7588",
+1388 => x"120c5875",
+1389 => x"81078418",
+1390 => x"0c751776",
+1391 => x"710c5478",
+1392 => x"81913883",
+1393 => x"ff762781",
+1394 => x"c8387589",
+1395 => x"2a76832a",
+1396 => x"54547380",
+1397 => x"2ebf3875",
+1398 => x"862ab805",
+1399 => x"53847427",
+1400 => x"b43880db",
+1401 => x"14539474",
+1402 => x"27ab3875",
+1403 => x"8c2a80ee",
+1404 => x"055380d4",
+1405 => x"74279e38",
+1406 => x"758f2a80",
+1407 => x"f7055382",
+1408 => x"d4742791",
+1409 => x"3875922a",
+1410 => x"80fc0553",
+1411 => x"8ad47427",
+1412 => x"843880fe",
+1413 => x"53721010",
+1414 => x"1080d7a8",
+1415 => x"05881108",
+1416 => x"55557375",
+1417 => x"2e82bf38",
+1418 => x"841408fc",
+1419 => x"06597579",
+1420 => x"278d3888",
+1421 => x"14085473",
+1422 => x"752e0981",
+1423 => x"06ea388c",
+1424 => x"1408708c",
+1425 => x"190c7488",
+1426 => x"190c7788",
+1427 => x"120c5576",
+1428 => x"8c150c79",
+1429 => x"5194d63f",
+1430 => x"8b3d0d04",
+1431 => x"76087771",
+1432 => x"31587605",
+1433 => x"88180856",
+1434 => x"567480d7",
+1435 => x"b02e80e0",
+1436 => x"388c1708",
+1437 => x"708c170c",
+1438 => x"7588120c",
+1439 => x"53fe8939",
+1440 => x"8814088c",
+1441 => x"1508708c",
+1442 => x"130c5988",
+1443 => x"190cfea3",
+1444 => x"3975832a",
+1445 => x"70545480",
+1446 => x"74248198",
+1447 => x"3872822c",
+1448 => x"81712b80",
+1449 => x"d7ac0807",
+1450 => x"80d7a80b",
+1451 => x"84050c74",
+1452 => x"10101080",
+1453 => x"d7a80588",
+1454 => x"1108718c",
+1455 => x"1b0c7088",
+1456 => x"1b0c7988",
+1457 => x"130c565a",
+1458 => x"55768c15",
+1459 => x"0cff8439",
+1460 => x"8159fdb4",
+1461 => x"39771673",
+1462 => x"81065455",
+1463 => x"72983876",
+1464 => x"08777131",
+1465 => x"5875058c",
+1466 => x"18088819",
+1467 => x"08718c12",
+1468 => x"0c88120c",
+1469 => x"55557481",
+1470 => x"0784180c",
+1471 => x"7680d7a8",
+1472 => x"0b88050c",
+1473 => x"80d7a408",
+1474 => x"7526fec7",
+1475 => x"3880d7a0",
+1476 => x"08527951",
+1477 => x"fafd3f79",
+1478 => x"5193923f",
+1479 => x"feba3981",
+1480 => x"778c170c",
+1481 => x"7788170c",
+1482 => x"758c190c",
+1483 => x"7588190c",
+1484 => x"59fd8039",
+1485 => x"83147082",
+1486 => x"2c81712b",
+1487 => x"80d7ac08",
+1488 => x"0780d7a8",
+1489 => x"0b84050c",
+1490 => x"75101010",
+1491 => x"80d7a805",
+1492 => x"88110871",
+1493 => x"8c1c0c70",
+1494 => x"881c0c7a",
+1495 => x"88130c57",
+1496 => x"5b5653fe",
+1497 => x"e4398073",
+1498 => x"24a33872",
+1499 => x"822c8171",
+1500 => x"2b80d7ac",
+1501 => x"080780d7",
+1502 => x"a80b8405",
+1503 => x"0c58748c",
+1504 => x"180c7388",
+1505 => x"180c7688",
+1506 => x"160cfdc3",
+1507 => x"39831370",
+1508 => x"822c8171",
+1509 => x"2b80d7ac",
+1510 => x"080780d7",
+1511 => x"a80b8405",
+1512 => x"0c5953da",
+1513 => x"39f93d0d",
+1514 => x"797b5853",
+1515 => x"800b80cf",
+1516 => x"ec085356",
+1517 => x"72722ebc",
+1518 => x"3884dc13",
+1519 => x"5574762e",
+1520 => x"b3388815",
+1521 => x"08841608",
+1522 => x"ff055454",
+1523 => x"80732499",
+1524 => x"388c1422",
+1525 => x"70902b53",
+1526 => x"587180d4",
+1527 => x"3880dc14",
+1528 => x"ff145454",
+1529 => x"728025e9",
+1530 => x"38740855",
+1531 => x"74d43880",
+1532 => x"cfec0852",
+1533 => x"84dc1255",
+1534 => x"74802ead",
+1535 => x"38881508",
+1536 => x"841608ff",
+1537 => x"05545480",
+1538 => x"73249838",
+1539 => x"8c142270",
+1540 => x"902b5358",
+1541 => x"71ad3880",
+1542 => x"dc14ff14",
+1543 => x"54547280",
+1544 => x"25ea3874",
+1545 => x"085574d5",
+1546 => x"3875800c",
+1547 => x"893d0d04",
+1548 => x"7351762d",
+1549 => x"75800807",
+1550 => x"80dc15ff",
+1551 => x"15555556",
+1552 => x"ffa23973",
+1553 => x"51762d75",
+1554 => x"80080780",
+1555 => x"dc15ff15",
+1556 => x"555556ca",
+1557 => x"39ea3d0d",
+1558 => x"688c1122",
+1559 => x"700a100a",
+1560 => x"81065758",
+1561 => x"567480e4",
+1562 => x"388e1622",
+1563 => x"70902b70",
+1564 => x"902c5155",
+1565 => x"58807424",
+1566 => x"b138983d",
+1567 => x"c4055373",
+1568 => x"5280cfec",
+1569 => x"08519481",
+1570 => x"3f800b80",
+1571 => x"08249738",
+1572 => x"7983e080",
+1573 => x"06547380",
+1574 => x"c0802e81",
+1575 => x"8f387382",
+1576 => x"80802e81",
+1577 => x"91388c16",
+1578 => x"22577690",
+1579 => x"80075473",
+1580 => x"8c172388",
+1581 => x"805280cf",
+1582 => x"ec085181",
+1583 => x"9b3f8008",
+1584 => x"9d388c16",
+1585 => x"22820755",
+1586 => x"748c1723",
+1587 => x"80c31670",
+1588 => x"770c9017",
+1589 => x"0c810b94",
+1590 => x"170c983d",
+1591 => x"0d0480cf",
+1592 => x"ec08a8f6",
+1593 => x"0bbc120c",
+1594 => x"588c1622",
+1595 => x"81800754",
+1596 => x"738c1723",
+1597 => x"8008760c",
+1598 => x"80089017",
+1599 => x"0c88800b",
+1600 => x"94170c74",
+1601 => x"802ed338",
+1602 => x"8e162270",
+1603 => x"902b7090",
+1604 => x"2c535654",
+1605 => x"9afb3f80",
+1606 => x"08802eff",
+1607 => x"bd388c16",
+1608 => x"22810757",
+1609 => x"768c1723",
+1610 => x"983d0d04",
+1611 => x"810b8c17",
+1612 => x"225855fe",
+1613 => x"f539a816",
+1614 => x"0880c3ad",
+1615 => x"2e098106",
+1616 => x"fee4388c",
+1617 => x"16228880",
+1618 => x"0754738c",
+1619 => x"17238880",
+1620 => x"0b80cc17",
+1621 => x"0cfedc39",
+1622 => x"f43d0d7e",
+1623 => x"608b1170",
+1624 => x"f8065b55",
+1625 => x"555d7296",
+1626 => x"26833890",
+1627 => x"58807824",
+1628 => x"74792607",
+1629 => x"55805474",
+1630 => x"742e0981",
+1631 => x"0680ca38",
+1632 => x"7c518ea8",
+1633 => x"3f7783f7",
+1634 => x"2680c538",
+1635 => x"77832a70",
+1636 => x"10101080",
+1637 => x"d7a8058c",
+1638 => x"11085858",
+1639 => x"5475772e",
+1640 => x"81f03884",
+1641 => x"1608fc06",
+1642 => x"8c170888",
+1643 => x"1808718c",
+1644 => x"120c8812",
+1645 => x"0c5b7605",
+1646 => x"84110881",
+1647 => x"0784120c",
+1648 => x"537c518d",
+1649 => x"e83f8816",
+1650 => x"5473800c",
+1651 => x"8e3d0d04",
+1652 => x"77892a78",
+1653 => x"832a5854",
+1654 => x"73802ebf",
+1655 => x"3877862a",
+1656 => x"b8055784",
+1657 => x"7427b438",
+1658 => x"80db1457",
+1659 => x"947427ab",
+1660 => x"38778c2a",
+1661 => x"80ee0557",
+1662 => x"80d47427",
+1663 => x"9e38778f",
+1664 => x"2a80f705",
+1665 => x"5782d474",
+1666 => x"27913877",
+1667 => x"922a80fc",
+1668 => x"05578ad4",
+1669 => x"74278438",
+1670 => x"80fe5776",
+1671 => x"10101080",
+1672 => x"d7a8058c",
+1673 => x"11085653",
+1674 => x"74732ea3",
+1675 => x"38841508",
+1676 => x"fc067079",
+1677 => x"31555673",
+1678 => x"8f2488e4",
+1679 => x"38738025",
+1680 => x"88e6388c",
+1681 => x"15085574",
+1682 => x"732e0981",
+1683 => x"06df3881",
+1684 => x"175980d7",
+1685 => x"b8085675",
+1686 => x"80d7b02e",
+1687 => x"82cc3884",
+1688 => x"1608fc06",
+1689 => x"70793155",
+1690 => x"55738f24",
+1691 => x"bb3880d7",
+1692 => x"b00b80d7",
+1693 => x"bc0c80d7",
+1694 => x"b00b80d7",
+1695 => x"b80c8074",
+1696 => x"2480db38",
+1697 => x"74168411",
+1698 => x"08810784",
+1699 => x"120c53fe",
+1700 => x"b0398816",
+1701 => x"8c110857",
+1702 => x"5975792e",
+1703 => x"098106fe",
+1704 => x"82388214",
+1705 => x"59ffab39",
+1706 => x"77167881",
+1707 => x"0784180c",
+1708 => x"7080d7bc",
+1709 => x"0c7080d7",
+1710 => x"b80c80d7",
+1711 => x"b00b8c12",
+1712 => x"0c8c1108",
+1713 => x"88120c74",
+1714 => x"81078412",
+1715 => x"0c740574",
+1716 => x"710c5b7c",
+1717 => x"518bd63f",
+1718 => x"881654fd",
+1719 => x"ec3983ff",
+1720 => x"75278391",
+1721 => x"3874892a",
+1722 => x"75832a54",
+1723 => x"5473802e",
+1724 => x"bf387486",
+1725 => x"2ab80553",
+1726 => x"847427b4",
+1727 => x"3880db14",
+1728 => x"53947427",
+1729 => x"ab38748c",
+1730 => x"2a80ee05",
+1731 => x"5380d474",
+1732 => x"279e3874",
+1733 => x"8f2a80f7",
+1734 => x"055382d4",
+1735 => x"74279138",
+1736 => x"74922a80",
+1737 => x"fc05538a",
+1738 => x"d4742784",
+1739 => x"3880fe53",
+1740 => x"72101010",
+1741 => x"80d7a805",
+1742 => x"88110855",
+1743 => x"5773772e",
+1744 => x"868b3884",
+1745 => x"1408fc06",
+1746 => x"5b747b27",
+1747 => x"8d388814",
+1748 => x"08547377",
+1749 => x"2e098106",
+1750 => x"ea388c14",
+1751 => x"0880d7a8",
+1752 => x"0b840508",
+1753 => x"718c190c",
+1754 => x"7588190c",
+1755 => x"7788130c",
+1756 => x"5c57758c",
+1757 => x"150c7853",
+1758 => x"80792483",
+1759 => x"98387282",
+1760 => x"2c81712b",
+1761 => x"5656747b",
+1762 => x"2680ca38",
+1763 => x"7a750657",
+1764 => x"7682a338",
+1765 => x"78fc0684",
+1766 => x"05597410",
+1767 => x"707c0655",
+1768 => x"55738292",
+1769 => x"38841959",
+1770 => x"f13980d7",
+1771 => x"a80b8405",
+1772 => x"0879545b",
+1773 => x"788025c6",
+1774 => x"3882da39",
+1775 => x"74097b06",
+1776 => x"7080d7a8",
+1777 => x"0b84050c",
+1778 => x"5b741055",
+1779 => x"747b2685",
+1780 => x"387485bc",
+1781 => x"3880d7a8",
+1782 => x"0b880508",
+1783 => x"70841208",
+1784 => x"fc06707b",
+1785 => x"317b7226",
+1786 => x"8f722507",
+1787 => x"5d575c5c",
+1788 => x"5578802e",
+1789 => x"80d93879",
+1790 => x"1580d7a0",
+1791 => x"08199011",
+1792 => x"59545680",
+1793 => x"d79c08ff",
+1794 => x"2e8838a0",
+1795 => x"8f13e080",
+1796 => x"06577652",
+1797 => x"7c518996",
+1798 => x"3f800854",
+1799 => x"8008ff2e",
+1800 => x"90388008",
+1801 => x"762782a7",
+1802 => x"387480d7",
+1803 => x"a82e829f",
+1804 => x"3880d7a8",
+1805 => x"0b880508",
+1806 => x"55841508",
+1807 => x"fc067079",
+1808 => x"31797226",
+1809 => x"8f722507",
+1810 => x"5d555a7a",
+1811 => x"83f23877",
+1812 => x"81078416",
+1813 => x"0c771570",
+1814 => x"80d7a80b",
+1815 => x"88050c74",
+1816 => x"81078412",
+1817 => x"0c567c51",
+1818 => x"88c33f88",
+1819 => x"15547380",
+1820 => x"0c8e3d0d",
+1821 => x"0474832a",
+1822 => x"70545480",
+1823 => x"7424819b",
+1824 => x"3872822c",
+1825 => x"81712b80",
+1826 => x"d7ac0807",
+1827 => x"7080d7a8",
+1828 => x"0b84050c",
+1829 => x"75101010",
+1830 => x"80d7a805",
+1831 => x"88110871",
+1832 => x"8c1b0c70",
+1833 => x"881b0c79",
+1834 => x"88130c57",
+1835 => x"555c5575",
+1836 => x"8c150cfd",
+1837 => x"c1397879",
+1838 => x"10101080",
+1839 => x"d7a80570",
+1840 => x"565b5c8c",
+1841 => x"14085675",
+1842 => x"742ea338",
+1843 => x"841608fc",
+1844 => x"06707931",
+1845 => x"5853768f",
+1846 => x"2483f138",
+1847 => x"76802584",
+1848 => x"af388c16",
+1849 => x"08567574",
+1850 => x"2e098106",
+1851 => x"df388814",
+1852 => x"811a7083",
+1853 => x"06555a54",
+1854 => x"72c9387b",
+1855 => x"83065675",
+1856 => x"802efdb8",
+1857 => x"38ff1cf8",
+1858 => x"1b5b5c88",
+1859 => x"1a087a2e",
+1860 => x"ea38fdb5",
+1861 => x"39831953",
+1862 => x"fce43983",
+1863 => x"1470822c",
+1864 => x"81712b80",
+1865 => x"d7ac0807",
+1866 => x"7080d7a8",
+1867 => x"0b84050c",
+1868 => x"76101010",
+1869 => x"80d7a805",
+1870 => x"88110871",
+1871 => x"8c1c0c70",
+1872 => x"881c0c7a",
+1873 => x"88130c58",
+1874 => x"535d5653",
+1875 => x"fee13980",
+1876 => x"d6ec0817",
+1877 => x"59800876",
+1878 => x"2e818b38",
+1879 => x"80d79c08",
+1880 => x"ff2e848e",
+1881 => x"38737631",
+1882 => x"1980d6ec",
+1883 => x"0c738706",
+1884 => x"70565372",
+1885 => x"802e8838",
+1886 => x"88733170",
+1887 => x"15555576",
+1888 => x"149fff06",
+1889 => x"a0807131",
+1890 => x"1670547e",
+1891 => x"53515386",
+1892 => x"9d3f8008",
+1893 => x"568008ff",
+1894 => x"2e819e38",
+1895 => x"80d6ec08",
+1896 => x"137080d6",
+1897 => x"ec0c7475",
+1898 => x"80d7a80b",
+1899 => x"88050c77",
+1900 => x"76311581",
+1901 => x"07555659",
+1902 => x"7a80d7a8",
+1903 => x"2e83c038",
+1904 => x"798f2682",
+1905 => x"ef38810b",
+1906 => x"84150c84",
+1907 => x"1508fc06",
+1908 => x"70793179",
+1909 => x"72268f72",
+1910 => x"25075d55",
+1911 => x"5a7a802e",
+1912 => x"fced3880",
+1913 => x"db398008",
+1914 => x"9fff0655",
+1915 => x"74feed38",
+1916 => x"7880d6ec",
+1917 => x"0c80d7a8",
+1918 => x"0b880508",
+1919 => x"7a188107",
+1920 => x"84120c55",
+1921 => x"80d79808",
+1922 => x"79278638",
+1923 => x"7880d798",
+1924 => x"0c80d794",
+1925 => x"087927fc",
+1926 => x"a0387880",
+1927 => x"d7940c84",
+1928 => x"1508fc06",
+1929 => x"70793179",
+1930 => x"72268f72",
+1931 => x"25075d55",
+1932 => x"5a7a802e",
+1933 => x"fc993888",
+1934 => x"39807457",
+1935 => x"53fedd39",
+1936 => x"7c5184e9",
+1937 => x"3f800b80",
+1938 => x"0c8e3d0d",
+1939 => x"04807324",
+1940 => x"a5387282",
+1941 => x"2c81712b",
+1942 => x"80d7ac08",
+1943 => x"077080d7",
+1944 => x"a80b8405",
+1945 => x"0c5c5a76",
+1946 => x"8c170c73",
+1947 => x"88170c75",
+1948 => x"88180cf9",
+1949 => x"fd398313",
+1950 => x"70822c81",
+1951 => x"712b80d7",
+1952 => x"ac080770",
+1953 => x"80d7a80b",
+1954 => x"84050c5d",
+1955 => x"5b53d839",
+1956 => x"7a75065c",
+1957 => x"7bfc9f38",
+1958 => x"84197510",
+1959 => x"5659f139",
+1960 => x"ff178105",
+1961 => x"59f7ab39",
+1962 => x"8c150888",
+1963 => x"1608718c",
+1964 => x"120c8812",
+1965 => x"0c597515",
+1966 => x"84110881",
+1967 => x"0784120c",
+1968 => x"587c5183",
+1969 => x"e83f8815",
+1970 => x"54fba339",
+1971 => x"77167881",
+1972 => x"0784180c",
+1973 => x"8c170888",
+1974 => x"1808718c",
+1975 => x"120c8812",
+1976 => x"0c5c7080",
+1977 => x"d7bc0c70",
+1978 => x"80d7b80c",
+1979 => x"80d7b00b",
+1980 => x"8c120c8c",
+1981 => x"11088812",
+1982 => x"0c778107",
+1983 => x"84120c77",
+1984 => x"0577710c",
+1985 => x"557c5183",
+1986 => x"a43f8816",
+1987 => x"54f5ba39",
+1988 => x"72168411",
+1989 => x"08810784",
+1990 => x"120c588c",
+1991 => x"16088817",
+1992 => x"08718c12",
+1993 => x"0c88120c",
+1994 => x"577c5183",
+1995 => x"803f8816",
+1996 => x"54f59639",
+1997 => x"7284150c",
+1998 => x"f41af806",
+1999 => x"70841d08",
+2000 => x"81060784",
+2001 => x"1d0c701c",
+2002 => x"5556850b",
+2003 => x"84150c85",
+2004 => x"0b88150c",
+2005 => x"8f7627fd",
+2006 => x"ab38881b",
+2007 => x"527c51eb",
+2008 => x"e83f80d7",
+2009 => x"a80b8805",
+2010 => x"0880d6ec",
+2011 => x"085a55fd",
+2012 => x"93397880",
+2013 => x"d6ec0c73",
+2014 => x"80d79c0c",
+2015 => x"fbef3972",
+2016 => x"84150cfc",
+2017 => x"ff39fb3d",
+2018 => x"0d77707a",
+2019 => x"7c585553",
+2020 => x"568f7527",
+2021 => x"80e63872",
+2022 => x"76078306",
+2023 => x"517080dc",
+2024 => x"38757352",
+2025 => x"54707084",
+2026 => x"05520874",
+2027 => x"70840556",
+2028 => x"0c737170",
+2029 => x"84055308",
+2030 => x"71708405",
+2031 => x"530c7170",
+2032 => x"84055308",
+2033 => x"71708405",
+2034 => x"530c7170",
+2035 => x"84055308",
+2036 => x"71708405",
+2037 => x"530cf016",
+2038 => x"5654748f",
+2039 => x"26c73883",
+2040 => x"75279538",
+2041 => x"70708405",
+2042 => x"52087470",
+2043 => x"8405560c",
+2044 => x"fc155574",
+2045 => x"8326ed38",
+2046 => x"73715452",
+2047 => x"ff155170",
+2048 => x"ff2e9838",
+2049 => x"72708105",
+2050 => x"54337270",
+2051 => x"81055434",
+2052 => x"ff115170",
+2053 => x"ff2e0981",
+2054 => x"06ea3875",
+2055 => x"800c873d",
+2056 => x"0d04fb3d",
+2057 => x"0d777a71",
+2058 => x"028c05a3",
+2059 => x"05335854",
+2060 => x"54568373",
+2061 => x"2780d438",
+2062 => x"75830651",
+2063 => x"7080cc38",
+2064 => x"74882b75",
+2065 => x"07707190",
+2066 => x"2b075551",
+2067 => x"8f7327a7",
+2068 => x"38737270",
+2069 => x"8405540c",
+2070 => x"71747170",
+2071 => x"8405530c",
+2072 => x"74717084",
+2073 => x"05530c74",
+2074 => x"71708405",
+2075 => x"530cf014",
+2076 => x"5452728f",
+2077 => x"26db3883",
+2078 => x"73279038",
+2079 => x"73727084",
+2080 => x"05540cfc",
+2081 => x"13537283",
+2082 => x"26f238ff",
+2083 => x"135170ff",
+2084 => x"2e933874",
+2085 => x"72708105",
+2086 => x"5434ff11",
+2087 => x"5170ff2e",
+2088 => x"098106ef",
+2089 => x"3875800c",
+2090 => x"873d0d04",
+2091 => x"04047070",
+2092 => x"7070800b",
+2093 => x"80dfe40c",
+2094 => x"765184f3",
+2095 => x"3f800853",
+2096 => x"8008ff2e",
+2097 => x"89387280",
+2098 => x"0c505050",
+2099 => x"500480df",
+2100 => x"e4085473",
+2101 => x"802eef38",
+2102 => x"7574710c",
+2103 => x"5272800c",
+2104 => x"50505050",
+2105 => x"04f93d0d",
+2106 => x"797c557b",
+2107 => x"548e1122",
+2108 => x"70902b70",
+2109 => x"902c5557",
+2110 => x"80cfec08",
+2111 => x"53585683",
+2112 => x"f63f8008",
+2113 => x"57800b80",
+2114 => x"08249338",
+2115 => x"80d01608",
+2116 => x"80080580",
+2117 => x"d0170c76",
+2118 => x"800c893d",
+2119 => x"0d048c16",
+2120 => x"2283dfff",
+2121 => x"0655748c",
+2122 => x"17237680",
+2123 => x"0c893d0d",
+2124 => x"04fa3d0d",
+2125 => x"788c1122",
+2126 => x"70882a70",
+2127 => x"81065157",
+2128 => x"585674a9",
+2129 => x"388c1622",
+2130 => x"83dfff06",
+2131 => x"55748c17",
+2132 => x"237a5479",
+2133 => x"538e1622",
+2134 => x"70902b70",
+2135 => x"902c5456",
+2136 => x"80cfec08",
+2137 => x"525681b2",
+2138 => x"3f883d0d",
+2139 => x"04825480",
+2140 => x"538e1622",
+2141 => x"70902b70",
+2142 => x"902c5456",
+2143 => x"80cfec08",
+2144 => x"525782bb",
+2145 => x"3f8c1622",
+2146 => x"83dfff06",
+2147 => x"55748c17",
+2148 => x"237a5479",
+2149 => x"538e1622",
+2150 => x"70902b70",
+2151 => x"902c5456",
+2152 => x"80cfec08",
+2153 => x"525680f2",
+2154 => x"3f883d0d",
+2155 => x"04f93d0d",
+2156 => x"797c557b",
+2157 => x"548e1122",
+2158 => x"70902b70",
+2159 => x"902c5557",
+2160 => x"80cfec08",
+2161 => x"53585681",
+2162 => x"f63f8008",
+2163 => x"578008ff",
+2164 => x"2e99388c",
+2165 => x"1622a080",
+2166 => x"0755748c",
+2167 => x"17238008",
+2168 => x"80d0170c",
+2169 => x"76800c89",
+2170 => x"3d0d048c",
+2171 => x"162283df",
+2172 => x"ff065574",
+2173 => x"8c172376",
+2174 => x"800c893d",
+2175 => x"0d047070",
+2176 => x"70748e11",
+2177 => x"2270902b",
+2178 => x"70902c55",
+2179 => x"51515380",
+2180 => x"cfec0851",
+2181 => x"bd3f5050",
+2182 => x"5004fb3d",
+2183 => x"0d800b80",
+2184 => x"dfe40c7a",
+2185 => x"53795278",
+2186 => x"5182fc3f",
+2187 => x"80085580",
+2188 => x"08ff2e88",
+2189 => x"3874800c",
+2190 => x"873d0d04",
+2191 => x"80dfe408",
+2192 => x"5675802e",
+2193 => x"f0387776",
+2194 => x"710c5474",
+2195 => x"800c873d",
+2196 => x"0d047070",
+2197 => x"7070800b",
+2198 => x"80dfe40c",
+2199 => x"765184c9",
+2200 => x"3f800853",
+2201 => x"8008ff2e",
+2202 => x"89387280",
+2203 => x"0c505050",
+2204 => x"500480df",
+2205 => x"e4085473",
+2206 => x"802eef38",
+2207 => x"7574710c",
+2208 => x"5272800c",
+2209 => x"50505050",
+2210 => x"04fc3d0d",
+2211 => x"800b80df",
+2212 => x"e40c7852",
+2213 => x"775187b0",
+2214 => x"3f800854",
+2215 => x"8008ff2e",
+2216 => x"88387380",
+2217 => x"0c863d0d",
+2218 => x"0480dfe4",
+2219 => x"08557480",
+2220 => x"2ef03876",
+2221 => x"75710c53",
+2222 => x"73800c86",
+2223 => x"3d0d04fb",
+2224 => x"3d0d800b",
+2225 => x"80dfe40c",
+2226 => x"7a537952",
+2227 => x"7851848b",
+2228 => x"3f800855",
+2229 => x"8008ff2e",
+2230 => x"88387480",
+2231 => x"0c873d0d",
+2232 => x"0480dfe4",
+2233 => x"08567580",
+2234 => x"2ef03877",
+2235 => x"76710c54",
+2236 => x"74800c87",
+2237 => x"3d0d04fb",
+2238 => x"3d0d800b",
+2239 => x"80dfe40c",
+2240 => x"7a537952",
+2241 => x"78518293",
+2242 => x"3f800855",
+2243 => x"8008ff2e",
+2244 => x"88387480",
+2245 => x"0c873d0d",
+2246 => x"0480dfe4",
+2247 => x"08567580",
+2248 => x"2ef03877",
+2249 => x"76710c54",
+2250 => x"74800c87",
+2251 => x"3d0d0470",
+2252 => x"707080df",
+2253 => x"d8088938",
+2254 => x"80dfe80b",
+2255 => x"80dfd80c",
+2256 => x"80dfd808",
+2257 => x"75115252",
+2258 => x"ff537087",
+2259 => x"fb808026",
+2260 => x"88387080",
+2261 => x"dfd80c71",
+2262 => x"5372800c",
+2263 => x"50505004",
+2264 => x"fd3d0d80",
+2265 => x"0b80cfe0",
+2266 => x"08545472",
+2267 => x"812e9b38",
+2268 => x"7380dfdc",
+2269 => x"0cc2af3f",
+2270 => x"c1863f80",
+2271 => x"dfb05281",
+2272 => x"51c3ff3f",
+2273 => x"80085186",
+2274 => x"bf3f7280",
+2275 => x"dfdc0cc2",
+2276 => x"953fc0ec",
+2277 => x"3f80dfb0",
+2278 => x"528151c3",
+2279 => x"e53f8008",
+2280 => x"5186a53f",
+2281 => x"00ff39f5",
+2282 => x"3d0d7e60",
+2283 => x"80dfdc08",
+2284 => x"705b585b",
+2285 => x"5b7580c2",
+2286 => x"38777a25",
+2287 => x"a138771b",
+2288 => x"70337081",
+2289 => x"ff065858",
+2290 => x"59758a2e",
+2291 => x"98387681",
+2292 => x"ff0651c1",
+2293 => x"b03f8118",
+2294 => x"58797824",
+2295 => x"e1387980",
+2296 => x"0c8d3d0d",
+2297 => x"048d51c1",
+2298 => x"9c3f7833",
+2299 => x"7081ff06",
+2300 => x"5257c191",
+2301 => x"3f811858",
+2302 => x"e0397955",
+2303 => x"7a547d53",
+2304 => x"85528d3d",
+2305 => x"fc0551c0",
+2306 => x"b93f8008",
+2307 => x"5685b23f",
+2308 => x"7b80080c",
+2309 => x"75800c8d",
+2310 => x"3d0d04f6",
+2311 => x"3d0d7d7f",
+2312 => x"80dfdc08",
+2313 => x"705b585a",
+2314 => x"5a7580c1",
+2315 => x"38777925",
+2316 => x"b338c0ac",
+2317 => x"3f800881",
+2318 => x"ff06708d",
+2319 => x"32703070",
+2320 => x"9f2a5151",
+2321 => x"5757768a",
+2322 => x"2e80c438",
+2323 => x"75802ebf",
+2324 => x"38771a56",
+2325 => x"76763476",
+2326 => x"51c0aa3f",
+2327 => x"81185878",
+2328 => x"7824cf38",
+2329 => x"77567580",
+2330 => x"0c8c3d0d",
+2331 => x"04785579",
+2332 => x"547c5384",
+2333 => x"528c3dfc",
+2334 => x"0551ffbf",
+2335 => x"c53f8008",
+2336 => x"5684be3f",
+2337 => x"7a80080c",
+2338 => x"75800c8c",
+2339 => x"3d0d0477",
+2340 => x"1a598a79",
+2341 => x"34811858",
+2342 => x"8d51ffbf",
+2343 => x"e83f8a51",
+2344 => x"ffbfe23f",
+2345 => x"7756ffbe",
+2346 => x"39fb3d0d",
+2347 => x"80dfdc08",
+2348 => x"70565473",
+2349 => x"88387480",
+2350 => x"0c873d0d",
+2351 => x"04775383",
+2352 => x"52873dfc",
+2353 => x"0551ffbe",
+2354 => x"f93f8008",
+2355 => x"5483f23f",
+2356 => x"7580080c",
+2357 => x"73800c87",
+2358 => x"3d0d04fa",
+2359 => x"3d0d80df",
+2360 => x"dc08802e",
+2361 => x"a3387a55",
+2362 => x"79547853",
+2363 => x"8652883d",
+2364 => x"fc0551ff",
+2365 => x"becc3f80",
+2366 => x"085683c5",
+2367 => x"3f768008",
+2368 => x"0c75800c",
+2369 => x"883d0d04",
+2370 => x"83b73f9d",
+2371 => x"0b80080c",
+2372 => x"ff0b800c",
+2373 => x"883d0d04",
+2374 => x"f73d0d7b",
+2375 => x"7d5b59bc",
+2376 => x"53805279",
+2377 => x"51f5fb3f",
+2378 => x"80705657",
+2379 => x"98567419",
+2380 => x"70337078",
+2381 => x"2b790781",
+2382 => x"18f81a5a",
+2383 => x"58595558",
+2384 => x"847524ea",
+2385 => x"38767a23",
+2386 => x"84195880",
+2387 => x"70565798",
+2388 => x"56741870",
+2389 => x"3370782b",
+2390 => x"79078118",
+2391 => x"f81a5a58",
+2392 => x"59515484",
+2393 => x"7524ea38",
+2394 => x"76821b23",
+2395 => x"88195880",
+2396 => x"70565798",
+2397 => x"56741870",
+2398 => x"3370782b",
+2399 => x"79078118",
+2400 => x"f81a5a58",
+2401 => x"59515484",
+2402 => x"7524ea38",
+2403 => x"76841b0c",
+2404 => x"8c195880",
+2405 => x"70565798",
+2406 => x"56741870",
+2407 => x"3370782b",
+2408 => x"79078118",
+2409 => x"f81a5a58",
+2410 => x"59515484",
+2411 => x"7524ea38",
+2412 => x"76881b23",
+2413 => x"90195880",
+2414 => x"70565798",
+2415 => x"56741870",
+2416 => x"3370782b",
+2417 => x"79078118",
+2418 => x"f81a5a58",
+2419 => x"59515484",
+2420 => x"7524ea38",
+2421 => x"768a1b23",
+2422 => x"94195880",
+2423 => x"70565798",
+2424 => x"56741870",
+2425 => x"3370782b",
+2426 => x"79078118",
+2427 => x"f81a5a58",
+2428 => x"59515484",
+2429 => x"7524ea38",
+2430 => x"768c1b23",
+2431 => x"98195880",
+2432 => x"70565798",
+2433 => x"56741870",
+2434 => x"3370782b",
+2435 => x"79078118",
+2436 => x"f81a5a58",
+2437 => x"59515484",
+2438 => x"7524ea38",
+2439 => x"768e1b23",
+2440 => x"9c195880",
+2441 => x"705657b8",
+2442 => x"56741870",
+2443 => x"3370782b",
+2444 => x"79078118",
+2445 => x"f81a5a58",
+2446 => x"595a5488",
+2447 => x"7524ea38",
+2448 => x"76901b0c",
+2449 => x"8b3d0d04",
+2450 => x"e93d0d6a",
+2451 => x"80dfdc08",
+2452 => x"57577593",
+2453 => x"3880c080",
+2454 => x"0b84180c",
+2455 => x"75ac180c",
+2456 => x"75800c99",
+2457 => x"3d0d0489",
+2458 => x"3d70556a",
+2459 => x"54558a52",
+2460 => x"993dffbc",
+2461 => x"0551ffbb",
+2462 => x"c93f8008",
+2463 => x"77537552",
+2464 => x"56fd953f",
+2465 => x"bc3f7780",
+2466 => x"080c7580",
+2467 => x"0c993d0d",
+2468 => x"04fc3d0d",
+2469 => x"815480df",
+2470 => x"dc088838",
+2471 => x"73800c86",
+2472 => x"3d0d0476",
+2473 => x"5397b952",
+2474 => x"863dfc05",
+2475 => x"51ffbb92",
+2476 => x"3f800854",
+2477 => x"8c3f7480",
+2478 => x"080c7380",
+2479 => x"0c863d0d",
+2480 => x"0480cfec",
+2481 => x"08800c04",
+2482 => x"f73d0d7b",
+2483 => x"80cfec08",
+2484 => x"82c81108",
+2485 => x"5a545a77",
+2486 => x"802e80da",
+2487 => x"38818818",
+2488 => x"841908ff",
+2489 => x"0581712b",
+2490 => x"59555980",
+2491 => x"742480ea",
+2492 => x"38807424",
+2493 => x"b5387382",
+2494 => x"2b781188",
+2495 => x"05565681",
+2496 => x"80190877",
+2497 => x"06537280",
+2498 => x"2eb63878",
+2499 => x"16700853",
+2500 => x"53795174",
+2501 => x"0853722d",
+2502 => x"ff14fc17",
+2503 => x"fc177981",
+2504 => x"2c5a5757",
+2505 => x"54738025",
+2506 => x"d6387708",
+2507 => x"5877ffad",
+2508 => x"3880cfec",
+2509 => x"0853bc13",
+2510 => x"08a53879",
+2511 => x"51f8e53f",
+2512 => x"74085372",
+2513 => x"2dff14fc",
+2514 => x"17fc1779",
+2515 => x"812c5a57",
+2516 => x"57547380",
+2517 => x"25ffa838",
+2518 => x"d1398057",
+2519 => x"ff933972",
+2520 => x"51bc1308",
+2521 => x"54732d79",
+2522 => x"51f8b93f",
+2523 => x"707080df",
+2524 => x"b80bfc05",
+2525 => x"70085252",
+2526 => x"70ff2e91",
+2527 => x"38702dfc",
+2528 => x"12700852",
+2529 => x"5270ff2e",
+2530 => x"098106f1",
+2531 => x"38505004",
+2532 => x"04ffbaff",
+2533 => x"3f040000",
+2534 => x"00000040",
+2535 => x"476f7420",
+2536 => x"696e7465",
+2537 => x"72727570",
+2538 => x"740a0000",
+2539 => x"4e6f2069",
+2540 => x"6e746572",
+2541 => x"72757074",
+2542 => x"0a000000",
+2543 => x"43000000",
+2544 => x"64756d6d",
+2545 => x"792e6578",
+2546 => x"65000000",
+2547 => x"00ffffff",
+2548 => x"ff00ffff",
+2549 => x"ffff00ff",
+2550 => x"ffffff00",
+2551 => x"00000000",
+2552 => x"00000000",
+2553 => x"00000000",
+2554 => x"00002fc0",
+2555 => x"000027f0",
+2556 => x"00000000",
+2557 => x"00002a58",
+2558 => x"00002ab4",
+2559 => x"00002b10",
+2560 => x"00000000",
+2561 => x"00000000",
+2562 => x"00000000",
+2563 => x"00000000",
+2564 => x"00000000",
+2565 => x"00000000",
+2566 => x"00000000",
+2567 => x"00000000",
+2568 => x"00000000",
+2569 => x"000027bc",
+2570 => x"00000000",
+2571 => x"00000000",
+2572 => x"00000000",
+2573 => x"00000000",
+2574 => x"00000000",
+2575 => x"00000000",
+2576 => x"00000000",
+2577 => x"00000000",
+2578 => x"00000000",
+2579 => x"00000000",
+2580 => x"00000000",
+2581 => x"00000000",
+2582 => x"00000000",
+2583 => x"00000000",
+2584 => x"00000000",
+2585 => x"00000000",
+2586 => x"00000000",
+2587 => x"00000000",
+2588 => x"00000000",
+2589 => x"00000000",
+2590 => x"00000000",
+2591 => x"00000000",
+2592 => x"00000000",
+2593 => x"00000000",
+2594 => x"00000000",
+2595 => x"00000000",
+2596 => x"00000000",
+2597 => x"00000000",
+2598 => x"00000001",
+2599 => x"330eabcd",
+2600 => x"1234e66d",
+2601 => x"deec0005",
+2602 => x"000b0000",
+2603 => x"00000000",
+2604 => x"00000000",
+2605 => x"00000000",
+2606 => x"00000000",
+2607 => x"00000000",
+2608 => x"00000000",
+2609 => x"00000000",
+2610 => x"00000000",
+2611 => x"00000000",
+2612 => x"00000000",
+2613 => x"00000000",
+2614 => x"00000000",
+2615 => x"00000000",
+2616 => x"00000000",
+2617 => x"00000000",
+2618 => x"00000000",
+2619 => x"00000000",
+2620 => x"00000000",
+2621 => x"00000000",
+2622 => x"00000000",
+2623 => x"00000000",
+2624 => x"00000000",
+2625 => x"00000000",
+2626 => x"00000000",
+2627 => x"00000000",
+2628 => x"00000000",
+2629 => x"00000000",
+2630 => x"00000000",
+2631 => x"00000000",
+2632 => x"00000000",
+2633 => x"00000000",
+2634 => x"00000000",
+2635 => x"00000000",
+2636 => x"00000000",
+2637 => x"00000000",
+2638 => x"00000000",
+2639 => x"00000000",
+2640 => x"00000000",
+2641 => x"00000000",
+2642 => x"00000000",
+2643 => x"00000000",
+2644 => x"00000000",
+2645 => x"00000000",
+2646 => x"00000000",
+2647 => x"00000000",
+2648 => x"00000000",
+2649 => x"00000000",
+2650 => x"00000000",
+2651 => x"00000000",
+2652 => x"00000000",
+2653 => x"00000000",
+2654 => x"00000000",
+2655 => x"00000000",
+2656 => x"00000000",
+2657 => x"00000000",
+2658 => x"00000000",
+2659 => x"00000000",
+2660 => x"00000000",
+2661 => x"00000000",
+2662 => x"00000000",
+2663 => x"00000000",
+2664 => x"00000000",
+2665 => x"00000000",
+2666 => x"00000000",
+2667 => x"00000000",
+2668 => x"00000000",
+2669 => x"00000000",
+2670 => x"00000000",
+2671 => x"00000000",
+2672 => x"00000000",
+2673 => x"00000000",
+2674 => x"00000000",
+2675 => x"00000000",
+2676 => x"00000000",
+2677 => x"00000000",
+2678 => x"00000000",
+2679 => x"00000000",
+2680 => x"00000000",
+2681 => x"00000000",
+2682 => x"00000000",
+2683 => x"00000000",
+2684 => x"00000000",
+2685 => x"00000000",
+2686 => x"00000000",
+2687 => x"00000000",
+2688 => x"00000000",
+2689 => x"00000000",
+2690 => x"00000000",
+2691 => x"00000000",
+2692 => x"00000000",
+2693 => x"00000000",
+2694 => x"00000000",
+2695 => x"00000000",
+2696 => x"00000000",
+2697 => x"00000000",
+2698 => x"00000000",
+2699 => x"00000000",
+2700 => x"00000000",
+2701 => x"00000000",
+2702 => x"00000000",
+2703 => x"00000000",
+2704 => x"00000000",
+2705 => x"00000000",
+2706 => x"00000000",
+2707 => x"00000000",
+2708 => x"00000000",
+2709 => x"00000000",
+2710 => x"00000000",
+2711 => x"00000000",
+2712 => x"00000000",
+2713 => x"00000000",
+2714 => x"00000000",
+2715 => x"00000000",
+2716 => x"00000000",
+2717 => x"00000000",
+2718 => x"00000000",
+2719 => x"00000000",
+2720 => x"00000000",
+2721 => x"00000000",
+2722 => x"00000000",
+2723 => x"00000000",
+2724 => x"00000000",
+2725 => x"00000000",
+2726 => x"00000000",
+2727 => x"00000000",
+2728 => x"00000000",
+2729 => x"00000000",
+2730 => x"00000000",
+2731 => x"00000000",
+2732 => x"00000000",
+2733 => x"00000000",
+2734 => x"00000000",
+2735 => x"00000000",
+2736 => x"00000000",
+2737 => x"00000000",
+2738 => x"00000000",
+2739 => x"00000000",
+2740 => x"00000000",
+2741 => x"00000000",
+2742 => x"00000000",
+2743 => x"00000000",
+2744 => x"00000000",
+2745 => x"00000000",
+2746 => x"00000000",
+2747 => x"00000000",
+2748 => x"00000000",
+2749 => x"00000000",
+2750 => x"00000000",
+2751 => x"00000000",
+2752 => x"00000000",
+2753 => x"00000000",
+2754 => x"00000000",
+2755 => x"00000000",
+2756 => x"00000000",
+2757 => x"00000000",
+2758 => x"00000000",
+2759 => x"00000000",
+2760 => x"00000000",
+2761 => x"00000000",
+2762 => x"00000000",
+2763 => x"00000000",
+2764 => x"00000000",
+2765 => x"00000000",
+2766 => x"00000000",
+2767 => x"00000000",
+2768 => x"00000000",
+2769 => x"00000000",
+2770 => x"00000000",
+2771 => x"00000000",
+2772 => x"00000000",
+2773 => x"00000000",
+2774 => x"00000000",
+2775 => x"00000000",
+2776 => x"00000000",
+2777 => x"00000000",
+2778 => x"00000000",
+2779 => x"00000000",
+2780 => x"00000000",
+2781 => x"00000000",
+2782 => x"00000000",
+2783 => x"00000000",
+2784 => x"00000000",
+2785 => x"00000000",
+2786 => x"00000000",
+2787 => x"00000000",
+2788 => x"00000000",
+2789 => x"00000000",
+2790 => x"00000000",
+2791 => x"ffffffff",
+2792 => x"00000000",
+2793 => x"00020000",
+2794 => x"00000000",
+2795 => x"00000000",
+2796 => x"00002ba8",
+2797 => x"00002ba8",
+2798 => x"00002bb0",
+2799 => x"00002bb0",
+2800 => x"00002bb8",
+2801 => x"00002bb8",
+2802 => x"00002bc0",
+2803 => x"00002bc0",
+2804 => x"00002bc8",
+2805 => x"00002bc8",
+2806 => x"00002bd0",
+2807 => x"00002bd0",
+2808 => x"00002bd8",
+2809 => x"00002bd8",
+2810 => x"00002be0",
+2811 => x"00002be0",
+2812 => x"00002be8",
+2813 => x"00002be8",
+2814 => x"00002bf0",
+2815 => x"00002bf0",
+2816 => x"00002bf8",
+2817 => x"00002bf8",
+2818 => x"00002c00",
+2819 => x"00002c00",
+2820 => x"00002c08",
+2821 => x"00002c08",
+2822 => x"00002c10",
+2823 => x"00002c10",
+2824 => x"00002c18",
+2825 => x"00002c18",
+2826 => x"00002c20",
+2827 => x"00002c20",
+2828 => x"00002c28",
+2829 => x"00002c28",
+2830 => x"00002c30",
+2831 => x"00002c30",
+2832 => x"00002c38",
+2833 => x"00002c38",
+2834 => x"00002c40",
+2835 => x"00002c40",
+2836 => x"00002c48",
+2837 => x"00002c48",
+2838 => x"00002c50",
+2839 => x"00002c50",
+2840 => x"00002c58",
+2841 => x"00002c58",
+2842 => x"00002c60",
+2843 => x"00002c60",
+2844 => x"00002c68",
+2845 => x"00002c68",
+2846 => x"00002c70",
+2847 => x"00002c70",
+2848 => x"00002c78",
+2849 => x"00002c78",
+2850 => x"00002c80",
+2851 => x"00002c80",
+2852 => x"00002c88",
+2853 => x"00002c88",
+2854 => x"00002c90",
+2855 => x"00002c90",
+2856 => x"00002c98",
+2857 => x"00002c98",
+2858 => x"00002ca0",
+2859 => x"00002ca0",
+2860 => x"00002ca8",
+2861 => x"00002ca8",
+2862 => x"00002cb0",
+2863 => x"00002cb0",
+2864 => x"00002cb8",
+2865 => x"00002cb8",
+2866 => x"00002cc0",
+2867 => x"00002cc0",
+2868 => x"00002cc8",
+2869 => x"00002cc8",
+2870 => x"00002cd0",
+2871 => x"00002cd0",
+2872 => x"00002cd8",
+2873 => x"00002cd8",
+2874 => x"00002ce0",
+2875 => x"00002ce0",
+2876 => x"00002ce8",
+2877 => x"00002ce8",
+2878 => x"00002cf0",
+2879 => x"00002cf0",
+2880 => x"00002cf8",
+2881 => x"00002cf8",
+2882 => x"00002d00",
+2883 => x"00002d00",
+2884 => x"00002d08",
+2885 => x"00002d08",
+2886 => x"00002d10",
+2887 => x"00002d10",
+2888 => x"00002d18",
+2889 => x"00002d18",
+2890 => x"00002d20",
+2891 => x"00002d20",
+2892 => x"00002d28",
+2893 => x"00002d28",
+2894 => x"00002d30",
+2895 => x"00002d30",
+2896 => x"00002d38",
+2897 => x"00002d38",
+2898 => x"00002d40",
+2899 => x"00002d40",
+2900 => x"00002d48",
+2901 => x"00002d48",
+2902 => x"00002d50",
+2903 => x"00002d50",
+2904 => x"00002d58",
+2905 => x"00002d58",
+2906 => x"00002d60",
+2907 => x"00002d60",
+2908 => x"00002d68",
+2909 => x"00002d68",
+2910 => x"00002d70",
+2911 => x"00002d70",
+2912 => x"00002d78",
+2913 => x"00002d78",
+2914 => x"00002d80",
+2915 => x"00002d80",
+2916 => x"00002d88",
+2917 => x"00002d88",
+2918 => x"00002d90",
+2919 => x"00002d90",
+2920 => x"00002d98",
+2921 => x"00002d98",
+2922 => x"00002da0",
+2923 => x"00002da0",
+2924 => x"00002da8",
+2925 => x"00002da8",
+2926 => x"00002db0",
+2927 => x"00002db0",
+2928 => x"00002db8",
+2929 => x"00002db8",
+2930 => x"00002dc0",
+2931 => x"00002dc0",
+2932 => x"00002dc8",
+2933 => x"00002dc8",
+2934 => x"00002dd0",
+2935 => x"00002dd0",
+2936 => x"00002dd8",
+2937 => x"00002dd8",
+2938 => x"00002de0",
+2939 => x"00002de0",
+2940 => x"00002de8",
+2941 => x"00002de8",
+2942 => x"00002df0",
+2943 => x"00002df0",
+2944 => x"00002df8",
+2945 => x"00002df8",
+2946 => x"00002e00",
+2947 => x"00002e00",
+2948 => x"00002e08",
+2949 => x"00002e08",
+2950 => x"00002e10",
+2951 => x"00002e10",
+2952 => x"00002e18",
+2953 => x"00002e18",
+2954 => x"00002e20",
+2955 => x"00002e20",
+2956 => x"00002e28",
+2957 => x"00002e28",
+2958 => x"00002e30",
+2959 => x"00002e30",
+2960 => x"00002e38",
+2961 => x"00002e38",
+2962 => x"00002e40",
+2963 => x"00002e40",
+2964 => x"00002e48",
+2965 => x"00002e48",
+2966 => x"00002e50",
+2967 => x"00002e50",
+2968 => x"00002e58",
+2969 => x"00002e58",
+2970 => x"00002e60",
+2971 => x"00002e60",
+2972 => x"00002e68",
+2973 => x"00002e68",
+2974 => x"00002e70",
+2975 => x"00002e70",
+2976 => x"00002e78",
+2977 => x"00002e78",
+2978 => x"00002e80",
+2979 => x"00002e80",
+2980 => x"00002e88",
+2981 => x"00002e88",
+2982 => x"00002e90",
+2983 => x"00002e90",
+2984 => x"00002e98",
+2985 => x"00002e98",
+2986 => x"00002ea0",
+2987 => x"00002ea0",
+2988 => x"00002ea8",
+2989 => x"00002ea8",
+2990 => x"00002eb0",
+2991 => x"00002eb0",
+2992 => x"00002eb8",
+2993 => x"00002eb8",
+2994 => x"00002ec0",
+2995 => x"00002ec0",
+2996 => x"00002ec8",
+2997 => x"00002ec8",
+2998 => x"00002ed0",
+2999 => x"00002ed0",
+3000 => x"00002ed8",
+3001 => x"00002ed8",
+3002 => x"00002ee0",
+3003 => x"00002ee0",
+3004 => x"00002ee8",
+3005 => x"00002ee8",
+3006 => x"00002ef0",
+3007 => x"00002ef0",
+3008 => x"00002ef8",
+3009 => x"00002ef8",
+3010 => x"00002f00",
+3011 => x"00002f00",
+3012 => x"00002f08",
+3013 => x"00002f08",
+3014 => x"00002f10",
+3015 => x"00002f10",
+3016 => x"00002f18",
+3017 => x"00002f18",
+3018 => x"00002f20",
+3019 => x"00002f20",
+3020 => x"00002f28",
+3021 => x"00002f28",
+3022 => x"00002f30",
+3023 => x"00002f30",
+3024 => x"00002f38",
+3025 => x"00002f38",
+3026 => x"00002f40",
+3027 => x"00002f40",
+3028 => x"00002f48",
+3029 => x"00002f48",
+3030 => x"00002f50",
+3031 => x"00002f50",
+3032 => x"00002f58",
+3033 => x"00002f58",
+3034 => x"00002f60",
+3035 => x"00002f60",
+3036 => x"00002f68",
+3037 => x"00002f68",
+3038 => x"00002f70",
+3039 => x"00002f70",
+3040 => x"00002f78",
+3041 => x"00002f78",
+3042 => x"00002f80",
+3043 => x"00002f80",
+3044 => x"00002f88",
+3045 => x"00002f88",
+3046 => x"00002f90",
+3047 => x"00002f90",
+3048 => x"00002f98",
+3049 => x"00002f98",
+3050 => x"00002fa0",
+3051 => x"00002fa0",
+3052 => x"000027c0",
+3053 => x"ffffffff",
+3054 => x"00000000",
+3055 => x"ffffffff",
+3056 => x"00000000",
+ others => x"00000000"
+);
+
+begin
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memAWriteEnable = '1') and (memBWriteEnable = '1') and (memAAddr=memBAddr) and (memAWrite/=memBWrite) then
+ report "write collision" severity failure;
+ end if;
+
+ if (memAWriteEnable = '1') then
+ ram(to_integer(unsigned(memAAddr))) := memAWrite;
+ memARead <= memAWrite;
+ else
+ memARead <= ram(to_integer(unsigned(memAAddr)));
+ end if;
+ end if;
+end process;
+
+process (clk)
+begin
+ if (clk'event and clk = '1') then
+ if (memBWriteEnable = '1') then
+ ram(to_integer(unsigned(memBAddr))) := memBWrite;
+ memBRead <= memBWrite;
+ else
+ memBRead <= ram(to_integer(unsigned(memBAddr)));
+ end if;
+ end if;
+end process;
+
+
+
+
+end dualport_ram_arch;
diff --git a/zpu/hdl/example/log.txt b/zpu/hdl/example/log.txt
new file mode 100644
index 0000000..6ee1d94
--- /dev/null
+++ b/zpu/hdl/example/log.txt
@@ -0,0 +1,20 @@
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
diff --git a/zpu/hdl/example/sim_small_fpga_top.vhd b/zpu/hdl/example/sim_small_fpga_top.vhd
new file mode 100644
index 0000000..909ea21
--- /dev/null
+++ b/zpu/hdl/example/sim_small_fpga_top.vhd
@@ -0,0 +1,197 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+--------------------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+
+entity fpga_top is
+end fpga_top;
+
+
+architecture behave of fpga_top is
+
+
+ signal clk : std_logic;
+
+ signal areset : std_logic := '1';
+
+
+ component zpu_io is
+ generic (
+ log_file: string := "log.txt"
+ );
+ port (
+ clk : in std_logic;
+ areset : in std_logic;
+ busy : out std_logic;
+ writeEnable : in std_logic;
+ readEnable : in std_logic;
+ write : in std_logic_vector(wordSize-1 downto 0);
+ read : out std_logic_vector(wordSize-1 downto 0);
+ addr : in std_logic_vector(maxAddrBit downto minAddrBit)
+ );
+ end component;
+
+
+ signal mem_busy : std_logic;
+ signal mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal mem_write : std_logic_vector(wordSize-1 downto 0);
+ signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0);
+ signal mem_writeEnable : std_logic;
+ signal mem_readEnable : std_logic;
+ signal mem_writeMask : std_logic_vector(wordBytes-1 downto 0);
+
+ signal enable : std_logic;
+
+ signal dram_mem_busy : std_logic;
+ signal dram_mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal dram_mem_write : std_logic_vector(wordSize-1 downto 0);
+ signal dram_mem_writeEnable : std_logic;
+ signal dram_mem_readEnable : std_logic;
+ signal dram_mem_writeMask : std_logic_vector(wordBytes-1 downto 0);
+
+ signal io_busy : std_logic;
+
+ signal io_mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal io_mem_writeEnable : std_logic;
+ signal io_mem_readEnable : std_logic;
+
+ signal dram_ready : std_logic;
+ signal io_ready : std_logic;
+ signal io_reading : std_logic;
+ signal interruptcounter : unsigned(15 downto 0);
+ signal interrupt : std_logic;
+
+ signal break : std_logic;
+
+begin
+
+ zpu: zpu_core
+ port map (
+ clk => clk,
+ reset => areset,
+ enable => enable,
+ in_mem_busy => mem_busy,
+ mem_read => mem_read,
+ mem_write => mem_write,
+ out_mem_addr => mem_addr,
+ out_mem_writeEnable => mem_writeEnable,
+ out_mem_readEnable => mem_readEnable,
+ mem_writeMask => mem_writeMask,
+ interrupt => interrupt,
+ break => break
+ );
+
+
+ ioMap: zpu_io
+ port map (
+ clk => clk,
+ areset => areset,
+ busy => io_busy,
+ writeEnable => io_mem_writeEnable,
+ readEnable => io_mem_readEnable,
+ write => mem_write,
+ read => io_mem_read,
+ addr => mem_addr(maxAddrBit downto minAddrBit)
+ );
+
+ dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit);
+ dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit);
+ io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit);
+ io_mem_readEnable <= mem_readEnable and mem_addr(ioBit);
+ mem_busy <= io_busy;
+
+
+ -- Memory reads either come from IO or DRAM. We need to pick the right one.
+ memorycontrol: process(dram_mem_read, dram_ready, io_ready, io_mem_read)
+ begin
+ mem_read <= (others => 'U');
+ if dram_ready='1' then
+ mem_read <= dram_mem_read;
+ end if;
+
+ if io_ready='1' then
+ mem_read <= (others => '0');
+ mem_read <= io_mem_read;
+ end if;
+ end process;
+
+
+ io_ready <= (io_reading or io_mem_readEnable) and not io_busy;
+
+ memoryControlSync: process(clk, areset)
+ begin
+ if areset = '1' then
+ enable <= '0';
+ io_reading <= '0';
+ dram_ready <= '0';
+
+ interruptcounter <= to_unsigned(0, 16);
+ interrupt <= '0';
+
+ elsif rising_edge(clk) then
+ enable <= '1';
+ io_reading <= io_busy or io_mem_readEnable;
+ dram_ready <= dram_mem_readEnable;
+
+ -- keep interrupt signal high for 16 cycles
+ interruptcounter <= interruptcounter + 1;
+ if (interruptcounter < 16) then
+ report "Interrupt asserted!" severity note;
+ interrupt <='1';
+ else
+ interrupt <='0';
+ end if;
+ end if;
+ end process;
+
+ -- wiggle the clock @ 100MHz
+ clock: process
+ begin
+ clk <= '0';
+ wait for 5 ns;
+ clk <= '1';
+ wait for 5 ns;
+ areset <= '0';
+ end process clock;
+
+
+end architecture behave;
diff --git a/zpu/hdl/example/sim_small_fpga_top_noint.vhd b/zpu/hdl/example/sim_small_fpga_top_noint.vhd
new file mode 100644
index 0000000..23b92cc
--- /dev/null
+++ b/zpu/hdl/example/sim_small_fpga_top_noint.vhd
@@ -0,0 +1,184 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+
+entity fpga_top is
+end fpga_top;
+
+
+architecture behave of fpga_top is
+
+
+ signal clk : std_logic;
+
+ signal areset : std_logic := '1';
+
+
+ component zpu_io is
+ generic (
+ log_file: string := "log.txt"
+ );
+ port (
+ clk : in std_logic;
+ areset : in std_logic;
+ busy : out std_logic;
+ writeEnable : in std_logic;
+ readEnable : in std_logic;
+ write : in std_logic_vector(wordSize-1 downto 0);
+ read : out std_logic_vector(wordSize-1 downto 0);
+ addr : in std_logic_vector(maxAddrBit downto minAddrBit)
+ );
+ end component;
+
+
+ signal mem_busy : std_logic;
+ signal mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal mem_write : std_logic_vector(wordSize-1 downto 0);
+ signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0);
+ signal mem_writeEnable : std_logic;
+ signal mem_readEnable : std_logic;
+ signal mem_writeMask : std_logic_vector(wordBytes-1 downto 0);
+
+ signal enable : std_logic;
+
+ signal dram_mem_busy : std_logic;
+ signal dram_mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal dram_mem_write : std_logic_vector(wordSize-1 downto 0);
+ signal dram_mem_writeEnable : std_logic;
+ signal dram_mem_readEnable : std_logic;
+ signal dram_mem_writeMask : std_logic_vector(wordBytes-1 downto 0);
+
+ signal io_busy : std_logic;
+
+ signal io_mem_read : std_logic_vector(wordSize-1 downto 0);
+ signal io_mem_writeEnable : std_logic;
+ signal io_mem_readEnable : std_logic;
+
+ signal dram_ready : std_logic;
+ signal io_ready : std_logic;
+ signal io_reading : std_logic;
+
+ signal break : std_logic;
+
+
+begin
+
+ zpu: zpu_core
+ port map (
+ clk => clk,
+ reset => areset,
+ enable => enable,
+ in_mem_busy => mem_busy,
+ mem_read => mem_read,
+ mem_write => mem_write,
+ out_mem_addr => mem_addr,
+ out_mem_writeEnable => mem_writeEnable,
+ out_mem_readEnable => mem_readEnable,
+ mem_writeMask => mem_writeMask,
+ interrupt => '0',
+ break => break
+ );
+
+
+ ioMap: zpu_io
+ port map (
+ clk => clk,
+ areset => areset,
+ busy => io_busy,
+ writeEnable => io_mem_writeEnable,
+ readEnable => io_mem_readEnable,
+ write => mem_write,
+ read => io_mem_read,
+ addr => mem_addr(maxAddrBit downto minAddrBit)
+ );
+
+ dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit);
+ dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit);
+ io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit);
+ io_mem_readEnable <= mem_readEnable and mem_addr(ioBit);
+ mem_busy <= io_busy;
+
+
+ -- Memory reads either come from IO or DRAM. We need to pick the right one.
+ memorycontrol: process(dram_mem_read, dram_ready, io_ready, io_mem_read)
+ begin
+ mem_read <= (others => 'U');
+ if dram_ready='1' then
+ mem_read <= dram_mem_read;
+ end if;
+
+ if io_ready='1' then
+ mem_read <= (others => '0');
+ mem_read <= io_mem_read;
+ end if;
+ end process;
+
+
+
+ io_ready <= (io_reading or io_mem_readEnable) and not io_busy;
+
+ memoryControlSync: process(clk, areset)
+ begin
+ if areset = '1' then
+ enable <= '0';
+ io_reading <= '0';
+ dram_ready <= '0';
+
+ elsif rising_edge(clk) then
+ enable <= '1';
+ io_reading <= io_busy or io_mem_readEnable;
+ dram_ready <= dram_mem_readEnable;
+ end if;
+ end process;
+
+ -- wiggle the clock @ 100MHz
+ clock: process
+ begin
+ clk <= '0';
+ wait for 5 ns;
+ clk <= '1';
+ wait for 5 ns;
+ areset <= '0';
+ end process clock;
+
+
+end architecture behave;
diff --git a/zpu/hdl/example/simzpu_dmips.do b/zpu/hdl/example/simzpu_dmips.do
new file mode 100644
index 0000000..883259e
--- /dev/null
+++ b/zpu/hdl/example/simzpu_dmips.do
@@ -0,0 +1,29 @@
+# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_dmips.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top_noint.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit bram_dmips.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/trace.vhd
+
+# run ZPU
+vsim fpga_top
+view wave
+add wave -recursive fpga_top/zpu/*
+#add wave -recursive fpga_top/*
+view structure
+#view signals
+
+# Enough to run tiny programs
+run 10 ms
diff --git a/zpu/hdl/example/simzpu_interrupt.do b/zpu/hdl/example/simzpu_interrupt.do
new file mode 100644
index 0000000..864bf76
--- /dev/null
+++ b/zpu/hdl/example/simzpu_interrupt.do
@@ -0,0 +1,29 @@
+# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_interrupt.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit interrupt.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/trace.vhd
+
+# run ZPU
+vsim fpga_top
+view wave
+add wave -recursive fpga_top/zpu/*
+#add wave -recursive fpga_top/*
+view structure
+#view signals
+
+# Enough to run tiny programs
+run 10 ms
diff --git a/zpu/hdl/example/simzpu_small.do b/zpu/hdl/example/simzpu_small.do
new file mode 100644
index 0000000..2b64926
--- /dev/null
+++ b/zpu/hdl/example/simzpu_small.do
@@ -0,0 +1,29 @@
+# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_small.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top_noint.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit helloworld.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/trace.vhd
+
+# run ZPU
+vsim fpga_top
+view wave
+add wave -recursive fpga_top/zpu/*
+#add wave -recursive fpga_top/*
+view structure
+#view signals
+
+# Enough to run tiny programs
+run 10 ms
diff --git a/zpu/hdl/example/zpu_config.vhd b/zpu/hdl/example/zpu_config.vhd
new file mode 100644
index 0000000..cd4163d
--- /dev/null
+++ b/zpu/hdl/example/zpu_config.vhd
@@ -0,0 +1,55 @@
+-- ZPU
+--
+-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+--
+-- The FreeBSD license
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+--
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above
+-- copyright notice, this list of conditions and the following
+-- disclaimer in the documentation and/or other materials
+-- provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY
+-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+-- ZPU PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+-- The views and conclusions contained in the software and documentation
+-- are those of the authors and should not be interpreted as representing
+-- official policies, either expressed or implied, of the ZPU Project.
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+package zpu_config is
+ -- generate trace output
+ constant Generate_Trace : boolean := true;
+ constant wordPower : integer := 5;
+ -- during simulation, set this to '0' to get matching trace.txt
+ constant DontCareValue : std_logic := '0';
+ -- Clock frequency in MHz.
+ constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64";
+ -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1)
+ constant maxAddrBitIncIO : integer := 27;
+ constant maxAddrBitBRAM : integer := 16;
+
+ -- start byte address of stack.
+ -- point to top of RAM - 2*words
+ constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) :=
+ std_logic_vector(to_unsigned((2**(maxAddrBitBRAM+1))-8, maxAddrBitIncIO+1));
+end zpu_config;
diff --git a/zpu/hdl/example/zpuromgen.c b/zpu/hdl/example/zpuromgen.c
new file mode 100644
index 0000000..fb8c4ba
--- /dev/null
+++ b/zpu/hdl/example/zpuromgen.c
@@ -0,0 +1,59 @@
+// zpuromgen.c
+//
+// Program to turn a binary file into a VHDL lookup table.
+// by Adam Pierce
+// 29-Feb-2008
+//
+// This software is free to use by anyone for any purpose.
+//
+
+#include <unistd.h>
+#include <stdio.h>
+
+typedef uint8_t BYTE;
+
+main(int argc, char **argv)
+{
+ BYTE opcode[4];
+ int fd;
+ int addr = 0;
+ ssize_t s;
+
+// Check the user has given us an input file.
+ if(argc < 2)
+ {
+ printf("Usage: %s <binary_file>\n\n", argv[0]);
+ return 1;
+ }
+
+// Open the input file.
+ fd = open(argv[1], 0);
+ if(fd == -1)
+ {
+ perror("File Open");
+ return 2;
+ }
+
+ while(1)
+ {
+ // Read 32 bits.
+ s = read(fd, opcode, 4);
+ if(s == -1)
+ {
+ perror("File read");
+ return 3;
+ }
+
+ if(s == 0)
+ break; // End of file.
+
+ // Output to STDOUT.
+ printf("%6d => x\"%02x%02x%02x%02x\",\n",
+ addr++, opcode[0], opcode[1],
+ opcode[2], opcode[3]);
+ }
+
+ close(fd);
+ return 0;
+}
+
diff --git a/zpu/hdl/example/zpuromgen.exe b/zpu/hdl/example/zpuromgen.exe
new file mode 100644
index 0000000..6655412
--- /dev/null
+++ b/zpu/hdl/example/zpuromgen.exe
Binary files differ
diff --git a/zpu/hdl/example_ghdl/README b/zpu/hdl/example_ghdl/README
new file mode 100644
index 0000000..a098c0c
--- /dev/null
+++ b/zpu/hdl/example_ghdl/README
@@ -0,0 +1,44 @@
+This directory contains a quick setup of the helloworld example for
+the GHDL simulator.
+
+ http://ghdl.free.fr/
+
+Compiled by Arnim Laeuger, 17-Apr-2008.
+Removed ROC/unisim dependency 16-Jun-2008.
+
+Compiling the example
+---------------------
+
+Make all shell scripts executable:
+ $ chmod +x *.sh
+
+On Linux, convert files from DOS format:
+ $ dos2unix *.sh
+
+You need to import the project sources once by running
+ $ ./ghdl_import.sh
+
+Compilation (using GHDL's make feature) is invoked by
+ $ ./ghdl_make.sh
+
+Whenever the VHDL sources change, it's enough to execute ghdl_make.sh. GHDL
+will trace the dependencies and will rebuild only the modified sources.
+
+
+Simulation
+----------
+
+Simulation finally happens by running the fpga_top executable generated by the
+compilation step. Don't forget to set a stop time or the testbench might run
+forever:
+
+ $ ./fpga_top --stop-time=2100us
+
+The log.txt and trace.txt files are generated as simulation progresses. They
+should be compared to the files given in the example directory.
+
+Waveforms can be obtained by specifying the ghw file name:
+
+ $ ./fpga_top --stop-time=1ms --wave=zpu.ghw
+
+They can be inspected with gtkwave from http://home.nc.rr.com/gtkwave/.
diff --git a/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh b/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh
new file mode 100644
index 0000000..b3be1a6
--- /dev/null
+++ b/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/zpu_config.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/sim_small_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core_small.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/bram_dmips.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/trace.vhd
+fi
+
+echo "Compiling design..."
+if ghdl -m ${MAKE_OPTIONS} fpga_top; then
+ echo "Compilation finished, start simulation with"
+ echo " ./fpga_top --stop-time=1ms"
+fi
diff --git a/zpu/hdl/example_ghdl/dmipstrace_ghdl.sh b/zpu/hdl/example_ghdl/dmipstrace_ghdl.sh
new file mode 100644
index 0000000..53474d4
--- /dev/null
+++ b/zpu/hdl/example_ghdl/dmipstrace_ghdl.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/zpu_config_trace.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/sim_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/dram_dmips.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/trace.vhd
+fi
+
+echo "Compiling design..."
+if ghdl -m ${MAKE_OPTIONS} fpga_top; then
+ echo "Compilation finished, start simulation with"
+ echo " ./fpga_top --stop-time=2500us"
+fi
diff --git a/zpu/hdl/example_ghdl/ghdl_import.sh b/zpu/hdl/example_ghdl/ghdl_import.sh
new file mode 100644
index 0000000..b1c2713
--- /dev/null
+++ b/zpu/hdl/example_ghdl/ghdl_import.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+. ghdl_options.sh
+
+mkdir -p work
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/zpu_config.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/interrupt.vhd
+# to execute helloworld comment interrupt.vhd above
+# and edit sim_small_fpga_top.vhd to never assert interrupts
+#ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/helloworld.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/trace.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core_small.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/sim_small_fpga_top.vhd
diff --git a/zpu/hdl/example_ghdl/ghdl_make.sh b/zpu/hdl/example_ghdl/ghdl_make.sh
new file mode 100644
index 0000000..948b100
--- /dev/null
+++ b/zpu/hdl/example_ghdl/ghdl_make.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+. ghdl_options.sh
+
+ghdl -m ${MAKE_OPTIONS} fpga_top
diff --git a/zpu/hdl/example_ghdl/ghdl_options.sh b/zpu/hdl/example_ghdl/ghdl_options.sh
new file mode 100644
index 0000000..aba231c
--- /dev/null
+++ b/zpu/hdl/example_ghdl/ghdl_options.sh
@@ -0,0 +1,2 @@
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
diff --git a/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh b/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh
new file mode 100644
index 0000000..8ba5078
--- /dev/null
+++ b/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/zpu_config_trace.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/sim_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/dram_hello.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/trace.vhd
+fi
+
+echo "Compiling design..."
+if ghdl -m ${MAKE_OPTIONS} fpga_top; then
+ echo "Compilation finished, start simulation with"
+ echo " ./fpga_top --stop-time=1ms"
+fi
diff --git a/zpu/hdl/example_medium/.cvsignore b/zpu/hdl/example_medium/.cvsignore
new file mode 100644
index 0000000..3add443
--- /dev/null
+++ b/zpu/hdl/example_medium/.cvsignore
@@ -0,0 +1,4 @@
+vsim.wlf
+work
+log.txt
+trace.txt
diff --git a/zpu/hdl/example_medium/dram_dmips.vhd b/zpu/hdl/example_medium/dram_dmips.vhd
new file mode 100644
index 0000000..0437adc
--- /dev/null
+++ b/zpu/hdl/example_medium/dram_dmips.vhd
@@ -0,0 +1,3308 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+
+library work;
+use work.zpu_config.all;
+use work.zpupkg.all;
+
+entity dram is
+port (clk : in std_logic;
+areset : std_logic;
+ mem_writeEnable : in std_logic;
+ mem_readEnable : in std_logic;
+ mem_addr : in std_logic_vector(maxAddrBit downto 0);
+ mem_write : in std_logic_vector(wordSize-1 downto 0);
+ mem_read : out std_logic_vector(wordSize-1 downto 0);
+ mem_busy : out std_logic;
+ mem_writeMask : in std_logic_vector(wordBytes-1 downto 0));
+end dram;
+
+architecture dram_arch of dram is
+
+
+type ram_type is array(natural range 0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0);
+
+shared variable ram : ram_type :=
+(
+0 => x"0b0b0b0b",
+1 => x"82700b0b",
+2 => x"80d5f40c",
+3 => x"3a0b0b80",
+4 => x"c4fb0400",
+5 => x"00000000",
+6 => x"00000000",
+7 => x"00000000",
+8 => x"80088408",
+9 => x"88080b0b",
+10 => x"80c5c22d",
+11 => x"880c840c",
+12 => x"800c0400",
+13 => x"00000000",
+14 => x"00000000",
+15 => x"00000000",
+16 => x"71fd0608",
+17 => x"72830609",
+18 => x"81058205",
+19 => x"832b2a83",
+20 => x"ffff0652",
+21 => x"04000000",
+22 => x"00000000",
+23 => x"00000000",
+24 => x"71fd0608",
+25 => x"83ffff73",
+26 => x"83060981",
+27 => x"05820583",
+28 => x"2b2b0906",
+29 => x"7383ffff",
+30 => x"0b0b0b0b",
+31 => x"83a70400",
+32 => x"72098105",
+33 => x"72057373",
+34 => x"09060906",
+35 => x"73097306",
+36 => x"070a8106",
+37 => x"53510400",
+38 => x"00000000",
+39 => x"00000000",
+40 => x"72722473",
+41 => x"732e0753",
+42 => x"51040000",
+43 => x"00000000",
+44 => x"00000000",
+45 => x"00000000",
+46 => x"00000000",
+47 => x"00000000",
+48 => x"71737109",
+49 => x"71068106",
+50 => x"30720a10",
+51 => x"0a720a10",
+52 => x"0a31050a",
+53 => x"81065151",
+54 => x"53510400",
+55 => x"00000000",
+56 => x"72722673",
+57 => x"732e0753",
+58 => x"51040000",
+59 => x"00000000",
+60 => x"00000000",
+61 => x"00000000",
+62 => x"00000000",
+63 => x"00000000",
+64 => x"00000000",
+65 => x"00000000",
+66 => x"00000000",
+67 => x"00000000",
+68 => x"00000000",
+69 => x"00000000",
+70 => x"00000000",
+71 => x"00000000",
+72 => x"0b0b0b88",
+73 => x"c3040000",
+74 => x"00000000",
+75 => x"00000000",
+76 => x"00000000",
+77 => x"00000000",
+78 => x"00000000",
+79 => x"00000000",
+80 => x"720a722b",
+81 => x"0a535104",
+82 => x"00000000",
+83 => x"00000000",
+84 => x"00000000",
+85 => x"00000000",
+86 => x"00000000",
+87 => x"00000000",
+88 => x"72729f06",
+89 => x"0981050b",
+90 => x"0b0b88a6",
+91 => x"05040000",
+92 => x"00000000",
+93 => x"00000000",
+94 => x"00000000",
+95 => x"00000000",
+96 => x"72722aff",
+97 => x"739f062a",
+98 => x"0974090a",
+99 => x"8106ff05",
+100 => x"06075351",
+101 => x"04000000",
+102 => x"00000000",
+103 => x"00000000",
+104 => x"71715351",
+105 => x"020d0406",
+106 => x"73830609",
+107 => x"81058205",
+108 => x"832b0b2b",
+109 => x"0772fc06",
+110 => x"0c515104",
+111 => x"00000000",
+112 => x"72098105",
+113 => x"72050970",
+114 => x"81050906",
+115 => x"0a810653",
+116 => x"51040000",
+117 => x"00000000",
+118 => x"00000000",
+119 => x"00000000",
+120 => x"72098105",
+121 => x"72050970",
+122 => x"81050906",
+123 => x"0a098106",
+124 => x"53510400",
+125 => x"00000000",
+126 => x"00000000",
+127 => x"00000000",
+128 => x"71098105",
+129 => x"52040000",
+130 => x"00000000",
+131 => x"00000000",
+132 => x"00000000",
+133 => x"00000000",
+134 => x"00000000",
+135 => x"00000000",
+136 => x"72720981",
+137 => x"05055351",
+138 => x"04000000",
+139 => x"00000000",
+140 => x"00000000",
+141 => x"00000000",
+142 => x"00000000",
+143 => x"00000000",
+144 => x"72097206",
+145 => x"73730906",
+146 => x"07535104",
+147 => x"00000000",
+148 => x"00000000",
+149 => x"00000000",
+150 => x"00000000",
+151 => x"00000000",
+152 => x"71fc0608",
+153 => x"72830609",
+154 => x"81058305",
+155 => x"1010102a",
+156 => x"81ff0652",
+157 => x"04000000",
+158 => x"00000000",
+159 => x"00000000",
+160 => x"71fc0608",
+161 => x"0b0b80d5",
+162 => x"e0738306",
+163 => x"10100508",
+164 => x"060b0b0b",
+165 => x"88a90400",
+166 => x"00000000",
+167 => x"00000000",
+168 => x"80088408",
+169 => x"88087575",
+170 => x"0b0b0bad",
+171 => x"aa2d5050",
+172 => x"80085688",
+173 => x"0c840c80",
+174 => x"0c510400",
+175 => x"00000000",
+176 => x"80088408",
+177 => x"88087575",
+178 => x"0b0b0bad",
+179 => x"ee2d5050",
+180 => x"80085688",
+181 => x"0c840c80",
+182 => x"0c510400",
+183 => x"00000000",
+184 => x"72097081",
+185 => x"0509060a",
+186 => x"8106ff05",
+187 => x"70547106",
+188 => x"73097274",
+189 => x"05ff0506",
+190 => x"07515151",
+191 => x"04000000",
+192 => x"72097081",
+193 => x"0509060a",
+194 => x"098106ff",
+195 => x"05705471",
+196 => x"06730972",
+197 => x"7405ff05",
+198 => x"06075151",
+199 => x"51040000",
+200 => x"05ff0504",
+201 => x"00000000",
+202 => x"00000000",
+203 => x"00000000",
+204 => x"00000000",
+205 => x"00000000",
+206 => x"00000000",
+207 => x"00000000",
+208 => x"810b0b0b",
+209 => x"80d5f00c",
+210 => x"51040000",
+211 => x"00000000",
+212 => x"00000000",
+213 => x"00000000",
+214 => x"00000000",
+215 => x"00000000",
+216 => x"71810552",
+217 => x"04000000",
+218 => x"00000000",
+219 => x"00000000",
+220 => x"00000000",
+221 => x"00000000",
+222 => x"00000000",
+223 => x"00000000",
+224 => x"00000000",
+225 => x"00000000",
+226 => x"00000000",
+227 => x"00000000",
+228 => x"00000000",
+229 => x"00000000",
+230 => x"00000000",
+231 => x"00000000",
+232 => x"02840572",
+233 => x"10100552",
+234 => x"04000000",
+235 => x"00000000",
+236 => x"00000000",
+237 => x"00000000",
+238 => x"00000000",
+239 => x"00000000",
+240 => x"00000000",
+241 => x"00000000",
+242 => x"00000000",
+243 => x"00000000",
+244 => x"00000000",
+245 => x"00000000",
+246 => x"00000000",
+247 => x"00000000",
+248 => x"717105ff",
+249 => x"05715351",
+250 => x"020d0400",
+251 => x"00000000",
+252 => x"00000000",
+253 => x"00000000",
+254 => x"00000000",
+255 => x"00000000",
+256 => x"82fd3fbf",
+257 => x"a03f0410",
+258 => x"10101010",
+259 => x"10101010",
+260 => x"10101010",
+261 => x"10101010",
+262 => x"10101010",
+263 => x"10101010",
+264 => x"10101010",
+265 => x"10105351",
+266 => x"047381ff",
+267 => x"06738306",
+268 => x"09810583",
+269 => x"05101010",
+270 => x"2b0772fc",
+271 => x"060c5151",
+272 => x"043c0472",
+273 => x"72807281",
+274 => x"06ff0509",
+275 => x"72060571",
+276 => x"1052720a",
+277 => x"100a5372",
+278 => x"ed385151",
+279 => x"535104ff",
+280 => x"3d0d0b0b",
+281 => x"80e5e408",
+282 => x"52710870",
+283 => x"882a8132",
+284 => x"70810651",
+285 => x"515170f1",
+286 => x"3873720c",
+287 => x"833d0d04",
+288 => x"80d5f008",
+289 => x"802ea438",
+290 => x"80d5f408",
+291 => x"822ebd38",
+292 => x"8380800b",
+293 => x"0b0b80e5",
+294 => x"e40c82a0",
+295 => x"800b80e5",
+296 => x"e80c8290",
+297 => x"800b80e5",
+298 => x"ec0c04f8",
+299 => x"808080a4",
+300 => x"0b0b0b80",
+301 => x"e5e40cf8",
+302 => x"80808280",
+303 => x"0b80e5e8",
+304 => x"0cf88080",
+305 => x"84800b80",
+306 => x"e5ec0c04",
+307 => x"80c0a880",
+308 => x"8c0b0b0b",
+309 => x"80e5e40c",
+310 => x"80c0a880",
+311 => x"940b80e5",
+312 => x"e80c0b0b",
+313 => x"80c7d00b",
+314 => x"80e5ec0c",
+315 => x"04f23d0d",
+316 => x"6080e5e8",
+317 => x"08565d82",
+318 => x"750c8059",
+319 => x"805a800b",
+320 => x"8f3d5d5b",
+321 => x"7a101015",
+322 => x"70087108",
+323 => x"719f2c7e",
+324 => x"852b5855",
+325 => x"557d5359",
+326 => x"5799993f",
+327 => x"7d7f7a72",
+328 => x"077c7207",
+329 => x"71716081",
+330 => x"05415f5d",
+331 => x"5b595755",
+332 => x"817b278f",
+333 => x"38767d0c",
+334 => x"77841e0c",
+335 => x"7c800c90",
+336 => x"3d0d0480",
+337 => x"e5e80855",
+338 => x"ffba3970",
+339 => x"7080e5f0",
+340 => x"335170a7",
+341 => x"3880d5fc",
+342 => x"08700852",
+343 => x"5270802e",
+344 => x"94388412",
+345 => x"80d5fc0c",
+346 => x"702d80d5",
+347 => x"fc087008",
+348 => x"525270ee",
+349 => x"38810b80",
+350 => x"e5f03450",
+351 => x"50040470",
+352 => x"0b0b80e5",
+353 => x"e008802e",
+354 => x"8e380b0b",
+355 => x"0b0b800b",
+356 => x"802e0981",
+357 => x"06833850",
+358 => x"040b0b80",
+359 => x"e5e0510b",
+360 => x"0b0bf4dc",
+361 => x"3f500404",
+362 => x"ff3d0d02",
+363 => x"8f053352",
+364 => x"718a2e8a",
+365 => x"387151fd",
+366 => x"a63f833d",
+367 => x"0d048d51",
+368 => x"fd9d3f71",
+369 => x"51fd983f",
+370 => x"833d0d04",
+371 => x"ce3d0db5",
+372 => x"3d707084",
+373 => x"0552088b",
+374 => x"a85c56a5",
+375 => x"3d5e5c80",
+376 => x"75708105",
+377 => x"5733765b",
+378 => x"55587378",
+379 => x"2e80c138",
+380 => x"8e3d5b73",
+381 => x"a52e0981",
+382 => x"0680c538",
+383 => x"78708105",
+384 => x"5a335473",
+385 => x"80e42e81",
+386 => x"b6387380",
+387 => x"e42480c6",
+388 => x"387380e3",
+389 => x"2ea13880",
+390 => x"52a55179",
+391 => x"2d805273",
+392 => x"51792d82",
+393 => x"18587870",
+394 => x"81055a33",
+395 => x"5473c438",
+396 => x"77800cb4",
+397 => x"3d0d047b",
+398 => x"841d8312",
+399 => x"33565d57",
+400 => x"80527351",
+401 => x"792d8118",
+402 => x"79708105",
+403 => x"5b335558",
+404 => x"73ffa038",
+405 => x"db397380",
+406 => x"f32e0981",
+407 => x"06ffb838",
+408 => x"7b841d71",
+409 => x"08595d56",
+410 => x"80773355",
+411 => x"5673762e",
+412 => x"8d388116",
+413 => x"70187033",
+414 => x"57555674",
+415 => x"f538ff16",
+416 => x"55807625",
+417 => x"ffa03876",
+418 => x"70810558",
+419 => x"33548052",
+420 => x"7351792d",
+421 => x"811875ff",
+422 => x"17575758",
+423 => x"807625ff",
+424 => x"85387670",
+425 => x"81055833",
+426 => x"54805273",
+427 => x"51792d81",
+428 => x"1875ff17",
+429 => x"57575875",
+430 => x"8024cc38",
+431 => x"fee8397b",
+432 => x"841d7108",
+433 => x"70719f2c",
+434 => x"5953595d",
+435 => x"56807524",
+436 => x"81913875",
+437 => x"7d7c5856",
+438 => x"54805773",
+439 => x"772e0981",
+440 => x"06b638b0",
+441 => x"7b3402b5",
+442 => x"05567a76",
+443 => x"2e9738ff",
+444 => x"16567533",
+445 => x"75708105",
+446 => x"57348117",
+447 => x"577a762e",
+448 => x"098106eb",
+449 => x"38807534",
+450 => x"767dff12",
+451 => x"57585675",
+452 => x"8024fef3",
+453 => x"38fe8f39",
+454 => x"8a527351",
+455 => x"9fd03f80",
+456 => x"0880c7d4",
+457 => x"05337670",
+458 => x"81055834",
+459 => x"8a527351",
+460 => x"9ef83f80",
+461 => x"08548008",
+462 => x"802effae",
+463 => x"388a5273",
+464 => x"519fab3f",
+465 => x"800880c7",
+466 => x"d4053376",
+467 => x"70810558",
+468 => x"348a5273",
+469 => x"519ed33f",
+470 => x"80085480",
+471 => x"08ffb938",
+472 => x"ff883974",
+473 => x"527653b4",
+474 => x"3dffb805",
+475 => x"51949a3f",
+476 => x"a33d0856",
+477 => x"fedd3980",
+478 => x"3d0d80c1",
+479 => x"0b81b4bc",
+480 => x"34800b81",
+481 => x"b6980c70",
+482 => x"800c823d",
+483 => x"0d04ff3d",
+484 => x"0d800b81",
+485 => x"b4bc3352",
+486 => x"527080c1",
+487 => x"2e993871",
+488 => x"81b69808",
+489 => x"0781b698",
+490 => x"0c80c20b",
+491 => x"81b4c034",
+492 => x"70800c83",
+493 => x"3d0d0481",
+494 => x"0b81b698",
+495 => x"080781b6",
+496 => x"980c80c2",
+497 => x"0b81b4c0",
+498 => x"3470800c",
+499 => x"833d0d04",
+500 => x"fd3d0d75",
+501 => x"70088a05",
+502 => x"535381b4",
+503 => x"bc335170",
+504 => x"80c12e8b",
+505 => x"3873f338",
+506 => x"70800c85",
+507 => x"3d0d04ff",
+508 => x"127081b4",
+509 => x"b8083174",
+510 => x"0c800c85",
+511 => x"3d0d04fc",
+512 => x"3d0d81b4",
+513 => x"c4085574",
+514 => x"802e8c38",
+515 => x"76750871",
+516 => x"0c81b4c4",
+517 => x"0856548c",
+518 => x"155381b4",
+519 => x"b808528a",
+520 => x"518fd43f",
+521 => x"73800c86",
+522 => x"3d0d04fb",
+523 => x"3d0d7770",
+524 => x"085656b0",
+525 => x"5381b4c4",
+526 => x"08527451",
+527 => x"ab943f85",
+528 => x"0b8c170c",
+529 => x"850b8c16",
+530 => x"0c750875",
+531 => x"0c81b4c4",
+532 => x"08547380",
+533 => x"2e8a3873",
+534 => x"08750c81",
+535 => x"b4c40854",
+536 => x"8c145381",
+537 => x"b4b80852",
+538 => x"8a518f8b",
+539 => x"3f841508",
+540 => x"ad38860b",
+541 => x"8c160c88",
+542 => x"15528816",
+543 => x"08518e97",
+544 => x"3f81b4c4",
+545 => x"08700876",
+546 => x"0c548c15",
+547 => x"7054548a",
+548 => x"52730851",
+549 => x"8ee13f73",
+550 => x"800c873d",
+551 => x"0d047508",
+552 => x"54b05373",
+553 => x"527551aa",
+554 => x"a93f7380",
+555 => x"0c873d0d",
+556 => x"04d93d0d",
+557 => x"b0519dcf",
+558 => x"3f800881",
+559 => x"b4b40cb0",
+560 => x"519dc43f",
+561 => x"800881b4",
+562 => x"c40c81b4",
+563 => x"b4088008",
+564 => x"0c800b80",
+565 => x"0884050c",
+566 => x"820b8008",
+567 => x"88050ca8",
+568 => x"0b80088c",
+569 => x"050c9f53",
+570 => x"80c7e052",
+571 => x"80089005",
+572 => x"51a9df3f",
+573 => x"a13d5e9f",
+574 => x"5380c880",
+575 => x"527d51a9",
+576 => x"d13f8a0b",
+577 => x"80f2f80c",
+578 => x"80d2a451",
+579 => x"f9be3f80",
+580 => x"c8a051f9",
+581 => x"b73f80d2",
+582 => x"a451f9b0",
+583 => x"3f80d684",
+584 => x"08802e89",
+585 => x"d33880c8",
+586 => x"d051f9a0",
+587 => x"3f80d2a4",
+588 => x"51f9993f",
+589 => x"80d68008",
+590 => x"5280c8fc",
+591 => x"51f98d3f",
+592 => x"80e69451",
+593 => x"b2ff3f81",
+594 => x"0b9a3d5e",
+595 => x"5b800b80",
+596 => x"d6800825",
+597 => x"82d43890",
+598 => x"3d5f80c1",
+599 => x"0b81b4bc",
+600 => x"34810b81",
+601 => x"b6980c80",
+602 => x"c20b81b4",
+603 => x"c0348240",
+604 => x"835a9f53",
+605 => x"80c9ac52",
+606 => x"7c51a8d6",
+607 => x"3f814180",
+608 => x"7d537e52",
+609 => x"568e943f",
+610 => x"8008762e",
+611 => x"09810683",
+612 => x"38815675",
+613 => x"81b6980c",
+614 => x"7f705856",
+615 => x"758325a2",
+616 => x"38751010",
+617 => x"16fd0542",
+618 => x"a93dffa4",
+619 => x"05538352",
+620 => x"76518cc3",
+621 => x"3f7f8105",
+622 => x"70417058",
+623 => x"56837624",
+624 => x"e0386154",
+625 => x"755380e6",
+626 => x"9c5281b4",
+627 => x"d0518cb7",
+628 => x"3f81b4c4",
+629 => x"08700858",
+630 => x"58b05377",
+631 => x"527651a7",
+632 => x"f13f850b",
+633 => x"8c190c85",
+634 => x"0b8c180c",
+635 => x"7708770c",
+636 => x"81b4c408",
+637 => x"5675802e",
+638 => x"8a387508",
+639 => x"770c81b4",
+640 => x"c408568c",
+641 => x"165381b4",
+642 => x"b808528a",
+643 => x"518be83f",
+644 => x"84170887",
+645 => x"ea38860b",
+646 => x"8c180c88",
+647 => x"17528818",
+648 => x"08518af3",
+649 => x"3f81b4c4",
+650 => x"08700878",
+651 => x"0c568c17",
+652 => x"7054598a",
+653 => x"52780851",
+654 => x"8bbd3f80",
+655 => x"c10b81b4",
+656 => x"c0335757",
+657 => x"767626a2",
+658 => x"3880c352",
+659 => x"76518ca1",
+660 => x"3f800861",
+661 => x"2e89e438",
+662 => x"81177081",
+663 => x"ff0681b4",
+664 => x"c0335858",
+665 => x"58757727",
+666 => x"e0387960",
+667 => x"29627054",
+668 => x"71535b59",
+669 => x"98b43f80",
+670 => x"0840787a",
+671 => x"31708729",
+672 => x"80083180",
+673 => x"088a0581",
+674 => x"b4bc3381",
+675 => x"b4b8085e",
+676 => x"5b525a56",
+677 => x"7780c12e",
+678 => x"89ce387b",
+679 => x"f738811b",
+680 => x"5b80d680",
+681 => x"087b25fd",
+682 => x"b13881b4",
+683 => x"ac51b095",
+684 => x"3f80c9cc",
+685 => x"51f6953f",
+686 => x"80d2a451",
+687 => x"f68e3f80",
+688 => x"c9dc51f6",
+689 => x"873f80d2",
+690 => x"a451f680",
+691 => x"3f81b4b8",
+692 => x"085280ca",
+693 => x"9451f5f4",
+694 => x"3f855280",
+695 => x"cab051f5",
+696 => x"eb3f81b6",
+697 => x"98085280",
+698 => x"cacc51f5",
+699 => x"df3f8152",
+700 => x"80cab051",
+701 => x"f5d63f81",
+702 => x"b4bc3352",
+703 => x"80cae851",
+704 => x"f5ca3f80",
+705 => x"c15280cb",
+706 => x"8451f5c0",
+707 => x"3f81b4c0",
+708 => x"335280cb",
+709 => x"a051f5b4",
+710 => x"3f80c252",
+711 => x"80cb8451",
+712 => x"f5aa3f81",
+713 => x"b4f00852",
+714 => x"80cbbc51",
+715 => x"f59e3f87",
+716 => x"5280cab0",
+717 => x"51f5953f",
+718 => x"80f2f808",
+719 => x"5280cbd8",
+720 => x"51f5893f",
+721 => x"80cbf451",
+722 => x"f5823f80",
+723 => x"cca051f4",
+724 => x"fb3f81b4",
+725 => x"c4087008",
+726 => x"535a80cc",
+727 => x"ac51f4ec",
+728 => x"3f80ccc8",
+729 => x"51f4e53f",
+730 => x"81b4c408",
+731 => x"84110853",
+732 => x"5680ccfc",
+733 => x"51f4d53f",
+734 => x"805280ca",
+735 => x"b051f4cc",
+736 => x"3f81b4c4",
+737 => x"08881108",
+738 => x"535880cd",
+739 => x"9851f4bc",
+740 => x"3f825280",
+741 => x"cab051f4",
+742 => x"b33f81b4",
+743 => x"c4088c11",
+744 => x"08535780",
+745 => x"cdb451f4",
+746 => x"a33f9152",
+747 => x"80cab051",
+748 => x"f49a3f81",
+749 => x"b4c40890",
+750 => x"055280cd",
+751 => x"d051f48c",
+752 => x"3f80cdec",
+753 => x"51f4853f",
+754 => x"80cea451",
+755 => x"f3fe3f81",
+756 => x"b4b40870",
+757 => x"08535f80",
+758 => x"ccac51f3",
+759 => x"ef3f80ce",
+760 => x"b851f3e8",
+761 => x"3f81b4b4",
+762 => x"08841108",
+763 => x"535b80cc",
+764 => x"fc51f3d8",
+765 => x"3f805280",
+766 => x"cab051f3",
+767 => x"cf3f81b4",
+768 => x"b4088811",
+769 => x"08535c80",
+770 => x"cd9851f3",
+771 => x"bf3f8152",
+772 => x"80cab051",
+773 => x"f3b63f81",
+774 => x"b4b4088c",
+775 => x"1108535a",
+776 => x"80cdb451",
+777 => x"f3a63f92",
+778 => x"5280cab0",
+779 => x"51f39d3f",
+780 => x"81b4b408",
+781 => x"90055280",
+782 => x"cdd051f3",
+783 => x"8f3f80cd",
+784 => x"ec51f388",
+785 => x"3f7f5280",
+786 => x"cef851f2",
+787 => x"ff3f8552",
+788 => x"80cab051",
+789 => x"f2f63f78",
+790 => x"5280cf94",
+791 => x"51f2ed3f",
+792 => x"8d5280ca",
+793 => x"b051f2e4",
+794 => x"3f615280",
+795 => x"cfb051f2",
+796 => x"db3f8752",
+797 => x"80cab051",
+798 => x"f2d23f60",
+799 => x"5280cfcc",
+800 => x"51f2c93f",
+801 => x"815280ca",
+802 => x"b051f2c0",
+803 => x"3f7d5280",
+804 => x"cfe851f2",
+805 => x"b73f80d0",
+806 => x"8451f2b0",
+807 => x"3f7c5280",
+808 => x"d0bc51f2",
+809 => x"a73f80d0",
+810 => x"d851f2a0",
+811 => x"3f80d2a4",
+812 => x"51f2993f",
+813 => x"81b4ac08",
+814 => x"81b4b008",
+815 => x"80e69408",
+816 => x"80e69808",
+817 => x"72713170",
+818 => x"74267574",
+819 => x"31707231",
+820 => x"80e68c0c",
+821 => x"444480e6",
+822 => x"900c80e6",
+823 => x"90085680",
+824 => x"d190555c",
+825 => x"595758f1",
+826 => x"e33f80e6",
+827 => x"8c085680",
+828 => x"762582a3",
+829 => x"3880d680",
+830 => x"0870719f",
+831 => x"2c9a3d53",
+832 => x"565680e6",
+833 => x"8c0880e6",
+834 => x"90084153",
+835 => x"7f547052",
+836 => x"5a89eb3f",
+837 => x"66685f80",
+838 => x"e5fc0c7d",
+839 => x"80e6800c",
+840 => x"80d68008",
+841 => x"709f2c58",
+842 => x"568058bd",
+843 => x"84c07855",
+844 => x"55765275",
+845 => x"53795187",
+846 => x"d13f953d",
+847 => x"80e68c08",
+848 => x"80e69008",
+849 => x"41557f56",
+850 => x"67694053",
+851 => x"7e547052",
+852 => x"5c89ab3f",
+853 => x"64665e80",
+854 => x"e6840c7c",
+855 => x"80e6880c",
+856 => x"80d68008",
+857 => x"709f2c40",
+858 => x"58805783",
+859 => x"dceb9480",
+860 => x"7755557e",
+861 => x"5277537b",
+862 => x"51878f3f",
+863 => x"64665d5b",
+864 => x"805e8ddd",
+865 => x"7e555580",
+866 => x"e68c0880",
+867 => x"e6900859",
+868 => x"52775379",
+869 => x"5186f33f",
+870 => x"66684054",
+871 => x"7e557a52",
+872 => x"7b53a93d",
+873 => x"ffa80551",
+874 => x"88d43f62",
+875 => x"645e81b4",
+876 => x"c80c7c81",
+877 => x"b4cc0c80",
+878 => x"d1a051f0",
+879 => x"8f3f80e6",
+880 => x"80085280",
+881 => x"d1d051f0",
+882 => x"833f80d1",
+883 => x"d851effc",
+884 => x"3f80e688",
+885 => x"085280d1",
+886 => x"d051eff0",
+887 => x"3f81b4cc",
+888 => x"085280d2",
+889 => x"8851efe4",
+890 => x"3f80d2a4",
+891 => x"51efdd3f",
+892 => x"800b800c",
+893 => x"a93d0d04",
+894 => x"80d2a851",
+895 => x"f6ac3977",
+896 => x"0857b053",
+897 => x"76527751",
+898 => x"9fc83f80",
+899 => x"c10b81b4",
+900 => x"c0335757",
+901 => x"f8ae3975",
+902 => x"8a3880e6",
+903 => x"90088126",
+904 => x"fdd33880",
+905 => x"d2d851ef",
+906 => x"a33f80d3",
+907 => x"9051ef9c",
+908 => x"3f80d2a4",
+909 => x"51ef953f",
+910 => x"80d68008",
+911 => x"70719f2c",
+912 => x"9a3d5356",
+913 => x"5680e68c",
+914 => x"0880e690",
+915 => x"0841537f",
+916 => x"5470525a",
+917 => x"87a83f66",
+918 => x"685f80e5",
+919 => x"fc0c7d80",
+920 => x"e6800c80",
+921 => x"d6800870",
+922 => x"9f2c5856",
+923 => x"8058bd84",
+924 => x"c0785555",
+925 => x"76527553",
+926 => x"7951858e",
+927 => x"3f953d80",
+928 => x"e68c0880",
+929 => x"e6900841",
+930 => x"557f5667",
+931 => x"6940537e",
+932 => x"5470525c",
+933 => x"86e83f64",
+934 => x"665e80e6",
+935 => x"840c7c80",
+936 => x"e6880c80",
+937 => x"d6800870",
+938 => x"9f2c4058",
+939 => x"805783dc",
+940 => x"eb948077",
+941 => x"55557e52",
+942 => x"77537b51",
+943 => x"84cc3f64",
+944 => x"665d5b80",
+945 => x"5e8ddd7e",
+946 => x"555580e6",
+947 => x"8c0880e6",
+948 => x"90085952",
+949 => x"77537951",
+950 => x"84b03f66",
+951 => x"6840547e",
+952 => x"557a527b",
+953 => x"53a93dff",
+954 => x"a8055186",
+955 => x"913f6264",
+956 => x"5e81b4c8",
+957 => x"0c7c81b4",
+958 => x"cc0c80d1",
+959 => x"a051edcc",
+960 => x"3f80e680",
+961 => x"085280d1",
+962 => x"d051edc0",
+963 => x"3f80d1d8",
+964 => x"51edb93f",
+965 => x"80e68808",
+966 => x"5280d1d0",
+967 => x"51edad3f",
+968 => x"81b4cc08",
+969 => x"5280d288",
+970 => x"51eda13f",
+971 => x"80d2a451",
+972 => x"ed9a3f80",
+973 => x"0b800ca9",
+974 => x"3d0d04a9",
+975 => x"3dffa005",
+976 => x"52805180",
+977 => x"d23f9f53",
+978 => x"80d3b052",
+979 => x"7c519d82",
+980 => x"3f7a7b81",
+981 => x"b4b80c81",
+982 => x"187081ff",
+983 => x"0681b4c0",
+984 => x"33595959",
+985 => x"5af5fe39",
+986 => x"ff16707b",
+987 => x"31600c5c",
+988 => x"800b811c",
+989 => x"5c5c80d6",
+990 => x"80087b25",
+991 => x"f3dc38f6",
+992 => x"a939ff3d",
+993 => x"0d738232",
+994 => x"70307072",
+995 => x"07802580",
+996 => x"0c525283",
+997 => x"3d0d04fe",
+998 => x"3d0d7476",
+999 => x"71535452",
+1000 => x"71822e83",
+1001 => x"38835171",
+1002 => x"812e9a38",
+1003 => x"8172269f",
+1004 => x"3871822e",
+1005 => x"b8387184",
+1006 => x"2ea93870",
+1007 => x"730c7080",
+1008 => x"0c843d0d",
+1009 => x"0480e40b",
+1010 => x"81b4b808",
+1011 => x"258b3880",
+1012 => x"730c7080",
+1013 => x"0c843d0d",
+1014 => x"0483730c",
+1015 => x"70800c84",
+1016 => x"3d0d0482",
+1017 => x"730c7080",
+1018 => x"0c843d0d",
+1019 => x"0481730c",
+1020 => x"70800c84",
+1021 => x"3d0d0480",
+1022 => x"3d0d7474",
+1023 => x"14820571",
+1024 => x"0c800c82",
+1025 => x"3d0d04f7",
+1026 => x"3d0d7b7d",
+1027 => x"7f618512",
+1028 => x"70822b75",
+1029 => x"11707471",
+1030 => x"70840553",
+1031 => x"0c5a5a5d",
+1032 => x"5b760c79",
+1033 => x"80f8180c",
+1034 => x"79861252",
+1035 => x"57585a5a",
+1036 => x"76762499",
+1037 => x"3876b329",
+1038 => x"822b7911",
+1039 => x"51537673",
+1040 => x"70840555",
+1041 => x"0c811454",
+1042 => x"757425f2",
+1043 => x"387681cc",
+1044 => x"2919fc11",
+1045 => x"088105fc",
+1046 => x"120c7a19",
+1047 => x"70089fa0",
+1048 => x"130c5856",
+1049 => x"850b81b4",
+1050 => x"b80c7580",
+1051 => x"0c8b3d0d",
+1052 => x"04fe3d0d",
+1053 => x"02930533",
+1054 => x"51800284",
+1055 => x"05970533",
+1056 => x"54527073",
+1057 => x"2e883871",
+1058 => x"800c843d",
+1059 => x"0d047081",
+1060 => x"b4bc3481",
+1061 => x"0b800c84",
+1062 => x"3d0d04f8",
+1063 => x"3d0d7a7c",
+1064 => x"5956820b",
+1065 => x"83195555",
+1066 => x"74167033",
+1067 => x"75335b51",
+1068 => x"5372792e",
+1069 => x"80c63880",
+1070 => x"c10b8116",
+1071 => x"81165656",
+1072 => x"57827525",
+1073 => x"e338ffa9",
+1074 => x"177081ff",
+1075 => x"06555973",
+1076 => x"82268338",
+1077 => x"87558153",
+1078 => x"7680d22e",
+1079 => x"98387752",
+1080 => x"75519bc3",
+1081 => x"3f805372",
+1082 => x"80082589",
+1083 => x"38871581",
+1084 => x"b4b80c81",
+1085 => x"5372800c",
+1086 => x"8a3d0d04",
+1087 => x"7281b4bc",
+1088 => x"34827525",
+1089 => x"ffa238ff",
+1090 => x"bd39ef3d",
+1091 => x"0d636567",
+1092 => x"5b427943",
+1093 => x"67695940",
+1094 => x"77415a80",
+1095 => x"5d805e61",
+1096 => x"7083ffff",
+1097 => x"0671902a",
+1098 => x"627083ff",
+1099 => x"ff067190",
+1100 => x"2a747229",
+1101 => x"74732975",
+1102 => x"73297774",
+1103 => x"2973902a",
+1104 => x"05721151",
+1105 => x"5856535f",
+1106 => x"5a575a58",
+1107 => x"55587373",
+1108 => x"27863884",
+1109 => x"80801656",
+1110 => x"73902a16",
+1111 => x"5b7883ff",
+1112 => x"ff067484",
+1113 => x"80802905",
+1114 => x"5c7a7c5a",
+1115 => x"5d785e77",
+1116 => x"7f296178",
+1117 => x"29057d05",
+1118 => x"5d7c7e56",
+1119 => x"7a0c7484",
+1120 => x"1b0c7980",
+1121 => x"0c933d0d",
+1122 => x"04f93d0d",
+1123 => x"797b7d54",
+1124 => x"58725977",
+1125 => x"30797030",
+1126 => x"7072079f",
+1127 => x"2a737131",
+1128 => x"5a525977",
+1129 => x"7956730c",
+1130 => x"53738413",
+1131 => x"0c54800c",
+1132 => x"893d0d04",
+1133 => x"f93d0d79",
+1134 => x"7b7d7f56",
+1135 => x"54525472",
+1136 => x"802ea038",
+1137 => x"70577158",
+1138 => x"a0733152",
+1139 => x"807225a1",
+1140 => x"38777074",
+1141 => x"2b577073",
+1142 => x"2a78752b",
+1143 => x"07565174",
+1144 => x"76535170",
+1145 => x"740c7184",
+1146 => x"150c7380",
+1147 => x"0c893d0d",
+1148 => x"04805677",
+1149 => x"72302b55",
+1150 => x"74765351",
+1151 => x"e639e43d",
+1152 => x"0d6ea13d",
+1153 => x"08a33d08",
+1154 => x"59575f80",
+1155 => x"764d774e",
+1156 => x"a33d08a5",
+1157 => x"3d08574b",
+1158 => x"754c5e7d",
+1159 => x"6c2486fb",
+1160 => x"38806a24",
+1161 => x"878f3869",
+1162 => x"6b58566b",
+1163 => x"6d5d467b",
+1164 => x"47754476",
+1165 => x"45646468",
+1166 => x"685c5c56",
+1167 => x"567481e7",
+1168 => x"38787627",
+1169 => x"82c73875",
+1170 => x"81ff2683",
+1171 => x"2b5583ff",
+1172 => x"ff76278c",
+1173 => x"389055fe",
+1174 => x"800a7627",
+1175 => x"83389855",
+1176 => x"75752a80",
+1177 => x"d3d00570",
+1178 => x"33a07731",
+1179 => x"71315755",
+1180 => x"5774802e",
+1181 => x"95387575",
+1182 => x"2ba07631",
+1183 => x"7a772b7c",
+1184 => x"722a077c",
+1185 => x"782b5d5b",
+1186 => x"59567590",
+1187 => x"2a7683ff",
+1188 => x"ff067154",
+1189 => x"7a535957",
+1190 => x"88803f80",
+1191 => x"085b87ea",
+1192 => x"3f800880",
+1193 => x"0879297c",
+1194 => x"902b7c90",
+1195 => x"2a075656",
+1196 => x"59737527",
+1197 => x"94388008",
+1198 => x"ff057615",
+1199 => x"55597574",
+1200 => x"26873874",
+1201 => x"742687b9",
+1202 => x"38765273",
+1203 => x"75315187",
+1204 => x"c93f8008",
+1205 => x"5587b33f",
+1206 => x"80088008",
+1207 => x"79297b83",
+1208 => x"ffff0677",
+1209 => x"902b0756",
+1210 => x"59577378",
+1211 => x"27963880",
+1212 => x"08ff0576",
+1213 => x"15555775",
+1214 => x"74268938",
+1215 => x"77742677",
+1216 => x"71315856",
+1217 => x"78902b77",
+1218 => x"0758805b",
+1219 => x"7a407741",
+1220 => x"7f615654",
+1221 => x"7d80d938",
+1222 => x"737f0c74",
+1223 => x"7f84050c",
+1224 => x"7e800c9e",
+1225 => x"3d0d0480",
+1226 => x"705c5874",
+1227 => x"7926dd38",
+1228 => x"7481ff26",
+1229 => x"832b5774",
+1230 => x"83ffff26",
+1231 => x"82a53874",
+1232 => x"772a80d3",
+1233 => x"d0057033",
+1234 => x"a0793171",
+1235 => x"31595c5d",
+1236 => x"7682b338",
+1237 => x"76547479",
+1238 => x"27833881",
+1239 => x"54797627",
+1240 => x"74075981",
+1241 => x"5878ffa2",
+1242 => x"38765880",
+1243 => x"5bff9d39",
+1244 => x"73527453",
+1245 => x"9e3de805",
+1246 => x"51fc8e3f",
+1247 => x"6769567f",
+1248 => x"0c747f84",
+1249 => x"050c7e80",
+1250 => x"0c9e3d0d",
+1251 => x"0475802e",
+1252 => x"81c43875",
+1253 => x"81ff2683",
+1254 => x"2b5583ff",
+1255 => x"ff76278c",
+1256 => x"389055fe",
+1257 => x"800a7627",
+1258 => x"83389855",
+1259 => x"75752a80",
+1260 => x"d3d00570",
+1261 => x"33a07731",
+1262 => x"7131575e",
+1263 => x"54748491",
+1264 => x"38787631",
+1265 => x"54817690",
+1266 => x"2a7783ff",
+1267 => x"ff065f5d",
+1268 => x"5b7b5273",
+1269 => x"5185c33f",
+1270 => x"80085785",
+1271 => x"ad3f8008",
+1272 => x"80087e29",
+1273 => x"78902b7c",
+1274 => x"902a0756",
+1275 => x"56597375",
+1276 => x"27943880",
+1277 => x"08ff0576",
+1278 => x"15555975",
+1279 => x"74268738",
+1280 => x"74742684",
+1281 => x"f3387b52",
+1282 => x"73753151",
+1283 => x"858c3f80",
+1284 => x"085584f6",
+1285 => x"3f800880",
+1286 => x"087e297b",
+1287 => x"83ffff06",
+1288 => x"77902b07",
+1289 => x"56595773",
+1290 => x"78279638",
+1291 => x"8008ff05",
+1292 => x"76155557",
+1293 => x"75742689",
+1294 => x"38777426",
+1295 => x"77713158",
+1296 => x"5a78902b",
+1297 => x"77077b41",
+1298 => x"417f6156",
+1299 => x"547d802e",
+1300 => x"fdc638fe",
+1301 => x"9b397552",
+1302 => x"815184ae",
+1303 => x"3f800856",
+1304 => x"feb13990",
+1305 => x"57fe800a",
+1306 => x"7527fdd3",
+1307 => x"38987571",
+1308 => x"2a80d3d0",
+1309 => x"057033a0",
+1310 => x"73317131",
+1311 => x"535d5e57",
+1312 => x"76802efd",
+1313 => x"cf38a077",
+1314 => x"3175782b",
+1315 => x"77722a07",
+1316 => x"77792b7b",
+1317 => x"7a2b7d74",
+1318 => x"2a077d7b",
+1319 => x"2b73902a",
+1320 => x"7483ffff",
+1321 => x"0671597f",
+1322 => x"772a585e",
+1323 => x"5c415f58",
+1324 => x"5c5483e6",
+1325 => x"3f800854",
+1326 => x"83d03f80",
+1327 => x"08800879",
+1328 => x"2975902b",
+1329 => x"7e902a07",
+1330 => x"56565973",
+1331 => x"75279938",
+1332 => x"8008ff05",
+1333 => x"7b155559",
+1334 => x"7a74268c",
+1335 => x"38737527",
+1336 => x"8738ff19",
+1337 => x"7b155559",
+1338 => x"76527375",
+1339 => x"315183aa",