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

Subversion Repositories tv80

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

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 89 ghutchis
  m1_n, iorq, no_read, write, rfsh_n, halt_n, busak_n, A, dout, mc, ts,
28 2 ghutchis
  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 89 ghutchis
  output [7:0]  dout;
64 60 ghutchis
  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 89 ghutchis
  reg [7:0]  dout;
79 60 ghutchis
  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 89 ghutchis
  always @ (posedge clk or negedge reset_n)
374 2 ghutchis
    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 89 ghutchis
          dout <= #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 89 ghutchis
                          TmpAddr[7:0] <= #1 dinst; // Special M1 vector fetch
461 60 ghutchis
                        end
462 2 ghutchis
                      else
463
                        begin
464 60 ghutchis
                          IR <= #1 dinst;
465
                        end
466 2 ghutchis
 
467 60 ghutchis
                      ISet <= #1 2'b00;
468
                      if (Prefix != 2'b00 )
469 2 ghutchis
                        begin
470 60 ghutchis
                          if (Prefix == 2'b11 )
471 2 ghutchis
                            begin
472 60 ghutchis
                              if (IR[5] == 1'b1 )
473 2 ghutchis
                                begin
474 60 ghutchis
                                  XY_State <= #1 2'b10;
475
                                end
476 2 ghutchis
                              else
477
                                begin
478 60 ghutchis
                                  XY_State <= #1 2'b01;
479
                                end
480
                            end
481 2 ghutchis
                          else
482
                            begin
483 60 ghutchis
                              if (Prefix == 2'b10 )
484 2 ghutchis
                                begin
485 60 ghutchis
                                  XY_State <= #1 2'b00;
486
                                  XY_Ind <= #1 1'b0;
487
                                end
488
                              ISet <= #1 Prefix;
489
                            end
490
                        end
491 2 ghutchis
                      else
492
                        begin
493 60 ghutchis
                          XY_State <= #1 2'b00;
494
                          XY_Ind <= #1 1'b0;
495
                        end
496
                    end // if (tstate == 2 && wait_n == 1'b1 )
497 2 ghutchis
 
498
 
499 60 ghutchis
                end
500 2 ghutchis
              else
501
                begin
502 60 ghutchis
                  // either (mcycle > 1) OR (mcycle == 1 AND tstate > 3)
503 2 ghutchis
 
504 60 ghutchis
                  if (mcycle[5] )
505 2 ghutchis
                    begin
506 60 ghutchis
                      XY_Ind <= #1 1'b1;
507
                      if (Prefix == 2'b01 )
508 2 ghutchis
                        begin
509 60 ghutchis
                          ISet <= #1 2'b01;
510
                        end
511
                    end
512 2 ghutchis
 
513 60 ghutchis
                  if (T_Res == 1'b1 )
514 2 ghutchis
                    begin
515 60 ghutchis
                      BTR_r <= #1 (I_BT || I_BC || I_BTR) && ~ No_BTR;
516
                      if (Jump == 1'b1 )
517 2 ghutchis
                        begin
518 60 ghutchis
                          A[15:8] <= #1 DI_Reg;
519
                          A[7:0] <= #1 TmpAddr[7:0];
520
                          PC[15:8] <= #1 DI_Reg;
521
                          PC[7:0] <= #1 TmpAddr[7:0];
522
                        end
523 2 ghutchis
                      else if (JumpXY == 1'b1 )
524
                        begin
525 60 ghutchis
                          A <= #1 RegBusC;
526
                          PC <= #1 RegBusC;
527
                        end else if (Call == 1'b1 || RstP == 1'b1 )
528 2 ghutchis
                          begin
529 60 ghutchis
                            A <= #1 TmpAddr;
530
                            PC <= #1 TmpAddr;
531
                          end
532 21 ghutchis
                        else if (last_mcycle && NMICycle == 1'b1 )
533 2 ghutchis
                          begin
534 60 ghutchis
                            A <= #1 16'b0000000001100110;
535
                            PC <= #1 16'b0000000001100110;
536
                          end
537 21 ghutchis
                        else if (mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 )
538 2 ghutchis
                          begin
539 60 ghutchis
                            A[15:8] <= #1 I;
540
                            A[7:0] <= #1 TmpAddr[7:0];
541
                            PC[15:8] <= #1 I;
542
                            PC[7:0] <= #1 TmpAddr[7:0];
543
                          end
544 2 ghutchis
                        else
545
                          begin
546 60 ghutchis
                            case (Set_Addr_To)
547
                              aXY :
548 2 ghutchis
                                begin
549 60 ghutchis
                                  if (XY_State == 2'b00 )
550 2 ghutchis
                                    begin
551 60 ghutchis
                                      A <= #1 RegBusC;
552
                                    end
553 2 ghutchis
                                  else
554
                                    begin
555 60 ghutchis
                                      if (NextIs_XY_Fetch == 1'b1 )
556 2 ghutchis
                                        begin
557 60 ghutchis
                                          A <= #1 PC;
558
                                        end
559 2 ghutchis
                                      else
560
                                        begin
561 60 ghutchis
                                          A <= #1 TmpAddr;
562
                                        end
563
                                    end // else: !if(XY_State == 2'b00 )
564 2 ghutchis
                                end // case: aXY
565
 
566 60 ghutchis
                              aIOA :
567 2 ghutchis
                                begin
568 60 ghutchis
                                  if (Mode == 3 )
569 2 ghutchis
                                    begin
570 60 ghutchis
                                      // Memory map I/O on GBZ80
571
                                      A[15:8] <= #1 8'hFF;
572
                                    end
573 2 ghutchis
                                  else if (Mode == 2 )
574
                                    begin
575 60 ghutchis
                                      // Duplicate I/O address on 8080
576
                                      A[15:8] <= #1 DI_Reg;
577
                                    end
578 2 ghutchis
                                  else
579
                                    begin
580 60 ghutchis
                                      A[15:8] <= #1 ACC;
581
                                    end
582
                                  A[7:0] <= #1 DI_Reg;
583 2 ghutchis
                                end // case: aIOA
584
 
585
 
586 60 ghutchis
                              aSP :
587 2 ghutchis
                                begin
588 60 ghutchis
                                  A <= #1 SP;
589 2 ghutchis
                                end
590
 
591 60 ghutchis
                              aBC :
592 2 ghutchis
                                begin
593 60 ghutchis
                                  if (Mode == 3 && iorq_i == 1'b1 )
594 2 ghutchis
                                    begin
595 60 ghutchis
                                      // Memory map I/O on GBZ80
596
                                      A[15:8] <= #1 8'hFF;
597
                                      A[7:0] <= #1 RegBusC[7:0];
598
                                    end
599 2 ghutchis
                                  else
600
                                    begin
601 60 ghutchis
                                      A <= #1 RegBusC;
602
                                    end
603 2 ghutchis
                                end // case: aBC
604
 
605 60 ghutchis
                              aDE :
606 2 ghutchis
                                begin
607 60 ghutchis
                                  A <= #1 RegBusC;
608 2 ghutchis
                                end
609
 
610 60 ghutchis
                              aZI :
611 2 ghutchis
                                begin
612 60 ghutchis
                                  if (Inc_WZ == 1'b1 )
613 2 ghutchis
                                    begin
614 60 ghutchis
                                      A <= #1 TmpAddr + 1;
615
                                    end
616 2 ghutchis
                                  else
617
                                    begin
618 60 ghutchis
                                      A[15:8] <= #1 DI_Reg;
619
                                      A[7:0] <= #1 TmpAddr[7:0];
620
                                    end
621 2 ghutchis
                                end // case: aZI
622
 
623 60 ghutchis
                              default   :
624 2 ghutchis
                                begin
625 60 ghutchis
                                  A <= #1 PC;
626 2 ghutchis
                                end
627 60 ghutchis
                            endcase // case(Set_Addr_To)
628 2 ghutchis
 
629 60 ghutchis
                          end // else: !if(mcycle[2] && IntCycle == 1'b1 && IStatus == 2'b10 )
630 2 ghutchis
 
631
 
632 60 ghutchis
                      Save_ALU_r <= #1 Save_ALU;
633
                      ALU_Op_r <= #1 ALU_Op;
634 2 ghutchis
 
635 60 ghutchis
                      if (I_CPL == 1'b1 )
636 2 ghutchis
                        begin
637 60 ghutchis
                          // CPL
638
                          ACC <= #1 ~ ACC;
639
                          F[Flag_Y] <= #1 ~ ACC[5];
640
                          F[Flag_H] <= #1 1'b1;
641
                          F[Flag_X] <= #1 ~ ACC[3];
642
                          F[Flag_N] <= #1 1'b1;
643
                        end
644
                      if (I_CCF == 1'b1 )
645 2 ghutchis
                        begin
646 60 ghutchis
                          // CCF
647
                          F[Flag_C] <= #1 ~ F[Flag_C];
648
                          F[Flag_Y] <= #1 ACC[5];
649
                          F[Flag_H] <= #1 F[Flag_C];
650
                          F[Flag_X] <= #1 ACC[3];
651
                          F[Flag_N] <= #1 1'b0;
652
                        end
653
                      if (I_SCF == 1'b1 )
654 2 ghutchis
                        begin
655 60 ghutchis
                          // SCF
656
                          F[Flag_C] <= #1 1'b1;
657
                          F[Flag_Y] <= #1 ACC[5];
658
                          F[Flag_H] <= #1 1'b0;
659
                          F[Flag_X] <= #1 ACC[3];
660
                          F[Flag_N] <= #1 1'b0;
661
                        end
662
                    end // if (T_Res == 1'b1 )
663 2 ghutchis
 
664
 
665 60 ghutchis
                  if (tstate[2] && wait_n == 1'b1 )
666 2 ghutchis
                    begin
667 60 ghutchis
                      if (ISet == 2'b01 && mcycle[6] )
668 2 ghutchis
                        begin
669 60 ghutchis
                          IR <= #1 dinst;
670
                        end
671
                      if (JumpE == 1'b1 )
672 2 ghutchis
                        begin
673
                          PC <= #1 PC16;
674 60 ghutchis
                        end
675 2 ghutchis
                      else if (Inc_PC == 1'b1 )
676
                        begin
677 60 ghutchis
                          //PC <= #1 PC + 1;
678 2 ghutchis
                          PC <= #1 PC16;
679 60 ghutchis
                        end
680
                      if (BTR_r == 1'b1 )
681 2 ghutchis
                        begin
682 60 ghutchis
                          //PC <= #1 PC - 2;
683 2 ghutchis
                          PC <= #1 PC16;
684 60 ghutchis
                        end
685
                      if (RstP == 1'b1 )
686 2 ghutchis
                        begin
687
                          TmpAddr <= #1 { 10'h0, IR[5:3], 3'h0 };
688 60 ghutchis
                          //TmpAddr <= #1 (others =>1'b0);
689
                          //TmpAddr[5:3] <= #1 IR[5:3];
690
                        end
691
                    end
692
                  if (tstate[3] && mcycle[5] )
693 2 ghutchis
                    begin
694
                      TmpAddr <= #1 SP16;
695 60 ghutchis
                    end
696 2 ghutchis
 
697 60 ghutchis
                  if ((tstate[2] && wait_n == 1'b1) || (tstate[4] && mcycle[0]) )
698 2 ghutchis
                    begin
699 60 ghutchis
                      if (IncDec_16[2:0] == 3'b111 )
700 2 ghutchis
                        begin
701
                          SP <= #1 SP16;
702 60 ghutchis
                        end
703
                    end
704 2 ghutchis
 
705 60 ghutchis
                  if (LDSPHL == 1'b1 )
706 2 ghutchis
                    begin
707 60 ghutchis
                      SP <= #1 RegBusC;
708
                    end
709
                  if (ExchangeAF == 1'b1 )
710 2 ghutchis
                    begin
711 60 ghutchis
                      Ap <= #1 ACC;
712
                      ACC <= #1 Ap;
713
                      Fp <= #1 F;
714
                      F <= #1 Fp;
715
                    end
716
                  if (ExchangeRS == 1'b1 )
717 2 ghutchis
                    begin
718 60 ghutchis
                      Alternate <= #1 ~ Alternate;
719
                    end
720
                end // else: !if(mcycle  == 3'b001 && tstate(2) == 1'b0 )
721 2 ghutchis
 
722
 
723 60 ghutchis
              if (tstate[3] )
724 2 ghutchis
                begin
725 60 ghutchis
                  if (LDZ == 1'b1 )
726 2 ghutchis
                    begin
727 60 ghutchis
                      TmpAddr[7:0] <= #1 DI_Reg;
728
                    end
729
                  if (LDW == 1'b1 )
730 2 ghutchis
                    begin
731 60 ghutchis
                      TmpAddr[15:8] <= #1 DI_Reg;
732
                    end
733 2 ghutchis
 
734 60 ghutchis
                  if (Special_LD[2] == 1'b1 )
735 2 ghutchis
                    begin
736 60 ghutchis
                      case (Special_LD[1:0])
737
                        2'b00 :
738 2 ghutchis
                          begin
739 60 ghutchis
                            ACC <= #1 I;
740
                            F[Flag_P] <= #1 IntE_FF2;
741 2 ghutchis
                          end
742
 
743 60 ghutchis
                        2'b01 :
744 2 ghutchis
                          begin
745 87 ghutchis
                            `ifdef TV80_REFRESH
746 60 ghutchis
                            ACC <= #1 R;
747 87 ghutchis
                            `else
748
                            ACC <= #1 0;
749
                            `endif
750 60 ghutchis
                            F[Flag_P] <= #1 IntE_FF2;
751 2 ghutchis
                          end
752
 
753 60 ghutchis
                        2'b10 :
754
                          I <= #1 ACC;
755
 
756
                        `ifdef TV80_REFRESH
757
                        default :
758
                          R <= #1 ACC;
759
                        `else
760
                        default : ;
761
                        `endif
762
                      endcase
763
                    end
764
                end // if (tstate == 3 )
765 2 ghutchis
 
766
 
767 60 ghutchis
              if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 )
768 2 ghutchis
                begin
769 60 ghutchis
                  if (Mode == 3 )
770 2 ghutchis
                    begin
771 60 ghutchis
                      F[6] <= #1 F_Out[6];
772
                      F[5] <= #1 F_Out[5];
773
                      F[7] <= #1 F_Out[7];
774
                      if (PreserveC_r == 1'b0 )
775 2 ghutchis
                        begin
776 60 ghutchis
                          F[4] <= #1 F_Out[4];
777
                        end
778
                    end
779 2 ghutchis
                  else
780
                    begin
781 60 ghutchis
                      F[7:1] <= #1 F_Out[7:1];
782
                      if (PreserveC_r == 1'b0 )
783 2 ghutchis
                        begin
784 60 ghutchis
                          F[Flag_C] <= #1 F_Out[0];
785
                        end
786
                    end
787
                end // if ((I_DJNZ == 1'b0 && Save_ALU_r == 1'b1) || ALU_Op_r == 4'b1001 )
788 2 ghutchis
 
789 60 ghutchis
              if (T_Res == 1'b1 && I_INRC == 1'b1 )
790 2 ghutchis
                begin
791 60 ghutchis
                  F[Flag_H] <= #1 1'b0;
792
                  F[Flag_N] <= #1 1'b0;
793
                  if (DI_Reg[7:0] == 8'b00000000 )
794 2 ghutchis
                    begin
795 60 ghutchis
                      F[Flag_Z] <= #1 1'b1;
796
                    end
797 2 ghutchis
                  else
798
                    begin
799 60 ghutchis
                      F[Flag_Z] <= #1 1'b0;
800
                    end
801
                  F[Flag_S] <= #1 DI_Reg[7];
802
                  F[Flag_P] <= #1 ~ (^DI_Reg[7:0]);
803
                end // if (T_Res == 1'b1 && I_INRC == 1'b1 )
804 2 ghutchis
 
805
 
806 60 ghutchis
              if (tstate[1] && Auto_Wait_t1 == 1'b0 )
807 2 ghutchis
                begin
808 89 ghutchis
                  dout <= #1 BusB;
809 60 ghutchis
                  if (I_RLD == 1'b1 )
810 2 ghutchis
                    begin
811 89 ghutchis
                      dout[3:0] <= #1 BusA[3:0];
812
                      dout[7:4] <= #1 BusB[3:0];
813 60 ghutchis
                    end
814
                  if (I_RRD == 1'b1 )
815 2 ghutchis
                    begin
816 89 ghutchis
                      dout[3:0] <= #1 BusB[7:4];
817
                      dout[7:4] <= #1 BusA[3:0];
818 60 ghutchis
                    end
819
                end
820 2 ghutchis
 
821 60 ghutchis
              if (T_Res == 1'b1 )
822 2 ghutchis
                begin
823 60 ghutchis
                  Read_To_Reg_r[3:0] <= #1 Set_BusA_To;
824
                  Read_To_Reg_r[4] <= #1 Read_To_Reg;
825
                  if (Read_To_Acc == 1'b1 )
826 2 ghutchis
                    begin
827 60 ghutchis
                      Read_To_Reg_r[3:0] <= #1 4'b0111;
828
                      Read_To_Reg_r[4] <= #1 1'b1;
829
                    end
830
                end
831 2 ghutchis
 
832 60 ghutchis
              if (tstate[1] && I_BT == 1'b1 )
833 2 ghutchis
                begin
834 60 ghutchis
                  F[Flag_X] <= #1 ALU_Q[3];
835
                  F[Flag_Y] <= #1 ALU_Q[1];
836
                  F[Flag_H] <= #1 1'b0;
837
                  F[Flag_N] <= #1 1'b0;
838
                end
839
              if (I_BC == 1'b1 || I_BT == 1'b1 )
840 2 ghutchis
                begin
841 60 ghutchis
                  F[Flag_P] <= #1 IncDecZ;
842
                end
843 2 ghutchis
 
844 60 ghutchis
              if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||
845
                  (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) )
846 2 ghutchis
                begin
847 60 ghutchis
                  case (Read_To_Reg_r)
848
                    5'b10111 :
849
                      ACC <= #1 Save_Mux;
850
                    5'b10110 :
851 89 ghutchis
                      dout <= #1 Save_Mux;
852 60 ghutchis
                    5'b11000 :
853
                      SP[7:0] <= #1 Save_Mux;
854
                    5'b11001 :
855
                      SP[15:8] <= #1 Save_Mux;
856
                    5'b11011 :
857
                      F <= #1 Save_Mux;
858
                  endcase
859
                end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||...              
860
            end // if (ClkEn == 1'b1 )         
861
        end // else: !if(reset_n == 1'b0 )
862 2 ghutchis
    end
863
 
864
 
865
  //-------------------------------------------------------------------------
866
  //
867
  // BC('), DE('), HL('), IX && IY
868
  //
869
  //-------------------------------------------------------------------------
870
  always @ (posedge clk)
871
    begin
872
      if (ClkEn == 1'b1 )
873
        begin
874 60 ghutchis
          // Bus A / Write
875
          RegAddrA_r <= #1  { Alternate, Set_BusA_To[2:1] };
876
          if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusA_To[2:1] == 2'b10 )
877 2 ghutchis
            begin
878 60 ghutchis
              RegAddrA_r <= #1 { XY_State[1],  2'b11 };
879
            end
880 2 ghutchis
 
881 60 ghutchis
          // Bus B
882
          RegAddrB_r <= #1 { Alternate, Set_BusB_To[2:1] };
883
          if (XY_Ind == 1'b0 && XY_State != 2'b00 && Set_BusB_To[2:1] == 2'b10 )
884 2 ghutchis
            begin
885 60 ghutchis
              RegAddrB_r <= #1 { XY_State[1],  2'b11 };
886
            end
887 2 ghutchis
 
888 60 ghutchis
          // Address from register
889
          RegAddrC <= #1 { Alternate,  Set_Addr_To[1:0] };
890
          // Jump (HL), LD SP,HL
891
          if ((JumpXY == 1'b1 || LDSPHL == 1'b1) )
892 2 ghutchis
            begin
893 60 ghutchis
              RegAddrC <= #1 { Alternate, 2'b10 };
894
            end
895
          if (((JumpXY == 1'b1 || LDSPHL == 1'b1) && XY_State != 2'b00) || (mcycle[5]) )
896 2 ghutchis
            begin
897 60 ghutchis
              RegAddrC <= #1 { XY_State[1],  2'b11 };
898
            end
899 2 ghutchis
 
900 60 ghutchis
          if (I_DJNZ == 1'b1 && Save_ALU_r == 1'b1 && Mode < 2 )
901 2 ghutchis
            begin
902 60 ghutchis
              IncDecZ <= #1 F_Out[Flag_Z];
903
            end
904
          if ((tstate[2] || (tstate[3] && mcycle[0])) && IncDec_16[2:0] == 3'b100 )
905 2 ghutchis
            begin
906 60 ghutchis
              if (ID16 == 0 )
907 2 ghutchis
                begin
908 60 ghutchis
                  IncDecZ <= #1 1'b0;
909
                end
910 2 ghutchis
              else
911
                begin
912 60 ghutchis
                  IncDecZ <= #1 1'b1;
913
                end
914
            end
915 2 ghutchis
 
916 60 ghutchis
          RegBusA_r <= #1 RegBusA;
917
        end
918 2 ghutchis
 
919
    end // always @ (posedge clk)
920
 
921
 
922
  always @(/*AUTOSENSE*/Alternate or ExchangeDH or IncDec_16
923 21 ghutchis
           or RegAddrA_r or RegAddrB_r or XY_State or mcycle or tstate)
924 2 ghutchis
    begin
925 21 ghutchis
      if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && XY_State == 2'b00)
926 2 ghutchis
        RegAddrA = { Alternate, IncDec_16[1:0] };
927 21 ghutchis
      else if ((tstate[2] || (tstate[3] && mcycle[0] && IncDec_16[2] == 1'b1)) && IncDec_16[1:0] == 2'b10)
928 2 ghutchis
        RegAddrA = { XY_State[1], 2'b11 };
929 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[3])
930 2 ghutchis
        RegAddrA = { Alternate, 2'b10 };
931 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[4])
932 60 ghutchis
        RegAddrA = { Alternate, 2'b01 };
933 2 ghutchis
      else
934
        RegAddrA = RegAddrA_r;
935
 
936 21 ghutchis
      if (ExchangeDH == 1'b1 && tstate[3])
937 2 ghutchis
        RegAddrB = { Alternate, 2'b01 };
938
      else
939
        RegAddrB = RegAddrB_r;
940
    end // always @ *
941
 
942
 
943
  always @(/*AUTOSENSE*/ALU_Op_r or Auto_Wait_t1 or ExchangeDH
944 21 ghutchis
           or IncDec_16 or Read_To_Reg_r or Save_ALU_r or mcycle
945
           or tstate or wait_n)
946 2 ghutchis
    begin
947
      RegWEH = 1'b0;
948
      RegWEL = 1'b0;
949 21 ghutchis
      if ((tstate[1] && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||
950 60 ghutchis
          (Save_ALU_r == 1'b1 && ALU_Op_r != 4'b0111) )
951 2 ghutchis
        begin
952 60 ghutchis
          case (Read_To_Reg_r)
953
            5'b10000 , 5'b10001 , 5'b10010 , 5'b10011 , 5'b10100 , 5'b10101 :
954 2 ghutchis
              begin
955 60 ghutchis
                RegWEH = ~ Read_To_Reg_r[0];
956
                RegWEL = Read_To_Reg_r[0];
957 2 ghutchis
              end
958
          endcase // case(Read_To_Reg_r)
959
 
960 60 ghutchis
        end // if ((tstate == 1 && Save_ALU_r == 1'b0 && Auto_Wait_t1 == 1'b0) ||...
961 2 ghutchis
 
962
 
963 21 ghutchis
      if (ExchangeDH == 1'b1 && (tstate[3] || tstate[4]) )
964 2 ghutchis
        begin
965 60 ghutchis
          RegWEH = 1'b1;
966
          RegWEL = 1'b1;
967
        end
968 2 ghutchis
 
969 21 ghutchis
      if (IncDec_16[2] == 1'b1 && ((tstate[2] && wait_n == 1'b1 && mcycle != 3'b001) || (tstate[3] && mcycle[0])) )
970 2 ghutchis
        begin
971 60 ghutchis
          case (IncDec_16[1:0])
972
            2'b00 , 2'b01 , 2'b10 :
973 2 ghutchis
              begin
974 60 ghutchis
                RegWEH = 1'b1;
975
                RegWEL = 1'b1;
976 2 ghutchis
              end
977 60 ghutchis
          endcase
978
        end
979 2 ghutchis
    end // always @ *
980
 
981
 
982
  always @(/*AUTOSENSE*/ExchangeDH or ID16 or IncDec_16 or RegBusA_r
983 21 ghutchis
           or RegBusB or Save_Mux or mcycle or tstate)
984 2 ghutchis
    begin
985
      RegDIH = Save_Mux;
986
      RegDIL = Save_Mux;
987
 
988 21 ghutchis
      if (ExchangeDH == 1'b1 && tstate[3] )
989 2 ghutchis
        begin
990 60 ghutchis
          RegDIH = RegBusB[15:8];
991
          RegDIL = RegBusB[7:0];
992
        end
993 21 ghutchis
      else if (ExchangeDH == 1'b1 && tstate[4] )
994 2 ghutchis
        begin
995 60 ghutchis
          RegDIH = RegBusA_r[15:8];
996
          RegDIL = RegBusA_r[7:0];
997
        end
998 21 ghutchis
      else if (IncDec_16[2] == 1'b1 && ((tstate[2] && mcycle != 3'b001) || (tstate[3] && mcycle[0])) )
999 2 ghutchis
        begin
1000 60 ghutchis
          RegDIH = ID16[15:8];
1001
          RegDIL = ID16[7:0];
1002
        end
1003 2 ghutchis
    end
1004
 
1005
  tv80_reg i_reg
1006
    (
1007
     .clk                  (clk),
1008
     .CEN                  (ClkEn),
1009
     .WEH                  (RegWEH),
1010
     .WEL                  (RegWEL),
1011
     .AddrA                (RegAddrA),
1012
     .AddrB                (RegAddrB),
1013
     .AddrC                (RegAddrC),
1014
     .DIH                  (RegDIH),
1015
     .DIL                  (RegDIL),
1016
     .DOAH                 (RegBusA[15:8]),
1017
     .DOAL                 (RegBusA[7:0]),
1018
     .DOBH                 (RegBusB[15:8]),
1019
     .DOBL                 (RegBusB[7:0]),
1020
     .DOCH                 (RegBusC[15:8]),
1021
     .DOCL                 (RegBusC[7:0])
1022
     );
1023
 
1024
  //-------------------------------------------------------------------------
1025
  //
1026
  // Buses
1027
  //
1028
  //-------------------------------------------------------------------------
1029
 
1030
  always @ (posedge clk)
1031
    begin
1032
      if (ClkEn == 1'b1 )
1033
        begin
1034 60 ghutchis
          case (Set_BusB_To)
1035
            4'b0111 :
1036
              BusB <= #1 ACC;
1037
            4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 :
1038 2 ghutchis
              begin
1039 60 ghutchis
                if (Set_BusB_To[0] == 1'b1 )
1040 2 ghutchis
                  begin
1041 60 ghutchis
                    BusB <= #1 RegBusB[7:0];
1042
                  end
1043 2 ghutchis
                else
1044
                  begin
1045 60 ghutchis
                    BusB <= #1 RegBusB[15:8];
1046
                  end
1047 2 ghutchis
              end
1048 60 ghutchis
            4'b0110 :
1049
              BusB <= #1 DI_Reg;
1050
            4'b1000 :
1051
              BusB <= #1 SP[7:0];
1052
            4'b1001 :
1053
              BusB <= #1 SP[15:8];
1054
            4'b1010 :
1055
              BusB <= #1 8'b00000001;
1056
            4'b1011 :
1057
              BusB <= #1 F;
1058
            4'b1100 :
1059
              BusB <= #1 PC[7:0];
1060
            4'b1101 :
1061
              BusB <= #1 PC[15:8];
1062
            4'b1110 :
1063
              BusB <= #1 8'b00000000;
1064
            default :
1065 87 ghutchis
              BusB <= #1 8'h0;
1066 60 ghutchis
          endcase
1067 2 ghutchis
 
1068 60 ghutchis
          case (Set_BusA_To)
1069
            4'b0111 :
1070
              BusA <= #1 ACC;
1071
            4'b0000 , 4'b0001 , 4'b0010 , 4'b0011 , 4'b0100 , 4'b0101 :
1072 2 ghutchis
              begin
1073 60 ghutchis
                if (Set_BusA_To[0] == 1'b1 )
1074 2 ghutchis
                  begin
1075 60 ghutchis
                    BusA <= #1 RegBusA[7:0];
1076
                  end
1077 2 ghutchis
                else
1078
                  begin
1079 60 ghutchis
                    BusA <= #1 RegBusA[15:8];
1080
                  end
1081 2 ghutchis
              end
1082 60 ghutchis
            4'b0110 :
1083
              BusA <= #1 DI_Reg;
1084
            4'b1000 :
1085
              BusA <= #1 SP[7:0];
1086
            4'b1001 :
1087
              BusA <= #1 SP[15:8];
1088
            4'b1010 :
1089
              BusA <= #1 8'b00000000;
1090
            default :
1091 87 ghutchis
              BusA <= #1  8'h0;
1092 60 ghutchis
          endcase
1093
        end
1094 2 ghutchis
    end
1095
 
1096
  //-------------------------------------------------------------------------
1097
  //
1098
  // Generate external control signals
1099
  //
1100
  //-------------------------------------------------------------------------
1101 60 ghutchis
`ifdef TV80_REFRESH
1102 89 ghutchis
  always @ (posedge clk or negedge reset_n)
1103 2 ghutchis
    begin
1104
      if (reset_n == 1'b0 )
1105
        begin
1106 60 ghutchis
          rfsh_n <= #1 1'b1;
1107
        end
1108 2 ghutchis
      else
1109
        begin
1110 60 ghutchis
          if (cen == 1'b1 )
1111 2 ghutchis
            begin
1112 60 ghutchis
              if (mcycle[0] && ((tstate[2]  && wait_n == 1'b1) || tstate[3]) )
1113 2 ghutchis
                begin
1114 60 ghutchis
                  rfsh_n <= #1 1'b0;
1115
                end
1116 2 ghutchis
              else
1117
                begin
1118 60 ghutchis
                  rfsh_n <= #1 1'b1;
1119
                end
1120
            end
1121
        end
1122 87 ghutchis
    end // always @ (posedge clk or negedge reset_n)
1123
`else // !`ifdef TV80_REFRESH
1124
  assign rfsh_n = 1'b1;
1125 60 ghutchis
`endif
1126 2 ghutchis
 
1127
  always @(/*AUTOSENSE*/BusAck or Halt_FF or I_DJNZ or IntCycle
1128 21 ghutchis
           or IntE_FF1 or di or iorq_i or mcycle or tstate)
1129 2 ghutchis
    begin
1130
      mc = mcycle;
1131
      ts = tstate;
1132
      DI_Reg = di;
1133
      halt_n = ~ Halt_FF;
1134
      busak_n = ~ BusAck;
1135
      intcycle_n = ~ IntCycle;
1136
      IntE = IntE_FF1;
1137
      iorq = iorq_i;
1138
      stop = I_DJNZ;
1139
    end
1140
 
1141
  //-----------------------------------------------------------------------
1142
  //
1143
  // Syncronise inputs
1144
  //
1145
  //-----------------------------------------------------------------------
1146
 
1147 89 ghutchis
  always @ (posedge clk or negedge reset_n)
1148 2 ghutchis
    begin : sync_inputs
1149 89 ghutchis
      if (~reset_n)
1150 2 ghutchis
        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 89 ghutchis
  always @ (posedge clk or negedge reset_n)
1182 2 ghutchis
    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 89 ghutchis
                  Auto_Wait_t1 <= #1 Auto_Wait || (iorq_i & ~Auto_Wait_t2);
1210 60 ghutchis
                end
1211 89 ghutchis
              Auto_Wait_t2 <= #1 Auto_Wait_t1 & !T_Res;
1212 60 ghutchis
              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 89 ghutchis
                      if (!NMICycle)
1220
                        IntE_FF1 <= #1 1'b1;
1221 60 ghutchis
                      IntE_FF2 <= #1 1'b1;
1222
                    end
1223
                  if (I_RETN == 1'b1 )
1224 2 ghutchis
                    begin
1225 60 ghutchis
                      IntE_FF1 <= #1 IntE_FF2;
1226
                    end
1227
                end
1228
              if (tstate[3] )
1229 2 ghutchis
                begin
1230 60 ghutchis
                  if (SetDI == 1'b1 )
1231 2 ghutchis
                    begin
1232 60 ghutchis
                      IntE_FF1 <= #1 1'b0;
1233
                      IntE_FF2 <= #1 1'b0;
1234
                    end
1235
                end
1236
              if (IntCycle == 1'b1 || NMICycle == 1'b1 )
1237 2 ghutchis
                begin
1238 60 ghutchis
                  Halt_FF <= #1 1'b0;
1239
                end
1240
              if (mcycle[0] && tstate[2] && wait_n == 1'b1 )
1241 2 ghutchis
                begin
1242 60 ghutchis
                  m1_n <= #1 1'b1;
1243
                end
1244
              if (BusReq_s == 1'b1 && BusAck == 1'b1 )
1245 2 ghutchis
                begin
1246
                end
1247
              else
1248
                begin
1249 60 ghutchis
                  BusAck <= #1 1'b0;
1250
                  if (tstate[2] && wait_n == 1'b0 )
1251 2 ghutchis
                    begin
1252 60 ghutchis
                    end
1253 2 ghutchis
                  else if (T_Res == 1'b1 )
1254
                    begin
1255 60 ghutchis
                      if (Halt == 1'b1 )
1256 2 ghutchis
                        begin
1257 60 ghutchis
                          Halt_FF <= #1 1'b1;
1258
                        end
1259
                      if (BusReq_s == 1'b1 )
1260 2 ghutchis
                        begin
1261 60 ghutchis
                          BusAck <= #1 1'b1;
1262
                        end
1263 2 ghutchis
                      else
1264
                        begin
1265 60 ghutchis
                          tstate <= #1 7'b0000010;
1266
                          if (NextIs_XY_Fetch == 1'b1 )
1267 2 ghutchis
                            begin
1268 60 ghutchis
                              mcycle <= #1 7'b0100000;
1269 88 ghutchis
                              Pre_XY_F_M <= #1 mcyc_to_number(mcycle);
1270 60 ghutchis
                              if (IR == 8'b00110110 && Mode == 0 )
1271 2 ghutchis
                                begin
1272 60 ghutchis
                                  Pre_XY_F_M <= #1 3'b010;
1273
                                end
1274
                            end
1275 21 ghutchis
                          else if ((mcycle[6]) || (mcycle[5] && Mode == 1 && ISet != 2'b01) )
1276 2 ghutchis
                            begin
1277 60 ghutchis
                              mcycle <= #1 number_to_bitvec(Pre_XY_F_M + 1);
1278
                            end
1279 21 ghutchis
                          else if ((last_mcycle) ||
1280 60 ghutchis
                                   No_BTR == 1'b1 ||
1281
                                   (mcycle[1] && I_DJNZ == 1'b1 && IncDecZ == 1'b1) )
1282 2 ghutchis
                            begin
1283 60 ghutchis
                              m1_n <= #1 1'b0;
1284
                              mcycle <= #1 7'b0000001;
1285
                              IntCycle <= #1 1'b0;
1286
                              NMICycle <= #1 1'b0;
1287
                              if (NMI_s == 1'b1 && Prefix == 2'b00 )
1288 2 ghutchis
                                begin
1289 60 ghutchis
                                  NMICycle <= #1 1'b1;
1290
                                  IntE_FF1 <= #1 1'b0;
1291
                                end
1292 2 ghutchis
                              else if ((IntE_FF1 == 1'b1 && INT_s == 1'b1) && Prefix == 2'b00 && SetEI == 1'b0 )
1293
                                begin
1294 60 ghutchis
                                  IntCycle <= #1 1'b1;
1295
                                  IntE_FF1 <= #1 1'b0;
1296
                                  IntE_FF2 <= #1 1'b0;
1297
                                end
1298
                            end
1299 2 ghutchis
                          else
1300
                            begin
1301 60 ghutchis
                              mcycle <= #1 { mcycle[5:0], mcycle[6] };
1302
                            end
1303
                        end
1304
                    end
1305 2 ghutchis
                  else
1306
                    begin   // verilog has no "nor" operator
1307 60 ghutchis
                      if ( ~(Auto_Wait == 1'b1 && Auto_Wait_t2 == 1'b0) &&
1308
                           ~(IOWait == 1 && iorq_i == 1'b1 && Auto_Wait_t1 == 1'b0) )
1309 2 ghutchis
                        begin
1310 60 ghutchis
                          tstate <= #1 { tstate[5:0], tstate[6] };
1311
                        end
1312
                    end
1313
                end
1314
              if (tstate[0])
1315 2 ghutchis
                begin
1316 60 ghutchis
                  m1_n <= #1 1'b0;
1317
                end
1318
            end
1319
        end
1320 2 ghutchis
    end
1321
 
1322
  always @(/*AUTOSENSE*/BTR_r or DI_Reg or IncDec_16 or JumpE or PC
1323 21 ghutchis
           or RegBusA or RegBusC or SP or tstate)
1324 2 ghutchis
    begin
1325
      if (JumpE == 1'b1 )
1326
        begin
1327
          PC16_B = { {8{DI_Reg[7]}}, DI_Reg };
1328 60 ghutchis
        end
1329 2 ghutchis
      else if (BTR_r == 1'b1 )
1330
        begin
1331
          PC16_B = -2;
1332 60 ghutchis
        end
1333 2 ghutchis
      else
1334
        begin
1335
          PC16_B = 1;
1336 60 ghutchis
        end
1337 2 ghutchis
 
1338 21 ghutchis
      if (tstate[3])
1339 2 ghutchis
        begin
1340
          SP16_A = RegBusC;
1341
          SP16_B = { {8{DI_Reg[7]}}, DI_Reg };
1342
        end
1343
      else
1344
        begin
1345
          // suspect that ID16 and SP16 could be shared
1346
          SP16_A = SP;
1347
 
1348
          if (IncDec_16[3] == 1'b1)
1349
            SP16_B = -1;
1350
          else
1351
            SP16_B = 1;
1352
        end
1353
 
1354
      if (IncDec_16[3])
1355
        ID16_B = -1;
1356
      else
1357
        ID16_B = 1;
1358
 
1359
      ID16 = RegBusA + ID16_B;
1360
      PC16 = PC + PC16_B;
1361
      SP16 = SP16_A + SP16_B;
1362
    end // always @ *
1363
 
1364
 
1365
  always @(/*AUTOSENSE*/IntCycle or NMICycle or mcycle)
1366
    begin
1367
      Auto_Wait = 1'b0;
1368
      if (IntCycle == 1'b1 || NMICycle == 1'b1 )
1369
        begin
1370 60 ghutchis
          if (mcycle[0] )
1371 2 ghutchis
            begin
1372 60 ghutchis
              Auto_Wait = 1'b1;
1373
            end
1374
        end
1375 2 ghutchis
    end // always @ *
1376
 
1377
endmodule // T80
1378
 

powered by: WebSVN 2.1.0

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