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

Subversion Repositories tv80

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

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

powered by: WebSVN 2.1.0

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