Subversion Repositories pentevo

Rev

Rev 411 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
255 ddp 1
module main(
2
 
380 ddp 3
 // clocks
4
 input fclk,
5
 output clkz_out,
6
 input clkz_in,
255 ddp 7
 
380 ddp 8
 // z80
9
 input iorq_n,
10
 input mreq_n,
11
 input rd_n,
12
 input wr_n,
13
 input m1_n,
14
 input rfsh_n,
15
 input int_n,
16
 input nmi_n,
17
 input wait_n,
18
 output res,
255 ddp 19
 
380 ddp 20
 inout [7:0] d,
21
 output [15:0] a,
255 ddp 22
 
380 ddp 23
 // zxbus and related
24
 output csrom,
25
 output romoe_n,
26
 output romwe_n,
255 ddp 27
 
380 ddp 28
 output rompg0_n,
29
 output dos_n, // aka rompg1
30
 output rompg2,
31
 output rompg3,
32
 output rompg4,
255 ddp 33
 
380 ddp 34
 input iorqge1,
35
 input iorqge2,
36
 output iorq1_n,
37
 output iorq2_n,
255 ddp 38
 
380 ddp 39
 // DRAM
40
 inout [15:0] rd,
41
 output [9:0] ra,
42
 output rwe_n,
43
 output rucas_n,
44
 output rlcas_n,
45
 output rras0_n,
46
 output rras1_n,
255 ddp 47
 
380 ddp 48
 // video
49
 output [1:0] vred,
50
 output [1:0] vgrn,
51
 output [1:0] vblu,
255 ddp 52
 
380 ddp 53
 output vhsync,
54
 output vvsync,
55
 output vcsync,
255 ddp 56
 
380 ddp 57
 // AY control and audio/tape
58
 input ay_clk,
59
 output ay_bdir,
60
 output ay_bc1,
255 ddp 61
 
380 ddp 62
 output reg beep,
255 ddp 63
 
380 ddp 64
 // IDE
65
 input [2:0] ide_a,
66
 input [15:0] ide_d,
255 ddp 67
 
380 ddp 68
 output ide_dir,
255 ddp 69
 
380 ddp 70
 input ide_rdy,
255 ddp 71
 
380 ddp 72
 output ide_cs0_n,
73
 output ide_cs1_n,
74
 output ide_rs_n,
75
 output ide_rd_n,
76
 output ide_wr_n,
255 ddp 77
 
380 ddp 78
 // VG93 and diskdrive
79
 output reg vg_clk,
255 ddp 80
 
380 ddp 81
 output vg_cs_n,
82
 output vg_res_n,
255 ddp 83
 
380 ddp 84
 input vg_hrdy,
85
 input vg_rclk,
86
 input vg_rawr,
87
 input [1:0] vg_a, // disk drive selection
88
 input vg_wrd,
89
 input vg_side,
255 ddp 90
 
380 ddp 91
 input step,
92
 input vg_sl,
93
 input vg_sr,
94
 input vg_tr43,
95
 input rdat_b_n,
96
 input vg_wf_de,
97
 input vg_drq,
98
 input vg_irq,
99
 input vg_wd,
255 ddp 100
 
380 ddp 101
 // serial links (atmega-fpga, sdcard)
102
 output sdcs_n,
103
 output sddo,
104
 output sdclk,
105
 input sddi,
255 ddp 106
 
380 ddp 107
 input spics_n,
108
 input spick,
109
 input spido,
110
 output spidi,
111
 output reg spiint_n
112
 
255 ddp 113
);
114
 
115
//--Dummy----------------------------------------------------------------------
116
 
380 ddp 117
 assign iorq1_n   = 1'b1;
118
 assign iorq2_n   = 1'b1;
255 ddp 119
 
380 ddp 120
 assign res       = 1'b1;
255 ddp 121
 
380 ddp 122
 assign ay_bdir   = 1'b0;
123
 assign ay_bc1    = 1'b0;
255 ddp 124
 
380 ddp 125
 assign vg_cs_n   = 1'b1;
126
 assign vg_res_n  = 1'b0;
255 ddp 127
 
380 ddp 128
 assign ide_dir   = 1'b1;
129
 assign ide_rs_n  = 1'b0;
130
 assign ide_cs0_n = 1'b1;
131
 assign ide_cs1_n = 1'b1;
132
 assign ide_rd_n  = 1'b1;
133
 assign ide_wr_n  = 1'b1;
255 ddp 134
 
380 ddp 135
 assign a[15:14]  = 2'b00;
255 ddp 136
 
137
//--INT---------------------------------------------------------------------------
138
 
139
 reg enable_covox_int;  initial enable_covox_int = 1'b0;
140
 reg enable_frame_int;  initial enable_frame_int = 1'b0;
141
 
142
 always @(posedge fclk)
143
  begin
144
   if ( enable_covox_int )
380 ddp 145
    spiint_n <= cvx_ptr_diff[3]|main_osc[7];
255 ddp 146
   else if ( enable_frame_int )
380 ddp 147
    spiint_n <= vtxtscr;
255 ddp 148
   else
149
    spiint_n <= 1'b1;
150
  end
151
 
152
//--clocks--Z80_clk--VG_clk--COVOX---------------------------------------------
153
 
154
 reg [9:0] main_osc;
155
 reg [2:0] vgclk_div7;
380 ddp 156
 reg [7:0] covox [15:0];        initial covox[0] = 8'h7f;
157
 reg [8:0] qe;                  initial qe = 9'h0ff;
158
 reg [3:0] cvx_ptr_out;         initial cvx_ptr_out = 4'd0;
159
 reg [3:0] cvx_ptr_in;          initial cvx_ptr_in  = 4'd0;
160
 wire [3:0] cvx_ptr_iinc;
161
 wire [3:0] cvx_ptr_diff;
162
 assign cvx_ptr_iinc = cvx_ptr_in + 4'd1;
163
 assign cvx_ptr_diff = cvx_ptr_in - cvx_ptr_out;
255 ddp 164
 
165
 always @(posedge fclk)
166
  begin
167
   //
380 ddp 168
   if ( { 1'b1, covox[cvx_ptr_out] } >= qe )
169
    begin
170
     beep <= 1'b1;
171
     qe <= 9'h1ff - { 1'b1, covox[cvx_ptr_out] } + qe;
172
    end
255 ddp 173
   else
380 ddp 174
    begin
175
     beep <= 1'b0;
176
     qe <= 9'h000 - { 1'b1, covox[cvx_ptr_out] } + qe;
177
    end
255 ddp 178
   //
380 ddp 179
   if ( main_osc[7:0] == 8'hff )
180
    begin
181
     if ( cvx_ptr_in !== cvx_ptr_out )
182
      cvx_ptr_out <= cvx_ptr_out + 4'd1;
183
    end
255 ddp 184
   //
185
   if ( main_osc[1:0]==2'b00 )
186
   begin
187
    if ( vgclk_div7[2:1] == 2'b11 )
188
     begin
189
      vgclk_div7 <= 3'd0;
190
      vg_clk <= ~vg_clk;
191
     end
192
    else
193
     vgclk_div7 <= vgclk_div7 + 3'd1;
194
   end
195
   //
380 ddp 196
   main_osc <= main_osc + 10'd1;
197
   //
255 ddp 198
  end
199
 
200
 assign clkz_out = main_osc[2]; // 3.5 MHz
201
 
202
//--Video----------------------------------------------------------------------
203
// character image - 6x8
204
// character size  - 6x10
205
// col x row       - 53x25 (318x250)
380 ddp 206
// fullscreen test - 360x288
255 ddp 207
 
380 ddp 208
 localparam HTXTS_END   = 9'd416;
209
 localparam CSYNC_CUT   = 9'd415;
498 ddp 210
 localparam CSYNC_CUT2  = 9'd394; // 9'd395;            // 9'd382;
380 ddp 211
 localparam HSYNC_BEG   = 9'd0;
498 ddp 212
 localparam HSYNC_BEG2  = 9'd447;
380 ddp 213
 localparam HSYNC_END   = 9'd33;
498 ddp 214
 localparam HSYNC_END2  = 9'd52; // 9'd53;
380 ddp 215
 localparam HTXTS_BEG   = 9'd98;
216
 localparam HMAX        = 9'd447;
255 ddp 217
 
380 ddp 218
 localparam VTXTS_END   = 9'd293;
219
 localparam VSYNC_BEG   = 9'd0;
220
 localparam VSYNC_END   = 9'd2;
221
 localparam VTXTS_BEG   = 9'd43;
222
 localparam VMAX        = 9'd319;
255 ddp 223
 
380 ddp 224
 localparam HBORD_BEG   = 9'd77;
225
 localparam HBORD_END   = 9'd437;
226
 localparam VBORD_BEG   = 9'd24;
227
 localparam VBORD_END   = 9'd312;
255 ddp 228
 
380 ddp 229
 //                          GgRrBb
230
 localparam BLACK       = 6'b000000;
231
 localparam GRAY_1      = 6'b010101;
232
 localparam GRAY_2      = 6'b101010;
233
 localparam WHITE       = 6'b111111;
234
 
235
 localparam BLUE_3      = 6'b000011;
236
 localparam RED_3       = 6'b001100;
237
 localparam MAGENTA_3   = 6'b001111;
238
 localparam GREEN_3     = 6'b110000;
239
 localparam CYAN_3      = 6'b110011;
240
 localparam YELLOW_3    = 6'b111100;
241
 
242
 localparam BLUE_2      = 6'b000010;
243
 localparam RED_2       = 6'b001000;
244
 localparam MAGENTA_2   = 6'b001010;
245
 localparam GREEN_2     = 6'b100000;
246
 localparam CYAN_2      = 6'b100010;
247
 localparam YELLOW_2    = 6'b101000;
248
 
249
 localparam BLUE_H      = 6'b010110;
250
 localparam RED_H       = 6'b011001;
251
 localparam MAGENTA_H   = 6'b011010;
252
 localparam GREEN_H     = 6'b100101;
253
 localparam CYAN_H      = 6'b100110;
254
 localparam YELLOW_H    = 6'b101001;
255
 
255 ddp 256
 reg [8:0] hcount;      initial hcount = 9'd0;
257
 reg [2:0] pixptr;
258
 reg [8:0] vcount;      initial vcount = 9'd0;
259
 reg [5:0] hcharcount;
260
 wire [2:0] vcharline;
261
 reg [10:0] voffset;
262
 reg [3:0] vcharlinecount;
263
 reg hsync;             initial hsync = 1'b1;
380 ddp 264
 reg htxtscr;           initial htxtscr = 1'b0;
255 ddp 265
 reg vsync;             initial vsync = 1'b1;
380 ddp 266
 reg vtxtscr;           initial vtxtscr = 1'b0;
255 ddp 267
 reg csync;             initial csync = 1'b1;
268
 wire [10:0] video_addr;
269
 wire [7:0] charcode0, charcode1, charcode2;
270
 wire [7:0] charcode;
271
 wire [7:0] attrcode0, attrcode1, attrcode2;
272
 wire [7:0] attrcode;
273
 wire [5:0] charpix;
274
 wire pixel;
380 ddp 275
 wire [5:0] fcolor, bcolor, image_color;
276
 reg [5:0] color;
255 ddp 277
 wire fontenable;
278
 reg [8:0] hmouse, vmouse;
279
 wire mouse_here, mouse_i, mouse_image, mouse_m, mouse_mask;
280
 reg vgaff, nextline;
380 ddp 281
 reg hbord;             initial hbord = 1'b0;
282
 reg vbord;             initial vbord = 1'b0;
283
 reg circle;            initial circle = 1'b0;
284
 reg uhole;             initial uhole = 1'b0;
285
 reg hhole;             initial hhole = 1'b0;
286
 reg vhole;             initial vhole = 1'b0;
287
 reg [1:0] bcdir;       initial bcdir = 2'b00;
288
 reg [1:0] scdir;       initial scdir = 2'b00;
289
 reg [3:0] hsetka, vsetka;
290
 reg [4:0] hchess, vchess;
291
 reg [1:0] hchss3;
292
 reg [2:0] cband;
293
 reg [6:0] bccount;
294
 reg [4:0] sccount;
295
 reg [6:0] schcnt;
296
 wire [6:0] cb_val;
297
 wire [4:0] cs_val;
298
 reg [2:0] clr3;
255 ddp 299
 
380 ddp 300
 
255 ddp 301
 always @(posedge fclk)
302
  begin
303
   //
304
   if ( {(main_osc[1]&scr_tv_mode),main_osc[0]}==2'h0 )
305
    begin
306
 
380 ddp 307
     if ( scr_mode==2'h0 )
308
      color <= (htxtscr & vtxtscr) ? ( (mouse_image) ? ~image_color : image_color ) : BLACK;
309
     else if ( hbord & vbord )
310
      case ( scr_mode )
311
       3'h2:
312
             color <= (hchess[0]^vchess[0]) ? WHITE : BLACK;
313
       3'h3:
314
             case (vchess)
315
              5'd0, 5'd19:
316
                if (vsetka==5'd14)
317
                 color <= GRAY_2;
318
                else if (hchess[0])
319
                 color <= WHITE;
320
                else
321
                 color <= BLACK;
322
              5'd5, 5'd6:
323
                case (cband)
324
                 3'd0: color <= GRAY_2;
325
                 3'd1: color <= YELLOW_H;
326
                 3'd2: color <= CYAN_H;
327
                 3'd3: color <= GREEN_H;
328
                 3'd4: color <= MAGENTA_H;
329
                 3'd5: color <= RED_H;
330
                 3'd6: color <= BLUE_H;
331
                 3'd7: color <= GRAY_1;
332
                endcase
333
              5'd13, 5'd14:
334
                case (cband)
335
                 3'd0: color <= GRAY_2;
336
                 3'd1: color <= YELLOW_2;
337
                 3'd2: color <= CYAN_2;
338
                 3'd3: color <= GREEN_2;
339
                 3'd4: color <= MAGENTA_2;
340
                 3'd5: color <= RED_2;
341
                 3'd6: color <= BLUE_2;
342
                 3'd7: color <= BLACK;
343
                endcase
344
              default
345
               begin
346
                if (uhole)
347
                 begin
348
                  if (pixel)
349
                   color <= GRAY_2;
350
                  else
351
                   color <= GRAY_1;
352
                 end
353
                else if ( (circle) && !(hhole&vhole) )
354
                 case (vchess)
355
                  5'd2, 5'd17:
356
                    if ( (hchess==5'd2) || (hchess==5'd3) || (hchess==5'd20) || (hchess==5'd21) )
357
                     begin
358
                      if (hcount[0])
359
                       color <= GRAY_2;
360
                      else
361
                       color <= GRAY_1;
362
                     end
363
                    else
364
                     color <= GRAY_2;
365
                  5'd3:
366
                    if ( (hchess==5'd2)  || ((hchess==5'd3)  && (hsetka!=5'd14))
367
                      || (hchess==5'd20) || ((hchess==5'd21) && (hsetka!=5'd14)) )
368
                     begin
369
                      if (hcount[0]^vcount[0])
370
                       color <= GRAY_1;
371
                      else
372
                       color <= GRAY_2;
373
                     end
374
                    else
375
                     color <= GRAY_2;
376
                  5'd7:
377
                    case (cband)
378
                     //3'd0: color <= WHITE;
379
                     3'd1: color <= WHITE;
380
                     3'd2: color <= BLACK;
381
                     3'd3: color <= GRAY_1;
382
                     3'd4: color <= GRAY_2;
383
                     3'd5: color <= WHITE;
384
                     3'd6: color <= BLACK;
385
                     //3'd7: color <= BLACK;
386
                    endcase
387
                  5'd8:
388
                    if (hcount[3])
389
                     color <= MAGENTA_H;
390
                    else
391
                     color <= GREEN_H;
392
                  5'd9, 5'd10:
393
                    if ( (hcount[8]) ^ (vchess[0]) ^ ( (hchess==5'd4) && (hsetka==4'd14) ) )
394
                     color <= GRAY_2;
395
                    else
396
                     color <= BLACK;
397
                  5'd11:
398
                    if (hcount[3])
399
                     color <= RED_H;
400
                    else
401
                     color <= CYAN_H;
402
                  5'd12:
403
                    if (hcount[0])
498 ddp 404
                     color <= GRAY_2;
405
                    else
380 ddp 406
                     color <= GRAY_1;
407
                  5'd15:
408
                    if ( (hchess[0]) && (schcnt==6'd63) )
409
                     color <= BLACK;
410
                    else
411
                     color <= GRAY_2;
412
                  5'd16:
413
                    if ( (hchess==5'd2)  || ((hchess==5'd3) &&(hsetka!=4'd14))
414
                      || (hchess==5'd20) || ((hchess==5'd21)&&(hsetka!=4'd14)) )
415
                     begin
416
                      if (hcount[0]^vcount[0])
417
                       color <= GRAY_2;
418
                      else
419
                       color <= GRAY_1;
420
                     end
421
                    else
422
                     color <= GRAY_2;
423
                  default:
424
                   color <= GRAY_2;
425
                 endcase
426
                else
427
                 color <= ( (hsetka==4'd14) || (vsetka==4'd14) ) ? GRAY_2 : GRAY_1;
428
               end
429
             endcase
430
       3'h4: case (cband)
431
              3'd0: color <= GRAY_2;
432
              3'd1: color <= YELLOW_2;
433
              3'd2: color <= CYAN_2;
434
              3'd3: color <= GREEN_2;
435
              3'd4: color <= MAGENTA_2;
436
              3'd5: color <= RED_2;
437
              3'd6: color <= BLUE_2;
438
              3'd7: color <= BLACK;
439
             endcase
440
       3'h5: if (vchess[4]==1'b0)
441
              begin
442
               if (vchess!=5'd15)
443
                case (cband)
444
                 3'd0: color <= GRAY_2;
445
                 3'd1: color <= YELLOW_2;
446
                 3'd2: color <= CYAN_2;
447
                 3'd3: color <= GREEN_2;
448
                 3'd4: color <= MAGENTA_2;
449
                 3'd5: color <= RED_2;
450
                 3'd6: color <= BLUE_2;
451
                 3'd7: color <= BLACK;
452
                endcase
453
               else
454
                case (cband)
455
                 3'd0: color <= BLUE_2;
456
                 3'd1: color <= BLACK;
457
                 3'd2: color <= MAGENTA_2;
458
                 3'd3: color <= BLACK;
459
                 3'd4: color <= CYAN_2;
460
                 3'd5: color <= BLACK;
461
                 3'd6: color <= GRAY_2;
462
                 3'd7: color <= BLACK;
463
                endcase
464
              end
465
             else
466
              case (cband)
467
               3'd0: color <= WHITE;
468
               3'd1: color <= YELLOW_2;
469
               3'd2: color <= CYAN_2;
470
               3'd3: color <= GREEN_2;
471
               3'd4: color <= MAGENTA_2;
472
               3'd5: color <= RED_2;
473
               3'd6: color <= BLUE_2;
474
               3'd7: color <= BLACK;
475
              endcase
476
       3'h6: begin
477
              if ( (vcount[2:0]==3'd4) || (hcount[2:0]==3'd1) )
478
               begin
479
                color[0] <= clr3[0];
480
                color[1] <= clr3[0];
481
                color[2] <= clr3[1];
482
                color[3] <= clr3[1];
483
                color[4] <= clr3[2];
484
                color[5] <= clr3[2];
485
               end
486
              else
487
               color <= BLACK;
488
             end
489
       default: color <= (hcount[0]^vcount[0]) ? WHITE : BLACK;
490
      endcase
491
     else
492
      color <= BLACK;
493
 
494
     hmouse <= hcount - scr_mouse_x;
495
 
496
     if ( ~htxtscr )
255 ddp 497
      begin
498
       hcharcount <= 6'h00;
499
       pixptr <= 3'd0;
500
      end
501
     else
502
      begin
503
       if ( pixptr==3'd5 )
504
        begin
505
         pixptr <= 3'd0;
506
         hcharcount <= hcharcount + 6'h01;
507
        end
508
       else
509
        pixptr <= pixptr + 3'd1;
510
      end
511
 
512
     if ( hcount==HMAX )
513
      hcount <= 9'd0;
514
     else
515
      hcount <= hcount + 9'd1;
516
 
380 ddp 517
     if ( hcount==HTXTS_END )
518
      htxtscr <= 1'b0;
519
     else if ( hcount==HTXTS_BEG )
520
      htxtscr <= 1'b1;
255 ddp 521
 
522
     if ( hcount==HSYNC_BEG )
523
      begin
498 ddp 524
       if ( scr_tv_mode ) hsync <= 1'b1;
255 ddp 525
       vgaff <= scr_tv_mode | ~vgaff;
526
       if ( vgaff )
527
        begin
498 ddp 528
         if ( scr_tv_mode ) csync <= 1'b1;
255 ddp 529
         nextline <= 1'b1;
530
        end
531
      end
532
 
498 ddp 533
     if ( (~scr_tv_mode) && (hcount==HSYNC_BEG2) )
534
      begin
535
       hsync <= 1'b1;
536
       if ( vgaff ) csync <= 1'b1;
537
      end
538
 
255 ddp 539
     if ( (~scr_tv_mode) && (hcount==HSYNC_END2) )
540
      begin
541
       hsync <= 1'b0;
542
       if ( !vsync )
543
        csync <= 1'b0;
544
      end
545
 
546
     if ( scr_tv_mode && (hcount==HSYNC_END) )
547
      begin
548
       hsync <= 1'b0;
549
       if ( !vsync )
550
        csync <= 1'b0;
551
      end
552
 
380 ddp 553
     if (scr_tv_mode)
554
      begin
555
       if (hcount==CSYNC_CUT)
556
        csync <= 1'b0;
557
      end
558
     else if ( (vgaff) && (hcount==CSYNC_CUT2) )
255 ddp 559
      csync <= 1'b0;
560
 
380 ddp 561
     if ( ((hchess==5'd0) || (hchess==5'd18)) && (hsetka==4'd13) )
562
      schcnt <= 6'd0;
563
     else if (schcnt!=6'd63)
564
      schcnt <= schcnt+6'd1;
255 ddp 565
 
380 ddp 566
     if ( hcount==HBORD_BEG )
567
      begin
568
       hbord <= 1'b1;
569
       hsetka <= 4'd0;
570
       hchess <= 5'd0;
571
       hchss3 <= 2'd0;
572
       cband <= 3'd0;
573
      end
574
     else
575
      begin
576
       if ( hsetka==4'd14 )
577
        begin
578
         hsetka <= 4'd0;
579
         hchess <= hchess+5'd1;
580
         if ( hchss3==2'd2 )
581
          begin
582
           hchss3 <= 2'd0;
583
           cband <= cband+3'd1;
584
          end
585
         else
586
          hchss3 <= hchss3+2'd1;
587
        end
588
       else
589
        hsetka <= hsetka+4'd1;
590
       if ( hcount==HBORD_END ) hbord <= 1'b0;
591
      end
255 ddp 592
 
380 ddp 593
     if ( !((vcount[2:0]==3'd0)&&vgaff) && (hcount==9'd0) )
594
      clr3 <= { clr3[1:0], clr3[2] };
595
     else if (hcount[2:0]==3'd5)
596
      clr3 <= { clr3[1:0], clr3[2] };
255 ddp 597
 
598
    end
599
   //
600
   if ( nextline )
601
    begin
602
 
603
     nextline <= 1'b0;
604
 
380 ddp 605
     if ( ~vtxtscr )
255 ddp 606
      begin
607
       voffset <= 11'd0;
608
       vcharlinecount <= 4'd15;
609
      end
610
     else
611
      begin
612
       if ( vcharlinecount==4'd8 )
613
        begin
614
         voffset <= voffset + 11'd53;
615
         vcharlinecount <= 4'd15;
616
        end
617
       else
618
        vcharlinecount <= vcharlinecount + 4'd1;
619
      end
620
 
621
     if ( vcount==VMAX )
622
      begin
623
       vcount <= 9'd0;
380 ddp 624
       clr3 <= 3'b001;
255 ddp 625
      end
626
     else
627
      vcount <= vcount + 9'd1;
628
 
380 ddp 629
     if ( vcount==VTXTS_END )
630
      vtxtscr <= 1'b0;
631
     else if ( vcount==VTXTS_BEG )
632
      vtxtscr <= 1'b1;
255 ddp 633
 
634
     if ( vcount==VSYNC_BEG )
635
      vsync <= 1'b1;
636
     else if ( vcount==VSYNC_END )
637
      vsync <= 1'b0;
638
 
380 ddp 639
     if ( vcount==VBORD_BEG )
640
      begin
641
       vbord <= 1'b1;
642
       vsetka <= 4'd5;
643
       vchess <= 5'd0;
644
       circle <= 1'b0;
645
       bccount <= 7'd0;
646
       sccount <= 5'd0;
647
       bcdir <= 2'b00;
648
       scdir <= 2'b00;
649
      end
650
     else
651
      begin
255 ddp 652
 
380 ddp 653
       if (bcdir[0])
654
        bccount <= bccount+7'd1;
655
       else if (bcdir[1])
656
        bccount <= bccount-7'd1;
657
 
658
       if (scdir[0])
659
        sccount <= sccount+5'd1;
660
       else if (scdir[1])
661
        sccount <= sccount-5'd1;
662
 
663
       if ( vsetka==4'd14 )
664
        begin
665
         vsetka <= 4'd0;
666
         vchess <= vchess+5'd1;
667
        end
668
       else
669
        begin
670
         vsetka <= vsetka+4'd1;
671
         if ( vsetka==4'd13 )
672
          begin
673
           if (vchess==5'd1)
674
            bcdir <= 2'b01;
675
           else if (vchess==5'd9)
676
            bcdir <= 2'b10;
677
           else if (vchess==5'd17)
678
            bcdir <= 2'b00;
679
           if ( (vchess==5'd0) || (vchess==5'd14) )
680
            scdir <= 2'b01;
681
           else if ( (vchess==5'd2) || (vchess==5'd16) )
682
            scdir <= 2'b10;
683
           else if ( (vchess==5'd4) || (vchess==5'd18) )
684
            scdir <= 2'b00;
685
          end
686
        end
687
 
688
       if ( vcount==VBORD_END ) vbord <= 1'b0;
689
 
690
      end
691
 
255 ddp 692
     vmouse <= vcount - scr_mouse_y;
693
 
694
    end
695
   //
380 ddp 696
   if ( (hchess==5'd2) || (hchess==5'd10) || (hchess==5'd20) )
697
    hhole <= 1'b1;
698
   else if ( (hchess==5'd4) || (hchess==5'd14) || (hchess==5'd22) )
699
    hhole <= 1'b0;
700
   //
701
   if ( (vchess==5'd4) && (schcnt==6'd63) )
702
    begin
703
     if (hchess==5'd7)
704
      uhole <= 1'b1;
705
     else if (hchess==5'd17)
706
      uhole <= 1'b0;
707
    end
708
   //
709
   if (hcount==(9'd258+cb_val))
710
    circle <= 1'b0;
711
   else if ( (schcnt==(5'd31+cs_val)) && (sccount!=5'd0) )
712
    circle <= 1'b0;
713
   else if (hcount==(9'd257-cb_val))
714
    circle <= 1'b1;
715
   else if ( (schcnt==(5'd30-cs_val)) && (sccount!=5'd0) )
716
    circle <= 1'b1;
717
   //
718
   if ( (((vchess==5'd2) || (vchess==5'd16)) && (vsetka==4'd7)) || (vchess==5'd9) )
719
    vhole <= 1'b1;
720
   else if ( (((vchess==5'd3) || (vchess==5'd17)) && (vsetka==4'd7)) || (vchess==5'd11) )
721
    vhole <= 1'b0;
722
   //
255 ddp 723
  end
724
 
380 ddp 725
 circl_b ccb ( .in_addr(bccount), .out_word(cb_val) );
726
 circl_s ccs ( .in_addr(sccount), .out_word(cs_val) );
727
 
255 ddp 728
 lpm_rom_7x2 mouse_cursor ( .address({ vmouse[3:0], hmouse[2:0] }), .q({ mouse_i, mouse_m }) );
729
 assign mouse_here = (hmouse[8:3] == 6'd0) && (vmouse[8:4] == 5'd0);
730
 assign mouse_mask = mouse_here & mouse_m;
731
 assign mouse_image = mouse_here & mouse_i;
732
 
733
 assign video_addr = voffset + { 4'h0, hcharcount[5:0] };
734
 lpm_ram_dp_9x8 scrmem0  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h0)),
735
                           .rdaddress(video_addr[8:0]), .q(charcode0) );
736
 lpm_ram_dp_9x8 scrmem1  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h1)),
737
                           .rdaddress(video_addr[8:0]), .q(charcode1) );
738
 lpm_ram_dp_9x8 scrmem2  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h2)),
739
                           .rdaddress(video_addr[8:0]), .q(charcode2) );
740
 assign charcode = (video_addr[10:9]==2'h0) ? charcode0 :
741
                   (video_addr[10:9]==2'h1) ? charcode1 : charcode2 ;
742
 lpm_ram_dp_9x8 attrmem0 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h0)),
743
                           .rdaddress(video_addr[8:0]), .q(attrcode0) );
744
 lpm_ram_dp_9x8 attrmem1 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h1)),
745
                           .rdaddress(video_addr[8:0]), .q(attrcode1) );
746
 lpm_ram_dp_9x8 attrmem2 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h2)),
747
                           .rdaddress(video_addr[8:0]), .q(attrcode2) );
748
 assign attrcode = (video_addr[10:9]==2'h0) ? attrcode0 :
749
                   (video_addr[10:9]==2'h1) ? attrcode1 : attrcode2 ;
750
 assign vcharline = (vcharlinecount[3]) ? ~vcharlinecount[2:0] : vcharlinecount[2:0];
751
 lpm_rom_11x6 chargen ( .address({ charcode, vcharline }), .q(charpix) );
752
 
753
 assign fcolor = { attrcode[2], (attrcode[2]&attrcode[3]),
754
                   attrcode[1], (attrcode[1]&attrcode[3]),
755
                   attrcode[0], (attrcode[0]&attrcode[3]) };
756
 assign bcolor = { (attrcode[6]&attrcode[7]), (attrcode[6]&(~attrcode[7])),
757
                   (attrcode[5]&attrcode[7]), (attrcode[5]&(~attrcode[7])),
758
                   (attrcode[4]&attrcode[7]), (attrcode[4]&(~attrcode[7])) };
759
 assign fontenable = (charcode[7:4]==4'hb)||
760
                     (charcode[7:4]==4'hc)||
761
                     (charcode[7:4]==4'hd)||
762
                     (~vcharlinecount[3]);
763
 assign pixel = ( charcode==8'hb0 ) ? ( (vcount[0]^hcount[1])&~hcount[0] ) :
764
                ( charcode==8'hb1 ) ? (  vcount[0]^hcount[0]             ) :
765
                ( charcode==8'hb2 ) ? ( (vcount[0]^hcount[1])| hcount[0] ) :
766
                ( fontenable ) ? charpix[3'd5-pixptr] : 1'b0;
767
 
380 ddp 768
 assign image_color = (mouse_mask) ? BLACK : ( pixel ? fcolor : bcolor ) ;
255 ddp 769
 
380 ddp 770
 assign { vgrn[1:0], vred[1:0], vblu[1:0] } = color;
255 ddp 771
 assign vhsync = hsync;
772
 assign vvsync = vsync;
773
 assign vcsync = ~csync;
774
 
775
//--AVRSPI--FlashROM-----------------------------------------------------------
776
 
777
 localparam TEMP_REG      = 8'ha0;
778
 
779
 localparam SD_CS0        = 8'ha1;
780
 localparam SD_CS1        = 8'ha2;
781
 localparam FLASH_LOADDR  = 8'ha3;
782
 localparam FLASH_MIDADDR = 8'ha4;
783
 localparam FLASH_HIADDR  = 8'ha5;
784
 localparam FLASH_DATA    = 8'ha6;
785
 localparam FLASH_CTRL    = 8'ha7;
786
 localparam SCR_LOADDR    = 8'ha8;
277 ddp 787
 localparam SCR_HIADDR    = 8'ha9;
255 ddp 788
 localparam SCR_SET_ATTR  = 8'haa; //   ATTR
789
 localparam SCR_FILL      = 8'hab; //      ATTR   
790
                                   // (   spics_n,       )
791
 localparam SCR_CHAR      = 8'hac; //         ATTR   
792
                                   // (   spics_n,       )
793
 localparam SCR_MOUSE_X   = 8'had;
794
 localparam SCR_MOUSE_Y   = 8'hae;
380 ddp 795
 localparam SCR_MODE      = 8'haf; // [7] - 0=VGAmode, 1=TVmode; [2:0] - 0=TXT,  ScrTESTs
255 ddp 796
 
380 ddp 797
 localparam MTST_CONTROL  = 8'h50; // [0] -   (0=, 1=)
255 ddp 798
 localparam MTST_PASS_CNT0= 8'h51;
799
 localparam MTST_PASS_CNT1= TEMP_REG;
800
 localparam MTST_FAIL_CNT0= 8'h52;
801
 localparam MTST_FAIL_CNT1= TEMP_REG;
802
 
803
 localparam COVOX         = 8'h53;
804
 
380 ddp 805
 localparam INT_CONTROL   = 8'h54; // [0] -    covox- (27343.75 Hz)
806
                                   // [1] -    (~49 Hz)
255 ddp 807
 
808
 reg [7:0] number;          initial number = 8'hff;
809
 reg [7:0] indata;          initial indata = 8'hff;
810
 reg [7:0] outdata;
811
 reg [2:0] bitptr;
812
 reg prev_spics_n;
813
 reg [18:0] flash_addr;
814
 reg flash_cs;              initial flash_cs = 1'b0;
815
 reg flash_oe;              initial flash_oe = 1'b0;
816
 reg flash_we;              initial flash_we = 1'b0;
290 ddp 817
 reg flash_postinc;         initial flash_postinc = 1'b0;
255 ddp 818
 reg [7:0] flash_data_out;
819
 reg [10:0] scr_addr;       initial scr_addr = 11'h000;
820
 reg [7:0] scr_attr;        initial scr_attr = 8'h0f;
821
 reg scr_wren_c;            initial scr_wren_c = 1'b0;
822
 reg scr_wren_a;            initial scr_wren_a = 1'b0;
823
 reg [8:0] scr_mouse_x;     initial scr_mouse_x = 9'd0;
824
 reg [8:0] scr_mouse_y;     initial scr_mouse_y = 9'd0;
825
 reg scr_tv_mode;           initial scr_tv_mode = 1'b1;
380 ddp 826
 reg [2:0] scr_mode;        initial scr_mode = 3'b0;
255 ddp 827
 wire spicsn_rising;
828
 wire spicsn_falling;
829
 wire sd_selected;
830
 reg cs_trg;
831
 reg [7:0] temp_reg;
832
 
833
 always @(posedge spick)
834
  begin
835
   if ( spics_n )
836
    number <= { number[6:0], spido };
837
   else
838
    indata <= { indata[6:0], spido };
839
  end
840
 
841
 always @(negedge spick or posedge spics_n)
842
  begin
843
   if ( spics_n )
844
    bitptr <= 3'b111;
845
   else
846
    bitptr <= bitptr - 3'b001;
847
  end
848
 
849
 always @(posedge fclk)
850
  begin
851
   //
852
   if ( spicsn_rising )
853
    begin
854
     //
855
     cs_trg <= 1'b1;
856
     //
857
     case ( number )
858
      FLASH_LOADDR:  flash_addr[7:0] <= indata;
859
      FLASH_MIDADDR: flash_addr[15:8] <= indata;
860
      FLASH_HIADDR:  flash_addr[18:16] <= indata[2:0];
290 ddp 861
      FLASH_DATA:    begin
862
                      flash_data_out <= indata;
863
                      if (flash_postinc) flash_addr[13:0] <= flash_addr[13:0] + 14'd1;
864
                     end
255 ddp 865
      FLASH_CTRL:    begin
866
                      flash_cs <= indata[0];
867
                      flash_oe <= indata[1];
868
                      flash_we <= indata[2];
290 ddp 869
                      flash_postinc <= indata[3];
255 ddp 870
                     end
871
      SCR_LOADDR:    scr_addr[7:0] <= indata;
872
      SCR_HIADDR:    scr_addr[10:8] <= indata[2:0];
873
      SCR_SET_ATTR:  scr_attr <= indata;
874
      SCR_FILL:      begin
875
                      scr_attr <= indata;
876
                      scr_wren_a <= 1'b1;
877
                     end
878
      SCR_CHAR:      begin
879
                      scr_wren_c <= 1'b1;
880
                      scr_wren_a <= 1'b1;
881
                     end
882
      TEMP_REG:      temp_reg <= indata;
883
      SCR_MOUSE_X:   scr_mouse_x <= { temp_reg[0], indata };
884
      SCR_MOUSE_Y:   scr_mouse_y <= { temp_reg[0], indata };
885
      SCR_MODE:      begin
380 ddp 886
                      scr_tv_mode <= indata[7];
887
                      scr_mode <= indata[2:0];
255 ddp 888
                     end
889
      MTST_CONTROL:  mtst_run <= indata[0];
380 ddp 890
      COVOX:         begin
891
                      covox[cvx_ptr_iinc] <= indata;
892
                      cvx_ptr_in <= cvx_ptr_iinc;
893
                     end
255 ddp 894
      INT_CONTROL:   begin
895
                      enable_covox_int <= indata[0];
896
                      enable_frame_int <= indata[1];
897
                     end
898
     endcase
899
     //
900
    end
901
   else
902
   begin
903
    //
904
    scr_wren_c <= 1'b0;
905
    scr_wren_a <= 1'b0;
906
    //
907
    if ( spicsn_falling )
908
     begin
909
      //
910
      cs_trg <= 1'b0;
911
      //
912
      case ( number )
380 ddp 913
       SCR_SET_ATTR:  outdata <= ~scr_attr; // for SPI testing
255 ddp 914
       SCR_FILL:      begin
915
                       outdata <= 8'hff;
916
                       scr_addr <= scr_addr + 11'd1;
917
                      end
918
       SCR_CHAR:      begin
919
                       outdata <= 8'hff;
920
                       scr_addr <= scr_addr + 11'd1;
921
                      end
922
       FLASH_DATA:    outdata <= d;
923
       MTST_PASS_CNT0:begin
924
                       outdata <= mtst_pass_counter[7:0];
925
                       temp_reg <= mtst_pass_counter[15:8];
926
                      end
927
       MTST_FAIL_CNT0:begin
928
                       outdata <= mtst_fail_counter[7:0];
929
                       temp_reg <= mtst_fail_counter[15:8];
930
                      end
380 ddp 931
       COVOX:         outdata <= { 4'd0, cvx_ptr_diff };
255 ddp 932
       TEMP_REG:      outdata <= temp_reg; // read after MTST_PASS_CNT0, MTST_FAIL_CNT0
933
       default:       outdata <= 8'hff;
934
      endcase
935
      //
936
     end
937
    //
938
   end
939
   //
940
   prev_spics_n <= spics_n;
941
   //
942
  end
943
 
944
 assign spicsn_rising  = ( { cs_trg, prev_spics_n, spics_n } == 3'b011 );
945
 assign spicsn_falling = ( { cs_trg, prev_spics_n, spics_n } == 3'b100 );
946
 
947
 assign sd_selected = ( ( (number==SD_CS0) || (number==SD_CS1) ) && (~spics_n) );
948
 assign spidi = sd_selected ? sddi : outdata[bitptr];
949
 assign sddo  = sd_selected ? spido : 1'b1;
950
 assign sdclk = sd_selected ? spick : 1'b0;
951
 assign sdcs_n = !( (number==SD_CS0) && (~spics_n) );
952
 
953
 assign a[13:0]  =  flash_addr[13:0];
954
 assign rompg0_n = ~flash_addr[14];
955
 assign { rompg4, rompg3, rompg2, dos_n } = flash_addr[18:15];
956
 assign csrom   =  flash_cs;
957
 assign romoe_n = ~flash_oe;
958
 assign romwe_n = ~flash_we;
959
 assign d = flash_oe ? 8'bZZZZZZZZ : flash_data_out;
960
 
961
//-----------------------------------------------------------------------------
962
 
963
 reg mtst_run;      initial mtst_run = 1'b0;
964
 wire [15:0] mtst_pass_counter;
965
 wire [15:0] mtst_fail_counter;
966
 
967
 mem_tester mtst( .clk(fclk), .rst_n(mtst_run),
968
                  .pass_counter(mtst_pass_counter),
969
                  .fail_counter(mtst_fail_counter),
970
                  .DRAM_DQ(rd), .DRAM_MA(ra), .DRAM_RAS0_N(rras0_n), .DRAM_RAS1_N(rras1_n),
971
                  .DRAM_LCAS_N(rlcas_n), .DRAM_UCAS_N(rucas_n), .DRAM_WE_N(rwe_n) );
972
 
973
//-----------------------------------------------------------------------------
974
 
975
endmodule