Revision 685
Added by markw over 7 years ago
| ultimate_cart/veronica/FT816.v | ||
|---|---|---|
| 
     reg cpu_clk_en;
 
   | 
||
| 
     reg clk_en;
 
   | 
||
| 
     wire clkx;
 
   | 
||
| 
     //FIXME TODO XXX BUFGCE u20 (.CE(cpu_clk_en), .I(clk), .O(clkx) );
 
   | 
||
| 
     //BUFGCE u20 (.CE(cpu_clk_en), .I(clk), .O(clkx) );
 
   | 
||
| 
     assign clkx = clk;
 
   | 
||
| 
     assign clko = clkx;
 
   | 
||
| 
     //assign clkx = clk;
 
   | 
||
| ... | ... | |
| 
     		`EOR_IMM,`EOR_ZP,`EOR_ZPX,`EOR_IX,`EOR_IY,`EOR_IYL,`EOR_ABS,`EOR_ABSX,`EOR_ABSY,`EOR_AL,`EOR_ALX,`EOR_I,`EOR_IL,`EOR_DSP,`EOR_DSPIY:	begin res16 <= acc16 ^ b16; end
 
   | 
||
| 
     		`LDA_IMM,`LDA_ZP,`LDA_ZPX,`LDA_IX,`LDA_IY,`LDA_IYL,`LDA_ABS,`LDA_ABSX,`LDA_ABSY,`LDA_AL,`LDA_ALX,`LDA_I,`LDA_IL,`LDA_DSP,`LDA_DSPIY:	begin res16 <= b16; end
 
   | 
||
| 
     		`BIT_IMM,`BIT_ZP,`BIT_ZPX,`BIT_ABS,`BIT_ABSX:	begin res16 <= acc16 & b16; end
 
   | 
||
| 
     		`TRB_ZP,`TRB_ABS:	begin res16 <= ~acc16 & b16; wdat <= ~acc16 & b16; state <= STORE1; data_nack(); end
 
   | 
||
| 
     		`TSB_ZP,`TSB_ABS:	begin res16 <= acc16 | b16; wdat <= acc16 | b16; state <= STORE1; data_nack(); end
 
   | 
||
| 
     		`TRB_ZP,`TRB_ABS:	begin res16 <= acc16 & b16; wdat <= ~acc16 & b16; state <= STORE1; data_nack(); end
 
   | 
||
| 
     		`TSB_ZP,`TSB_ABS:	begin res16 <= acc16 & b16; wdat <= acc16 | b16; state <= STORE1; data_nack(); end
 
   | 
||
| 
     		`LDX_IMM,`LDX_ZP,`LDX_ZPY,`LDX_ABS,`LDX_ABSY:	begin res16 <= b16; end
 
   | 
||
| 
     		`LDY_IMM,`LDY_ZP,`LDY_ZPX,`LDY_ABS,`LDY_ABSX:	begin res16 <= b16; end
 
   | 
||
| 
     		`CPX_IMM,`CPX_ZP,`CPX_ABS:	begin res16 <= x16 - b16; end
 
   | 
||
| ... | ... | |
| 
     | 
||
| 
     `include "bus_task.v"
 
   | 
||
| 
     `include "misc_task.v"
 
   | 
||
| 
     `include "load_tsk.v"
 
   | 
||
| 
     | 
||
| 
     task next_state;
 
   | 
||
| 
     input [5:0] nxt;
 
   | 
||
| ultimate_cart/veronica/FT832.v | ||
|---|---|---|
| 
     `timescale 1ns / 1ps
 
   | 
||
| 
     // ============================================================================
 
   | 
||
| 
     //        __
 
   | 
||
| 
     //   \\__/ o\    (C) 2013-2015  Robert Finch, Stratford
 
   | 
||
| 
     //   \\__/ o\    (C) 2013-2017  Robert Finch, Waterloo
 
   | 
||
| 
     //    \  __ /    All rights reserved.
 
   | 
||
| 
     //     \/_//     robfinch<remove>@finitron.ca
 
   | 
||
| 
     //       ||
 
   | 
||
| ... | ... | |
| 
     | 
||
| 
     // Comment out the SUPPORT_xxx definitions to remove a core feature.
 
   | 
||
| 
     `define SUPPORT_TASK	1'b1
 
   | 
||
| 
     `define TASK_MEM        512
 
   | 
||
| 
     `define TASK_MEM_ABIT   8
 
   | 
||
| 
     `define TASK_BL         1'b1                // core uses back link register rather than stack
 
   | 
||
| 
     `define TASK_MEM        4096
 
   | 
||
| 
     `define TASK_MEM_ABIT   11
 
   | 
||
| 
     //`define TASK_BL         1'b1                // core uses back link register rather than stack
 
   | 
||
| 
     `define SUPPORT_SEG     1'b1
 
   | 
||
| 
     `define ICACHE_4K		1'b1
 
   | 
||
| 
     //`define ICACHE_16K		1'b1
 
   | 
||
| ... | ... | |
| 
     `define SUPPORT_BCD		1'b1
 
   | 
||
| 
     //`define SUPPORT_CGI		1'b1			// support the control giveaway interrupt
 
   | 
||
| 
     `define SUPPORT_NEW_INSN    1'b1
 
   | 
||
| 
     `define SUPPORT_INTMD   1'b1
 
   | 
||
| 
     | 
||
| 
     `define BYTE_RST_VECT	32'h0000FFFC
 
   | 
||
| 
     `define BYTE_NMI_VECT	32'h0000FFFA
 
   | 
||
| ... | ... | |
| 
     `define BRK_VECT_816	32'h0000FFE6
 
   | 
||
| 
     `define COP_VECT_816	32'h0000FFE4
 
   | 
||
| 
     | 
||
| 
     `define IRQ2_VECT       32'h0000FFE2
 
   | 
||
| 
     `define IRQ3_VECT       32'h0000FFE0
 
   | 
||
| 
     | 
||
| 
     `define RST_VECT_832	32'h0000FFFC
 
   | 
||
| 
     `define IRQ_VECT_832	32'h0000FFDE
 
   | 
||
| 
     `define NMI_VECT_832	32'h0000FFDA
 
   | 
||
| ... | ... | |
| 
     `define BRK			9'h00
 
   | 
||
| 
     `define BRK2		9'h100
 
   | 
||
| 
     `define RTI			9'h40
 
   | 
||
| 
     `define RTIC        9'h150
 
   | 
||
| 
     `define RTS			9'h60
 
   | 
||
| 
     `define PHP			9'h08
 
   | 
||
| 
     `define CLC			9'h18
 
   | 
||
| ... | ... | |
| 
     `define CLI			9'h58
 
   | 
||
| 
     `define PLA			9'h68
 
   | 
||
| 
     `define SEI			9'h78
 
   | 
||
| 
     `define SEI_IMM     9'h178
 
   | 
||
| 
     `define DEY			9'h88
 
   | 
||
| 
     `define DEY4		9'h188
 
   | 
||
| 
     `define TYA			9'h98
 
   | 
||
| ... | ... | |
| 
     `define TASS        9'h15A
 
   | 
||
| 
     `define TSSA        9'h17A
 
   | 
||
| 
     `define SDU         9'h1BA
 
   | 
||
| 
     `define LLA         9'h1FA
 
   | 
||
| 
     | 
||
| 
     `define ADC_IMM		9'h69
 
   | 
||
| 
     `define ADC_ZP		9'h65
 
   | 
||
| ... | ... | |
| 
     `define BRL			9'h82
 
   | 
||
| 
     `define BRA			9'h80
 
   | 
||
| 
     `define BGT         9'h110
 
   | 
||
| 
     `define BLT         9'h130
 
   | 
||
| 
     `define BGE         9'h190
 
   | 
||
| 
     `define BLE         8'h1B0
 
   | 
||
| 
     | 
||
| 
     `define JML			9'h5C
 
   | 
||
| ... | ... | |
| 
     `define PLB			9'hAB
 
   | 
||
| 
     `define PLD			9'h2B
 
   | 
||
| 
     `define MUL         9'h12A
 
   | 
||
| 
     `define FAR         9'h1DA
 
   | 
||
| 
     | 
||
| 
     `define LDX_IMM		9'hA2
 
   | 
||
| 
     `define LDX_ZP		9'hA6
 
   | 
||
| ... | ... | |
| 
     `define TSB_ZP		9'h04
 
   | 
||
| 
     `define TSB_ABS		9'h0C
 
   | 
||
| 
     `define TSB_XABS	9'h10C
 
   | 
||
| 
     `define BMT_XABS    9'h114
 
   | 
||
| 
     `define BMS_XABS    9'h124
 
   | 
||
| 
     `define BMC_XABS    9'h134
 
   | 
||
| 
     | 
||
| 
     `define MVP			9'h44
 
   | 
||
| 
     `define MVN			9'h54
 
   | 
||
| ... | ... | |
| 
     `define PC_70		6'd5
 
   | 
||
| 
     `define PC_158		6'd6
 
   | 
||
| 
     `define PC_2316		6'd7
 
   | 
||
| 
     `define PC_3124		6'd8
 
   | 
||
| 
     `define PC_310		6'd9
 
   | 
||
| 
     `define LDW_SEG70   6'd8
 
   | 
||
| 
     `define LDW_SEG158  6'd9
 
   | 
||
| 
     `define WORD_311	6'd10
 
   | 
||
| 
     `define IA_310		6'd11
 
   | 
||
| 
     `define IA_70		6'd12
 
   | 
||
| ... | ... | |
| 
     | 
||
| 
     // Input Frequency is 32 times the 00 clock
 
   | 
||
| 
     | 
||
| 
     module FT832(corenum, rst, clk, clko, cyc, phi11, phi12, phi81, phi82, nmi, irq, abort, e, mx, rdy, be, vpa, vda, mlb, vpb,
 
   | 
||
| 
     module FT832(corenum, rst, clk, clko, cyc, phi11, phi12, phi81, phi82, nmi, irq1, irq2, irq3, abort, e, mx, rdy, be, vpa, vda, mlb, vpb,
 
   | 
||
| 
         rw, ad, db, err_i, rty_i);
 
   | 
||
| 
     parameter STORE_SKIPPING = 1'b1;        // set to 1 to skip the store operation if the value didn't change during a RMW instruction
 
   | 
||
| 
     parameter EXTRA_LONG_BRANCHES = 1'b1;   // set to 1 to use an illegal branch displacement ($FF) to indicate a long branch
 
   | 
||
| 
     parameter IO_SEGMENT = 32'hFFD00000;    // set to determine the segment value of the IOS: prefix
 
   | 
||
| 
     parameter PC24 = 1'b1;                  // set if PC is to be true 24 bits (generates slightly more hardware).
 
   | 
||
| 
     parameter PC24 = 1'b0;                  // set if PC is to be true 24 bits (generates slightly more hardware).
 
   | 
||
| 
     parameter POPBF = 1'b0;                 // set to 1 if popping the break flag from the stack is desired
 
   | 
||
| 
     parameter TASK_VECTORING = 1'b1;        // controls whether the core uses task vectors or regular interrupt vectors
 
   | 
||
| 
     parameter TASK_VECTORING = 1'b0;        // controls whether the core uses task vectors or regular interrupt vectors
 
   | 
||
| 
     //parameter DEAD_CYCLE = 1'b1;            // insert dead cycles between each memory access
 
   | 
||
| 
     | 
||
| 
     // There parameters are not meant to be altered.
 
   | 
||
| ... | ... | |
| 
     parameter ICACHE1 = 6'd31;
 
   | 
||
| 
     parameter IBUF1 = 6'd32;
 
   | 
||
| 
     parameter DCACHE1 = 6'd33;
 
   | 
||
| 
     parameter SEG1 = 6'd34;
 
   | 
||
| 
     parameter MVN816 = 6'd36;
 
   | 
||
| 
     parameter JMF1 = 6'd37;
 
   | 
||
| 
     parameter PLDS1 = 6'd38;
 
   | 
||
| ... | ... | |
| 
     parameter ICACHE2 = 6'd43;
 
   | 
||
| 
     parameter CALC = 6'd44;
 
   | 
||
| 
     parameter ICACHE3 = 6'd45;
 
   | 
||
| 
     parameter PBDELAY = 6'd46;
 
   | 
||
| 
     parameter JCR1 = 6'd47;
 
   | 
||
| 
     | 
||
| 
     parameter SEGF_NONE = 6'd0;
 
   | 
||
| 
     parameter SEGF_EXEC = 6'd1;
 
   | 
||
| 
     parameter SEGF_WRITE = 6'd2;
 
   | 
||
| 
     parameter SEGF_BOUND = 6'd3;
 
   | 
||
| 
     | 
||
| 
     parameter PRES_NONE = 7'h00;
 
   | 
||
| 
     parameter PRES_ACC = 7'h08;
 
   | 
||
| 
     parameter PRES_X = 7'h04;
 
   | 
||
| 
     parameter PRES_Y = 7'h02;
 
   | 
||
| 
     parameter PRES_P = 7'h01;
 
   | 
||
| 
     parameter PRES_PC = 7'h10;
 
   | 
||
| 
     parameter PRES_CS = 7'h40;
 
   | 
||
| 
     parameter PRES_BACKLINK = 7'h20;
 
   | 
||
| 
     parameter PRES_ALL = 7'h7F;
 
   | 
||
| 
     localparam PRES_FAXY = PRES_ACC | PRES_X | PRES_Y | PRES_P; 
 
   | 
||
| 
     | 
||
| 
     input [31:0] corenum;
 
   | 
||
| 
     input rst;
 
   | 
||
| 
     input clk;
 
   | 
||
| ... | ... | |
| 
     output phi81;
 
   | 
||
| 
     output phi82;
 
   | 
||
| 
     input nmi;
 
   | 
||
| 
     input irq;
 
   | 
||
| 
     input irq1;
 
   | 
||
| 
     input irq2;
 
   | 
||
| 
     input irq3;
 
   | 
||
| 
     input abort;
 
   | 
||
| 
     output e;
 
   | 
||
| 
     output mx;
 
   | 
||
| ... | ... | |
| 
     reg [31:0] phi1r,phi2r;
 
   | 
||
| 
     reg [31:0] ado1;
 
   | 
||
| 
     | 
||
| 
     wire cs_pgmap;
 
   | 
||
| 
     wire [7:0] pgo;
 
   | 
||
| 
     wire [12:0] pc_page;
 
   | 
||
| 
     reg pgr, ivda;
 
   | 
||
| 
     always @(posedge clk)
 
   | 
||
| 
         pgr <= cs_pgmap;
 
   | 
||
| 
     wire pgmap_rdy = cs_pgmap ? pgr : 1'b1; 
 
   | 
||
| 
     wire irdy = rdy;// & pgmap_rdy;
 
   | 
||
| 
     | 
||
| 
     reg rwo;
 
   | 
||
| 
     reg [7:0] dbo;
 
   | 
||
| 
     reg [31:0] ado;
 
   | 
||
| 
     reg [7:0] dbi;
 
   | 
||
| 
     reg pg2;
 
   | 
||
| 
     reg [5:0] state;    // machine state number
 
   | 
||
| 
     reg [5:0] retstate; // return state - allows 1 level of state subroutine call
 
   | 
||
| ... | ... | |
| 
     reg [127:0] ir;     // the instruction register
 
   | 
||
| 
     wire [8:0] ir9 = {pg2,ir[7:0]}; // The first byte of the instruction
 
   | 
||
| 
     reg [23:0] pc,opc,npc;
 
   | 
||
| 
     wire [28:0] mapped_pc = {pc_page,pc[15:0]};
 
   | 
||
| 
     reg pc_cap;                 // pc history capture flag
 
   | 
||
| 
     `ifdef SUPPORT_SEG
 
   | 
||
| 
     reg [15:0] ds;              // data segment
 
   | 
||
| ... | ... | |
| 
     wire [31:0] cspc = cs_base + pc;
 
   | 
||
| 
     `else
 
   | 
||
| 
     wire [31:0] cspc = pc;
 
   | 
||
| 
     reg [3:0] seg_fault_val = 0;
 
   | 
||
| 
     `endif
 
   | 
||
| 
     reg [15:0] dpr;		        // direct page register
 
   | 
||
| 
     reg [7:0] dbr;		        // data bank register
 
   | 
||
| ... | ... | |
| 
     wire [31:0] y_inc = y + 32'd1;
 
   | 
||
| 
     reg gie;	// global interrupt enable (set when sp is loaded)
 
   | 
||
| 
     reg hwi;	// hardware interrupt indicator
 
   | 
||
| 
     reg im;
 
   | 
||
| 
     reg [2:0] iml,iml1;
 
   | 
||
| 
     wire im = |iml;
 
   | 
||
| 
     reg [2:0] irqenc;
 
   | 
||
| 
     reg [15:0] ima;
 
   | 
||
| 
     reg its;    // interrupt task switch bit
 
   | 
||
| 
     reg cf,vf,nf,zf,df,em,bf;
 
   | 
||
| 
     reg m816,m832;
 
   | 
||
| 
     reg x_bit,m_bit;
 
   | 
||
| ... | ... | |
| 
     reg mxb16,mxb32;
 
   | 
||
| 
     reg mib;
 
   | 
||
| 
     reg ssm;
 
   | 
||
| 
     reg [2:0] tmsp [0:511];
 
   | 
||
| 
     | 
||
| 
     integer n;
 
   | 
||
| 
     initial begin
 
   | 
||
| 
         for (n = 0; n < 512; n = n + 2)
 
   | 
||
| 
             tmsp[n] <= 0;
 
   | 
||
| 
     end
 
   | 
||
| 
     | 
||
| 
     wire DEAD_CYCLE = FALSE;//(vda|vpa) && ado >= 32'h10000;
 
   | 
||
| 
     | 
||
| 
     //wire m16 = m816 & ~m_bit;
 
   | 
||
| ... | ... | |
| 
     wire [7:0] rdat;
 
   | 
||
| 
     reg [5:0] load_what;
 
   | 
||
| 
     reg [5:0] store_what;
 
   | 
||
| 
     reg [15:0] temp_vec;
 
   | 
||
| 
     reg s8,s16,s32,lds;
 
   | 
||
| 
     reg sop;                // size override prefix
 
   | 
||
| 
     reg [31:0] tmp32;
 
   | 
||
| ... | ... | |
| 
     reg isBusErr;
 
   | 
||
| 
     reg isBrk,isMove,isSts;
 
   | 
||
| 
     reg isMove816;
 
   | 
||
| 
     reg isFar = 0;
 
   | 
||
| 
     reg isRTI,isRTL,isRTS,isRTF;
 
   | 
||
| 
     reg isRMW;
 
   | 
||
| 
     reg isSub;
 
   | 
||
| 
     reg isJmpi;
 
   | 
||
| 
     reg isJsrIndx,isJsrInd,isJLInd;
 
   | 
||
| 
     reg isIY,isIY24,isI24,isIY32,isI32;
 
   | 
||
| 
     reg isDspiy;
 
   | 
||
| 
     reg isDspiy,isStaiy;
 
   | 
||
| 
     reg tj_prefix;
 
   | 
||
| 
     reg lla;
 
   | 
||
| 
     | 
||
| 
     wire isCmp = ir9==`CPX_ZPX || ir9==`CPX_ABS || ir9==`CPX_XABS ||
 
   | 
||
| 
     			 ir9==`CPY_ZPX || ir9==`CPY_ABS || ir9==`CPY_XABS;
 
   | 
||
| ... | ... | |
| 
     			 ir9==`TRB_XABS || ir9==`TSB_XABS
 
   | 
||
| 
     			 ;
 
   | 
||
| 
     wire isBranch = ir9==`BRA || ir9==`BEQ || ir9==`BNE || ir9==`BVS || ir9==`BVC || ir9==`BMI || ir9==`BPL || ir9==`BCS || ir9==`BCC ||
 
   | 
||
| 
                     ir9==`BGT || ir9==`BGE || ir9==`BLT || ir9==`BLE;
 
   | 
||
| 
                     ir9==`BGT || ir9==`BLE;
 
   | 
||
| 
     | 
||
| 
     // This function needed to make the processor adhere to the page and bank 
 
   | 
||
| 
     // wrapping characteristics of the 65xx. The stack will wrap around within
 
   | 
||
| ... | ... | |
| 
     );
 
   | 
||
| 
     | 
||
| 
     `ifdef SUPPORT_TASK
 
   | 
||
| 
     reg [`TASK_MEM_ABIT:0] tr, otr;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT-3:0] tr, otr, trh;
 
   | 
||
| 
     reg [7:0] tsk_pres;                 // register value preservation flags
 
   | 
||
| 
     reg tskm_we;
 
   | 
||
| 
     reg tskm_wr;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT:0] tskm_wa;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT-3:0] tskm_wa;
 
   | 
||
| 
     | 
||
| 
     wire [15:0] cs_o;
 
   | 
||
| 
     wire [15:0] ds_o;
 
   | 
||
| ... | ... | |
| 
     wire [7:0] srx_o;
 
   | 
||
| 
     wire [7:0] dbr_o;
 
   | 
||
| 
     wire [15:0] dpr_o;
 
   | 
||
| 
     wire [`TASK_MEM_ABIT:0] bl_o;
 
   | 
||
| 
     wire [5:0] mapno_o;
 
   | 
||
| 
     wire [`TASK_MEM_ABIT-3:0] bl_o;
 
   | 
||
| 
     reg [15:0] cs_i;
 
   | 
||
| 
     reg [15:0] ds_i;
 
   | 
||
| 
     reg [15:0] ss_i;
 
   | 
||
| ... | ... | |
| 
     reg [7:0] srx_i;
 
   | 
||
| 
     reg [7:0] dbr_i;
 
   | 
||
| 
     reg [15:0] dpr_i;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT:0] bl_i;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT:0] back_link;
 
   | 
||
| 
     reg [5:0] mapno_i;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT-3:0] bl_i;
 
   | 
||
| 
     reg [`TASK_MEM_ABIT-3:0] back_link;
 
   | 
||
| 
     | 
||
| 
     task_mem utskm1
 
   | 
||
| 
     (
 
   | 
||
| 
         .wclk(clk),
 
   | 
||
| 
         .wce(tskm_we),
 
   | 
||
| 
         .wr(tskm_wr),
 
   | 
||
| 
         .wa(tskm_wa),
 
   | 
||
| 
         .wa({tmsp[tskm_wa],tskm_wa}),
 
   | 
||
| 
         .cs_i(cs_i),
 
   | 
||
| 
         .ds_i(ds_i),
 
   | 
||
| 
         .ss_i(ss_i),
 
   | 
||
| ... | ... | |
| 
         .db_i(dbr_i),
 
   | 
||
| 
         .dpr_i(dpr_i),
 
   | 
||
| 
         .bl_i(bl_i),
 
   | 
||
| 
         .mapno_i(mapno_i),
 
   | 
||
| 
         .rclk(~clk),
 
   | 
||
| 
         .rce(1'b1),
 
   | 
||
| 
         .ra(tr),
 
   | 
||
| 
         .ra({tmsp[tr],tr}),
 
   | 
||
| 
         .cs_o(cs_o),
 
   | 
||
| 
         .ds_o(ds_o),
 
   | 
||
| 
         .ss_o(ss_o),
 
   | 
||
| ... | ... | |
| 
         .srx_o(srx_o),
 
   | 
||
| 
         .db_o(dbr_o),
 
   | 
||
| 
         .dpr_o(dpr_o),
 
   | 
||
| 
         .bl_o(bl_o)
 
   | 
||
| 
         .bl_o(bl_o),
 
   | 
||
| 
         .mapno_o(mapno_o)
 
   | 
||
| 
     );
 
   | 
||
| 
     | 
||
| 
     `endif
 
   | 
||
| 
     | 
||
| 
     `ifdef SUPPORT_SEG
 
   | 
||
| 
     reg wr_sdt;
 
   | 
||
| 
     reg [11:0] sdt_wa;
 
   | 
||
| 
     reg [11:0] sdt_ra;
 
   | 
||
| ... | ... | |
| 
         .size_o(size_o),
 
   | 
||
| 
         .base_o(base_o)
 
   | 
||
| 
     );
 
   | 
||
| 
     `endif
 
   | 
||
| 
     | 
||
| 
     reg [5:0] mapno;
 
   | 
||
| 
     /*
 
   | 
||
| 
     ProgramMappingTbl upmap1
 
   | 
||
| 
     (
 
   | 
||
| 
         .clk(clk),
 
   | 
||
| 
         .wr(cs_pgmap & ~rwo),
 
   | 
||
| 
         .wadr(ado[14:0]),
 
   | 
||
| 
         .wdat(dbo),
 
   | 
||
| 
         .rdat(pgo),
 
   | 
||
| 
         .omapno(mapno),
 
   | 
||
| 
         .pb(cspc[23:16]),
 
   | 
||
| 
         .page(pc_page)
 
   | 
||
| 
     );
 
   | 
||
| 
     */
 
   | 
||
| 
     reg  [7:0] cpybuf [63:0];   // stack copy buffer
 
   | 
||
| 
     | 
||
| 
     // Registerable decodes
 
   | 
||
| ... | ... | |
| 
     		isBrk <= ir9==`BRK || ir9==`COP;
 
   | 
||
| 
     		isMove <= ir9==`MVP || ir9==`MVN;
 
   | 
||
| 
     		isJsrIndx <= ir9==`JSR_INDX;
 
   | 
||
| 
     		isJmpi  <= ir9==`JMP_IND || ir9==`JMP_INDX;
 
   | 
||
| 
     		isJLInd <= ir9==`JML_IND || ir9==`JML_XIND || ir9==`JSL_XINDX || ir9==`JML_XINDX;
 
   | 
||
| 
     		isDspiy <= ir9[4:0]==5'h13;
 
   | 
||
| 
     		isStaiy <= ir9==`STA_IY || ir9==`STA_IYL || ir9==`STA_XIYL || ir9==`STA_DSPIY || ir9==`STA_XDSPIY;
 
   | 
||
| 
     	end
 
   | 
||
| 
     | 
||
| 
     assign mx = clk ? m_bit : x_bit;
 
   | 
||
| ... | ... | |
| 
     | 
||
| 
     | 
||
| 
     | 
||
| 
     wire [7:0] dati = db;
 
   | 
||
| 
     wire [7:0] dati = db;//cs_pgmap ? pgo : db;
 
   | 
||
| 
     | 
||
| 
     // Evaluate branches
 
   | 
||
| 
     // 
 
   | 
||
| ... | ... | |
| 
                               m816 ? {stack_bank,sp16 + ir[15:8]} : {stack_page,sp[7:0]+ir[15:8]};
 
   | 
||
| 
     reg [31:0] vect;
 
   | 
||
| 
     | 
||
| 
     assign rw = be ? rwo : 1'bz;
 
   | 
||
| 
     assign cs_pgmap = 1'b0;//ivda && (ado[31:16]==16'h0002);
 
   | 
||
| 
     assign rw = be ? rwo|cs_pgmap : 1'bz;
 
   | 
||
| 
     assign ad = be ? ado : {32{1'bz}};
 
   | 
||
| 
     assign db = rwo ? {8{1'bz}} : be ? dbo : {8{1'bz}};
 
   | 
||
| 
     | 
||
| ... | ... | |
| 
     // - this circuit must be under the clk_i domain
 
   | 
||
| 
     //-----------------------------------------------------------------------------
 
   | 
||
| 
     //
 
   | 
||
| 
     //wire clkx = clk;
 
   | 
||
| 
     //assign clko = clkx;
 
   | 
||
| 
     | 
||
| 
     reg clk_en;
 
   | 
||
| 
     reg cpu_clk_en;
 
   | 
||
| 
     reg clk_en;
 
   | 
||
| 
     wire clkx;
 
   | 
||
| 
     BUFGCE u20 (.CE(cpu_clk_en), .I(clk), .O(clkx) );
 
   | 
||
| 
     assign clko = clkx;
 
   | 
||
| ... | ... | |
| 
     		cpu_clk_en <= clk_en;
 
   | 
||
| 
     end
 
   | 
||
| 
     | 
||
| 
     reg isRstVect;
 
   | 
||
| 
     reg abort1;
 
   | 
||
| 
     reg abort_edge;
 
   | 
||
| 
     reg [2:0] imcd;	// interrupt mask enable count down
 
   | 
||
| 
     always @*
 
   | 
||
| 
     if (~irq3)
 
   | 
||
| 
         irqenc <= 3'b011;
 
   | 
||
| 
     else if (~irq2)
 
   | 
||
| 
         irqenc <= 3'b010;
 
   | 
||
| 
     else if (~irq1)
 
   | 
||
| 
         irqenc <= 3'b001;
 
   | 
||
| 
     else
 
   | 
||
| 
         irqenc <= 3'b000;
 
   | 
||
| 
     | 
||
| 
     always @(posedge clkx)
 
   | 
||
| 
     if (~rst) begin
 
   | 
||
| 
     	vpa <= `FALSE;
 
   | 
||
| 
     	vda <= `FALSE;
 
   | 
||
| 
     	ivda <= `FALSE;
 
   | 
||
| 
     	vpb <= `TRUE;
 
   | 
||
| 
     	rwo <= `TRUE;
 
   | 
||
| 
     	ado <= 32'h000000;
 
   | 
||
| ... | ... | |
| 
     	state <= RESET1;
 
   | 
||
| 
     	em <= 1'b1;
 
   | 
||
| 
     	pc <= 24'h00FFF0;		// set high-order pc to zero
 
   | 
||
| 
     `ifdef SUPPORT_SEG
 
   | 
||
| 
     	cs <= 16'd0;
 
   | 
||
| 
     	ds <= 16'd0;
 
   | 
||
| 
     	ss <= 16'd0;
 
   | 
||
| ... | ... | |
| 
     	ds_wr <= TRUE;
 
   | 
||
| 
     	ss_wr <= TRUE;
 
   | 
||
| 
     	cs_wr <= FALSE;
 
   | 
||
| 
     	stksz <= 2'b00;        // 256 bytes
 
   | 
||
| 
         wr_sdt <= FALSE;
 
   | 
||
| 
     `endif	
 
   | 
||
| 
     	dpr <= 16'h0000;
 
   | 
||
| 
     	dbr <= 8'h00;
 
   | 
||
| 
     	acc <= 32'h0;
 
   | 
||
| 
     	x <= 32'h0;
 
   | 
||
| 
     	y <= 32'h0;
 
   | 
||
| 
     	sp <= 32'h1FF;
 
   | 
||
| 
     	stack_page <= 24'h000001;
 
   | 
||
| 
     	stack_bank <= 16'h0000;
 
   | 
||
| 
     	clk_en <= 1'b1;
 
   | 
||
| 
     	im <= `TRUE;
 
   | 
||
| 
     	iml <= 3'b000;
 
   | 
||
| 
     	imcd <= 3'b111;
 
   | 
||
| 
         ima <= 16'h0000;
 
   | 
||
| 
     	mib <= `FALSE;
 
   | 
||
| 
     	gie <= 1'b0;
 
   | 
||
| 
     	isIY <= 1'b0;
 
   | 
||
| ... | ... | |
| 
     	load_what <= `NOTHING;
 
   | 
||
| 
     	abort_edge <= 1'b0;
 
   | 
||
| 
     	abort1 <= 1'b0;
 
   | 
||
| 
     	imcd <= 3'b111;
 
   | 
||
| 
     	inv_icache <= TRUE;
 
   | 
||
| 
     	inv_iline <= FALSE;
 
   | 
||
| 
     	pc_cap <= TRUE;
 
   | 
||
| 
     	tr <= 8'h00;
 
   | 
||
| 
         tskm_we <= FALSE;
 
   | 
||
| 
         tskm_wr <= FALSE;
 
   | 
||
| 
         wr_sdt <= FALSE;
 
   | 
||
| 
         ssm <= FALSE;
 
   | 
||
| 
         tj_prefix <= FALSE;
 
   | 
||
| 
         seg_fault_val = SEGF_NONE;
 
   | 
||
| 
         lla <= FALSE;
 
   | 
||
| 
         isRstVect <= `TRUE;
 
   | 
||
| 
         mapno <= 6'd0;
 
   | 
||
| 
     end
 
   | 
||
| 
     else begin
 
   | 
||
| 
     abort1 <= abort;
 
   | 
||
| ... | ... | |
| 
     tskm_wr <= FALSE;
 
   | 
||
| 
     `endif
 
   | 
||
| 
     wr_itag <= FALSE;
 
   | 
||
| 
     `ifdef SUPPORT_SEG
 
   | 
||
| 
     wr_sdt <= FALSE;
 
   | 
||
| 
     `endif
 
   | 
||
| 
     case(state)
 
   | 
||
| 
     RESET1:
 
   | 
||
| 
     	begin
 
   | 
||
| ... | ... | |
| 
             ds_limit <= 32'hFFFFFFFF;
 
   | 
||
| 
             ss_limit <= 32'hFFFFFFFF;
 
   | 
||
| 
             ds_wr <= TRUE;
 
   | 
||
| 
     		seg <= 32'd0;
 
   | 
||
| 
             lmt <= 32'hFFFF;
 
   | 
||
| 
             mem_wr <= TRUE;
 
   | 
||
| 
     `endif 
 
   | 
||
| 
             first_ifetch <= TRUE;
 
   | 
||
| 
     		seg <= 32'd0;
 
   | 
||
| 
     		lmt <= 32'hFFFF;
 
   | 
||
| 
     		mem_wr <= TRUE;
 
   | 
||
| 
     		inv_icache <= FALSE;
 
   | 
||
| 
     		state <= LOAD_MAC1;
 
   | 
||
| 
     	end
 
   | 
||
| ... | ... | |
| 
         begin
 
   | 
||
| 
     	vda <= FALSE;
 
   | 
||
| 
     	if (hit0&hit1) begin
 
   | 
||
| 
     		if (imcd != 3'b111)
 
   | 
||
| 
     			imcd <= {imcd[1:0],1'b0};
 
   | 
||
| 
     		if (imcd == 3'b000) begin
 
   | 
||
| 
     			imcd <= 3'b111;
 
   | 
||
| 
     			im <= 1'b0;
 
   | 
||
| 
     		end
 
   | 
||
| 
     		vect <= m832 ? `BRK_VECT_832 : m816 ? `BRK_VECT_816 : `BYTE_IRQ_VECT;
 
   | 
||
| 
     		hwi <= `FALSE;
 
   | 
||
| 
     		isBusErr <= `FALSE;
 
   | 
||
| 
     		pg2 <= FALSE;
 
   | 
||
| 
     		isFar <= `FALSE;
 
   | 
||
| 
     		isIY <= `FALSE;
 
   | 
||
| 
     		isIY24 <= `FALSE;
 
   | 
||
| 
     		isIY32 <= `FALSE;
 
   | 
||
| 
     		isI24 <= `FALSE;
 
   | 
||
| 
     		isI32 <= `FALSE;
 
   | 
||
| 
     		lla <= `FALSE;
 
   | 
||
| 
     		s8 <= FALSE;
 
   | 
||
| 
     		s16 <= FALSE;
 
   | 
||
| 
     		s32 <= FALSE;
 
   | 
||
| ... | ... | |
| 
     		store_what <= (m32 | m16) ? `STW_DEF70 : `STW_DEF;
 
   | 
||
| 
     	    ir <= insn;
 
   | 
||
| 
     		opc <= pc;
 
   | 
||
| 
     		if (nmi_edge | ~irq)
 
   | 
||
| 
     		if (nmi_edge | ~irq1 | ~irq2 | ~irq3)
 
   | 
||
| 
     			wai <= 1'b0;
 
   | 
||
| 
     		if (abort_edge) begin
 
   | 
||
| 
     			pc <= opc;
 
   | 
||
| 
                 iml1 <= 3'd7;
 
   | 
||
| 
     			ir[7:0] <= `BRK;
 
   | 
||
| 
     			abort_edge <= 1'b0;
 
   | 
||
| 
     			hwi <= `TRUE;
 
   | 
||
| ... | ... | |
| 
     			next_state(DECODE);
 
   | 
||
| 
     		end
 
   | 
||
| 
     		else if (nmi_edge & gie) begin
 
   | 
||
| 
                 iml1 <= 3'd7;
 
   | 
||
| 
     			ir[7:0] <= `BRK;
 
   | 
||
| 
     			nmi_edge <= 1'b0;
 
   | 
||
| 
     			hwi <= `TRUE;
 
   | 
||
| 
     			vect <= m832 ? `NMI_VECT_832 : m816 ? `NMI_VECT_816 : `BYTE_NMI_VECT;
 
   | 
||
| 
     			vect[23:16] <= 8'h00;
 
   | 
||
| 
     			seg <= 32'd0;
 
   | 
||
| 
     			lmt <= 32'hFFFF;
 
   | 
||
| 
     			mem_wr <= FALSE;
 
   | 
||
| 
     			next_state(DECODE);
 
   | 
||
| 
     		end
 
   | 
||
| 
     		else if (~irq & gie & ~im) begin
 
   | 
||
| 
     		else if ((irqenc > iml) && gie) begin
 
   | 
||
| 
     		    iml1 <= irqenc;
 
   | 
||
| 
     			ir[7:0] <= `BRK;
 
   | 
||
| 
     			hwi <= `TRUE;
 
   | 
||
| 
     			if (m832)
 
   | 
||
| 
     			    vect <= `IRQ_VECT_832;
 
   | 
||
| 
     			else if (m816)
 
   | 
||
| 
     				vect <= `IRQ_VECT_816;
 
   | 
||
| 
     			seg <= 32'd0;
 
   | 
||
| 
     			lmt <= 32'hFFFF;
 
   | 
||
| 
     			mem_wr <= FALSE;
 
   | 
||
| 
     			case(irqenc)
 
   | 
||
| 
                 3'b010: vect <= `IRQ2_VECT;
 
   | 
||
| 
                 3'b011: vect <= `IRQ3_VECT;
 
   | 
||
| 
                 default:    // 001
 
   | 
||
| 
                     if (m832)
 
   | 
||
| 
                         vect <= `IRQ_VECT_832;
 
   | 
||
| 
                     else if (m816)
 
   | 
||
| 
                         vect <= `IRQ_VECT_816;
 
   | 
||
| 
     			endcase
 
   | 
||
| 
     			next_state(DECODE);
 
   | 
||
| 
     		end
 
   | 
||
| 
     		else if (pc > cs_limit && m832) begin
 
   | 
||
| 
     `ifdef SUPPORT_SEG		
 
   | 
||
| 
     		else if (pc > cs_limit) begin
 
   | 
||
| 
     		    iml1 <= 3'd7;
 
   | 
||
| 
     			ir[7:0] <= `BRK;
 
   | 
||
| 
                 hwi <= `TRUE;
 
   | 
||
| 
                 if (m832)
 
   | 
||
| ... | ... | |
| 
                 next_state(DECODE);
 
   | 
||
| 
                 seg_fault_val <= SEGF_BOUND;
 
   | 
||
| 
     		end
 
   | 
||
| 
     `endif		
 
   | 
||
| 
     		else if (!wai) begin
 
   | 
||
| 
     `ifdef SUPPORT_INTMD		
 
   | 
||
| 
                 if (mib) begin
 
   | 
||
| 
                     set_task_regs(m832 ? 24'd4 : m816 ? 24'd2 : 24'd1);
 
   | 
||
| 
                     case({m832,m816})
 
   | 
||
| ... | ... | |
| 
                     next_state(TSK1);
 
   | 
||
| 
                 end
 
   | 
||
| 
                 else
 
   | 
||
| 
     `endif            
 
   | 
||
| 
     			    next_state(DECODE);
 
   | 
||
| 
     		end
 
   | 
||
| 
     		else
 
   | 
||
| 
     			next_state(IFETCH);
 
   | 
||
| 
     		if (!abort_edge & first_ifetch) begin
 
   | 
||
| 
     		first_ifetch <= FALSE;
 
   | 
||
| 
     		if (!abort_edge) begin
 
   | 
||
| 
     		case(ir9)
 
   | 
||
| 
     		// Note the break flag is not affected by SEP/REP
 
   | 
||
| 
     		// Setting the index registers to eight bit zeros out the upper part of the register.
 
   | 
||
| ... | ... | |
| 
     			begin
 
   | 
||
| 
     				cf <= cf | ir[8];
 
   | 
||
| 
     				zf <= zf | ir[9];
 
   | 
||
| 
     				im <= im | ir[10];
 
   | 
||
| 
     				if (ir[10])
 
   | 
||
| 
     				    iml <= 3'd1;
 
   | 
||
| 
     				df <= df | ir[11];
 
   | 
||
| 
     				if (m816|m832) begin
 
   | 
||
| 
     					x_bit <= x_bit | ir[12];
 
   | 
||
| ... | ... | |
| 
     			begin
 
   | 
||
| 
     				cf <= cf & ~ir[8];
 
   | 
||
| 
     				zf <= zf & ~ir[9];
 
   | 
||
| 
     				im <= im & ~ir[10];
 
   | 
||
| 
     				if (ir[10])
 
   | 
||
| 
     				    iml <= 3'd0;
 
   | 
||
| 
     				df <= df & ~ir[11];
 
   | 
||
| 
     				if (m816|m832) begin
 
   | 
||
| 
     					x_bit <= x_bit & ~ir[12];
 
   | 
||
| ... | ... | |
| 
                     begin
 
   | 
||
| 
                         cf <= cf | ir[8];
 
   | 
||
| 
                         zf <= zf | ir[9];
 
   | 
||
| 
                         im <= im | ir[10];
 
   | 
||
| 
                         if (ir[10])
 
   | 
||
| 
                             iml <= 3'd1;
 
   | 
||
| 
                         df <= df | ir[11];
 
   | 
||
| 
                         if (m816|m832) begin
 
   | 
||
| 
                             x_bit <= x_bit | ir[12];
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     cf <= cf & ~ir[8];
 
   | 
||
| 
                     zf <= zf & ~ir[9];
 
   | 
||
| 
                     im <= im & ~ir[10];
 
   | 
||
| 
                     if (ir[10])
 
   | 
||
| 
                         iml <= 3'd0;
 
   | 
||
| 
                     df <= df & ~ir[11];
 
   | 
||
| 
                     if (m816|m832) begin
 
   | 
||
| 
                         x_bit <= x_bit & ~ir[12];
 
   | 
||
| ... | ... | |
| 
                         zf <= resz16;
 
   | 
||
| 
                     end
 
   | 
||
| 
                 end
 
   | 
||
| 
     `ifdef SUPPORT_SEG            
 
   | 
||
| 
             `TASS:  ss <= res32[15:0];
 
   | 
||
| 
     		`TSA,`TYA,`TXA,`INA,`DEA,`PLA,`TSSA:
 
   | 
||
| 
             `TSSA,
 
   | 
||
| 
     `endif    
 
   | 
||
| 
     		`TSA,`TYA,`TXA,`INA,`DEA,`PLA:
 
   | 
||
| 
     			begin
 
   | 
||
| 
                     if (m32) begin
 
   | 
||
| 
                         acc <= res32;
 
   | 
||
| ... | ... | |
| 
                         acc <= df ? bcsio : res32;
 
   | 
||
| 
                         cf <= ~(df ? bcsico : carry(1,a32[31],b32[31],res32[31]));
 
   | 
||
| 
                         vf <= (1'b1 ^ res32[31] ^ b32[31]) & (a32[31] ^ b32[31]);
 
   | 
||
| 
                         nf <= df ? bcsio[15] : resn16;
 
   | 
||
| 
                         zf <= df ? bcsio==16'h0000 : resz16;
 
   | 
||
| 
                         nf <= df ? bcsio[15] : resn32;
 
   | 
||
| 
                         zf <= df ? bcsio==16'h0000 : resz32;
 
   | 
||
| 
                     end
 
   | 
||
| 
     				else if (m16) begin
 
   | 
||
| 
     					acc[15:0] <= df ? bcsio : res32[15:0];
 
   | 
||
| ... | ... | |
| 
                         acc <= df ? bcso : res32;
 
   | 
||
| 
                         vf <= (1'b1 ^ res32[31] ^ b32[31]) & (a32[31] ^ b32[31]);
 
   | 
||
| 
                         cf <= ~(df ? bcsco : carry(1,a32[31],b32[31],res32[31]));
 
   | 
||
| 
                         nf <= df ? bcso[15] : resn16;
 
   | 
||
| 
                         zf <= df ? bcso==16'h0000 : resz16;
 
   | 
||
| 
                         nf <= df ? bcso[15] : resn32;
 
   | 
||
| 
                         zf <= df ? bcso==16'h0000 : resz32;
 
   | 
||
| 
                     end
 
   | 
||
| 
     				else if (m16) begin
 
   | 
||
| 
     					acc[15:0] <= df ? bcso : res32[15:0];
 
   | 
||
| ... | ... | |
| 
     		    if (m32) begin zf <= resz32; end
 
   | 
||
| 
     			else if (m16) begin zf <= resz16; end
 
   | 
||
| 
     			else begin          zf <= resz8; end
 
   | 
||
| 
     		`BMT_XABS,`BMS_XABS,`BMC_XABS:    begin zf <= resz8; nf <= resn8; end
 
   | 
||
| 
     		`LDA_IMM,`LDA_ZP,`LDA_ZPX,`LDA_IX,`LDA_IY,`LDA_IYL,`LDA_ABS,`LDA_ABSX,`LDA_ABSY,`LDA_I,`LDA_IL,`LDA_AL,`LDA_ALX,`LDA_DSP,`LDA_DSPIY,
 
   | 
||
| 
     		`LDA_XABS,`LDA_XABSX,`LDA_XABSY,`LDA_XIYL,`LDA_XIL,`LDA_XDSPIY,
 
   | 
||
| 
     		`AND_IMM,`AND_ZP,`AND_ZPX,`AND_IX,`AND_IY,`AND_IYL,`AND_ABS,`AND_ABSX,`AND_ABSY,`AND_I,`AND_IL,`AND_AL,`AND_ALX,`AND_DSP,`AND_DSPIY,
 
   | 
||
| ... | ... | |
| 
     // Decode
 
   | 
||
| 
     DECODE:
 
   | 
||
| 
         begin
 
   | 
||
| 
             first_ifetch <= TRUE;
 
   | 
||
| 
     		moveto_ifetch();
 
   | 
||
| 
             inc_pc(24'd1);
 
   | 
||
| 
     		case(ir9)
 
   | 
||
| ... | ... | |
| 
     		      next_state(DECODE);
 
   | 
||
| 
     		      end
 
   | 
||
| 
     `ifdef SUPPORT_NEW_INSN
 
   | 
||
| 
             `LLA:   begin
 
   | 
||
| 
                     lla <= `TRUE;
 
   | 
||
| 
         	        ir <= {8'h00,ir[127:8]};
 
   | 
||
| 
                     next_state(DECODE);
 
   | 
||
| 
                     end
 
   | 
||
| 
     `ifdef SUPPORT_SEG
 
   | 
||
| 
     		`CS:  begin
 
   | 
||
| 
     		      seg <= cs_base;
 
   | 
||
| ... | ... | |
| 
                   next_state(DECODE);
 
   | 
||
| 
                   end
 
   | 
||
| 
              `SEG: begin
 
   | 
||
| 
                   inc_pc(24'd5);
 
   | 
||
| 
     		      seg <= ir[39:8];
 
   | 
||
| 
     		      ir <= {40'h00,ir[127:40]};
 
   | 
||
| 
                   inc_pc(24'd3);
 
   | 
||
| 
     		      sdt_ra <= ir[23:8];
 
   | 
||
| 
     		      ir <= {24'h00,ir[127:24]};
 
   | 
||
| 
     		      pg2 <= FALSE;
 
   | 
||
| 
     		      next_state(DECODE);
 
   | 
||
| 
     		      next_state(SEG1);
 
   | 
||
| 
     		      end
 
   | 
||
| 
     `endif
 
   | 
||
| 
             `TJ:  begin tj_prefix <= TRUE; ir <= {8'h00,ir[127:8]}; pg2 <= FALSE; next_state(DECODE); end
 
   | 
||
| ... | ... | |
| 
     		`WRD: begin sop <= TRUE; s32 <= TRUE; ir <= {8'h00,ir[127:8]}; pg2 <= FALSE; next_state(DECODE); end
 
   | 
||
| 
     		`SEP16:	  inc_pc(24'd3);	// see byte_ifetch
 
   | 
||
| 
             `REP16:   inc_pc(24'd3);
 
   | 
||
| 
     		`FAR: begin isFar <= TRUE; ir <= {8'h00,ir[127:8]}; pg2 <= FALSE; next_state(DECODE); end
 
   | 
||
| 
     `endif
 
   | 
||
| 
     		`SEP:	inc_pc(24'd2);	// see byte_ifetch
 
   | 
||
| 
     		`REP:	inc_pc(24'd2);
 
   | 
||
| ... | ... | |
| 
     		`SEC:	begin cf <= 1'b1; end
 
   | 
||
| 
     		`CMC:   cf <= ~cf;
 
   | 
||
| 
     		`CLV:	begin vf <= 1'b0; end
 
   | 
||
| 
     		`CLI:	begin imcd <= 3'b110; end
 
   | 
||
| 
     		`SEI:	begin im <= 1'b1; end
 
   | 
||
| 
     		`CLI:	begin iml <= 3'd0; end// imcd <= 3'b110; end
 
   | 
||
| 
     		`SEI:	begin iml <= 3'd7; end
 
   | 
||
| 
     		`SEI_IMM: begin iml <= ir[10:8]; end
 
   | 
||
| 
     		`CLD:	begin df <= 1'b0; end
 
   | 
||
| 
     		`SED:	begin df <= 1'b1; end
 
   | 
||
| 
     		`WAI:	begin wai <= 1'b1; end
 
   | 
||
| ... | ... | |
| 
     		              next_state(TASS1);
 
   | 
||
| 
     		          end
 
   | 
||
| 
     `ifdef SUPPORT_TASK
 
   | 
||
| 
     		`TTA:       res32 <= tr;
 
   | 
||
| 
     		`TTA:       res32 <= {mapno,1'b0,tr};
 
   | 
||
| 
     `endif
 
   | 
||
| 
     `endif
 
   | 
||
| 
     		`DEA:	res32 <= acc_dec;
 
   | 
||
| ... | ... | |
| 
     			begin
 
   | 
||
| 
     			    inc_pc(24'd2);
 
   | 
||
| 
                     inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG               
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     load_what <= `PC_70;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
     		`RTS,`RTL:
 
   | 
||
| 
     			begin
 
   | 
||
| 
     			    inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG			    
 
   | 
||
| 
     			    seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
     				load_what <= `PC_70;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     			end
 
   | 
||
| 
     	    `RTIC:
 
   | 
||
| 
     	            begin
 
   | 
||
| 
     		        iml <= ima[2:0];
 
   | 
||
| 
                     its <= ima[3];
 
   | 
||
| 
                     ima <= {4'b0,ima[15:4]};
 
   | 
||
| 
                     do_rtx(24'h1,8'h00,PRES_NONE);
 
   | 
||
| 
                     end
 
   | 
||
| 
     		`RTI:	begin
 
   | 
||
| 
     		        iml <= ima[2:0];
 
   | 
||
| 
     		        its <= ima[3];
 
   | 
||
| 
     		        ima <= {4'b0,ima[15:4]};
 
   | 
||
| 
     		        if (ima[3]) begin
 
   | 
||
| 
                         set_task_regs(24'd1);
 
   | 
||
| 
                         tsk_pres <= PRES_NONE;
 
   | 
||
| 
                         sp_i <= fn_add_to_sp(32'd2);
 
   | 
||
| 
                         inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                         seg <= ss_base;
 
   | 
||
| 
                         lmt <= ss_limit;
 
   | 
||
| 
                         mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                         load_what <= `LDW_TR70S;
 
   | 
||
| 
                         state <= LOAD_MAC1;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     else begin
 
   | 
||
| 
     `ifdef SUPPORT_SEG		
 
   | 
||
| 
     			    seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
     `ifdef SUPPORT_TASK
 
   | 
||
| 
     		        if (m832) begin
 
   | 
||
| 
                         set_task_regs(24'd1);
 
   | 
||
| 
     `ifdef TASK_BL
 
   | 
||
| 
                         begin
 
   | 
||
| 
                             tr <= back_link;
 
   | 
||
| 
                             tsk_pres <= 7'h0;
 
   | 
||
| 
                             retstate <= IFETCH;
 
   | 
||
| 
                             next_state(TSK1);
 
   | 
||
| 
                         end
 
   | 
||
| 
     `else
 
   | 
||
| 
                         begin
 
   | 
||
| 
                             sp_i <= fn_add_to_sp(32'd2);
 
   | 
||
| 
                             inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG                        
 
   | 
||
| 
                             seg <= ss_base;
 
   | 
||
| 
                             lmt <= ss_limit;
 
   | 
||
| 
                             mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                        
 
   | 
||
| 
                             tsk_pres <= 7'd0;
 
   | 
||
| 
                             load_what <= `LDW_TR70S;
 
   | 
||
| 
                             state <= LOAD_MAC1;
 
   | 
||
| 
                         end
 
   | 
||
| 
     `endif
 
   | 
||
| 
                     end
 
   | 
||
| 
                     else
 
   | 
||
| 
     `endif
 
   | 
||
| ... | ... | |
| 
                         state <= LOAD_MAC1;
 
   | 
||
| 
     				end
 
   | 
||
| 
     				end
 
   | 
||
| 
     				end
 
   | 
||
| 
     		`PHP:   begin
 
   | 
||
| 
     		             if (m832)
 
   | 
||
| 
     		             if (m832 || (sop & s16))
 
   | 
||
| 
     		                 tsk_push(`STW_SR158,1,0);
 
   | 
||
| 
     		             else
 
   | 
||
| 
     		                 tsk_push(`STW_SR70,0,0);
 
   | 
||
| ... | ... | |
| 
     		`PLP:
 
   | 
||
| 
     			begin
 
   | 
||
| 
                     inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif          
 
   | 
||
| 
     				load_what <= `SR_70;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     			end
 
   | 
||
| 
     		`PLA:
 
   | 
||
| 
     			begin
 
   | 
||
| 
     			    inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG			    
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
                     if (m32) s32 <= TRUE;
 
   | 
||
| 
                     else if (m16) s16 <= TRUE;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (m32) s32 <= TRUE;
 
   | 
||
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     load_what <= `WORD_71S;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     				retstate <= ssm ? SSM1:IFETCH;
 
   | 
||
| ... | ... | |
| 
     		`PLX,`PLY:
 
   | 
||
| 
     			begin
 
   | 
||
| 
     			    inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG			    
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
                     if (xb32) s32 <= TRUE;
 
   | 
||
| 
                     else if (xb16) s16 <= TRUE;
 
   | 
||
| 
     `endif              
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
     				load_what <= `WORD_71S;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     				retstate <= ssm ? SSM1:IFETCH;
 
   | 
||
| ... | ... | |
| 
     		`PLB:
 
   | 
||
| 
     			begin
 
   | 
||
| 
     			    inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG			    
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
       				load_what <= `WORD_71S;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     				retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| ... | ... | |
| 
     		`PLD:
 
   | 
||
| 
     			begin
 
   | 
||
| 
     			    inc_sp();
 
   | 
||
| 
     `ifdef SUPPORT_SEG			    
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     			    s16 <= TRUE;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     if (!sop)
 
   | 
||
| 
     			        s16 <= TRUE;
 
   | 
||
| 
       				load_what <= `WORD_71S;
 
   | 
||
| 
     				state <= LOAD_MAC1;
 
   | 
||
| 
     				retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     if (lla) begin
 
   | 
||
| 
                         acc <= zp_address;
 
   | 
||
| 
                         next_state(IFETCH);
 
   | 
||
| 
                     end
 
   | 
||
| 
                     else 
 
   | 
||
| 
                         next_state(LOAD_MAC1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     mxb16 <= xb16;
 
   | 
||
| 
                     mxb32 <= xb32;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     //state <= LOAD_MAC2;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `ADC_ZP,`SBC_ZP,`AND_ZP,`ORA_ZP,`EOR_ZP,`CMP_ZP,
 
   | 
||
| ... | ... | |
| 
                     end
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     end
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     end
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (m32) s32 <= TRUE;
 
   | 
||
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_ACC70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STX_ZP:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_X70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STY_ZP:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_Y70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STZ_ZP:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zp_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (m32) s32 <= TRUE;
 
   | 
||
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_Z70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
     		// Handle zp,x mode
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpx_address;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                     if (lla) begin
 
   | 
||
| 
                         acc <= zpx_address;
 
   | 
||
| 
                         next_state(IFETCH);
 
   | 
||
| 
                     end
 
   | 
||
| 
                     else 
 
   | 
||
| 
                         next_state(LOAD_MAC1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpx_address;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpx_address;
 
   | 
||
| 
                     wadr <= zpx_address;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STA_ZPX:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zpx_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (m32) s32 <= TRUE;
 
   | 
||
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_ACC70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STY_ZPX:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zpx_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_Y70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `STZ_ZPX:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zpx_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (m32) s32 <= TRUE;
 
   | 
||
| 
                         else if (m16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_Z70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
             // Handle zp,y
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpy_address;
 
   | 
||
| 
                     data_read(zpy_address,1);
 
   | 
||
| 
                     next_state(LOAD_MAC1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     load_what <= `LOAD_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     wadr <= zpy_address;
 
   | 
||
| 
                     next_state(STORE1);
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| 
                         if (xb32) s32 <= TRUE;
 
   | 
||
| 
                         else if (xb16) s16 <= TRUE;
 
   | 
||
| 
                     end
 
   | 
||
| 
                     store_what <= `STW_X70;
 
   | 
||
| 
                     state <= STORE1;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| 
     		// Handle (zp,x)
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpx_address;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                 end
 
   | 
||
| 
             `ADC_IX,`SBC_IX,`AND_IX,`ORA_IX,`EOR_IX,`CMP_IX,`STA_IX:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zpx_address;
 
   | 
||
| 
                     data_read(zpx_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isIY <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isIY <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
             `LDA_DSP:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif           
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
             `STA_DSP:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
                     wadr <= dsp_address;
 
   | 
||
| 
                     if (!sop) begin
 
   | 
||
| ... | ... | |
| 
     		`LDA_DSPIY:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isIY <= `TRUE;
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isIY <= `TRUE;
 
   | 
||
| ... | ... | |
| 
     	   `LDA_XDSPIY:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                    inc_pc(24'd2);
 
   | 
||
| 
     `ifdef SUPPORT_SEG               
 
   | 
||
| 
                    seg <= ss_base;
 
   | 
||
| 
                    lmt <= ss_limit;
 
   | 
||
| 
                    mem_wr <= ss_wr;
 
   | 
||
| 
     `endif               
 
   | 
||
| 
                    radr <= dsp_address;
 
   | 
||
| 
                    mxb16 <= m16;
 
   | 
||
| 
                    mxb32 <= m32;
 
   | 
||
| 
                    isI32 <= `TRUE;
 
   | 
||
| 
                    isIY32 <= `TRUE;
 
   | 
||
| 
                    load_what <= `IA_70;
 
   | 
||
| 
                    state <= LOAD_MAC1;
 
   | 
||
| ... | ... | |
| 
            `ADC_XDSPIY,`SBC_XDSPIY,`CMP_XDSPIY,`ORA_XDSPIY,`AND_XDSPIY,`EOR_XDSPIY,`STA_XDSPIY:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
     `ifdef SUPPORT_SEG                
 
   | 
||
| 
                     seg <= ss_base;
 
   | 
||
| 
                     lmt <= ss_limit;
 
   | 
||
| 
                     mem_wr <= ss_wr;
 
   | 
||
| 
     `endif                
 
   | 
||
| 
                     radr <= dsp_address;
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isI32 <= TRUE;
 
   | 
||
| 
                     isIY32 <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isI24 <= `TRUE;
 
   | 
||
| 
                     isIY24 <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `ADC_IYL,`SBC_IYL,`AND_IYL,`ORA_IYL,`EOR_IYL,`CMP_IYL,`STA_IYL:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isI24 <= `TRUE;
 
   | 
||
| 
                     isIY24 <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                 end
 
   | 
||
| 
     `ifdef SUPPORT_NEW_INSN
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isI32 <= `TRUE;
 
   | 
||
| 
                     isIY32 <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                 end
 
   | 
||
| 
             `ADC_XIYL,`SBC_XIYL,`AND_XIYL,`ORA_XIYL,`EOR_XIYL,`CMP_XIYL,`STA_XIYL:
 
   | 
||
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     isI32 <= `TRUE;
 
   | 
||
| 
                     isIY32 <= `TRUE;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                 end
 
   | 
||
| 
     `endif
 
   | 
||
| ... | ... | |
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     isI24 <= `TRUE;
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     isI24 <= `TRUE;
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     isI32 <= `TRUE;
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= ssm ? SSM1 : IFETCH;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     isI32 <= `TRUE;
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
| 
                     state <= LOAD_MAC1;
 
   | 
||
| 
                     retstate <= CALC;
 
   | 
||
| 
                     bank_wrap <= !m832;
 
   | 
||
| 
                 end
 
   | 
||
| ... | ... | |
| 
                 begin
 
   | 
||
| 
                     inc_pc(24'd2);
 
   | 
||
| 
                     radr <= zp_address;
 
   | 
||
| 
                     data_read(zp_address,1);
 
   | 
||
| 
                     mxb16 <= m16;
 
   | 
||
| 
                     mxb32 <= m32;
 
   | 
||
| 
                     load_what <= `IA_70;
 
   | 
||
| 
                     state <= LOAD_MAC2;
 
   | 
||
Latest 65816 changes from Robs github