From: Joshua Wise Date: Fri, 12 Mar 2010 15:09:29 +0000 (-0500) Subject: Add support for CellularRAM on Nexys2. X-Git-Url: http://git.joshuawise.com/firearm.git/commitdiff_plain/1e7ff543e49341fedea742d7b8b674111d852748 Add support for CellularRAM on Nexys2. --- diff --git a/BigBlockRAM.v b/BigBlockRAM.v index 7e6ea99..7b8275a 100644 --- a/BigBlockRAM.v +++ b/BigBlockRAM.v @@ -10,9 +10,10 @@ module BigBlockRAM( /* This module is mapped in physical memory from 0x00000000 to * 0x00800000. rdata and ready must be driven to zero if the - * address is not within the range of this module. + * address is not within the range of this module. There also + * exists a shadow up at 0x80000000. */ - wire decode = bus_addr[31:23] == 9'b0; + wire decode = bus_addr[30:23] == 8'b0; wire [22:0] ramaddr = {bus_addr[22:2], 2'b0}; /* mask off lower two bits * for word alignment */ diff --git a/CellularRAM.v b/CellularRAM.v new file mode 100644 index 0000000..81622cd --- /dev/null +++ b/CellularRAM.v @@ -0,0 +1,50 @@ +module CellularRAM( + input clk, + input [31:0] bus_addr, + output wire [31:0] bus_rdata, + input [31:0] bus_wdata, + input bus_rd, + input bus_wr, + output wire bus_ready, + + output wire cr_nADV, cr_nCE, cr_nOE, cr_nWE, cr_CRE, cr_nLB, cr_nUB, cr_CLK, + inout wire [15:0] cr_DQ, + output wire [22:0] cr_A, + output wire st_nCE + ); + + /* This module is mapped in physical memory from 0x80000000 to + * 0x80FFFFFF. rdata and ready must be driven to zero if the + * address is not within the range of this module. + */ + wire decode = bus_addr[31:24] == 8'h80; + assign cr_A = bus_addr[23:1]; + reg [22:0] cr_A_1a = 23'h7FFFFF; + reg [22:0] cr_A_2a = 23'h7FFFFF; + wire active = (decode && (bus_rd || bus_wr)); + reg active_1a = 0; + reg active_2a = 0; + + always @(posedge clk) + begin + cr_A_1a <= cr_A; + cr_A_2a <= cr_A_1a; + active_1a <= active; + active_2a <= active_1a; + end + + assign bus_rdata = (bus_rd && decode) ? {16'h0000, cr_DQ} : 32'h0; + assign cr_DQ = (bus_wr && decode) ? bus_wdata : 16'hzzzz; + + assign bus_ready = active && active_1a && active_2a && (cr_A_1a == cr_A) && (cr_A_2a == cr_A); + + assign st_nCE = 0; + assign cr_nADV = ~decode; + assign cr_nCE = 0; + assign cr_nOE = ~bus_rd; + assign cr_nWE = ~bus_wr; + assign cr_CRE = 0; + assign cr_nLB = 0; + assign cr_nUB = 0; + assign cr_CLK = 0; +endmodule diff --git a/Makefile b/Makefile index 2c4bf60..7649562 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VLOGS = ARM_Constants.v BigBlockRAM.v BlockRAM.v BusArbiter.v DCache.v Decode.v Execute.v Fetch.v ICache.v Issue.v Memory.v Minishift.v RegFile.v Terminal.v Writeback.v system.v +VLOGS = ARM_Constants.v BigBlockRAM.v BlockRAM.v BusArbiter.v DCache.v Decode.v Execute.v Fetch.v ICache.v Issue.v Memory.v Minishift.v RegFile.v Terminal.v Writeback.v system.v CellularRAM.v all: Vsystem diff --git a/ram.hex b/ram.hex index aa3a6ed..5d115b1 120000 --- a/ram.hex +++ b/ram.hex @@ -1 +1 @@ -tests/testbench.pad.hex \ No newline at end of file +tests/ram.hex \ No newline at end of file diff --git a/system.v b/system.v index 8205a15..97880c9 100644 --- a/system.v +++ b/system.v @@ -6,7 +6,12 @@ module System(input clk, input rst `else , output wire [8:0] sys_odata, input [8:0] sys_idata, - output wire sys_tookdata + output wire sys_tookdata, + + output wire cr_nADV, cr_nCE, cr_nOE, cr_nWE, cr_CRE, cr_nLB, cr_nUB, cr_CLK, + inout wire [15:0] cr_DQ, + output wire [22:0] cr_A, + output wire st_nCE `endif ); @@ -34,15 +39,15 @@ module System(input clk, input rst wire bus_rd_dcache; wire bus_wr_dcache; - wire [31:0] bus_rdata_blockram; - wire bus_ready_blockram; + wire [31:0] bus_rdata_blockram, bus_rdata_cellularram; + wire bus_ready_blockram, bus_ready_cellularram; assign bus_addr = bus_addr_icache | bus_addr_dcache; - assign bus_rdata = bus_rdata_blockram; + assign bus_rdata = bus_rdata_blockram | bus_rdata_cellularram; assign bus_wdata = bus_wdata_icache | bus_wdata_dcache; assign bus_rd = bus_rd_icache | bus_rd_dcache; assign bus_wr = bus_wr_icache | bus_wr_dcache; - assign bus_ready = bus_ready_blockram; + assign bus_ready = bus_ready_blockram | bus_ready_cellularram; wire [31:0] icache_rd_addr; wire icache_rd_req; @@ -239,6 +244,40 @@ module System(input clk, input rst .bus_wdata(bus_wdata), .bus_rd(bus_rd), .bus_wr(bus_wr), .bus_ready(bus_ready_blockram)); +`ifdef verilator + assign bus_rdata_cellularram = 32'h00000000; + assign bus_ready_cellularram = 0; +`else + /* CellularRAM AUTO_TEMPLATE ( + .bus_rdata(bus_rdata_cellularram), + .bus_ready(bus_ready_cellularram), + ); + */ + CellularRAM cellularram( + /*AUTOINST*/ + // Outputs + .bus_rdata (bus_rdata_cellularram), // Templated + .bus_ready (bus_ready_cellularram), // Templated + .cr_nADV (cr_nADV), + .cr_nCE (cr_nCE), + .cr_nOE (cr_nOE), + .cr_nWE (cr_nWE), + .cr_CRE (cr_CRE), + .cr_nLB (cr_nLB), + .cr_nUB (cr_nUB), + .cr_CLK (cr_CLK), + .cr_A (cr_A[22:0]), + .st_nCE (st_nCE), + // Inouts + .cr_DQ (cr_DQ[15:0]), + // Inputs + .clk (clk), + .bus_addr (bus_addr[31:0]), + .bus_wdata (bus_wdata[31:0]), + .bus_rd (bus_rd), + .bus_wr (bus_wr)); +`endif + /* Fetch AUTO_TEMPLATE ( .jmp_0a(jmp), .jmppc_0a(jmppc), diff --git a/tests/Makefile b/tests/Makefile index 471a83e..774222d 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,6 +1,6 @@ CFLAGS=-mno-thumb-interwork -march=armv4 -all: costas.hex testbench.hex +all: costas.hex testbench.pad.hex testbench.hex %.o: %.c arm-elf-gcc $(CFLAGS) -c -o $@ $< diff --git a/tests/testbench.c b/tests/testbench.c index e708df6..f078ecd 100644 --- a/tests/testbench.c +++ b/tests/testbench.c @@ -102,10 +102,30 @@ void ldm_tester() puts("PASS\n"); } +void cellularram() +{ + volatile int *p = 0x80010000; + + puts("[writing] "); + p[0] = 0x12345678; + p[1] = 0x87654321; + p[2] = 0xAAAA5555; + p[3] = 0x5555AAAA; + puts("[cache flush] "); + p[0x1000] = 0x00000000; + puts("[reading: "); + puthex(p[0]); + puthex(p[1]); + puthex(p[2]); + puthex(p[3]); + puts("]\n"); +} + struct tests tlist[] = { {"ldm pc/mul", ldm_tester}, {"fact", facttest}, {"j4cbo", j4cbo}, + {"cellularram", cellularram}, {"ack", acktest}, {"miniblarg", testmain}, {"corecurse", corecurse}, diff --git a/tests/testbench.hex b/tests/testbench.hex index 1335254..37a227a 100644 --- a/tests/testbench.hex +++ b/tests/testbench.hex @@ -1,5 +1,5 @@ e59fd00c -eb0005e4 +eb000651 eafffffe ee000510 e1a0f00e @@ -8,114 +8,131 @@ e1a0c00d e92dd800 e24cb004 e24dd004 +ee113531 +e50b3010 +e51b3010 +e2033c01 +e3530000 +0afffff9 +e51b3010 +e20330ff +e1a00003 +e89da808 +e1a0c00d +e92dd800 +e24cb004 +e24dd004 e50b0010 +ea000007 e51b3010 e5d33000 -e3530000 -0a000008 -e24b1010 -e5913000 e1a02003 -e5d22000 +e51b3010 e2833001 -e5813000 +e50b3010 e1a00002 -ebffffeb -eafffff2 +ebffffe0 +e51b3010 +e5d33000 +e3530000 +1afffff3 e89da808 e1a0c00d e92dd800 e24cb004 e24dd00c -e50b0010 +e50b0018 e59f3054 e50b3014 e3a03007 -e50b3018 -e51b3018 -e3530000 -ba00000d -e51b3018 -e1a02103 +e50b3010 +ea00000c e51b3010 +e1a02103 +e51b3018 e1a03233 e203200f e51b3014 -e0823003 +e0833002 e5d33000 e1a00003 -ebffffd3 -e51b3018 +ebffffc7 +e51b3010 e2433001 -e50b3018 -eaffffee +e50b3010 +e51b3010 +e3530000 +aaffffef e24bd00c e89da800 -00001830 +000019f4 e1a0c00d -e92dd800 +e92dd810 e24cb004 e24dd00c -e50b0010 -e50b1014 -e51b3010 +e50b0014 +e50b1018 +e51b3014 e3530000 1a000003 -e51b3014 +e51b3018 e2833001 -e50b3018 +e50b301c ea000017 -e51b3014 +e51b3018 e3530000 1a000007 -e51b3010 +e51b3014 e2433001 e1a00003 e3a01001 ebffffea e1a03000 -e50b3018 +e50b301c ea00000c e51b3014 +e2434001 +e51b3018 e2433001 -e51b0010 +e51b0014 +e1a01003 +ebffffe0 +e1a03000 +e1a00004 e1a01003 -ebffffe2 -e1a02000 -e51b3010 -e2433001 -e1a00003 -e1a01002 ebffffdc e1a03000 -e50b3018 -e51b0018 -e24bd00c -e89da800 +e50b301c +e51b301c +e1a00003 +e24bd010 +e89da810 e1a0c00d e92dd800 e24cb004 e24dd004 e3a00003 e3a01003 -ebffffd0 +ebffffcf e1a03000 e50b3010 e51b3010 e353003d -0a000006 -e51b0010 -ebffffac -e59f0018 -ebffff97 -e51b0010 -ebffffa8 +0a000008 +e51b3010 +e1a00003 +ebffffaa +e59f001c +ebffff95 +e51b3010 +e1a00003 +ebffffa5 ea000001 e59f0008 -ebffff92 +ebffff8f e89da808 -00001844 -00001850 +00001a08 +00001a14 e1a0c00d e92dd800 e24cb004 @@ -126,141 +143,142 @@ e3530000 1a000002 e3a0306a e50b3014 -ea00006a +ea00006b e51b3010 e3530001 1a000002 e3a0308b e50b3014 -ea000064 +ea000065 e51b3010 e3530002 1a000002 e3a03078 e50b3014 -ea00005e +ea00005f e51b3010 e3530003 1a000002 e3a030b7 e50b3014 -ea000058 +ea000059 e51b3010 e3530004 1a000002 e3a03045 e50b3014 -ea000052 +ea000053 e51b3010 e3530005 1a000002 e3a030c5 e50b3014 -ea00004c +ea00004d e51b3010 e3530006 1a000002 e3a03093 e50b3014 -ea000046 +ea000047 e51b3010 e3530007 1a000002 e3a030cf e50b3014 -ea000040 +ea000041 e51b3010 e3530008 1a000002 e3a03023 e50b3014 -ea00003a +ea00003b e51b3010 e3530009 1a000002 e3a0309b e50b3014 -ea000034 +ea000035 e51b3010 e353000a 1a000002 e3a0307a e50b3014 -ea00002e +ea00002f e51b3010 e353000b 1a000002 e3a030f4 e50b3014 -ea000028 +ea000029 e51b3010 e353000c 1a000002 e3a0307d e50b3014 -ea000022 +ea000023 e51b3010 e353000d 1a000002 e3a030d7 e50b3014 -ea00001c +ea00001d e51b3010 e353000e 1a000002 e3a03045 e50b3014 -ea000016 +ea000017 e51b3010 e353000f 1a000002 e3a030db e50b3014 -ea000010 +ea000011 e51b3010 e3530010 1a000002 e3a03002 e50b3014 -ea00000a +ea00000b e51b3010 e3530011 1a000002 e3a030e0 e50b3014 -ea000004 -e59f0018 -ebffff1c -e51b0010 -ebffff2d +ea000005 +e59f0020 +ebffff19 +e51b3010 +e1a00003 +ebffff29 eafffffe -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 -00001858 +00001a1c e1a0c00d e92dd800 e24cb004 e24dd008 -e50b0010 -e51b2010 -e1a03fc2 -e1a03ea3 -e0823003 +e50b0014 +e51b3014 +e2832007 +e3530000 +b1a03002 e1a031c3 e1a00003 -ebffff79 +ebffff77 e1a03000 -e50b3014 -e51b2010 +e50b3010 +e51b2014 e1a03fc2 -e1a03ea3 -e0823003 -e1a031c3 -e1a03183 -e0633002 +e1a01ea3 +e0823001 +e2033007 +e0613003 e2632007 -e51b3014 +e51b3010 e1a03253 e2033001 e1a00003 @@ -272,24 +290,25 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffffdc +ebffffdd e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb0000ae +eb0000b5 e1a03000 e50b3014 ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -305,17 +324,18 @@ e3530000 e51b3010 e2833001 e1a00003 -eb00005d +eb000061 e1a03000 e50b3014 ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -324,25 +344,26 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffffa8 +ebffffa7 e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00000c +eb00000d e1a03000 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebffffb6 +ebffffb4 e1a03000 e2833045 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -351,25 +372,26 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff8d +ebffff8b e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00000c +eb00000d e1a03000 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebffff9b +ebffff98 e1a03000 e283304e e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -378,14 +400,14 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff72 +ebffff6f e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebffff87 +ebffff83 e1a03000 e283304f e50b3014 @@ -393,11 +415,12 @@ ea000006 e51b3010 e2833001 e1a00003 -ebffff7f +ebffff7b e1a03000 e2833055 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -406,25 +429,26 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff56 +ebffff52 e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00000c +eb00000d e1a03000 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebffff64 +ebffff5f e1a03000 e2833041 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -433,14 +457,14 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff3b +ebffff36 e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebffff50 +ebffff4a e1a03000 e283304d e50b3014 @@ -448,11 +472,12 @@ ea000006 e51b3010 e2833001 e1a00003 -ebffff48 +ebffff42 e1a03000 e2833054 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -461,24 +486,25 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff1f +ebffff19 e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00008f +eb000097 e1a03000 e50b3014 ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -487,24 +513,25 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebffff05 +ebfffefe e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb000042 +eb000045 e1a03000 e50b3014 ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -513,25 +540,26 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffeeb +ebfffee3 e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00000c +eb00000d e1a03000 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebfffef9 +ebfffef0 e1a03000 e2833049 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -540,14 +568,14 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffed0 +ebfffec7 e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebfffee5 +ebfffedb e1a03000 e2833050 e50b3014 @@ -555,11 +583,12 @@ ea000006 e51b3010 e2833001 e1a00003 -ebfffedd +ebfffed3 e1a03000 e2833058 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -568,25 +597,26 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffeb4 +ebfffeaa e1a03000 e3530000 0a000006 e51b3010 e2833001 e1a00003 -eb00000c +eb00000d e1a03000 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebfffec2 +ebfffeb7 e1a03000 e2833048 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -595,38 +625,41 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffe99 +ebfffe8e e1a03000 e3530000 -0a000002 -e59f302c +0a000005 +e3e03e87 +e50b3014 +e51b3014 +e2433008 e50b3014 ea000006 e51b3010 e2833001 e1a00003 -ebfffeab +ebfffe9c e1a03000 e2833053 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 -fffff787 e1a0c00d e92dd800 e24cb004 e24dd008 e50b0010 e51b0010 -ebfffe81 +ebfffe73 e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebfffe96 +ebfffe87 e1a03000 e2833020 e50b3014 @@ -634,10 +667,11 @@ ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -646,14 +680,14 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffe66 +ebfffe57 e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebfffe7b +ebfffe6b e1a03000 e2833046 e50b3014 @@ -661,10 +695,11 @@ ea000005 e51b3010 e2833001 e1a00003 -eb000004 +eb000005 e1a03000 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -673,14 +708,14 @@ e24cb004 e24dd008 e50b0010 e51b0010 -ebfffe4b +ebfffe3b e1a03000 e3530000 0a000007 e51b3010 e2833001 e1a00003 -ebfffe60 +ebfffe4f e1a03000 e283304c e50b3014 @@ -688,11 +723,12 @@ ea000006 e51b3010 e2833001 e1a00003 -ebfffe58 +ebfffe47 e1a03000 e2833052 e50b3014 -e51b0014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -700,22 +736,23 @@ e92dd800 e24cb004 e24dd004 e3a00000 -ebfffe4c +ebfffe3a e1a03000 e50b3010 e51b3010 e3530097 -0a000004 -e51b0010 -ebfffd52 +0a000005 +e51b3010 +e1a00003 +ebfffd3b e59f0010 -ebfffd3d +ebfffd26 ea000001 e59f0008 -ebfffd3a +ebfffd23 e89da808 -00001844 -00001850 +00001a08 +00001a14 e1a0c00d e92dd810 e24cb004 @@ -723,26 +760,26 @@ e24dd008 e50b0014 e51b3014 e3530000 -0a00000f +0a00000e e51b2014 -e1a03fc2 -e1a03fa3 -e0823003 +e1a03fa2 +e0833002 e1a030c3 e1a00003 -eb00000d +eb00000e e1a04000 e51b3014 e2433001 e1a00003 -ebffffeb +ebffffec e1a03000 e0844003 e50b4018 ea000001 e3a03001 e50b3018 -e51b0018 +e51b3018 +e1a00003 e24bd010 e89da810 e1a0c00d @@ -766,86 +803,88 @@ e50b4018 ea000001 e3a03000 e50b3018 -e51b0018 +e51b3018 +e1a00003 e24bd010 e89da810 e1a0c00d e92dd810 e24cb004 -e24dd004 +e24dd008 e3a00023 -ebffffc4 +ebffffc3 e1a04000 e3a00020 -ebffffde +ebffffdd e1a03000 e0843003 e243309e e50b3014 e51b2014 -e59f3020 +e3a03b0f +e2833033 e1520003 1a000002 -e59f0018 -ebfffcef +e59f0014 +ebfffcd6 ea000001 -e59f0010 -ebfffcec -e1a00003 -e89da818 -00003c33 -00001850 -0000187c +e59f000c +ebfffcd3 +e24bd010 +e89da810 +00001a14 +00001a40 e1a0c00d e92dd800 e24cb004 e59f000c -ebfffce2 +ebfffcca e3a03000 e1a00003 e89da800 -00001884 +00001a48 e1a0c00d e92dd800 e24cb004 e59f3004 e1a00003 e89da800 -00001918 +00001b28 e1a0c00d e92dd800 e24cb004 e24dd010 -e50b0010 -e50b1014 -e51b2010 -e51b3014 +e50b0018 +e50b101c +e51b2018 +e51b301c e0223003 -e50b3010 -e3a03000 e50b3018 +e3a03000 +e50b3014 +ea000011 e51b3018 -e3530007 -ca000011 -e51b3010 e2033001 +e20330ff e3530000 0a000002 -e59f3040 -e50b301c +e59f3048 +e50b3010 ea000001 e3a03000 -e50b301c -e51b3010 -e1a020c3 -e51b301c -e0223003 e50b3010 e51b3018 -e2833001 -e50b3018 -eaffffea +e1a020c3 e51b3010 +e0223003 +e50b3018 +e51b3014 +e2833001 +e50b3014 +e51b3014 +e3530007 +daffffea +e51b3018 e1a00003 e24bd00c e89da800 @@ -905,10 +944,11 @@ e51b3014 e5933018 e50b3018 ea000002 -ebffff91 +ebffff90 e1a03000 e50b3018 -e51b0018 +e51b3018 +e1a00003 e24bd00c e89da800 e1a0c00d @@ -975,15 +1015,16 @@ e3530000 1a000002 e3a03000 e50b3018 -ea00002a +ea00002b e51b3010 e3530001 -1a000006 +1a000007 e51b3014 e5933010 -e1a03123 -e2233001 -e2033001 +e2033004 +e3530000 +13a03000 +03a03001 e50b3018 ea000020 e51b3010 @@ -1016,409 +1057,411 @@ e3530007 e3a03001 e50b3018 ea000002 -ebffff22 +ebffff1f e1a03000 e50b3018 -e51b0018 +e51b3018 +e1a00003 e24bd00c e89da800 e1a0c00d e92dd800 e24cb004 e24dd040 -e24b3028 -e50b302c -e3a03000 +e24b304c e50b3030 e3a03000 -e50b3034 +e50b302c e3a03000 -e50b3038 -e51b202c +e50b3028 +e3a03000 +e50b3024 +e51b2030 e3a03000 e5823014 -e51b202c +e51b2030 e3a03000 e5823000 -e51b202c +e51b2030 e3a03000 e5823004 -e51b202c +e51b2030 e3a03000 e5823008 -e51b202c +e51b2030 e3a03000 e582300c -e51b202c +e51b2030 e3a03000 e5823010 -e51b202c +e51b2030 e3a03000 e5823018 -ebffff04 +ebffff00 e1a03000 -e50b304c -e51b3038 -e353000f -0a000155 -e51b302c +e50b3010 +ea000154 +e51b3030 e5933014 e1a02103 -e51b304c -e0823003 +e51b3010 +e0833002 e5933000 -e50b3034 -e51b3034 +e50b3028 +e51b3028 e1a03643 -e50b3038 -e51b3034 +e50b3024 +e51b3028 e1a034c3 e2033007 -e50b303c -e51b3034 +e50b3020 +e51b3028 e1a03243 e203300f -e50b3040 -e51b3034 +e50b301c +e51b3028 e203300f -e50b3044 -e51b302c -e51b0030 -e5931000 -ebfffeed -e1a03000 -e50b3030 -e51b302c -e51b0030 -e5931004 -ebfffee7 +e50b3018 +e51b3030 +e5933000 +e51b002c +e1a01003 +ebfffeea e1a03000 -e50b3030 -e51b302c -e51b0030 -e5931008 -ebfffee1 +e50b302c +e51b3030 +e5933004 +e51b002c +e1a01003 +ebfffee3 e1a03000 -e50b3030 -e51b302c -e51b0030 -e593100c -ebfffedb +e50b302c +e51b3030 +e5933008 +e51b002c +e1a01003 +ebfffedc e1a03000 -e50b3030 -e51b302c -e51b0030 -e5931010 +e50b302c +e51b3030 +e593300c +e51b002c +e1a01003 ebfffed5 e1a03000 -e50b3030 -e51b302c -e51b0030 -e5931018 -ebfffecf +e50b302c +e51b3030 +e5933010 +e51b002c +e1a01003 +ebfffece e1a03000 -e50b3030 -e51b302c -e51b0030 -e5931014 -ebfffec9 +e50b302c +e51b3030 +e5933018 +e51b002c +e1a01003 +ebfffec7 e1a03000 -e50b3030 -e51b3038 +e50b302c +e51b3030 +e5933014 +e51b002c +e1a01003 +ebfffec0 +e1a03000 +e50b302c +e51b3024 e3530000 1a000021 -e51b202c -e51b302c +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebffff54 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff4d e1a03000 e3530000 1a000005 -e51b202c -e51b302c +e51b3030 e5933014 -e2833001 -e5823014 -eaffffa9 -e51b302c +e2832001 +e51b3030 +e5832014 +ea0000fa +e51b3030 e5933014 e1a02103 -e51b304c -e0823003 +e51b3010 +e0833002 e5933000 -e50b3048 -e51b202c -e51b302c +e50b3014 +e51b3030 e5933014 -e2833001 -e5823014 -e51b0040 -e51b1048 -e51b202c -ebffff06 -eaffff98 -e51b3038 +e2832001 +e51b3030 +e5832014 +e51b001c +e51b1014 +e51b2030 +ebfffeff +ea0000e9 +e51b3024 e3530001 -1a000019 -e51b202c -e51b302c +1a000018 +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebffff2f +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff28 e1a03000 e3530000 -1a000000 -eaffff89 -e51b0044 -e51b102c -ebfffeb6 +0a0000db +e51b0018 +e51b1030 +ebfffeaf e1a03000 e1a02103 -e51b304c -e0823003 +e51b3010 +e0833002 e5933000 -e50b3048 -e51b0040 -e51b1048 -e51b202c -ebfffee9 -eaffff7b -e51b3038 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffee3 +ea0000cd +e51b3024 e3530002 -1a00001d -e51b202c -e51b302c +1a00001c +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebffff12 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff0c e1a03000 e3530000 -1a000000 -eaffff6c -e51b0044 -e51b102c -ebfffe99 +0a0000bf +e51b0018 +e51b1030 +ebfffe93 e1a03000 -e50b3048 -e51b0040 -e51b102c -ebfffe94 +e50b3014 +e51b001c +e51b1030 +ebfffe8e e1a03000 e3530901 0a000001 -ebfffe5a -ea0000c3 -e51b3048 +ebfffe53 +ea0000c1 +e51b3014 e20330ff e1a00003 -ebfffb3a -eaffff5a -e51b3038 +ebfffb0d +ea0000ad +e51b3024 e3530003 -1a000015 -e51b202c -e51b302c +1a000014 +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebfffef1 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffeec e1a03000 e3530000 -1a000000 -eaffff4b -e51b0044 -e51b102c -ebfffe78 -e1a03000 -e50b3048 -e51b0040 -e51b1048 -e51b202c -ebfffeaf -eaffff41 -e51b3038 +0a00009f +e51b0018 +e51b1030 +ebfffe73 +e1a03000 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffeab +ea000095 +e51b3024 e3530004 -1a000020 -e51b202c -e51b302c +1a00001f +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebfffed8 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffed4 e1a03000 e3530000 -1a000000 -eaffff32 -e51b0044 -e51b102c -ebfffe5f -e1a03000 -e50b3048 -e51b0040 -e51b102c -ebfffe5a +0a000087 +e51b0018 +e51b1030 +ebfffe5b +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffe56 e1a02000 -e51b3048 +e51b3014 e0833002 -e50b3048 -e51b3048 +e50b3014 +e51b3014 e1a03803 e1a03823 -e50b3048 -e51b0040 -e51b1048 -e51b202c -ebfffe8b -eaffff1d -e51b3038 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffe88 +ea000072 +e51b3024 e3530005 -1a000033 -e51b202c -e51b302c +1a000032 +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebfffeb4 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffeb1 e1a03000 e3530000 -1a000000 -eaffff0e -e51b0044 -e51b102c -ebfffe3b +0a000064 +e51b0018 +e51b1030 +ebfffe38 e1a03000 -e50b3048 -e51b0040 -e51b102c -ebfffe36 +e50b3014 +e51b001c +e51b1030 +ebfffe33 e1a02000 -e51b3048 +e51b3014 e0623003 -e50b3048 -e51b202c +e50b3014 +e51b2030 e3a03000 e5823010 -e51b3048 +e51b3014 e3530000 1a000004 -e51b202c -e51b302c +e51b3030 e5933010 -e3833004 -e5823010 -e51b3048 +e3832004 +e51b3030 +e5832010 +e51b3014 e3530000 da000004 -e51b202c -e51b302c +e51b3030 e5933010 -e3833001 -e5823010 -e51b3048 +e3832001 +e51b3030 +e5832010 +e51b3014 e3530000 -aafffeec -e51b202c -e51b302c +aa000042 +e51b3030 e5933010 -e3833002 -e5823010 -eafffee6 -e51b3038 +e3832002 +e51b3030 +e5832010 +ea00003c +e51b3024 e3530006 -1a00001c -e51b202c -e51b302c +1a00001b +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebfffe7d +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffe7b e1a03000 e3530000 -1a000000 -eafffed7 -e51b0044 -e51b102c -ebfffe04 -e1a03000 -e50b3048 -e51b0040 -e51b102c -ebfffdff +0a00002e +e51b0018 +e51b1030 +ebfffe02 +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffdfd e1a02000 -e51b3048 +e51b3014 e0033002 -e50b3048 -e51b0040 -e51b1048 -e51b202c -ebfffe34 -eafffec6 -e51b3038 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffe33 +ea00001d +e51b3024 e3530007 -1afffec3 -e51b202c -e51b302c +1a00001a +e51b3030 e5933014 -e2833001 -e5823014 -e51b003c -e51b102c -ebfffe5d +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffe5c e1a03000 e3530000 -1a000000 -eafffeb7 -e51b0040 -e51b102c -ebfffde4 -e1a03000 -e50b3048 -e51b3048 +0a00000f +e51b001c +e51b1030 +ebfffde3 +e1a03000 +e50b3014 +e51b3014 e1e03003 -e50b3048 -e51b3048 +e50b3014 +e51b3014 e1a03803 e1a03823 -e50b3048 -e51b0040 -e51b1048 -e51b202c -ebfffe14 -eafffea6 +e50b3014 +e51b001c +e51b1014 e51b2030 -e59f3028 +ebfffe14 +e51b3024 +e353000f +1afffea7 +e51b202c +e59f302c e1520003 -0a000004 -e51b0030 -ebfffa95 +0a000005 +e51b302c +e1a00003 +ebfffa78 e59f0018 -ebfffa80 +ebfffa63 ea000001 e59f0010 -ebfffa7d +ebfffa60 e24bd00c e89da800 ee861173 -00001894 -00001850 +00001a58 +00001a14 e1a0c00d e92dd800 e24cb004 @@ -1427,41 +1470,43 @@ e50b0010 e51b3010 e3530000 1a000002 -e3a03001 -e50b3014 +e3a01001 +e50b1014 ea000007 e51b3010 e2433001 e1a00003 ebfffff0 -e1a03000 -e51b2010 -e0030392 -e50b3014 -e51b0014 +e1a02000 +e51b3010 +e0010293 +e50b1014 +e51b3014 +e1a00003 e24bd00c e89da800 e1a0c00d e92dd800 e24cb004 e3a0000a -ebffffe4 +ebffffe3 e1a02000 -e59f301c +e3a039dd +e2833c1f e1520003 0a000002 -e59f0014 -ebfffa57 +e59f0010 +ebfffa38 ea000001 -e59f000c -ebfffa54 +e59f0008 +ebfffa35 e89da800 -00375f00 -0000187c -00001850 +00001a40 +00001a14 e1a0c00d e92dd800 e24cb004 +e24dd004 e1a0300e eb000009 e1a00000 @@ -1484,50 +1529,112 @@ e89da800 e0000291 e1a00000 e1a00000 -e1a00003 -e89da800 +e89da808 e1a0c00d e92dd800 e24cb004 e24dd004 -ebffffe2 +ebffffe3 e1a03000 e50b3010 e51b3010 e3530722 -0a000006 -e59f0020 -ebfffa29 -e51b0010 -ebfffa3a +0a000007 +e59f0024 +ebfffa0b +e51b3010 +e1a00003 +ebfffa1b e59f0014 -ebfffa25 +ebfffa06 ea000001 e59f000c -ebfffa22 +ebfffa03 e89da808 -0000189c -000018b0 -00001850 +00001a60 +00001a74 +00001a14 e1a0c00d e92dd800 e24cb004 e24dd004 -e59f0068 -ebfffa18 -e59f3064 +e3a03102 +e2833801 e50b3010 +e59f00c4 +ebfff9f6 +e51b2010 +e59f30bc +e5823000 +e51b3010 +e2832004 +e59f30b0 +e5823000 +e51b3010 +e2832008 +e3a03c55 +e2833055 +e1833883 +e5823000 +e51b3010 +e283200c +e3a03caa +e28330aa +e1833783 +e5823000 +e59f007c +ebfff9e1 +e51b3010 +e2832901 +e3a03000 +e5823000 +e59f0068 +ebfff9db e51b3010 e5933000 -e3530000 -0a00000e -e59f0050 -ebfffa10 +e1a00003 +ebfff9ea e51b3010 -e5930000 -ebfffa0d -e59f0040 -ebfffa0b +e2833004 +e5933000 +e1a00003 +ebfff9e5 +e51b3010 +e2833008 +e5933000 +e1a00003 +ebfff9e0 +e51b3010 +e283300c +e5933000 +e1a00003 +ebfff9db +e59f0018 +ebfff9c6 +e89da808 +00001a78 +12345678 +87654321 +00001a84 +00001a94 +00001aa0 +e1a0c00d +e92dd800 +e24cb004 +e24dd004 +e59f0078 +ebfff9b9 +e59f3074 +e50b3010 +ea00000e +e59f006c +ebfff9b4 +e51b3010 +e5933000 +e1a00003 +ebfff9b0 +e59f0058 +ebfff9ae e51b3010 e5933004 e1a0e00f @@ -1535,17 +1642,23 @@ e1a0f003 e51b3010 e2833008 e50b3010 -eaffffec -e59f001c -ebfffa01 -e3a03000 +e51b3010 +e5933000 +e3530000 +1affffec +e59f0028 +ebfff9a1 +ebfff992 +e1a03000 +e20330ff e1a00003 -e89da808 -000018ec -00001960 -00001900 -0000190c -00001910 +ebfff98b +eafffff9 +00001ae8 +00001b70 +00001afc +00001b08 +00001b0c 33323130 37363534 42413938 @@ -1579,6 +1692,17 @@ e89da808 73617720 00000020 0000000a +6972775b +676e6974 +0000205d +6361635b +66206568 +6873756c +0000205d +6165725b +676e6964 +0000203a +00000a5d 206d646c 6d2f6370 00006c75 @@ -1586,6 +1710,9 @@ e89da808 00000000 6263346a 0000006f +6c6c6563 +72616c75 +006d6172 006b6361 696e696d 72616c62 @@ -1603,7 +1730,12 @@ e89da808 00000000 0000203a 656e6f44 -00000a21 +63452021 +6e696f68 +68632067 +63617261 +73726574 +00000a2e 00000e30 00000009 00000e00 @@ -1622,17 +1754,19 @@ e89da808 0000000a 00002e10 0000ffff -000018b4 -00001740 -000018c0 -0000168c -000018c8 -00000ae4 -000018d0 -00000178 -000018d4 -00001000 -000018e0 -00000c0c +00001aa4 +000017f0 +00001ab0 +0000173c +00001ab8 +00000b74 +00001ac0 +00001850 +00001acc +000001b4 +00001ad0 +000010a8 +00001adc +00000ca4 00000000 00000000 diff --git a/tests/testbench.pad.hex b/tests/testbench.pad.hex index eecc6d5..bf3d259 100644 --- a/tests/testbench.pad.hex +++ b/tests/testbench.pad.hex @@ -1,1142 +1,1512 @@ e59fd00c -eb000499 +eb000651 eafffffe ee000510 e1a0f00e 00003ffc -ee110531 -e3100c01 -0afffffc -e20000ff -e1a0f00e e1a0c00d -e92dd810 -e1a04000 -e5d00000 +e92dd800 e24cb004 -e3500000 -089da810 -ebffffef -e5f40001 -e3500000 -1afffffb -e89da810 +e24dd004 +ee113531 +e50b3010 +e51b3010 +e2033c01 +e3530000 +0afffff9 +e51b3010 +e20330ff +e1a00003 +e89da808 e1a0c00d -e92dd870 -e59f6028 +e92dd800 e24cb004 -e1a05000 -e3a04007 -e1a01104 -e1a00135 -e200300f -e7d30006 +e24dd004 +e50b0010 +ea000007 +e51b3010 +e5d33000 +e1a02003 +e51b3010 +e2833001 +e50b3010 +e1a00002 ebffffe0 -e2544001 -5afffff8 -e89da870 -00001338 +e51b3010 +e5d33000 +e3530000 +1afffff3 +e89da808 +e1a0c00d +e92dd800 +e24cb004 +e24dd00c +e50b0018 +e59f3054 +e50b3014 +e3a03007 +e50b3010 +ea00000c +e51b3010 +e1a02103 +e51b3018 +e1a03233 +e203200f +e51b3014 +e0833002 +e5d33000 +e1a00003 +ebffffc7 +e51b3010 +e2433001 +e50b3010 +e51b3010 +e3530000 +aaffffef +e24bd00c +e89da800 +000019f4 e1a0c00d e92dd810 -e1a03000 e24cb004 -e1a02001 +e24dd00c +e50b0014 +e50b1018 +e51b3014 e3530000 -e1a00003 -e2421001 -e2434001 -0a00000b -e3520000 -02433001 -02822001 -0afffff6 -ebfffff0 -e1a03004 -e1a02000 +1a000003 +e51b3018 +e2833001 +e50b301c +ea000017 +e51b3018 e3530000 +1a000007 +e51b3014 +e2433001 e1a00003 -e2421001 +e3a01001 +ebffffea +e1a03000 +e50b301c +ea00000c +e51b3014 e2434001 -1afffff3 -e2820001 +e51b3018 +e2433001 +e51b0014 +e1a01003 +ebffffe0 +e1a03000 +e1a00004 +e1a01003 +ebffffdc +e1a03000 +e50b301c +e51b301c +e1a00003 +e24bd010 e89da810 e1a0c00d -e3a00003 -e92dd810 -e1a01000 +e92dd800 e24cb004 -ebffffe1 -e350003d -e1a04000 -0a000005 -ebffffce -e59f0018 -ebffffc0 -e1a00004 -e89d6810 -eaffffc9 +e24dd004 +e3a00003 +e3a01003 +ebffffcf +e1a03000 +e50b3010 +e51b3010 +e353003d +0a000008 +e51b3010 +e1a00003 +ebffffaa +e59f001c +ebffff95 +e51b3010 +e1a00003 +ebffffa5 +ea000001 e59f0008 -e89d6810 -eaffffba -0000134c -00001358 +ebffff8f +e89da808 +00001a08 +00001a14 e1a0c00d -e92dd810 -e2504000 +e92dd800 e24cb004 -0280006a -089da810 -e3540001 -03a0008b -089da810 -e3540002 -03a00078 -089da810 -e3540003 -03a000b7 -089da810 -e3540004 -0a00002a -e3540005 -03a000c5 -089da810 -e3540006 -03a00093 -089da810 -e3540007 -03a000cf -089da810 -e3540008 -03a00023 -089da810 -e3540009 -03a0009b -089da810 -e354000a -03a0007a -089da810 -e354000b -03a000f4 -089da810 -e354000c -03a0007d -089da810 -e354000d -03a000d7 -089da810 -e354000e -0a00000d -e354000f -03a000db -089da810 -e3540010 -03a00002 -089da810 -e3540011 -03a000e0 -089da810 -e59f0014 -ebffff7f -e1a00004 -ebffff89 +e24dd008 +e50b0010 +e51b3010 +e3530000 +1a000002 +e3a0306a +e50b3014 +ea00006b +e51b3010 +e3530001 +1a000002 +e3a0308b +e50b3014 +ea000065 +e51b3010 +e3530002 +1a000002 +e3a03078 +e50b3014 +ea00005f +e51b3010 +e3530003 +1a000002 +e3a030b7 +e50b3014 +ea000059 +e51b3010 +e3530004 +1a000002 +e3a03045 +e50b3014 +ea000053 +e51b3010 +e3530005 +1a000002 +e3a030c5 +e50b3014 +ea00004d +e51b3010 +e3530006 +1a000002 +e3a03093 +e50b3014 +ea000047 +e51b3010 +e3530007 +1a000002 +e3a030cf +e50b3014 +ea000041 +e51b3010 +e3530008 +1a000002 +e3a03023 +e50b3014 +ea00003b +e51b3010 +e3530009 +1a000002 +e3a0309b +e50b3014 +ea000035 +e51b3010 +e353000a +1a000002 +e3a0307a +e50b3014 +ea00002f +e51b3010 +e353000b +1a000002 +e3a030f4 +e50b3014 +ea000029 +e51b3010 +e353000c +1a000002 +e3a0307d +e50b3014 +ea000023 +e51b3010 +e353000d +1a000002 +e3a030d7 +e50b3014 +ea00001d +e51b3010 +e353000e +1a000002 +e3a03045 +e50b3014 +ea000017 +e51b3010 +e353000f +1a000002 +e3a030db +e50b3014 +ea000011 +e51b3010 +e3530010 +1a000002 +e3a03002 +e50b3014 +ea00000b +e51b3010 +e3530011 +1a000002 +e3a030e0 +e50b3014 +ea000005 +e59f0020 +ebffff19 +e51b3010 +e1a00003 +ebffff29 eafffffe -e3a00045 -e89da810 -00001360 -e1a0c00d -e1a01fc0 -e92dd830 -e0805ea1 -e1a051c5 -e24cb004 -e1a04000 -e1a00005 -ebffffb7 -e0444185 -e2644007 -e1a00450 -e2000001 -e89da830 +e51b3014 +e1a00003 +e24bd00c +e89da800 +00001a1c e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebffffec -e3500000 -e2840001 -0a000002 -eb000074 -e280004c -e89da810 -e2840001 -eb000070 -e2800052 -e89da810 +e24dd008 +e50b0014 +e51b3014 +e2832007 +e3530000 +b1a03002 +e1a031c3 +e1a00003 +ebffff77 +e1a03000 +e50b3010 +e51b2014 +e1a03fc2 +e1a01ea3 +e0823001 +e2033007 +e0613003 +e2632007 +e51b3010 +e1a03253 +e2033001 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 +e24dd008 +e50b0010 +e51b0010 ebffffdd -e3500000 -e2840001 -1a000001 -e89d6810 -eaffffe6 -eb000063 -e2800046 -e89da810 +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb0000b5 +e1a03000 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e1a04000 -e2805001 -ebffffcf -e3500000 -e2840001 -0a000002 -eb000057 -e2800020 -e89da830 -e1a00005 -ebffffc7 -e3500000 -e2850001 -0a000002 -eb00004f -e2800046 -e89da830 -e2850001 -ebffffcd -e89da830 +e24dd008 +e50b0010 +e51b0010 +ebffffc2 +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb000061 +e1a03000 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebffffb9 -e3500000 -0a000008 -e2844001 -e1a00004 +e24dd008 +e50b0010 +e51b0010 +ebffffa7 +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb00000d +e1a03000 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 ebffffb4 -e3500000 -0a000025 -e2840001 -eb00003c -e2800020 -e89da810 -e2844001 -e1a00004 -ebffffab -e3500000 -0a00000e -e2844001 -e1a00004 -ebffffa6 -e3500000 -0a000023 -e2844001 -e1a00004 -ebffffa1 -e3500000 -159f00a8 -189da810 -e2840001 -eb000028 -e2800053 -e89da810 -e2844001 -e1a00004 -ebffff97 -e3500000 -0a000018 -e2844001 -e1a00004 -ebffff92 -e3500000 -0a000017 -e2840001 -eb00001a -e2800050 -e89da810 -e2844001 -e1a00004 -ebffff89 -e3500000 -0a000003 -e2840001 -eb000011 -e2800046 -e89da810 -e2840001 -ebffff8f -e89da810 -e2840001 -eb00000a -e2800048 -e89da810 -e2840001 -eb000006 -e2800049 -e89da810 -e2840001 -eb000002 -e2800058 -e89da810 -fffff787 +e1a03000 +e2833045 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebffff6e -e3500000 -0a000012 -e2844001 -e1a00004 -ebffff69 -e3500000 -0a000033 -e2844001 -e1a00004 -ebffff64 -e3500000 -1a000042 -e2844001 -e1a00004 -ebffff5f -e3500000 -0a000057 -e2840001 -ebffffe7 -e2800046 -e89da810 -e2844001 -e1a00004 -ebffff56 -e3500000 -0a00000d -e2844001 -e1a00004 -ebffff51 -e3500000 -0a000041 -e2844001 -e1a00004 -ebffff4c -e3500000 -0a000053 -e2840001 -ebffffd4 -e280004d -e89da810 -e2844001 -e1a00004 -ebffff43 -e3500000 -0a000037 -e2844001 -e1a00004 -ebffff3e -e3500000 -0a00003d -e2844001 -e1a00004 -ebffff39 -e3500000 -0a000044 -e2840001 -ebffffc1 -e280004f -e89da810 -e2844001 -e1a00004 -ebffff30 -e3500000 -0a000012 -e2844001 -e1a00004 -ebffff2b -e3500000 -0a000026 -e2844001 -e1a00004 -ebffff26 -e3500000 -159f00e4 -189da810 -e2840001 -ebffffad -e2800053 -e89da810 -e2840001 -ebffffa9 -e2800020 -e89da810 -e2844001 -e1a00004 -ebffff18 -e3500000 -0a00001b -e2844001 -e1a00004 -ebffff13 -e3500000 -0a000022 -e2840001 -ebffff9b -e2800050 -e89da810 -e2840001 -ebffff97 -e2800041 -e89da810 -e2840001 -ebffff93 -e2800045 -e89da810 -e2840001 -ebffff11 -e89da810 -e2840001 -ebffff8c -e2800048 -e89da810 -e2840001 -ebffff88 -e280004e -e89da810 -e2840001 -ebffff84 -e2800049 -e89da810 -e2840001 -ebffff80 -e2800054 -e89da810 -e2840001 -ebffff7c -e2800055 -e89da810 -e2840001 -ebffff78 -e2800058 -e89da810 -fffff787 +e24dd008 +e50b0010 +e51b0010 +ebffff8b +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb00000d +e1a03000 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebffff98 +e1a03000 +e283304e +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebfffee4 -e3500000 -e59f3014 -e2840001 -1a000001 -ebffff6b -e2803053 +e24dd008 +e50b0010 +e51b0010 +ebffff6f +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 e1a00003 -e89da810 -fffff787 +ebffff83 +e1a03000 +e283304f +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebffff7b +e1a03000 +e2833055 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e2805001 -e1a04000 -ebfffed5 -e3500000 -e1a00005 +e24dd008 +e50b0010 +e51b0010 +ebffff52 +e1a03000 +e3530000 0a000006 -ebfffed1 -e3500000 -e59f302c -e2850001 -0a000005 +e51b3010 +e2833001 e1a00003 -e89da830 -e2840001 -ebffff55 -e2800048 -e89da830 -ebffff52 -e2803053 +eb00000d +e1a03000 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebffff5f +e1a03000 +e2833041 +e50b3014 +e51b3014 e1a00003 -e89da830 -fffff787 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebfffebd -e3500000 -e2840001 -0a000002 -ebffff45 -e2800050 -e89da810 -e2840001 -ebffff41 -e2800058 -e89da810 +e24dd008 +e50b0010 +e51b0010 +ebffff36 +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 +e1a00003 +ebffff4a +e1a03000 +e283304d +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebffff42 +e1a03000 +e2833054 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e2804001 -e1a05000 -ebfffead -e3500000 -e1a00004 -0a000006 -ebfffea9 -e3500000 -e2840001 +e24dd008 +e50b0010 +e51b0010 +ebffff19 +e1a03000 +e3530000 0a000006 -ebffff31 -e2800050 -e89da830 -e2850001 -ebffff2d -e2800049 -e89da830 -e2840001 -ebffff29 -e2800058 -e89da830 -e1a0c00d -e92dd810 -e24cb004 -e1a04000 -ebfffe96 -e3500000 -0a00000e -e2844001 -e1a00004 -ebfffe91 -e3500000 -0a00001b -e2844001 -e1a00004 -ebfffe8c -e3500000 -159f0078 -189da810 -e2840001 -ebffff13 -e2800053 -e89da810 -e2844001 -e1a00004 -ebfffe82 -e3500000 -0a000008 -e2844001 -e1a00004 -ebfffe7d -e3500000 -0a00000b -e2840001 -ebffff05 -e2800050 -e89da810 -e2840001 -ebffff01 -e2800049 -e89da810 -e2840001 -ebfffefd -e2800048 -e89da810 -e2840001 -ebfffef9 -e2800058 -e89da810 -fffff787 +e51b3010 +e2833001 +e1a00003 +eb000097 +e1a03000 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebfffe65 -e3500000 -e2840001 -0a000002 -ebfffeed -e280004d -e89da810 -e2840001 -ebfffee9 -e2800054 -e89da810 +e24dd008 +e50b0010 +e51b0010 +ebfffefe +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb000045 +e1a03000 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e2804001 -e1a05000 -ebfffe55 -e3500000 -e1a00004 -0a000006 -ebfffe51 -e3500000 -e2840001 +e24dd008 +e50b0010 +e51b0010 +ebfffee3 +e1a03000 +e3530000 0a000006 -ebfffed9 -e280004d -e89da830 -e2850001 -ebfffed5 -e2800041 -e89da830 -e2840001 -ebfffed1 -e2800054 -e89da830 +e51b3010 +e2833001 +e1a00003 +eb00000d +e1a03000 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebfffef0 +e1a03000 +e2833049 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebfffe3e -e3500000 -e2840001 -0a000002 -ebfffec6 -e280004f -e89da810 -e2840001 -ebfffec2 -e2800055 -e89da810 +e24dd008 +e50b0010 +e51b0010 +ebfffec7 +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 +e1a00003 +ebfffedb +e1a03000 +e2833050 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebfffed3 +e1a03000 +e2833058 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e2804001 -e1a05000 -ebfffe2e -e3500000 -e1a00004 -0a000006 -ebfffe2a -e3500000 -e2840001 -0a000006 -ebfffeb2 -e280004f -e89da830 -e2850001 -ebfffeae -e280004e -e89da830 -e2840001 +e24dd008 +e50b0010 +e51b0010 ebfffeaa -e2800055 -e89da830 +e1a03000 +e3530000 +0a000006 +e51b3010 +e2833001 +e1a00003 +eb00000d +e1a03000 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebfffeb7 +e1a03000 +e2833048 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd830 +e92dd800 e24cb004 -e2804001 -e1a05000 -ebfffe16 -e3500000 -e1a00004 -0a00000b -ebfffe12 -e2845001 -e3500000 -e1a00005 -0a00000a -ebfffe0d -e3500000 -e2850001 -0a00000a -ebfffe95 -e280004f -e89da830 -e2850001 -ebfffe91 -e2800045 -e89da830 -e2840001 -ebfffe8d -e280004e -e89da830 -e2850001 -ebfffe89 -e2800055 -e89da830 +e24dd008 +e50b0010 +e51b0010 +ebfffe8e +e1a03000 +e3530000 +0a000005 +e3e03e87 +e50b3014 +e51b3014 +e2433008 +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebfffe9c +e1a03000 +e2833053 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d -e92dd810 +e92dd800 e24cb004 -e1a04000 -ebfffdf6 -e3500000 -0a00000d -e2844001 -e1a00004 -ebfffdf1 -e3500000 -0a00001f -e2844001 -e1a00004 -ebfffdec -e3500000 -0a00001e -e2840001 -ebfffe74 -e280004d -e89da810 -e2844001 -e1a00004 -ebfffde3 -e3500000 -0a00000d -e2844001 -e1a00004 -ebfffdde -e3500000 -0a000014 -e2844001 -e1a00004 -ebfffdd9 -e3500000 -0a000013 -e2840001 -ebfffe61 -e280004f -e89da810 -e2840001 -ebfffe5d -e2800045 -e89da810 -e2840001 -ebfffe59 -e2800041 -e89da810 -e2840001 -ebfffe55 -e2800054 -e89da810 -e2840001 -ebfffe51 -e280004e -e89da810 -e2840001 -ebfffe4d -e2800055 -e89da810 +e24dd008 +e50b0010 +e51b0010 +ebfffe73 +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 +e1a00003 +ebfffe87 +e1a03000 +e2833020 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 e1a0c00d e92dd800 -e3a00000 e24cb004 -ebfffe46 -e3500097 -059f0010 -0a000001 -ebfffd3c +e24dd008 +e50b0010 +e51b0010 +ebfffe57 +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 +e1a00003 +ebfffe6b +e1a03000 +e2833046 +e50b3014 +ea000005 +e51b3010 +e2833001 +e1a00003 +eb000005 +e1a03000 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 +e1a0c00d +e92dd800 +e24cb004 +e24dd008 +e50b0010 +e51b0010 +ebfffe3b +e1a03000 +e3530000 +0a000007 +e51b3010 +e2833001 +e1a00003 +ebfffe4f +e1a03000 +e283304c +e50b3014 +ea000006 +e51b3010 +e2833001 +e1a00003 +ebfffe47 +e1a03000 +e2833052 +e50b3014 +e51b3014 +e1a00003 +e24bd00c +e89da800 +e1a0c00d +e92dd800 +e24cb004 +e24dd004 +e3a00000 +ebfffe3a +e1a03000 +e50b3010 +e51b3010 +e3530097 +0a000005 +e51b3010 +e1a00003 +ebfffd3b +e59f0010 +ebfffd26 +ea000001 e59f0008 -e89d6800 -eafffd2d -00001358 -0000134c +ebfffd23 +e89da808 +00001a08 +00001a14 e1a0c00d -e92dd830 -e2505000 -e0850fa5 -e1a000c0 +e92dd810 e24cb004 -03a00001 -089da830 -eb000004 +e24dd008 +e50b0014 +e51b3014 +e3530000 +0a00000e +e51b2014 +e1a03fa2 +e0833002 +e1a030c3 +e1a00003 +eb00000e e1a04000 -e2450001 -ebfffff3 -e0840000 -e89da830 +e51b3014 +e2433001 +e1a00003 +ebffffec +e1a03000 +e0844003 +e50b4018 +ea000001 +e3a03001 +e50b3018 +e51b3018 +e1a00003 +e24bd010 +e89da810 e1a0c00d -e92dd830 -e2505000 +e92dd810 e24cb004 -01a00005 -089da830 -ebffffea +e24dd008 +e50b0014 +e51b3014 +e3530000 +0a00000a +e51b0014 +ebffffd8 e1a04000 -e2450001 -ebffffe7 -e0840000 -e89da830 +e51b3014 +e2433001 +e1a00003 +ebffffd3 +e1a03000 +e0844003 +e50b4018 +ea000001 +e3a03000 +e50b3018 +e51b3018 +e1a00003 +e24bd010 +e89da810 e1a0c00d e92dd810 -e3a00023 e24cb004 -ebffffe0 +e24dd008 +e3a00023 +ebffffc3 e1a04000 e3a00020 -ebffffeb -e59f3020 -e0844000 -e1540003 -e59f0018 -0a000002 +ebffffdd +e1a03000 +e0843003 +e243309e +e50b3014 +e51b2014 +e3a03b0f +e2833033 +e1520003 +1a000002 e59f0014 -ebfffd02 -e89da810 -ebfffd00 +ebfffcd6 +ea000001 +e59f000c +ebfffcd3 +e24bd010 e89da810 -00003cd1 -00001358 -00001350 +00001a14 +00001a40 e1a0c00d e92dd800 +e24cb004 e59f000c +ebfffcca +e3a03000 +e1a00003 +e89da800 +00001a48 +e1a0c00d +e92dd800 e24cb004 -ebfffcf7 -e3a00000 +e59f3004 +e1a00003 +e89da800 +00001b28 +e1a0c00d +e92dd800 +e24cb004 +e24dd010 +e50b0018 +e50b101c +e51b2018 +e51b301c +e0223003 +e50b3018 +e3a03000 +e50b3014 +ea000011 +e51b3018 +e2033001 +e20330ff +e3530000 +0a000002 +e59f3048 +e50b3010 +ea000001 +e3a03000 +e50b3010 +e51b3018 +e1a020c3 +e51b3010 +e0223003 +e50b3018 +e51b3014 +e2833001 +e50b3014 +e51b3014 +e3530007 +daffffea +e51b3018 +e1a00003 +e24bd00c e89da800 -00001384 -e59f0000 -e1a0f00e -00001428 -e0200001 -e3a01007 -e59f2014 -e2103001 -11a03002 -e2511001 -e02300c0 -5afffff9 -e1a0f00e edb88320 e1a0c00d -e3500000 e92dd800 -05910000 e24cb004 -089da800 -e3500001 -05910004 -089da800 -e3500002 -05910008 -089da800 -e3500003 -0591000c -089da800 -e3500004 -05910010 -089da800 -e3500005 -05910014 -089da800 -e3500006 -05910018 -089da800 -e59f0008 -ebfffccd -e3a00000 +e24dd00c +e50b0010 +e50b1014 +e51b3010 +e3530000 +1a000003 +e51b3014 +e5933000 +e50b3018 +ea00002c +e51b3010 +e3530001 +1a000003 +e51b3014 +e5933004 +e50b3018 +ea000025 +e51b3010 +e3530002 +1a000003 +e51b3014 +e5933008 +e50b3018 +ea00001e +e51b3010 +e3530003 +1a000003 +e51b3014 +e593300c +e50b3018 +ea000017 +e51b3010 +e3530004 +1a000003 +e51b3014 +e5933010 +e50b3018 +ea000010 +e51b3010 +e3530005 +1a000003 +e51b3014 +e5933014 +e50b3018 +ea000009 +e51b3010 +e3530006 +1a000003 +e51b3014 +e5933018 +e50b3018 +ea000002 +ebffff90 +e1a03000 +e50b3018 +e51b3018 +e1a00003 +e24bd00c e89da800 -00001384 -e3500000 -05821000 -0a000010 -e3500001 -05821004 -0a00000d -e3500002 -05821008 -0a00000a -e3500003 -0582100c -0a000007 -e3500004 -05821010 -0a000004 -e3500005 -05821014 -0a000001 -e3500006 -05821018 -e3a00000 -e1a0f00e e1a0c00d -e3500000 e92dd800 e24cb004 -089da800 -e3500001 -05913010 -01a03123 -02233001 -0a000011 -e3500002 -05913010 -02030004 -089da800 -e3500003 -0a00000a -e3500004 -05913010 -02030002 -089da800 -e3500007 -02400006 -089da800 -e59f0014 -ebfffc9b -e3a00000 +e24dd00c +e50b0010 +e50b1014 +e50b2018 +e51b3010 +e3530000 +1a000002 +e51b2018 +e51b3014 +e5823000 +e51b3010 +e3530001 +1a000002 +e51b2018 +e51b3014 +e5823004 +e51b3010 +e3530002 +1a000002 +e51b2018 +e51b3014 +e5823008 +e51b3010 +e3530003 +1a000002 +e51b2018 +e51b3014 +e582300c +e51b3010 +e3530004 +1a000002 +e51b2018 +e51b3014 +e5823010 +e51b3010 +e3530005 +1a000002 +e51b2018 +e51b3014 +e5823014 +e51b3010 +e3530006 +1a000002 +e51b2018 +e51b3014 +e5823018 +e3a03000 +e1a00003 +e24bd00c e89da800 -e5913010 -e2030001 +e1a0c00d +e92dd800 +e24cb004 +e24dd00c +e50b0010 +e50b1014 +e51b3010 +e3530000 +1a000002 +e3a03000 +e50b3018 +ea00002b +e51b3010 +e3530001 +1a000007 +e51b3014 +e5933010 +e2033004 +e3530000 +13a03000 +03a03001 +e50b3018 +ea000020 +e51b3010 +e3530002 +1a000004 +e51b3014 +e5933010 +e2033004 +e50b3018 +ea000018 +e51b3010 +e3530003 +1a000004 +e51b3014 +e5933010 +e2033001 +e50b3018 +ea000010 +e51b3010 +e3530004 +1a000004 +e51b3014 +e5933010 +e2033002 +e50b3018 +ea000008 +e51b3010 +e3530007 +1a000002 +e3a03001 +e50b3018 +ea000002 +ebffff1f +e1a03000 +e50b3018 +e51b3018 +e1a00003 +e24bd00c e89da800 -00001384 e1a0c00d -e92ddff0 +e92dd800 e24cb004 -e3a0a000 -e24dd01c -e59f9354 -e24b5044 -e50ba030 -e50ba044 -e50ba040 -e50ba03c -e50ba038 -e50ba034 -e50ba02c -e5951014 -e1a0000a -e7993101 -e5951000 -e1a024c3 -e1a0c243 -e1a04643 -e2026007 -e20c800f -e203700f -ebffff8a -e5951004 -ebffff88 -e5951008 -ebffff86 -e595100c -ebffff84 -e5951010 -ebffff82 -e5951018 -ebffff80 -e5951014 -ebffff7e -e3540000 -e1a0a000 -0a000018 -e3540001 -0a000029 -e3540002 -0a000037 -e3540003 -0a000049 -e3540004 -0a000055 -e3540005 -0a000069 -e3540006 -0a000082 -e3540007 -0a000093 -e354000f -1affffd5 -e59f328c -e1500003 -059f0288 +e24dd040 +e24b304c +e50b3030 +e3a03000 +e50b302c +e3a03000 +e50b3028 +e3a03000 +e50b3024 +e51b2030 +e3a03000 +e5823014 +e51b2030 +e3a03000 +e5823000 +e51b2030 +e3a03000 +e5823004 +e51b2030 +e3a03000 +e5823008 +e51b2030 +e3a03000 +e582300c +e51b2030 +e3a03000 +e5823010 +e51b2030 +e3a03000 +e5823018 +ebffff00 +e1a03000 +e50b3010 +ea000154 +e51b3030 +e5933014 +e1a02103 +e51b3010 +e0833002 +e5933000 +e50b3028 +e51b3028 +e1a03643 +e50b3024 +e51b3028 +e1a034c3 +e2033007 +e50b3020 +e51b3028 +e1a03243 +e203300f +e50b301c +e51b3028 +e203300f +e50b3018 +e51b3030 +e5933000 +e51b002c +e1a01003 +ebfffeea +e1a03000 +e50b302c +e51b3030 +e5933004 +e51b002c +e1a01003 +ebfffee3 +e1a03000 +e50b302c +e51b3030 +e5933008 +e51b002c +e1a01003 +ebfffedc +e1a03000 +e50b302c +e51b3030 +e593300c +e51b002c +e1a01003 +ebfffed5 +e1a03000 +e50b302c +e51b3030 +e5933010 +e51b002c +e1a01003 +ebfffece +e1a03000 +e50b302c +e51b3030 +e5933018 +e51b002c +e1a01003 +ebfffec7 +e1a03000 +e50b302c +e51b3030 +e5933014 +e51b002c +e1a01003 +ebfffec0 +e1a03000 +e50b302c +e51b3024 +e3530000 +1a000021 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff4d +e1a03000 +e3530000 +1a000005 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +ea0000fa +e51b3030 +e5933014 +e1a02103 +e51b3010 +e0833002 +e5933000 +e50b3014 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b001c +e51b1014 +e51b2030 +ebfffeff +ea0000e9 +e51b3024 +e3530001 +1a000018 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff28 +e1a03000 +e3530000 +0a0000db +e51b0018 +e51b1030 +ebfffeaf +e1a03000 +e1a02103 +e51b3010 +e0833002 +e5933000 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffee3 +ea0000cd +e51b3024 +e3530002 +1a00001c +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebffff0c +e1a03000 +e3530000 +0a0000bf +e51b0018 +e51b1030 +ebfffe93 +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffe8e +e1a03000 +e3530901 0a000001 -ebfffc64 -e59f0280 -ebfffc56 -e24bd028 -e89daff0 -e5957014 -e1a00006 -e2874001 -e1a01005 -e5854014 -ebffff99 -e3500000 -05953014 -02833001 -05853014 -0affffc1 -e595e014 -e1a00008 -e28e6001 -e799110e -e1a02005 -e5856014 -ebffff77 -eaffffb9 -e595c014 -e1a00006 -e28c3001 -e1a01005 -e5853014 -ebffff86 -e3500000 -0affffb1 -e1a01005 -e1a00007 -ebffff4e -e7991100 -e1a00008 -e1a02005 -ebffff67 -eaffffa9 -e5951014 -e1a00006 -e2812001 -e1a01005 -e5852014 -ebffff76 -e3500000 -0affffa1 -e1a01005 -e1a00007 -ebffff3e -e1a01005 -e1a04000 -e1a00008 -ebffff3a -e3500901 -1a000064 -e20400ff -ebfffc16 -eaffff95 -e595e014 -e1a00006 -e28e4001 -e1a01005 -e5854014 -ebffff62 -e3500000 -0affff8d -e1a01005 -e1a00007 -ebffff2a -e1a01000 -e1a00008 -eaffffda -e5953014 -e1a00006 -e1a01005 -e2836001 -e5856014 -ebffff54 -e3500000 -0affff7f -e1a00007 -e1a01005 -ebffff1c -e1a01005 -e1a04000 -e1a00008 -ebffff18 -e084c000 -e1a0080c -e1a07820 -e1a01007 -e1a00008 -e1a02005 -eaffffc5 -e5951014 -e1a00006 -e2812001 -e1a01005 -e5852014 -ebffff3e -e3500000 -0affff69 -e1a01005 -e1a00007 -ebffff06 -e1a01005 -e1a06000 -e1a00008 -ebffff02 -e060e006 -e35e0000 -e3a02000 -e1a08002 -02822004 -01a08002 -c3882001 -c1a08002 -b3888002 -b5858010 -a5852010 -eaffff56 -e595c014 -e1a00006 -e28c3001 -e1a01005 -e5853014 -ebffff23 -e3500000 -0affff4e -e1a00007 -e1a01005 -ebfffeeb -e1a01005 -e1a04000 -e1a00008 -ebfffee7 -e0047000 -e1a01007 -e1a00008 -eaffff96 -e5951014 -e1a00006 -e2812001 -e1a01005 -e5852014 -ebffff10 -e3500000 -0affff3b -e1a01005 -e1a00008 -ebfffed8 -e1e0e000 -e1a0080e -e1a01820 -e1a00008 -eaffff86 +ebfffe53 +ea0000c1 +e51b3014 +e20330ff +e1a00003 +ebfffb0d +ea0000ad +e51b3024 +e3530003 +1a000014 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffeec +e1a03000 +e3530000 +0a00009f +e51b0018 +e51b1030 +ebfffe73 +e1a03000 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffeab +ea000095 +e51b3024 +e3530004 +1a00001f +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffed4 +e1a03000 +e3530000 +0a000087 +e51b0018 +e51b1030 +ebfffe5b +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffe56 +e1a02000 +e51b3014 +e0833002 +e50b3014 +e51b3014 +e1a03803 +e1a03823 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffe88 +ea000072 +e51b3024 +e3530005 +1a000032 +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffeb1 +e1a03000 +e3530000 +0a000064 +e51b0018 +e51b1030 +ebfffe38 +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffe33 +e1a02000 +e51b3014 +e0623003 +e50b3014 +e51b2030 +e3a03000 +e5823010 +e51b3014 +e3530000 +1a000004 +e51b3030 +e5933010 +e3832004 +e51b3030 +e5832010 +e51b3014 +e3530000 +da000004 +e51b3030 +e5933010 +e3832001 +e51b3030 +e5832010 +e51b3014 +e3530000 +aa000042 +e51b3030 +e5933010 +e3832002 +e51b3030 +e5832010 +ea00003c +e51b3024 +e3530006 +1a00001b +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffe7b +e1a03000 +e3530000 +0a00002e +e51b0018 +e51b1030 +ebfffe02 +e1a03000 +e50b3014 +e51b001c +e51b1030 +ebfffdfd +e1a02000 +e51b3014 +e0033002 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffe33 +ea00001d +e51b3024 +e3530007 +1a00001a +e51b3030 +e5933014 +e2832001 +e51b3030 +e5832014 +e51b0020 +e51b1030 +ebfffe5c +e1a03000 +e3530000 +0a00000f +e51b001c +e51b1030 +ebfffde3 +e1a03000 +e50b3014 +e51b3014 +e1e03003 +e50b3014 +e51b3014 +e1a03803 +e1a03823 +e50b3014 +e51b001c +e51b1014 +e51b2030 +ebfffe14 +e51b3024 +e353000f +1afffea7 +e51b202c +e59f302c +e1520003 +0a000005 +e51b302c +e1a00003 +ebfffa78 +e59f0018 +ebfffa63 +ea000001 e59f0010 -eaffff61 -00001428 +ebfffa60 +e24bd00c +e89da800 ee861173 -00001358 -00001394 -00001384 +00001a58 +00001a14 e1a0c00d -e92dd810 -e2504000 +e92dd800 e24cb004 -e2440001 -e3a03001 -1a000001 +e24dd008 +e50b0010 +e51b3010 +e3530000 +1a000002 +e3a01001 +e50b1014 +ea000007 +e51b3010 +e2433001 e1a00003 -e89da810 -ebfffff5 -e0030094 +ebfffff0 +e1a02000 +e51b3010 +e0010293 +e50b1014 +e51b3014 e1a00003 -e89da810 +e24bd00c +e89da800 e1a0c00d e92dd800 -e3a00009 e24cb004 -ebffffed -e3a0100a -e0020190 -e59f3010 -e59f0010 +e3a0000a +ebffffe3 +e1a02000 +e3a039dd +e2833c1f e1520003 -059f000c -e89d6800 -eafffb9a -00375f00 -00001350 -00001358 +0a000002 +e59f0010 +ebfffa38 +ea000001 +e59f0008 +ebfffa35 +e89da800 +00001a40 +00001a14 +e1a0c00d +e92dd800 +e24cb004 +e24dd004 e1a0300e eb000009 e1a00000 @@ -1159,75 +1529,136 @@ e89da800 e0000291 e1a00000 e1a00000 -e1a0f00e +e89da808 e1a0c00d -e92dd810 +e92dd800 e24cb004 -ebffffe4 -e1a04000 -e3540722 -e59f001c -059f001c -0a000003 -ebfffb76 -e1a00004 -ebfffb80 +e24dd004 +ebffffe3 +e1a03000 +e50b3010 +e51b3010 +e3530722 +0a000007 +e59f0024 +ebfffa0b +e51b3010 +e1a00003 +ebfffa1b +e59f0014 +ebfffa06 +ea000001 e59f000c -e89d6810 -eafffb71 -0000139c -00001358 -00001354 +ebfffa03 +e89da808 +00001a60 +00001a74 +00001a14 e1a0c00d -e92dd810 -e59f406c +e92dd800 e24cb004 +e24dd004 +e3a03102 +e2833801 +e50b3010 +e59f00c4 +ebfff9f6 +e51b2010 +e59f30bc +e5823000 +e51b3010 +e2832004 +e59f30b0 +e5823000 +e51b3010 +e2832008 +e3a03c55 +e2833055 +e1833883 +e5823000 +e51b3010 +e283200c +e3a03caa +e28330aa +e1833783 +e5823000 +e59f007c +ebfff9e1 +e51b3010 +e2832901 +e3a03000 +e5823000 e59f0068 -ebfffb68 -e5943000 -e3530000 -0a000009 +ebfff9db +e51b3010 +e5933000 +e1a00003 +ebfff9ea +e51b3010 +e2833004 +e5933000 +e1a00003 +ebfff9e5 +e51b3010 +e2833008 +e5933000 +e1a00003 +ebfff9e0 +e51b3010 +e283300c +e5933000 +e1a00003 +ebfff9db +e59f0018 +ebfff9c6 +e89da808 +00001a78 +12345678 +87654321 +00001a84 +00001a94 +00001aa0 +e1a0c00d +e92dd800 +e24cb004 +e24dd004 +e59f0078 +ebfff9b9 +e59f3074 +e50b3010 +ea00000e +e59f006c +ebfff9b4 +e51b3010 +e5933000 +e1a00003 +ebfff9b0 e59f0058 -ebfffb63 -e5940000 -ebfffb61 -e59f004c -ebfffb5f +ebfff9ae +e51b3010 +e5933004 e1a0e00f -e594f004 -e5b43008 -eafffff3 -e59f0038 -ebfffb59 -ee113531 -e3130c01 -e20300ff -0afffffb -ebfffb4c -ee113531 -e3130c01 -e20300ff -0afffff6 +e1a0f003 +e51b3010 +e2833008 +e50b3010 +e51b3010 +e5933000 +e3530000 +1affffec +e59f0028 +ebfff9a1 +ebfff992 +e1a03000 +e20330ff +e1a00003 +ebfff98b eafffff9 -000013f0 -000013b0 -000013c4 -000013d0 -000013d4 -206d646c -6d2f6370 -00006c75 -74636166 -00000000 -6263346a -0000006f -006b6361 -696e696d -72616c62 -00000067 -65726f63 -73727563 -00000065 +00001ae8 +00001b70 +00001afc +00001b08 +00001b0c 33323130 37363534 42413938 @@ -1248,6 +1679,8 @@ eafffff9 23206574 00000000 4c494146 +0000000a +4c494146 62615b20 5d74726f 0000000a @@ -1258,6 +1691,35 @@ eafffff9 746c7573 73617720 00000020 +0000000a +6972775b +676e6974 +0000205d +6361635b +66206568 +6873756c +0000205d +6165725b +676e6964 +0000203a +00000a5d +206d646c +6d2f6370 +00006c75 +74636166 +00000000 +6263346a +0000006f +6c6c6563 +72616c75 +006d6172 +006b6361 +696e696d +72616c62 +00000067 +65726f63 +73727563 +00000065 74736554 636e6562 75722068 @@ -1274,20 +1736,6 @@ eafffff9 63617261 73726574 00000a2e -00001300 -00001228 -0000130c -0000118c -00001314 -00000b44 -0000131c -000000f8 -00001320 -00000dd4 -0000132c -00000be4 -00000000 -00000000 00000e30 00000009 00000e00 @@ -1306,468 +1754,20 @@ eafffff9 0000000a 00002e10 0000ffff -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 +00001aa4 +000017f0 +00001ab0 +0000173c +00001ab8 +00000b74 +00001ac0 +00001850 +00001acc +000001b4 +00001ad0 +000010a8 +00001adc +00000ca4 00000000 00000000 00000000 diff --git a/xst/Console.nexys2.v b/xst/Console.nexys2.v new file mode 100644 index 0000000..bf42439 --- /dev/null +++ b/xst/Console.nexys2.v @@ -0,0 +1,406 @@ +module MulDivDCM(input xtal, output clk); + parameter div = 5; + parameter mul = 2; + + wire CLKFX_BUF; + wire GND_BIT = 0; + BUFG CLKFX_BUFG_INST (.I(CLKFX_BUF), + .O(clk)); + DCM_SP DCM_SP_INST (.CLKFB(GND_BIT), + .CLKIN(xtal), + .DSSEN(GND_BIT), + .PSCLK(GND_BIT), + .PSEN(GND_BIT), + .PSINCDEC(GND_BIT), + .RST(GND_BIT), + .CLKFX(CLKFX_BUF)); + defparam DCM_SP_INST.CLK_FEEDBACK = "NONE"; + defparam DCM_SP_INST.CLKDV_DIVIDE = 2.0; + defparam DCM_SP_INST.CLKFX_DIVIDE = div; + defparam DCM_SP_INST.CLKFX_MULTIPLY = mul; + defparam DCM_SP_INST.CLKIN_DIVIDE_BY_2 = "FALSE"; + defparam DCM_SP_INST.CLKIN_PERIOD = 20.000; + defparam DCM_SP_INST.CLKOUT_PHASE_SHIFT = "NONE"; + defparam DCM_SP_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; + defparam DCM_SP_INST.DFS_FREQUENCY_MODE = "LOW"; + defparam DCM_SP_INST.DLL_FREQUENCY_MODE = "LOW"; + defparam DCM_SP_INST.DUTY_CYCLE_CORRECTION = "TRUE"; + defparam DCM_SP_INST.FACTORY_JF = 16'hC080; + defparam DCM_SP_INST.PHASE_SHIFT = 0; + defparam DCM_SP_INST.STARTUP_WAIT = "TRUE"; +endmodule + +module Console( + input xtal, + input rst, + output wire rstact, + output wire vs, hs, + output wire [2:0] r, g, + output wire [1:0] b, + input ps2c, ps2d, + output wire cr_nADV, cr_nCE, cr_nOE, cr_nWE, cr_CRE, cr_nLB, cr_nUB, cr_CLK, + inout wire [15:0] cr_DQ, + output wire [22:0] cr_A, + output wire st_nCE); + + wire pixclk, coreclk; + + wire [11:0] x, y; + wire border; + + assign coreclk = pixclk; + MulDivDCM dcm31_25(xtal, pixclk); + defparam dcm31_25.div = 4; + defparam dcm31_25.mul = 2; + + SyncGen sync(pixclk, vs, hs, x, y, border); + + wire [7:0] cschar; + wire [2:0] csrow; + wire [7:0] csdata; + + wire [10:0] vraddr; + wire [7:0] vrdata; + + wire [10:0] vwaddr; + wire [7:0] vwdata; + wire [7:0] serdata; + wire vwr, serwr; + wire [10:0] vscroll; + + wire odata; + + wire [6:0] vcursx; + wire [4:0] vcursy; + + reg [16:0] rsttimer = 17'h3FFFF; + always @(posedge coreclk) + if (rst) + rsttimer <= 17'h3FFFF; + else if (rsttimer) + rsttimer <= rsttimer - 1; + assign rstact = rsttimer != 17'h0; + + wire tookdata; + reg ps2_hasd = 0; + reg [7:0] ps2_d = 0; + wire sertxwr; + wire [7:0] sertxdata; + + CharSet cs(cschar, csrow, csdata); + VideoRAM vram(pixclk, vraddr + vscroll, vrdata, coreclk, vwaddr, vwdata, vwr); + VDisplay dpy(pixclk, x, y, vraddr, vrdata, cschar, csrow, csdata, vcursx, vcursy, odata); + RXState rxsm(coreclk, vwr, vwaddr, vwdata, vscroll, vcursx, vcursy, serwr, serdata); + PS2 ps2(coreclk, ps2c, ps2d, sertxwr, sertxdata); + System sys(.clk(coreclk), .rst(rstact), .sys_odata({serwr, serdata}), .sys_idata({ps2_hasd, ps2_d}), .sys_tookdata(tookdata), + .cr_nADV (cr_nADV), + .cr_nCE (cr_nCE), + .cr_nOE (cr_nOE), + .cr_nWE (cr_nWE), + .cr_CRE (cr_CRE), + .cr_nLB (cr_nLB), + .cr_nUB (cr_nUB), + .cr_CLK (cr_CLK), + .cr_A (cr_A), + .st_nCE (st_nCE), + .cr_DQ (cr_DQ)); + + always @(posedge coreclk) + if (sertxwr) + {ps2_hasd, ps2_d} <= {1'b1, sertxdata}; + else if (tookdata) + {ps2_hasd, ps2_d} <= {1'b0, 8'hxxxxxxxx}; + + wire [7:0] red, green, blue; + assign r = (odata ? 3'b111 : 0) | (x[8:7] ^ y[7:6]); + assign g = (odata ? 3'b111 : 0) | (x[7:6] ^ y[8:7]); + assign b = (odata ? 2'b11 : 0) | (x[8 ] ^ y[8 ]); +endmodule + +module SyncGen( + input pixclk, + output reg vs, hs, + output reg [11:0] x, y, + output reg border); + + parameter XRES = 640; + parameter XFPORCH = 16; + parameter XSYNC = 96; + parameter XBPORCH = 48; + + parameter YRES = 480; + parameter YFPORCH = 10; + parameter YSYNC = 2; + parameter YBPORCH = 29; + + always @(posedge pixclk) + begin + if (x >= (XRES + XFPORCH + XSYNC + XBPORCH)) + begin + if (y >= (YRES + YFPORCH + YSYNC + YBPORCH)) + y = 0; + else + y = y + 1; + x = 0; + end else + x = x + 1; + hs <= (x >= (XRES + XFPORCH)) && (x < (XRES + XFPORCH + XSYNC)); + vs <= (y >= (YRES + YFPORCH)) && (y < (YRES + YFPORCH + YSYNC)); + border <= (x > XRES) || (y > YRES); + end +endmodule + +module CharSet( + input [7:0] char, + input [2:0] row, + output wire [7:0] data); + + reg [7:0] rom [(256 * 8 - 1):0]; + + initial + $readmemb("ibmpc1.mem", rom); + + assign data = rom[{char, row}]; +endmodule + +module VideoRAM( + input pixclk, + input [10:0] raddr, + output reg [7:0] rdata, + input wclk, + input [10:0] waddr, + input [7:0] wdata, + input wr); + + reg [7:0] ram [2047 : 0]; + + always @(posedge pixclk) + rdata <= ram[raddr]; + + always @(posedge wclk) + if (wr) + ram[waddr] <= wdata; +endmodule + +module VDisplay( + input pixclk, + input [11:0] x, + input [11:0] y, + output wire [10:0] raddr, + input [7:0] rchar, + output wire [7:0] cschar, + output wire [2:0] csrow, + input [7:0] csdata, + input [6:0] cursx, + input [4:0] cursy, + output reg data); + + wire [7:0] col = x[11:3]; + wire [5:0] row = y[10:4]; + reg [7:0] ch; + reg [11:0] xdly; + + assign raddr = ({row,4'b0} + {row,6'b0} + {4'h0,col}); + assign cschar = rchar; + assign csrow = y[3:1]; + + reg [23:0] blinktime = 0; + + always @(posedge pixclk) blinktime <= blinktime + 1; + + wire curssel = (cursx == col) && (cursy == row) && blinktime[23]; + + always @(posedge pixclk) + xdly <= x; + + always @(posedge pixclk) + data = ((xdly < 80 * 8) && (y < 25 * 16)) ? (csdata[7 - xdly[2:0]] ^ curssel) : 0; +endmodule + +module RXState( + input clk25, + output reg vwr = 0, + output reg [10:0] vwaddr = 0, + output reg [7:0] vwdata = 0, + output reg [10:0] vscroll = 0, + output wire [6:0] vcursx, + output wire [4:0] vcursy, + input serwr, + input [7:0] serdata); + + parameter STATE_IDLE = 4'b0000; + parameter STATE_NEWLINE = 4'b0001; + parameter STATE_CLEAR = 4'b0010; + + reg [3:0] state = STATE_CLEAR; + + reg [6:0] x = 0; + reg [4:0] y = 0; + + assign vcursx = x; + assign vcursy = y; + + reg [10:0] clearstart = 0; + reg [10:0] clearend = 11'b11111111111; + + always @(posedge clk25) + case (state) + STATE_IDLE: if (serwr) begin + if (serdata == 8'h0A) begin + state <= STATE_NEWLINE; + x <= 0; + vwr <= 0; + end else if (serdata == 8'h0D) begin + x <= 0; + vwr <= 0; + end else if (serdata == 8'h0C) begin + clearstart <= 0; + clearend <= 11'b11111111111; + x <= 0; + y <= 0; + vscroll <= 0; + state <= STATE_CLEAR; + end else if (serdata == 8'h08) begin + if (x != 0) + x <= x - 1; + vwr <= 0; + end else begin + vwr <= 1; + vwaddr <= ({y,4'b0} + {y,6'b0} + {4'h0,x}) + vscroll; + vwdata <= serdata; + if (x == 79) begin + x <= 0; + state <= STATE_NEWLINE; + end else + x <= x + 1; + end + end + STATE_NEWLINE: + begin + vwr <= 0; + if (y == 24) begin + vscroll <= vscroll + 80; + clearstart <= (25 * 80) + vscroll; + clearend <= (26*80) + vscroll; + state <= STATE_CLEAR; + end else begin + y <= y + 1; + state <= STATE_IDLE; + end + end + STATE_CLEAR: + begin + vwr <= 1; + vwaddr <= clearstart; + vwdata <= 8'h20; + clearstart <= clearstart + 1; + if (clearstart == clearend) + state <= STATE_IDLE; + end + endcase +endmodule + +module PS2( + input pixclk, + input inclk, + input indata, + output reg wr, + output reg [7:0] data + ); + + reg [3:0] bitcount = 0; + reg [7:0] key = 0; + reg keyarrow = 0, keyup = 0, parity = 0; + + + /* Clock debouncing */ + reg lastinclk = 0; + reg [6:0] debounce = 0; + reg fixedclk = 0; + reg [11:0] resetcountdown = 0; + + reg [6:0] unshiftedrom [127:0]; initial $readmemh("scancodes.unshifted.hex", unshiftedrom); + reg [6:0] shiftedrom [127:0]; initial $readmemh("scancodes.shifted.hex", shiftedrom); + + reg mod_lshift = 0; + reg mod_rshift = 0; + reg mod_capslock = 0; + wire mod_shifted = (mod_lshift | mod_rshift) ^ mod_capslock; + + reg nd = 0; + reg lastnd = 0; + + always @(posedge pixclk) begin + if (inclk != lastinclk) begin + lastinclk <= inclk; + debounce <= 1; + resetcountdown <= 12'b111111111111; + end else if (debounce == 0) begin + fixedclk <= inclk; + resetcountdown <= resetcountdown - 1; + end else + debounce <= debounce + 1; + + if (nd ^ lastnd) begin + lastnd <= nd; + wr <= 1; + end else + wr <= 0; + end + + always @(negedge fixedclk) begin + if (resetcountdown == 0) + bitcount <= 0; + else if (bitcount == 10) begin + bitcount <= 0; + if(parity != (^ key)) begin + if(keyarrow) begin + casex(key) + 8'hF0: keyup <= 1; + 8'hxx: keyarrow <= 0; + endcase + end + else begin + if(keyup) begin + keyup <= 0; + keyarrow <= 0; + casex (key) + 8'h12: mod_lshift <= 0; + 8'h59: mod_rshift <= 0; + endcase + // handle this? I don't fucking know + end + else begin + casex(key) + 8'hE0: keyarrow <= 1; // handle these? I don't fucking know + 8'hF0: keyup <= 1; + 8'h12: mod_lshift <= 1; + 8'h59: mod_rshift <= 1; + 8'h14: mod_capslock <= ~mod_capslock; + 8'b0xxxxxxx: begin nd <= ~nd; data <= mod_shifted ? shiftedrom[key] : unshiftedrom[key]; end + 8'b1xxxxxxx: begin /* AAAAAAASSSSSSSS */ end + endcase + end + end + end + else begin + keyarrow <= 0; + keyup <= 0; + end + end else + bitcount <= bitcount + 1; + + case(bitcount) + 1: key[0] <= indata; + 2: key[1] <= indata; + 3: key[2] <= indata; + 4: key[3] <= indata; + 5: key[4] <= indata; + 6: key[5] <= indata; + 7: key[6] <= indata; + 8: key[7] <= indata; + 9: parity <= indata; + endcase + end + +endmodule diff --git a/xst/FireARM.ucf b/xst/FireARM.ucf index d26adb9..e0c4f58 100644 --- a/xst/FireARM.ucf +++ b/xst/FireARM.ucf @@ -1,33 +1,77 @@ -NET "xtal" LOC="ah15" | CLOCK_DEDICATED_ROUTE = FALSE | TNM_NET = xtal; -TIMESPEC "TS_xtal"=PERIOD "xtal" 100 MHz HIGH 50%; - -NET "dvi_d<11>" LOC="AN14" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<10>" LOC="AP14" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<9>" LOC="AB10" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<8>" LOC="AA10" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<7>" LOC="AN13" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<6>" LOC="AM13" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<5>" LOC="AA8" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<4>" LOC="AA9" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<3>" LOC="AP12" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<2>" LOC="AN12" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<1>" LOC="AC8" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_d<0>" LOC="AB8" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_xclk_p" LOC="AL11" | TNM="dvi_c" | IOSTANDARD=LVDCI_33; -NET "dvi_xclk_n" LOC="AL10" | TNM="dvi_c" | IOSTANDARD=LVDCI_33; -NET "dvi_hs" LOC="AM12" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_vs" LOC="AM11" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_de" LOC="AE8" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; -NET "dvi_reset_b" LOC="AK6" | TNM="dvi_d" | IOSTANDARD=LVDCI_33; - -NET "dvi_scl" LOC="u27" | SLEW=fast | PULLUP; -NET "dvi_sda" LOC="t29" | SLEW=fast | PULLUP; - -TIMESPEC "TS_dvi_setup" = FROM dvi_c TO dvi_d 500 ps; -TIMESPEC "TS_dvi_hold" = FROM dvi_d TO dvi_c 500 ps; - -NET "rst" LOC="E9"; -NET "rstact" LOC="F6"; - -NET "ps2c" LOC="T26" | CLOCK_DEDICATED_ROUTE = FALSE; -NET "ps2d" LOC="T25"; +NET "xtal" LOC="B8" | CLOCK_DEDICATED_ROUTE = FALSE | TNM_NET = xtal; +TIMESPEC "TS_xtal"=PERIOD "xtal" 50 MHz HIGH 50%; +//NET "coreclk" TNM = coreclk; + +//TIMESPEC TSctl = FROM coreclk TO CR_CTL 5ns; +//TIMESPEC TSdatao = FROM coreclk TO CR_DATA 5ns; +//TIMESPEC TSdatai = FROM CR_DATA TO coreclk 5ns; +//TIMESPEC TSaddr = FROM coreclk TO CR_ADDR 5ns; + +NET "cr_nADV" LOC="J4" | SLEW="fast" | TNM = CR_CTL; +NET "cr_nCE" LOC="R6" | SLEW="fast" | TNM = CR_CTL; +NET "cr_nOE" LOC="T2" | SLEW="fast" | TNM = CR_CTL; +NET "cr_nWE" LOC="N7" | SLEW="fast" | TNM = CR_CTL; +NET "cr_CRE" LOC="P7" | SLEW="fast" | TNM = CR_CTL; +NET "cr_nLB" LOC="K5" | SLEW="fast" | TNM = CR_CTL; +NET "cr_nUB" LOC="K4" | SLEW="fast" | TNM = CR_CTL; +NET "cr_CLK" LOC="H5" | SLEW="fast" | TNM = CR_CTL; + +NET "cr_DQ<0>" LOC="L1" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<1>" LOC="L4" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<2>" LOC="L6" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<3>" LOC="M4" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<4>" LOC="N5" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<5>" LOC="P1" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<6>" LOC="P2" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<7>" LOC="R2" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<8>" LOC="L3" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<9>" LOC="L5" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<10>" LOC="M3" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<11>" LOC="M6" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<12>" LOC="L2" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<13>" LOC="N4" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<14>" LOC="R3" | SLEW="fast" | TNM = CR_DATA; +NET "cr_DQ<15>" LOC="T1" | SLEW="fast" | TNM = CR_DATA; + +NET "cr_A<0>" LOC="J1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<1>" LOC="J2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<2>" LOC="H4" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<3>" LOC="H1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<4>" LOC="H2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<5>" LOC="J5" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<6>" LOC="H3" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<7>" LOC="H6" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<8>" LOC="F1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<9>" LOC="G3" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<10>" LOC="G6" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<11>" LOC="G5" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<12>" LOC="G4" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<13>" LOC="F2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<14>" LOC="E1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<15>" LOC="M5" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<16>" LOC="E2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<17>" LOC="C2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<18>" LOC="C1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<19>" LOC="D2" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<20>" LOC="K3" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<21>" LOC="D1" | SLEW="fast" | TNM = CR_ADDR; +NET "cr_A<22>" LOC="K6" | SLEW="fast" | TNM = CR_ADDR; +NET "st_nCE" LOC="R5" | SLEW="fast" | TNM = CR_CTL; + +NET "vs" LOC = "u3" |SLEW = "fast"; +NET "hs" LOC = "t4" |SLEW = "fast"; +NET "r<2>" LOC = "r8"; +NET "r<1>" LOC = "t8"; +NET "r<0>" LOC = "r9"; +NET "g<2>" LOC = "p6"; +NET "g<1>" LOC = "p8"; +NET "g<0>" LOC = "n8"; +NET "b<1>" LOC = "u4"; +NET "b<0>" LOC = "u5"; + +NET "rst" LOC="H13"; +NET "rstact" LOC="J14"; + +NET "ps2c" LOC="R12" | CLOCK_DEDICATED_ROUTE = FALSE; +NET "ps2d" LOC="P11"; + diff --git a/xst/FireARM.xst b/xst/FireARM.xst index 01b1093..5850e94 100644 --- a/xst/FireARM.xst +++ b/xst/FireARM.xst @@ -5,7 +5,7 @@ run -ifmt mixed -ofn FireARM -ofmt NGC --p xc5vlx110t-1-ff1136 +-p xc3s1200e-5-fg320 -top Console -opt_mode Speed -opt_level 1 diff --git a/xst/Makefile b/xst/Makefile index e4cd3a3..1c86905 100644 --- a/xst/Makefile +++ b/xst/Makefile @@ -1,8 +1,9 @@ TARGET = FireARM -VLOGS = Console.v \ +VLOGS = Console.nexys2.v \ ../ARM_Constants.v \ ../BigBlockRAM.v \ ../BlockRAM.v \ + ../CellularRAM.v \ ../BusArbiter.v \ ../DCache.v \ ../Decode.v \ @@ -41,7 +42,7 @@ BITGEN_OPTS = \ -g Match_cycle:2 \ -g DriveDone:No -fpga_target: $(TARGET).bit +fpga_target: $(TARGET).svf $(TARGET).ngc: $(TARGET).xst $(VLOGS_ALL) @mkdir -p xst/projnav.tmp @@ -71,10 +72,10 @@ sim/%.v: %.ngc netgen -ofmt verilog -w -dir sim $< $(TARGET).ngd: $(TARGET).ngc $(TARGET).ucf - ngdbuild -dd _ngo -uc $(TARGET).ucf -nt timestamp -p xc5vlx110t-ff1136-1 "$(TARGET).ngc" $(TARGET).ngd + ngdbuild -dd _ngo -uc $(TARGET).ucf -nt timestamp -p xc3s1200e-fg320-5 "$(TARGET).ngc" $(TARGET).ngd $(TARGET)_map.ncd: $(TARGET).ngd - map -w -p xc5vlx110t-ff1136-1 -cm area -pr off -k 4 -c 100 -o $(TARGET)_map.ncd $(TARGET).ngd $(TARGET).pcf + map -w -p xc3s1200e-fg320-5 -cm area -pr off -k 4 -c 100 -o $(TARGET)_map.ncd $(TARGET).ngd $(TARGET).pcf $(TARGET).ncd: $(TARGET)_map.ncd par -w -ol std -t 1 $(TARGET)_map.ncd $(TARGET).ncd $(TARGET).pcf