------------------------------------------------------------------------- -- Project: JCPU, a portable 8-bit RISC CPU written in VHDL -- This file: The ROM file for use in your VHDL design -- Copyright (C) 2007 J. Ahrensfeld -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- This library is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- Lesser General Public License for more details. -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -- For questions and ideas, please contact the author at jens@jayfield.org ----------------------------------------------------------------------- LIBRARY ieee; use IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; library work; use work.cpu_pkg.all; -- JASM_ROM_INSERT_HERE ENTITY irom IS Port ( clk : in STD_LOGIC; ce : in STD_LOGIC; addr : in inst_addr_t; dout : out inst_t ); END irom; ARCHITECTURE sdr_test OF irom IS type imem_rom_t is array (0 to 342) of inst_t; -- Assembled from sdr_test.jsm constant imem_rom : imem_rom_t := ( "110000" & X"002", -- 0x000: JMP 0x002 "111111" & X"000", -- 0x001: RETI "111011" & X"0B1", -- 0x002: CALL 0x0B1 "000011" & X"000", -- 0x003: MOV R00, 0x00 "100100" & X"010", -- 0x004: XOUT (0x01), R00 "000011" & X"010", -- 0x005: MOV R00, 0x01 "111011" & X"0CE", -- 0x006: CALL 0x0CE "101000" & X"070", -- 0x007: XIN R00, (0x07) "100100" & X"010", -- 0x008: XOUT (0x01), R00 "011001" & X"800", -- 0x009: AND R00, 0x80 "110010" & X"007", -- 0x00A: JNZ 0x007 "000011" & X"001", -- 0x00B: MOV R01, 0x00 "111011" & X"0D3", -- 0x00C: CALL 0x0D3 "101000" & X"040", -- 0x00D: XIN R00, (0x04) "011011" & X"100", -- 0x00E: OR R00, 0x10 "100100" & X"040", -- 0x00F: XOUT (0x04), R00 "111011" & X"129", -- 0x010: CALL 0x129 "011011" & X"200", -- 0x011: OR R00, 0x20 "100100" & X"040", -- 0x012: XOUT (0x04), R00 "111011" & X"129", -- 0x013: CALL 0x129 "011001" & X"EF0", -- 0x014: AND R00, 0xEF "100100" & X"040", -- 0x015: XOUT (0x04), R00 "111011" & X"129", -- 0x016: CALL 0x129 "011001" & X"CF0", -- 0x017: AND R00, 0xCF "100100" & X"040", -- 0x018: XOUT (0x04), R00 "110000" & X"01A", -- 0x019: JMP 0x01A "000011" & X"010", -- 0x01A: MOV R00, 0x01 "111011" & X"0CE", -- 0x01B: CALL 0x0CE "000011" & X"0B1", -- 0x01C: MOV R01, 0x0B "111011" & X"0D3", -- 0x01D: CALL 0x0D3 "111011" & X"07F", -- 0x01E: CALL 0x07F "000011" & X"800", -- 0x01F: MOV R00, 0x80 "000011" & X"08F", -- 0x020: MOV R15, 0x08 "000111" & X"000", -- 0x021: MOVX (R00), 0x00 "010001" & X"010", -- 0x022: INC R00 "010101" & X"01F", -- 0x023: DEC R15 "110010" & X"021", -- 0x024: JNZ 0x021 "101000" & X"0A0", -- 0x025: XIN R00, (0x0A) "001111" & X"FF0", -- 0x026: CMP R00, 0xFF "111001" & X"031", -- 0x027: JEQ 0x031 "101000" & X"070", -- 0x028: XIN R00, (0x07) "100100" & X"010", -- 0x029: XOUT (0x01), R00 "011001" & X"020", -- 0x02A: AND R00, 0x02 "110010" & X"028", -- 0x02B: JNZ 0x028 "000011" & X"070", -- 0x02C: MOV R00, 0x07 "100101" & X"020", -- 0x02D: XOUT (R00), 0x02 "000011" & X"020", -- 0x02E: MOV R00, 0x02 "111011" & X"086", -- 0x02F: CALL 0x086 "110000" & X"025", -- 0x030: JMP 0x025 "111011" & X"096", -- 0x031: CALL 0x096 "111011" & X"122", -- 0x032: CALL 0x122 "000011" & X"010", -- 0x033: MOV R00, 0x01 "111011" & X"0CE", -- 0x034: CALL 0x0CE "000011" & X"1A1", -- 0x035: MOV R01, 0x1A "111011" & X"0D3", -- 0x036: CALL 0x0D3 "111011" & X"07F", -- 0x037: CALL 0x07F "000011" & X"000", -- 0x038: MOV R00, 0x00 "001101" & X"000", -- 0x039: MOVC (0x00), R00 "101000" & X"0A0", -- 0x03A: XIN R00, (0x0A) "001111" & X"FF0", -- 0x03B: CMP R00, 0xFF "111001" & X"051", -- 0x03C: JEQ 0x051 "001010" & X"001", -- 0x03D: MOVC R01, (0x00) "000011" & X"800", -- 0x03E: MOV R00, 0x80 "000011" & X"08F", -- 0x03F: MOV R15, 0x08 "000110" & X"001", -- 0x040: MOVX (R01), R00 "010001" & X"010", -- 0x041: INC R00 "010001" & X"011", -- 0x042: INC R01 "010101" & X"01F", -- 0x043: DEC R15 "110010" & X"040", -- 0x044: JNZ 0x040 "101000" & X"070", -- 0x045: XIN R00, (0x07) "100100" & X"010", -- 0x046: XOUT (0x01), R00 "011001" & X"020", -- 0x047: AND R00, 0x02 "110010" & X"045", -- 0x048: JNZ 0x045 "000011" & X"070", -- 0x049: MOV R00, 0x07 "100101" & X"020", -- 0x04A: XOUT (R00), 0x02 "000011" & X"020", -- 0x04B: MOV R00, 0x02 "111011" & X"086", -- 0x04C: CALL 0x086 "001010" & X"000", -- 0x04D: MOVC R00, (0x00) "010001" & X"010", -- 0x04E: INC R00 "001101" & X"000", -- 0x04F: MOVC (0x00), R00 "110000" & X"03A", -- 0x050: JMP 0x03A "111011" & X"096", -- 0x051: CALL 0x096 "111011" & X"122", -- 0x052: CALL 0x122 "000011" & X"010", -- 0x053: MOV R00, 0x01 "111011" & X"0CE", -- 0x054: CALL 0x0CE "000011" & X"281", -- 0x055: MOV R01, 0x28 "111011" & X"0D3", -- 0x056: CALL 0x0D3 "111011" & X"07F", -- 0x057: CALL 0x07F "000011" & X"000", -- 0x058: MOV R00, 0x00 "001101" & X"000", -- 0x059: MOVC (0x00), R00 "101000" & X"0A0", -- 0x05A: XIN R00, (0x0A) "001111" & X"FF0", -- 0x05B: CMP R00, 0xFF "111001" & X"073", -- 0x05C: JEQ 0x073 "000011" & X"070", -- 0x05D: MOV R00, 0x07 "100101" & X"010", -- 0x05E: XOUT (R00), 0x01 "101000" & X"070", -- 0x05F: XIN R00, (0x07) "100100" & X"010", -- 0x060: XOUT (0x01), R00 "011001" & X"010", -- 0x061: AND R00, 0x01 "110010" & X"05F", -- 0x062: JNZ 0x05F "001010" & X"001", -- 0x063: MOVC R01, (0x00) "000011" & X"800", -- 0x064: MOV R00, 0x80 "000011" & X"08F", -- 0x065: MOV R15, 0x08 "000100" & X"002", -- 0x066: MOVX R02, (R00) "001110" & X"012", -- 0x067: CMP R02, R01 "111010" & X"078", -- 0x068: JNE 0x078 "010001" & X"010", -- 0x069: INC R00 "010001" & X"011", -- 0x06A: INC R01 "010101" & X"01F", -- 0x06B: DEC R15 "110010" & X"066", -- 0x06C: JNZ 0x066 "000011" & X"020", -- 0x06D: MOV R00, 0x02 "111011" & X"086", -- 0x06E: CALL 0x086 "001010" & X"000", -- 0x06F: MOVC R00, (0x00) "010001" & X"010", -- 0x070: INC R00 "001101" & X"000", -- 0x071: MOVC (0x00), R00 "110000" & X"05A", -- 0x072: JMP 0x05A "000011" & X"C00", -- 0x073: MOV R00, 0xC0 "111011" & X"0CE", -- 0x074: CALL 0x0CE "000011" & X"361", -- 0x075: MOV R01, 0x36 "111011" & X"0D3", -- 0x076: CALL 0x0D3 "110000" & X"07D", -- 0x077: JMP 0x07D "000011" & X"C00", -- 0x078: MOV R00, 0xC0 "111011" & X"0CE", -- 0x079: CALL 0x0CE "000011" & X"401", -- 0x07A: MOV R01, 0x40 "111011" & X"0D3", -- 0x07B: CALL 0x0D3 "110000" & X"07D", -- 0x07C: JMP 0x07D "111011" & X"122", -- 0x07D: CALL 0x122 "110000" & X"01A", -- 0x07E: JMP 0x01A "111100" & X"000", -- 0x07F: PUSH R00 "000011" & X"000", -- 0x080: MOV R00, 0x00 "100100" & X"080", -- 0x081: XOUT (0x08), R00 "100100" & X"090", -- 0x082: XOUT (0x09), R00 "100100" & X"0A0", -- 0x083: XOUT (0x0A), R00 "111101" & X"000", -- 0x084: POP R00 "111110" & X"000", -- 0x085: RET "111100" & X"001", -- 0x086: PUSH R01 "111100" & X"002", -- 0x087: PUSH R02 "111100" & X"003", -- 0x088: PUSH R03 "101000" & X"081", -- 0x089: XIN R01, (0x08) "101000" & X"092", -- 0x08A: XIN R02, (0x09) "101000" & X"0A3", -- 0x08B: XIN R03, (0x0A) "010000" & X"001", -- 0x08C: ADD R01, R00 "010011" & X"002", -- 0x08D: ADDC R02, 0x00 "010011" & X"003", -- 0x08E: ADDC R03, 0x00 "100100" & X"081", -- 0x08F: XOUT (0x08), R01 "100100" & X"092", -- 0x090: XOUT (0x09), R02 "100100" & X"0A3", -- 0x091: XOUT (0x0A), R03 "111101" & X"003", -- 0x092: POP R03 "111101" & X"002", -- 0x093: POP R02 "111101" & X"001", -- 0x094: POP R01 "111110" & X"000", -- 0x095: RET "000011" & X"C00", -- 0x096: MOV R00, 0xC0 "111011" & X"0CE", -- 0x097: CALL 0x0CE "101000" & X"0A0", -- 0x098: XIN R00, (0x0A) "111011" & X"09F", -- 0x099: CALL 0x09F "101000" & X"090", -- 0x09A: XIN R00, (0x09) "111011" & X"09F", -- 0x09B: CALL 0x09F "101000" & X"080", -- 0x09C: XIN R00, (0x08) "111011" & X"09F", -- 0x09D: CALL 0x09F "111110" & X"000", -- 0x09E: RET "111011" & X"0AA", -- 0x09F: CALL 0x0AA "111011" & X"0E5", -- 0x0A0: CALL 0x0E5 "000010" & X"010", -- 0x0A1: MOV R00, R01 "111011" & X"0E5", -- 0x0A2: CALL 0x0E5 "111110" & X"000", -- 0x0A3: RET "011001" & X"0F0", -- 0x0A4: AND R00, 0x0F "001111" & X"0A0", -- 0x0A5: CMP R00, 0x0A "110101" & X"0A8", -- 0x0A6: JLT 0x0A8 "010001" & X"070", -- 0x0A7: ADD R00, 0x07 "010001" & X"300", -- 0x0A8: ADD R00, 0x30 "111110" & X"000", -- 0x0A9: RET "111100" & X"000", -- 0x0AA: PUSH R00 "111011" & X"0A4", -- 0x0AB: CALL 0x0A4 "000010" & X"001", -- 0x0AC: MOV R01, R00 "111101" & X"000", -- 0x0AD: POP R00 "101010" & X"000", -- 0x0AE: SWAP R00 "111011" & X"0A4", -- 0x0AF: CALL 0x0A4 "111110" & X"000", -- 0x0B0: RET "000011" & X"002", -- 0x0B1: MOV R02, 0x00 "000011" & X"030", -- 0x0B2: MOV R00, 0x03 "111011" & X"0FD", -- 0x0B3: CALL 0x0FD "111011" & X"130", -- 0x0B4: CALL 0x130 "000011" & X"002", -- 0x0B5: MOV R02, 0x00 "000011" & X"030", -- 0x0B6: MOV R00, 0x03 "111011" & X"0FD", -- 0x0B7: CALL 0x0FD "111011" & X"130", -- 0x0B8: CALL 0x130 "000011" & X"002", -- 0x0B9: MOV R02, 0x00 "000011" & X"020", -- 0x0BA: MOV R00, 0x02 "111011" & X"0FD", -- 0x0BB: CALL 0x0FD "111011" & X"137", -- 0x0BC: CALL 0x137 "000011" & X"280", -- 0x0BD: MOV R00, 0x28 "111011" & X"0CE", -- 0x0BE: CALL 0x0CE "000011" & X"0C0", -- 0x0BF: MOV R00, 0x0C "111011" & X"0CE", -- 0x0C0: CALL 0x0CE "000011" & X"060", -- 0x0C1: MOV R00, 0x06 "111011" & X"0CE", -- 0x0C2: CALL 0x0CE "000011" & X"010", -- 0x0C3: MOV R00, 0x01 "111011" & X"0CE", -- 0x0C4: CALL 0x0CE "111110" & X"000", -- 0x0C5: RET "111100" & X"000", -- 0x0C6: PUSH R00 "111011" & X"0F1", -- 0x0C7: CALL 0x0F1 "011001" & X"800", -- 0x0C8: AND R00, 0x80 "110001" & X"0CC", -- 0x0C9: JZ 0x0CC "111011" & X"14E", -- 0x0CA: CALL 0x14E "110000" & X"0C7", -- 0x0CB: JMP 0x0C7 "111101" & X"000", -- 0x0CC: POP R00 "111110" & X"000", -- 0x0CD: RET "111100" & X"002", -- 0x0CE: PUSH R02 "000011" & X"002", -- 0x0CF: MOV R02, 0x00 "111011" & X"0EA", -- 0x0D0: CALL 0x0EA "111101" & X"002", -- 0x0D1: POP R02 "111110" & X"000", -- 0x0D2: RET "111100" & X"000", -- 0x0D3: PUSH R00 "000100" & X"010", -- 0x0D4: MOVX R00, (R01) "010001" & X"011", -- 0x0D5: INC R01 "001111" & X"000", -- 0x0D6: TST R00 "110001" & X"0DA", -- 0x0D7: JZ 0x0DA "111011" & X"0E5", -- 0x0D8: CALL 0x0E5 "110000" & X"0D4", -- 0x0D9: JMP 0x0D4 "111101" & X"000", -- 0x0DA: POP R00 "111110" & X"000", -- 0x0DB: RET "111100" & X"000", -- 0x0DC: PUSH R00 "001001" & X"010", -- 0x0DD: MOVC R00, (R01) "010001" & X"011", -- 0x0DE: INC R01 "001111" & X"000", -- 0x0DF: TST R00 "110001" & X"0E3", -- 0x0E0: JZ 0x0E3 "111011" & X"0E5", -- 0x0E1: CALL 0x0E5 "110000" & X"0DD", -- 0x0E2: JMP 0x0DD "111101" & X"000", -- 0x0E3: POP R00 "111110" & X"000", -- 0x0E4: RET "111100" & X"002", -- 0x0E5: PUSH R02 "000011" & X"402", -- 0x0E6: MOV R02, 0x40 "111011" & X"0EA", -- 0x0E7: CALL 0x0EA "111101" & X"002", -- 0x0E8: POP R02 "111110" & X"000", -- 0x0E9: RET "111011" & X"0C6", -- 0x0EA: CALL 0x0C6 "111100" & X"000", -- 0x0EB: PUSH R00 "101010" & X"000", -- 0x0EC: SWAP R00 "111011" & X"0FD", -- 0x0ED: CALL 0x0FD "111101" & X"000", -- 0x0EE: POP R00 "111011" & X"0FD", -- 0x0EF: CALL 0x0FD "111110" & X"000", -- 0x0F0: RET "111100" & X"002", -- 0x0F1: PUSH R02 "000011" & X"002", -- 0x0F2: MOV R02, 0x00 "111011" & X"0F6", -- 0x0F3: CALL 0x0F6 "111101" & X"002", -- 0x0F4: POP R02 "111110" & X"000", -- 0x0F5: RET "111011" & X"110", -- 0x0F6: CALL 0x110 "101010" & X"000", -- 0x0F7: SWAP R00 "111100" & X"000", -- 0x0F8: PUSH R00 "111011" & X"110", -- 0x0F9: CALL 0x110 "111101" & X"002", -- 0x0FA: POP R02 "011010" & X"020", -- 0x0FB: OR R00, R02 "111110" & X"000", -- 0x0FC: RET "111100" & X"001", -- 0x0FD: PUSH R01 "011001" & X"0F0", -- 0x0FE: AND R00, 0x0F "000010" & X"001", -- 0x0FF: MOV R01, R00 "011010" & X"021", -- 0x100: OR R01, R02 "100100" & X"031", -- 0x101: XOUT (0x03), R01 "111011" & X"14E", -- 0x102: CALL 0x14E "000010" & X"001", -- 0x103: MOV R01, R00 "011010" & X"021", -- 0x104: OR R01, R02 "011011" & X"801", -- 0x105: OR R01, 0x80 "100100" & X"031", -- 0x106: XOUT (0x03), R01 "111011" & X"14E", -- 0x107: CALL 0x14E "000010" & X"001", -- 0x108: MOV R01, R00 "011010" & X"021", -- 0x109: OR R01, R02 "100100" & X"031", -- 0x10A: XOUT (0x03), R01 "111011" & X"14E", -- 0x10B: CALL 0x14E "011011" & X"201", -- 0x10C: OR R01, 0x20 "100100" & X"031", -- 0x10D: XOUT (0x03), R01 "111101" & X"001", -- 0x10E: POP R01 "111110" & X"000", -- 0x10F: RET "111100" & X"001", -- 0x110: PUSH R01 "000011" & X"201", -- 0x111: MOV R01, 0x20 "011010" & X"021", -- 0x112: OR R01, R02 "100100" & X"031", -- 0x113: XOUT (0x03), R01 "111011" & X"14E", -- 0x114: CALL 0x14E "000011" & X"201", -- 0x115: MOV R01, 0x20 "011010" & X"021", -- 0x116: OR R01, R02 "011011" & X"801", -- 0x117: OR R01, 0x80 "100100" & X"031", -- 0x118: XOUT (0x03), R01 "111011" & X"14E", -- 0x119: CALL 0x14E "101000" & X"030", -- 0x11A: XIN R00, (0x03) "011001" & X"0F0", -- 0x11B: AND R00, 0x0F "000011" & X"201", -- 0x11C: MOV R01, 0x20 "011010" & X"021", -- 0x11D: OR R01, R02 "100100" & X"031", -- 0x11E: XOUT (0x03), R01 "111011" & X"14E", -- 0x11F: CALL 0x14E "111101" & X"001", -- 0x120: POP R01 "111110" & X"000", -- 0x121: RET "111100" & X"00F", -- 0x122: PUSH R15 "000011" & X"0AF", -- 0x123: MOV R15, 0x0A "111011" & X"129", -- 0x124: CALL 0x129 "010101" & X"01F", -- 0x125: DEC R15 "110010" & X"124", -- 0x126: JNZ 0x124 "111101" & X"00F", -- 0x127: POP R15 "111110" & X"000", -- 0x128: RET "111100" & X"00F", -- 0x129: PUSH R15 "000011" & X"0AF", -- 0x12A: MOV R15, 0x0A "111011" & X"130", -- 0x12B: CALL 0x130 "010101" & X"01F", -- 0x12C: DEC R15 "110010" & X"12B", -- 0x12D: JNZ 0x12B "111101" & X"00F", -- 0x12E: POP R15 "111110" & X"000", -- 0x12F: RET "111100" & X"00F", -- 0x130: PUSH R15 "000011" & X"0AF", -- 0x131: MOV R15, 0x0A "111011" & X"137", -- 0x132: CALL 0x137 "010101" & X"01F", -- 0x133: DEC R15 "110010" & X"132", -- 0x134: JNZ 0x132 "111101" & X"00F", -- 0x135: POP R15 "111110" & X"000", -- 0x136: RET "111100" & X"00F", -- 0x137: PUSH R15 "000011" & X"0AF", -- 0x138: MOV R15, 0x0A "111011" & X"13E", -- 0x139: CALL 0x13E "010101" & X"01F", -- 0x13A: DEC R15 "110010" & X"139", -- 0x13B: JNZ 0x139 "111101" & X"00F", -- 0x13C: POP R15 "111110" & X"000", -- 0x13D: RET "111100" & X"00F", -- 0x13E: PUSH R15 "000011" & X"0AF", -- 0x13F: MOV R15, 0x0A "111011" & X"145", -- 0x140: CALL 0x145 "010101" & X"01F", -- 0x141: DEC R15 "110010" & X"140", -- 0x142: JNZ 0x140 "111101" & X"00F", -- 0x143: POP R15 "111110" & X"000", -- 0x144: RET "111100" & X"00F", -- 0x145: PUSH R15 "000011" & X"63F", -- 0x146: MOV R15, 0x63 "000000" & X"000", -- 0x147: NOP "000000" & X"000", -- 0x148: NOP "000000" & X"000", -- 0x149: NOP "010101" & X"01F", -- 0x14A: DEC R15 "110010" & X"147", -- 0x14B: JNZ 0x147 "111101" & X"00F", -- 0x14C: POP R15 "111110" & X"000", -- 0x14D: RET "111100" & X"00F", -- 0x14E: PUSH R15 "000011" & X"09F", -- 0x14F: MOV R15, 0x09 "000000" & X"000", -- 0x150: NOP "000000" & X"000", -- 0x151: NOP "000000" & X"000", -- 0x152: NOP "010101" & X"01F", -- 0x153: DEC R15 "110010" & X"150", -- 0x154: JNZ 0x150 "111101" & X"00F", -- 0x155: POP R15 "111110" & X"000" -- 0x156: RET ); begin PROM_READ: process(clk, ce) begin if rising_edge(clk) and ce = '1' then dout <= imem_rom(to_integer(addr)); end if; end process; end sdr_test;