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

Subversion Repositories tv80

[/] [tv80/] [trunk/] [rtl/] [core/] [tv80_core.v] - Blame information for rev 88

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

Line No. Rev Author Line
1 2 ghutchis
//
2
// TV80 8-Bit Microprocessor Core
3
// Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org)
4
//
5
// Copyright (c) 2004 Guy Hutchison (ghutchis@opencores.org)
6
//
7
// Permission is hereby granted, free of charge, to any person obtaining a 
8
// copy of this software and associated documentation files (the "Software"), 
9
// to deal in the Software without restriction, including without limitation 
10
// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
11
// and/or sell copies of the Software, and to permit persons to whom the 
12
// Software is furnished to do so, subject to the following conditions:
13
//
14
// The above copyright notice and this permission notice shall be included 
15
// in all copies or substantial portions of the Software.
16
//
17
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
18
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
19
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
20
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
21
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
22
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
23
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
 
25
module tv80_core (/*AUTOARG*/
26
  // Outputs
27
  m1_n, iorq, no_read, write, rfsh_n, halt_n, busak_n, A, do, mc, ts,
28
  intcycle_n, IntE, stop,
29
  // Inputs
30
  reset_n, clk, cen, wait_n, int_n, nmi_n, busrq_n, dinst, di
31
  );
32
  // Beginning of automatic inputs (from unused autoinst inputs)
33
  // End of automatics
34
 
35 60 ghutchis
  parameter Mode = 1;   // 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB
36
  parameter IOWait = 1; // 0 => Single cycle I/O, 1 => Std I/O cycle
37 2 ghutchis
  parameter Flag_C = 0;
38
  parameter Flag_N = 1;
39
  parameter Flag_P = 2;
40
  parameter Flag_X = 3;
41
  parameter Flag_H = 4;
42
  parameter Flag_Y = 5;
43
  parameter Flag_Z = 6;
44
  parameter Flag_S = 7;
45
 
46 60 ghutchis
  input     reset_n;
47
  input     clk;
48
  input     cen;
49
  input     wait_n;
50
  input     int_n;
51
  input     nmi_n;
52
  input     busrq_n;
53
  output    m1_n;
54
  output    iorq;
55
  output    no_read;
56
  output    write;
57
  output    rfsh_n;
58
  output    halt_n;
59
  output    busak_n;
60 2 ghutchis
  output [15:0] A;
61 60 ghutchis
  input [7:0]   dinst;
62
  input [7:0]   di;
63
  output [7:0]  do;
64
  output [6:0]  mc;
65
  output [6:0]  ts;
66
  output        intcycle_n;
67
  output        IntE;
68
  output        stop;
69 2 ghutchis
 
70 60 ghutchis
  reg    m1_n;
71 87 ghutchis
  reg    iorq;
72
`ifdef TV80_REFRESH
73
  reg    rfsh_n;
74
`endif
75 60 ghutchis
  reg    halt_n;
76
  reg    busak_n;
77 2 ghutchis
  reg [15:0] A;
78 60 ghutchis
  reg [7:0]  do;
79
  reg [6:0]  mc;
80
  reg [6:0]  ts;
81
  reg   intcycle_n;
82
  reg   IntE;
83
  reg   stop;
84 2 ghutchis
 
85 60 ghutchis
  parameter     aNone    = 3'b111;
86
  parameter     aBC      = 3'b000;
87
  parameter     aDE      = 3'b001;
88
  parameter     aXY      = 3'b010;
89
  parameter     aIOA     = 3'b100;
90
  parameter     aSP      = 3'b101;
91
  parameter     aZI      = 3'b110;
92 2 ghutchis
 
93
  // Registers
94
  reg [7:0]     ACC, F;
95
  reg [7:0]     Ap, Fp;
96
  reg [7:0]     I;
97 87 ghutchis
`ifdef TV80_REFRESH
98 2 ghutchis
  reg [7:0]     R;
99 87 ghutchis
`endif
100 2 ghutchis
  reg [15:0]    SP, PC;
101
  reg [7:0]     RegDIH;
102
  reg [7:0]     RegDIL;
103
  wire [15:0]   RegBusA;
104
  wire [15:0]   RegBusB;
105
  wire [15:0]   RegBusC;
106
  reg [2:0]     RegAddrA_r;
107
  reg [2:0]     RegAddrA;
108
  reg [2:0]     RegAddrB_r;
109
  reg [2:0]     RegAddrB;
110
  reg [2:0]     RegAddrC;
111
  reg           RegWEH;
112
  reg           RegWEL;
113
  reg           Alternate;
114
 
115
  // Help Registers
116 60 ghutchis
  reg [15:0]    TmpAddr;        // Temporary address register
117
  reg [7:0]     IR;             // Instruction register
118
  reg [1:0]     ISet;           // Instruction set selector
119 2 ghutchis
  reg [15:0]    RegBusA_r;
120
 
121
  reg [15:0]    ID16;
122
  reg [7:0]     Save_Mux;
123
 
124 21 ghutchis
  reg [6:0]     tstate;
125
  reg [6:0]     mcycle;
126
  reg           last_mcycle, last_tstate;
127 2 ghutchis
  reg           IntE_FF1;
128
  reg           IntE_FF2;
129
  reg           Halt_FF;
130
  reg           BusReq_s;
131
  reg           BusAck;
132
  reg           ClkEn;
133
  reg           NMI_s;
134
  reg           INT_s;
135
  reg [1:0]     IStatus;
136
 
137
  reg [7:0]     DI_Reg;
138
  reg           T_Res;
139
  reg [1:0]     XY_State;
140
  reg [2:0]     Pre_XY_F_M;
141
  reg           NextIs_XY_Fetch;
142
  reg           XY_Ind;
143
  reg           No_BTR;
144
  reg           BTR_r;
145
  reg           Auto_Wait;
146
  reg           Auto_Wait_t1;
147
  reg           Auto_Wait_t2;
148
  reg           IncDecZ;
149
 
150
  // ALU signals
151
  reg [7:0]     BusB;
152
  reg [7:0]     BusA;
153
  wire [7:0]    ALU_Q;
154
  wire [7:0]    F_Out;
155
 
156
  // Registered micro code outputs
157
  reg [4:0]     Read_To_Reg_r;
158
  reg           Arith16_r;
159
  reg           Z16_r;
160
  reg [3:0]     ALU_Op_r;
161
  reg           Save_ALU_r;
162
  reg           PreserveC_r;
163
  reg [2:0]     mcycles;
164
 
165
  // Micro code outputs
166
  wire [2:0]    mcycles_d;
167
  wire [2:0]    tstates;
168
  reg           IntCycle;
169
  reg           NMICycle;
170
  wire          Inc_PC;
171
  wire          Inc_WZ;
172
  wire [3:0]    IncDec_16;
173
  wire [1:0]    Prefix;
174
  wire          Read_To_Acc;
175
  wire          Read_To_Reg;
176
  wire [3:0]     Set_BusB_To;
177
  wire [3:0]     Set_BusA_To;
178
  wire [3:0]     ALU_Op;
179
  wire           Save_ALU;
180
  wire           PreserveC;
181
  wire           Arith16;
182
  wire [2:0]     Set_Addr_To;
183
  wire           Jump;
184
  wire           JumpE;
185
  wire           JumpXY;
186
  wire           Call;
187
  wire           RstP;
188
  wire           LDZ;
189
  wire           LDW;
190
  wire           LDSPHL;
191
  wire           iorq_i;
192
  wire [2:0]     Special_LD;
193
  wire           ExchangeDH;
194
  wire           ExchangeRp;
195
  wire           ExchangeAF;
196
  wire           ExchangeRS;
197
  wire           I_DJNZ;
198
  wire           I_CPL;
199
  wire           I_CCF;
200
  wire           I_SCF;
201
  wire           I_RETN;
202
  wire           I_BT;
203
  wire           I_BC;
204
  wire           I_BTR;
205
  wire           I_RLD;
206
  wire           I_RRD;
207
  wire           I_INRC;
208
  wire           SetDI;
209
  wire           SetEI;
210
  wire [1:0]     IMode;
211
  wire           Halt;
212
 
213
  reg [15:0]     PC16;
214
  reg [15:0]     PC16_B;
215
  reg [15:0]     SP16, SP16_A, SP16_B;
216
  reg [15:0]     ID16_B;
217
  reg            Oldnmi_n;
218
 
219
  tv80_mcode #(Mode, Flag_C, Flag_N, Flag_P, Flag_X, Flag_H, Flag_Y, Flag_Z, Flag_S) i_mcode
220
    (
221
     .IR                   (IR),
222
     .ISet                 (ISet),
223
     .MCycle               (mcycle),
224
     .F                    (F),
225
     .NMICycle             (NMICycle),
226
     .IntCycle             (IntCycle),
227
     .MCycles              (mcycles_d),
228
     .TStates              (tstates),
229
     .Prefix               (Prefix),
230
     .Inc_PC               (Inc_PC),
231
     .Inc_WZ               (Inc_WZ),
232
     .IncDec_16            (IncDec_16),
233
     .Read_To_Acc          (Read_To_Acc),
234
     .Read_To_Reg          (Read_To_Reg),
235
     .Set_BusB_To          (Set_BusB_To),
236
     .Set_BusA_To          (Set_BusA_To),
237
     .ALU_Op               (ALU_Op),
238
     .Save_ALU             (Save_ALU),
239
     .PreserveC            (PreserveC),
240
     .Arith16              (Arith16),
241
     .Set_Addr_To          (Set_Addr_To),
242
     .IORQ                 (iorq_i),
243
     .Jump                 (Jump),
244
     .JumpE                (JumpE),
245
     .JumpXY               (JumpXY),
246
     .Call                 (Call),
247
     .RstP                 (RstP),
248
     .LDZ                  (LDZ),
249
     .LDW                  (LDW),
250
     .LDSPHL               (LDSPHL),
251
     .Special_LD           (Special_LD),
252
     .ExchangeDH           (ExchangeDH),
253
     .ExchangeRp           (ExchangeRp),
254
     .ExchangeAF           (ExchangeAF),
255
     .ExchangeRS           (ExchangeRS),
256
     .I_DJNZ               (I_DJNZ),
257
     .I_CPL                (I_CPL),
258
     .I_CCF                (I_CCF),
259
     .I_SCF                (I_SCF),
260
     .I_RETN               (I_RETN),
261
     .I_BT                 (I_BT),
262
     .I_BC                 (I_BC),
263
     .I_BTR                (I_BTR),
264
     .I_RLD                (I_RLD),
265
     .I_RRD                (I_RRD),
266
     .I_INRC               (I_INRC),
267
     .SetDI                (SetDI),
268
     .SetEI                (SetEI),
269
     .IMode                (IMode),
270
     .Halt                 (Halt),
271
     .NoRead               (no_read),
272
     .Write                (write)
273
     );
274
 
275
  tv80_alu #(Mode, Flag_C, Flag_N, Flag_P, Flag_X, Flag_H, Flag_Y, Flag_Z, Flag_S) i_alu
276
    (
277
     .Arith16              (Arith16_r),
278
     .Z16                  (Z16_r),
279
     .ALU_Op               (ALU_Op_r),
280
     .IR                   (IR[5:0]),
281
     .ISet                 (ISet),
282
     .BusA                 (BusA),
283
     .BusB                 (BusB),
284
     .F_In                 (F),
285
     .Q                    (ALU_Q),
286
     .F_Out                (F_Out)
287
     );
288
 
289 21 ghutchis
  function [6:0] number_to_bitvec;
290
    input [2:0] num;
291
    begin
292
      case (num)
293
        1 : number_to_bitvec = 7'b0000001;
294
        2 : number_to_bitvec = 7'b0000010;
295
        3 : number_to_bitvec = 7'b0000100;
296
        4 : number_to_bitvec = 7'b0001000;
297
        5 : number_to_bitvec = 7'b0010000;
298
        6 : number_to_bitvec = 7'b0100000;
299
        7 : number_to_bitvec = 7'b1000000;
300
        default : number_to_bitvec = 7'bx;
301
      endcase // case(num)
302
    end
303
  endfunction // number_to_bitvec
304 88 ghutchis
 
305
  function [2:0] mcyc_to_number;
306
    input [6:0] mcyc;
307
    begin
308
      casez (mcyc)
309
        7'b1zzzzzz : mcyc_to_number = 3'h7;
310
        7'bz1zzzzz : mcyc_to_number = 3'h6;
311
        7'bzz1zzzz : mcyc_to_number = 3'h5;
312
        7'bzzz1zzz : mcyc_to_number = 3'h4;
313
        7'bzzzz1zz : mcyc_to_number = 3'h3;
314
        7'bzzzzz1z : mcyc_to_number = 3'h2;
315
        7'bzzzzzz1 : mcyc_to_number = 3'h1;
316
        default : mcyc_to_number = 3'h1;
317
      endcase
318
    end
319
  endfunction
320 21 ghutchis
 
321
  always @(/*AUTOSENSE*/mcycle or mcycles or tstate or tstates)
322
    begin
323
      case (mcycles)
324
        1 : last_mcycle = mcycle[0];
325
        2 : last_mcycle = mcycle[1];
326
        3 : last_mcycle = mcycle[2];
327
        4 : last_mcycle = mcycle[3];
328
        5 : last_mcycle = mcycle[4];
329
        6 : last_mcycle = mcycle[5];
330
        7 : last_mcycle = mcycle[6];
331
        default : last_mcycle = 1'bx;
332
      endcase // case(mcycles)
333
 
334
      case (tstates)
335
 
336
        1 : last_tstate = tstate[1];
337
        2 : last_tstate = tstate[2];
338
        3 : last_tstate = tstate[3];
339
        4 : last_tstate = tstate[4];
340
        5 : last_tstate = tstate[5];
341
        6 : last_tstate = tstate[6];
342
        default : last_tstate = 1'bx;
343
      endcase
344
    end // always @ (...
345
 
346
 
347 2 ghutchis
  always @(/*AUTOSENSE*/ALU_Q or BusAck or BusB or DI_Reg
348 21 ghutchis
           or ExchangeRp or IR or Save_ALU_r or Set_Addr_To or XY_Ind
349
           or XY_State or cen or last_tstate or mcycle)
350 2 ghutchis
    begin
351
      ClkEn = cen && ~ BusAck;
352
 
353 21 ghutchis
      if (last_tstate)
354 2 ghutchis
        T_Res = 1'b1;
355
      else T_Res = 1'b0;
356
 
357
      if (XY_State != 2'b00 && XY_Ind == 1'b0 &&
358 60 ghutchis
          ((Set_Addr_To == aXY) ||
359
           (mcycle[0] && IR == 8'b11001011) ||
360
           (mcycle[0] && IR == 8'b00110110)))
361 2 ghutchis
        NextIs_XY_Fetch = 1'b1;
362
      else
363
        NextIs_XY_Fetch = 1'b0;
364
 
365
      if (ExchangeRp)
366
        Save_Mux = BusB;
367
      else if (!Save_ALU_r)
368
        Save_Mux = DI_Reg;
369
      else
370
        Save_Mux = ALU_Q;
371
    end // always @ *
372
 
373
  always @ (posedge clk)
374
    begin
375
      if (reset_n == 1'b0 )
376
        begin
377 60 ghutchis
          PC <= #1 0;  // Program Counter
378
          A <= #1 0;
379
          TmpAddr <= #1 0;
380
          IR <= #1 8'b00000000;
381
          ISet <= #1 2'b00;
382
          XY_State <= #1 2'b00;
383
          IStatus <= #1 2'b00;
384
          mcycles <= #1 3'b000;
385
          do <= #1 8'b00000000;
386 2 ghutchis
 
387 60 ghutchis
          ACC <= #1 8'hFF;
388
          F <= #1 8'hFF;
389
          Ap <= #1 8'hFF;
390
          Fp <= #1 8'hFF;
391
          I <= #1 0;
392
          `ifdef TV80_REFRESH
393
          R <= #1 0;
394
          `endif
395
          SP <= #1 16'hFFFF;
396
          Alternate <= #1 1'b0;
397 2 ghutchis
 
398 60 ghutchis
          Read_To_Reg_r <= #1 5'b00000;
399
          Arith16_r <= #1 1'b0;
400
          BTR_r <= #1 1'b0;
401
          Z16_r <= #1 1'b0;
402
          ALU_Op_r <= #1 4'b0000;
403
          Save_ALU_r <= #1 1'b0;
404
          PreserveC_r <= #1 1'b0;
405
          XY_Ind <= #1 1'b0;
406
        end
407 2 ghutchis
      else
408
        begin
409
 
410 60 ghutchis
          if (ClkEn == 1'b1 )
411 2 ghutchis
            begin
412
 
413 60 ghutchis
              ALU_Op_r <= #1 4'b0000;
414
              Save_ALU_r <= #1 1'b0;
415
              Read_To_Reg_r <= #1 5'b00000;
416 2 ghutchis
 
417 60 ghutchis
              mcycles <= #1 mcycles_d;
418 2 ghutchis
 
419 60 ghutchis
              if (IMode != 2'b11 )
420 2 ghutchis
                begin
421 60 ghutchis
                  IStatus <= #1 IMode;
422
                end
423 2 ghutchis
 
424 60 ghutchis
              Arith16_r <= #1 Arith16;
425
              PreserveC_r <= #1 PreserveC;
426
              if (ISet == 2'b10 && ALU_Op[2] == 1'b0 && ALU_Op[0] == 1'b1 && mcycle[2] )
427 2 ghutchis
                begin
428 60 ghutchis
                  Z16_r <= #1 1'b1;
429
                end
430 2 ghutchis
              else
431
                begin
432 60 ghutchis
                  Z16_r <= #1 1'b0;
433
                end
434 2 ghutchis
 
435 60 ghutchis
              if (mcycle[0] && (tstate[1] | tstate[2] | tstate[3] ))
436 2 ghutchis
                begin
437 60 ghutchis
                  // mcycle == 1 && tstate == 1, 2, || 3
438
                  if (tstate[2] && wait_n == 1'b1 )
439 2 ghutchis
                    begin
440 60 ghutchis
                      `ifdef TV80_REFRESH
441
                      if (Mode < 2 )
442 2 ghutchis
                        begin
443 60 ghutchis
                          A[7:0] <= #1 R;
444
                          A[15:8] <= #1 I;
445
                          R[6:0] <= #1 R[6:0] + 1;
446
                        end
447
                      `endif
448
                      if (Jump == 1'b0 && Call == 1'b0 && NMICycle == 1'b0 && IntCycle == 1'b0 && ~ (Halt_FF == 1'b1 || Halt == 1'b1) )
449 2 ghutchis
                        begin
450 60 ghutchis
                          PC <= #1 PC16;
451
                        end
452 2 ghutchis
 
453 60 ghutchis
                      if (IntCycle == 1'b1 && IStatus == 2'b01 )
454 2 ghutchis
                        begin
455 60 ghutchis
                          IR <= #1 8'b11111111;
456
                        end
457 2 ghutchis
                      else if (Halt_FF == 1'b1 || (IntCycle == 1'b1 && IStatus == 2'b10) || NMICycle == 1'b1 )
458
                        begin
459 60 ghutchis
                          IR <= #1 8'b00000000;
460
                        end
461 2 ghutchis
                      else
462
                        begin
463 60 ghutchis
                          IR <= #1 dinst;
464
                        end
465 2 ghutchis
 
466 60 ghutchis
                      ISet <= #1 2'b00;
467
                      if (Prefix != 2'b00 )
468 2 ghutchis
                        begin
469 60 ghutchis
                          if (Prefix == 2'b11 )
470 2 ghutchis
                            begin
471 60 ghutchis
                              if (IR[5] == 1'b1 )
472 2 ghutchis
                                begin
473 60 ghutchis
                                  XY_State <= #1 2'b10;
474
                                end
475 2 ghutchis
                              else
476
                                begin
477 60 ghutchis
                                  XY_State <= #1 2'b01;
478
                                end
479
                            end
480 2 ghutchis
                          else
481
                            begin
482 60 ghutchis
                              if (Prefix == 2'b10 )
483 2 ghutchis
                                begin
484 60 ghutchis
                                  XY_State <= #1 2'b00;
485
                                  XY_Ind <= #1 1'b0;
486
                                end
487
                              ISet <= #1 Prefix;
488
                            end
489
                        end
490 2 ghutchis
                      else
491
                        begin
492 60 ghutchis
                          XY_State <= #1 2'b00;
493
                          XY_Ind <= #1 1'b0;
494
                        end
495
                    end // if (tstate == 2 && wait_n == 1'b1 )
496 2 ghutchis
 
497
 
498 60 ghutchis
                end
499 2 ghutchis
              else
500
                begin
501 60 ghutchis
                  // either (mcycle > 1) OR (mcycle == 1 AND tstate > 3)
502 2 ghutchis
 
503 60 ghutchis
                  if (mcycle[5] )
504 2 ghutchis
                    begin
505 60 ghutchis
                      XY_Ind <= #1 1'b1;
506
                      if (Prefix == 2'b01 )
507 2 ghutchis
                        begin
508 60 ghutchis
                          ISet <= #1 2'b01;
509
                        end
510
                    end
511 2 ghutchis
 
512 60 ghutchis
                  if (T_Res == 1'b1 )
513 2 ghutchis
                    begin
514 60 ghutchis
                      BTR_r <= #1 (I_BT || I_BC || I_BTR) && ~ No_BTR;
515
                      if (Jump == 1'b1 )
516 2 ghutchis
                        begin
517 60 ghutchis
                          A[15:8] <= #1 DI_Reg;
518
                          A[7:0] <= #1 TmpAddr[7:0];
519
                          PC[15:8] <= #1 DI_Reg;
520
                          PC[7:0] <= #1 TmpAddr[7:0];
521
                        end
522 2 ghutchis
                      else if (JumpXY == 1'b1 )
523
                        begin
524 60 ghutchis
                          A <= #1 RegBusC;
525
                          PC <= #1 RegBusC;
526
                        end else if (Call == 1'b1 || RstP == 1'b1 )
527 2 ghutchis
                          begin
528 60 ghutchis
                            A <= #1 TmpAddr;
529
                            PC <= #1 TmpAddr;
530
                          end
531 21 ghutchis
                        else if (last_mcycle && NMICycle == 1'b1 )
532 2 ghutchis
                          begin
533 60 ghutchis
                            A <= #1 16'b0000000001100110;
534
                            PC <= #1 16'b0000000001100110;
535
                          end
536 21 ghutchis
                        else if (mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 )
537 2 ghutchis
                          begin
538 60 ghutchis
                            A[15:8] <= #1 I;
539
                            A[7:0] <= #1 TmpAddr[7:0];
540
                            PC[15:8] <= #1 I;
541
                            PC[7:0] <= #1 TmpAddr[7:0];
542
                          end
543 2 ghutchis
                        else
544
                          begin
545 60 ghutchis
                            case (Set_Addr_To)
546
                              aXY :
547 2 ghutchis
                                begin
548 60 ghutchis
                                  if (XY_State == 2'b00 )
549 2 ghutchis
                                    begin
550 60 ghutchis
                                      A <= #1 RegBusC;
551
                                    end
552 2 ghutchis
                                  else
553
                                    begin
554 60 ghutchis
                                      if (NextIs_XY_Fetch == 1'b1 )
555 2 ghutchis
                                        begin
556 60 ghutchis
                                          A <= #1 PC;
557
                                        end
558 2 ghutchis
                                      else
559
                                        begin
560 60 ghutchis
                                          A <= #1 TmpAddr;
561
                                        end
562
                                    end // else: !if(XY_State == 2'b00 )
563 2 ghutchis
                                end // case: aXY
564
 
565 60 ghutchis
                              aIOA :
566 2 ghutchis
                                begin
567 60 ghutchis
                                  if (Mode == 3 )
568 2 ghutchis
                                    begin
569 60 ghutchis
                                      // Memory map I/O on GBZ80
570
                                      A[15:8] <= #1 8'hFF;
571
                                    end
572 2 ghutchis
                                  else if (Mode == 2 )
573
                                    begin
574 60 ghutchis
                                      // Duplicate I/O address on 8080
575
                                      A[15:8] <= #1 DI_Reg;
576
                                    end
577 2 ghutchis
                                  else
578
                                    begin
579 60 ghutchis
                                      A[15:8] <= #1 ACC;
580
                                    end
581
                                  A[7:0] <= #1 DI_Reg;
582 2 ghutchis
                                end // case: aIOA
583
 
584
 
585 60 ghutchis
                              aSP :
586 2 ghutchis
                                begin
587 60 ghutchis
                                  A <= #1 SP;
588 2 ghutchis
                                end
589
 
590 60 ghutchis
                              aBC :
591 2 ghutchis
                                begin
592 60 ghutchis
                                  if (Mode == 3 && iorq_i == 1'b1 )
593 2 ghutchis
                                    begin
594 60 ghutchis
                                      // Memory map I/O on GBZ80
595
                                      A[15:8] <= #1 8'hFF;
596
                                      A[7:0] <= #1 RegBusC[7:0];
597
                                    end
598 2 ghutchis
                                  else
599
                                    begin
600 60 ghutchis
                                      A <= #1 RegBusC;
601
                                    end
602 2 ghutchis
                                end // case: aBC
603
 
604 60 ghutchis
                              aDE :
605 2 ghutchis
                                begin
606 60 ghutchis
                                  A <= #1 RegBusC;
607 2 ghutchis
                                end
608
 
609 60 ghutchis
                              aZI :
610 2 ghutchis
                                begin
611 60 ghutchis
                                  if (Inc_WZ == 1'b1 )
612 2 ghutchis
                                    begin
613 60 ghutchis
                                      A <= #1 TmpAddr + 1;
614
                                    end
615 2 ghutchis
                                  else
616
                                    begin
617 60 ghutchis
                                      A[15:8] <= #1 DI_Reg;
618
                                      A[7:0] <= #1 TmpAddr[7:0];
619
                                    end
620 2 ghutchis
                                end // case: aZI
621
 
622 60 ghutchis
                              default   :
623 2 ghutchis
                                begin
624 60 ghutchis
                                  A <= #1 PC;
625 2 ghutchis
                                end
626 60 ghutchis
                            endcase // case(Set_Addr_To)
627 2 ghutchis
 
628 60 ghutchis
                          end // else: !if(mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 )
629 2 ghutchis
 
630
 
631 60 ghutchis
                      Save_ALU_r <= #1 Save_ALU;
632
                      ALU_Op_r <= #1 ALU_Op;
633 2 ghutchis
 
634 60 ghutchis
                      if (I_CPL == 1'b1 )
635 2 ghutchis
                        begin
636 60 ghutchis
                          // CPL
637
                          ACC <= #1 ~ ACC;
638
                          F[Flag_Y] <= #1 ~ ACC[5];
639
                          F[Flag_H] <= #1 1'b1;
640
                          F[Flag_X] <= #1 ~ ACC[3];
641
                          F[Flag_N] <= #1 1'b1;
642
                        end
643
                      if (I_CCF == 1'b1 )
644 2 ghutchis
                        begin
645 60 ghutchis
                          // CCF
646
                          F[Flag_C] <= #1 ~ F[Flag_C];
647
                          F[Flag_Y] <= #1 ACC[5];
648
                          F[Flag_H] <= #1 F[Flag_C];
649
                          F[Flag_X] <= #1 ACC[3];
650
                          F[Flag_N] <= #1 1'b0;
651
                        end
652
                      if (I_SCF == 1'b1 )
653 2 ghutchis
                        begin
654 60 ghutchis
                          // SCF
655
                          F[Flag_C] <= #1 1'b1;
656
                          F[Flag_Y] <= #1 ACC[5];
657
                          F[Flag_H] <= #1 1'b0;
658
                          F[Flag_X] <= #1 ACC[3];
659
                          F[Flag_N] <= #1 1'b0;
660
                        end
661
                    end // if (T_Res == 1'b1 )
662 2 ghutchis
 
663
 
664 60 ghutchis
                  if (tstate[2] && wait_n == 1'b1 )
665 2 ghutchis
                    begin
666 60 ghutchis
                      if (ISet == 2'b01 && mcycle[6] )
667 2 ghutchis
                        begin
668 60 ghutchis
                          IR <= #1 dinst;
669
                        end
670
                      if (JumpE == 1'b1 )
671 2 ghutchis
                        begin
672
                          PC <= #1 PC16;
673 60 ghutchis
                        end
674 2 ghutchis
                      else if (Inc_PC == 1'b1 )
675
                        begin
676 60 ghutchis
                          //PC <= #1 PC + 1;
677 2 ghutchis
                          PC <= #1 PC16;
678 60 ghutchis
                        end
679
                      if (BTR_r == 1'b1 )
680 2 ghutchis
                        begin
681 60 ghutchis
                          //PC <= #1 PC - 2;
682 2 ghutchis
                          PC <= #1 PC16;
683 60 ghutchis
                        end
684
                      if (RstP == 1'b1 )
685 2 ghutchis
                        begin
686
                          TmpAddr <= #1 { 10'h0, IR[5:3], 3'h0 };
687 60 ghutchis
                          //TmpAddr <= #1 (others =>1'b0);
688
                          //TmpAddr[5:3] <= #1 IR[5:3];
689
                        end
690
                    end
691
                  if (tstate[3] && mcycle[5] )
692 2 ghutchis
                    begin
693
                      TmpAddr <= #1 SP16;
694 60 ghutchis
                    end
695 2 ghutchis
 
696 60 ghutchis
                  if ((tstate[2] && wait_n == 1'b1) || (tstate[4] && mcycle[0]) )
697 2 ghutchis
                    begin
698 60 ghutchis
                      if (IncDec_16[2:0] == 3'b111 )
699 2 ghutchis
                        begin
700
                          SP <= #1 SP16;
701 60 ghutchis
                        end
702
                    end
703 2 ghutchis
 
704 60 ghutchis
                  if (LDSPHL == 1'b1 )
705 2 ghutchis
                    begin
706 60 ghutchis
                      SP <= #1 RegBusC;
707
                    end
708
                  if (ExchangeAF == 1'b1 )
709 2 ghutchis
                    begin
710 60 ghutchis
                      Ap <= #1 ACC;
711
                      ACC <= #1 Ap;
712
                      Fp <= #1 F;
713
                      F <= #1 Fp;
714
                    end
715
                  if (ExchangeRS == 1'b1 )
716 2 ghutchis
                    begin
717 60 ghutchis
                      Alternate <= #1 ~ Alternate;
718
                    end
719
                end // else: !if(mcycle  == 3'b001 && tstate(2) == 1'b0 )
720 2 ghutchis
 
721
 
722 60 ghutchis
              if (tstate[3] )
723 2 ghutchis
                begin
724 60 ghutchis
                  if (LDZ == 1'b1 )
725 2 ghutchis
                    begin
726 60 ghutchis
                      TmpAddr[7:0] <= #1 DI_Reg;
727
                    end
728
                  if (LDW == 1'b1 )
729 2 ghutchis
                    begin
730 60 ghutchis
                      TmpAddr[15:8] <= #1 DI_Reg;
731
                    end
732 2 ghutchis
 
733 60 ghutchis
                  if (Special_LD[2] == 1'b1 )
734 2 ghutchis
                    begin
735 60 ghutchis
                      case (Special_LD[1:0])
736
                        2'b00 :
737 2 ghutchis
                          begin
738 60 ghutchis
                            ACC <= #1 I;
739
                            F[Flag_P] <= #1 IntE_FF2;
740 2 ghutchis
                          end
741
 
742 60 ghutchis
                        2'b01 :
743 2 ghutchis
                          begin
744 87 ghutchis
                            `ifdef TV80_REFRESH
745 60 ghutchis
                            ACC <= #1 R;
746 87 ghutchis
                            `else
747
                            ACC <= #1 0;
748
                            `endif
749 60 ghutchis
                            F[Flag_P] <= #1 IntE_FF2;
750 2 ghutchis
                          end
751
 
752 60 ghutchis
                        2'b10 :
753
                          I <= #1 ACC;
754
 
755
                        `ifdef TV80_REFRESH
756
                        default :
757
                          R <= #1 ACC;
758
                        `else
759
                        default : ;
760
                        `endif
761
                      endcase
762
                    end
763
                end // if (tstate == 3 )
764 2 ghutchis
 
765
 
766 60 ghutchis
              if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 )
767 2 ghutchis
                begin
768 60 ghutchis
                  if (Mode == 3 )
769 2 ghutchis
                    begin
770 60 ghutchis
                      F[6] <= #1 F_Out[6];
771
                      F[5] <= #1 F_Out[5];
772
                      F[7] <= #1 F_Out[7];
773
                      if (PreserveC_r == 1'b0 )
774 2 ghutchis
                        begin
775 60 ghutchis
                          F[4] <= #1 F_Out[4];
776
                        end
777
                    end
778 2 ghutchis
                  else
779
                    begin
780 60 ghutchis
                      F[7:1] <= #1 F_Out[7:1];
781
                      if (PreserveC_r == 1'b0 )
782 2 ghutchis
                        begin
783 60 ghutchis
                          F[Flag_C] <= #1 F_Out[0];
784
                        end
785
                    end
786
                end // if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 )
787 2 ghutchis
 
788 60 ghutchis
              if (T_Res == 1'b1 && I_INRC == 1'b1 )
789 2 ghutchis
                begin
790 60 ghutchis
                  F[Flag_H] <= #1 1'b0;
791
                  F[Flag_N] <= #1 1'b0;
792
                  if (DI_Reg[7:0] == 8'b00000000 )
793 2 ghutchis
                    begin
794 60 ghutchis
                      F[Flag_Z] <= #1 1'b1;
795
                    end
796 2 ghutchis
                  else
797
                    begin
798 60 ghutchis
                      F[Flag_Z] <= #1 1'b0;
799
                    end
800
                  F[Flag_S] <= #1 DI_Reg[7];
801
                  F[Flag_P] <= #1 ~ (^DI_Reg[7:0]);
802
                end // if (T_Res == 1'b1 && I_INRC == 1'b1 )
803 2 ghutchis
 
804
 
805 60 ghutchis
              if (tstate[1] && Auto_Wait_t1 == 1'b0 )
806 2 ghutchis
                begin
807 60 ghutchis
                  do <= #1 BusB;
808
                  if (I_RLD == 1'b1 )
809 2 ghutchis
                    begin
810 60 ghutchis
                      do[3:0] <= #1 BusA[3:0];
811
                      do[7:4] <= #1 BusB[3:0];
812
                    end
813
                  if (I_RRD == 1'b1 )
814 2 ghutchis
                    begin
815 60 ghutchis
                      do[3:0] <= #1 BusB[7:4];
816
                      do[7:4] <= #1 BusA[3:0];
817
                    end
818
                end
819 2 ghutchis
 
820 60 ghutchis
              if (T_Res == 1'b1 )
821 2 ghutchis
                begin
822 60 ghutchis
                  Read_To_Reg_r[3:0] <= #1 Set_BusA_To;
823
                  Read_To_Reg_r[4] <= #1 Read_To_Reg;
824
                  if (Read_To_Acc == 1'b1 )
825 2 ghutchis
                    begin
826 60 ghutchis
                      Read_To_Reg_r[3:0] <= #1 4'b0111;
827
                      Read_To_Reg_r[4] <= #1 1'b1;
828
                    end
829
                end
830 2 ghutchis
 
831 60 ghutchis
              if (tstate[1] && I_BT == 1'b1 )
832 2 ghutchis
                begin
833 60 ghutchis
                  F[Flag_X] <= #1 ALU_Q[3];
834
                  F[Flag_Y] <= #1 ALU_Q[1];
835
                  F[Flag_H] <= #1 1'b0;
836
                  F[Flag_N] <= #1 1'b0;
837
                end
838
              if (I_BC == 1'b1 || I_BT == 1'b1 )
839 2 ghutchis
                begin
840 60 ghutchis
                  F[Flag_P] <= #1 IncDecZ;
841
                end
842 2 ghutchis
 
843 60 ghutchis
              if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||
844
                  (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) )
845 2 ghutchis
                begin
846 60 ghutchis
                  case (Read_To_Reg_r)
847
                    5'b10111 :
848
                      ACC <= #1 Save_Mux;
849
                    5'b10110 :
850
                      do <= #1 Save_Mux;
851
                    5'b11000 :
852
                      SP[7:0] <= #1 Save_Mux;
853
                    5'b11001 :
854
                      SP[15:8] <= #1 Save_Mux;
855
                    5'b11011 :
856
                      F <= #1 Save_Mux;
857
                  endcase
858
                end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||...              
859
            end // if (ClkEn == 1'b1 )         
860
        end // else: !if(reset_n == 1'b0 )
861 2 ghutchis
    end
862
 
863
 
864
  //-------------------------------------------------------------------------
865
  //
866
  // BC('), DE('), HL('), IX && IY
867
  //
868
  //-------------------------------------------------------------------------
869
  always @ (posedge clk)
870
    begin
871
      if (ClkEn == 1'b1 )
872
        begin
873 60 ghutchis
          // Bus A / Write
874
          RegAddrA_r <= #1  { Alternate, Set_BusA_To[2:1] };
875
          if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusA_To[2:1] == 2'b10 )
876 2 ghutchis
            begin
877 60 ghutchis
              RegAddrA_r <= #1 { XY_State[1],  2'b11 };
878
            end
879 2 ghutchis
 
880 60 ghutchis
          // Bus B
881
          RegAddrB_r <= #1 { Alternate, Set_BusB_To[2:1] };
882
          if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusB_To[2:1] == 2'b10 )
883 2 ghutchis
            begin
884 60 ghutchis
              RegAddrB_r <= #1 { XY_State[1],  2'b11 };
885
            end
886 2 ghutchis
 
887 60 ghutchis
          // Address from register
888
          RegAddrC <= #1 { Alternate,  Set_Addr_To[1:0] };
889
          // Jump (HL), LD SP,HL
890
          if ((JumpXY == 1'b1 || LDSPHL == 1'b1) )
891 2 ghutchis
            begin
892 60 ghutchis
              RegAddrC <= #1 { Alternate, 2'b10 };
893
            end
894
          if (((JumpXY == 1'b1 || LDSPHL == 1'b1) && XY_State != 2'b00) || (mcycle[5]) )
895 2 ghutchis
            begin
896 60 ghutchis
              RegAddrC <= #1 { XY_State[1],  2'b11 };
897
            end
898 2 ghutchis
 
899 60 ghutchis
          if (I_DJNZ == 1'b1 && Save_ALU_r == 1'b1 && Mode < 2 )
900 2 ghutchis
            begin
901 60 ghutchis
              IncDecZ <= #1 F_Out[Flag_Z];
902
            end
903
          if ((tstate[2] || (tstate[3] && mcycle[0])) && IncDec_16[2:0] == 3'b100 )
904 2 ghutchis
            begin
905 60 ghutchis
              if (ID16 == 0 )
906 2 ghutchis
                begin
907 60 ghutchis
                  IncDecZ <= #1 1'b0;
908
                end
909 2 ghutchis
              else
910
                begin
911 60 ghutchis
                  IncDecZ <= #1 1'b1;
912
                end
913
            end
914 2 ghutchis
 
915 60 ghutchis
          RegBusA_r <= #1 RegBusA;
916
        end
917 2 ghutchis
 
918
    end // always @ (posedge clk)
919
 
920
 
921
  always @(/*AUTOSENSE*/Alternate or ExchangeDH or IncDec_16
922 21 ghutchis
           or RegAddrA_r or RegAddrB_r or XY_State or mcycle or tstate)
923 2 ghutchis
    begin
924 21 ghutchis
      if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && XY_State == 2'b00)
925 2 ghutchis
        RegAddrA = { Alternate, IncDec_16[1:0] };
926 21 ghutchis
      else if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && IncDec_16[1:0] == 2'b10)
927 2 ghutchis
        RegAddrA = { XY_State[1], 2'b11 };
928 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[3])
929 2 ghutchis
        RegAddrA = { Alternate, 2'b10 };
930 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[4])
931 60 ghutchis
        RegAddrA = { Alternate, 2'b01 };
932 2 ghutchis
      else
933
        RegAddrA = RegAddrA_r;
934
 
935 21 ghutchis
      if (ExchangeDH == 1'b1 && tstate[3])
936 2 ghutchis
        RegAddrB = { Alternate, 2'b01 };
937
      else
938
        RegAddrB = RegAddrB_r;
939
    end // always @ *
940
 
941
 
942
  always @(/*AUTOSENSE*/ALU_Op_r or Auto_Wait_t1 or ExchangeDH
943 21 ghutchis
           or IncDec_16 or Read_To_Reg_r or Save_ALU_r or mcycle
944
           or tstate or wait_n)
945 2 ghutchis
    begin
946
      RegWEH = 1'b0;
947
      RegWEL = 1'b0;
948 21 ghutchis
      if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||
949 60 ghutchis
          (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) )
950 2 ghutchis
        begin
951 60 ghutchis
          case (Read_To_Reg_r)
952
            5'b10000 , 5'b10001 , 5'b10010 , 5'b10011 , 5'b10100 , 5'b10101 :
953 2 ghutchis
              begin
954 60 ghutchis
                RegWEH = ~ Read_To_Reg_r[0];
955
                RegWEL = Read_To_Reg_r[0];
956 2 ghutchis
              end
957
          endcase // case(Read_To_Reg_r)
958
 
959 60 ghutchis
        end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||...
960 2 ghutchis
 
961
 
962 21 ghutchis
      if (ExchangeDH == 1'b1 && (tstate[3] || tstate[4]) )
963 2 ghutchis
        begin
964 60 ghutchis
          RegWEH = 1'b1;
965
          RegWEL = 1'b1;
966
        end
967 2 ghutchis
 
968 21 ghutchis
      if (IncDec_16[2] == 1'b1 && ((tstate[2] && wait_n == 1'b1 && mcycle != 3'b001) || (tstate[3] && mcycle[0])) )
969 2 ghutchis
        begin
970 60 ghutchis
          case (IncDec_16[1:0])
971
            2'b00 , 2'b01 , 2'b10 :
972 2 ghutchis
              begin
973 60 ghutchis
                RegWEH = 1'b1;
974
                RegWEL = 1'b1;
975 2 ghutchis
              end
976 60 ghutchis
          endcase
977
        end
978 2 ghutchis
    end // always @ *
979
 
980
 
981
  always @(/*AUTOSENSE*/ExchangeDH or ID16 or IncDec_16 or RegBusA_r
982 21 ghutchis
           or RegBusB or Save_Mux or mcycle or tstate)
983 2 ghutchis
    begin
984
      RegDIH = Save_Mux;
985
      RegDIL = Save_Mux;
986
 
987 21 ghutchis
      if (ExchangeDH == 1'b1 && tstate[3] )
988 2 ghutchis
        begin
989 60 ghutchis
          RegDIH = RegBusB[15:8];
990
          RegDIL = RegBusB[7:0];
991
        end
992 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[4] )
993 2 ghutchis
        begin
994 60 ghutchis
          RegDIH = RegBusA_r[15:8];
995
          RegDIL = RegBusA_r[7:0];
996
        end
997 21 ghutchis
      else if (IncDec_16[2] == 1'b1 && ((tstate[2] && mcycle != 3'b001) || (tstate[3] && mcycle[0])) )
998 2 ghutchis
        begin
999 60 ghutchis
          RegDIH = ID16[15:8];
1000
          RegDIL = ID16[7:0];
1001
        end
1002 2 ghutchis
    end
1003
 
1004
  tv80_reg i_reg
1005
    (
1006
     .clk                  (clk),
1007
     .CEN                  (ClkEn),
1008
     .WEH                  (RegWEH),
1009
     .WEL                  (RegWEL),
1010
     .AddrA                (RegAddrA),
1011
     .AddrB                (RegAddrB),
1012
     .AddrC                (RegAddrC),
1013
     .DIH                  (RegDIH),
1014
     .DIL                  (RegDIL),
1015
     .DOAH                 (RegBusA[15:8]),
1016
     .DOAL                 (RegBusA[7:0]),
1017
     .DOBH                 (RegBusB[15:8]),
1018
     .DOBL                 (RegBusB[7:0]),
1019
     .DOCH                 (RegBusC[15:8]),
1020
     .DOCL                 (RegBusC[7:0])
1021
     );
1022
 
1023
  //-------------------------------------------------------------------------
1024
  //
1025
  // Buses
1026
  //
1027
  //-------------------------------------------------------------------------
1028
 
1029
  always @ (posedge clk)
1030
    begin
1031
      if (ClkEn == 1'b1 )
1032
        begin
1033 60 ghutchis
          case (Set_BusB_To)
1034
            4'b0111 :
1035
              BusB <= #1 ACC;
1036
            4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 :
1037 2 ghutchis
              begin
1038 60 ghutchis
                if (Set_BusB_To[0] == 1'b1 )
1039 2 ghutchis
                  begin
1040 60 ghutchis
                    BusB <= #1 RegBusB[7:0];
1041
                  end
1042 2 ghutchis
                else
1043
                  begin
1044 60 ghutchis
                    BusB <= #1 RegBusB[15:8];
1045
                  end
1046 2 ghutchis
              end
1047 60 ghutchis
            4'b0110 :
1048
              BusB <= #1 DI_Reg;
1049
            4'b1000 :
1050
              BusB <= #1 SP[7:0];
1051
            4'b1001 :
1052
              BusB <= #1 SP[15:8];
1053
            4'b1010 :
1054
              BusB <= #1 8'b00000001;
1055
            4'b1011 :
1056
              BusB <= #1 F;
1057
            4'b1100 :
1058
              BusB <= #1 PC[7:0];
1059
            4'b1101 :
1060
              BusB <= #1 PC[15:8];
1061
            4'b1110 :
1062
              BusB <= #1 8'b00000000;
1063
            default :
1064 87 ghutchis
              BusB <= #1 8'h0;
1065 60 ghutchis
          endcase
1066 2 ghutchis
 
1067 60 ghutchis
          case (Set_BusA_To)
1068
            4'b0111 :
1069
              BusA <= #1 ACC;
1070
            4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 :
1071 2 ghutchis
              begin
1072 60 ghutchis
                if (Set_BusA_To[0] == 1'b1 )
1073 2 ghutchis
                  begin
1074 60 ghutchis
                    BusA <= #1 RegBusA[7:0];
1075
                  end
1076 2 ghutchis
                else
1077
                  begin
1078 60 ghutchis
                    BusA <= #1 RegBusA[15:8];
1079
                  end
1080 2 ghutchis
              end
1081 60 ghutchis
            4'b0110 :
1082
              BusA <= #1 DI_Reg;
1083
            4'b1000 :
1084
              BusA <= #1 SP[7:0];
1085
            4'b1001 :
1086
              BusA <= #1 SP[15:8];
1087
            4'b1010 :
1088
              BusA <= #1 8'b00000000;
1089
            default :
1090 87 ghutchis
              BusA <= #1  8'h0;
1091 60 ghutchis
          endcase
1092
        end
1093 2 ghutchis
    end
1094
 
1095
  //-------------------------------------------------------------------------
1096
  //
1097
  // Generate external control signals
1098
  //
1099
  //-------------------------------------------------------------------------
1100 60 ghutchis
`ifdef TV80_REFRESH
1101 2 ghutchis
  always @ (posedge clk)
1102
    begin
1103
      if (reset_n == 1'b0 )
1104
        begin
1105 60 ghutchis
          rfsh_n <= #1 1'b1;
1106
        end
1107 2 ghutchis
      else
1108
        begin
1109 60 ghutchis
          if (cen == 1'b1 )
1110 2 ghutchis
            begin
1111 60 ghutchis
              if (mcycle[0] && ((tstate[2]  && wait_n == 1'b1) || tstate[3]) )
1112 2 ghutchis
                begin
1113 60 ghutchis
                  rfsh_n <= #1 1'b0;
1114
                end
1115 2 ghutchis
              else
1116
                begin
1117 60 ghutchis
                  rfsh_n <= #1 1'b1;
1118
                end
1119
            end
1120
        end
1121 87 ghutchis
    end // always @ (posedge clk or negedge reset_n)
1122
`else // !`ifdef TV80_REFRESH
1123
  assign rfsh_n = 1'b1;
1124 60 ghutchis
`endif
1125 2 ghutchis
 
1126
  always @(/*AUTOSENSE*/BusAck or Halt_FF or I_DJNZ or IntCycle
1127 21 ghutchis
           or IntE_FF1 or di or iorq_i or mcycle or tstate)
1128 2 ghutchis
    begin
1129
      mc = mcycle;
1130
      ts = tstate;
1131
      DI_Reg = di;
1132
      halt_n = ~ Halt_FF;
1133
      busak_n = ~ BusAck;
1134
      intcycle_n = ~ IntCycle;
1135
      IntE = IntE_FF1;
1136
      iorq = iorq_i;
1137
      stop = I_DJNZ;
1138
    end
1139
 
1140
  //-----------------------------------------------------------------------
1141
  //
1142
  // Syncronise inputs
1143
  //
1144
  //-----------------------------------------------------------------------
1145
 
1146
  always @ (posedge clk)
1147
    begin : sync_inputs
1148
 
1149
      if (reset_n == 1'b0 )
1150
        begin
1151 60 ghutchis
          BusReq_s <= #1 1'b0;
1152
          INT_s <= #1 1'b0;
1153
          NMI_s <= #1 1'b0;
1154
          Oldnmi_n <= #1 1'b0;
1155
        end
1156 2 ghutchis
      else
1157
        begin
1158 60 ghutchis
          if (cen == 1'b1 )
1159 2 ghutchis
            begin
1160 60 ghutchis
              BusReq_s <= #1 ~ busrq_n;
1161
              INT_s <= #1 ~ int_n;
1162
              if (NMICycle == 1'b1 )
1163 2 ghutchis
                begin
1164 60 ghutchis
                  NMI_s <= #1 1'b0;
1165
                end
1166 2 ghutchis
              else if (nmi_n == 1'b0 && Oldnmi_n == 1'b1 )
1167
                begin
1168 60 ghutchis
                  NMI_s <= #1 1'b1;
1169
                end
1170
              Oldnmi_n <= #1 nmi_n;
1171
            end
1172
        end
1173 2 ghutchis
    end
1174
 
1175
  //-----------------------------------------------------------------------
1176
  //
1177
  // Main state machine
1178
  //
1179
  //-----------------------------------------------------------------------
1180
 
1181
  always @ (posedge clk)
1182
    begin
1183
      if (reset_n == 1'b0 )
1184
        begin
1185 60 ghutchis
          mcycle <= #1 7'b0000001;
1186
          tstate <= #1 7'b0000001;
1187
          Pre_XY_F_M <= #1 3'b000;
1188
          Halt_FF <= #1 1'b0;
1189
          BusAck <= #1 1'b0;
1190
          NMICycle <= #1 1'b0;
1191
          IntCycle <= #1 1'b0;
1192
          IntE_FF1 <= #1 1'b0;
1193
          IntE_FF2 <= #1 1'b0;
1194
          No_BTR <= #1 1'b0;
1195
          Auto_Wait_t1 <= #1 1'b0;
1196
          Auto_Wait_t2 <= #1 1'b0;
1197
          m1_n <= #1 1'b1;
1198
        end
1199 2 ghutchis
      else
1200
        begin
1201 60 ghutchis
          if (cen == 1'b1 )
1202 2 ghutchis
            begin
1203 60 ghutchis
              if (T_Res == 1'b1 )
1204 2 ghutchis
                begin
1205 60 ghutchis
                  Auto_Wait_t1 <= #1 1'b0;
1206
                end
1207 2 ghutchis
              else
1208
                begin
1209 60 ghutchis
                  Auto_Wait_t1 <= #1 Auto_Wait || iorq_i;
1210
                end
1211
              Auto_Wait_t2 <= #1 Auto_Wait_t1;
1212
              No_BTR <= #1 (I_BT && (~ IR[4] || ~ F[Flag_P])) ||
1213
                        (I_BC && (~ IR[4] || F[Flag_Z] || ~ F[Flag_P])) ||
1214
                        (I_BTR && (~ IR[4] || F[Flag_Z]));
1215
              if (tstate[2] )
1216 2 ghutchis
                begin
1217 60 ghutchis
                  if (SetEI == 1'b1 )
1218 2 ghutchis
                    begin
1219 60 ghutchis
                      IntE_FF1 <= #1 1'b1;
1220
                      IntE_FF2 <= #1 1'b1;
1221
                    end
1222
                  if (I_RETN == 1'b1 )
1223 2 ghutchis
                    begin
1224 60 ghutchis
                      IntE_FF1 <= #1 IntE_FF2;
1225
                    end
1226
                end
1227
              if (tstate[3] )
1228 2 ghutchis
                begin
1229 60 ghutchis
                  if (SetDI == 1'b1 )
1230 2 ghutchis
                    begin
1231 60 ghutchis
                      IntE_FF1 <= #1 1'b0;
1232
                      IntE_FF2 <= #1 1'b0;
1233
                    end
1234
                end
1235
              if (IntCycle == 1'b1 || NMICycle == 1'b1 )
1236 2 ghutchis
                begin
1237 60 ghutchis
                  Halt_FF <= #1 1'b0;
1238
                end
1239
              if (mcycle[0] && tstate[2] && wait_n == 1'b1 )
1240 2 ghutchis
                begin
1241 60 ghutchis
                  m1_n <= #1 1'b1;
1242
                end
1243
              if (BusReq_s == 1'b1 && BusAck == 1'b1 )
1244 2 ghutchis
                begin
1245
                end
1246
              else
1247
                begin
1248 60 ghutchis
                  BusAck <= #1 1'b0;
1249
                  if (tstate[2] && wait_n == 1'b0 )
1250 2 ghutchis
                    begin
1251 60 ghutchis
                    end
1252 2 ghutchis
                  else if (T_Res == 1'b1 )
1253
                    begin
1254 60 ghutchis
                      if (Halt == 1'b1 )
1255 2 ghutchis
                        begin
1256 60 ghutchis
                          Halt_FF <= #1 1'b1;
1257
                        end
1258
                      if (BusReq_s == 1'b1 )
1259 2 ghutchis
                        begin
1260 60 ghutchis
                          BusAck <= #1 1'b1;
1261
                        end
1262 2 ghutchis
                      else
1263
                        begin
1264 60 ghutchis
                          tstate <= #1 7'b0000010;
1265
                          if (NextIs_XY_Fetch == 1'b1 )
1266 2 ghutchis
                            begin
1267 60 ghutchis
                              mcycle <= #1 7'b0100000;
1268 88 ghutchis
                              Pre_XY_F_M <= #1 mcyc_to_number(mcycle);
1269 60 ghutchis
                              if (IR == 8'b00110110 && Mode == 0 )
1270 2 ghutchis
                                begin
1271 60 ghutchis
                                  Pre_XY_F_M <= #1 3'b010;
1272
                                end
1273
                            end
1274 21 ghutchis
                          else if ((mcycle[6]) || (mcycle[5] && Mode == 1 && ISet != 2'b01) )
1275 2 ghutchis
                            begin
1276 60 ghutchis
                              mcycle <= #1 number_to_bitvec(Pre_XY_F_M + 1);
1277
                            end
1278 21 ghutchis
                          else if ((last_mcycle) ||
1279 60 ghutchis
                                   No_BTR == 1'b1 ||
1280
                                   (mcycle[1] && I_DJNZ == 1'b1 && IncDecZ == 1'b1) )
1281 2 ghutchis
                            begin
1282 60 ghutchis
                              m1_n <= #1 1'b0;
1283
                              mcycle <= #1 7'b0000001;
1284
                              IntCycle <= #1 1'b0;
1285
                              NMICycle <= #1 1'b0;
1286
                              if (NMI_s == 1'b1 && Prefix == 2'b00 )
1287 2 ghutchis
                                begin
1288 60 ghutchis
                                  NMICycle <= #1 1'b1;
1289
                                  IntE_FF1 <= #1 1'b0;
1290
                                end
1291 2 ghutchis
                              else if ((IntE_FF1 == 1'b1 && INT_s == 1'b1) && Prefix == 2'b00 && SetEI == 1'b0 )
1292
                                begin
1293 60 ghutchis
                                  IntCycle <= #1 1'b1;
1294
                                  IntE_FF1 <= #1 1'b0;
1295
                                  IntE_FF2 <= #1 1'b0;
1296
                                end
1297
                            end
1298 2 ghutchis
                          else
1299
                            begin
1300 60 ghutchis
                              mcycle <= #1 { mcycle[5:0], mcycle[6] };
1301
                            end
1302
                        end
1303
                    end
1304 2 ghutchis
                  else
1305
                    begin   // verilog has no "nor" operator
1306 60 ghutchis
                      if ( ~(Auto_Wait == 1'b1 && Auto_Wait_t2 == 1'b0) &&
1307
                           ~(IOWait == 1 && iorq_i == 1'b1 && Auto_Wait_t1 == 1'b0) )
1308 2 ghutchis
                        begin
1309 60 ghutchis
                          tstate <= #1 { tstate[5:0], tstate[6] };
1310
                        end
1311
                    end
1312
                end
1313
              if (tstate[0])
1314 2 ghutchis
                begin
1315 60 ghutchis
                  m1_n <= #1 1'b0;
1316
                end
1317
            end
1318
        end
1319 2 ghutchis
    end
1320
 
1321
  always @(/*AUTOSENSE*/BTR_r or DI_Reg or IncDec_16 or JumpE or PC
1322 21 ghutchis
           or RegBusA or RegBusC or SP or tstate)
1323 2 ghutchis
    begin
1324
      if (JumpE == 1'b1 )
1325
        begin
1326
          PC16_B = { {8{DI_Reg[7]}}, DI_Reg };
1327 60 ghutchis
        end
1328 2 ghutchis
      else if (BTR_r == 1'b1 )
1329
        begin
1330
          PC16_B = -2;
1331 60 ghutchis
        end
1332 2 ghutchis
      else
1333
        begin
1334
          PC16_B = 1;
1335 60 ghutchis
        end
1336 2 ghutchis
 
1337 21 ghutchis
      if (tstate[3])
1338 2 ghutchis
        begin
1339
          SP16_A = RegBusC;
1340
          SP16_B = { {8{DI_Reg[7]}}, DI_Reg };
1341
        end
1342
      else
1343
        begin
1344
          // suspect that ID16 and SP16 could be shared
1345
          SP16_A = SP;
1346
 
1347
          if (IncDec_16[3] == 1'b1)
1348
            SP16_B = -1;
1349
          else
1350
            SP16_B = 1;
1351
        end
1352
 
1353
      if (IncDec_16[3])
1354
        ID16_B = -1;
1355
      else
1356
        ID16_B = 1;
1357
 
1358
      ID16 = RegBusA + ID16_B;
1359
      PC16 = PC + PC16_B;
1360
      SP16 = SP16_A + SP16_B;
1361
    end // always @ *
1362
 
1363
 
1364
  always @(/*AUTOSENSE*/IntCycle or NMICycle or mcycle)
1365
    begin
1366
      Auto_Wait = 1'b0;
1367
      if (IntCycle == 1'b1 || NMICycle == 1'b1 )
1368
        begin
1369 60 ghutchis
          if (mcycle[0] )
1370 2 ghutchis
            begin
1371 60 ghutchis
              Auto_Wait = 1'b1;
1372
            end
1373
        end
1374 2 ghutchis
    end // always @ *
1375
 
1376
// synopsys dc_script_begin
1377 60 ghutchis
// set_attribute current_design "revision" "$Id: tv80_core.v,v 1.5 2005-01-26 18:55:47 ghutchis Exp $" -type string -quiet
1378 2 ghutchis
// synopsys dc_script_end
1379
endmodule // T80
1380
 

powered by: WebSVN 2.1.0

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