`include "opcodes.v" `timescale 1ns / 100ps `define FIRST a=0; `define NEXT a=a+1; module memory( data, address, write, clock ); inout [15:0] data; input [15:0] address; input write, clock; reg [15:0] Data_stored [ 511:0 ]; integer a, loop, multiply_next; assign data = (!write) ? Data_stored [address] : 16'bz; always @(posedge clock) if (write) Data_stored [address] <= #20 data; initial begin // Variables & Arrays `define VAR_A 16'd150 Data_stored[`VAR_A] = 16'dx; `define VAR_B 16'd151 Data_stored[`VAR_B] = 16'dx; `define VAR_P 16'd152 Data_stored[`VAR_P] = 16'dx; `define TEMP 16'd153 Data_stored[`TEMP] = 16'dx; `define ARRAY_1 16'd200 Data_stored[200] = 16'd6; Data_stored[201] = 16'd4; Data_stored[202] = 16'd5; Data_stored[203] = 0; Data_stored[204] = 16'dx; `define ARRAY_2 16'd210 Data_stored[210] = 16'd9; Data_stored[211] = 16'd21; Data_stored[212] = 16'd3; Data_stored[213] = 0; Data_stored[214] = 16'dx; `define ARRAY_3 16'd220 Data_stored[220] = 16'dx; Data_stored[221] = 16'dx; Data_stored[222] = 16'dx; Data_stored[223] = 16'dx; Data_stored[224] = 16'dx; // Program `FIRST // S=500 Data_stored[a] = {`LDS,`IMMEDIATE}; `NEXT Data_stored[a] =500; `NEXT // X=0 Data_stored[a] = {`LDX,`IMMEDIATE}; `NEXT Data_stored[a] = 0; `NEXT //.multiply_next P=0 multiply_next = a; Data_stored[a] = {`LDA,`IMMEDIATE}; `NEXT Data_stored[a] = 0; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_P; `NEXT // A=ARRAY_1[X] Data_stored[a] = {`LDA,`INDEXED}; `NEXT Data_stored[a] = `ARRAY_1; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_A; `NEXT // B=ARRAY_2[X] Data_stored[a] = {`LDA,`INDEXED}; `NEXT Data_stored[a] = `ARRAY_2; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_B; `NEXT // If (Z=1) Branch .loop Data_stored[a] = {`SUB,`IMMEDIATE}; `NEXT Data_stored[a] = 0; `NEXT Data_stored[a] = {`BEQ,`PC_RELATIVE}; `NEXT Data_stored[a] = 99-a; `NEXT // .loop AND #1 loop = a; Data_stored[a] = {`AND,`IMMEDIATE}; `NEXT Data_stored[a] = 1; `NEXT // If (Z == 1) Branch .noadd Data_stored[a] = {`BEQ,`PC_RELATIVE}; `NEXT Data_stored[a] = +16'd7; `NEXT // P=P+A Data_stored[a] = {`LDA,`DIRECT}; `NEXT Data_stored[a] = `VAR_P; `NEXT Data_stored[a] = {`ADD,`DIRECT}; `NEXT Data_stored[a] = `VAR_A; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_P; `NEXT // .noadd A=A<<1 Data_stored[a] = {`LDA,`DIRECT}; `NEXT Data_stored[a] = `VAR_A; `NEXT Data_stored[a] = {`LSL,`INHERENT}; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_A; `NEXT // B=B>>1 Data_stored[a] = {`LDA,`DIRECT}; `NEXT Data_stored[a] = `VAR_B; `NEXT Data_stored[a] = {`LSR,`INHERENT}; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `VAR_B; `NEXT // If (Z=0) Branch .loop Data_stored[a] = {`BNE,`PC_RELATIVE}; `NEXT Data_stored[a] = loop-a; `NEXT // ARRAY_3[X]=P Data_stored[a] = {`LDA,`DIRECT}; `NEXT Data_stored[a] = `VAR_P; `NEXT Data_stored[a] = {`STA,`INDEXED}; `NEXT Data_stored[a] = `ARRAY_3; `NEXT // X=X+1 Data_stored[a] = {`STX,`DIRECT}; `NEXT Data_stored[a] = `TEMP; `NEXT Data_stored[a] = {`LDA,`DIRECT}; `NEXT Data_stored[a] = `TEMP; `NEXT Data_stored[a] = {`ADD,`IMMEDIATE}; `NEXT Data_stored[a] = 1; `NEXT Data_stored[a] = {`STA,`DIRECT}; `NEXT Data_stored[a] = `TEMP; `NEXT Data_stored[a] = {`LDX,`DIRECT}; `NEXT Data_stored[a] = `TEMP; `NEXT // Branch .multiply_next Data_stored[a] = {`BA,`PC_RELATIVE}; `NEXT Data_stored[a] = multiply_next-a; `NEXT // .end Branch .end Data_stored[99] = {`BA,`PC_RELATIVE}; `NEXT Data_stored[100] = -16'd1; `NEXT end endmodule