commit cbce52a426cc940ccc8a22ea740db1da623842d9
parent 3135f6941fddc27cbc35533a6c74ca7eb03211b4
Author: Brian Swetland <swetland@frotz.net>
Date: Thu, 16 Jan 2020 17:51:00 -0800
display: new vga/hdmi display and associated projects
- choice between 40 and 80 columns (and 1.5KB/2.5KB vram)
- choice between 1/2 and 1/4 ascii (and 4KB/2KB prom)
- video ram wraps at column boundaries now (old display
used 64x30 to store 40x30 cells)
- tidier timing generator
Diffstat:
10 files changed, 9234 insertions(+), 1 deletion(-)
diff --git a/hdl/display/display.sv b/hdl/display/display.sv
@@ -0,0 +1,222 @@
+// Copyright 2020, Brian Swetland <swetland@frotz.net>
+// Licensed under the Apache License, Version 2.0.
+
+`default_nettype none
+
+module display #(
+ parameter BPP = 2,
+
+ // WIDE=0 selects 80x30, 2.5KB VRAM
+ // WIDE=1 selects 40x30, 1.5KB VRAM
+ parameter WIDE = 0,
+
+ // MINIFONT=0 selects half-ascii (0 through 127) 4KB PROM
+ // MINIFONT=1 selects quarter-ascii (uppercase only) 2KB PROM
+ // (0..31 map to 32..63, 96..127 map to 64..95)
+ parameter MINIFONT = 0,
+
+ // horizontal timing (all values -1)
+ parameter HZNT_FRONT = 15,
+ parameter HZNT_SYNC = 95,
+ parameter HZNT_BACK = 47,
+ parameter HZNT_ACTIVE = 639,
+
+ // vertical timing (all values -1)
+ parameter VERT_FRONT = 11,
+ parameter VERT_SYNC = 1,
+ parameter VERT_BACK = 29,
+ parameter VERT_ACTIVE = 479
+ )(
+ input wire clk,
+
+ output wire [BPP-1:0]red,
+ output wire [BPP-1:0]grn,
+ output wire [BPP-1:0]blu,
+ output wire hsync,
+ output wire vsync,
+ output wire active,
+ output wire frame,
+
+ input wire wclk,
+ input wire [11:0]waddr,
+ input wire [7:0]wdata,
+ input wire we
+);
+
+localparam PWIDTH = WIDE ? 16 : 8;
+localparam PCOUNT = WIDE ? 15 : 7;
+localparam VRAMSZ = WIDE ? 1536 : 2560;
+localparam VRAMAW = WIDE ? 11 : 12;
+
+localparam PROMSZ = MINIFONT ? 1024 : 2048;
+localparam PROMAW = MINIFONT ? 10 : 11;
+
+wire hs;
+wire vs;
+wire start_frame;
+wire start_line;
+wire pxl_accept;
+wire [9:0]pxl_x;
+wire [9:0]pxl_y;
+
+assign hsync = hs;
+assign vsync = vs;
+assign active = pxl_accept;
+assign frame = start_frame;
+
+display_timing #(
+ .HZNT_FRONT(HZNT_FRONT),
+ .HZNT_SYNC(HZNT_SYNC),
+ .HZNT_BACK(HZNT_BACK),
+ .HZNT_ACTIVE(HZNT_ACTIVE),
+ .VERT_FRONT(VERT_FRONT),
+ .VERT_SYNC(VERT_SYNC),
+ .VERT_BACK(VERT_BACK),
+ .VERT_ACTIVE(VERT_ACTIVE)
+ ) timing (
+ .clk(clk),
+ .hsync(hs),
+ .vsync(vs),
+ .start_frame(start_frame),
+ .start_line(start_line),
+ .pxl_accept(pxl_accept),
+ .pxl_x(pxl_x),
+ .pxl_y(pxl_y)
+);
+
+// VIDEO RAM
+//
+reg [7:0] video_ram[0:VRAMSZ-1];
+
+`ifdef HEX_PATHS
+initial $readmemh("hdl/display/vram-40x30.hex", video_ram);
+`else
+initial $readmemh("vram-40x30.hex", video_ram);
+`endif
+
+wire re;
+wire [11:0] raddr;
+reg [7:0] vdata;
+
+always_ff @(posedge wclk) begin
+ if (we)
+ video_ram[waddr[VRAMAW-1:0]] <= wdata;
+end
+
+always_ff @(posedge clk) begin
+ if (re)
+ vdata <= video_ram[raddr[VRAMAW-1:0]];
+end
+
+// PATTERN ROM
+//
+reg [7:0] pattern_rom [0:PROMSZ-1];
+
+`ifdef HEX_PATHS
+generate
+if (MINIFONT) initial $readmemh("hdl/display/fontdata-8x16x64.hex", pattern_rom);
+else initial $readmemh("hdl/display/fontdata-8x16x128.hex", pattern_rom);
+endgenerate
+`else
+generate
+if (MINIFONT) initial $readmemh("fontdata-8x16x64.hex", pattern_rom);
+else initial $readmemh("fontdata-8x16x128.hex", pattern_rom);
+endgenerate
+`endif
+
+reg [7:0]character_id;
+
+wire [PROMAW-1:0] prom_addr;
+
+// generate pattern rom address based on character id
+// and the low bits of the display line
+generate
+if (MINIFONT) assign prom_addr = { character_id[6], character_id[4:0], pxl_y[3:0] };
+else assign prom_addr = { character_id[6:0], pxl_y[3:0] };
+endgenerate
+
+reg [7:0]prom_data;
+
+always_ff @(posedge clk) begin
+ prom_data <= pattern_rom[prom_addr];
+end
+
+reg [PWIDTH-1:0]pattern;
+reg [PWIDTH-1:0]pattern_next;
+reg [3:0]pattern_count;
+reg [3:0]pattern_count_next;
+reg [3:0]pattern_count_sub1;
+reg pattern_count_done;
+
+assign { pattern_count_done, pattern_count_sub1 } = { 1'b0, pattern_count } - 5'd1;
+
+reg load_character_addr = 1'b0;
+reg load_character_addr_next;
+
+reg [11:0]vram_raddr;
+reg [11:0]vram_raddr_next;
+reg [11:0]vram_saddr;
+reg [11:0]vram_saddr_next;
+wire [11:0]vram_raddr_add1 = vram_raddr + 12'd1;
+
+assign raddr = vram_raddr;
+assign re = load_character_addr;
+
+reg [PWIDTH-1:0]pattern_expand;
+generate
+ if (WIDE) assign pattern_expand = {
+ prom_data[7], prom_data[7], prom_data[6], prom_data[6],
+ prom_data[5], prom_data[5], prom_data[4], prom_data[4],
+ prom_data[3], prom_data[3], prom_data[2], prom_data[2],
+ prom_data[1], prom_data[1], prom_data[0], prom_data[0] };
+ else assign pattern_expand = prom_data;
+endgenerate
+
+always_comb begin
+ vram_raddr_next = vram_raddr;
+ vram_saddr_next = vram_saddr;
+ load_character_addr_next = 1'b0;
+ pattern_next = pattern;
+ pattern_count_next = pattern_count;
+
+ if (start_frame) begin
+ vram_raddr_next = 12'd0;
+ end
+ if (start_line) begin
+ load_character_addr_next = 1'b1;
+ // if we're at the first line of a character, save
+ // the vram address, otherwise rewind it back to the
+ // last start of line
+ if (pxl_y[3:0] == 4'b0000) begin
+ vram_saddr_next = vram_raddr;
+ end else begin
+ vram_raddr_next = vram_saddr;
+ end
+ end
+ if (pxl_accept) begin
+ if (pattern_count_done) begin
+ pattern_next = pattern_expand;
+ pattern_count_next = PCOUNT;
+ load_character_addr_next = 1'b1;
+ vram_raddr_next = vram_raddr_add1;
+ end else begin
+ pattern_next = { pattern[PWIDTH-2:0], 1'b0 };
+ pattern_count_next = pattern_count_sub1;
+ end
+ end
+end
+
+always_ff @(posedge clk) begin
+ pattern <= pattern_next;
+ pattern_count <= pattern_count_next;
+ load_character_addr = load_character_addr_next;
+ vram_raddr <= vram_raddr_next;
+ vram_saddr <= vram_saddr_next;
+ character_id <= vdata;
+end
+
+assign red = active ? { BPP {pattern[PWIDTH-1]} } : {BPP{1'b0}};
+assign grn = active ? { BPP {pattern[PWIDTH-1]} } : {BPP{1'b0}};
+assign blu = active ? { BPP {1'b1} } : {BPP{1'b0}};
+
+endmodule
diff --git a/hdl/display/display_timing.sv b/hdl/display/display_timing.sv
@@ -0,0 +1,205 @@
+// Copyright 2020, Brian Swetland <swetland@frotz.net>
+// Licensed under the Apache License, Version 2.0.
+
+`default_nettype none
+
+module display_timing #(
+ // horizontal timing (all values -1)
+ parameter HZNT_FRONT = 15,
+ parameter HZNT_SYNC = 95,
+ parameter HZNT_BACK = 47,
+ parameter HZNT_ACTIVE = 639,
+
+ // vertical timing (all values -1)
+ parameter VERT_FRONT = 11,
+ parameter VERT_SYNC = 1,
+ parameter VERT_BACK = 29,
+ parameter VERT_ACTIVE = 479
+)(
+ input wire clk,
+
+ output wire hsync,
+ output wire vsync,
+ output wire start_frame,
+ output wire start_line,
+ output wire pxl_accept,
+ output wire [9:0] pxl_x,
+ output wire [9:0] pxl_y
+);
+
+localparam HS_FRONT = 2'd0;
+localparam HS_SYNC = 2'd1;
+localparam HS_BACK = 2'd2;
+localparam HS_ACTIVE = 2'd3;
+
+localparam VS_FRONT = 2'd0;
+localparam VS_SYNC = 2'd1;
+localparam VS_BACK = 2'd2;
+localparam VS_ACTIVE = 2'd3;
+
+reg [1:0] v_state = VS_FRONT;
+reg [1:0] v_state_next;
+reg v_sync = 1'b1;
+reg v_sync_next;
+reg v_active = 1'b0;
+reg v_active_next;
+reg [9:0] v_count = 10'b0;
+reg [9:0] v_count_next;
+wire [9:0] v_count_add1;
+reg [7:0] v_countdown = VERT_FRONT;
+reg [7:0] v_countdown_next;
+wire [7:0] v_countdown_sub1;
+wire v_countdown_done;
+
+reg [1:0] h_state = HS_FRONT;
+reg [1:0] h_state_next;
+reg h_sync = 1'b1;
+reg h_sync_next;
+reg h_active = 1'b0;
+reg h_active_next;
+reg [9:0] h_count = 10'b0;
+reg [9:0] h_count_next;
+wire [9:0] h_count_add1;
+reg [7:0] h_countdown = HZNT_FRONT;
+reg [7:0] h_countdown_next;
+wire [7:0] h_countdown_sub1;
+wire h_countdown_done;
+
+reg new_line = 1'b0;
+reg new_frame = 1'b0;
+reg new_line_next;
+reg new_frame_next;
+
+assign v_count_add1 = v_count + 9'd1;
+assign h_count_add1 = h_count + 9'd1;
+
+assign { h_countdown_done, h_countdown_sub1 } = { 1'b0, h_countdown } - 9'd1;
+assign { v_countdown_done, v_countdown_sub1 } = { 1'b0, v_countdown } - 9'd1;
+
+// outputs
+assign hsync = h_sync;
+assign vsync = v_sync;
+assign start_frame = new_frame;
+assign start_line = new_line;
+assign pxl_accept = h_active & v_active;
+assign pxl_x = h_count;
+assign pxl_y = v_count;
+
+always_comb begin
+ h_state_next = h_state;
+ h_count_next = h_count;
+ h_countdown_next = h_countdown;
+ h_active_next = h_active;
+ h_sync_next = h_sync;
+ new_line_next = 1'b0;
+
+ case (h_state)
+ HS_FRONT: begin
+ if (h_countdown_done) begin
+ h_state_next = HS_SYNC;
+ h_countdown_next = HZNT_SYNC;
+ h_sync_next = 1'b0;
+ end else begin
+ h_countdown_next = h_countdown_sub1;
+ end
+ end
+ HS_SYNC: begin
+ if (h_countdown_done) begin
+ h_state_next = HS_BACK;
+ h_countdown_next = HZNT_BACK;
+ h_sync_next = 1'b1;
+ end else begin
+ h_countdown_next = h_countdown_sub1;
+ end
+ end
+ HS_BACK: begin
+ if (h_countdown_done) begin
+ h_state_next = HS_ACTIVE;
+ h_countdown_next = HZNT_FRONT;
+ h_active_next = 1'b1;
+ end else begin
+ h_countdown_next = h_countdown_sub1;
+ end
+ end
+ HS_ACTIVE: begin
+ if (h_count == HZNT_ACTIVE) begin
+ h_state_next = HS_FRONT;
+ h_count_next = 0;
+ new_line_next = 1'b1;
+ h_active_next = 1'b0;
+ end else begin
+ h_count_next = h_count_add1;
+ end
+ end
+ endcase
+end
+
+always_comb begin
+ v_state_next = v_state;
+ v_count_next = v_count;
+ v_countdown_next = v_countdown;
+ v_active_next = v_active;
+ v_sync_next = v_sync;
+ new_frame_next = 1'b0;
+
+ case (v_state)
+ VS_FRONT: begin
+ if (v_countdown_done) begin
+ v_state_next = VS_SYNC;
+ v_countdown_next = VERT_SYNC;
+ v_sync_next = 1'b0;
+ end else begin
+ v_countdown_next = v_countdown_sub1;
+ end
+ end
+ VS_SYNC: begin
+ if (v_countdown_done) begin
+ v_state_next = VS_BACK;
+ v_countdown_next = VERT_BACK;
+ v_sync_next = 1'b1;
+ end else begin
+ v_countdown_next = v_countdown_sub1;
+ end
+ end
+ VS_BACK: begin
+ if (v_countdown_done) begin
+ v_state_next = VS_ACTIVE;
+ v_countdown_next = VERT_FRONT;
+ v_active_next = 1'b1;
+ end else begin
+ v_countdown_next = v_countdown_sub1;
+ end
+ end
+ VS_ACTIVE: begin
+ if (v_count == VERT_ACTIVE) begin
+ v_state_next = VS_FRONT;
+ v_count_next = 0;
+ v_active_next = 1'b0;
+ new_frame_next = 1'b1;
+ end else begin
+ v_count_next = v_count_add1;
+ end
+ end
+ endcase
+end
+
+always_ff @(posedge clk) begin
+ h_state <= h_state_next;
+ h_sync <= h_sync_next;
+ h_count <= h_count_next;
+ h_countdown <= h_countdown_next;
+ h_active <= h_active_next;
+
+ new_line <= new_line_next;
+ new_frame <= new_frame_next & new_line_next;
+
+ if (new_line_next) begin
+ v_state <= v_state_next;
+ v_sync <= v_sync_next;
+ v_count <= v_count_next;
+ v_countdown <= v_countdown_next;
+ v_active <= v_active_next;
+ end
+end
+
+endmodule
diff --git a/hdl/display/fontdata-8x16x128.hex b/hdl/display/fontdata-8x16x128.hex
@@ -0,0 +1,2048 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+81
+a5
+81
+81
+bd
+99
+81
+81
+7e
+00
+00
+00
+00
+00
+00
+7e
+ff
+db
+ff
+ff
+c3
+e7
+ff
+ff
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+6c
+ee
+fe
+fe
+fe
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+fe
+fe
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+18
+3c
+3c
+5a
+ff
+ff
+5a
+18
+3c
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+fe
+fe
+ee
+54
+10
+38
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+3c
+3c
+18
+00
+00
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ff
+ff
+e7
+c3
+c3
+e7
+ff
+ff
+ff
+ff
+ff
+ff
+00
+00
+00
+00
+00
+3c
+66
+42
+42
+66
+3c
+00
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ff
+c3
+99
+bd
+bd
+99
+c3
+ff
+ff
+ff
+ff
+ff
+00
+00
+1e
+06
+0a
+7a
+cc
+84
+84
+cc
+78
+00
+00
+00
+00
+00
+00
+00
+3c
+66
+42
+42
+66
+3c
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+08
+0c
+0a
+0a
+0a
+08
+08
+08
+78
+f8
+70
+00
+00
+00
+00
+00
+10
+18
+14
+12
+1a
+16
+12
+72
+f2
+62
+0e
+1e
+0c
+00
+00
+00
+00
+00
+10
+92
+7c
+6c
+c6
+6c
+7c
+92
+10
+00
+00
+00
+00
+00
+00
+80
+c0
+e0
+f8
+fe
+f8
+e0
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+02
+06
+0e
+3e
+fe
+3e
+0e
+06
+02
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+10
+d6
+7c
+38
+10
+00
+00
+00
+00
+00
+66
+66
+66
+66
+66
+66
+66
+00
+66
+66
+00
+00
+00
+00
+00
+00
+7f
+db
+db
+db
+db
+7b
+1b
+1b
+1b
+1b
+00
+00
+00
+00
+00
+7c
+c6
+60
+38
+6c
+c6
+c6
+6c
+38
+0c
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+fe
+fe
+fe
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+d6
+7c
+38
+10
+fe
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+10
+10
+10
+10
+00
+00
+00
+00
+00
+00
+10
+10
+10
+10
+10
+10
+d6
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+00
+10
+18
+0c
+fe
+0c
+18
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+30
+60
+fe
+60
+30
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c0
+c0
+c0
+c0
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+24
+42
+ff
+42
+24
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+10
+38
+38
+7c
+7c
+fe
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+fe
+7c
+7c
+38
+38
+10
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+78
+78
+78
+30
+30
+30
+00
+30
+30
+00
+00
+00
+00
+00
+66
+66
+22
+22
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6c
+6c
+fe
+6c
+6c
+fe
+6c
+6c
+00
+00
+00
+00
+00
+00
+10
+10
+7c
+d6
+d6
+70
+38
+1c
+d6
+d6
+7c
+10
+10
+00
+00
+00
+00
+60
+92
+96
+6c
+18
+30
+6c
+d2
+92
+0c
+00
+00
+00
+00
+00
+00
+38
+6c
+6c
+38
+30
+76
+dc
+cc
+cc
+76
+00
+00
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+0c
+18
+30
+30
+30
+30
+30
+30
+18
+0c
+00
+00
+00
+00
+00
+00
+30
+18
+0c
+0c
+0c
+0c
+0c
+0c
+18
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+66
+3c
+ff
+3c
+66
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+10
+20
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+00
+00
+00
+00
+00
+00
+00
+02
+06
+0c
+18
+30
+60
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+ce
+de
+f6
+e6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+18
+38
+78
+18
+18
+18
+18
+18
+18
+7e
+00
+00
+00
+00
+00
+00
+7c
+c6
+86
+06
+0c
+18
+30
+60
+c0
+fe
+00
+00
+00
+00
+00
+00
+7c
+c6
+06
+06
+3c
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+0c
+1c
+3c
+6c
+cc
+cc
+fe
+0c
+0c
+1e
+00
+00
+00
+00
+00
+00
+fe
+c0
+c0
+c0
+fc
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+fc
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+06
+0c
+0c
+18
+18
+30
+30
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+7c
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+7e
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+06
+0c
+18
+30
+60
+30
+18
+0c
+06
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+00
+00
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+60
+30
+18
+0c
+06
+0c
+18
+30
+60
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+06
+0c
+18
+18
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+3c
+42
+9d
+a5
+a5
+ad
+b6
+40
+3c
+00
+00
+00
+00
+00
+00
+38
+6c
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+7c
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+c0
+c0
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+ce
+c6
+c6
+c6
+7e
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+3c
+18
+18
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+1e
+0c
+0c
+0c
+0c
+0c
+cc
+cc
+cc
+78
+00
+00
+00
+00
+00
+00
+e6
+66
+66
+66
+7c
+78
+6c
+66
+66
+e6
+00
+00
+00
+00
+00
+00
+f0
+60
+60
+60
+60
+60
+60
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+82
+c6
+ee
+fe
+fe
+d6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+86
+c6
+e6
+f6
+fe
+de
+ce
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+d6
+de
+7c
+06
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+6c
+6c
+66
+e6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c2
+60
+38
+0c
+06
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7e
+7e
+5a
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+6c
+38
+10
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+d6
+fe
+ee
+c6
+82
+00
+00
+00
+00
+00
+00
+c6
+c6
+6c
+7c
+38
+38
+7c
+6c
+c6
+c6
+00
+00
+00
+00
+00
+00
+66
+66
+66
+66
+3c
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+0c
+18
+30
+60
+c2
+c6
+fe
+00
+00
+00
+00
+00
+00
+3c
+30
+30
+30
+30
+30
+30
+30
+30
+3c
+00
+00
+00
+00
+00
+00
+00
+80
+c0
+60
+30
+18
+0c
+06
+02
+00
+00
+00
+00
+00
+00
+00
+3c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+3c
+00
+00
+00
+00
+10
+38
+6c
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+00
+00
+18
+18
+10
+08
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+e0
+60
+60
+7c
+66
+66
+66
+66
+66
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+1c
+0c
+0c
+7c
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+1c
+36
+30
+78
+30
+30
+30
+30
+30
+78
+00
+00
+00
+00
+00
+00
+00
+00
+00
+76
+cc
+cc
+cc
+cc
+cc
+7c
+0c
+cc
+78
+00
+00
+00
+e0
+60
+60
+6c
+76
+66
+66
+66
+66
+e6
+00
+00
+00
+00
+00
+00
+18
+18
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+0c
+0c
+00
+1c
+0c
+0c
+0c
+0c
+0c
+0c
+cc
+cc
+78
+00
+00
+00
+e0
+60
+60
+66
+6c
+78
+78
+6c
+66
+e6
+00
+00
+00
+00
+00
+00
+38
+18
+18
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ec
+fe
+d6
+d6
+d6
+d6
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+dc
+66
+66
+66
+66
+66
+66
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+dc
+66
+66
+66
+66
+66
+7c
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+cc
+cc
+cc
+cc
+cc
+7c
+0c
+0c
+1e
+00
+00
+00
+00
+00
+00
+de
+76
+60
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+60
+38
+0c
+c6
+7c
+00
+00
+00
+00
+00
+00
+10
+30
+30
+fc
+30
+30
+30
+30
+34
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+cc
+cc
+cc
+cc
+cc
+78
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+d6
+d6
+d6
+d6
+fe
+6c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+c6
+6c
+38
+6c
+c6
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+7e
+06
+0c
+f8
+00
+00
+00
+00
+00
+00
+fe
+8c
+18
+30
+60
+c2
+fe
+00
+00
+00
+00
+00
+00
+0e
+18
+18
+18
+70
+18
+18
+18
+18
+0e
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+00
+00
+18
+18
+18
+18
+00
+00
+00
+00
+00
+00
+70
+18
+18
+18
+0e
+18
+18
+18
+18
+70
+00
+00
+00
+00
+00
+00
+76
+dc
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+38
+6c
+c6
+c6
+c6
+fe
+00
+00
+00
+00
+00
diff --git a/hdl/display/fontdata-8x16x256.hex b/hdl/display/fontdata-8x16x256.hex
@@ -0,0 +1,4096 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+81
+a5
+81
+81
+bd
+99
+81
+81
+7e
+00
+00
+00
+00
+00
+00
+7e
+ff
+db
+ff
+ff
+c3
+e7
+ff
+ff
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+6c
+ee
+fe
+fe
+fe
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+fe
+fe
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+18
+3c
+3c
+5a
+ff
+ff
+5a
+18
+3c
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+fe
+fe
+ee
+54
+10
+38
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+3c
+3c
+18
+00
+00
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ff
+ff
+e7
+c3
+c3
+e7
+ff
+ff
+ff
+ff
+ff
+ff
+00
+00
+00
+00
+00
+3c
+66
+42
+42
+66
+3c
+00
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ff
+c3
+99
+bd
+bd
+99
+c3
+ff
+ff
+ff
+ff
+ff
+00
+00
+1e
+06
+0a
+7a
+cc
+84
+84
+cc
+78
+00
+00
+00
+00
+00
+00
+00
+3c
+66
+42
+42
+66
+3c
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+08
+0c
+0a
+0a
+0a
+08
+08
+08
+78
+f8
+70
+00
+00
+00
+00
+00
+10
+18
+14
+12
+1a
+16
+12
+72
+f2
+62
+0e
+1e
+0c
+00
+00
+00
+00
+00
+10
+92
+7c
+6c
+c6
+6c
+7c
+92
+10
+00
+00
+00
+00
+00
+00
+80
+c0
+e0
+f8
+fe
+f8
+e0
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+02
+06
+0e
+3e
+fe
+3e
+0e
+06
+02
+00
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+10
+d6
+7c
+38
+10
+00
+00
+00
+00
+00
+66
+66
+66
+66
+66
+66
+66
+00
+66
+66
+00
+00
+00
+00
+00
+00
+7f
+db
+db
+db
+db
+7b
+1b
+1b
+1b
+1b
+00
+00
+00
+00
+00
+7c
+c6
+60
+38
+6c
+c6
+c6
+6c
+38
+0c
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+fe
+fe
+fe
+00
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+d6
+7c
+38
+10
+fe
+00
+00
+00
+00
+00
+10
+38
+7c
+d6
+10
+10
+10
+10
+10
+10
+00
+00
+00
+00
+00
+00
+10
+10
+10
+10
+10
+10
+d6
+7c
+38
+10
+00
+00
+00
+00
+00
+00
+00
+00
+10
+18
+0c
+fe
+0c
+18
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+30
+60
+fe
+60
+30
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c0
+c0
+c0
+c0
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+24
+42
+ff
+42
+24
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+10
+38
+38
+7c
+7c
+fe
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+fe
+7c
+7c
+38
+38
+10
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+78
+78
+78
+30
+30
+30
+00
+30
+30
+00
+00
+00
+00
+00
+66
+66
+22
+22
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6c
+6c
+fe
+6c
+6c
+fe
+6c
+6c
+00
+00
+00
+00
+00
+00
+10
+10
+7c
+d6
+d6
+70
+38
+1c
+d6
+d6
+7c
+10
+10
+00
+00
+00
+00
+60
+92
+96
+6c
+18
+30
+6c
+d2
+92
+0c
+00
+00
+00
+00
+00
+00
+38
+6c
+6c
+38
+30
+76
+dc
+cc
+cc
+76
+00
+00
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+0c
+18
+30
+30
+30
+30
+30
+30
+18
+0c
+00
+00
+00
+00
+00
+00
+30
+18
+0c
+0c
+0c
+0c
+0c
+0c
+18
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+66
+3c
+ff
+3c
+66
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+10
+20
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+00
+00
+00
+00
+00
+00
+00
+02
+06
+0c
+18
+30
+60
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+ce
+de
+f6
+e6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+18
+38
+78
+18
+18
+18
+18
+18
+18
+7e
+00
+00
+00
+00
+00
+00
+7c
+c6
+86
+06
+0c
+18
+30
+60
+c0
+fe
+00
+00
+00
+00
+00
+00
+7c
+c6
+06
+06
+3c
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+0c
+1c
+3c
+6c
+cc
+cc
+fe
+0c
+0c
+1e
+00
+00
+00
+00
+00
+00
+fe
+c0
+c0
+c0
+fc
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+fc
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+06
+0c
+0c
+18
+18
+30
+30
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+7c
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+7e
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+06
+0c
+18
+30
+60
+30
+18
+0c
+06
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+00
+00
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+60
+30
+18
+0c
+06
+0c
+18
+30
+60
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+06
+0c
+18
+18
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+3c
+42
+9d
+a5
+a5
+ad
+b6
+40
+3c
+00
+00
+00
+00
+00
+00
+38
+6c
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+7c
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+c0
+c0
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+ce
+c6
+c6
+c6
+7e
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+3c
+18
+18
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+1e
+0c
+0c
+0c
+0c
+0c
+cc
+cc
+cc
+78
+00
+00
+00
+00
+00
+00
+e6
+66
+66
+66
+7c
+78
+6c
+66
+66
+e6
+00
+00
+00
+00
+00
+00
+f0
+60
+60
+60
+60
+60
+60
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+82
+c6
+ee
+fe
+fe
+d6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+86
+c6
+e6
+f6
+fe
+de
+ce
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+d6
+de
+7c
+06
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+6c
+6c
+66
+e6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c2
+60
+38
+0c
+06
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7e
+7e
+5a
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+6c
+38
+10
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+d6
+fe
+ee
+c6
+82
+00
+00
+00
+00
+00
+00
+c6
+c6
+6c
+7c
+38
+38
+7c
+6c
+c6
+c6
+00
+00
+00
+00
+00
+00
+66
+66
+66
+66
+3c
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+0c
+18
+30
+60
+c2
+c6
+fe
+00
+00
+00
+00
+00
+00
+3c
+30
+30
+30
+30
+30
+30
+30
+30
+3c
+00
+00
+00
+00
+00
+00
+00
+80
+c0
+60
+30
+18
+0c
+06
+02
+00
+00
+00
+00
+00
+00
+00
+3c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+3c
+00
+00
+00
+00
+10
+38
+6c
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+00
+00
+18
+18
+10
+08
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+e0
+60
+60
+7c
+66
+66
+66
+66
+66
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+1c
+0c
+0c
+7c
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+1c
+36
+30
+78
+30
+30
+30
+30
+30
+78
+00
+00
+00
+00
+00
+00
+00
+00
+00
+76
+cc
+cc
+cc
+cc
+cc
+7c
+0c
+cc
+78
+00
+00
+00
+e0
+60
+60
+6c
+76
+66
+66
+66
+66
+e6
+00
+00
+00
+00
+00
+00
+18
+18
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+0c
+0c
+00
+1c
+0c
+0c
+0c
+0c
+0c
+0c
+cc
+cc
+78
+00
+00
+00
+e0
+60
+60
+66
+6c
+78
+78
+6c
+66
+e6
+00
+00
+00
+00
+00
+00
+38
+18
+18
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ec
+fe
+d6
+d6
+d6
+d6
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+dc
+66
+66
+66
+66
+66
+66
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+dc
+66
+66
+66
+66
+66
+7c
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+cc
+cc
+cc
+cc
+cc
+7c
+0c
+0c
+1e
+00
+00
+00
+00
+00
+00
+de
+76
+60
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+60
+38
+0c
+c6
+7c
+00
+00
+00
+00
+00
+00
+10
+30
+30
+fc
+30
+30
+30
+30
+34
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+cc
+cc
+cc
+cc
+cc
+78
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+d6
+d6
+d6
+d6
+fe
+6c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+c6
+6c
+38
+6c
+c6
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+7e
+06
+0c
+f8
+00
+00
+00
+00
+00
+00
+fe
+8c
+18
+30
+60
+c2
+fe
+00
+00
+00
+00
+00
+00
+0e
+18
+18
+18
+70
+18
+18
+18
+18
+0e
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+00
+00
+18
+18
+18
+18
+00
+00
+00
+00
+00
+00
+70
+18
+18
+18
+0e
+18
+18
+18
+18
+70
+00
+00
+00
+00
+00
+00
+76
+dc
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+10
+38
+6c
+c6
+c6
+c6
+fe
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+c0
+c0
+c6
+c6
+7c
+10
+08
+70
+00
+00
+00
+cc
+cc
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+06
+0c
+10
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+30
+78
+cc
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+cc
+cc
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+c0
+60
+10
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+30
+48
+30
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+c0
+c6
+7c
+10
+08
+70
+00
+00
+18
+3c
+66
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+c6
+c6
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+c0
+60
+10
+00
+7c
+c6
+c6
+fe
+c0
+c6
+7c
+00
+00
+00
+00
+00
+00
+66
+66
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+18
+3c
+66
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+c0
+60
+10
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+c6
+c6
+00
+38
+6c
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+38
+44
+38
+38
+6c
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+06
+0c
+10
+fe
+66
+62
+68
+78
+68
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7c
+12
+72
+9e
+90
+92
+7c
+00
+00
+00
+00
+00
+00
+3e
+6a
+c8
+c8
+cc
+fc
+c8
+c8
+ca
+ce
+00
+00
+00
+00
+00
+18
+3c
+66
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+c6
+c6
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+c0
+60
+10
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+30
+78
+cc
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+c0
+60
+10
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+c6
+c6
+00
+c6
+c6
+c6
+c6
+c6
+c6
+7e
+06
+0c
+78
+00
+c6
+c6
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+c6
+c6
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+10
+10
+7c
+d6
+d0
+d0
+d6
+7c
+10
+10
+00
+00
+00
+00
+00
+00
+38
+6c
+60
+f0
+60
+60
+60
+60
+f2
+dc
+00
+00
+00
+00
+00
+00
+66
+66
+66
+3c
+18
+7e
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+00
+f8
+cc
+cc
+f8
+c4
+cc
+de
+cc
+cc
+c6
+00
+00
+00
+00
+00
+00
+0e
+1b
+18
+18
+7e
+18
+18
+18
+18
+18
+18
+d8
+70
+00
+00
+06
+0c
+10
+00
+78
+0c
+7c
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+06
+0c
+10
+00
+38
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+06
+0c
+10
+00
+7c
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+06
+0c
+10
+00
+cc
+cc
+cc
+cc
+cc
+cc
+76
+00
+00
+00
+00
+00
+00
+76
+dc
+00
+dc
+66
+66
+66
+66
+66
+66
+00
+00
+00
+00
+76
+dc
+00
+86
+c6
+e6
+f6
+fe
+de
+ce
+c6
+c6
+00
+00
+00
+00
+00
+70
+18
+78
+d8
+6c
+00
+fc
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+78
+cc
+cc
+78
+00
+fc
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+00
+30
+30
+60
+c0
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+c0
+c0
+c0
+c0
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+06
+06
+06
+06
+00
+00
+00
+00
+00
+60
+e0
+64
+6c
+78
+30
+60
+dc
+b6
+0c
+18
+3e
+00
+00
+00
+00
+60
+e0
+64
+6c
+78
+30
+6c
+dc
+ac
+3e
+0c
+0c
+00
+00
+00
+00
+00
+30
+30
+00
+30
+30
+30
+78
+78
+78
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+36
+6c
+d8
+6c
+36
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+d8
+6c
+36
+6c
+d8
+00
+00
+00
+00
+00
+00
+00
+55
+00
+55
+00
+55
+00
+55
+00
+55
+00
+55
+00
+55
+00
+55
+aa
+55
+aa
+55
+aa
+55
+aa
+55
+aa
+55
+aa
+55
+aa
+55
+aa
+55
+ff
+55
+ff
+55
+ff
+55
+ff
+55
+ff
+55
+ff
+55
+ff
+55
+ff
+55
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+f8
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+f8
+18
+f8
+18
+18
+18
+18
+18
+18
+18
+36
+36
+36
+36
+36
+36
+36
+36
+f6
+36
+36
+36
+36
+36
+36
+36
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+36
+36
+36
+36
+36
+36
+36
+00
+00
+00
+00
+00
+00
+f8
+18
+f8
+18
+18
+18
+18
+18
+18
+18
+36
+36
+36
+36
+36
+36
+f6
+06
+f6
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+00
+00
+00
+00
+00
+00
+fe
+06
+f6
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+f6
+06
+fe
+00
+00
+00
+00
+00
+00
+00
+36
+36
+36
+36
+36
+36
+36
+36
+fe
+00
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+18
+18
+f8
+18
+f8
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+f8
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+1f
+00
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+18
+18
+18
+18
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+1f
+18
+18
+18
+18
+18
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+18
+18
+18
+18
+ff
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+1f
+18
+1f
+18
+18
+18
+18
+18
+18
+18
+36
+36
+36
+36
+36
+36
+36
+36
+37
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+37
+30
+3f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+3f
+30
+37
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+f7
+00
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+f7
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+37
+30
+37
+36
+36
+36
+36
+36
+36
+36
+00
+00
+00
+00
+00
+00
+ff
+00
+ff
+00
+00
+00
+00
+00
+00
+00
+36
+36
+36
+36
+36
+36
+f7
+00
+f7
+36
+36
+36
+36
+36
+36
+36
+18
+18
+18
+18
+18
+18
+ff
+00
+ff
+00
+00
+00
+00
+00
+00
+00
+36
+36
+36
+36
+36
+36
+36
+36
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+ff
+18
+18
+18
+18
+18
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+3f
+00
+00
+00
+00
+00
+00
+00
+18
+18
+18
+18
+18
+18
+1f
+18
+1f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1f
+18
+1f
+18
+18
+18
+18
+18
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+3f
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+36
+ff
+36
+36
+36
+36
+36
+36
+36
+18
+18
+18
+18
+18
+18
+ff
+18
+ff
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+f8
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+1f
+18
+18
+18
+18
+18
+18
+18
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+f0
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+0f
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+74
+dc
+c8
+c8
+c8
+dc
+76
+00
+00
+00
+00
+00
+00
+78
+cc
+cc
+d8
+cc
+c6
+c6
+c6
+dc
+c0
+40
+00
+00
+00
+00
+00
+fe
+62
+60
+60
+60
+60
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+00
+00
+02
+7e
+ec
+6c
+6c
+6c
+6c
+48
+00
+00
+00
+00
+00
+00
+fe
+c2
+60
+30
+18
+30
+60
+c0
+c2
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+d0
+c8
+c8
+c8
+c8
+70
+00
+00
+00
+00
+00
+00
+00
+00
+00
+cc
+cc
+cc
+cc
+cc
+cc
+f8
+80
+80
+00
+00
+00
+00
+00
+00
+00
+7e
+d8
+18
+18
+18
+18
+10
+00
+00
+00
+00
+00
+00
+38
+10
+7c
+d6
+d6
+d6
+d6
+7c
+10
+38
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+6c
+28
+28
+ee
+00
+00
+00
+00
+00
+00
+3c
+62
+30
+18
+7c
+cc
+cc
+cc
+cc
+78
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6e
+db
+db
+db
+76
+00
+00
+00
+00
+00
+00
+00
+00
+00
+02
+06
+7c
+ce
+de
+d6
+f6
+e6
+7c
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+3c
+60
+c0
+f8
+c0
+60
+3c
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+00
+00
+fe
+00
+00
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+7e
+18
+18
+00
+00
+ff
+00
+00
+00
+00
+00
+00
+00
+30
+18
+0c
+06
+0c
+18
+30
+00
+7e
+00
+00
+00
+00
+00
+00
+00
+0c
+18
+30
+60
+30
+18
+0c
+00
+7e
+00
+00
+00
+00
+00
+00
+0e
+1b
+1b
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+d8
+d8
+d8
+70
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+7e
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+76
+dc
+00
+76
+dc
+00
+00
+00
+00
+00
+00
+00
+38
+6c
+6c
+38
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+00
+00
+00
+00
+00
+00
+00
+00
+0f
+0c
+0c
+0c
+0c
+0c
+ec
+6c
+6c
+3c
+1c
+00
+00
+00
+00
+00
+d8
+6c
+6c
+6c
+6c
+6c
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+70
+98
+18
+30
+60
+f8
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+7e
+7e
+7e
+7e
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/hdl/display/fontdata-8x16x64.hex b/hdl/display/fontdata-8x16x64.hex
@@ -0,0 +1,1024 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+78
+78
+78
+30
+30
+30
+00
+30
+30
+00
+00
+00
+00
+00
+66
+66
+22
+22
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+6c
+6c
+fe
+6c
+6c
+fe
+6c
+6c
+00
+00
+00
+00
+00
+00
+10
+10
+7c
+d6
+d6
+70
+38
+1c
+d6
+d6
+7c
+10
+10
+00
+00
+00
+00
+60
+92
+96
+6c
+18
+30
+6c
+d2
+92
+0c
+00
+00
+00
+00
+00
+00
+38
+6c
+6c
+38
+30
+76
+dc
+cc
+cc
+76
+00
+00
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+0c
+18
+30
+30
+30
+30
+30
+30
+18
+0c
+00
+00
+00
+00
+00
+00
+30
+18
+0c
+0c
+0c
+0c
+0c
+0c
+18
+30
+00
+00
+00
+00
+00
+00
+00
+00
+00
+66
+3c
+ff
+3c
+66
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+7e
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+10
+20
+00
+00
+00
+00
+00
+00
+00
+00
+00
+fe
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+30
+30
+00
+00
+00
+00
+00
+00
+00
+02
+06
+0c
+18
+30
+60
+c0
+80
+00
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+ce
+de
+f6
+e6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+18
+38
+78
+18
+18
+18
+18
+18
+18
+7e
+00
+00
+00
+00
+00
+00
+7c
+c6
+86
+06
+0c
+18
+30
+60
+c0
+fe
+00
+00
+00
+00
+00
+00
+7c
+c6
+06
+06
+3c
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+0c
+1c
+3c
+6c
+cc
+cc
+fe
+0c
+0c
+1e
+00
+00
+00
+00
+00
+00
+fe
+c0
+c0
+c0
+fc
+06
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c0
+c0
+fc
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+06
+0c
+0c
+18
+18
+30
+30
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+7c
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+7e
+06
+06
+c6
+7c
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+00
+00
+18
+18
+00
+00
+00
+18
+18
+08
+10
+00
+00
+00
+00
+00
+00
+06
+0c
+18
+30
+60
+30
+18
+0c
+06
+00
+00
+00
+00
+00
+00
+00
+00
+00
+7e
+00
+00
+7e
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+60
+30
+18
+0c
+06
+0c
+18
+30
+60
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+06
+0c
+18
+18
+00
+18
+18
+00
+00
+00
+00
+00
+00
+00
+3c
+42
+9d
+a5
+a5
+ad
+b6
+40
+3c
+00
+00
+00
+00
+00
+00
+38
+6c
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+7c
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+c0
+c0
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+66
+66
+66
+66
+fc
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+fe
+66
+62
+68
+78
+78
+68
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c0
+c0
+ce
+c6
+c6
+c6
+7e
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+fe
+c6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+3c
+18
+18
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+1e
+0c
+0c
+0c
+0c
+0c
+cc
+cc
+cc
+78
+00
+00
+00
+00
+00
+00
+e6
+66
+66
+66
+7c
+78
+6c
+66
+66
+e6
+00
+00
+00
+00
+00
+00
+f0
+60
+60
+60
+60
+60
+60
+62
+66
+fe
+00
+00
+00
+00
+00
+00
+82
+c6
+ee
+fe
+fe
+d6
+c6
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+86
+c6
+e6
+f6
+fe
+de
+ce
+c6
+c6
+c6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+60
+60
+60
+f0
+00
+00
+00
+00
+00
+00
+7c
+c6
+c6
+c6
+c6
+c6
+c6
+d6
+de
+7c
+06
+00
+00
+00
+00
+00
+fc
+66
+66
+66
+66
+7c
+6c
+6c
+66
+e6
+00
+00
+00
+00
+00
+00
+7c
+c6
+c2
+60
+38
+0c
+06
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+7e
+7e
+5a
+18
+18
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+7c
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+c6
+c6
+6c
+38
+10
+00
+00
+00
+00
+00
+00
+c6
+c6
+c6
+c6
+c6
+d6
+fe
+ee
+c6
+82
+00
+00
+00
+00
+00
+00
+c6
+c6
+6c
+7c
+38
+38
+7c
+6c
+c6
+c6
+00
+00
+00
+00
+00
+00
+66
+66
+66
+66
+3c
+18
+18
+18
+18
+3c
+00
+00
+00
+00
+00
+00
+fe
+c6
+86
+0c
+18
+30
+60
+c2
+c6
+fe
+00
+00
+00
+00
+00
+00
+3c
+30
+30
+30
+30
+30
+30
+30
+30
+3c
+00
+00
+00
+00
+00
+00
+00
+80
+c0
+60
+30
+18
+0c
+06
+02
+00
+00
+00
+00
+00
+00
+00
+3c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+0c
+3c
+00
+00
+00
+00
+10
+38
+6c
+c6
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+ff
+00
+00
diff --git a/hdl/display/vram-40x30.hex b/hdl/display/vram-40x30.hex
@@ -0,0 +1,1536 @@
+48
+65
+6c
+6c
+6f
+2c
+20
+44
+69
+73
+70
+6c
+61
+79
+20
+57
+6f
+72
+6c
+64
+21
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+01
+02
+03
+04
+05
+06
+07
+08
+09
+0a
+0b
+0c
+0d
+0e
+0f
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+1a
+1b
+1c
+1d
+1e
+1f
+00
+00
+00
+00
+00
+00
+00
+00
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+2a
+2b
+2c
+2d
+2e
+2f
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+3a
+3b
+3c
+3d
+3e
+3f
+00
+00
+00
+00
+00
+00
+00
+00
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+4a
+4b
+4c
+4d
+4e
+4f
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+5a
+5b
+5c
+5d
+5e
+5f
+00
+00
+00
+00
+00
+00
+00
+00
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+6a
+6b
+6c
+6d
+6e
+6f
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+7a
+7b
+7c
+7d
+7e
+7f
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/hdl/icebreaker_hdmi111.sv b/hdl/icebreaker_hdmi111.sv
@@ -0,0 +1,85 @@
+// Copyright 2018, Brian Swetland <swetland@frotz.net>
+// Licensed under the Apache License, Version 2.0.
+
+`default_nettype none
+
+module top(
+ input clk12m_in,
+ output hdmi_red,
+ output hdmi_grn,
+ output hdmi_blu,
+ output hdmi_hsync,
+ output hdmi_vsync,
+ output hdmi_de,
+ output hdmi_clk,
+ input uart_rx,
+ output uart_tx,
+ output led_red,
+ output led_grn
+);
+
+wire clk12m;
+wire clk25m;
+
+pll_12_25 pll0 (
+ .clk12m_in(clk12m_in),
+ .clk12m_out(clk12m),
+ .clk25m_out(clk25m),
+ .lock(),
+ .reset(1'b1)
+);
+
+`ifdef verilator
+assign hdmi_clk = clk25m;
+`else
+SB_IO #(
+ .PIN_TYPE(6'b010000), // DDR OUTPUT
+ .PULLUP(1'b0),
+ .NEG_TRIGGER(1'b0),
+ .IO_STANDARD("SB_LVCMOS")
+ ) hdmi_clk_io (
+ .PACKAGE_PIN(hdmi_clk),
+ .LATCH_INPUT_VALUE(),
+ .CLOCK_ENABLE(), // per docs, leave discon for always enable
+ .INPUT_CLK(),
+ .OUTPUT_CLK(clk25m),
+ .D_OUT_0(1'b1),
+ .D_OUT_1(1'b0),
+ .D_IN_0(),
+ .D_IN_1()
+ );
+`endif
+
+wire [15:0]dbg_wdata;
+wire [15:0]dbg_waddr;
+wire dbg_we;
+
+display #(
+ .BPP(1),
+ ) display0 (
+ .clk(clk25m),
+ .red(hdmi_red),
+ .grn(hdmi_grn),
+ .blu(hdmi_blu),
+ .hsync(hdmi_hsync),
+ .vsync(hdmi_vsync),
+ .active(hdmi_de),
+ .frame(),
+ .wclk(clk25m),
+ .waddr(dbg_waddr[11:0]),
+ .wdata(dbg_wdata[7:0]),
+ .we(dbg_we)
+);
+
+uart_debug_ifc uart(
+ .sys_clk(clk12m),
+ .sys_wr(dbg_we),
+ .sys_waddr(dbg_waddr),
+ .sys_wdata(dbg_wdata),
+ .uart_rx(uart_rx),
+ .uart_tx(uart_tx),
+ .led_red(led_red),
+ .led_grn(led_grn)
+ );
+
+endmodule
diff --git a/hdl/lattice/pll_12_25.v b/hdl/lattice/pll_12_25.v
@@ -38,7 +38,9 @@ defparam pll_inst.SHIFTREG_DIV_MODE = 2'b00;
defparam pll_inst.PLLOUT_SELECT_PORTB = "GENCLK";
defparam pll_inst.ENABLE_ICEGATE_PORTA = 1'b0;
defparam pll_inst.ENABLE_ICEGATE_PORTB = 1'b0;
-
+`else
+assign clk12m_out = clk12m_in;
+assign clk25m_out = clk12m_in;
`endif
endmodule
diff --git a/project/display.def b/project/display.def
@@ -0,0 +1,6 @@
+
+PROJECT_TYPE := verilator-sim
+
+PROJECT_SRCS := hdl/testdisplay.sv hdl/display/display.sv hdl/display/display_timing.sv
+
+PROJECT_VOPTS := -CFLAGS -DVGA
diff --git a/project/icebreaker-hdmi111.def b/project/icebreaker-hdmi111.def
@@ -0,0 +1,9 @@
+
+PROJECT_TYPE := nextpnr-ice40
+
+PROJECT_SRCS := hdl/icebreaker_hdmi111.sv hdl/board_icebreaker_hdmi111.pcf
+PROJECT_SRCS += hdl/lattice/pll_12_25.v
+PROJECT_SRCS += hdl/uart_debug_ifc.sv hdl/uart_rx.sv hdl/crc8_serial.sv
+PROJECT_SRCS += hdl/display/display.sv hdl/display/display_timing.sv
+
+PROJECT_NEXTPNR_OPTS := --package sg48 --up5k