OpenCores
URL https://opencores.org/ocsvn/cpu8080/cpu8080/trunk

Subversion Repositories cpu8080

[/] [cpu8080/] [trunk/] [project/] [vgachr.v] - Blame information for rev 21

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 15 samiam9512
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company: 
4
// Engineer: 
5
// 
6
// Create Date:    12:02:03 10/22/2006 
7
// Design Name: 
8
// Module Name:    vgachr 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: 
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: 
19
//
20 18 samiam9512
// Simulation plugs exist in this code. Look for "????? SIMULATION PLUG"
21
//
22
// Debug plugs exist in this code. Look for "????? DEBUG PLUG"
23
//
24 15 samiam9512
//////////////////////////////////////////////////////////////////////////////////
25
 
26
////////////////////////////////////////////////////////////////////////////////
27
//
28
// TERMINAL EMULATOR
29
//
30
// Emulates an ADM 3A dumb terminal, with a MITS serial I/O board interface.
31
// Two ports are emulated:
32
//
33
// 0: Control
34
// 1: Data
35
//
36
// The MITS serial card has all of its configuration performed by jumpers on the
37
// card, which means there is no programming configuration required. The data
38
// to the terminal is sent out of the data port, while the data from the 
39
// keyboard, which is not yet implemented, is read from the same data port.
40
// The parity is ignored on output, and set to 0 on input.
41
//
42
// The control register ignores all writes, and returns $80 if the terminal is
43
// busy, otherwise $00. This is the output ready to send bit. The busy bit
44
// reflects if the state machine is processing an operation. This is a cheat
45
// that only works with our emulated terminal/serial board pair, because 
46
// normally there is no way for the local CPU to know that the remote terminal
47
// is busy. This can lead to problems in the real world, and it's why Unix
48
// "termcap" terminal descriptions commonly have waiting periods perscribed
49
// time consuming operations like screen clear. This emulated terminal is
50
// "ideal" in that it accounts for all of this automatically, but it does not
51
// hurt the realisim of the emulation. An application that performs delays based
52
// on real terminal operations won't be incorrect because it performs a delay,
53
// but a stupid application that relies on this "smart" implementation might
54
// fail to run on the real thing.
55
//
56 20 samiam9512
// The ADM 3A terminal emulation is based on "ADM-3A Operators manual" of 1979,
57
// and "ADM 3A Dumb Terminal Users Reference Manual" of April, 1986, and the
58
// Unix termcap definition of the terminal.
59 18 samiam9512
//
60 20 samiam9512
// Several actions of terminals are typically not listed in the documentation,
61
// and the ADM 3A is no different. That's why termcap exists. The following
62
// actions were derived from the termcap definition:
63 18 samiam9512
//
64 20 samiam9512
// 1. The screen clear command also homes the cursor.
65
// 2. Giving the terminal a right cursor command while at the right side of the
66
// 3. Screen wraps the cursor around to the right, one line down. If the cursor
67
//    is at the 80th collumn of the 24th line, it will then scroll.
68
// 4. Down cursor (line feed) on the 24th line scrolls the screen.
69 18 samiam9512
//
70 20 samiam9512
// Note that rule (3) causes the terminal to be unable to ever write a character
71
// to the collumn 80 character of line 24, which is interesting if you are
72
// writing a full screen editor. The ADM 3A had a switch for this behavior, but
73
// the user could hardly be expected to open the side panel and flip this switch
74
// to be able to edit.
75
//
76
// The following actions are unknown:
77
//
78
// 1. A cursor left command given when the cursor is at the left side of the 
79
//    screen has unknown effect. According to termcap, it is not to go to the
80
//    end of the next line up. I have guessed here that it is to simply
81
//    refuse to move.
82
// 2. A cursor up command given when the cursor is at the top of the screen
83
//    has unknown effect. I have guessed here that is is to simply refuse to
84
//    move.
85
//
86
// These are terminal features there are no plans to implement:
87
//
88
// 1. ENQ or answerback mode. This appears to require operator setup, the manual
89
// does not specify any useful default value for the 32 byte answerback, 
90
// otherwise it might serve as sort of an early plug and play. If there is an
91
// application out there that uses this, I would put it in.
92 18 samiam9512
// 2. Bell (where would it go?).
93 20 samiam9512
// 3. Ctrl-N and Ctrl-O keyboard locking and extention port. I'm not sure 
94
// locking has a good use, nor is all that great an idea.
95
// 4. Any of the setup modes or features, as operated by the keyboard.
96 18 samiam9512
//
97 20 samiam9512
// Not implemented in this version:
98 18 samiam9512
//
99 20 samiam9512
// 1. Reduced intensity mode.
100
// 2. Graphics mode.
101 18 samiam9512
//
102 20 samiam9512
// The ADM 3A terminal will pretty much serve as an upward compatible version
103
// of the ASR-33 teletypes (Western Union Surplus) that were also commonly used
104
// in the time of the Altair. The ADM 3A was a common replacement for such
105
// units.
106
//
107
// Bugs/problems/issues:
108
//
109
// 1. The emulation was occasionally observed to hang. The CPU was still running
110
// and polling the keyboard, but no reply is received when keys are hit. The rdy
111
// signal is not coming from the low level keyboard logic.
112
// 2. Cursor left at left hand side does not refuse to move (see above).
113
// 3. moving to the 80th collum on line 24 and typing a character does not cause
114
// the screen to scroll.
115
// 4. On sign-on, the first two characters are missing the top row. I suspect
116
// this is due to the start of frame character preloading that is done.
117
// 5. \ESCGc or set attributes does not work from the keyboard unless you hit
118
// caps lock or hold the shift key down before and after the escape. It should
119
// work anytime the upper case G is hit.
120
//
121 15 samiam9512
 
122
//
123
// Terminal height and width
124
//
125
`define scnchrs 80 // width
126
`define scnlins 24 // height
127
 
128
//
129
// Terminal states
130
//
131 20 samiam9512
`define term_idle    5'h00 // idle
132
`define term_wrtstd2 5'h01 // write standard character #2
133
`define term_wrtstd3 5'h02 // write standard character #3
134
`define term_wrtstd4 5'h03 // write standard character #4
135
`define term_clear   5'h04 // clear screen and home cursor
136
`define term_clear2  5'h05 // clear screen and home cursor #2
137
`define term_clear3  5'h06 // clear screen and home cursor #3
138
`define term_clear4  5'h07 // clear screen and home cursor #4
139
`define term_fndstr  5'h08 // find start of current line
140
`define term_scroll  5'h09 // scroll screen
141
`define term_scroll1 5'h0a // scroll screen #1
142
`define term_scroll2 5'h0b // scroll screen #2
143
`define term_scroll3 5'h0c // scroll screen #3
144
`define term_scroll4 5'h0d // scroll screen #4
145
`define term_scroll5 5'h0e // scroll screen #5
146
`define term_scroll6 5'h0f // scroll screen #6
147
`define term_esc     5'h10 // escape
148
`define term_poscur  5'h11 // position cursor
149
`define term_poscur2 5'h12 // position cursor #2
150
`define term_attset  5'h13 // set screen attributes
151 15 samiam9512
 
152 20 samiam9512
//
153
// Terminal attribute bits
154
//
155
`define attr_blank   5'b00001 // blank
156
`define attr_blink   5'b00010 // blink
157
`define attr_reverse 5'b00100 // reverse
158
`define attr_under   5'b01000 // underline
159
`define attr_rinten  5'b10000 // reduced intensity
160
 
161 15 samiam9512
module terminal(addr, data, write, read, select, r, g, b, hsync_n, vsync_n,
162 18 samiam9512
                ps2_clk, ps2_data, reset, clock, diag);
163 15 samiam9512
 
164 18 samiam9512
   input        addr;     // control reg/data reg address
165
   inout [7:0]  data;     // CPU data
166
   input        write;    // CPU write
167
   input        read;     // CPU read
168
   input        select;   // controller select
169
   input        reset;    // CPU reset
170
   input        clock;    // CPU clock
171
   output [2:0] r, g, b;  // R,G,B color output buses
172
   output       hsync_n;  // horizontal sync pulse
173
   output       vsync_n;  // vertical sync pulse
174
   input        ps2_clk;  // clock from keyboard
175
   input        ps2_data; // data from keyboard
176
   output [7:0] diag;     // diagnostic 8 bit port
177 15 samiam9512
 
178 20 samiam9512
   // internal definitions
179
   reg [4:0]   state;   // terminal state machine
180 15 samiam9512
   reg [10:0]  cursor;  // cursor address
181 18 samiam9512
   reg [10:0]  tcursor; // cursor temp address
182 15 samiam9512
   reg [7:0]   chrdatw; // character write data
183
   reg         outrdy;  // output ready to send
184
   reg         wrtchr;  // character ready to write
185
   reg  [7:0]  datao;   // intermediate for data output
186 20 samiam9512
   reg  [7:0]  rowchr;  // row holding character
187
   reg  [4:0]  curatr;  // current attribute set
188 15 samiam9512
 
189
   // character map communication bus
190
   reg  [10:0] cmaddr;  // character map address to read or write
191
   reg         cmread;  // character map read from address
192
   reg         cmwrite; // character map write from address
193
   wire  [7:0] cmdata;  // character map data to be written/read
194 20 samiam9512
   wire  [4:0] cmattr;  // character map attributes to be written/read
195 15 samiam9512
   reg   [7:0] cmdatai; // character map data to be written
196
   reg         cmdatae; // character map data enable
197 20 samiam9512
   reg   [7:0] cmattri; // character map attribute to be written
198
   reg         cmattre; // character map attribute enable
199 15 samiam9512
 
200 18 samiam9512
   // keyboard communication
201
   wire   [7:0] scancode;   // key scancode
202
   wire         parity;     // keyboard parity
203
   wire         busy;       // busy scanning code
204
   wire         rdy;        // ready with code
205
   wire         error;      // scancode error
206
   reg          scnrdy;     // scancode 
207 20 samiam9512
   reg          extkey;     // is extended key
208 18 samiam9512
   reg          capslock;   // caps lock toggle
209
   reg          leftshift;  // state of left shift key
210
   reg          rightshift; // state of right shift key
211
   reg          leftctrl;   // state of left control key
212
   reg          rightctrl;  // state of right control key
213
   reg          relcod;     // release code active
214
   reg          extcod;     // extention code active
215
   wire   [7:0] asciidata;  // output of lookup rom
216
   wire   [7:0] asciidatau; // output of lookup rom
217
   reg          clrrdy;     // clear input ready
218
 
219
   // here we put signals out the diagnostic port if required.
220
   assign diag[0] = busy;
221
   assign diag[1] = rdy;
222
   assign diag[2] = scnrdy;
223
   assign diag[3] = ps2_clk;
224
   assign diag[4] = ps2_data;
225
   assign diag[5] = relcod;
226
   assign diag[6] = leftctrl;
227
   assign diag[7] = rightctrl;
228
 
229 15 samiam9512
   // instantiate memory mapped character display
230
   chrmemmap display(!reset, clock, r, g, b, hsync_n, vsync_n, cmaddr, cmread,
231 20 samiam9512
                     cmwrite, cmdata, cmattr, cursor);
232 15 samiam9512
 
233 18 samiam9512
   // instantiate ps/2 keyboard. Note that the keyboard decoder only generates
234
   // codes on release, which has to be changed, since we need both asserts and
235
   // deasserts.
236 15 samiam9512
   ps2_kbd vgai(.clk(clock), .rst(reset), .ps2_clk(ps2_clk), .ps2_data(ps2_data),
237
                .scancode(scancode), .parity(parity), .busy(busy), .rdy(rdy),
238
                .error(error));
239
 
240 18 samiam9512
   // instantiate keyboard scan lookup roms
241
   scnrom kbdtbl(scancode, asciidata); // lower case
242
   scnromu kbdtblu(scancode, asciidatau); // lower case
243
 
244
   // process keyboard input state
245
   always @(posedge clock)
246
      if (reset) begin // perform reset actions
247
 
248
         leftshift <= 0; // clear left shift key state
249
         rightshift <= 0; // clear right shift key state
250
         leftctrl <= 0; // clear left control key state
251
         rightctrl <= 0; // clear right control key state
252
         capslock <= 0; // clear caps lock state
253
         relcod <= 0; // clear release status
254
         scnrdy <= 0; // clear key ready
255 20 samiam9512
         extkey <= 0; // is an extended key
256 18 samiam9512
 
257
   end else begin
258
 
259
      if (rdy) begin
260
 
261
          // if the release code $f0 occurs, set release until the next key occurs
262
          if (scancode == 8'hf0) relcod <= 1;
263
          // if the extention code $e0 occurs, set the extention flag
264 20 samiam9512
          else if (scancode == 8'he0) extcod <= 1;
265 18 samiam9512
          else if (relcod) begin // release
266
 
267
             relcod <= 0; // reset release code
268
             // reset any extention code
269
             if (scancode != 8'hf0 && scancode != 8'he0) extcod <= 0;
270
             // if caps lock is hit, toggle caps lock status
271
             if (scancode == 8'h58) capslock <= !capslock;
272
             // process left and right shift key up
273
             if (scancode == 8'h12) leftshift <= 0; // left up
274
             if (scancode == 8'h59) rightshift <= 0; // right up
275
             // process control key up
276
             if (scancode == 8'h14) begin
277
 
278
                if (extcod) rightctrl <= 0; // right up
279
                else leftctrl <= 0; // left up
280
 
281
             end
282
 
283
          end else begin // assert
284
 
285
             scnrdy <= 1; // set key is ready
286 20 samiam9512
             extkey <= extcod; // set extended status of key
287 18 samiam9512
             // reset any extention code
288
             if (scancode != 8'hf0 && scancode != 8'he0) extcod <= 0;
289
             // process left and right shift key down
290
             if (scancode == 8'h12) leftshift <= 1; // left down
291
             if (scancode == 8'h59) rightshift <= 1; // right down
292
             // process control key down
293
             if (scancode == 8'h14) begin
294
 
295
                if (extcod) rightctrl <= 1; // right down
296
                else leftctrl <= 1; // left down
297
 
298
             end
299
 
300
          end
301
 
302
      end else if (clrrdy) scnrdy <= 0; // clear key ready
303
 
304
   end
305
 
306 20 samiam9512
   // process terminal emulation
307 18 samiam9512
   always @(posedge clock)
308 15 samiam9512
      if (reset) begin // reset
309
 
310
         // on reset, we set the state machine to perform a screen clear and
311
         // home cursor
312 18 samiam9512
         // ????? SIMULATION PLUG
313
         // Don't clear screen, this takes too long in simulation
314 15 samiam9512
         state <= `term_clear; // set to clear screen
315 18 samiam9512
         // state <= `term_idle; // continue
316 15 samiam9512
         cursor <= 0; // set cursor to home
317
         outrdy <= 0; // set not ready to send
318
         wrtchr <= 0; // set no character to write
319
         cmread <= 0; // clear read character
320
         cmwrite <= 0; // clear write character
321
         cmdatae <= 0; // no enable character map data
322 20 samiam9512
         cmattre <= 0; // no enable character map attributes
323 18 samiam9512
         clrrdy <= 0; // set clear ready off
324 20 samiam9512
         curatr <= 5'b0; // set no attributes active
325 18 samiam9512
 
326
   end else begin
327 15 samiam9512
 
328 18 samiam9512
      if (write&select) begin // CPU write
329 15 samiam9512
 
330 18 samiam9512
         if (addr) begin
331
 
332
            chrdatw <= data & 8'h7f; // set character write data without parity
333
            wrtchr <= 1; // character ready to write
334
            outrdy <= 0; // remove ready to send
335
 
336
         end
337
 
338
      end else if (read&select) begin // CPU read
339
 
340
         if (addr) begin
341
 
342
            // Return decoded keyboard, with shifting. The letter keys, 'a'-'z',
343
            // can be shifted by the shift keys, but not by caps lock state.
344
            // The other keys can be shifted by either. This matches PC 
345
            // behavior, which lets you have cap locks on without shifting the
346
            // letter keys. The control codes are shifted as a block from `($60)
347
            // to ~($7e) down to $00. This leaves out \US and \DEL, but these
348
            // codes get generated by the DEL key.
349 20 samiam9512
            if (extkey) begin // its an extended key
350
 
351
               if (scancode == 8'h75) datao <= 8'h0b; // up
352
               else if (scancode == 8'h6b) datao <= 8'h08; // left
353
               else if (scancode == 8'h72) datao <= 8'h0a; // down
354
               else if (scancode == 8'h74) datao <= 8'h0c; // right
355
               else if (scancode == 8'h6c) datao <= 8'h1e; // home
356
               else if (scancode == 8'h71) datao <= 8'h1f; // delete (rub out)
357
 
358
            end else if (asciidata >= 8'h60 && asciidata <= 8'h7e &&
359
                         (leftctrl || rightctrl))
360 18 samiam9512
               datao <= asciidata & 8'h1f;
361
            else if (asciidata >= 8'h61 && asciidata <= 8'h7a)
362
               datao <= leftshift||rightshift||capslock ? asciidatau: asciidata;
363
            else
364
               datao <= leftshift||rightshift ? asciidatau: asciidata;
365
            clrrdy <= 1; // clear scancode ready f/f
366
 
367
         end else
368
            datao <= (!outrdy << 7) | (scnrdy << 5); // return ready statuses
369
 
370
      end else clrrdy <= 0; // clear keyboard ready signal
371 15 samiam9512
 
372 18 samiam9512
      case (state) // run output state
373
 
374
         `term_idle: begin // idle waiting for character
375
 
376
            // We wait for the cpu cycle to end before running the state machine
377
            // write procedure. This allows this module to run at full speed, 
378
            // while the rest of the CPU logic runs slow. The vga logic must run
379
            // at a fixed speed because it has the display to run, but the rest
380
            // can be slow to allow debugging.
381
            if (wrtchr&!(select&read|select&write)) begin
382 15 samiam9512
 
383 18 samiam9512
               // process character after CPU goes away
384
               if (chrdatw >= 8'h20 && chrdatw != 8'h7f) begin
385
 
386
                  // write standard (non-control) character
387
                  cmaddr <= cursor; // set address at cursor
388
                  cmdatai <= chrdatw; // place character data to write
389 20 samiam9512
                  cmattri <= curatr; // set with current attributes
390 18 samiam9512
                  cmdatae <= 1; // enable data to memory
391 20 samiam9512
                  cmattre <= 1; // enable attributes to memory
392 18 samiam9512
                  state <= `term_wrtstd2; // continue
393
 
394
               end else begin // control character
395
 
396
                  if (chrdatw == 8'h0a) begin // line down (line feed)
397
 
398
                     if (cursor < 23*80) begin // not at screen end
399 15 samiam9512
 
400 18 samiam9512
                        cursor <= cursor+80;
401
                        wrtchr <= 0; // remove ready to write
402
                        outrdy <= 1; // set ready to send
403 15 samiam9512
 
404 18 samiam9512
                     end else begin
405 15 samiam9512
 
406 18 samiam9512
                        tcursor <= 0; // set temp cursor to screen start
407
                        state <= `term_scroll; // go to scroll screen
408 15 samiam9512
 
409 18 samiam9512
                      end
410
 
411
                  end else if (chrdatw == 8'h0b) begin // line up
412
 
413
                     if (cursor >= 80) cursor <= cursor-80;
414
                     wrtchr <= 0; // remove ready to write
415
                     outrdy <= 1; // set ready to send
416
 
417
                  end else if (chrdatw == 8'h0d) begin // carriage return
418
 
419
                     tcursor <= 0; // set start of line cursor
420
                     state <= `term_fndstr; // go to find start of line
421 15 samiam9512
 
422 18 samiam9512
                  end else if (chrdatw == 8'h08) begin // character left
423
 
424
                     // if not at home position, back up
425
                     if (cursor > 0) cursor <= cursor-1;
426
                     wrtchr <= 0; // remove ready to write
427
                     outrdy <= 1; // set ready to send
428 15 samiam9512
 
429 18 samiam9512
                  end else if (chrdatw == 8'h0c) begin // character right
430
 
431
                     // if not at screen end, go forward
432
                     if (cursor < 80*24-1) cursor <= cursor+1;
433
                     wrtchr <= 0; // remove ready to write
434
                     outrdy <= 1; // set ready to send
435 15 samiam9512
 
436 18 samiam9512
                  end else if (chrdatw == 8'h1e) begin // home
437
 
438
                     cursor <= 0; // set to home position
439
                     wrtchr <= 0; // remove ready to write
440
                     outrdy <= 1; // set ready to send
441
 
442
                  end else if (chrdatw == 8'h1a) begin // clear screen
443 15 samiam9512
 
444 18 samiam9512
                     state <= `term_clear; // go to screen clear
445
                     wrtchr <= 0; // remove ready to write
446
                     outrdy <= 1; // set ready to send
447 15 samiam9512
 
448 20 samiam9512
                  end else if (chrdatw == 8'h1b) begin // escape
449
 
450
                     wrtchr <= 0; // remove ready to write
451
                     outrdy <= 1; // set ready to send
452
                     state <= `term_esc; // go escape handler
453
 
454 18 samiam9512
                  end else begin // unsupported control character
455
 
456
                     wrtchr <= 0; // remove ready to write
457
                     outrdy <= 1; // set ready to send
458
 
459
                  end
460
 
461
               end
462
 
463
            end
464
 
465
         end
466
 
467
         `term_wrtstd2: begin // write standard character #2
468
 
469
            cmwrite <= 1; // set write to memory
470
            state <= `term_wrtstd3; // continue
471
 
472
         end
473
 
474
         `term_wrtstd3: begin // write standard character #3
475
 
476
            cmwrite <= 0; // remove write to memory
477
            state <= `term_wrtstd4; // continue
478
 
479
         end
480
 
481
         `term_wrtstd4: begin // write standard character #3
482
 
483
            cmdatae <= 0; // release data enable to memory
484 20 samiam9512
            cmattre <= 0; // release attribute enable to memory
485 18 samiam9512
            outrdy <= 1; // set ready to send
486
            cursor <= cursor+1; // advance cursor
487
            wrtchr <= 0; // remove ready to write
488
            state <= `term_idle; // continue
489
 
490
         end
491
 
492
         `term_clear: begin // clear screen and home cursor
493
 
494
            cmaddr <= 0; // clear buffer address
495
            cmdatai <= 8'h20; // clear to spaces
496 20 samiam9512
            cmattri <= 5'b0; // clear attributes
497 18 samiam9512
            cmdatae <= 1; // enable data to memory
498 20 samiam9512
            cmattre <= 1; // enable attributes to memory
499 18 samiam9512
            state <= `term_clear2; // continue
500
 
501
         end
502
 
503
         `term_clear2: begin // clear screen and home cursor #2
504
 
505
            cmwrite <= 1; // set write to memory
506
            state <= `term_clear3; // continue
507
 
508
         end
509
 
510
         `term_clear3: begin // clear screen and home cursor #2
511
 
512
            cmwrite <= 0; // reset write to memory
513
            state <= `term_clear4; // continue
514
 
515
         end
516
 
517
         `term_clear4: begin // clear screen and home cursor #4
518
 
519
            if (cmaddr < `scnchrs*`scnlins) begin
520
 
521
               cmaddr <= cmaddr+1; // next character
522
               // Uncomment the next to put an incrementing pattern instead of
523
               // spaces.
524
               //cmdatai <= cmdatai+1;
525
               state <= `term_clear2; // continue
526
 
527
            end else begin // done
528
 
529
               outrdy <= 1; // set ready to send
530
               cursor <= 0; // set cursor to home position
531
               cmdatae <= 0; // release data enable to memory
532 20 samiam9512
               cmattre <= 0; // release attribute enable to memory
533 18 samiam9512
               state <= `term_idle; // continue
534
 
535
            end
536
 
537
         end
538
 
539
         `term_fndstr: begin // find start of current line
540
 
541
            if (tcursor+80 > cursor) begin // found
542
 
543
               cursor <= tcursor; // set cursor to line start
544 15 samiam9512
               wrtchr <= 0; // remove ready to write
545
               outrdy <= 1; // set ready to send
546 18 samiam9512
               state <= `term_idle; // continue
547 15 samiam9512
 
548 18 samiam9512
            end else tcursor <= tcursor+80; // advance to next line
549
 
550
         end
551
 
552
         `term_scroll: begin // scroll screen up
553
 
554
            // move all data up a line
555
            if (tcursor < 80*23) begin // scroll up
556
 
557
               cmread <= 1; // set read display
558
               cmaddr <= tcursor+80; // set address to read
559
               state <= `term_scroll1; // continue
560 15 samiam9512
 
561 18 samiam9512
            end else state <= `term_scroll5; // go blank last line
562
 
563 15 samiam9512
         end
564
 
565 18 samiam9512
         `term_scroll1: begin // scroll screen up #1
566 15 samiam9512
 
567 18 samiam9512
            state <= `term_scroll2; // hold read
568 15 samiam9512
 
569 18 samiam9512
         end
570 15 samiam9512
 
571 18 samiam9512
         `term_scroll2: begin // scroll screen up #2
572 15 samiam9512
 
573 18 samiam9512
            cmdatai <= cmdata; // get data at address
574 20 samiam9512
            cmattri <= cmattr; // get attribute at address
575 18 samiam9512
            cmread <= 0; // turn off read
576
            state <= `term_scroll3; // continue
577 15 samiam9512
 
578 18 samiam9512
         end
579 15 samiam9512
 
580 18 samiam9512
         `term_scroll3: begin // scroll screen up #3
581 15 samiam9512
 
582 18 samiam9512
            cmdatae <= 1; // enable data to write
583 20 samiam9512
            cmattre <= 1; // enable attribute to write
584 18 samiam9512
            cmwrite <= 1; // set to write
585
            cmaddr <= tcursor;
586
            state <= `term_scroll4; // continue
587 15 samiam9512
 
588 18 samiam9512
         end
589 15 samiam9512
 
590 18 samiam9512
         `term_scroll4: begin // scroll screen up #4
591 15 samiam9512
 
592 18 samiam9512
            cmwrite <= 0; // turn off write
593 20 samiam9512
            cmdatae <= 0; // turn off data enable
594
            cmattre <= 0; // turn off attribute enable
595 18 samiam9512
            tcursor <= tcursor+1; // next address
596
            state <= `term_scroll; // repeat character move
597 15 samiam9512
 
598 18 samiam9512
         end
599 15 samiam9512
 
600 18 samiam9512
         `term_scroll5: begin // scroll screen up #5
601 15 samiam9512
 
602 18 samiam9512
            // blank out last line
603
            if (tcursor < 80*24) begin // blank out
604 15 samiam9512
 
605 18 samiam9512
               cmdatai <= 8'h20; // set to write spaces
606 20 samiam9512
               cmattri <= 0; // set no attribute
607 18 samiam9512
               cmdatae <= 1; // enable data to write
608 20 samiam9512
               cmattre <= 1; // enable attribute to write
609 18 samiam9512
               cmwrite <= 1; // set to write
610
               cmaddr <= tcursor;
611
               state <= `term_scroll6; // continue
612 15 samiam9512
 
613 18 samiam9512
            end else begin // terminate
614 15 samiam9512
 
615 18 samiam9512
               wrtchr <= 0; // remove ready to write
616
               outrdy <= 1; // set ready to send
617
               state <= `term_idle; // continue
618 15 samiam9512
 
619 18 samiam9512
            end
620 15 samiam9512
 
621
         end
622
 
623 18 samiam9512
         `term_scroll6: begin // scroll screen up #6
624 15 samiam9512
 
625 18 samiam9512
            cmwrite <= 0; // turn off write
626 20 samiam9512
            cmdatae <= 0; // turn off data enable
627
            cmattre <= 0; // turn off attribute enable
628 18 samiam9512
            tcursor <= tcursor+1; // next address
629
            state <= `term_scroll5; // repeat blank out
630 15 samiam9512
 
631 18 samiam9512
         end
632 20 samiam9512
 
633
         `term_esc: begin // handle escape codes
634
 
635
            // wait for next character
636
            if (wrtchr&!(select&read|select&write)) begin
637
 
638
               // check its a cursor position, or "\esc="
639
               if (chrdatw == 8'h3d) begin
640
 
641
                  wrtchr <= 0; // remove ready to write
642
                  outrdy <= 1; // set ready to send
643
                  state <= `term_poscur;
644
 
645
               // check its a attribute set, or "\escG"
646
               end else if (chrdatw == 8'h47) begin
647
 
648
                  wrtchr <= 0; // remove ready to write
649
                  outrdy <= 1; // set ready to send
650
                  state <= `term_attset;
651
 
652
               end else begin // invalid sequence, abort
653
 
654
                  wrtchr <= 0; // remove ready to write
655
                  outrdy <= 1; // set ready to send
656
                  state <= `term_idle;
657
 
658
               end
659
 
660
 
661
            end
662
 
663
         end
664
 
665
         `term_poscur: begin // handle cursor direct position
666
 
667
            // wait for next character
668
            if (wrtchr&!(select&read|select&write)) begin
669
 
670
               rowchr <= chrdatw; // save row character
671
               wrtchr <= 0; // remove ready to write
672
               outrdy <= 1; // set ready to send
673
               state <= `term_poscur2;
674
 
675
            end
676
 
677
         end
678
 
679
         `term_poscur2: begin // handle cursor direct position #2
680
 
681
            // wait for next character
682
            if (wrtchr&!(select&read|select&write)) begin
683
 
684
               // check row and collumn are valid
685
               if (rowchr >= 8'h20 && rowchr <= 8'h37 &&
686
                   chrdatw >= 8'h20 && chrdatw <= 8'h6f)
687
                  // perform position
688
                  cursor <= (rowchr-8'h20)*80+(chrdatw-8'h20);
689
               wrtchr <= 0; // remove ready to write
690
               outrdy <= 1; // set ready to send
691
               state <= `term_idle;
692
 
693
            end
694
 
695
         end
696
 
697
         `term_attset: begin // handle attribute set
698
 
699
            // wait for next character
700
            if (wrtchr&!(select&read|select&write)) begin
701
 
702
               // Process attribute set code. The ADM 3A attributes are arranged
703
               // so that the bits in characters '0'-'N' correspond to attribute
704
               // bits. Some of the combinations are "invalid", but these are
705
               // ones that override each other. For example, blank overrides
706
               // all others.
707
               if (chrdatw >= 8'h30 && chrdatw <= 8'h4e) // its '0'-'N'
708
                  curatr <= chrdatw-8'h30 & 5'b11111;
709
               wrtchr <= 0; // remove ready to write
710
               outrdy <= 1; // set ready to send
711
               state <= `term_idle;
712
 
713
            end
714
 
715
         end
716 18 samiam9512
 
717
         default: state <= 6'bx;
718
 
719
      endcase
720 15 samiam9512
 
721 18 samiam9512
   end
722
 
723 15 samiam9512
   // Enable drive to character memory
724
   assign cmdata = cmdatae ? cmdatai: 8'bz;
725
 
726 20 samiam9512
   // Enable drive to character attributes
727
   assign cmattr = cmattre ? cmattri: 8'bz;
728
 
729 15 samiam9512
   // Enable drive for data output
730
   assign data = read&select ? datao: 8'bz;
731
 
732
endmodule
733
 
734
////////////////////////////////////////////////////////////////////////////////
735
//
736
// MEMORY MAPPED CHARACTER DISPLAY
737
//
738 20 samiam9512
// Contains the 20x8 characters used in a 640x480, 24 lines of 80 characters
739 15 samiam9512
// display. This display is accessed vi a 1920 character memory, which can be 
740
// written and read. It is dual port, so has no restrictions on read and write.
741
//
742
// This block can either be directly mapped to CPU main memory, or can be run
743
// via a terminal emulator.
744
//
745 20 samiam9512
// Note there wasn't a mode for 24 lines, or for 640x480 pixels for alpha mode
746
// on the PC. Instead, 640x480 was a standard VGA mode for graphics. I like it
747
// because it unifies graphics and alpha modes, and has even divisions to
748
// character cells. Its a bit difficult to fit characters into a 8x20 cell,
749
// but the modes used for alpha, like 640x400 or 640x300 are not 4:3 aspect
750
// ratios, and really work by stretching the pixels vertically. We just do
751
// the same thing by explicit mapping.
752
//
753 15 samiam9512
 
754 20 samiam9512
`define clkfreq   50000000              // input clock frequency
755
`define blinkfreq 1                     // blink cycle in seconds
756
`define blinkmax  (`clkfreq*`blinkfreq) // total blink cycle
757
 
758 15 samiam9512
module chrmemmap(rst_n, clk, r, g, b, hsync_n, vsync_n, addr, read, write,
759 20 samiam9512
                 data, attr, cursor);
760 15 samiam9512
 
761
      input         rst_n;   // reset
762
      input         clk;     // master clock
763
      output [2:0]  r, g, b; // R,G,B color output buses
764
      output        hsync_n; // horizontal sync pulse
765
      output        vsync_n; // vertical sync pulse
766
      input  [10:0] addr;    // address to read or write
767
      input         read;    // read from address
768
      input         write;   // write from address
769
      inout  [7:0]  data;    // data to be written/read
770 20 samiam9512
      inout  [4:0]  attr;    // attributes to be written/read
771 18 samiam9512
      input [10:0]  cursor;  // cursor address
772 15 samiam9512
 
773
   reg [15:0] pixeldata; // 16 bit pixel feed
774
 
775 20 samiam9512
   reg  [6:0]  chrcnt;   // character counter
776
   reg  [4:0]  rowcnt;   // character row counter
777
   reg  [4:0]  lincnt;   // line counter
778
   reg  [10:0] scnadr;   // screen character buffer address
779
   reg  [7:0]  curchr;   // current character indexed by scnadr
780
   reg  [4:0]  curatr;   // current attribute indexed by scnadr
781
   reg  [1:0]  fchsta;   // character fetch state, 0 = load high, 1 = load low
782
   wire [10:0] chradr;   // character generator address
783
   wire [7:0]  chrdata;  // character generator data
784
   reg  [7:0]  datao;    // intermediate for data output
785
   reg  [4:0]  attro;    // intermediate for attribute output
786
   reg  [7:0]  pixdatl;  // pixel data low holding
787
   reg  [31:0] blinkcnt; // blink cycle counter
788
   reg         blon;     // blink on/off
789 15 samiam9512
 
790
   // storage for character based screen
791
 
792 20 samiam9512
   reg [7:0] scnbuf[1919:0]; // screen
793
   reg [4:0] atrbuf[1919:0]; // attributes
794 15 samiam9512
 
795
   assign rst = ~rst_n; // change reset polarity
796
 
797
   vga vgai(.rst(rst), .clk(clk), .pixel_data_in(pixeldata), .rd(rd), .eof(eof),
798
            .r(r), .g(g), .b(b), .hsync_n(hsync_n), .vsync_n(vsync_n),
799
            .blank(blank));
800
 
801
   chrrom crom(chradr, chrdata); // place character generator
802
 
803 20 samiam9512
   // run the blink cycle counter
804
   always @(posedge clk)
805
      if (rst) begin
806
 
807
      blinkcnt <= 0; // clear blink cycle
808
      blon <= 0; // clear cursor blink on
809
 
810
   end else begin
811
 
812
      blinkcnt <= blinkcnt+1; // count blink cycle
813
      // check blink cycle maxed, recycle if so
814
      if (blinkcnt >= `blinkmax) begin
815
 
816
         blinkcnt <= 0; // clear blink count
817
         blon <= ~blon; // flip blink state
818
 
819
      end
820
 
821
   end
822
 
823 15 samiam9512
   // run the character to screen scan
824
   always @(posedge clk)
825 18 samiam9512
      if (rst) begin // if reset
826 15 samiam9512
 
827 18 samiam9512
      // ????? SIMULATION PLUG
828
      // starting the character counter at the end of the line allows the scan
829
      // to cross the area the CPU is filling, and is ok at hardware time.
830
      // chrcnt <= 7'h0; // clear counters
831
      chrcnt <= 80-20; // clear counters
832
      // ????? SIMULATION PLUG
833
      // Starting the row count at 1 allows pixels to appear on the simulation,
834
      // and produces only a single bad line in real hardware
835 15 samiam9512
      rowcnt <= 5'h0;
836 18 samiam9512
      // rowcnt <= 5'h1;
837 15 samiam9512
      lincnt <= 5'h0;
838
      scnadr <= 11'h0;
839
      fchsta <= 0;
840
 
841 18 samiam9512
   end else if (eof) begin // if end of frame
842
 
843
      chrcnt <= 7'h0; // clear counters
844
      rowcnt <= 5'h0;
845
      lincnt <= 5'h0;
846
      scnadr <= 11'h0;
847
      fchsta <= 1; // set to fetch first set of characters
848
 
849 15 samiam9512
   end else if (rd || fchsta) begin
850
 
851
      if (fchsta == 1 || fchsta == 3) begin
852
 
853
         // advance counters
854
         if (chrcnt < 79) chrcnt <= chrcnt+1; // next character count
855
         else begin // next row
856
 
857
            chrcnt <= 0; // reset character
858
            if (rowcnt < 19) rowcnt <= rowcnt+1; // next character row
859
            else begin // next line
860
 
861
               rowcnt <= 0; // reset row
862
               lincnt <= lincnt+1; // next line
863
               scnadr <= scnadr+80; // advance character fetch
864
 
865
            end
866
 
867
         end
868
 
869
      end
870
 
871
      // Choose high or low character, and next state. Note we have to flip the
872
      // characters left to right to be correct.
873
      case (fchsta)
874
 
875
         0: fchsta <= 1; // delay until rd cycle is over
876
 
877
         1: begin
878
 
879 20 samiam9512
            // Set low bits of pixel register, and reverse if cursor matches the
880
            // current position, or if reverse attribute is on. Turn it all off
881
            // if blank is on.
882
            if ((scnadr+chrcnt == cursor)^curatr[2])
883
               pixdatl <= ~(curatr[0]|(curatr[1]&blon)? 8'h00: // blink and blank
884
                             (curatr[3]&rowcnt == 14? 8'hff: // underline 
885
                              { chrdata[0], chrdata[1], chrdata[2], chrdata[3],
886
                                chrdata[4], chrdata[5], chrdata[6], chrdata[7] }));
887 18 samiam9512
            else
888 20 samiam9512
               pixdatl <= curatr[0]|(curatr[1]&blon)? 8'h00: // blink and blank
889
                             (curatr[3]&rowcnt == 14? 8'hff: // underline 
890
                              { chrdata[0], chrdata[1], chrdata[2], chrdata[3],
891
                                chrdata[4], chrdata[5], chrdata[6], chrdata[7] });
892 15 samiam9512
            fchsta <= 2; // next state
893
 
894
         end
895
 
896
         2: fchsta <= 3; // delay a cycle for ROM read time
897
 
898
         3: begin
899
 
900 20 samiam9512
            // Set low bits of pixel register, and reverse if cursor matches the
901
            // current position, or if reverse attribute is on. Turn it all off
902
            // if blank is on.
903
            if ((scnadr+chrcnt == cursor)^curatr[2])
904 18 samiam9512
               pixeldata <= pixdatl |
905 20 samiam9512
                 (~(curatr[0]|(curatr[1]&blon)? 8'h00: // blink and blank
906
                    (curatr[3]&rowcnt == 14? 8'hff: // underline 
907
                     { chrdata[0], chrdata[1], chrdata[2], chrdata[3],
908
                       chrdata[4], chrdata[5], chrdata[6], chrdata[7] })) &
909 18 samiam9512
                  8'hff) << 8;
910
            else
911
               pixeldata <= pixdatl |
912 20 samiam9512
                 (curatr[0]|(curatr[1]&blon)? 8'h00: // blink and blank
913
                    (curatr[3]&rowcnt == 14? 8'hff: // underline 
914
                     { chrdata[0], chrdata[1], chrdata[2], chrdata[3],
915
                       chrdata[4], chrdata[5], chrdata[6], chrdata[7] })) << 8;
916 15 samiam9512
            fchsta <= 0; // back to start
917
 
918
         end
919
 
920
      endcase
921
 
922
   end
923
 
924
   // operate dual port screen character RAM
925
   always @(posedge clk) begin
926
 
927
      // set current indexed character without parity
928 18 samiam9512
      curchr <= scnbuf[scnadr+chrcnt] & 8'h7f;
929 15 samiam9512
      if (write) scnbuf[addr] <= data;
930
      datao <= scnbuf[addr];
931
 
932
   end
933
 
934 20 samiam9512
   // operate dual port screen attribute RAM
935
   always @(posedge clk) begin
936
 
937
      // set current indexed character without parity
938
      curatr <= atrbuf[scnadr+chrcnt];
939
      if (write) atrbuf[addr] <= attr;
940
      attro <= atrbuf[addr];
941
 
942
   end
943
 
944 15 samiam9512
   // create character address from character in buffer and current row
945
   assign chradr =
946
      (curchr < 8'h20 || curchr == 8'h7f) ? 11'h0: (curchr-8'h20)*20+rowcnt;
947
 
948
   // Enable drive for data output
949
   assign data = read ? datao: 8'bz;
950 20 samiam9512
   assign attr = read ? attro: 8'bz;
951 15 samiam9512
 
952
endmodule
953
 
954
////////////////////////////////////////////////////////////////////////////////
955
//
956
// CHARACTER ROM
957
//
958
// Contains the 20x8 characters used in a 640x480, 25 lines of 80 characters
959
// display.
960
//
961
 
962
module chrrom(addr, data);
963
 
964
   input  [10:0] addr;
965
   output [7:0]  data;
966
 
967
   reg [7:0]  data;
968
 
969
   always @(addr) case (addr)
970
 
971 18 samiam9512
      // Character set starting with space, and ending with '~'
972 15 samiam9512
 
973 18 samiam9512
      // The design of characters is such that they are embedded into an odd
974
      // number of pixels, 7x19, with one space pixel to the right and bottom
975
      // of each cell. The character layout works best on an odd cell width
976
      // and height, because this gives a clear center to the character.
977
      // Each characters baseline is marked. The baseline is where the capital
978
      // characters sit, and only the descenders go below this position.
979
 
980 15 samiam9512
      11'h000: data = 8'b00000000; // ' '
981
      11'h001: data = 8'b00000000;
982
      11'h002: data = 8'b00000000;
983
      11'h003: data = 8'b00000000;
984
      11'h004: data = 8'b00000000;
985
      11'h005: data = 8'b00000000;
986
      11'h006: data = 8'b00000000;
987
      11'h007: data = 8'b00000000;
988
      11'h008: data = 8'b00000000;
989
      11'h009: data = 8'b00000000;
990
      11'h00A: data = 8'b00000000;
991
      11'h00B: data = 8'b00000000;
992 20 samiam9512
      11'h00C: data = 8'b00000000; // B
993 15 samiam9512
      11'h00D: data = 8'b00000000;
994
      11'h00E: data = 8'b00000000;
995
      11'h00F: data = 8'b00000000;
996
      11'h010: data = 8'b00000000;
997
      11'h011: data = 8'b00000000;
998
      11'h012: data = 8'b00000000;
999
      11'h013: data = 8'b00000000;
1000
 
1001 18 samiam9512
      11'h014: data = 8'b00010000; // '!'
1002 15 samiam9512
      11'h015: data = 8'b00010000;
1003
      11'h016: data = 8'b00010000;
1004
      11'h017: data = 8'b00010000;
1005
      11'h018: data = 8'b00010000;
1006
      11'h019: data = 8'b00010000;
1007
      11'h01A: data = 8'b00010000;
1008
      11'h01B: data = 8'b00010000;
1009
      11'h01C: data = 8'b00010000;
1010
      11'h01D: data = 8'b00010000;
1011 18 samiam9512
      11'h01E: data = 8'b00000000;
1012
      11'h01F: data = 8'b00010000;
1013 20 samiam9512
      11'h020: data = 8'b00010000; // B
1014
      11'h021: data = 8'b00000000;
1015 18 samiam9512
      11'h022: data = 8'b00000000;
1016
      11'h023: data = 8'b00000000;
1017 15 samiam9512
      11'h024: data = 8'b00000000;
1018
      11'h025: data = 8'b00000000;
1019
      11'h026: data = 8'b00000000;
1020
      11'h027: data = 8'b00000000;
1021
 
1022
      11'h028: data = 8'b00000000; // '"'
1023
      11'h029: data = 8'b00101000;
1024
      11'h02A: data = 8'b00101000;
1025
      11'h02B: data = 8'b00000000;
1026
      11'h02C: data = 8'b00000000;
1027
      11'h02D: data = 8'b00000000;
1028
      11'h02E: data = 8'b00000000;
1029
      11'h02F: data = 8'b00000000;
1030
      11'h030: data = 8'b00000000;
1031
      11'h031: data = 8'b00000000;
1032
      11'h032: data = 8'b00000000;
1033
      11'h033: data = 8'b00000000;
1034 20 samiam9512
      11'h034: data = 8'b00000000; // B
1035
      11'h035: data = 8'b00000000;
1036 15 samiam9512
      11'h036: data = 8'b00000000;
1037
      11'h037: data = 8'b00000000;
1038
      11'h038: data = 8'b00000000;
1039
      11'h039: data = 8'b00000000;
1040
      11'h03A: data = 8'b00000000;
1041
      11'h03B: data = 8'b00000000;
1042
 
1043 20 samiam9512
      11'h03C: data = 8'b01000100; // '#'
1044 18 samiam9512
      11'h03D: data = 8'b01000100;
1045
      11'h03E: data = 8'b01000100;
1046
      11'h03F: data = 8'b01000100;
1047 20 samiam9512
      11'h040: data = 8'b11111110;
1048
      11'h041: data = 8'b01000100;
1049 18 samiam9512
      11'h042: data = 8'b01000100;
1050
      11'h043: data = 8'b01000100;
1051 20 samiam9512
      11'h044: data = 8'b11111110;
1052 18 samiam9512
      11'h045: data = 8'b01000100;
1053 20 samiam9512
      11'h046: data = 8'b01000100;
1054 18 samiam9512
      11'h047: data = 8'b01000100;
1055 20 samiam9512
      11'h048: data = 8'b01000100; // B
1056
      11'h049: data = 8'b00000000;
1057
      11'h04A: data = 8'b00000000;
1058 15 samiam9512
      11'h04B: data = 8'b00000000;
1059
      11'h04C: data = 8'b00000000;
1060
      11'h04D: data = 8'b00000000;
1061
      11'h04E: data = 8'b00000000;
1062
      11'h04F: data = 8'b00000000;
1063
 
1064 20 samiam9512
      11'h050: data = 8'b00010000; // '$'
1065
      11'h051: data = 8'b01111100;
1066
      11'h052: data = 8'b10010010;
1067
      11'h053: data = 8'b10010000;
1068 18 samiam9512
      11'h054: data = 8'b10010000;
1069
      11'h055: data = 8'b10010000;
1070 20 samiam9512
      11'h056: data = 8'b01111100;
1071
      11'h057: data = 8'b00010010;
1072
      11'h058: data = 8'b00010010;
1073 15 samiam9512
      11'h059: data = 8'b00010010;
1074 20 samiam9512
      11'h05A: data = 8'b10010010;
1075
      11'h05B: data = 8'b01111100;
1076
      11'h05C: data = 8'b00010000; // B
1077
      11'h05D: data = 8'b00000000;
1078
      11'h05E: data = 8'b00000000;
1079 15 samiam9512
      11'h05F: data = 8'b00000000;
1080
      11'h060: data = 8'b00000000;
1081
      11'h061: data = 8'b00000000;
1082
      11'h062: data = 8'b00000000;
1083
      11'h063: data = 8'b00000000;
1084
 
1085 20 samiam9512
      11'h064: data = 8'b11100000; // '%'
1086
      11'h065: data = 8'b10100010;
1087
      11'h066: data = 8'b11100100;
1088
      11'h067: data = 8'b00000100;
1089
      11'h068: data = 8'b00001000;
1090 15 samiam9512
      11'h069: data = 8'b00001000;
1091 20 samiam9512
      11'h06A: data = 8'b00010000;
1092
      11'h06B: data = 8'b00010000;
1093
      11'h06C: data = 8'b00100000;
1094
      11'h06D: data = 8'b00100000;
1095
      11'h06E: data = 8'b01001110;
1096
      11'h06F: data = 8'b01001010;
1097
      11'h070: data = 8'b10001110; // B
1098
      11'h071: data = 8'b00000000;
1099
      11'h072: data = 8'b00000000;
1100 15 samiam9512
      11'h073: data = 8'b00000000;
1101
      11'h074: data = 8'b00000000;
1102
      11'h075: data = 8'b00000000;
1103
      11'h076: data = 8'b00000000;
1104
      11'h077: data = 8'b00000000;
1105
 
1106
      11'h078: data = 8'b00000000; // '&'
1107 20 samiam9512
      11'h079: data = 8'b00000000;
1108
      11'h07A: data = 8'b00110000;
1109 15 samiam9512
      11'h07B: data = 8'b01001000;
1110 20 samiam9512
      11'h07C: data = 8'b10001000;
1111
      11'h07D: data = 8'b10010000;
1112
      11'h07E: data = 8'b01100000;
1113
      11'h07F: data = 8'b00100000;
1114 15 samiam9512
      11'h080: data = 8'b01010000;
1115 20 samiam9512
      11'h081: data = 8'b10001010;
1116
      11'h082: data = 8'b10000100;
1117
      11'h083: data = 8'b10001010;
1118
      11'h084: data = 8'b01110000; // B
1119
      11'h085: data = 8'b00000000;
1120
      11'h086: data = 8'b00000000;
1121 15 samiam9512
      11'h087: data = 8'b00000000;
1122
      11'h088: data = 8'b00000000;
1123
      11'h089: data = 8'b00000000;
1124
      11'h08A: data = 8'b00000000;
1125
      11'h08B: data = 8'b00000000;
1126
 
1127 20 samiam9512
      11'h08C: data = 8'b00010000; // '''
1128 15 samiam9512
      11'h08D: data = 8'b00010000;
1129 20 samiam9512
      11'h08E: data = 8'b00000000;
1130 15 samiam9512
      11'h08F: data = 8'b00000000;
1131
      11'h090: data = 8'b00000000;
1132
      11'h091: data = 8'b00000000;
1133
      11'h092: data = 8'b00000000;
1134
      11'h093: data = 8'b00000000;
1135
      11'h094: data = 8'b00000000;
1136
      11'h095: data = 8'b00000000;
1137
      11'h096: data = 8'b00000000;
1138
      11'h097: data = 8'b00000000;
1139 20 samiam9512
      11'h098: data = 8'b00000000; // B
1140
      11'h099: data = 8'b00000000;
1141 15 samiam9512
      11'h09A: data = 8'b00000000;
1142
      11'h09B: data = 8'b00000000;
1143
      11'h09C: data = 8'b00000000;
1144
      11'h09D: data = 8'b00000000;
1145
      11'h09E: data = 8'b00000000;
1146
      11'h09F: data = 8'b00000000;
1147
 
1148 20 samiam9512
      11'h0A0: data = 8'b00000100; // '('
1149
      11'h0A1: data = 8'b00001000;
1150
      11'h0A2: data = 8'b00010000;
1151
      11'h0A3: data = 8'b00100000;
1152
      11'h0A4: data = 8'b00100000;
1153
      11'h0A5: data = 8'b01000000;
1154
      11'h0A6: data = 8'b01000000;
1155 15 samiam9512
      11'h0A7: data = 8'b01000000;
1156 20 samiam9512
      11'h0A8: data = 8'b00100000;
1157
      11'h0A9: data = 8'b00100000;
1158
      11'h0AA: data = 8'b00010000;
1159
      11'h0AB: data = 8'b00001000;
1160
      11'h0AC: data = 8'b00000100; // B
1161
      11'h0AD: data = 8'b00000000;
1162
      11'h0AE: data = 8'b00000000;
1163 15 samiam9512
      11'h0AF: data = 8'b00000000;
1164
      11'h0B0: data = 8'b00000000;
1165
      11'h0B1: data = 8'b00000000;
1166
      11'h0B2: data = 8'b00000000;
1167
      11'h0B3: data = 8'b00000000;
1168
 
1169 20 samiam9512
      11'h0B4: data = 8'b01000000; // ')'
1170
      11'h0B5: data = 8'b00100000;
1171
      11'h0B6: data = 8'b00010000;
1172
      11'h0B7: data = 8'b00001000;
1173 15 samiam9512
      11'h0B8: data = 8'b00001000;
1174 20 samiam9512
      11'h0B9: data = 8'b00000100;
1175
      11'h0BA: data = 8'b00000100;
1176
      11'h0BB: data = 8'b00000100;
1177
      11'h0BC: data = 8'b00001000;
1178
      11'h0BD: data = 8'b00001000;
1179
      11'h0BE: data = 8'b00010000;
1180
      11'h0BF: data = 8'b00100000;
1181
      11'h0C0: data = 8'b01000000; // B
1182
      11'h0C1: data = 8'b00000000;
1183
      11'h0C2: data = 8'b00000000;
1184 15 samiam9512
      11'h0C3: data = 8'b00000000;
1185
      11'h0C4: data = 8'b00000000;
1186
      11'h0C5: data = 8'b00000000;
1187
      11'h0C6: data = 8'b00000000;
1188
      11'h0C7: data = 8'b00000000;
1189
 
1190
      11'h0C8: data = 8'b00000000; // '*'
1191 20 samiam9512
      11'h0C9: data = 8'b00000000;
1192
      11'h0CA: data = 8'b00000000;
1193
      11'h0CB: data = 8'b00000000;
1194
      11'h0CC: data = 8'b01000100;
1195
      11'h0CD: data = 8'b00101000;
1196
      11'h0CE: data = 8'b01111100;
1197
      11'h0CF: data = 8'b00101000;
1198
      11'h0D0: data = 8'b01000100;
1199
      11'h0D1: data = 8'b00000000;
1200
      11'h0D2: data = 8'b00000000;
1201
      11'h0D3: data = 8'b00000000;
1202
      11'h0D4: data = 8'b00000000; // B
1203
      11'h0D5: data = 8'b00000000;
1204
      11'h0D6: data = 8'b00000000;
1205 15 samiam9512
      11'h0D7: data = 8'b00000000;
1206
      11'h0D8: data = 8'b00000000;
1207
      11'h0D9: data = 8'b00000000;
1208
      11'h0DA: data = 8'b00000000;
1209
      11'h0DB: data = 8'b00000000;
1210
 
1211
      11'h0DC: data = 8'b00000000; // '+'
1212
      11'h0DD: data = 8'b00000000;
1213
      11'h0DE: data = 8'b00000000;
1214
      11'h0DF: data = 8'b00010000;
1215
      11'h0E0: data = 8'b00010000;
1216
      11'h0E1: data = 8'b00010000;
1217 20 samiam9512
      11'h0E2: data = 8'b11111110;
1218
      11'h0E3: data = 8'b00010000;
1219 15 samiam9512
      11'h0E4: data = 8'b00010000;
1220
      11'h0E5: data = 8'b00010000;
1221 20 samiam9512
      11'h0E6: data = 8'b00000000;
1222
      11'h0E7: data = 8'b00000000;
1223
      11'h0E8: data = 8'b00000000; // B
1224
      11'h0E9: data = 8'b00000000;
1225 15 samiam9512
      11'h0EA: data = 8'b00000000;
1226
      11'h0EB: data = 8'b00000000;
1227
      11'h0EC: data = 8'b00000000;
1228
      11'h0ED: data = 8'b00000000;
1229
      11'h0EE: data = 8'b00000000;
1230
      11'h0EF: data = 8'b00000000;
1231
 
1232
      11'h0F0: data = 8'b00000000; // ','
1233
      11'h0F1: data = 8'b00000000;
1234
      11'h0F2: data = 8'b00000000;
1235
      11'h0F3: data = 8'b00000000;
1236
      11'h0F4: data = 8'b00000000;
1237
      11'h0F5: data = 8'b00000000;
1238
      11'h0F6: data = 8'b00000000;
1239
      11'h0F7: data = 8'b00000000;
1240
      11'h0F8: data = 8'b00000000;
1241
      11'h0F9: data = 8'b00000000;
1242
      11'h0FA: data = 8'b00000000;
1243
      11'h0FB: data = 8'b00000000;
1244 20 samiam9512
      11'h0FC: data = 8'b00010000; // B
1245
      11'h0FD: data = 8'b00010000;
1246
      11'h0FE: data = 8'b00100000;
1247
      11'h0FF: data = 8'b00000000;
1248
      11'h100: data = 8'b00000000;
1249 15 samiam9512
      11'h101: data = 8'b00000000;
1250
      11'h102: data = 8'b00000000;
1251
      11'h103: data = 8'b00000000;
1252
 
1253
      11'h104: data = 8'b00000000; // '-'
1254
      11'h105: data = 8'b00000000;
1255
      11'h106: data = 8'b00000000;
1256
      11'h107: data = 8'b00000000;
1257
      11'h108: data = 8'b00000000;
1258 20 samiam9512
      11'h109: data = 8'b00000000;
1259
      11'h10A: data = 8'b01111100;
1260 15 samiam9512
      11'h10B: data = 8'b00000000;
1261
      11'h10C: data = 8'b00000000;
1262
      11'h10D: data = 8'b00000000;
1263
      11'h10E: data = 8'b00000000;
1264
      11'h10F: data = 8'b00000000;
1265 20 samiam9512
      11'h110: data = 8'b00000000; // B
1266
      11'h111: data = 8'b00000000;
1267 15 samiam9512
      11'h112: data = 8'b00000000;
1268
      11'h113: data = 8'b00000000;
1269
      11'h114: data = 8'b00000000;
1270
      11'h115: data = 8'b00000000;
1271
      11'h116: data = 8'b00000000;
1272
      11'h117: data = 8'b00000000;
1273
 
1274
      11'h118: data = 8'b00000000; // '.'
1275
      11'h119: data = 8'b00000000;
1276
      11'h11A: data = 8'b00000000;
1277
      11'h11B: data = 8'b00000000;
1278
      11'h11C: data = 8'b00000000;
1279
      11'h11D: data = 8'b00000000;
1280
      11'h11E: data = 8'b00000000;
1281
      11'h11F: data = 8'b00000000;
1282
      11'h120: data = 8'b00000000;
1283
      11'h121: data = 8'b00000000;
1284
      11'h122: data = 8'b00000000;
1285
      11'h123: data = 8'b00000000;
1286 20 samiam9512
      11'h124: data = 8'b00010000; // B
1287
      11'h125: data = 8'b00000000;
1288
      11'h126: data = 8'b00000000;
1289 15 samiam9512
      11'h127: data = 8'b00000000;
1290
      11'h128: data = 8'b00000000;
1291
      11'h129: data = 8'b00000000;
1292
      11'h12A: data = 8'b00000000;
1293
      11'h12B: data = 8'b00000000;
1294
 
1295
      11'h12C: data = 8'b00000000; // '/'
1296 20 samiam9512
      11'h12D: data = 8'b00000010;
1297
      11'h12E: data = 8'b00000100;
1298
      11'h12F: data = 8'b00000100;
1299
      11'h130: data = 8'b00001000;
1300
      11'h131: data = 8'b00001000;
1301
      11'h132: data = 8'b00010000;
1302
      11'h133: data = 8'b00010000;
1303
      11'h134: data = 8'b00100000;
1304
      11'h135: data = 8'b00100000;
1305
      11'h136: data = 8'b01000000;
1306
      11'h137: data = 8'b01000000;
1307
      11'h138: data = 8'b10000000; // B
1308
      11'h139: data = 8'b00000000;
1309
      11'h13A: data = 8'b00000000;
1310 15 samiam9512
      11'h13B: data = 8'b00000000;
1311
      11'h13C: data = 8'b00000000;
1312
      11'h13D: data = 8'b00000000;
1313
      11'h13E: data = 8'b00000000;
1314
      11'h13F: data = 8'b00000000;
1315
 
1316 20 samiam9512
      11'h140: data = 8'b01111100; // '0'
1317
      11'h141: data = 8'b10000010;
1318
      11'h142: data = 8'b10000110;
1319
      11'h143: data = 8'b10001110;
1320
      11'h144: data = 8'b10001010;
1321
      11'h145: data = 8'b10011010;
1322
      11'h146: data = 8'b10010010;
1323
      11'h147: data = 8'b10110010;
1324
      11'h148: data = 8'b10100010;
1325
      11'h149: data = 8'b11100010;
1326
      11'h14A: data = 8'b11000010;
1327
      11'h14B: data = 8'b10000010;
1328
      11'h14C: data = 8'b01111100; // B
1329
      11'h14D: data = 8'b00000000;
1330
      11'h14E: data = 8'b00000000;
1331 15 samiam9512
      11'h14F: data = 8'b00000000;
1332
      11'h150: data = 8'b00000000;
1333
      11'h151: data = 8'b00000000;
1334
      11'h152: data = 8'b00000000;
1335
      11'h153: data = 8'b00000000;
1336
 
1337 20 samiam9512
      11'h154: data = 8'b00010000; // '1'
1338
      11'h155: data = 8'b00110000;
1339
      11'h156: data = 8'b01010000;
1340
      11'h157: data = 8'b00010000;
1341
      11'h158: data = 8'b00010000;
1342
      11'h159: data = 8'b00010000;
1343
      11'h15A: data = 8'b00010000;
1344
      11'h15B: data = 8'b00010000;
1345
      11'h15C: data = 8'b00010000;
1346
      11'h15D: data = 8'b00010000;
1347
      11'h15E: data = 8'b00010000;
1348
      11'h15F: data = 8'b00010000;
1349
      11'h160: data = 8'b11111110; // B
1350
      11'h161: data = 8'b00000000;
1351
      11'h162: data = 8'b00000000;
1352 15 samiam9512
      11'h163: data = 8'b00000000;
1353
      11'h164: data = 8'b00000000;
1354
      11'h165: data = 8'b00000000;
1355
      11'h166: data = 8'b00000000;
1356
      11'h167: data = 8'b00000000;
1357
 
1358 20 samiam9512
      11'h168: data = 8'b01111100; // '2'
1359
      11'h169: data = 8'b10000010;
1360
      11'h16A: data = 8'b00000010;
1361 15 samiam9512
      11'h16B: data = 8'b00000010;
1362
      11'h16C: data = 8'b00000010;
1363
      11'h16D: data = 8'b00000010;
1364 20 samiam9512
      11'h16E: data = 8'b00000010;
1365 15 samiam9512
      11'h16F: data = 8'b00000100;
1366
      11'h170: data = 8'b00001000;
1367 20 samiam9512
      11'h171: data = 8'b00010000;
1368
      11'h172: data = 8'b00100000;
1369
      11'h173: data = 8'b01000000;
1370
      11'h174: data = 8'b11111110; // B
1371
      11'h175: data = 8'b00000000;
1372
      11'h176: data = 8'b00000000;
1373 15 samiam9512
      11'h177: data = 8'b00000000;
1374
      11'h178: data = 8'b00000000;
1375
      11'h179: data = 8'b00000000;
1376
      11'h17A: data = 8'b00000000;
1377
      11'h17B: data = 8'b00000000;
1378
 
1379 20 samiam9512
      11'h17C: data = 8'b01111100; // '3'
1380
      11'h17D: data = 8'b10000010;
1381
      11'h17E: data = 8'b00000010;
1382 15 samiam9512
      11'h17F: data = 8'b00000010;
1383
      11'h180: data = 8'b00000010;
1384
      11'h181: data = 8'b00000010;
1385 20 samiam9512
      11'h182: data = 8'b01111100;
1386
      11'h183: data = 8'b00000010;
1387 15 samiam9512
      11'h184: data = 8'b00000010;
1388
      11'h185: data = 8'b00000010;
1389
      11'h186: data = 8'b00000010;
1390 20 samiam9512
      11'h187: data = 8'b10000010;
1391
      11'h188: data = 8'b01111100; // B
1392
      11'h189: data = 8'b00000000;
1393
      11'h18A: data = 8'b00000000;
1394 15 samiam9512
      11'h18B: data = 8'b00000000;
1395
      11'h18C: data = 8'b00000000;
1396
      11'h18D: data = 8'b00000000;
1397
      11'h18E: data = 8'b00000000;
1398
      11'h18F: data = 8'b00000000;
1399
 
1400 20 samiam9512
      11'h190: data = 8'b10000010; // '4'
1401
      11'h191: data = 8'b10000010;
1402
      11'h192: data = 8'b10000010;
1403
      11'h193: data = 8'b10000010;
1404
      11'h194: data = 8'b10000010;
1405
      11'h195: data = 8'b10000010;
1406
      11'h196: data = 8'b11111110;
1407
      11'h197: data = 8'b00000010;
1408 15 samiam9512
      11'h198: data = 8'b00000010;
1409
      11'h199: data = 8'b00000010;
1410
      11'h19A: data = 8'b00000010;
1411
      11'h19B: data = 8'b00000010;
1412 20 samiam9512
      11'h19C: data = 8'b00000010; // B
1413
      11'h19D: data = 8'b00000000;
1414
      11'h19E: data = 8'b00000000;
1415 15 samiam9512
      11'h19F: data = 8'b00000000;
1416
      11'h1A0: data = 8'b00000000;
1417
      11'h1A1: data = 8'b00000000;
1418
      11'h1A2: data = 8'b00000000;
1419
      11'h1A3: data = 8'b00000000;
1420
 
1421 20 samiam9512
      11'h1A4: data = 8'b11111110; // '5'
1422
      11'h1A5: data = 8'b10000000;
1423
      11'h1A6: data = 8'b10000000;
1424
      11'h1A7: data = 8'b10000000;
1425
      11'h1A8: data = 8'b10000000;
1426
      11'h1A9: data = 8'b10000000;
1427
      11'h1AA: data = 8'b11111100;
1428
      11'h1AB: data = 8'b00000010;
1429
      11'h1AC: data = 8'b00000010;
1430 15 samiam9512
      11'h1AD: data = 8'b00000010;
1431
      11'h1AE: data = 8'b00000010;
1432 20 samiam9512
      11'h1AF: data = 8'b10000010;
1433
      11'h1B0: data = 8'b01111100; // B
1434
      11'h1B1: data = 8'b00000000;
1435
      11'h1B2: data = 8'b00000000;
1436 15 samiam9512
      11'h1B3: data = 8'b00000000;
1437
      11'h1B4: data = 8'b00000000;
1438
      11'h1B5: data = 8'b00000000;
1439
      11'h1B6: data = 8'b00000000;
1440
      11'h1B7: data = 8'b00000000;
1441
 
1442 20 samiam9512
      11'h1B8: data = 8'b01111100; // '6'
1443
      11'h1B9: data = 8'b10000010;
1444
      11'h1BA: data = 8'b10000000;
1445
      11'h1BB: data = 8'b10000000;
1446
      11'h1BC: data = 8'b10000000;
1447
      11'h1BD: data = 8'b10000000;
1448
      11'h1BE: data = 8'b01111100;
1449
      11'h1BF: data = 8'b10000010;
1450
      11'h1C0: data = 8'b10000010;
1451
      11'h1C1: data = 8'b10000010;
1452
      11'h1C2: data = 8'b10000010;
1453
      11'h1C3: data = 8'b10000010;
1454
      11'h1C4: data = 8'b01111110; // B
1455
      11'h1C5: data = 8'b00000000;
1456
      11'h1C6: data = 8'b00000000;
1457 15 samiam9512
      11'h1C7: data = 8'b00000000;
1458
      11'h1C8: data = 8'b00000000;
1459
      11'h1C9: data = 8'b00000000;
1460
      11'h1CA: data = 8'b00000000;
1461
      11'h1CB: data = 8'b00000000;
1462
 
1463 20 samiam9512
      11'h1CC: data = 8'b11111110; // '7'
1464
      11'h1CD: data = 8'b00000110;
1465
      11'h1CE: data = 8'b00000100;
1466
      11'h1CF: data = 8'b00001000;
1467
      11'h1D0: data = 8'b00001000;
1468
      11'h1D1: data = 8'b00010000;
1469
      11'h1D2: data = 8'b00010000;
1470
      11'h1D3: data = 8'b00100000;
1471
      11'h1D4: data = 8'b00100000;
1472
      11'h1D5: data = 8'b01000000;
1473 15 samiam9512
      11'h1D6: data = 8'b01000000;
1474 20 samiam9512
      11'h1D7: data = 8'b10000000;
1475
      11'h1D8: data = 8'b10000000; // B
1476
      11'h1D9: data = 8'b00000000;
1477
      11'h1DA: data = 8'b00000000;
1478 15 samiam9512
      11'h1DB: data = 8'b00000000;
1479
      11'h1DC: data = 8'b00000000;
1480
      11'h1DD: data = 8'b00000000;
1481
      11'h1DE: data = 8'b00000000;
1482
      11'h1DF: data = 8'b00000000;
1483
 
1484 20 samiam9512
      11'h1E0: data = 8'b01111100; // '8'
1485
      11'h1E1: data = 8'b10000010;
1486
      11'h1E2: data = 8'b10000010;
1487
      11'h1E3: data = 8'b10000010;
1488
      11'h1E4: data = 8'b10000010;
1489
      11'h1E5: data = 8'b10000010;
1490
      11'h1E6: data = 8'b01111100;
1491
      11'h1E7: data = 8'b10000010;
1492
      11'h1E8: data = 8'b10000010;
1493
      11'h1E9: data = 8'b10000010;
1494
      11'h1EA: data = 8'b10000010;
1495
      11'h1EB: data = 8'b10000010;
1496
      11'h1EC: data = 8'b01111100; // B
1497
      11'h1ED: data = 8'b00000000;
1498
      11'h1EE: data = 8'b00000000;
1499 15 samiam9512
      11'h1EF: data = 8'b00000000;
1500
      11'h1F0: data = 8'b00000000;
1501
      11'h1F1: data = 8'b00000000;
1502
      11'h1F2: data = 8'b00000000;
1503
      11'h1F3: data = 8'b00000000;
1504
 
1505 20 samiam9512
      11'h1F4: data = 8'b01111100; // '9'
1506
      11'h1F5: data = 8'b10000010;
1507
      11'h1F6: data = 8'b10000010;
1508
      11'h1F7: data = 8'b10000010;
1509
      11'h1F8: data = 8'b10000010;
1510
      11'h1F9: data = 8'b10000010;
1511
      11'h1FA: data = 8'b01111100;
1512
      11'h1FB: data = 8'b00000010;
1513 15 samiam9512
      11'h1FC: data = 8'b00000010;
1514
      11'h1FD: data = 8'b00000010;
1515 20 samiam9512
      11'h1FE: data = 8'b00000010;
1516
      11'h1FF: data = 8'b10000010;
1517
      11'h200: data = 8'b01111100; // B
1518
      11'h201: data = 8'b00000000;
1519
      11'h202: data = 8'b00000000;
1520 15 samiam9512
      11'h203: data = 8'b00000000;
1521
      11'h204: data = 8'b00000000;
1522
      11'h205: data = 8'b00000000;
1523
      11'h206: data = 8'b00000000;
1524
      11'h207: data = 8'b00000000;
1525
 
1526
      11'h208: data = 8'b00000000; // ':'
1527
      11'h209: data = 8'b00000000;
1528
      11'h20A: data = 8'b00000000;
1529
      11'h20B: data = 8'b00000000;
1530 20 samiam9512
      11'h20C: data = 8'b00010000;
1531 15 samiam9512
      11'h20D: data = 8'b00000000;
1532
      11'h20E: data = 8'b00000000;
1533
      11'h20F: data = 8'b00000000;
1534 20 samiam9512
      11'h210: data = 8'b00010000;
1535 15 samiam9512
      11'h211: data = 8'b00000000;
1536
      11'h212: data = 8'b00000000;
1537
      11'h213: data = 8'b00000000;
1538 20 samiam9512
      11'h214: data = 8'b00000000; // B
1539
      11'h215: data = 8'b00000000;
1540
      11'h216: data = 8'b00000000;
1541 15 samiam9512
      11'h217: data = 8'b00000000;
1542
      11'h218: data = 8'b00000000;
1543
      11'h219: data = 8'b00000000;
1544
      11'h21A: data = 8'b00000000;
1545
      11'h21B: data = 8'b00000000;
1546
 
1547
      11'h21C: data = 8'b00000000; // ';'
1548
      11'h21D: data = 8'b00000000;
1549
      11'h21E: data = 8'b00000000;
1550
      11'h21F: data = 8'b00000000;
1551
      11'h220: data = 8'b00000000;
1552
      11'h221: data = 8'b00000000;
1553
      11'h222: data = 8'b00000000;
1554
      11'h223: data = 8'b00000000;
1555
      11'h224: data = 8'b00000000;
1556 20 samiam9512
      11'h225: data = 8'b00010000;
1557 15 samiam9512
      11'h226: data = 8'b00000000;
1558
      11'h227: data = 8'b00000000;
1559 20 samiam9512
      11'h228: data = 8'b00010000; // B
1560
      11'h229: data = 8'b00010000;
1561
      11'h22A: data = 8'b00100000;
1562
      11'h22B: data = 8'b00000000;
1563
      11'h22C: data = 8'b00000000;
1564 15 samiam9512
      11'h22D: data = 8'b00000000;
1565
      11'h22E: data = 8'b00000000;
1566
      11'h22F: data = 8'b00000000;
1567
 
1568 20 samiam9512
      11'h230: data = 8'b00000010; // '<'
1569
      11'h231: data = 8'b00000100;
1570
      11'h232: data = 8'b00001000;
1571
      11'h233: data = 8'b00010000;
1572
      11'h234: data = 8'b00100000;
1573
      11'h235: data = 8'b01000000;
1574
      11'h236: data = 8'b10000000;
1575
      11'h237: data = 8'b01000000;
1576
      11'h238: data = 8'b00100000;
1577
      11'h239: data = 8'b00010000;
1578
      11'h23A: data = 8'b00001000;
1579
      11'h23B: data = 8'b00000100;
1580
      11'h23C: data = 8'b00000010; // B
1581
      11'h23D: data = 8'b00000000;
1582 15 samiam9512
      11'h23E: data = 8'b00000000;
1583
      11'h23F: data = 8'b00000000;
1584
      11'h240: data = 8'b00000000;
1585
      11'h241: data = 8'b00000000;
1586
      11'h242: data = 8'b00000000;
1587
      11'h243: data = 8'b00000000;
1588
 
1589
      11'h244: data = 8'b00000000; // '='
1590
      11'h245: data = 8'b00000000;
1591
      11'h246: data = 8'b00000000;
1592
      11'h247: data = 8'b00000000;
1593
      11'h248: data = 8'b00000000;
1594 20 samiam9512
      11'h249: data = 8'b01111100;
1595
      11'h24A: data = 8'b00000000;
1596
      11'h24B: data = 8'b01111100;
1597
      11'h24C: data = 8'b00000000;
1598 15 samiam9512
      11'h24D: data = 8'b00000000;
1599
      11'h24E: data = 8'b00000000;
1600
      11'h24F: data = 8'b00000000;
1601 20 samiam9512
      11'h250: data = 8'b00000000; // B
1602
      11'h251: data = 8'b00000000;
1603 15 samiam9512
      11'h252: data = 8'b00000000;
1604
      11'h253: data = 8'b00000000;
1605
      11'h254: data = 8'b00000000;
1606
      11'h255: data = 8'b00000000;
1607
      11'h256: data = 8'b00000000;
1608
      11'h257: data = 8'b00000000;
1609
 
1610 20 samiam9512
      11'h258: data = 8'b10000000; // '>'
1611
      11'h259: data = 8'b01000000;
1612
      11'h25A: data = 8'b00100000;
1613
      11'h25B: data = 8'b00010000;
1614
      11'h25C: data = 8'b00001000;
1615
      11'h25D: data = 8'b00000100;
1616
      11'h25E: data = 8'b00000010;
1617 15 samiam9512
      11'h25F: data = 8'b00000100;
1618 20 samiam9512
      11'h260: data = 8'b00001000;
1619
      11'h261: data = 8'b00010000;
1620
      11'h262: data = 8'b00100000;
1621
      11'h263: data = 8'b01000000;
1622
      11'h264: data = 8'b10000000; // B
1623
      11'h265: data = 8'b00000000;
1624 15 samiam9512
      11'h266: data = 8'b00000000;
1625
      11'h267: data = 8'b00000000;
1626
      11'h268: data = 8'b00000000;
1627
      11'h269: data = 8'b00000000;
1628
      11'h26A: data = 8'b00000000;
1629
      11'h26B: data = 8'b00000000;
1630
 
1631 20 samiam9512
      11'h26C: data = 8'b01111100; // '?'
1632
      11'h26D: data = 8'b10000010;
1633
      11'h26E: data = 8'b00000010;
1634 15 samiam9512
      11'h26F: data = 8'b00000010;
1635
      11'h270: data = 8'b00000010;
1636
      11'h271: data = 8'b00000010;
1637 20 samiam9512
      11'h272: data = 8'b00011100;
1638
      11'h273: data = 8'b00010000;
1639 15 samiam9512
      11'h274: data = 8'b00010000;
1640
      11'h275: data = 8'b00010000;
1641
      11'h276: data = 8'b00010000;
1642 20 samiam9512
      11'h277: data = 8'b00000000;
1643
      11'h278: data = 8'b00010000; // B
1644
      11'h279: data = 8'b00000000;
1645
      11'h27A: data = 8'b00000000;
1646 15 samiam9512
      11'h27B: data = 8'b00000000;
1647
      11'h27C: data = 8'b00000000;
1648
      11'h27D: data = 8'b00000000;
1649
      11'h27E: data = 8'b00000000;
1650
      11'h27F: data = 8'b00000000;
1651
 
1652 20 samiam9512
      11'h280: data = 8'b01111100; // '@'
1653
      11'h281: data = 8'b10000010;
1654
      11'h282: data = 8'b10000010;
1655
      11'h283: data = 8'b10000010;
1656
      11'h284: data = 8'b10011110;
1657
      11'h285: data = 8'b10010010;
1658
      11'h286: data = 8'b10010010;
1659
      11'h287: data = 8'b10011110;
1660
      11'h288: data = 8'b10000000;
1661
      11'h289: data = 8'b10000000;
1662
      11'h28A: data = 8'b10000000;
1663
      11'h28B: data = 8'b10000000;
1664
      11'h28C: data = 8'b01111110; // B
1665
      11'h28D: data = 8'b00000000;
1666
      11'h28E: data = 8'b00000000;
1667 15 samiam9512
      11'h28F: data = 8'b00000000;
1668
      11'h290: data = 8'b00000000;
1669
      11'h291: data = 8'b00000000;
1670
      11'h292: data = 8'b00000000;
1671
      11'h293: data = 8'b00000000;
1672
 
1673 20 samiam9512
      11'h294: data = 8'b01111100; // 'A'
1674
      11'h295: data = 8'b10000010;
1675
      11'h296: data = 8'b10000010;
1676
      11'h297: data = 8'b10000010;
1677
      11'h298: data = 8'b10000010;
1678
      11'h299: data = 8'b10000010;
1679
      11'h29A: data = 8'b11111110;
1680
      11'h29B: data = 8'b10000010;
1681
      11'h29C: data = 8'b10000010;
1682
      11'h29D: data = 8'b10000010;
1683
      11'h29E: data = 8'b10000010;
1684
      11'h29F: data = 8'b10000010;
1685
      11'h2A0: data = 8'b10000010; // B
1686
      11'h2A1: data = 8'b00000000;
1687
      11'h2A2: data = 8'b00000000;
1688 15 samiam9512
      11'h2A3: data = 8'b00000000;
1689
      11'h2A4: data = 8'b00000000;
1690
      11'h2A5: data = 8'b00000000;
1691
      11'h2A6: data = 8'b00000000;
1692
      11'h2A7: data = 8'b00000000;
1693
 
1694 20 samiam9512
      11'h2A8: data = 8'b11111100; // 'B'
1695
      11'h2A9: data = 8'b10000010;
1696
      11'h2AA: data = 8'b10000010;
1697
      11'h2AB: data = 8'b10000010;
1698
      11'h2AC: data = 8'b10000010;
1699
      11'h2AD: data = 8'b10000010;
1700
      11'h2AE: data = 8'b11111100;
1701
      11'h2AF: data = 8'b10000010;
1702
      11'h2B0: data = 8'b10000010;
1703
      11'h2B1: data = 8'b10000010;
1704
      11'h2B2: data = 8'b10000010;
1705
      11'h2B3: data = 8'b10000010;
1706
      11'h2B4: data = 8'b11111100; // B
1707
      11'h2B5: data = 8'b00000000;
1708
      11'h2B6: data = 8'b00000000;
1709 15 samiam9512
      11'h2B7: data = 8'b00000000;
1710
      11'h2B8: data = 8'b00000000;
1711
      11'h2B9: data = 8'b00000000;
1712
      11'h2BA: data = 8'b00000000;
1713
      11'h2BB: data = 8'b00000000;
1714
 
1715 20 samiam9512
      11'h2BC: data = 8'b01111100; // 'C'
1716
      11'h2BD: data = 8'b10000010;
1717
      11'h2BE: data = 8'b10000000;
1718
      11'h2BF: data = 8'b10000000;
1719
      11'h2C0: data = 8'b10000000;
1720
      11'h2C1: data = 8'b10000000;
1721
      11'h2C2: data = 8'b10000000;
1722
      11'h2C3: data = 8'b10000000;
1723
      11'h2C4: data = 8'b10000000;
1724
      11'h2C5: data = 8'b10000000;
1725
      11'h2C6: data = 8'b10000000;
1726
      11'h2C7: data = 8'b10000010;
1727
      11'h2C8: data = 8'b01111100; // B
1728
      11'h2C9: data = 8'b00000000;
1729
      11'h2CA: data = 8'b00000000;
1730 15 samiam9512
      11'h2CB: data = 8'b00000000;
1731
      11'h2CC: data = 8'b00000000;
1732
      11'h2CD: data = 8'b00000000;
1733
      11'h2CE: data = 8'b00000000;
1734
      11'h2CF: data = 8'b00000000;
1735
 
1736 20 samiam9512
      11'h2D0: data = 8'b11111100; // 'D'
1737
      11'h2D1: data = 8'b10000010;
1738
      11'h2D2: data = 8'b10000010;
1739
      11'h2D3: data = 8'b10000010;
1740
      11'h2D4: data = 8'b10000010;
1741
      11'h2D5: data = 8'b10000010;
1742
      11'h2D6: data = 8'b10000010;
1743
      11'h2D7: data = 8'b10000010;
1744
      11'h2D8: data = 8'b10000010;
1745
      11'h2D9: data = 8'b10000010;
1746
      11'h2DA: data = 8'b10000010;
1747
      11'h2DB: data = 8'b10000010;
1748
      11'h2DC: data = 8'b11111100; // B
1749
      11'h2DD: data = 8'b00000000;
1750
      11'h2DE: data = 8'b00000000;
1751 15 samiam9512
      11'h2DF: data = 8'b00000000;
1752
      11'h2E0: data = 8'b00000000;
1753
      11'h2E1: data = 8'b00000000;
1754
      11'h2E2: data = 8'b00000000;
1755
      11'h2E3: data = 8'b00000000;
1756
 
1757 20 samiam9512
      11'h2E4: data = 8'b11111110; // 'E'
1758
      11'h2E5: data = 8'b10000000;
1759
      11'h2E6: data = 8'b10000000;
1760
      11'h2E7: data = 8'b10000000;
1761
      11'h2E8: data = 8'b10000000;
1762
      11'h2E9: data = 8'b10000000;
1763
      11'h2EA: data = 8'b11111000;
1764
      11'h2EB: data = 8'b10000000;
1765
      11'h2EC: data = 8'b10000000;
1766
      11'h2ED: data = 8'b10000000;
1767
      11'h2EE: data = 8'b10000000;
1768
      11'h2EF: data = 8'b10000000;
1769
      11'h2F0: data = 8'b11111110; // B
1770
      11'h2F1: data = 8'b00000000;
1771
      11'h2F2: data = 8'b00000000;
1772 15 samiam9512
      11'h2F3: data = 8'b00000000;
1773
      11'h2F4: data = 8'b00000000;
1774
      11'h2F5: data = 8'b00000000;
1775
      11'h2F6: data = 8'b00000000;
1776
      11'h2F7: data = 8'b00000000;
1777
 
1778 20 samiam9512
      11'h2F8: data = 8'b11111110; // 'F'
1779
      11'h2F9: data = 8'b10000000;
1780
      11'h2FA: data = 8'b10000000;
1781
      11'h2FB: data = 8'b10000000;
1782
      11'h2FC: data = 8'b10000000;
1783
      11'h2FD: data = 8'b10000000;
1784
      11'h2FE: data = 8'b11111000;
1785
      11'h2FF: data = 8'b10000000;
1786
      11'h300: data = 8'b10000000;
1787
      11'h301: data = 8'b10000000;
1788
      11'h302: data = 8'b10000000;
1789
      11'h303: data = 8'b10000000;
1790
      11'h304: data = 8'b10000000; // B
1791
      11'h305: data = 8'b00000000;
1792
      11'h306: data = 8'b00000000;
1793 15 samiam9512
      11'h307: data = 8'b00000000;
1794
      11'h308: data = 8'b00000000;
1795
      11'h309: data = 8'b00000000;
1796
      11'h30A: data = 8'b00000000;
1797
      11'h30B: data = 8'b00000000;
1798
 
1799 20 samiam9512
      11'h30C: data = 8'b01111100; // 'G'
1800
      11'h30D: data = 8'b10000010;
1801
      11'h30E: data = 8'b10000000;
1802
      11'h30F: data = 8'b10000000;
1803
      11'h310: data = 8'b10000000;
1804
      11'h311: data = 8'b10000000;
1805
      11'h312: data = 8'b10011100;
1806
      11'h313: data = 8'b10000010;
1807
      11'h314: data = 8'b10000010;
1808
      11'h315: data = 8'b10000010;
1809
      11'h316: data = 8'b10000010;
1810
      11'h317: data = 8'b10000010;
1811
      11'h318: data = 8'b01111100; // B
1812
      11'h319: data = 8'b00000000;
1813
      11'h31A: data = 8'b00000000;
1814 15 samiam9512
      11'h31B: data = 8'b00000000;
1815
      11'h31C: data = 8'b00000000;
1816
      11'h31D: data = 8'b00000000;
1817
      11'h31E: data = 8'b00000000;
1818
      11'h31F: data = 8'b00000000;
1819
 
1820 20 samiam9512
      11'h320: data = 8'b10000010; // 'H'
1821
      11'h321: data = 8'b10000010;
1822
      11'h322: data = 8'b10000010;
1823
      11'h323: data = 8'b10000010;
1824
      11'h324: data = 8'b10000010;
1825
      11'h325: data = 8'b10000010;
1826
      11'h326: data = 8'b11111110;
1827
      11'h327: data = 8'b10000010;
1828
      11'h328: data = 8'b10000010;
1829
      11'h329: data = 8'b10000010;
1830
      11'h32A: data = 8'b10000010;
1831
      11'h32B: data = 8'b10000010;
1832
      11'h32C: data = 8'b10000010; // B
1833
      11'h32D: data = 8'b00000000;
1834
      11'h32E: data = 8'b00000000;
1835 15 samiam9512
      11'h32F: data = 8'b00000000;
1836
      11'h330: data = 8'b00000000;
1837
      11'h331: data = 8'b00000000;
1838
      11'h332: data = 8'b00000000;
1839
      11'h333: data = 8'b00000000;
1840
 
1841 20 samiam9512
      11'h334: data = 8'b11111110; // 'I'
1842
      11'h335: data = 8'b00010000;
1843 15 samiam9512
      11'h336: data = 8'b00010000;
1844
      11'h337: data = 8'b00010000;
1845
      11'h338: data = 8'b00010000;
1846
      11'h339: data = 8'b00010000;
1847
      11'h33A: data = 8'b00010000;
1848
      11'h33B: data = 8'b00010000;
1849
      11'h33C: data = 8'b00010000;
1850
      11'h33D: data = 8'b00010000;
1851
      11'h33E: data = 8'b00010000;
1852
      11'h33F: data = 8'b00010000;
1853 20 samiam9512
      11'h340: data = 8'b11111110; // B
1854
      11'h341: data = 8'b00000000;
1855
      11'h342: data = 8'b00000000;
1856 15 samiam9512
      11'h343: data = 8'b00000000;
1857
      11'h344: data = 8'b00000000;
1858
      11'h345: data = 8'b00000000;
1859
      11'h346: data = 8'b00000000;
1860
      11'h347: data = 8'b00000000;
1861
 
1862 20 samiam9512
      11'h348: data = 8'b00000010; // 'J'
1863 15 samiam9512
      11'h349: data = 8'b00000010;
1864
      11'h34A: data = 8'b00000010;
1865
      11'h34B: data = 8'b00000010;
1866
      11'h34C: data = 8'b00000010;
1867
      11'h34D: data = 8'b00000010;
1868
      11'h34E: data = 8'b00000010;
1869
      11'h34F: data = 8'b00000010;
1870
      11'h350: data = 8'b00000010;
1871
      11'h351: data = 8'b00000010;
1872
      11'h352: data = 8'b00000010;
1873 20 samiam9512
      11'h353: data = 8'b10000010;
1874
      11'h354: data = 8'b01111100; // B
1875
      11'h355: data = 8'b00000000;
1876
      11'h356: data = 8'b00000000;
1877 15 samiam9512
      11'h357: data = 8'b00000000;
1878
      11'h358: data = 8'b00000000;
1879
      11'h359: data = 8'b00000000;
1880
      11'h35A: data = 8'b00000000;
1881
      11'h35B: data = 8'b00000000;
1882
 
1883 20 samiam9512
      11'h35C: data = 8'b10000010; // 'K'
1884
      11'h35D: data = 8'b10000100;
1885
      11'h35E: data = 8'b10001000;
1886
      11'h35F: data = 8'b10010000;
1887
      11'h360: data = 8'b10100000;
1888
      11'h361: data = 8'b11000000;
1889
      11'h362: data = 8'b10000000;
1890
      11'h363: data = 8'b11000000;
1891
      11'h364: data = 8'b10100000;
1892
      11'h365: data = 8'b10010000;
1893
      11'h366: data = 8'b10001000;
1894
      11'h367: data = 8'b10000100;
1895
      11'h368: data = 8'b10000010; // B
1896
      11'h369: data = 8'b00000000;
1897
      11'h36A: data = 8'b00000000;
1898 15 samiam9512
      11'h36B: data = 8'b00000000;
1899
      11'h36C: data = 8'b00000000;
1900
      11'h36D: data = 8'b00000000;
1901
      11'h36E: data = 8'b00000000;
1902
      11'h36F: data = 8'b00000000;
1903
 
1904 20 samiam9512
      11'h370: data = 8'b10000000; // 'L'
1905
      11'h371: data = 8'b10000000;
1906
      11'h372: data = 8'b10000000;
1907
      11'h373: data = 8'b10000000;
1908
      11'h374: data = 8'b10000000;
1909
      11'h375: data = 8'b10000000;
1910
      11'h376: data = 8'b10000000;
1911
      11'h377: data = 8'b10000000;
1912
      11'h378: data = 8'b10000000;
1913
      11'h379: data = 8'b10000000;
1914
      11'h37A: data = 8'b10000000;
1915
      11'h37B: data = 8'b10000000;
1916
      11'h37C: data = 8'b11111110; // B
1917
      11'h37D: data = 8'b00000000;
1918
      11'h37E: data = 8'b00000000;
1919 15 samiam9512
      11'h37F: data = 8'b00000000;
1920
      11'h380: data = 8'b00000000;
1921
      11'h381: data = 8'b00000000;
1922
      11'h382: data = 8'b00000000;
1923
      11'h383: data = 8'b00000000;
1924
 
1925 20 samiam9512
      11'h384: data = 8'b10000010; // 'M'
1926
      11'h385: data = 8'b11000110;
1927
      11'h386: data = 8'b10101010;
1928
      11'h387: data = 8'b10010010;
1929
      11'h388: data = 8'b10000010;
1930
      11'h389: data = 8'b10000010;
1931
      11'h38A: data = 8'b10000010;
1932
      11'h38B: data = 8'b10000010;
1933
      11'h38C: data = 8'b10000010;
1934
      11'h38D: data = 8'b10000010;
1935
      11'h38E: data = 8'b10000010;
1936
      11'h38F: data = 8'b10000010;
1937
      11'h390: data = 8'b10000010; // B
1938
      11'h391: data = 8'b00000000;
1939
      11'h392: data = 8'b00000000;
1940 15 samiam9512
      11'h393: data = 8'b00000000;
1941
      11'h394: data = 8'b00000000;
1942
      11'h395: data = 8'b00000000;
1943
      11'h396: data = 8'b00000000;
1944
      11'h397: data = 8'b00000000;
1945
 
1946 20 samiam9512
      11'h398: data = 8'b10000010; // 'N'
1947
      11'h399: data = 8'b11000010;
1948
      11'h39A: data = 8'b10100010;
1949
      11'h39B: data = 8'b10010010;
1950
      11'h39C: data = 8'b10001010;
1951
      11'h39D: data = 8'b10000110;
1952
      11'h39E: data = 8'b10000010;
1953
      11'h39F: data = 8'b10000010;
1954
      11'h3A0: data = 8'b10000010;
1955
      11'h3A1: data = 8'b10000010;
1956
      11'h3A2: data = 8'b10000010;
1957
      11'h3A3: data = 8'b10000010;
1958
      11'h3A4: data = 8'b10000010; // B
1959
      11'h3A5: data = 8'b00000000;
1960
      11'h3A6: data = 8'b00000000;
1961 15 samiam9512
      11'h3A7: data = 8'b00000000;
1962
      11'h3A8: data = 8'b00000000;
1963
      11'h3A9: data = 8'b00000000;
1964
      11'h3AA: data = 8'b00000000;
1965
      11'h3AB: data = 8'b00000000;
1966
 
1967 20 samiam9512
      11'h3AC: data = 8'b01111100; // 'O'
1968
      11'h3AD: data = 8'b10000010;
1969
      11'h3AE: data = 8'b10000010;
1970
      11'h3AF: data = 8'b10000010;
1971
      11'h3B0: data = 8'b10000010;
1972
      11'h3B1: data = 8'b10000010;
1973
      11'h3B2: data = 8'b10000010;
1974
      11'h3B3: data = 8'b10000010;
1975
      11'h3B4: data = 8'b10000010;
1976
      11'h3B5: data = 8'b10000010;
1977
      11'h3B6: data = 8'b10000010;
1978
      11'h3B7: data = 8'b10000010;
1979
      11'h3B8: data = 8'b01111100; // B
1980
      11'h3B9: data = 8'b00000000;
1981
      11'h3BA: data = 8'b00000000;
1982 15 samiam9512
      11'h3BB: data = 8'b00000000;
1983
      11'h3BC: data = 8'b00000000;
1984
      11'h3BD: data = 8'b00000000;
1985
      11'h3BE: data = 8'b00000000;
1986
      11'h3BF: data = 8'b00000000;
1987
 
1988 20 samiam9512
      11'h3C0: data = 8'b11111100; // 'P'
1989
      11'h3C1: data = 8'b10000010;
1990
      11'h3C2: data = 8'b10000010;
1991
      11'h3C3: data = 8'b10000010;
1992
      11'h3C4: data = 8'b10000010;
1993
      11'h3C5: data = 8'b10000010;
1994
      11'h3C6: data = 8'b11111100;
1995
      11'h3C7: data = 8'b10000000;
1996
      11'h3C8: data = 8'b10000000;
1997
      11'h3C9: data = 8'b10000000;
1998
      11'h3CA: data = 8'b10000000;
1999
      11'h3CB: data = 8'b10000000;
2000
      11'h3CC: data = 8'b10000000; // B
2001
      11'h3CD: data = 8'b00000000;
2002
      11'h3CE: data = 8'b00000000;
2003 15 samiam9512
      11'h3CF: data = 8'b00000000;
2004
      11'h3D0: data = 8'b00000000;
2005
      11'h3D1: data = 8'b00000000;
2006
      11'h3D2: data = 8'b00000000;
2007
      11'h3D3: data = 8'b00000000;
2008
 
2009 20 samiam9512
      11'h3D4: data = 8'b01111100; // 'Q'
2010
      11'h3D5: data = 8'b10000010;
2011
      11'h3D6: data = 8'b10000010;
2012
      11'h3D7: data = 8'b10000010;
2013
      11'h3D8: data = 8'b10000010;
2014
      11'h3D9: data = 8'b10000010;
2015
      11'h3DA: data = 8'b10000010;
2016
      11'h3DB: data = 8'b10000010;
2017
      11'h3DC: data = 8'b10000010;
2018
      11'h3DD: data = 8'b10000010;
2019
      11'h3DE: data = 8'b10001010;
2020
      11'h3DF: data = 8'b10000110;
2021
      11'h3E0: data = 8'b01111110; // B
2022
      11'h3E1: data = 8'b00000000;
2023
      11'h3E2: data = 8'b00000000;
2024 15 samiam9512
      11'h3E3: data = 8'b00000000;
2025
      11'h3E4: data = 8'b00000000;
2026
      11'h3E5: data = 8'b00000000;
2027
      11'h3E6: data = 8'b00000000;
2028
      11'h3E7: data = 8'b00000000;
2029
 
2030 20 samiam9512
      11'h3E8: data = 8'b11111100; // 'R'
2031
      11'h3E9: data = 8'b10000010;
2032
      11'h3EA: data = 8'b10000010;
2033
      11'h3EB: data = 8'b10000010;
2034
      11'h3EC: data = 8'b10000010;
2035
      11'h3ED: data = 8'b10000010;
2036
      11'h3EE: data = 8'b11111100;
2037
      11'h3EF: data = 8'b11000000;
2038
      11'h3F0: data = 8'b10100000;
2039
      11'h3F1: data = 8'b10010000;
2040
      11'h3F2: data = 8'b10001000;
2041
      11'h3F3: data = 8'b10000100;
2042
      11'h3F4: data = 8'b10000010; // B
2043
      11'h3F5: data = 8'b00000000;
2044
      11'h3F6: data = 8'b00000000;
2045 15 samiam9512
      11'h3F7: data = 8'b00000000;
2046
      11'h3F8: data = 8'b00000000;
2047
      11'h3F9: data = 8'b00000000;
2048
      11'h3FA: data = 8'b00000000;
2049
      11'h3FB: data = 8'b00000000;
2050
 
2051 20 samiam9512
      11'h3FC: data = 8'b01111100; // 'S'
2052
      11'h3FD: data = 8'b10000010;
2053
      11'h3FE: data = 8'b10000000;
2054
      11'h3FF: data = 8'b10000000;
2055
      11'h400: data = 8'b10000000;
2056
      11'h401: data = 8'b10000000;
2057
      11'h402: data = 8'b01111100;
2058
      11'h403: data = 8'b00000010;
2059
      11'h404: data = 8'b00000010;
2060 15 samiam9512
      11'h405: data = 8'b00000010;
2061
      11'h406: data = 8'b00000010;
2062 20 samiam9512
      11'h407: data = 8'b10000010;
2063
      11'h408: data = 8'b01111100; // B
2064
      11'h409: data = 8'b00000000;
2065
      11'h40A: data = 8'b00000000;
2066 15 samiam9512
      11'h40B: data = 8'b00000000;
2067
      11'h40C: data = 8'b00000000;
2068
      11'h40D: data = 8'b00000000;
2069
      11'h40E: data = 8'b00000000;
2070
      11'h40F: data = 8'b00000000;
2071
 
2072 20 samiam9512
      11'h410: data = 8'b11111110; // 'T'
2073
      11'h411: data = 8'b00010000;
2074 15 samiam9512
      11'h412: data = 8'b00010000;
2075
      11'h413: data = 8'b00010000;
2076
      11'h414: data = 8'b00010000;
2077
      11'h415: data = 8'b00010000;
2078
      11'h416: data = 8'b00010000;
2079
      11'h417: data = 8'b00010000;
2080
      11'h418: data = 8'b00010000;
2081
      11'h419: data = 8'b00010000;
2082
      11'h41A: data = 8'b00010000;
2083
      11'h41B: data = 8'b00010000;
2084 20 samiam9512
      11'h41C: data = 8'b00010000; // B
2085
      11'h41D: data = 8'b00000000;
2086
      11'h41E: data = 8'b00000000;
2087 15 samiam9512
      11'h41F: data = 8'b00000000;
2088
      11'h420: data = 8'b00000000;
2089
      11'h421: data = 8'b00000000;
2090
      11'h422: data = 8'b00000000;
2091
      11'h423: data = 8'b00000000;
2092
 
2093 20 samiam9512
      11'h424: data = 8'b10000010; // 'U'
2094
      11'h425: data = 8'b10000010;
2095
      11'h426: data = 8'b10000010;
2096
      11'h427: data = 8'b10000010;
2097
      11'h428: data = 8'b10000010;
2098
      11'h429: data = 8'b10000010;
2099
      11'h42A: data = 8'b10000010;
2100
      11'h42B: data = 8'b10000010;
2101
      11'h42C: data = 8'b10000010;
2102
      11'h42D: data = 8'b10000010;
2103
      11'h42E: data = 8'b10000010;
2104
      11'h42F: data = 8'b10000010;
2105
      11'h430: data = 8'b01111100; // B
2106
      11'h431: data = 8'b00000000;
2107
      11'h432: data = 8'b00000000;
2108 15 samiam9512
      11'h433: data = 8'b00000000;
2109
      11'h434: data = 8'b00000000;
2110
      11'h435: data = 8'b00000000;
2111
      11'h436: data = 8'b00000000;
2112
      11'h437: data = 8'b00000000;
2113
 
2114 20 samiam9512
      11'h438: data = 8'b10000010; // 'V'
2115
      11'h439: data = 8'b10000010;
2116
      11'h43A: data = 8'b10000010;
2117
      11'h43B: data = 8'b10000010;
2118
      11'h43C: data = 8'b10000010;
2119
      11'h43D: data = 8'b10000010;
2120
      11'h43E: data = 8'b10000010;
2121
      11'h43F: data = 8'b10000010;
2122
      11'h440: data = 8'b10000010;
2123
      11'h441: data = 8'b10000010;
2124
      11'h442: data = 8'b01000100;
2125
      11'h443: data = 8'b00101000;
2126
      11'h444: data = 8'b00010000; // B
2127
      11'h445: data = 8'b00000000;
2128
      11'h446: data = 8'b00000000;
2129 15 samiam9512
      11'h447: data = 8'b00000000;
2130
      11'h448: data = 8'b00000000;
2131
      11'h449: data = 8'b00000000;
2132
      11'h44A: data = 8'b00000000;
2133
      11'h44B: data = 8'b00000000;
2134
 
2135 20 samiam9512
      11'h44C: data = 8'b10000010; // 'W'
2136
      11'h44D: data = 8'b10000010;
2137
      11'h44E: data = 8'b10000010;
2138
      11'h44F: data = 8'b10000010;
2139
      11'h450: data = 8'b10000010;
2140
      11'h451: data = 8'b10000010;
2141
      11'h452: data = 8'b10000010;
2142
      11'h453: data = 8'b10000010;
2143
      11'h454: data = 8'b10000010;
2144
      11'h455: data = 8'b10010010;
2145
      11'h456: data = 8'b10101010;
2146
      11'h457: data = 8'b11000110;
2147
      11'h458: data = 8'b10000010; // B
2148
      11'h459: data = 8'b00000000;
2149
      11'h45A: data = 8'b00000000;
2150 15 samiam9512
      11'h45B: data = 8'b00000000;
2151
      11'h45C: data = 8'b00000000;
2152
      11'h45D: data = 8'b00000000;
2153
      11'h45E: data = 8'b00000000;
2154
      11'h45F: data = 8'b00000000;
2155
 
2156 20 samiam9512
      11'h460: data = 8'b10000010; // 'X'
2157
      11'h461: data = 8'b10000010;
2158
      11'h462: data = 8'b10000010;
2159
      11'h463: data = 8'b10000010;
2160
      11'h464: data = 8'b01000100;
2161
      11'h465: data = 8'b00101000;
2162
      11'h466: data = 8'b00010000;
2163
      11'h467: data = 8'b00101000;
2164
      11'h468: data = 8'b01000100;
2165
      11'h469: data = 8'b10000010;
2166
      11'h46A: data = 8'b10000010;
2167
      11'h46B: data = 8'b10000010;
2168
      11'h46C: data = 8'b10000010; // B
2169
      11'h46D: data = 8'b00000000;
2170
      11'h46E: data = 8'b00000000;
2171 15 samiam9512
      11'h46F: data = 8'b00000000;
2172
      11'h470: data = 8'b00000000;
2173
      11'h471: data = 8'b00000000;
2174
      11'h472: data = 8'b00000000;
2175
      11'h473: data = 8'b00000000;
2176
 
2177 20 samiam9512
      11'h474: data = 8'b10000010; // 'Y'
2178
      11'h475: data = 8'b10000010;
2179
      11'h476: data = 8'b10000010;
2180
      11'h477: data = 8'b10000010;
2181
      11'h478: data = 8'b01000100;
2182
      11'h479: data = 8'b00101000;
2183
      11'h47A: data = 8'b00010000;
2184
      11'h47B: data = 8'b00010000;
2185 15 samiam9512
      11'h47C: data = 8'b00010000;
2186
      11'h47D: data = 8'b00010000;
2187
      11'h47E: data = 8'b00010000;
2188
      11'h47F: data = 8'b00010000;
2189 20 samiam9512
      11'h480: data = 8'b00010000; // B
2190
      11'h481: data = 8'b00000000;
2191
      11'h482: data = 8'b00000000;
2192 15 samiam9512
      11'h483: data = 8'b00000000;
2193
      11'h484: data = 8'b00000000;
2194
      11'h485: data = 8'b00000000;
2195
      11'h486: data = 8'b00000000;
2196
      11'h487: data = 8'b00000000;
2197
 
2198 20 samiam9512
      11'h488: data = 8'b11111110; // 'Z'
2199
      11'h489: data = 8'b00000010;
2200 15 samiam9512
      11'h48A: data = 8'b00000010;
2201
      11'h48B: data = 8'b00000010;
2202
      11'h48C: data = 8'b00000100;
2203 20 samiam9512
      11'h48D: data = 8'b00001000;
2204
      11'h48E: data = 8'b00010000;
2205
      11'h48F: data = 8'b00100000;
2206
      11'h490: data = 8'b01000000;
2207
      11'h491: data = 8'b10000000;
2208
      11'h492: data = 8'b10000000;
2209
      11'h493: data = 8'b10000000;
2210
      11'h494: data = 8'b11111110; // B
2211
      11'h495: data = 8'b00000000;
2212
      11'h496: data = 8'b00000000;
2213 15 samiam9512
      11'h497: data = 8'b00000000;
2214
      11'h498: data = 8'b00000000;
2215
      11'h499: data = 8'b00000000;
2216
      11'h49A: data = 8'b00000000;
2217
      11'h49B: data = 8'b00000000;
2218
 
2219 20 samiam9512
      11'h49C: data = 8'b00111000; // '['
2220
      11'h49D: data = 8'b00100000;
2221
      11'h49E: data = 8'b00100000;
2222
      11'h49F: data = 8'b00100000;
2223
      11'h4A0: data = 8'b00100000;
2224
      11'h4A1: data = 8'b00100000;
2225
      11'h4A2: data = 8'b00100000;
2226
      11'h4A3: data = 8'b00100000;
2227
      11'h4A4: data = 8'b00100000;
2228
      11'h4A5: data = 8'b00100000;
2229
      11'h4A6: data = 8'b00100000;
2230
      11'h4A7: data = 8'b00100000;
2231
      11'h4A8: data = 8'b00111000; // B
2232
      11'h4A9: data = 8'b00000000;
2233
      11'h4AA: data = 8'b00000000;
2234 15 samiam9512
      11'h4AB: data = 8'b00000000;
2235
      11'h4AC: data = 8'b00000000;
2236
      11'h4AD: data = 8'b00000000;
2237
      11'h4AE: data = 8'b00000000;
2238
      11'h4AF: data = 8'b00000000;
2239
 
2240
      11'h4B0: data = 8'b00000000; // '\'
2241 20 samiam9512
      11'h4B1: data = 8'b10000000;
2242 15 samiam9512
      11'h4B2: data = 8'b01000000;
2243 20 samiam9512
      11'h4B3: data = 8'b01000000;
2244 15 samiam9512
      11'h4B4: data = 8'b00100000;
2245
      11'h4B5: data = 8'b00100000;
2246
      11'h4B6: data = 8'b00010000;
2247
      11'h4B7: data = 8'b00010000;
2248 20 samiam9512
      11'h4B8: data = 8'b00001000;
2249 15 samiam9512
      11'h4B9: data = 8'b00001000;
2250 20 samiam9512
      11'h4BA: data = 8'b00000100;
2251
      11'h4BB: data = 8'b00000100;
2252
      11'h4BC: data = 8'b00000010; // B
2253
      11'h4BD: data = 8'b00000000;
2254
      11'h4BE: data = 8'b00000000;
2255 15 samiam9512
      11'h4BF: data = 8'b00000000;
2256
      11'h4C0: data = 8'b00000000;
2257
      11'h4C1: data = 8'b00000000;
2258
      11'h4C2: data = 8'b00000000;
2259
      11'h4C3: data = 8'b00000000;
2260
 
2261 20 samiam9512
      11'h4C4: data = 8'b00111000; // ']'
2262
      11'h4C5: data = 8'b00001000;
2263
      11'h4C6: data = 8'b00001000;
2264
      11'h4C7: data = 8'b00001000;
2265
      11'h4C8: data = 8'b00001000;
2266
      11'h4C9: data = 8'b00001000;
2267
      11'h4CA: data = 8'b00001000;
2268
      11'h4CB: data = 8'b00001000;
2269
      11'h4CC: data = 8'b00001000;
2270
      11'h4CD: data = 8'b00001000;
2271
      11'h4CE: data = 8'b00001000;
2272
      11'h4CF: data = 8'b00001000;
2273
      11'h4D0: data = 8'b00111000; // B
2274
      11'h4D1: data = 8'b00000000;
2275
      11'h4D2: data = 8'b00000000;
2276 15 samiam9512
      11'h4D3: data = 8'b00000000;
2277
      11'h4D4: data = 8'b00000000;
2278
      11'h4D5: data = 8'b00000000;
2279
      11'h4D6: data = 8'b00000000;
2280
      11'h4D7: data = 8'b00000000;
2281
 
2282 20 samiam9512
      11'h4D8: data = 8'b00010000; // '^'
2283
      11'h4D9: data = 8'b00101000;
2284
      11'h4DA: data = 8'b01000100;
2285
      11'h4DB: data = 8'b00000000;
2286 15 samiam9512
      11'h4DC: data = 8'b00000000;
2287
      11'h4DD: data = 8'b00000000;
2288
      11'h4DE: data = 8'b00000000;
2289
      11'h4DF: data = 8'b00000000;
2290
      11'h4E0: data = 8'b00000000;
2291
      11'h4E1: data = 8'b00000000;
2292
      11'h4E2: data = 8'b00000000;
2293
      11'h4E3: data = 8'b00000000;
2294 20 samiam9512
      11'h4E4: data = 8'b00000000; // B
2295 15 samiam9512
      11'h4E5: data = 8'b00000000;
2296
      11'h4E6: data = 8'b00000000;
2297
      11'h4E7: data = 8'b00000000;
2298
      11'h4E8: data = 8'b00000000;
2299
      11'h4E9: data = 8'b00000000;
2300
      11'h4EA: data = 8'b00000000;
2301
      11'h4EB: data = 8'b00000000;
2302
 
2303
      11'h4EC: data = 8'b00000000; // '_'
2304
      11'h4ED: data = 8'b00000000;
2305
      11'h4EE: data = 8'b00000000;
2306
      11'h4EF: data = 8'b00000000;
2307
      11'h4F0: data = 8'b00000000;
2308
      11'h4F1: data = 8'b00000000;
2309
      11'h4F2: data = 8'b00000000;
2310
      11'h4F3: data = 8'b00000000;
2311
      11'h4F4: data = 8'b00000000;
2312
      11'h4F5: data = 8'b00000000;
2313
      11'h4F6: data = 8'b00000000;
2314
      11'h4F7: data = 8'b00000000;
2315 20 samiam9512
      11'h4F8: data = 8'b11111110; // B
2316 15 samiam9512
      11'h4F9: data = 8'b00000000;
2317 20 samiam9512
      11'h4FA: data = 8'b00000000;
2318 15 samiam9512
      11'h4FB: data = 8'b00000000;
2319
      11'h4FC: data = 8'b00000000;
2320
      11'h4FD: data = 8'b00000000;
2321
      11'h4FE: data = 8'b00000000;
2322
      11'h4FF: data = 8'b00000000;
2323
 
2324 20 samiam9512
      11'h500: data = 8'b00100000; // '`'
2325
      11'h501: data = 8'b00010000;
2326
      11'h502: data = 8'b00000000;
2327 15 samiam9512
      11'h503: data = 8'b00000000;
2328
      11'h504: data = 8'b00000000;
2329
      11'h505: data = 8'b00000000;
2330
      11'h506: data = 8'b00000000;
2331
      11'h507: data = 8'b00000000;
2332
      11'h508: data = 8'b00000000;
2333
      11'h509: data = 8'b00000000;
2334
      11'h50A: data = 8'b00000000;
2335
      11'h50B: data = 8'b00000000;
2336 20 samiam9512
      11'h50C: data = 8'b00000000; // B
2337 15 samiam9512
      11'h50D: data = 8'b00000000;
2338
      11'h50E: data = 8'b00000000;
2339
      11'h50F: data = 8'b00000000;
2340
      11'h510: data = 8'b00000000;
2341
      11'h511: data = 8'b00000000;
2342
      11'h512: data = 8'b00000000;
2343
      11'h513: data = 8'b00000000;
2344
 
2345
      11'h514: data = 8'b00000000; // 'a'
2346
      11'h515: data = 8'b00000000;
2347
      11'h516: data = 8'b00000000;
2348
      11'h517: data = 8'b00000000;
2349
      11'h518: data = 8'b00000000;
2350
      11'h519: data = 8'b00000000;
2351 20 samiam9512
      11'h51A: data = 8'b01111000;
2352
      11'h51B: data = 8'b00000100;
2353
      11'h51C: data = 8'b00111100;
2354
      11'h51D: data = 8'b01000100;
2355
      11'h51E: data = 8'b01000100;
2356
      11'h51F: data = 8'b01000100;
2357
      11'h520: data = 8'b00111100; // B
2358
      11'h521: data = 8'b00000000;
2359
      11'h522: data = 8'b00000000;
2360 15 samiam9512
      11'h523: data = 8'b00000000;
2361
      11'h524: data = 8'b00000000;
2362
      11'h525: data = 8'b00000000;
2363
      11'h526: data = 8'b00000000;
2364
      11'h527: data = 8'b00000000;
2365
 
2366 20 samiam9512
      11'h528: data = 8'b01000000; // 'b'
2367
      11'h529: data = 8'b01000000;
2368
      11'h52A: data = 8'b01000000;
2369
      11'h52B: data = 8'b01000000;
2370
      11'h52C: data = 8'b01000000;
2371
      11'h52D: data = 8'b01000000;
2372
      11'h52E: data = 8'b01111000;
2373
      11'h52F: data = 8'b01000100;
2374
      11'h530: data = 8'b01000100;
2375
      11'h531: data = 8'b01000100;
2376
      11'h532: data = 8'b01000100;
2377
      11'h533: data = 8'b01000100;
2378
      11'h534: data = 8'b01111000; // B
2379
      11'h535: data = 8'b00000000;
2380
      11'h536: data = 8'b00000000;
2381 15 samiam9512
      11'h537: data = 8'b00000000;
2382
      11'h538: data = 8'b00000000;
2383
      11'h539: data = 8'b00000000;
2384
      11'h53A: data = 8'b00000000;
2385
      11'h53B: data = 8'b00000000;
2386
 
2387
      11'h53C: data = 8'b00000000; // 'c'
2388
      11'h53D: data = 8'b00000000;
2389
      11'h53E: data = 8'b00000000;
2390
      11'h53F: data = 8'b00000000;
2391
      11'h540: data = 8'b00000000;
2392
      11'h541: data = 8'b00000000;
2393 20 samiam9512
      11'h542: data = 8'b00111000;
2394
      11'h543: data = 8'b01000100;
2395
      11'h544: data = 8'b01000000;
2396
      11'h545: data = 8'b01000000;
2397
      11'h546: data = 8'b01000000;
2398
      11'h547: data = 8'b01000100;
2399
      11'h548: data = 8'b00111000; // B
2400
      11'h549: data = 8'b00000000;
2401
      11'h54A: data = 8'b00000000;
2402 15 samiam9512
      11'h54B: data = 8'b00000000;
2403
      11'h54C: data = 8'b00000000;
2404
      11'h54D: data = 8'b00000000;
2405
      11'h54E: data = 8'b00000000;
2406
      11'h54F: data = 8'b00000000;
2407
 
2408 20 samiam9512
      11'h550: data = 8'b00000100; // 'd'
2409
      11'h551: data = 8'b00000100;
2410
      11'h552: data = 8'b00000100;
2411
      11'h553: data = 8'b00000100;
2412
      11'h554: data = 8'b00000100;
2413
      11'h555: data = 8'b00000100;
2414
      11'h556: data = 8'b00111100;
2415
      11'h557: data = 8'b01000100;
2416
      11'h558: data = 8'b01000100;
2417
      11'h559: data = 8'b01000100;
2418
      11'h55A: data = 8'b01000100;
2419
      11'h55B: data = 8'b01000100;
2420
      11'h55C: data = 8'b00111100; // B
2421
      11'h55D: data = 8'b00000000;
2422
      11'h55E: data = 8'b00000000;
2423 15 samiam9512
      11'h55F: data = 8'b00000000;
2424
      11'h560: data = 8'b00000000;
2425
      11'h561: data = 8'b00000000;
2426
      11'h562: data = 8'b00000000;
2427
      11'h563: data = 8'b00000000;
2428
 
2429
      11'h564: data = 8'b00000000; // 'e'
2430
      11'h565: data = 8'b00000000;
2431
      11'h566: data = 8'b00000000;
2432
      11'h567: data = 8'b00000000;
2433
      11'h568: data = 8'b00000000;
2434
      11'h569: data = 8'b00000000;
2435 20 samiam9512
      11'h56A: data = 8'b00111000;
2436
      11'h56B: data = 8'b01000100;
2437
      11'h56C: data = 8'b01000100;
2438
      11'h56D: data = 8'b01111100;
2439
      11'h56E: data = 8'b01000000;
2440
      11'h56F: data = 8'b01000000;
2441
      11'h570: data = 8'b00111100; // B
2442
      11'h571: data = 8'b00000000;
2443
      11'h572: data = 8'b00000000;
2444 15 samiam9512
      11'h573: data = 8'b00000000;
2445
      11'h574: data = 8'b00000000;
2446
      11'h575: data = 8'b00000000;
2447
      11'h576: data = 8'b00000000;
2448
      11'h577: data = 8'b00000000;
2449
 
2450 20 samiam9512
      11'h578: data = 8'b00001100; // 'f'
2451
      11'h579: data = 8'b00010000;
2452
      11'h57A: data = 8'b00010000;
2453
      11'h57B: data = 8'b00010000;
2454
      11'h57C: data = 8'b00010000;
2455
      11'h57D: data = 8'b00010000;
2456
      11'h57E: data = 8'b01111100;
2457
      11'h57F: data = 8'b00010000;
2458 15 samiam9512
      11'h580: data = 8'b00010000;
2459
      11'h581: data = 8'b00010000;
2460 20 samiam9512
      11'h582: data = 8'b00010000;
2461 15 samiam9512
      11'h583: data = 8'b00010000;
2462 20 samiam9512
      11'h584: data = 8'b00010000; // B
2463
      11'h585: data = 8'b00000000;
2464
      11'h586: data = 8'b00000000;
2465 15 samiam9512
      11'h587: data = 8'b00000000;
2466
      11'h588: data = 8'b00000000;
2467
      11'h589: data = 8'b00000000;
2468
      11'h58A: data = 8'b00000000;
2469
      11'h58B: data = 8'b00000000;
2470
 
2471
      11'h58C: data = 8'b00000000; // 'g'
2472
      11'h58D: data = 8'b00000000;
2473
      11'h58E: data = 8'b00000000;
2474
      11'h58F: data = 8'b00000000;
2475
      11'h590: data = 8'b00000000;
2476
      11'h591: data = 8'b00000000;
2477 20 samiam9512
      11'h592: data = 8'b00111000;
2478
      11'h593: data = 8'b01000100;
2479
      11'h594: data = 8'b01000100;
2480
      11'h595: data = 8'b01000100;
2481
      11'h596: data = 8'b01000100;
2482
      11'h597: data = 8'b01000100;
2483
      11'h598: data = 8'b00111100; // B
2484
      11'h599: data = 8'b00000100;
2485
      11'h59A: data = 8'b00000100;
2486
      11'h59B: data = 8'b00000100;
2487
      11'h59C: data = 8'b00000100;
2488
      11'h59D: data = 8'b01000100;
2489
      11'h59E: data = 8'b00111000;
2490 15 samiam9512
      11'h59F: data = 8'b00000000;
2491
 
2492 20 samiam9512
      11'h5A0: data = 8'b01000000; // 'h'
2493
      11'h5A1: data = 8'b01000000;
2494
      11'h5A2: data = 8'b01000000;
2495
      11'h5A3: data = 8'b01000000;
2496
      11'h5A4: data = 8'b01000000;
2497
      11'h5A5: data = 8'b01000000;
2498
      11'h5A6: data = 8'b01111000;
2499
      11'h5A7: data = 8'b01000100;
2500
      11'h5A8: data = 8'b01000100;
2501
      11'h5A9: data = 8'b01000100;
2502
      11'h5AA: data = 8'b01000100;
2503
      11'h5AB: data = 8'b01000100;
2504
      11'h5AC: data = 8'b01000100; // B
2505
      11'h5AD: data = 8'b00000000;
2506
      11'h5AE: data = 8'b00000000;
2507 15 samiam9512
      11'h5AF: data = 8'b00000000;
2508
      11'h5B0: data = 8'b00000000;
2509
      11'h5B1: data = 8'b00000000;
2510
      11'h5B2: data = 8'b00000000;
2511
      11'h5B3: data = 8'b00000000;
2512
 
2513
      11'h5B4: data = 8'b00000000; // 'i'
2514
      11'h5B5: data = 8'b00000000;
2515
      11'h5B6: data = 8'b00000000;
2516
      11'h5B7: data = 8'b00000000;
2517 20 samiam9512
      11'h5B8: data = 8'b00010000;
2518 15 samiam9512
      11'h5B9: data = 8'b00000000;
2519 20 samiam9512
      11'h5BA: data = 8'b00110000;
2520
      11'h5BB: data = 8'b00010000;
2521
      11'h5BC: data = 8'b00010000;
2522
      11'h5BD: data = 8'b00010000;
2523 15 samiam9512
      11'h5BE: data = 8'b00010000;
2524 20 samiam9512
      11'h5BF: data = 8'b00010000;
2525
      11'h5C0: data = 8'b00111000; // B
2526
      11'h5C1: data = 8'b00000000;
2527
      11'h5C2: data = 8'b00000000;
2528 15 samiam9512
      11'h5C3: data = 8'b00000000;
2529
      11'h5C4: data = 8'b00000000;
2530
      11'h5C5: data = 8'b00000000;
2531
      11'h5C6: data = 8'b00000000;
2532
      11'h5C7: data = 8'b00000000;
2533
 
2534
      11'h5C8: data = 8'b00000000; // 'j'
2535
      11'h5C9: data = 8'b00000000;
2536
      11'h5CA: data = 8'b00000000;
2537
      11'h5CB: data = 8'b00000000;
2538 20 samiam9512
      11'h5CC: data = 8'b00001000;
2539 15 samiam9512
      11'h5CD: data = 8'b00000000;
2540 20 samiam9512
      11'h5CE: data = 8'b00011000;
2541
      11'h5CF: data = 8'b00001000;
2542
      11'h5D0: data = 8'b00001000;
2543
      11'h5D1: data = 8'b00001000;
2544
      11'h5D2: data = 8'b00001000;
2545
      11'h5D3: data = 8'b00001000;
2546
      11'h5D4: data = 8'b00001000; // B
2547
      11'h5D5: data = 8'b00001000;
2548
      11'h5D6: data = 8'b00001000;
2549
      11'h5D7: data = 8'b00001000;
2550
      11'h5D8: data = 8'b00001000;
2551
      11'h5D9: data = 8'b01001000;
2552
      11'h5DA: data = 8'b00110000;
2553 15 samiam9512
      11'h5DB: data = 8'b00000000;
2554
 
2555 20 samiam9512
      11'h5DC: data = 8'b01000000; // 'k'
2556
      11'h5DD: data = 8'b01000000;
2557
      11'h5DE: data = 8'b01000000;
2558
      11'h5DF: data = 8'b01000000;
2559
      11'h5E0: data = 8'b01000000;
2560
      11'h5E1: data = 8'b01000000;
2561
      11'h5E2: data = 8'b01000100;
2562
      11'h5E3: data = 8'b01001000;
2563
      11'h5E4: data = 8'b01010000;
2564
      11'h5E5: data = 8'b01100000;
2565
      11'h5E6: data = 8'b01010000;
2566
      11'h5E7: data = 8'b01001000;
2567
      11'h5E8: data = 8'b01000100; // B
2568
      11'h5E9: data = 8'b00000000;
2569
      11'h5EA: data = 8'b00000000;
2570 15 samiam9512
      11'h5EB: data = 8'b00000000;
2571
      11'h5EC: data = 8'b00000000;
2572
      11'h5ED: data = 8'b00000000;
2573
      11'h5EE: data = 8'b00000000;
2574
      11'h5EF: data = 8'b00000000;
2575
 
2576 20 samiam9512
      11'h5F0: data = 8'b00110000; // 'l'
2577
      11'h5F1: data = 8'b00010000;
2578
      11'h5F2: data = 8'b00010000;
2579
      11'h5F3: data = 8'b00010000;
2580
      11'h5F4: data = 8'b00010000;
2581
      11'h5F5: data = 8'b00010000;
2582
      11'h5F6: data = 8'b00010000;
2583
      11'h5F7: data = 8'b00010000;
2584
      11'h5F8: data = 8'b00010000;
2585
      11'h5F9: data = 8'b00010000;
2586
      11'h5FA: data = 8'b00010000;
2587
      11'h5FB: data = 8'b00010000;
2588
      11'h5FC: data = 8'b01111100; // B
2589
      11'h5FD: data = 8'b00000000;
2590
      11'h5FE: data = 8'b00000000;
2591 15 samiam9512
      11'h5FF: data = 8'b00000000;
2592
      11'h600: data = 8'b00000000;
2593
      11'h601: data = 8'b00000000;
2594
      11'h602: data = 8'b00000000;
2595
      11'h603: data = 8'b00000000;
2596
 
2597
      11'h604: data = 8'b00000000; // 'm'
2598
      11'h605: data = 8'b00000000;
2599
      11'h606: data = 8'b00000000;
2600
      11'h607: data = 8'b00000000;
2601
      11'h608: data = 8'b00000000;
2602
      11'h609: data = 8'b00000000;
2603 20 samiam9512
      11'h60A: data = 8'b01101100;
2604
      11'h60B: data = 8'b01010100;
2605
      11'h60C: data = 8'b01010100;
2606
      11'h60D: data = 8'b01010100;
2607
      11'h60E: data = 8'b01010100;
2608
      11'h60F: data = 8'b01010100;
2609
      11'h610: data = 8'b01000100; // B
2610
      11'h611: data = 8'b00000000;
2611
      11'h612: data = 8'b00000000;
2612 15 samiam9512
      11'h613: data = 8'b00000000;
2613
      11'h614: data = 8'b00000000;
2614
      11'h615: data = 8'b00000000;
2615
      11'h616: data = 8'b00000000;
2616
      11'h617: data = 8'b00000000;
2617
 
2618
      11'h618: data = 8'b00000000; // 'n'
2619
      11'h619: data = 8'b00000000;
2620
      11'h61A: data = 8'b00000000;
2621
      11'h61B: data = 8'b00000000;
2622
      11'h61C: data = 8'b00000000;
2623
      11'h61D: data = 8'b00000000;
2624 20 samiam9512
      11'h61E: data = 8'b00111000;
2625
      11'h61F: data = 8'b01000100;
2626
      11'h620: data = 8'b01000100;
2627
      11'h621: data = 8'b01000100;
2628
      11'h622: data = 8'b01000100;
2629
      11'h623: data = 8'b01000100;
2630
      11'h624: data = 8'b01000100; // B
2631
      11'h625: data = 8'b00000000;
2632
      11'h626: data = 8'b00000000;
2633 15 samiam9512
      11'h627: data = 8'b00000000;
2634
      11'h628: data = 8'b00000000;
2635
      11'h629: data = 8'b00000000;
2636
      11'h62A: data = 8'b00000000;
2637
      11'h62B: data = 8'b00000000;
2638
 
2639
      11'h62C: data = 8'b00000000; // 'o'
2640
      11'h62D: data = 8'b00000000;
2641
      11'h62E: data = 8'b00000000;
2642
      11'h62F: data = 8'b00000000;
2643
      11'h630: data = 8'b00000000;
2644
      11'h631: data = 8'b00000000;
2645 20 samiam9512
      11'h632: data = 8'b00111000;
2646
      11'h633: data = 8'b01000100;
2647
      11'h634: data = 8'b01000100;
2648
      11'h635: data = 8'b01000100;
2649
      11'h636: data = 8'b01000100;
2650
      11'h637: data = 8'b01000100;
2651
      11'h638: data = 8'b00111000; // B
2652
      11'h639: data = 8'b00000000;
2653
      11'h63A: data = 8'b00000000;
2654 15 samiam9512
      11'h63B: data = 8'b00000000;
2655
      11'h63C: data = 8'b00000000;
2656
      11'h63D: data = 8'b00000000;
2657
      11'h63E: data = 8'b00000000;
2658
      11'h63F: data = 8'b00000000;
2659
 
2660
      11'h640: data = 8'b00000000; // 'p'
2661
      11'h641: data = 8'b00000000;
2662
      11'h642: data = 8'b00000000;
2663
      11'h643: data = 8'b00000000;
2664
      11'h644: data = 8'b00000000;
2665
      11'h645: data = 8'b00000000;
2666 20 samiam9512
      11'h646: data = 8'b01111000;
2667
      11'h647: data = 8'b01000100;
2668
      11'h648: data = 8'b01000100;
2669
      11'h649: data = 8'b01000100;
2670
      11'h64A: data = 8'b01000100;
2671
      11'h64B: data = 8'b01000100;
2672
      11'h64C: data = 8'b01111000; // B
2673
      11'h64D: data = 8'b01000000;
2674
      11'h64E: data = 8'b01000000;
2675 15 samiam9512
      11'h64F: data = 8'b01000000;
2676
      11'h650: data = 8'b01000000;
2677
      11'h651: data = 8'b01000000;
2678 20 samiam9512
      11'h652: data = 8'b01000000;
2679 15 samiam9512
      11'h653: data = 8'b00000000;
2680
 
2681
      11'h654: data = 8'b00000000; // 'q'
2682
      11'h655: data = 8'b00000000;
2683
      11'h656: data = 8'b00000000;
2684
      11'h657: data = 8'b00000000;
2685
      11'h658: data = 8'b00000000;
2686
      11'h659: data = 8'b00000000;
2687 20 samiam9512
      11'h65A: data = 8'b00111100;
2688
      11'h65B: data = 8'b01000100;
2689
      11'h65C: data = 8'b01000100;
2690
      11'h65D: data = 8'b01000100;
2691
      11'h65E: data = 8'b01000100;
2692
      11'h65F: data = 8'b01000100;
2693
      11'h660: data = 8'b00111100; // B
2694
      11'h661: data = 8'b00000100;
2695
      11'h662: data = 8'b00000100;
2696
      11'h663: data = 8'b00000100;
2697
      11'h664: data = 8'b00000100;
2698
      11'h665: data = 8'b00000100;
2699
      11'h666: data = 8'b00000100;
2700 15 samiam9512
      11'h667: data = 8'b00000000;
2701
 
2702
      11'h668: data = 8'b00000000; // 'r'
2703
      11'h669: data = 8'b00000000;
2704
      11'h66A: data = 8'b00000000;
2705
      11'h66B: data = 8'b00000000;
2706
      11'h66C: data = 8'b00000000;
2707
      11'h66D: data = 8'b00000000;
2708 20 samiam9512
      11'h66E: data = 8'b00111100;
2709
      11'h66F: data = 8'b01000000;
2710
      11'h670: data = 8'b01000000;
2711
      11'h671: data = 8'b01000000;
2712
      11'h672: data = 8'b01000000;
2713
      11'h673: data = 8'b01000000;
2714
      11'h674: data = 8'b01000000; // B
2715
      11'h675: data = 8'b00000000;
2716
      11'h676: data = 8'b00000000;
2717 15 samiam9512
      11'h677: data = 8'b00000000;
2718
      11'h678: data = 8'b00000000;
2719
      11'h679: data = 8'b00000000;
2720
      11'h67A: data = 8'b00000000;
2721
      11'h67B: data = 8'b00000000;
2722
 
2723
      11'h67C: data = 8'b00000000; // 's'
2724
      11'h67D: data = 8'b00000000;
2725
      11'h67E: data = 8'b00000000;
2726
      11'h67F: data = 8'b00000000;
2727
      11'h680: data = 8'b00000000;
2728
      11'h681: data = 8'b00000000;
2729 20 samiam9512
      11'h682: data = 8'b00111100;
2730 15 samiam9512
      11'h683: data = 8'b01000000;
2731
      11'h684: data = 8'b01000000;
2732 20 samiam9512
      11'h685: data = 8'b00111000;
2733
      11'h686: data = 8'b00000100;
2734
      11'h687: data = 8'b00000100;
2735
      11'h688: data = 8'b01111000; // B
2736
      11'h689: data = 8'b00000000;
2737
      11'h68A: data = 8'b00000000;
2738 15 samiam9512
      11'h68B: data = 8'b00000000;
2739
      11'h68C: data = 8'b00000000;
2740
      11'h68D: data = 8'b00000000;
2741
      11'h68E: data = 8'b00000000;
2742
      11'h68F: data = 8'b00000000;
2743
 
2744
      11'h690: data = 8'b00000000; // 't'
2745
      11'h691: data = 8'b00000000;
2746
      11'h692: data = 8'b00000000;
2747
      11'h693: data = 8'b00000000;
2748 20 samiam9512
      11'h694: data = 8'b00010000;
2749
      11'h695: data = 8'b00010000;
2750
      11'h696: data = 8'b01111100;
2751
      11'h697: data = 8'b00010000;
2752 15 samiam9512
      11'h698: data = 8'b00010000;
2753 20 samiam9512
      11'h699: data = 8'b00010000;
2754 15 samiam9512
      11'h69A: data = 8'b00010000;
2755
      11'h69B: data = 8'b00010000;
2756 20 samiam9512
      11'h69C: data = 8'b00011000; // B
2757
      11'h69D: data = 8'b00000000;
2758
      11'h69E: data = 8'b00000000;
2759 15 samiam9512
      11'h69F: data = 8'b00000000;
2760
      11'h6A0: data = 8'b00000000;
2761
      11'h6A1: data = 8'b00000000;
2762
      11'h6A2: data = 8'b00000000;
2763
      11'h6A3: data = 8'b00000000;
2764
 
2765
      11'h6A4: data = 8'b00000000; // 'u'
2766
      11'h6A5: data = 8'b00000000;
2767
      11'h6A6: data = 8'b00000000;
2768
      11'h6A7: data = 8'b00000000;
2769
      11'h6A8: data = 8'b00000000;
2770
      11'h6A9: data = 8'b00000000;
2771 20 samiam9512
      11'h6AA: data = 8'b01000100;
2772
      11'h6AB: data = 8'b01000100;
2773
      11'h6AC: data = 8'b01000100;
2774
      11'h6AD: data = 8'b01000100;
2775
      11'h6AE: data = 8'b01000100;
2776
      11'h6AF: data = 8'b01000100;
2777
      11'h6B0: data = 8'b00111000; // B
2778
      11'h6B1: data = 8'b00000000;
2779
      11'h6B2: data = 8'b00000000;
2780 15 samiam9512
      11'h6B3: data = 8'b00000000;
2781
      11'h6B4: data = 8'b00000000;
2782
      11'h6B5: data = 8'b00000000;
2783
      11'h6B6: data = 8'b00000000;
2784
      11'h6B7: data = 8'b00000000;
2785
 
2786
      11'h6B8: data = 8'b00000000; // 'v'
2787
      11'h6B9: data = 8'b00000000;
2788
      11'h6BA: data = 8'b00000000;
2789
      11'h6BB: data = 8'b00000000;
2790
      11'h6BC: data = 8'b00000000;
2791
      11'h6BD: data = 8'b00000000;
2792 20 samiam9512
      11'h6BE: data = 8'b01000100;
2793
      11'h6BF: data = 8'b01000100;
2794
      11'h6C0: data = 8'b01000100;
2795
      11'h6C1: data = 8'b01000100;
2796
      11'h6C2: data = 8'b01000100;
2797
      11'h6C3: data = 8'b00101000;
2798
      11'h6C4: data = 8'b00010000; // B
2799
      11'h6C5: data = 8'b00000000;
2800
      11'h6C6: data = 8'b00000000;
2801 15 samiam9512
      11'h6C7: data = 8'b00000000;
2802
      11'h6C8: data = 8'b00000000;
2803
      11'h6C9: data = 8'b00000000;
2804
      11'h6CA: data = 8'b00000000;
2805
      11'h6CB: data = 8'b00000000;
2806
 
2807
      11'h6CC: data = 8'b00000000; // 'w'
2808
      11'h6CD: data = 8'b00000000;
2809
      11'h6CE: data = 8'b00000000;
2810
      11'h6CF: data = 8'b00000000;
2811
      11'h6D0: data = 8'b00000000;
2812
      11'h6D1: data = 8'b00000000;
2813 20 samiam9512
      11'h6D2: data = 8'b01000100;
2814
      11'h6D3: data = 8'b01010100;
2815
      11'h6D4: data = 8'b01010100;
2816
      11'h6D5: data = 8'b01010100;
2817
      11'h6D6: data = 8'b01010100;
2818
      11'h6D7: data = 8'b01010100;
2819
      11'h6D8: data = 8'b00101000; // B
2820
      11'h6D9: data = 8'b00000000;
2821
      11'h6DA: data = 8'b00000000;
2822 15 samiam9512
      11'h6DB: data = 8'b00000000;
2823
      11'h6DC: data = 8'b00000000;
2824
      11'h6DD: data = 8'b00000000;
2825
      11'h6DE: data = 8'b00000000;
2826
      11'h6DF: data = 8'b00000000;
2827
 
2828
      11'h6E0: data = 8'b00000000; // 'x'
2829
      11'h6E1: data = 8'b00000000;
2830
      11'h6E2: data = 8'b00000000;
2831
      11'h6E3: data = 8'b00000000;
2832
      11'h6E4: data = 8'b00000000;
2833
      11'h6E5: data = 8'b00000000;
2834 20 samiam9512
      11'h6E6: data = 8'b01000100;
2835
      11'h6E7: data = 8'b01000100;
2836
      11'h6E8: data = 8'b00101000;
2837
      11'h6E9: data = 8'b00010000;
2838
      11'h6EA: data = 8'b00101000;
2839
      11'h6EB: data = 8'b01000100;
2840
      11'h6EC: data = 8'b01000100; // B
2841
      11'h6ED: data = 8'b00000000;
2842
      11'h6EE: data = 8'b00000000;
2843 15 samiam9512
      11'h6EF: data = 8'b00000000;
2844
      11'h6F0: data = 8'b00000000;
2845
      11'h6F1: data = 8'b00000000;
2846
      11'h6F2: data = 8'b00000000;
2847
      11'h6F3: data = 8'b00000000;
2848
 
2849
      11'h6F4: data = 8'b00000000; // 'y'
2850
      11'h6F5: data = 8'b00000000;
2851
      11'h6F6: data = 8'b00000000;
2852
      11'h6F7: data = 8'b00000000;
2853
      11'h6F8: data = 8'b00000000;
2854
      11'h6F9: data = 8'b00000000;
2855 20 samiam9512
      11'h6FA: data = 8'b01000100;
2856
      11'h6FB: data = 8'b01000100;
2857
      11'h6FC: data = 8'b01000100;
2858
      11'h6FD: data = 8'b01000100;
2859
      11'h6FE: data = 8'b01000100;
2860
      11'h6FF: data = 8'b01000100;
2861
      11'h700: data = 8'b00111100; // B
2862
      11'h701: data = 8'b00000100;
2863
      11'h702: data = 8'b00000100;
2864
      11'h703: data = 8'b00000100;
2865
      11'h704: data = 8'b00000100;
2866
      11'h705: data = 8'b01000100;
2867
      11'h706: data = 8'b00111000;
2868 15 samiam9512
      11'h707: data = 8'b00000000;
2869
 
2870
      11'h708: data = 8'b00000000; // 'z'
2871
      11'h709: data = 8'b00000000;
2872
      11'h70A: data = 8'b00000000;
2873
      11'h70B: data = 8'b00000000;
2874
      11'h70C: data = 8'b00000000;
2875
      11'h70D: data = 8'b00000000;
2876 20 samiam9512
      11'h70E: data = 8'b01111100;
2877
      11'h70F: data = 8'b00000100;
2878
      11'h710: data = 8'b00001000;
2879
      11'h711: data = 8'b00010000;
2880
      11'h712: data = 8'b00100000;
2881
      11'h713: data = 8'b01000000;
2882
      11'h714: data = 8'b01111100; // B
2883
      11'h715: data = 8'b00000000;
2884
      11'h716: data = 8'b00000000;
2885 15 samiam9512
      11'h717: data = 8'b00000000;
2886
      11'h718: data = 8'b00000000;
2887
      11'h719: data = 8'b00000000;
2888
      11'h71A: data = 8'b00000000;
2889
      11'h71B: data = 8'b00000000;
2890
 
2891 20 samiam9512
      11'h71C: data = 8'b00001000; // '{'
2892
      11'h71D: data = 8'b00010000;
2893
      11'h71E: data = 8'b00010000;
2894
      11'h71F: data = 8'b00010000;
2895
      11'h720: data = 8'b00010000;
2896
      11'h721: data = 8'b00010000;
2897
      11'h722: data = 8'b00100000;
2898
      11'h723: data = 8'b00010000;
2899
      11'h724: data = 8'b00010000;
2900
      11'h725: data = 8'b00010000;
2901
      11'h726: data = 8'b00010000;
2902
      11'h727: data = 8'b00010000;
2903
      11'h728: data = 8'b00001000; // B
2904
      11'h729: data = 8'b00000000;
2905
      11'h72A: data = 8'b00000000;
2906 15 samiam9512
      11'h72B: data = 8'b00000000;
2907
      11'h72C: data = 8'b00000000;
2908
      11'h72D: data = 8'b00000000;
2909
      11'h72E: data = 8'b00000000;
2910
      11'h72F: data = 8'b00000000;
2911
 
2912 20 samiam9512
      11'h730: data = 8'b00010000; // '|'
2913 15 samiam9512
      11'h731: data = 8'b00010000;
2914
      11'h732: data = 8'b00010000;
2915
      11'h733: data = 8'b00010000;
2916
      11'h734: data = 8'b00010000;
2917
      11'h735: data = 8'b00010000;
2918
      11'h736: data = 8'b00010000;
2919
      11'h737: data = 8'b00010000;
2920
      11'h738: data = 8'b00010000;
2921
      11'h739: data = 8'b00010000;
2922
      11'h73A: data = 8'b00010000;
2923
      11'h73B: data = 8'b00010000;
2924 20 samiam9512
      11'h73C: data = 8'b00010000; // B
2925
      11'h73D: data = 8'b00000000;
2926
      11'h73E: data = 8'b00000000;
2927 15 samiam9512
      11'h73F: data = 8'b00000000;
2928
      11'h740: data = 8'b00000000;
2929
      11'h741: data = 8'b00000000;
2930
      11'h742: data = 8'b00000000;
2931
      11'h743: data = 8'b00000000;
2932
 
2933 20 samiam9512
      11'h744: data = 8'b00100000; // '}'
2934
      11'h745: data = 8'b00010000;
2935 15 samiam9512
      11'h746: data = 8'b00010000;
2936
      11'h747: data = 8'b00010000;
2937
      11'h748: data = 8'b00010000;
2938
      11'h749: data = 8'b00010000;
2939 20 samiam9512
      11'h74A: data = 8'b00001000;
2940 15 samiam9512
      11'h74B: data = 8'b00010000;
2941 20 samiam9512
      11'h74C: data = 8'b00010000;
2942 15 samiam9512
      11'h74D: data = 8'b00010000;
2943
      11'h74E: data = 8'b00010000;
2944
      11'h74F: data = 8'b00010000;
2945 20 samiam9512
      11'h750: data = 8'b00100000; // B
2946
      11'h751: data = 8'b00000000;
2947
      11'h752: data = 8'b00000000;
2948 15 samiam9512
      11'h753: data = 8'b00000000;
2949
      11'h754: data = 8'b00000000;
2950
      11'h755: data = 8'b00000000;
2951
      11'h756: data = 8'b00000000;
2952
      11'h757: data = 8'b00000000;
2953
 
2954 20 samiam9512
      11'h758: data = 8'b01100010; // '~'
2955
      11'h759: data = 8'b10010010;
2956
      11'h75A: data = 8'b10001100;
2957
      11'h75B: data = 8'b00000000;
2958 15 samiam9512
      11'h75C: data = 8'b00000000;
2959
      11'h75D: data = 8'b00000000;
2960
      11'h75E: data = 8'b00000000;
2961
      11'h75F: data = 8'b00000000;
2962
      11'h760: data = 8'b00000000;
2963
      11'h761: data = 8'b00000000;
2964
      11'h762: data = 8'b00000000;
2965
      11'h763: data = 8'b00000000;
2966 20 samiam9512
      11'h764: data = 8'b00000000; // B
2967 15 samiam9512
      11'h765: data = 8'b00000000;
2968
      11'h766: data = 8'b00000000;
2969
      11'h767: data = 8'b00000000;
2970
      11'h768: data = 8'b00000000;
2971
      11'h769: data = 8'b00000000;
2972
      11'h76A: data = 8'b00000000;
2973
      11'h76B: data = 8'b00000000;
2974
 
2975
      default data = 8'b00000000; // blank
2976
 
2977
   endcase
2978
 
2979
endmodule
2980 18 samiam9512
 
2981
////////////////////////////////////////////////////////////////////////////////
2982
//
2983
// KEYBOARD SCAN CODE CONVERTER
2984
//
2985
// Converts an 8 bit scan code to ASCII characters. Note that we don't represent
2986
// any control or other special characters in this table. Controls, shifts and
2987
// other keys are created at a higher level.
2988
//
2989
// There are two tables, the lower case or "normal" lookup table, and a shifted
2990
// table that gives either the upper case for the key, or an alternate 
2991
// character.
2992
//
2993
// To determine the proper arrangement of scan codes to ascii codes, a keyboard
2994
// scan code table was used, which can be found various places on the internet.
2995
//
2996
 
2997
module scnrom(addr, data);
2998
 
2999
   input  [7:0] addr;
3000
   output [7:0] data;
3001
 
3002
   reg [7:0]  data;
3003
 
3004
   always @(addr) case (addr)
3005
 
3006
      8'h00: data = 8'h00; // 
3007
      8'h01: data = 8'h00; // f9
3008
      8'h02: data = 8'h00; // 
3009
      8'h03: data = 8'h00; // f5
3010
      8'h04: data = 8'h00; // f3
3011
      8'h05: data = 8'h00; // f1
3012
      8'h06: data = 8'h00; // f2
3013
      8'h07: data = 8'h00; // f12
3014
      8'h08: data = 8'h00; // 
3015
      8'h09: data = 8'h00; // f10
3016
      8'h0A: data = 8'h00; // f8
3017
      8'h0B: data = 8'h00; // f6
3018
      8'h0C: data = 8'h00; // f4
3019
      8'h0D: data = 8'h09; // tab
3020
      8'h0E: data = 8'h60; // `
3021
      8'h0F: data = 8'h00; // 
3022
      8'h10: data = 8'h00; // 
3023
      8'h11: data = 8'h00; // lft alt
3024
      8'h12: data = 8'h00; // lft shift
3025
      8'h13: data = 8'h00; // 
3026
      8'h14: data = 8'h00; // left ctl
3027
      8'h15: data = 8'h71; // q
3028
      8'h16: data = 8'h31; // 1
3029
      8'h17: data = 8'h00; // 
3030
      8'h18: data = 8'h00; // 
3031
      8'h19: data = 8'h00; // 
3032
      8'h1A: data = 8'h7a; // z
3033
      8'h1B: data = 8'h73; // s
3034
      8'h1C: data = 8'h61; // a
3035
      8'h1D: data = 8'h77; // w
3036
      8'h1E: data = 8'h32; // 2
3037
      8'h1F: data = 8'h00; // 
3038
      8'h20: data = 8'h00; // 
3039
      8'h21: data = 8'h63; // c
3040
      8'h22: data = 8'h78; // x
3041
      8'h23: data = 8'h64; // d
3042
      8'h24: data = 8'h65; // e
3043
      8'h25: data = 8'h34; // 4
3044
      8'h26: data = 8'h33; // 3
3045
      8'h27: data = 8'h00; // 
3046
      8'h28: data = 8'h00; // 
3047
      8'h29: data = 8'h20; // sp
3048
      8'h2A: data = 8'h76; // v
3049
      8'h2B: data = 8'h66; // f
3050
      8'h2C: data = 8'h74; // t
3051
      8'h2D: data = 8'h72; // r
3052
      8'h2E: data = 8'h35; // 5
3053
      8'h2F: data = 8'h00; // 
3054
      8'h30: data = 8'h00; // 
3055
      8'h31: data = 8'h6e; // n
3056
      8'h32: data = 8'h62; // b
3057
      8'h33: data = 8'h68; // h
3058
      8'h34: data = 8'h67; // g
3059
      8'h35: data = 8'h79; // y
3060
      8'h36: data = 8'h36; // 6
3061
      8'h37: data = 8'h00; // 
3062
      8'h38: data = 8'h00; // 
3063
      8'h39: data = 8'h00; // 
3064
      8'h3A: data = 8'h6d; // m
3065
      8'h3B: data = 8'h6a; // j
3066
      8'h3C: data = 8'h75; // u
3067
      8'h3D: data = 8'h37; // 7
3068
      8'h3E: data = 8'h38; // 8
3069
      8'h3F: data = 8'h00; // 
3070
      8'h40: data = 8'h00; // 
3071
      8'h41: data = 8'h2c; // ,
3072
      8'h42: data = 8'h6b; // k
3073
      8'h43: data = 8'h69; // i
3074
      8'h44: data = 8'h6f; // o
3075
      8'h45: data = 8'h30; // 0
3076
      8'h46: data = 8'h39; // 9
3077
      8'h47: data = 8'h00; // 
3078
      8'h48: data = 8'h00; // 
3079
      8'h49: data = 8'h2e; // .
3080
      8'h4A: data = 8'h2f; // /
3081
      8'h4B: data = 8'h6c; // l
3082
      8'h4C: data = 8'h3b; // ;
3083
      8'h4D: data = 8'h70; // p
3084
      8'h4E: data = 8'h2d; // -
3085
      8'h4F: data = 8'h00; // 
3086
      8'h50: data = 8'h00; // 
3087
      8'h51: data = 8'h00; // 
3088
      8'h52: data = 8'h27; // '
3089
      8'h53: data = 8'h00; // 
3090
      8'h54: data = 8'h5b; // [
3091
      8'h55: data = 8'h3d; // =
3092
      8'h56: data = 8'h00; // 
3093
      8'h57: data = 8'h00; // 
3094
      8'h58: data = 8'h00; // caps lock
3095
      8'h59: data = 8'h00; // rgt shift
3096
      8'h5A: data = 8'h0D; // ent
3097
      8'h5B: data = 8'h5d; // ]
3098
      8'h5C: data = 8'h00; // 
3099
      8'h5D: data = 8'h5c; // \
3100
      8'h5E: data = 8'h00; // 
3101
      8'h5F: data = 8'h00; // 
3102
      8'h60: data = 8'h00; // 
3103
      8'h61: data = 8'h00; // 
3104
      8'h62: data = 8'h00; // 
3105
      8'h63: data = 8'h00; // 
3106
      8'h64: data = 8'h00; // 
3107
      8'h65: data = 8'h00; // 
3108
      8'h66: data = 8'h08; // bcksp
3109
      8'h67: data = 8'h00; // 
3110
      8'h68: data = 8'h00; // 
3111
      8'h69: data = 8'h31; // 1
3112
      8'h6A: data = 8'h00; // 
3113
      8'h6B: data = 8'h34; // 4
3114
      8'h6C: data = 8'h37; // 7
3115
      8'h6D: data = 8'h00; // 
3116
      8'h6E: data = 8'h00; // 
3117
      8'h6F: data = 8'h00; // 
3118
      8'h70: data = 8'h30; // 0
3119
      8'h71: data = 8'h2e; // .
3120
      8'h72: data = 8'h32; // 2
3121
      8'h73: data = 8'h35; // 5
3122
      8'h74: data = 8'h36; // 6
3123
      8'h75: data = 8'h38; // 8
3124
      8'h76: data = 8'h1B; // esc
3125
      8'h77: data = 8'h00; // num lock
3126
      8'h78: data = 8'h00; // f11
3127
      8'h79: data = 8'h2b; // +
3128
      8'h7A: data = 8'h33; // 3
3129
      8'h7B: data = 8'h2d; // -
3130
      8'h7C: data = 8'h2a; // -
3131
      8'h7D: data = 8'h39; // 9
3132
      8'h7E: data = 8'h00; // scl lock
3133
      8'h7F: data = 8'h00; // 
3134
      8'h80: data = 8'h00; // 
3135
      8'h81: data = 8'h00; // 
3136
      8'h82: data = 8'h00; // 
3137
      8'h83: data = 8'h00; // f7
3138
      8'h84: data = 8'h00; // 
3139
      8'h85: data = 8'h00; // 
3140
      8'h86: data = 8'h00; // 
3141
      8'h87: data = 8'h00; // 
3142
      8'h88: data = 8'h00; // 
3143
      8'h89: data = 8'h00; // 
3144
      8'h8A: data = 8'h00; // 
3145
      8'h8B: data = 8'h00; // 
3146
      8'h8C: data = 8'h00; // 
3147
      8'h8D: data = 8'h00; // 
3148
      8'h8E: data = 8'h00; // 
3149
      8'h8F: data = 8'h00; // 
3150
 
3151
      default data = 8'b00000000; // blank
3152
 
3153
   endcase
3154
 
3155
endmodule
3156
 
3157
// upper case version
3158
 
3159
module scnromu(addr, data);
3160
 
3161
   input  [7:0] addr;
3162
   output [7:0] data;
3163
 
3164
   reg [7:0]  data;
3165
 
3166
   always @(addr) case (addr)
3167
 
3168
      8'h00: data = 8'h00; // 
3169
      8'h01: data = 8'h00; // f9
3170
      8'h02: data = 8'h00; // 
3171
      8'h03: data = 8'h00; // f5
3172
      8'h04: data = 8'h00; // f3
3173
      8'h05: data = 8'h00; // f1
3174
      8'h06: data = 8'h00; // f2
3175
      8'h07: data = 8'h00; // f12
3176
      8'h08: data = 8'h00; // 
3177
      8'h09: data = 8'h00; // f10
3178
      8'h0A: data = 8'h00; // f8
3179
      8'h0B: data = 8'h00; // f6
3180
      8'h0C: data = 8'h00; // f4
3181
      8'h0D: data = 8'h09; // tab
3182
      8'h0E: data = 8'h7e; // ~
3183
      8'h0F: data = 8'h00; // 
3184
      8'h10: data = 8'h00; // 
3185
      8'h11: data = 8'h00; // lft alt
3186
      8'h12: data = 8'h00; // lft shift
3187
      8'h13: data = 8'h00; // 
3188
      8'h14: data = 8'h00; // lft ctl
3189
      8'h15: data = 8'h51; // Q
3190
      8'h16: data = 8'h21; // !
3191
      8'h17: data = 8'h00; // 
3192
      8'h18: data = 8'h00; // 
3193
      8'h19: data = 8'h00; // 
3194
      8'h1A: data = 8'h5a; // Z
3195
      8'h1B: data = 8'h53; // S
3196
      8'h1C: data = 8'h41; // A
3197
      8'h1D: data = 8'h57; // W
3198
      8'h1E: data = 8'h40; // @
3199
      8'h1F: data = 8'h00; // 
3200
      8'h20: data = 8'h00; // 
3201
      8'h21: data = 8'h43; // C
3202
      8'h22: data = 8'h58; // X
3203
      8'h23: data = 8'h44; // D
3204
      8'h24: data = 8'h45; // E
3205
      8'h25: data = 8'h24; // $
3206
      8'h26: data = 8'h23; // #
3207
      8'h27: data = 8'h00; // 
3208
      8'h28: data = 8'h00; // 
3209
      8'h29: data = 8'h20; // sp
3210
      8'h2A: data = 8'h56; // V
3211
      8'h2B: data = 8'h46; // F
3212
      8'h2C: data = 8'h54; // T
3213
      8'h2D: data = 8'h52; // R
3214
      8'h2E: data = 8'h25; // %
3215
      8'h2F: data = 8'h00; // 
3216
      8'h30: data = 8'h00; // 
3217
      8'h31: data = 8'h4e; // N
3218
      8'h32: data = 8'h42; // B
3219
      8'h33: data = 8'h48; // H
3220
      8'h34: data = 8'h47; // G
3221
      8'h35: data = 8'h59; // Y
3222
      8'h36: data = 8'h5e; // ^
3223
      8'h37: data = 8'h00; // 
3224
      8'h38: data = 8'h00; // 
3225
      8'h39: data = 8'h00; // 
3226
      8'h3A: data = 8'h4d; // M
3227
      8'h3B: data = 8'h4a; // J
3228
      8'h3C: data = 8'h55; // U
3229
      8'h3D: data = 8'h26; // &
3230
      8'h3E: data = 8'h2a; // *
3231
      8'h3F: data = 8'h00; // 
3232
      8'h40: data = 8'h00; // 
3233
      8'h41: data = 8'h3c; // <
3234
      8'h42: data = 8'h4b; // K
3235
      8'h43: data = 8'h49; // I
3236
      8'h44: data = 8'h4f; // O
3237
      8'h45: data = 8'h29; // )
3238
      8'h46: data = 8'h28; // (
3239
      8'h47: data = 8'h00; // 
3240
      8'h48: data = 8'h00; // 
3241
      8'h49: data = 8'h3e; // >
3242
      8'h4A: data = 8'h3f; // ?
3243
      8'h4B: data = 8'h4c; // L
3244
      8'h4C: data = 8'h3a; // :
3245
      8'h4D: data = 8'h50; // P
3246
      8'h4E: data = 8'h5f; // _
3247
      8'h4F: data = 8'h00; // 
3248
      8'h50: data = 8'h00; // 
3249
      8'h51: data = 8'h00; // 
3250
      8'h52: data = 8'h22; // "
3251
      8'h53: data = 8'h00; // 
3252
      8'h54: data = 8'h7b; // {
3253
      8'h55: data = 8'h2b; // +
3254
      8'h56: data = 8'h00; // 
3255
      8'h57: data = 8'h00; // 
3256
      8'h58: data = 8'h00; // caps lock
3257
      8'h59: data = 8'h00; // rgt shift
3258
      8'h5A: data = 8'h0D; // ent
3259
      8'h5B: data = 8'h7d; // }
3260
      8'h5C: data = 8'h00; // 
3261
      8'h5D: data = 8'h7c; // |
3262
      8'h5E: data = 8'h00; // 
3263
      8'h5F: data = 8'h00; // 
3264
      8'h60: data = 8'h00; // 
3265
      8'h61: data = 8'h00; // 
3266
      8'h62: data = 8'h00; // 
3267
      8'h63: data = 8'h00; // 
3268
      8'h64: data = 8'h00; // 
3269
      8'h65: data = 8'h00; // 
3270
      8'h66: data = 8'h08; // bcksp
3271
      8'h67: data = 8'h00; // 
3272
      8'h68: data = 8'h00; // 
3273
      8'h69: data = 8'h31; // 1
3274
      8'h6A: data = 8'h00; // 
3275
      8'h6B: data = 8'h34; // 4
3276
      8'h6C: data = 8'h37; // 7
3277
      8'h6D: data = 8'h00; // 
3278
      8'h6E: data = 8'h00; // 
3279
      8'h6F: data = 8'h00; // 
3280
      8'h70: data = 8'h30; // 0
3281
      8'h71: data = 8'h2e; // .
3282
      8'h72: data = 8'h32; // 2
3283
      8'h73: data = 8'h35; // 5
3284
      8'h74: data = 8'h36; // 6
3285
      8'h75: data = 8'h38; // 8
3286
      8'h76: data = 8'h1B; // esc
3287
      8'h77: data = 8'h00; // num lock
3288
      8'h78: data = 8'h00; // f11
3289
      8'h79: data = 8'h2b; // +
3290
      8'h7A: data = 8'h33; // 3
3291
      8'h7B: data = 8'h2d; // -
3292
      8'h7C: data = 8'h2a; // *
3293
      8'h7D: data = 8'h39; // 9
3294
      8'h7E: data = 8'h00; // scl lock
3295
      8'h7F: data = 8'h00; // 
3296
      8'h80: data = 8'h00; // 
3297
      8'h81: data = 8'h00; // 
3298
      8'h82: data = 8'h00; // 
3299
      8'h83: data = 8'h00; // f7
3300
      8'h84: data = 8'h00; // 
3301
      8'h85: data = 8'h00; // 
3302
      8'h86: data = 8'h00; // 
3303
      8'h87: data = 8'h00; // 
3304
      8'h88: data = 8'h00; // 
3305
      8'h89: data = 8'h00; // 
3306
      8'h8A: data = 8'h00; // 
3307
      8'h8B: data = 8'h00; // 
3308
      8'h8C: data = 8'h00; // 
3309
      8'h8D: data = 8'h00; // 
3310
      8'h8E: data = 8'h00; // 
3311
      8'h8F: data = 8'h00; // 
3312
 
3313
      default data = 8'b00000000; // blank
3314
 
3315
   endcase
3316
 
3317
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.