Browse Source

serial: simplify physical tty and make BREAK reset work

Simplify the physical TTY. Fix the handling of BREAK on the physical
TTY (or a button to ground tty_txd) to reset the system.
H. Peter Anvin 3 years ago
parent
commit
adf6c39024
20 changed files with 1883 additions and 1521 deletions
  1. 1 1
      fpga/ip/fifo.qip
  2. 13 13
      fpga/ip/fifo.v
  3. 2 2
      fpga/max80.qpf
  4. 1 1
      fpga/max80.qsf
  5. 126 132
      fpga/max80.sv
  6. BIN
      fpga/output/v1.jic
  7. BIN
      fpga/output/v1.sof
  8. BIN
      fpga/output/v2.jic
  9. BIN
      fpga/output/v2.sof
  10. 160 0
      fpga/serial.sv
  11. 9 1
      fpga/spirom.sv
  12. 0 186
      fpga/tty.sv
  13. 10 0
      rv32/Makefile
  14. 1449 1164
      rv32/boot.mif
  15. 4 0
      rv32/checksum.h
  16. 48 0
      rv32/checksum.pl
  17. 1 1
      rv32/console.c
  18. 10 5
      rv32/console.h
  19. 6 4
      rv32/io.h
  20. 43 11
      rv32/system.c

+ 1 - 1
fpga/ip/fifo.qip

@@ -1,5 +1,5 @@
 set_global_assignment -name IP_TOOL_NAME "FIFO"
 set_global_assignment -name IP_TOOL_NAME "FIFO"
-set_global_assignment -name IP_TOOL_VERSION "20.1"
+set_global_assignment -name IP_TOOL_VERSION "21.1"
 set_global_assignment -name IP_GENERATED_DEVICE_FAMILY "{Cyclone IV E}"
 set_global_assignment -name IP_GENERATED_DEVICE_FAMILY "{Cyclone IV E}"
 set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "fifo.v"]
 set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "fifo.v"]
 set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "fifo_inst.v"]
 set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "fifo_inst.v"]

+ 13 - 13
fpga/ip/fifo.v

@@ -14,11 +14,11 @@
 // ************************************************************
 // ************************************************************
 // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
 // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
 //
 //
-// 20.1.1 Build 720 11/11/2020 SJ Lite Edition
+// 21.1.0 Build 842 10/21/2021 SJ Lite Edition
 // ************************************************************
 // ************************************************************
 
 
 
 
-//Copyright (C) 2020  Intel Corporation. All rights reserved.
+//Copyright (C) 2021  Intel Corporation. All rights reserved.
 //Your use of Intel Corporation's design tools, logic functions 
 //Your use of Intel Corporation's design tools, logic functions 
 //and other software and tools, and any partner logic 
 //and other software and tools, and any partner logic 
 //functions, and any output files from any of the foregoing 
 //functions, and any output files from any of the foregoing 
@@ -58,16 +58,16 @@ module fifo (
 	output	  empty;
 	output	  empty;
 	output	  full;
 	output	  full;
 	output	[7:0]  q;
 	output	[7:0]  q;
-	output	[8:0]  usedw;
+	output	[9:0]  usedw;
 
 
 	wire  sub_wire0;
 	wire  sub_wire0;
 	wire  sub_wire1;
 	wire  sub_wire1;
 	wire [7:0] sub_wire2;
 	wire [7:0] sub_wire2;
-	wire [8:0] sub_wire3;
+	wire [9:0] sub_wire3;
 	wire  empty = sub_wire0;
 	wire  empty = sub_wire0;
 	wire  full = sub_wire1;
 	wire  full = sub_wire1;
 	wire [7:0] q = sub_wire2[7:0];
 	wire [7:0] q = sub_wire2[7:0];
-	wire [8:0] usedw = sub_wire3[8:0];
+	wire [9:0] usedw = sub_wire3[9:0];
 
 
 	scfifo	scfifo_component (
 	scfifo	scfifo_component (
 				.aclr (aclr),
 				.aclr (aclr),
@@ -86,11 +86,11 @@ module fifo (
 	defparam
 	defparam
 		scfifo_component.add_ram_output_register = "OFF",
 		scfifo_component.add_ram_output_register = "OFF",
 		scfifo_component.intended_device_family = "Cyclone IV E",
 		scfifo_component.intended_device_family = "Cyclone IV E",
-		scfifo_component.lpm_numwords = 512,
+		scfifo_component.lpm_numwords = 1024,
 		scfifo_component.lpm_showahead = "ON",
 		scfifo_component.lpm_showahead = "ON",
 		scfifo_component.lpm_type = "scfifo",
 		scfifo_component.lpm_type = "scfifo",
 		scfifo_component.lpm_width = 8,
 		scfifo_component.lpm_width = 8,
-		scfifo_component.lpm_widthu = 9,
+		scfifo_component.lpm_widthu = 10,
 		scfifo_component.overflow_checking = "ON",
 		scfifo_component.overflow_checking = "ON",
 		scfifo_component.underflow_checking = "ON",
 		scfifo_component.underflow_checking = "ON",
 		scfifo_component.use_eab = "ON";
 		scfifo_component.use_eab = "ON";
@@ -105,9 +105,9 @@ endmodule
 // Retrieval info: PRIVATE: AlmostEmptyThr NUMERIC "-1"
 // Retrieval info: PRIVATE: AlmostEmptyThr NUMERIC "-1"
 // Retrieval info: PRIVATE: AlmostFull NUMERIC "0"
 // Retrieval info: PRIVATE: AlmostFull NUMERIC "0"
 // Retrieval info: PRIVATE: AlmostFullThr NUMERIC "-1"
 // Retrieval info: PRIVATE: AlmostFullThr NUMERIC "-1"
-// Retrieval info: PRIVATE: CLOCKS_ARE_SYNCHRONIZED NUMERIC "0"
+// Retrieval info: PRIVATE: CLOCKS_ARE_SYNCHRONIZED NUMERIC "1"
 // Retrieval info: PRIVATE: Clock NUMERIC "0"
 // Retrieval info: PRIVATE: Clock NUMERIC "0"
-// Retrieval info: PRIVATE: Depth NUMERIC "512"
+// Retrieval info: PRIVATE: Depth NUMERIC "1024"
 // Retrieval info: PRIVATE: Empty NUMERIC "1"
 // Retrieval info: PRIVATE: Empty NUMERIC "1"
 // Retrieval info: PRIVATE: Full NUMERIC "1"
 // Retrieval info: PRIVATE: Full NUMERIC "1"
 // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
 // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
@@ -136,11 +136,11 @@ endmodule
 // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
 // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
 // Retrieval info: CONSTANT: ADD_RAM_OUTPUT_REGISTER STRING "OFF"
 // Retrieval info: CONSTANT: ADD_RAM_OUTPUT_REGISTER STRING "OFF"
 // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
 // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E"
-// Retrieval info: CONSTANT: LPM_NUMWORDS NUMERIC "512"
+// Retrieval info: CONSTANT: LPM_NUMWORDS NUMERIC "1024"
 // Retrieval info: CONSTANT: LPM_SHOWAHEAD STRING "ON"
 // Retrieval info: CONSTANT: LPM_SHOWAHEAD STRING "ON"
 // Retrieval info: CONSTANT: LPM_TYPE STRING "scfifo"
 // Retrieval info: CONSTANT: LPM_TYPE STRING "scfifo"
 // Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "8"
 // Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "8"
-// Retrieval info: CONSTANT: LPM_WIDTHU NUMERIC "9"
+// Retrieval info: CONSTANT: LPM_WIDTHU NUMERIC "10"
 // Retrieval info: CONSTANT: OVERFLOW_CHECKING STRING "ON"
 // Retrieval info: CONSTANT: OVERFLOW_CHECKING STRING "ON"
 // Retrieval info: CONSTANT: UNDERFLOW_CHECKING STRING "ON"
 // Retrieval info: CONSTANT: UNDERFLOW_CHECKING STRING "ON"
 // Retrieval info: CONSTANT: USE_EAB STRING "ON"
 // Retrieval info: CONSTANT: USE_EAB STRING "ON"
@@ -152,7 +152,7 @@ endmodule
 // Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
 // Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
 // Retrieval info: USED_PORT: rdreq 0 0 0 0 INPUT NODEFVAL "rdreq"
 // Retrieval info: USED_PORT: rdreq 0 0 0 0 INPUT NODEFVAL "rdreq"
 // Retrieval info: USED_PORT: sclr 0 0 0 0 INPUT NODEFVAL "sclr"
 // Retrieval info: USED_PORT: sclr 0 0 0 0 INPUT NODEFVAL "sclr"
-// Retrieval info: USED_PORT: usedw 0 0 9 0 OUTPUT NODEFVAL "usedw[8..0]"
+// Retrieval info: USED_PORT: usedw 0 0 10 0 OUTPUT NODEFVAL "usedw[9..0]"
 // Retrieval info: USED_PORT: wrreq 0 0 0 0 INPUT NODEFVAL "wrreq"
 // Retrieval info: USED_PORT: wrreq 0 0 0 0 INPUT NODEFVAL "wrreq"
 // Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
 // Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
 // Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
 // Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
@@ -163,7 +163,7 @@ endmodule
 // Retrieval info: CONNECT: empty 0 0 0 0 @empty 0 0 0 0
 // Retrieval info: CONNECT: empty 0 0 0 0 @empty 0 0 0 0
 // Retrieval info: CONNECT: full 0 0 0 0 @full 0 0 0 0
 // Retrieval info: CONNECT: full 0 0 0 0 @full 0 0 0 0
 // Retrieval info: CONNECT: q 0 0 8 0 @q 0 0 8 0
 // Retrieval info: CONNECT: q 0 0 8 0 @q 0 0 8 0
-// Retrieval info: CONNECT: usedw 0 0 9 0 @usedw 0 0 9 0
+// Retrieval info: CONNECT: usedw 0 0 10 0 @usedw 0 0 10 0
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.v TRUE
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.v TRUE
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.inc FALSE
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.inc FALSE
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.cmp FALSE
 // Retrieval info: GEN_FILE: TYPE_NORMAL fifo.cmp FALSE

+ 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 = 00:01:58  January 19, 2022
+# Date created = 00:53:31  January 22, 2022
 #
 #
 # -------------------------------------------------------------------------- #
 # -------------------------------------------------------------------------- #
 
 
 QUARTUS_VERSION = "21.1"
 QUARTUS_VERSION = "21.1"
-DATE = "00:01:58  January 19, 2022"
+DATE = "00:53:31  January 22, 2022"
 
 
 # Revisions
 # Revisions
 
 

+ 1 - 1
fpga/max80.qsf

@@ -260,7 +260,7 @@ set_global_assignment -name VERILOG_FILE usb/usb_serial/src_v/usbf_crc16.v
 set_global_assignment -name SYSTEMVERILOG_FILE usb/usb.sv
 set_global_assignment -name SYSTEMVERILOG_FILE usb/usb.sv
 set_global_assignment -name VERILOG_FILE ip/statusram.v
 set_global_assignment -name VERILOG_FILE ip/statusram.v
 set_global_assignment -name VERILOG_INCLUDE_FILE iodevs.vh
 set_global_assignment -name VERILOG_INCLUDE_FILE iodevs.vh
-set_global_assignment -name SYSTEMVERILOG_FILE tty.sv
+set_global_assignment -name SYSTEMVERILOG_FILE serial.sv
 set_global_assignment -name SYSTEMVERILOG_FILE sdcard.sv
 set_global_assignment -name SYSTEMVERILOG_FILE sdcard.sv
 set_global_assignment -name SYSTEMVERILOG_FILE sysclock.sv
 set_global_assignment -name SYSTEMVERILOG_FILE sysclock.sv
 set_global_assignment -name SYSTEMVERILOG_FILE i2c.sv
 set_global_assignment -name SYSTEMVERILOG_FILE i2c.sv

+ 126 - 132
fpga/max80.sv

@@ -13,123 +13,123 @@ module max80
     parameter logic [7:0] fpga_ver)
     parameter logic [7:0] fpga_ver)
    (
    (
     // Clock oscillator
     // Clock oscillator
-    input 	  master_clk, // 336 MHz from PLL2
-    input 	  master_pll_locked, // PLL2 is locked, master_clk is good
-    output 	  reset_plls, // Reset all PLLs including PLL2
+    input	  master_clk, // 336 MHz from PLL2
+    input	  master_pll_locked, // PLL2 is locked, master_clk is good
+    output	  reset_plls, // Reset all PLLs including PLL2
 
 
-    input 	  board_id, // This better match the firmware
+    input	  board_id, // This better match the firmware
 
 
     // ABC-bus
     // ABC-bus
-    inout 	  abc_clk, // ABC-bus 3 MHz clock
+    inout	  abc_clk, // ABC-bus 3 MHz clock
     inout [15:0]  abc_a, // ABC address bus
     inout [15:0]  abc_a, // ABC address bus
     inout [7:0]   abc_d, // ABC data bus
     inout [7:0]   abc_d, // ABC data bus
-    output 	  abc_d_oe, // Data bus output enable
-    inout 	  abc_rst_n, // ABC bus reset strobe
-    inout 	  abc_cs_n, // ABC card select strobe
+    output	  abc_d_oe, // Data bus output enable
+    inout	  abc_rst_n, // ABC bus reset strobe
+    inout	  abc_cs_n, // ABC card select strobe
     inout [4:0]   abc_out_n, // OUT, C1-C4 strobe
     inout [4:0]   abc_out_n, // OUT, C1-C4 strobe
     inout [1:0]   abc_inp_n, // INP, STATUS strobe
     inout [1:0]   abc_inp_n, // INP, STATUS strobe
-    inout 	  abc_xmemfl_n, // Memory read strobe
-    inout 	  abc_xmemw800_n, // Memory write strobe (ABC800)
-    inout 	  abc_xmemw80_n, // Memory write strobe (ABC80)
-    inout 	  abc_xinpstb_n, // I/O read strobe (ABC800)
-    inout 	  abc_xoutpstb_n, // I/O write strobe (ABC80)
+    inout	  abc_xmemfl_n, // Memory read strobe
+    inout	  abc_xmemw800_n, // Memory write strobe (ABC800)
+    inout	  abc_xmemw80_n, // Memory write strobe (ABC80)
+    inout	  abc_xinpstb_n, // I/O read strobe (ABC800)
+    inout	  abc_xoutpstb_n, // I/O write strobe (ABC80)
     // The following are inverted versus the bus IF
     // The following are inverted versus the bus IF
     // the corresponding MOSFETs are installed
     // the corresponding MOSFETs are installed
-    inout 	  abc_rdy_x, // RDY = WAIT#
-    inout 	  abc_resin_x, // System reset request
-    inout 	  abc_int80_x, // System INT request (ABC80)
-    inout 	  abc_int800_x, // System INT request (ABC800)
-    inout 	  abc_nmi_x, // System NMI request (ABC800)
-    inout 	  abc_xm_x, // System memory override (ABC800)
+    inout	  abc_rdy_x, // RDY = WAIT#
+    inout	  abc_resin_x, // System reset request
+    inout	  abc_int80_x, // System INT request (ABC80)
+    inout	  abc_int800_x, // System INT request (ABC800)
+    inout	  abc_nmi_x, // System NMI request (ABC800)
+    inout	  abc_xm_x, // System memory override (ABC800)
     // Host/device control
     // Host/device control
-    output 	  abc_host, // 1 = host, 0 = target
+    output	  abc_host, // 1 = host, 0 = target
 
 
     // ABC-bus extension header
     // ABC-bus extension header
     // (Note: cannot use an array here because HC and HH are
     // (Note: cannot use an array here because HC and HH are
     // input only.)
     // input only.)
-    inout 	  exth_ha,
-    inout 	  exth_hb,
-    input 	  exth_hc,
-    inout 	  exth_hd,
-    inout 	  exth_he,
-    inout 	  exth_hf,
-    inout 	  exth_hg,
-    input 	  exth_hh,
+    inout	  exth_ha,
+    inout	  exth_hb,
+    input	  exth_hc,
+    inout	  exth_hd,
+    inout	  exth_he,
+    inout	  exth_hf,
+    inout	  exth_hg,
+    input	  exth_hh,
 
 
     // SDRAM bus
     // SDRAM bus
-    output 	  sr_clk,
+    output	  sr_clk,
     output [1:0]  sr_ba, // Bank address
     output [1:0]  sr_ba, // Bank address
     output [12:0] sr_a, // Address within bank
     output [12:0] sr_a, // Address within bank
     inout [15:0]  sr_dq, // Also known as D or IO
     inout [15:0]  sr_dq, // Also known as D or IO
     output [1:0]  sr_dqm, // DQML and DQMH
     output [1:0]  sr_dqm, // DQML and DQMH
-    output 	  sr_cs_n,
-    output 	  sr_we_n,
-    output 	  sr_cas_n,
-    output 	  sr_ras_n,
+    output	  sr_cs_n,
+    output	  sr_we_n,
+    output	  sr_cas_n,
+    output	  sr_ras_n,
 
 
     // SD card
     // SD card
-    input 	  sd_cd_n,
-    output 	  sd_cs_n,
-    output 	  sd_clk,
-    output 	  sd_di,
-    input 	  sd_do,
+    input	  sd_cd_n,
+    output	  sd_cs_n,
+    output	  sd_clk,
+    output	  sd_di,
+    input	  sd_do,
 
 
     // Serial console (naming is FPGA as DCE)
     // Serial console (naming is FPGA as DCE)
-    input 	  tty_txd,
-    output 	  tty_rxd,
-    input 	  tty_rts,
-    output 	  tty_cts,
-    input 	  tty_dtr,
+    input	  tty_txd,
+    output	  tty_rxd,
+    input	  tty_rts,
+    output	  tty_cts,
+    input	  tty_dtr,
 
 
     // SPI flash memory (also configuration)
     // SPI flash memory (also configuration)
-    output 	  flash_cs_n,
-    output 	  flash_sck,
+    output	  flash_cs_n,
+    output	  flash_sck,
     inout [1:0]   flash_io,
     inout [1:0]   flash_io,
 
 
     // SPI bus (connected to ESP32 so can be bidirectional)
     // SPI bus (connected to ESP32 so can be bidirectional)
-    inout 	  spi_clk,
-    inout 	  spi_miso,
-    inout 	  spi_mosi,
-    inout 	  spi_cs_esp_n, // ESP32 IO10
-    inout 	  spi_cs_flash_n, // ESP32 IO01
+    inout	  spi_clk,
+    inout	  spi_miso,
+    inout	  spi_mosi,
+    inout	  spi_cs_esp_n, // ESP32 IO10
+    inout	  spi_cs_flash_n, // ESP32 IO01
 
 
     // Other ESP32 connections
     // Other ESP32 connections
-    inout 	  esp_io0, // ESP32 IO00
-    inout 	  esp_int, // ESP32 IO09
+    inout	  esp_io0, // ESP32 IO00
+    inout	  esp_int, // ESP32 IO09
 
 
     // I2C bus (RTC and external)
     // I2C bus (RTC and external)
-    inout 	  i2c_scl,
-    inout 	  i2c_sda,
-    input 	  rtc_32khz,
-    input 	  rtc_int_n,
+    inout	  i2c_scl,
+    inout	  i2c_sda,
+    input	  rtc_32khz,
+    input	  rtc_int_n,
 
 
     // LED (2 = D23/G, 1 = D22/R, 0 = D17/B)
     // LED (2 = D23/G, 1 = D22/R, 0 = D17/B)
     output [2:0]  led,
     output [2:0]  led,
 
 
     // USB
     // USB
-    inout 	  usb_dp,
-    inout 	  usb_dn,
-    output 	  usb_pu,
-    input 	  usb_rx,
-    input 	  usb_rx_ok,
+    inout	  usb_dp,
+    inout	  usb_dn,
+    output	  usb_pu,
+    input	  usb_rx,
+    input	  usb_rx_ok,
 
 
     // HDMI
     // HDMI
     output [2:0]  hdmi_d,
     output [2:0]  hdmi_d,
-    output 	  hdmi_clk,
-    inout 	  hdmi_scl,
-    inout 	  hdmi_sda,
-    inout 	  hdmi_hpd,
+    output	  hdmi_clk,
+    inout	  hdmi_scl,
+    inout	  hdmi_sda,
+    inout	  hdmi_hpd,
 
 
     // Unconnected pins with pullups, used for randomness
     // Unconnected pins with pullups, used for randomness
     inout [2:0]   rngio,
     inout [2:0]   rngio,
 
 
     // Various clocks available to the top level as well as internally
     // Various clocks available to the top level as well as internally
-    output 	  sdram_clk,	// 168 MHz SDRAM clock
-    output 	  sys_clk,	//  84 MHz System clock
-    output 	  flash_clk,	// 134 MHz Serial flash ROM clock
-    output 	  usb_clk,	//  48 MHz USB clock
-    output 	  vid_clk,	//  56 MHz Video pixel clock
-    output 	  vid_hdmiclk	// 280 MHz HDMI serializer clock = vid_clk x 5
+    output	  sdram_clk,	// 168 MHz SDRAM clock
+    output	  sys_clk,	//  84 MHz System clock
+    output	  flash_clk,	// 134 MHz Serial flash ROM clock
+    output	  usb_clk,	//  48 MHz USB clock
+    output	  vid_clk,	//  56 MHz Video pixel clock
+    output	  vid_hdmiclk	// 280 MHz HDMI serializer clock = vid_clk x 5
     );
     );
 
 
    // -----------------------------------------------------------------------
    // -----------------------------------------------------------------------
@@ -140,7 +140,6 @@ module max80
 
 
    tri1 [4:1]		    pll_locked;
    tri1 [4:1]		    pll_locked;
 
 
-   assign   reset_plls = 1'b0;
    assign   pll_locked[2] = master_pll_locked;
    assign   pll_locked[2] = master_pll_locked;
 
 
    //
    //
@@ -204,32 +203,41 @@ module max80
    reg [31:1] sys_clk_stb;
    reg [31:1] sys_clk_stb;
 
 
    // 3 types of reset: system, hard, and reconfig
    // 3 types of reset: system, hard, and reconfig
-   reg  [3:1] reset_cmd_q;
-   wire [3:1] reset_cmd;
-   reg	      soft_reset_q;
+   wire [3:1] cpu_reset_cmd;	// CPU-originated reset command
+   reg  [3:1] cpu_reset_cmd_q[0:1];
+   wire [3:1] aux_reset_cmd;	// Other reset sources
+   reg [3:1]  reset_cmd_q = 3'b0;
 
 
    always @(negedge all_plls_locked or posedge sys_clk)
    always @(negedge all_plls_locked or posedge sys_clk)
      if (~all_plls_locked)
      if (~all_plls_locked)
        begin
        begin
-	  hard_rst_n     <= 1'b0;
-	  rst_n          <= 1'b0;
-	  reset_cmd_q    <= 3'b0;
-	  soft_reset_q   <= 1'b0;
-	  sys_clk_ctr    <= (-'sb1) << reset_pow2;
-	  sys_clk_ctr_q  <= 'b0;
-	  sys_clk_stb    <= 'b0;
+	  reset_plls         <= 1'b0;
+	  hard_rst_n         <= 1'b0;
+	  rst_n              <= 1'b0;
+	  reset_cmd_q        <= 3'b0;
+	  cpu_reset_cmd_q[0] <= 3'b0;
+	  cpu_reset_cmd_q[1] <= 3'b0;
+	  sys_clk_ctr        <= (-'sb1) << reset_pow2;
+	  sys_clk_ctr_q      <= 'b0;
+	  sys_clk_stb        <= 'b0;
        end
        end
      else
      else
        begin
        begin
-	  reset_cmd_q    <= reset_cmd;
-	  soft_reset_q   <= reset_cmd_q[1]; // Edge detect for soft reset
+	  cpu_reset_cmd_q[0] <= cpu_reset_cmd;
+	  cpu_reset_cmd_q[1] <= cpu_reset_cmd_q[0];
 
 
-	  if (reset_cmd_q[1] & ~soft_reset_q)
+	  reset_cmd_q <= (cpu_reset_cmd_q[0] & ~cpu_reset_cmd_q[1]) |
+			 aux_reset_cmd;
+
+	  if (|reset_cmd_q)
 	    begin
 	    begin
+	       // Soft or hard reset
 	       sys_clk_ctr   <= (-'sb1) << reset_pow2;
 	       sys_clk_ctr   <= (-'sb1) << reset_pow2;
 	       sys_clk_ctr_q <= 1'b0;
 	       sys_clk_ctr_q <= 1'b0;
 	       sys_clk_stb   <= 1'b0;
 	       sys_clk_stb   <= 1'b0;
 	       rst_n         <= 1'b0;
 	       rst_n         <= 1'b0;
+	       hard_rst_n    <= hard_rst_n & ~|reset_cmd_q[3:2];
+	       reset_plls    <= reset_cmd_q[3];
 	    end
 	    end
 	  else
 	  else
 	    begin
 	    begin
@@ -593,10 +601,10 @@ module max80
 
 
    // System reset
    // System reset
    wire	       usb_rxd_break_rst; // Break due to USB serial port BREAK
    wire	       usb_rxd_break_rst; // Break due to USB serial port BREAK
-   reg 	       tty_rxd_break_rst; // Break due to TTY serial port BREAK
+   wire	       tty_rxd_break_rst; // Break due to TTY serial port BREAK
 
 
-   // Reset control. Note that CPU reset command 0 is intentionally ignored.
-   wire [3:0] cpu_reset_cmd =
+   // Reset control. Note that CPU reset command 0 is a noop.
+   wire [3:0] cpu_reset_io_cmd =
 	      (sysreg[3] & cpu_mem_wstrb[0]) << cpu_mem_wdata[1:0];
 	      (sysreg[3] & cpu_mem_wstrb[0]) << cpu_mem_wdata[1:0];
 
 
    //
    //
@@ -606,20 +614,22 @@ module max80
    // Triggered by:
    // Triggered by:
    //  - CPU reset command 1
    //  - CPU reset command 1
    //  - CPU entering TRAP state (irrecoverable error)
    //  - CPU entering TRAP state (irrecoverable error)
-   //  - BREAK received on USB console
+   //  - BREAK received on console
    //
    //
-   assign reset_cmd[1] = cpu_reset_cmd[1] | cpu_trap |
-			 usb_rxd_break_rst | tty_rxd_break_rst;
+   assign cpu_reset_cmd[1] = cpu_reset_io_cmd[1] | cpu_trap;
+   assign aux_reset_cmd[1] = usb_rxd_break_rst | tty_rxd_break_rst;
 
 
    //
    //
    // Hard system reset: FPGA not reloaded, PLLs reset, all hw units reset
    // Hard system reset: FPGA not reloaded, PLLs reset, all hw units reset
    //
    //
-   assign reset_cmd[2] = cpu_reset_cmd[2];
+   assign cpu_reset_cmd[2] = cpu_reset_io_cmd[2];
+   assign aux_reset_cmd[2] = 1'b0;
 
 
    //
    //
-   // FPGA reload reset
+   // FPGA reload reset (not implemented yet)
    //
    //
-   assign reset_cmd[3] = cpu_reset_cmd[3];
+   assign cpu_reset_cmd[3] = cpu_reset_io_cmd[3];
+   assign aux_reset_cmd[3] = 1'b0;
 
 
    // LED indication from the CPU
    // LED indication from the CPU
    reg [2:0]   led_q;
    reg [2:0]   led_q;
@@ -685,57 +695,41 @@ module max80
    wire        tty_data_in;	// Input data
    wire        tty_data_in;	// Input data
    wire        tty_cts_out;	// Assert CTS# externally
    wire        tty_cts_out;	// Assert CTS# externally
    wire        tty_rts_in;	// RTS# received from outside
    wire        tty_rts_in;	// RTS# received from outside
+   wire        tty_dtr_in;	// DTR# received from outside
+
 
 
    assign tty_data_in      = tty_txd;
    assign tty_data_in      = tty_txd;
    assign tty_rxd          = tty_data_out;
    assign tty_rxd          = tty_data_out;
    assign tty_rts_in       = ~tty_rts;
    assign tty_rts_in       = ~tty_rts;
+   assign tty_dtr_in       = ~tty_dtr;
    assign tty_cts          = ~tty_cts_out;
    assign tty_cts          = ~tty_cts_out;
 
 
    assign tty_cts_out = 1'b1;	// Always assert CTS# for now
    assign tty_cts_out = 1'b1;	// Always assert CTS# for now
 
 
    // The physical tty now just snoops USB ACM channel 0; as such it does
    // The physical tty now just snoops USB ACM channel 0; as such it does
    // not respond to any write requests nor issue any irqs
    // not respond to any write requests nor issue any irqs
-   tty serial_con (
-	    .rst_n ( hard_rst_n ),
-	    .clk   ( sys_clk ),
+   wire        serial_tx_full;
+   wire        serial_rx_break;
 
 
-	    .valid ( iodev_valid_tty &
-		     cpu_mem_addr[6:2] == 5'b00000 &
-		     cpu_mem_wstrb[0] ),
-	    .wstrb ( cpu_mem_wstrb ),
-	    .wdata ( cpu_mem_wdata ),
-	    .rdata ( ),
-	    .addr  ( cpu_mem_addr[3:2] ),
-	    .irq   ( ),
+   serial serial_tty (
+		      .rst_n    ( hard_rst_n ),
+		      .clk      ( sys_clk ),
 
 
-	    .tty_txd ( tty_data_out ) // DTE -> DCE
-	    );
+		      .tx_valid ( iodev_valid_tty &
+				  cpu_mem_addr[6:2] == 5'b00000 &
+				  cpu_mem_wstrb[0] ),
+		      .tx_data  ( cpu_mem_wdata[7:0] ),
 
 
-   // Detect BREAK on the hardware tty input and generate a reset,
-   // regardless of any other control signals.
-   reg [19:0]  tty_break_ctr;
-   always @(posedge sys_clk)
-     begin
-	if (~hard_rst_n)
-	  begin
-	     tty_break_ctr     <= ~'b0;
-	     tty_rxd_break_rst <= ~tty_rxd;
-	  end
-	else
-	  begin
-	     if (tty_rxd)
-	       begin
-		  tty_break_ctr     <= 'b0;
-		  tty_rxd_break_rst <= 1'b0;
-	       end
-	     else
-	       begin
-		  tty_break_ctr <= tty_break_ctr + 1'b1;
-		  if (&tty_break_ctr)
-		    tty_rxd_break_rst <= 1'b1;
-	       end // else: !if(tty_rxd)
-	  end // else: !if(~hard_rst_n)
-     end // always @ (posedge sys_clk)
+		      .tty_rx   ( tty_data_in ),
+		      .tty_tx   ( tty_data_out ),
+
+		      .tx_full  ( serial_tx_full ),
+		      .rx_break ( tty_rxd_break_rst )
+		      );
+
+   // If DTR# is asserted, block on full serial Tx FIFO; this allows
+   // us to not lose debugging messages.
+   assign iodev_wait_n_tty = ~(serial_tx_full & tty_dtr_in);
 
 
    max80_usb #( .channels( TTY_CHANNELS ) ) usb (
    max80_usb #( .channels( TTY_CHANNELS ) ) usb (
 		  .hard_rst_n         ( hard_rst_n ),
 		  .hard_rst_n         ( hard_rst_n ),

BIN
fpga/output/v1.jic


BIN
fpga/output/v1.sof


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.sof


+ 160 - 0
fpga/serial.sv

@@ -0,0 +1,160 @@
+//
+// Serial port "snoop" of the console (otherwise sent via USB.)
+//
+// The only receive support is BREAK.
+//
+// The transmission rate is fixed to 1 Mbps.
+//
+// If the output FIFO is full, an output signal is asserted, which
+// is expected to be used together with DTR to provide blocking I/O
+// if desired.
+//
+
+module serial (
+	    input 	rst_n,
+	    input 	clk,
+
+	    input 	tx_valid,
+	    input [7:0] tx_data,
+
+	    input 	tty_rx,
+	    output 	tty_tx,
+
+	    output reg	rx_break,
+	    output 	tx_full
+	    );
+
+   `include "functions.sv"	// For ModelSim
+
+   //
+   // Baud rate generator; produces a clock enable synchronous
+   // with clk.  This is based on a numerically controlled oscillator
+   // (NCO); the baudrate is given as a binary fraction of the input
+   // clock rate divided by the oversampling rate (16); for practical
+   // reasons represented minus one LSB so 0x0.ffffff -> 1
+   // and 0 -> 0x0.000001.
+   //
+   // The term "divisor" here is probably misleading, since it is
+   // actually a fixed-point *multiplier* which is <= 1.
+   //
+   parameter [31:0]	BAUDRATE = 1000000;
+   parameter [31:0]	TTY_CLK  = 84000000;
+   parameter		NCO_BITS = 24;
+   parameter            BREAK_BITS = 19; // 2^19/(BAUDRATE*16) ~ 33 ms
+
+   reg  [NCO_BITS-1:0]  divisor
+			= round_div(BAUDRATE << NCO_BITS, TTY_CLK >> 4) - 1'b1;
+   reg  [NCO_BITS-1:0]  nco_q;
+   reg			tty_clk_en; // tty clock tick (clock enable)
+
+   always @(posedge clk)
+	{ tty_clk_en, nco_q } <= nco_q + divisor + 1'b1;
+
+   //
+   // Tx FIFO
+   //
+   reg  tx_rdack;
+   wire tx_wrreq;
+   wire tx_rdempty;
+   wire [7:0] tx_out_data;
+
+   reg 	      tx_valid_q;
+
+   always @(negedge rst_n or posedge clk)
+     if (~rst_n)
+       tx_valid_q <= 1'b0;
+     else
+       tx_valid_q <= tx_valid;
+
+   fifo txfifo (
+		.aclr ( ~rst_n ),
+		.clock ( clk ),
+		.data ( tx_data ),
+		.rdreq ( tx_rdack ),
+		.sclr ( 1'b0 ),	// Flush FIFO command
+		.wrreq ( tx_valid & ~tx_valid_q ),
+		.empty ( tx_rdempty ),
+		.full ( tx_full ),
+		.q ( tx_out_data ),
+		.usedw ( )
+		);
+
+   //
+   // Transmitter
+   //
+   reg [3:0]  tx_phase;
+   reg [3:0]  tx_bits;
+   reg [9:0]  tx_sr = ~10'b0;		// Shift register
+   assign tty_tx = tx_sr[0];
+
+   always @(negedge rst_n or posedge clk)
+     if (~rst_n)
+       begin
+	  tx_phase <= 4'h0;
+	  tx_bits  <= 4'd0;
+	  tx_sr    <= ~10'b0;	// Line idle
+	  tx_rdack <= 1'b0;
+       end
+     else
+       begin
+	  tx_rdack <= 1'b0;
+
+	  if ( tty_clk_en )
+	    begin
+	       tx_phase <= tx_phase + 1'b1;
+
+	       if (tx_phase == 4'hF)
+		 begin
+		    tx_sr[8:0] <= tx_sr[9:1];
+		    tx_sr[9]   <= 1'b1; // Stop bit/idle
+
+		    if (tx_bits == 4'd0)
+		      begin
+			 if ( ~tx_rdempty )
+			   begin
+			      tx_sr[9:2] <= tx_out_data;
+			      tx_sr[1]   <= 1'b0; // Start bit
+			      // 10 = start bit + data + stop bit
+			      tx_bits    <= 4'd10;
+			      tx_rdack   <= 1'b1; // Remove from FIFO
+			   end
+		      end
+		    else
+		      begin
+			 tx_bits <= tx_bits - 1'b1;
+		      end // else: !if(tx_bits == 4'd0)
+		 end // if (tx_phase == 4'hF)
+	    end // if ( tty_clk_en )
+       end // else: !if(~rst_n)
+
+   //
+   // BREAK detect
+   //
+   reg  [BREAK_BITS-1:0] rx_break_ctr;
+   wire   [BREAK_BITS:0] rx_break_ctr_next = rx_break_ctr + 1'b1;
+   
+   always @(negedge rst_n or posedge clk)
+     if (~rst_n)
+       begin
+	  rx_break_ctr <= 'b0;
+	  rx_break     <= 1'b0;
+       end
+     else
+       begin
+	  if ( tty_clk_en )
+	    begin
+	       if ( tty_rx )
+		 begin
+		    // Rx high = not a break
+		    rx_break_ctr <= 'b0;
+		    rx_break     <= 1'b0;
+		 end
+	       else
+		 begin
+		    rx_break_ctr <= rx_break_ctr_next[BREAK_BITS-1:0];
+		    rx_break     <= rx_break | rx_break_ctr_next[BREAK_BITS];
+		 end // else: !if(tty_rxd)
+	    end // if ( tty_clk_en )
+       end // else: !if(~rst_n)
+   
+endmodule // serial

+ 9 - 1
fpga/spirom.sv

@@ -233,6 +233,7 @@ module spirom (
    wire        go_spi_s;
    wire        go_spi_s;
    reg	       spi_more_q;
    reg	       spi_more_q;
    reg	       spi_active;
    reg	       spi_active;
+   reg [3:0]   spi_cs_ctr;
 
 
    // Explicit synchronizers for handshake signals
    // Explicit synchronizers for handshake signals
    synchronizer #(.width(1)) go_spi_synchro
    synchronizer #(.width(1)) go_spi_synchro
@@ -257,6 +258,7 @@ module spirom (
 	  spi_clk_en   <= 1'b0;
 	  spi_clk_en   <= 1'b0;
 	  spi_data_ctr <= 26'b0;
 	  spi_data_ctr <= 26'b0;
 	  spi_cs_n     <= 1'b1;
 	  spi_cs_n     <= 1'b1;
+	  spi_cs_ctr   <= 'b0;
 	  spi_in_req   <= 1'b0;
 	  spi_in_req   <= 1'b0;
 	  spi_in_req_q <= 1'b0;
 	  spi_in_req_q <= 1'b0;
 	  spi_mosi_en  <= 1'b1;
 	  spi_mosi_en  <= 1'b1;
@@ -272,6 +274,12 @@ module spirom (
 	  spi_in_req_q <= spi_in_req;
 	  spi_in_req_q <= spi_in_req;
 	  spi_clk_en   <= 1'b0;
 	  spi_clk_en   <= 1'b0;
 
 
+	  // After asserting CS#, wait 16 SPI clock times
+	  if (spi_cs_n)
+	    spi_cs_ctr <= 'b0;
+	  else
+	    spi_cs_ctr <= spi_cs_ctr + ~&spi_cs_ctr;
+
 	  // Note: datalen <- spi_data_ctr is a 2-cycle multipath
 	  // Note: datalen <- spi_data_ctr is a 2-cycle multipath
 	  if (go_spi_s & ~spi_active)
 	  if (go_spi_s & ~spi_active)
 	    begin
 	    begin
@@ -292,7 +300,7 @@ module spirom (
 	    end
 	    end
 	  else
 	  else
 	    begin
 	    begin
-	       spi_active   <= 1'b1;
+	       spi_active   <= &spi_cs_ctr;
 	       spi_cs_n     <= 1'b0;
 	       spi_cs_n     <= 1'b0;
 
 
 	       if ( spi_active )
 	       if ( spi_active )

+ 0 - 186
fpga/tty.sv

@@ -1,186 +0,0 @@
-//
-// Very simple asynchronous tty. Not really a "UART" since it isn't
-// very "universal". It doesn't have to be.
-//
-// Currently only transmit is supported, 8-N-1, at a fixed speed.
-// The baud rate is tty_clk/((divisor+1)*16).
-//
-// The registers are as follows:
-//
-// 0 - WO - data register (will be RW)
-// 1 - RW - baud rate register (binary fraction of TTY_CLK/16 - 1)
-// 2 - RO - status register
-//          0 - transmitter idle (FIFO and shift register empty)
-//          1 - transmit FIFO 3/4 empty
-//	    2 - transmit FIFO 1/2 empty
-//          3 - transmit FIFO 1/2 full (inverse of bit 2)
-//          4 - transmit FIFO 3/4 full
-// 3 - RW - interrupt enable register (status register mask)
-
-module tty (
-	    input	      rst_n,
-	    input	      clk,
-
-	    input	      valid,
-	    input [3:0]       wstrb,
-	    input [31:0]      wdata,
-	    input [1:0]       addr,
-	    output reg [31:0] rdata,
-	    output reg	      irq,
-
-	    output	      tty_txd
-	    );
-
-   `include "functions.sv"	// For ModelSim
-
-   //
-   // Baud rate generator; produces a clock enable synchronous
-   // with clk.  This is based on a numerically controlled oscillator
-   // (NCO); the baudrate is given as a binary fraction of the input
-   // clock rate divided by the oversampling rate (16); for practical
-   // reasons represented minus one LSB so 0x0.ffffff -> 1
-   // and 0 -> 0x0.000001.
-   //
-   // The term "divisor" here is probably misleading, since it is
-   // actually a fixed-point *multiplier* which is <= 1.
-   //
-   parameter [31:0]	BAUDRATE = 115200;
-   parameter [31:0]	TTY_CLK  = 84000000;
-   parameter		NCO_BITS = 24;
-
-   reg  [NCO_BITS-1:0]  divisor
-			= round_div(BAUDRATE << NCO_BITS, TTY_CLK >> 4) - 1'b1;
-   reg  [NCO_BITS-1:0]  nco_q;
-   reg			tty_clk_en; // tty clock tick (clock enable)
-
-   always @(posedge clk)
-	{ tty_clk_en, nco_q } <= nco_q + divisor + 1'b1;
-
-   //
-   // Tx FIFO
-   //
-   reg  tx_rdack;
-   wire tx_wrreq;
-   wire tx_rdempty;
-   wire [7:0] tx_data;
-   wire [8:0] tx_usedw;
-
-   fifo txfifo (
-		.aclr ( ~rst_n ),
-		.clock ( clk ),
-		.data ( wdata ),
-		.rdreq ( tx_rdack ),
-		.sclr ( 1'b0 ),	// Flush FIFO command
-		.wrreq ( tx_wrreq ),
-		.empty ( tx_rdempty ),
-		.full ( ),
-		.q ( tx_data ),
-		.usedw ( tx_usedw )
-		);
-
-   //
-   // Transmitter
-   //
-   reg [3:0]  tx_phase;
-   reg [3:0]  tx_bits;
-   reg [9:0]  tx_sr = ~10'b0;		// Shift register
-   assign tty_txd = tx_sr[0];
-
-   always @(negedge rst_n or posedge clk)
-     if (~rst_n)
-       begin
-	  tx_phase <= 4'h0;
-	  tx_bits  <= 4'd0;
-	  tx_sr    <= ~10'b0;	// Line idle
-	  tx_rdack <= 1'b0;
-       end
-     else
-       begin
-	  tx_rdack <= 1'b0;
-
-	  if ( tty_clk_en )
-	    begin
-	       tx_phase <= tx_phase + 1'b1;
-
-	       if (tx_phase == 4'hF)
-		 begin
-		    tx_sr[8:0] <= tx_sr[9:1];
-		    tx_sr[9]   <= 1'b1; // Stop bit/idle
-
-		    if (tx_bits == 4'd0)
-		      begin
-			 if ( ~tx_rdempty )
-			   begin
-			      tx_sr[9:2] <= tx_data;
-			      tx_sr[1]   <= 1'b0; // Start bit
-			      // 10 = start bit + data + stop bit
-			      tx_bits    <= 4'd10;
-			      tx_rdack   <= 1'b1; // Remove from FIFO
-			   end
-		      end
-		    else
-		      begin
-			 tx_bits <= tx_bits - 1'b1;
-		      end // else: !if(tx_bits == 4'd0)
-		 end // if (tx_phase == 4'hF)
-	    end // if ( tty_clk_en )
-       end // else: !if(~rst_n)
-
-   //
-   // CPU interface
-   //
-
-   // Data (FIFO) register; normally addressed as byte
-   // Protect against long pulses (edge detect)
-   reg old_wstrb;
-   always @(posedge clk)
-     old_wstrb <= wstrb[0];
-
-   assign tx_wrreq = valid & wstrb[0] & ~old_wstrb & (addr == 2'b00);
-
-   // Status register definition
-   localparam status_bits = 5;
-   wire [status_bits-1:0] status;
-
-   assign status[0] = tx_rdempty & (tx_bits == 4'd0);
-   assign status[1] = tx_usedw[8:7] == 2'b00;
-   assign status[2] = ~tx_usedw[8];
-   assign status[3] = tx_usedw[8];
-   assign status[4] = tx_usedw[8:7] == 2'b11;
-
-   reg [status_bits-1:0]  irq_en;
-   //
-   // Control register writes.
-   // Only full word writes are supported.
-   //
-   always @(negedge rst_n or posedge clk)
-     if (~rst_n)
-       begin
-	  irq_en <= 5'b0;
-       end
-     else if (valid & (&wstrb))
-       case (addr)
-	 2'b01: divisor <= wdata[NCO_BITS-1:0];
-	 2'b11: irq_en  <= wdata[status_bits-1:0];
-       endcase // case (addr)
-
-   // Read MUX
-   always @(*)
-     begin
-	rdata = 32'b0;
-	case (addr)
-	  2'b01:   rdata[NCO_BITS-1:0]    = divisor;
-	  2'b10:   rdata[status_bits-1:0] = status;
-	  2'b11:   rdata[status_bits-1:0] = irq_en;
-	  default: rdata = 32'b0;
-	endcase // case (addr)
-     end
-
-   // Interrupt
-   always @(negedge rst_n or posedge clk)
-     if (~rst_n)
-       irq <= 1'b0;
-     else
-       irq <= |(status & irq_en);
-
-endmodule // tty

+ 10 - 0
rv32/Makefile

@@ -7,6 +7,7 @@ CC	  = $(CROSS)gcc
 LD	  = $(CROSS)ld
 LD	  = $(CROSS)ld
 OBJCOPY   = $(CROSS)objcopy
 OBJCOPY   = $(CROSS)objcopy
 AR        = $(CROSS)ar
 AR        = $(CROSS)ar
+NM	  = $(CROSS)nm
 PERL      = perl
 PERL      = perl
 INCLUDE   = -I. -I./include -I./fatfs/source
 INCLUDE   = -I. -I./include -I./fatfs/source
 include ../riscv-opts.mk
 include ../riscv-opts.mk
@@ -86,6 +87,15 @@ 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 | \
+			grep ' R __dram_init_end$$' | \
+	                awk '{ print $$1; }') - (1 << 30)))
+
 testimg.bin: testimg.elf
 testimg.bin: testimg.elf
 	$(OBJCOPY) -O binary $< $@
 	$(OBJCOPY) -O binary $< $@
 
 

+ 1449 - 1164
rv32/boot.mif

@@ -15,7 +15,7 @@ CONTENT BEGIN
 0008 : 0001210B;
 0008 : 0001210B;
 0009 : 008DF413;
 0009 : 008DF413;
 000A : 00040863;
 000A : 00040863;
-000B : 7B0000EF;
+000B : 35B000EF;
 000C : 408D8DB3;
 000C : 408D8DB3;
 000D : 060D8063;
 000D : 060D8063;
 000E : 00000493;
 000E : 00000493;
@@ -48,26 +48,26 @@ CONTENT BEGIN
 0029 : 0000250B;
 0029 : 0000250B;
 002A : 0005B00B;
 002A : 0005B00B;
 002B : 00000000;
 002B : 00000000;
-002C : 6340006F;
-002D : 5360006F;
-002E : 5260006F;
-002F : 7200006F;
-0030 : 5360006F;
-0031 : 6200006F;
-0032 : 4220106F;
-0033 : 6180006F;
-0034 : 6140006F;
-0035 : 6AC0006F;
-0036 : 60C0006F;
-0037 : 6080006F;
-0038 : 6040006F;
-0039 : 6000006F;
+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;
 003A : 00000000;
 003B : 7C5C2D2F;
 003B : 7C5C2D2F;
-003C : 4101D4B0;
+003C : 4101D2B0;
 003D : FFFFFFFF;
 003D : FFFFFFFF;
 003E : FFFFFFFF;
 003E : FFFFFFFF;
-003F : 00001644;
+003F : 00001AB8;
 0040 : 00000040;
 0040 : 00000040;
 0041 : 00000000;
 0041 : 00000000;
 0042 : 00000000;
 0042 : 00000000;
@@ -202,33 +202,33 @@ CONTENT BEGIN
 00C3 : CA26CC22;
 00C3 : CA26CC22;
 00C4 : C64EC84A;
 00C4 : C64EC84A;
 00C5 : C256C452;
 00C5 : C256C452;
-00C6 : 2E11C05A;
+00C6 : 2659C05A;
 00C7 : 1A604283;
 00C7 : 1A604283;
 00C8 : 00028663;
 00C8 : 00028663;
 00C9 : 40007097;
 00C9 : 40007097;
-00CA : F42080E7;
+00CA : E2E080E7;
 00CB : 400074B7;
 00CB : 400074B7;
 00CC : 40007937;
 00CC : 40007937;
 00CD : 5AFD4981;
 00CD : 5AFD4981;
-00CE : 2B448493;
-00CF : 31E90913;
+00CE : 1A448493;
+00CF : 20E90913;
 00D0 : 40007A37;
 00D0 : 40007A37;
 00D1 : 0750008B;
 00D1 : 0750008B;
 00D2 : 0810878B;
 00D2 : 0810878B;
 00D3 : 1A704303;
 00D3 : 1A704303;
 00D4 : 00030663;
 00D4 : 00030663;
 00D5 : 40001097;
 00D5 : 40001097;
-00D6 : 58E080E7;
-00D7 : 7F6000EF;
+00D6 : 424080E7;
+00D7 : 3A1000EF;
 00D8 : 89C02403;
 00D8 : 89C02403;
 00D9 : FE89F0E3;
 00D9 : FE89F0E3;
 00DA : 00845393;
 00DA : 00845393;
 00DB : 0FF47593;
 00DB : 0FF47593;
 00DC : 93638626;
 00DC : 93638626;
 00DD : 864A0003;
 00DD : 864A0003;
-00DE : 2BEA0513;
+00DE : 1AEA0513;
 00DF : 40001097;
 00DF : 40001097;
-00E0 : 28A080E7;
+00E0 : 120080E7;
 00E1 : BF7D89A2;
 00E1 : BF7D89A2;
 00E2 : 00000697;
 00E2 : 00000697;
 00E3 : D1468693;
 00E3 : D1468693;
@@ -319,1143 +319,1428 @@ CONTENT BEGIN
 0138 : 06850585;
 0138 : 06850585;
 0139 : FEE6EAE3;
 0139 : FEE6EAE3;
 013A : 00008082;
 013A : 00008082;
-013B : C4221141;
-013C : C04AC226;
-013D : 842AC606;
-013E : 492544A1;
-013F : 01C45793;
-0140 : 05700513;
-0141 : 64630412;
-0142 : 051300F9;
-0143 : 953E0300;
-0144 : 22CD14FD;
-0145 : 40B2F4E5;
-0146 : 44924422;
-0147 : 01414902;
-0148 : 11018082;
-0149 : CE06C84A;
-014A : CA26CC22;
-014B : C452C64E;
-014C : 2A73892A;
-014D : 65053430;
-014E : 4FC50493;
-014F : 4FC50513;
-0150 : 00158413;
-0151 : 854A2AD1;
-0152 : 98792AC1;
-0153 : 00848513;
-0154 : 099322E1;
-0155 : 854EFFC4;
-0156 : 85133F51;
-0157 : 2A6D00F4;
-0158 : FFE45783;
-0159 : FFC45303;
-015A : 9293491D;
-015B : 85330107;
-015C : 3FAD0062;
-015D : 01448513;
-015E : 85522245;
-015F : 45293F85;
-0160 : 44812A95;
-0161 : 02000A13;
-0162 : 440149A1;
-0163 : 00940533;
-0164 : 3FA93BE5;
-0165 : 04634529;
-0166 : 05130124;
-0167 : 04050200;
-0168 : 15E32A91;
-0169 : 04A1FF34;
-016A : FF4491E3;
-016B : 98805083;
-016C : 0010F393;
-016D : FE038CE3;
-016E : C01026F3;
-016F : 1908B5B7;
-0170 : 0FF58613;
-0171 : C0102773;
-0172 : 40D70833;
-0173 : FF067CE3;
-0174 : 878B58FD;
-0175 : 4E050608;
-0176 : 81C02623;
-0177 : 6505BFF5;
-0178 : 05131141;
-0179 : C6065225;
-017A : 65053F2D;
-017B : 05131141;
-017C : C60652D5;
-017D : 0293373D;
-017E : A7831240;
-017F : 83130002;
-0180 : A0230017;
-0181 : 73930062;
-0182 : 916301F3;
-0183 : 55130203;
-0184 : 75930053;
-0185 : 06930035;
-0186 : 88330EC0;
-0187 : 488300B6;
-0188 : 4E210008;
-0189 : 99100023;
-018A : 99C00023;
-018B : 11418082;
-018C : C422C606;
-018D : C0102773;
-018E : 12E02423;
-018F : DE900093;
-0190 : 0610078B;
-0191 : 2423429D;
-0192 : 537D8050;
-0193 : 0660038B;
-0194 : 2003F413;
-0195 : 0537DC65;
-0196 : 85B74000;
-0197 : 44014000;
-0198 : 00050613;
-0199 : A5858393;
-019A : 06766463;
-019B : 40007637;
-019C : 3B260513;
-019D : 85222055;
-019E : 45293D95;
-019F : 86B728A5;
-01A0 : 38374000;
-01A1 : 43014001;
-01A2 : A5868793;
-01A3 : 4B080293;
-01A4 : 0457E463;
-01A5 : 00030763;
-01A6 : 400078B7;
-01A7 : 3C888513;
-01A8 : 4E1928A5;
-01A9 : 24236E85;
-01AA : 851381C0;
-01AB : 20AD541E;
-01AC : 98805F03;
-01AD : 001F7F93;
-01AE : FE0F8CE3;
-01AF : 24234715;
-01B0 : 442280E0;
-01B1 : 014140B2;
-01B2 : 40001317;
-01B3 : D6C30067;
-01B4 : 06114208;
-01B5 : BF49942A;
-01B6 : 0007A083;
-01B7 : 63330791;
-01B8 : B77D0013;
-01B9 : 95334785;
-01BA : 429300A7;
-01BB : 050BFFF5;
-01BC : 80820655;
-01BD : 82936785;
-01BE : 57038047;
-01BF : 73339880;
-01C0 : 0CE30057;
-01C1 : 43A9FE53;
-01C2 : 00751563;
-01C3 : 002345B5;
-01C4 : 002398B0;
-01C5 : 808298A0;
-01C6 : 82936785;
-01C7 : 57038047;
-01C8 : 73339880;
-01C9 : 0CE30057;
-01CA : 45A9FE53;
-01CB : 438346B5;
-01CC : 05050005;
-01CD : 00039363;
-01CE : 94638082;
-01CF : 002300B3;
-01D0 : 002398D0;
-01D1 : B7E59870;
-01D2 : 00C02703;
-01D3 : 3B0002B7;
-01D4 : A0A02023;
-01D5 : 00E28333;
-01D6 : 00B303B3;
-01D7 : 2D000537;
-01D8 : A0702223;
-01D9 : 24238E49;
-01DA : 8082A0C0;
-01DB : A0A02023;
-01DC : 200007B7;
-01DD : A0002223;
-01DE : 24238DDD;
-01DF : 8082A0B0;
-01E0 : 12C00293;
-01E1 : 0002A703;
-01E2 : 00170693;
-01E3 : 00D2A023;
-01E4 : 4585CB19;
-01E5 : 02B70763;
-01E6 : 20000F13;
-01E7 : DFF00F93;
-01E8 : 07FF078B;
-01E9 : 05378082;
-01EA : 83374000;
-01EB : 06134000;
-01EC : 03930005;
-01ED : 8633A583;
-01EE : 458140C3;
-01EF : 00050513;
-01F0 : 8837B761;
-01F1 : 3E374000;
-01F2 : 08934001;
-01F3 : 0E93A588;
-01F4 : 85B34B0E;
-01F5 : 0513411E;
-01F6 : BF49A588;
-01F7 : CE061101;
-01F8 : CC22CA26;
-01F9 : C64EC84A;
-01FA : 5783C452;
-01FB : 00938880;
-01FC : 949318C0;
-01FD : F2930107;
-01FE : A4030FF7;
-01FF : 80C10000;
-0200 : 12028263;
-0201 : 89104303;
-0202 : 89004583;
-0203 : 76134695;
-0204 : F5930FF3;
-0205 : E4630FF5;
-0206 : 4F051066;
-0207 : 14CF6F63;
-0208 : 10061463;
-0209 : 14040D63;
-020A : 00442F83;
-020B : 020F8963;
-020C : 8713401C;
-020D : C0180017;
-020E : 00B78023;
-020F : 01D44083;
-0210 : 01444283;
-0211 : 0050F333;
-0212 : 00640EA3;
-0213 : 88600AA3;
-0214 : 83934054;
-0215 : 2223FFF6;
-0216 : 98630074;
-0217 : 03B30203;
-0218 : 8B2300C4;
-0219 : 5A0300B3;
-021A : 55330104;
-021B : 791340CA;
-021C : 0C630015;
-021D : 09930009;
-021E : 98130086;
-021F : 08B30029;
-0220 : AE030104;
-0221 : 85220008;
-0222 : F5939E02;
-0223 : C1A11004;
-0224 : 0D634450;
-0225 : 0E931406;
-0226 : 2623FFF6;
-0227 : 876301D4;
-0228 : 4083140E;
-0229 : 428301D4;
-022A : F6B30154;
-022B : 0EA30050;
-022C : 0AA300D4;
-022D : 238388D0;
-022E : 8A130084;
-022F : 24230013;
-0230 : C5030144;
-0231 : 0E230003;
-0232 : 0A2300A4;
-0233 : F91388A0;
-0234 : 05632004;
-0235 : 48030209;
-0236 : 498301D4;
-0237 : 0AA38950;
-0238 : 58838900;
-0239 : F5930104;
-023A : FE130FF9;
-023B : 07632008;
-023C : 2E83000E;
-023D : 460503C4;
-023E : 9E828522;
-023F : 5F83444C;
-0240 : 40400104;
-0241 : 00B03633;
-0242 : 00861F13;
-0243 : 01FF6733;
-0244 : 008037B3;
-0245 : 00E7E333;
-0246 : 08236093;
-0247 : 439DA09D;
-0248 : 06760F63;
-0249 : A8A1F03D;
-024A : 03F5FA13;
-024B : 002A1913;
-024C : 1BC00813;
-024D : 012808B3;
-024E : 0008A403;
-024F : 11400023;
-0250 : 0080A023;
-0251 : 08200313;
-0252 : 2E03C015;
-0253 : 5F8300C4;
-0254 : 405C0104;
-0255 : 01C03EB3;
-0256 : 008E9F13;
-0257 : 01FF6733;
-0258 : 00F030B3;
-0259 : 00E0E2B3;
-025A : 0822E313;
-025B : 88601523;
-025C : C0114681;
-025D : 2A234C54;
-025E : 12E388D0;
-025F : 0093EE04;
-0260 : 92930820;
-0261 : E4B30100;
-0262 : 24230092;
-0263 : 40F28890;
-0264 : 44D24462;
-0265 : 49B24942;
-0266 : 61054A22;
-0267 : 05138082;
-0268 : 4A030400;
-0269 : A0231000;
-026A : 00230000;
-026B : 061310A0;
-026C : 15230820;
-026D : 2A2388C0;
-026E : 44018800;
-026F : 1BC00913;
-0270 : 10000993;
-0271 : 00890833;
-0272 : 00082503;
-0273 : 5883CD01;
-0274 : FE130105;
-0275 : 07630808;
-0276 : 2E83000E;
-0277 : 461D0405;
-0278 : 9E8285D2;
-0279 : 1FE30411;
-027A : BF51FD34;
-027B : 01F44F83;
-027C : 89404F03;
-027D : 01F40E23;
-027E : 89F00A23;
-027F : 01045703;
-0280 : 0FFF7593;
-0281 : 10077793;
-0282 : EC0783E3;
-0283 : 03842303;
-0284 : 85224601;
-0285 : BD659302;
-0286 : 575D47A1;
-0287 : 06E7828B;
-0288 : 2383C10C;
-0289 : C15018C0;
-028A : 00D50EA3;
-028B : 02751663;
-028C : 5E03454C;
-028D : 36330105;
-028E : 36B300C0;
-028F : 981300B0;
-0290 : 68B30086;
-0291 : EEB30106;
-0292 : EF1301C8;
-0293 : 1523082E;
-0294 : 4D4889E0;
-0295 : 88A02A23;
-0296 : 0082FF93;
-0297 : 878B57DD;
-0298 : 808206FF;
-0299 : 575D47A1;
-029A : 06E7828B;
-029B : 00158313;
-029C : 2423C550;
-029D : C3830065;
-029E : 0EA30005;
-029F : 268300D5;
-02A0 : 0E2318C0;
-02A1 : 17630075;
-02A2 : 280302D5;
-02A3 : 5F030045;
-02A4 : 36330105;
-02A5 : 38B300C0;
-02A6 : 1E130100;
-02A7 : EEB30086;
-02A8 : EFB301C8;
-02A9 : E79301EE;
-02AA : 1523082F;
-02AB : 4D4888F0;
-02AC : 88A02A23;
-02AD : 0082F293;
-02AE : 878B575D;
-02AF : 808206E2;
-02B0 : 575D47A1;
-02B1 : 06E7828B;
-02B2 : 00C52303;
-02B3 : 00B50FA3;
-02B4 : 00031A63;
-02B5 : 18C02603;
-02B6 : 00B50E23;
-02B7 : 00C51463;
-02B8 : 88B00A23;
-02B9 : 0082F513;
-02BA : 078B55DD;
-02BB : 808206B5;
-02BC : 575D47A1;
-02BD : 06E7828B;
-02BE : 18C02383;
-02BF : 00B50EA3;
-02C0 : 00751463;
-02C1 : 88B00AA3;
-02C2 : 0082F513;
-02C3 : 078B55DD;
-02C4 : 808206B5;
-02C5 : 09400793;
-02C6 : 00F51823;
-02C7 : 00050EA3;
-02C8 : 88000AA3;
-02C9 : 04F54283;
-02CA : 040506A3;
-02CB : 0012E313;
-02CC : 046507A3;
-02CD : 47838082;
-02CE : E29304F5;
-02CF : 07A30027;
-02D0 : 80820455;
-02D1 : 04F54783;
-02D2 : 0047E293;
-02D3 : 045507A3;
-02D4 : 71158082;
-02D5 : CF86C7CE;
-02D6 : C1DACBA6;
-02D7 : C9CACDA2;
-02D8 : C3D6C5D2;
-02D9 : DD62DF5E;
-02DA : D96ADB66;
-02DB : 0093D76E;
-02DC : 2B030F40;
-02DD : A2831240;
-02DE : 29030000;
-02DF : 74938800;
-02E0 : 8D630059;
-02E1 : 63052962;
-02E2 : 58C34383;
-02E3 : 0F400B93;
-02E4 : 0013F413;
-02E5 : 1097C071;
-02E6 : 80E74000;
-02E7 : 78935260;
-02E8 : 85630015;
-02E9 : 4A850008;
-02EA : A8C94A01;
-02EB : 80800A93;
-02EC : 000AAA03;
-02ED : 40007CB7;
-02EE : 40013D37;
-02EF : 002A6C13;
-02F0 : 018AA023;
-02F1 : 85934605;
-02F2 : 051331EC;
-02F3 : 4097260D;
-02F4 : 80E74000;
-02F5 : C1053880;
-02F6 : 400077B7;
-02F7 : 71978513;
-02F8 : 40001097;
-02F9 : A26080E7;
-02FA : 000AA983;
-02FB : FFD9F293;
-02FC : 005AA023;
-02FD : 0850BF4D;
-02FE : 8513100C;
-02FF : 002331EC;
-0300 : CA020201;
-0301 : 40005097;
-0302 : 1CC080E7;
-0303 : 7DB74652;
-0304 : 100C4000;
-0305 : 732D8513;
-0306 : 40001097;
-0307 : 9EE080E7;
-0308 : 082C0870;
-0309 : 31EC8513;
-030A : 5097CC02;
-030B : 80E74000;
-030C : 4E7203E0;
-030D : 7FB745E2;
-030E : 5E834000;
-030F : 2F0300AE;
-0310 : 851301CE;
-0311 : 9693760F;
-0312 : 0613009E;
-0313 : 1097FFEF;
-0314 : 80E74000;
-0315 : BF819B80;
-0316 : 40001097;
-0317 : 416080E7;
-0318 : F1318905;
-0319 : 19000613;
-031A : 46FD4218;
-031B : 40EB0833;
-031C : 1B06F463;
-031D : 01662023;
-031E : 4A054A81;
-031F : 016BA023;
-0320 : 0F800093;
-0321 : 0000AB83;
-0322 : 00197313;
-0323 : C002C21A;
-0324 : 069B8163;
-0325 : 0090A023;
-0326 : 80800393;
-0327 : 0003A403;
-0328 : 00197593;
-0329 : 00259613;
-032A : FFB47513;
-032B : 00A66733;
-032C : 40007837;
-032D : 00E3A023;
-032E : 79280513;
-032F : 00497913;
-0330 : 00633CA1;
-0331 : 78B71609;
-0332 : 85134000;
-0333 : 34A96F58;
-0334 : 9D634A92;
-0335 : 7A37140A;
-0336 : 05134000;
-0337 : C4B370DA;
-0338 : DC93009B;
-0339 : 4D050024;
-033A : FA933C05;
-033B : C06A001C;
-033C : 6E854A05;
-033D : 4000CDB7;
-033E : 8F136E05;
-033F : 8D136A4E;
-0340 : 4B81400D;
-0341 : 84934B01;
-0342 : 0C13400D;
-0343 : C47A58CE;
-0344 : 04ED4F83;
-0345 : 120A8163;
-0346 : 120F8163;
-0347 : 4901846A;
-0348 : 46834DA1;
-0349 : FE132AE4;
-034A : 04630016;
-034B : 4E83040E;
-034C : FF13001C;
-034D : 1863001E;
-034E : 0513000F;
-034F : 50970504;
-0350 : 80E74000;
-0351 : 4F83B900;
-0352 : F7932AE4;
-0353 : 0723FFEF;
-0354 : 42832AF4;
-0355 : 809304CD;
-0356 : 0623FFF2;
-0357 : 4303041D;
-0358 : 73932AF4;
-0359 : 96630043;
-035A : 76130003;
-035B : 0723FFE3;
-035C : 09052AC4;
-035D : 2E840413;
-035E : FBB915E3;
-035F : 040D0723;
-0360 : C5114502;
-0361 : 2097856A;
-0362 : 80E74000;
-0363 : 4592D660;
-0364 : CD8D4981;
-0365 : 48215CDD;
-0366 : 0798070B;
-0367 : 08936709;
-0368 : 0E33B907;
-0369 : 8DB3031B;
-036A : C98301C4;
-036B : 87A304FD;
-036C : F993040D;
-036D : 068B0FF9;
-036E : F6930790;
-036F : 89630069;
-0370 : 856A2206;
-0371 : 40002097;
-0372 : D28080E7;
-0373 : 04ED4603;
-0374 : 46061A63;
-0375 : 8E136889;
-0376 : 0B05B908;
-0377 : 9D724691;
-0378 : 17E39BF2;
-0379 : 0A63F2DB;
-037A : 0493000A;
-037B : AA038080;
-037C : 7A930004;
-037D : A023FFDA;
-037E : 40FE0154;
-037F : 44DE446E;
-0380 : 49BE494E;
-0381 : 4A9E4A2E;
-0382 : 5BFA4B0E;
-0383 : 5CDA5C6A;
-0384 : 5DBA5D4A;
-0385 : 8082612D;
-0386 : B3794A81;
-0387 : 4A014A81;
-0388 : 76B7B585;
-0389 : 85134000;
-038A : B5556FC6;
-038B : 40007C37;
-038C : 702C0513;
-038D : 95E3B56D;
-038E : 4783F40F;
-038F : F993000C;
-0390 : 9FE30017;
-0391 : 2283F209;
-0392 : 63058800;
-0393 : 6AF30413;
-0394 : 0042F093;
-0395 : 00009563;
-0396 : 841343A2;
-0397 : 051300A3;
-0398 : 05930300;
-0399 : 002302F0;
-039A : 00A300A4;
-039B : 012300B4;
-039C : 8CEA0004;
-039D : 2A8D0413;
-039E : 03000913;
-039F : 044D2603;
-03A0 : 40007837;
-03A1 : 0693874A;
-03A2 : 45910086;
-03A3 : 7A180613;
-03A4 : 60978522;
-03A5 : 80E74000;
-03A6 : 87378280;
-03A7 : 0D934000;
-03A8 : 0993DA84;
-03A9 : A6838AC7;
-03AA : 84630009;
-03AB : 78B71206;
-03AC : 87224000;
-03AD : 7A988613;
-03AE : 04000593;
-03AF : 50971008;
-03B0 : 80E74000;
-03B1 : C6837FC0;
-03B2 : FE132AEC;
-03B3 : 09630016;
-03B4 : 4E83020E;
-03B5 : FF13001C;
-03B6 : 1763001E;
-03B7 : 856E000F;
-03B8 : 40005097;
-03B9 : 9EE080E7;
-03BA : 2AECCF83;
-03BB : FFEFF793;
-03BC : 2AFC8723;
-03BD : 04CD4283;
-03BE : FFF28093;
-03BF : 041D0623;
-03C0 : 2AFCC303;
-03C1 : 00437393;
-03C2 : 0E039263;
-03C3 : 0FE37893;
-03C4 : 2B1C8723;
-03C5 : 0028F513;
-03C6 : E1114605;
-03C7 : 100C460D;
-03C8 : C632856E;
-03C9 : 40004097;
-03CA : 092080E7;
-03CB : C5834629;
-03CC : 19632AEC;
-03CD : 483200C5;
-03CE : 00287713;
-03CF : E893C701;
-03D0 : B7F90025;
-03D1 : C1114885;
-03D2 : E6B34891;
-03D3 : 87230115;
-03D4 : FE132ADC;
-03D5 : 0B630016;
-03D6 : 79B7080E;
-03D7 : 10104000;
-03D8 : 851385A2;
-03D9 : 00977AE9;
-03DA : 80E74000;
-03DB : 0E936A00;
-03DC : 0F130220;
-03DD : A8230084;
-03DE : A0232BDC;
-03DF : 55FD0BEC;
-03E0 : 856E567D;
-03E1 : 40005097;
-03E2 : 96C080E7;
-03E3 : 7DB7C911;
-03E4 : 85A24000;
-03E5 : 7C2D8513;
-03E6 : 40000097;
-03E7 : 66E080E7;
-03E8 : 044D2303;
-03E9 : 064CAF83;
-03EA : 060CA283;
-03EB : 00235383;
-03EC : 018F9793;
-03ED : 0082D093;
-03EE : 0017E633;
-03EF : 00C3F363;
-03F0 : 9623861E;
-03F1 : 45032ACC;
-03F2 : 059304CD;
-03F3 : 06230015;
-03F4 : 090504BD;
-03F5 : 03800813;
-03F6 : 2E840413;
-03F7 : 2E8C8C93;
-03F8 : E9091EE3;
-03F9 : 07234705;
-03FA : BB5904ED;
-03FB : BD650991;
-03FC : 0019FE93;
-03FD : DC0E8CE3;
-03FE : 049D4F03;
-03FF : 048D4603;
-0400 : 5F936285;
-0401 : 8093006F;
-0402 : 97937902;
-0403 : 8333008F;
-0404 : 83B3001B;
-0405 : 79130067;
-0406 : 7C930016;
-0407 : 8433007F;
-0408 : 00630074;
-0409 : 05130409;
-040A : 8DB32E80;
-040B : 85B302AC;
-040C : 883301CD;
-040D : 470300B4;
-040E : 78932AE8;
-040F : 98630017;
-0410 : 03930408;
-0411 : 06A3F800;
-0412 : 0593047D;
-0413 : 856A0800;
-0414 : 04233C85;
-0415 : 4603040D;
-0416 : 7513048D;
-0417 : 0423FFE6;
-0418 : 4D8304AD;
-0419 : F593048D;
-041A : C5C5002D;
-041B : 010D5303;
-041C : FFDDF093;
-041D : 041D0423;
-041E : 10036393;
-041F : 007D1823;
-0420 : 06134685;
-0421 : 85A21000;
-0422 : 3AE9856A;
-0423 : 856AB381;
-0424 : 40002097;
-0425 : 9F0080E7;
-0426 : 0313E901;
-0427 : 06A30210;
-0428 : 0593046D;
-0429 : B7650210;
-042A : 80800E13;
-042B : 2683D002;
-042C : 4595000E;
-042D : EE93856A;
-042E : 20230026;
-042F : 3C0D01DE;
-0430 : 050B8F13;
-0431 : 01ED8FB3;
-0432 : 8933856A;
-0433 : 209701F4;
-0434 : 80E74000;
-0435 : 15939800;
-0436 : 46010085;
-0437 : 5097854A;
-0438 : 80E74000;
-0439 : C5118120;
-043A : 06A340A1;
-043B : 45A1041D;
-043C : 1014BFB9;
-043D : 10000613;
-043E : 854A85A2;
-043F : 40004097;
-0440 : 1DE080E7;
-0441 : 5782F175;
-0442 : 10000293;
-0443 : FC579EE3;
-0444 : F813B799;
-0445 : 0463004D;
-0446 : 57830208;
-0447 : F913010D;
-0448 : 0423FFBD;
-0449 : E293052D;
-044A : 18230017;
-044B : 0693005D;
-044C : 06130410;
-044D : 85A21000;
-044E : 38F9856A;
-044F : F713B941;
-0450 : C721008D;
-0451 : 08936E09;
-0452 : 06932E80;
-0453 : 8CB3B90E;
-0454 : 0EB3031C;
-0455 : 8F3302DB;
-0456 : 8DB301DC;
-0457 : CF8301E4;
-0458 : F9132AED;
-0459 : 1E63001F;
-045A : 06930209;
-045B : 06A3F800;
-045C : 059304DD;
-045D : 856A0800;
-045E : 042332A1;
-045F : 4E83040D;
-0460 : FF13048D;
-0461 : 0423FF7E;
-0462 : 4D8305ED;
-0463 : 856A048D;
-0464 : 00FDFF93;
-0465 : 05FD0423;
-0466 : 40002097;
-0467 : 920080E7;
-0468 : F793B135;
-0469 : CB81002F;
-046A : 04000E13;
-046B : 05CD06A3;
-046C : 04000593;
-046D : 856AB7C9;
-046E : 40002097;
-046F : 8C8080E7;
-0470 : 0893E901;
-0471 : 06A30210;
-0472 : 0593051D;
-0473 : B7650210;
-0474 : 0293D002;
-0475 : A0838080;
-0476 : 83930002;
-0477 : 8633050B;
-0478 : E313007C;
-0479 : A0230020;
-047A : 856A0062;
-047B : 00C48CB3;
-047C : 40002097;
-047D : 85E080E7;
-047E : 00851593;
-047F : 85664601;
-0480 : 40004097;
-0481 : 6F0080E7;
-0482 : 0713C901;
-0483 : 06A30200;
-0484 : 059304ED;
-0485 : B7850200;
-0486 : 2AEDC503;
-0487 : 06131014;
-0488 : 65931000;
-0489 : 87230085;
-048A : 85662ABD;
-048B : 409785A2;
-048C : 80E74000;
-048D : F97129A0;
-048E : 08135402;
-048F : 16E31000;
-0490 : BF35FD04;
-0491 : 000A1663;
-0492 : 0049F993;
-0493 : B80984E3;
-0494 : 4D81846A;
-0495 : 45034CA1;
-0496 : 75932AE4;
-0497 : CD890085;
-0498 : 05040513;
-0499 : 40004097;
-049A : 4B2080E7;
-049B : 2AE44803;
-049C : FF787713;
-049D : 2AE40723;
-049E : 04130D85;
-049F : 9CE32E84;
-04A0 : BE89FD9D;
-04A1 : 01D54783;
-04A2 : 0047E293;
-04A3 : 00550EA3;
-04A4 : 88500AA3;
-04A5 : 47838082;
-04A6 : E29301D5;
-04A7 : 0EA30027;
-04A8 : 0AA30055;
-04A9 : 80828850;
-04AA : D4227179;
-04AB : F793D606;
-04AC : 842E0045;
-04AD : 4083CFCD;
-04AE : 031301D5;
-04AF : F2931B10;
-04B0 : 0EA30FB0;
-04B1 : 0AA30055;
-04B2 : 43838850;
-04B3 : 85B70073;
-04B4 : 8893AE14;
-04B5 : 0613AE15;
-04B6 : 08331470;
-04B7 : 47030276;
-04B8 : 4F030063;
-04B9 : 45830053;
-04BA : 50930033;
-04BB : 7F930017;
-04BC : 979303FF;
-04BD : F293005F;
-04BE : E6B301F0;
-04BF : 47830057;
-04C0 : BE330023;
-04C1 : 43830313;
-04C2 : 43030043;
-04C3 : F0930013;
-04C4 : F61300F7;
-04C5 : 929301F3;
-04C6 : 073E0150;
-04C7 : CE02CC02;
-04C8 : 0EB34785;
-04C9 : 181301C8;
-04CA : FE1300B6;
-04CB : E8B301F5;
-04CC : 1F130106;
-04CD : 0EC6010E;
-04CE : 01E8EFB3;
-04CF : 01430693;
-04D0 : 011ED893;
-04D1 : 005FE3B3;
-04D2 : 011765B3;
-04D3 : 01969613;
-04D4 : 00C3E833;
-04D5 : 01059E13;
-04D6 : 1C23CA42;
-04D7 : 5F1300B1;
-04D8 : 1223010E;
-04D9 : 202391E0;
-04DA : 03A39100;
-04DB : 70931AF0;
-04DC : 8D630404;
-04DD : 42830000;
-04DE : 462101D5;
-04DF : 0402E693;
-04E0 : 1B100593;
-04E1 : F0EFC62A;
-04E2 : 4532E92F;
-04E3 : 53130462;
-04E4 : 52634184;
-04E5 : 46830A03;
-04E6 : 071301D5;
-04E7 : FE931A90;
-04E8 : 0EA30FD6;
-04E9 : 0AA301D5;
-04EA : 288389D0;
-04EB : 26039000;
-04EC : 48519040;
-04ED : 0158DF93;
-04EE : 01070023;
-04EF : F793CC32;
-04F0 : D09300FF;
-04F1 : 58130108;
-04F2 : 064600F6;
-04F3 : 00F70123;
-04F4 : 01F0F293;
-04F5 : 00C807B7;
-04F6 : 01165093;
-04F7 : 005701A3;
-04F8 : 0217B2B3;
-04F9 : 0198DE13;
-04FA : 0F13CA46;
-04FB : D393FECE;
-04FC : D31300B8;
-04FD : F8930058;
-04FE : 00A301F8;
-04FF : 9E1301E7;
-0500 : 7F130018;
-0501 : F4130018;
-0502 : 769301F3;
-0503 : 6FB303F3;
-0504 : 02A301EE;
-0505 : 022300D7;
-0506 : 03230087;
-0507 : 03A301F7;
-0508 : 54220057;
-0509 : E69350B2;
-050A : 4621080E;
-050B : 1A900593;
-050C : F06F6145;
-050D : 50B2E32F;
-050E : 61455422;
-050F : 57838082;
-0510 : 46039980;
-0511 : 92931B90;
-0512 : D3130107;
-0513 : 8F1A0102;
-0514 : 1B900393;
-0515 : C595C211;
-0516 : 01037593;
-0517 : 0015B813;
-0518 : 01038023;
-0519 : 4703ED99;
-051A : 78939900;
-051B : 0E230FF7;
-051C : 0FA30115;
-051D : 5E030115;
-051E : 1E939980;
-051F : DF13010E;
-0520 : 1F93010E;
-0521 : D793010F;
-0522 : 5293010F;
-0523 : 5693007F;
-0524 : 1F23001F;
-0525 : 581398F0;
-0526 : F313009F;
-0527 : F6130082;
-0528 : C3830126;
-0529 : 65B30003;
-052A : 771300C3;
-052B : C8B30048;
-052C : CE1300E5;
-052D : 2F830E68;
-052E : 4EB318C0;
-052F : 0EA3007E;
-0530 : 156301D5;
-0531 : 4D4801F5;
-0532 : 88A02A23;
-0533 : 08238082;
-0534 : 079398B0;
-0535 : 002303E0;
-0536 : 458198F0;
-0537 : 0793B78D;
-0538 : 002303C0;
-0539 : 458598F0;
-053A : 0793BF99;
-053B : 65050230;
-053C : 98F00023;
-053D : 05134581;
-053E : B7916005;
-053F : 4F525245;
-0540 : 00203A52;
-0541 : 20746120;
-0542 : 20007830;
-0543 : 00783028;
-0544 : 61420A29;
-0545 : 64612064;
-0546 : 73657264;
-0547 : 30203A73;
-0548 : 696D0078;
-0549 : 696C6173;
-054A : 64656E67;
-054B : 766E6900;
-054C : 64696C61;
-054D : 736E6920;
-054E : 63757274;
-054F : 6E6F6974;
-0550 : 2A0A0A00;
-0551 : 48202A2A;
-0552 : 6F6C6C65;
-0553 : 6F57202C;
-0554 : 21646C72;
-0555 : 2A2A2A20;
-0556 : 58414D0A;
-0557 : 66203038;
-0558 : 776D7269;
-0559 : 20657261;
-055A : 706D6F63;
-055B : 64656C69;
-055C : 3A6E6F20;
-055D : 6E614A20;
-055E : 20383120;
-055F : 32323032;
-0560 : 3A333220;
-0561 : 313A3335;
-0562 : 00000A38;
-0563 : 00000101;
-0564 : 00000000;
-0565 : 00000000;
-0566 : 00000000;
-0567 : 00000000;
-0568 : 00000000;
-0569 : 00000000;
-056A : 00000000;
-056B : 00000000;
-056C : 00000000;
-056D : 00000000;
-056E : 00000000;
-056F : 00000000;
-0570 : 00000000;
-0571 : 00000000;
-0572 : 00000000;
-0573 : 00000105;
-0574 : 00007FBF;
-0575 : 00000000;
-0576 : D3030300;
-0577 : 00001284;
-0578 : 00000000;
-0579 : 000012A8;
-057A : 00000000;
-057B : 00000000;
-057C : 00000000;
-057D : 00001296;
-057E : 00000000;
-057F : 00000000;
-0580 : 00000000;
-0581 : 00000000;
-0582 : 00000000;
-0583 : 00000000;
-0584 : 00000101;
-0585 : 0000FFFF;
-0586 : 00000000;
-0587 : 0003F600;
-0588 : 000014CE;
-0589 : 00000000;
-058A : 00000000;
-058B : 00000000;
-058C : 00000000;
-058D : 00000000;
-058E : 000014DE;
-058F : 00000000;
-0590 : 00000000;
-0591 : 00000000;
-0592 : 00000000;
-0593 : 00000000;
-0594 : 00000000;
-0595 : 00000000;
-0596 : 00000000;
-0597 : 00000000;
-0598 : 00000000;
-0599 : 00000000;
-059A : 00000000;
-059B : 00000000;
-059C : 00000000;
-059D : 00000000;
-059E : 00000000;
-059F : 00000000;
-05A0 : 00000000;
-05A1 : 00000000;
-05A2 : 00000000;
-05A3 : 00000000;
-05A4 : 00000000;
-05A5 : 00000000;
-05A6 : 00000000;
-05A7 : 00000000;
-05A8 : 00000000;
-05A9 : 6362612F;
-05AA : 6B736964;
-05AB : 3030382E;
-05AC : 002F;
-[05AD..1FFF] : 00;
+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 : 48B30FA1;
+020D : AC2300DF;
+020E : A803FF1F;
+020F : 0F33FF8F;
+0210 : AC23035F;
+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 : 20233B00;
+02BF : 8333A0A0;
+02C0 : 03B300E2;
+02C1 : 053700B3;
+02C2 : 22232D00;
+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 : 3A303020;
+065F : 353A3235;
+0660 : 53000A36;
+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;
 END;

+ 4 - 0
rv32/checksum.h

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

+ 48 - 0
rv32/checksum.pl

@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+
+use strict;
+use integer;
+
+my($infile,$outfile,$length) = @ARGV;
+
+unless (defined($outfile)) {
+    die "Usage: $0 infile outfile [length]\n";
+}
+
+sub nextblock($$$) {
+    my($block,$len,$limit) = @_;
+
+    my $bytes = $block;
+
+    if (defined($limit) && $limit - $len < $bytes) {
+	$bytes = $limit - $len;
+    }
+    return $bytes;
+}
+
+open(my $in, '<', $infile) or die "$0: $infile: $!\n";
+binmode $in;
+my $data;
+my $sum = 0;
+my $len = 0;
+my $blocklen;
+while (($blocklen = nextblock(4096, $len, $length)) &&
+       read($in, $data, $blocklen) == $blocklen) {
+    foreach my $w (unpack("V*", $data)) {
+	$sum = ($sum + $w) & 0xffffffff;
+    }
+    $len += $blocklen;
+}
+close($in);
+
+open(my $out, '>', $outfile) or die "$0: $outfile: $!\n";
+
+my $outfile_c = uc($outfile);
+$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";
+
+close($out);

+ 1 - 1
rv32/console.c

@@ -8,7 +8,7 @@
 #include "console.h"
 #include "console.h"
 #include "io.h"
 #include "io.h"
 
 
-#if CON_FLOW_CTL
+#if CON_OUT_OF_LINE
 
 
 void __hot con_putc(char c)
 void __hot con_putc(char c)
 {
 {

+ 10 - 5
rv32/console.h

@@ -4,7 +4,9 @@
 #include "compiler.h"
 #include "compiler.h"
 #include "io.h"
 #include "io.h"
 
 
-#define CON_FLOW_CTL 1		/* Block on connected and output full? */
+#define CON_FLOW_CTL	0	/* Block on connected and output full? */
+#define CON_OUT_OF_LINE	0
+#define CON_DELAY	0	/* us delay after output */
 
 
 void __fmt_printf(1,0) con_vprintf(const char *, va_list);
 void __fmt_printf(1,0) con_vprintf(const char *, va_list);
 void __fmt_printf(1,2) con_printf(const char *, ...);
 void __fmt_printf(1,2) con_printf(const char *, ...);
@@ -23,9 +25,12 @@ static __always_inline void __con_wait_tx_ready(void)
 
 
 static __always_inline void __con_putc(char c)
 static __always_inline void __con_putc(char c)
 {
 {
-    if (c == '\n')
+    if (c == '\n') {
 	CON_DATA = '\r';
 	CON_DATA = '\r';
+	udelay(CON_DELAY);
+    }
     CON_DATA = c;
     CON_DATA = c;
+    udelay(CON_DELAY);
 }
 }
 
 
 static __always_inline void _con_putc(char c)
 static __always_inline void _con_putc(char c)
@@ -44,7 +49,7 @@ static __always_inline void _con_puts(const char *str)
 	__con_putc(c);
 	__con_putc(c);
 }
 }
 
 
-#if CON_FLOW_CTL
+#if CON_OUT_OF_LINE
 
 
 void con_putc(char c);
 void con_putc(char c);
 void con_puts(const char *);
 void con_puts(const char *);
@@ -53,12 +58,12 @@ void con_puts(const char *);
 
 
 /* Simple enough to inline if we don't care about flow control */
 /* Simple enough to inline if we don't care about flow control */
 
 
-static inline void con_putc(char c)
+static __always_inline void con_putc(char c)
 {
 {
     _con_putc(c);
     _con_putc(c);
 }
 }
 
 
-static inline con_puts(const char *str)
+static __always_inline void con_puts(const char *str)
 {
 {
     _con_puts(str);
     _con_puts(str);
 }
 }

+ 6 - 4
rv32/io.h

@@ -65,11 +65,13 @@ static __always_inline uint64_t rdtimeq(void)
 
 
 static __always_inline void udelay(uint32_t us)
 static __always_inline void udelay(uint32_t us)
 {
 {
-    uint32_t cycles = us * (CPU_HZ / 1000000);
-    uint32_t start = rdtime();
+    if (!__builtin_constant_p(us) || us) {
+	uint32_t cycles = us * (CPU_HZ / 1000000);
+	uint32_t start = rdtime();
 
 
-    while (rdtime() - start < cycles)
-	pause();
+	while (rdtime() - start < cycles)
+	    pause();
+    }
 }
 }
 
 
 static inline void i2c_set_speed(unsigned int khz)
 static inline void i2c_set_speed(unsigned int khz)

+ 43 - 11
rv32/system.c

@@ -7,7 +7,7 @@
 
 
 #define DEBUG     0
 #define DEBUG     0
 #define MINITESTS 1
 #define MINITESTS 1
-#define DELAY     0
+#define DELAY     1
 
 
 static void __hot con_print_hex(unsigned int n)
 static void __hot con_print_hex(unsigned int n)
 {
 {
@@ -80,7 +80,7 @@ IRQHANDLER(sysclock,0)
     }
     }
 }
 }
 
 
-static void __cold __noinline late_init(void);
+static void late_init(void);
 
 
 uint32_t __sbss timer_irq_start;
 uint32_t __sbss timer_irq_start;
 void __hot init(void)
 void __hot init(void)
@@ -99,23 +99,56 @@ void __hot init(void)
     unmask_irqs((1U << ROMCOPY_IRQ)|(1U << EBREAK_IRQ)|
     unmask_irqs((1U << ROMCOPY_IRQ)|(1U << EBREAK_IRQ)|
 		(1U << BUSERR_IRQ)|(1U << SYSCLOCK_IRQ));
 		(1U << BUSERR_IRQ)|(1U << SYSCLOCK_IRQ));
 
 
+    con_puts(hello);
+
     set_leds(7);
     set_leds(7);
     wait_romcopy_done();
     wait_romcopy_done();
 
 
     if ( MINITESTS ) {
     if ( MINITESTS ) {
 	extern uint32_t __dram_init_start[], __dram_init_end[];
 	extern uint32_t __dram_init_start[], __dram_init_end[];
 	extern uint32_t __dram_bss_start[], __dram_bss_end[];
 	extern uint32_t __dram_bss_start[], __dram_bss_end[];
-	const uint32_t *dp;
+	volatile uint32_t *dp;
 	uint32_t v;
 	uint32_t v;
+	uint32_t wrerr;
+	uint32_t not_zero, all_ones;
+	uint32_t rx = 0x193ac604;
 
 
-	v = 0;
-	for (dp = __dram_init_start; dp < __dram_init_end; dp++)
-	    v += *dp;
+	v = wrerr = 0;
+	all_ones  = -1;
+	not_zero  = 0;
+
+	for (dp = __dram_init_start; dp < __dram_init_end; dp++) {
+	    uint32_t v1, v2;
+
+	    v1 = *dp;
+	    v += v1;
+
+	    v2 = v1 ^ rx;
+	    *dp = v2;
+
+	    wrerr |= *dp ^ v2;
 
 
-	con_puts("SDRAM data checksum: ");
+	    *dp++ = v1;
+
+	    not_zero |= v1;
+	    all_ones &= v1;
+	    
+	    rx *= 0xf4d5725f;
+	}
+
+	con_puts(hotstr("SDRAM data checksum: "));
 	con_print_hex(v);
 	con_print_hex(v);
 	con_putc('\n');
 	con_putc('\n');
 
 
+	con_puts(hotstr("Bits always set, clear: "));
+	con_print_hex(all_ones);
+	con_putc(' ');
+	con_print_hex(~not_zero);
+	con_putc('\n');
+	
+	if (wrerr)
+	    con_puts(hotstr("SDRAM read/write error\n"));
+
 	v = 0;
 	v = 0;
 	for (dp = __dram_bss_start; dp < __dram_bss_end; dp++) {
 	for (dp = __dram_bss_start; dp < __dram_bss_end; dp++) {
 	    uint32_t x = *dp;
 	    uint32_t x = *dp;
@@ -123,16 +156,15 @@ void __hot init(void)
 	}
 	}
 
 
 	if (v)
 	if (v)
-	    con_puts("SDRAM .bss is not zero!\n");
+	    con_puts(hotstr("SDRAM .bss is not zero!\n"));
     }
     }
     set_leds(6);
     set_leds(6);
 
 
-    con_puts(hello);
     con_flush();
     con_flush();
 
 
     set_leds(5);
     set_leds(5);
 #if DELAY
 #if DELAY
-    con_puts("Waiting 5 s for testing...");
+    con_puts(hotstr("Waiting 5 s for testing..."));
     udelay(5000000);
     udelay(5000000);
     con_putc('\n');
     con_putc('\n');
     con_flush();
     con_flush();
@@ -143,7 +175,7 @@ void __hot init(void)
 
 
 volatile uint32_t __dram_bss test_dram[8];
 volatile uint32_t __dram_bss test_dram[8];
 
 
-static void __cold __noinline late_init(void)
+static void __hot late_init(void)
 {
 {
     /* This needs to be done as early as possible!!! */
     /* This needs to be done as early as possible!!! */
     con_puts("Running abc_init_memmap: ");
     con_puts("Running abc_init_memmap: ");