Browse Source

Move date stamp generation to fpga build; record SDRAM checksum

Move the generation of the date stamp into the fpga build, to make
sure it reflects any changes including RTL-only changes. It is still a
.mif-only change and is conditional on dependency changes, so it does
not end up forcing an unnecessary RTL recompile.

Compute the expected checksum of the SDRAM memory data (dram.bin) and
record it in the .mif for validation.
H. Peter Anvin 3 years ago
parent
commit
9471dad838
24 changed files with 1914 additions and 1825 deletions
  1. 1 0
      fpga/.gitignore
  2. 19 5
      fpga/Makefile
  3. 3 3
      fpga/ip/fastmem_ip.v
  4. 2 2
      fpga/max80.qpf
  5. 1 9
      fpga/max80.qsf
  6. 1771 0
      fpga/output/sram.mif
  7. BIN
      fpga/output/v1.jic
  8. BIN
      fpga/output/v1.sof
  9. BIN
      fpga/output/v2.jic
  10. BIN
      fpga/output/v2.sof
  11. 2 3
      fpga/scripts/qsfdeps.pl
  12. 21 23
      fpga/spirom.sv
  13. 3 0
      fpga/v1.qsf
  14. 5 2
      fpga/v2.qsf
  15. 6 16
      rv32/Makefile
  16. 0 1746
      rv32/boot.mif
  17. 1 1
      rv32/checksum.h
  18. 49 11
      rv32/checksum.pl
  19. 3 0
      rv32/fw.h
  20. 16 1
      rv32/head.S
  21. 5 1
      rv32/max80.ld
  22. 1 1
      rv32/romcopy.c
  23. 5 1
      rv32/system.c
  24. 0 0
      tools/bin2mif.pl

+ 1 - 0
fpga/.gitignore

@@ -1,3 +1,4 @@
+output/*.bin
 output/*.jam
 output/*.jam
 output/*.map
 output/*.map
 output/*.jdi
 output/*.jdi

+ 19 - 5
fpga/Makefile

@@ -23,7 +23,8 @@ outdir		= output
 
 
 PERL    = perl
 PERL    = perl
 
 
-SUBDIRS = usb
+SUBDIRS     = usb
+PREREQFILES = $(outdir)/sram.mif
 
 
 alltarg := sof jic pow.rpt sta.rpt
 alltarg := sof jic pow.rpt sta.rpt
 allout   = $(foreach o,$(alltarg),$(outdir)/$(1).$(o))
 allout   = $(foreach o,$(alltarg),$(outdir)/$(1).$(o))
@@ -47,13 +48,24 @@ $(REVISIONS):
 %.targets:
 %.targets:
 	$(MAKE) $(call allout,$*)
 	$(MAKE) $(call allout,$*)
 
 
-$(outdir)/%.map.rpt: %.qsf
+$(outdir)/%.map.rpt: %.qsf %_map_deps
 	$(QMAP) $(PROJECT) -c $*
 	$(QMAP) $(PROJECT) -c $*
 
 
 $(outdir)/%.fit.rpt: $(outdir)/%.map.rpt
 $(outdir)/%.fit.rpt: $(outdir)/%.map.rpt
-	$(QFIT)  $(PROJECT) -c $*
+	$(QFIT) $(PROJECT) -c $*
 
 
-$(outdir)/%.mif_update.rpt: $(outdir)/%.fit.rpt
+all_map_deps: $(foreach rev,$(REVISIONS),$(rev),$(rev)_map_deps)
+
+$(outdir)/sram.bin: ../rv32/boot.bin $(all_map_deps)
+	LC_ALL=C date | tr '\n' '\0' | cat $< - > $@
+
+sram_depth  := 8192
+sram_width  := 32
+sram_stride := 1
+$(outdir)/%.mif: $(outdir)/%.bin ../tools/bin2mif.pl
+	$(PERL) ../tools/bin2mif.pl $< $@ $($*_depth) $($*_width) $($*_stride)
+
+$(outdir)/%.mif_update.rpt: $(outdir)/%.fit.rpt $(outdir)/sram.mif
 	$(QCDB) --update_mif $(PROJECT) -c $*
 	$(QCDB) --update_mif $(PROJECT) -c $*
 
 
 $(outdir)/%.sof: $(outdir)/%.mif_update.rpt
 $(outdir)/%.sof: $(outdir)/%.mif_update.rpt
@@ -69,8 +81,10 @@ $(outdir)/%.pow.rpt: $(outdir)/%.sta.rpt
 $(outdir)/%.jic:  $(PROJECT)-%.cof $(outdir)/%.sof ../rv32/dram.hex
 $(outdir)/%.jic:  $(PROJECT)-%.cof $(outdir)/%.sof ../rv32/dram.hex
 	$(QCPF) --convert $<
 	$(QCPF) --convert $<
 
 
-# Prerequisite directories
+# Prerequisite directories and files
 prereq:
 prereq:
+	mkdir -p $(outdir)
+	$(MAKE) $(PREREQFILES)
 	for d in $(SUBDIRS); do $(MAKE) -C $$d; done
 	for d in $(SUBDIRS); do $(MAKE) -C $$d; done
 
 
 # Clean out SignalTap
 # Clean out SignalTap

+ 3 - 3
fpga/ip/fastmem_ip.v

@@ -97,7 +97,7 @@ module fastmem_ip (
 		altsyncram_component.byte_size = 8,
 		altsyncram_component.byte_size = 8,
 		altsyncram_component.clock_enable_input_a = "BYPASS",
 		altsyncram_component.clock_enable_input_a = "BYPASS",
 		altsyncram_component.clock_enable_output_a = "BYPASS",
 		altsyncram_component.clock_enable_output_a = "BYPASS",
-		altsyncram_component.init_file = "../rv32/boot.mif",
+		altsyncram_component.init_file = "output/sram.mif",
 		altsyncram_component.intended_device_family = "Cyclone IV E",
 		altsyncram_component.intended_device_family = "Cyclone IV E",
 		altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",
 		altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",
 		altsyncram_component.lpm_type = "altsyncram",
 		altsyncram_component.lpm_type = "altsyncram",
@@ -136,7 +136,7 @@ endmodule
 // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
 // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
 // Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
 // Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
 // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
 // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
-// Retrieval info: PRIVATE: MIFfilename STRING "../rv32/boot.mif"
+// Retrieval info: PRIVATE: MIFfilename STRING "output/sram.mif"
 // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192"
 // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "8192"
 // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
 // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
 // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "2"
 // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "2"
@@ -154,7 +154,7 @@ endmodule
 // Retrieval info: CONSTANT: BYTE_SIZE NUMERIC "8"
 // Retrieval info: CONSTANT: BYTE_SIZE NUMERIC "8"
 // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
 // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
 // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
 // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
-// Retrieval info: CONSTANT: INIT_FILE STRING "../rv32/boot.mif"
+// Retrieval info: CONSTANT: INIT_FILE STRING "output/sram.mif"
 // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
 // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
 // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
 // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
 // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
 // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"

+ 2 - 2
fpga/max80.qpf

@@ -19,12 +19,12 @@
 #
 #
 # Quartus Prime
 # Quartus Prime
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-# Date created = 04:32:14  January 27, 2022
+# Date created = 00:17:28  January 28, 2022
 #
 #
 # -------------------------------------------------------------------------- #
 # -------------------------------------------------------------------------- #
 
 
 QUARTUS_VERSION = "21.1"
 QUARTUS_VERSION = "21.1"
-DATE = "04:32:14  January 27, 2022"
+DATE = "00:17:28  January 28, 2022"
 
 
 # Revisions
 # Revisions
 
 

+ 1 - 9
fpga/max80.qsf

@@ -114,8 +114,6 @@ set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULA
 set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO"
 set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO"
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to flash_clk
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to flash_clk
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to flash_cs_n
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to flash_cs_n
-set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to flash_miso
-set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to flash_mosi
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to board_id
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to board_id
 
 
 
 
@@ -248,10 +246,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE rng.sv
 set_global_assignment -name QIP_FILE ip/int_osc/synthesis/int_osc.qip
 set_global_assignment -name QIP_FILE ip/int_osc/synthesis/int_osc.qip
 set_global_assignment -name VERILOG_FILE ip/pll4.v
 set_global_assignment -name VERILOG_FILE ip/pll4.v
 set_global_assignment -name VERILOG_FILE ip/pll3.v
 set_global_assignment -name VERILOG_FILE ip/pll3.v
-set_global_assignment -name VERILOG_FILE ip/pll2_16.v
-set_global_assignment -name VERILOG_FILE ip/pll2_48.v
-set_global_assignment -name QIP_FILE ip/pll2_16.qip
-set_global_assignment -name QIP_FILE ip/pll2_48.qip
 set_global_assignment -name VERILOG_FILE usb/usb_fs_phy/src_v/usb_fs_phy.v
 set_global_assignment -name VERILOG_FILE usb/usb_fs_phy/src_v/usb_fs_phy.v
 set_global_assignment -name VERILOG_FILE usb/usb_serial/src_v/usbf_sie_tx.v
 set_global_assignment -name VERILOG_FILE usb/usb_serial/src_v/usbf_sie_tx.v
 set_global_assignment -name VERILOG_FILE usb/usb_serial/src_v/usbf_sie_rx.v
 set_global_assignment -name VERILOG_FILE usb/usb_serial/src_v/usbf_sie_rx.v
@@ -268,7 +262,7 @@ set_global_assignment -name SYSTEMVERILOG_FILE abcbus.sv
 set_global_assignment -name VERILOG_FILE ip/abcmapram.v
 set_global_assignment -name VERILOG_FILE ip/abcmapram.v
 set_global_assignment -name VERILOG_FILE ip/fastmem_ip.v
 set_global_assignment -name VERILOG_FILE ip/fastmem_ip.v
 set_global_assignment -name SYSTEMVERILOG_FILE fast_mem.sv
 set_global_assignment -name SYSTEMVERILOG_FILE fast_mem.sv
-set_global_assignment -name MIF_FILE ../rv32/boot.mif
+set_global_assignment -name MIF_FILE output/sram.mif
 set_global_assignment -name VERILOG_FILE picorv32.v
 set_global_assignment -name VERILOG_FILE picorv32.v
 set_global_assignment -name SYSTEMVERILOG_FILE functions.sv
 set_global_assignment -name SYSTEMVERILOG_FILE functions.sv
 set_global_assignment -name SYSTEMVERILOG_FILE spi_master.sv
 set_global_assignment -name SYSTEMVERILOG_FILE spi_master.sv
@@ -285,8 +279,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE tmdsenc.sv
 set_global_assignment -name SYSTEMVERILOG_FILE video.sv
 set_global_assignment -name SYSTEMVERILOG_FILE video.sv
 set_global_assignment -name SDC_FILE max80.sdc
 set_global_assignment -name SDC_FILE max80.sdc
 set_global_assignment -name SYSTEMVERILOG_FILE max80.sv
 set_global_assignment -name SYSTEMVERILOG_FILE max80.sv
-set_global_assignment -name SYSTEMVERILOG_FILE v1.sv
-set_global_assignment -name SYSTEMVERILOG_FILE v2.sv
 set_global_assignment -name SOURCE_TCL_SCRIPT_FILE scripts/pins.tcl
 set_global_assignment -name SOURCE_TCL_SCRIPT_FILE scripts/pins.tcl
 set_global_assignment -name VERILOG_FILE ip/fifo.v
 set_global_assignment -name VERILOG_FILE ip/fifo.v
 set_global_assignment -name VERILOG_FILE ip/ddufifo.v
 set_global_assignment -name VERILOG_FILE ip/ddufifo.v

+ 1771 - 0
fpga/output/sram.mif

@@ -0,0 +1,1771 @@
+-- generated from output/sram.bin
+DEPTH = 8192;
+WIDTH = 32;
+ADDRESS_RADIX = HEX;
+DATA_RADIX = HEX;
+CONTENT BEGIN
+0000 : 00000000;
+0001 : 00000000;
+0002 : 4631DEFA;
+0003 : 00100000;
+0004 : C0102473;
+0005 : 00008137;
+0006 : 2A80006F;
+0007 : 00000000;
+0008 : 0001210B;
+0009 : 008DF413;
+000A : 00040863;
+000B : 3AD000EF;
+000C : 408D8DB3;
+000D : 060D8063;
+000E : 00000493;
+000F : 0FFDF293;
+0010 : 00029663;
+0011 : 008DDD93;
+0012 : 02048493;
+0013 : 00FDF293;
+0014 : 00029663;
+0015 : 004DDD93;
+0016 : 01048493;
+0017 : 003DF293;
+0018 : 00029663;
+0019 : 002DDD93;
+001A : 00848493;
+001B : 001DF293;
+001C : 00029663;
+001D : 001DDD93;
+001E : 00448493;
+001F : 0024D513;
+0020 : 000D0593;
+0021 : 0B0480E7;
+0022 : 001DDD93;
+0023 : 00448493;
+0024 : FA0D96E3;
+0025 : 30200073;
+0026 : 00000000;
+0027 : 00000013;
+0028 : 00008067;
+0029 : 0000250B;
+002A : 0005B00B;
+002B : 00000000;
+002C : 2850006F;
+002D : 5A80006F;
+002E : 5980006F;
+002F : 31D0006F;
+0030 : 5A80006F;
+0031 : 2710006F;
+0032 : 06D0106F;
+0033 : 2690006F;
+0034 : 2650006F;
+0035 : 2A90006F;
+0036 : 25D0006F;
+0037 : 2590006F;
+0038 : 2550006F;
+0039 : 2510006F;
+003A : 00000000;
+003B : 7C5C2D2F;
+003C : 4101D2B0;
+003D : FFFFFFFF;
+003E : FFFFFFFF;
+003F : 00001B00;
+0040 : 00000040;
+0041 : 00000000;
+0042 : 00000000;
+0043 : 00000000;
+0044 : 00000000;
+0045 : 00000000;
+0046 : 00000000;
+0047 : 00000000;
+0048 : 00000000;
+0049 : 00000000;
+004A : 00000000;
+004B : 00000000;
+004C : 00000000;
+004D : 00000000;
+004E : 00000000;
+004F : 00000000;
+0050 : 00000000;
+0051 : 00000000;
+0052 : 00000000;
+0053 : 00000000;
+0054 : 00000000;
+0055 : 00000000;
+0056 : 00000000;
+0057 : 00000000;
+0058 : 00000000;
+0059 : 00000000;
+005A : 00000000;
+005B : 00000000;
+005C : 00000000;
+005D : 00000000;
+005E : 00000000;
+005F : 00000000;
+0060 : 00000000;
+0061 : 00000000;
+0062 : 00000000;
+0063 : 00000000;
+0064 : 00000000;
+0065 : 00000000;
+0066 : 00000000;
+0067 : 00000000;
+0068 : 00000000;
+0069 : 00000000;
+006A : 00000000;
+006B : 00000000;
+006C : 00000000;
+006D : 00000000;
+006E : 00000000;
+006F : 00000000;
+0070 : 00000000;
+0071 : 00000000;
+0072 : 00000000;
+0073 : 00000000;
+0074 : 00000000;
+0075 : 00000000;
+0076 : 00000000;
+0077 : 00000000;
+0078 : 00000000;
+0079 : 00000000;
+007A : 00000000;
+007B : 00000000;
+007C : 00000000;
+007D : 00000000;
+007E : 00000000;
+007F : 00000000;
+0080 : 00000000;
+0081 : 00000000;
+0082 : 00000000;
+0083 : 00000000;
+0084 : 00000000;
+0085 : 00000000;
+0086 : 00000000;
+0087 : 00000000;
+0088 : 00000000;
+0089 : 00000000;
+008A : 00000000;
+008B : 00000000;
+008C : 00000000;
+008D : 00000000;
+008E : 00000000;
+008F : 00000000;
+0090 : 00000000;
+0091 : 00000000;
+0092 : 00000000;
+0093 : 00000000;
+0094 : 00000000;
+0095 : 00000000;
+0096 : 00000000;
+0097 : 00000000;
+0098 : 00000000;
+0099 : 00000000;
+009A : 00000000;
+009B : 00000000;
+009C : 00000000;
+009D : 00000000;
+009E : 00000000;
+009F : 00000000;
+00A0 : 00000000;
+00A1 : 00000000;
+00A2 : 00000000;
+00A3 : 00000000;
+00A4 : 00000000;
+00A5 : 00000000;
+00A6 : 00000000;
+00A7 : 00000000;
+00A8 : 00000000;
+00A9 : 00000000;
+00AA : 00000000;
+00AB : 00000000;
+00AC : 00000000;
+00AD : 00000000;
+00AE : 00000000;
+00AF : 00000000;
+00B0 : FFF04293;
+00B1 : 0602800B;
+00B2 : 00000193;
+00B3 : 0001A18B;
+00B4 : 12000513;
+00B5 : 2C000593;
+00B6 : 00052023;
+00B7 : 00052223;
+00B8 : 00052423;
+00B9 : 00052623;
+00BA : 00052823;
+00BB : 00052A23;
+00BC : 00052C23;
+00BD : 00052E23;
+00BE : 02050513;
+00BF : FCB56EE3;
+00C0 : 12802023;
+00C1 : 0040006F;
+00C2 : CE061101;
+00C3 : CA26CC22;
+00C4 : C64EC84A;
+00C5 : C256C452;
+00C6 : 2659C05A;
+00C7 : 1A604283;
+00C8 : 00028663;
+00C9 : 40007097;
+00CA : E2E080E7;
+00CB : 400074B7;
+00CC : 40007937;
+00CD : 5AFD4981;
+00CE : 1A448493;
+00CF : 20E90913;
+00D0 : 40007A37;
+00D1 : 0750008B;
+00D2 : 0810878B;
+00D3 : 1A704303;
+00D4 : 00030663;
+00D5 : 40001097;
+00D6 : 424080E7;
+00D7 : 3F3000EF;
+00D8 : 89C02403;
+00D9 : FE89F0E3;
+00DA : 00845393;
+00DB : 0FF47593;
+00DC : 93638626;
+00DD : 864A0003;
+00DE : 1AEA0513;
+00DF : 40001097;
+00E0 : 120080E7;
+00E1 : BF7D89A2;
+00E2 : 00000697;
+00E3 : D1468693;
+00E4 : 897D4690;
+00E5 : 8E49053E;
+00E6 : 8682C290;
+00E7 : 00000697;
+00E8 : D0068693;
+00E9 : 897D46D0;
+00EA : 8E49051E;
+00EB : 8682C290;
+00EC : F713C25D;
+00ED : 17930FF5;
+00EE : E2B30107;
+00EF : 931300E7;
+00F0 : 76930082;
+00F1 : 63B30015;
+00F2 : 87AA0053;
+00F3 : 4805EAC9;
+00F4 : 08C87163;
+00F5 : 0027F893;
+00F6 : 08089F63;
+00F7 : F6634EFD;
+00F8 : 0F1308CE;
+00F9 : 7F93FE06;
+00FA : 8F13FE0F;
+00FB : 87330207;
+00FC : A01901EF;
+00FD : 020F0F13;
+00FE : 0077A023;
+00FF : 0077A223;
+0100 : 0077A423;
+0101 : 0077A623;
+0102 : 0077A823;
+0103 : 0077AA23;
+0104 : 0077AC23;
+0105 : 0077AE23;
+0106 : 87FA86FA;
+0107 : FDE71CE3;
+0108 : 428D8A7D;
+0109 : 02C2F363;
+010A : FFC60313;
+010B : FFC37893;
+010C : 00478E93;
+010D : 01D88E33;
+010E : 0E91A011;
+010F : 0076A023;
+0110 : 86F687F6;
+0111 : FFCE9BE3;
+0112 : 73938A0D;
+0113 : 90630026;
+0114 : 8A050203;
+0115 : 8082E211;
+0116 : 00B78023;
+0117 : 07938082;
+0118 : 00230015;
+0119 : 167D0075;
+011A : 86BEB79D;
+011B : 9023BF5D;
+011C : 078900B7;
+011D : 9023BFF9;
+011E : 16790077;
+011F : BFB90789;
+0120 : 00000000;
+0121 : 00B567B3;
+0122 : 8B8D8FD1;
+0123 : 04079263;
+0124 : 00C50733;
+0125 : 8A7186AA;
+0126 : 40C007B3;
+0127 : 4C478067;
+0128 : 02000613;
+0129 : CEDC4DDC;
+012A : CE9C4D9C;
+012B : CADC49DC;
+012C : CA9C499C;
+012D : C6DC45DC;
+012E : C69C459C;
+012F : C2DC41DC;
+0130 : C29C419C;
+0131 : 96B295B2;
+0132 : FCE6ECE3;
+0133 : 00018082;
+0134 : 00C50733;
+0135 : 00050693;
+0136 : 0005C783;
+0137 : 00F68023;
+0138 : 06850585;
+0139 : FEE6EAE3;
+013A : 00008082;
+013B : 46254721;
+013C : 01C55693;
+013D : 05700793;
+013E : 64630512;
+013F : 079300D6;
+0140 : 82B30300;
+0141 : 002300D7;
+0142 : 177D9850;
+0143 : 8082F375;
+0144 : CE061101;
+0145 : CA26CC22;
+0146 : C64EC84A;
+0147 : C256C452;
+0148 : 297387AA;
+0149 : 84933430;
+014A : 64090015;
+014B : FFE4FA13;
+014C : 94840693;
+014D : FFCA0993;
+014E : 94840413;
+014F : 4AB54E29;
+0150 : 0006C703;
+0151 : E3710685;
+0152 : 483548A9;
+0153 : 0007C083;
+0154 : 93630785;
+0155 : 02930C00;
+0156 : 45290084;
+0157 : C30343B5;
+0158 : 02850002;
+0159 : 0C031163;
+015A : 3749854E;
+015B : 00F40393;
+015C : 45B54629;
+015D : 0003C503;
+015E : ED4D0385;
+015F : 0029D583;
+0160 : FFCA5803;
+0161 : 01059613;
+0162 : 01060533;
+0163 : 08933785;
+0164 : 43290144;
+0165 : C98342B5;
+0166 : 08850008;
+0167 : 0A099363;
+0168 : 4935854A;
+0169 : 4A2937A1;
+016A : 99200023;
+016B : 99400023;
+016C : 491D4481;
+016D : 02000A13;
+016E : 49A14AB5;
+016F : 85334401;
+0170 : 33D90084;
+0171 : 0E133725;
+0172 : 15630200;
+0173 : 00230124;
+0174 : 4E299950;
+0175 : 99C00023;
+0176 : 12E30405;
+0177 : 04A1FF34;
+0178 : FD449EE3;
+0179 : C0102EF3;
+017A : 1908BF37;
+017B : 0FFF0F93;
+017C : C01026F3;
+017D : 41D68733;
+017E : FEEFFCE3;
+017F : 878B57FD;
+0180 : 40850607;
+0181 : 80102623;
+0182 : 1463BFF5;
+0183 : 002301C7;
+0184 : 00239950;
+0185 : B72D98E0;
+0186 : 01109463;
+0187 : 99000023;
+0188 : 98100023;
+0189 : 1463B725;
+018A : 002300A3;
+018B : 00239870;
+018C : B7359860;
+018D : 00C51463;
+018E : 98B00023;
+018F : 98A00023;
+0190 : 9463BF15;
+0191 : 00230069;
+0192 : 00239850;
+0193 : B7A19930;
+0194 : 11416509;
+0195 : 96E50513;
+0196 : 3D5DC606;
+0197 : 11416509;
+0198 : 97950513;
+0199 : 356DC606;
+019A : 12400293;
+019B : 0002A783;
+019C : 00178313;
+019D : 0062A023;
+019E : 01F37393;
+019F : 02039163;
+01A0 : 00535513;
+01A1 : 00357593;
+01A2 : 0EC00693;
+01A3 : 00B68833;
+01A4 : 00084883;
+01A5 : 00234E21;
+01A6 : 00239910;
+01A7 : 808299C0;
+01A8 : CE061101;
+01A9 : CA26CC22;
+01AA : C64EC84A;
+01AB : C256C452;
+01AC : C0102773;
+01AD : 12E02423;
+01AE : DE900093;
+01AF : 0610078B;
+01B0 : 02936409;
+01B1 : 83139484;
+01B2 : 04130452;
+01B3 : 49299484;
+01B4 : 43834535;
+01B5 : 03050003;
+01B6 : 18039163;
+01B7 : 85136489;
+01B8 : 48A9B6E4;
+01B9 : 45834835;
+01BA : 05050005;
+01BB : 16059E63;
+01BC : 00234635;
+01BD : 46A998C0;
+01BE : 98D00023;
+01BF : 2423481D;
+01C0 : 58FD8100;
+01C1 : 0710090B;
+01C2 : 20097993;
+01C3 : FE098CE3;
+01C4 : 193ACA37;
+01C5 : 40000AB7;
+01C6 : 40008E37;
+01C7 : F4D57EB7;
+01C8 : 604A0613;
+01C9 : 000A8693;
+01CA : 448159FD;
+01CB : 45014A01;
+01CC : 918E0093;
+01CD : 25FE8A93;
+01CE : 1216EF63;
+01CF : 07A40F13;
+01D0 : 47B54729;
+01D1 : 000F4F83;
+01D2 : 9D630F05;
+01D3 : 3B79140F;
+01D4 : 09040713;
+01D5 : 4F354FA9;
+01D6 : 00074783;
+01D7 : 9A630705;
+01D8 : 25031407;
+01D9 : 33590080;
+01DA : 002342B5;
+01DB : 43299850;
+01DC : 98600023;
+01DD : 09B40393;
+01DE : 4E354EA9;
+01DF : 0003C503;
+01E0 : 1F630385;
+01E1 : 854E1205;
+01E2 : 05933395;
+01E3 : 00230200;
+01E4 : C51398B0;
+01E5 : 3B99FFF4;
+01E6 : 00234635;
+01E7 : 46A998C0;
+01E8 : 98D00023;
+01E9 : 140A1163;
+01EA : 400089B7;
+01EB : 40013A37;
+01EC : 89134881;
+01ED : 06939189;
+01EE : 6B632B0A;
+01EF : 9B6312D9;
+01F0 : 0F931408;
+01F1 : 47198080;
+01F2 : 00EFA023;
+01F3 : A0234795;
+01F4 : 041300FF;
+01F5 : 46290E54;
+01F6 : 408345B5;
+01F7 : 04050004;
+01F8 : 12009F63;
+01F9 : C01022F3;
+01FA : 1908B337;
+01FB : 0FF30393;
+01FC : C0102573;
+01FD : 405505B3;
+01FE : FEB3FCE3;
+01FF : 00234635;
+0200 : 46A998C0;
+0201 : 400074B7;
+0202 : 98D00023;
+0203 : 1D948813;
+0204 : 43B54529;
+0205 : 00084883;
+0206 : 99630805;
+0207 : 20971008;
+0208 : 80E74000;
+0209 : 7937FD60;
+020A : 09934000;
+020B : 43291F39;
+020C : CA034435;
+020D : 09850009;
+020E : 100A1163;
+020F : 80002A83;
+0210 : 38584E37;
+0211 : 14DE0E93;
+0212 : 11DA8F63;
+0213 : 40007737;
+0214 : 1F770093;
+0215 : 4AB544A9;
+0216 : 9463A8F5;
+0217 : 00230123;
+0218 : 002398A0;
+0219 : B5B59870;
+021A : 01159463;
+021B : 99000023;
+021C : 98B00023;
+021D : A283BD8D;
+021E : 43330006;
+021F : A0230056;
+0220 : A3830066;
+0221 : 06330006;
+0222 : A0230356;
+0223 : C5B30056;
+0224 : 95160063;
+0225 : 00BA6A33;
+0226 : 0054E4B3;
+0227 : 0059F9B3;
+0228 : BD590691;
+0229 : 00EF9463;
+022A : 98F00023;
+022B : 99F00023;
+022C : 9463BD51;
+022D : 002301F7;
+022E : 002399E0;
+022F : BD6998F0;
+0230 : 01D51463;
+0231 : 99C00023;
+0232 : 98A00023;
+0233 : 1463BD45;
+0234 : 00230099;
+0235 : 00239900;
+0236 : C9039920;
+0237 : 08850008;
+0238 : FE0917E3;
+0239 : 0893B5D1;
+023A : 44A90B44;
+023B : B7F54835;
+023C : 00092803;
+023D : E8B30911;
+023E : B5C10108;
+023F : 015F1463;
+0240 : 99C00023;
+0241 : 99E00023;
+0242 : 000ECF03;
+0243 : 17E30E85;
+0244 : BD45FE0F;
+0245 : 0CC40E93;
+0246 : 4E354AA9;
+0247 : 9463B7F5;
+0248 : 002300C0;
+0249 : 002398B0;
+024A : BD459810;
+024B : 00A89463;
+024C : 98700023;
+024D : 99100023;
+024E : 1463BDF1;
+024F : 0023006A;
+0250 : 00239880;
+0251 : B5F59940;
+0252 : 00929463;
+0253 : 99500023;
+0254 : 98500023;
+0255 : 0000C283;
+0256 : 97E30085;
+0257 : 1097FE02;
+0258 : 80E74000;
+0259 : 4583AB20;
+025A : 46038060;
+025B : 46838050;
+025C : 47038040;
+025D : 7F378070;
+025E : 05134000;
+025F : 1097271F;
+0260 : 80E74000;
+0261 : 4F83B1E0;
+0262 : 47038060;
+0263 : 84638070;
+0264 : 7EB702EF;
+0265 : 8F934000;
+0266 : 4F2920FE;
+0267 : A03949B5;
+0268 : 01E79463;
+0269 : 99300023;
+026A : 98F00023;
+026B : 000FC783;
+026C : F7FD0F85;
+026D : 47B5B76D;
+026E : 98F00023;
+026F : 70B74429;
+0270 : 00234000;
+0271 : 82939880;
+0272 : 4A2923E0;
+0273 : C3034E35;
+0274 : 02850002;
+0275 : 12031B63;
+0276 : 111113B7;
+0277 : 44332537;
+0278 : 400135B7;
+0279 : 8A134401;
+027A : 09931113;
+027B : 84932115;
+027C : 79370405;
+027D : 4AA14000;
+027E : 03440633;
+027F : 00241693;
+0280 : 00D48833;
+0281 : 29C90513;
+0282 : 05B30405;
+0283 : 20230136;
+0284 : 278300B8;
+0285 : 10970008;
+0286 : 80E74000;
+0287 : 1DE3A860;
+0288 : 48B5FD54;
+0289 : 99100023;
+028A : 00234E29;
+028B : 498199C0;
+028C : 9E934A21;
+028D : 8F330029;
+028E : 258301D4;
+028F : 0513000F;
+0290 : 098529C9;
+0291 : 40001097;
+0292 : A58080E7;
+0293 : FF4993E3;
+0294 : 40007FB7;
+0295 : 250F8793;
+0296 : 483548A9;
+0297 : 0007C703;
+0298 : EB5D0785;
+0299 : 64894AA1;
+029A : 0804878B;
+029B : C0002583;
+029C : 29C90513;
+029D : 10971AFD;
+029E : 80E74000;
+029F : 95E3A260;
+02A0 : 7937FE0A;
+02A1 : 00934000;
+02A2 : 46A920C9;
+02A3 : C2834635;
+02A4 : 00850000;
+02A5 : 08029963;
+02A6 : 40001097;
+02A7 : DB4080E7;
+02A8 : 04134311;
+02A9 : 20238080;
+02AA : 10970064;
+02AB : 80E74000;
+02AC : 2097AC00;
+02AD : 80E74000;
+02AE : 438D0260;
+02AF : 00742023;
+02B0 : 40001097;
+02B1 : 4B2080E7;
+02B2 : 40002097;
+02B3 : A76080E7;
+02B4 : 40002097;
+02B5 : F44080E7;
+02B6 : C0084509;
+02B7 : 40002097;
+02B8 : 008080E7;
+02B9 : C00C4585;
+02BA : 40002097;
+02BB : DE6080E7;
+02BC : 88002623;
+02BD : 80002423;
+02BE : 446240F2;
+02BF : 494244D2;
+02C0 : 4A2249B2;
+02C1 : 61054A92;
+02C2 : 14638082;
+02C3 : 00230143;
+02C4 : 002399C0;
+02C5 : BD659860;
+02C6 : 01171463;
+02C7 : 99000023;
+02C8 : 98E00023;
+02C9 : 9463BF25;
+02CA : 002300D2;
+02CB : 002398C0;
+02CC : BFB19850;
+02CD : 95334785;
+02CE : 429300A7;
+02CF : 050BFFF5;
+02D0 : 80820655;
+02D1 : 00C02703;
+02D2 : 3B0002B7;
+02D3 : A0A02023;
+02D4 : 00E28333;
+02D5 : 00B303B3;
+02D6 : 2D000537;
+02D7 : A0702223;
+02D8 : 24238E49;
+02D9 : 8082A0C0;
+02DA : A0A02023;
+02DB : 200007B7;
+02DC : A0002223;
+02DD : 24238DDD;
+02DE : 8082A0B0;
+02DF : 12C00293;
+02E0 : 0002A703;
+02E1 : 00170693;
+02E2 : 00D2A023;
+02E3 : 4585CB19;
+02E4 : 02B70763;
+02E5 : 20000F13;
+02E6 : DFF00F93;
+02E7 : 07FF078B;
+02E8 : 05378082;
+02E9 : 83374000;
+02EA : 06134000;
+02EB : 03930005;
+02EC : 86339183;
+02ED : 458140C3;
+02EE : 00050513;
+02EF : 8837B761;
+02F0 : 3E374000;
+02F1 : 08934001;
+02F2 : 0E939188;
+02F3 : 85B32B0E;
+02F4 : 0513411E;
+02F5 : BF499188;
+02F6 : CE061101;
+02F7 : CC22CA26;
+02F8 : C64EC84A;
+02F9 : 5783C452;
+02FA : 00938880;
+02FB : 949318C0;
+02FC : F2930107;
+02FD : A4030FF7;
+02FE : 80C10000;
+02FF : 12028263;
+0300 : 89104303;
+0301 : 89004583;
+0302 : 76134695;
+0303 : F5930FF3;
+0304 : E4630FF5;
+0305 : 4F051066;
+0306 : 14CF6F63;
+0307 : 10061463;
+0308 : 14040D63;
+0309 : 00442F83;
+030A : 020F8963;
+030B : 8713401C;
+030C : C0180017;
+030D : 00B78023;
+030E : 01D44083;
+030F : 01444283;
+0310 : 0050F333;
+0311 : 00640EA3;
+0312 : 88600AA3;
+0313 : 83934054;
+0314 : 2223FFF6;
+0315 : 98630074;
+0316 : 03B30203;
+0317 : 8B2300C4;
+0318 : 5A0300B3;
+0319 : 55330104;
+031A : 791340CA;
+031B : 0C630015;
+031C : 09930009;
+031D : 98130086;
+031E : 08B30029;
+031F : AE030104;
+0320 : 85220008;
+0321 : F5939E02;
+0322 : C1A11004;
+0323 : 0D634450;
+0324 : 0E931406;
+0325 : 2623FFF6;
+0326 : 876301D4;
+0327 : 4083140E;
+0328 : 428301D4;
+0329 : F6B30154;
+032A : 0EA30050;
+032B : 0AA300D4;
+032C : 238388D0;
+032D : 8A130084;
+032E : 24230013;
+032F : C5030144;
+0330 : 0E230003;
+0331 : 0A2300A4;
+0332 : F91388A0;
+0333 : 05632004;
+0334 : 48030209;
+0335 : 498301D4;
+0336 : 0AA38950;
+0337 : 58838900;
+0338 : F5930104;
+0339 : FE130FF9;
+033A : 07632008;
+033B : 2E83000E;
+033C : 460503C4;
+033D : 9E828522;
+033E : 5F83444C;
+033F : 40400104;
+0340 : 00B03633;
+0341 : 00861F13;
+0342 : 01FF6733;
+0343 : 008037B3;
+0344 : 00E7E333;
+0345 : 08236093;
+0346 : 439DA09D;
+0347 : 06760F63;
+0348 : A8A1F03D;
+0349 : 03F5FA13;
+034A : 002A1913;
+034B : 1BC00813;
+034C : 012808B3;
+034D : 0008A403;
+034E : 11400023;
+034F : 0080A023;
+0350 : 08200313;
+0351 : 2E03C015;
+0352 : 5F8300C4;
+0353 : 405C0104;
+0354 : 01C03EB3;
+0355 : 008E9F13;
+0356 : 01FF6733;
+0357 : 00F030B3;
+0358 : 00E0E2B3;
+0359 : 0822E313;
+035A : 88601523;
+035B : C0114681;
+035C : 2A234C54;
+035D : 12E388D0;
+035E : 0093EE04;
+035F : 92930820;
+0360 : E4B30100;
+0361 : 24230092;
+0362 : 40F28890;
+0363 : 44D24462;
+0364 : 49B24942;
+0365 : 61054A22;
+0366 : 05138082;
+0367 : 4A030400;
+0368 : A0231000;
+0369 : 00230000;
+036A : 061310A0;
+036B : 15230820;
+036C : 2A2388C0;
+036D : 44018800;
+036E : 1BC00913;
+036F : 10000993;
+0370 : 00890833;
+0371 : 00082503;
+0372 : 5883CD01;
+0373 : FE130105;
+0374 : 07630808;
+0375 : 2E83000E;
+0376 : 461D0405;
+0377 : 9E8285D2;
+0378 : 1FE30411;
+0379 : BF51FD34;
+037A : 01F44F83;
+037B : 89404F03;
+037C : 01F40E23;
+037D : 89F00A23;
+037E : 01045703;
+037F : 0FFF7593;
+0380 : 10077793;
+0381 : EC0783E3;
+0382 : 03842303;
+0383 : 85224601;
+0384 : BD659302;
+0385 : 575D47A1;
+0386 : 06E7828B;
+0387 : 2383C10C;
+0388 : C15018C0;
+0389 : 00D50EA3;
+038A : 02751663;
+038B : 5E03454C;
+038C : 36330105;
+038D : 36B300C0;
+038E : 981300B0;
+038F : 68B30086;
+0390 : EEB30106;
+0391 : EF1301C8;
+0392 : 1523082E;
+0393 : 4D4889E0;
+0394 : 88A02A23;
+0395 : 0082FF93;
+0396 : 878B57DD;
+0397 : 808206FF;
+0398 : 575D47A1;
+0399 : 06E7828B;
+039A : 00158313;
+039B : 2423C550;
+039C : C3830065;
+039D : 0EA30005;
+039E : 268300D5;
+039F : 0E2318C0;
+03A0 : 17630075;
+03A1 : 280302D5;
+03A2 : 5F030045;
+03A3 : 36330105;
+03A4 : 38B300C0;
+03A5 : 1E130100;
+03A6 : EEB30086;
+03A7 : EFB301C8;
+03A8 : E79301EE;
+03A9 : 1523082F;
+03AA : 4D4888F0;
+03AB : 88A02A23;
+03AC : 0082F293;
+03AD : 878B575D;
+03AE : 808206E2;
+03AF : 575D47A1;
+03B0 : 06E7828B;
+03B1 : 00C52303;
+03B2 : 00B50FA3;
+03B3 : 00031A63;
+03B4 : 18C02603;
+03B5 : 00B50E23;
+03B6 : 00C51463;
+03B7 : 88B00A23;
+03B8 : 0082F513;
+03B9 : 078B55DD;
+03BA : 808206B5;
+03BB : 575D47A1;
+03BC : 06E7828B;
+03BD : 18C02383;
+03BE : 00B50EA3;
+03BF : 00751463;
+03C0 : 88B00AA3;
+03C1 : 0082F513;
+03C2 : 078B55DD;
+03C3 : 808206B5;
+03C4 : 09400793;
+03C5 : 00F51823;
+03C6 : 00050EA3;
+03C7 : 88000AA3;
+03C8 : 04F54283;
+03C9 : 040506A3;
+03CA : 0012E313;
+03CB : 046507A3;
+03CC : 47838082;
+03CD : E29304F5;
+03CE : 07A30027;
+03CF : 80820455;
+03D0 : 04F54783;
+03D1 : 0047E293;
+03D2 : 045507A3;
+03D3 : 71158082;
+03D4 : CF86C7CE;
+03D5 : C1DACDA2;
+03D6 : C9CACBA6;
+03D7 : C3D6C5D2;
+03D8 : DD62DF5E;
+03D9 : D96ADB66;
+03DA : 0093D76E;
+03DB : 2B030F40;
+03DC : A2831240;
+03DD : 24830000;
+03DE : F4138800;
+03DF : 80630054;
+03E0 : 63091762;
+03E1 : A4834383;
+03E2 : 0F400B93;
+03E3 : 0013F513;
+03E4 : 1097C171;
+03E5 : 80E74000;
+03E6 : 791300A0;
+03E7 : 05630015;
+03E8 : 4A850009;
+03E9 : A8D94A01;
+03EA : 80800A93;
+03EB : 000AAA03;
+03EC : 40007CB7;
+03ED : 40013D37;
+03EE : 002A6C13;
+03EF : 018AA023;
+03F0 : 85934605;
+03F1 : 051320EC;
+03F2 : 4097060D;
+03F3 : 80E74000;
+03F4 : C105E7E0;
+03F5 : 400077B7;
+03F6 : 5E978513;
+03F7 : 40000097;
+03F8 : 4C0080E7;
+03F9 : 000AA983;
+03FA : FFD9F293;
+03FB : 005AA023;
+03FC : 0850BF4D;
+03FD : 8513100C;
+03FE : 002320EC;
+03FF : CA020201;
+0400 : 40005097;
+0401 : CC2080E7;
+0402 : 7DB74652;
+0403 : 100C4000;
+0404 : 602D8513;
+0405 : 40000097;
+0406 : 488080E7;
+0407 : 082C0870;
+0408 : 20EC8513;
+0409 : 5097CC02;
+040A : 80E74000;
+040B : 4E72B340;
+040C : 7FB745E2;
+040D : 5E834000;
+040E : 2F0300AE;
+040F : 851301CE;
+0410 : 9693630F;
+0411 : 0613009E;
+0412 : 0097FFEF;
+0413 : 80E74000;
+0414 : BF814520;
+0415 : 40001097;
+0416 : EFA080E7;
+0417 : 00157593;
+0418 : 0813F1A9;
+0419 : 27031900;
+041A : 46FD0008;
+041B : 40EB08B3;
+041C : 0716F563;
+041D : 01682023;
+041E : 4A054A81;
+041F : 016BA023;
+0420 : 0F800093;
+0421 : 0000A703;
+0422 : 0014FB93;
+0423 : C002C25E;
+0424 : 0A870E63;
+0425 : 80800313;
+0426 : 0080A023;
+0427 : 00032383;
+0428 : 0014F593;
+0429 : 00259613;
+042A : FFB3F513;
+042B : 00A66833;
+042C : 400078B7;
+042D : 01032023;
+042E : 5B688913;
+042F : 4C354329;
+0430 : 00094683;
+0431 : EE990905;
+0432 : C8A98891;
+0433 : 40007A37;
+0434 : 5CBA0D13;
+0435 : 4CB54C29;
+0436 : 4A81A01D;
+0437 : 4A81B5E1;
+0438 : BF794A01;
+0439 : 00669463;
+043A : 99800023;
+043B : 98D00023;
+043C : 9463BFC1;
+043D : 0023018D;
+043E : 00239990;
+043F : 4D8399B0;
+0440 : 0D05000D;
+0441 : FE0D97E3;
+0442 : 15634E12;
+0443 : 7EB7160E;
+0444 : 87934000;
+0445 : 4FA95D2E;
+0446 : A82149B5;
+0447 : 40007AB7;
+0448 : 5C5A8D13;
+0449 : 9463BF45;
+044A : 002301F2;
+044B : 00239930;
+044C : C2839850;
+044D : 07850007;
+044E : FE0297E3;
+044F : 57138C39;
+0450 : 4B050024;
+0451 : 00177A93;
+0452 : 4A05C05A;
+0453 : C0B76389;
+0454 : 63094000;
+0455 : B6038513;
+0456 : 20008D13;
+0457 : 4B014B81;
+0458 : 20008493;
+0459 : A4830C13;
+045A : 4583C42A;
+045B : 886304ED;
+045C : 8763100A;
+045D : 846A1005;
+045E : 4DA14901;
+045F : 2AE44783;
+0460 : 0017F293;
+0461 : 04028463;
+0462 : 001C4703;
+0463 : 00177313;
+0464 : 00031863;
+0465 : 05040513;
+0466 : 40004097;
+0467 : 628080E7;
+0468 : 2AE44383;
+0469 : FFE3F093;
+046A : 2A140723;
+046B : 04CD4503;
+046C : FFF50593;
+046D : 04BD0623;
+046E : 2AF44803;
+046F : 00487893;
+0470 : 00089663;
+0471 : FFE87613;
+0472 : 2AC40723;
+0473 : 04130905;
+0474 : 15E32E84;
+0475 : 0723FBB9;
+0476 : 4682040D;
+0477 : 856AC691;
+0478 : 40002097;
+0479 : 804080E7;
+047A : 49814E12;
+047B : 020E0E63;
+047C : 4EA15CDD;
+047D : 079E870B;
+047E : 0F936F09;
+047F : 07B3B90F;
+0480 : 8DB303FB;
+0481 : C98300F4;
+0482 : 87A304FD;
+0483 : F993040D;
+0484 : 068B0FF9;
+0485 : F2930790;
+0486 : 8D630069;
+0487 : 856A2002;
+0488 : 40001097;
+0489 : 7C4080E7;
+048A : 04ED4603;
+048B : 46061063;
+048C : 87936F89;
+048D : 0B05B90F;
+048E : 9D3E4291;
+048F : 16E39BBE;
+0490 : 0A63F25B;
+0491 : 0493000A;
+0492 : AA038080;
+0493 : 7A930004;
+0494 : A023FFDA;
+0495 : 40FE0154;
+0496 : 44DE446E;
+0497 : 49BE494E;
+0498 : 4A9E4A2E;
+0499 : 5BFA4B0E;
+049A : 5CDA5C6A;
+049B : 5DBA5D4A;
+049C : 8082612D;
+049D : 40007F37;
+049E : 5DEF0793;
+049F : FDB1BD69;
+04A0 : 000C4603;
+04A1 : 00167813;
+04A2 : F40819E3;
+04A3 : 88002883;
+04A4 : 8D936689;
+04A5 : F913B6B6;
+04A6 : 15630048;
+04A7 : 4CA20009;
+04A8 : 00AC8D93;
+04A9 : 03000E13;
+04AA : 02F00E93;
+04AB : 01CD8023;
+04AC : 01DD80A3;
+04AD : 000D8123;
+04AE : 2A8D0413;
+04AF : 09138CEA;
+04B0 : 2F030300;
+04B1 : 7FB7044D;
+04B2 : 874A4000;
+04B3 : 008F0693;
+04B4 : 662F8613;
+04B5 : 85224591;
+04B6 : 400079B7;
+04B7 : DA840D93;
+04B8 : 40005097;
+04B9 : 2CC080E7;
+04BA : 76C98993;
+04BB : 0009A683;
+04BC : 12068363;
+04BD : 400077B7;
+04BE : 86138722;
+04BF : 059366A7;
+04C0 : 10080400;
+04C1 : 40005097;
+04C2 : 2A8080E7;
+04C3 : 2AECC283;
+04C4 : 0012F713;
+04C5 : 4083CB05;
+04C6 : F313001C;
+04C7 : 17630010;
+04C8 : 856E0003;
+04C9 : 40004097;
+04CA : 49C080E7;
+04CB : 2AECC383;
+04CC : FFE3F513;
+04CD : 2AAC8723;
+04CE : 04CD4583;
+04CF : FFF58613;
+04D0 : 04CD0623;
+04D1 : 2AFCC803;
+04D2 : 00487893;
+04D3 : 0E089263;
+04D4 : 0FE87F93;
+04D5 : 2BFC8723;
+04D6 : 002FF693;
+04D7 : E2914605;
+04D8 : 100C460D;
+04D9 : C632856E;
+04DA : 40004097;
+04DB : B40080E7;
+04DC : CE034EA9;
+04DD : 1A632AEC;
+04DE : 4F3201D5;
+04DF : 002F7F93;
+04E0 : 000F8563;
+04E1 : 002E6F93;
+04E2 : 4785B7F1;
+04E3 : 4791C111;
+04E4 : 00FE62B3;
+04E5 : 2A5C8723;
+04E6 : 0012F713;
+04E7 : 79B7CB51;
+04E8 : 10104000;
+04E9 : 851385A2;
+04EA : 009766F9;
+04EB : 80E74000;
+04EC : 03130F20;
+04ED : 03930220;
+04EE : A8230084;
+04EF : A0232A6C;
+04F0 : 55FD0A7C;
+04F1 : 856E567D;
+04F2 : 40004097;
+04F3 : 41A080E7;
+04F4 : 7DB7C911;
+04F5 : 85A24000;
+04F6 : 683D8513;
+04F7 : 40000097;
+04F8 : 0C0080E7;
+04F9 : 044D2603;
+04FA : 064CA083;
+04FB : 060CA583;
+04FC : 00265883;
+04FD : 01809513;
+04FE : 0085D813;
+04FF : 01056633;
+0500 : 00C8F363;
+0501 : 96238646;
+0502 : 46832ACC;
+0503 : 8E1304CD;
+0504 : 06230016;
+0505 : 090505CD;
+0506 : 03800E93;
+0507 : 2E840413;
+0508 : 2E8C8C93;
+0509 : E9D91FE3;
+050A : 07234F05;
+050B : B37505ED;
+050C : BD6D0991;
+050D : 0019F713;
+050E : DE0708E3;
+050F : 049D4303;
+0510 : 048D4603;
+0511 : 53936505;
+0512 : 05930063;
+0513 : 90937905;
+0514 : 88330083;
+0515 : 88B300BB;
+0516 : 79130100;
+0517 : 7C930016;
+0518 : 84330073;
+0519 : 00630114;
+051A : 06930409;
+051B : 8DB32E80;
+051C : 8E3302DC;
+051D : 8EB300FD;
+051E : CF0301C4;
+051F : 7F932AEE;
+0520 : 9963001F;
+0521 : 0893040F;
+0522 : 06A3F800;
+0523 : 0593051D;
+0524 : 856A0800;
+0525 : 04233425;
+0526 : 4603040D;
+0527 : 7693048D;
+0528 : 0423FFE6;
+0529 : 4D8304DD;
+052A : FE13048D;
+052B : 0463002D;
+052C : 58030A0E;
+052D : F593010D;
+052E : 0423FFDD;
+052F : 689304BD;
+0530 : 18231008;
+0531 : 4685011D;
+0532 : 10000613;
+0533 : 856A85A2;
+0534 : BB993A41;
+0535 : 1097856A;
+0536 : 80E74000;
+0537 : E9014A20;
+0538 : 02100813;
+0539 : 050D06A3;
+053A : 02100593;
+053B : 0793B75D;
+053C : D0028080;
+053D : 0007A283;
+053E : 856A4595;
+053F : 0022E713;
+0540 : 32EDC398;
+0541 : 050B8313;
+0542 : 006D83B3;
+0543 : 8933856A;
+0544 : 10970074;
+0545 : 80E74000;
+0546 : 15934340;
+0547 : 46010085;
+0548 : 4097854A;
+0549 : 80E74000;
+054A : C5112C00;
+054B : 06A345A1;
+054C : 45A104BD;
+054D : 1014BFB9;
+054E : 10000613;
+054F : 854A85A2;
+0550 : 40004097;
+0551 : C8C080E7;
+0552 : 5082F175;
+0553 : 10000513;
+0554 : FCA09EE3;
+0555 : FE93B799;
+0556 : 8563004D;
+0557 : 5083020E;
+0558 : F913010D;
+0559 : 0423FFBD;
+055A : E513052D;
+055B : 18230010;
+055C : 069300AD;
+055D : 06130410;
+055E : 85A21000;
+055F : F0EF856A;
+0560 : B15D897F;
+0561 : 008DFF13;
+0562 : 040F0563;
+0563 : 0F936789;
+0564 : 82932E80;
+0565 : 8CB3B907;
+0566 : 073303FC;
+0567 : 8333025B;
+0568 : 8DB300EC;
+0569 : C3830064;
+056A : F9132AED;
+056B : 1E630013;
+056C : 02930209;
+056D : 06A3F800;
+056E : 0593045D;
+056F : 856A0800;
+0570 : 042338F5;
+0571 : 4703040D;
+0572 : 7313048D;
+0573 : 0423FF77;
+0574 : 4D83046D;
+0575 : 856A048D;
+0576 : 00FDF393;
+0577 : 047D0423;
+0578 : 40001097;
+0579 : 3D0080E7;
+057A : F093B181;
+057B : 89630023;
+057C : 07930000;
+057D : 06A30400;
+057E : 059304FD;
+057F : B7C10400;
+0580 : 1097856A;
+0581 : 80E74000;
+0582 : E9013760;
+0583 : 02100F93;
+0584 : 05FD06A3;
+0585 : 02100593;
+0586 : D002B75D;
+0587 : 80800513;
+0588 : 8893410C;
+0589 : 8633050B;
+058A : E813011C;
+058B : 20230025;
+058C : 856A0105;
+058D : 00C48CB3;
+058E : 40001097;
+058F : 30E080E7;
+0590 : 00851593;
+0591 : 85664601;
+0592 : 40004097;
+0593 : 19A080E7;
+0594 : 0F13C901;
+0595 : 06A30200;
+0596 : 059305ED;
+0597 : B7850200;
+0598 : 2AEDC683;
+0599 : 10000613;
+059A : EE1385A2;
+059B : 87230086;
+059C : 10142BCD;
+059D : 40978566;
+059E : 80E74000;
+059F : F971D440;
+05A0 : 0E935402;
+05A1 : 16E31000;
+05A2 : BF35FDD4;
+05A3 : 000A1663;
+05A4 : 0049F993;
+05A5 : B8098EE3;
+05A6 : 4D81846A;
+05A7 : 46834CA1;
+05A8 : FE132AE4;
+05A9 : 0E630086;
+05AA : 0513000E;
+05AB : 40970504;
+05AC : 80E74000;
+05AD : 4E83F5A0;
+05AE : FF132AE4;
+05AF : 0723FF7E;
+05B0 : 0D852BE4;
+05B1 : 2E840413;
+05B2 : FD9D9BE3;
+05B3 : 4783B695;
+05B4 : E29301D5;
+05B5 : 0EA30047;
+05B6 : 0AA30055;
+05B7 : 80828850;
+05B8 : 01D54783;
+05B9 : 0027E293;
+05BA : 00550EA3;
+05BB : 88500AA3;
+05BC : 71798082;
+05BD : D606D422;
+05BE : 0045F793;
+05BF : CFCD842E;
+05C0 : 01D54083;
+05C1 : 1B100313;
+05C2 : 0FB0F293;
+05C3 : 00550EA3;
+05C4 : 88500AA3;
+05C5 : 00734383;
+05C6 : AE1485B7;
+05C7 : AE158893;
+05C8 : 14700613;
+05C9 : 02760833;
+05CA : 00634703;
+05CB : 00534F03;
+05CC : 00334583;
+05CD : 00175093;
+05CE : 03FF7F93;
+05CF : 005F9793;
+05D0 : 01F0F293;
+05D1 : 0057E6B3;
+05D2 : 00234783;
+05D3 : 0313BE33;
+05D4 : 00434383;
+05D5 : 00134303;
+05D6 : 00F7F093;
+05D7 : 01F3F613;
+05D8 : 01509293;
+05D9 : CC02073E;
+05DA : 4785CE02;
+05DB : 01C80EB3;
+05DC : 00B61813;
+05DD : 01F5FE13;
+05DE : 0106E8B3;
+05DF : 010E1F13;
+05E0 : EFB30EC6;
+05E1 : 069301E8;
+05E2 : D8930143;
+05E3 : E3B3011E;
+05E4 : 65B3005F;
+05E5 : 96130117;
+05E6 : E8330196;
+05E7 : 9E1300C3;
+05E8 : CA420105;
+05E9 : 00B11C23;
+05EA : 010E5F13;
+05EB : 91E01223;
+05EC : 91002023;
+05ED : 1AF003A3;
+05EE : 04047093;
+05EF : 00008D63;
+05F0 : 01D54283;
+05F1 : E6934621;
+05F2 : 05930402;
+05F3 : C62A1B10;
+05F4 : E44FF0EF;
+05F5 : 04624532;
+05F6 : 41845313;
+05F7 : 0A035263;
+05F8 : 01D54683;
+05F9 : 1A900713;
+05FA : 0FD6FE93;
+05FB : 01D50EA3;
+05FC : 89D00AA3;
+05FD : 90002883;
+05FE : 90402603;
+05FF : DF934851;
+0600 : 00230158;
+0601 : CC320107;
+0602 : 00FFF793;
+0603 : 0108D093;
+0604 : 00F65813;
+0605 : 01230646;
+0606 : F29300F7;
+0607 : 07B701F0;
+0608 : 509300C8;
+0609 : 01A30116;
+060A : B2B30057;
+060B : DE130217;
+060C : CA460198;
+060D : FECE0F13;
+060E : 00B8D393;
+060F : 0058D313;
+0610 : 01F8F893;
+0611 : 01E700A3;
+0612 : 00189E13;
+0613 : 00187F13;
+0614 : 01F3F413;
+0615 : 03F37693;
+0616 : 01EE6FB3;
+0617 : 00D702A3;
+0618 : 00870223;
+0619 : 01F70323;
+061A : 005703A3;
+061B : 50B25422;
+061C : 080EE693;
+061D : 05934621;
+061E : 61451A90;
+061F : DE4FF06F;
+0620 : 542250B2;
+0621 : 80826145;
+0622 : 99805783;
+0623 : 1B904603;
+0624 : 01079293;
+0625 : 0102D313;
+0626 : 03938F1A;
+0627 : C2111B90;
+0628 : 7593C595;
+0629 : B8130103;
+062A : 80230015;
+062B : ED990103;
+062C : 99004703;
+062D : 0FF77893;
+062E : 01150E23;
+062F : 01150FA3;
+0630 : 99805E03;
+0631 : 010E1E93;
+0632 : 010EDF13;
+0633 : 010F1F93;
+0634 : 010FD793;
+0635 : 007F5293;
+0636 : 001F5693;
+0637 : 98F01F23;
+0638 : 009F5813;
+0639 : 0082F313;
+063A : 0126F613;
+063B : 0003C383;
+063C : 00C365B3;
+063D : 00487713;
+063E : 00E5C8B3;
+063F : 0E68CE13;
+0640 : 18C02F83;
+0641 : 007E4EB3;
+0642 : 01D50EA3;
+0643 : 01F51563;
+0644 : 2A234D48;
+0645 : 808288A0;
+0646 : 98B00823;
+0647 : 03E00793;
+0648 : 98F00023;
+0649 : B78D4581;
+064A : 03C00793;
+064B : 98F00023;
+064C : BF994585;
+064D : 02300793;
+064E : 00236509;
+064F : 458198F0;
+0650 : ABC50513;
+0651 : 0000B791;
+0652 : 4F525245;
+0653 : 00203A52;
+0654 : 20746120;
+0655 : 20007830;
+0656 : 00783028;
+0657 : 61420A29;
+0658 : 64612064;
+0659 : 73657264;
+065A : 30203A73;
+065B : 696D0078;
+065C : 696C6173;
+065D : 64656E67;
+065E : 766E6900;
+065F : 64696C61;
+0660 : 736E6920;
+0661 : 63757274;
+0662 : 6E6F6974;
+0663 : 2A0A0A00;
+0664 : 48202A2A;
+0665 : 6F6C6C65;
+0666 : 6F57202C;
+0667 : 21646C72;
+0668 : 2A2A2A20;
+0669 : 58414D0A;
+066A : 66203038;
+066B : 776D7269;
+066C : 20657261;
+066D : 706D6F63;
+066E : 64656C69;
+066F : 3A6E6F20;
+0670 : 44530020;
+0671 : 204D4152;
+0672 : 61746164;
+0673 : 65686320;
+0674 : 75736B63;
+0675 : 00203A6D;
+0676 : 70786520;
+0677 : 65746365;
+0678 : 42002064;
+0679 : 20737469;
+067A : 61776C61;
+067B : 73207379;
+067C : 202C7465;
+067D : 61656C63;
+067E : 00203A72;
+067F : 41524453;
+0680 : 6572204D;
+0681 : 772F6461;
+0682 : 65746972;
+0683 : 72726520;
+0684 : 000A726F;
+0685 : 41524453;
+0686 : 622E204D;
+0687 : 69207373;
+0688 : 6F6E2073;
+0689 : 657A2074;
+068A : 0A216F72;
+068B : 69615700;
+068C : 676E6974;
+068D : 73203520;
+068E : 726F6620;
+068F : 73657420;
+0690 : 676E6974;
+0691 : 002E2E2E;
+0692 : 00000101;
+0693 : 00000000;
+0694 : 00000000;
+0695 : 00000000;
+0696 : 00000000;
+0697 : 00000000;
+0698 : 00000000;
+0699 : 00000000;
+069A : 00000000;
+069B : 00000000;
+069C : 00000000;
+069D : 00000000;
+069E : 00000000;
+069F : 00000000;
+06A0 : 00000000;
+06A1 : 00000000;
+06A2 : 00000105;
+06A3 : 00007FBF;
+06A4 : 00000000;
+06A5 : D3030300;
+06A6 : 000016CE;
+06A7 : 00000000;
+06A8 : 000016F2;
+06A9 : 00000000;
+06AA : 00000000;
+06AB : 00000000;
+06AC : 000016E0;
+06AD : 00000000;
+06AE : 00000000;
+06AF : 00000000;
+06B0 : 00000000;
+06B1 : 00000000;
+06B2 : 00000000;
+06B3 : 00000101;
+06B4 : 0000FFFF;
+06B5 : 00000000;
+06B6 : 0003F600;
+06B7 : 00001918;
+06B8 : 00000000;
+06B9 : 00000000;
+06BA : 00000000;
+06BB : 00000000;
+06BC : 00000000;
+06BD : 00001928;
+06BE : 00000000;
+06BF : 00000000;
+06C0 : 00000000;
+06C1 : 00000000;
+06C2 : 00000000;
+06C3 : 00000000;
+06C4 : 00000000;
+06C5 : 00000000;
+06C6 : 00000000;
+06C7 : 00000000;
+06C8 : 00000000;
+06C9 : 00000000;
+06CA : 00000000;
+06CB : 00000000;
+06CC : 00000000;
+06CD : 00000000;
+06CE : 00000000;
+06CF : 00000000;
+06D0 : 00000000;
+06D1 : 00000000;
+06D2 : 00000000;
+06D3 : 00000000;
+06D4 : 00000000;
+06D5 : 00000000;
+06D6 : 00000000;
+06D7 : 00000000;
+06D8 : 6362612F;
+06D9 : 6B736964;
+06DA : 3030382E;
+06DB : 7246002F;
+06DC : 614A2069;
+06DD : 3832206E;
+06DE : 3A303020;
+06DF : 323A3731;
+06E0 : 53502035;
+06E1 : 30322054;
+06E2 : 003232;
+[06E3..1FFF] : 00;
+END;

BIN
fpga/output/v1.jic


BIN
fpga/output/v1.sof


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.sof


+ 2 - 3
fpga/scripts/qsfdeps.pl

@@ -83,12 +83,11 @@ open(my $out, '>', $outfile) or die;
 
 
 print_deps($out, $outfile, %dep_deps);
 print_deps($out, $outfile, %dep_deps);
 
 
-my $map_target = "$output_dir/$project.map.rpt";
-print_deps($out, $map_target, %map_deps);
-
 my $asm_target = "$output_dir/$project.mif_update.rpt";
 my $asm_target = "$output_dir/$project.mif_update.rpt";
 print_deps($out, $asm_target, %asm_deps);
 print_deps($out, $asm_target, %asm_deps);
 
 
+print_deps($out, "${project}_map_deps", %map_deps);
+
 close($out);
 close($out);
 
 
 exit 0;
 exit 0;

+ 21 - 23
fpga/spirom.sv

@@ -147,7 +147,7 @@ module spirom (
 
 
 			.wrclk ( rom_clk ),
 			.wrclk ( rom_clk ),
 			.data ( spi_in_data ),
 			.data ( spi_in_data ),
-			.wrreq ( spi_in_req_q ),
+			.wrreq ( spi_in_req_q & is_spi ),
 			.wrusedw ( wrusedw ),
 			.wrusedw ( wrusedw ),
 
 
 			.rdclk ( ram_clk ),
 			.rdclk ( ram_clk ),
@@ -238,6 +238,7 @@ module spirom (
    reg	       spi_more_q;
    reg	       spi_more_q;
    reg	       spi_active;
    reg	       spi_active;
    reg [3:0]   spi_cs_ctr;
    reg [3:0]   spi_cs_ctr;
+   reg [31:0]  spi_out_shr;
 
 
    // Explicit synchronizers for handshake signals
    // Explicit synchronizers for handshake signals
    synchronizer #(.width(1)) go_spi_synchro
    synchronizer #(.width(1)) go_spi_synchro
@@ -255,11 +256,15 @@ module spirom (
       .q ( spi_active_s )
       .q ( spi_active_s )
       );
       );
 
 
+   // 64/4 = 16 bytes min space
+   wire dma_queue_space = (~wrusedw) >= 12'd128;
+
    always @(negedge rst_n or posedge rom_clk)
    always @(negedge rst_n or posedge rom_clk)
      if (~rst_n)
      if (~rst_n)
        begin
        begin
 	  spi_cmd_ctr  <= 6'b0;
 	  spi_cmd_ctr  <= 6'b0;
 	  spi_clk_en   <= 1'b0;
 	  spi_clk_en   <= 1'b0;
+	  spi_clk_en_q <= 1'b0;
 	  spi_data_ctr <= 27'b0;
 	  spi_data_ctr <= 27'b0;
 	  spi_cs_n     <= 1'b1;
 	  spi_cs_n     <= 1'b1;
 	  spi_cs_ctr   <= 'b0;
 	  spi_cs_ctr   <= 'b0;
@@ -270,12 +275,17 @@ module spirom (
 	  spi_in_shr   <= 32'b0;
 	  spi_in_shr   <= 32'b0;
 	  spi_active   <= 1'b0;
 	  spi_active   <= 1'b0;
 	  spi_more_q   <= 1'b0;
 	  spi_more_q   <= 1'b0;
+	  spi_out_shr  <= 32'b0;
        end
        end
      else
      else
        begin
        begin
 	  spi_in_req   <= 1'b0;
 	  spi_in_req   <= 1'b0;
 	  spi_in_req_q <= spi_in_req;
 	  spi_in_req_q <= spi_in_req;
 	  spi_clk_en   <= 1'b0;
 	  spi_clk_en   <= 1'b0;
+	  spi_clk_en_q <= spi_clk_en;
+
+	  // Bit to start transmitting on the next clock down transition
+	  spi_out_shr <= spi_out_shr << spi_clk_en;
 
 
 	  // After asserting CS#, wait 16 SPI clock times
 	  // After asserting CS#, wait 16 SPI clock times
 	  if (spi_cs_n)
 	  if (spi_cs_n)
@@ -292,6 +302,7 @@ module spirom (
 	       spi_active   <= 1'b1;
 	       spi_active   <= 1'b1;
 	       spi_cs_n     <= 1'b0;
 	       spi_cs_n     <= 1'b0;
 	       spi_more_q   <= spi_more;
 	       spi_more_q   <= spi_more;
+	       spi_out_shr  <= romcmd;
 	    end
 	    end
 	  else if ( ~|{spi_data_ctr, spi_cmd_ctr} )
 	  else if ( ~|{spi_data_ctr, spi_cmd_ctr} )
 	    begin
 	    begin
@@ -308,8 +319,10 @@ module spirom (
 
 
 	       if ( spi_active )
 	       if ( spi_active )
 		 begin
 		 begin
-		    // 64/4 = 16 bytes min space
-		    spi_clk_en <= (~wrusedw) >= 12'd128;
+		    // This will block unnecessarily if the DMA queue
+		    // is full from a previous transaction, but that doesn't
+		    // matter in practice... just let it drain.
+		    spi_clk_en <= dma_queue_space;
 
 
 		    if ( spi_clk_en )
 		    if ( spi_clk_en )
 		      begin
 		      begin
@@ -336,30 +349,15 @@ module spirom (
        end // else: !if(~rst_n)
        end // else: !if(~rst_n)
 
 
    // SPI output data is shifted on the negative edge
    // SPI output data is shifted on the negative edge
-   reg [31:0] spi_out_shr;
-   reg	      spi_clk_en_q;
+   reg 	       spi_out_q;
+   always @(negedge rom_clk)
+     spi_out_q <= spi_out_shr[31];
 
 
-   assign spi_io[0] = spi_mosi_en ? spi_out_shr[31] : 1'bz;
+   assign spi_io[0] = spi_mosi_en ? spi_out_q : 1'bz;
    assign spi_io[1] = 1'bz;
    assign spi_io[1] = 1'bz;
 
 
-   always @(negedge rst_n or negedge rom_clk)
-     if (~rst_n)
-       begin
-	  spi_out_shr  <= 32'b0;
-	  spi_clk_en_q <= 1'b0;
-       end
-     else
-       begin
-	  spi_clk_en_q <= spi_clk_en;
-
-	  if (~spi_active)
-	    spi_out_shr <= romcmd;
-	  else if ( spi_clk_en_q )
-	    spi_out_shr <= { spi_out_shr[30:0], 1'b0 };
-       end
-
    //
    //
-   // SPI_SCK output buffer
+   // SPI_SCK output buffer: emit a clock pulse iff spi_clk_en_q is high
    //
    //
    ddio_out spi_clk_buf (
    ddio_out spi_clk_buf (
 			 .aclr ( ~rst_n ),
 			 .aclr ( ~rst_n ),

+ 3 - 0
fpga/v1.qsf

@@ -2,6 +2,9 @@
 
 
 set_global_assignment -name TOP_LEVEL_ENTITY v1
 set_global_assignment -name TOP_LEVEL_ENTITY v1
 set_global_assignment -name SOURCE_FILE v1.pins
 set_global_assignment -name SOURCE_FILE v1.pins
+set_global_assignment -name SYSTEMVERILOG_FILE v1.sv
+set_global_assignment -name VERILOG_FILE ip/pll2_48.v
+set_global_assignment -name QIP_FILE ip/pll2_48.qip
 set_global_assignment -name SOURCE_FILE "max80-v1.cof"
 set_global_assignment -name SOURCE_FILE "max80-v1.cof"
 
 
 set_global_assignment -name SOURCE_TCL_SCRIPT_FILE max80.qsf
 set_global_assignment -name SOURCE_TCL_SCRIPT_FILE max80.qsf

+ 5 - 2
fpga/v2.qsf

@@ -2,7 +2,12 @@
 
 
 set_global_assignment -name TOP_LEVEL_ENTITY v2
 set_global_assignment -name TOP_LEVEL_ENTITY v2
 set_global_assignment -name SOURCE_FILE v2.pins
 set_global_assignment -name SOURCE_FILE v2.pins
+set_global_assignment -name VERILOG_FILE ip/pll2_16.v
+set_global_assignment -name QIP_FILE ip/pll2_16.qip
 set_global_assignment -name SOURCE_FILE "max80-v2.cof"
 set_global_assignment -name SOURCE_FILE "max80-v2.cof"
+set_global_assignment -name SYSTEMVERILOG_FILE v2.sv
+
+set_global_assignment -name SOURCE_TCL_SCRIPT_FILE max80.qsf
 
 
 set_instance_assignment -name IO_STANDARD LVDS -to usb_rx
 set_instance_assignment -name IO_STANDARD LVDS -to usb_rx
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to usb_rx
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to usb_rx
@@ -13,7 +18,5 @@ set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to usb_dn
 set_instance_assignment -name IO_STANDARD "2.5 V" -to sd_cd_n
 set_instance_assignment -name IO_STANDARD "2.5 V" -to sd_cd_n
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to sd_cd_n
 set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to sd_cd_n
 
 
-set_global_assignment -name SOURCE_TCL_SCRIPT_FILE max80.qsf
-
 # Quartus insists on this line...
 # Quartus insists on this line...
 set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
 set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

+ 6 - 16
rv32/Makefile

@@ -34,12 +34,7 @@ gendeps   = -MD -MF $(@D)/.$(@F).d -MT $@
 genhdrs = iodevs.h irqtable.h
 genhdrs = iodevs.h irqtable.h
 gensrcs =
 gensrcs =
 
 
-all: boot.mif dram.hex checksum.h
-
-# Generate MIF file for 8Kx32 RAM
-boot_depth  := 8192
-boot_width  := 32
-boot_stride := 1
+all: boot.bin dram.hex checksum.h
 
 
 ROMS    := $(wildcard roms/*.rom)
 ROMS    := $(wildcard roms/*.rom)
 ROMOBJS  = $(ROMS:.rom=.o)
 ROMOBJS  = $(ROMS:.rom=.o)
@@ -72,9 +67,6 @@ fatfs.a: $(FATFS_O)
 
 
 CFLAGS_memset.c := -O2
 CFLAGS_memset.c := -O2
 
 
-%.mif: %.bin bin2mif.pl
-	$(PERL) bin2mif.pl $< $@ $($*_depth) $($*_width) $($*_stride)
-
 %.hex: %.elf
 %.hex: %.elf
 	$(OBJCOPY) -O ihex $< $@
 	$(OBJCOPY) -O ihex $< $@
 
 
@@ -87,14 +79,12 @@ boot.bin: max80.elf
 dram.bin: max80.elf
 dram.bin: max80.elf
 	$(OBJCOPY) -O binary -j '.dram*' $< $@
 	$(OBJCOPY) -O binary -j '.dram*' $< $@
 
 
-dram_init.bin: dram.bin max80.elf
-	dd if=$@ of=$< count=1 bs=
-
-checksum.h: dram.bin checksum.pl
-	$(PERL) checksum.pl $< $@ \
-		$$(($$($(NM) -n max80.elf --radix=decimal | \
+checksum.h: dram.bin boot.bin checksum.pl
+	$(PERL) checksum.pl -o $@ -p boot.bin \
+		-l $$(($$($(NM) -n max80.elf --radix=decimal | \
 			grep ' R __dram_init_end$$' | \
 			grep ' R __dram_init_end$$' | \
-	                awk '{ print $$1; }') - (1 << 30)))
+	                awk '{ print $$1; }') - (1 << 30))) \
+		dram.bin
 
 
 testimg.bin: testimg.elf
 testimg.bin: testimg.elf
 	$(OBJCOPY) -O binary $< $@
 	$(OBJCOPY) -O binary $< $@

+ 0 - 1746
rv32/boot.mif

@@ -1,1746 +0,0 @@
--- generated from boot.bin
-DEPTH = 8192;
-WIDTH = 32;
-ADDRESS_RADIX = HEX;
-DATA_RADIX = HEX;
-CONTENT BEGIN
-0000 : 00000000;
-0001 : 00000000;
-0002 : 00000000;
-0003 : 00100000;
-0004 : C0102473;
-0005 : 00008137;
-0006 : 2A80006F;
-0007 : 00000000;
-0008 : 0001210B;
-0009 : 008DF413;
-000A : 00040863;
-000B : 35B000EF;
-000C : 408D8DB3;
-000D : 060D8063;
-000E : 00000493;
-000F : 0FFDF293;
-0010 : 00029663;
-0011 : 008DDD93;
-0012 : 02048493;
-0013 : 00FDF293;
-0014 : 00029663;
-0015 : 004DDD93;
-0016 : 01048493;
-0017 : 003DF293;
-0018 : 00029663;
-0019 : 002DDD93;
-001A : 00848493;
-001B : 001DF293;
-001C : 00029663;
-001D : 001DDD93;
-001E : 00448493;
-001F : 0024D513;
-0020 : 000D0593;
-0021 : 0B0480E7;
-0022 : 001DDD93;
-0023 : 00448493;
-0024 : FA0D96E3;
-0025 : 30200073;
-0026 : 00000000;
-0027 : 00000013;
-0028 : 00008067;
-0029 : 0000250B;
-002A : 0005B00B;
-002B : 00000000;
-002C : 2330006F;
-002D : 5A80006F;
-002E : 5980006F;
-002F : 2CB0006F;
-0030 : 5A80006F;
-0031 : 21F0006F;
-0032 : 01B0106F;
-0033 : 2170006F;
-0034 : 2130006F;
-0035 : 2570006F;
-0036 : 20B0006F;
-0037 : 2070006F;
-0038 : 2030006F;
-0039 : 1FF0006F;
-003A : 00000000;
-003B : 7C5C2D2F;
-003C : 4101D2B0;
-003D : FFFFFFFF;
-003E : FFFFFFFF;
-003F : 00001AB8;
-0040 : 00000040;
-0041 : 00000000;
-0042 : 00000000;
-0043 : 00000000;
-0044 : 00000000;
-0045 : 00000000;
-0046 : 00000000;
-0047 : 00000000;
-0048 : 00000000;
-0049 : 00000000;
-004A : 00000000;
-004B : 00000000;
-004C : 00000000;
-004D : 00000000;
-004E : 00000000;
-004F : 00000000;
-0050 : 00000000;
-0051 : 00000000;
-0052 : 00000000;
-0053 : 00000000;
-0054 : 00000000;
-0055 : 00000000;
-0056 : 00000000;
-0057 : 00000000;
-0058 : 00000000;
-0059 : 00000000;
-005A : 00000000;
-005B : 00000000;
-005C : 00000000;
-005D : 00000000;
-005E : 00000000;
-005F : 00000000;
-0060 : 00000000;
-0061 : 00000000;
-0062 : 00000000;
-0063 : 00000000;
-0064 : 00000000;
-0065 : 00000000;
-0066 : 00000000;
-0067 : 00000000;
-0068 : 00000000;
-0069 : 00000000;
-006A : 00000000;
-006B : 00000000;
-006C : 00000000;
-006D : 00000000;
-006E : 00000000;
-006F : 00000000;
-0070 : 00000000;
-0071 : 00000000;
-0072 : 00000000;
-0073 : 00000000;
-0074 : 00000000;
-0075 : 00000000;
-0076 : 00000000;
-0077 : 00000000;
-0078 : 00000000;
-0079 : 00000000;
-007A : 00000000;
-007B : 00000000;
-007C : 00000000;
-007D : 00000000;
-007E : 00000000;
-007F : 00000000;
-0080 : 00000000;
-0081 : 00000000;
-0082 : 00000000;
-0083 : 00000000;
-0084 : 00000000;
-0085 : 00000000;
-0086 : 00000000;
-0087 : 00000000;
-0088 : 00000000;
-0089 : 00000000;
-008A : 00000000;
-008B : 00000000;
-008C : 00000000;
-008D : 00000000;
-008E : 00000000;
-008F : 00000000;
-0090 : 00000000;
-0091 : 00000000;
-0092 : 00000000;
-0093 : 00000000;
-0094 : 00000000;
-0095 : 00000000;
-0096 : 00000000;
-0097 : 00000000;
-0098 : 00000000;
-0099 : 00000000;
-009A : 00000000;
-009B : 00000000;
-009C : 00000000;
-009D : 00000000;
-009E : 00000000;
-009F : 00000000;
-00A0 : 00000000;
-00A1 : 00000000;
-00A2 : 00000000;
-00A3 : 00000000;
-00A4 : 00000000;
-00A5 : 00000000;
-00A6 : 00000000;
-00A7 : 00000000;
-00A8 : 00000000;
-00A9 : 00000000;
-00AA : 00000000;
-00AB : 00000000;
-00AC : 00000000;
-00AD : 00000000;
-00AE : 00000000;
-00AF : 00000000;
-00B0 : FFF04293;
-00B1 : 0602800B;
-00B2 : 00000193;
-00B3 : 0001A18B;
-00B4 : 12000513;
-00B5 : 2C000593;
-00B6 : 00052023;
-00B7 : 00052223;
-00B8 : 00052423;
-00B9 : 00052623;
-00BA : 00052823;
-00BB : 00052A23;
-00BC : 00052C23;
-00BD : 00052E23;
-00BE : 02050513;
-00BF : FCB56EE3;
-00C0 : 12802023;
-00C1 : 0040006F;
-00C2 : CE061101;
-00C3 : CA26CC22;
-00C4 : C64EC84A;
-00C5 : C256C452;
-00C6 : 2659C05A;
-00C7 : 1A604283;
-00C8 : 00028663;
-00C9 : 40007097;
-00CA : E2E080E7;
-00CB : 400074B7;
-00CC : 40007937;
-00CD : 5AFD4981;
-00CE : 1A448493;
-00CF : 20E90913;
-00D0 : 40007A37;
-00D1 : 0750008B;
-00D2 : 0810878B;
-00D3 : 1A704303;
-00D4 : 00030663;
-00D5 : 40001097;
-00D6 : 424080E7;
-00D7 : 3A1000EF;
-00D8 : 89C02403;
-00D9 : FE89F0E3;
-00DA : 00845393;
-00DB : 0FF47593;
-00DC : 93638626;
-00DD : 864A0003;
-00DE : 1AEA0513;
-00DF : 40001097;
-00E0 : 120080E7;
-00E1 : BF7D89A2;
-00E2 : 00000697;
-00E3 : D1468693;
-00E4 : 897D4690;
-00E5 : 8E49053E;
-00E6 : 8682C290;
-00E7 : 00000697;
-00E8 : D0068693;
-00E9 : 897D46D0;
-00EA : 8E49051E;
-00EB : 8682C290;
-00EC : F713C25D;
-00ED : 17930FF5;
-00EE : E2B30107;
-00EF : 931300E7;
-00F0 : 76930082;
-00F1 : 63B30015;
-00F2 : 87AA0053;
-00F3 : 4805EAC9;
-00F4 : 08C87163;
-00F5 : 0027F893;
-00F6 : 08089F63;
-00F7 : F6634EFD;
-00F8 : 0F1308CE;
-00F9 : 7F93FE06;
-00FA : 8F13FE0F;
-00FB : 87330207;
-00FC : A01901EF;
-00FD : 020F0F13;
-00FE : 0077A023;
-00FF : 0077A223;
-0100 : 0077A423;
-0101 : 0077A623;
-0102 : 0077A823;
-0103 : 0077AA23;
-0104 : 0077AC23;
-0105 : 0077AE23;
-0106 : 87FA86FA;
-0107 : FDE71CE3;
-0108 : 428D8A7D;
-0109 : 02C2F363;
-010A : FFC60313;
-010B : FFC37893;
-010C : 00478E93;
-010D : 01D88E33;
-010E : 0E91A011;
-010F : 0076A023;
-0110 : 86F687F6;
-0111 : FFCE9BE3;
-0112 : 73938A0D;
-0113 : 90630026;
-0114 : 8A050203;
-0115 : 8082E211;
-0116 : 00B78023;
-0117 : 07938082;
-0118 : 00230015;
-0119 : 167D0075;
-011A : 86BEB79D;
-011B : 9023BF5D;
-011C : 078900B7;
-011D : 9023BFF9;
-011E : 16790077;
-011F : BFB90789;
-0120 : 00000000;
-0121 : 00B567B3;
-0122 : 8B8D8FD1;
-0123 : 04079263;
-0124 : 00C50733;
-0125 : 8A7186AA;
-0126 : 40C007B3;
-0127 : 4C478067;
-0128 : 02000613;
-0129 : CEDC4DDC;
-012A : CE9C4D9C;
-012B : CADC49DC;
-012C : CA9C499C;
-012D : C6DC45DC;
-012E : C69C459C;
-012F : C2DC41DC;
-0130 : C29C419C;
-0131 : 96B295B2;
-0132 : FCE6ECE3;
-0133 : 00018082;
-0134 : 00C50733;
-0135 : 00050693;
-0136 : 0005C783;
-0137 : 00F68023;
-0138 : 06850585;
-0139 : FEE6EAE3;
-013A : 00008082;
-013B : 46254721;
-013C : 01C55693;
-013D : 05700793;
-013E : 64630512;
-013F : 079300D6;
-0140 : 82B30300;
-0141 : 002300D7;
-0142 : 177D9850;
-0143 : 8082F375;
-0144 : CE061101;
-0145 : CA26CC22;
-0146 : C64EC84A;
-0147 : C256C452;
-0148 : 297387AA;
-0149 : 84933430;
-014A : 64090015;
-014B : FFE4FA13;
-014C : 8F440693;
-014D : FFCA0993;
-014E : 8F440413;
-014F : 4AB54E29;
-0150 : 0006C703;
-0151 : E3710685;
-0152 : 483548A9;
-0153 : 0007C083;
-0154 : 93630785;
-0155 : 02930C00;
-0156 : 45290084;
-0157 : C30343B5;
-0158 : 02850002;
-0159 : 0C031163;
-015A : 3749854E;
-015B : 00F40393;
-015C : 45B54629;
-015D : 0003C503;
-015E : ED4D0385;
-015F : 0029D583;
-0160 : FFCA5803;
-0161 : 01059613;
-0162 : 01060533;
-0163 : 08933785;
-0164 : 43290144;
-0165 : C98342B5;
-0166 : 08850008;
-0167 : 0A099363;
-0168 : 4935854A;
-0169 : 4A2937A1;
-016A : 99200023;
-016B : 99400023;
-016C : 491D4481;
-016D : 02000A13;
-016E : 49A14AB5;
-016F : 85334401;
-0170 : 33D90084;
-0171 : 0E133725;
-0172 : 15630200;
-0173 : 00230124;
-0174 : 4E299950;
-0175 : 99C00023;
-0176 : 12E30405;
-0177 : 04A1FF34;
-0178 : FD449EE3;
-0179 : C0102EF3;
-017A : 1908BF37;
-017B : 0FFF0F93;
-017C : C01026F3;
-017D : 41D68733;
-017E : FEEFFCE3;
-017F : 878B57FD;
-0180 : 40850607;
-0181 : 80102623;
-0182 : 1463BFF5;
-0183 : 002301C7;
-0184 : 00239950;
-0185 : B72D98E0;
-0186 : 01109463;
-0187 : 99000023;
-0188 : 98100023;
-0189 : 1463B725;
-018A : 002300A3;
-018B : 00239870;
-018C : B7359860;
-018D : 00C51463;
-018E : 98B00023;
-018F : 98A00023;
-0190 : 9463BF15;
-0191 : 00230069;
-0192 : 00239850;
-0193 : B7A19930;
-0194 : 11416509;
-0195 : 91A50513;
-0196 : 3D5DC606;
-0197 : 11416509;
-0198 : 92550513;
-0199 : 356DC606;
-019A : 12400293;
-019B : 0002A783;
-019C : 00178313;
-019D : 0062A023;
-019E : 01F37393;
-019F : 02039163;
-01A0 : 00535513;
-01A1 : 00357593;
-01A2 : 0EC00693;
-01A3 : 00B68833;
-01A4 : 00084883;
-01A5 : 00234E21;
-01A6 : 00239910;
-01A7 : 808299C0;
-01A8 : CE061101;
-01A9 : CA26CC22;
-01AA : C64EC84A;
-01AB : C256C452;
-01AC : C0102773;
-01AD : 12E02423;
-01AE : DE900093;
-01AF : 0610078B;
-01B0 : 02936409;
-01B1 : 83138F44;
-01B2 : 04130452;
-01B3 : 47A98F44;
-01B4 : 43834735;
-01B5 : 03050003;
-01B6 : 14039363;
-01B7 : 2423449D;
-01B8 : 557D8090;
-01B9 : 06A0058B;
-01BA : 2005F613;
-01BB : C6B7DE65;
-01BC : 0837193A;
-01BD : 88B74000;
-01BE : 7A374000;
-01BF : 8F13F4D5;
-01C0 : 59FD6046;
-01C1 : 44814901;
-01C2 : 0F934501;
-01C3 : 8E130008;
-01C4 : 0A939188;
-01C5 : EB6325FA;
-01C6 : 0A9311CF;
-01C7 : 462908F4;
-01C8 : CE0345B5;
-01C9 : 0A85000A;
-01CA : 120E1963;
-01CB : 4EB533C1;
-01CC : 99D00023;
-01CD : 00234F29;
-01CE : 0F9399E0;
-01CF : 45290A54;
-01D0 : C7034A35;
-01D1 : 0F85000F;
-01D2 : 12071063;
-01D3 : 3B79854E;
-01D4 : 02000993;
-01D5 : FFF94513;
-01D6 : 99300023;
-01D7 : 49353B41;
-01D8 : 99200023;
-01D9 : 002347A9;
-01DA : 926398F0;
-01DB : 84B71204;
-01DC : 35374000;
-01DD : 49014001;
-01DE : 91848393;
-01DF : 2B050293;
-01E0 : 1053EC63;
-01E1 : 12091C63;
-01E2 : 80800893;
-01E3 : A0234A19;
-01E4 : 4A950148;
-01E5 : 0158A023;
-01E6 : 0EF40413;
-01E7 : 47B540A9;
-01E8 : 00044E03;
-01E9 : 10630405;
-01EA : 2EF3120E;
-01EB : BF37C010;
-01EC : 0F931908;
-01ED : 27730FFF;
-01EE : 09B3C010;
-01EF : FCE341D7;
-01F0 : 4935FF3F;
-01F1 : 99200023;
-01F2 : 70B747A9;
-01F3 : 00234000;
-01F4 : 829398F0;
-01F5 : 47291D90;
-01F6 : C3034FB5;
-01F7 : 02850002;
-01F8 : 0E031A63;
-01F9 : 40002097;
-01FA : 010080E7;
-01FB : 400073B7;
-01FC : 1F338493;
-01FD : 4EB54F29;
-01FE : 0004C503;
-01FF : E1750485;
-0200 : 80002583;
-0201 : 38584637;
-0202 : 14D60693;
-0203 : 10D58163;
-0204 : 400078B7;
-0205 : 1F788693;
-0206 : 4AB544A9;
-0207 : 9463A0C5;
-0208 : 002300F3;
-0209 : 002398E0;
-020A : B5659870;
-020B : 000FA683;
-020C : 48B30F91;
-020D : AE2300DF;
-020E : A803FF1F;
-020F : 0F33FFCF;
-0210 : AE23035F;
-0211 : 4EB3FEDF;
-0212 : 95360118;
-0213 : 01D4E4B3;
-0214 : 00D96933;
-0215 : 00D9F9B3;
-0216 : 1463BD7D;
-0217 : 002300CE;
-0218 : 002398B0;
-0219 : BD7599C0;
-021A : 00A71463;
-021B : 99400023;
-021C : 98E00023;
-021D : 9463B5F9;
-021E : 00230013;
-021F : 00239850;
-0220 : 43839870;
-0221 : 03050003;
-0222 : FE0397E3;
-0223 : 0313B5CD;
-0224 : 40A90BE4;
-0225 : B7F542B5;
-0226 : 0003A303;
-0227 : 69330391;
-0228 : BDF90069;
-0229 : 00B81463;
-022A : 98C00023;
-022B : 99000023;
-022C : 0006C803;
-022D : 17E30685;
-022E : B5F9FE08;
-022F : 0D640693;
-0230 : 463545A9;
-0231 : 1463B7F5;
-0232 : 0023001E;
-0233 : 002398F0;
-0234 : B5F999C0;
-0235 : 00E31463;
-0236 : 99F00023;
-0237 : 98600023;
-0238 : 1463BDED;
-0239 : 002301E5;
-023A : 002399D0;
-023B : B72998A0;
-023C : 009E1463;
-023D : 99500023;
-023E : 99C00023;
-023F : 0006CE03;
-0240 : 17E30685;
-0241 : 1097FE0E;
-0242 : 80E74000;
-0243 : 4583B0A0;
-0244 : 46038060;
-0245 : 46838050;
-0246 : 47038040;
-0247 : 78378070;
-0248 : 05134000;
-0249 : 10972718;
-024A : 80E74000;
-024B : 4883B760;
-024C : 4A038060;
-024D : 85638070;
-024E : 75370348;
-024F : 06134000;
-0250 : 45A920F5;
-0251 : A03949B5;
-0252 : 00B81463;
-0253 : 99300023;
-0254 : 99000023;
-0255 : 00064803;
-0256 : 17E30605;
-0257 : B765FE08;
-0258 : 00234AB5;
-0259 : 44299950;
-025A : 40007E37;
-025B : 98800023;
-025C : 23EE0E93;
-025D : 43B54A29;
-025E : 000ECF03;
-025F : 1D630E85;
-0260 : 3937120F;
-0261 : 1FB74001;
-0262 : 27371111;
-0263 : 04934433;
-0264 : 44010409;
-0265 : 111F8A13;
-0266 : 21170993;
-0267 : 40007937;
-0268 : 07B34AA1;
-0269 : 10930344;
-026A : 82B30024;
-026B : 05130014;
-026C : 040529C9;
-026D : 013785B3;
-026E : 00B2A023;
-026F : 0002A783;
-0270 : 40001097;
-0271 : ADC080E7;
-0272 : FD541DE3;
-0273 : 00234335;
-0274 : 43A99860;
-0275 : 98700023;
-0276 : 4A214981;
-0277 : 00299513;
-0278 : 00A485B3;
-0279 : 0513418C;
-027A : 098529C9;
-027B : 40001097;
-027C : AB0080E7;
-027D : FF4994E3;
-027E : 40007637;
-027F : 25060813;
-0280 : 44354329;
-0281 : 00084883;
-0282 : 9E630805;
-0283 : 4AA10A08;
-0284 : 878B6489;
-0285 : 25830804;
-0286 : 0513C000;
-0287 : 1AFD29C9;
-0288 : 40001097;
-0289 : A7C080E7;
-028A : FE0A95E3;
-028B : 400076B7;
-028C : 20C68E13;
-028D : 40B542A9;
-028E : 000E4E83;
-028F : 9B630E05;
-0290 : 1097080E;
-0291 : 80E74000;
-0292 : 4F11E0A0;
-0293 : 80800913;
-0294 : 01E92023;
-0295 : 40001097;
-0296 : B16080E7;
-0297 : 40002097;
-0298 : 07C080E7;
-0299 : 20234F8D;
-029A : 109701F9;
-029B : 80E74000;
-029C : 20975080;
-029D : 80E74000;
-029E : 2097ACC0;
-029F : 80E74000;
-02A0 : 4709F9A0;
-02A1 : 00E92023;
-02A2 : 40002097;
-02A3 : 05C080E7;
-02A4 : 20234785;
-02A5 : 209700F9;
-02A6 : 80E74000;
-02A7 : 2623E380;
-02A8 : 24238800;
-02A9 : 40F28000;
-02AA : 44D24462;
-02AB : 49B24942;
-02AC : 4A924A22;
-02AD : 80826105;
-02AE : 014F1463;
-02AF : 98700023;
-02B0 : 99E00023;
-02B1 : 9463BD55;
-02B2 : 00230068;
-02B3 : 00239880;
-02B4 : BF0D9910;
-02B5 : 005E9463;
-02B6 : 98100023;
-02B7 : 99D00023;
-02B8 : 4785BFA1;
-02B9 : 00A79533;
-02BA : FFF54293;
-02BB : 0655050B;
-02BC : 27038082;
-02BD : 02B700C0;
-02BE : 20230B00;
-02BF : 8333A0A0;
-02C0 : 03B300E2;
-02C1 : 053700B3;
-02C2 : 22232500;
-02C3 : 8E49A070;
-02C4 : A0C02423;
-02C5 : 20238082;
-02C6 : 07B7A0A0;
-02C7 : 22232000;
-02C8 : 8DDDA000;
-02C9 : A0B02423;
-02CA : 02938082;
-02CB : A70312C0;
-02CC : 06930002;
-02CD : A0230017;
-02CE : CB1900D2;
-02CF : 07634585;
-02D0 : 0F1302B7;
-02D1 : 0F932000;
-02D2 : 078BDFF0;
-02D3 : 808207FF;
-02D4 : 40000537;
-02D5 : 40008337;
-02D6 : 00050613;
-02D7 : 91830393;
-02D8 : 40C38633;
-02D9 : 05134581;
-02DA : B7610005;
-02DB : 40008837;
-02DC : 40013E37;
-02DD : 91880893;
-02DE : 2B0E0E93;
-02DF : 411E85B3;
-02E0 : 91880513;
-02E1 : 1101BF49;
-02E2 : CA26CE06;
-02E3 : C84ACC22;
-02E4 : C452C64E;
-02E5 : 88805783;
-02E6 : 18C00093;
-02E7 : 01079493;
-02E8 : 0FF7F293;
-02E9 : 0000A403;
-02EA : 826380C1;
-02EB : 43031202;
-02EC : 45838910;
-02ED : 46958900;
-02EE : 0FF37613;
-02EF : 0FF5F593;
-02F0 : 1066E463;
-02F1 : 6F634F05;
-02F2 : 146314CF;
-02F3 : 0D631006;
-02F4 : 2F831404;
-02F5 : 89630044;
-02F6 : 401C020F;
-02F7 : 00178713;
-02F8 : 8023C018;
-02F9 : 408300B7;
-02FA : 428301D4;
-02FB : F3330144;
-02FC : 0EA30050;
-02FD : 0AA30064;
-02FE : 40548860;
-02FF : FFF68393;
-0300 : 00742223;
-0301 : 02039863;
-0302 : 00C403B3;
-0303 : 00B38B23;
-0304 : 01045A03;
-0305 : 40CA5533;
-0306 : 00157913;
-0307 : 00090C63;
-0308 : 00860993;
-0309 : 00299813;
-030A : 010408B3;
-030B : 0008AE03;
-030C : 9E028522;
-030D : 1004F593;
-030E : 4450C1A1;
-030F : 14060D63;
-0310 : FFF60E93;
-0311 : 01D42623;
-0312 : 140E8763;
-0313 : 01D44083;
-0314 : 01544283;
-0315 : 0050F6B3;
-0316 : 00D40EA3;
-0317 : 88D00AA3;
-0318 : 00842383;
-0319 : 00138A13;
-031A : 01442423;
-031B : 0003C503;
-031C : 00A40E23;
-031D : 88A00A23;
-031E : 2004F913;
-031F : 02090563;
-0320 : 01D44803;
-0321 : 89504983;
-0322 : 89000AA3;
-0323 : 01045883;
-0324 : 0FF9F593;
-0325 : 2008FE13;
-0326 : 000E0763;
-0327 : 03C42E83;
-0328 : 85224605;
-0329 : 444C9E82;
-032A : 01045F83;
-032B : 36334040;
-032C : 1F1300B0;
-032D : 67330086;
-032E : 37B301FF;
-032F : E3330080;
-0330 : 609300E7;
-0331 : A09D0823;
-0332 : 0F63439D;
-0333 : F03D0676;
-0334 : FA13A8A1;
-0335 : 191303F5;
-0336 : 0813002A;
-0337 : 08B31BC0;
-0338 : A4030128;
-0339 : 00230008;
-033A : A0231140;
-033B : 03130080;
-033C : C0150820;
-033D : 00C42E03;
-033E : 01045F83;
-033F : 3EB3405C;
-0340 : 9F1301C0;
-0341 : 6733008E;
-0342 : 30B301FF;
-0343 : E2B300F0;
-0344 : E31300E0;
-0345 : 15230822;
-0346 : 46818860;
-0347 : 4C54C011;
-0348 : 88D02A23;
-0349 : EE0412E3;
-034A : 08200093;
-034B : 01009293;
-034C : 0092E4B3;
-034D : 88902423;
-034E : 446240F2;
-034F : 494244D2;
-0350 : 4A2249B2;
-0351 : 80826105;
-0352 : 04000513;
-0353 : 10004A03;
-0354 : 0000A023;
-0355 : 10A00023;
-0356 : 08200613;
-0357 : 88C01523;
-0358 : 88002A23;
-0359 : 09134401;
-035A : 09931BC0;
-035B : 08331000;
-035C : 25030089;
-035D : CD010008;
-035E : 01055883;
-035F : 0808FE13;
-0360 : 000E0763;
-0361 : 04052E83;
-0362 : 85D2461D;
-0363 : 04119E82;
-0364 : FD341FE3;
-0365 : 4F83BF51;
-0366 : 4F0301F4;
-0367 : 0E238940;
-0368 : 0A2301F4;
-0369 : 570389F0;
-036A : 75930104;
-036B : 77930FFF;
-036C : 83E31007;
-036D : 2303EC07;
-036E : 46010384;
-036F : 93028522;
-0370 : 47A1BD65;
-0371 : 828B575D;
-0372 : C10C06E7;
-0373 : 18C02383;
-0374 : 0EA3C150;
-0375 : 166300D5;
-0376 : 454C0275;
-0377 : 01055E03;
-0378 : 00C03633;
-0379 : 00B036B3;
-037A : 00869813;
-037B : 010668B3;
-037C : 01C8EEB3;
-037D : 082EEF13;
-037E : 89E01523;
-037F : 2A234D48;
-0380 : FF9388A0;
-0381 : 57DD0082;
-0382 : 06FF878B;
-0383 : 47A18082;
-0384 : 828B575D;
-0385 : 831306E7;
-0386 : C5500015;
-0387 : 00652423;
-0388 : 0005C383;
-0389 : 00D50EA3;
-038A : 18C02683;
-038B : 00750E23;
-038C : 02D51763;
-038D : 00452803;
-038E : 01055F03;
-038F : 00C03633;
-0390 : 010038B3;
-0391 : 00861E13;
-0392 : 01C8EEB3;
-0393 : 01EEEFB3;
-0394 : 082FE793;
-0395 : 88F01523;
-0396 : 2A234D48;
-0397 : F29388A0;
-0398 : 575D0082;
-0399 : 06E2878B;
-039A : 47A18082;
-039B : 828B575D;
-039C : 230306E7;
-039D : 0FA300C5;
-039E : 1A6300B5;
-039F : 26030003;
-03A0 : 0E2318C0;
-03A1 : 146300B5;
-03A2 : 0A2300C5;
-03A3 : F51388B0;
-03A4 : 55DD0082;
-03A5 : 06B5078B;
-03A6 : 47A18082;
-03A7 : 828B575D;
-03A8 : 238306E7;
-03A9 : 0EA318C0;
-03AA : 146300B5;
-03AB : 0AA30075;
-03AC : F51388B0;
-03AD : 55DD0082;
-03AE : 06B5078B;
-03AF : 07938082;
-03B0 : 18230940;
-03B1 : 0EA300F5;
-03B2 : 0AA30005;
-03B3 : 42838800;
-03B4 : 06A304F5;
-03B5 : E3130405;
-03B6 : 07A30012;
-03B7 : 80820465;
-03B8 : 04F54783;
-03B9 : 0027E293;
-03BA : 045507A3;
-03BB : 47838082;
-03BC : E29304F5;
-03BD : 07A30047;
-03BE : 80820455;
-03BF : C7CE7115;
-03C0 : CDA2CF86;
-03C1 : CBA6C1DA;
-03C2 : C5D2C9CA;
-03C3 : DF5EC3D6;
-03C4 : DB66DD62;
-03C5 : D76ED96A;
-03C6 : 0F400093;
-03C7 : 12402B03;
-03C8 : 0000A283;
-03C9 : 88002483;
-03CA : 0054F413;
-03CB : 17628063;
-03CC : 43836309;
-03CD : 0B93A003;
-03CE : F5130F40;
-03CF : C1710013;
-03D0 : 40001097;
-03D1 : 05C080E7;
-03D2 : 00157913;
-03D3 : 00090563;
-03D4 : 4A014A85;
-03D5 : 0A93A8D9;
-03D6 : AA038080;
-03D7 : 7CB7000A;
-03D8 : 3D374000;
-03D9 : 6C134001;
-03DA : A023002A;
-03DB : 4605018A;
-03DC : 20EC8593;
-03DD : 060D0513;
-03DE : 40004097;
-03DF : ED0080E7;
-03E0 : 77B7C105;
-03E1 : 85134000;
-03E2 : 00975E97;
-03E3 : 80E74000;
-03E4 : A9835120;
-03E5 : F293000A;
-03E6 : A023FFD9;
-03E7 : BF4D005A;
-03E8 : 100C0850;
-03E9 : 20EC8513;
-03EA : 02010023;
-03EB : 5097CA02;
-03EC : 80E74000;
-03ED : 4652D140;
-03EE : 40007DB7;
-03EF : 8513100C;
-03F0 : 0097602D;
-03F1 : 80E74000;
-03F2 : 08704DA0;
-03F3 : 8513082C;
-03F4 : CC0220EC;
-03F5 : 40005097;
-03F6 : B86080E7;
-03F7 : 45E24E72;
-03F8 : 40007FB7;
-03F9 : 00AE5E83;
-03FA : 01CE2F03;
-03FB : 630F8513;
-03FC : 009E9693;
-03FD : FFEF0613;
-03FE : 40000097;
-03FF : 4A4080E7;
-0400 : 1097BF81;
-0401 : 80E74000;
-0402 : 7593F4C0;
-0403 : F1A90015;
-0404 : 19000813;
-0405 : 00082703;
-0406 : 08B346FD;
-0407 : F56340EB;
-0408 : 20230716;
-0409 : 4A810168;
-040A : A0234A05;
-040B : 0093016B;
-040C : A7030F80;
-040D : FB930000;
-040E : C25E0014;
-040F : 0E63C002;
-0410 : 03130A87;
-0411 : A0238080;
-0412 : 23830080;
-0413 : F5930003;
-0414 : 96130014;
-0415 : F5130025;
-0416 : 6833FFB3;
-0417 : 78B700A6;
-0418 : 20234000;
-0419 : 89130103;
-041A : 43295B68;
-041B : 46834C35;
-041C : 09050009;
-041D : 8891EE99;
-041E : 7A37C8A9;
-041F : 0D134000;
-0420 : 4C295CBA;
-0421 : A01D4CB5;
-0422 : B5E14A81;
-0423 : 4A014A81;
-0424 : 9463BF79;
-0425 : 00230066;
-0426 : 00239980;
-0427 : BFC198D0;
-0428 : 018D9463;
-0429 : 99900023;
-042A : 99B00023;
-042B : 000D4D83;
-042C : 97E30D05;
-042D : 4E12FE0D;
-042E : 160E1563;
-042F : 40007EB7;
-0430 : 5D2E8793;
-0431 : 49B54FA9;
-0432 : 7AB7A821;
-0433 : 8D134000;
-0434 : BF455C5A;
-0435 : 01F29463;
-0436 : 99300023;
-0437 : 98500023;
-0438 : 0007C283;
-0439 : 97E30785;
-043A : 8C39FE02;
-043B : 00245713;
-043C : 7A934B05;
-043D : C05A0017;
-043E : 63894A05;
-043F : 4000C0B7;
-0440 : 85136309;
-0441 : 8D13B183;
-0442 : 4B812000;
-0443 : 84934B01;
-0444 : 0C132000;
-0445 : C42AA003;
-0446 : 04ED4583;
-0447 : 100A8863;
-0448 : 10058763;
-0449 : 4901846A;
-044A : 47834DA1;
-044B : F2932AE4;
-044C : 84630017;
-044D : 47030402;
-044E : 7313001C;
-044F : 18630017;
-0450 : 05130003;
-0451 : 40970504;
-0452 : 80E74000;
-0453 : 438367A0;
-0454 : F0932AE4;
-0455 : 0723FFE3;
-0456 : 45032A14;
-0457 : 059304CD;
-0458 : 0623FFF5;
-0459 : 480304BD;
-045A : 78932AF4;
-045B : 96630048;
-045C : 76130008;
-045D : 0723FFE8;
-045E : 09052AC4;
-045F : 2E840413;
-0460 : FBB915E3;
-0461 : 040D0723;
-0462 : C6914682;
-0463 : 2097856A;
-0464 : 80E74000;
-0465 : 4E128560;
-0466 : 0E634981;
-0467 : 5CDD020E;
-0468 : 870B4EA1;
-0469 : 6F09079E;
-046A : B90F0F93;
-046B : 03FB07B3;
-046C : 00F48DB3;
-046D : 04FDC983;
-046E : 040D87A3;
-046F : 0FF9F993;
-0470 : 0790068B;
-0471 : 0069F293;
-0472 : 20028D63;
-0473 : 2097856A;
-0474 : 80E74000;
-0475 : 46038160;
-0476 : 106304ED;
-0477 : 6F894606;
-0478 : B90F8793;
-0479 : 42910B05;
-047A : 9BBE9D3E;
-047B : F25B16E3;
-047C : 000A0A63;
-047D : 80800493;
-047E : 0004AA03;
-047F : FFDA7A93;
-0480 : 0154A023;
-0481 : 446E40FE;
-0482 : 494E44DE;
-0483 : 4A2E49BE;
-0484 : 4B0E4A9E;
-0485 : 5C6A5BFA;
-0486 : 5D4A5CDA;
-0487 : 612D5DBA;
-0488 : 7F378082;
-0489 : 07934000;
-048A : BD695DEF;
-048B : 4603FDB1;
-048C : 7813000C;
-048D : 19E30016;
-048E : 2883F408;
-048F : 66898800;
-0490 : B2368D93;
-0491 : 0048F913;
-0492 : 00091563;
-0493 : 8D934CA2;
-0494 : 0E1300AC;
-0495 : 0E930300;
-0496 : 802302F0;
-0497 : 80A301CD;
-0498 : 812301DD;
-0499 : 0413000D;
-049A : 8CEA2A8D;
-049B : 03000913;
-049C : 044D2F03;
-049D : 40007FB7;
-049E : 0693874A;
-049F : 8613008F;
-04A0 : 4591662F;
-04A1 : 79B78522;
-04A2 : 0D934000;
-04A3 : 5097DA84;
-04A4 : 80E74000;
-04A5 : 899331E0;
-04A6 : A68376C9;
-04A7 : 83630009;
-04A8 : 77B71206;
-04A9 : 87224000;
-04AA : 66A78613;
-04AB : 04000593;
-04AC : 50971008;
-04AD : 80E74000;
-04AE : C2832FA0;
-04AF : F7132AEC;
-04B0 : CB050012;
-04B1 : 001C4083;
-04B2 : 0010F313;
-04B3 : 00031763;
-04B4 : 4097856E;
-04B5 : 80E74000;
-04B6 : C3834EE0;
-04B7 : F5132AEC;
-04B8 : 8723FFE3;
-04B9 : 45832AAC;
-04BA : 861304CD;
-04BB : 0623FFF5;
-04BC : C80304CD;
-04BD : 78932AFC;
-04BE : 92630048;
-04BF : 7F930E08;
-04C0 : 87230FE8;
-04C1 : F6932BFC;
-04C2 : 4605002F;
-04C3 : 460DE291;
-04C4 : 856E100C;
-04C5 : 4097C632;
-04C6 : 80E74000;
-04C7 : 4EA9B920;
-04C8 : 2AECCE03;
-04C9 : 01D51A63;
-04CA : 7F934F32;
-04CB : 8563002F;
-04CC : 6F93000F;
-04CD : B7F1002E;
-04CE : C1114785;
-04CF : 62B34791;
-04D0 : 872300FE;
-04D1 : F7132A5C;
-04D2 : CB510012;
-04D3 : 400079B7;
-04D4 : 85A21010;
-04D5 : 66F98513;
-04D6 : 40000097;
-04D7 : 144080E7;
-04D8 : 02200313;
-04D9 : 00840393;
-04DA : 2A6CA823;
-04DB : 0A7CA023;
-04DC : 567D55FD;
-04DD : 4097856E;
-04DE : 80E74000;
-04DF : C91146C0;
-04E0 : 40007DB7;
-04E1 : 851385A2;
-04E2 : 0097683D;
-04E3 : 80E74000;
-04E4 : 26031120;
-04E5 : A083044D;
-04E6 : A583064C;
-04E7 : 5883060C;
-04E8 : 95130026;
-04E9 : D8130180;
-04EA : 66330085;
-04EB : F3630105;
-04EC : 864600C8;
-04ED : 2ACC9623;
-04EE : 04CD4683;
-04EF : 00168E13;
-04F0 : 05CD0623;
-04F1 : 0E930905;
-04F2 : 04130380;
-04F3 : 8C932E84;
-04F4 : 1FE32E8C;
-04F5 : 4F05E9D9;
-04F6 : 05ED0723;
-04F7 : 0991B375;
-04F8 : F713BD6D;
-04F9 : 08E30019;
-04FA : 4303DE07;
-04FB : 4603049D;
-04FC : 6505048D;
-04FD : 00635393;
-04FE : 79050593;
-04FF : 00839093;
-0500 : 00BB8833;
-0501 : 010088B3;
-0502 : 00167913;
-0503 : 00737C93;
-0504 : 01148433;
-0505 : 04090063;
-0506 : 2E800693;
-0507 : 02DC8DB3;
-0508 : 00FD8E33;
-0509 : 01C48EB3;
-050A : 2AEECF03;
-050B : 001F7F93;
-050C : 040F9963;
-050D : F8000893;
-050E : 051D06A3;
-050F : 08000593;
-0510 : 3425856A;
-0511 : 040D0423;
-0512 : 048D4603;
-0513 : FFE67693;
-0514 : 04DD0423;
-0515 : 048D4D83;
-0516 : 002DFE13;
-0517 : 0A0E0463;
-0518 : 010D5803;
-0519 : FFDDF593;
-051A : 04BD0423;
-051B : 10086893;
-051C : 011D1823;
-051D : 06134685;
-051E : 85A21000;
-051F : 3A41856A;
-0520 : 856ABB99;
-0521 : 40001097;
-0522 : 4F4080E7;
-0523 : 0813E901;
-0524 : 06A30210;
-0525 : 0593050D;
-0526 : B75D0210;
-0527 : 80800793;
-0528 : A283D002;
-0529 : 45950007;
-052A : E713856A;
-052B : C3980022;
-052C : 831332ED;
-052D : 83B3050B;
-052E : 856A006D;
-052F : 00748933;
-0530 : 40001097;
-0531 : 486080E7;
-0532 : 00851593;
-0533 : 854A4601;
-0534 : 40004097;
-0535 : 312080E7;
-0536 : 45A1C511;
-0537 : 04BD06A3;
-0538 : BFB945A1;
-0539 : 06131014;
-053A : 85A21000;
-053B : 4097854A;
-053C : 80E74000;
-053D : F175CDE0;
-053E : 05135082;
-053F : 9EE31000;
-0540 : B799FCA0;
-0541 : 004DFE93;
-0542 : 020E8563;
-0543 : 010D5083;
-0544 : FFBDF913;
-0545 : 052D0423;
-0546 : 0010E513;
-0547 : 00AD1823;
-0548 : 04100693;
-0549 : 10000613;
-054A : 856A85A2;
-054B : 897FF0EF;
-054C : FF13B15D;
-054D : 0563008D;
-054E : 6789040F;
-054F : 2E800F93;
-0550 : B9078293;
-0551 : 03FC8CB3;
-0552 : 025B0733;
-0553 : 00EC8333;
-0554 : 00648DB3;
-0555 : 2AEDC383;
-0556 : 0013F913;
-0557 : 02091E63;
-0558 : F8000293;
-0559 : 045D06A3;
-055A : 08000593;
-055B : 38F5856A;
-055C : 040D0423;
-055D : 048D4703;
-055E : FF777313;
-055F : 046D0423;
-0560 : 048D4D83;
-0561 : F393856A;
-0562 : 042300FD;
-0563 : 1097047D;
-0564 : 80E74000;
-0565 : B1814220;
-0566 : 0023F093;
-0567 : 00008963;
-0568 : 04000793;
-0569 : 04FD06A3;
-056A : 04000593;
-056B : 856AB7C1;
-056C : 40001097;
-056D : 3C8080E7;
-056E : 0F93E901;
-056F : 06A30210;
-0570 : 059305FD;
-0571 : B75D0210;
-0572 : 0513D002;
-0573 : 410C8080;
-0574 : 050B8893;
-0575 : 011C8633;
-0576 : 0025E813;
-0577 : 01052023;
-0578 : 8CB3856A;
-0579 : 109700C4;
-057A : 80E74000;
-057B : 15933600;
-057C : 46010085;
-057D : 40978566;
-057E : 80E74000;
-057F : C9011EC0;
-0580 : 02000F13;
-0581 : 05ED06A3;
-0582 : 02000593;
-0583 : C683B785;
-0584 : 06132AED;
-0585 : 85A21000;
-0586 : 0086EE13;
-0587 : 2BCD8723;
-0588 : 85661014;
-0589 : 40004097;
-058A : D96080E7;
-058B : 5402F971;
-058C : 10000E93;
-058D : FDD416E3;
-058E : 1663BF35;
-058F : F993000A;
-0590 : 8EE30049;
-0591 : 846AB809;
-0592 : 4CA14D81;
-0593 : 2AE44683;
-0594 : 0086FE13;
-0595 : 000E0E63;
-0596 : 05040513;
-0597 : 40004097;
-0598 : FAC080E7;
-0599 : 2AE44E83;
-059A : FF7EFF13;
-059B : 2BE40723;
-059C : 04130D85;
-059D : 9BE32E84;
-059E : B695FD9D;
-059F : 01D54783;
-05A0 : 0047E293;
-05A1 : 00550EA3;
-05A2 : 88500AA3;
-05A3 : 47838082;
-05A4 : E29301D5;
-05A5 : 0EA30027;
-05A6 : 0AA30055;
-05A7 : 80828850;
-05A8 : D4227179;
-05A9 : F793D606;
-05AA : 842E0045;
-05AB : 4083CFCD;
-05AC : 031301D5;
-05AD : F2931B10;
-05AE : 0EA30FB0;
-05AF : 0AA30055;
-05B0 : 43838850;
-05B1 : 85B70073;
-05B2 : 8893AE14;
-05B3 : 0613AE15;
-05B4 : 08331470;
-05B5 : 47030276;
-05B6 : 4F030063;
-05B7 : 45830053;
-05B8 : 50930033;
-05B9 : 7F930017;
-05BA : 979303FF;
-05BB : F293005F;
-05BC : E6B301F0;
-05BD : 47830057;
-05BE : BE330023;
-05BF : 43830313;
-05C0 : 43030043;
-05C1 : F0930013;
-05C2 : F61300F7;
-05C3 : 929301F3;
-05C4 : 073E0150;
-05C5 : CE02CC02;
-05C6 : 0EB34785;
-05C7 : 181301C8;
-05C8 : FE1300B6;
-05C9 : E8B301F5;
-05CA : 1F130106;
-05CB : 0EC6010E;
-05CC : 01E8EFB3;
-05CD : 01430693;
-05CE : 011ED893;
-05CF : 005FE3B3;
-05D0 : 011765B3;
-05D1 : 01969613;
-05D2 : 00C3E833;
-05D3 : 01059E13;
-05D4 : 1C23CA42;
-05D5 : 5F1300B1;
-05D6 : 1223010E;
-05D7 : 202391E0;
-05D8 : 03A39100;
-05D9 : 70931AF0;
-05DA : 8D630404;
-05DB : 42830000;
-05DC : 462101D5;
-05DD : 0402E693;
-05DE : 1B100593;
-05DF : F0EFC62A;
-05E0 : 4532E44F;
-05E1 : 53130462;
-05E2 : 52634184;
-05E3 : 46830A03;
-05E4 : 071301D5;
-05E5 : FE931A90;
-05E6 : 0EA30FD6;
-05E7 : 0AA301D5;
-05E8 : 288389D0;
-05E9 : 26039000;
-05EA : 48519040;
-05EB : 0158DF93;
-05EC : 01070023;
-05ED : F793CC32;
-05EE : D09300FF;
-05EF : 58130108;
-05F0 : 064600F6;
-05F1 : 00F70123;
-05F2 : 01F0F293;
-05F3 : 00C807B7;
-05F4 : 01165093;
-05F5 : 005701A3;
-05F6 : 0217B2B3;
-05F7 : 0198DE13;
-05F8 : 0F13CA46;
-05F9 : D393FECE;
-05FA : D31300B8;
-05FB : F8930058;
-05FC : 00A301F8;
-05FD : 9E1301E7;
-05FE : 7F130018;
-05FF : F4130018;
-0600 : 769301F3;
-0601 : 6FB303F3;
-0602 : 02A301EE;
-0603 : 022300D7;
-0604 : 03230087;
-0605 : 03A301F7;
-0606 : 54220057;
-0607 : E69350B2;
-0608 : 4621080E;
-0609 : 1A900593;
-060A : F06F6145;
-060B : 50B2DE4F;
-060C : 61455422;
-060D : 57838082;
-060E : 46039980;
-060F : 92931B90;
-0610 : D3130107;
-0611 : 8F1A0102;
-0612 : 1B900393;
-0613 : C595C211;
-0614 : 01037593;
-0615 : 0015B813;
-0616 : 01038023;
-0617 : 4703ED99;
-0618 : 78939900;
-0619 : 0E230FF7;
-061A : 0FA30115;
-061B : 5E030115;
-061C : 1E939980;
-061D : DF13010E;
-061E : 1F93010E;
-061F : D793010F;
-0620 : 5293010F;
-0621 : 5693007F;
-0622 : 1F23001F;
-0623 : 581398F0;
-0624 : F313009F;
-0625 : F6130082;
-0626 : C3830126;
-0627 : 65B30003;
-0628 : 771300C3;
-0629 : C8B30048;
-062A : CE1300E5;
-062B : 2F830E68;
-062C : 4EB318C0;
-062D : 0EA3007E;
-062E : 156301D5;
-062F : 4D4801F5;
-0630 : 88A02A23;
-0631 : 08238082;
-0632 : 079398B0;
-0633 : 002303E0;
-0634 : 458198F0;
-0635 : 0793B78D;
-0636 : 002303C0;
-0637 : 458598F0;
-0638 : 0793BF99;
-0639 : 65090230;
-063A : 98F00023;
-063B : 05134581;
-063C : B791A745;
-063D : 4F525245;
-063E : 00203A52;
-063F : 20746120;
-0640 : 20007830;
-0641 : 00783028;
-0642 : 61420A29;
-0643 : 64612064;
-0644 : 73657264;
-0645 : 30203A73;
-0646 : 696D0078;
-0647 : 696C6173;
-0648 : 64656E67;
-0649 : 766E6900;
-064A : 64696C61;
-064B : 736E6920;
-064C : 63757274;
-064D : 6E6F6974;
-064E : 2A0A0A00;
-064F : 48202A2A;
-0650 : 6F6C6C65;
-0651 : 6F57202C;
-0652 : 21646C72;
-0653 : 2A2A2A20;
-0654 : 58414D0A;
-0655 : 66203038;
-0656 : 776D7269;
-0657 : 20657261;
-0658 : 706D6F63;
-0659 : 64656C69;
-065A : 3A6E6F20;
-065B : 6E614A20;
-065C : 20323220;
-065D : 32323032;
-065E : 3A313020;
-065F : 333A3030;
-0660 : 53000A31;
-0661 : 4D415244;
-0662 : 74616420;
-0663 : 68632061;
-0664 : 736B6365;
-0665 : 203A6D75;
-0666 : 74694200;
-0667 : 6C612073;
-0668 : 73796177;
-0669 : 74657320;
-066A : 6C63202C;
-066B : 3A726165;
-066C : 44530020;
-066D : 204D4152;
-066E : 64616572;
-066F : 6972772F;
-0670 : 65206574;
-0671 : 726F7272;
-0672 : 4453000A;
-0673 : 204D4152;
-0674 : 7373622E;
-0675 : 20736920;
-0676 : 20746F6E;
-0677 : 6F72657A;
-0678 : 57000A21;
-0679 : 69746961;
-067A : 3520676E;
-067B : 66207320;
-067C : 7420726F;
-067D : 69747365;
-067E : 2E2E676E;
-067F : 0000002E;
-0680 : 00000101;
-0681 : 00000000;
-0682 : 00000000;
-0683 : 00000000;
-0684 : 00000000;
-0685 : 00000000;
-0686 : 00000000;
-0687 : 00000000;
-0688 : 00000000;
-0689 : 00000000;
-068A : 00000000;
-068B : 00000000;
-068C : 00000000;
-068D : 00000000;
-068E : 00000000;
-068F : 00000000;
-0690 : 00000105;
-0691 : 00007FBF;
-0692 : 00000000;
-0693 : D3030300;
-0694 : 0000167C;
-0695 : 00000000;
-0696 : 000016A0;
-0697 : 00000000;
-0698 : 00000000;
-0699 : 00000000;
-069A : 0000168E;
-069B : 00000000;
-069C : 00000000;
-069D : 00000000;
-069E : 00000000;
-069F : 00000000;
-06A0 : 00000000;
-06A1 : 00000101;
-06A2 : 0000FFFF;
-06A3 : 00000000;
-06A4 : 0003F600;
-06A5 : 000018C6;
-06A6 : 00000000;
-06A7 : 00000000;
-06A8 : 00000000;
-06A9 : 00000000;
-06AA : 00000000;
-06AB : 000018D6;
-06AC : 00000000;
-06AD : 00000000;
-06AE : 00000000;
-06AF : 00000000;
-06B0 : 00000000;
-06B1 : 00000000;
-06B2 : 00000000;
-06B3 : 00000000;
-06B4 : 00000000;
-06B5 : 00000000;
-06B6 : 00000000;
-06B7 : 00000000;
-06B8 : 00000000;
-06B9 : 00000000;
-06BA : 00000000;
-06BB : 00000000;
-06BC : 00000000;
-06BD : 00000000;
-06BE : 00000000;
-06BF : 00000000;
-06C0 : 00000000;
-06C1 : 00000000;
-06C2 : 00000000;
-06C3 : 00000000;
-06C4 : 00000000;
-06C5 : 00000000;
-06C6 : 6362612F;
-06C7 : 6B736964;
-06C8 : 3030382E;
-06C9 : 002F;
-[06CA..1FFF] : 00;
-END;

+ 1 - 1
rv32/checksum.h

@@ -1,4 +1,4 @@
 #ifndef CHECKSUM_H
 #ifndef CHECKSUM_H
 #define CHECKSUM_H
 #define CHECKSUM_H
-#define SDRAM_SUM 0xff919e72
+#define SDRAM_SUM 0x4631defa
 #endif
 #endif

+ 49 - 11
rv32/checksum.pl

@@ -3,10 +3,30 @@
 use strict;
 use strict;
 use integer;
 use integer;
 
 
-my($infile,$outfile,$length) = @ARGV;
+my $o;
+my $infile;
+my $outfile;
+my $patchfile;
+my $length;
+while (defined($o = shift @ARGV)) {
+    if ($o =~ /^-/) {
+	if ($o eq '-o') {
+	    $outfile = shift @ARGV;
+	} elsif ($o eq '-p') {
+	    $patchfile = shift @ARGV;
+	} elsif ($o eq '-l') {
+	    $length = shift @ARGV;
+	} else {
+	    last;		# Error
+	}
+    } else {
+	$infile = $o;
+	last;
+    }
+}
 
 
-unless (defined($outfile)) {
-    die "Usage: $0 infile outfile [length]\n";
+if (!defined($infile) || scalar @ARGV) {
+    die "Usage: $0 [-o outfile][-p patchfile][-l length] infile\n";
 }
 }
 
 
 sub nextblock($$$) {
 sub nextblock($$$) {
@@ -35,14 +55,32 @@ while (($blocklen = nextblock(4096, $len, $length)) &&
 }
 }
 close($in);
 close($in);
 
 
-open(my $out, '>', $outfile) or die "$0: $outfile: $!\n";
+if (defined($outfile)) {
+    my $out;
+    if ($outfile =~ /^-?$/) {
+	open($out, '>&', \*STDOUT);
+    } else {
+	open($out, '>', $outfile);
+    }
+    die "$0: $outfile: $!\n" unless defined($out);
 
 
-my $outfile_c = uc($outfile);
-$outfile_c =~ s/[\W_]+/_/g;
+    my $outfile_c = uc($outfile) || 'SDRAM_SUM_H';
+    $outfile_c =~ s/[\W_]+/_/g;
 
 
-print  $out "#ifndef $outfile_c\n";
-print  $out "#define $outfile_c\n";
-printf $out "#define SDRAM_SUM 0x%08x\n", $sum;
-print  $out "#endif\n";
+    print  $out "#ifndef $outfile_c\n";
+    print  $out "#define $outfile_c\n";
+    printf $out "#define SDRAM_SUM 0x%08x\n", $sum;
+    print  $out "#endif\n";
 
 
-close($out);
+    close($out);
+}
+
+if (defined($patchfile)) {
+    my $pf;
+    open($pf, '+<', $patchfile) or die "$0: $patchfile: $!\n";
+    binmode $pf;
+
+    seek($pf, 8, 0) or die "$0: $patchfile: $!\n";
+    print $pf pack("V", $sum);
+    close($pf);
+}

+ 3 - 0
rv32/fw.h

@@ -6,6 +6,8 @@
 #include "irq.h"
 #include "irq.h"
 
 
 extern const size_t __rom_offset;
 extern const size_t __rom_offset;
+extern const uint32_t __dram_checksum;
+extern const char __datestamp[];
 
 
 extern no_return _die(void);
 extern no_return _die(void);
 extern no_return exit(int);
 extern no_return exit(int);
@@ -27,6 +29,7 @@ static inline uint32_t timer_count(void)
     extern volatile uint32_t timer_irq_count;
     extern volatile uint32_t timer_irq_count;
     return timer_irq_count;
     return timer_irq_count;
 }
 }
+
 extern void init(void);
 extern void init(void);
 
 
 extern void mount_abcdrives(void);
 extern void mount_abcdrives(void);

+ 16 - 1
rv32/head.S

@@ -17,10 +17,16 @@
 	.section ".null","a"
 	.section ".null","a"
 	.globl _NULL
 	.globl _NULL
 _NULL:
 _NULL:
-	.space 12
+	.space 8
 	.type	_NULL, @object
 	.type	_NULL, @object
 	.size	_NULL, . - _NULL
 	.size	_NULL, . - _NULL
 
 
+	.globl __dram_checksum
+__dram_checksum:
+	.long 0			// Filled in post-link
+	.type __dram_checksum, @object
+	.size __dram_checksum, . - __dram_checksum
+
 	.globl __rom_offset
 	.globl __rom_offset
 __rom_offset:
 __rom_offset:
 	.long ROM_OFFSET
 	.long ROM_OFFSET
@@ -83,6 +89,15 @@ time_zero:
 	.size time_zero, . - time_zero
 	.size time_zero, . - time_zero
 	.popsection
 	.popsection
 
 
+	// Time stamp definition as patched in by FPGA build
+	.section ".datestamp","a"
+	.globl __datestamp
+__datestamp:
+	.space 32
+	.type __datestamp, @object
+	.size __datestamp, . - __datestamp
+
+	// Stack definition
 	.section ".stack","aw",@nobits
 	.section ".stack","aw",@nobits
 	.balign 4
 	.balign 4
 	.globl ___stack_bottom
 	.globl ___stack_bottom

+ 5 - 1
rv32/max80.ld

@@ -221,9 +221,13 @@ SECTIONS
 	_edata = .;
 	_edata = .;
 	_end = .;
 	_end = .;
 
 
+	/* Patched in during FPGA compile, must immediately follow _end */
+	.datestamp (NOLOAD) : { KEEP(*(.datestamp)) }
+
 	HIDDEN($sram_size_assert = ASSERT(. <= STACK_BOTTOM, "SRAM overflow"));
 	HIDDEN($sram_size_assert = ASSERT(. <= STACK_BOTTOM, "SRAM overflow"));
 
 
-	.stack STACK_BOTTOM : {
+	. = STACK_BOTTOM;
+	.stack (NOLOAD) : {
 		KEEP (*(.stack))
 		KEEP (*(.stack))
 	}
 	}
 
 

+ 1 - 1
rv32/romcopy.c

@@ -45,7 +45,7 @@ enum romcmd {
 
 
 size_t __sbss romcopy_log[15];
 size_t __sbss romcopy_log[15];
 
 
-#define SPIROM_DUAL_MODE 0
+#define SPIROM_DUAL_MODE 1
 
 
 void __hot romcopy_download(void *dst, size_t offset, size_t len)
 void __hot romcopy_download(void *dst, size_t offset, size_t len)
 {
 {

+ 5 - 1
rv32/system.c

@@ -91,7 +91,7 @@ void __hot init(void)
 #ifdef TEST
 #ifdef TEST
 	"testing"
 	"testing"
 #endif
 #endif
-	"firmware compiled on: " __DATE__ " " __TIME__ "\n";
+	"firmware compiled on: ";
 
 
     timer_irq_start = rdtime();
     timer_irq_start = rdtime();
 
 
@@ -100,6 +100,8 @@ void __hot init(void)
 		(1U << BUSERR_IRQ)|(1U << SYSCLOCK_IRQ));
 		(1U << BUSERR_IRQ)|(1U << SYSCLOCK_IRQ));
 
 
     con_puts(hello);
     con_puts(hello);
+    con_puts(__datestamp);
+    con_putc('\n');
 
 
     set_leds(7);
     set_leds(7);
     wait_romcopy_done();
     wait_romcopy_done();
@@ -138,6 +140,8 @@ void __hot init(void)
 
 
 	con_puts(hotstr("SDRAM data checksum: "));
 	con_puts(hotstr("SDRAM data checksum: "));
 	con_print_hex(v);
 	con_print_hex(v);
+	con_puts(hotstr(" expected "));
+	con_print_hex(__dram_checksum);
 	con_putc('\n');
 	con_putc('\n');
 
 
 	con_puts(hotstr("Bits always set, clear: "));
 	con_puts(hotstr("Bits always set, clear: "));

+ 0 - 0
rv32/bin2mif.pl → tools/bin2mif.pl