Ver Fonte

sdram: fix signal timing that broke dram bss zeroing.

If MINITESTS is enabled, verify the checksum of the initialized part
of SDRAM and the zeroness of the bss.

Add a few other minor fixes and improvements.
H. Peter Anvin há 3 anos atrás
pai
commit
63c8bc2ec8
15 ficheiros alterados com 1416 adições e 657 exclusões
  1. 3 3
      fpga/max80.qpf
  2. BIN
      fpga/output/v1.jic
  3. BIN
      fpga/output/v1.sof
  4. BIN
      fpga/output/v2.jic
  5. BIN
      fpga/output/v2.sof
  6. 21 7
      fpga/sdram.sv
  7. 39 25
      fpga/spirom.sv
  8. 1 1
      rv32/abcdisk.c
  9. 9 9
      rv32/abcio.c
  10. 5 4
      rv32/abcio.h
  11. 5 2
      rv32/abcmem.c
  12. 1287 582
      rv32/boot.mif
  13. 4 0
      rv32/io.h
  14. 8 15
      rv32/romcopy.c
  15. 34 9
      rv32/system.c

+ 3 - 3
fpga/max80.qpf

@@ -19,14 +19,14 @@
 #
 # Quartus Prime
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-# Date created = 03:11:29  December 23, 2021
+# Date created = 20:20:54  December 26, 2021
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "21.1"
-DATE = "03:11:29  December 23, 2021"
+DATE = "20:20:54  December 26, 2021"
 
 # Revisions
 
-PROJECT_REVISION = "v2"
 PROJECT_REVISION = "v1"
+PROJECT_REVISION = "v2"

BIN
fpga/output/v1.jic


BIN
fpga/output/v1.sof


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.sof


+ 21 - 7
fpga/sdram.sv

@@ -583,6 +583,9 @@ module sdram
 		      p1.rstrb[1] <= ~p1.wrack;
 		      state <= st_ready;
 		   end
+		   default: begin
+		      // Do nothing
+		   end
 		 endcase // case (op_cycle)
 	      end // case: st_rd_wr
 
@@ -601,44 +604,55 @@ module sdram
 	    st_wr2:
 	      begin
 		 // Streamable write from flash ROM
+		 // Note: wacc is asserted in the cycle *before* the
+		 // data and address is latched/consumed.
 		 dram_d      <= wd2;
 		 dram_a[10]  <= 1'b0;  // No auto precharge/precharge one bank
 		 dram_a[8:0] <= a2[9:1];
+		 dram_dqm    <= 2'b11;
 
 		 case (op_cycle)
 		   0, 1: begin
-		      wacc2 <= 1'b1;
+		      wacc2    <= 1'b1;
+		      dram_dqm <= 2'b00;
 		   end
 		   2: begin
 		      dram_cmd  <= cmd_wr;
 		      wacc2     <= 1'b1;
-		      wrq2_more <= wrq2[1];
+		      dram_dqm  <= 2'b00;
+		      wrq2_more <= wrq2[1] & (~&a2[9:3]);
 		   end
 		   3: begin
 		      wacc2    <= 1'b1;
+		      dram_dqm <= 2'b00;
 		   end
 		   4: begin
 		      dram_cmd  <= cmd_wr;
+		      dram_dqm  <= 2'b00;
 		      if (wrq2_more & ~(p1.req | do_rfsh))
 			begin
 			   // Burst can continue
 			   wacc2       <= 1'b1;
 			   op_ctr[3:0] <= 4'd1;
 			end
-		   end // case: 4
+		   end
+		   5: begin
+		      dram_dqm <= 2'b00;
+		   end
 		   6: begin
-		      dram_dqm    <= 2'b11; // This shouldn't be necessary?!
+		      // Nothing
 		   end
 		   7: begin
 		      // tWR completed
-		      dram_cmd    <= cmd_pre;
-		      dram_dqm    <= 2'b11;
+		      dram_cmd <= cmd_pre;
 		   end
 		   8: begin
 		      // tRP will be complete before the next ACT
-		      dram_dqm    <= 2'b11;
 		      state <= st_ready;
 		   end
+		   default: begin
+		      // Do nothing
+		   end
 		 endcase // case (op_cycle)
 	      end // case: st_wr2
 	  endcase // case(state)

+ 39 - 25
fpga/spirom.sv

@@ -40,29 +40,35 @@ module spirom (
    reg [23:2] datalen;
    reg [2:0]  cmdlen;
    reg	      go_spi;
+   reg	      is_spi;
    reg	      go_ram;
    reg	      is_ram;
    reg	      spi_dual;
    reg	      spi_more;		// Do not raise CS# after command done
    reg	      ram_done;
    reg	      ram_done_q;
+   reg	      cpu_wr_q;
    reg [31:0] spi_in_shr;	// Input shift register for one-bit input
    wire       spi_active_s;
 
-   always @(negedge rst_n or posedge sys_clk)
+   wire       cpu_wr_w = cpu_valid & cpu_wstrb[0];
+
+   always @(negedge rst_n or posedge ram_clk)
      if (~rst_n)
        begin
 	  ramstart     <= 23'b0;
 	  romcmd       <= 32'b0;
 	  datalen      <= 22'b0;
-	  cmdlen       <= 3'bx;
+	  cmdlen       <= 3'b0;
 	  go_spi       <= 1'b0;
+	  is_spi       <= 1'b0;
 	  go_ram       <= 1'b0;
 	  is_ram       <= 1'b0;
 	  ram_done_q   <= 1'b1;
 	  irq          <= 1'b1;
 	  spi_dual     <= 1'b0;
 	  spi_more     <= 1'b0;
+	  cpu_wr_q     <= 1'b0;
        end
      else
        begin
@@ -76,7 +82,10 @@ module spirom (
 	  if (ram_done_q & ~go_ram & ~spi_active_s & ~go_spi)
 	    irq     <= 1'b1;
 
-	  if (cpu_valid & cpu_wstrb[0])
+	  cpu_wr_q <= cpu_wr_w;
+
+	  // Don't allow writing unless the unit is idle (IRQ = 1)
+	  if (cpu_wr_w & ~cpu_wr_q & irq)
 	    begin
 	       // Only full word accesses supported via DMA!!
 	       case (cpu_addr)
@@ -90,10 +99,12 @@ module spirom (
 		    datalen     <= cpu_wdata[23:2];
 		    cmdlen      <= cpu_wdata[26:24];
 		    go_spi      <= cpu_wdata[26:24] != 3'd0;
+		    is_spi      <= cpu_wdata[26:24] != 3'd0;
 		    spi_dual    <= cpu_wdata[27];
 		    spi_more    <= cpu_wdata[28];
 		    is_ram      <= cpu_wdata[29];
-		    go_ram      <= cpu_wdata[29] & |cpu_wdata[23:2];
+		    go_ram      <= cpu_wdata[29];
+		    irq         <= 1'b0;
 		 end
 		 default: begin
 		    // Do nothing
@@ -104,12 +115,12 @@ module spirom (
 
    always_comb
      case (cpu_addr)
-       3'b000: cpu_rdata = { 7'b0, ramstart, 2'b0 };
-       3'b001: cpu_rdata = romcmd;
-       3'b010: cpu_rdata = { 2'b0, is_ram, spi_more, spi_dual,
-			     cmdlen, datalen,  2'b0 };
-       3'b011: cpu_rdata = { 31'b0, irq };
-       3'b100: cpu_rdata = spi_in_shr;
+       3'b000:  cpu_rdata = { 7'b0, ramstart, 2'b0 };
+       3'b001:  cpu_rdata = romcmd;
+       3'b010:  cpu_rdata = { 2'b0, is_ram, spi_more, spi_dual,
+			      cmdlen, datalen,  2'b0 };
+       3'b011:  cpu_rdata = { 31'b0, irq };
+       3'b100:  cpu_rdata = spi_in_shr;
        default: cpu_rdata = 32'bx;
      endcase // case (cpu_addr)
 
@@ -122,7 +133,6 @@ module spirom (
    wire [11:0]		  wrusedw;
    wire [8:0]		  rdusedw;
    wire [15:0]		  fifo_out;
-   reg			  from_spi;
 
    ddufifo spirom_fifo (
 			.aclr ( ~rst_n ),
@@ -134,7 +144,7 @@ module spirom (
 
 			.rdclk ( ram_clk ),
 			.q ( fifo_out ),
-			.rdreq ( wacc & from_spi ),
+			.rdreq ( wacc & is_spi ),
 			.rdusedw ( rdusedw )
 			);
 
@@ -144,21 +154,24 @@ module spirom (
    // Shuffle fifo_out because SPI brings in data in bigendian bit
    // order within bytes, but the FIFO IP assumes littleendian
    //
-   assign wd[ 7: 6] = {2{from_spi}} & fifo_out[ 1: 0];
-   assign wd[ 5: 4] = {2{from_spi}} & fifo_out[ 3: 2];
-   assign wd[ 3: 2] = {2{from_spi}} & fifo_out[ 5: 4];
-   assign wd[ 1: 0] = {2{from_spi}} & fifo_out[ 7: 6];
+   wire [15:0]		  spi_wd;
 
-   assign wd[15:14] = {2{from_spi}} & fifo_out[ 9: 8];
-   assign wd[13:12] = {2{from_spi}} & fifo_out[11:10];
-   assign wd[11:10] = {2{from_spi}} & fifo_out[13:12];
-   assign wd[ 9: 8] = {2{from_spi}} & fifo_out[15:14];
+   assign spi_wd[ 7: 6] = fifo_out[ 1: 0];
+   assign spi_wd[ 5: 4] = fifo_out[ 3: 2];
+   assign spi_wd[ 3: 2] = fifo_out[ 5: 4];
+   assign spi_wd[ 1: 0] = fifo_out[ 7: 6];
+
+   assign spi_wd[15:14] = fifo_out[ 9: 8];
+   assign spi_wd[13:12] = fifo_out[11:10];
+   assign spi_wd[11:10] = fifo_out[13:12];
+   assign spi_wd[ 9: 8] = fifo_out[15:14];
 
    reg [24:1] waddr_q;
    reg [23:1] ram_data_ctr;
    reg	      wacc_q;
 
    assign waddr = waddr_q;
+   assign wd = is_spi ? spi_wd : 16'h0000;
 
    always @(negedge rst_n or posedge ram_clk)
      if (~rst_n)
@@ -171,11 +184,13 @@ module spirom (
        end
      else
        begin
+	  wacc_q       <= wacc;
+
 	  if (|ram_data_ctr)
 	    begin
 	       ram_done <= 1'b0;
 
-	       if (from_spi)
+	       if (is_spi)
 		 begin
 		    // Reading from SPI ROM
 		    wrq[0] <= rdusedw >=  9'd4; // 4*2 =  8 bytes min available
@@ -188,8 +203,7 @@ module spirom (
 		    wrq[1] <= |ram_data_ctr[23:4];
 		 end
 
-	       wacc_q       <= wacc;
-	       waddr_q      <= waddr_q + wacc_q;
+	       waddr_q      <= waddr_q      + wacc_q;
 	       ram_data_ctr <= ram_data_ctr - wacc_q;
 	    end // if (|ram_data_ctr)
 	  else
@@ -201,7 +215,7 @@ module spirom (
 		 begin
 		    waddr_q      <= { ramstart, 1'b0 };
 		    ram_data_ctr <= { datalen,  1'b0 };
-		    from_spi     <= |cmdlen;
+		    ram_done     <= 1'b0;
 		 end
 	    end
        end // else: !if(~rst_n)
@@ -288,7 +302,7 @@ module spirom (
 			 if ( spi_cmd_ctr == 6'd1 )
 			      spi_mosi_en  <= ~spi_dual;
 
-			 if ( spi_cmd_ctr == 6'd0 )
+			 if ( ~|spi_cmd_ctr )
 			   begin
 			      spi_in_req   <= 1'b1;
 			      spi_data_ctr <= spi_data_ctr - 1'b1;

+ 1 - 1
rv32/abcdisk.c

@@ -681,7 +681,7 @@ static int mount_disk(void)
 #define SYNC_TIME (1*TIMER_HZ)	/* 1 s */
 
 /* Called from the main loop */
-void abcdisk_io_poll(void)
+void __hot abcdisk_io_poll(void)
 {
     static uint32_t last_sync;
     static uint32_t last_timer = -1U;

+ 9 - 9
rv32/abcio.c

@@ -9,9 +9,9 @@
 #include "irq.h"
 #include "abcio.h"
 
-static struct abc_dev *abc_device[65]; /* 65 == post-RST# = always NULL */
-static struct abc_dev *selected_dev;
-static uint8_t abc_devsel = 64;
+static __bss_hot struct abc_dev *abc_device[65]; /* 65 == post-RST# = always NULL */
+static __sbss struct abc_dev *selected_dev;
+static __sdata uint8_t abc_devsel = 64;
 
 #define EVENT_MASK_ALWAYS 0x0082 /* RST# and CS# */
 
@@ -133,8 +133,8 @@ IRQHANDLER(abc)
     ABC_BUSY = what | (event_mask(dev) << 16);
 }
 
-void abc_setup_out_queue(struct abc_dev *dev, void *buf, size_t len,
-			 uint8_t status)
+void __hot abc_setup_out_queue(struct abc_dev *dev, void *buf, size_t len,
+			       uint8_t status)
 {
     irqmask_t irqmask = mask_irq(ABC_IRQ);
 
@@ -146,8 +146,8 @@ void abc_setup_out_queue(struct abc_dev *dev, void *buf, size_t len,
     restore_irq(irqmask, ABC_IRQ);
 }
 
-void abc_setup_inp_queue(struct abc_dev *dev, const void *buf, size_t len,
-			 uint8_t status)
+void __hot abc_setup_inp_queue(struct abc_dev *dev, const void *buf, size_t len,
+			       uint8_t status)
 {
     irqmask_t irqmask = mask_irq(ABC_IRQ);
 
@@ -160,7 +160,7 @@ void abc_setup_inp_queue(struct abc_dev *dev, const void *buf, size_t len,
     restore_irq(irqmask, ABC_IRQ);
 }
 
-void abc_set_inp_default(struct abc_dev *dev, uint8_t val)
+void __hot abc_set_inp_default(struct abc_dev *dev, uint8_t val)
 {
     irqmask_t irqmask = mask_irq(ABC_IRQ);
 
@@ -174,7 +174,7 @@ void abc_set_inp_default(struct abc_dev *dev, uint8_t val)
     restore_irq(irqmask, ABC_IRQ);
 }
 
-void abc_set_inp_status(struct abc_dev *dev, uint8_t val)
+void __hot abc_set_inp_status(struct abc_dev *dev, uint8_t val)
 {
     irqmask_t irqmask = mask_irq(ABC_IRQ);
 

+ 5 - 4
rv32/abcio.h

@@ -8,10 +8,11 @@
 
 struct abc_dev;
 
-#define ABC_CALLBACK(func)					\
-    void func(struct abc_dev *dev __attribute__((unused)),	\
-	      uint8_t data __attribute__((unused)),		\
-	      uint8_t addr __attribute__((unused)))
+/* Called from an interrupt handler, so hot */
+#define ABC_CALLBACK(func)						\
+    void __hot func(struct abc_dev *dev __attribute__((unused)),	\
+		    uint8_t data __attribute__((unused)),		\
+		    uint8_t addr __attribute__((unused)))
 typedef ABC_CALLBACK((*abc_callback_t));
 
 struct abc_dev {

+ 5 - 2
rv32/abcmem.c

@@ -16,8 +16,11 @@ struct abc_mem_init {
 
 extern const char rom_ufddos80[];
 
-static char __dram_bss abc80_nvram[2 << 10]; /* Not really NV... */
-static char __dram_bss abc80_extmem[16 << 10];
+/* Not really NV, but matches NVRAM in some expansions */
+static char __dram_bss __aligned(512) abc80_nvram[2 << 10];
+
+/* 16K external memory to expand to 512K */
+static char __dram_bss __aligned(512) abc80_extmem[16 << 10];
 
 static const struct abc_mem_init mem_init[] = {
     { 0x5000,  2 << 10, RD|WR, abc80_nvram },

+ 1287 - 582
rv32/boot.mif

@@ -10,12 +10,12 @@ CONTENT BEGIN
 0003 : 00100000;
 0004 : C0102473;
 0005 : 00008137;
-0006 : 1880006F;
+0006 : 2880006F;
 0007 : 00000000;
 0008 : 0001210B;
 0009 : 200DF413;
 000A : 00040863;
-000B : 588000EF;
+000B : 650000EF;
 000C : 408D8DB3;
 000D : 060D8063;
 000E : 00000493;
@@ -48,24 +48,24 @@ CONTENT BEGIN
 0029 : 0000250B;
 002A : 0005B00B;
 002B : 00000000;
-002C : 3760006F;
-002D : 3080006F;
-002E : 2F80006F;
-002F : 2EE0006F;
-0030 : 3660006F;
-0031 : 4780006F;
-0032 : 35E0006F;
-0033 : 35A0006F;
-0034 : 3560006F;
-0035 : 4E00006F;
-0036 : 34E0006F;
+002C : 4E20006F;
+002D : 3FE0006F;
+002E : 3EE0006F;
+002F : 4020006F;
+0030 : 4D20006F;
+0031 : 55C0006F;
+0032 : 4CA0006F;
+0033 : 4C60006F;
+0034 : 4C20006F;
+0035 : 5A80006F;
+0036 : 4BA0006F;
 0037 : 00000000;
-0038 : 4101D990;
-0039 : 00000000;
+0038 : 4101D0B0;
+0039 : FFFFFFFF;
 003A : FFFFFFFF;
-003B : FFFFFFFF;
-003C : 000009FC;
-003D : 00000040;
+003B : 00001500;
+003C : 00000040;
+003D : 00000000;
 003E : 00000000;
 003F : 00000000;
 0040 : 00000000;
@@ -108,568 +108,1273 @@ CONTENT BEGIN
 0065 : 00000000;
 0066 : 00000000;
 0067 : 00000000;
-0068 : FFF04293;
-0069 : 0602800B;
-006A : 00000193;
-006B : 0001A18B;
-006C : 10000513;
-006D : 1A000593;
-006E : 00052023;
-006F : 00052223;
-0070 : 00052423;
-0071 : 00052623;
-0072 : 00052823;
-0073 : 00052A23;
-0074 : 00052C23;
-0075 : 00052E23;
-0076 : 02050513;
-0077 : FCB56EE3;
-0078 : 10802023;
-0079 : 0040006F;
-007A : C6061141;
-007B : C226C422;
-007C : 42832AE1;
-007D : 866317A0;
-007E : 70970002;
-007F : 80E74000;
-0080 : 547D6600;
-0081 : 0680008B;
-0082 : 0810878B;
-0083 : 17B04303;
-0084 : 00030663;
-0085 : 40001097;
-0086 : 2D0080E7;
-0087 : 40002097;
-0088 : 660080E7;
-0089 : 0000B7C5;
-008A : 00000697;
-008B : E7468693;
-008C : 897D4690;
-008D : 8E49053E;
-008E : 8682C290;
-008F : 00000697;
-0090 : E6068693;
-0091 : 897D46D0;
-0092 : 8E49051E;
-0093 : 8682C290;
-0094 : 00B567B3;
-0095 : 8B8D8FD1;
-0096 : 04079263;
-0097 : 00C50733;
-0098 : 8A7186AA;
-0099 : 40C007B3;
-009A : 29078067;
-009B : 02000613;
-009C : CEDC4DDC;
-009D : CE9C4D9C;
-009E : CADC49DC;
-009F : CA9C499C;
-00A0 : C6DC45DC;
-00A1 : C69C459C;
-00A2 : C2DC41DC;
-00A3 : C29C419C;
-00A4 : 96B295B2;
-00A5 : FCE6ECE3;
-00A6 : 00018082;
-00A7 : 00C50733;
-00A8 : 00050693;
-00A9 : 0005C783;
-00AA : 00F68023;
-00AB : 06850585;
-00AC : FEE6EAE3;
-00AD : 00008082;
-00AE : C4221141;
-00AF : C04AC226;
-00B0 : 842AC606;
-00B1 : 492544A1;
-00B2 : 01C45793;
-00B3 : 05700513;
-00B4 : 64630412;
-00B5 : 051300F9;
-00B6 : 953E0300;
-00B7 : 2AA114FD;
-00B8 : 40B2F4E5;
-00B9 : 44924422;
-00BA : 01414902;
-00BB : 11018082;
-00BC : CE06C84A;
-00BD : CA26CC22;
-00BE : C452C64E;
-00BF : 2A73892A;
-00C0 : 65053430;
-00C1 : 8F850493;
-00C2 : 8F850513;
-00C3 : 00158413;
-00C4 : 854A2291;
-00C5 : 98792281;
-00C6 : 00848513;
-00C7 : 09932A25;
-00C8 : 854EFFC4;
-00C9 : 85133F51;
-00CA : 222D00F4;
-00CB : FFE45783;
-00CC : FFC45303;
-00CD : 9293491D;
-00CE : 85330107;
-00CF : 3FAD0062;
-00D0 : 01448513;
-00D1 : 85522A01;
-00D2 : 45293F85;
-00D3 : 448120ED;
-00D4 : 02000A13;
-00D5 : 440149A1;
-00D6 : 00940533;
-00D7 : 3FA935F1;
-00D8 : 04634529;
-00D9 : 05130124;
-00DA : 04050200;
-00DB : 15E320E9;
-00DC : 04A1FF34;
-00DD : FF4491E3;
-00DE : 90802083;
-00DF : 0010F393;
-00E0 : FE038CE3;
-00E1 : C01026F3;
-00E2 : 1908B5B7;
-00E3 : 0FF58613;
-00E4 : C0102773;
-00E5 : 40D70833;
-00E6 : FF067CE3;
-00E7 : 878B58FD;
-00E8 : 4E050608;
-00E9 : 81C02623;
-00EA : 2783BFF5;
-00EB : 80821040;
-00EC : 11416505;
-00ED : 91E50513;
-00EE : 3F15C606;
-00EF : 11416505;
-00F0 : 92950513;
-00F1 : 3725C606;
-00F2 : C6061141;
-00F3 : C0102773;
-00F4 : 10E02423;
-00F5 : FD100093;
-00F6 : 0610078B;
-00F7 : 2423429D;
-00F8 : 537D8050;
-00F9 : 0660038B;
-00FA : 0203F513;
-00FB : 4599DD65;
-00FC : 0005A637;
-00FD : 80B02423;
-00FE : E0B60693;
-00FF : 22236805;
-0100 : 051390D0;
-0101 : 20B993D8;
-0102 : 90802883;
-0103 : 0018FE13;
-0104 : FE0E0CE3;
-0105 : 24234E95;
-0106 : 40B281D0;
-0107 : 13170141;
-0108 : 00674000;
-0109 : 4785C163;
-010A : 00A79533;
-010B : FFF54293;
-010C : 0655050B;
-010D : 27838082;
-010E : F2939080;
-010F : 9CE30107;
-0110 : 4329FE02;
-0111 : 00651563;
-0112 : 002343B5;
-0113 : 00239070;
-0114 : 808290A0;
-0115 : 463546A9;
-0116 : 00054783;
-0117 : 8082E391;
-0118 : 27030505;
-0119 : 72939080;
-011A : 9CE30107;
-011B : 9463FE02;
-011C : 002300D7;
-011D : 002390C0;
-011E : BFF990F0;
-011F : 0E402703;
-0120 : 00470693;
-0121 : 0ED02223;
-0122 : C01022F3;
-0123 : 00572023;
-0124 : 98A02023;
-0125 : 0E402303;
-0126 : 3B0008B7;
-0127 : 2D000FB7;
-0128 : 00A32023;
-0129 : 00C02803;
-012A : 00430393;
-012B : 0E702223;
-012C : 01088E33;
-012D : 222395F2;
-012E : 2E8398B0;
-012F : 66330E40;
-0130 : 8F1301F6;
-0131 : 2223004E;
-0132 : A0230FE0;
-0133 : 242300BE;
-0134 : 270398C0;
-0135 : 06930E40;
-0136 : 22230047;
-0137 : C3100ED0;
-0138 : 27038082;
-0139 : 06930E40;
-013A : 22230047;
-013B : 22F30ED0;
-013C : 2023C010;
-013D : 20230057;
-013E : 230398A0;
-013F : 08370E40;
-0140 : E5B32000;
-0141 : 03930105;
-0142 : 22230043;
-0143 : 20230E70;
-0144 : 222300A3;
-0145 : 25039800;
-0146 : 06130E40;
-0147 : 22230045;
-0148 : 20230EC0;
-0149 : 24230005;
-014A : 288398B0;
-014B : 8E130E40;
-014C : 22230048;
-014D : A0230FC0;
-014E : 808200B8;
-014F : 14400293;
-0150 : 0002A703;
-0151 : 00170693;
-0152 : 00D2A023;
-0153 : 4E05C70D;
-0154 : 05C70563;
-0155 : 0E402303;
-0156 : 00430713;
-0157 : 0EE02223;
-0158 : C01026F3;
-0159 : 02000393;
-015A : 00D32023;
-015B : FDF00513;
-015C : 06A3878B;
-015D : 08378082;
-015E : 85B74000;
-015F : 05134000;
-0160 : 889310C0;
-0161 : 0613FE05;
-0162 : 22230008;
-0163 : 86330EA0;
-0164 : 458140C8;
-0165 : 00080513;
-0166 : 8EB7B5D5;
-0167 : 4FB74000;
-0168 : 8F134001;
-0169 : 8793FE0E;
-016A : 85B3990F;
-016B : 851341E7;
-016C : BF05FE0E;
-016D : CE061101;
-016E : CC22CA26;
-016F : C64EC84A;
-0170 : C256C452;
-0171 : B8805903;
-0172 : 16000793;
-0173 : 0007AA83;
-0174 : 01091093;
-0175 : 0100D913;
-0176 : 16000293;
-0177 : 86634481;
-0178 : D483000A;
-0179 : 74B3010A;
-017A : 73130099;
-017B : 0A630FF9;
-017C : 43830803;
-017D : 4583B910;
-017E : 4695B900;
-017F : 0FF3F613;
-0180 : 0FF5F593;
-0181 : 0676EC63;
-0182 : E3634085;
-0183 : 146304C0;
-0184 : 88631006;
-0185 : A703060A;
-0186 : CB1D004A;
-0187 : 000AA783;
-0188 : 00178293;
-0189 : 005AA023;
-018A : 00B78023;
-018B : 01DAC303;
-018C : 014AC383;
-018D : 007376B3;
-018E : 00DA8EA3;
-018F : B8D00AA3;
-0190 : 004AA503;
-0191 : FFF50813;
-0192 : 010AA223;
-0193 : 02081B63;
-0194 : 88334885;
-0195 : 99B300CA;
-0196 : 0B2300C8;
-0197 : FA3300B8;
-0198 : 00630099;
-0199 : 0E13020A;
-019A : 1E930086;
-019B : 8F33002E;
-019C : 2F8301DA;
-019D : 8556000F;
-019E : A0219F82;
-019F : 0263451D;
-01A0 : 759310A6;
-01A1 : C1A91009;
-01A2 : 00CAA603;
-01A3 : 14060763;
-01A4 : FFF60413;
-01A5 : 008AA623;
-01A6 : 14040163;
-01A7 : 01DAC303;
-01A8 : 015AC383;
-01A9 : 007376B3;
-01AA : 00DA8EA3;
-01AB : B8D00AA3;
-01AC : 008AA503;
-01AD : 00150813;
-01AE : 010AA423;
-01AF : 00054883;
-01B0 : 011A8E23;
-01B1 : B9100A23;
-01B2 : 20097993;
-01B3 : 12098B63;
-01B4 : 01DACE03;
-01B5 : B9504A03;
-01B6 : 2004F493;
-01B7 : B9C00AA3;
-01B8 : 0FFA7593;
-01B9 : AE83C491;
-01BA : 460503CA;
-01BB : 9E828556;
-01BC : 00CAAF03;
-01BD : 010AD603;
-01BE : 004AAA83;
-01BF : 01E03FB3;
-01C0 : 008F9593;
-01C1 : 00C5E433;
-01C2 : 015030B3;
-01C3 : 0080E733;
-01C4 : 08276293;
-01C5 : F893A8DD;
-01C6 : FE3703F5;
-01C7 : 9A134000;
-01C8 : 0E930028;
-01C9 : 8F33E40E;
-01CA : 2A83014E;
-01CB : 0A23000F;
-01CC : A0230F10;
-01CD : 06930152;
-01CE : 84630820;
-01CF : AF83020A;
-01D0 : D70300CA;
-01D1 : A783010A;
-01D2 : 3433004A;
-01D3 : 109301F0;
-01D4 : E2B30084;
-01D5 : 333300E0;
-01D6 : 63B300F0;
-01D7 : E6930053;
-01D8 : 15230823;
-01D9 : 4501B8D0;
-01DA : 000A8463;
-01DB : 01CAA503;
-01DC : B8A02A23;
-01DD : F00A87E3;
-01DE : 010AD483;
-01DF : 009974B3;
-01E0 : 0613BDC1;
-01E1 : 08130F40;
-01E2 : 4A830400;
-01E3 : A0230006;
-01E4 : 00230002;
-01E5 : 08930106;
-01E6 : 15230820;
-01E7 : F9B7B910;
-01E8 : 2A234000;
-01E9 : 4401B800;
-01EA : E4098993;
-01EB : 10000A13;
-01EC : 00898E33;
-01ED : 000E2503;
-01EE : 5E83CD01;
-01EF : FF130105;
-01F0 : 0763080E;
-01F1 : 2F83000F;
-01F2 : 461D0405;
-01F3 : 9F8285D6;
-01F4 : 1FE30411;
-01F5 : 4A81FD44;
-01F6 : C703B56D;
-01F7 : 408301FA;
-01F8 : F293B940;
-01F9 : 8E231004;
-01FA : 0A2300EA;
-01FB : F593B8E0;
-01FC : 8BE30FF0;
-01FD : A783EC02;
-01FE : 4601038A;
-01FF : 97828556;
-0200 : 0293B5E1;
-0201 : 95E30820;
-0202 : 9793EE0A;
-0203 : E9330102;
-0204 : 24230127;
-0205 : 40F2B920;
-0206 : 44D24462;
-0207 : 49B24942;
-0208 : 4A924A22;
-0209 : 80826105;
-020A : F713C25D;
-020B : 17930FF5;
-020C : E2B30107;
-020D : 931300E7;
-020E : 76930082;
-020F : 63B30015;
-0210 : 87AA0053;
-0211 : 4805EAC9;
-0212 : 08C87163;
-0213 : 0027F893;
-0214 : 08089F63;
-0215 : F6634EFD;
-0216 : 0F1308CE;
-0217 : 7F93FE06;
-0218 : 8F13FE0F;
-0219 : 87330207;
-021A : A01901EF;
-021B : 020F0F13;
-021C : 0077A023;
-021D : 0077A223;
-021E : 0077A423;
-021F : 0077A623;
-0220 : 0077A823;
-0221 : 0077AA23;
-0222 : 0077AC23;
-0223 : 0077AE23;
-0224 : 87FA86FA;
-0225 : FDE71CE3;
-0226 : 428D8A7D;
-0227 : 02C2F363;
-0228 : FFC60313;
-0229 : FFC37893;
-022A : 00478E93;
-022B : 01D88E33;
-022C : 0E91A011;
-022D : 0076A023;
-022E : 86F687F6;
-022F : FFCE9BE3;
-0230 : 73938A0D;
-0231 : 90630026;
-0232 : 8A050203;
-0233 : 8082E211;
-0234 : 00B78023;
-0235 : 07938082;
-0236 : 00230015;
-0237 : 167D0075;
-0238 : 86BEB79D;
-0239 : 9023BF5D;
-023A : 078900B7;
-023B : 9023BFF9;
-023C : 16790077;
-023D : BFB90789;
-023E : 4F525245;
-023F : 00203A52;
-0240 : 20746120;
-0241 : 20007830;
-0242 : 00783028;
-0243 : 61420A29;
-0244 : 64612064;
-0245 : 73657264;
-0246 : 30203A73;
-0247 : 696D0078;
-0248 : 696C6173;
-0249 : 64656E67;
-024A : 766E6900;
-024B : 64696C61;
-024C : 736E6920;
-024D : 63757274;
-024E : 6E6F6974;
-024F : 2A0A0A00;
-0250 : 48202A2A;
-0251 : 6F6C6C65;
-0252 : 6F57202C;
-0253 : 21646C72;
-0254 : 2A2A2A20;
-0255 : 58414D0A;
-0256 : 66203038;
-0257 : 776D7269;
-0258 : 20657261;
-0259 : 706D6F63;
-025A : 64656C69;
-025B : 3A6E6F20;
-025C : 63654420;
-025D : 20363220;
-025E : 31323032;
-025F : 3A363120;
-0260 : 353A3033;
-0261 : 00000A37;
-0262 : 00000101;
-0263 : 00000000;
-0264 : 00000000;
-0265 : 00000000;
-0266 : 00000000;
-0267 : 00000000;
-0268 : 00000000;
-0269 : 00000000;
-026A : 00000000;
-026B : 00000000;
-026C : 00000000;
-026D : 00000000;
-026E : 00000000;
-026F : 00000000;
-0270 : 00000000;
-0271 : 00000000;
-0272 : 00000105;
-0273 : 00007FBF;
-0274 : 00000000;
-0275 : D3030300;
-0276 : 40003028;
-0277 : 00000000;
-0278 : 4000304C;
-0279 : 00000000;
-027A : 00000000;
-027B : 00000000;
-027C : 4000303A;
-027D : 00000000;
-027E : 00000000;
-027F : 00000000;
-0280 : 00000000;
-0281 : 00000000;
-0282 : 00000000;
-0283 : 00000000;
-0284 : 00000000;
-0285 : 00000000;
-0286 : 00000000;
-0287 : 00000000;
-0288 : 00000000;
-0289 : 00000000;
-028A : 00000000;
-028B : 00000000;
-028C : 00000000;
-028D : 00000000;
-028E : 00000000;
-028F : 00000000;
-0290 : 00000000;
-0291 : 00000000;
-0292 : 00000000;
-0293 : 00000000;
-0294 : 00000000;
-0295 : 00000000;
-0296 : 00000000;
-0297 : 6362612F;
-0298 : 6B736964;
-0299 : 3030382E;
-029A : 002F;
-[029B..1FFF] : 00;
+0068 : 00000000;
+0069 : 00000000;
+006A : 00000000;
+006B : 00000000;
+006C : 00000000;
+006D : 00000000;
+006E : 00000000;
+006F : 00000000;
+0070 : 00000000;
+0071 : 00000000;
+0072 : 00000000;
+0073 : 00000000;
+0074 : 00000000;
+0075 : 00000000;
+0076 : 00000000;
+0077 : 00000000;
+0078 : 00000000;
+0079 : 00000000;
+007A : 00000000;
+007B : 00000000;
+007C : 00000000;
+007D : 00000000;
+007E : 00000000;
+007F : 00000000;
+0080 : 00000000;
+0081 : 00000000;
+0082 : 00000000;
+0083 : 00000000;
+0084 : 00000000;
+0085 : 00000000;
+0086 : 00000000;
+0087 : 00000000;
+0088 : 00000000;
+0089 : 00000000;
+008A : 00000000;
+008B : 00000000;
+008C : 00000000;
+008D : 00000000;
+008E : 00000000;
+008F : 00000000;
+0090 : 00000000;
+0091 : 00000000;
+0092 : 00000000;
+0093 : 00000000;
+0094 : 00000000;
+0095 : 00000000;
+0096 : 00000000;
+0097 : 00000000;
+0098 : 00000000;
+0099 : 00000000;
+009A : 00000000;
+009B : 00000000;
+009C : 00000000;
+009D : 00000000;
+009E : 00000000;
+009F : 00000000;
+00A0 : 00000000;
+00A1 : 00000000;
+00A2 : 00000000;
+00A3 : 00000000;
+00A4 : 00000000;
+00A5 : 00000000;
+00A6 : 00000000;
+00A7 : 00000000;
+00A8 : FFF04293;
+00A9 : 0602800B;
+00AA : 00000193;
+00AB : 0001A18B;
+00AC : 10000513;
+00AD : 2A000593;
+00AE : 00052023;
+00AF : 00052223;
+00B0 : 00052423;
+00B1 : 00052623;
+00B2 : 00052823;
+00B3 : 00052A23;
+00B4 : 00052C23;
+00B5 : 00052E23;
+00B6 : 02050513;
+00B7 : FCB56EE3;
+00B8 : 10802023;
+00B9 : 0040006F;
+00BA : C6061141;
+00BB : C226C422;
+00BC : 428322C5;
+00BD : 86631860;
+00BE : 70970002;
+00BF : 80E74000;
+00C0 : 547DB740;
+00C1 : 0680008B;
+00C2 : 0810878B;
+00C3 : 18704303;
+00C4 : 00030663;
+00C5 : 40001097;
+00C6 : 1D0080E7;
+00C7 : 71C000EF;
+00C8 : 0000B7D5;
+00C9 : 00000697;
+00CA : D7868693;
+00CB : 897D4690;
+00CC : 8E49053E;
+00CD : 8682C290;
+00CE : 00000697;
+00CF : D6468693;
+00D0 : 897D46D0;
+00D1 : 8E49051E;
+00D2 : 8682C290;
+00D3 : 00B567B3;
+00D4 : 8B8D8FD1;
+00D5 : 04079263;
+00D6 : 00C50733;
+00D7 : 8A7186AA;
+00D8 : 40C007B3;
+00D9 : 38C78067;
+00DA : 02000613;
+00DB : CEDC4DDC;
+00DC : CE9C4D9C;
+00DD : CADC49DC;
+00DE : CA9C499C;
+00DF : C6DC45DC;
+00E0 : C69C459C;
+00E1 : C2DC41DC;
+00E2 : C29C419C;
+00E3 : 96B295B2;
+00E4 : FCE6ECE3;
+00E5 : 00018082;
+00E6 : 00C50733;
+00E7 : 00050693;
+00E8 : 0005C783;
+00E9 : 00F68023;
+00EA : 06850585;
+00EB : FEE6EAE3;
+00EC : 00008082;
+00ED : C4221141;
+00EE : C04AC226;
+00EF : 842AC606;
+00F0 : 492544A1;
+00F1 : 01C45793;
+00F2 : 05700513;
+00F3 : 64630412;
+00F4 : 051300F9;
+00F5 : 953E0300;
+00F6 : 22E114FD;
+00F7 : 40B2F4E5;
+00F8 : 44924422;
+00F9 : 01414902;
+00FA : 11018082;
+00FB : CE06C84A;
+00FC : CA26CC22;
+00FD : C452C64E;
+00FE : 2A73892A;
+00FF : 65053430;
+0100 : 3FC50493;
+0101 : 3FC50513;
+0102 : 00158413;
+0103 : 854A2A55;
+0104 : 98792A45;
+0105 : 00848513;
+0106 : 09932265;
+0107 : 854EFFC4;
+0108 : 85133F51;
+0109 : 2A6900F4;
+010A : FFE45783;
+010B : FFC45303;
+010C : 9293491D;
+010D : 85330107;
+010E : 3FAD0062;
+010F : 01448513;
+0110 : 85522241;
+0111 : 45293F85;
+0112 : 44812AA9;
+0113 : 02000A13;
+0114 : 440149A1;
+0115 : 00940533;
+0116 : 3FA935F1;
+0117 : 04634529;
+0118 : 05130124;
+0119 : 04050200;
+011A : 15E32A2D;
+011B : 04A1FF34;
+011C : FF4491E3;
+011D : 90802083;
+011E : 0010F393;
+011F : FE038CE3;
+0120 : C01026F3;
+0121 : 1908B5B7;
+0122 : 0FF58613;
+0123 : C0102773;
+0124 : 40D70833;
+0125 : FF067CE3;
+0126 : 878B58FD;
+0127 : 4E050608;
+0128 : 81C02623;
+0129 : 6505BFF5;
+012A : 05131141;
+012B : C6064225;
+012C : 65053F2D;
+012D : 05131141;
+012E : C60642D5;
+012F : 0293373D;
+0130 : A7031040;
+0131 : 03130002;
+0132 : A0230017;
+0133 : 80820062;
+0134 : A7B71141;
+0135 : C6060005;
+0136 : 8093C422;
+0137 : 2223E0B7;
+0138 : 27739010;
+0139 : 2423C010;
+013A : 031310E0;
+013B : 078BFD10;
+013C : 439D0660;
+013D : 80702423;
+013E : 050B547D;
+013F : 75930680;
+0140 : DDE50205;
+0141 : 40000637;
+0142 : 400076B7;
+0143 : 06134401;
+0144 : 85130006;
+0145 : 64636206;
+0146 : 783706A6;
+0147 : 05134000;
+0148 : 2879F858;
+0149 : 35798522;
+014A : 28A54529;
+014B : 400078B7;
+014C : 40013E37;
+014D : 84134381;
+014E : 02936208;
+014F : 64630B0E;
+0150 : 87630454;
+0151 : 7EB70003;
+0152 : 85134000;
+0153 : 288DF9BE;
+0154 : 6F854F19;
+0155 : 81E02423;
+0156 : 441F8513;
+0157 : 27832095;
+0158 : F0939080;
+0159 : 8CE30017;
+015A : 4715FE00;
+015B : 80E02423;
+015C : 40B24422;
+015D : 13170141;
+015E : 00674000;
+015F : 420CABE3;
+0160 : 942E0611;
+0161 : 2303BF49;
+0162 : 04110004;
+0163 : 0063E3B3;
+0164 : 4785B77D;
+0165 : 00A79533;
+0166 : FFF54293;
+0167 : 0655050B;
+0168 : 27838082;
+0169 : F2939080;
+016A : 9CE30107;
+016B : 4329FE02;
+016C : 00651563;
+016D : 002343B5;
+016E : 00239070;
+016F : 808290A0;
+0170 : 463546A9;
+0171 : 00054783;
+0172 : 8082E391;
+0173 : 27030505;
+0174 : 72939080;
+0175 : 9CE30107;
+0176 : 9463FE02;
+0177 : 002300D7;
+0178 : 002390C0;
+0179 : BFF990F0;
+017A : 00C02703;
+017B : 3B0002B7;
+017C : 98A02023;
+017D : 00E28333;
+017E : 00B303B3;
+017F : 2D000537;
+0180 : 98702223;
+0181 : 24238E49;
+0182 : 808298C0;
+0183 : 98A02023;
+0184 : 200007B7;
+0185 : 98002223;
+0186 : 24238DDD;
+0187 : 808298B0;
+0188 : 10C00293;
+0189 : 0002A703;
+018A : 00170693;
+018B : 00D2A023;
+018C : 4585CB19;
+018D : 02B70763;
+018E : 02000F13;
+018F : FDF00F93;
+0190 : 07FF078B;
+0191 : 05378082;
+0192 : 73374000;
+0193 : 06134000;
+0194 : 03930005;
+0195 : 86336203;
+0196 : 458140C3;
+0197 : 00050513;
+0198 : 7837B761;
+0199 : 3E374000;
+019A : 08934001;
+019B : 0E936208;
+019C : 85B30B0E;
+019D : 0513411E;
+019E : BF496208;
+019F : CE061101;
+01A0 : CC22CA26;
+01A1 : C64EC84A;
+01A2 : C256C452;
+01A3 : B8805903;
+01A4 : 16C00793;
+01A5 : 0007AA83;
+01A6 : 01091093;
+01A7 : 0100D913;
+01A8 : 16C00293;
+01A9 : 86634481;
+01AA : D483000A;
+01AB : 74B3010A;
+01AC : 73130099;
+01AD : 0A630FF9;
+01AE : 43830803;
+01AF : 4583B910;
+01B0 : 4695B900;
+01B1 : 0FF3F613;
+01B2 : 0FF5F593;
+01B3 : 0676EC63;
+01B4 : E3634F85;
+01B5 : 146304CF;
+01B6 : 88631006;
+01B7 : A083060A;
+01B8 : 8B63004A;
+01B9 : A7830200;
+01BA : 8713000A;
+01BB : A0230017;
+01BC : 802300EA;
+01BD : C28300B7;
+01BE : C30301DA;
+01BF : F3B3014A;
+01C0 : 8EA30062;
+01C1 : 0AA3007A;
+01C2 : A683B870;
+01C3 : 8513004A;
+01C4 : A223FFF6;
+01C5 : E91500AA;
+01C6 : 85334805;
+01C7 : 19B300CA;
+01C8 : 0B2300C8;
+01C9 : FA3300B5;
+01CA : 00630099;
+01CB : 0893020A;
+01CC : 9E130086;
+01CD : 8EB30028;
+01CE : AF0301CA;
+01CF : 8556000E;
+01D0 : A0219F02;
+01D1 : 0063451D;
+01D2 : 759310A6;
+01D3 : C1A91009;
+01D4 : 00CAA603;
+01D5 : 14060163;
+01D6 : FFF60413;
+01D7 : 008AA623;
+01D8 : 12040B63;
+01D9 : 01DAC283;
+01DA : 015AC303;
+01DB : 0062F3B3;
+01DC : 007A8EA3;
+01DD : B8700AA3;
+01DE : 008AA683;
+01DF : 00168513;
+01E0 : 00AAA423;
+01E1 : 0006C803;
+01E2 : 010A8E23;
+01E3 : B9000A23;
+01E4 : 20097993;
+01E5 : 12098563;
+01E6 : 01DAC883;
+01E7 : B9504A03;
+01E8 : 2004F493;
+01E9 : B9100AA3;
+01EA : 0FFA7593;
+01EB : AE03C491;
+01EC : 460503CA;
+01ED : 9E028556;
+01EE : 00CAAE83;
+01EF : 010AD603;
+01F0 : 004AAA83;
+01F1 : 01D03F33;
+01F2 : 008F1593;
+01F3 : 00C5E433;
+01F4 : 01503FB3;
+01F5 : 008FE0B3;
+01F6 : 0820E713;
+01F7 : F813A0ED;
+01F8 : 1A1303F5;
+01F9 : 0E130028;
+01FA : 0EB319C0;
+01FB : AA83014E;
+01FC : 0823000E;
+01FD : A0230F00;
+01FE : 03930152;
+01FF : 84630820;
+0200 : AF03020A;
+0201 : D08300CA;
+0202 : A783010A;
+0203 : 3433004A;
+0204 : 1F9301E0;
+0205 : E7330084;
+0206 : 32B3001F;
+0207 : E33300F0;
+0208 : 639300E2;
+0209 : 15230823;
+020A : 4681B870;
+020B : 000A8463;
+020C : 01CAA683;
+020D : B8D02A23;
+020E : F00A89E3;
+020F : 010AD483;
+0210 : 009974B3;
+0211 : 0613BDD1;
+0212 : 4A830400;
+0213 : A0230F00;
+0214 : 08230002;
+0215 : 08130EC0;
+0216 : 15230820;
+0217 : 2A23B900;
+0218 : 4401B800;
+0219 : 19C00993;
+021A : 10000A13;
+021B : 008988B3;
+021C : 0008A503;
+021D : 5E03CD01;
+021E : 7E930105;
+021F : 8763080E;
+0220 : 2F03000E;
+0221 : 461D0405;
+0222 : 9F0285D6;
+0223 : 1FE30411;
+0224 : 4A81FD44;
+0225 : C083BD5D;
+0226 : 4F8301FA;
+0227 : F713B940;
+0228 : 8E231004;
+0229 : 0A23001A;
+022A : F593B810;
+022B : 01E30FFF;
+022C : A783EE07;
+022D : 4601038A;
+022E : 97828556;
+022F : 0713BDD1;
+0230 : 9BE30820;
+0231 : 1793EE0A;
+0232 : E9330107;
+0233 : 24230127;
+0234 : 40F2B920;
+0235 : 44D24462;
+0236 : 49B24942;
+0237 : 4A924A22;
+0238 : 80826105;
+0239 : 20000793;
+023A : DFF00713;
+023B : 06E7828B;
+023C : 16C02383;
+023D : C150C10C;
+023E : 00D50EA3;
+023F : 02751663;
+0240 : 5E03454C;
+0241 : 36330105;
+0242 : 36B300C0;
+0243 : 981300B0;
+0244 : 68B30086;
+0245 : EEB30106;
+0246 : EF1301C8;
+0247 : 1523082E;
+0248 : 4D48B9E0;
+0249 : B8A02A23;
+024A : 2002FF93;
+024B : DFF00793;
+024C : 06FF878B;
+024D : 07938082;
+024E : 07132000;
+024F : 828BDFF0;
+0250 : 831306E7;
+0251 : C5500015;
+0252 : 00652423;
+0253 : 0005C383;
+0254 : 00D50EA3;
+0255 : 16C02683;
+0256 : 00750E23;
+0257 : 02D51763;
+0258 : 00452803;
+0259 : 01055F03;
+025A : 00C03633;
+025B : 010038B3;
+025C : 00861E13;
+025D : 01C8EEB3;
+025E : 01EEEFB3;
+025F : 082FE793;
+0260 : B8F01523;
+0261 : 2A234D48;
+0262 : F293B8A0;
+0263 : 07132002;
+0264 : 878BDFF0;
+0265 : 808206E2;
+0266 : 20000793;
+0267 : DFF00713;
+0268 : 06E7828B;
+0269 : 00C52303;
+026A : 00B50FA3;
+026B : 00031A63;
+026C : 16C02603;
+026D : 00B50E23;
+026E : 00A61463;
+026F : B8B00A23;
+0270 : 2002F513;
+0271 : DFF00593;
+0272 : 06B5078B;
+0273 : 07938082;
+0274 : 07132000;
+0275 : 828BDFF0;
+0276 : 238306E7;
+0277 : 0EA316C0;
+0278 : 946300B5;
+0279 : 0AA300A3;
+027A : F513B8B0;
+027B : 05932002;
+027C : 078BDFF0;
+027D : 808206B5;
+027E : 09400793;
+027F : 00F51823;
+0280 : 00050EA3;
+0281 : B8000AA3;
+0282 : 04F54283;
+0283 : 040506A3;
+0284 : 0012E313;
+0285 : 046507A3;
+0286 : BFF98082;
+0287 : 04F54783;
+0288 : 0027E293;
+0289 : 045507A3;
+028A : 47838082;
+028B : E29304F5;
+028C : 07A30047;
+028D : 80820455;
+028E : C7CE7115;
+028F : CBA6CF86;
+0290 : CDA2C1DA;
+0291 : C5D2C9CA;
+0292 : DF5EC3D6;
+0293 : DB66DD62;
+0294 : D76ED96A;
+0295 : 0E400093;
+0296 : 10402B03;
+0297 : 0000A283;
+0298 : B8002903;
+0299 : 00597493;
+029A : 29628F63;
+029B : 43836305;
+029C : 0B9348C3;
+029D : F4130E40;
+029E : C0710013;
+029F : 40001097;
+02A0 : 244080E7;
+02A1 : 00157893;
+02A2 : 00088563;
+02A3 : 4A014A85;
+02A4 : 0A93A8C9;
+02A5 : AA038080;
+02A6 : 7CB7000A;
+02A7 : 3D374000;
+02A8 : 6C134001;
+02A9 : A023002A;
+02AA : 4605018A;
+02AB : EF1C8593;
+02AC : E60D0513;
+02AD : 40004097;
+02AE : 0A0080E7;
+02AF : 77B7C105;
+02B0 : 85134000;
+02B1 : 00972EC7;
+02B2 : 80E74000;
+02B3 : A98373E0;
+02B4 : F293000A;
+02B5 : A023FFD9;
+02B6 : BF4D005A;
+02B7 : 100C0850;
+02B8 : EF1C8513;
+02B9 : 02010023;
+02BA : 5097CA02;
+02BB : 80E74000;
+02BC : 4652EF00;
+02BD : 40007DB7;
+02BE : 8513100C;
+02BF : 0097305D;
+02C0 : 80E74000;
+02C1 : 08707060;
+02C2 : 8513082C;
+02C3 : CC02EF1C;
+02C4 : 40005097;
+02C5 : D62080E7;
+02C6 : 45E24E72;
+02C7 : 40007FB7;
+02C8 : 00AE5E83;
+02C9 : 01CE2F03;
+02CA : 333F8513;
+02CB : 009E9693;
+02CC : FFEF0613;
+02CD : 40000097;
+02CE : 6D0080E7;
+02CF : 1097BF81;
+02D0 : 80E74000;
+02D1 : 89051300;
+02D2 : 0613F131;
+02D3 : 42181700;
+02D4 : 083346FD;
+02D5 : F66340EB;
+02D6 : 20231B06;
+02D7 : 4A810166;
+02D8 : A0234A05;
+02D9 : 0093016B;
+02DA : AB830E80;
+02DB : 73130000;
+02DC : C21A0019;
+02DD : 8163C002;
+02DE : A023069B;
+02DF : 03930090;
+02E0 : A4038080;
+02E1 : 75930003;
+02E2 : 96130019;
+02E3 : 75130025;
+02E4 : 6733FFB4;
+02E5 : 783700A6;
+02E6 : A0234000;
+02E7 : 051300E3;
+02E8 : 79133658;
+02E9 : 3C290049;
+02EA : 16090263;
+02EB : 400078B7;
+02EC : 2C888513;
+02ED : 4A923431;
+02EE : 140A9F63;
+02EF : 40007A37;
+02F0 : 2E0A0513;
+02F1 : 009BC4B3;
+02F2 : 0024DC93;
+02F3 : 3ACD4D05;
+02F4 : 001CFA93;
+02F5 : 4A05C06A;
+02F6 : CDB76E85;
+02F7 : 6E054000;
+02F8 : 560E8F13;
+02F9 : 000D8D13;
+02FA : 4B014B81;
+02FB : 000D8493;
+02FC : 48CE0C13;
+02FD : 4F83C47A;
+02FE : 836304ED;
+02FF : 8363120A;
+0300 : 846A120F;
+0301 : 4DA14901;
+0302 : 2AE44683;
+0303 : 0016FE13;
+0304 : 040E0463;
+0305 : 001C4E83;
+0306 : 001EFF13;
+0307 : 000F1863;
+0308 : 05040513;
+0309 : 40005097;
+030A : 8B4080E7;
+030B : 2AE44F83;
+030C : FFEFF793;
+030D : 2AF40723;
+030E : 04CD4283;
+030F : FFF28093;
+0310 : 041D0623;
+0311 : 2AF44303;
+0312 : 00437393;
+0313 : 00039663;
+0314 : FFE37613;
+0315 : 2AC40723;
+0316 : 04130905;
+0317 : 15E32E84;
+0318 : 0723FBB9;
+0319 : 4502040D;
+031A : 856AC511;
+031B : 40002097;
+031C : A96080E7;
+031D : 49814592;
+031E : 0C93CD9D;
+031F : 0813DFF0;
+0320 : 070B2000;
+0321 : 67090798;
+0322 : B9070893;
+0323 : 031B0E33;
+0324 : 01C48DB3;
+0325 : 04FDC983;
+0326 : 040D87A3;
+0327 : 0FF9F993;
+0328 : 0790068B;
+0329 : 0069F693;
+032A : 22068963;
+032B : 2097856A;
+032C : 80E74000;
+032D : 4603A540;
+032E : 1B6304ED;
+032F : 68894606;
+0330 : B9088E13;
+0331 : 46910B05;
+0332 : 9BF29D72;
+0333 : F2DB15E3;
+0334 : 000A0A63;
+0335 : 80800493;
+0336 : 0004AA03;
+0337 : FFDA7A93;
+0338 : 0154A023;
+0339 : 446E40FE;
+033A : 494E44DE;
+033B : 4A2E49BE;
+033C : 4B0E4A9E;
+033D : 5C6A5BFA;
+033E : 5D4A5CDA;
+033F : 612D5DBA;
+0340 : 4A818082;
+0341 : 4A81B369;
+0342 : BDB14A01;
+0343 : 400076B7;
+0344 : 2CF68513;
+0345 : 7C37B545;
+0346 : 05134000;
+0347 : B55D2D5C;
+0348 : F40F93E3;
+0349 : 000C4783;
+034A : 0017F993;
+034B : F2099DE3;
+034C : B8002283;
+034D : 04136305;
+034E : F09356B3;
+034F : 95630042;
+0350 : 43A20000;
+0351 : 00A38413;
+0352 : 03000513;
+0353 : 02F00593;
+0354 : 00A40023;
+0355 : 00B400A3;
+0356 : 00040123;
+0357 : 04138CEA;
+0358 : 09132A8D;
+0359 : 26030300;
+035A : 7837044D;
+035B : 874A4000;
+035C : 00860693;
+035D : 06134591;
+035E : 85223748;
+035F : 40005097;
+0360 : 548080E7;
+0361 : 40007737;
+0362 : DA840D93;
+0363 : 47070993;
+0364 : 0009A683;
+0365 : 12068463;
+0366 : 400078B7;
+0367 : 86138722;
+0368 : 059337C8;
+0369 : 10080400;
+036A : 40005097;
+036B : 51C080E7;
+036C : 2AECC683;
+036D : 0016FE13;
+036E : 020E0963;
+036F : 001C4E83;
+0370 : 001EFF13;
+0371 : 000F1763;
+0372 : 4097856E;
+0373 : 80E74000;
+0374 : CF8370E0;
+0375 : F7932AEC;
+0376 : 8723FFEF;
+0377 : 42832AFC;
+0378 : 809304CD;
+0379 : 0623FFF2;
+037A : C303041D;
+037B : 73932AFC;
+037C : 92630043;
+037D : 78930E03;
+037E : 87230FE3;
+037F : F5132B1C;
+0380 : 46050028;
+0381 : 460DE111;
+0382 : 856E100C;
+0383 : 4097C632;
+0384 : 80E74000;
+0385 : 4629DA60;
+0386 : 2AECC583;
+0387 : 00C51963;
+0388 : 77134832;
+0389 : C7010028;
+038A : 0025E893;
+038B : 4885B7F9;
+038C : 4891C111;
+038D : 0115E6B3;
+038E : 2ADC8723;
+038F : 0016FE13;
+0390 : 080E0B63;
+0391 : 400079B7;
+0392 : 85A21010;
+0393 : 38198513;
+0394 : 40000097;
+0395 : 3B4080E7;
+0396 : 02200E93;
+0397 : 00840F13;
+0398 : 2BDCA823;
+0399 : 0BECA023;
+039A : 567D55FD;
+039B : 4097856E;
+039C : 80E74000;
+039D : C91168C0;
+039E : 40007DB7;
+039F : 851385A2;
+03A0 : 0097395D;
+03A1 : 80E74000;
+03A2 : 23033820;
+03A3 : AF83044D;
+03A4 : A283064C;
+03A5 : 5383060C;
+03A6 : 97930023;
+03A7 : D093018F;
+03A8 : E6330082;
+03A9 : F3630017;
+03AA : 861E00C3;
+03AB : 2ACC9623;
+03AC : 04CD4503;
+03AD : 00150593;
+03AE : 04BD0623;
+03AF : 08130905;
+03B0 : 04130380;
+03B1 : 8C932E84;
+03B2 : 1EE32E8C;
+03B3 : 4705E909;
+03B4 : 04ED0723;
+03B5 : 0991BB49;
+03B6 : FE93BD65;
+03B7 : 8CE30019;
+03B8 : 4F03DC0E;
+03B9 : 4603049D;
+03BA : 6285048D;
+03BB : 006F5F93;
+03BC : 79028093;
+03BD : 008F9793;
+03BE : 001B8333;
+03BF : 006783B3;
+03C0 : 00167913;
+03C1 : 007F7C93;
+03C2 : 00748433;
+03C3 : 04090063;
+03C4 : 2E800513;
+03C5 : 02AC8DB3;
+03C6 : 01CD85B3;
+03C7 : 00B48833;
+03C8 : 2AE84703;
+03C9 : 00177893;
+03CA : 04089863;
+03CB : F8000393;
+03CC : 047D06A3;
+03CD : 08000593;
+03CE : 3CB9856A;
+03CF : 040D0423;
+03D0 : 048D4603;
+03D1 : FFE67513;
+03D2 : 04AD0423;
+03D3 : 048D4D83;
+03D4 : 002DF593;
+03D5 : 5303C5C5;
+03D6 : F093010D;
+03D7 : 0423FFDD;
+03D8 : 6393041D;
+03D9 : 18231003;
+03DA : 4685007D;
+03DB : 10000613;
+03DC : 856A85A2;
+03DD : B38132C9;
+03DE : 1097856A;
+03DF : 80E74000;
+03E0 : E90171C0;
+03E1 : 02100313;
+03E2 : 046D06A3;
+03E3 : 02100593;
+03E4 : 0E13B765;
+03E5 : D0028080;
+03E6 : 000E2683;
+03E7 : 856A4595;
+03E8 : 0026EE93;
+03E9 : 01DE2023;
+03EA : 8F13341D;
+03EB : 8FB3050B;
+03EC : 856A01ED;
+03ED : 01F48933;
+03EE : 40001097;
+03EF : 6AC080E7;
+03F0 : 00851593;
+03F1 : 854A4601;
+03F2 : 40004097;
+03F3 : 532080E7;
+03F4 : 40A1C511;
+03F5 : 041D06A3;
+03F6 : BFB945A1;
+03F7 : 06131014;
+03F8 : 85A21000;
+03F9 : 4097854A;
+03FA : 80E74000;
+03FB : F175EFE0;
+03FC : 02935782;
+03FD : 9EE31000;
+03FE : B799FC57;
+03FF : 004DF813;
+0400 : 02080563;
+0401 : 010D5783;
+0402 : FFBDF913;
+0403 : 052D0423;
+0404 : 0017E293;
+0405 : 005D1823;
+0406 : 04100693;
+0407 : 10000613;
+0408 : 856A85A2;
+0409 : 8C1FF0EF;
+040A : F713B179;
+040B : C721008D;
+040C : 08936E09;
+040D : 06932E80;
+040E : 8CB3B90E;
+040F : 0EB3031C;
+0410 : 8F3302DB;
+0411 : 8DB301DC;
+0412 : CF8301E4;
+0413 : F9132AED;
+0414 : 1E63001F;
+0415 : 06930209;
+0416 : 06A3F800;
+0417 : 059304DD;
+0418 : 856A0800;
+0419 : 04233A15;
+041A : 4E83040D;
+041B : FF13048D;
+041C : 0423FF7E;
+041D : 4D8305ED;
+041E : 856A048D;
+041F : 00FDFF93;
+0420 : 05FD0423;
+0421 : 40001097;
+0422 : 64A080E7;
+0423 : F793B12D;
+0424 : CB81002F;
+0425 : 04000E13;
+0426 : 05CD06A3;
+0427 : 04000593;
+0428 : 856AB7C9;
+0429 : 40001097;
+042A : 5F2080E7;
+042B : 0893E901;
+042C : 06A30210;
+042D : 0593051D;
+042E : B7650210;
+042F : 0293D002;
+0430 : A0838080;
+0431 : 83930002;
+0432 : 8633050B;
+0433 : E313007C;
+0434 : A0230020;
+0435 : 856A0062;
+0436 : 00C48CB3;
+0437 : 40001097;
+0438 : 588080E7;
+0439 : 00851593;
+043A : 85664601;
+043B : 40004097;
+043C : 40E080E7;
+043D : 0713C901;
+043E : 06A30200;
+043F : 059304ED;
+0440 : B7850200;
+0441 : 2AEDC503;
+0442 : 06131014;
+0443 : 65931000;
+0444 : 87230085;
+0445 : 85662ABD;
+0446 : 409785A2;
+0447 : 80E74000;
+0448 : F971FB80;
+0449 : 08135402;
+044A : 16E31000;
+044B : BF35FD04;
+044C : 000A1663;
+044D : 0049F993;
+044E : B80983E3;
+044F : 4D81846A;
+0450 : 45034CA1;
+0451 : 75932AE4;
+0452 : CD890085;
+0453 : 05040513;
+0454 : 40004097;
+0455 : 1D0080E7;
+0456 : 2AE44803;
+0457 : FF787713;
+0458 : 2AE40723;
+0459 : 04130D85;
+045A : 9CE32E84;
+045B : BE81FD9D;
+045C : 01D54783;
+045D : 0047E293;
+045E : 00550EA3;
+045F : B8500AA3;
+0460 : 47838082;
+0461 : E29301D5;
+0462 : 0EA30027;
+0463 : 0AA30055;
+0464 : 8082B850;
+0465 : D4227179;
+0466 : F793D606;
+0467 : 842E0045;
+0468 : 4083CFCD;
+0469 : 031301D5;
+046A : F2931910;
+046B : 0EA30FB0;
+046C : 0AA30055;
+046D : 4383B850;
+046E : 85B70073;
+046F : 8893AE14;
+0470 : 0613AE15;
+0471 : 08331470;
+0472 : 47030276;
+0473 : 4F030063;
+0474 : 45830053;
+0475 : 50930033;
+0476 : 7F930017;
+0477 : 979303FF;
+0478 : F293005F;
+0479 : E6B301F0;
+047A : 47830057;
+047B : BE330023;
+047C : 43830313;
+047D : 43030043;
+047E : F0930013;
+047F : F61300F7;
+0480 : 929301F3;
+0481 : 073E0150;
+0482 : CE02CC02;
+0483 : 0EB34785;
+0484 : 181301C8;
+0485 : FE1300B6;
+0486 : E8B301F5;
+0487 : 1F130106;
+0488 : 0EC6010E;
+0489 : 01E8EFB3;
+048A : 01430693;
+048B : 011ED893;
+048C : 005FE3B3;
+048D : 011765B3;
+048E : 01969613;
+048F : 00C3E833;
+0490 : 01059E13;
+0491 : 1C23CA42;
+0492 : 5F1300B1;
+0493 : 1223010E;
+0494 : 202389E0;
+0495 : 03A38900;
+0496 : 709318F0;
+0497 : 8D630404;
+0498 : 42830000;
+0499 : 462101D5;
+049A : 0402E693;
+049B : 19100593;
+049C : F0EFC62A;
+049D : 4532E72F;
+049E : 53130462;
+049F : 52634184;
+04A0 : 46830A03;
+04A1 : 071301D5;
+04A2 : FE931890;
+04A3 : 0EA30FD6;
+04A4 : 0AA301D5;
+04A5 : 2883B9D0;
+04A6 : 26038800;
+04A7 : 48518840;
+04A8 : 0158DF93;
+04A9 : 01070023;
+04AA : F793CC32;
+04AB : D09300FF;
+04AC : 58130108;
+04AD : 064600F6;
+04AE : 00F70123;
+04AF : 01F0F293;
+04B0 : 00C807B7;
+04B1 : 01165093;
+04B2 : 005701A3;
+04B3 : 0217B2B3;
+04B4 : 0198DE13;
+04B5 : 0F13CA46;
+04B6 : D393FECE;
+04B7 : D31300B8;
+04B8 : F8930058;
+04B9 : 00A301F8;
+04BA : 9E1301E7;
+04BB : 7F130018;
+04BC : F4130018;
+04BD : 769301F3;
+04BE : 6FB303F3;
+04BF : 02A301EE;
+04C0 : 022300D7;
+04C1 : 03230087;
+04C2 : 03A301F7;
+04C3 : 54220057;
+04C4 : E69350B2;
+04C5 : 4621080E;
+04C6 : 18900593;
+04C7 : F06F6145;
+04C8 : 50B2E18F;
+04C9 : 61455422;
+04CA : C25D8082;
+04CB : 0FF5F713;
+04CC : 01071793;
+04CD : 00E7E2B3;
+04CE : 00829313;
+04CF : 00157693;
+04D0 : 005363B3;
+04D1 : EAC987AA;
+04D2 : 71634805;
+04D3 : F89308C8;
+04D4 : 9F630027;
+04D5 : 4EFD0808;
+04D6 : 08CEF663;
+04D7 : FE060F13;
+04D8 : FE0F7F93;
+04D9 : 02078F13;
+04DA : 01EF8733;
+04DB : 0F13A019;
+04DC : A023020F;
+04DD : A2230077;
+04DE : A4230077;
+04DF : A6230077;
+04E0 : A8230077;
+04E1 : AA230077;
+04E2 : AC230077;
+04E3 : AE230077;
+04E4 : 86FA0077;
+04E5 : 1CE387FA;
+04E6 : 8A7DFDE7;
+04E7 : F363428D;
+04E8 : 031302C2;
+04E9 : 7893FFC6;
+04EA : 8E93FFC3;
+04EB : 8E330047;
+04EC : A01101D8;
+04ED : A0230E91;
+04EE : 87F60076;
+04EF : 9BE386F6;
+04F0 : 8A0DFFCE;
+04F1 : 00267393;
+04F2 : 02039063;
+04F3 : E2118A05;
+04F4 : 80238082;
+04F5 : 808200B7;
+04F6 : 00150793;
+04F7 : 00750023;
+04F8 : B79D167D;
+04F9 : BF5D86BE;
+04FA : 00B79023;
+04FB : BFF90789;
+04FC : 00779023;
+04FD : 07891679;
+04FE : 0000BFB9;
+04FF : 4F525245;
+0500 : 00203A52;
+0501 : 20746120;
+0502 : 20007830;
+0503 : 00783028;
+0504 : 61420A29;
+0505 : 64612064;
+0506 : 73657264;
+0507 : 30203A73;
+0508 : 696D0078;
+0509 : 696C6173;
+050A : 64656E67;
+050B : 766E6900;
+050C : 64696C61;
+050D : 736E6920;
+050E : 63757274;
+050F : 6E6F6974;
+0510 : 2A0A0A00;
+0511 : 48202A2A;
+0512 : 6F6C6C65;
+0513 : 6F57202C;
+0514 : 21646C72;
+0515 : 2A2A2A20;
+0516 : 58414D0A;
+0517 : 66203038;
+0518 : 776D7269;
+0519 : 20657261;
+051A : 706D6F63;
+051B : 64656C69;
+051C : 3A6E6F20;
+051D : 63654420;
+051E : 20363220;
+051F : 31323032;
+0520 : 3A303220;
+0521 : 353A3032;
+0522 : 00000A33;
+0523 : 00000101;
+0524 : 00000000;
+0525 : 00000000;
+0526 : 00000000;
+0527 : 00000000;
+0528 : 00000000;
+0529 : 00000000;
+052A : 00000000;
+052B : 00000000;
+052C : 00000000;
+052D : 00000000;
+052E : 00000000;
+052F : 00000000;
+0530 : 00000000;
+0531 : 00000000;
+0532 : 00000000;
+0533 : 00000105;
+0534 : 00007FBF;
+0535 : 00000000;
+0536 : D3030300;
+0537 : 00001170;
+0538 : 00000000;
+0539 : 00001194;
+053A : 00000000;
+053B : 00000000;
+053C : 00000000;
+053D : 00001182;
+053E : 00000000;
+053F : 00000000;
+0540 : 00000000;
+0541 : 00000000;
+0542 : 00000000;
+0543 : 00000000;
+0544 : 00000000;
+0545 : 00000000;
+0546 : 00000000;
+0547 : 00000000;
+0548 : 00000000;
+0549 : 00000000;
+054A : 00000000;
+054B : 00000000;
+054C : 00000000;
+054D : 00000000;
+054E : 00000000;
+054F : 00000000;
+0550 : 00000000;
+0551 : 00000000;
+0552 : 00000000;
+0553 : 00000000;
+0554 : 00000000;
+0555 : 00000000;
+0556 : 00000000;
+0557 : 00000000;
+0558 : 6362612F;
+0559 : 6B736964;
+055A : 3030382E;
+055B : 002F;
+[055C..1FFF] : 00;
 END;

+ 4 - 0
rv32/io.h

@@ -8,6 +8,8 @@
 #include "picorv32.h"
 #include "irq.h"
 
+#define barrier() do { asm volatile("" : : : "memory"); } while (0)
+
 static __always_inline void pause(void)
 {
     /* Placeholder for anything that might want to be done while waiting */
@@ -79,6 +81,8 @@ static __always_inline void wait_romcopy_done(void)
 {
     while (~irqmask() & (1 << ROMCOPY_IRQ))
 	pause();
+
+    barrier();
 }
 
 /* Read a random 32-bit number */

+ 8 - 15
rv32/romcopy.c

@@ -43,38 +43,32 @@ enum romcmd {
     ROM_FAST_READ_DUAL			= 0x3b
 };
 
-size_t __sbss romcopy_log[12];
-static size_t __sdata *romcopy_log_ptr;
+size_t __sbss romcopy_log[15];
 
 void __hot romcopy_download(void *dst, size_t offset, size_t len)
 {
-    *romcopy_log_ptr++ = rdtime();
-    *romcopy_log_ptr++ = ROMCOPY_RAMADDR = (size_t)dst;
-    *romcopy_log_ptr++ = ROMCOPY_ROMCMD  =
-	__rom_offset + offset + (ROM_FAST_READ_DUAL << 24);
-    *romcopy_log_ptr++ = ROMCOPY_DATALEN =
+    ROMCOPY_RAMADDR = (size_t)dst;
+    ROMCOPY_ROMCMD  = __rom_offset + offset + (ROM_FAST_READ_DUAL << 24);
+    ROMCOPY_DATALEN =
 	len | ROMCOPY_SPI_CMDLEN(5) | ROMCOPY_SPI_DUAL | ROMCOPY_WRITE_RAM;
 }
 
 void __hot romcopy_bzero(void *dst, size_t len)
 {
-    *romcopy_log_ptr++ = rdtime();
-    *romcopy_log_ptr++ = ROMCOPY_RAMADDR = (size_t)dst;
-    *romcopy_log_ptr++ = ROMCOPY_ROMCMD = 0;
-    *romcopy_log_ptr++ = ROMCOPY_DATALEN =
+    ROMCOPY_RAMADDR = (size_t)dst;
+    ROMCOPY_ROMCMD  = 0;
+    ROMCOPY_DATALEN =
 	len | ROMCOPY_ZERO_BUFFER | ROMCOPY_WRITE_RAM;
 }
 
 uint32_t __sbss romcopy_time[2];
 IRQHANDLER(romcopy)
 {
-    static unsigned int romcopy_state;
+    static __sbss unsigned int romcopy_state;
     size_t len;
 
     switch (romcopy_state++) {
     case 0:
-	romcopy_log_ptr = romcopy_log;
-
 	/* Copy DRAM data */
 	len = __dram_init_end - __dram_init_start;
 	romcopy_download(__dram_init_start, 0, len);
@@ -85,7 +79,6 @@ IRQHANDLER(romcopy)
 	romcopy_bzero(__dram_bss_start, len);
 	break;
     default:
-	*romcopy_log_ptr++ = rdtime();
 	mask_irq(ROMCOPY_IRQ);
 	break;
     }

+ 34 - 9
rv32/system.c

@@ -9,14 +9,6 @@
 #define MINITESTS 1
 #define DELAY     0
 
-volatile __sbss uint32_t timer_irq_count;
-IRQHANDLER(sysclock)
-{
-    uint32_t count = timer_irq_count;
-
-    count++;
-}
-
 static void __hot con_print_hex(unsigned int n)
 {
     for (int i = 0; i < 8; i++) {
@@ -72,6 +64,14 @@ IRQHANDLER(ebreak)
     killed(hotstr("invalid instruction"), pc);
 }
 
+volatile __sbss uint32_t timer_irq_count;
+IRQHANDLER(sysclock)
+{
+    uint32_t count = timer_irq_count;
+    count++;
+    timer_irq_count = count;
+}
+
 static void __cold __noinline late_init(void);
 
 uint32_t __sbss timer_irq_start;
@@ -85,6 +85,8 @@ void __hot init(void)
 #endif
 	"firmware compiled on: " __DATE__ " " __TIME__ "\n";
 
+    con_set_baudrate(115200);
+
     timer_irq_start = rdtime();
 
     /* Start ROM copy engine, unmask timer and fatal exceptions */
@@ -93,9 +95,32 @@ void __hot init(void)
 
     set_leds(7);
     wait_romcopy_done();
+
+    if ( MINITESTS ) {
+	extern uint32_t __dram_init_start[], __dram_init_end[];
+	extern uint32_t __dram_bss_start[], __dram_bss_end[];
+	const uint32_t *dp;
+	uint32_t v;
+
+	v = 0;
+	for (dp = __dram_init_start; dp < __dram_init_end; dp++)
+	    v += *dp;
+
+	con_puts("SDRAM data checksum: ");
+	con_print_hex(v);
+	con_putc('\n');
+
+	v = 0;
+	for (dp = __dram_bss_start; dp < __dram_bss_end; dp++) {
+	    uint32_t x = *dp;
+	    v |= x;
+	}
+
+	if (v)
+	    con_puts("SDRAM .bss is not zero!\n");
+    }
     set_leds(6);
 
-    con_set_baudrate(115200);
     con_puts(hello);
     con_flush();