From ea60299d26289abda8cead39f7ddee5458817d3a Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 21 Mar 2021 10:47:01 +0000 Subject: [PATCH] - added git-svn-id: http://moon:8086/svn/vhdl/trunk@1414 cc03376c-175c-47c8-b038-4cd826a8556b --- projects/cpu/Makefile | 68 + projects/cpu/asm/counter.jsm | 284 ++ projects/cpu/asm/counter.tcl | 3156 +++++++++++++++++ projects/cpu/asm/cse.tcl | 247 ++ projects/cpu/asm/greet.jsm | 379 ++ projects/cpu/asm/greet.tcl | 797 +++++ projects/cpu/asm/make | 51 + projects/cpu/asm/pen_test.jsm | 773 ++++ projects/cpu/asm/pen_test.tcl | 2474 +++++++++++++ projects/cpu/asm/rom.tcl | 64 + projects/cpu/asm/sdr_test.jsm | 306 ++ projects/cpu/asm/sdr_test.tcl | 1239 +++++++ projects/cpu/asm/sdr_test_short.jsm | 215 ++ projects/cpu/asm/sdr_test_short.tcl | 542 +++ projects/cpu/asm/sdr_tst.tcl | 62 + projects/cpu/asm/sdram_test.jsm | 472 +++ projects/cpu/asm/sdram_test.tcl | 1751 +++++++++ projects/cpu/asm/sdram_test_short.jsm | 308 ++ projects/cpu/asm/sdram_test_short.tcl | 704 ++++ projects/cpu/asm/test.jsm | 188 + projects/cpu/asm/test.tcl | 0 projects/cpu/asm/uart_test.jsm | 510 +++ projects/cpu/asm/uart_test.tcl | 1103 ++++++ projects/cpu/asm/vga_test.jsm | 736 ++++ projects/cpu/asm/vga_test.tcl | 2402 +++++++++++++ projects/cpu/asm/xregs.inc.jsm | 41 + projects/cpu/doc/cpu.vsd | Bin 0 -> 105984 bytes projects/cpu/doc/cpu20070129.vsd | Bin 0 -> 104960 bytes projects/cpu/doc/cpu20070130.vsd | Bin 0 -> 184832 bytes projects/cpu/doc/cpu20070131.vsd | Bin 0 -> 108032 bytes projects/cpu/doc/cpu20070203.vsd | Bin 0 -> 206848 bytes projects/cpu/doc/cpu20070315.vsd | Bin 0 -> 230400 bytes projects/cpu/doc/cpu20070404.vsd | Bin 0 -> 238592 bytes projects/cpu/doc/timing_template.vss | Bin 0 -> 20992 bytes projects/cpu/sim/tb_systest.fdo | 51 + projects/cpu/sim/tb_systest.mdo | 18 + projects/cpu/sim/tb_systest.ndo | 18 + projects/cpu/sim/tb_systest.tdo | 18 + projects/cpu/sim/tb_systest.wdo | 96 + projects/cpu/sim/tb_systest.wtdo | 50 + projects/cpu/src/systest/counter_irom.vhdl | 1086 ++++++ projects/cpu/src/systest/counter_irom_ld.vhdl | 1182 ++++++ projects/cpu/src/systest/counter_xrom.vhdl | 318 ++ projects/cpu/src/systest/counter_xrom_ld.vhdl | 414 +++ projects/cpu/src/systest/cpu_embedded.vhd | 107 + projects/cpu/src/systest/sdr_test_irom.vhdl | 405 +++ .../cpu/src/systest/sdr_test_irom_ld.vhdl | 1182 ++++++ .../cpu/src/systest/sdr_test_short_irom.vhdl | 172 + .../src/systest/sdr_test_short_irom_ld.vhdl | 1181 ++++++ .../cpu/src/systest/sdr_test_short_xrom.vhdl | 317 ++ .../src/systest/sdr_test_short_xrom_ld.vhdl | 413 +++ projects/cpu/src/systest/sdr_test_xrom.vhdl | 318 ++ .../cpu/src/systest/sdr_test_xrom_ld.vhdl | 414 +++ projects/cpu/src/systest/sdr_tst_irom.vhdl | 0 projects/cpu/src/systest/sdr_tst_irom_ld.vhdl | 0 projects/cpu/src/systest/sdr_tst_xrom.vhdl | 0 projects/cpu/src/systest/sdr_tst_xrom_ld.vhdl | 0 projects/cpu/src/systest/sdram_config.vhd | 74 + projects/cpu/src/systest/sdram_test_irom.vhdl | 575 +++ .../cpu/src/systest/sdram_test_irom_ld.vhdl | 1181 ++++++ .../src/systest/sdram_test_short_irom.vhdl | 226 ++ .../src/systest/sdram_test_short_irom_ld.vhdl | 1181 ++++++ .../src/systest/sdram_test_short_xrom.vhdl | 317 ++ .../src/systest/sdram_test_short_xrom_ld.vhdl | 413 +++ projects/cpu/src/systest/sdram_test_xrom.vhdl | 317 ++ .../cpu/src/systest/sdram_test_xrom_ld.vhdl | 413 +++ projects/cpu/src/systest/systest.bak.vhd | 1099 ++++++ projects/cpu/src/systest/systest.orig.vhd | 408 +++ projects/cpu/src/systest/systest.vhd | 1140 ++++++ projects/cpu/src/systest/systest_cfg.vhd | 19 + projects/cpu/src/systest/tb_systest.vhd | 166 + projects/cpu/src/systest/vga_test_irom.vhdl | 786 ++++ .../cpu/src/systest/vga_test_irom_ld.vhdl | 1181 ++++++ projects/cpu/src/systest/vga_test_xrom.vhdl | 317 ++ .../cpu/src/systest/vga_test_xrom_ld.vhdl | 413 +++ .../cpu/syn/ise91/systest/project/systest.lso | 1 + .../cpu/syn/ise91/systest/project/systest.prj | 34 + .../cpu/syn/ise91/systest/project/systest.ucf | 337 ++ .../cpu/syn/ise91/systest/project/systest.ut | 33 + .../cpu/syn/ise91/systest/project/systest.xst | 59 + 80 files changed, 37322 insertions(+) create mode 100644 projects/cpu/Makefile create mode 100644 projects/cpu/asm/counter.jsm create mode 100644 projects/cpu/asm/counter.tcl create mode 100644 projects/cpu/asm/cse.tcl create mode 100644 projects/cpu/asm/greet.jsm create mode 100644 projects/cpu/asm/greet.tcl create mode 100644 projects/cpu/asm/make create mode 100644 projects/cpu/asm/pen_test.jsm create mode 100644 projects/cpu/asm/pen_test.tcl create mode 100644 projects/cpu/asm/rom.tcl create mode 100644 projects/cpu/asm/sdr_test.jsm create mode 100644 projects/cpu/asm/sdr_test.tcl create mode 100644 projects/cpu/asm/sdr_test_short.jsm create mode 100644 projects/cpu/asm/sdr_test_short.tcl create mode 100644 projects/cpu/asm/sdr_tst.tcl create mode 100644 projects/cpu/asm/sdram_test.jsm create mode 100644 projects/cpu/asm/sdram_test.tcl create mode 100644 projects/cpu/asm/sdram_test_short.jsm create mode 100644 projects/cpu/asm/sdram_test_short.tcl create mode 100644 projects/cpu/asm/test.jsm create mode 100644 projects/cpu/asm/test.tcl create mode 100644 projects/cpu/asm/uart_test.jsm create mode 100644 projects/cpu/asm/uart_test.tcl create mode 100644 projects/cpu/asm/vga_test.jsm create mode 100644 projects/cpu/asm/vga_test.tcl create mode 100644 projects/cpu/asm/xregs.inc.jsm create mode 100644 projects/cpu/doc/cpu.vsd create mode 100644 projects/cpu/doc/cpu20070129.vsd create mode 100644 projects/cpu/doc/cpu20070130.vsd create mode 100644 projects/cpu/doc/cpu20070131.vsd create mode 100644 projects/cpu/doc/cpu20070203.vsd create mode 100644 projects/cpu/doc/cpu20070315.vsd create mode 100644 projects/cpu/doc/cpu20070404.vsd create mode 100644 projects/cpu/doc/timing_template.vss create mode 100644 projects/cpu/sim/tb_systest.fdo create mode 100644 projects/cpu/sim/tb_systest.mdo create mode 100644 projects/cpu/sim/tb_systest.ndo create mode 100644 projects/cpu/sim/tb_systest.tdo create mode 100644 projects/cpu/sim/tb_systest.wdo create mode 100644 projects/cpu/sim/tb_systest.wtdo create mode 100644 projects/cpu/src/systest/counter_irom.vhdl create mode 100644 projects/cpu/src/systest/counter_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/counter_xrom.vhdl create mode 100644 projects/cpu/src/systest/counter_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/cpu_embedded.vhd create mode 100644 projects/cpu/src/systest/sdr_test_irom.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_short_irom.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_short_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_short_xrom.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_short_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_xrom.vhdl create mode 100644 projects/cpu/src/systest/sdr_test_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdr_tst_irom.vhdl create mode 100644 projects/cpu/src/systest/sdr_tst_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdr_tst_xrom.vhdl create mode 100644 projects/cpu/src/systest/sdr_tst_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdram_config.vhd create mode 100644 projects/cpu/src/systest/sdram_test_irom.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_short_irom.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_short_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_short_xrom.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_short_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_xrom.vhdl create mode 100644 projects/cpu/src/systest/sdram_test_xrom_ld.vhdl create mode 100644 projects/cpu/src/systest/systest.bak.vhd create mode 100644 projects/cpu/src/systest/systest.orig.vhd create mode 100644 projects/cpu/src/systest/systest.vhd create mode 100644 projects/cpu/src/systest/systest_cfg.vhd create mode 100644 projects/cpu/src/systest/tb_systest.vhd create mode 100644 projects/cpu/src/systest/vga_test_irom.vhdl create mode 100644 projects/cpu/src/systest/vga_test_irom_ld.vhdl create mode 100644 projects/cpu/src/systest/vga_test_xrom.vhdl create mode 100644 projects/cpu/src/systest/vga_test_xrom_ld.vhdl create mode 100644 projects/cpu/syn/ise91/systest/project/systest.lso create mode 100644 projects/cpu/syn/ise91/systest/project/systest.prj create mode 100644 projects/cpu/syn/ise91/systest/project/systest.ucf create mode 100644 projects/cpu/syn/ise91/systest/project/systest.ut create mode 100644 projects/cpu/syn/ise91/systest/project/systest.xst diff --git a/projects/cpu/Makefile b/projects/cpu/Makefile new file mode 100644 index 0000000..8f22854 --- /dev/null +++ b/projects/cpu/Makefile @@ -0,0 +1,68 @@ +# ------------------------------------------------- +# Global options +# ------------------------------------------------- +LANG_STD := 93c +IEEE_STD := standard +WORK_PATH := work +SOURCE_PATH := src +LIB_PATH := ../lib + +# ------------------------------------------------- +# Target options +# ------------------------------------------------- +TARGET := tb_cpu + +SOURCES := $(SOURCE_PATH)/cpu_pkg.vhd \ + $(SOURCE_PATH)/stack.vhd \ + $(SOURCE_PATH)/pc.vhd \ + $(SOURCE_PATH)/reg_dual.vhd \ + $(SOURCE_PATH)/dpath_ctrl.vhd \ + $(SOURCE_PATH)/cpu.vhd \ + $(SOURCE_PATH)/alu.vhd \ + $(SOURCE_PATH)/$(TARGET).vhd + +# ------------------------------------------------- +GHDL_OPT := --workdir=$(WORK_PATH) --std=$(LANG_STD) --ieee=$(IEEE_STD) + +# ------------------------------------------------- +all: elaborate + +.PHONY: syntax +syntax: + ghdl -s $(GHDL_OPT) $(SOURCES) + +import: + ghdl -i $(GHDL_OPT) $(LIB_PATH)/*.vhd $(SOURCES) + +analyze: + ghdl -a $(GHDL_OPT) $(LIB_PATH)/*.vhd $(SOURCES) + +anaborate: + ghdl -c $(GHDL_OPT) $(LIB_PATH)/*.vhd $(SOURCES) -e $(TARGET) + +makeunit: analyze + ghdl -m $(GHDL_OPT) $(TARGET) + +elaborate: analyze + ghdl -e $(GHDL_OPT) $(TARGET) + +run: elaborate + ghdl -r $(GHDL_OPT) $(TARGET) --vcd=$(TARGET).vcd --wave=$(TARGET).ghw --assert-level=error + +show: $(TARGET).vcd + gtkwave $(TARGET).ghw $(TARGET).sav + +xref: import + mkdir -p html + ghdl --xref-html $(SOURCES) + +tree: elaborate + ./$(TARGET) --no-run --disp-tree=inst + +# ------------------------------------------------- +.PHONY: clean +clean: + rm -rf $(TARGET) + cd $(WORK_PATH); rm -rf *.o *.cf + +# ------------------------------------------------- diff --git a/projects/cpu/asm/counter.jsm b/projects/cpu/asm/counter.jsm new file mode 100644 index 0000000..2b3175a --- /dev/null +++ b/projects/cpu/asm/counter.jsm @@ -0,0 +1,284 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +CR: equ 0x0D +LF: equ 0x0A +report_ival: equ 0x64 + +; External RAM/ROM + xmem +msg_txt: dc "J-CPU V1.", 0 + +; Internal RAM + cmem 0 +count: db 4 + +cntDigit: db 8 + +count_stat: db 1 +shifter: db 1 + +ram_txt_start: db 15 +ram_txt_end: db 1 +ram_txt_ptr: db 1 +upd_z1: db 1 +page_test_var: db 1 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp ende + + org 1023 +ende: jmp init + + org 0x001 +; ------------------------------------------------- +; ISR +; ------------------------------------------------- +isr: push R0 + push R1 + push R2 + push R3 + push R4 + push R5 + push R6 + push R7 + push R8 + push R9 + push R10 + push R11 + push R12 + push R13 + push R14 + push R15 + + xin R0, (uart_status) + and R0, 0x10 + jz rcv_empty + xin R0, (uart_data) + cmp R0, 0x0D + jeq reset_ptr + movc R1, (ram_txt_ptr) + movc (R1), R0 + cmp R1, ram_txt_end + jlt inc_ptr +reset_ptr: mov R1, ram_txt_start + dec R1 + movc (upd_z1), R1 +inc_ptr: inc R1 + movc (ram_txt_ptr), R1 +rcv_empty: call Cnt32 + + pop R15 + pop R14 + pop R13 + pop R12 + pop R11 + pop R10 + pop R9 + pop R8 + pop R7 + pop R6 + pop R5 + pop R4 + pop R3 + pop R2 + pop R1 + pop R0 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +init: ; org 0x40 + + call CounterInit + call LCD_init + mov R0, 0x00 + movc (count_stat), R0 + xout (led_port), R0 + movc (upd_z1), R0 + xin R1, (btn_port) + or R1, 0x80 + movc (shifter), R1 + mov R0, ram_txt_start + movc (ram_txt_ptr), R0 + + mov R0, ctrl_reg + ; Enable timer + xout (R0), 0x02 + ; Enable interrupt source + xout (R0), 0x03 + mov R0, report_ival + movc (count_stat), R0 + + ; Enable CPU interrupt + mov R0, 0x03 + cout (cpu_int_ctrl), R0 + + ; Print Hello world + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, msg_txt + call LCD_putsx + + ; Read revision reg to form version number v1. +end_txt: cin R0, (cpu_revision) + add R0, 0x30 + call LCD_writechar + + ; check page sel function + mov R0, 0x00 + cout (cpu_control), R0 + mov R1, 0x00 + movc (page_test_var), R1 + + mov R0, 0x01 + cout (cpu_control), R0 + mov R1, 0xAA + movc (page_test_var), R1 + + mov R0, 0x00 + cout (cpu_control), R0 + movc R0, (page_test_var) + cmp R0, 0xAA + jeq error + + mov R0, 0x01 + cout (cpu_control), R0 + movc R0, (page_test_var) + cmp R0, 0xAA + jeq page_reset + +error: jmp error + +page_reset: mov R0, 0x00 + cout (cpu_control), R0 + +; ------------------------------------------------- +; Main loop +; ------------------------------------------------- +start: halt + + movc R0, (count_stat) + dec R0 + movc (count_stat), R0 + jnz start + mov R7, report_ival + movc R1, (cntDigit+0) + movc R2, (cntDigit+1) + swap R1 + xor R1, R2 + and R1, 0x02 + jnz do_add + dec R7 + mov R0, 0x2D + jmp upd_cs + +do_add: inc R7 + mov R0, 0x2B +upd_cs: movc (count_stat), R7 + call sout + + ; Toggle LED + movc R0, (shifter) + rol R0 + movc (shifter), R0 + +; xin R0, (led_port) +; xor R0, 0x02 + xout (led_port), R0 + + movc R0, (upd_z1) + mov R1, 0x00 + movc (upd_z1), R1 + tst R0 + jz upd_num + + mov R1, ram_txt_start +read_ram: movc R0, (R1) + call LCD_writechar + inc R1 + cmp R1, ram_txt_end + jle read_ram + + ; Write digits to LCD and serial +upd_num: call UpdateDigits + mov R0, LCD_CMD_Z2 + call LCD_writecmd + mov R1, cntDigit+7 +print_num: movc R0, (R1) + call sout + call LCD_writechar + cmp R1, cntDigit+0 + jeq sendCRLF + dec R1 + jmp print_num + +sendCRLF: mov R0, CR + call sout + mov R0, LF + call sout + +ex_print: jmp start + +; ------------------------------------------------- +CounterInit: mov R0, 0x00 + movc (count+0), R0 + movc (count+1), R0 + movc (count+2), R0 + movc (count+3), R0 + ret + +; ------------------------------------------------- +Cnt32: mov R0, count+0 +cloop: movc R1, (R0) + inc R1 + movc (R0), R1 + jnc CountRdy + cmp R0, count+3 + jeq CountRdy + inc R0 + jmp cloop +CountRdy: ret + +; ------------------------------------------------- +UpdateDigits: mov R2, cntDigit+0 + mov R0, count+0 +dualLoop: movc R1, (R0) + and R1, 0x0F + cmp R1, 0x0A + jlt isNum1 + add R1, 0x07 +isNum1: add R1, 0x30 + movc (R2), R1 + inc R2 + movc R1, (R0) + swap R1 + and R1, 0x0F + cmp R1, 0x0A + jlt isNum2 + add R1, 0x07 +isNum2: add R1, 0x30 + movc (R2), R1 + cmp R0, count+3 + jeq UpdRdy + inc R0 + inc R2 + jmp dualLoop +UpdRdy: ret + +; ------------------------------------------------- +include "../../../lib/jasm/uart.inc.jsm" +include "../../../lib/jasm/lcd.inc.jsm" +include "../../../lib/jasm/delays.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/counter.tcl b/projects/cpu/asm/counter.tcl new file mode 100644 index 0000000..e9415d1 --- /dev/null +++ b/projects/cpu/asm/counter.tcl @@ -0,0 +1,3156 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from counter.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "000303FF" + +# 0x001: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013C000" + +# 0x002: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0023C001" + +# 0x003: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0033C002" + +# 0x004: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0043C003" + +# 0x005: PUSH R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0053C004" + +# 0x006: PUSH R05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0063C005" + +# 0x007: PUSH R06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0073C006" + +# 0x008: PUSH R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0083C007" + +# 0x009: PUSH R08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0093C008" + +# 0x00A: PUSH R09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A3C009" + +# 0x00B: PUSH R10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B3C00A" + +# 0x00C: PUSH R11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C3C00B" + +# 0x00D: PUSH R12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D3C00C" + +# 0x00E: PUSH R13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E3C00D" + +# 0x00F: PUSH R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F3C00E" + +# 0x010: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103C00F" + +# 0x011: XIN R00, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01128060" + +# 0x012: AND R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01219100" + +# 0x013: JZ 0x020 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01331020" + +# 0x014: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01428020" + +# 0x015: CMP R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0150F0D0" + +# 0x016: JEQ 0x01B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163901B" + +# 0x017: MOVC R01, (0x1E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0170A1E1" + +# 0x018: MOVC (R00), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0180B010" + +# 0x019: CMP R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0190F1D1" + +# 0x01A: JLT 0x01E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A3501E" + +# 0x01B: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B030E1" + +# 0x01C: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C15011" + +# 0x01D: MOVC (0x1F), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D0D1F1" + +# 0x01E: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E11011" + +# 0x01F: MOVC (0x1E), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F0D1E1" + +# 0x020: CALL 0x098 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0203B098" + +# 0x021: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0213D00F" + +# 0x022: POP R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0223D00E" + +# 0x023: POP R13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0233D00D" + +# 0x024: POP R12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0243D00C" + +# 0x025: POP R11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0253D00B" + +# 0x026: POP R10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0263D00A" + +# 0x027: POP R09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0273D009" + +# 0x028: POP R08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0283D008" + +# 0x029: POP R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0293D007" + +# 0x02A: POP R06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A3D006" + +# 0x02B: POP R05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B3D005" + +# 0x02C: POP R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C3D004" + +# 0x02D: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D3D003" + +# 0x02E: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E3D002" + +# 0x02F: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F3D001" + +# 0x030: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0303D000" + +# 0x031: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0313F000" + +# 0x032: CALL 0x092 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0323B092" + +# 0x033: CALL 0x0C8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0333B0C8" + +# 0x034: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03403000" + +# 0x035: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0350D0C0" + +# 0x036: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03624010" + +# 0x037: MOVC (0x1F), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0370D1F0" + +# 0x038: XIN R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03828001" + +# 0x039: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0391B801" + +# 0x03A: MOVC (0x0D), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A0D0D1" + +# 0x03B: MOV R00, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B030E0" + +# 0x03C: MOVC (0x1E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C0D1E0" + +# 0x03D: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D03040" + +# 0x03E: XOUT (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E25020" + +# 0x03F: XOUT (R00), 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F25030" + +# 0x040: MOV R00, 0x64 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04003640" + +# 0x041: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0410D0C0" + +# 0x042: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04203030" + +# 0x043: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04326030" + +# 0x044: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04403010" + +# 0x045: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0453B0E5" + +# 0x046: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04603001" + +# 0x047: CALL 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0473B0EA" + +# 0x048: CIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04829000" + +# 0x049: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04911300" + +# 0x04A: CALL 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A3B0FC" + +# 0x04B: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B03000" + +# 0x04C: COUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C26010" + +# 0x04D: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D03001" + +# 0x04E: MOVC (0x20), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E0D201" + +# 0x04F: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F03010" + +# 0x050: COUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05026010" + +# 0x051: MOV R01, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05103AA1" + +# 0x052: MOVC (0x20), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0520D201" + +# 0x053: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05303000" + +# 0x054: COUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05426010" + +# 0x055: MOVC R00, (0x20) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0550A200" + +# 0x056: CMP R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0560FAA0" + +# 0x057: JEQ 0x05D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0573905D" + +# 0x058: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05803010" + +# 0x059: COUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05926010" + +# 0x05A: MOVC R00, (0x20) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A0A200" + +# 0x05B: CMP R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B0FAA0" + +# 0x05C: JEQ 0x05E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C3905E" + +# 0x05D: JMP 0x05D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D3005D" + +# 0x05E: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E03000" + +# 0x05F: COUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F26010" + +# 0x060: HALT +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06001000" + +# 0x061: MOVC R00, (0x0C) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0610A0C0" + +# 0x062: DEC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06215010" + +# 0x063: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0630D0C0" + +# 0x064: JNZ 0x060 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06432060" + +# 0x065: MOV R07, 0x64 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06503647" + +# 0x066: MOVC R01, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0660A041" + +# 0x067: MOVC R02, (0x05) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0670A052" + +# 0x068: SWAP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0682A001" + +# 0x069: XOR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0691C021" + +# 0x06A: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A19021" + +# 0x06B: JNZ 0x06F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B3206F" + +# 0x06C: DEC R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C15017" + +# 0x06D: MOV R00, 0x2D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D032D0" + +# 0x06E: JMP 0x071 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E30071" + +# 0x06F: INC R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F11017" + +# 0x070: MOV R00, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "070032B0" + +# 0x071: MOVC (0x0C), R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0710D0C7" + +# 0x072: CALL 0x0BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0723B0BA" + +# 0x073: MOVC R00, (0x0D) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0730A0D0" + +# 0x074: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07420000" + +# 0x075: MOVC (0x0D), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0750D0D0" + +# 0x076: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07624010" + +# 0x077: MOVC R00, (0x1F) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0770A1F0" + +# 0x078: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07803001" + +# 0x079: MOVC (0x1F), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0790D1F1" + +# 0x07A: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A0F000" + +# 0x07B: JZ 0x082 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B31082" + +# 0x07C: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C030E1" + +# 0x07D: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D09010" + +# 0x07E: CALL 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E3B0FC" + +# 0x07F: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F11011" + +# 0x080: CMP R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0800F1D1" + +# 0x081: JLE 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0813707D" + +# 0x082: CALL 0x0A2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0823B0A2" + +# 0x083: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08303C00" + +# 0x084: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0843B0E5" + +# 0x085: MOV R01, 0x0B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "085030B1" + +# 0x086: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08609010" + +# 0x087: CALL 0x0BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0873B0BA" + +# 0x088: CALL 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0883B0FC" + +# 0x089: CMP R01, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0890F041" + +# 0x08A: JEQ 0x08D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A3908D" + +# 0x08B: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B15011" + +# 0x08C: JMP 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C30086" + +# 0x08D: MOV R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D030D0" + +# 0x08E: CALL 0x0BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E3B0BA" + +# 0x08F: MOV R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F030A0" + +# 0x090: CALL 0x0BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0903B0BA" + +# 0x091: JMP 0x060 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09130060" + +# 0x092: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09203000" + +# 0x093: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0930D000" + +# 0x094: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0940D010" + +# 0x095: MOVC (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0950D020" + +# 0x096: MOVC (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0960D030" + +# 0x097: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0973E000" + +# 0x098: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09803000" + +# 0x099: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09909001" + +# 0x09A: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A11011" + +# 0x09B: MOVC (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B0B001" + +# 0x09C: JNC 0x0A1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C340A1" + +# 0x09D: CMP R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D0F030" + +# 0x09E: JEQ 0x0A1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E390A1" + +# 0x09F: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F11010" + +# 0x0A0: JMP 0x099 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A030099" + +# 0x0A1: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A13E000" + +# 0x0A2: MOV R02, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A203042" + +# 0x0A3: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A303000" + +# 0x0A4: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A409001" + +# 0x0A5: AND R01, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A5190F1" + +# 0x0A6: CMP R01, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A60F0A1" + +# 0x0A7: JLT 0x0A9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A7350A9" + +# 0x0A8: ADD R01, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A811071" + +# 0x0A9: ADD R01, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A911301" + +# 0x0AA: MOVC (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA0B021" + +# 0x0AB: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB11012" + +# 0x0AC: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC09001" + +# 0x0AD: SWAP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD2A001" + +# 0x0AE: AND R01, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE190F1" + +# 0x0AF: CMP R01, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF0F0A1" + +# 0x0B0: JLT 0x0B2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B0350B2" + +# 0x0B1: ADD R01, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B111071" + +# 0x0B2: ADD R01, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B211301" + +# 0x0B3: MOVC (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B30B021" + +# 0x0B4: CMP R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B40F030" + +# 0x0B5: JEQ 0x0B9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B5390B9" + +# 0x0B6: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B611010" + +# 0x0B7: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B711012" + +# 0x0B8: JMP 0x0A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B8300A4" + +# 0x0B9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B93E000" + +# 0x0BA: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA3C001" + +# 0x0BB: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB28061" + +# 0x0BC: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC19021" + +# 0x0BD: JNZ 0x0BB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD320BB" + +# 0x0BE: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE24020" + +# 0x0BF: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF3D001" + +# 0x0C0: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C03E000" + +# 0x0C1: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C13C001" + +# 0x0C2: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C228061" + +# 0x0C3: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C319101" + +# 0x0C4: JNZ 0x0C2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C4320C2" + +# 0x0C5: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C528020" + +# 0x0C6: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C63D001" + +# 0x0C7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C73E000" + +# 0x0C8: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C803002" + +# 0x0C9: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C903030" + +# 0x0CA: CALL 0x114 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA3B114" + +# 0x0CB: CALL 0x147 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB3B147" + +# 0x0CC: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC03002" + +# 0x0CD: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD03030" + +# 0x0CE: CALL 0x114 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE3B114" + +# 0x0CF: CALL 0x147 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF3B147" + +# 0x0D0: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D003002" + +# 0x0D1: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D103020" + +# 0x0D2: CALL 0x114 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D23B114" + +# 0x0D3: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D33B14E" + +# 0x0D4: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D403280" + +# 0x0D5: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D53B0E5" + +# 0x0D6: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D6030C0" + +# 0x0D7: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D73B0E5" + +# 0x0D8: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D803060" + +# 0x0D9: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D93B0E5" + +# 0x0DA: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA03010" + +# 0x0DB: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB3B0E5" + +# 0x0DC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC3E000" + +# 0x0DD: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD3C000" + +# 0x0DE: CALL 0x108 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE3B108" + +# 0x0DF: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF19800" + +# 0x0E0: JZ 0x0E3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E0310E3" + +# 0x0E1: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E13B165" + +# 0x0E2: JMP 0x0DE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E2300DE" + +# 0x0E3: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E33D000" + +# 0x0E4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E43E000" + +# 0x0E5: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E53C002" + +# 0x0E6: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E603002" + +# 0x0E7: CALL 0x101 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E73B101" + +# 0x0E8: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E83D002" + +# 0x0E9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E93E000" + +# 0x0EA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA3C000" + +# 0x0EB: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB04010" + +# 0x0EC: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC11011" + +# 0x0ED: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED0F000" + +# 0x0EE: JZ 0x0F1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE310F1" + +# 0x0EF: CALL 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF3B0FC" + +# 0x0F0: JMP 0x0EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F0300EB" + +# 0x0F1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F13D000" + +# 0x0F2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F23E000" + +# 0x0F3: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F33C000" + +# 0x0F4: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F409010" + +# 0x0F5: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F511011" + +# 0x0F6: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F60F000" + +# 0x0F7: JZ 0x0FA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F7310FA" + +# 0x0F8: CALL 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F83B0FC" + +# 0x0F9: JMP 0x0F4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F9300F4" + +# 0x0FA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA3D000" + +# 0x0FB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB3E000" + +# 0x0FC: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC3C002" + +# 0x0FD: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD03402" + +# 0x0FE: CALL 0x101 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE3B101" + +# 0x0FF: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF3D002" + +# 0x100: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1003E000" + +# 0x101: CALL 0x0DD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1013B0DD" + +# 0x102: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1023C000" + +# 0x103: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1032A000" + +# 0x104: CALL 0x114 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1043B114" + +# 0x105: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1053D000" + +# 0x106: CALL 0x114 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1063B114" + +# 0x107: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1073E000" + +# 0x108: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1083C002" + +# 0x109: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10903002" + +# 0x10A: CALL 0x10D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A3B10D" + +# 0x10B: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B3D002" + +# 0x10C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C3E000" + +# 0x10D: CALL 0x127 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D3B127" + +# 0x10E: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E2A000" + +# 0x10F: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F3C000" + +# 0x110: CALL 0x127 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1103B127" + +# 0x111: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1113D002" + +# 0x112: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1121A020" + +# 0x113: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1133E000" + +# 0x114: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1143C001" + +# 0x115: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "115190F0" + +# 0x116: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11602001" + +# 0x117: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1171A021" + +# 0x118: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11824031" + +# 0x119: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1193B165" + +# 0x11A: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A02001" + +# 0x11B: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B1A021" + +# 0x11C: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C1B801" + +# 0x11D: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D24031" + +# 0x11E: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E3B165" + +# 0x11F: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F02001" + +# 0x120: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1201A021" + +# 0x121: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12124031" + +# 0x122: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1223B165" + +# 0x123: OR R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1231B201" + +# 0x124: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12424031" + +# 0x125: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1253D001" + +# 0x126: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1263E000" + +# 0x127: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1273C001" + +# 0x128: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12803201" + +# 0x129: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1291A021" + +# 0x12A: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A24031" + +# 0x12B: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B3B165" + +# 0x12C: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C03201" + +# 0x12D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D1A021" + +# 0x12E: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E1B801" + +# 0x12F: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F24031" + +# 0x130: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1303B165" + +# 0x131: XIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13128030" + +# 0x132: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "132190F0" + +# 0x133: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13303201" + +# 0x134: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1341A021" + +# 0x135: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13524031" + +# 0x136: CALL 0x165 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1363B165" + +# 0x137: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1373D001" + +# 0x138: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1383E000" + +# 0x139: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1393C00F" + +# 0x13A: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A030AF" + +# 0x13B: CALL 0x140 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B3B140" + +# 0x13C: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C1501F" + +# 0x13D: JNZ 0x13B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D3213B" + +# 0x13E: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E3D00F" + +# 0x13F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F3E000" + +# 0x140: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1403C00F" + +# 0x141: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "141030AF" + +# 0x142: CALL 0x147 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1423B147" + +# 0x143: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1431501F" + +# 0x144: JNZ 0x142 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14432142" + +# 0x145: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1453D00F" + +# 0x146: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1463E000" + +# 0x147: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1473C00F" + +# 0x148: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "148030AF" + +# 0x149: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1493B14E" + +# 0x14A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A1501F" + +# 0x14B: JNZ 0x149 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B32149" + +# 0x14C: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C3D00F" + +# 0x14D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D3E000" + +# 0x14E: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E3C00F" + +# 0x14F: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F030AF" + +# 0x150: CALL 0x155 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1503B155" + +# 0x151: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1511501F" + +# 0x152: JNZ 0x150 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15232150" + +# 0x153: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1533D00F" + +# 0x154: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1543E000" + +# 0x155: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1553C00F" + +# 0x156: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "156030AF" + +# 0x157: CALL 0x15C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1573B15C" + +# 0x158: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1581501F" + +# 0x159: JNZ 0x157 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15932157" + +# 0x15A: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15A3D00F" + +# 0x15B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15B3E000" + +# 0x15C: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15C3C00F" + +# 0x15D: MOV R15, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15D0363F" + +# 0x15E: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15E00000" + +# 0x15F: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15F00000" + +# 0x160: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16000000" + +# 0x161: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1611501F" + +# 0x162: JNZ 0x15E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1623215E" + +# 0x163: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1633D00F" + +# 0x164: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1643E000" + +# 0x165: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1653C00F" + +# 0x166: MOV R15, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1660309F" + +# 0x167: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16700000" + +# 0x168: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16800000" + +# 0x169: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16900000" + +# 0x16A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16A1501F" + +# 0x16B: JNZ 0x167 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16B32167" + +# 0x16C: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16C3D00F" + +# 0x16D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16D3E000" + +# 0x16E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16E00000" + +# 0x16F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16F00000" + +# 0x170: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17000000" + +# 0x171: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17100000" + +# 0x172: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17200000" + +# 0x173: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17300000" + +# 0x174: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17400000" + +# 0x175: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17500000" + +# 0x176: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17600000" + +# 0x177: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17700000" + +# 0x178: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17800000" + +# 0x179: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17900000" + +# 0x17A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17A00000" + +# 0x17B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17B00000" + +# 0x17C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17C00000" + +# 0x17D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17D00000" + +# 0x17E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17E00000" + +# 0x17F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17F00000" + +# 0x180: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18000000" + +# 0x181: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18100000" + +# 0x182: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18200000" + +# 0x183: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18300000" + +# 0x184: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18400000" + +# 0x185: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18500000" + +# 0x186: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18600000" + +# 0x187: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18700000" + +# 0x188: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18800000" + +# 0x189: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18900000" + +# 0x18A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18A00000" + +# 0x18B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18B00000" + +# 0x18C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18C00000" + +# 0x18D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18D00000" + +# 0x18E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18E00000" + +# 0x18F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18F00000" + +# 0x190: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19000000" + +# 0x191: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19100000" + +# 0x192: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19200000" + +# 0x193: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19300000" + +# 0x194: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19400000" + +# 0x195: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19500000" + +# 0x196: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19600000" + +# 0x197: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19700000" + +# 0x198: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19800000" + +# 0x199: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19900000" + +# 0x19A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19A00000" + +# 0x19B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19B00000" + +# 0x19C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19C00000" + +# 0x19D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19D00000" + +# 0x19E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19E00000" + +# 0x19F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19F00000" + +# 0x1A0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A000000" + +# 0x1A1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A100000" + +# 0x1A2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A200000" + +# 0x1A3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A300000" + +# 0x1A4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A400000" + +# 0x1A5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A500000" + +# 0x1A6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A600000" + +# 0x1A7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A700000" + +# 0x1A8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A800000" + +# 0x1A9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A900000" + +# 0x1AA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AA00000" + +# 0x1AB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AB00000" + +# 0x1AC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AC00000" + +# 0x1AD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AD00000" + +# 0x1AE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AE00000" + +# 0x1AF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AF00000" + +# 0x1B0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B000000" + +# 0x1B1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B100000" + +# 0x1B2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B200000" + +# 0x1B3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B300000" + +# 0x1B4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B400000" + +# 0x1B5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B500000" + +# 0x1B6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B600000" + +# 0x1B7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B700000" + +# 0x1B8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B800000" + +# 0x1B9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B900000" + +# 0x1BA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BA00000" + +# 0x1BB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BB00000" + +# 0x1BC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BC00000" + +# 0x1BD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BD00000" + +# 0x1BE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BE00000" + +# 0x1BF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BF00000" + +# 0x1C0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C000000" + +# 0x1C1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C100000" + +# 0x1C2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C200000" + +# 0x1C3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C300000" + +# 0x1C4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C400000" + +# 0x1C5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C500000" + +# 0x1C6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C600000" + +# 0x1C7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C700000" + +# 0x1C8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C800000" + +# 0x1C9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C900000" + +# 0x1CA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CA00000" + +# 0x1CB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CB00000" + +# 0x1CC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CC00000" + +# 0x1CD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CD00000" + +# 0x1CE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CE00000" + +# 0x1CF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CF00000" + +# 0x1D0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D000000" + +# 0x1D1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D100000" + +# 0x1D2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D200000" + +# 0x1D3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D300000" + +# 0x1D4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D400000" + +# 0x1D5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D500000" + +# 0x1D6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D600000" + +# 0x1D7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D700000" + +# 0x1D8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D800000" + +# 0x1D9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D900000" + +# 0x1DA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DA00000" + +# 0x1DB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DB00000" + +# 0x1DC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DC00000" + +# 0x1DD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DD00000" + +# 0x1DE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DE00000" + +# 0x1DF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DF00000" + +# 0x1E0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E000000" + +# 0x1E1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E100000" + +# 0x1E2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E200000" + +# 0x1E3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E300000" + +# 0x1E4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E400000" + +# 0x1E5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E500000" + +# 0x1E6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E600000" + +# 0x1E7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E700000" + +# 0x1E8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E800000" + +# 0x1E9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E900000" + +# 0x1EA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EA00000" + +# 0x1EB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EB00000" + +# 0x1EC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EC00000" + +# 0x1ED: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1ED00000" + +# 0x1EE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EE00000" + +# 0x1EF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EF00000" + +# 0x1F0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F000000" + +# 0x1F1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F100000" + +# 0x1F2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F200000" + +# 0x1F3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F300000" + +# 0x1F4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F400000" + +# 0x1F5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F500000" + +# 0x1F6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F600000" + +# 0x1F7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F700000" + +# 0x1F8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F800000" + +# 0x1F9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F900000" + +# 0x1FA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FA00000" + +# 0x1FB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FB00000" + +# 0x1FC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FC00000" + +# 0x1FD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FD00000" + +# 0x1FE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FE00000" + +# 0x1FF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FF00000" + +# 0x200: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20000000" + +# 0x201: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20100000" + +# 0x202: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20200000" + +# 0x203: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20300000" + +# 0x204: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20400000" + +# 0x205: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20500000" + +# 0x206: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20600000" + +# 0x207: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20700000" + +# 0x208: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20800000" + +# 0x209: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20900000" + +# 0x20A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20A00000" + +# 0x20B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20B00000" + +# 0x20C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20C00000" + +# 0x20D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20D00000" + +# 0x20E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20E00000" + +# 0x20F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20F00000" + +# 0x210: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21000000" + +# 0x211: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21100000" + +# 0x212: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21200000" + +# 0x213: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21300000" + +# 0x214: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21400000" + +# 0x215: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21500000" + +# 0x216: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21600000" + +# 0x217: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21700000" + +# 0x218: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21800000" + +# 0x219: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21900000" + +# 0x21A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21A00000" + +# 0x21B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21B00000" + +# 0x21C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21C00000" + +# 0x21D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21D00000" + +# 0x21E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21E00000" + +# 0x21F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21F00000" + +# 0x220: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22000000" + +# 0x221: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22100000" + +# 0x222: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22200000" + +# 0x223: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22300000" + +# 0x224: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22400000" + +# 0x225: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22500000" + +# 0x226: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22600000" + +# 0x227: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22700000" + +# 0x228: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22800000" + +# 0x229: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22900000" + +# 0x22A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22A00000" + +# 0x22B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22B00000" + +# 0x22C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22C00000" + +# 0x22D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22D00000" + +# 0x22E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22E00000" + +# 0x22F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22F00000" + +# 0x230: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23000000" + +# 0x231: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23100000" + +# 0x232: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23200000" + +# 0x233: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23300000" + +# 0x234: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23400000" + +# 0x235: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23500000" + +# 0x236: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23600000" + +# 0x237: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23700000" + +# 0x238: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23800000" + +# 0x239: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23900000" + +# 0x23A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23A00000" + +# 0x23B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23B00000" + +# 0x23C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23C00000" + +# 0x23D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23D00000" + +# 0x23E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23E00000" + +# 0x23F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23F00000" + +# 0x240: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24000000" + +# 0x241: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24100000" + +# 0x242: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24200000" + +# 0x243: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24300000" + +# 0x244: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24400000" + +# 0x245: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24500000" + +# 0x246: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24600000" + +# 0x247: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24700000" + +# 0x248: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24800000" + +# 0x249: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24900000" + +# 0x24A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24A00000" + +# 0x24B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24B00000" + +# 0x24C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24C00000" + +# 0x24D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24D00000" + +# 0x24E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24E00000" + +# 0x24F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24F00000" + +# 0x250: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25000000" + +# 0x251: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25100000" + +# 0x252: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25200000" + +# 0x253: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25300000" + +# 0x254: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25400000" + +# 0x255: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25500000" + +# 0x256: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25600000" + +# 0x257: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25700000" + +# 0x258: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25800000" + +# 0x259: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25900000" + +# 0x25A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25A00000" + +# 0x25B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25B00000" + +# 0x25C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25C00000" + +# 0x25D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25D00000" + +# 0x25E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25E00000" + +# 0x25F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25F00000" + +# 0x260: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26000000" + +# 0x261: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26100000" + +# 0x262: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26200000" + +# 0x263: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26300000" + +# 0x264: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26400000" + +# 0x265: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26500000" + +# 0x266: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26600000" + +# 0x267: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26700000" + +# 0x268: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26800000" + +# 0x269: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26900000" + +# 0x26A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26A00000" + +# 0x26B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26B00000" + +# 0x26C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26C00000" + +# 0x26D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26D00000" + +# 0x26E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26E00000" + +# 0x26F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26F00000" + +# 0x270: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27000000" + +# 0x271: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27100000" + +# 0x272: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27200000" + +# 0x273: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27300000" + +# 0x274: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27400000" + +# 0x275: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27500000" + +# 0x276: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27600000" + +# 0x277: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27700000" + +# 0x278: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27800000" + +# 0x279: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27900000" + +# 0x27A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27A00000" + +# 0x27B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27B00000" + +# 0x27C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27C00000" + +# 0x27D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27D00000" + +# 0x27E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27E00000" + +# 0x27F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27F00000" + +# 0x280: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28000000" + +# 0x281: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28100000" + +# 0x282: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28200000" + +# 0x283: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28300000" + +# 0x284: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28400000" + +# 0x285: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28500000" + +# 0x286: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28600000" + +# 0x287: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28700000" + +# 0x288: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28800000" + +# 0x289: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28900000" + +# 0x28A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28A00000" + +# 0x28B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28B00000" + +# 0x28C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28C00000" + +# 0x28D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28D00000" + +# 0x28E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28E00000" + +# 0x28F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28F00000" + +# 0x290: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29000000" + +# 0x291: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29100000" + +# 0x292: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29200000" + +# 0x293: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29300000" + +# 0x294: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29400000" + +# 0x295: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29500000" + +# 0x296: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29600000" + +# 0x297: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29700000" + +# 0x298: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29800000" + +# 0x299: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29900000" + +# 0x29A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29A00000" + +# 0x29B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29B00000" + +# 0x29C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29C00000" + +# 0x29D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29D00000" + +# 0x29E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29E00000" + +# 0x29F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29F00000" + +# 0x2A0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A000000" + +# 0x2A1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A100000" + +# 0x2A2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A200000" + +# 0x2A3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A300000" + +# 0x2A4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A400000" + +# 0x2A5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A500000" + +# 0x2A6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A600000" + +# 0x2A7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A700000" + +# 0x2A8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A800000" + +# 0x2A9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A900000" + +# 0x2AA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AA00000" + +# 0x2AB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AB00000" + +# 0x2AC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AC00000" + +# 0x2AD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AD00000" + +# 0x2AE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AE00000" + +# 0x2AF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AF00000" + +# 0x2B0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B000000" + +# 0x2B1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B100000" + +# 0x2B2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B200000" + +# 0x2B3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B300000" + +# 0x2B4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B400000" + +# 0x2B5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B500000" + +# 0x2B6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B600000" + +# 0x2B7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B700000" + +# 0x2B8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B800000" + +# 0x2B9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B900000" + +# 0x2BA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BA00000" + +# 0x2BB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BB00000" + +# 0x2BC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BC00000" + +# 0x2BD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BD00000" + +# 0x2BE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BE00000" + +# 0x2BF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BF00000" + +# 0x2C0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C000000" + +# 0x2C1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C100000" + +# 0x2C2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C200000" + +# 0x2C3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C300000" + +# 0x2C4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C400000" + +# 0x2C5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C500000" + +# 0x2C6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C600000" + +# 0x2C7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C700000" + +# 0x2C8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C800000" + +# 0x2C9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C900000" + +# 0x2CA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CA00000" + +# 0x2CB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CB00000" + +# 0x2CC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CC00000" + +# 0x2CD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CD00000" + +# 0x2CE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CE00000" + +# 0x2CF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CF00000" + +# 0x2D0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D000000" + +# 0x2D1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D100000" + +# 0x2D2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D200000" + +# 0x2D3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D300000" + +# 0x2D4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D400000" + +# 0x2D5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D500000" + +# 0x2D6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D600000" + +# 0x2D7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D700000" + +# 0x2D8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D800000" + +# 0x2D9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D900000" + +# 0x2DA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DA00000" + +# 0x2DB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DB00000" + +# 0x2DC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DC00000" + +# 0x2DD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DD00000" + +# 0x2DE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DE00000" + +# 0x2DF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DF00000" + +# 0x2E0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E000000" + +# 0x2E1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E100000" + +# 0x2E2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E200000" + +# 0x2E3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E300000" + +# 0x2E4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E400000" + +# 0x2E5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E500000" + +# 0x2E6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E600000" + +# 0x2E7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E700000" + +# 0x2E8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E800000" + +# 0x2E9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E900000" + +# 0x2EA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EA00000" + +# 0x2EB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EB00000" + +# 0x2EC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EC00000" + +# 0x2ED: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2ED00000" + +# 0x2EE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EE00000" + +# 0x2EF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EF00000" + +# 0x2F0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F000000" + +# 0x2F1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F100000" + +# 0x2F2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F200000" + +# 0x2F3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F300000" + +# 0x2F4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F400000" + +# 0x2F5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F500000" + +# 0x2F6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F600000" + +# 0x2F7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F700000" + +# 0x2F8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F800000" + +# 0x2F9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F900000" + +# 0x2FA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FA00000" + +# 0x2FB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FB00000" + +# 0x2FC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FC00000" + +# 0x2FD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FD00000" + +# 0x2FE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FE00000" + +# 0x2FF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FF00000" + +# 0x300: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30000000" + +# 0x301: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30100000" + +# 0x302: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30200000" + +# 0x303: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30300000" + +# 0x304: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30400000" + +# 0x305: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30500000" + +# 0x306: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30600000" + +# 0x307: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30700000" + +# 0x308: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30800000" + +# 0x309: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30900000" + +# 0x30A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30A00000" + +# 0x30B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30B00000" + +# 0x30C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30C00000" + +# 0x30D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30D00000" + +# 0x30E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30E00000" + +# 0x30F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30F00000" + +# 0x310: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31000000" + +# 0x311: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31100000" + +# 0x312: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31200000" + +# 0x313: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31300000" + +# 0x314: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31400000" + +# 0x315: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31500000" + +# 0x316: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31600000" + +# 0x317: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31700000" + +# 0x318: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31800000" + +# 0x319: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31900000" + +# 0x31A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31A00000" + +# 0x31B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31B00000" + +# 0x31C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31C00000" + +# 0x31D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31D00000" + +# 0x31E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31E00000" + +# 0x31F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31F00000" + +# 0x320: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32000000" + +# 0x321: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32100000" + +# 0x322: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32200000" + +# 0x323: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32300000" + +# 0x324: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32400000" + +# 0x325: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32500000" + +# 0x326: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32600000" + +# 0x327: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32700000" + +# 0x328: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32800000" + +# 0x329: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32900000" + +# 0x32A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32A00000" + +# 0x32B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32B00000" + +# 0x32C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32C00000" + +# 0x32D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32D00000" + +# 0x32E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32E00000" + +# 0x32F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32F00000" + +# 0x330: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33000000" + +# 0x331: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33100000" + +# 0x332: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33200000" + +# 0x333: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33300000" + +# 0x334: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33400000" + +# 0x335: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33500000" + +# 0x336: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33600000" + +# 0x337: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33700000" + +# 0x338: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33800000" + +# 0x339: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33900000" + +# 0x33A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33A00000" + +# 0x33B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33B00000" + +# 0x33C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33C00000" + +# 0x33D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33D00000" + +# 0x33E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33E00000" + +# 0x33F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33F00000" + +# 0x340: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34000000" + +# 0x341: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34100000" + +# 0x342: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34200000" + +# 0x343: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34300000" + +# 0x344: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34400000" + +# 0x345: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34500000" + +# 0x346: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34600000" + +# 0x347: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34700000" + +# 0x348: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34800000" + +# 0x349: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34900000" + +# 0x34A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34A00000" + +# 0x34B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34B00000" + +# 0x34C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34C00000" + +# 0x34D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34D00000" + +# 0x34E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34E00000" + +# 0x34F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34F00000" + +# 0x350: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35000000" + +# 0x351: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35100000" + +# 0x352: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35200000" + +# 0x353: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35300000" + +# 0x354: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35400000" + +# 0x355: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35500000" + +# 0x356: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35600000" + +# 0x357: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35700000" + +# 0x358: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35800000" + +# 0x359: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35900000" + +# 0x35A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35A00000" + +# 0x35B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35B00000" + +# 0x35C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35C00000" + +# 0x35D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35D00000" + +# 0x35E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35E00000" + +# 0x35F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35F00000" + +# 0x360: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36000000" + +# 0x361: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36100000" + +# 0x362: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36200000" + +# 0x363: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36300000" + +# 0x364: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36400000" + +# 0x365: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36500000" + +# 0x366: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36600000" + +# 0x367: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36700000" + +# 0x368: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36800000" + +# 0x369: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36900000" + +# 0x36A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36A00000" + +# 0x36B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36B00000" + +# 0x36C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36C00000" + +# 0x36D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36D00000" + +# 0x36E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36E00000" + +# 0x36F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36F00000" + +# 0x370: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37000000" + +# 0x371: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37100000" + +# 0x372: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37200000" + +# 0x373: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37300000" + +# 0x374: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37400000" + +# 0x375: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37500000" + +# 0x376: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37600000" + +# 0x377: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37700000" + +# 0x378: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37800000" + +# 0x379: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37900000" + +# 0x37A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37A00000" + +# 0x37B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37B00000" + +# 0x37C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37C00000" + +# 0x37D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37D00000" + +# 0x37E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37E00000" + +# 0x37F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37F00000" + +# 0x380: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38000000" + +# 0x381: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38100000" + +# 0x382: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38200000" + +# 0x383: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38300000" + +# 0x384: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38400000" + +# 0x385: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38500000" + +# 0x386: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38600000" + +# 0x387: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38700000" + +# 0x388: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38800000" + +# 0x389: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38900000" + +# 0x38A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38A00000" + +# 0x38B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38B00000" + +# 0x38C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38C00000" + +# 0x38D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38D00000" + +# 0x38E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38E00000" + +# 0x38F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38F00000" + +# 0x390: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39000000" + +# 0x391: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39100000" + +# 0x392: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39200000" + +# 0x393: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39300000" + +# 0x394: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39400000" + +# 0x395: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39500000" + +# 0x396: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39600000" + +# 0x397: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39700000" + +# 0x398: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39800000" + +# 0x399: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39900000" + +# 0x39A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39A00000" + +# 0x39B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39B00000" + +# 0x39C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39C00000" + +# 0x39D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39D00000" + +# 0x39E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39E00000" + +# 0x39F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39F00000" + +# 0x3A0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A000000" + +# 0x3A1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A100000" + +# 0x3A2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A200000" + +# 0x3A3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A300000" + +# 0x3A4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A400000" + +# 0x3A5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A500000" + +# 0x3A6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A600000" + +# 0x3A7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A700000" + +# 0x3A8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A800000" + +# 0x3A9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A900000" + +# 0x3AA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AA00000" + +# 0x3AB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AB00000" + +# 0x3AC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AC00000" + +# 0x3AD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AD00000" + +# 0x3AE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AE00000" + +# 0x3AF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AF00000" + +# 0x3B0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B000000" + +# 0x3B1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B100000" + +# 0x3B2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B200000" + +# 0x3B3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B300000" + +# 0x3B4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B400000" + +# 0x3B5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B500000" + +# 0x3B6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B600000" + +# 0x3B7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B700000" + +# 0x3B8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B800000" + +# 0x3B9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B900000" + +# 0x3BA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BA00000" + +# 0x3BB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BB00000" + +# 0x3BC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BC00000" + +# 0x3BD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BD00000" + +# 0x3BE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BE00000" + +# 0x3BF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BF00000" + +# 0x3C0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C000000" + +# 0x3C1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C100000" + +# 0x3C2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C200000" + +# 0x3C3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C300000" + +# 0x3C4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C400000" + +# 0x3C5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C500000" + +# 0x3C6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C600000" + +# 0x3C7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C700000" + +# 0x3C8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C800000" + +# 0x3C9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C900000" + +# 0x3CA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CA00000" + +# 0x3CB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CB00000" + +# 0x3CC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CC00000" + +# 0x3CD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CD00000" + +# 0x3CE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CE00000" + +# 0x3CF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CF00000" + +# 0x3D0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D000000" + +# 0x3D1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D100000" + +# 0x3D2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D200000" + +# 0x3D3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D300000" + +# 0x3D4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D400000" + +# 0x3D5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D500000" + +# 0x3D6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D600000" + +# 0x3D7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D700000" + +# 0x3D8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D800000" + +# 0x3D9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D900000" + +# 0x3DA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DA00000" + +# 0x3DB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DB00000" + +# 0x3DC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DC00000" + +# 0x3DD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DD00000" + +# 0x3DE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DE00000" + +# 0x3DF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DF00000" + +# 0x3E0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E000000" + +# 0x3E1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E100000" + +# 0x3E2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E200000" + +# 0x3E3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E300000" + +# 0x3E4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E400000" + +# 0x3E5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E500000" + +# 0x3E6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E600000" + +# 0x3E7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E700000" + +# 0x3E8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E800000" + +# 0x3E9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E900000" + +# 0x3EA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EA00000" + +# 0x3EB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EB00000" + +# 0x3EC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EC00000" + +# 0x3ED: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3ED00000" + +# 0x3EE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EE00000" + +# 0x3EF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EF00000" + +# 0x3F0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F000000" + +# 0x3F1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F100000" + +# 0x3F2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F200000" + +# 0x3F3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F300000" + +# 0x3F4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F400000" + +# 0x3F5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F500000" + +# 0x3F6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F600000" + +# 0x3F7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F700000" + +# 0x3F8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F800000" + +# 0x3F9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F900000" + +# 0x3FA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FA00000" + +# 0x3FB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FB00000" + +# 0x3FC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FC00000" + +# 0x3FD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FD00000" + +# 0x3FE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FE00000" + +# 0x3FF: JMP 0x032 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FF30032" + +# Assembled from counter.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "004A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "012D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0243" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0350" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0455" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0520" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0656" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0731" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "082E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0900" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/cse.tcl b/projects/cpu/asm/cse.tcl new file mode 100644 index 0000000..14e34f6 --- /dev/null +++ b/projects/cpu/asm/cse.tcl @@ -0,0 +1,247 @@ +###################################################################### +# Copyright (c) 2006 Xilinx, Inc. All rights reserved. +# +# XILINX CONFIDENTIAL PROPERTY +# This document contains proprietary information which is +# protected by copyright. All rights are reserved. No part of +# this document may be photocopied, reproduced or translated to +# another program language without prior written consent of +# XILINX Inc., San Jose, CA. 95124 +# +# Xilinx, Inc. +# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +# COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +# ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +# STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +# IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +# FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +# XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +# THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +# ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +# FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE. +# +###################################################################### + +# +# For Tcl Manual for builtin commands, see +# http://www.tcl.tk/man/tcl8.3 +# +# +# + +# Example scanning devices and ChipScope cores, in a JTAG Chain, +# using the Cse api. + +# Get the Cse DLL's and globals +cd F:\\Xilinx9\\ChipScope_Pro_9_1i\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Create global variables + +# Parallel IV Cable +set PARALLEL_CABLE_ARGS [list "port=LPT1" \ + "frequency=200000"] + # "frequency=5000000 | 2500000 | 200000" + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" \ + "frequency=3000000"] + # frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +set CABLE_NAME $CSEJTAG_TARGET_PLATFORMUSB +set CABLE_ARGS $PLATFORM_USB_CABLE_ARGS +set debug 0 + +proc main {argc argv} { + global debug + global PLATFORM_USB_CABLE_ARGS + global CSEJTAG_TARGET_PLATFORMUSB + global CABLE_NAME + global CABLE_ARGS + global CSE_MSG_INFO + + if {[expr ($argc > 0) && [string equal "-h" [lindex $argv 0]]]} { + writeMessage 0 $CSE_MSG_INFO "Usage: xtclsh csejtag_examplel1.tcl \[-usb\] \[-d\]\n" + exit + } + + # for CseServer/CseClient use + set serverflag_idx 0 + set serveraddress_idx 0 + + # Checks to see if usb or debug flag is set + for {set i 0} {$i < $argc} {incr i} { + if {[string equal "-usb" [lindex $argv $i]]} { + set CABLE_NAME $CSEJTAG_TARGET_PLATFORMUSB + set CABLE_ARGS $PLATFORM_USB_CABLE_ARGS + } elseif {[string equal "-d" [lindex $argv $i]]} { + set debug 1 + } elseif {[string equal "-server" [lindex $argv $i]]} { + set serverflag_idx $i + set serveraddress_idx [expr $i + 1] + } + } + + # Create Session. Pass location of idcode.lst to override default. + set handle [csejtag_session create "writeMessage" [lindex $argv $serverflag_idx] [lindex $argv $serveraddress_idx] ] + + # Scan the JTAG chain + scanChain $handle + + csejtag_session destroy $handle +} + +proc scanChain {handle} { + global CABLE_NAME + global CABLE_ARGS + global CSE_MSG_ERROR + global CSE_MSG_INFO + global CSEJTAG_SCAN_DEFAULT + global CSEJTAG_LOCKED_ME + global CSEJTAG_TEST_LOGIC_RESET + global CSEJTAG_SHIFT_READ + global CSEJTAG_RUN_TEST_IDLE + + # Open cable + csejtag_target open $handle \ + $CABLE_NAME \ + 0 \ + [lindex $CABLE_ARGS 0] \ + [lindex $CABLE_ARGS 1] + + # CseJtag_session sendMessage will call the messageRouter + # function specified in csejtag_session create + csejtag_session send_message $handle $CSE_MSG_INFO "Open Cable successfully\n" + + # Need to lock cable before actually accessing JTAG chain + set cablelock [csejtag_target lock $handle 5000] + if {$cablelock != $CSEJTAG_LOCKED_ME} { + csejtag_session send_message $handle $CSE_MSG_ERROR "cse_lock_target failed" + csejtag_target close $handle + return + } + + csejtag_session send_message $handle $CSE_MSG_INFO "Obtained cable lock\n" + + # Scan the JTAG chain, reading idcodes, + # setting IR lengths for known devices in the CseJtag + # data structures. + # CseJtag needs to know in order to do JTAG shifts. + csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT + + # Get number of devices + set deviceCount [csejtag_tap get_device_count $handle] + + set str [format "Found %u devices\n" $deviceCount] + csejtag_session send_message $handle $CSE_MSG_INFO $str + + # Get a byte array of all idcodes by scanning the JTAG chain. + csejtag_tap navigate $handle $CSEJTAG_TEST_LOGIC_RESET 0 0 + + set idcodeBuffer [csejtag_tap shift_chain_dr $handle\ + $CSEJTAG_SHIFT_READ \ + $CSEJTAG_RUN_TEST_IDLE \ + 0 \ + [expr $deviceCount * 32] \ + 0 \ + -hextdimask 0 \ + -hextdomask 0] + + for {set deviceIndex 0} {$deviceIndex < $deviceCount} {incr deviceIndex} { + scanDevice $handle $deviceIndex $deviceCount $idcodeBuffer + } + + csejtag_target unlock $handle + csejtag_target close $handle + csejtag_session send_message $handle $CSE_MSG_INFO "Closed cable successfully\n" +} + +# Note that this function (with the exception of the call to +# scanUserReg() ) does not get any information +# which requires a new scan of the device chain. +# It is just lookup in the 'idcode.lst' file or +# information which CseJtag data structures already has such as: +# deviceCount and device idcodes. +proc scanDevice {handle deviceIndex deviceCount idcodeBuffer} { + global CSE_MSG_INFO + + # position of buffer + set startofidcodeBuf [expr $deviceIndex * 8 ] + set idcodeBuf [string range $idcodeBuffer $startofidcodeBuf [expr $startofidcodeBuf + 7] ] + + # Get idcode without scanning the JTAG chain + set idcodeBuffer2 [csejtag_tap get_device_idcode $handle $deviceIndex] + + # Convert idcodeFromBuffer and idcodeFromBuffer2 to unsigned integers + set idcodeFromBuffer [expr "0x0$idcodeBuf"] + + set idcode [expr [format "%u" [binaryStringToInt $idcodeBuffer2] ] ] + + # Get IR length without scanning JTAG chain + set irLength 0 + set irLength [csejtag_db get_irlength_for_idcode $handle $idcodeBuffer2] + + # NOTE If (irLength == 0) an application program needs to set it, + # ( using function csejtag_tap_set_irlength $handle $deviceIndex $irLength) + # perhaps after asking the user or looking it up someway. + # Without irLength known for all devices in the chain, + # JTAG communication will fail. + + # Get device name + set deviceName [csejtag_db get_device_name_for_idcode $handle $idcodeBuffer2] + + # print out device info + set str [format "\nDEVICE %u, idcode:%x, Scanned idcode:%x, IRLength:%u, %s\n" \ + $deviceIndex $idcode $idcodeFromBuffer $irLength $deviceName] + csejtag_session send_message $handle $CSE_MSG_INFO $str + + # Compares the two methods of obtaining the idcode, + # prints a message if they are different. + + if {$idcode != $idcodeFromBuffer} { + csejtag_session send_message $handle $CSE_MSG_INFO "IDCODES ARE NOT EQUAL!!!\n" + } +} + +proc writeMessage {handle msgFlags msg} { + global debug + global CSE_MSG_ERROR + global CSE_MSG_WARNING + global CSE_MSG_STATUS + global CSE_MSG_INFO + global CSE_MSG_NOISE + global CSE_MSG_DEBUG + if {[expr $debug || ($msgFlags != $CSE_MSG_DEBUG)]} { + if {$msgFlags == $CSE_MSG_ERROR} { + puts -nonewline "Error:" + } elseif {$msgFlags == $CSE_MSG_WARNING} { + puts -nonewline "Warning:" + } elseif {$msgFlags == $CSE_MSG_INFO} { + puts -nonewline "Info:" + } elseif {$msgFlags == $CSE_MSG_STATUS} { + puts -nonewline "Status:" + } elseif {$msgFlags == $CSE_MSG_DEBUG} { + puts -nonewline "Debug:" + } + puts -nonewline $msg + flush stdout + } +} + +proc binaryStringToInt {binarystring} { + set len [string length $binarystring] + set retval 0 + for {set i 0} {$i < $len} {incr i} { + set retval [expr $retval << 1] + if {[string index $binarystring $i] == "1"} { + set retval [expr $retval | 1] + } + } + return $retval +} + +# Start the program +main $argc $argv diff --git a/projects/cpu/asm/greet.jsm b/projects/cpu/asm/greet.jsm new file mode 100644 index 0000000..f24a5db --- /dev/null +++ b/projects/cpu/asm/greet.jsm @@ -0,0 +1,379 @@ +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +lcd_read: equ 0x20 +lcd_data: equ 0x40 +lcd_enable: equ 0x80 + +DIV10: equ 0x0A + +CR: equ 0x0D +LF: equ 0x0A + +LCD_CMD_Z1: equ 0x80 +LCD_CMD_Z2: equ 0xC0 + +; I/O +btn_port: equ 0xC0 ; RO +led_port: equ 0xC1 ; Write +uart_data: equ 0xC2 ; Write +lcd_port: equ 0xC3 ; R/W +ctrl_reg: equ 0xC4 ; R/W +dip_port: equ 0xC5 ; RO +uart_status: equ 0xC6 ; Read + +; ------------------------------------------------- +; Program +; ------------------------------------------------- +reset: jmp init + + org 0x001 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +init: call LCD_init + + ; Print Hello world + call LCD_clear + ; J + mov R0, 0x4A + call LCD_writechar + call sout + ; - + mov R0, 0x2D + call LCD_writechar + call sout + ; C + mov R0, 0x43 + call LCD_writechar + call sout + ; P + mov R0, 0x50 + call LCD_writechar + call sout + ; U + mov R0, 0x55 + call LCD_writechar + call sout + ; + mov R0, 0x20 + call LCD_writechar + call sout + ; V + mov R0, 0x56 + call LCD_writechar + call sout + ; 1 + mov R0, 0x31 + call LCD_writechar + call sout + ; . + mov R0, 0x2E + call LCD_writechar + call sout + ; 0 + mov R0, 0x30 + call LCD_writechar + call sout + + ; CRLF + mov R0, LCD_CMD_Z2 + call LCD_writecmd + mov R0, CR + call sout + mov R0, LF + call sout + + ; R + mov R0, 0x52 + call LCD_writechar + call sout + ; E + mov R0, 0x65 + call LCD_writechar + call sout + ; A + mov R0, 0x61 + call LCD_writechar + call sout + ; D + mov R0, 0x64 + call LCD_writechar + call sout + ; Y + mov R0, 0x79 + call LCD_writechar + call sout + + ; CRLF + mov R0, CR + call sout + mov R0, LF + call sout + +jjj: jmp jjj + +; ------------------------------------------------- +; sout +; ------------------------------------------------- +; R0 = input +sout: push R1 +sout1: movx R1, (uart_status) + and R1, 0x02 + jnz sout1 + movx (uart_data), R0 + pop R1 + ret + +; ------------------------------------------------- +; sin +; ------------------------------------------------- +; R0 = output +sin: push R1 +sin1: movx R1, (uart_status) + and R1, 0x10 + jnz sin1 + movx R0, (uart_data) + pop R1 + ret + +; ------------------------------------------------- +; Init LCD +; ------------------------------------------------- +LCD_init: mov R1, lcd_port + movx (R1), lcd_read + + call delay10ms + + ; 0. + mov R2, 0x00 + mov R0, 0x03 + call LCD_write_ + call delay10ms + mov R2, 0x00 + mov R0, 0x03 + call LCD_write_ + call delay10ms + + mov R2, 0x00 + mov R0, 0x02 + call LCD_write_ + call delay1ms + + ; 1. + mov R0, 0x28 + call LCD_writecmd + + ; 2. + mov R0, 0x0E + call LCD_writecmd + + ; 3. + mov R0, 0x06 + call LCD_writecmd + + ; 3. + mov R0, 0x01 + call LCD_writecmd + + ret + +; ------------------------------------------------- +; LCD_Clear +; ------------------------------------------------- +LCD_clear: push R0 + mov R0, 0x01 + call LCD_writecmd + pop R0 + ret + +; ------------------------------------------------- +; LCD_writecmd +; ------------------------------------------------- +; R0 = cmd +LCD_writecmd: call LCD_waitbsy + push R2 + push R0 + push R0 + mov R2, 0x00 + shr R0 + shr R0 + shr R0 + shr R0 + call LCD_write_ + pop R0 + and R0, 0x0F + call LCD_write_ + pop R0 + pop R2 + ret + +; ------------------------------------------------- +; LCD_writechar +; ------------------------------------------------- +; R0 = char +LCD_writechar: call LCD_waitbsy + push R2 + push R0 + push R0 + mov R2, lcd_data + shr R0 + shr R0 + shr R0 + shr R0 + call LCD_write_ + pop R0 + and R0, 0x0F + call LCD_write_ + pop R0 + pop R2 + ret + +; ------------------------------------------------- +; LCD_write_ +; ------------------------------------------------- +; R0 = input +LCD_write_: push R1 + + mov R1, R0 + or R1, R2 + movx (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + or R1, lcd_enable + movx (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + movx (lcd_port), R1 + call delay1us + + pop R1 + ret + +; ------------------------------------------------- +; LCD_read_ +; ------------------------------------------------- +; R0 = output +LCD_read_: push R1 + + mov R1, lcd_read + or R1, R2 + movx (lcd_port), R1 + call delay1us + + mov R1, lcd_read + or R1, R2 + or R1, lcd_enable + movx (lcd_port), R1 + call delay1us + movx R0, (lcd_port) + + mov R1, lcd_read + or R1, R2 + movx (lcd_port), R1 + call delay1us + + pop R1 + ret + +; ------------------------------------------------- +; LCD_readstat +; ------------------------------------------------- +; R0 = status +LCD_readstat: push R2 + mov R2, 0x00 + call LCD_read_ + shl R0 + shl R0 + shl R0 + shl R0 + push R0 + call LCD_read_ + and R0, 0x0F + pop R2 + or R0, R2 + pop R2 + ret + +; ------------------------------------------------- +; LCD_waitbsy +; ------------------------------------------------- +LCD_waitbsy: push R0 +bsy_loop: call LCD_readstat + and R0, 0x80 + jz ex_bsy + call delay1us + jmp bsy_loop +ex_bsy: pop R0 + ret + +; ------------------------------------------------- +; Delays +; ------------------------------------------------- +delay1s: push R15 + mov R15, DIV10 +loop1s: call delay100ms + dec R15 + jnz loop1s + pop R15 + ret + +delay100ms: push R15 + mov R15, DIV10 +loop100ms: call delay10ms + dec R15 + jnz loop100ms + pop R15 + ret + +delay10ms: push R15 + mov R15, DIV10 +loop10ms: call delay1ms + dec R15 + jnz loop10ms + pop R15 + ret + +delay1ms: push R15 + mov R15, DIV10 +loop1ms: call delay100us + dec R15 + jnz loop1ms + pop R15 + ret + +delay100us: push R15 + mov R15, DIV10 +loop100us: call delay10us + dec R15 + jnz loop100us + pop R15 + ret + +delay10us: push R15 + mov R15, DIV10 +loop10us: call delay1us + dec R15 + jnz loop10us + pop R15 + ret + +delay1us: push R15 + mov R15, DIV10 +loop1us: call delay100ns + dec R15 + jnz loop1us + pop R15 + ret + +delay100ns: nop + nop + nop + nop + ret \ No newline at end of file diff --git a/projects/cpu/asm/greet.tcl b/projects/cpu/asm/greet.tcl new file mode 100644 index 0000000..79160c3 --- /dev/null +++ b/projects/cpu/asm/greet.tcl @@ -0,0 +1,797 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" \ + "frequency=1500000"] + # frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +# --------------------------------------------------------------- +# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 $irlength "3C2"] + +# Write Program +# JASM_ROM_INSERT_HERE +# 0x000: JMP 0x002 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00030002" + +# 0x001: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0007F000" + +# 0x002: CALL 0x04A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "000BB04A" + +# 0x003: CALL 0x062 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "000FB062" + +# 0x004: MOV R00, 0x4A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "001034A0" + +# 0x005: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0017B077" + +# 0x006: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "001BB03C" + +# 0x007: MOV R00, 0x2D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "001C32D0" + +# 0x008: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0023B077" + +# 0x009: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0027B03C" + +# 0x00A: MOV R00, 0x43 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00283430" + +# 0x00B: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "002FB077" + +# 0x00C: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0033B03C" + +# 0x00D: MOV R00, 0x50 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00343500" + +# 0x00E: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "003BB077" + +# 0x00F: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "003FB03C" + +# 0x010: MOV R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00403550" + +# 0x011: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0047B077" + +# 0x012: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "004BB03C" + +# 0x013: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "004C3200" + +# 0x014: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0053B077" + +# 0x015: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0057B03C" + +# 0x016: MOV R00, 0x56 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00583560" + +# 0x017: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "005FB077" + +# 0x018: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0063B03C" + +# 0x019: MOV R00, 0x31 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00643310" + +# 0x01A: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "006BB077" + +# 0x01B: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "006FB03C" + +# 0x01C: MOV R00, 0x2E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "007032E0" + +# 0x01D: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0077B077" + +# 0x01E: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "007BB03C" + +# 0x01F: MOV R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "007C3300" + +# 0x020: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0083B077" + +# 0x021: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0087B03C" + +# 0x022: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00883C00" + +# 0x023: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "008FB067" + +# 0x024: MOV R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "009030D0" + +# 0x025: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0097B03C" + +# 0x026: MOV R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "009830A0" + +# 0x027: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "009FB03C" + +# 0x028: MOV R00, 0x52 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00A03520" + +# 0x029: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00A7B077" + +# 0x02A: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00ABB03C" + +# 0x02B: MOV R00, 0x65 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00AC3650" + +# 0x02C: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00B3B077" + +# 0x02D: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00B7B03C" + +# 0x02E: MOV R00, 0x61 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00B83610" + +# 0x02F: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00BFB077" + +# 0x030: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00C3B03C" + +# 0x031: MOV R00, 0x64 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00C43640" + +# 0x032: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00CBB077" + +# 0x033: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00CFB03C" + +# 0x034: MOV R00, 0x79 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00D03790" + +# 0x035: CALL 0x077 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00D7B077" + +# 0x036: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00DBB03C" + +# 0x037: MOV R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00DC30D0" + +# 0x038: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00E3B03C" + +# 0x039: MOV R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00E430A0" + +# 0x03A: CALL 0x03C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00EBB03C" + +# 0x03B: JMP 0x03B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00EF003B" + +# 0x03C: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F3C001" + +# 0x03D: MOVX R01, (0xC6) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F45C61" + +# 0x03E: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F99021" + +# 0x03F: JNZ 0x03D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00FF203D" + +# 0x040: MOVX (0xC2), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01008C20" + +# 0x041: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0107D001" + +# 0x042: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "010BE000" + +# 0x043: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "010FC001" + +# 0x044: MOVX R01, (0xC6) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01105C61" + +# 0x045: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01159101" + +# 0x046: JNZ 0x044 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "011B2044" + +# 0x047: MOVX R00, (0xC2) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "011C5C20" + +# 0x048: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0123D001" + +# 0x049: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0127E000" + +# 0x04A: MOV R01, 0xC3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01283C31" + +# 0x04B: MOVX (R01), 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "012C7201" + +# 0x04C: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0133B0CC" + +# 0x04D: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01343002" + +# 0x04E: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01383030" + +# 0x04F: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "013FB087" + +# 0x050: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0143B0CC" + +# 0x051: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01443002" + +# 0x052: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01483030" + +# 0x053: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "014FB087" + +# 0x054: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0153B0CC" + +# 0x055: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01543002" + +# 0x056: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01583020" + +# 0x057: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "015FB087" + +# 0x058: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0163B0D3" + +# 0x059: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01643280" + +# 0x05A: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "016BB067" + +# 0x05B: MOV R00, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "016C30E0" + +# 0x05C: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0173B067" + +# 0x05D: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01743060" + +# 0x05E: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "017BB067" + +# 0x05F: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "017C3010" + +# 0x060: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0183B067" + +# 0x061: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0187E000" + +# 0x062: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "018BC000" + +# 0x063: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "018C3010" + +# 0x064: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0193B067" + +# 0x065: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0197D000" + +# 0x066: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "019BE000" + +# 0x067: CALL 0x0B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "019FB0B6" + +# 0x068: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01A3C002" + +# 0x069: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01A7C000" + +# 0x06A: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01ABC000" + +# 0x06B: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01AC3002" + +# 0x06C: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01B1F000" + +# 0x06D: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01B5F000" + +# 0x06E: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01B9F000" + +# 0x06F: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01BDF000" + +# 0x070: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01C3B087" + +# 0x071: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01C7D000" + +# 0x072: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01C990F0" + +# 0x073: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01CFB087" + +# 0x074: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01D3D000" + +# 0x075: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01D7D002" + +# 0x076: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01DBE000" + +# 0x077: CALL 0x0B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01DFB0B6" + +# 0x078: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01E3C002" + +# 0x079: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01E7C000" + +# 0x07A: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01EBC000" + +# 0x07B: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01EC3402" + +# 0x07C: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01F1F000" + +# 0x07D: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01F5F000" + +# 0x07E: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01F9F000" + +# 0x07F: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01FDF000" + +# 0x080: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0203B087" + +# 0x081: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0207D000" + +# 0x082: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "020990F0" + +# 0x083: CALL 0x087 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "020FB087" + +# 0x084: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0213D000" + +# 0x085: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0217D002" + +# 0x086: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "021BE000" + +# 0x087: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "021FC001" + +# 0x088: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02202001" + +# 0x089: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0225A021" + +# 0x08A: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02288C31" + +# 0x08B: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "022FB0E8" + +# 0x08C: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02302001" + +# 0x08D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0235A021" + +# 0x08E: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0239B801" + +# 0x08F: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "023C8C31" + +# 0x090: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0243B0E8" + +# 0x091: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02442001" + +# 0x092: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0249A021" + +# 0x093: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "024C8C31" + +# 0x094: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0253B0E8" + +# 0x095: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0257D001" + +# 0x096: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "025BE000" + +# 0x097: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "025FC001" + +# 0x098: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02603201" + +# 0x099: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0265A021" + +# 0x09A: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02688C31" + +# 0x09B: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "026FB0E8" + +# 0x09C: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02703201" + +# 0x09D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0275A021" + +# 0x09E: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0279B801" + +# 0x09F: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "027C8C31" + +# 0x0A0: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0283B0E8" + +# 0x0A1: MOVX R00, (0xC3) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02845C30" + +# 0x0A2: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02883201" + +# 0x0A3: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "028DA021" + +# 0x0A4: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02908C31" + +# 0x0A5: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0297B0E8" + +# 0x0A6: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "029BD001" + +# 0x0A7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "029FE000" + +# 0x0A8: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02A3C002" + +# 0x0A9: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02A43002" + +# 0x0AA: CALL 0x097 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02ABB097" + +# 0x0AB: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02ADE000" + +# 0x0AC: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02B1E000" + +# 0x0AD: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02B5E000" + +# 0x0AE: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02B9E000" + +# 0x0AF: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02BFC000" + +# 0x0B0: CALL 0x097 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02C3B097" + +# 0x0B1: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02C590F0" + +# 0x0B2: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02CBD002" + +# 0x0B3: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02CDA020" + +# 0x0B4: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02D3D002" + +# 0x0B5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02D7E000" + +# 0x0B6: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02DBC000" + +# 0x0B7: CALL 0x0A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02DFB0A8" + +# 0x0B8: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02E19800" + +# 0x0B9: JZ 0x0BC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02E710BC" + +# 0x0BA: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02EBB0E8" + +# 0x0BB: JMP 0x0B7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02EF00B7" + +# 0x0BC: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02F3D000" + +# 0x0BD: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02F7E000" + +# 0x0BE: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02FBC00F" + +# 0x0BF: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02FC30AF" + +# 0x0C0: CALL 0x0C5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0303B0C5" + +# 0x0C1: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0305501F" + +# 0x0C2: JNZ 0x0C0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "030B20C0" + +# 0x0C3: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "030FD00F" + +# 0x0C4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0313E000" + +# 0x0C5: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0317C00F" + +# 0x0C6: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "031830AF" + +# 0x0C7: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "031FB0CC" + +# 0x0C8: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0321501F" + +# 0x0C9: JNZ 0x0C7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "032720C7" + +# 0x0CA: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "032BD00F" + +# 0x0CB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "032FE000" + +# 0x0CC: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0333C00F" + +# 0x0CD: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "033430AF" + +# 0x0CE: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "033BB0D3" + +# 0x0CF: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "033D501F" + +# 0x0D0: JNZ 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "034320CE" + +# 0x0D1: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0347D00F" + +# 0x0D2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "034BE000" + +# 0x0D3: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "034FC00F" + +# 0x0D4: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "035030AF" + +# 0x0D5: CALL 0x0DA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0357B0DA" + +# 0x0D6: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0359501F" + +# 0x0D7: JNZ 0x0D5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "035F20D5" + +# 0x0D8: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0363D00F" + +# 0x0D9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0367E000" + +# 0x0DA: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "036BC00F" + +# 0x0DB: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "036C30AF" + +# 0x0DC: CALL 0x0E1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0373B0E1" + +# 0x0DD: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0375501F" + +# 0x0DE: JNZ 0x0DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "037B20DC" + +# 0x0DF: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "037FD00F" + +# 0x0E0: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0383E000" + +# 0x0E1: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0387C00F" + +# 0x0E2: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "038830AF" + +# 0x0E3: CALL 0x0E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "038FB0E8" + +# 0x0E4: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0391501F" + +# 0x0E5: JNZ 0x0E3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "039720E3" + +# 0x0E6: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "039BD00F" + +# 0x0E7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "039FE000" + +# 0x0E8: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03A3C00F" + +# 0x0E9: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03A430AF" + +# 0x0EA: CALL 0x0EF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03ABB0EF" + +# 0x0EB: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03AD501F" + +# 0x0EC: JNZ 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03B320EA" + +# 0x0ED: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03B7D00F" + +# 0x0EE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03BBE000" + +# 0x0EF: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03BC0000" + +# 0x0F0: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C00000" + +# 0x0F1: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C40000" + +# 0x0F2: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C80000" + +# 0x0F3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03CFE000" + + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/make b/projects/cpu/asm/make new file mode 100644 index 0000000..5e1cebc --- /dev/null +++ b/projects/cpu/asm/make @@ -0,0 +1,51 @@ +#!/bin/sh + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: rom-file generation for cpu_core + +# 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 + +# --------------------------------------------------------------------- + +TARGET=$2 +DSTDIR=$1 + +JASM_HOME=/cygdrive/w/vhdl/lib/CPUs/JCpu/tools + +$JASM_HOME/jasm.rb $TARGET.jsm + +irom_tcl_snippet="$TARGET.irom.tcl.snip" +irom_vhdl_snippet="$TARGET.irom.vhdl.snip" +irom_ld_vhdl_snippet="$TARGET.irom_ld.vhdl.snip" +xrom_tcl_snippet="$TARGET.xrom.tcl.snip" +xrom_vhdl_snippet="$TARGET.xrom.vhdl.snip" +xrom_ld_vhdl_snippet="$TARGET.xrom_ld.vhdl.snip" + +$JASM_HOME/insrom.rb $irom_vhdl_snippet $JASM_HOME/irom.vhd.tpl >$DSTDIR/$TARGET\_irom.vhdl +$JASM_HOME/insrom.rb $irom_ld_vhdl_snippet $JASM_HOME/irom_ld.vhd.tpl >$DSTDIR/$TARGET\_irom_ld.vhdl + +$JASM_HOME/insrom.rb $xrom_vhdl_snippet $JASM_HOME/xrom.vhd.tpl >$DSTDIR/$TARGET\_xrom.vhdl +$JASM_HOME/insrom.rb $xrom_ld_vhdl_snippet $JASM_HOME/xrom_ld.vhd.tpl >$DSTDIR/$TARGET\_xrom_ld.vhdl + +cat $irom_tcl_snippet > $TARGET.tcl.snip.snip +cat $xrom_tcl_snippet >> $TARGET.tcl.snip.snip +$JASM_HOME/insrom.rb $TARGET.tcl.snip.snip $JASM_HOME/rom.tcl.tpl >$TARGET.tcl + +rm -f *.snip diff --git a/projects/cpu/asm/pen_test.jsm b/projects/cpu/asm/pen_test.jsm new file mode 100644 index 0000000..c907444 --- /dev/null +++ b/projects/cpu/asm/pen_test.jsm @@ -0,0 +1,773 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +BURST_LEN: equ 8 +SD_CMD_WRITE: equ 0x06 +SD_CMD_READ: equ 0x05 +START_ADDR0: equ 0x00 +START_ADDR1: equ 0x00 +START_ADDR2: equ 0x20 +END_ADDR0: equ 0xF8 +END_ADDR1: equ 0xFF +END_ADDR2: equ 0xFF +PEN_TIMEOUT0: equ 0xE8 +PEN_TIMEOUT1: equ 0x03 +PEN_BUFSIZE: equ 64 + +; External RAM/ROM + xmem +crlf: dc 13, 10, 0 +greet_txt: dc "SDRAM Test", 0 +msg_txt0: dc "Clearing SDRAM", 0 +msg_txt1: dc "Writing SDRAM", 0 +msg_txt2: dc "Reading SDRAM", 0 +msg_txt3: dc "Reading Bitmap", 0 +verify_ok: dc "Verify OK", 0 +verify_nok: dc "Failed at ", 0 +dot: dc ".", 0 + + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +block_cnt: db 1 +round_cnt: db 1 +bmp_offset: db 4 +pixel_buf: db 32 + +pen_rx_buf: db 128 +pen_rx_ptr_r: db 1 +pen_rx_ptr_w: db 1 +pen_timeout: db 2 +pen_bit_cnt_w: db 1 +pen_octet_w: db 1 +pen_octet_r: db 1 +pen_last_state: db 1 +pen_enable: db 1 +pen_bit_cnt_r: db 1 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 +pen_isr: push R0 + push R1 + push R2 + +u_get_nxt: xin R1, (btn_port) + movc R0, (pen_octet_w) + and R1, 0x20 + shl R1 + shl R1 + shl R1 + rolc R0 + movc (pen_octet_w), R0 + movc R1, (pen_bit_cnt_w) + inc R1 + movc (pen_bit_cnt_w), R1 + cmp R1, 8 + jne ex_uart_isr + mov R1, 0 + movc (pen_bit_cnt_w), R1 + movc R2, (pen_rx_ptr_w) + movc (R2), R0 + inc R2 + cmp R2, pen_rx_buf+128 + jne u_upd_nxt + mov R2, pen_rx_buf +u_upd_nxt: movc (pen_rx_ptr_w), R2 +ex_uart_isr: call Timer_isr + pop R2 + pop R1 + pop R0 + reti + +Timer_isr: xin R0, (btn_port) + and R0, 0x20 + shr R0 + xin R1, (ctrl_reg) + and R1, 0xEF + or R0, R1 + xout (ctrl_reg), R0 + xin R0, (btn_port) + and R0, 0x01 + jz btn_chk2 + mov R0, vga_read_addr + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + jmp ex_t_isr +btn_chk2: xin R0, (btn_port) + and R0, 0x02 + jz ex_t_isr + mov R0, vga_read_addr + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + inc R0 + xout (R0), 0x20 +ex_t_isr: ret + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: call pen_init + call LCD_init + mov R0, 0x00 + xout (led_port), R0 + + mov R0, CTRL_VGA_ENABLE + xout (ctrl_reg), R0 + + xin R0, (ctrl_reg) + or R0, CTRL_TIMER_ENABLE + xout (ctrl_reg), R0 + + mov R0, 0x03 + cout (cpu_int_ctrl), R0 + + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + mov R0, 0 + mov R1, 0xC0 + xout (reg_color_red), R1 + xout (reg_color_grn), R1 + xout (reg_color_blu), R1 + + call cg_wait_rdy + call cg_clr_screen + + ; Print greeting message + mov R1, greet_txt + call LCD_putsx + + mov R1, greet_txt + call cg_puts + mov R1, crlf + call cg_puts_clr + + xin R0, (ctrl_reg) + and R0, 0xCF + xout (ctrl_reg), R0 + + mov R0, 0 + movc (round_cnt), R0 + + mov R0, 0x0F + xout (timer_reload+0), R0 + mov R0, 0x27 + xout (timer_reload+1), R0 + mov R0, 0x00 + xout (timer_reload+2), R0 + +main_loop: call do_clear + call write_uart_data +ML1: call do_write + call do_read + movc R0, (round_cnt) + inc R0 + movc (round_cnt), R0 + jmp ML1 + +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- +do_clear: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt0 + call LCD_putsx + + mov R1, msg_txt0 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, 0 + mov R1, 0 + mov R2, 0 + call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: mov R2, BURST_LEN + +poll_clear_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_clear_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + sub R2, 2 + jnz poll_clear_full + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_c + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_c + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq clear_finished + + ; Advance address counter +next_addr_c: mov R0, BURST_LEN + call AddrCnt_Inc + + jmp sdr_clear + +clear_finished: + call AddrCnt_Disp + call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +write_uart_data: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt3 + call LCD_putsx + + mov R1, msg_txt3 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + + ; Set SDRAM address register to 0 +; mov R0, 0xF8 ; 800x600 +; mov R1, 0x52 ; 800x600 +; mov R2, 0x07 ; 800x600 +pen_restart: mov R0, 0x00 ; 1280x1024 + mov R1, 0x00 ; 1280x1024 + mov R2, 0x00 ; 1280x1024 + call AddrCnt_Init + call pen_init + +chk_pen_off: xin R0, (btn_port) + and R0, 0x20 + jnz chk_pen_off + mov R0, 1 +chk_pen_on: xin R0, (btn_port) + and R0, 0x20 + jz chk_pen_on + movc R0, (pen_rx_ptr_w) + sub R0, 5 + cmp R0, pen_rx_buf+128 + jlt set_rx_ptr + sub R0, 128 +set_rx_ptr: movc (pen_rx_ptr_r), R0 + + + ; Fill SDR Buffer +get_pen: mov R1, pixel_buf +wls0: call pen_getchar + movc (R1), R0 + inc R1 + cmp R1, pixel_buf+8 + jne wls0 + + ; Start SDR write + xin R0, (sdram_addr+0) + push R0 + xin R0, (sdram_addr+1) + push R0 + xin R0, (sdram_addr+2) + push R0 + + mov R15, 64 + +write_sd_block: mov R2, BURST_LEN + mov R1, pixel_buf +copy_sdram: mov R3, sdram_data +copy_pixel: movc R0, (R1) + movx (R3), R0 + inc R3 + movx (R3), R0 + inc R3 + movx (R3), R0 + inc R3 + inc R1 + cmp R3, sdram_data+6 + jne copy_pixel +pwf: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz pwf + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + sub R2, 2 + jnz copy_sdram + + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + +; call AddrCnt_Disp + xin R0, (sdram_addr+1) + add R0, 0x05 + xout (sdram_addr+1), R0 + xin R0, (sdram_addr+2) + addc R0, 0x00 + xout (sdram_addr+2), R0 + + dec R15 + jnz write_sd_block + + ; Advance address counter + pop R0, + xout (sdram_addr+2), R0 + pop R0 + xout (sdram_addr+1), R0 + pop R0 + xout (sdram_addr+0), R0 + + xin R0, (sdram_addr+0) + cmp R0, 0xF8 + jne next_addr + xin R0, (sdram_addr+1) + cmp R0, 0x04 + jne next_addr + xin R0, (sdram_addr+2) + cmp R0, 0x00 + jeq pen_restart + +next_addr: mov R0, BURST_LEN + call AddrCnt_Inc + jmp get_pen +sdw_fin: call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Write message + mov R1, msg_txt1 + call LCD_putsx + + mov R1, msg_txt1 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, START_ADDR0 + mov R1, START_ADDR1 + mov R2, START_ADDR2 + call AddrCnt_Init + movc R0, (round_cnt) + movc (block_cnt), R0 + +sdr_write: mov R2, BURST_LEN + + ; Fill SDR Buffer +sdr_burst_wr: movc R1, (block_cnt) + mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + +poll_write_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_write_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + movc R0, (block_cnt) + inc R0 + movc (block_cnt), R0 + + sub R2, 2 + jnz sdr_burst_wr + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_w + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_w + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq write_finished + + ; Advance address counter +next_addr_w: mov R0, BURST_LEN + call AddrCnt_Inc + + jmp sdr_write + +write_finished: call AddrCnt_Disp + call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Read message + mov R1, msg_txt2 + call LCD_putsx + + mov R1, msg_txt2 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, START_ADDR0 + mov R1, START_ADDR1 + mov R2, START_ADDR2 + call AddrCnt_Init + movc R0, (round_cnt) + movc (block_cnt), R0 + + ; flush_data +flush_data: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz sdr_read + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + jmp flush_data + +sdr_read: ; Start SDR read + call wait_cmd_rdy + mov R0, SD_CMD_READ + xout (sdram_reg), R0 + + mov R3, BURST_LEN + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz poll_read_fin + + ; Verify SDR Buffer + movc R1, (block_cnt) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance Read-FIFO + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + + movc R0, (block_cnt) + inc R0 + movc (block_cnt), R0 + + sub R3, 2 + jnz poll_read_fin + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_r + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_r + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq read_finished + + ; Advance address counter +next_addr_r: mov R0, BURST_LEN + call AddrCnt_Inc + jmp sdr_read + +; ---------------------------------------------------------- +wait_cmd_rdy: push R0 +wait4cmd: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_CMD_FULL + jnz wait4cmd + pop R0 + ret + +; ---------------------------------------------------------- +read_finished: +no_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_ok + call LCD_putsx + mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + + mov R1, verify_ok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + jmp ende + +verify_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_nok + call LCD_putsx + call print_addr + call print_data + mov R1, verify_nok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + + jmp ende + +ende: call delay1s + ret + +; ------------------------------------------------- +AddrCnt_Init: xout (sdram_addr+0), R0 + xout (sdram_addr+1), R1 + xout (sdram_addr+2), R2 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Inc: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Parameter +; R0: decrement value +AddrCnt_Dec: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + sub R1, R0 + subc R2, 0 + subc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Display Address counter +AddrCnt_Disp: mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + ret + +; ------------------------------------------------- +; PutHexByte +; R0 : Byte value +PutHexByte: push R1 + call bin2hex + call LCD_writechar + mov R0, R1 + call LCD_writechar + pop R1 + ret + +; ------------------------------------------------- +print_addr: push R0 + xin R0, (sdram_addr+2) + call PutHexByte + xin R0, (sdram_addr+1) + call PutHexByte + xin R0, (sdram_addr+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +; R1 : ptr to byte array +print_dword: push R0 + add R1, 3 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +print_data: push R0 + mov R0, LCD_CMD_Z2 + call LCD_writecmd + movx R0, (sdram_data+7) + call PutHexByte + movx R0, (sdram_data+6) + call PutHexByte + movx R0, (sdram_data+5) + call PutHexByte + movx R0, (sdram_data+4) + call PutHexByte + movx R0, (sdram_data+3) + call PutHexByte + movx R0, (sdram_data+2) + call PutHexByte + movx R0, (sdram_data+1) + call PutHexByte + movx R0, (sdram_data+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +pen_init: push R0 + mov R0, 0 + movc (pen_enable), R0 + call delay10ms + mov R0, pen_rx_buf + movc (pen_rx_ptr_r), R0 + movc (pen_rx_ptr_w), R0 + mov R0, PEN_TIMEOUT0 + movc (pen_timeout+0), R0 + mov R0, PEN_TIMEOUT1 + movc (pen_timeout+1), R0 + mov R0, 0 + movc (pen_bit_cnt_w), R0 + movc (pen_octet_w), R0 + movc (pen_octet_r), R0 + mov R0, 7 + movc (pen_bit_cnt_r), R0 + pop R0 + ret + +; ------------------------------------------------- +; Params: none +; Return: +; R0 : received character +pen_getchar: push R1 + push R2 + push R3 + movc R3, (pen_octet_r) + movc R1, (pen_rx_ptr_r) + movc R2, (pen_bit_cnt_r) + inc R2 + cmp R2, 8 + jne u_upd_r_ptr + mov R2, 0 + +pen_wait_rx: movc R0, (pen_rx_ptr_w) + cmp R0, R1 + jeq pen_wait_rx + movc R3, (R1) + inc R1 + cmp R1, pen_rx_buf+128 + jne u_upd_r_ptr + mov R1, pen_rx_buf +u_upd_r_ptr: movc (pen_rx_ptr_r), R1 + movc (pen_bit_cnt_r), R2 +ex_pen_gc: mov R0, 0xFF + shl R3 + jnc pen_is_zero + mov R0, 0x00 +pen_is_zero: movc (pen_octet_r), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +include "../../../lib/jasm/utils.inc.jsm" +include "../../../lib/jasm/lcd.inc.jsm" +include "../../../lib/jasm/cg.inc.jsm" +include "../../../lib/jasm/delays.inc.jsm" +include "../../../lib/jasm/uart.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/pen_test.tcl b/projects/cpu/asm/pen_test.tcl new file mode 100644 index 0000000..b12cd98 --- /dev/null +++ b/projects/cpu/asm/pen_test.tcl @@ -0,0 +1,2474 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from pen_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x03A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0003003A" + +# 0x001: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013C000" + +# 0x002: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0023C001" + +# 0x003: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0033C002" + +# 0x004: XIN R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00428001" + +# 0x005: MOVC R00, (0xAB) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0050AAB0" + +# 0x006: AND R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00619201" + +# 0x007: SHL R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0071E001" + +# 0x008: SHL R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0081E001" + +# 0x009: SHL R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0091E001" + +# 0x00A: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A22000" + +# 0x00B: MOVC (0xAB), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B0DAB0" + +# 0x00C: MOVC R01, (0xAA) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C0AAA1" + +# 0x00D: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D11011" + +# 0x00E: MOVC (0xAA), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E0DAA1" + +# 0x00F: CMP R01, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F0F081" + +# 0x010: JNE 0x01A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103A01A" + +# 0x011: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01103001" + +# 0x012: MOVC (0xAA), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0120DAA1" + +# 0x013: MOVC R02, (0xA7) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0130AA72" + +# 0x014: MOVC (R00), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0140B020" + +# 0x015: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01511012" + +# 0x016: CMP R02, 0xA6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0160FA62" + +# 0x017: JNE 0x019 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0173A019" + +# 0x018: MOV R02, 0x26 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01803262" + +# 0x019: MOVC (0xA7), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0190DA72" + +# 0x01A: CALL 0x01F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A3B01F" + +# 0x01B: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B3D002" + +# 0x01C: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C3D001" + +# 0x01D: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D3D000" + +# 0x01E: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E3F000" + +# 0x01F: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F28000" + +# 0x020: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02019200" + +# 0x021: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0211F000" + +# 0x022: XIN R01, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02228041" + +# 0x023: AND R01, 0xEF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02319EF1" + +# 0x024: OR R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0241A010" + +# 0x025: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02524040" + +# 0x026: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02628000" + +# 0x027: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02719010" + +# 0x028: JZ 0x030 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02831030" + +# 0x029: MOV R00, 0x14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02903140" + +# 0x02A: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A25000" + +# 0x02B: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B11010" + +# 0x02C: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C25000" + +# 0x02D: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D11010" + +# 0x02E: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E25000" + +# 0x02F: JMP 0x039 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F30039" + +# 0x030: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03028000" + +# 0x031: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03119020" + +# 0x032: JZ 0x039 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03231039" + +# 0x033: MOV R00, 0x14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03303140" + +# 0x034: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03425000" + +# 0x035: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03511010" + +# 0x036: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03625000" + +# 0x037: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03711010" + +# 0x038: XOUT (R00), 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03825200" + +# 0x039: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0393E000" + +# 0x03A: CALL 0x1DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A3B1DC" + +# 0x03B: CALL 0x219 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B3B219" + +# 0x03C: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C03000" + +# 0x03D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D24010" + +# 0x03E: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E03040" + +# 0x03F: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F24040" + +# 0x040: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04028040" + +# 0x041: OR R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0411B020" + +# 0x042: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04224040" + +# 0x043: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04303030" + +# 0x044: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04426030" + +# 0x045: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04503010" + +# 0x046: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0463B236" + +# 0x047: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04703000" + +# 0x048: MOV R01, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04803C01" + +# 0x049: XOUT (0x10), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04924101" + +# 0x04A: XOUT (0x11), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A24111" + +# 0x04B: XOUT (0x12), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B24121" + +# 0x04C: CALL 0x2AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C3B2AA" + +# 0x04D: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D3B28F" + +# 0x04E: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E03031" + +# 0x04F: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F3B23B" + +# 0x050: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05003031" + +# 0x051: CALL 0x29B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0513B29B" + +# 0x052: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05203001" + +# 0x053: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0533B2A7" + +# 0x054: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05428040" + +# 0x055: AND R00, 0xCF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05519CF0" + +# 0x056: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05624040" + +# 0x057: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05703000" + +# 0x058: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0580D010" + +# 0x059: MOV R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "059030F0" + +# 0x05A: XOUT (0x17), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A24170" + +# 0x05B: MOV R00, 0x27 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B03270" + +# 0x05C: XOUT (0x18), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C24180" + +# 0x05D: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D03000" + +# 0x05E: XOUT (0x19), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E24190" + +# 0x05F: CALL 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F3B067" + +# 0x060: CALL 0x094 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0603B094" + +# 0x061: CALL 0x0EF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0613B0EF" + +# 0x062: CALL 0x123 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0623B123" + +# 0x063: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0630A010" + +# 0x064: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06411010" + +# 0x065: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0650D010" + +# 0x066: JMP 0x061 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06630061" + +# 0x067: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06703010" + +# 0x068: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0683B236" + +# 0x069: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "069030E1" + +# 0x06A: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A3B23B" + +# 0x06B: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B030E1" + +# 0x06C: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C3B2A4" + +# 0x06D: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D03001" + +# 0x06E: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E3B2A7" + +# 0x06F: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F03000" + +# 0x070: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07003001" + +# 0x071: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07103002" + +# 0x072: CALL 0x180 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0723B180" + +# 0x073: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07303800" + +# 0x074: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0740308F" + +# 0x075: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07507000" + +# 0x076: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07611010" + +# 0x077: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0771501F" + +# 0x078: JNZ 0x075 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07832075" + +# 0x079: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07903082" + +# 0x07A: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A28070" + +# 0x07B: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B24010" + +# 0x07C: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C19040" + +# 0x07D: JNZ 0x07A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D3207A" + +# 0x07E: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E03100" + +# 0x07F: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F24070" + +# 0x080: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08015022" + +# 0x081: JNZ 0x07A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0813207A" + +# 0x082: CALL 0x15D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0823B15D" + +# 0x083: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08303060" + +# 0x084: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08424070" + +# 0x085: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08528080" + +# 0x086: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0860FF80" + +# 0x087: JNE 0x08E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0873A08E" + +# 0x088: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08828090" + +# 0x089: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0890FFF0" + +# 0x08A: JNE 0x08E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A3A08E" + +# 0x08B: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B280A0" + +# 0x08C: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C0FFF0" + +# 0x08D: JEQ 0x091 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D39091" + +# 0x08E: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E03080" + +# 0x08F: CALL 0x184 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F3B184" + +# 0x090: JMP 0x079 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09030079" + +# 0x091: CALL 0x1A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0913B1A4" + +# 0x092: CALL 0x2B0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0923B2B0" + +# 0x093: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0933E000" + +# 0x094: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09403010" + +# 0x095: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0953B236" + +# 0x096: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09603391" + +# 0x097: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0973B23B" + +# 0x098: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09803391" + +# 0x099: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0993B2A4" + +# 0x09A: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A03001" + +# 0x09B: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B3B2A7" + +# 0x09C: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C03000" + +# 0x09D: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D03001" + +# 0x09E: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E03002" + +# 0x09F: CALL 0x180 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F3B180" + +# 0x0A0: CALL 0x1DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A03B1DC" + +# 0x0A1: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A128000" + +# 0x0A2: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A219200" + +# 0x0A3: JNZ 0x0A1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A3320A1" + +# 0x0A4: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A403010" + +# 0x0A5: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A528000" + +# 0x0A6: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A619200" + +# 0x0A7: JZ 0x0A5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A7310A5" + +# 0x0A8: MOVC R00, (0xA7) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A80AA70" + +# 0x0A9: SUB R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A915050" + +# 0x0AA: CMP R00, 0xA6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA0FA60" + +# 0x0AB: JLT 0x0AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB350AD" + +# 0x0AC: SUB R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC15800" + +# 0x0AD: MOVC (0xA6), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD0DA60" + +# 0x0AE: MOV R01, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE03061" + +# 0x0AF: CALL 0x1EF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF3B1EF" + +# 0x0B0: MOVC (R00), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B00B010" + +# 0x0B1: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B111011" + +# 0x0B2: CMP R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B20F0E1" + +# 0x0B3: JNE 0x0AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B33A0AF" + +# 0x0B4: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B428080" + +# 0x0B5: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B53C000" + +# 0x0B6: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B628090" + +# 0x0B7: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B73C000" + +# 0x0B8: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B8280A0" + +# 0x0B9: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B93C000" + +# 0x0BA: MOV R15, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA0340F" + +# 0x0BB: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB03082" + +# 0x0BC: MOV R01, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC03061" + +# 0x0BD: MOV R03, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD03803" + +# 0x0BE: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE09010" + +# 0x0BF: MOVX (R00), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF06030" + +# 0x0C0: INC R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C011013" + +# 0x0C1: MOVX (R00), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C106030" + +# 0x0C2: INC R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C211013" + +# 0x0C3: MOVX (R00), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C306030" + +# 0x0C4: INC R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C411013" + +# 0x0C5: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C511011" + +# 0x0C6: CMP R03, 0x86 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C60F863" + +# 0x0C7: JNE 0x0BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C73A0BE" + +# 0x0C8: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C828070" + +# 0x0C9: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C924010" + +# 0x0CA: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA19040" + +# 0x0CB: JNZ 0x0C8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB320C8" + +# 0x0CC: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC03100" + +# 0x0CD: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD24070" + +# 0x0CE: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE15022" + +# 0x0CF: JNZ 0x0BD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF320BD" + +# 0x0D0: CALL 0x15D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D03B15D" + +# 0x0D1: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D103060" + +# 0x0D2: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D224070" + +# 0x0D3: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D328090" + +# 0x0D4: ADD R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D411050" + +# 0x0D5: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D524090" + +# 0x0D6: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D6280A0" + +# 0x0D7: ADDC R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D713000" + +# 0x0D8: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D8240A0" + +# 0x0D9: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D91501F" + +# 0x0DA: JNZ 0x0BB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA320BB" + +# 0x0DB: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB3D000" + +# 0x0DC: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC240A0" + +# 0x0DD: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD3D000" + +# 0x0DE: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE24090" + +# 0x0DF: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF3D000" + +# 0x0E0: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E024080" + +# 0x0E1: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E128080" + +# 0x0E2: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E20FF80" + +# 0x0E3: JNE 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E33A0EA" + +# 0x0E4: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E428090" + +# 0x0E5: CMP R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E50F040" + +# 0x0E6: JNE 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E63A0EA" + +# 0x0E7: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E7280A0" + +# 0x0E8: CMP R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E80F000" + +# 0x0E9: JEQ 0x09C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E93909C" + +# 0x0EA: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA03080" + +# 0x0EB: CALL 0x184 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB3B184" + +# 0x0EC: JMP 0x0AE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC300AE" + +# 0x0ED: CALL 0x2B0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED3B2B0" + +# 0x0EE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE3E000" + +# 0x0EF: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF03010" + +# 0x0F0: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F03B236" + +# 0x0F1: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F1031D1" + +# 0x0F2: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F23B23B" + +# 0x0F3: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F3031D1" + +# 0x0F4: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F43B2A4" + +# 0x0F5: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F503001" + +# 0x0F6: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F63B2A7" + +# 0x0F7: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F703000" + +# 0x0F8: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F803001" + +# 0x0F9: MOV R02, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F903202" + +# 0x0FA: CALL 0x180 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA3B180" + +# 0x0FB: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB0A010" + +# 0x0FC: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC0D000" + +# 0x0FD: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD03082" + +# 0x0FE: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE0A001" + +# 0x0FF: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF03800" + +# 0x100: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1000308F" + +# 0x101: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10106001" + +# 0x102: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10211010" + +# 0x103: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10311011" + +# 0x104: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1041501F" + +# 0x105: JNZ 0x101 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10532101" + +# 0x106: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10628070" + +# 0x107: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10724010" + +# 0x108: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10819040" + +# 0x109: JNZ 0x106 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10932106" + +# 0x10A: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A03100" + +# 0x10B: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B24070" + +# 0x10C: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C0A000" + +# 0x10D: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D11010" + +# 0x10E: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E0D000" + +# 0x10F: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F15022" + +# 0x110: JNZ 0x0FE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "110320FE" + +# 0x111: CALL 0x15D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1113B15D" + +# 0x112: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11203060" + +# 0x113: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11324070" + +# 0x114: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11428080" + +# 0x115: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1150FF80" + +# 0x116: JNE 0x11D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1163A11D" + +# 0x117: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11728090" + +# 0x118: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1180FFF0" + +# 0x119: JNE 0x11D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1193A11D" + +# 0x11A: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A280A0" + +# 0x11B: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B0FFF0" + +# 0x11C: JEQ 0x120 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C39120" + +# 0x11D: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D03080" + +# 0x11E: CALL 0x184 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E3B184" + +# 0x11F: JMP 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F300FD" + +# 0x120: CALL 0x1A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1203B1A4" + +# 0x121: CALL 0x2B0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1213B2B0" + +# 0x122: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1223E000" + +# 0x123: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12303010" + +# 0x124: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1243B236" + +# 0x125: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "125032B1" + +# 0x126: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1263B23B" + +# 0x127: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "127032B1" + +# 0x128: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1283B2A4" + +# 0x129: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12903001" + +# 0x12A: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A3B2A7" + +# 0x12B: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B03000" + +# 0x12C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C03001" + +# 0x12D: MOV R02, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D03202" + +# 0x12E: CALL 0x180 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E3B180" + +# 0x12F: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F0A010" + +# 0x130: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1300D000" + +# 0x131: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13128070" + +# 0x132: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13224010" + +# 0x133: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13319200" + +# 0x134: JNZ 0x138 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13432138" + +# 0x135: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13503200" + +# 0x136: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13624070" + +# 0x137: JMP 0x131 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13730131" + +# 0x138: CALL 0x15D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1383B15D" + +# 0x139: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13903050" + +# 0x13A: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A24070" + +# 0x13B: MOV R03, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B03083" + +# 0x13C: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C28070" + +# 0x13D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D24010" + +# 0x13E: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E19200" + +# 0x13F: JNZ 0x13C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F3213C" + +# 0x140: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1400A001" + +# 0x141: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14103800" + +# 0x142: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1420308F" + +# 0x143: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14304002" + +# 0x144: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1440E012" + +# 0x145: JNE 0x170 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1453A170" + +# 0x146: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14611010" + +# 0x147: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14711011" + +# 0x148: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1481501F" + +# 0x149: JNZ 0x143 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14932143" + +# 0x14A: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A03200" + +# 0x14B: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B24070" + +# 0x14C: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C0A000" + +# 0x14D: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D11010" + +# 0x14E: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E0D000" + +# 0x14F: SUB R03, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F15023" + +# 0x150: JNZ 0x13C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1503213C" + +# 0x151: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15128080" + +# 0x152: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1520FF80" + +# 0x153: JNE 0x15A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1533A15A" + +# 0x154: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15428090" + +# 0x155: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1550FFF0" + +# 0x156: JNE 0x15A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1563A15A" + +# 0x157: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "157280A0" + +# 0x158: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1580FFF0" + +# 0x159: JEQ 0x164 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15939164" + +# 0x15A: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15A03080" + +# 0x15B: CALL 0x184 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15B3B184" + +# 0x15C: JMP 0x138 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15C30138" + +# 0x15D: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15D3C000" + +# 0x15E: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15E28070" + +# 0x15F: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15F24010" + +# 0x160: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16019010" + +# 0x161: JNZ 0x15E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1613215E" + +# 0x162: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1623D000" + +# 0x163: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1633E000" + +# 0x164: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16403010" + +# 0x165: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1653B236" + +# 0x166: MOV R01, 0x48 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16603481" + +# 0x167: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1673B23B" + +# 0x168: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16803C00" + +# 0x169: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1693B236" + +# 0x16A: CALL 0x1AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16A3B1AF" + +# 0x16B: MOV R01, 0x48 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16B03481" + +# 0x16C: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16C3B2A4" + +# 0x16D: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16D03001" + +# 0x16E: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16E3B2A7" + +# 0x16F: JMP 0x17E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16F3017E" + +# 0x170: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17003010" + +# 0x171: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1713B236" + +# 0x172: MOV R01, 0x52 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17203521" + +# 0x173: CALL 0x23B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1733B23B" + +# 0x174: CALL 0x1AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1743B1AF" + +# 0x175: CALL 0x1C7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1753B1C7" + +# 0x176: MOV R01, 0x52 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17603521" + +# 0x177: CALL 0x2A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1773B2A4" + +# 0x178: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17803001" + +# 0x179: CALL 0x2A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1793B2A7" + +# 0x17A: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17A28040" + +# 0x17B: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17B1B100" + +# 0x17C: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17C24040" + +# 0x17D: JMP 0x17E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17D3017E" + +# 0x17E: CALL 0x2B0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17E3B2B0" + +# 0x17F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17F3E000" + +# 0x180: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18024080" + +# 0x181: XOUT (0x09), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18124091" + +# 0x182: XOUT (0x0A), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "182240A2" + +# 0x183: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1833E000" + +# 0x184: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1843C001" + +# 0x185: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1853C002" + +# 0x186: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1863C003" + +# 0x187: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18728081" + +# 0x188: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18828092" + +# 0x189: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "189280A3" + +# 0x18A: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18A10001" + +# 0x18B: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18B13002" + +# 0x18C: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18C13003" + +# 0x18D: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18D24081" + +# 0x18E: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18E24092" + +# 0x18F: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18F240A3" + +# 0x190: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1903D003" + +# 0x191: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1913D002" + +# 0x192: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1923D001" + +# 0x193: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1933E000" + +# 0x194: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1943C001" + +# 0x195: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1953C002" + +# 0x196: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1963C003" + +# 0x197: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19728081" + +# 0x198: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19828092" + +# 0x199: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "199280A3" + +# 0x19A: SUB R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19A14001" + +# 0x19B: SUBC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19B17002" + +# 0x19C: SUBC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19C17003" + +# 0x19D: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19D24081" + +# 0x19E: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19E24092" + +# 0x19F: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19F240A3" + +# 0x1A0: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A03D003" + +# 0x1A1: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A13D002" + +# 0x1A2: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A23D001" + +# 0x1A3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A33E000" + +# 0x1A4: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A403C00" + +# 0x1A5: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A53B236" + +# 0x1A6: CALL 0x1AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A63B1AF" + +# 0x1A7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A73E000" + +# 0x1A8: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A83C001" + +# 0x1A9: CALL 0x212 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A93B212" + +# 0x1AA: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AA3B24D" + +# 0x1AB: MOV R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AB02010" + +# 0x1AC: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AC3B24D" + +# 0x1AD: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AD3D001" + +# 0x1AE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AE3E000" + +# 0x1AF: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AF3C000" + +# 0x1B0: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B0280A0" + +# 0x1B1: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B13B1A8" + +# 0x1B2: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B228090" + +# 0x1B3: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B33B1A8" + +# 0x1B4: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B428080" + +# 0x1B5: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B53B1A8" + +# 0x1B6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B63D000" + +# 0x1B7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B73E000" + +# 0x1B8: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B83C000" + +# 0x1B9: ADD R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B911031" + +# 0x1BA: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BA09010" + +# 0x1BB: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BB3B1A8" + +# 0x1BC: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BC15011" + +# 0x1BD: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BD09010" + +# 0x1BE: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BE3B1A8" + +# 0x1BF: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BF15011" + +# 0x1C0: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C009010" + +# 0x1C1: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C13B1A8" + +# 0x1C2: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C215011" + +# 0x1C3: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C309010" + +# 0x1C4: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C43B1A8" + +# 0x1C5: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C53D000" + +# 0x1C6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C63E000" + +# 0x1C7: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C73C000" + +# 0x1C8: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C803C00" + +# 0x1C9: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C93B236" + +# 0x1CA: MOVX R00, (0x87) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CA05870" + +# 0x1CB: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CB3B1A8" + +# 0x1CC: MOVX R00, (0x86) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CC05860" + +# 0x1CD: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CD3B1A8" + +# 0x1CE: MOVX R00, (0x85) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CE05850" + +# 0x1CF: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CF3B1A8" + +# 0x1D0: MOVX R00, (0x84) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D005840" + +# 0x1D1: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D13B1A8" + +# 0x1D2: MOVX R00, (0x83) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D205830" + +# 0x1D3: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D33B1A8" + +# 0x1D4: MOVX R00, (0x82) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D405820" + +# 0x1D5: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D53B1A8" + +# 0x1D6: MOVX R00, (0x81) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D605810" + +# 0x1D7: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D73B1A8" + +# 0x1D8: MOVX R00, (0x80) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D805800" + +# 0x1D9: CALL 0x1A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D93B1A8" + +# 0x1DA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DA3D000" + +# 0x1DB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DB3E000" + +# 0x1DC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DC3C000" + +# 0x1DD: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DD03000" + +# 0x1DE: MOVC (0xAE), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DE0DAE0" + +# 0x1DF: CALL 0x2BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DF3B2BE" + +# 0x1E0: MOV R00, 0x26 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E003260" + +# 0x1E1: MOVC (0xA6), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E10DA60" + +# 0x1E2: MOVC (0xA7), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E20DA70" + +# 0x1E3: MOV R00, 0xE8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E303E80" + +# 0x1E4: MOVC (0xA8), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E40DA80" + +# 0x1E5: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E503030" + +# 0x1E6: MOVC (0xA9), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E60DA90" + +# 0x1E7: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E703000" + +# 0x1E8: MOVC (0xAA), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E80DAA0" + +# 0x1E9: MOVC (0xAB), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E90DAB0" + +# 0x1EA: MOVC (0xAC), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EA0DAC0" + +# 0x1EB: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EB03070" + +# 0x1EC: MOVC (0xAF), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EC0DAF0" + +# 0x1ED: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1ED3D000" + +# 0x1EE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EE3E000" + +# 0x1EF: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EF3C001" + +# 0x1F0: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F03C002" + +# 0x1F1: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F13C003" + +# 0x1F2: MOVC R03, (0xAC) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F20AAC3" + +# 0x1F3: MOVC R01, (0xA6) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F30AA61" + +# 0x1F4: MOVC R02, (0xAF) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F40AAF2" + +# 0x1F5: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F511012" + +# 0x1F6: CMP R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F60F082" + +# 0x1F7: JNE 0x201 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F73A201" + +# 0x1F8: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F803002" + +# 0x1F9: MOVC R00, (0xA7) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F90AA70" + +# 0x1FA: CMP R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FA0E010" + +# 0x1FB: JEQ 0x1F9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FB391F9" + +# 0x1FC: MOVC R03, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FC09013" + +# 0x1FD: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FD11011" + +# 0x1FE: CMP R01, 0xA6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FE0FA61" + +# 0x1FF: JNE 0x201 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FF3A201" + +# 0x200: MOV R01, 0x26 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20003261" + +# 0x201: MOVC (0xA6), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2010DA61" + +# 0x202: MOVC (0xAF), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2020DAF2" + +# 0x203: MOV R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20303FF0" + +# 0x204: SHL R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2041E003" + +# 0x205: JNC 0x207 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20534207" + +# 0x206: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20603000" + +# 0x207: MOVC (0xAC), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2070DAC3" + +# 0x208: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2083D003" + +# 0x209: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2093D002" + +# 0x20A: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20A3D001" + +# 0x20B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20B3E000" + +# 0x20C: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20C190F0" + +# 0x20D: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20D0F0A0" + +# 0x20E: JLT 0x210 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20E35210" + +# 0x20F: ADD R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20F11070" + +# 0x210: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21011300" + +# 0x211: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2113E000" + +# 0x212: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2123C000" + +# 0x213: CALL 0x20C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2133B20C" + +# 0x214: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21402001" + +# 0x215: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2153D000" + +# 0x216: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2162A000" + +# 0x217: CALL 0x20C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2173B20C" + +# 0x218: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2183E000" + +# 0x219: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21903002" + +# 0x21A: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21A03030" + +# 0x21B: CALL 0x265 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21B3B265" + +# 0x21C: CALL 0x2BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21C3B2BE" + +# 0x21D: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21D03002" + +# 0x21E: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21E03030" + +# 0x21F: CALL 0x265 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21F3B265" + +# 0x220: CALL 0x2BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2203B2BE" + +# 0x221: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22103002" + +# 0x222: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22203020" + +# 0x223: CALL 0x265 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2233B265" + +# 0x224: CALL 0x2C5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2243B2C5" + +# 0x225: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22503280" + +# 0x226: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2263B236" + +# 0x227: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "227030C0" + +# 0x228: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2283B236" + +# 0x229: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22903060" + +# 0x22A: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22A3B236" + +# 0x22B: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22B03010" + +# 0x22C: CALL 0x236 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22C3B236" + +# 0x22D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22D3E000" + +# 0x22E: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22E3C000" + +# 0x22F: CALL 0x259 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22F3B259" + +# 0x230: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23019800" + +# 0x231: JZ 0x234 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23131234" + +# 0x232: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2323B2DC" + +# 0x233: JMP 0x22F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2333022F" + +# 0x234: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2343D000" + +# 0x235: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2353E000" + +# 0x236: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2363C002" + +# 0x237: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23703002" + +# 0x238: CALL 0x252 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2383B252" + +# 0x239: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2393D002" + +# 0x23A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23A3E000" + +# 0x23B: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23B3C000" + +# 0x23C: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23C04010" + +# 0x23D: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23D11011" + +# 0x23E: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23E0F000" + +# 0x23F: JZ 0x242 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23F31242" + +# 0x240: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2403B24D" + +# 0x241: JMP 0x23C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2413023C" + +# 0x242: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2423D000" + +# 0x243: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2433E000" + +# 0x244: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2443C000" + +# 0x245: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24509010" + +# 0x246: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24611011" + +# 0x247: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2470F000" + +# 0x248: JZ 0x24B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2483124B" + +# 0x249: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2493B24D" + +# 0x24A: JMP 0x245 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24A30245" + +# 0x24B: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24B3D000" + +# 0x24C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24C3E000" + +# 0x24D: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24D3C002" + +# 0x24E: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24E03402" + +# 0x24F: CALL 0x252 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24F3B252" + +# 0x250: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2503D002" + +# 0x251: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2513E000" + +# 0x252: CALL 0x22E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2523B22E" + +# 0x253: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2533C000" + +# 0x254: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2542A000" + +# 0x255: CALL 0x265 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2553B265" + +# 0x256: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2563D000" + +# 0x257: CALL 0x265 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2573B265" + +# 0x258: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2583E000" + +# 0x259: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2593C002" + +# 0x25A: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25A03002" + +# 0x25B: CALL 0x25E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25B3B25E" + +# 0x25C: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25C3D002" + +# 0x25D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25D3E000" + +# 0x25E: CALL 0x278 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25E3B278" + +# 0x25F: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25F2A000" + +# 0x260: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2603C000" + +# 0x261: CALL 0x278 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2613B278" + +# 0x262: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2623D002" + +# 0x263: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2631A020" + +# 0x264: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2643E000" + +# 0x265: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2653C001" + +# 0x266: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "266190F0" + +# 0x267: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26702001" + +# 0x268: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2681A021" + +# 0x269: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26924031" + +# 0x26A: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26A3B2DC" + +# 0x26B: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26B02001" + +# 0x26C: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26C1A021" + +# 0x26D: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26D1B801" + +# 0x26E: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26E24031" + +# 0x26F: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26F3B2DC" + +# 0x270: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27002001" + +# 0x271: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2711A021" + +# 0x272: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27224031" + +# 0x273: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2733B2DC" + +# 0x274: OR R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2741B201" + +# 0x275: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27524031" + +# 0x276: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2763D001" + +# 0x277: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2773E000" + +# 0x278: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2783C001" + +# 0x279: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27903201" + +# 0x27A: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27A1A021" + +# 0x27B: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27B24031" + +# 0x27C: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27C3B2DC" + +# 0x27D: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27D03201" + +# 0x27E: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27E1A021" + +# 0x27F: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27F1B801" + +# 0x280: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28024031" + +# 0x281: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2813B2DC" + +# 0x282: XIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28228030" + +# 0x283: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "283190F0" + +# 0x284: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28403201" + +# 0x285: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2851A021" + +# 0x286: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28624031" + +# 0x287: CALL 0x2DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2873B2DC" + +# 0x288: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2883D001" + +# 0x289: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2893E000" + +# 0x28A: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28A3C000" + +# 0x28B: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28B03020" + +# 0x28C: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28C240E0" + +# 0x28D: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28D3D000" + +# 0x28E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28E3E000" + +# 0x28F: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28F3C000" + +# 0x290: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29003010" + +# 0x291: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "291240E0" + +# 0x292: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2923D000" + +# 0x293: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2933E000" + +# 0x294: CALL 0x2AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2943B2AA" + +# 0x295: XOUT (0x0C), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "295240C1" + +# 0x296: XOUT (0x0B), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "296240B0" + +# 0x297: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2973E000" + +# 0x298: CALL 0x2AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2983B2AA" + +# 0x299: XOUT (0x0D), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "299240D0" + +# 0x29A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29A3E000" + +# 0x29B: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29B3C000" + +# 0x29C: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29C04010" + +# 0x29D: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29D11011" + +# 0x29E: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29E0F000" + +# 0x29F: JZ 0x2A2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29F312A2" + +# 0x2A0: CALL 0x298 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A03B298" + +# 0x2A1: JMP 0x29C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A13029C" + +# 0x2A2: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A23D000" + +# 0x2A3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A33E000" + +# 0x2A4: CALL 0x28A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A43B28A" + +# 0x2A5: CALL 0x29B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A53B29B" + +# 0x2A6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A63E000" + +# 0x2A7: CALL 0x29B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A73B29B" + +# 0x2A8: CALL 0x28A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A83B28A" + +# 0x2A9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A93E000" + +# 0x2AA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AA3C000" + +# 0x2AB: XIN R00, (0x0E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AB280E0" + +# 0x2AC: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AC19020" + +# 0x2AD: JZ 0x2AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AD312AB" + +# 0x2AE: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AE3D000" + +# 0x2AF: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AF3E000" + +# 0x2B0: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B03C00F" + +# 0x2B1: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B1030AF" + +# 0x2B2: CALL 0x2B7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B23B2B7" + +# 0x2B3: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B31501F" + +# 0x2B4: JNZ 0x2B2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B4322B2" + +# 0x2B5: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B53D00F" + +# 0x2B6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B63E000" + +# 0x2B7: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B73C00F" + +# 0x2B8: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B8030AF" + +# 0x2B9: CALL 0x2BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B93B2BE" + +# 0x2BA: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BA1501F" + +# 0x2BB: JNZ 0x2B9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BB322B9" + +# 0x2BC: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BC3D00F" + +# 0x2BD: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BD3E000" + +# 0x2BE: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BE3C00F" + +# 0x2BF: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BF030AF" + +# 0x2C0: CALL 0x2C5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C03B2C5" + +# 0x2C1: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C11501F" + +# 0x2C2: JNZ 0x2C0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C2322C0" + +# 0x2C3: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C33D00F" + +# 0x2C4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C43E000" + +# 0x2C5: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C53C00F" + +# 0x2C6: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C6030AF" + +# 0x2C7: CALL 0x2CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C73B2CC" + +# 0x2C8: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C81501F" + +# 0x2C9: JNZ 0x2C7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C9322C7" + +# 0x2CA: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CA3D00F" + +# 0x2CB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CB3E000" + +# 0x2CC: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CC3C00F" + +# 0x2CD: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CD030AF" + +# 0x2CE: CALL 0x2D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CE3B2D3" + +# 0x2CF: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CF1501F" + +# 0x2D0: JNZ 0x2CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D0322CE" + +# 0x2D1: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D13D00F" + +# 0x2D2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D23E000" + +# 0x2D3: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D33C00F" + +# 0x2D4: MOV R15, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D40363F" + +# 0x2D5: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D500000" + +# 0x2D6: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D600000" + +# 0x2D7: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D700000" + +# 0x2D8: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D81501F" + +# 0x2D9: JNZ 0x2D5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D9322D5" + +# 0x2DA: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DA3D00F" + +# 0x2DB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DB3E000" + +# 0x2DC: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DC3C00F" + +# 0x2DD: MOV R15, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DD0309F" + +# 0x2DE: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DE00000" + +# 0x2DF: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DF00000" + +# 0x2E0: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E000000" + +# 0x2E1: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E11501F" + +# 0x2E2: JNZ 0x2DE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E2322DE" + +# 0x2E3: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E33D00F" + +# 0x2E4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E43E000" + +# 0x2E5: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E53C001" + +# 0x2E6: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E628061" + +# 0x2E7: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E719021" + +# 0x2E8: JNZ 0x2E6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E8322E6" + +# 0x2E9: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E924020" + +# 0x2EA: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EA3D001" + +# 0x2EB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EB3E000" + +# 0x2EC: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EC3C001" + +# 0x2ED: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2ED28061" + +# 0x2EE: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EE19101" + +# 0x2EF: JZ 0x2ED +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EF312ED" + +# 0x2F0: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F028020" + +# 0x2F1: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F13D001" + +# 0x2F2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F23E000" + +# Assembled from pen_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "000D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "010A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "074D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0954" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B73" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E43" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1065" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1161" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1272" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1369" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "146E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1567" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1620" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1753" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1844" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A41" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B4D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D57" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2074" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2169" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "226E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2367" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2420" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2553" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2644" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2752" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2841" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "294D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B52" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "306E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3167" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3220" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "374D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E6E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F67" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4020" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4142" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4269" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4374" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "446D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4561" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4670" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4856" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4965" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C66" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F4F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "504B" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5246" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5361" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5469" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "556C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5665" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5764" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5961" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D2E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/rom.tcl b/projects/cpu/asm/rom.tcl new file mode 100644 index 0000000..d337450 --- /dev/null +++ b/projects/cpu/asm/rom.tcl @@ -0,0 +1,64 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# Source JTAG/TCL frame work +#cd $env(CHIPSCOPE)\bin\nt +cd F:\\Xilinx9\\ChipScope_Pro_9_1i\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" \ + "frequency=6000000"] + # frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +set CABLE_NAME $CSEJTAG_TARGET_PLATFORMUSB +set CABLE_ARGS $PLATFORM_USB_CABLE_ARGS + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CABLE_NAME 0 $CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 + +# --------------------------------------------------------------- +# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +::chipscope::csejtag_tap shift_chain_ir $handle $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 10 3C2 + +# Write Program +# JASM_ROM_INSERT_HERE + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/sdr_test.jsm b/projects/cpu/asm/sdr_test.jsm new file mode 100644 index 0000000..f68f8ba --- /dev/null +++ b/projects/cpu/asm/sdr_test.jsm @@ -0,0 +1,306 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +addr_incr: equ 2 +addr_msb_max: equ 0xFF + +; External RAM/ROM + xmem +greet_txt: dc "SDRAM Test", 0 +msg_txt0: dc "Clearing SDRAM", 0 +msg_txt1: dc "Writing SDRAM", 0 +msg_txt2: dc "Reading SDRAM", 0 +verify_ok: dc "Verify OK", 0 +verify_nok: dc "Verify Failed", 0 +dot: dc ".", 0 + + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +round: db 1 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: + call LCD_init + mov R0, 0x00 + xout (led_port), R0 + + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Wait until SDRAM ready +poll_bsy_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_BUSY + jnz poll_bsy_fin + + ; Print greeting message + mov R1, greet_txt + call LCD_putsx + + xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + call delay100ms + or R0, 0x20 + xout (ctrl_reg), R0 + call delay100ms + and R0, 0xEF + xout (ctrl_reg), R0 + call delay100ms + and R0, 0xCF + xout (ctrl_reg), R0 + + jmp do_clear +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- +do_clear: ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt0 + call LCD_putsx + + ; Set SDRAM address register to 0 + call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq clear_finished + + ; Wait finished last write +poll_clear_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_WRITE_BUSY + + jnz poll_clear_fin + + ; Start SDR write + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_WRITE_REQUEST + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + + jmp sdr_clear + +clear_finished: + call AddrCnt_Disp + call delay1s + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Write message + mov R1, msg_txt1 + call LCD_putsx + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_write: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq write_finished + + ; Fill SDR Buffer + movc R1, (round) +; xin R0, (sdram_addr+2) +; cmp R0, 0x7F +; jne force_no_err +; inc R1 +force_no_err: mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + + ; Wait finished last write +poll_write_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_WRITE_BUSY + jnz poll_write_fin + + ; Start SDR write + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_WRITE_REQUEST + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + movc R0, (round) + inc R0 + movc (round), R0 + + jmp sdr_write + +write_finished: call AddrCnt_Disp + call delay1s + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Read message + mov R1, msg_txt2 + call LCD_putsx + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_read: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq read_finished + + ; Start SDR read + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_READ_REQUEST + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_READ_BUSY + jnz poll_read_fin + +read_back_mem: + ; Verify SDR Buffer + movc R1, (round) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + movc R0, (round) + inc R0 + movc (round), R0 + jmp sdr_read + +; ---------------------------------------------------------- +read_finished: +no_error: mov R0, LCD_CMD_Z2 + call LCD_writecmd + mov R1, verify_ok + call LCD_putsx + jmp ende + +verify_error: mov R0, LCD_CMD_Z2 + call LCD_writecmd + mov R1, verify_nok + call LCD_putsx + jmp ende + +ende: call delay1s + jmp do_clear + +; ------------------------------------------------- +AddrCnt_Init: push R0 + mov R0, 0x00 + xout (sdram_addr+0), R0 + xout (sdram_addr+1), R0 + xout (sdram_addr+2), R0 + pop R0 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Adv: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Display Address counter +AddrCnt_Disp: mov R0, LCD_CMD_Z2 + call LCD_writecmd + + xin R0, (sdram_addr+2) + call PutHexByte + xin R0, (sdram_addr+1) + call PutHexByte + xin R0, (sdram_addr+0) + call PutHexByte + + ret + +; ------------------------------------------------- +; PutHexByte +; R0 : Byte value +PutHexByte: call bin2hex + call LCD_writechar + mov R0, R1 + call LCD_writechar + ret + +; ------------------------------------------------- +include "../../../lib/jasm/utils.inc.jsm" +include "../../../lib/jasm/lcd.inc.jsm" +include "../../../lib/jasm/delays.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/sdr_test.tcl b/projects/cpu/asm/sdr_test.tcl new file mode 100644 index 0000000..d1a9c86 --- /dev/null +++ b/projects/cpu/asm/sdr_test.tcl @@ -0,0 +1,1239 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from sdr_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x002 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030002" + +# 0x001: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013F000" + +# 0x002: CALL 0x0B1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0023B0B1" + +# 0x003: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00303000" + +# 0x004: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00424010" + +# 0x005: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00503010" + +# 0x006: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0063B0CE" + +# 0x007: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00728070" + +# 0x008: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00824010" + +# 0x009: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00919800" + +# 0x00A: JNZ 0x007 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A32007" + +# 0x00B: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B03001" + +# 0x00C: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C3B0D3" + +# 0x00D: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D28040" + +# 0x00E: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E1B100" + +# 0x00F: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F24040" + +# 0x010: CALL 0x129 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103B129" + +# 0x011: OR R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0111B200" + +# 0x012: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01224040" + +# 0x013: CALL 0x129 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0133B129" + +# 0x014: AND R00, 0xEF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01419EF0" + +# 0x015: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01524040" + +# 0x016: CALL 0x129 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163B129" + +# 0x017: AND R00, 0xCF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01719CF0" + +# 0x018: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01824040" + +# 0x019: JMP 0x01A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0193001A" + +# 0x01A: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A03010" + +# 0x01B: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B3B0CE" + +# 0x01C: MOV R01, 0x0B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C030B1" + +# 0x01D: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D3B0D3" + +# 0x01E: CALL 0x07F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E3B07F" + +# 0x01F: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F03800" + +# 0x020: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0200308F" + +# 0x021: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02107000" + +# 0x022: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02211010" + +# 0x023: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0231501F" + +# 0x024: JNZ 0x021 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02432021" + +# 0x025: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "025280A0" + +# 0x026: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0260FFF0" + +# 0x027: JEQ 0x031 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02739031" + +# 0x028: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02828070" + +# 0x029: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02924010" + +# 0x02A: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A19020" + +# 0x02B: JNZ 0x028 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B32028" + +# 0x02C: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C03070" + +# 0x02D: XOUT (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D25020" + +# 0x02E: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E03020" + +# 0x02F: CALL 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F3B086" + +# 0x030: JMP 0x025 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03030025" + +# 0x031: CALL 0x096 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0313B096" + +# 0x032: CALL 0x122 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0323B122" + +# 0x033: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03303010" + +# 0x034: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0343B0CE" + +# 0x035: MOV R01, 0x1A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "035031A1" + +# 0x036: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0363B0D3" + +# 0x037: CALL 0x07F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0373B07F" + +# 0x038: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03803000" + +# 0x039: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0390D000" + +# 0x03A: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A280A0" + +# 0x03B: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B0FFF0" + +# 0x03C: JEQ 0x051 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C39051" + +# 0x03D: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D0A001" + +# 0x03E: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E03800" + +# 0x03F: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F0308F" + +# 0x040: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04006001" + +# 0x041: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04111010" + +# 0x042: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04211011" + +# 0x043: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0431501F" + +# 0x044: JNZ 0x040 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04432040" + +# 0x045: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04528070" + +# 0x046: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04624010" + +# 0x047: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04719020" + +# 0x048: JNZ 0x045 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04832045" + +# 0x049: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04903070" + +# 0x04A: XOUT (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A25020" + +# 0x04B: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B03020" + +# 0x04C: CALL 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C3B086" + +# 0x04D: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D0A000" + +# 0x04E: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E11010" + +# 0x04F: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F0D000" + +# 0x050: JMP 0x03A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0503003A" + +# 0x051: CALL 0x096 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0513B096" + +# 0x052: CALL 0x122 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0523B122" + +# 0x053: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05303010" + +# 0x054: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0543B0CE" + +# 0x055: MOV R01, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05503281" + +# 0x056: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0563B0D3" + +# 0x057: CALL 0x07F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0573B07F" + +# 0x058: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05803000" + +# 0x059: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0590D000" + +# 0x05A: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A280A0" + +# 0x05B: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B0FFF0" + +# 0x05C: JEQ 0x073 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C39073" + +# 0x05D: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D03070" + +# 0x05E: XOUT (R00), 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E25010" + +# 0x05F: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F28070" + +# 0x060: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06024010" + +# 0x061: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06119010" + +# 0x062: JNZ 0x05F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0623205F" + +# 0x063: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0630A001" + +# 0x064: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06403800" + +# 0x065: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0650308F" + +# 0x066: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06604002" + +# 0x067: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0670E012" + +# 0x068: JNE 0x078 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0683A078" + +# 0x069: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06911010" + +# 0x06A: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A11011" + +# 0x06B: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B1501F" + +# 0x06C: JNZ 0x066 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C32066" + +# 0x06D: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D03020" + +# 0x06E: CALL 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E3B086" + +# 0x06F: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F0A000" + +# 0x070: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07011010" + +# 0x071: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0710D000" + +# 0x072: JMP 0x05A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0723005A" + +# 0x073: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07303C00" + +# 0x074: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0743B0CE" + +# 0x075: MOV R01, 0x36 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07503361" + +# 0x076: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0763B0D3" + +# 0x077: JMP 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0773007D" + +# 0x078: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07803C00" + +# 0x079: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0793B0CE" + +# 0x07A: MOV R01, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A03401" + +# 0x07B: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B3B0D3" + +# 0x07C: JMP 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C3007D" + +# 0x07D: CALL 0x122 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D3B122" + +# 0x07E: JMP 0x01A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E3001A" + +# 0x07F: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F3C000" + +# 0x080: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08003000" + +# 0x081: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08124080" + +# 0x082: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08224090" + +# 0x083: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "083240A0" + +# 0x084: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0843D000" + +# 0x085: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0853E000" + +# 0x086: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0863C001" + +# 0x087: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0873C002" + +# 0x088: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0883C003" + +# 0x089: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08928081" + +# 0x08A: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A28092" + +# 0x08B: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B280A3" + +# 0x08C: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C10001" + +# 0x08D: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D13002" + +# 0x08E: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E13003" + +# 0x08F: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F24081" + +# 0x090: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09024092" + +# 0x091: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "091240A3" + +# 0x092: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0923D003" + +# 0x093: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0933D002" + +# 0x094: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0943D001" + +# 0x095: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0953E000" + +# 0x096: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09603C00" + +# 0x097: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0973B0CE" + +# 0x098: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "098280A0" + +# 0x099: CALL 0x09F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0993B09F" + +# 0x09A: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A28090" + +# 0x09B: CALL 0x09F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B3B09F" + +# 0x09C: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C28080" + +# 0x09D: CALL 0x09F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D3B09F" + +# 0x09E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E3E000" + +# 0x09F: CALL 0x0AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F3B0AA" + +# 0x0A0: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A03B0E5" + +# 0x0A1: MOV R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A102010" + +# 0x0A2: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A23B0E5" + +# 0x0A3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A33E000" + +# 0x0A4: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A4190F0" + +# 0x0A5: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A50F0A0" + +# 0x0A6: JLT 0x0A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A6350A8" + +# 0x0A7: ADD R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A711070" + +# 0x0A8: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A811300" + +# 0x0A9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A93E000" + +# 0x0AA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA3C000" + +# 0x0AB: CALL 0x0A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB3B0A4" + +# 0x0AC: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC02001" + +# 0x0AD: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD3D000" + +# 0x0AE: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE2A000" + +# 0x0AF: CALL 0x0A4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF3B0A4" + +# 0x0B0: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B03E000" + +# 0x0B1: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B103002" + +# 0x0B2: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B203030" + +# 0x0B3: CALL 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B33B0FD" + +# 0x0B4: CALL 0x130 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B43B130" + +# 0x0B5: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B503002" + +# 0x0B6: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B603030" + +# 0x0B7: CALL 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B73B0FD" + +# 0x0B8: CALL 0x130 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B83B130" + +# 0x0B9: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B903002" + +# 0x0BA: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA03020" + +# 0x0BB: CALL 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB3B0FD" + +# 0x0BC: CALL 0x137 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC3B137" + +# 0x0BD: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD03280" + +# 0x0BE: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE3B0CE" + +# 0x0BF: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF030C0" + +# 0x0C0: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C03B0CE" + +# 0x0C1: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C103060" + +# 0x0C2: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C23B0CE" + +# 0x0C3: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C303010" + +# 0x0C4: CALL 0x0CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C43B0CE" + +# 0x0C5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C53E000" + +# 0x0C6: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C63C000" + +# 0x0C7: CALL 0x0F1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C73B0F1" + +# 0x0C8: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C819800" + +# 0x0C9: JZ 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C9310CC" + +# 0x0CA: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA3B14E" + +# 0x0CB: JMP 0x0C7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB300C7" + +# 0x0CC: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC3D000" + +# 0x0CD: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD3E000" + +# 0x0CE: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE3C002" + +# 0x0CF: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF03002" + +# 0x0D0: CALL 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D03B0EA" + +# 0x0D1: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D13D002" + +# 0x0D2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D23E000" + +# 0x0D3: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D33C000" + +# 0x0D4: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D404010" + +# 0x0D5: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D511011" + +# 0x0D6: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D60F000" + +# 0x0D7: JZ 0x0DA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D7310DA" + +# 0x0D8: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D83B0E5" + +# 0x0D9: JMP 0x0D4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D9300D4" + +# 0x0DA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA3D000" + +# 0x0DB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB3E000" + +# 0x0DC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC3C000" + +# 0x0DD: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD09010" + +# 0x0DE: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE11011" + +# 0x0DF: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF0F000" + +# 0x0E0: JZ 0x0E3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E0310E3" + +# 0x0E1: CALL 0x0E5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E13B0E5" + +# 0x0E2: JMP 0x0DD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E2300DD" + +# 0x0E3: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E33D000" + +# 0x0E4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E43E000" + +# 0x0E5: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E53C002" + +# 0x0E6: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E603402" + +# 0x0E7: CALL 0x0EA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E73B0EA" + +# 0x0E8: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E83D002" + +# 0x0E9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E93E000" + +# 0x0EA: CALL 0x0C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA3B0C6" + +# 0x0EB: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB3C000" + +# 0x0EC: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC2A000" + +# 0x0ED: CALL 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED3B0FD" + +# 0x0EE: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE3D000" + +# 0x0EF: CALL 0x0FD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF3B0FD" + +# 0x0F0: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F03E000" + +# 0x0F1: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F13C002" + +# 0x0F2: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F203002" + +# 0x0F3: CALL 0x0F6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F33B0F6" + +# 0x0F4: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F43D002" + +# 0x0F5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F53E000" + +# 0x0F6: CALL 0x110 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F63B110" + +# 0x0F7: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F72A000" + +# 0x0F8: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F83C000" + +# 0x0F9: CALL 0x110 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F93B110" + +# 0x0FA: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA3D002" + +# 0x0FB: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB1A020" + +# 0x0FC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC3E000" + +# 0x0FD: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD3C001" + +# 0x0FE: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE190F0" + +# 0x0FF: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF02001" + +# 0x100: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1001A021" + +# 0x101: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10124031" + +# 0x102: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1023B14E" + +# 0x103: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10302001" + +# 0x104: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1041A021" + +# 0x105: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1051B801" + +# 0x106: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10624031" + +# 0x107: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1073B14E" + +# 0x108: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10802001" + +# 0x109: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1091A021" + +# 0x10A: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A24031" + +# 0x10B: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B3B14E" + +# 0x10C: OR R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C1B201" + +# 0x10D: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D24031" + +# 0x10E: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E3D001" + +# 0x10F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F3E000" + +# 0x110: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1103C001" + +# 0x111: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11103201" + +# 0x112: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1121A021" + +# 0x113: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11324031" + +# 0x114: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1143B14E" + +# 0x115: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11503201" + +# 0x116: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1161A021" + +# 0x117: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1171B801" + +# 0x118: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11824031" + +# 0x119: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1193B14E" + +# 0x11A: XIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A28030" + +# 0x11B: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B190F0" + +# 0x11C: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C03201" + +# 0x11D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D1A021" + +# 0x11E: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E24031" + +# 0x11F: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F3B14E" + +# 0x120: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1203D001" + +# 0x121: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1213E000" + +# 0x122: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1223C00F" + +# 0x123: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "123030AF" + +# 0x124: CALL 0x129 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1243B129" + +# 0x125: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1251501F" + +# 0x126: JNZ 0x124 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12632124" + +# 0x127: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1273D00F" + +# 0x128: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1283E000" + +# 0x129: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1293C00F" + +# 0x12A: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A030AF" + +# 0x12B: CALL 0x130 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B3B130" + +# 0x12C: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C1501F" + +# 0x12D: JNZ 0x12B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D3212B" + +# 0x12E: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E3D00F" + +# 0x12F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F3E000" + +# 0x130: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1303C00F" + +# 0x131: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "131030AF" + +# 0x132: CALL 0x137 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1323B137" + +# 0x133: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1331501F" + +# 0x134: JNZ 0x132 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13432132" + +# 0x135: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1353D00F" + +# 0x136: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1363E000" + +# 0x137: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1373C00F" + +# 0x138: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "138030AF" + +# 0x139: CALL 0x13E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1393B13E" + +# 0x13A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A1501F" + +# 0x13B: JNZ 0x139 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B32139" + +# 0x13C: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C3D00F" + +# 0x13D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D3E000" + +# 0x13E: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E3C00F" + +# 0x13F: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F030AF" + +# 0x140: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1403B145" + +# 0x141: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1411501F" + +# 0x142: JNZ 0x140 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14232140" + +# 0x143: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1433D00F" + +# 0x144: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1443E000" + +# 0x145: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1453C00F" + +# 0x146: MOV R15, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1460363F" + +# 0x147: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14700000" + +# 0x148: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14800000" + +# 0x149: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14900000" + +# 0x14A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A1501F" + +# 0x14B: JNZ 0x147 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B32147" + +# 0x14C: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C3D00F" + +# 0x14D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D3E000" + +# 0x14E: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E3C00F" + +# 0x14F: MOV R15, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F0309F" + +# 0x150: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15000000" + +# 0x151: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15100000" + +# 0x152: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15200000" + +# 0x153: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1531501F" + +# 0x154: JNZ 0x150 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15432150" + +# 0x155: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1553D00F" + +# 0x156: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1563E000" + +# Assembled from sdr_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0053" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0144" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0252" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0341" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "044D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0520" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0654" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0765" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0873" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0974" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B43" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1069" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "116E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1267" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1320" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1453" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1544" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1652" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1741" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "184D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A57" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F6E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2067" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2120" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2253" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2344" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2452" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2541" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "264D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2852" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2965" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D6E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E67" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3053" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3144" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3252" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3341" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "344D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3656" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3765" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3872" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3969" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A66" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D4F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E4B" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4056" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4165" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4272" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4369" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4466" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4579" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4620" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4746" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4861" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4969" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E2E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/sdr_test_short.jsm b/projects/cpu/asm/sdr_test_short.jsm new file mode 100644 index 0000000..4f748d1 --- /dev/null +++ b/projects/cpu/asm/sdr_test_short.jsm @@ -0,0 +1,215 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +addr_incr: equ 2 +addr_lsb_max: equ 0x08 + +; External RAM/ROM + xmem + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +round: db 1 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: mov R0, 0x00 + xout (led_port), R0 + xin R0, (ctrl_reg) + and R0, 0xCF + xout (ctrl_reg), R0 + + ; Wait until SDRAM ready +poll_bsy_fin: xin R0, (sdram_reg) + and R0, SDRAM_STAT_BUSY + jnz poll_bsy_fin + + jmp do_clear +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- +do_clear: + ; Set SDRAM address register to 0 + call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: xin R0, (sdram_addr+0) + cmp R0, addr_lsb_max + jeq clear_finished + + ; Wait finished last write +poll_clear_fin: xin R0, (sdram_reg) + and R0, SDRAM_STAT_WRITE_BUSY + jnz poll_clear_fin + + ; Start SDR write + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_WRITE_REQUEST + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + + jmp sdr_clear + +clear_finished: + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_write: xin R0, (sdram_addr+0) + cmp R0, addr_lsb_max + jeq write_finished + + ; Fill SDR Buffer + movc R1, (round) +force_no_err: mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + + ; Wait finished last write +poll_write_fin: xin R0, (sdram_reg) + and R0, SDRAM_STAT_WRITE_BUSY + jnz poll_write_fin + + nop + + ; Start SDR write + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_WRITE_REQUEST + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + movc R0, (round) + inc R0 + movc (round), R0 + + jmp sdr_write + +write_finished: + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_read: xin R0, (sdram_addr+0) + cmp R0, addr_lsb_max + jeq read_finished + + ; Start SDR read + mov R0, sdram_reg + xout (R0), SDRAM_CTRL_READ_REQUEST + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + and R0, SDRAM_STAT_READ_BUSY + jnz poll_read_fin + +read_back_mem: + ; Verify SDR Buffer + movc R1, (round) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance address counter + mov R0, addr_incr + call AddrCnt_Adv + movc R0, (round) + inc R0 + movc (round), R0 + jmp sdr_read + +; ---------------------------------------------------------- +read_finished: +no_error: jmp ende + +verify_error: xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + jmp ende + +ende: jmp ende + +; ------------------------------------------------- +AddrCnt_Init: push R0 + mov R0, 0x00 + xout (sdram_addr+0), R0 + xout (sdram_addr+1), R0 + xout (sdram_addr+2), R0 + pop R0 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Adv: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- + \ No newline at end of file diff --git a/projects/cpu/asm/sdr_test_short.tcl b/projects/cpu/asm/sdr_test_short.tcl new file mode 100644 index 0000000..b5dd735 --- /dev/null +++ b/projects/cpu/asm/sdr_test_short.tcl @@ -0,0 +1,542 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from sdr_test_short.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x002 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030002" + +# 0x001: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013F000" + +# 0x002: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00203000" + +# 0x003: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00324010" + +# 0x004: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00428040" + +# 0x005: AND R00, 0xCF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00519CF0" + +# 0x006: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00624040" + +# 0x007: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00728070" + +# 0x008: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00819800" + +# 0x009: JNZ 0x007 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00932007" + +# 0x00A: JMP 0x00B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A3000B" + +# 0x00B: CALL 0x058 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B3B058" + +# 0x00C: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C03800" + +# 0x00D: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D0308F" + +# 0x00E: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E07000" + +# 0x00F: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F11010" + +# 0x010: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0101501F" + +# 0x011: JNZ 0x00E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0113200E" + +# 0x012: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01228080" + +# 0x013: CMP R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0130F080" + +# 0x014: JEQ 0x01D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0143901D" + +# 0x015: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01528070" + +# 0x016: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01619020" + +# 0x017: JNZ 0x015 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01732015" + +# 0x018: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01803070" + +# 0x019: XOUT (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01925020" + +# 0x01A: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A03020" + +# 0x01B: CALL 0x05F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B3B05F" + +# 0x01C: JMP 0x012 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C30012" + +# 0x01D: CALL 0x058 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D3B058" + +# 0x01E: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E03000" + +# 0x01F: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F0D000" + +# 0x020: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02028080" + +# 0x021: CMP R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0210F080" + +# 0x022: JEQ 0x037 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02239037" + +# 0x023: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0230A001" + +# 0x024: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02403800" + +# 0x025: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0250308F" + +# 0x026: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02606001" + +# 0x027: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02711010" + +# 0x028: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02811011" + +# 0x029: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0291501F" + +# 0x02A: JNZ 0x026 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A32026" + +# 0x02B: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B28070" + +# 0x02C: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C19020" + +# 0x02D: JNZ 0x02B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D3202B" + +# 0x02E: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E00000" + +# 0x02F: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F03070" + +# 0x030: XOUT (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03025020" + +# 0x031: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03103020" + +# 0x032: CALL 0x05F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0323B05F" + +# 0x033: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0330A000" + +# 0x034: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03411010" + +# 0x035: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0350D000" + +# 0x036: JMP 0x020 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03630020" + +# 0x037: CALL 0x058 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0373B058" + +# 0x038: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03803000" + +# 0x039: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0390D000" + +# 0x03A: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A28080" + +# 0x03B: CMP R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B0F080" + +# 0x03C: JEQ 0x052 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C39052" + +# 0x03D: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D03070" + +# 0x03E: XOUT (R00), 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E25010" + +# 0x03F: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F28070" + +# 0x040: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04019010" + +# 0x041: JNZ 0x03F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0413203F" + +# 0x042: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0420A001" + +# 0x043: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04303800" + +# 0x044: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0440308F" + +# 0x045: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04504002" + +# 0x046: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0460E012" + +# 0x047: JNE 0x053 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0473A053" + +# 0x048: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04811010" + +# 0x049: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04911011" + +# 0x04A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A1501F" + +# 0x04B: JNZ 0x045 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B32045" + +# 0x04C: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C03020" + +# 0x04D: CALL 0x05F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D3B05F" + +# 0x04E: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E0A000" + +# 0x04F: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F11010" + +# 0x050: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0500D000" + +# 0x051: JMP 0x03A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0513003A" + +# 0x052: JMP 0x057 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05230057" + +# 0x053: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05328040" + +# 0x054: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0541B100" + +# 0x055: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05524040" + +# 0x056: JMP 0x057 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05630057" + +# 0x057: JMP 0x057 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05730057" + +# 0x058: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0583C000" + +# 0x059: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05903000" + +# 0x05A: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A24080" + +# 0x05B: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B24090" + +# 0x05C: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C240A0" + +# 0x05D: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D3D000" + +# 0x05E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E3E000" + +# 0x05F: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F3C001" + +# 0x060: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0603C002" + +# 0x061: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0613C003" + +# 0x062: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06228081" + +# 0x063: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06328092" + +# 0x064: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "064280A3" + +# 0x065: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06510001" + +# 0x066: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06613002" + +# 0x067: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06713003" + +# 0x068: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06824081" + +# 0x069: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06924092" + +# 0x06A: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A240A3" + +# 0x06B: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B3D003" + +# 0x06C: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C3D002" + +# 0x06D: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D3D001" + +# 0x06E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E3E000" + +# Assembled from sdr_test_short.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/sdr_tst.tcl b/projects/cpu/asm/sdr_tst.tcl new file mode 100644 index 0000000..6507e94 --- /dev/null +++ b/projects/cpu/asm/sdr_tst.tcl @@ -0,0 +1,62 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/sdram_test.jsm b/projects/cpu/asm/sdram_test.jsm new file mode 100644 index 0000000..8f05ae0 --- /dev/null +++ b/projects/cpu/asm/sdram_test.jsm @@ -0,0 +1,472 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +BURST_LEN: equ 8 +SD_CMD_WRITE: equ 0x06 +SD_CMD_READ: equ 0x05 +addr_msb_max: equ 0xFF + +; External RAM/ROM + xmem +crlf: dc 13, 10, 0 +greet_txt: dc "SDRAM Test", 0 +msg_txt0: dc "Clearing SDRAM", 0 +msg_txt1: dc "Writing SDRAM", 0 +msg_txt2: dc "Reading SDRAM", 0 +verify_ok: dc "Verify OK", 0 +verify_nok: dc "Failed at ", 0 +dot: dc ".", 0 + + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +round: db 1 +bmp_offset: db 4 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 + push R0 + xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + pop R0 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: + call LCD_init + mov R0, 0x00 + xout (led_port), R0 + + mov R0, CTRL_VGA_ENABLE + xout (ctrl_reg), R0 + + + cin R0, (cpu_int_ctrl) + or R0, 0x05 + cout (cpu_int_ctrl), R0 + + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + mov R0, 0 + mov R1, 0xC0 + xout (reg_color_red), R1 + xout (reg_color_grn), R1 + xout (reg_color_blu), R1 + + call cg_wait_rdy + call cg_clr_screen + + ; Print greeting message + mov R1, greet_txt + call LCD_putsx + + mov R1, greet_txt + call cg_puts + mov R1, crlf + call cg_puts_clr + + xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + call delay100ms + or R0, 0x20 + xout (ctrl_reg), R0 + call delay100ms + and R0, 0xEF + xout (ctrl_reg), R0 + call delay100ms + and R0, 0xCF + xout (ctrl_reg), R0 + +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- +do_clear: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt0 + call LCD_putsx + + mov R1, msg_txt0 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq clear_finished + + mov R2, BURST_LEN + +poll_clear_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_clear_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + sub R2, 2 + jnz poll_clear_full + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + + jmp sdr_clear + +clear_finished: + call AddrCnt_Disp + call delay1s + jmp do_write + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Write message + mov R1, msg_txt1 + call LCD_putsx + + mov R1, msg_txt1 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_write: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq write_finished + + mov R2, BURST_LEN + + ; Fill SDR Buffer +sdr_burst_wr: movc R1, (round) +; xin R0, (sdram_addr+2) +; cmp R0, 0x7F +; jne force_no_err +; inc R1 +force_no_err: mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + +poll_write_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_write_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + movc R0, (round) + inc R0 + movc (round), R0 + + sub R2, 2 + jnz sdr_burst_wr + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + + jmp sdr_write + +write_finished: call AddrCnt_Disp + call delay1s + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Read message + mov R1, msg_txt2 + call LCD_putsx + + mov R1, msg_txt2 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_read: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq read_finished + + ; Start SDR read + call wait_cmd_rdy + mov R0, SD_CMD_READ + xout (sdram_reg), R0 + +; mov R0, LCD_CMD_Z1 +; call LCD_writecmd +; call print_addr +; mov R0, LCD_CMD_Z2 +; call LCD_writecmd +; call print_data + + mov R3, BURST_LEN + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz poll_read_fin + + ; Verify SDR Buffer + movc R1, (round) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance Read-FIFO + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + + movc R0, (round) + inc R0 + movc (round), R0 + + sub R3, 2 + jnz poll_read_fin + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + jmp sdr_read + +; ---------------------------------------------------------- +sd_request: push R0 + mov R0, SDRAM_CTRL_REQUEST + xout (sdram_reg), R0 +wait4grant: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_ACCESS + jz wait4grant + pop R0 + ret + +; ---------------------------------------------------------- +wait_cmd_rdy: call sd_request + push R0 +wait4cmd: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_CMD_FULL + jnz wait4cmd + pop R0 + ret + +; ---------------------------------------------------------- +read_finished: +no_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_ok + call LCD_putsx + mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + + mov R1, verify_ok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + jmp ende + +verify_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_nok + call LCD_putsx + call print_addr + call print_data + mov R1, verify_nok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + jmp ende + +ende: call delay1s + jmp do_clear + +; ------------------------------------------------- +AddrCnt_Init: push R0 + mov R0, 0x00 + xout (sdram_addr+0), R0 + xout (sdram_addr+1), R0 + xout (sdram_addr+2), R0 + pop R0 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Adv: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Display Address counter +AddrCnt_Disp: mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + ret + +; ------------------------------------------------- +; PutHexByte +; R0 : Byte value +PutHexByte: push R1 + call bin2hex + call LCD_writechar + mov R0, R1 + call LCD_writechar + pop R1 + ret + +; ------------------------------------------------- +print_addr: push R0 + xin R0, (sdram_addr+2) + call PutHexByte + xin R0, (sdram_addr+1) + call PutHexByte + xin R0, (sdram_addr+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +; R1 : ptr to byte array +print_dword: push R0 + add R1, 3 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +print_data: push R0 + mov R0, LCD_CMD_Z2 + call LCD_writecmd + movx R0, (sdram_data+7) + call PutHexByte + movx R0, (sdram_data+6) + call PutHexByte + movx R0, (sdram_data+5) + call PutHexByte + movx R0, (sdram_data+4) + call PutHexByte + movx R0, (sdram_data+3) + call PutHexByte + movx R0, (sdram_data+2) + call PutHexByte + movx R0, (sdram_data+1) + call PutHexByte + movx R0, (sdram_data+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +include "../../../lib/jasm/utils.inc.jsm" +include "../../../lib/jasm/lcd.inc.jsm" +include "../../../lib/jasm/cg.inc.jsm" +include "../../../lib/jasm/delays.inc.jsm" +include "../../../lib/jasm/uart.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/sdram_test.tcl b/projects/cpu/asm/sdram_test.tcl new file mode 100644 index 0000000..c48bae3 --- /dev/null +++ b/projects/cpu/asm/sdram_test.tcl @@ -0,0 +1,1751 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from sdram_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x007 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030007" + +# 0x001: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013C000" + +# 0x002: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00228040" + +# 0x003: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0031B100" + +# 0x004: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00424040" + +# 0x005: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0053D000" + +# 0x006: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0063F000" + +# 0x007: CALL 0x128 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0073B128" + +# 0x008: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00803000" + +# 0x009: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00924010" + +# 0x00A: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A03040" + +# 0x00B: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B24040" + +# 0x00C: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C29030" + +# 0x00D: OR R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D1B050" + +# 0x00E: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E26030" + +# 0x00F: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F03010" + +# 0x010: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103B145" + +# 0x011: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01103000" + +# 0x012: MOV R01, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01203C01" + +# 0x013: XOUT (0x10), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01324101" + +# 0x014: XOUT (0x11), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01424111" + +# 0x015: XOUT (0x12), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01524121" + +# 0x016: CALL 0x1B9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163B1B9" + +# 0x017: CALL 0x19E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0173B19E" + +# 0x018: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01803031" + +# 0x019: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0193B14A" + +# 0x01A: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A03031" + +# 0x01B: CALL 0x1AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B3B1AA" + +# 0x01C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C03001" + +# 0x01D: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D3B1B6" + +# 0x01E: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E28040" + +# 0x01F: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F1B100" + +# 0x020: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02024040" + +# 0x021: CALL 0x1C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0213B1C6" + +# 0x022: OR R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0221B200" + +# 0x023: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02324040" + +# 0x024: CALL 0x1C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0243B1C6" + +# 0x025: AND R00, 0xEF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02519EF0" + +# 0x026: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02624040" + +# 0x027: CALL 0x1C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0273B1C6" + +# 0x028: AND R00, 0xCF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02819CF0" + +# 0x029: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02924040" + +# 0x02A: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A03010" + +# 0x02B: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B3B145" + +# 0x02C: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C030E1" + +# 0x02D: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D3B14A" + +# 0x02E: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E030E1" + +# 0x02F: CALL 0x1B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F3B1B3" + +# 0x030: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03003001" + +# 0x031: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0313B1B6" + +# 0x032: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0323B0CC" + +# 0x033: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03303800" + +# 0x034: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0340308F" + +# 0x035: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03507000" + +# 0x036: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03611010" + +# 0x037: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0371501F" + +# 0x038: JNZ 0x035 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03832035" + +# 0x039: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "039280A0" + +# 0x03A: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A0FFF0" + +# 0x03B: JEQ 0x04B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B3904B" + +# 0x03C: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C03082" + +# 0x03D: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D28070" + +# 0x03E: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E24010" + +# 0x03F: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F19040" + +# 0x040: JNZ 0x03D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0403203D" + +# 0x041: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04103100" + +# 0x042: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04224070" + +# 0x043: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04315022" + +# 0x044: JNZ 0x03D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0443203D" + +# 0x045: CALL 0x0AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0453B0AB" + +# 0x046: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04603060" + +# 0x047: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04724070" + +# 0x048: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04803080" + +# 0x049: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0493B0D3" + +# 0x04A: JMP 0x039 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A30039" + +# 0x04B: CALL 0x0E3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B3B0E3" + +# 0x04C: CALL 0x1BF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C3B1BF" + +# 0x04D: JMP 0x04E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D3004E" + +# 0x04E: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E03010" + +# 0x04F: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F3B145" + +# 0x050: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "050031D1" + +# 0x051: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0513B14A" + +# 0x052: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "052031D1" + +# 0x053: CALL 0x1B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0533B1B3" + +# 0x054: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05403001" + +# 0x055: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0553B1B6" + +# 0x056: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0563B0CC" + +# 0x057: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05703000" + +# 0x058: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0580D000" + +# 0x059: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "059280A0" + +# 0x05A: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A0FFF0" + +# 0x05B: JEQ 0x076 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B39076" + +# 0x05C: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C03082" + +# 0x05D: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D0A001" + +# 0x05E: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E03800" + +# 0x05F: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F0308F" + +# 0x060: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06006001" + +# 0x061: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06111010" + +# 0x062: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06211011" + +# 0x063: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0631501F" + +# 0x064: JNZ 0x060 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06432060" + +# 0x065: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06528070" + +# 0x066: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06624010" + +# 0x067: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06719040" + +# 0x068: JNZ 0x065 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06832065" + +# 0x069: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06903100" + +# 0x06A: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A24070" + +# 0x06B: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B0A000" + +# 0x06C: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C11010" + +# 0x06D: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D0D000" + +# 0x06E: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E15022" + +# 0x06F: JNZ 0x05D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F3205D" + +# 0x070: CALL 0x0AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0703B0AB" + +# 0x071: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07103060" + +# 0x072: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07224070" + +# 0x073: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07303080" + +# 0x074: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0743B0D3" + +# 0x075: JMP 0x059 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07530059" + +# 0x076: CALL 0x0E3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0763B0E3" + +# 0x077: CALL 0x1BF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0773B1BF" + +# 0x078: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07803010" + +# 0x079: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0793B145" + +# 0x07A: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A032B1" + +# 0x07B: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B3B14A" + +# 0x07C: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C032B1" + +# 0x07D: CALL 0x1B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D3B1B3" + +# 0x07E: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E03001" + +# 0x07F: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F3B1B6" + +# 0x080: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0803B0CC" + +# 0x081: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08103000" + +# 0x082: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0820D000" + +# 0x083: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "083280A0" + +# 0x084: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0840FFF0" + +# 0x085: JEQ 0x0B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "085390B3" + +# 0x086: CALL 0x0AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0863B0AB" + +# 0x087: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08703050" + +# 0x088: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08824070" + +# 0x089: MOV R03, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08903083" + +# 0x08A: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A28070" + +# 0x08B: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B24010" + +# 0x08C: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C19200" + +# 0x08D: JNZ 0x08A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D3208A" + +# 0x08E: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E0A001" + +# 0x08F: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F03800" + +# 0x090: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0900308F" + +# 0x091: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09104002" + +# 0x092: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0920E012" + +# 0x093: JNE 0x0BF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0933A0BF" + +# 0x094: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09411010" + +# 0x095: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09511011" + +# 0x096: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0961501F" + +# 0x097: JNZ 0x091 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09732091" + +# 0x098: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09803200" + +# 0x099: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09924070" + +# 0x09A: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A0A000" + +# 0x09B: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B11010" + +# 0x09C: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C0D000" + +# 0x09D: SUB R03, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D15023" + +# 0x09E: JNZ 0x08A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E3208A" + +# 0x09F: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F03080" + +# 0x0A0: CALL 0x0D3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A03B0D3" + +# 0x0A1: JMP 0x083 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A130083" + +# 0x0A2: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A23C000" + +# 0x0A3: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A303800" + +# 0x0A4: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A424070" + +# 0x0A5: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A528070" + +# 0x0A6: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A624010" + +# 0x0A7: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A719800" + +# 0x0A8: JZ 0x0A5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A8310A5" + +# 0x0A9: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A93D000" + +# 0x0AA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA3E000" + +# 0x0AB: CALL 0x0A2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB3B0A2" + +# 0x0AC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC3C000" + +# 0x0AD: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD28070" + +# 0x0AE: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE24010" + +# 0x0AF: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF19010" + +# 0x0B0: JNZ 0x0AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B0320AD" + +# 0x0B1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B13D000" + +# 0x0B2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B23E000" + +# 0x0B3: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B303010" + +# 0x0B4: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B43B145" + +# 0x0B5: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B503391" + +# 0x0B6: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B63B14A" + +# 0x0B7: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B703C00" + +# 0x0B8: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B83B145" + +# 0x0B9: CALL 0x0EE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B93B0EE" + +# 0x0BA: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA03391" + +# 0x0BB: CALL 0x1B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB3B1B3" + +# 0x0BC: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC03001" + +# 0x0BD: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD3B1B6" + +# 0x0BE: JMP 0x0CA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE300CA" + +# 0x0BF: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF03010" + +# 0x0C0: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C03B145" + +# 0x0C1: MOV R01, 0x43 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C103431" + +# 0x0C2: CALL 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C23B14A" + +# 0x0C3: CALL 0x0EE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C33B0EE" + +# 0x0C4: CALL 0x106 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C43B106" + +# 0x0C5: MOV R01, 0x43 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C503431" + +# 0x0C6: CALL 0x1B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C63B1B3" + +# 0x0C7: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C703001" + +# 0x0C8: CALL 0x1B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C83B1B6" + +# 0x0C9: JMP 0x0CA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C9300CA" + +# 0x0CA: CALL 0x1BF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA3B1BF" + +# 0x0CB: JMP 0x02A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB3002A" + +# 0x0CC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC3C000" + +# 0x0CD: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD03000" + +# 0x0CE: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE24080" + +# 0x0CF: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF24090" + +# 0x0D0: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D0240A0" + +# 0x0D1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D13D000" + +# 0x0D2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D23E000" + +# 0x0D3: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D33C001" + +# 0x0D4: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D43C002" + +# 0x0D5: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D53C003" + +# 0x0D6: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D628081" + +# 0x0D7: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D728092" + +# 0x0D8: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D8280A3" + +# 0x0D9: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D910001" + +# 0x0DA: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA13002" + +# 0x0DB: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB13003" + +# 0x0DC: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC24081" + +# 0x0DD: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD24092" + +# 0x0DE: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE240A3" + +# 0x0DF: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF3D003" + +# 0x0E0: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E03D002" + +# 0x0E1: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E13D001" + +# 0x0E2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E23E000" + +# 0x0E3: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E303C00" + +# 0x0E4: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E43B145" + +# 0x0E5: CALL 0x0EE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E53B0EE" + +# 0x0E6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E63E000" + +# 0x0E7: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E73C001" + +# 0x0E8: CALL 0x121 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E83B121" + +# 0x0E9: CALL 0x15C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E93B15C" + +# 0x0EA: MOV R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA02010" + +# 0x0EB: CALL 0x15C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB3B15C" + +# 0x0EC: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC3D001" + +# 0x0ED: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED3E000" + +# 0x0EE: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE3C000" + +# 0x0EF: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF280A0" + +# 0x0F0: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F03B0E7" + +# 0x0F1: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F128090" + +# 0x0F2: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F23B0E7" + +# 0x0F3: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F328080" + +# 0x0F4: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F43B0E7" + +# 0x0F5: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F53D000" + +# 0x0F6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F63E000" + +# 0x0F7: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F73C000" + +# 0x0F8: ADD R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F811031" + +# 0x0F9: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F909010" + +# 0x0FA: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA3B0E7" + +# 0x0FB: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB15011" + +# 0x0FC: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC09010" + +# 0x0FD: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD3B0E7" + +# 0x0FE: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE15011" + +# 0x0FF: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF09010" + +# 0x100: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1003B0E7" + +# 0x101: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10115011" + +# 0x102: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10209010" + +# 0x103: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1033B0E7" + +# 0x104: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1043D000" + +# 0x105: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1053E000" + +# 0x106: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1063C000" + +# 0x107: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10703C00" + +# 0x108: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1083B145" + +# 0x109: MOVX R00, (0x87) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10905870" + +# 0x10A: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A3B0E7" + +# 0x10B: MOVX R00, (0x86) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B05860" + +# 0x10C: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C3B0E7" + +# 0x10D: MOVX R00, (0x85) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D05850" + +# 0x10E: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E3B0E7" + +# 0x10F: MOVX R00, (0x84) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F05840" + +# 0x110: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1103B0E7" + +# 0x111: MOVX R00, (0x83) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11105830" + +# 0x112: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1123B0E7" + +# 0x113: MOVX R00, (0x82) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11305820" + +# 0x114: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1143B0E7" + +# 0x115: MOVX R00, (0x81) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11505810" + +# 0x116: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1163B0E7" + +# 0x117: MOVX R00, (0x80) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11705800" + +# 0x118: CALL 0x0E7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1183B0E7" + +# 0x119: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1193D000" + +# 0x11A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A3E000" + +# 0x11B: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B190F0" + +# 0x11C: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C0F0A0" + +# 0x11D: JLT 0x11F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D3511F" + +# 0x11E: ADD R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E11070" + +# 0x11F: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F11300" + +# 0x120: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1203E000" + +# 0x121: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1213C000" + +# 0x122: CALL 0x11B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1223B11B" + +# 0x123: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12302001" + +# 0x124: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1243D000" + +# 0x125: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1252A000" + +# 0x126: CALL 0x11B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1263B11B" + +# 0x127: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1273E000" + +# 0x128: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12803002" + +# 0x129: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12903030" + +# 0x12A: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A3B174" + +# 0x12B: CALL 0x1CD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B3B1CD" + +# 0x12C: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C03002" + +# 0x12D: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D03030" + +# 0x12E: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E3B174" + +# 0x12F: CALL 0x1CD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F3B1CD" + +# 0x130: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13003002" + +# 0x131: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13103020" + +# 0x132: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1323B174" + +# 0x133: CALL 0x1D4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1333B1D4" + +# 0x134: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13403280" + +# 0x135: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1353B145" + +# 0x136: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "136030C0" + +# 0x137: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1373B145" + +# 0x138: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13803060" + +# 0x139: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1393B145" + +# 0x13A: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A03010" + +# 0x13B: CALL 0x145 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B3B145" + +# 0x13C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C3E000" + +# 0x13D: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D3C000" + +# 0x13E: CALL 0x168 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E3B168" + +# 0x13F: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F19800" + +# 0x140: JZ 0x143 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14031143" + +# 0x141: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1413B1EB" + +# 0x142: JMP 0x13E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1423013E" + +# 0x143: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1433D000" + +# 0x144: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1443E000" + +# 0x145: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1453C002" + +# 0x146: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14603002" + +# 0x147: CALL 0x161 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1473B161" + +# 0x148: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1483D002" + +# 0x149: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1493E000" + +# 0x14A: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A3C000" + +# 0x14B: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B04010" + +# 0x14C: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C11011" + +# 0x14D: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D0F000" + +# 0x14E: JZ 0x151 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E31151" + +# 0x14F: CALL 0x15C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F3B15C" + +# 0x150: JMP 0x14B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1503014B" + +# 0x151: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1513D000" + +# 0x152: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1523E000" + +# 0x153: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1533C000" + +# 0x154: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15409010" + +# 0x155: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15511011" + +# 0x156: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1560F000" + +# 0x157: JZ 0x15A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1573115A" + +# 0x158: CALL 0x15C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1583B15C" + +# 0x159: JMP 0x154 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15930154" + +# 0x15A: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15A3D000" + +# 0x15B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15B3E000" + +# 0x15C: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15C3C002" + +# 0x15D: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15D03402" + +# 0x15E: CALL 0x161 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15E3B161" + +# 0x15F: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15F3D002" + +# 0x160: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1603E000" + +# 0x161: CALL 0x13D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1613B13D" + +# 0x162: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1623C000" + +# 0x163: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1632A000" + +# 0x164: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1643B174" + +# 0x165: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1653D000" + +# 0x166: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1663B174" + +# 0x167: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1673E000" + +# 0x168: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1683C002" + +# 0x169: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16903002" + +# 0x16A: CALL 0x16D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16A3B16D" + +# 0x16B: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16B3D002" + +# 0x16C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16C3E000" + +# 0x16D: CALL 0x187 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16D3B187" + +# 0x16E: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16E2A000" + +# 0x16F: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16F3C000" + +# 0x170: CALL 0x187 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1703B187" + +# 0x171: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1713D002" + +# 0x172: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1721A020" + +# 0x173: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1733E000" + +# 0x174: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1743C001" + +# 0x175: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "175190F0" + +# 0x176: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17602001" + +# 0x177: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1771A021" + +# 0x178: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17824031" + +# 0x179: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1793B1EB" + +# 0x17A: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17A02001" + +# 0x17B: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17B1A021" + +# 0x17C: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17C1B801" + +# 0x17D: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17D24031" + +# 0x17E: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17E3B1EB" + +# 0x17F: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17F02001" + +# 0x180: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1801A021" + +# 0x181: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18124031" + +# 0x182: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1823B1EB" + +# 0x183: OR R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1831B201" + +# 0x184: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18424031" + +# 0x185: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1853D001" + +# 0x186: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1863E000" + +# 0x187: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1873C001" + +# 0x188: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18803201" + +# 0x189: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1891A021" + +# 0x18A: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18A24031" + +# 0x18B: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18B3B1EB" + +# 0x18C: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18C03201" + +# 0x18D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18D1A021" + +# 0x18E: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18E1B801" + +# 0x18F: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18F24031" + +# 0x190: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1903B1EB" + +# 0x191: XIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19128030" + +# 0x192: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "192190F0" + +# 0x193: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19303201" + +# 0x194: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1941A021" + +# 0x195: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19524031" + +# 0x196: CALL 0x1EB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1963B1EB" + +# 0x197: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1973D001" + +# 0x198: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1983E000" + +# 0x199: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1993C000" + +# 0x19A: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19A03020" + +# 0x19B: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19B240E0" + +# 0x19C: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19C3D000" + +# 0x19D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19D3E000" + +# 0x19E: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19E3C000" + +# 0x19F: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19F03010" + +# 0x1A0: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A0240E0" + +# 0x1A1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A13D000" + +# 0x1A2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A23E000" + +# 0x1A3: CALL 0x1B9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A33B1B9" + +# 0x1A4: XOUT (0x0C), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A4240C1" + +# 0x1A5: XOUT (0x0B), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A5240B0" + +# 0x1A6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A63E000" + +# 0x1A7: CALL 0x1B9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A73B1B9" + +# 0x1A8: XOUT (0x0D), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A8240D0" + +# 0x1A9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A93E000" + +# 0x1AA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AA3C000" + +# 0x1AB: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AB04010" + +# 0x1AC: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AC11011" + +# 0x1AD: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AD0F000" + +# 0x1AE: JZ 0x1B1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AE311B1" + +# 0x1AF: CALL 0x1A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AF3B1A7" + +# 0x1B0: JMP 0x1AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B0301AB" + +# 0x1B1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B13D000" + +# 0x1B2: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B23E000" + +# 0x1B3: CALL 0x199 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B33B199" + +# 0x1B4: CALL 0x1AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B43B1AA" + +# 0x1B5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B53E000" + +# 0x1B6: CALL 0x1AA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B63B1AA" + +# 0x1B7: CALL 0x199 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B73B199" + +# 0x1B8: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B83E000" + +# 0x1B9: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B93C000" + +# 0x1BA: XIN R00, (0x0E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BA280E0" + +# 0x1BB: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BB19020" + +# 0x1BC: JZ 0x1BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BC311BA" + +# 0x1BD: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BD3D000" + +# 0x1BE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BE3E000" + +# 0x1BF: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BF3C00F" + +# 0x1C0: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C0030AF" + +# 0x1C1: CALL 0x1C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C13B1C6" + +# 0x1C2: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C21501F" + +# 0x1C3: JNZ 0x1C1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C3321C1" + +# 0x1C4: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C43D00F" + +# 0x1C5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C53E000" + +# 0x1C6: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C63C00F" + +# 0x1C7: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C7030AF" + +# 0x1C8: CALL 0x1CD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C83B1CD" + +# 0x1C9: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C91501F" + +# 0x1CA: JNZ 0x1C8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CA321C8" + +# 0x1CB: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CB3D00F" + +# 0x1CC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CC3E000" + +# 0x1CD: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CD3C00F" + +# 0x1CE: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CE030AF" + +# 0x1CF: CALL 0x1D4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CF3B1D4" + +# 0x1D0: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D01501F" + +# 0x1D1: JNZ 0x1CF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D1321CF" + +# 0x1D2: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D23D00F" + +# 0x1D3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D33E000" + +# 0x1D4: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D43C00F" + +# 0x1D5: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D5030AF" + +# 0x1D6: CALL 0x1DB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D63B1DB" + +# 0x1D7: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D71501F" + +# 0x1D8: JNZ 0x1D6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D8321D6" + +# 0x1D9: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D93D00F" + +# 0x1DA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DA3E000" + +# 0x1DB: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DB3C00F" + +# 0x1DC: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DC030AF" + +# 0x1DD: CALL 0x1E2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DD3B1E2" + +# 0x1DE: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DE1501F" + +# 0x1DF: JNZ 0x1DD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DF321DD" + +# 0x1E0: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E03D00F" + +# 0x1E1: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E13E000" + +# 0x1E2: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E23C00F" + +# 0x1E3: MOV R15, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E30363F" + +# 0x1E4: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E400000" + +# 0x1E5: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E500000" + +# 0x1E6: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E600000" + +# 0x1E7: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E71501F" + +# 0x1E8: JNZ 0x1E4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E8321E4" + +# 0x1E9: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E93D00F" + +# 0x1EA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EA3E000" + +# 0x1EB: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EB3C00F" + +# 0x1EC: MOV R15, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EC0309F" + +# 0x1ED: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1ED00000" + +# 0x1EE: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EE00000" + +# 0x1EF: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EF00000" + +# 0x1F0: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F01501F" + +# 0x1F1: JNZ 0x1ED +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F1321ED" + +# 0x1F2: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F23D00F" + +# 0x1F3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F33E000" + +# 0x1F4: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F43C001" + +# 0x1F5: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F528061" + +# 0x1F6: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F619021" + +# 0x1F7: JNZ 0x1F5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F7321F5" + +# 0x1F8: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F824020" + +# 0x1F9: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F93D001" + +# 0x1FA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FA3E000" + +# 0x1FB: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FB3C001" + +# 0x1FC: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FC28061" + +# 0x1FD: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FD19101" + +# 0x1FE: JZ 0x1FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FE311FC" + +# 0x1FF: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FF28020" + +# 0x200: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2003D001" + +# 0x201: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2013E000" + +# Assembled from sdram_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "000D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "010A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "074D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0954" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B73" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E43" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1065" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1161" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1272" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1369" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "146E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1567" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1620" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1753" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1844" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A41" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B4D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D57" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2074" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2169" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "226E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2367" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2420" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2553" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2644" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2752" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2841" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "294D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B52" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "306E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3167" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3220" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "374D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3956" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D66" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "404F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "414B" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4346" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4461" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4569" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "466C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4765" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4864" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4920" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E2E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/sdram_test_short.jsm b/projects/cpu/asm/sdram_test_short.jsm new file mode 100644 index 0000000..15618d9 --- /dev/null +++ b/projects/cpu/asm/sdram_test_short.jsm @@ -0,0 +1,308 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +BURST_LEN: equ 8 +SD_CMD_WRITE: equ 0x06 +SD_CMD_READ: equ 0x05 +addr_msb_max: equ 0x40 + +; External RAM/ROM + xmem +crlf: dc 13, 10, 0 +greet_txt: dc "SDRAM Test", 0 +msg_txt0: dc "Clearing SDRAM", 0 +msg_txt1: dc "Writing SDRAM", 0 +msg_txt2: dc "Reading SDRAM", 0 +verify_ok: dc "Verify OK", 0 +verify_nok: dc "Failed at ", 0 +dot: dc ".", 0 + + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +round: db 1 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: + mov R0, 0x00 + xout (led_port), R0 + +; xin R0, (btn_port) +; tst R0 +; jz no_vga + mov R0, CTRL_VGA_ENABLE + xout (ctrl_reg), R0 + + +no_vga: mov R0, 0 + mov R1, 0x80 + xout (reg_color_red), R0 + xout (reg_color_grn), R1 + xout (reg_color_blu), R0 + + jmp do_write + +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- + + ; Set SDRAM address register to 0 +do_clear: call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: xin R0, (sdram_addr+0) + cmp R0, addr_msb_max + jeq clear_finished + + mov R2, BURST_LEN + +poll_clear_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_clear_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + sub R2, 2 + jnz poll_clear_full + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + + jmp sdr_clear + +clear_finished: + call AddrCnt_Disp + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: ; Clear LCD + + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_write: xin R0, (sdram_addr+0) + cmp R0, addr_msb_max + jeq write_finished + + mov R2, BURST_LEN + + ; Fill SDR Buffer +sdr_burst_wr: movc R1, (round) +; xin R0, (sdram_addr+2) +; cmp R0, 0x7F +; jne force_no_err +; inc R1 +force_no_err: mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + +poll_write_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_write_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + movc R0, (round) + inc R0 + movc (round), R0 + + sub R2, 2 + jnz sdr_burst_wr + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + + jmp sdr_write + +write_finished: call AddrCnt_Disp + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: ; Clear LCD + + ; Set SDRAM address register to 0 + call AddrCnt_Init + mov R0, 0 + movc (round), R0 + +sdr_read: xin R0, (sdram_addr+2) + cmp R0, addr_msb_max + jeq read_finished + + ; Start SDR read + call wait_cmd_rdy + mov R0, SD_CMD_READ + xout (sdram_reg), R0 + + + mov R3, BURST_LEN + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz poll_read_fin + + ; Verify SDR Buffer + movc R1, (round) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance Read-FIFO + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + + movc R0, (round) + inc R0 + movc (round), R0 + + sub R3, 2 + jnz poll_read_fin + + ; Advance address counter + mov R0, BURST_LEN + call AddrCnt_Adv + jmp sdr_read + +; ---------------------------------------------------------- +sd_request: push R0 + mov R0, SDRAM_CTRL_REQUEST + xout (sdram_reg), R0 +wait4grant: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, SDRAM_STAT_ACCESS + jz wait4grant + pop R0 + ret + +; ---------------------------------------------------------- +wait_cmd_rdy: call sd_request + push R0 +wait4cmd: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_CMD_FULL + jnz wait4cmd + pop R0 + ret + +; ---------------------------------------------------------- +read_finished: +no_error: jmp ende + +verify_error: jmp ende + +ende: jmp do_clear + +; ------------------------------------------------- +AddrCnt_Init: push R0 + mov R0, 0x00 + xout (sdram_addr+0), R0 + xout (sdram_addr+1), R0 + xout (sdram_addr+2), R0 + pop R0 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Adv: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Display Address counter +AddrCnt_Disp: ret + +; ------------------------------------------------- +; PutHexByte +; R0 : Byte value +PutHexByte: ret + +; ------------------------------------------------- +print_addr: ret + +; ------------------------------------------------- +print_data: ret + +; ------------------------------------------------- +include "../../../lib/jasm/utils.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/sdram_test_short.tcl b/projects/cpu/asm/sdram_test_short.tcl new file mode 100644 index 0000000..1ec1369 --- /dev/null +++ b/projects/cpu/asm/sdram_test_short.tcl @@ -0,0 +1,704 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from sdram_test_short.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x002 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030002" + +# 0x001: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013F000" + +# 0x002: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00203000" + +# 0x003: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00324010" + +# 0x004: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00403040" + +# 0x005: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00524040" + +# 0x006: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00603000" + +# 0x007: MOV R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00703801" + +# 0x008: XOUT (0x10), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00824100" + +# 0x009: XOUT (0x11), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00924111" + +# 0x00A: XOUT (0x12), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A24120" + +# 0x00B: JMP 0x026 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B30026" + +# 0x00C: CALL 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C3B07D" + +# 0x00D: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D03800" + +# 0x00E: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E0308F" + +# 0x00F: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F07000" + +# 0x010: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01011010" + +# 0x011: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0111501F" + +# 0x012: JNZ 0x00F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0123200F" + +# 0x013: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01328080" + +# 0x014: CMP R00, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0140F400" + +# 0x015: JEQ 0x025 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01539025" + +# 0x016: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01603082" + +# 0x017: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01728070" + +# 0x018: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01824010" + +# 0x019: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01919040" + +# 0x01A: JNZ 0x017 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A32017" + +# 0x01B: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B03100" + +# 0x01C: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C24070" + +# 0x01D: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D15022" + +# 0x01E: JNZ 0x017 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E32017" + +# 0x01F: CALL 0x072 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F3B072" + +# 0x020: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02003060" + +# 0x021: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02124070" + +# 0x022: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02203080" + +# 0x023: CALL 0x084 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0233B084" + +# 0x024: JMP 0x013 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02430013" + +# 0x025: CALL 0x094 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0253B094" + +# 0x026: CALL 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0263B07D" + +# 0x027: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02703000" + +# 0x028: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0280D000" + +# 0x029: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02928080" + +# 0x02A: CMP R00, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A0F400" + +# 0x02B: JEQ 0x046 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B39046" + +# 0x02C: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C03082" + +# 0x02D: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D0A001" + +# 0x02E: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E03800" + +# 0x02F: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F0308F" + +# 0x030: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03006001" + +# 0x031: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03111010" + +# 0x032: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03211011" + +# 0x033: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0331501F" + +# 0x034: JNZ 0x030 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03432030" + +# 0x035: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03528070" + +# 0x036: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03624010" + +# 0x037: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03719040" + +# 0x038: JNZ 0x035 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03832035" + +# 0x039: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03903100" + +# 0x03A: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A24070" + +# 0x03B: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B0A000" + +# 0x03C: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C11010" + +# 0x03D: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D0D000" + +# 0x03E: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E15022" + +# 0x03F: JNZ 0x02D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F3202D" + +# 0x040: CALL 0x072 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0403B072" + +# 0x041: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04103060" + +# 0x042: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04224070" + +# 0x043: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04303080" + +# 0x044: CALL 0x084 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0443B084" + +# 0x045: JMP 0x029 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04530029" + +# 0x046: CALL 0x094 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0463B094" + +# 0x047: CALL 0x07D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0473B07D" + +# 0x048: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04803000" + +# 0x049: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0490D000" + +# 0x04A: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A280A0" + +# 0x04B: CMP R00, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B0F400" + +# 0x04C: JEQ 0x07A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C3907A" + +# 0x04D: CALL 0x072 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D3B072" + +# 0x04E: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E03050" + +# 0x04F: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F24070" + +# 0x050: MOV R03, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05003083" + +# 0x051: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05128070" + +# 0x052: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05224010" + +# 0x053: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05319200" + +# 0x054: JNZ 0x051 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05432051" + +# 0x055: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0550A001" + +# 0x056: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05603800" + +# 0x057: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0570308F" + +# 0x058: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05804002" + +# 0x059: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0590E012" + +# 0x05A: JNE 0x07B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A3A07B" + +# 0x05B: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B11010" + +# 0x05C: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C11011" + +# 0x05D: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D1501F" + +# 0x05E: JNZ 0x058 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E32058" + +# 0x05F: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F03200" + +# 0x060: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06024070" + +# 0x061: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0610A000" + +# 0x062: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06211010" + +# 0x063: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0630D000" + +# 0x064: SUB R03, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06415023" + +# 0x065: JNZ 0x051 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06532051" + +# 0x066: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06603080" + +# 0x067: CALL 0x084 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0673B084" + +# 0x068: JMP 0x04A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0683004A" + +# 0x069: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0693C000" + +# 0x06A: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A03800" + +# 0x06B: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B24070" + +# 0x06C: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C28070" + +# 0x06D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D24010" + +# 0x06E: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E19800" + +# 0x06F: JZ 0x06C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F3106C" + +# 0x070: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0703D000" + +# 0x071: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0713E000" + +# 0x072: CALL 0x069 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0723B069" + +# 0x073: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0733C000" + +# 0x074: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07428070" + +# 0x075: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07524010" + +# 0x076: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07619010" + +# 0x077: JNZ 0x074 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07732074" + +# 0x078: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0783D000" + +# 0x079: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0793E000" + +# 0x07A: JMP 0x07C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A3007C" + +# 0x07B: JMP 0x07C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B3007C" + +# 0x07C: JMP 0x00C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C3000C" + +# 0x07D: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D3C000" + +# 0x07E: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E03000" + +# 0x07F: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F24080" + +# 0x080: XOUT (0x09), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08024090" + +# 0x081: XOUT (0x0A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "081240A0" + +# 0x082: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0823D000" + +# 0x083: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0833E000" + +# 0x084: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0843C001" + +# 0x085: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0853C002" + +# 0x086: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0863C003" + +# 0x087: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08728081" + +# 0x088: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08828092" + +# 0x089: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "089280A3" + +# 0x08A: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A10001" + +# 0x08B: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B13002" + +# 0x08C: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C13003" + +# 0x08D: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D24081" + +# 0x08E: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E24092" + +# 0x08F: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F240A3" + +# 0x090: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0903D003" + +# 0x091: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0913D002" + +# 0x092: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0923D001" + +# 0x093: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0933E000" + +# 0x094: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0943E000" + +# 0x095: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0953E000" + +# 0x096: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0963E000" + +# 0x097: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0973E000" + +# 0x098: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "098190F0" + +# 0x099: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0990F0A0" + +# 0x09A: JLT 0x09C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A3509C" + +# 0x09B: ADD R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B11070" + +# 0x09C: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C11300" + +# 0x09D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D3E000" + +# 0x09E: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E3C000" + +# 0x09F: CALL 0x098 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F3B098" + +# 0x0A0: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A002001" + +# 0x0A1: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A13D000" + +# 0x0A2: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A22A000" + +# 0x0A3: CALL 0x098 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A33B098" + +# 0x0A4: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A43E000" + +# Assembled from sdram_test_short.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "000D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "010A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "074D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0954" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B73" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E43" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1065" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1161" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1272" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1369" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "146E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1567" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1620" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1753" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1844" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A41" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B4D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D57" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2074" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2169" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "226E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2367" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2420" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2553" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2644" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2752" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2841" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "294D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B52" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "306E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3167" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3220" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "374D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3956" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D66" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "404F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "414B" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4346" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4461" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4569" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "466C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4765" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4864" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4920" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E2E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/test.jsm b/projects/cpu/asm/test.jsm new file mode 100644 index 0000000..f92d833 --- /dev/null +++ b/projects/cpu/asm/test.jsm @@ -0,0 +1,188 @@ +; PROJECT "test" + + data 10 +constant: DROM 55, 33,3a,5b,01,4f +rxbuf: DRAM 16 +txbuf: DRAM 16 +message: DROM 12, 99, 45, 2a, 5c, 0, 0d, 0a + +reset: jmp start + inc R14 + mov R8, R15 + mov R15, #00 + add R15, R14 + mov R15, R8 + reti + nop + nop + nop + +const1: equ 01 +const2: equ 02 +const3: equ 03 +const4: equ EF +const5: equ BE + + org 10 + +f1: +f2: inc R13 + ret + +start: mov R11, message + nop +; This is a comment: + mov R0, #00 + mov R1, const1 + mov R2, const2 + mov R3, const3 + mov R4, const4 + mov R5, const5 + mov R6, #06 + mov R7, #07 + mov R8, #08 + mov R9, #09 + mov R10, #10 + mov R11, #65 + mov R12, #12 + mov R13, #40 + mov R14, #00 + mov R15, #15 + movx (#21), R5 + movx (R14), #65 + tst R0 + tst R5 + shr R13 + shr R13 + shl R13 + shl R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + ror R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + rol R13 + ror R15 + ror R15 + ror R15 + ror R15 + halt + nop + mov R8, #80 + mov R15, #00 + shl R8 + rolc R15 + rol R15 + rol R15 + rol R15 + rol R15 + rol R15 + rol R15 + rol R15 + + xor R9, #08 + or R6, #50 + and R15, #51 + + cmp R0, #00 + jne error + jlt error + jgt error + jne error + jeq ok10 + jmp error +ok10: + jle ok11 + jmp error +ok11: + jge ok12 + jmp error +ok12: + + cmp R1, #00 + jeq error + jlt error + jgt ok20 +ok20: + jne ok21 +ok21: + jge ok22 + jmp error +ok22: + + cmp R11 #64 + jeq error + cmp R11 #65 + jle ok30 + jmp error +ok30: + jge ok31 + jmp error +ok31: + jgt error + jlt error + + cmp R11 #66 + jle ok40 + jmp error +ok40: + jgt error + jge error + jlt label2 + jmp error + +label2: movx (const4), R10 +linit: mov R2, #10 + mov R1, #01 +loop: sub R2, R1 + jnz loop + jmp sub + +sub: mov R15, #20 + push R15 + mov R8, #01 + call f1 + call f2 + call stub + mov R7, const4 + pop R15 + mov R15, R7 + jmp linit + + nop + nop + nop + +stub: mov R0, #00 +L2: movx (R0), R7; + add R0, #02 + sub R15, #01; Subtract + jnz L2 ; exit, if zero + + movx R5, (#09) + movx R7, (R0) + ret + +error: + nop + jmp error + diff --git a/projects/cpu/asm/test.tcl b/projects/cpu/asm/test.tcl new file mode 100644 index 0000000..e69de29 diff --git a/projects/cpu/asm/uart_test.jsm b/projects/cpu/asm/uart_test.jsm new file mode 100644 index 0000000..ea01df2 --- /dev/null +++ b/projects/cpu/asm/uart_test.jsm @@ -0,0 +1,510 @@ +; ------------------------------------------------- +; Uart test +; ------------------------------------------------- +reset: jmp init + + org 0x001 + jmp isr + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +ram_start: equ 0x00 ; R/W +txt_start: equ 0x80 ; RO +txt_end: equ 0x8B ; RO +btn_port: equ 0xC0 ; RO +led_port: equ 0xC1 ; Write +uart_data: equ 0xC2 ; Write +lcd_port: equ 0xC3 ; R/W +ctrl_reg: equ 0xC4 ; R/W +dip_port: equ 0xC5 ; RO +uart_status: equ 0xC6 ; Read + +lcd_read: equ 0x20 +lcd_data: equ 0x40 +lcd_enable: equ 0x80 + +DIV10: equ 0x0A + +CR: equ 0x0D +LF: equ 0x0A + +count0: equ 0x00 +count1: equ 0x01 +count2: equ 0x02 +count3: equ 0x03 + +cntDigit0: equ 0x04 +cntDigit1: equ 0x05 +cntDigit2: equ 0x06 +cntDigit3: equ 0x07 +cntDigit4: equ 0x08 +cntDigit5: equ 0x09 +cntDigit6: equ 0x0A +cntDigit7: equ 0x0B + +LCD_CMD_Z1: equ 0x80 +LCD_CMD_Z2: equ 0xC0 + +count_stat: equ 0x0C + +; Chip register +cpu_revision: equ 0x00 ; RO +cpu_control: equ 0x01 ; R/W +cpu_status: equ 0x02 ; RO +cpu_int_ctrl: equ 0x03 ; R/W + +; ------------------------------------------------- +; Main +; ------------------------------------------------- + org 010 + +init: mov R1, 0x55 + movx (led_port), R1 +; jmp init + call CounterInit + call LCD_init + mov R0, 0x00 + movc (count_stat), R0 + mov R1, 0x04 + movx R0, (btn_port) + and R0, 0x01 + jz not_pressed + mov R1, 0x00 +not_pressed: movx (led_port), R1 + + mov R0, ctrl_reg + ; Enable timer + movx (R0), 0x02 + ; Enable interrupt + movx (R0), 0x03 + + ; Enable CPU interrupt + cin R0, (cpu_int_ctrl) + or R0, 0x01 + cout (cpu_int_ctrl), R0 + +start: halt + call Cnt32 + call UpdateDigits + mov R15, cntDigit7 + + movc R0, (count_stat) + tst R0 + jz start + mov R0, 0x00 + movc (count_stat), R0 + +loop: call subprog + movc R0, (R15) + call sout + cmp R15, cntDigit0 + jeq sendCRLF + dec R15 + jmp loop + +sendCRLF: mov R0, CR + call sout + mov R0, LF + call sout + + jmp start + +; ------------------------------------------------- +CounterInit: mov R0, 0x00 + movc (count0), R0 + movc (count1), R0 + movc (count2), R0 + movc (count3), R0 + ret + +Cnt32: mov R0, count0 +cloop: movc R1, (R0) + inc R1 + movc (R0), R1 + ; ---------------- + mov R7, R1 + mov R14, R7 + mov R7, 0x55 + mov R7, 0xAA + xor R7, R7 + xor R14, 0x99 + ; ---------------- + jnc CountRdy + cmp R0, count3 + jeq CountRdy + inc R0 + jmp cloop +CountRdy: ret + +UpdateDigits: mov R2, cntDigit0 + mov R0, count0 +dualLoop: movc R1, (R0) + and R1, 0x0F + cmp R1, 0x0A + jlt isNum1 + add R1, 0x07 +isNum1: add R1, 0x30 + movc (R2), R1 + inc R2 + movc R1, (R0) + shr R1 + shr R1 + shr R1 + shr R1 + and R1, 0x0F + cmp R1, 0x0A + jlt isNum2 + add R1, 0x07 +isNum2: add R1, 0x30 + movc (R2), R1 + cmp R0, count3 + jeq UpdRdy + inc R0 + inc R2 + jmp dualLoop +UpdRdy: ret + +; ------------------------------------------------- +; subprog +; ------------------------------------------------- +subprog: push R0 + push R1 + push R2 + push R3 + push R4 + push R5 + push R6 + push R7 + push R8 + push R9 + push R10 + push R11 + push R12 + push R13 + push R14 + push R15 + pop R15 + pop R14 + pop R13 + pop R12 + pop R11 + pop R10 + pop R9 + pop R8 + pop R7 + pop R6 + pop R5 + pop R4 + pop R3 + pop R2 + pop R1 + pop R0 + ret + +; ------------------------------------------------- +; sout +; ------------------------------------------------- +; R0 = input +sout: push R1 +sout1: movx R1, (uart_status) + and R1, 0x02 + jnz sout1 + movx (uart_data), R0 + pop R1 + ret + +; ------------------------------------------------- +; sin +; ------------------------------------------------- +; R0 = output +sin: push R1 +sin1: movx R1, (uart_status) + and R1, 0x10 + jnz sin1 + movx R0, (uart_data) + pop R1 + ret + +; ------------------------------------------------- +; Init LCD +; ------------------------------------------------- +LCD_init: mov R1, lcd_port + movx (R1), lcd_read + + call delay10ms + + ; 0. + mov R2, 0x00 + mov R0, 0x03 + call LCD_write_ + call delay10ms + mov R2, 0x00 + mov R0, 0x03 + call LCD_write_ + call delay10ms + + mov R2, 0x00 + mov R0, 0x02 + call LCD_write_ + call delay1ms + + ; 1. + mov R0, 0x28 + call LCD_writecmd + + ; 2. + mov R0, 0x0E + call LCD_writecmd + + ; 3. + mov R0, 0x06 + call LCD_writecmd + + ; 3. + mov R0, 0x01 + call LCD_writecmd + + ret + +; ------------------------------------------------- +; LCD_Clear +; ------------------------------------------------- +LCD_clear: push R0 + mov R0, 0x01 + call LCD_writecmd + pop R0 + ret + +; ------------------------------------------------- +; LCD_writecmd +; ------------------------------------------------- +; R0 = cmd +LCD_writecmd: call LCD_waitbsy + push R2 + push R0 + push R0 + mov R2, 0x00 + shr R0 + shr R0 + shr R0 + shr R0 + call LCD_write_ + pop R0 + and R0, 0x0F + call LCD_write_ + pop R0 + pop R2 + ret + +; ------------------------------------------------- +; LCD_writechar +; ------------------------------------------------- +; R0 = char +LCD_writechar: call LCD_waitbsy + push R2 + push R0 + push R0 + mov R2, lcd_data + shr R0 + shr R0 + shr R0 + shr R0 + call LCD_write_ + pop R0 + and R0, 0x0F + call LCD_write_ + pop R0 + pop R2 + ret + +; ------------------------------------------------- +; LCD_write_ +; ------------------------------------------------- +; R0 = input +LCD_write_: push R1 + + mov R1, R0 + or R1, R2 + movx (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + or R1, lcd_enable + movx (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + movx (lcd_port), R1 + call delay1us + + pop R1 + ret + +; ------------------------------------------------- +; LCD_read_ +; ------------------------------------------------- +; R0 = output +LCD_read_: push R1 + + mov R1, lcd_read + or R1, R2 + movx (lcd_port), R1 + call delay1us + + mov R1, lcd_read + or R1, R2 + or R1, lcd_enable + movx (lcd_port), R1 + call delay1us + movx R0, (lcd_port) + + mov R1, lcd_read + or R1, R2 + movx (lcd_port), R1 + call delay1us + + pop R1 + ret + +; ------------------------------------------------- +; LCD_readstat +; ------------------------------------------------- +; R0 = status +LCD_readstat: push R2 + mov R2, 0x00 + call LCD_read_ + shl R0 + shl R0 + shl R0 + shl R0 + push R0 + call LCD_read_ + and R0, 0x0F + pop R2 + or R0, R2 + pop R2 + ret + +; ------------------------------------------------- +; LCD_waitbsy +; ------------------------------------------------- +LCD_waitbsy: push R0 +bsy_loop: call LCD_readstat + and R0, 0x80 + jz ex_bsy + call delay1us + jmp bsy_loop +ex_bsy: pop R0 + ret + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- +isr: push R0 + push R1 + movx R0, (led_port) + xor R0, 0x02 + movx (led_port), R0 + + call LCD_clear + + mov R0, LCD_CMD_Z1 + call LCD_writecmd + + mov R1, txt_start +read_rom: movx R0, (R1) + call LCD_writechar + inc R1 + cmp R1, txt_end + jlt read_rom + + mov R0, LCD_CMD_Z2 + call LCD_writecmd + mov R1, cntDigit1 + movc R0, (R1) + mov R1, cntDigit7 + cmp R0, 0x30 + jne print_num + mov R0, 0x01 + movc (count_stat), R0 + +print_num: movc R0, (R1) + call LCD_writechar + cmp R1, cntDigit0 + jeq ex_isr + dec R1 + jmp print_num + +ex_isr: call delay1ms + pop R1 + pop R0 + + reti + +; ------------------------------------------------- +; Delays +; ------------------------------------------------- +delay1s: push R15 + mov R15, DIV10 +loop1s: call delay100ms + dec R15 + jnz loop1s + pop R15 + ret + +delay100ms: push R15 + mov R15, DIV10 +loop100ms: call delay10ms + dec R15 + jnz loop100ms + pop R15 + ret + +delay10ms: push R15 + mov R15, DIV10 +loop10ms: call delay1ms + dec R15 + jnz loop10ms + pop R15 + ret + +delay1ms: push R15 + mov R15, DIV10 +loop1ms: call delay100us + dec R15 + jnz loop1ms + pop R15 + ret + +delay100us: push R15 + mov R15, DIV10 +loop100us: call delay10us + dec R15 + jnz loop100us + pop R15 + ret + +delay10us: push R15 + mov R15, DIV10 +loop10us: call delay1us + dec R15 + jnz loop10us + pop R15 + ret + +delay1us: push R15 + mov R15, DIV10 +loop1us: call delay100ns + dec R15 + jnz loop1us + pop R15 + ret + +delay100ns: nop + nop + nop + nop + ret \ No newline at end of file diff --git a/projects/cpu/asm/uart_test.tcl b/projects/cpu/asm/uart_test.tcl new file mode 100644 index 0000000..48e2515 --- /dev/null +++ b/projects/cpu/asm/uart_test.tcl @@ -0,0 +1,1103 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG + +# 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 + +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" \ + "frequency=1500000"] + # frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +# --------------------------------------------------------------- +# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 $irlength "3C2"] + +# Write Program +# JASM_ROM_INSERT_HERE +# 0x000: JMP 0x008 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00030008" + +# 0x001: JMP 0x103 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00070103" + +# 0x002: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00080000" + +# 0x003: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "000C0000" + +# 0x004: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00100000" + +# 0x005: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00140000" + +# 0x006: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00180000" + +# 0x007: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "001C0000" + +# 0x008: MOV R01, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00203551" + +# 0x009: MOVX (0xC1), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00248C11" + +# 0x00A: CALL 0x02F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "002BB02F" + +# 0x00B: CALL 0x08F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "002FB08F" + +# 0x00C: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00303000" + +# 0x00D: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0034D0C0" + +# 0x00E: MOV R01, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00383041" + +# 0x00F: MOVX R00, (0xC0) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "003C5C00" + +# 0x010: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00419010" + +# 0x011: JZ 0x013 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00471013" + +# 0x012: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00483001" + +# 0x013: MOVX (0xC1), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "004C8C11" + +# 0x014: MOV R00, 0xC4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00503C40" + +# 0x015: MOVX (R00), 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00547020" + +# 0x016: MOVX (R00), 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00587030" + +# 0x017: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "005E9030" + +# 0x018: OR R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0061B010" + +# 0x019: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00666030" + +# 0x01A: HALT +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00681000" + +# 0x01B: CALL 0x035 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "006FB035" + +# 0x01C: CALL 0x045 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0073B045" + +# 0x01D: MOV R15, 0x0B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "007430BF" + +# 0x01E: MOVC R00, (0x0C) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0078A0C0" + +# 0x01F: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "007CF000" + +# 0x020: JZ 0x01A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0083101A" + +# 0x021: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00843000" + +# 0x022: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0088D0C0" + +# 0x023: CALL 0x060 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "008FB060" + +# 0x024: MOVC R00, (R15) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "009090F0" + +# 0x025: CALL 0x081 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0097B081" + +# 0x026: CMP R15, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0098F04F" + +# 0x027: JEQ 0x02A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "009F902A" + +# 0x028: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00A1501F" + +# 0x029: JMP 0x023 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00A70023" + +# 0x02A: MOV R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00A830D0" + +# 0x02B: CALL 0x081 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00AFB081" + +# 0x02C: MOV R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00B030A0" + +# 0x02D: CALL 0x081 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00B7B081" + +# 0x02E: JMP 0x01A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00BB001A" + +# 0x02F: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00BC3000" + +# 0x030: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00C0D000" + +# 0x031: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00C4D010" + +# 0x032: MOVC (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00C8D020" + +# 0x033: MOVC (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00CCD030" + +# 0x034: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00D3E000" + +# 0x035: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00D43000" + +# 0x036: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00D89001" + +# 0x037: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00DD1011" + +# 0x038: MOVC (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00E0B001" + +# 0x039: MOV R07, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00E42017" + +# 0x03A: MOV R14, R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00E8207E" + +# 0x03B: MOV R07, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00EC3557" + +# 0x03C: MOV R07, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F03AA7" + +# 0x03D: XOR R07, R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F5C077" + +# 0x03E: XOR R14, 0x99 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00F9D99E" + +# 0x03F: JNC 0x044 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "00FF4044" + +# 0x040: CMP R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0100F030" + +# 0x041: JEQ 0x044 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01079044" + +# 0x042: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01091010" + +# 0x043: JMP 0x036 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "010F0036" + +# 0x044: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0113E000" + +# 0x045: MOV R02, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01143042" + +# 0x046: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01183000" + +# 0x047: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "011C9001" + +# 0x048: AND R01, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "012190F1" + +# 0x049: CMP R01, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0124F0A1" + +# 0x04A: JLT 0x04C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "012B504C" + +# 0x04B: ADD R01, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "012D1071" + +# 0x04C: ADD R01, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01311301" + +# 0x04D: MOVC (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0134B021" + +# 0x04E: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01391012" + +# 0x04F: MOVC R01, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "013C9001" + +# 0x050: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0141F001" + +# 0x051: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0145F001" + +# 0x052: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0149F001" + +# 0x053: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "014DF001" + +# 0x054: AND R01, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "015190F1" + +# 0x055: CMP R01, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0154F0A1" + +# 0x056: JLT 0x058 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "015B5058" + +# 0x057: ADD R01, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "015D1071" + +# 0x058: ADD R01, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01611301" + +# 0x059: MOVC (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0164B021" + +# 0x05A: CMP R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0168F030" + +# 0x05B: JEQ 0x05F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "016F905F" + +# 0x05C: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01711010" + +# 0x05D: INC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01751012" + +# 0x05E: JMP 0x047 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "017B0047" + +# 0x05F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "017FE000" + +# 0x060: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0183C000" + +# 0x061: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0187C001" + +# 0x062: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "018BC002" + +# 0x063: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "018FC003" + +# 0x064: PUSH R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0193C004" + +# 0x065: PUSH R05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0197C005" + +# 0x066: PUSH R06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "019BC006" + +# 0x067: PUSH R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "019FC007" + +# 0x068: PUSH R08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01A3C008" + +# 0x069: PUSH R09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01A7C009" + +# 0x06A: PUSH R10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01ABC00A" + +# 0x06B: PUSH R11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01AFC00B" + +# 0x06C: PUSH R12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01B3C00C" + +# 0x06D: PUSH R13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01B7C00D" + +# 0x06E: PUSH R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01BBC00E" + +# 0x06F: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01BFC00F" + +# 0x070: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01C3D00F" + +# 0x071: POP R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01C7D00E" + +# 0x072: POP R13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01CBD00D" + +# 0x073: POP R12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01CFD00C" + +# 0x074: POP R11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01D3D00B" + +# 0x075: POP R10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01D7D00A" + +# 0x076: POP R09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01DBD009" + +# 0x077: POP R08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01DFD008" + +# 0x078: POP R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01E3D007" + +# 0x079: POP R06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01E7D006" + +# 0x07A: POP R05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01EBD005" + +# 0x07B: POP R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01EFD004" + +# 0x07C: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01F3D003" + +# 0x07D: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01F7D002" + +# 0x07E: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01FBD001" + +# 0x07F: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "01FFD000" + +# 0x080: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0203E000" + +# 0x081: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0207C001" + +# 0x082: MOVX R01, (0xC6) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02085C61" + +# 0x083: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "020D9021" + +# 0x084: JNZ 0x082 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02132082" + +# 0x085: MOVX (0xC2), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02148C20" + +# 0x086: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "021BD001" + +# 0x087: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "021FE000" + +# 0x088: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0223C001" + +# 0x089: MOVX R01, (0xC6) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02245C61" + +# 0x08A: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02299101" + +# 0x08B: JNZ 0x089 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "022F2089" + +# 0x08C: MOVX R00, (0xC2) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02305C20" + +# 0x08D: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0237D001" + +# 0x08E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "023BE000" + +# 0x08F: MOV R01, 0xC3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "023C3C31" + +# 0x090: MOVX (R01), 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02407201" + +# 0x091: CALL 0x132 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0247B132" + +# 0x092: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02483002" + +# 0x093: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "024C3030" + +# 0x094: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0253B0CC" + +# 0x095: CALL 0x132 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0257B132" + +# 0x096: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02583002" + +# 0x097: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "025C3030" + +# 0x098: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0263B0CC" + +# 0x099: CALL 0x132 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0267B132" + +# 0x09A: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02683002" + +# 0x09B: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "026C3020" + +# 0x09C: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0273B0CC" + +# 0x09D: CALL 0x139 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0277B139" + +# 0x09E: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02783280" + +# 0x09F: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "027FB0AC" + +# 0x0A0: MOV R00, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "028030E0" + +# 0x0A1: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0287B0AC" + +# 0x0A2: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02883060" + +# 0x0A3: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "028FB0AC" + +# 0x0A4: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02903010" + +# 0x0A5: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0297B0AC" + +# 0x0A6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "029BE000" + +# 0x0A7: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "029FC000" + +# 0x0A8: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02A03010" + +# 0x0A9: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02A7B0AC" + +# 0x0AA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02ABD000" + +# 0x0AB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02AFE000" + +# 0x0AC: CALL 0x0FB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02B3B0FB" + +# 0x0AD: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02B7C002" + +# 0x0AE: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02BBC000" + +# 0x0AF: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02BFC000" + +# 0x0B0: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02C03002" + +# 0x0B1: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02C5F000" + +# 0x0B2: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02C9F000" + +# 0x0B3: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02CDF000" + +# 0x0B4: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02D1F000" + +# 0x0B5: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02D7B0CC" + +# 0x0B6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02DBD000" + +# 0x0B7: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02DD90F0" + +# 0x0B8: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02E3B0CC" + +# 0x0B9: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02E7D000" + +# 0x0BA: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02EBD002" + +# 0x0BB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02EFE000" + +# 0x0BC: CALL 0x0FB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02F3B0FB" + +# 0x0BD: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02F7C002" + +# 0x0BE: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02FBC000" + +# 0x0BF: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "02FFC000" + +# 0x0C0: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03003402" + +# 0x0C1: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0305F000" + +# 0x0C2: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0309F000" + +# 0x0C3: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "030DF000" + +# 0x0C4: SHR R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0311F000" + +# 0x0C5: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0317B0CC" + +# 0x0C6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "031BD000" + +# 0x0C7: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "031D90F0" + +# 0x0C8: CALL 0x0CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0323B0CC" + +# 0x0C9: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0327D000" + +# 0x0CA: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "032BD002" + +# 0x0CB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "032FE000" + +# 0x0CC: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0333C001" + +# 0x0CD: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03342001" + +# 0x0CE: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0339A021" + +# 0x0CF: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "033C8C31" + +# 0x0D0: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0343B14E" + +# 0x0D1: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03442001" + +# 0x0D2: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0349A021" + +# 0x0D3: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "034DB801" + +# 0x0D4: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03508C31" + +# 0x0D5: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0357B14E" + +# 0x0D6: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03582001" + +# 0x0D7: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "035DA021" + +# 0x0D8: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03608C31" + +# 0x0D9: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0367B14E" + +# 0x0DA: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "036BD001" + +# 0x0DB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "036FE000" + +# 0x0DC: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0373C001" + +# 0x0DD: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03743201" + +# 0x0DE: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0379A021" + +# 0x0DF: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "037C8C31" + +# 0x0E0: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0383B14E" + +# 0x0E1: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03843201" + +# 0x0E2: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0389A021" + +# 0x0E3: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "038DB801" + +# 0x0E4: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03908C31" + +# 0x0E5: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0397B14E" + +# 0x0E6: MOVX R00, (0xC3) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03985C30" + +# 0x0E7: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "039C3201" + +# 0x0E8: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03A1A021" + +# 0x0E9: MOVX (0xC3), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03A48C31" + +# 0x0EA: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03ABB14E" + +# 0x0EB: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03AFD001" + +# 0x0EC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03B3E000" + +# 0x0ED: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03B7C002" + +# 0x0EE: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03B83002" + +# 0x0EF: CALL 0x0DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03BFB0DC" + +# 0x0F0: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C1E000" + +# 0x0F1: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C5E000" + +# 0x0F2: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03C9E000" + +# 0x0F3: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03CDE000" + +# 0x0F4: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03D3C000" + +# 0x0F5: CALL 0x0DC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03D7B0DC" + +# 0x0F6: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03D990F0" + +# 0x0F7: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03DFD002" + +# 0x0F8: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03E1A020" + +# 0x0F9: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03E7D002" + +# 0x0FA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03EBE000" + +# 0x0FB: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03EFC000" + +# 0x0FC: CALL 0x0ED +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03F3B0ED" + +# 0x0FD: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03F59800" + +# 0x0FE: JZ 0x101 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03FB1101" + +# 0x0FF: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "03FFB14E" + +# 0x100: JMP 0x0FC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "040300FC" + +# 0x101: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0407D000" + +# 0x102: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "040BE000" + +# 0x103: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "040FC000" + +# 0x104: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0413C001" + +# 0x105: MOVX R00, (0xC1) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04145C10" + +# 0x106: XOR R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0419D020" + +# 0x107: MOVX (0xC1), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "041C8C10" + +# 0x108: CALL 0x0A7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0423B0A7" + +# 0x109: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04243800" + +# 0x10A: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "042BB0AC" + +# 0x10B: MOV R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "042C3801" + +# 0x10C: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04304010" + +# 0x10D: CALL 0x0BC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0437B0BC" + +# 0x10E: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04391011" + +# 0x10F: CMP R01, 0x8B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "043CF8B1" + +# 0x110: JLT 0x10C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0443510C" + +# 0x111: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04443C00" + +# 0x112: CALL 0x0AC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "044BB0AC" + +# 0x113: MOV R01, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "044C3051" + +# 0x114: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04509010" + +# 0x115: MOV R01, 0x0B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "045430B1" + +# 0x116: CMP R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0458F300" + +# 0x117: JNE 0x11A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "045FA11A" + +# 0x118: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04603010" + +# 0x119: MOVC (0x0C), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0464D0C0" + +# 0x11A: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04689010" + +# 0x11B: CALL 0x0BC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "046FB0BC" + +# 0x11C: CMP R01, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0470F041" + +# 0x11D: JEQ 0x120 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04779120" + +# 0x11E: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04795011" + +# 0x11F: JMP 0x11A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "047F011A" + +# 0x120: CALL 0x139 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0483B139" + +# 0x121: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0487D001" + +# 0x122: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "048BD000" + +# 0x123: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "048FF000" + +# 0x124: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0493C00F" + +# 0x125: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "049430AF" + +# 0x126: CALL 0x12B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "049BB12B" + +# 0x127: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "049D501F" + +# 0x128: JNZ 0x126 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04A32126" + +# 0x129: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04A7D00F" + +# 0x12A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04ABE000" + +# 0x12B: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04AFC00F" + +# 0x12C: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04B030AF" + +# 0x12D: CALL 0x132 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04B7B132" + +# 0x12E: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04B9501F" + +# 0x12F: JNZ 0x12D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04BF212D" + +# 0x130: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04C3D00F" + +# 0x131: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04C7E000" + +# 0x132: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04CBC00F" + +# 0x133: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04CC30AF" + +# 0x134: CALL 0x139 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04D3B139" + +# 0x135: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04D5501F" + +# 0x136: JNZ 0x134 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04DB2134" + +# 0x137: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04DFD00F" + +# 0x138: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04E3E000" + +# 0x139: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04E7C00F" + +# 0x13A: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04E830AF" + +# 0x13B: CALL 0x140 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04EFB140" + +# 0x13C: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04F1501F" + +# 0x13D: JNZ 0x13B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04F7213B" + +# 0x13E: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04FBD00F" + +# 0x13F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "04FFE000" + +# 0x140: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0503C00F" + +# 0x141: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "050430AF" + +# 0x142: CALL 0x147 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "050BB147" + +# 0x143: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "050D501F" + +# 0x144: JNZ 0x142 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "05132142" + +# 0x145: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0517D00F" + +# 0x146: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "051BE000" + +# 0x147: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "051FC00F" + +# 0x148: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "052030AF" + +# 0x149: CALL 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0527B14E" + +# 0x14A: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0529501F" + +# 0x14B: JNZ 0x149 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "052F2149" + +# 0x14C: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0533D00F" + +# 0x14D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0537E000" + +# 0x14E: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "053BC00F" + +# 0x14F: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "053C30AF" + +# 0x150: CALL 0x155 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0543B155" + +# 0x151: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0545501F" + +# 0x152: JNZ 0x150 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "054B2150" + +# 0x153: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "054FD00F" + +# 0x154: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0553E000" + +# 0x155: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "05540000" + +# 0x156: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "05580000" + +# 0x157: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "055C0000" + +# 0x158: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "05600000" + +# 0x159: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 28 "0567E000" + + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/vga_test.jsm b/projects/cpu/asm/vga_test.jsm new file mode 100644 index 0000000..cdc8ae6 --- /dev/null +++ b/projects/cpu/asm/vga_test.jsm @@ -0,0 +1,736 @@ +; ------------------------------------------------- +; Register definitions +; ------------------------------------------------- +include "../../../lib/jasm/cregs.inc.jsm" +include "xregs.inc.jsm" + +; ------------------------------------------------- +; Constants +; ------------------------------------------------- +BURST_LEN: equ 8 +SD_CMD_WRITE: equ 0x06 +SD_CMD_READ: equ 0x05 +START_ADDR0: equ 0x00 +START_ADDR1: equ 0x00 +START_ADDR2: equ 0x20 +END_ADDR0: equ 0xF8 +END_ADDR1: equ 0xFF +END_ADDR2: equ 0xFF +SIO_TIMEOUT0: equ 0xE8 +SIO_TIMEOUT1: equ 0x03 +SIO_BUFSIZE: equ 64 + +; External RAM/ROM + xmem +crlf: dc 13, 10, 0 +greet_txt: dc "SDRAM Test", 0 +msg_txt0: dc "Clearing SDRAM", 0 +msg_txt1: dc "Writing SDRAM", 0 +msg_txt2: dc "Reading SDRAM", 0 +msg_txt3: dc "Reading Bitmap", 0 +verify_ok: dc "Verify OK", 0 +verify_nok: dc "Failed at ", 0 +dot: dc ".", 0 + + org 0x80 +sdram_data: db 8 ; SDRAM data window at X:0x80 + +; Internal RAM + cmem 0 +block_cnt: db 1 +round_cnt: db 1 +bmp_offset: db 4 +pixel_buf: db 24 + +sio_rx_buf: db 64 +sio_rx_ptr_r: db 1 +sio_rx_ptr_w: db 1 +sio_timeout: db 2 + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: org 0x000 + jmp main + +; ------------------------------------------------- +; ISR +; ------------------------------------------------- + org 0x001 +sio_isr: push R0 + push R1 +u_get_nxt: xin R1, (uart_status) + and R1, 0x10 + jz ex_uart_isr + xin R0, (uart_data) + movc R1, (sio_rx_ptr_w) + movc (R1), R0 + inc R1 + cmp R1, sio_rx_buf+64 + jne u_upd_nxt + mov R1, sio_rx_buf +u_upd_nxt: movc (sio_rx_ptr_w), R1 + movc R0, (sio_rx_ptr_r) + cmp R0, R1 + jne u_get_nxt + xin R0, (ctrl_reg) + or R0, 0x20 + xout (ctrl_reg), R0 + jmp u_get_nxt +ex_uart_isr: call Timer_isr + pop R1 + pop R0 + reti + +Timer_isr: xin R0, (btn_port) + and R0, 0x01 + jz btn_chk2 + mov R0, vga_read_addr + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + jmp ex_t_isr +btn_chk2: xin R0, (btn_port) + and R0, 0x02 + jz ex_t_isr + mov R0, vga_read_addr + xout (R0), 0x00 + inc R0 + xout (R0), 0x00 + inc R0 + xout (R0), 0x20 +ex_t_isr: ret + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +main: call sio_init + call LCD_init + mov R0, 0x00 + xout (led_port), R0 + + mov R0, CTRL_VGA_ENABLE + xout (ctrl_reg), R0 + + xin R0, (ctrl_reg) + or R0, CTRL_TIMER_ENABLE + xout (ctrl_reg), R0 + + mov R0, 0x03 + cout (cpu_int_ctrl), R0 + + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + mov R0, 0 + mov R1, 0xC0 + xout (reg_color_red), R1 + xout (reg_color_grn), R1 + xout (reg_color_blu), R1 + + call cg_wait_rdy + call cg_clr_screen + + ; Print greeting message + mov R1, greet_txt + call LCD_putsx + + mov R1, greet_txt + call cg_puts + mov R1, crlf + call cg_puts_clr + + xin R0, (ctrl_reg) + and R0, 0xCF + xout (ctrl_reg), R0 + + mov R0, 0 + movc (round_cnt), R0 + + +main_loop: call write_uart_data +; call do_clear +ML1: call do_write + call do_read + movc R0, (round_cnt) + inc R0 + movc (round_cnt), R0 + jmp ML1 + +; ---------------------------------------------------------- +; SDRAM clear +; ---------------------------------------------------------- +do_clear: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt0 + call LCD_putsx + + mov R1, msg_txt0 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, 0 + mov R1, 0 + mov R2, 0 + call AddrCnt_Init + + ; Fill SDR Buffer with zeros + mov R0, sdram_data + mov R15, 8 +buf_clr_loop: movx (R0), 0 + inc R0 + dec R15 + jnz buf_clr_loop + +sdr_clear: mov R2, BURST_LEN + +poll_clear_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_clear_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + sub R2, 2 + jnz poll_clear_full + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_c + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_c + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq clear_finished + + ; Advance address counter +next_addr_c: mov R0, BURST_LEN + call AddrCnt_Inc + + jmp sdr_clear + +clear_finished: + call AddrCnt_Disp + call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +write_uart_data: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Clear message + mov R1, msg_txt3 + call LCD_putsx + + mov R1, msg_txt3 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 +; mov R0, 0xF8 ; 800x600 +; mov R1, 0x52 ; 800x600 +; mov R2, 0x07 ; 800x600 + mov R0, 0xF8 ; 1280x1024 + mov R1, 0xFF ; 1280x1024 + mov R2, 0x13 ; 1280x1024 + call AddrCnt_Init + +read_bmp: mov R15, 0 +skip_hdr1: call sio_getchar + jc write_uart_data + inc R15 + cmp R15, 10 + jne skip_hdr1 + + call sio_getchar + jc write_uart_data + inc R15 + movc (bmp_offset+0), R0 + + call sio_getchar + jc write_uart_data + inc R15 + movc (bmp_offset+1), R0 + + call sio_getchar + jc write_uart_data + inc R15 + movc (bmp_offset+2), R0 + + call sio_getchar + jc write_uart_data + inc R15 + movc (bmp_offset+3), R0 + + movc R1, (bmp_offset+0) +skip_hdr2: call sio_getchar + jc write_uart_data + inc R15 + cmp R15, R1 + jne skip_hdr2 + +get_pixel: mov R15, 8 + mov R1, pixel_buf+23 +next_pixel: mov R2, 3 +next_color: dec R2 + mov R3, R1 + call sio_getchar + jc sdw_fin + sub R3, R2 + movc (R3), R0 + tst R2 + jnz next_color + sub R1, 3 + dec R15 + jnz next_pixel + + mov R2, BURST_LEN + + ; Fill SDR Buffer + mov R1, pixel_buf +wls: mov R3, sdram_data +wls0: movc R0, (R1) + movx (R3), R0 + inc R1 + inc R3 + cmp R3, sdram_data+6 + jne wls0 + +pwf: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz pwf + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + sub R2, 2 + jnz wls + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + call AddrCnt_Disp + xin R0, (sdram_addr+0) + tst R0 + jnz next_addr + xin R0, (sdram_addr+1) + tst R0 + jnz next_addr + xin R0, (sdram_addr+2) + tst R0 + jz sdw_fin + + ; Advance address counter +next_addr: mov R0, BURST_LEN + call AddrCnt_Dec + jmp get_pixel +sdw_fin: call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Write +; ---------------------------------------------------------- +do_write: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Write message + mov R1, msg_txt1 + call LCD_putsx + + mov R1, msg_txt1 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, START_ADDR0 + mov R1, START_ADDR1 + mov R2, START_ADDR2 + call AddrCnt_Init + movc R0, (round_cnt) + movc (block_cnt), R0 + +sdr_write: mov R2, BURST_LEN + + ; Fill SDR Buffer +sdr_burst_wr: movc R1, (block_cnt) + mov R0, sdram_data + mov R15, 8 +write_loop: movx (R0), R1 + inc R0 + inc R1 + dec R15 + jnz write_loop + +poll_write_full: + xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_WRITE_DATA_FULL + jnz poll_write_full + + ; Fill FIFO + mov R0, FIFO_CTRL_IS_WRITE + xout (sdram_reg), R0 + + movc R0, (block_cnt) + inc R0 + movc (block_cnt), R0 + + sub R2, 2 + jnz sdr_burst_wr + + ; Start SDR write + call wait_cmd_rdy + mov R0, SD_CMD_WRITE + xout (sdram_reg), R0 + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_w + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_w + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq write_finished + + ; Advance address counter +next_addr_w: mov R0, BURST_LEN + call AddrCnt_Inc + + jmp sdr_write + +write_finished: call AddrCnt_Disp + call delay1s + ret + +; ---------------------------------------------------------- +; SDRAM Verify +; ---------------------------------------------------------- +do_read: + ; Clear LCD + mov R0, LCD_CMD_CLEAR + call LCD_writecmd + + ; Print Read message + mov R1, msg_txt2 + call LCD_putsx + + mov R1, msg_txt2 + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + ; Set SDRAM address register to 0 + mov R0, START_ADDR0 + mov R1, START_ADDR1 + mov R2, START_ADDR2 + call AddrCnt_Init + movc R0, (round_cnt) + movc (block_cnt), R0 + + ; flush_data +flush_data: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz sdr_read + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + jmp flush_data + +sdr_read: ; Start SDR read + call wait_cmd_rdy + mov R0, SD_CMD_READ + xout (sdram_reg), R0 + + mov R3, BURST_LEN + + ; Wait last read +poll_read_fin: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_READ_DATA_EMPTY + jnz poll_read_fin + + ; Verify SDR Buffer + movc R1, (block_cnt) + mov R0, sdram_data + mov R15, 8 +read_loop: movx R2, (R0) + cmp R2, R1 + jne verify_error + inc R0 + inc R1 + dec R15 + jnz read_loop + + ; Advance Read-FIFO + mov R0, FIFO_CTRL_IS_READ + xout (sdram_reg), R0 + + movc R0, (block_cnt) + inc R0 + movc (block_cnt), R0 + + sub R3, 2 + jnz poll_read_fin + + xin R0, (sdram_addr+0) + cmp R0, END_ADDR0 + jne next_addr_r + xin R0, (sdram_addr+1) + cmp R0, END_ADDR1 + jne next_addr_r + xin R0, (sdram_addr+2) + cmp R0, END_ADDR2 + jeq read_finished + + ; Advance address counter +next_addr_r: mov R0, BURST_LEN + call AddrCnt_Inc + jmp sdr_read + +; ---------------------------------------------------------- +wait_cmd_rdy: push R0 +wait4cmd: xin R0, (sdram_reg) + xout (led_port), R0 + and R0, FIFO_STAT_CMD_FULL + jnz wait4cmd + pop R0 + ret + +; ---------------------------------------------------------- +read_finished: +no_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_ok + call LCD_putsx + mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + + mov R1, verify_ok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + + jmp ende + +verify_error: mov R0, LCD_CMD_CLEAR + call LCD_writecmd + mov R1, verify_nok + call LCD_putsx + call print_addr + call print_data + mov R1, verify_nok + call cg_clr_puts + mov R1, crlf + call cg_puts_clr + xin R0, (ctrl_reg) + or R0, 0x10 + xout (ctrl_reg), R0 + + jmp ende + +ende: call delay1s + ret + +; ------------------------------------------------- +AddrCnt_Init: xout (sdram_addr+0), R0 + xout (sdram_addr+1), R1 + xout (sdram_addr+2), R2 + ret + +; ------------------------------------------------- +; Parameter +; R0: increment value +AddrCnt_Inc: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + add R1, R0 + addc R2, 0 + addc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Parameter +; R0: decrement value +AddrCnt_Dec: push R1 + push R2 + push R3 + xin R1, (sdram_addr+0) + xin R2, (sdram_addr+1) + xin R3, (sdram_addr+2) + sub R1, R0 + subc R2, 0 + subc R3, 0 + xout (sdram_addr+0), R1 + xout (sdram_addr+1), R2 + xout (sdram_addr+2), R3 + pop R3 + pop R2 + pop R1 + ret + +; ------------------------------------------------- +; Display Address counter +AddrCnt_Disp: mov R0, LCD_CMD_Z2 + call LCD_writecmd + call print_addr + ret + +; ------------------------------------------------- +; PutHexByte +; R0 : Byte value +PutHexByte: push R1 + call bin2hex + call LCD_writechar + mov R0, R1 + call LCD_writechar + pop R1 + ret + +; ------------------------------------------------- +print_addr: push R0 + xin R0, (sdram_addr+2) + call PutHexByte + xin R0, (sdram_addr+1) + call PutHexByte + xin R0, (sdram_addr+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +; R1 : ptr to byte array +print_dword: push R0 + add R1, 3 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + dec R1 + movc R0, (R1) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +print_data: push R0 + mov R0, LCD_CMD_Z2 + call LCD_writecmd + movx R0, (sdram_data+7) + call PutHexByte + movx R0, (sdram_data+6) + call PutHexByte + movx R0, (sdram_data+5) + call PutHexByte + movx R0, (sdram_data+4) + call PutHexByte + movx R0, (sdram_data+3) + call PutHexByte + movx R0, (sdram_data+2) + call PutHexByte + movx R0, (sdram_data+1) + call PutHexByte + movx R0, (sdram_data+0) + call PutHexByte + pop R0 + ret + +; ------------------------------------------------- +sio_init: push R0 + mov R0, 13 + xout (uart_baudrate), R0 + mov R0, sio_rx_buf + movc (sio_rx_ptr_r), R0 + movc (sio_rx_ptr_w), R0 + mov R0, SIO_TIMEOUT0 + movc (sio_timeout+0), R0 + mov R0, SIO_TIMEOUT1 + movc (sio_timeout+1), R0 + pop R0 + ret + +; ------------------------------------------------- +; Params: none +; Return: +; R0 : received character +sio_getchar: push R1 + push R2 + push R3 + movc R2, (sio_timeout+0) + movc R3, (sio_timeout+1) + movc R1, (sio_rx_ptr_r) +sio_wait_rx: movc R0, (sio_rx_ptr_w) + cmp R0, R1 + jeq wait_rx_stub + movc R0, (R1) + inc R1 + cmp R1, sio_rx_buf+64 + jne u_upd_r_ptr + mov R1, sio_rx_buf +u_upd_r_ptr: movc (sio_rx_ptr_r), R1 + clrc +ex_sio_gc: pop R3 + pop R2 + pop R1 + ret +wait_rx_stub: call delay1ms + dec R2 + subc R3, 0 + jnz sio_wait_rx + tst R2 + jnz sio_wait_rx +sio_to: setc + jmp ex_sio_gc + +; ------------------------------------------------- +include "../../../lib/jasm/utils.inc.jsm" +include "../../../lib/jasm/lcd.inc.jsm" +include "../../../lib/jasm/cg.inc.jsm" +include "../../../lib/jasm/delays.inc.jsm" +include "../../../lib/jasm/uart.inc.jsm" + \ No newline at end of file diff --git a/projects/cpu/asm/vga_test.tcl b/projects/cpu/asm/vga_test.tcl new file mode 100644 index 0000000..cc0a78c --- /dev/null +++ b/projects/cpu/asm/vga_test.tcl @@ -0,0 +1,2402 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from vga_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x033 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030033" + +# 0x001: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013C000" + +# 0x002: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0023C001" + +# 0x003: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00328061" + +# 0x004: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00419101" + +# 0x005: JZ 0x015 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00531015" + +# 0x006: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00628020" + +# 0x007: MOVC R01, (0x5F) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0070A5F1" + +# 0x008: MOVC (R00), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0080B010" + +# 0x009: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00911011" + +# 0x00A: CMP R01, 0x5E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A0F5E1" + +# 0x00B: JNE 0x00D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B3A00D" + +# 0x00C: MOV R01, 0x1E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C031E1" + +# 0x00D: MOVC (0x5F), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D0D5F1" + +# 0x00E: MOVC R00, (0x5E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E0A5E0" + +# 0x00F: CMP R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F0E010" + +# 0x010: JNE 0x003 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103A003" + +# 0x011: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01128040" + +# 0x012: OR R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0121B200" + +# 0x013: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01324040" + +# 0x014: JMP 0x003 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01430003" + +# 0x015: CALL 0x019 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0153B019" + +# 0x016: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163D001" + +# 0x017: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0173D000" + +# 0x018: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0183F000" + +# 0x019: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01928000" + +# 0x01A: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A19200" + +# 0x01B: XIN R01, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B28041" + +# 0x01C: AND R01, 0xDF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C19DF1" + +# 0x01D: OR R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D1A010" + +# 0x01E: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E24040" + +# 0x01F: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F28000" + +# 0x020: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02019010" + +# 0x021: JZ 0x029 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02131029" + +# 0x022: MOV R00, 0x14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02203140" + +# 0x023: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02325000" + +# 0x024: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02411010" + +# 0x025: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02525000" + +# 0x026: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02611010" + +# 0x027: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02725000" + +# 0x028: JMP 0x032 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02830032" + +# 0x029: XIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02928000" + +# 0x02A: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A19020" + +# 0x02B: JZ 0x032 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B31032" + +# 0x02C: MOV R00, 0x14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C03140" + +# 0x02D: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D25000" + +# 0x02E: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E11010" + +# 0x02F: XOUT (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F25000" + +# 0x030: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03011010" + +# 0x031: XOUT (R00), 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03125200" + +# 0x032: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0323E000" + +# 0x033: CALL 0x1CC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0333B1CC" + +# 0x034: CALL 0x201 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0343B201" + +# 0x035: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03503000" + +# 0x036: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03624010" + +# 0x037: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03703040" + +# 0x038: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03824040" + +# 0x039: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03928040" + +# 0x03A: OR R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A1B020" + +# 0x03B: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B24040" + +# 0x03C: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C03030" + +# 0x03D: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D26030" + +# 0x03E: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E03010" + +# 0x03F: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F3B21E" + +# 0x040: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04003000" + +# 0x041: MOV R01, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04103C01" + +# 0x042: XOUT (0x10), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04224101" + +# 0x043: XOUT (0x11), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04324111" + +# 0x044: XOUT (0x12), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04424121" + +# 0x045: CALL 0x292 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0453B292" + +# 0x046: CALL 0x277 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0463B277" + +# 0x047: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04703031" + +# 0x048: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0483B223" + +# 0x049: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04903031" + +# 0x04A: CALL 0x283 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A3B283" + +# 0x04B: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B03001" + +# 0x04C: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C3B28F" + +# 0x04D: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D28040" + +# 0x04E: AND R00, 0xCF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E19CF0" + +# 0x04F: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F24040" + +# 0x050: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05003000" + +# 0x051: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0510D010" + +# 0x052: CALL 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0523B086" + +# 0x053: CALL 0x0DF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0533B0DF" + +# 0x054: CALL 0x113 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0543B113" + +# 0x055: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0550A010" + +# 0x056: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05611010" + +# 0x057: MOVC (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0570D010" + +# 0x058: JMP 0x053 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05830053" + +# 0x059: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05903010" + +# 0x05A: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A3B21E" + +# 0x05B: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B030E1" + +# 0x05C: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C3B223" + +# 0x05D: MOV R01, 0x0E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D030E1" + +# 0x05E: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E3B28C" + +# 0x05F: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F03001" + +# 0x060: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0603B28F" + +# 0x061: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06103000" + +# 0x062: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06203001" + +# 0x063: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06303002" + +# 0x064: CALL 0x170 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0643B170" + +# 0x065: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06503800" + +# 0x066: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0660308F" + +# 0x067: MOVX (R00), 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06707000" + +# 0x068: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06811010" + +# 0x069: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0691501F" + +# 0x06A: JNZ 0x067 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A32067" + +# 0x06B: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B03082" + +# 0x06C: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C28070" + +# 0x06D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D24010" + +# 0x06E: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E19040" + +# 0x06F: JNZ 0x06C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F3206C" + +# 0x070: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07003100" + +# 0x071: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07124070" + +# 0x072: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07215022" + +# 0x073: JNZ 0x06C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0733206C" + +# 0x074: CALL 0x14D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0743B14D" + +# 0x075: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07503060" + +# 0x076: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07624070" + +# 0x077: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07728080" + +# 0x078: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0780FF80" + +# 0x079: JNE 0x080 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0793A080" + +# 0x07A: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A28090" + +# 0x07B: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B0FFF0" + +# 0x07C: JNE 0x080 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C3A080" + +# 0x07D: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D280A0" + +# 0x07E: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E0FFF0" + +# 0x07F: JEQ 0x083 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F39083" + +# 0x080: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08003080" + +# 0x081: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0813B174" + +# 0x082: JMP 0x06B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0823006B" + +# 0x083: CALL 0x194 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0833B194" + +# 0x084: CALL 0x298 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0843B298" + +# 0x085: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0853E000" + +# 0x086: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08603010" + +# 0x087: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0873B21E" + +# 0x088: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08803391" + +# 0x089: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0893B223" + +# 0x08A: MOV R01, 0x39 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A03391" + +# 0x08B: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B3B28C" + +# 0x08C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C03001" + +# 0x08D: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D3B28F" + +# 0x08E: MOV R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E03F80" + +# 0x08F: MOV R01, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F03FF1" + +# 0x090: MOV R02, 0x13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09003132" + +# 0x091: CALL 0x170 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0913B170" + +# 0x092: MOV R15, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0920300F" + +# 0x093: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0933B1D8" + +# 0x094: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09433086" + +# 0x095: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0951101F" + +# 0x096: CMP R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0960F0AF" + +# 0x097: JNE 0x093 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0973A093" + +# 0x098: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0983B1D8" + +# 0x099: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09933086" + +# 0x09A: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A1101F" + +# 0x09B: MOVC (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B0D020" + +# 0x09C: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C3B1D8" + +# 0x09D: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D33086" + +# 0x09E: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E1101F" + +# 0x09F: MOVC (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F0D030" + +# 0x0A0: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A03B1D8" + +# 0x0A1: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A133086" + +# 0x0A2: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A21101F" + +# 0x0A3: MOVC (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A30D040" + +# 0x0A4: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A43B1D8" + +# 0x0A5: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A533086" + +# 0x0A6: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A61101F" + +# 0x0A7: MOVC (0x05), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A70D050" + +# 0x0A8: MOVC R01, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A80A021" + +# 0x0A9: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A93B1D8" + +# 0x0AA: JC 0x086 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA33086" + +# 0x0AB: INC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB1101F" + +# 0x0AC: CMP R15, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC0E01F" + +# 0x0AD: JNE 0x0A9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD3A0A9" + +# 0x0AE: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE0308F" + +# 0x0AF: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF031D1" + +# 0x0B0: MOV R02, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B003032" + +# 0x0B1: DEC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B115012" + +# 0x0B2: MOV R03, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B202013" + +# 0x0B3: CALL 0x1D8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B33B1D8" + +# 0x0B4: JC 0x0DD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B4330DD" + +# 0x0B5: SUB R03, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B514023" + +# 0x0B6: MOVC (R00), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B60B030" + +# 0x0B7: TST R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B70F002" + +# 0x0B8: JNZ 0x0B1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B8320B1" + +# 0x0B9: SUB R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B915031" + +# 0x0BA: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA1501F" + +# 0x0BB: JNZ 0x0B0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB320B0" + +# 0x0BC: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC03082" + +# 0x0BD: MOV R01, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD03061" + +# 0x0BE: MOV R03, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE03803" + +# 0x0BF: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF09010" + +# 0x0C0: MOVX (R00), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C006030" + +# 0x0C1: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C111011" + +# 0x0C2: INC R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C211013" + +# 0x0C3: CMP R03, 0x86 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C30F863" + +# 0x0C4: JNE 0x0BF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C43A0BF" + +# 0x0C5: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C528070" + +# 0x0C6: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C624010" + +# 0x0C7: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C719040" + +# 0x0C8: JNZ 0x0C5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C8320C5" + +# 0x0C9: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C903100" + +# 0x0CA: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA24070" + +# 0x0CB: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB15022" + +# 0x0CC: JNZ 0x0BE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC320BE" + +# 0x0CD: CALL 0x14D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD3B14D" + +# 0x0CE: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE03060" + +# 0x0CF: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF24070" + +# 0x0D0: CALL 0x194 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D03B194" + +# 0x0D1: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D128080" + +# 0x0D2: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D20F000" + +# 0x0D3: JNZ 0x0DA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D3320DA" + +# 0x0D4: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D428090" + +# 0x0D5: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D50F000" + +# 0x0D6: JNZ 0x0DA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D6320DA" + +# 0x0D7: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D7280A0" + +# 0x0D8: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D80F000" + +# 0x0D9: JZ 0x0DD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D9310DD" + +# 0x0DA: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA03080" + +# 0x0DB: CALL 0x184 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB3B184" + +# 0x0DC: JMP 0x0AE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC300AE" + +# 0x0DD: CALL 0x298 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD3B298" + +# 0x0DE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE3E000" + +# 0x0DF: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF03010" + +# 0x0E0: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E03B21E" + +# 0x0E1: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E1031D1" + +# 0x0E2: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E23B223" + +# 0x0E3: MOV R01, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E3031D1" + +# 0x0E4: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E43B28C" + +# 0x0E5: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E503001" + +# 0x0E6: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E63B28F" + +# 0x0E7: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E703000" + +# 0x0E8: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E803001" + +# 0x0E9: MOV R02, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E903202" + +# 0x0EA: CALL 0x170 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA3B170" + +# 0x0EB: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB0A010" + +# 0x0EC: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC0D000" + +# 0x0ED: MOV R02, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED03082" + +# 0x0EE: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE0A001" + +# 0x0EF: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF03800" + +# 0x0F0: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F00308F" + +# 0x0F1: MOVX (R01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F106001" + +# 0x0F2: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F211010" + +# 0x0F3: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F311011" + +# 0x0F4: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F41501F" + +# 0x0F5: JNZ 0x0F1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F5320F1" + +# 0x0F6: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F628070" + +# 0x0F7: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F724010" + +# 0x0F8: AND R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F819040" + +# 0x0F9: JNZ 0x0F6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F9320F6" + +# 0x0FA: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA03100" + +# 0x0FB: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB24070" + +# 0x0FC: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC0A000" + +# 0x0FD: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD11010" + +# 0x0FE: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE0D000" + +# 0x0FF: SUB R02, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF15022" + +# 0x100: JNZ 0x0EE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "100320EE" + +# 0x101: CALL 0x14D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1013B14D" + +# 0x102: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10203060" + +# 0x103: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10324070" + +# 0x104: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10428080" + +# 0x105: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1050FF80" + +# 0x106: JNE 0x10D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1063A10D" + +# 0x107: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10728090" + +# 0x108: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1080FFF0" + +# 0x109: JNE 0x10D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1093A10D" + +# 0x10A: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A280A0" + +# 0x10B: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B0FFF0" + +# 0x10C: JEQ 0x110 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C39110" + +# 0x10D: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D03080" + +# 0x10E: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E3B174" + +# 0x10F: JMP 0x0ED +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F300ED" + +# 0x110: CALL 0x194 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1103B194" + +# 0x111: CALL 0x298 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1113B298" + +# 0x112: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1123E000" + +# 0x113: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11303010" + +# 0x114: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1143B21E" + +# 0x115: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "115032B1" + +# 0x116: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1163B223" + +# 0x117: MOV R01, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "117032B1" + +# 0x118: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1183B28C" + +# 0x119: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11903001" + +# 0x11A: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A3B28F" + +# 0x11B: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B03000" + +# 0x11C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C03001" + +# 0x11D: MOV R02, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D03202" + +# 0x11E: CALL 0x170 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E3B170" + +# 0x11F: MOVC R00, (0x01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F0A010" + +# 0x120: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1200D000" + +# 0x121: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12128070" + +# 0x122: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12224010" + +# 0x123: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12319200" + +# 0x124: JNZ 0x128 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12432128" + +# 0x125: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12503200" + +# 0x126: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12624070" + +# 0x127: JMP 0x121 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12730121" + +# 0x128: CALL 0x14D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1283B14D" + +# 0x129: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12903050" + +# 0x12A: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A24070" + +# 0x12B: MOV R03, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B03083" + +# 0x12C: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C28070" + +# 0x12D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D24010" + +# 0x12E: AND R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E19200" + +# 0x12F: JNZ 0x12C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F3212C" + +# 0x130: MOVC R01, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1300A001" + +# 0x131: MOV R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13103800" + +# 0x132: MOV R15, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1320308F" + +# 0x133: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13304002" + +# 0x134: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1340E012" + +# 0x135: JNE 0x160 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1353A160" + +# 0x136: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13611010" + +# 0x137: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13711011" + +# 0x138: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1381501F" + +# 0x139: JNZ 0x133 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13932133" + +# 0x13A: MOV R00, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A03200" + +# 0x13B: XOUT (0x07), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B24070" + +# 0x13C: MOVC R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C0A000" + +# 0x13D: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D11010" + +# 0x13E: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E0D000" + +# 0x13F: SUB R03, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F15023" + +# 0x140: JNZ 0x12C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1403212C" + +# 0x141: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14128080" + +# 0x142: CMP R00, 0xF8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1420FF80" + +# 0x143: JNE 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1433A14A" + +# 0x144: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14428090" + +# 0x145: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1450FFF0" + +# 0x146: JNE 0x14A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1463A14A" + +# 0x147: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "147280A0" + +# 0x148: CMP R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1480FFF0" + +# 0x149: JEQ 0x154 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14939154" + +# 0x14A: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A03080" + +# 0x14B: CALL 0x174 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B3B174" + +# 0x14C: JMP 0x128 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C30128" + +# 0x14D: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D3C000" + +# 0x14E: XIN R00, (0x07) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E28070" + +# 0x14F: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F24010" + +# 0x150: AND R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15019010" + +# 0x151: JNZ 0x14E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1513214E" + +# 0x152: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1523D000" + +# 0x153: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1533E000" + +# 0x154: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15403010" + +# 0x155: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1553B21E" + +# 0x156: MOV R01, 0x48 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15603481" + +# 0x157: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1573B223" + +# 0x158: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15803C00" + +# 0x159: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1593B21E" + +# 0x15A: CALL 0x19F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15A3B19F" + +# 0x15B: MOV R01, 0x48 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15B03481" + +# 0x15C: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15C3B28C" + +# 0x15D: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15D03001" + +# 0x15E: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15E3B28F" + +# 0x15F: JMP 0x16E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15F3016E" + +# 0x160: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16003010" + +# 0x161: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1613B21E" + +# 0x162: MOV R01, 0x52 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16203521" + +# 0x163: CALL 0x223 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1633B223" + +# 0x164: CALL 0x19F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1643B19F" + +# 0x165: CALL 0x1B7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1653B1B7" + +# 0x166: MOV R01, 0x52 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16603521" + +# 0x167: CALL 0x28C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1673B28C" + +# 0x168: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16803001" + +# 0x169: CALL 0x28F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1693B28F" + +# 0x16A: XIN R00, (0x04) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16A28040" + +# 0x16B: OR R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16B1B100" + +# 0x16C: XOUT (0x04), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16C24040" + +# 0x16D: JMP 0x16E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16D3016E" + +# 0x16E: CALL 0x298 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16E3B298" + +# 0x16F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16F3E000" + +# 0x170: XOUT (0x08), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17024080" + +# 0x171: XOUT (0x09), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17124091" + +# 0x172: XOUT (0x0A), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "172240A2" + +# 0x173: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1733E000" + +# 0x174: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1743C001" + +# 0x175: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1753C002" + +# 0x176: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1763C003" + +# 0x177: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17728081" + +# 0x178: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17828092" + +# 0x179: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "179280A3" + +# 0x17A: ADD R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17A10001" + +# 0x17B: ADDC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17B13002" + +# 0x17C: ADDC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17C13003" + +# 0x17D: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17D24081" + +# 0x17E: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17E24092" + +# 0x17F: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17F240A3" + +# 0x180: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1803D003" + +# 0x181: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1813D002" + +# 0x182: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1823D001" + +# 0x183: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1833E000" + +# 0x184: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1843C001" + +# 0x185: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1853C002" + +# 0x186: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1863C003" + +# 0x187: XIN R01, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18728081" + +# 0x188: XIN R02, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18828092" + +# 0x189: XIN R03, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "189280A3" + +# 0x18A: SUB R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18A14001" + +# 0x18B: SUBC R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18B17002" + +# 0x18C: SUBC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18C17003" + +# 0x18D: XOUT (0x08), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18D24081" + +# 0x18E: XOUT (0x09), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18E24092" + +# 0x18F: XOUT (0x0A), R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18F240A3" + +# 0x190: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1903D003" + +# 0x191: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1913D002" + +# 0x192: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1923D001" + +# 0x193: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1933E000" + +# 0x194: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19403C00" + +# 0x195: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1953B21E" + +# 0x196: CALL 0x19F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1963B19F" + +# 0x197: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1973E000" + +# 0x198: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1983C001" + +# 0x199: CALL 0x1FA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1993B1FA" + +# 0x19A: CALL 0x235 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19A3B235" + +# 0x19B: MOV R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19B02010" + +# 0x19C: CALL 0x235 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19C3B235" + +# 0x19D: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19D3D001" + +# 0x19E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19E3E000" + +# 0x19F: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19F3C000" + +# 0x1A0: XIN R00, (0x0A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A0280A0" + +# 0x1A1: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A13B198" + +# 0x1A2: XIN R00, (0x09) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A228090" + +# 0x1A3: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A33B198" + +# 0x1A4: XIN R00, (0x08) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A428080" + +# 0x1A5: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A53B198" + +# 0x1A6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A63D000" + +# 0x1A7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A73E000" + +# 0x1A8: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A83C000" + +# 0x1A9: ADD R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A911031" + +# 0x1AA: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AA09010" + +# 0x1AB: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AB3B198" + +# 0x1AC: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AC15011" + +# 0x1AD: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AD09010" + +# 0x1AE: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AE3B198" + +# 0x1AF: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AF15011" + +# 0x1B0: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B009010" + +# 0x1B1: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B13B198" + +# 0x1B2: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B215011" + +# 0x1B3: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B309010" + +# 0x1B4: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B43B198" + +# 0x1B5: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B53D000" + +# 0x1B6: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B63E000" + +# 0x1B7: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B73C000" + +# 0x1B8: MOV R00, 0xC0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B803C00" + +# 0x1B9: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B93B21E" + +# 0x1BA: MOVX R00, (0x87) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BA05870" + +# 0x1BB: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BB3B198" + +# 0x1BC: MOVX R00, (0x86) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BC05860" + +# 0x1BD: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BD3B198" + +# 0x1BE: MOVX R00, (0x85) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BE05850" + +# 0x1BF: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BF3B198" + +# 0x1C0: MOVX R00, (0x84) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C005840" + +# 0x1C1: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C13B198" + +# 0x1C2: MOVX R00, (0x83) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C205830" + +# 0x1C3: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C33B198" + +# 0x1C4: MOVX R00, (0x82) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C405820" + +# 0x1C5: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C53B198" + +# 0x1C6: MOVX R00, (0x81) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C605810" + +# 0x1C7: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C73B198" + +# 0x1C8: MOVX R00, (0x80) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C805800" + +# 0x1C9: CALL 0x198 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C93B198" + +# 0x1CA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CA3D000" + +# 0x1CB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CB3E000" + +# 0x1CC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CC3C000" + +# 0x1CD: MOV R00, 0x0D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CD030D0" + +# 0x1CE: XOUT (0x13), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CE24130" + +# 0x1CF: MOV R00, 0x1E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CF031E0" + +# 0x1D0: MOVC (0x5E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D00D5E0" + +# 0x1D1: MOVC (0x5F), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D10D5F0" + +# 0x1D2: MOV R00, 0xE8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D203E80" + +# 0x1D3: MOVC (0x60), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D30D600" + +# 0x1D4: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D403030" + +# 0x1D5: MOVC (0x61), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D50D610" + +# 0x1D6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D63D000" + +# 0x1D7: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D73E000" + +# 0x1D8: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D83C001" + +# 0x1D9: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D93C002" + +# 0x1DA: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DA3C003" + +# 0x1DB: MOVC R02, (0x60) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DB0A602" + +# 0x1DC: MOVC R03, (0x61) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DC0A613" + +# 0x1DD: MOVC R01, (0x5E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DD0A5E1" + +# 0x1DE: MOVC R00, (0x5F) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DE0A5F0" + +# 0x1DF: CMP R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DF0E010" + +# 0x1E0: JEQ 0x1EC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E0391EC" + +# 0x1E1: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E109010" + +# 0x1E2: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E211011" + +# 0x1E3: CMP R01, 0x5E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E30F5E1" + +# 0x1E4: JNE 0x1E6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E43A1E6" + +# 0x1E5: MOV R01, 0x1E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E5031E1" + +# 0x1E6: MOVC (0x5E), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E60D5E1" + +# 0x1E7: CLRC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E715000" + +# 0x1E8: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E83D003" + +# 0x1E9: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E93D002" + +# 0x1EA: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EA3D001" + +# 0x1EB: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EB3E000" + +# 0x1EC: CALL 0x2AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EC3B2AD" + +# 0x1ED: DEC R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1ED15012" + +# 0x1EE: SUBC R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EE17003" + +# 0x1EF: JNZ 0x1DE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EF321DE" + +# 0x1F0: TST R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F00F002" + +# 0x1F1: JNZ 0x1DE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F1321DE" + +# 0x1F2: SETC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F22B000" + +# 0x1F3: JMP 0x1E8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F3301E8" + +# 0x1F4: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F4190F0" + +# 0x1F5: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F50F0A0" + +# 0x1F6: JLT 0x1F8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F6351F8" + +# 0x1F7: ADD R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F711070" + +# 0x1F8: ADD R00, 0x30 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F811300" + +# 0x1F9: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F93E000" + +# 0x1FA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FA3C000" + +# 0x1FB: CALL 0x1F4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FB3B1F4" + +# 0x1FC: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FC02001" + +# 0x1FD: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FD3D000" + +# 0x1FE: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FE2A000" + +# 0x1FF: CALL 0x1F4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FF3B1F4" + +# 0x200: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2003E000" + +# 0x201: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20103002" + +# 0x202: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20203030" + +# 0x203: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2033B24D" + +# 0x204: CALL 0x2A6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2043B2A6" + +# 0x205: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20503002" + +# 0x206: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20603030" + +# 0x207: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2073B24D" + +# 0x208: CALL 0x2A6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2083B2A6" + +# 0x209: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20903002" + +# 0x20A: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20A03020" + +# 0x20B: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20B3B24D" + +# 0x20C: CALL 0x2AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20C3B2AD" + +# 0x20D: MOV R00, 0x28 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20D03280" + +# 0x20E: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20E3B21E" + +# 0x20F: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20F030C0" + +# 0x210: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2103B21E" + +# 0x211: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21103060" + +# 0x212: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2123B21E" + +# 0x213: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21303010" + +# 0x214: CALL 0x21E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2143B21E" + +# 0x215: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2153E000" + +# 0x216: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2163C000" + +# 0x217: CALL 0x241 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2173B241" + +# 0x218: AND R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21819800" + +# 0x219: JZ 0x21C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2193121C" + +# 0x21A: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21A3B2C4" + +# 0x21B: JMP 0x217 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21B30217" + +# 0x21C: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21C3D000" + +# 0x21D: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21D3E000" + +# 0x21E: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21E3C002" + +# 0x21F: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21F03002" + +# 0x220: CALL 0x23A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2203B23A" + +# 0x221: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2213D002" + +# 0x222: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2223E000" + +# 0x223: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2233C000" + +# 0x224: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22404010" + +# 0x225: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22511011" + +# 0x226: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2260F000" + +# 0x227: JZ 0x22A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2273122A" + +# 0x228: CALL 0x235 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2283B235" + +# 0x229: JMP 0x224 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22930224" + +# 0x22A: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22A3D000" + +# 0x22B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22B3E000" + +# 0x22C: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22C3C000" + +# 0x22D: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22D09010" + +# 0x22E: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22E11011" + +# 0x22F: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22F0F000" + +# 0x230: JZ 0x233 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23031233" + +# 0x231: CALL 0x235 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2313B235" + +# 0x232: JMP 0x22D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2323022D" + +# 0x233: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2333D000" + +# 0x234: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2343E000" + +# 0x235: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2353C002" + +# 0x236: MOV R02, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23603402" + +# 0x237: CALL 0x23A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2373B23A" + +# 0x238: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2383D002" + +# 0x239: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2393E000" + +# 0x23A: CALL 0x216 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23A3B216" + +# 0x23B: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23B3C000" + +# 0x23C: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23C2A000" + +# 0x23D: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23D3B24D" + +# 0x23E: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23E3D000" + +# 0x23F: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23F3B24D" + +# 0x240: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2403E000" + +# 0x241: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2413C002" + +# 0x242: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24203002" + +# 0x243: CALL 0x246 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2433B246" + +# 0x244: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2443D002" + +# 0x245: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2453E000" + +# 0x246: CALL 0x260 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2463B260" + +# 0x247: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2472A000" + +# 0x248: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2483C000" + +# 0x249: CALL 0x260 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2493B260" + +# 0x24A: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24A3D002" + +# 0x24B: OR R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24B1A020" + +# 0x24C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24C3E000" + +# 0x24D: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24D3C001" + +# 0x24E: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24E190F0" + +# 0x24F: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24F02001" + +# 0x250: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2501A021" + +# 0x251: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25124031" + +# 0x252: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2523B2C4" + +# 0x253: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25302001" + +# 0x254: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2541A021" + +# 0x255: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2551B801" + +# 0x256: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25624031" + +# 0x257: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2573B2C4" + +# 0x258: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25802001" + +# 0x259: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2591A021" + +# 0x25A: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25A24031" + +# 0x25B: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25B3B2C4" + +# 0x25C: OR R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25C1B201" + +# 0x25D: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25D24031" + +# 0x25E: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25E3D001" + +# 0x25F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25F3E000" + +# 0x260: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2603C001" + +# 0x261: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26103201" + +# 0x262: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2621A021" + +# 0x263: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26324031" + +# 0x264: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2643B2C4" + +# 0x265: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26503201" + +# 0x266: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2661A021" + +# 0x267: OR R01, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2671B801" + +# 0x268: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26824031" + +# 0x269: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2693B2C4" + +# 0x26A: XIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26A28030" + +# 0x26B: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26B190F0" + +# 0x26C: MOV R01, 0x20 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26C03201" + +# 0x26D: OR R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26D1A021" + +# 0x26E: XOUT (0x03), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26E24031" + +# 0x26F: CALL 0x2C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26F3B2C4" + +# 0x270: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2703D001" + +# 0x271: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2713E000" + +# 0x272: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2723C000" + +# 0x273: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27303020" + +# 0x274: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "274240E0" + +# 0x275: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2753D000" + +# 0x276: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2763E000" + +# 0x277: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2773C000" + +# 0x278: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27803010" + +# 0x279: XOUT (0x0E), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "279240E0" + +# 0x27A: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27A3D000" + +# 0x27B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27B3E000" + +# 0x27C: CALL 0x292 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27C3B292" + +# 0x27D: XOUT (0x0C), R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27D240C1" + +# 0x27E: XOUT (0x0B), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27E240B0" + +# 0x27F: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27F3E000" + +# 0x280: CALL 0x292 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2803B292" + +# 0x281: XOUT (0x0D), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "281240D0" + +# 0x282: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2823E000" + +# 0x283: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2833C000" + +# 0x284: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28404010" + +# 0x285: INC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28511011" + +# 0x286: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2860F000" + +# 0x287: JZ 0x28A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2873128A" + +# 0x288: CALL 0x280 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2883B280" + +# 0x289: JMP 0x284 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28930284" + +# 0x28A: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28A3D000" + +# 0x28B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28B3E000" + +# 0x28C: CALL 0x272 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28C3B272" + +# 0x28D: CALL 0x283 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28D3B283" + +# 0x28E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28E3E000" + +# 0x28F: CALL 0x283 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28F3B283" + +# 0x290: CALL 0x272 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2903B272" + +# 0x291: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2913E000" + +# 0x292: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2923C000" + +# 0x293: XIN R00, (0x0E) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "293280E0" + +# 0x294: AND R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29419020" + +# 0x295: JZ 0x293 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29531293" + +# 0x296: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2963D000" + +# 0x297: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2973E000" + +# 0x298: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2983C00F" + +# 0x299: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "299030AF" + +# 0x29A: CALL 0x29F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29A3B29F" + +# 0x29B: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29B1501F" + +# 0x29C: JNZ 0x29A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29C3229A" + +# 0x29D: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29D3D00F" + +# 0x29E: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29E3E000" + +# 0x29F: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29F3C00F" + +# 0x2A0: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A0030AF" + +# 0x2A1: CALL 0x2A6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A13B2A6" + +# 0x2A2: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A21501F" + +# 0x2A3: JNZ 0x2A1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A3322A1" + +# 0x2A4: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A43D00F" + +# 0x2A5: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A53E000" + +# 0x2A6: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A63C00F" + +# 0x2A7: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A7030AF" + +# 0x2A8: CALL 0x2AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A83B2AD" + +# 0x2A9: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A91501F" + +# 0x2AA: JNZ 0x2A8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AA322A8" + +# 0x2AB: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AB3D00F" + +# 0x2AC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AC3E000" + +# 0x2AD: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AD3C00F" + +# 0x2AE: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AE030AF" + +# 0x2AF: CALL 0x2B4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AF3B2B4" + +# 0x2B0: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B01501F" + +# 0x2B1: JNZ 0x2AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B1322AF" + +# 0x2B2: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B23D00F" + +# 0x2B3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B33E000" + +# 0x2B4: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B43C00F" + +# 0x2B5: MOV R15, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B5030AF" + +# 0x2B6: CALL 0x2BB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B63B2BB" + +# 0x2B7: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B71501F" + +# 0x2B8: JNZ 0x2B6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B8322B6" + +# 0x2B9: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B93D00F" + +# 0x2BA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BA3E000" + +# 0x2BB: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BB3C00F" + +# 0x2BC: MOV R15, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BC0363F" + +# 0x2BD: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BD00000" + +# 0x2BE: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BE00000" + +# 0x2BF: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BF00000" + +# 0x2C0: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C01501F" + +# 0x2C1: JNZ 0x2BD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C1322BD" + +# 0x2C2: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C23D00F" + +# 0x2C3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C33E000" + +# 0x2C4: PUSH R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C43C00F" + +# 0x2C5: MOV R15, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C50309F" + +# 0x2C6: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C600000" + +# 0x2C7: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C700000" + +# 0x2C8: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C800000" + +# 0x2C9: DEC R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C91501F" + +# 0x2CA: JNZ 0x2C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CA322C6" + +# 0x2CB: POP R15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CB3D00F" + +# 0x2CC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CC3E000" + +# 0x2CD: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CD3C001" + +# 0x2CE: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CE28061" + +# 0x2CF: AND R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CF19021" + +# 0x2D0: JNZ 0x2CE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D0322CE" + +# 0x2D1: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D124020" + +# 0x2D2: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D23D001" + +# 0x2D3: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D33E000" + +# 0x2D4: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D43C001" + +# 0x2D5: XIN R01, (0x06) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D528061" + +# 0x2D6: AND R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D619101" + +# 0x2D7: JZ 0x2D5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D7312D5" + +# 0x2D8: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D828020" + +# 0x2D9: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D93D001" + +# 0x2DA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DA3E000" + +# Assembled from vga_test.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "000D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "010A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "074D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0954" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B73" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E43" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1065" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1161" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1272" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1369" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "146E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1567" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1620" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1753" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1844" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A41" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B4D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D57" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2074" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2169" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "226E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2367" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2420" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2553" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2644" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2752" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2841" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "294D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B52" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "306E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3167" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3220" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3353" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3444" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3552" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "374D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3952" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E6E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F67" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4020" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4142" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4269" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4374" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "446D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4561" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4670" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4856" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4965" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B69" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C66" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F4F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "504B" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5246" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5361" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5469" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "556C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5665" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5764" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5820" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5961" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D2E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/projects/cpu/asm/xregs.inc.jsm b/projects/cpu/asm/xregs.inc.jsm new file mode 100644 index 0000000..f258191 --- /dev/null +++ b/projects/cpu/asm/xregs.inc.jsm @@ -0,0 +1,41 @@ +; External registers +btn_port: equ 0x00 ; RO +led_port: equ 0x01 ; R/W +uart_data: equ 0x02 ; R/W +lcd_port: equ 0x03 ; R/W +ctrl_reg: equ 0x04 ; R/W +CTRL_VGA_ENABLE: equ 0x04 +CTRL_TIMER_ENABLE: equ 0x02 +dip_port: equ 0x05 ; RO +uart_status: equ 0x06 ; RO +sdram_reg: equ 0x07 ; R/W +FIFO_CTRL_IS_CMD: equ 0x04 +FIFO_CTRL_IS_WRITE: equ 0x10 +FIFO_CTRL_IS_READ: equ 0x20 +FIFO_STAT_CMD_FULL: equ 0x01 +FIFO_STAT_CMD_EMPTY: equ 0x02 +FIFO_STAT_WRITE_DATA_FULL: equ 0x04 +FIFO_STAT_WRITE_DATA_EMPTY: equ 0x08 +FIFO_STAT_READ_DATA_FULL: equ 0x10 +FIFO_STAT_READ_DATA_EMPTY: equ 0x20 +sdram_addr: equ 0x08 ; R/W +sdram_addr0: equ 0x08 ; R/W +sdram_addr1: equ 0x09 ; R/W +sdram_addr2: equ 0x0A ; R/W +reg_cg_char_addr: equ 0x0B ; RW +reg_cg_line_addr: equ 0x0C ; RW +reg_cg_data: equ 0x0D ; RW +reg_cg_ctrl: equ 0x0E ; WO +reg_hwstat: equ 0x0E ; RO +reg_color_red: equ 0x10 ; RW +reg_color_grn: equ 0x11 ; RW +reg_color_blu: equ 0x12 ; RW +uart_baudrate: equ 0x13 ; R/W +vga_read_addr: equ 0x14 ; R/W +vga_read_addr0: equ 0x14 ; R/W +vga_read_addr1: equ 0x15 ; R/W +vga_read_addr2: equ 0x16 ; R/W +timer_reload: equ 0x17 ; R/W +timer_reload0: equ 0x17 ; R/W +timer_reload1: equ 0x18 ; R/W +timer_reload2: equ 0x19 ; R/W diff --git a/projects/cpu/doc/cpu.vsd b/projects/cpu/doc/cpu.vsd new file mode 100644 index 0000000000000000000000000000000000000000..d9aa2b93c62659827b0bcc25fff82062b53ac839 GIT binary patch literal 105984 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 Ns$(|hIBog-{~u2mT>bz6 literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/cpu20070130.vsd b/projects/cpu/doc/cpu20070130.vsd new file mode 100644 index 0000000000000000000000000000000000000000..b47dd71bd95bfee06c446813f1e88e47d02438bc GIT binary patch literal 184832 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 z%0A16Um^vQ=G2yUWg{aV1V5KChb}KE1E-zKE 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 literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/cpu20070131.vsd b/projects/cpu/doc/cpu20070131.vsd new file mode 100644 index 0000000000000000000000000000000000000000..40aecfeda528f48453483d1dc5c546ea458cc1dd GIT binary patch literal 108032 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 literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/cpu20070203.vsd b/projects/cpu/doc/cpu20070203.vsd new file mode 100644 index 0000000000000000000000000000000000000000..3b7cd2e3175d857188bac6964b02de02ff544da0 GIT binary patch literal 206848 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

o%3$NFi;=XtK>C7 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

*DV$+1^!DUYo~@%HIcUVQ8-LGqlwB8Ui%l zhIX3jhAx0t5g!2DFwjO~oNAP&HNp^FcLTl`=)G`XH{2hB=UU@=N~d_9-P6zpb`drnnSd3fCN-$8pvr9-+Mv^dJo?9rNbMz?g4xV=EXW=>t_z9qo$9)rUe-fUX zh3DrZ9ZJv4%l&2QQF-Kj^+Q+_upDOr#~`G5N$LOHGQ#@`A=RRFb*o3~&f`S)6=a55qT>?Mb4L$@Vk1Ibs&C>Ql<7JW8x8m0i znn$h07?ZX}>ErGXmhnmOvqsmvddd8l^Sicyvq#ICuI$(c^y5;#_QDr$4 z^Eg6X%fBqgyL#$EF=xjYA;o!_rI2>Ewk&g&Dk}epAIz;Uu`R9W{2^X2 z{%+CN{e3U4HwquT1_%WF%=g_}Z$3-!sl(X5t|dZ>o9Wz6@cZwrH?OGrex+uRk@|OL ze(sl-=YK`@Eizn!j2SNFzpiAx%L+q=OOzoCA;n9}|B8|~-4p8qJj;L1_m?*_pO4)+iGWJDC@#1{lZ_6GxuZyQ!y1bFlN2Fc( z%bQ^5XpFQAGPXxZ@#1{lFK z+PH22d_%ip^xUKv}qRX)}HnlU`A--$Be}x$O3Yw=btuYi)cT4%wVi6#&*+zO&q4S1MXwUx&4}_NukE zGlw!Gz)o>g0#ycN~==4Z&3Brk6ZA3T0k`n&*c%N}&zYw!dCMz3 zSF<#EE2^F3=UtY!ywY0I{qii(!Khj$*@E1dA`i#gxivEu8U+ xJzvGI)CX__S?=m(xv`A*h?gT$#z)HawyOO8LgbiD(K)^4nkE02SQW{E{|7tmwWI(5 literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/cpu20070315.vsd b/projects/cpu/doc/cpu20070315.vsd new file mode 100644 index 0000000000000000000000000000000000000000..88a6e2e3ec73b01f22b874bcdd17756091a89e5e GIT binary patch literal 230400 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 DqjSG# literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/cpu20070404.vsd b/projects/cpu/doc/cpu20070404.vsd new file mode 100644 index 0000000000000000000000000000000000000000..f819bd877b27dabfa62965528990f1248ff92b1f GIT binary patch literal 238592 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 OnH|33>tj#y_x}fa|NJQc literal 0 HcmV?d00001 diff --git a/projects/cpu/doc/timing_template.vss b/projects/cpu/doc/timing_template.vss new file mode 100644 index 0000000000000000000000000000000000000000..2c38de8296208268b5c9d97509b867a98663aa20 GIT binary patch literal 20992 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 bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/counter_xrom.vhdl b/projects/cpu/src/systest/counter_xrom.vhdl new file mode 100644 index 0000000..d12f063 --- /dev/null +++ b/projects/cpu/src/systest/counter_xrom.vhdl @@ -0,0 +1,318 @@ +------------------------------------------------------------------------- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE counter OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from counter.jsm + constant xmem_rom : xmem_rom_t := + ( + X"4A", -- 0x00 + X"2D", -- 0x01 + X"43", -- 0x02 + X"50", -- 0x03 + X"55", -- 0x04 + X"20", -- 0x05 + X"56", -- 0x06 + X"31", -- 0x07 + X"2E", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end counter; + diff --git a/projects/cpu/src/systest/counter_xrom_ld.vhdl b/projects/cpu/src/systest/counter_xrom_ld.vhdl new file mode 100644 index 0000000..d59488d --- /dev/null +++ b/projects/cpu/src/systest/counter_xrom_ld.vhdl @@ -0,0 +1,414 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM + +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from counter.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"4A", -- 0x00 + X"2D", -- 0x01 + X"43", -- 0x02 + X"50", -- 0x03 + X"55", -- 0x04 + X"20", -- 0x05 + X"56", -- 0x06 + X"31", -- 0x07 + X"2E", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/cpu_embedded.vhd b/projects/cpu/src/systest/cpu_embedded.vhd new file mode 100644 index 0000000..03bed0b --- /dev/null +++ b/projects/cpu/src/systest/cpu_embedded.vhd @@ -0,0 +1,107 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: cpu_embedded using cpu_core and rom + +-- 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; + +use work.cpu_pkg.all; + +entity cpu_embedded is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); +end cpu_embedded; + +architecture rtl of cpu_embedded is + + signal rom_data : unsigned (IMEM_DATA_WIDTH-1 downto 0); + signal rom_addr : unsigned (IMEM_ADDR_WIDTH-1 downto 0); + + COMPONENT cpu + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + instr_din : in unsigned (IMEM_DATA_WIDTH-1 downto 0); + instr_addr : out unsigned (IMEM_ADDR_WIDTH-1 downto 0); + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); + END COMPONENT; + + + COMPONENT irom + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + END COMPONENT; + +begin + +inst_cpu: cpu + PORT MAP( + rst => rst, + clk => clk, + ce => ce, + int_in => int_in, + int_ack => int_ack, + xmem_we => xmem_we, + xmem_re => xmem_re, + instr_din => rom_data, + instr_addr => rom_addr, + xmem_din => xmem_din, + xmem_dout => xmem_dout, + xmem_addr => xmem_addr, + io_sel => io_sel + ); + +inst_irom: irom + PORT MAP( + clk => clk, + ce => ce, + addr => rom_addr, + dout => rom_data + ); + +end rtl; diff --git a/projects/cpu/src/systest/sdr_test_irom.vhdl b/projects/cpu/src/systest/sdr_test_irom.vhdl new file mode 100644 index 0000000..04b0f9c --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_irom.vhdl @@ -0,0 +1,405 @@ +------------------------------------------------------------------------- +-- 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; + diff --git a/projects/cpu/src/systest/sdr_test_irom_ld.vhdl b/projects/cpu/src/systest/sdr_test_irom_ld.vhdl new file mode 100644 index 0000000..4c5aa99 --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_irom_ld.vhdl @@ -0,0 +1,1182 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM + +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdr_test.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal 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 + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdr_test_short_irom.vhdl b/projects/cpu/src/systest/sdr_test_short_irom.vhdl new file mode 100644 index 0000000..b968343 --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_short_irom.vhdl @@ -0,0 +1,172 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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_short OF irom IS + + type imem_rom_t is array (0 to 110) of inst_t; + + -- Assembled from sdr_test_short.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"000", -- 0x002: MOV R00, 0x00 + "100100" & X"010", -- 0x003: XOUT (0x01), R00 + "101000" & X"040", -- 0x004: XIN R00, (0x04) + "011001" & X"CF0", -- 0x005: AND R00, 0xCF + "100100" & X"040", -- 0x006: XOUT (0x04), R00 + "101000" & X"070", -- 0x007: XIN R00, (0x07) + "011001" & X"800", -- 0x008: AND R00, 0x80 + "110010" & X"007", -- 0x009: JNZ 0x007 + "110000" & X"00B", -- 0x00A: JMP 0x00B + "111011" & X"058", -- 0x00B: CALL 0x058 + "000011" & X"800", -- 0x00C: MOV R00, 0x80 + "000011" & X"08F", -- 0x00D: MOV R15, 0x08 + "000111" & X"000", -- 0x00E: MOVX (R00), 0x00 + "010001" & X"010", -- 0x00F: INC R00 + "010101" & X"01F", -- 0x010: DEC R15 + "110010" & X"00E", -- 0x011: JNZ 0x00E + "101000" & X"080", -- 0x012: XIN R00, (0x08) + "001111" & X"080", -- 0x013: CMP R00, 0x08 + "111001" & X"01D", -- 0x014: JEQ 0x01D + "101000" & X"070", -- 0x015: XIN R00, (0x07) + "011001" & X"020", -- 0x016: AND R00, 0x02 + "110010" & X"015", -- 0x017: JNZ 0x015 + "000011" & X"070", -- 0x018: MOV R00, 0x07 + "100101" & X"020", -- 0x019: XOUT (R00), 0x02 + "000011" & X"020", -- 0x01A: MOV R00, 0x02 + "111011" & X"05F", -- 0x01B: CALL 0x05F + "110000" & X"012", -- 0x01C: JMP 0x012 + "111011" & X"058", -- 0x01D: CALL 0x058 + "000011" & X"000", -- 0x01E: MOV R00, 0x00 + "001101" & X"000", -- 0x01F: MOVC (0x00), R00 + "101000" & X"080", -- 0x020: XIN R00, (0x08) + "001111" & X"080", -- 0x021: CMP R00, 0x08 + "111001" & X"037", -- 0x022: JEQ 0x037 + "001010" & X"001", -- 0x023: MOVC R01, (0x00) + "000011" & X"800", -- 0x024: MOV R00, 0x80 + "000011" & X"08F", -- 0x025: MOV R15, 0x08 + "000110" & X"001", -- 0x026: MOVX (R01), R00 + "010001" & X"010", -- 0x027: INC R00 + "010001" & X"011", -- 0x028: INC R01 + "010101" & X"01F", -- 0x029: DEC R15 + "110010" & X"026", -- 0x02A: JNZ 0x026 + "101000" & X"070", -- 0x02B: XIN R00, (0x07) + "011001" & X"020", -- 0x02C: AND R00, 0x02 + "110010" & X"02B", -- 0x02D: JNZ 0x02B + "000000" & X"000", -- 0x02E: NOP + "000011" & X"070", -- 0x02F: MOV R00, 0x07 + "100101" & X"020", -- 0x030: XOUT (R00), 0x02 + "000011" & X"020", -- 0x031: MOV R00, 0x02 + "111011" & X"05F", -- 0x032: CALL 0x05F + "001010" & X"000", -- 0x033: MOVC R00, (0x00) + "010001" & X"010", -- 0x034: INC R00 + "001101" & X"000", -- 0x035: MOVC (0x00), R00 + "110000" & X"020", -- 0x036: JMP 0x020 + "111011" & X"058", -- 0x037: CALL 0x058 + "000011" & X"000", -- 0x038: MOV R00, 0x00 + "001101" & X"000", -- 0x039: MOVC (0x00), R00 + "101000" & X"080", -- 0x03A: XIN R00, (0x08) + "001111" & X"080", -- 0x03B: CMP R00, 0x08 + "111001" & X"052", -- 0x03C: JEQ 0x052 + "000011" & X"070", -- 0x03D: MOV R00, 0x07 + "100101" & X"010", -- 0x03E: XOUT (R00), 0x01 + "101000" & X"070", -- 0x03F: XIN R00, (0x07) + "011001" & X"010", -- 0x040: AND R00, 0x01 + "110010" & X"03F", -- 0x041: JNZ 0x03F + "001010" & X"001", -- 0x042: MOVC R01, (0x00) + "000011" & X"800", -- 0x043: MOV R00, 0x80 + "000011" & X"08F", -- 0x044: MOV R15, 0x08 + "000100" & X"002", -- 0x045: MOVX R02, (R00) + "001110" & X"012", -- 0x046: CMP R02, R01 + "111010" & X"053", -- 0x047: JNE 0x053 + "010001" & X"010", -- 0x048: INC R00 + "010001" & X"011", -- 0x049: INC R01 + "010101" & X"01F", -- 0x04A: DEC R15 + "110010" & X"045", -- 0x04B: JNZ 0x045 + "000011" & X"020", -- 0x04C: MOV R00, 0x02 + "111011" & X"05F", -- 0x04D: CALL 0x05F + "001010" & X"000", -- 0x04E: MOVC R00, (0x00) + "010001" & X"010", -- 0x04F: INC R00 + "001101" & X"000", -- 0x050: MOVC (0x00), R00 + "110000" & X"03A", -- 0x051: JMP 0x03A + "110000" & X"057", -- 0x052: JMP 0x057 + "101000" & X"040", -- 0x053: XIN R00, (0x04) + "011011" & X"100", -- 0x054: OR R00, 0x10 + "100100" & X"040", -- 0x055: XOUT (0x04), R00 + "110000" & X"057", -- 0x056: JMP 0x057 + "110000" & X"057", -- 0x057: JMP 0x057 + "111100" & X"000", -- 0x058: PUSH R00 + "000011" & X"000", -- 0x059: MOV R00, 0x00 + "100100" & X"080", -- 0x05A: XOUT (0x08), R00 + "100100" & X"090", -- 0x05B: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x05C: XOUT (0x0A), R00 + "111101" & X"000", -- 0x05D: POP R00 + "111110" & X"000", -- 0x05E: RET + "111100" & X"001", -- 0x05F: PUSH R01 + "111100" & X"002", -- 0x060: PUSH R02 + "111100" & X"003", -- 0x061: PUSH R03 + "101000" & X"081", -- 0x062: XIN R01, (0x08) + "101000" & X"092", -- 0x063: XIN R02, (0x09) + "101000" & X"0A3", -- 0x064: XIN R03, (0x0A) + "010000" & X"001", -- 0x065: ADD R01, R00 + "010011" & X"002", -- 0x066: ADDC R02, 0x00 + "010011" & X"003", -- 0x067: ADDC R03, 0x00 + "100100" & X"081", -- 0x068: XOUT (0x08), R01 + "100100" & X"092", -- 0x069: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x06A: XOUT (0x0A), R03 + "111101" & X"003", -- 0x06B: POP R03 + "111101" & X"002", -- 0x06C: POP R02 + "111101" & X"001", -- 0x06D: POP R01 + "111110" & X"000" -- 0x06E: 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_short; + diff --git a/projects/cpu/src/systest/sdr_test_short_irom_ld.vhdl b/projects/cpu/src/systest/sdr_test_short_irom_ld.vhdl new file mode 100644 index 0000000..c07924a --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_short_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdr_test_short.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"000", -- 0x002: MOV R00, 0x00 + "100100" & X"010", -- 0x003: XOUT (0x01), R00 + "101000" & X"040", -- 0x004: XIN R00, (0x04) + "011001" & X"CF0", -- 0x005: AND R00, 0xCF + "100100" & X"040", -- 0x006: XOUT (0x04), R00 + "101000" & X"070", -- 0x007: XIN R00, (0x07) + "011001" & X"800", -- 0x008: AND R00, 0x80 + "110010" & X"007", -- 0x009: JNZ 0x007 + "110000" & X"00B", -- 0x00A: JMP 0x00B + "111011" & X"058", -- 0x00B: CALL 0x058 + "000011" & X"800", -- 0x00C: MOV R00, 0x80 + "000011" & X"08F", -- 0x00D: MOV R15, 0x08 + "000111" & X"000", -- 0x00E: MOVX (R00), 0x00 + "010001" & X"010", -- 0x00F: INC R00 + "010101" & X"01F", -- 0x010: DEC R15 + "110010" & X"00E", -- 0x011: JNZ 0x00E + "101000" & X"080", -- 0x012: XIN R00, (0x08) + "001111" & X"080", -- 0x013: CMP R00, 0x08 + "111001" & X"01D", -- 0x014: JEQ 0x01D + "101000" & X"070", -- 0x015: XIN R00, (0x07) + "011001" & X"020", -- 0x016: AND R00, 0x02 + "110010" & X"015", -- 0x017: JNZ 0x015 + "000011" & X"070", -- 0x018: MOV R00, 0x07 + "100101" & X"020", -- 0x019: XOUT (R00), 0x02 + "000011" & X"020", -- 0x01A: MOV R00, 0x02 + "111011" & X"05F", -- 0x01B: CALL 0x05F + "110000" & X"012", -- 0x01C: JMP 0x012 + "111011" & X"058", -- 0x01D: CALL 0x058 + "000011" & X"000", -- 0x01E: MOV R00, 0x00 + "001101" & X"000", -- 0x01F: MOVC (0x00), R00 + "101000" & X"080", -- 0x020: XIN R00, (0x08) + "001111" & X"080", -- 0x021: CMP R00, 0x08 + "111001" & X"037", -- 0x022: JEQ 0x037 + "001010" & X"001", -- 0x023: MOVC R01, (0x00) + "000011" & X"800", -- 0x024: MOV R00, 0x80 + "000011" & X"08F", -- 0x025: MOV R15, 0x08 + "000110" & X"001", -- 0x026: MOVX (R01), R00 + "010001" & X"010", -- 0x027: INC R00 + "010001" & X"011", -- 0x028: INC R01 + "010101" & X"01F", -- 0x029: DEC R15 + "110010" & X"026", -- 0x02A: JNZ 0x026 + "101000" & X"070", -- 0x02B: XIN R00, (0x07) + "011001" & X"020", -- 0x02C: AND R00, 0x02 + "110010" & X"02B", -- 0x02D: JNZ 0x02B + "000000" & X"000", -- 0x02E: NOP + "000011" & X"070", -- 0x02F: MOV R00, 0x07 + "100101" & X"020", -- 0x030: XOUT (R00), 0x02 + "000011" & X"020", -- 0x031: MOV R00, 0x02 + "111011" & X"05F", -- 0x032: CALL 0x05F + "001010" & X"000", -- 0x033: MOVC R00, (0x00) + "010001" & X"010", -- 0x034: INC R00 + "001101" & X"000", -- 0x035: MOVC (0x00), R00 + "110000" & X"020", -- 0x036: JMP 0x020 + "111011" & X"058", -- 0x037: CALL 0x058 + "000011" & X"000", -- 0x038: MOV R00, 0x00 + "001101" & X"000", -- 0x039: MOVC (0x00), R00 + "101000" & X"080", -- 0x03A: XIN R00, (0x08) + "001111" & X"080", -- 0x03B: CMP R00, 0x08 + "111001" & X"052", -- 0x03C: JEQ 0x052 + "000011" & X"070", -- 0x03D: MOV R00, 0x07 + "100101" & X"010", -- 0x03E: XOUT (R00), 0x01 + "101000" & X"070", -- 0x03F: XIN R00, (0x07) + "011001" & X"010", -- 0x040: AND R00, 0x01 + "110010" & X"03F", -- 0x041: JNZ 0x03F + "001010" & X"001", -- 0x042: MOVC R01, (0x00) + "000011" & X"800", -- 0x043: MOV R00, 0x80 + "000011" & X"08F", -- 0x044: MOV R15, 0x08 + "000100" & X"002", -- 0x045: MOVX R02, (R00) + "001110" & X"012", -- 0x046: CMP R02, R01 + "111010" & X"053", -- 0x047: JNE 0x053 + "010001" & X"010", -- 0x048: INC R00 + "010001" & X"011", -- 0x049: INC R01 + "010101" & X"01F", -- 0x04A: DEC R15 + "110010" & X"045", -- 0x04B: JNZ 0x045 + "000011" & X"020", -- 0x04C: MOV R00, 0x02 + "111011" & X"05F", -- 0x04D: CALL 0x05F + "001010" & X"000", -- 0x04E: MOVC R00, (0x00) + "010001" & X"010", -- 0x04F: INC R00 + "001101" & X"000", -- 0x050: MOVC (0x00), R00 + "110000" & X"03A", -- 0x051: JMP 0x03A + "110000" & X"057", -- 0x052: JMP 0x057 + "101000" & X"040", -- 0x053: XIN R00, (0x04) + "011011" & X"100", -- 0x054: OR R00, 0x10 + "100100" & X"040", -- 0x055: XOUT (0x04), R00 + "110000" & X"057", -- 0x056: JMP 0x057 + "110000" & X"057", -- 0x057: JMP 0x057 + "111100" & X"000", -- 0x058: PUSH R00 + "000011" & X"000", -- 0x059: MOV R00, 0x00 + "100100" & X"080", -- 0x05A: XOUT (0x08), R00 + "100100" & X"090", -- 0x05B: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x05C: XOUT (0x0A), R00 + "111101" & X"000", -- 0x05D: POP R00 + "111110" & X"000", -- 0x05E: RET + "111100" & X"001", -- 0x05F: PUSH R01 + "111100" & X"002", -- 0x060: PUSH R02 + "111100" & X"003", -- 0x061: PUSH R03 + "101000" & X"081", -- 0x062: XIN R01, (0x08) + "101000" & X"092", -- 0x063: XIN R02, (0x09) + "101000" & X"0A3", -- 0x064: XIN R03, (0x0A) + "010000" & X"001", -- 0x065: ADD R01, R00 + "010011" & X"002", -- 0x066: ADDC R02, 0x00 + "010011" & X"003", -- 0x067: ADDC R03, 0x00 + "100100" & X"081", -- 0x068: XOUT (0x08), R01 + "100100" & X"092", -- 0x069: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x06A: XOUT (0x0A), R03 + "111101" & X"003", -- 0x06B: POP R03 + "111101" & X"002", -- 0x06C: POP R02 + "111101" & X"001", -- 0x06D: POP R01 + "111110" & X"000", -- 0x06E: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdr_test_short_xrom.vhdl b/projects/cpu/src/systest/sdr_test_short_xrom.vhdl new file mode 100644 index 0000000..b269fbd --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_short_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE sdr_test_short OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from sdr_test_short.jsm + constant xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end sdr_test_short; + diff --git a/projects/cpu/src/systest/sdr_test_short_xrom_ld.vhdl b/projects/cpu/src/systest/sdr_test_short_xrom_ld.vhdl new file mode 100644 index 0000000..b8dcc9e --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_short_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdr_test_short.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdr_test_xrom.vhdl b/projects/cpu/src/systest/sdr_test_xrom.vhdl new file mode 100644 index 0000000..9771a4d --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_xrom.vhdl @@ -0,0 +1,318 @@ +------------------------------------------------------------------------- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE sdr_test OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from sdr_test.jsm + constant xmem_rom : xmem_rom_t := + ( + X"53", -- 0x00 + X"44", -- 0x01 + X"52", -- 0x02 + X"41", -- 0x03 + X"4D", -- 0x04 + X"20", -- 0x05 + X"54", -- 0x06 + X"65", -- 0x07 + X"73", -- 0x08 + X"74", -- 0x09 + X"00", -- 0x0A + X"43", -- 0x0B + X"6C", -- 0x0C + X"65", -- 0x0D + X"61", -- 0x0E + X"72", -- 0x0F + X"69", -- 0x10 + X"6E", -- 0x11 + X"67", -- 0x12 + X"20", -- 0x13 + X"53", -- 0x14 + X"44", -- 0x15 + X"52", -- 0x16 + X"41", -- 0x17 + X"4D", -- 0x18 + X"00", -- 0x19 + X"57", -- 0x1A + X"72", -- 0x1B + X"69", -- 0x1C + X"74", -- 0x1D + X"69", -- 0x1E + X"6E", -- 0x1F + X"67", -- 0x20 + X"20", -- 0x21 + X"53", -- 0x22 + X"44", -- 0x23 + X"52", -- 0x24 + X"41", -- 0x25 + X"4D", -- 0x26 + X"00", -- 0x27 + X"52", -- 0x28 + X"65", -- 0x29 + X"61", -- 0x2A + X"64", -- 0x2B + X"69", -- 0x2C + X"6E", -- 0x2D + X"67", -- 0x2E + X"20", -- 0x2F + X"53", -- 0x30 + X"44", -- 0x31 + X"52", -- 0x32 + X"41", -- 0x33 + X"4D", -- 0x34 + X"00", -- 0x35 + X"56", -- 0x36 + X"65", -- 0x37 + X"72", -- 0x38 + X"69", -- 0x39 + X"66", -- 0x3A + X"79", -- 0x3B + X"20", -- 0x3C + X"4F", -- 0x3D + X"4B", -- 0x3E + X"00", -- 0x3F + X"56", -- 0x40 + X"65", -- 0x41 + X"72", -- 0x42 + X"69", -- 0x43 + X"66", -- 0x44 + X"79", -- 0x45 + X"20", -- 0x46 + X"46", -- 0x47 + X"61", -- 0x48 + X"69", -- 0x49 + X"6C", -- 0x4A + X"65", -- 0x4B + X"64", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end sdr_test; + diff --git a/projects/cpu/src/systest/sdr_test_xrom_ld.vhdl b/projects/cpu/src/systest/sdr_test_xrom_ld.vhdl new file mode 100644 index 0000000..304897c --- /dev/null +++ b/projects/cpu/src/systest/sdr_test_xrom_ld.vhdl @@ -0,0 +1,414 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM + +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdr_test.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"53", -- 0x00 + X"44", -- 0x01 + X"52", -- 0x02 + X"41", -- 0x03 + X"4D", -- 0x04 + X"20", -- 0x05 + X"54", -- 0x06 + X"65", -- 0x07 + X"73", -- 0x08 + X"74", -- 0x09 + X"00", -- 0x0A + X"43", -- 0x0B + X"6C", -- 0x0C + X"65", -- 0x0D + X"61", -- 0x0E + X"72", -- 0x0F + X"69", -- 0x10 + X"6E", -- 0x11 + X"67", -- 0x12 + X"20", -- 0x13 + X"53", -- 0x14 + X"44", -- 0x15 + X"52", -- 0x16 + X"41", -- 0x17 + X"4D", -- 0x18 + X"00", -- 0x19 + X"57", -- 0x1A + X"72", -- 0x1B + X"69", -- 0x1C + X"74", -- 0x1D + X"69", -- 0x1E + X"6E", -- 0x1F + X"67", -- 0x20 + X"20", -- 0x21 + X"53", -- 0x22 + X"44", -- 0x23 + X"52", -- 0x24 + X"41", -- 0x25 + X"4D", -- 0x26 + X"00", -- 0x27 + X"52", -- 0x28 + X"65", -- 0x29 + X"61", -- 0x2A + X"64", -- 0x2B + X"69", -- 0x2C + X"6E", -- 0x2D + X"67", -- 0x2E + X"20", -- 0x2F + X"53", -- 0x30 + X"44", -- 0x31 + X"52", -- 0x32 + X"41", -- 0x33 + X"4D", -- 0x34 + X"00", -- 0x35 + X"56", -- 0x36 + X"65", -- 0x37 + X"72", -- 0x38 + X"69", -- 0x39 + X"66", -- 0x3A + X"79", -- 0x3B + X"20", -- 0x3C + X"4F", -- 0x3D + X"4B", -- 0x3E + X"00", -- 0x3F + X"56", -- 0x40 + X"65", -- 0x41 + X"72", -- 0x42 + X"69", -- 0x43 + X"66", -- 0x44 + X"79", -- 0x45 + X"20", -- 0x46 + X"46", -- 0x47 + X"61", -- 0x48 + X"69", -- 0x49 + X"6C", -- 0x4A + X"65", -- 0x4B + X"64", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdr_tst_irom.vhdl b/projects/cpu/src/systest/sdr_tst_irom.vhdl new file mode 100644 index 0000000..e69de29 diff --git a/projects/cpu/src/systest/sdr_tst_irom_ld.vhdl b/projects/cpu/src/systest/sdr_tst_irom_ld.vhdl new file mode 100644 index 0000000..e69de29 diff --git a/projects/cpu/src/systest/sdr_tst_xrom.vhdl b/projects/cpu/src/systest/sdr_tst_xrom.vhdl new file mode 100644 index 0000000..e69de29 diff --git a/projects/cpu/src/systest/sdr_tst_xrom_ld.vhdl b/projects/cpu/src/systest/sdr_tst_xrom_ld.vhdl new file mode 100644 index 0000000..e69de29 diff --git a/projects/cpu/src/systest/sdram_config.vhd b/projects/cpu/src/systest/sdram_config.vhd new file mode 100644 index 0000000..bdb6f09 --- /dev/null +++ b/projects/cpu/src/systest/sdram_config.vhd @@ -0,0 +1,74 @@ +------------------------------------------------------------------------- +-- Project: SDRAM controller +-- This file: User SDRAM component adjustments +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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; + +package sdram_config is + + constant DDR_DATA_WIDTH : positive := 32; -- External DDR-SDRAM Module data bus width + constant DDR_ADDR_WIDTH : positive := 13; -- number of address lines to DDR-SDRAM Device/Module + constant DDR_BANK_WIDTH : positive := 2; -- Number of BANK address lines of external DDR-SDRAM + constant DDR_ROW_ADDR_WIDTH : positive := 13; -- + constant DDR_COL_ADDR_WIDTH : positive := 9; -- + + constant LMR_REG_BASE : natural := 0; + constant LMR_REG_EXTENDED : natural := 1; + constant LMR_OP_NORMAL : natural := 0; + constant LMR_OP_RES_DLL : natural := 2; + constant LMR_BT_SEQ : natural := 0; + constant LMR_BT_ILVD : natural := 1; + constant LMR_BL2 : natural := 1; + constant LMR_BL4 : natural := 2; + constant LMR_BL8 : natural := 3; + constant LMR_CL2 : natural := 2; + constant LMR_CL3 : natural := 3; + constant LMR_CL2_5 : natural := 6; + + -- DDR SDRAM Hardware defined constants + constant BIT_AUTO_PRE : positive := 10; -- bit-position in column address for auto precharge (see Data Sheet) + constant BIT_PRE_ALL : positive := 10; -- bit-position in column address for precharge all (see Data Sheet) + constant ENABLE_PRE_ALL : std_logic := '1'; + constant ENABLE_AUTO_PRE : std_logic := '0'; + + -- DDR-SDR TIMING constants ------------------------------------------------------------------ + -- After REFRESH_CLOCKS a refresh cycle is necessary, 64ms / 8192 = max every 7.8125 us refesh + constant REFRESH_INTERVAL : real := 7.8125; -- us + + -- These values are for your SDRAM part (see datasheet) + constant TCAS : positive := 2; -- CAS latency [clocks] + constant TRP : positive := 2; -- precharge command period + constant TRAS : positive := 5; -- active to precharge delay + constant TRFC : positive := 8; -- auto refresh command period + constant TMRD : positive := 2; -- load mode register command cylce time + constant TRCD : positive := 2; -- active to read or write delay ! + constant TWR : positive := 2; -- write recovery time + + constant PWR_UP_WAIT : natural := 220; -- µs + + subtype user_tag_t is unsigned(3 downto 0); + + ---------------------------------------------------------------------------------------------- + +end sdram_config; diff --git a/projects/cpu/src/systest/sdram_test_irom.vhdl b/projects/cpu/src/systest/sdram_test_irom.vhdl new file mode 100644 index 0000000..6026283 --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_irom.vhdl @@ -0,0 +1,575 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 sdram_test OF irom IS + + type imem_rom_t is array (0 to 513) of inst_t; + + -- Assembled from sdram_test.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"007", -- 0x000: JMP 0x007 + "111100" & X"000", -- 0x001: PUSH R00 + "101000" & X"040", -- 0x002: XIN R00, (0x04) + "011011" & X"100", -- 0x003: OR R00, 0x10 + "100100" & X"040", -- 0x004: XOUT (0x04), R00 + "111101" & X"000", -- 0x005: POP R00 + "111111" & X"000", -- 0x006: RETI + "111011" & X"128", -- 0x007: CALL 0x128 + "000011" & X"000", -- 0x008: MOV R00, 0x00 + "100100" & X"010", -- 0x009: XOUT (0x01), R00 + "000011" & X"040", -- 0x00A: MOV R00, 0x04 + "100100" & X"040", -- 0x00B: XOUT (0x04), R00 + "101001" & X"030", -- 0x00C: CIN R00, (0x03) + "011011" & X"050", -- 0x00D: OR R00, 0x05 + "100110" & X"030", -- 0x00E: COUT (0x03), R00 + "000011" & X"010", -- 0x00F: MOV R00, 0x01 + "111011" & X"145", -- 0x010: CALL 0x145 + "000011" & X"000", -- 0x011: MOV R00, 0x00 + "000011" & X"C01", -- 0x012: MOV R01, 0xC0 + "100100" & X"101", -- 0x013: XOUT (0x10), R01 + "100100" & X"111", -- 0x014: XOUT (0x11), R01 + "100100" & X"121", -- 0x015: XOUT (0x12), R01 + "111011" & X"1B9", -- 0x016: CALL 0x1B9 + "111011" & X"19E", -- 0x017: CALL 0x19E + "000011" & X"031", -- 0x018: MOV R01, 0x03 + "111011" & X"14A", -- 0x019: CALL 0x14A + "000011" & X"031", -- 0x01A: MOV R01, 0x03 + "111011" & X"1AA", -- 0x01B: CALL 0x1AA + "000011" & X"001", -- 0x01C: MOV R01, 0x00 + "111011" & X"1B6", -- 0x01D: CALL 0x1B6 + "101000" & X"040", -- 0x01E: XIN R00, (0x04) + "011011" & X"100", -- 0x01F: OR R00, 0x10 + "100100" & X"040", -- 0x020: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x021: CALL 0x1C6 + "011011" & X"200", -- 0x022: OR R00, 0x20 + "100100" & X"040", -- 0x023: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x024: CALL 0x1C6 + "011001" & X"EF0", -- 0x025: AND R00, 0xEF + "100100" & X"040", -- 0x026: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x027: CALL 0x1C6 + "011001" & X"CF0", -- 0x028: AND R00, 0xCF + "100100" & X"040", -- 0x029: XOUT (0x04), R00 + "000011" & X"010", -- 0x02A: MOV R00, 0x01 + "111011" & X"145", -- 0x02B: CALL 0x145 + "000011" & X"0E1", -- 0x02C: MOV R01, 0x0E + "111011" & X"14A", -- 0x02D: CALL 0x14A + "000011" & X"0E1", -- 0x02E: MOV R01, 0x0E + "111011" & X"1B3", -- 0x02F: CALL 0x1B3 + "000011" & X"001", -- 0x030: MOV R01, 0x00 + "111011" & X"1B6", -- 0x031: CALL 0x1B6 + "111011" & X"0CC", -- 0x032: CALL 0x0CC + "000011" & X"800", -- 0x033: MOV R00, 0x80 + "000011" & X"08F", -- 0x034: MOV R15, 0x08 + "000111" & X"000", -- 0x035: MOVX (R00), 0x00 + "010001" & X"010", -- 0x036: INC R00 + "010101" & X"01F", -- 0x037: DEC R15 + "110010" & X"035", -- 0x038: JNZ 0x035 + "101000" & X"0A0", -- 0x039: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x03A: CMP R00, 0xFF + "111001" & X"04B", -- 0x03B: JEQ 0x04B + "000011" & X"082", -- 0x03C: MOV R02, 0x08 + "101000" & X"070", -- 0x03D: XIN R00, (0x07) + "100100" & X"010", -- 0x03E: XOUT (0x01), R00 + "011001" & X"040", -- 0x03F: AND R00, 0x04 + "110010" & X"03D", -- 0x040: JNZ 0x03D + "000011" & X"100", -- 0x041: MOV R00, 0x10 + "100100" & X"070", -- 0x042: XOUT (0x07), R00 + "010101" & X"022", -- 0x043: SUB R02, 0x02 + "110010" & X"03D", -- 0x044: JNZ 0x03D + "111011" & X"0AB", -- 0x045: CALL 0x0AB + "000011" & X"060", -- 0x046: MOV R00, 0x06 + "100100" & X"070", -- 0x047: XOUT (0x07), R00 + "000011" & X"080", -- 0x048: MOV R00, 0x08 + "111011" & X"0D3", -- 0x049: CALL 0x0D3 + "110000" & X"039", -- 0x04A: JMP 0x039 + "111011" & X"0E3", -- 0x04B: CALL 0x0E3 + "111011" & X"1BF", -- 0x04C: CALL 0x1BF + "110000" & X"04E", -- 0x04D: JMP 0x04E + "000011" & X"010", -- 0x04E: MOV R00, 0x01 + "111011" & X"145", -- 0x04F: CALL 0x145 + "000011" & X"1D1", -- 0x050: MOV R01, 0x1D + "111011" & X"14A", -- 0x051: CALL 0x14A + "000011" & X"1D1", -- 0x052: MOV R01, 0x1D + "111011" & X"1B3", -- 0x053: CALL 0x1B3 + "000011" & X"001", -- 0x054: MOV R01, 0x00 + "111011" & X"1B6", -- 0x055: CALL 0x1B6 + "111011" & X"0CC", -- 0x056: CALL 0x0CC + "000011" & X"000", -- 0x057: MOV R00, 0x00 + "001101" & X"000", -- 0x058: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x059: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x05A: CMP R00, 0xFF + "111001" & X"076", -- 0x05B: JEQ 0x076 + "000011" & X"082", -- 0x05C: MOV R02, 0x08 + "001010" & X"001", -- 0x05D: MOVC R01, (0x00) + "000011" & X"800", -- 0x05E: MOV R00, 0x80 + "000011" & X"08F", -- 0x05F: MOV R15, 0x08 + "000110" & X"001", -- 0x060: MOVX (R01), R00 + "010001" & X"010", -- 0x061: INC R00 + "010001" & X"011", -- 0x062: INC R01 + "010101" & X"01F", -- 0x063: DEC R15 + "110010" & X"060", -- 0x064: JNZ 0x060 + "101000" & X"070", -- 0x065: XIN R00, (0x07) + "100100" & X"010", -- 0x066: XOUT (0x01), R00 + "011001" & X"040", -- 0x067: AND R00, 0x04 + "110010" & X"065", -- 0x068: JNZ 0x065 + "000011" & X"100", -- 0x069: MOV R00, 0x10 + "100100" & X"070", -- 0x06A: XOUT (0x07), R00 + "001010" & X"000", -- 0x06B: MOVC R00, (0x00) + "010001" & X"010", -- 0x06C: INC R00 + "001101" & X"000", -- 0x06D: MOVC (0x00), R00 + "010101" & X"022", -- 0x06E: SUB R02, 0x02 + "110010" & X"05D", -- 0x06F: JNZ 0x05D + "111011" & X"0AB", -- 0x070: CALL 0x0AB + "000011" & X"060", -- 0x071: MOV R00, 0x06 + "100100" & X"070", -- 0x072: XOUT (0x07), R00 + "000011" & X"080", -- 0x073: MOV R00, 0x08 + "111011" & X"0D3", -- 0x074: CALL 0x0D3 + "110000" & X"059", -- 0x075: JMP 0x059 + "111011" & X"0E3", -- 0x076: CALL 0x0E3 + "111011" & X"1BF", -- 0x077: CALL 0x1BF + "000011" & X"010", -- 0x078: MOV R00, 0x01 + "111011" & X"145", -- 0x079: CALL 0x145 + "000011" & X"2B1", -- 0x07A: MOV R01, 0x2B + "111011" & X"14A", -- 0x07B: CALL 0x14A + "000011" & X"2B1", -- 0x07C: MOV R01, 0x2B + "111011" & X"1B3", -- 0x07D: CALL 0x1B3 + "000011" & X"001", -- 0x07E: MOV R01, 0x00 + "111011" & X"1B6", -- 0x07F: CALL 0x1B6 + "111011" & X"0CC", -- 0x080: CALL 0x0CC + "000011" & X"000", -- 0x081: MOV R00, 0x00 + "001101" & X"000", -- 0x082: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x083: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x084: CMP R00, 0xFF + "111001" & X"0B3", -- 0x085: JEQ 0x0B3 + "111011" & X"0AB", -- 0x086: CALL 0x0AB + "000011" & X"050", -- 0x087: MOV R00, 0x05 + "100100" & X"070", -- 0x088: XOUT (0x07), R00 + "000011" & X"083", -- 0x089: MOV R03, 0x08 + "101000" & X"070", -- 0x08A: XIN R00, (0x07) + "100100" & X"010", -- 0x08B: XOUT (0x01), R00 + "011001" & X"200", -- 0x08C: AND R00, 0x20 + "110010" & X"08A", -- 0x08D: JNZ 0x08A + "001010" & X"001", -- 0x08E: MOVC R01, (0x00) + "000011" & X"800", -- 0x08F: MOV R00, 0x80 + "000011" & X"08F", -- 0x090: MOV R15, 0x08 + "000100" & X"002", -- 0x091: MOVX R02, (R00) + "001110" & X"012", -- 0x092: CMP R02, R01 + "111010" & X"0BF", -- 0x093: JNE 0x0BF + "010001" & X"010", -- 0x094: INC R00 + "010001" & X"011", -- 0x095: INC R01 + "010101" & X"01F", -- 0x096: DEC R15 + "110010" & X"091", -- 0x097: JNZ 0x091 + "000011" & X"200", -- 0x098: MOV R00, 0x20 + "100100" & X"070", -- 0x099: XOUT (0x07), R00 + "001010" & X"000", -- 0x09A: MOVC R00, (0x00) + "010001" & X"010", -- 0x09B: INC R00 + "001101" & X"000", -- 0x09C: MOVC (0x00), R00 + "010101" & X"023", -- 0x09D: SUB R03, 0x02 + "110010" & X"08A", -- 0x09E: JNZ 0x08A + "000011" & X"080", -- 0x09F: MOV R00, 0x08 + "111011" & X"0D3", -- 0x0A0: CALL 0x0D3 + "110000" & X"083", -- 0x0A1: JMP 0x083 + "111100" & X"000", -- 0x0A2: PUSH R00 + "000011" & X"800", -- 0x0A3: MOV R00, 0x80 + "100100" & X"070", -- 0x0A4: XOUT (0x07), R00 + "101000" & X"070", -- 0x0A5: XIN R00, (0x07) + "100100" & X"010", -- 0x0A6: XOUT (0x01), R00 + "011001" & X"800", -- 0x0A7: AND R00, 0x80 + "110001" & X"0A5", -- 0x0A8: JZ 0x0A5 + "111101" & X"000", -- 0x0A9: POP R00 + "111110" & X"000", -- 0x0AA: RET + "111011" & X"0A2", -- 0x0AB: CALL 0x0A2 + "111100" & X"000", -- 0x0AC: PUSH R00 + "101000" & X"070", -- 0x0AD: XIN R00, (0x07) + "100100" & X"010", -- 0x0AE: XOUT (0x01), R00 + "011001" & X"010", -- 0x0AF: AND R00, 0x01 + "110010" & X"0AD", -- 0x0B0: JNZ 0x0AD + "111101" & X"000", -- 0x0B1: POP R00 + "111110" & X"000", -- 0x0B2: RET + "000011" & X"010", -- 0x0B3: MOV R00, 0x01 + "111011" & X"145", -- 0x0B4: CALL 0x145 + "000011" & X"391", -- 0x0B5: MOV R01, 0x39 + "111011" & X"14A", -- 0x0B6: CALL 0x14A + "000011" & X"C00", -- 0x0B7: MOV R00, 0xC0 + "111011" & X"145", -- 0x0B8: CALL 0x145 + "111011" & X"0EE", -- 0x0B9: CALL 0x0EE + "000011" & X"391", -- 0x0BA: MOV R01, 0x39 + "111011" & X"1B3", -- 0x0BB: CALL 0x1B3 + "000011" & X"001", -- 0x0BC: MOV R01, 0x00 + "111011" & X"1B6", -- 0x0BD: CALL 0x1B6 + "110000" & X"0CA", -- 0x0BE: JMP 0x0CA + "000011" & X"010", -- 0x0BF: MOV R00, 0x01 + "111011" & X"145", -- 0x0C0: CALL 0x145 + "000011" & X"431", -- 0x0C1: MOV R01, 0x43 + "111011" & X"14A", -- 0x0C2: CALL 0x14A + "111011" & X"0EE", -- 0x0C3: CALL 0x0EE + "111011" & X"106", -- 0x0C4: CALL 0x106 + "000011" & X"431", -- 0x0C5: MOV R01, 0x43 + "111011" & X"1B3", -- 0x0C6: CALL 0x1B3 + "000011" & X"001", -- 0x0C7: MOV R01, 0x00 + "111011" & X"1B6", -- 0x0C8: CALL 0x1B6 + "110000" & X"0CA", -- 0x0C9: JMP 0x0CA + "111011" & X"1BF", -- 0x0CA: CALL 0x1BF + "110000" & X"02A", -- 0x0CB: JMP 0x02A + "111100" & X"000", -- 0x0CC: PUSH R00 + "000011" & X"000", -- 0x0CD: MOV R00, 0x00 + "100100" & X"080", -- 0x0CE: XOUT (0x08), R00 + "100100" & X"090", -- 0x0CF: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x0D0: XOUT (0x0A), R00 + "111101" & X"000", -- 0x0D1: POP R00 + "111110" & X"000", -- 0x0D2: RET + "111100" & X"001", -- 0x0D3: PUSH R01 + "111100" & X"002", -- 0x0D4: PUSH R02 + "111100" & X"003", -- 0x0D5: PUSH R03 + "101000" & X"081", -- 0x0D6: XIN R01, (0x08) + "101000" & X"092", -- 0x0D7: XIN R02, (0x09) + "101000" & X"0A3", -- 0x0D8: XIN R03, (0x0A) + "010000" & X"001", -- 0x0D9: ADD R01, R00 + "010011" & X"002", -- 0x0DA: ADDC R02, 0x00 + "010011" & X"003", -- 0x0DB: ADDC R03, 0x00 + "100100" & X"081", -- 0x0DC: XOUT (0x08), R01 + "100100" & X"092", -- 0x0DD: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x0DE: XOUT (0x0A), R03 + "111101" & X"003", -- 0x0DF: POP R03 + "111101" & X"002", -- 0x0E0: POP R02 + "111101" & X"001", -- 0x0E1: POP R01 + "111110" & X"000", -- 0x0E2: RET + "000011" & X"C00", -- 0x0E3: MOV R00, 0xC0 + "111011" & X"145", -- 0x0E4: CALL 0x145 + "111011" & X"0EE", -- 0x0E5: CALL 0x0EE + "111110" & X"000", -- 0x0E6: RET + "111100" & X"001", -- 0x0E7: PUSH R01 + "111011" & X"121", -- 0x0E8: CALL 0x121 + "111011" & X"15C", -- 0x0E9: CALL 0x15C + "000010" & X"010", -- 0x0EA: MOV R00, R01 + "111011" & X"15C", -- 0x0EB: CALL 0x15C + "111101" & X"001", -- 0x0EC: POP R01 + "111110" & X"000", -- 0x0ED: RET + "111100" & X"000", -- 0x0EE: PUSH R00 + "101000" & X"0A0", -- 0x0EF: XIN R00, (0x0A) + "111011" & X"0E7", -- 0x0F0: CALL 0x0E7 + "101000" & X"090", -- 0x0F1: XIN R00, (0x09) + "111011" & X"0E7", -- 0x0F2: CALL 0x0E7 + "101000" & X"080", -- 0x0F3: XIN R00, (0x08) + "111011" & X"0E7", -- 0x0F4: CALL 0x0E7 + "111101" & X"000", -- 0x0F5: POP R00 + "111110" & X"000", -- 0x0F6: RET + "111100" & X"000", -- 0x0F7: PUSH R00 + "010001" & X"031", -- 0x0F8: ADD R01, 0x03 + "001001" & X"010", -- 0x0F9: MOVC R00, (R01) + "111011" & X"0E7", -- 0x0FA: CALL 0x0E7 + "010101" & X"011", -- 0x0FB: DEC R01 + "001001" & X"010", -- 0x0FC: MOVC R00, (R01) + "111011" & X"0E7", -- 0x0FD: CALL 0x0E7 + "010101" & X"011", -- 0x0FE: DEC R01 + "001001" & X"010", -- 0x0FF: MOVC R00, (R01) + "111011" & X"0E7", -- 0x100: CALL 0x0E7 + "010101" & X"011", -- 0x101: DEC R01 + "001001" & X"010", -- 0x102: MOVC R00, (R01) + "111011" & X"0E7", -- 0x103: CALL 0x0E7 + "111101" & X"000", -- 0x104: POP R00 + "111110" & X"000", -- 0x105: RET + "111100" & X"000", -- 0x106: PUSH R00 + "000011" & X"C00", -- 0x107: MOV R00, 0xC0 + "111011" & X"145", -- 0x108: CALL 0x145 + "000101" & X"870", -- 0x109: MOVX R00, (0x87) + "111011" & X"0E7", -- 0x10A: CALL 0x0E7 + "000101" & X"860", -- 0x10B: MOVX R00, (0x86) + "111011" & X"0E7", -- 0x10C: CALL 0x0E7 + "000101" & X"850", -- 0x10D: MOVX R00, (0x85) + "111011" & X"0E7", -- 0x10E: CALL 0x0E7 + "000101" & X"840", -- 0x10F: MOVX R00, (0x84) + "111011" & X"0E7", -- 0x110: CALL 0x0E7 + "000101" & X"830", -- 0x111: MOVX R00, (0x83) + "111011" & X"0E7", -- 0x112: CALL 0x0E7 + "000101" & X"820", -- 0x113: MOVX R00, (0x82) + "111011" & X"0E7", -- 0x114: CALL 0x0E7 + "000101" & X"810", -- 0x115: MOVX R00, (0x81) + "111011" & X"0E7", -- 0x116: CALL 0x0E7 + "000101" & X"800", -- 0x117: MOVX R00, (0x80) + "111011" & X"0E7", -- 0x118: CALL 0x0E7 + "111101" & X"000", -- 0x119: POP R00 + "111110" & X"000", -- 0x11A: RET + "011001" & X"0F0", -- 0x11B: AND R00, 0x0F + "001111" & X"0A0", -- 0x11C: CMP R00, 0x0A + "110101" & X"11F", -- 0x11D: JLT 0x11F + "010001" & X"070", -- 0x11E: ADD R00, 0x07 + "010001" & X"300", -- 0x11F: ADD R00, 0x30 + "111110" & X"000", -- 0x120: RET + "111100" & X"000", -- 0x121: PUSH R00 + "111011" & X"11B", -- 0x122: CALL 0x11B + "000010" & X"001", -- 0x123: MOV R01, R00 + "111101" & X"000", -- 0x124: POP R00 + "101010" & X"000", -- 0x125: SWAP R00 + "111011" & X"11B", -- 0x126: CALL 0x11B + "111110" & X"000", -- 0x127: RET + "000011" & X"002", -- 0x128: MOV R02, 0x00 + "000011" & X"030", -- 0x129: MOV R00, 0x03 + "111011" & X"174", -- 0x12A: CALL 0x174 + "111011" & X"1CD", -- 0x12B: CALL 0x1CD + "000011" & X"002", -- 0x12C: MOV R02, 0x00 + "000011" & X"030", -- 0x12D: MOV R00, 0x03 + "111011" & X"174", -- 0x12E: CALL 0x174 + "111011" & X"1CD", -- 0x12F: CALL 0x1CD + "000011" & X"002", -- 0x130: MOV R02, 0x00 + "000011" & X"020", -- 0x131: MOV R00, 0x02 + "111011" & X"174", -- 0x132: CALL 0x174 + "111011" & X"1D4", -- 0x133: CALL 0x1D4 + "000011" & X"280", -- 0x134: MOV R00, 0x28 + "111011" & X"145", -- 0x135: CALL 0x145 + "000011" & X"0C0", -- 0x136: MOV R00, 0x0C + "111011" & X"145", -- 0x137: CALL 0x145 + "000011" & X"060", -- 0x138: MOV R00, 0x06 + "111011" & X"145", -- 0x139: CALL 0x145 + "000011" & X"010", -- 0x13A: MOV R00, 0x01 + "111011" & X"145", -- 0x13B: CALL 0x145 + "111110" & X"000", -- 0x13C: RET + "111100" & X"000", -- 0x13D: PUSH R00 + "111011" & X"168", -- 0x13E: CALL 0x168 + "011001" & X"800", -- 0x13F: AND R00, 0x80 + "110001" & X"143", -- 0x140: JZ 0x143 + "111011" & X"1EB", -- 0x141: CALL 0x1EB + "110000" & X"13E", -- 0x142: JMP 0x13E + "111101" & X"000", -- 0x143: POP R00 + "111110" & X"000", -- 0x144: RET + "111100" & X"002", -- 0x145: PUSH R02 + "000011" & X"002", -- 0x146: MOV R02, 0x00 + "111011" & X"161", -- 0x147: CALL 0x161 + "111101" & X"002", -- 0x148: POP R02 + "111110" & X"000", -- 0x149: RET + "111100" & X"000", -- 0x14A: PUSH R00 + "000100" & X"010", -- 0x14B: MOVX R00, (R01) + "010001" & X"011", -- 0x14C: INC R01 + "001111" & X"000", -- 0x14D: TST R00 + "110001" & X"151", -- 0x14E: JZ 0x151 + "111011" & X"15C", -- 0x14F: CALL 0x15C + "110000" & X"14B", -- 0x150: JMP 0x14B + "111101" & X"000", -- 0x151: POP R00 + "111110" & X"000", -- 0x152: RET + "111100" & X"000", -- 0x153: PUSH R00 + "001001" & X"010", -- 0x154: MOVC R00, (R01) + "010001" & X"011", -- 0x155: INC R01 + "001111" & X"000", -- 0x156: TST R00 + "110001" & X"15A", -- 0x157: JZ 0x15A + "111011" & X"15C", -- 0x158: CALL 0x15C + "110000" & X"154", -- 0x159: JMP 0x154 + "111101" & X"000", -- 0x15A: POP R00 + "111110" & X"000", -- 0x15B: RET + "111100" & X"002", -- 0x15C: PUSH R02 + "000011" & X"402", -- 0x15D: MOV R02, 0x40 + "111011" & X"161", -- 0x15E: CALL 0x161 + "111101" & X"002", -- 0x15F: POP R02 + "111110" & X"000", -- 0x160: RET + "111011" & X"13D", -- 0x161: CALL 0x13D + "111100" & X"000", -- 0x162: PUSH R00 + "101010" & X"000", -- 0x163: SWAP R00 + "111011" & X"174", -- 0x164: CALL 0x174 + "111101" & X"000", -- 0x165: POP R00 + "111011" & X"174", -- 0x166: CALL 0x174 + "111110" & X"000", -- 0x167: RET + "111100" & X"002", -- 0x168: PUSH R02 + "000011" & X"002", -- 0x169: MOV R02, 0x00 + "111011" & X"16D", -- 0x16A: CALL 0x16D + "111101" & X"002", -- 0x16B: POP R02 + "111110" & X"000", -- 0x16C: RET + "111011" & X"187", -- 0x16D: CALL 0x187 + "101010" & X"000", -- 0x16E: SWAP R00 + "111100" & X"000", -- 0x16F: PUSH R00 + "111011" & X"187", -- 0x170: CALL 0x187 + "111101" & X"002", -- 0x171: POP R02 + "011010" & X"020", -- 0x172: OR R00, R02 + "111110" & X"000", -- 0x173: RET + "111100" & X"001", -- 0x174: PUSH R01 + "011001" & X"0F0", -- 0x175: AND R00, 0x0F + "000010" & X"001", -- 0x176: MOV R01, R00 + "011010" & X"021", -- 0x177: OR R01, R02 + "100100" & X"031", -- 0x178: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x179: CALL 0x1EB + "000010" & X"001", -- 0x17A: MOV R01, R00 + "011010" & X"021", -- 0x17B: OR R01, R02 + "011011" & X"801", -- 0x17C: OR R01, 0x80 + "100100" & X"031", -- 0x17D: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x17E: CALL 0x1EB + "000010" & X"001", -- 0x17F: MOV R01, R00 + "011010" & X"021", -- 0x180: OR R01, R02 + "100100" & X"031", -- 0x181: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x182: CALL 0x1EB + "011011" & X"201", -- 0x183: OR R01, 0x20 + "100100" & X"031", -- 0x184: XOUT (0x03), R01 + "111101" & X"001", -- 0x185: POP R01 + "111110" & X"000", -- 0x186: RET + "111100" & X"001", -- 0x187: PUSH R01 + "000011" & X"201", -- 0x188: MOV R01, 0x20 + "011010" & X"021", -- 0x189: OR R01, R02 + "100100" & X"031", -- 0x18A: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x18B: CALL 0x1EB + "000011" & X"201", -- 0x18C: MOV R01, 0x20 + "011010" & X"021", -- 0x18D: OR R01, R02 + "011011" & X"801", -- 0x18E: OR R01, 0x80 + "100100" & X"031", -- 0x18F: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x190: CALL 0x1EB + "101000" & X"030", -- 0x191: XIN R00, (0x03) + "011001" & X"0F0", -- 0x192: AND R00, 0x0F + "000011" & X"201", -- 0x193: MOV R01, 0x20 + "011010" & X"021", -- 0x194: OR R01, R02 + "100100" & X"031", -- 0x195: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x196: CALL 0x1EB + "111101" & X"001", -- 0x197: POP R01 + "111110" & X"000", -- 0x198: RET + "111100" & X"000", -- 0x199: PUSH R00 + "000011" & X"020", -- 0x19A: MOV R00, 0x02 + "100100" & X"0E0", -- 0x19B: XOUT (0x0E), R00 + "111101" & X"000", -- 0x19C: POP R00 + "111110" & X"000", -- 0x19D: RET + "111100" & X"000", -- 0x19E: PUSH R00 + "000011" & X"010", -- 0x19F: MOV R00, 0x01 + "100100" & X"0E0", -- 0x1A0: XOUT (0x0E), R00 + "111101" & X"000", -- 0x1A1: POP R00 + "111110" & X"000", -- 0x1A2: RET + "111011" & X"1B9", -- 0x1A3: CALL 0x1B9 + "100100" & X"0C1", -- 0x1A4: XOUT (0x0C), R01 + "100100" & X"0B0", -- 0x1A5: XOUT (0x0B), R00 + "111110" & X"000", -- 0x1A6: RET + "111011" & X"1B9", -- 0x1A7: CALL 0x1B9 + "100100" & X"0D0", -- 0x1A8: XOUT (0x0D), R00 + "111110" & X"000", -- 0x1A9: RET + "111100" & X"000", -- 0x1AA: PUSH R00 + "000100" & X"010", -- 0x1AB: MOVX R00, (R01) + "010001" & X"011", -- 0x1AC: INC R01 + "001111" & X"000", -- 0x1AD: TST R00 + "110001" & X"1B1", -- 0x1AE: JZ 0x1B1 + "111011" & X"1A7", -- 0x1AF: CALL 0x1A7 + "110000" & X"1AB", -- 0x1B0: JMP 0x1AB + "111101" & X"000", -- 0x1B1: POP R00 + "111110" & X"000", -- 0x1B2: RET + "111011" & X"199", -- 0x1B3: CALL 0x199 + "111011" & X"1AA", -- 0x1B4: CALL 0x1AA + "111110" & X"000", -- 0x1B5: RET + "111011" & X"1AA", -- 0x1B6: CALL 0x1AA + "111011" & X"199", -- 0x1B7: CALL 0x199 + "111110" & X"000", -- 0x1B8: RET + "111100" & X"000", -- 0x1B9: PUSH R00 + "101000" & X"0E0", -- 0x1BA: XIN R00, (0x0E) + "011001" & X"020", -- 0x1BB: AND R00, 0x02 + "110001" & X"1BA", -- 0x1BC: JZ 0x1BA + "111101" & X"000", -- 0x1BD: POP R00 + "111110" & X"000", -- 0x1BE: RET + "111100" & X"00F", -- 0x1BF: PUSH R15 + "000011" & X"0AF", -- 0x1C0: MOV R15, 0x0A + "111011" & X"1C6", -- 0x1C1: CALL 0x1C6 + "010101" & X"01F", -- 0x1C2: DEC R15 + "110010" & X"1C1", -- 0x1C3: JNZ 0x1C1 + "111101" & X"00F", -- 0x1C4: POP R15 + "111110" & X"000", -- 0x1C5: RET + "111100" & X"00F", -- 0x1C6: PUSH R15 + "000011" & X"0AF", -- 0x1C7: MOV R15, 0x0A + "111011" & X"1CD", -- 0x1C8: CALL 0x1CD + "010101" & X"01F", -- 0x1C9: DEC R15 + "110010" & X"1C8", -- 0x1CA: JNZ 0x1C8 + "111101" & X"00F", -- 0x1CB: POP R15 + "111110" & X"000", -- 0x1CC: RET + "111100" & X"00F", -- 0x1CD: PUSH R15 + "000011" & X"0AF", -- 0x1CE: MOV R15, 0x0A + "111011" & X"1D4", -- 0x1CF: CALL 0x1D4 + "010101" & X"01F", -- 0x1D0: DEC R15 + "110010" & X"1CF", -- 0x1D1: JNZ 0x1CF + "111101" & X"00F", -- 0x1D2: POP R15 + "111110" & X"000", -- 0x1D3: RET + "111100" & X"00F", -- 0x1D4: PUSH R15 + "000011" & X"0AF", -- 0x1D5: MOV R15, 0x0A + "111011" & X"1DB", -- 0x1D6: CALL 0x1DB + "010101" & X"01F", -- 0x1D7: DEC R15 + "110010" & X"1D6", -- 0x1D8: JNZ 0x1D6 + "111101" & X"00F", -- 0x1D9: POP R15 + "111110" & X"000", -- 0x1DA: RET + "111100" & X"00F", -- 0x1DB: PUSH R15 + "000011" & X"0AF", -- 0x1DC: MOV R15, 0x0A + "111011" & X"1E2", -- 0x1DD: CALL 0x1E2 + "010101" & X"01F", -- 0x1DE: DEC R15 + "110010" & X"1DD", -- 0x1DF: JNZ 0x1DD + "111101" & X"00F", -- 0x1E0: POP R15 + "111110" & X"000", -- 0x1E1: RET + "111100" & X"00F", -- 0x1E2: PUSH R15 + "000011" & X"63F", -- 0x1E3: MOV R15, 0x63 + "000000" & X"000", -- 0x1E4: NOP + "000000" & X"000", -- 0x1E5: NOP + "000000" & X"000", -- 0x1E6: NOP + "010101" & X"01F", -- 0x1E7: DEC R15 + "110010" & X"1E4", -- 0x1E8: JNZ 0x1E4 + "111101" & X"00F", -- 0x1E9: POP R15 + "111110" & X"000", -- 0x1EA: RET + "111100" & X"00F", -- 0x1EB: PUSH R15 + "000011" & X"09F", -- 0x1EC: MOV R15, 0x09 + "000000" & X"000", -- 0x1ED: NOP + "000000" & X"000", -- 0x1EE: NOP + "000000" & X"000", -- 0x1EF: NOP + "010101" & X"01F", -- 0x1F0: DEC R15 + "110010" & X"1ED", -- 0x1F1: JNZ 0x1ED + "111101" & X"00F", -- 0x1F2: POP R15 + "111110" & X"000", -- 0x1F3: RET + "111100" & X"001", -- 0x1F4: PUSH R01 + "101000" & X"061", -- 0x1F5: XIN R01, (0x06) + "011001" & X"021", -- 0x1F6: AND R01, 0x02 + "110010" & X"1F5", -- 0x1F7: JNZ 0x1F5 + "100100" & X"020", -- 0x1F8: XOUT (0x02), R00 + "111101" & X"001", -- 0x1F9: POP R01 + "111110" & X"000", -- 0x1FA: RET + "111100" & X"001", -- 0x1FB: PUSH R01 + "101000" & X"061", -- 0x1FC: XIN R01, (0x06) + "011001" & X"101", -- 0x1FD: AND R01, 0x10 + "110001" & X"1FC", -- 0x1FE: JZ 0x1FC + "101000" & X"020", -- 0x1FF: XIN R00, (0x02) + "111101" & X"001", -- 0x200: POP R01 + "111110" & X"000" -- 0x201: 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 sdram_test; + diff --git a/projects/cpu/src/systest/sdram_test_irom_ld.vhdl b/projects/cpu/src/systest/sdram_test_irom_ld.vhdl new file mode 100644 index 0000000..891cd27 --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdram_test.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"007", -- 0x000: JMP 0x007 + "111100" & X"000", -- 0x001: PUSH R00 + "101000" & X"040", -- 0x002: XIN R00, (0x04) + "011011" & X"100", -- 0x003: OR R00, 0x10 + "100100" & X"040", -- 0x004: XOUT (0x04), R00 + "111101" & X"000", -- 0x005: POP R00 + "111111" & X"000", -- 0x006: RETI + "111011" & X"128", -- 0x007: CALL 0x128 + "000011" & X"000", -- 0x008: MOV R00, 0x00 + "100100" & X"010", -- 0x009: XOUT (0x01), R00 + "000011" & X"040", -- 0x00A: MOV R00, 0x04 + "100100" & X"040", -- 0x00B: XOUT (0x04), R00 + "101001" & X"030", -- 0x00C: CIN R00, (0x03) + "011011" & X"050", -- 0x00D: OR R00, 0x05 + "100110" & X"030", -- 0x00E: COUT (0x03), R00 + "000011" & X"010", -- 0x00F: MOV R00, 0x01 + "111011" & X"145", -- 0x010: CALL 0x145 + "000011" & X"000", -- 0x011: MOV R00, 0x00 + "000011" & X"C01", -- 0x012: MOV R01, 0xC0 + "100100" & X"101", -- 0x013: XOUT (0x10), R01 + "100100" & X"111", -- 0x014: XOUT (0x11), R01 + "100100" & X"121", -- 0x015: XOUT (0x12), R01 + "111011" & X"1B9", -- 0x016: CALL 0x1B9 + "111011" & X"19E", -- 0x017: CALL 0x19E + "000011" & X"031", -- 0x018: MOV R01, 0x03 + "111011" & X"14A", -- 0x019: CALL 0x14A + "000011" & X"031", -- 0x01A: MOV R01, 0x03 + "111011" & X"1AA", -- 0x01B: CALL 0x1AA + "000011" & X"001", -- 0x01C: MOV R01, 0x00 + "111011" & X"1B6", -- 0x01D: CALL 0x1B6 + "101000" & X"040", -- 0x01E: XIN R00, (0x04) + "011011" & X"100", -- 0x01F: OR R00, 0x10 + "100100" & X"040", -- 0x020: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x021: CALL 0x1C6 + "011011" & X"200", -- 0x022: OR R00, 0x20 + "100100" & X"040", -- 0x023: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x024: CALL 0x1C6 + "011001" & X"EF0", -- 0x025: AND R00, 0xEF + "100100" & X"040", -- 0x026: XOUT (0x04), R00 + "111011" & X"1C6", -- 0x027: CALL 0x1C6 + "011001" & X"CF0", -- 0x028: AND R00, 0xCF + "100100" & X"040", -- 0x029: XOUT (0x04), R00 + "000011" & X"010", -- 0x02A: MOV R00, 0x01 + "111011" & X"145", -- 0x02B: CALL 0x145 + "000011" & X"0E1", -- 0x02C: MOV R01, 0x0E + "111011" & X"14A", -- 0x02D: CALL 0x14A + "000011" & X"0E1", -- 0x02E: MOV R01, 0x0E + "111011" & X"1B3", -- 0x02F: CALL 0x1B3 + "000011" & X"001", -- 0x030: MOV R01, 0x00 + "111011" & X"1B6", -- 0x031: CALL 0x1B6 + "111011" & X"0CC", -- 0x032: CALL 0x0CC + "000011" & X"800", -- 0x033: MOV R00, 0x80 + "000011" & X"08F", -- 0x034: MOV R15, 0x08 + "000111" & X"000", -- 0x035: MOVX (R00), 0x00 + "010001" & X"010", -- 0x036: INC R00 + "010101" & X"01F", -- 0x037: DEC R15 + "110010" & X"035", -- 0x038: JNZ 0x035 + "101000" & X"0A0", -- 0x039: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x03A: CMP R00, 0xFF + "111001" & X"04B", -- 0x03B: JEQ 0x04B + "000011" & X"082", -- 0x03C: MOV R02, 0x08 + "101000" & X"070", -- 0x03D: XIN R00, (0x07) + "100100" & X"010", -- 0x03E: XOUT (0x01), R00 + "011001" & X"040", -- 0x03F: AND R00, 0x04 + "110010" & X"03D", -- 0x040: JNZ 0x03D + "000011" & X"100", -- 0x041: MOV R00, 0x10 + "100100" & X"070", -- 0x042: XOUT (0x07), R00 + "010101" & X"022", -- 0x043: SUB R02, 0x02 + "110010" & X"03D", -- 0x044: JNZ 0x03D + "111011" & X"0AB", -- 0x045: CALL 0x0AB + "000011" & X"060", -- 0x046: MOV R00, 0x06 + "100100" & X"070", -- 0x047: XOUT (0x07), R00 + "000011" & X"080", -- 0x048: MOV R00, 0x08 + "111011" & X"0D3", -- 0x049: CALL 0x0D3 + "110000" & X"039", -- 0x04A: JMP 0x039 + "111011" & X"0E3", -- 0x04B: CALL 0x0E3 + "111011" & X"1BF", -- 0x04C: CALL 0x1BF + "110000" & X"04E", -- 0x04D: JMP 0x04E + "000011" & X"010", -- 0x04E: MOV R00, 0x01 + "111011" & X"145", -- 0x04F: CALL 0x145 + "000011" & X"1D1", -- 0x050: MOV R01, 0x1D + "111011" & X"14A", -- 0x051: CALL 0x14A + "000011" & X"1D1", -- 0x052: MOV R01, 0x1D + "111011" & X"1B3", -- 0x053: CALL 0x1B3 + "000011" & X"001", -- 0x054: MOV R01, 0x00 + "111011" & X"1B6", -- 0x055: CALL 0x1B6 + "111011" & X"0CC", -- 0x056: CALL 0x0CC + "000011" & X"000", -- 0x057: MOV R00, 0x00 + "001101" & X"000", -- 0x058: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x059: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x05A: CMP R00, 0xFF + "111001" & X"076", -- 0x05B: JEQ 0x076 + "000011" & X"082", -- 0x05C: MOV R02, 0x08 + "001010" & X"001", -- 0x05D: MOVC R01, (0x00) + "000011" & X"800", -- 0x05E: MOV R00, 0x80 + "000011" & X"08F", -- 0x05F: MOV R15, 0x08 + "000110" & X"001", -- 0x060: MOVX (R01), R00 + "010001" & X"010", -- 0x061: INC R00 + "010001" & X"011", -- 0x062: INC R01 + "010101" & X"01F", -- 0x063: DEC R15 + "110010" & X"060", -- 0x064: JNZ 0x060 + "101000" & X"070", -- 0x065: XIN R00, (0x07) + "100100" & X"010", -- 0x066: XOUT (0x01), R00 + "011001" & X"040", -- 0x067: AND R00, 0x04 + "110010" & X"065", -- 0x068: JNZ 0x065 + "000011" & X"100", -- 0x069: MOV R00, 0x10 + "100100" & X"070", -- 0x06A: XOUT (0x07), R00 + "001010" & X"000", -- 0x06B: MOVC R00, (0x00) + "010001" & X"010", -- 0x06C: INC R00 + "001101" & X"000", -- 0x06D: MOVC (0x00), R00 + "010101" & X"022", -- 0x06E: SUB R02, 0x02 + "110010" & X"05D", -- 0x06F: JNZ 0x05D + "111011" & X"0AB", -- 0x070: CALL 0x0AB + "000011" & X"060", -- 0x071: MOV R00, 0x06 + "100100" & X"070", -- 0x072: XOUT (0x07), R00 + "000011" & X"080", -- 0x073: MOV R00, 0x08 + "111011" & X"0D3", -- 0x074: CALL 0x0D3 + "110000" & X"059", -- 0x075: JMP 0x059 + "111011" & X"0E3", -- 0x076: CALL 0x0E3 + "111011" & X"1BF", -- 0x077: CALL 0x1BF + "000011" & X"010", -- 0x078: MOV R00, 0x01 + "111011" & X"145", -- 0x079: CALL 0x145 + "000011" & X"2B1", -- 0x07A: MOV R01, 0x2B + "111011" & X"14A", -- 0x07B: CALL 0x14A + "000011" & X"2B1", -- 0x07C: MOV R01, 0x2B + "111011" & X"1B3", -- 0x07D: CALL 0x1B3 + "000011" & X"001", -- 0x07E: MOV R01, 0x00 + "111011" & X"1B6", -- 0x07F: CALL 0x1B6 + "111011" & X"0CC", -- 0x080: CALL 0x0CC + "000011" & X"000", -- 0x081: MOV R00, 0x00 + "001101" & X"000", -- 0x082: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x083: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x084: CMP R00, 0xFF + "111001" & X"0B3", -- 0x085: JEQ 0x0B3 + "111011" & X"0AB", -- 0x086: CALL 0x0AB + "000011" & X"050", -- 0x087: MOV R00, 0x05 + "100100" & X"070", -- 0x088: XOUT (0x07), R00 + "000011" & X"083", -- 0x089: MOV R03, 0x08 + "101000" & X"070", -- 0x08A: XIN R00, (0x07) + "100100" & X"010", -- 0x08B: XOUT (0x01), R00 + "011001" & X"200", -- 0x08C: AND R00, 0x20 + "110010" & X"08A", -- 0x08D: JNZ 0x08A + "001010" & X"001", -- 0x08E: MOVC R01, (0x00) + "000011" & X"800", -- 0x08F: MOV R00, 0x80 + "000011" & X"08F", -- 0x090: MOV R15, 0x08 + "000100" & X"002", -- 0x091: MOVX R02, (R00) + "001110" & X"012", -- 0x092: CMP R02, R01 + "111010" & X"0BF", -- 0x093: JNE 0x0BF + "010001" & X"010", -- 0x094: INC R00 + "010001" & X"011", -- 0x095: INC R01 + "010101" & X"01F", -- 0x096: DEC R15 + "110010" & X"091", -- 0x097: JNZ 0x091 + "000011" & X"200", -- 0x098: MOV R00, 0x20 + "100100" & X"070", -- 0x099: XOUT (0x07), R00 + "001010" & X"000", -- 0x09A: MOVC R00, (0x00) + "010001" & X"010", -- 0x09B: INC R00 + "001101" & X"000", -- 0x09C: MOVC (0x00), R00 + "010101" & X"023", -- 0x09D: SUB R03, 0x02 + "110010" & X"08A", -- 0x09E: JNZ 0x08A + "000011" & X"080", -- 0x09F: MOV R00, 0x08 + "111011" & X"0D3", -- 0x0A0: CALL 0x0D3 + "110000" & X"083", -- 0x0A1: JMP 0x083 + "111100" & X"000", -- 0x0A2: PUSH R00 + "000011" & X"800", -- 0x0A3: MOV R00, 0x80 + "100100" & X"070", -- 0x0A4: XOUT (0x07), R00 + "101000" & X"070", -- 0x0A5: XIN R00, (0x07) + "100100" & X"010", -- 0x0A6: XOUT (0x01), R00 + "011001" & X"800", -- 0x0A7: AND R00, 0x80 + "110001" & X"0A5", -- 0x0A8: JZ 0x0A5 + "111101" & X"000", -- 0x0A9: POP R00 + "111110" & X"000", -- 0x0AA: RET + "111011" & X"0A2", -- 0x0AB: CALL 0x0A2 + "111100" & X"000", -- 0x0AC: PUSH R00 + "101000" & X"070", -- 0x0AD: XIN R00, (0x07) + "100100" & X"010", -- 0x0AE: XOUT (0x01), R00 + "011001" & X"010", -- 0x0AF: AND R00, 0x01 + "110010" & X"0AD", -- 0x0B0: JNZ 0x0AD + "111101" & X"000", -- 0x0B1: POP R00 + "111110" & X"000", -- 0x0B2: RET + "000011" & X"010", -- 0x0B3: MOV R00, 0x01 + "111011" & X"145", -- 0x0B4: CALL 0x145 + "000011" & X"391", -- 0x0B5: MOV R01, 0x39 + "111011" & X"14A", -- 0x0B6: CALL 0x14A + "000011" & X"C00", -- 0x0B7: MOV R00, 0xC0 + "111011" & X"145", -- 0x0B8: CALL 0x145 + "111011" & X"0EE", -- 0x0B9: CALL 0x0EE + "000011" & X"391", -- 0x0BA: MOV R01, 0x39 + "111011" & X"1B3", -- 0x0BB: CALL 0x1B3 + "000011" & X"001", -- 0x0BC: MOV R01, 0x00 + "111011" & X"1B6", -- 0x0BD: CALL 0x1B6 + "110000" & X"0CA", -- 0x0BE: JMP 0x0CA + "000011" & X"010", -- 0x0BF: MOV R00, 0x01 + "111011" & X"145", -- 0x0C0: CALL 0x145 + "000011" & X"431", -- 0x0C1: MOV R01, 0x43 + "111011" & X"14A", -- 0x0C2: CALL 0x14A + "111011" & X"0EE", -- 0x0C3: CALL 0x0EE + "111011" & X"106", -- 0x0C4: CALL 0x106 + "000011" & X"431", -- 0x0C5: MOV R01, 0x43 + "111011" & X"1B3", -- 0x0C6: CALL 0x1B3 + "000011" & X"001", -- 0x0C7: MOV R01, 0x00 + "111011" & X"1B6", -- 0x0C8: CALL 0x1B6 + "110000" & X"0CA", -- 0x0C9: JMP 0x0CA + "111011" & X"1BF", -- 0x0CA: CALL 0x1BF + "110000" & X"02A", -- 0x0CB: JMP 0x02A + "111100" & X"000", -- 0x0CC: PUSH R00 + "000011" & X"000", -- 0x0CD: MOV R00, 0x00 + "100100" & X"080", -- 0x0CE: XOUT (0x08), R00 + "100100" & X"090", -- 0x0CF: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x0D0: XOUT (0x0A), R00 + "111101" & X"000", -- 0x0D1: POP R00 + "111110" & X"000", -- 0x0D2: RET + "111100" & X"001", -- 0x0D3: PUSH R01 + "111100" & X"002", -- 0x0D4: PUSH R02 + "111100" & X"003", -- 0x0D5: PUSH R03 + "101000" & X"081", -- 0x0D6: XIN R01, (0x08) + "101000" & X"092", -- 0x0D7: XIN R02, (0x09) + "101000" & X"0A3", -- 0x0D8: XIN R03, (0x0A) + "010000" & X"001", -- 0x0D9: ADD R01, R00 + "010011" & X"002", -- 0x0DA: ADDC R02, 0x00 + "010011" & X"003", -- 0x0DB: ADDC R03, 0x00 + "100100" & X"081", -- 0x0DC: XOUT (0x08), R01 + "100100" & X"092", -- 0x0DD: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x0DE: XOUT (0x0A), R03 + "111101" & X"003", -- 0x0DF: POP R03 + "111101" & X"002", -- 0x0E0: POP R02 + "111101" & X"001", -- 0x0E1: POP R01 + "111110" & X"000", -- 0x0E2: RET + "000011" & X"C00", -- 0x0E3: MOV R00, 0xC0 + "111011" & X"145", -- 0x0E4: CALL 0x145 + "111011" & X"0EE", -- 0x0E5: CALL 0x0EE + "111110" & X"000", -- 0x0E6: RET + "111100" & X"001", -- 0x0E7: PUSH R01 + "111011" & X"121", -- 0x0E8: CALL 0x121 + "111011" & X"15C", -- 0x0E9: CALL 0x15C + "000010" & X"010", -- 0x0EA: MOV R00, R01 + "111011" & X"15C", -- 0x0EB: CALL 0x15C + "111101" & X"001", -- 0x0EC: POP R01 + "111110" & X"000", -- 0x0ED: RET + "111100" & X"000", -- 0x0EE: PUSH R00 + "101000" & X"0A0", -- 0x0EF: XIN R00, (0x0A) + "111011" & X"0E7", -- 0x0F0: CALL 0x0E7 + "101000" & X"090", -- 0x0F1: XIN R00, (0x09) + "111011" & X"0E7", -- 0x0F2: CALL 0x0E7 + "101000" & X"080", -- 0x0F3: XIN R00, (0x08) + "111011" & X"0E7", -- 0x0F4: CALL 0x0E7 + "111101" & X"000", -- 0x0F5: POP R00 + "111110" & X"000", -- 0x0F6: RET + "111100" & X"000", -- 0x0F7: PUSH R00 + "010001" & X"031", -- 0x0F8: ADD R01, 0x03 + "001001" & X"010", -- 0x0F9: MOVC R00, (R01) + "111011" & X"0E7", -- 0x0FA: CALL 0x0E7 + "010101" & X"011", -- 0x0FB: DEC R01 + "001001" & X"010", -- 0x0FC: MOVC R00, (R01) + "111011" & X"0E7", -- 0x0FD: CALL 0x0E7 + "010101" & X"011", -- 0x0FE: DEC R01 + "001001" & X"010", -- 0x0FF: MOVC R00, (R01) + "111011" & X"0E7", -- 0x100: CALL 0x0E7 + "010101" & X"011", -- 0x101: DEC R01 + "001001" & X"010", -- 0x102: MOVC R00, (R01) + "111011" & X"0E7", -- 0x103: CALL 0x0E7 + "111101" & X"000", -- 0x104: POP R00 + "111110" & X"000", -- 0x105: RET + "111100" & X"000", -- 0x106: PUSH R00 + "000011" & X"C00", -- 0x107: MOV R00, 0xC0 + "111011" & X"145", -- 0x108: CALL 0x145 + "000101" & X"870", -- 0x109: MOVX R00, (0x87) + "111011" & X"0E7", -- 0x10A: CALL 0x0E7 + "000101" & X"860", -- 0x10B: MOVX R00, (0x86) + "111011" & X"0E7", -- 0x10C: CALL 0x0E7 + "000101" & X"850", -- 0x10D: MOVX R00, (0x85) + "111011" & X"0E7", -- 0x10E: CALL 0x0E7 + "000101" & X"840", -- 0x10F: MOVX R00, (0x84) + "111011" & X"0E7", -- 0x110: CALL 0x0E7 + "000101" & X"830", -- 0x111: MOVX R00, (0x83) + "111011" & X"0E7", -- 0x112: CALL 0x0E7 + "000101" & X"820", -- 0x113: MOVX R00, (0x82) + "111011" & X"0E7", -- 0x114: CALL 0x0E7 + "000101" & X"810", -- 0x115: MOVX R00, (0x81) + "111011" & X"0E7", -- 0x116: CALL 0x0E7 + "000101" & X"800", -- 0x117: MOVX R00, (0x80) + "111011" & X"0E7", -- 0x118: CALL 0x0E7 + "111101" & X"000", -- 0x119: POP R00 + "111110" & X"000", -- 0x11A: RET + "011001" & X"0F0", -- 0x11B: AND R00, 0x0F + "001111" & X"0A0", -- 0x11C: CMP R00, 0x0A + "110101" & X"11F", -- 0x11D: JLT 0x11F + "010001" & X"070", -- 0x11E: ADD R00, 0x07 + "010001" & X"300", -- 0x11F: ADD R00, 0x30 + "111110" & X"000", -- 0x120: RET + "111100" & X"000", -- 0x121: PUSH R00 + "111011" & X"11B", -- 0x122: CALL 0x11B + "000010" & X"001", -- 0x123: MOV R01, R00 + "111101" & X"000", -- 0x124: POP R00 + "101010" & X"000", -- 0x125: SWAP R00 + "111011" & X"11B", -- 0x126: CALL 0x11B + "111110" & X"000", -- 0x127: RET + "000011" & X"002", -- 0x128: MOV R02, 0x00 + "000011" & X"030", -- 0x129: MOV R00, 0x03 + "111011" & X"174", -- 0x12A: CALL 0x174 + "111011" & X"1CD", -- 0x12B: CALL 0x1CD + "000011" & X"002", -- 0x12C: MOV R02, 0x00 + "000011" & X"030", -- 0x12D: MOV R00, 0x03 + "111011" & X"174", -- 0x12E: CALL 0x174 + "111011" & X"1CD", -- 0x12F: CALL 0x1CD + "000011" & X"002", -- 0x130: MOV R02, 0x00 + "000011" & X"020", -- 0x131: MOV R00, 0x02 + "111011" & X"174", -- 0x132: CALL 0x174 + "111011" & X"1D4", -- 0x133: CALL 0x1D4 + "000011" & X"280", -- 0x134: MOV R00, 0x28 + "111011" & X"145", -- 0x135: CALL 0x145 + "000011" & X"0C0", -- 0x136: MOV R00, 0x0C + "111011" & X"145", -- 0x137: CALL 0x145 + "000011" & X"060", -- 0x138: MOV R00, 0x06 + "111011" & X"145", -- 0x139: CALL 0x145 + "000011" & X"010", -- 0x13A: MOV R00, 0x01 + "111011" & X"145", -- 0x13B: CALL 0x145 + "111110" & X"000", -- 0x13C: RET + "111100" & X"000", -- 0x13D: PUSH R00 + "111011" & X"168", -- 0x13E: CALL 0x168 + "011001" & X"800", -- 0x13F: AND R00, 0x80 + "110001" & X"143", -- 0x140: JZ 0x143 + "111011" & X"1EB", -- 0x141: CALL 0x1EB + "110000" & X"13E", -- 0x142: JMP 0x13E + "111101" & X"000", -- 0x143: POP R00 + "111110" & X"000", -- 0x144: RET + "111100" & X"002", -- 0x145: PUSH R02 + "000011" & X"002", -- 0x146: MOV R02, 0x00 + "111011" & X"161", -- 0x147: CALL 0x161 + "111101" & X"002", -- 0x148: POP R02 + "111110" & X"000", -- 0x149: RET + "111100" & X"000", -- 0x14A: PUSH R00 + "000100" & X"010", -- 0x14B: MOVX R00, (R01) + "010001" & X"011", -- 0x14C: INC R01 + "001111" & X"000", -- 0x14D: TST R00 + "110001" & X"151", -- 0x14E: JZ 0x151 + "111011" & X"15C", -- 0x14F: CALL 0x15C + "110000" & X"14B", -- 0x150: JMP 0x14B + "111101" & X"000", -- 0x151: POP R00 + "111110" & X"000", -- 0x152: RET + "111100" & X"000", -- 0x153: PUSH R00 + "001001" & X"010", -- 0x154: MOVC R00, (R01) + "010001" & X"011", -- 0x155: INC R01 + "001111" & X"000", -- 0x156: TST R00 + "110001" & X"15A", -- 0x157: JZ 0x15A + "111011" & X"15C", -- 0x158: CALL 0x15C + "110000" & X"154", -- 0x159: JMP 0x154 + "111101" & X"000", -- 0x15A: POP R00 + "111110" & X"000", -- 0x15B: RET + "111100" & X"002", -- 0x15C: PUSH R02 + "000011" & X"402", -- 0x15D: MOV R02, 0x40 + "111011" & X"161", -- 0x15E: CALL 0x161 + "111101" & X"002", -- 0x15F: POP R02 + "111110" & X"000", -- 0x160: RET + "111011" & X"13D", -- 0x161: CALL 0x13D + "111100" & X"000", -- 0x162: PUSH R00 + "101010" & X"000", -- 0x163: SWAP R00 + "111011" & X"174", -- 0x164: CALL 0x174 + "111101" & X"000", -- 0x165: POP R00 + "111011" & X"174", -- 0x166: CALL 0x174 + "111110" & X"000", -- 0x167: RET + "111100" & X"002", -- 0x168: PUSH R02 + "000011" & X"002", -- 0x169: MOV R02, 0x00 + "111011" & X"16D", -- 0x16A: CALL 0x16D + "111101" & X"002", -- 0x16B: POP R02 + "111110" & X"000", -- 0x16C: RET + "111011" & X"187", -- 0x16D: CALL 0x187 + "101010" & X"000", -- 0x16E: SWAP R00 + "111100" & X"000", -- 0x16F: PUSH R00 + "111011" & X"187", -- 0x170: CALL 0x187 + "111101" & X"002", -- 0x171: POP R02 + "011010" & X"020", -- 0x172: OR R00, R02 + "111110" & X"000", -- 0x173: RET + "111100" & X"001", -- 0x174: PUSH R01 + "011001" & X"0F0", -- 0x175: AND R00, 0x0F + "000010" & X"001", -- 0x176: MOV R01, R00 + "011010" & X"021", -- 0x177: OR R01, R02 + "100100" & X"031", -- 0x178: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x179: CALL 0x1EB + "000010" & X"001", -- 0x17A: MOV R01, R00 + "011010" & X"021", -- 0x17B: OR R01, R02 + "011011" & X"801", -- 0x17C: OR R01, 0x80 + "100100" & X"031", -- 0x17D: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x17E: CALL 0x1EB + "000010" & X"001", -- 0x17F: MOV R01, R00 + "011010" & X"021", -- 0x180: OR R01, R02 + "100100" & X"031", -- 0x181: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x182: CALL 0x1EB + "011011" & X"201", -- 0x183: OR R01, 0x20 + "100100" & X"031", -- 0x184: XOUT (0x03), R01 + "111101" & X"001", -- 0x185: POP R01 + "111110" & X"000", -- 0x186: RET + "111100" & X"001", -- 0x187: PUSH R01 + "000011" & X"201", -- 0x188: MOV R01, 0x20 + "011010" & X"021", -- 0x189: OR R01, R02 + "100100" & X"031", -- 0x18A: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x18B: CALL 0x1EB + "000011" & X"201", -- 0x18C: MOV R01, 0x20 + "011010" & X"021", -- 0x18D: OR R01, R02 + "011011" & X"801", -- 0x18E: OR R01, 0x80 + "100100" & X"031", -- 0x18F: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x190: CALL 0x1EB + "101000" & X"030", -- 0x191: XIN R00, (0x03) + "011001" & X"0F0", -- 0x192: AND R00, 0x0F + "000011" & X"201", -- 0x193: MOV R01, 0x20 + "011010" & X"021", -- 0x194: OR R01, R02 + "100100" & X"031", -- 0x195: XOUT (0x03), R01 + "111011" & X"1EB", -- 0x196: CALL 0x1EB + "111101" & X"001", -- 0x197: POP R01 + "111110" & X"000", -- 0x198: RET + "111100" & X"000", -- 0x199: PUSH R00 + "000011" & X"020", -- 0x19A: MOV R00, 0x02 + "100100" & X"0E0", -- 0x19B: XOUT (0x0E), R00 + "111101" & X"000", -- 0x19C: POP R00 + "111110" & X"000", -- 0x19D: RET + "111100" & X"000", -- 0x19E: PUSH R00 + "000011" & X"010", -- 0x19F: MOV R00, 0x01 + "100100" & X"0E0", -- 0x1A0: XOUT (0x0E), R00 + "111101" & X"000", -- 0x1A1: POP R00 + "111110" & X"000", -- 0x1A2: RET + "111011" & X"1B9", -- 0x1A3: CALL 0x1B9 + "100100" & X"0C1", -- 0x1A4: XOUT (0x0C), R01 + "100100" & X"0B0", -- 0x1A5: XOUT (0x0B), R00 + "111110" & X"000", -- 0x1A6: RET + "111011" & X"1B9", -- 0x1A7: CALL 0x1B9 + "100100" & X"0D0", -- 0x1A8: XOUT (0x0D), R00 + "111110" & X"000", -- 0x1A9: RET + "111100" & X"000", -- 0x1AA: PUSH R00 + "000100" & X"010", -- 0x1AB: MOVX R00, (R01) + "010001" & X"011", -- 0x1AC: INC R01 + "001111" & X"000", -- 0x1AD: TST R00 + "110001" & X"1B1", -- 0x1AE: JZ 0x1B1 + "111011" & X"1A7", -- 0x1AF: CALL 0x1A7 + "110000" & X"1AB", -- 0x1B0: JMP 0x1AB + "111101" & X"000", -- 0x1B1: POP R00 + "111110" & X"000", -- 0x1B2: RET + "111011" & X"199", -- 0x1B3: CALL 0x199 + "111011" & X"1AA", -- 0x1B4: CALL 0x1AA + "111110" & X"000", -- 0x1B5: RET + "111011" & X"1AA", -- 0x1B6: CALL 0x1AA + "111011" & X"199", -- 0x1B7: CALL 0x199 + "111110" & X"000", -- 0x1B8: RET + "111100" & X"000", -- 0x1B9: PUSH R00 + "101000" & X"0E0", -- 0x1BA: XIN R00, (0x0E) + "011001" & X"020", -- 0x1BB: AND R00, 0x02 + "110001" & X"1BA", -- 0x1BC: JZ 0x1BA + "111101" & X"000", -- 0x1BD: POP R00 + "111110" & X"000", -- 0x1BE: RET + "111100" & X"00F", -- 0x1BF: PUSH R15 + "000011" & X"0AF", -- 0x1C0: MOV R15, 0x0A + "111011" & X"1C6", -- 0x1C1: CALL 0x1C6 + "010101" & X"01F", -- 0x1C2: DEC R15 + "110010" & X"1C1", -- 0x1C3: JNZ 0x1C1 + "111101" & X"00F", -- 0x1C4: POP R15 + "111110" & X"000", -- 0x1C5: RET + "111100" & X"00F", -- 0x1C6: PUSH R15 + "000011" & X"0AF", -- 0x1C7: MOV R15, 0x0A + "111011" & X"1CD", -- 0x1C8: CALL 0x1CD + "010101" & X"01F", -- 0x1C9: DEC R15 + "110010" & X"1C8", -- 0x1CA: JNZ 0x1C8 + "111101" & X"00F", -- 0x1CB: POP R15 + "111110" & X"000", -- 0x1CC: RET + "111100" & X"00F", -- 0x1CD: PUSH R15 + "000011" & X"0AF", -- 0x1CE: MOV R15, 0x0A + "111011" & X"1D4", -- 0x1CF: CALL 0x1D4 + "010101" & X"01F", -- 0x1D0: DEC R15 + "110010" & X"1CF", -- 0x1D1: JNZ 0x1CF + "111101" & X"00F", -- 0x1D2: POP R15 + "111110" & X"000", -- 0x1D3: RET + "111100" & X"00F", -- 0x1D4: PUSH R15 + "000011" & X"0AF", -- 0x1D5: MOV R15, 0x0A + "111011" & X"1DB", -- 0x1D6: CALL 0x1DB + "010101" & X"01F", -- 0x1D7: DEC R15 + "110010" & X"1D6", -- 0x1D8: JNZ 0x1D6 + "111101" & X"00F", -- 0x1D9: POP R15 + "111110" & X"000", -- 0x1DA: RET + "111100" & X"00F", -- 0x1DB: PUSH R15 + "000011" & X"0AF", -- 0x1DC: MOV R15, 0x0A + "111011" & X"1E2", -- 0x1DD: CALL 0x1E2 + "010101" & X"01F", -- 0x1DE: DEC R15 + "110010" & X"1DD", -- 0x1DF: JNZ 0x1DD + "111101" & X"00F", -- 0x1E0: POP R15 + "111110" & X"000", -- 0x1E1: RET + "111100" & X"00F", -- 0x1E2: PUSH R15 + "000011" & X"63F", -- 0x1E3: MOV R15, 0x63 + "000000" & X"000", -- 0x1E4: NOP + "000000" & X"000", -- 0x1E5: NOP + "000000" & X"000", -- 0x1E6: NOP + "010101" & X"01F", -- 0x1E7: DEC R15 + "110010" & X"1E4", -- 0x1E8: JNZ 0x1E4 + "111101" & X"00F", -- 0x1E9: POP R15 + "111110" & X"000", -- 0x1EA: RET + "111100" & X"00F", -- 0x1EB: PUSH R15 + "000011" & X"09F", -- 0x1EC: MOV R15, 0x09 + "000000" & X"000", -- 0x1ED: NOP + "000000" & X"000", -- 0x1EE: NOP + "000000" & X"000", -- 0x1EF: NOP + "010101" & X"01F", -- 0x1F0: DEC R15 + "110010" & X"1ED", -- 0x1F1: JNZ 0x1ED + "111101" & X"00F", -- 0x1F2: POP R15 + "111110" & X"000", -- 0x1F3: RET + "111100" & X"001", -- 0x1F4: PUSH R01 + "101000" & X"061", -- 0x1F5: XIN R01, (0x06) + "011001" & X"021", -- 0x1F6: AND R01, 0x02 + "110010" & X"1F5", -- 0x1F7: JNZ 0x1F5 + "100100" & X"020", -- 0x1F8: XOUT (0x02), R00 + "111101" & X"001", -- 0x1F9: POP R01 + "111110" & X"000", -- 0x1FA: RET + "111100" & X"001", -- 0x1FB: PUSH R01 + "101000" & X"061", -- 0x1FC: XIN R01, (0x06) + "011001" & X"101", -- 0x1FD: AND R01, 0x10 + "110001" & X"1FC", -- 0x1FE: JZ 0x1FC + "101000" & X"020", -- 0x1FF: XIN R00, (0x02) + "111101" & X"001", -- 0x200: POP R01 + "111110" & X"000", -- 0x201: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdram_test_short_irom.vhdl b/projects/cpu/src/systest/sdram_test_short_irom.vhdl new file mode 100644 index 0000000..6d7f650 --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_short_irom.vhdl @@ -0,0 +1,226 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 sdram_test_short OF irom IS + + type imem_rom_t is array (0 to 164) of inst_t; + + -- Assembled from sdram_test_short.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"000", -- 0x002: MOV R00, 0x00 + "100100" & X"010", -- 0x003: XOUT (0x01), R00 + "000011" & X"040", -- 0x004: MOV R00, 0x04 + "100100" & X"040", -- 0x005: XOUT (0x04), R00 + "000011" & X"000", -- 0x006: MOV R00, 0x00 + "000011" & X"801", -- 0x007: MOV R01, 0x80 + "100100" & X"100", -- 0x008: XOUT (0x10), R00 + "100100" & X"111", -- 0x009: XOUT (0x11), R01 + "100100" & X"120", -- 0x00A: XOUT (0x12), R00 + "110000" & X"026", -- 0x00B: JMP 0x026 + "111011" & X"07D", -- 0x00C: CALL 0x07D + "000011" & X"800", -- 0x00D: MOV R00, 0x80 + "000011" & X"08F", -- 0x00E: MOV R15, 0x08 + "000111" & X"000", -- 0x00F: MOVX (R00), 0x00 + "010001" & X"010", -- 0x010: INC R00 + "010101" & X"01F", -- 0x011: DEC R15 + "110010" & X"00F", -- 0x012: JNZ 0x00F + "101000" & X"080", -- 0x013: XIN R00, (0x08) + "001111" & X"400", -- 0x014: CMP R00, 0x40 + "111001" & X"025", -- 0x015: JEQ 0x025 + "000011" & X"082", -- 0x016: MOV R02, 0x08 + "101000" & X"070", -- 0x017: XIN R00, (0x07) + "100100" & X"010", -- 0x018: XOUT (0x01), R00 + "011001" & X"040", -- 0x019: AND R00, 0x04 + "110010" & X"017", -- 0x01A: JNZ 0x017 + "000011" & X"100", -- 0x01B: MOV R00, 0x10 + "100100" & X"070", -- 0x01C: XOUT (0x07), R00 + "010101" & X"022", -- 0x01D: SUB R02, 0x02 + "110010" & X"017", -- 0x01E: JNZ 0x017 + "111011" & X"072", -- 0x01F: CALL 0x072 + "000011" & X"060", -- 0x020: MOV R00, 0x06 + "100100" & X"070", -- 0x021: XOUT (0x07), R00 + "000011" & X"080", -- 0x022: MOV R00, 0x08 + "111011" & X"084", -- 0x023: CALL 0x084 + "110000" & X"013", -- 0x024: JMP 0x013 + "111011" & X"094", -- 0x025: CALL 0x094 + "111011" & X"07D", -- 0x026: CALL 0x07D + "000011" & X"000", -- 0x027: MOV R00, 0x00 + "001101" & X"000", -- 0x028: MOVC (0x00), R00 + "101000" & X"080", -- 0x029: XIN R00, (0x08) + "001111" & X"400", -- 0x02A: CMP R00, 0x40 + "111001" & X"046", -- 0x02B: JEQ 0x046 + "000011" & X"082", -- 0x02C: MOV R02, 0x08 + "001010" & X"001", -- 0x02D: MOVC R01, (0x00) + "000011" & X"800", -- 0x02E: MOV R00, 0x80 + "000011" & X"08F", -- 0x02F: MOV R15, 0x08 + "000110" & X"001", -- 0x030: MOVX (R01), R00 + "010001" & X"010", -- 0x031: INC R00 + "010001" & X"011", -- 0x032: INC R01 + "010101" & X"01F", -- 0x033: DEC R15 + "110010" & X"030", -- 0x034: JNZ 0x030 + "101000" & X"070", -- 0x035: XIN R00, (0x07) + "100100" & X"010", -- 0x036: XOUT (0x01), R00 + "011001" & X"040", -- 0x037: AND R00, 0x04 + "110010" & X"035", -- 0x038: JNZ 0x035 + "000011" & X"100", -- 0x039: MOV R00, 0x10 + "100100" & X"070", -- 0x03A: XOUT (0x07), R00 + "001010" & X"000", -- 0x03B: MOVC R00, (0x00) + "010001" & X"010", -- 0x03C: INC R00 + "001101" & X"000", -- 0x03D: MOVC (0x00), R00 + "010101" & X"022", -- 0x03E: SUB R02, 0x02 + "110010" & X"02D", -- 0x03F: JNZ 0x02D + "111011" & X"072", -- 0x040: CALL 0x072 + "000011" & X"060", -- 0x041: MOV R00, 0x06 + "100100" & X"070", -- 0x042: XOUT (0x07), R00 + "000011" & X"080", -- 0x043: MOV R00, 0x08 + "111011" & X"084", -- 0x044: CALL 0x084 + "110000" & X"029", -- 0x045: JMP 0x029 + "111011" & X"094", -- 0x046: CALL 0x094 + "111011" & X"07D", -- 0x047: CALL 0x07D + "000011" & X"000", -- 0x048: MOV R00, 0x00 + "001101" & X"000", -- 0x049: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x04A: XIN R00, (0x0A) + "001111" & X"400", -- 0x04B: CMP R00, 0x40 + "111001" & X"07A", -- 0x04C: JEQ 0x07A + "111011" & X"072", -- 0x04D: CALL 0x072 + "000011" & X"050", -- 0x04E: MOV R00, 0x05 + "100100" & X"070", -- 0x04F: XOUT (0x07), R00 + "000011" & X"083", -- 0x050: MOV R03, 0x08 + "101000" & X"070", -- 0x051: XIN R00, (0x07) + "100100" & X"010", -- 0x052: XOUT (0x01), R00 + "011001" & X"200", -- 0x053: AND R00, 0x20 + "110010" & X"051", -- 0x054: JNZ 0x051 + "001010" & X"001", -- 0x055: MOVC R01, (0x00) + "000011" & X"800", -- 0x056: MOV R00, 0x80 + "000011" & X"08F", -- 0x057: MOV R15, 0x08 + "000100" & X"002", -- 0x058: MOVX R02, (R00) + "001110" & X"012", -- 0x059: CMP R02, R01 + "111010" & X"07B", -- 0x05A: JNE 0x07B + "010001" & X"010", -- 0x05B: INC R00 + "010001" & X"011", -- 0x05C: INC R01 + "010101" & X"01F", -- 0x05D: DEC R15 + "110010" & X"058", -- 0x05E: JNZ 0x058 + "000011" & X"200", -- 0x05F: MOV R00, 0x20 + "100100" & X"070", -- 0x060: XOUT (0x07), R00 + "001010" & X"000", -- 0x061: MOVC R00, (0x00) + "010001" & X"010", -- 0x062: INC R00 + "001101" & X"000", -- 0x063: MOVC (0x00), R00 + "010101" & X"023", -- 0x064: SUB R03, 0x02 + "110010" & X"051", -- 0x065: JNZ 0x051 + "000011" & X"080", -- 0x066: MOV R00, 0x08 + "111011" & X"084", -- 0x067: CALL 0x084 + "110000" & X"04A", -- 0x068: JMP 0x04A + "111100" & X"000", -- 0x069: PUSH R00 + "000011" & X"800", -- 0x06A: MOV R00, 0x80 + "100100" & X"070", -- 0x06B: XOUT (0x07), R00 + "101000" & X"070", -- 0x06C: XIN R00, (0x07) + "100100" & X"010", -- 0x06D: XOUT (0x01), R00 + "011001" & X"800", -- 0x06E: AND R00, 0x80 + "110001" & X"06C", -- 0x06F: JZ 0x06C + "111101" & X"000", -- 0x070: POP R00 + "111110" & X"000", -- 0x071: RET + "111011" & X"069", -- 0x072: CALL 0x069 + "111100" & X"000", -- 0x073: PUSH R00 + "101000" & X"070", -- 0x074: XIN R00, (0x07) + "100100" & X"010", -- 0x075: XOUT (0x01), R00 + "011001" & X"010", -- 0x076: AND R00, 0x01 + "110010" & X"074", -- 0x077: JNZ 0x074 + "111101" & X"000", -- 0x078: POP R00 + "111110" & X"000", -- 0x079: RET + "110000" & X"07C", -- 0x07A: JMP 0x07C + "110000" & X"07C", -- 0x07B: JMP 0x07C + "110000" & X"00C", -- 0x07C: JMP 0x00C + "111100" & X"000", -- 0x07D: PUSH R00 + "000011" & X"000", -- 0x07E: MOV R00, 0x00 + "100100" & X"080", -- 0x07F: XOUT (0x08), R00 + "100100" & X"090", -- 0x080: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x081: XOUT (0x0A), R00 + "111101" & X"000", -- 0x082: POP R00 + "111110" & X"000", -- 0x083: RET + "111100" & X"001", -- 0x084: PUSH R01 + "111100" & X"002", -- 0x085: PUSH R02 + "111100" & X"003", -- 0x086: PUSH R03 + "101000" & X"081", -- 0x087: XIN R01, (0x08) + "101000" & X"092", -- 0x088: XIN R02, (0x09) + "101000" & X"0A3", -- 0x089: XIN R03, (0x0A) + "010000" & X"001", -- 0x08A: ADD R01, R00 + "010011" & X"002", -- 0x08B: ADDC R02, 0x00 + "010011" & X"003", -- 0x08C: ADDC R03, 0x00 + "100100" & X"081", -- 0x08D: XOUT (0x08), R01 + "100100" & X"092", -- 0x08E: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x08F: XOUT (0x0A), R03 + "111101" & X"003", -- 0x090: POP R03 + "111101" & X"002", -- 0x091: POP R02 + "111101" & X"001", -- 0x092: POP R01 + "111110" & X"000", -- 0x093: RET + "111110" & X"000", -- 0x094: RET + "111110" & X"000", -- 0x095: RET + "111110" & X"000", -- 0x096: RET + "111110" & X"000", -- 0x097: RET + "011001" & X"0F0", -- 0x098: AND R00, 0x0F + "001111" & X"0A0", -- 0x099: CMP R00, 0x0A + "110101" & X"09C", -- 0x09A: JLT 0x09C + "010001" & X"070", -- 0x09B: ADD R00, 0x07 + "010001" & X"300", -- 0x09C: ADD R00, 0x30 + "111110" & X"000", -- 0x09D: RET + "111100" & X"000", -- 0x09E: PUSH R00 + "111011" & X"098", -- 0x09F: CALL 0x098 + "000010" & X"001", -- 0x0A0: MOV R01, R00 + "111101" & X"000", -- 0x0A1: POP R00 + "101010" & X"000", -- 0x0A2: SWAP R00 + "111011" & X"098", -- 0x0A3: CALL 0x098 + "111110" & X"000" -- 0x0A4: 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 sdram_test_short; + diff --git a/projects/cpu/src/systest/sdram_test_short_irom_ld.vhdl b/projects/cpu/src/systest/sdram_test_short_irom_ld.vhdl new file mode 100644 index 0000000..788968e --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_short_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdram_test_short.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"000", -- 0x002: MOV R00, 0x00 + "100100" & X"010", -- 0x003: XOUT (0x01), R00 + "000011" & X"040", -- 0x004: MOV R00, 0x04 + "100100" & X"040", -- 0x005: XOUT (0x04), R00 + "000011" & X"000", -- 0x006: MOV R00, 0x00 + "000011" & X"801", -- 0x007: MOV R01, 0x80 + "100100" & X"100", -- 0x008: XOUT (0x10), R00 + "100100" & X"111", -- 0x009: XOUT (0x11), R01 + "100100" & X"120", -- 0x00A: XOUT (0x12), R00 + "110000" & X"026", -- 0x00B: JMP 0x026 + "111011" & X"07D", -- 0x00C: CALL 0x07D + "000011" & X"800", -- 0x00D: MOV R00, 0x80 + "000011" & X"08F", -- 0x00E: MOV R15, 0x08 + "000111" & X"000", -- 0x00F: MOVX (R00), 0x00 + "010001" & X"010", -- 0x010: INC R00 + "010101" & X"01F", -- 0x011: DEC R15 + "110010" & X"00F", -- 0x012: JNZ 0x00F + "101000" & X"080", -- 0x013: XIN R00, (0x08) + "001111" & X"400", -- 0x014: CMP R00, 0x40 + "111001" & X"025", -- 0x015: JEQ 0x025 + "000011" & X"082", -- 0x016: MOV R02, 0x08 + "101000" & X"070", -- 0x017: XIN R00, (0x07) + "100100" & X"010", -- 0x018: XOUT (0x01), R00 + "011001" & X"040", -- 0x019: AND R00, 0x04 + "110010" & X"017", -- 0x01A: JNZ 0x017 + "000011" & X"100", -- 0x01B: MOV R00, 0x10 + "100100" & X"070", -- 0x01C: XOUT (0x07), R00 + "010101" & X"022", -- 0x01D: SUB R02, 0x02 + "110010" & X"017", -- 0x01E: JNZ 0x017 + "111011" & X"072", -- 0x01F: CALL 0x072 + "000011" & X"060", -- 0x020: MOV R00, 0x06 + "100100" & X"070", -- 0x021: XOUT (0x07), R00 + "000011" & X"080", -- 0x022: MOV R00, 0x08 + "111011" & X"084", -- 0x023: CALL 0x084 + "110000" & X"013", -- 0x024: JMP 0x013 + "111011" & X"094", -- 0x025: CALL 0x094 + "111011" & X"07D", -- 0x026: CALL 0x07D + "000011" & X"000", -- 0x027: MOV R00, 0x00 + "001101" & X"000", -- 0x028: MOVC (0x00), R00 + "101000" & X"080", -- 0x029: XIN R00, (0x08) + "001111" & X"400", -- 0x02A: CMP R00, 0x40 + "111001" & X"046", -- 0x02B: JEQ 0x046 + "000011" & X"082", -- 0x02C: MOV R02, 0x08 + "001010" & X"001", -- 0x02D: MOVC R01, (0x00) + "000011" & X"800", -- 0x02E: MOV R00, 0x80 + "000011" & X"08F", -- 0x02F: MOV R15, 0x08 + "000110" & X"001", -- 0x030: MOVX (R01), R00 + "010001" & X"010", -- 0x031: INC R00 + "010001" & X"011", -- 0x032: INC R01 + "010101" & X"01F", -- 0x033: DEC R15 + "110010" & X"030", -- 0x034: JNZ 0x030 + "101000" & X"070", -- 0x035: XIN R00, (0x07) + "100100" & X"010", -- 0x036: XOUT (0x01), R00 + "011001" & X"040", -- 0x037: AND R00, 0x04 + "110010" & X"035", -- 0x038: JNZ 0x035 + "000011" & X"100", -- 0x039: MOV R00, 0x10 + "100100" & X"070", -- 0x03A: XOUT (0x07), R00 + "001010" & X"000", -- 0x03B: MOVC R00, (0x00) + "010001" & X"010", -- 0x03C: INC R00 + "001101" & X"000", -- 0x03D: MOVC (0x00), R00 + "010101" & X"022", -- 0x03E: SUB R02, 0x02 + "110010" & X"02D", -- 0x03F: JNZ 0x02D + "111011" & X"072", -- 0x040: CALL 0x072 + "000011" & X"060", -- 0x041: MOV R00, 0x06 + "100100" & X"070", -- 0x042: XOUT (0x07), R00 + "000011" & X"080", -- 0x043: MOV R00, 0x08 + "111011" & X"084", -- 0x044: CALL 0x084 + "110000" & X"029", -- 0x045: JMP 0x029 + "111011" & X"094", -- 0x046: CALL 0x094 + "111011" & X"07D", -- 0x047: CALL 0x07D + "000011" & X"000", -- 0x048: MOV R00, 0x00 + "001101" & X"000", -- 0x049: MOVC (0x00), R00 + "101000" & X"0A0", -- 0x04A: XIN R00, (0x0A) + "001111" & X"400", -- 0x04B: CMP R00, 0x40 + "111001" & X"07A", -- 0x04C: JEQ 0x07A + "111011" & X"072", -- 0x04D: CALL 0x072 + "000011" & X"050", -- 0x04E: MOV R00, 0x05 + "100100" & X"070", -- 0x04F: XOUT (0x07), R00 + "000011" & X"083", -- 0x050: MOV R03, 0x08 + "101000" & X"070", -- 0x051: XIN R00, (0x07) + "100100" & X"010", -- 0x052: XOUT (0x01), R00 + "011001" & X"200", -- 0x053: AND R00, 0x20 + "110010" & X"051", -- 0x054: JNZ 0x051 + "001010" & X"001", -- 0x055: MOVC R01, (0x00) + "000011" & X"800", -- 0x056: MOV R00, 0x80 + "000011" & X"08F", -- 0x057: MOV R15, 0x08 + "000100" & X"002", -- 0x058: MOVX R02, (R00) + "001110" & X"012", -- 0x059: CMP R02, R01 + "111010" & X"07B", -- 0x05A: JNE 0x07B + "010001" & X"010", -- 0x05B: INC R00 + "010001" & X"011", -- 0x05C: INC R01 + "010101" & X"01F", -- 0x05D: DEC R15 + "110010" & X"058", -- 0x05E: JNZ 0x058 + "000011" & X"200", -- 0x05F: MOV R00, 0x20 + "100100" & X"070", -- 0x060: XOUT (0x07), R00 + "001010" & X"000", -- 0x061: MOVC R00, (0x00) + "010001" & X"010", -- 0x062: INC R00 + "001101" & X"000", -- 0x063: MOVC (0x00), R00 + "010101" & X"023", -- 0x064: SUB R03, 0x02 + "110010" & X"051", -- 0x065: JNZ 0x051 + "000011" & X"080", -- 0x066: MOV R00, 0x08 + "111011" & X"084", -- 0x067: CALL 0x084 + "110000" & X"04A", -- 0x068: JMP 0x04A + "111100" & X"000", -- 0x069: PUSH R00 + "000011" & X"800", -- 0x06A: MOV R00, 0x80 + "100100" & X"070", -- 0x06B: XOUT (0x07), R00 + "101000" & X"070", -- 0x06C: XIN R00, (0x07) + "100100" & X"010", -- 0x06D: XOUT (0x01), R00 + "011001" & X"800", -- 0x06E: AND R00, 0x80 + "110001" & X"06C", -- 0x06F: JZ 0x06C + "111101" & X"000", -- 0x070: POP R00 + "111110" & X"000", -- 0x071: RET + "111011" & X"069", -- 0x072: CALL 0x069 + "111100" & X"000", -- 0x073: PUSH R00 + "101000" & X"070", -- 0x074: XIN R00, (0x07) + "100100" & X"010", -- 0x075: XOUT (0x01), R00 + "011001" & X"010", -- 0x076: AND R00, 0x01 + "110010" & X"074", -- 0x077: JNZ 0x074 + "111101" & X"000", -- 0x078: POP R00 + "111110" & X"000", -- 0x079: RET + "110000" & X"07C", -- 0x07A: JMP 0x07C + "110000" & X"07C", -- 0x07B: JMP 0x07C + "110000" & X"00C", -- 0x07C: JMP 0x00C + "111100" & X"000", -- 0x07D: PUSH R00 + "000011" & X"000", -- 0x07E: MOV R00, 0x00 + "100100" & X"080", -- 0x07F: XOUT (0x08), R00 + "100100" & X"090", -- 0x080: XOUT (0x09), R00 + "100100" & X"0A0", -- 0x081: XOUT (0x0A), R00 + "111101" & X"000", -- 0x082: POP R00 + "111110" & X"000", -- 0x083: RET + "111100" & X"001", -- 0x084: PUSH R01 + "111100" & X"002", -- 0x085: PUSH R02 + "111100" & X"003", -- 0x086: PUSH R03 + "101000" & X"081", -- 0x087: XIN R01, (0x08) + "101000" & X"092", -- 0x088: XIN R02, (0x09) + "101000" & X"0A3", -- 0x089: XIN R03, (0x0A) + "010000" & X"001", -- 0x08A: ADD R01, R00 + "010011" & X"002", -- 0x08B: ADDC R02, 0x00 + "010011" & X"003", -- 0x08C: ADDC R03, 0x00 + "100100" & X"081", -- 0x08D: XOUT (0x08), R01 + "100100" & X"092", -- 0x08E: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x08F: XOUT (0x0A), R03 + "111101" & X"003", -- 0x090: POP R03 + "111101" & X"002", -- 0x091: POP R02 + "111101" & X"001", -- 0x092: POP R01 + "111110" & X"000", -- 0x093: RET + "111110" & X"000", -- 0x094: RET + "111110" & X"000", -- 0x095: RET + "111110" & X"000", -- 0x096: RET + "111110" & X"000", -- 0x097: RET + "011001" & X"0F0", -- 0x098: AND R00, 0x0F + "001111" & X"0A0", -- 0x099: CMP R00, 0x0A + "110101" & X"09C", -- 0x09A: JLT 0x09C + "010001" & X"070", -- 0x09B: ADD R00, 0x07 + "010001" & X"300", -- 0x09C: ADD R00, 0x30 + "111110" & X"000", -- 0x09D: RET + "111100" & X"000", -- 0x09E: PUSH R00 + "111011" & X"098", -- 0x09F: CALL 0x098 + "000010" & X"001", -- 0x0A0: MOV R01, R00 + "111101" & X"000", -- 0x0A1: POP R00 + "101010" & X"000", -- 0x0A2: SWAP R00 + "111011" & X"098", -- 0x0A3: CALL 0x098 + "111110" & X"000", -- 0x0A4: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdram_test_short_xrom.vhdl b/projects/cpu/src/systest/sdram_test_short_xrom.vhdl new file mode 100644 index 0000000..a1abe9f --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_short_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE sdram_test_short OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from sdram_test_short.jsm + constant xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"56", -- 0x39 + X"65", -- 0x3A + X"72", -- 0x3B + X"69", -- 0x3C + X"66", -- 0x3D + X"79", -- 0x3E + X"20", -- 0x3F + X"4F", -- 0x40 + X"4B", -- 0x41 + X"00", -- 0x42 + X"46", -- 0x43 + X"61", -- 0x44 + X"69", -- 0x45 + X"6C", -- 0x46 + X"65", -- 0x47 + X"64", -- 0x48 + X"20", -- 0x49 + X"61", -- 0x4A + X"74", -- 0x4B + X"20", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end sdram_test_short; + diff --git a/projects/cpu/src/systest/sdram_test_short_xrom_ld.vhdl b/projects/cpu/src/systest/sdram_test_short_xrom_ld.vhdl new file mode 100644 index 0000000..fbee0fd --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_short_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdram_test_short.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"56", -- 0x39 + X"65", -- 0x3A + X"72", -- 0x3B + X"69", -- 0x3C + X"66", -- 0x3D + X"79", -- 0x3E + X"20", -- 0x3F + X"4F", -- 0x40 + X"4B", -- 0x41 + X"00", -- 0x42 + X"46", -- 0x43 + X"61", -- 0x44 + X"69", -- 0x45 + X"6C", -- 0x46 + X"65", -- 0x47 + X"64", -- 0x48 + X"20", -- 0x49 + X"61", -- 0x4A + X"74", -- 0x4B + X"20", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/sdram_test_xrom.vhdl b/projects/cpu/src/systest/sdram_test_xrom.vhdl new file mode 100644 index 0000000..70009b2 --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE sdram_test OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from sdram_test.jsm + constant xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"56", -- 0x39 + X"65", -- 0x3A + X"72", -- 0x3B + X"69", -- 0x3C + X"66", -- 0x3D + X"79", -- 0x3E + X"20", -- 0x3F + X"4F", -- 0x40 + X"4B", -- 0x41 + X"00", -- 0x42 + X"46", -- 0x43 + X"61", -- 0x44 + X"69", -- 0x45 + X"6C", -- 0x46 + X"65", -- 0x47 + X"64", -- 0x48 + X"20", -- 0x49 + X"61", -- 0x4A + X"74", -- 0x4B + X"20", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end sdram_test; + diff --git a/projects/cpu/src/systest/sdram_test_xrom_ld.vhdl b/projects/cpu/src/systest/sdram_test_xrom_ld.vhdl new file mode 100644 index 0000000..4c413ef --- /dev/null +++ b/projects/cpu/src/systest/sdram_test_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from sdram_test.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"56", -- 0x39 + X"65", -- 0x3A + X"72", -- 0x3B + X"69", -- 0x3C + X"66", -- 0x3D + X"79", -- 0x3E + X"20", -- 0x3F + X"4F", -- 0x40 + X"4B", -- 0x41 + X"00", -- 0x42 + X"46", -- 0x43 + X"61", -- 0x44 + X"69", -- 0x45 + X"6C", -- 0x46 + X"65", -- 0x47 + X"64", -- 0x48 + X"20", -- 0x49 + X"61", -- 0x4A + X"74", -- 0x4B + X"20", -- 0x4C + X"00", -- 0x4D + X"2E", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/systest.bak.vhd b/projects/cpu/src/systest/systest.bak.vhd new file mode 100644 index 0000000..c6defd8 --- /dev/null +++ b/projects/cpu/src/systest/systest.bak.vhd @@ -0,0 +1,1099 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: system test using Xilinx ML-402 + +-- 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; +use std.textio.all; -- Imports the standard textio package. + +Library UNISIM; +use UNISIM.vcomponents.all; + +library work; +use work.cpu_pkg.all; +use work.vga_types.all; +use work.fifo_ctrl_pkg.all; +use work.sdram_config.all; +use work.sdram_types.all; + +ENTITY systest IS +GENERIC +( + sys_freq : integer := 100E6; + ddr_phaseshift : integer := 0; + ddr_frequency_hz : integer := 100E6; + tsvga : vga_timespec_t := ts_vga_1280_1024_72 +); +PORT +( + sys_rst_n_in : in std_logic; + sys_clk_in : in std_logic; + + -- Buttons and LEDs + sys_btn : in unsigned(4 downto 0); + sys_dip : in unsigned(7 downto 0); + sys_led : out unsigned(8 downto 0); + + -- UART + sys_rx : in std_logic; + sys_tx : out std_logic; + + -- LCD + sys_lcd_d : inout unsigned(3 downto 0); + sys_lcd_e : out std_logic; + sys_lcd_rs : out std_logic; + sys_lcd_rw : out std_logic; + + -- DDR SDRAM + sys_sdr_clk_p : out std_logic; -- ddr_sdram_clock + sys_sdr_clk_n : out std_logic; -- /ddr_sdram_clock + sys_sdr_cke_q : out std_logic; -- clock enable + sys_sdr_cs_qn : out std_logic; -- /chip select + sys_sdr_ras_qn : out std_logic; -- /ras + sys_sdr_cas_qn : out std_logic; -- /cas + sys_sdr_we_qn : out std_logic; -- /write enable + sys_sdr_dm_q : out unsigned(DDR_DM_WIDTH-1 downto 0); -- data mask bits, set to "00" + sys_sdr_dqs_q : inout unsigned(DDR_DQS_WIDTH-1 downto 0); -- data strobe, only for write + sys_sdr_ba_q : out unsigned(DDR_BANK_WIDTH-1 downto 0); -- bank select + sys_sdr_a_q : out unsigned(DDR_ADDR_WIDTH-1 downto 0); -- address bus + sys_sdr_data : inout unsigned(DDR_DATA_WIDTH-1 downto 0); -- bidir data bus + sys_sdr_clk_fb : in std_logic; + + -- VGA + sys_vga_red : out unsigned(7 downto 0); + sys_vga_green : out unsigned(7 downto 0); + sys_vga_blue : out unsigned(7 downto 0); + sys_vga_blank_n : out std_logic; + sys_vga_sync_n : out std_logic; + sys_vga_hsync : out std_logic; + sys_vga_vsync : out std_logic; + sys_vga_clk : out std_logic; + + sys_error : out unsigned(1 downto 0) -- indicates Errors + +); +-- attribute BUFFER_TYPE : string; +-- attribute BUFFER_TYPE of sys_clk_in : signal is "BUFG"; +-- attribute BUFFER_TYPE of sys_sdr_dcm_clk_fb : signal is "BUFG"; + +END systest; + +ARCHITECTURE behavior OF systest IS + + COMPONENT cpu_embedded + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); + END COMPONENT; + + COMPONENT xrom + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + END COMPONENT; + + COMPONENT lcd_port + PORT ( + rst : in std_logic; + clk : in std_logic; + we : in std_logic; + din : in unsigned(7 downto 0); + dout : out unsigned(7 downto 0); + lcd_d : inout unsigned(3 downto 0); + lcd_e : out std_logic; + lcd_rs : out std_logic; + lcd_rw : out std_logic + ); + END COMPONENT; + +-- +-- declaration of UART transmitter with integral 16 byte FIFO buffer +-- + component uart_tx + Port ( data_in : in std_logic_vector(7 downto 0); + write_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + serial_out : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; +-- +-- declaration of UART Receiver with integral 16 byte FIFO buffer +-- + component uart_rx + Port ( serial_in : in std_logic; + data_out : out std_logic_vector(7 downto 0); + read_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + buffer_data_present : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; + + signal rst : std_logic; + signal rst_in : std_logic; + signal started_up : std_logic := '1'; + signal clk : std_logic; + signal int_in, int_ack, int_en, io_sel, int_force : std_logic; + + signal cpu_baudrate : dmem_data_t; + signal cpu_din : dmem_data_t; + signal cpu_dout : dmem_data_t; + signal cpu_addr : dmem_addr_t; + signal cpu_we : std_logic; + signal cpu_re : std_logic; + signal ctrl_reg : dmem_data_t; + signal led_reg : dmem_data_t; + signal cpu_lcd_out_reg, cpu_lcd_in_reg, reg_uart_tx: dmem_data_t; + signal cpu_lcd_we : std_logic; + signal cpu_sdr_buf_we, cpu_sdr_valid : std_logic; + signal cpu_color : color_t; + signal cpu_vga_enable : std_logic; + signal cpu_error_leds : unsigned(1 downto 0); + -- + -- Signals for connection of peripherals + -- + signal uart_status_port : dmem_data_t; + -- + -- Signals to form an timer generating an interrupt every microsecond + -- + constant timer_reload : integer := 99999; + signal timer_count : integer range 0 to 99999 :=0; + signal timer_pulse, timer_en : std_logic; + -- + -- Signals for UART connections + -- + signal baud_count : integer range 0 to 255 :=0; + signal en_16_x_baud : std_logic; + signal write_to_uart : std_logic; + signal tx_full : std_logic; + signal tx_half_full : std_logic; + signal read_from_uart : std_logic; + signal rx_data : std_logic_vector(7 downto 0); + signal rx_data_present : std_logic; + signal rx_full : std_logic; + signal rx_half_full : std_logic; + + -- X-ROM + signal xrom_data : dmem_data_t; + signal sdr_data : dmem_data_t; + + -- DDR SDRAM + constant BURST_LEN : natural := 8; + subtype sdr_buf_t is unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_buf_in, sdr_vga_data : sdr_buf_t := (others => '0'); + signal cpu_sd_ack : std_logic; + + signal cpu_sd_request_strobe : std_logic; + signal sdr_tag_in : user_tag_t; + signal sdr_tag_wr : user_tag_t; + signal sdr_tag_rd : user_tag_t; + signal sdr_ucmd : user_cmd_t; + signal cpu_sd_cmd : user_cmd_t; + signal cpu_sd_cmd_we : std_logic; + signal sdr_ucmd_vld : std_logic; + signal cpu_sdr_addr : user_addr_t; + signal cpu_vga_read_offset : user_addr_t; + signal sdr_addr : user_addr_t; + signal sdr_busy_q : std_logic; + signal sdr_udata_in : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_udata_req_wr : std_logic; + signal sdr_udata_out_q : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_udata_vld_q : std_logic; + + signal cmd_fifo_din : unsigned(29 downto 0); + signal cmd_fifo_dout : unsigned(29 downto 0); + signal cmd_fifo_re : std_logic; + signal cmd_fifo_we : std_logic; + signal cmd_fifo_full : std_logic; + signal cmd_fifo_empty : std_logic; + + signal cpu_write_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_write_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_write_fifo_re : std_logic; + signal cpu_write_fifo_we : std_logic; + signal cpu_write_fifo_full : std_logic; + signal cpu_write_fifo_empty : std_logic; + + signal cpu_read_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_read_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_read_fifo_re : std_logic; + signal cpu_read_fifo_we : std_logic; + signal cpu_read_fifo_full : std_logic; + signal cpu_read_fifo_empty : std_logic; + + alias tag_fifo_in is cmd_fifo_din(29 downto 26); + alias cmd_fifo_in is cmd_fifo_din(25 downto 24); + alias addr_fifo_in is cmd_fifo_din(23 downto 0); + alias tag_fifo_out is cmd_fifo_dout(29 downto 26); + alias cmd_fifo_out is cmd_fifo_dout(25 downto 24); + alias addr_fifo_out is cmd_fifo_dout(23 downto 0); + +-- attribute rom_style: string; +-- attribute rom_style of cmd_fifo_dout: signal is "DISTRIBUTED"; +-- attribute rom_style of cpu_cpu_write_fifo_dout: signal is "DISTRIBUTED"; +-- attribute rom_style of cpu_read_fifo_dout: signal is "DISTRIBUTED"; + + -- VGA + signal vga_clk : std_logic; + signal vga_ready : std_logic; + signal vga_color_w : color_t; + signal vga_color : color_t; + signal vga_color_we : std_logic; + signal vga_fifo_full : std_logic; + signal vga_fifo_almost_full : std_logic; + signal vga_hsync : std_logic; + signal vga_vsync : std_logic; + signal vga_pos_x : natural range 0 to tsvga.ts_h.ncyc_scan-1; + signal vga_pos_y : natural range 0 to tsvga.ts_v.ncyc_scan-1; + signal vga_scan_x : std_logic; + signal vga_scan_y : std_logic; + signal vga_scan_rdy : std_logic; + signal vga_scan_rdy_h : std_logic; + signal vga_scan_rdy_v : std_logic; + signal vga_active : std_logic; + + type vga_cmd_state_t is (vga_cmd_s_init, vga_cmd_s_idle, vga_cmd_s_request, vga_cmd_s_access); + signal vga_cmd_s, vga_cmd_sn : vga_cmd_state_t; + + type vga_data_state_t is (vga_data_s_init, vga_data_s_idle, vga_data_s_read1, vga_data_s_read2); + signal vga_data_s, vga_data_sn : vga_data_state_t; + + type sd_ctrl_state_t is (s_sd_idle, s_sd_vga_access_grant, s_sd_vga_access, s_sd_cpu_access_grant, s_sd_cpu_access); + signal st, stn : sd_ctrl_state_t; + + signal sd_vga_access : std_logic; + signal sd_cpu_access : std_logic; + signal sd_vga_request : std_logic; + signal sd_cpu_request : std_logic; + + -- Character generator + signal cg_rst : std_logic; + signal cg_en : std_logic; + signal cg_ready : std_logic; + signal cg_clr_screen : std_logic; + signal cg_clr_line : std_logic; + signal cg_ascii_data : dmem_data_t; + signal cg_ascii_data_we : std_logic; + signal cg_ascii_posy_we : std_logic; + signal cg_ascii_posx_we : std_logic; + signal cg_draw_en : std_logic; + signal cg_color : color_t; + + -- DDR to VGA + signal vga_cmd_cnt : natural range 0 to 255; + signal vga_pixel_cnt : natural range 0 to tsvga.ts_h.ncyc_scan*tsvga.ts_v.ncyc_scan-1; + signal vga_sd_addr : user_addr_t; + signal vga_sd_valid : std_logic; + signal vga_pixel_cnt_en : std_logic; + signal vga_sd_cmd : user_cmd_t; + signal vga_sd_cmd_we : std_logic; + + signal vga_read_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal vga_read_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal vga_read_fifo_re : std_logic; + signal vga_read_fifo_we : std_logic; + signal vga_read_fifo_full : std_logic; + signal vga_read_fifo_empty : std_logic; + signal vga_read_fifo_almost_full : std_logic; + signal vga_read_fifo_almost_empty : std_logic; + +BEGIN + + int_in <= sys_btn(4) or sys_dip(7) or timer_pulse or int_force or rx_data_present; + rst_in <= not (started_up and sys_rst_n_in); + uart_status_port <= "000" & rx_data_present & rx_full & rx_half_full & tx_full & tx_half_full ; + + -- VGA mapping + sys_vga_clk <= vga_clk; + sys_vga_red <= vga_color(r); + sys_vga_green <= vga_color(g); + sys_vga_blue <= vga_color(b); + vga_scan_rdy <= vga_scan_rdy_h and vga_scan_rdy_v; + sys_error <= cpu_error_leds; + + cg_en <= vga_scan_x and vga_scan_y; + cg_rst <= rst; + +------------------------------------------------------------------ +cpu_sdr_buffer: + process(clk) + variable index, lo, hi : integer; + begin + if rising_edge(clk) then + index := to_integer(cpu_addr(2 downto 0)); + hi := dmem_data_t'length*(index+1)-1; + lo := dmem_data_t'length*(index); + if cpu_sdr_buf_we = '1' then + sdr_buf_in(hi downto lo) <= cpu_dout; + end if; + sdr_data <= cpu_read_fifo_dout(hi downto lo); + end if; + end process; + +------------------------------------------------------------------ +led_out: + process(rst, clk) + begin + if rst = '1' then + sys_led <= (others => '0'); + elsif rising_edge(clk) then + sys_led <= int_in & led_reg; + end if; + end process; + +------------------------------------------------------------------ +timer: + process(rst, clk, timer_count, timer_en) + begin + if rst = '1' then + timer_count <= timer_reload; + timer_pulse <= '0'; + elsif rising_edge(clk) then + timer_pulse <= '0'; + if timer_count /= 0 then + if timer_en = '1' then + timer_count <= timer_count - 1; + end if; + else + timer_pulse <= '1'; + timer_count <= timer_reload; + end if; + end if; + end process; + +------------------------------------------------------------------ +reg_mux: + process(clk) + variable data : dmem_data_t; + variable addr : dmem_addr_t; + variable is_io : boolean; + variable cpu_read : std_logic; + begin + + read_from_uart <= '0'; + if rising_edge(clk) then + addr := cpu_addr; + is_io := (io_sel = '1'); + cpu_read := cpu_re; + end if; + + if is_io then + case addr is + when X"00" => -- 00 + data := "0000" & unsigned(sys_btn(3 downto 0)); + when X"01" => -- 01 + data := led_reg; + when X"02" => -- 02 + data := unsigned(rx_data); + read_from_uart <= cpu_read; + when X"03" => -- 03 + data := cpu_lcd_in_reg; + when X"04" => -- 04 + data := int_force & '0' & cpu_error_leds & '0' & cpu_vga_enable & timer_en & int_en; + when X"05" => -- 05 + data := unsigned(sys_dip); + when X"06" => -- 06 + data := uart_status_port; + when X"07" => -- 07 + data := sd_cpu_access & sd_vga_access & cpu_read_fifo_empty & cpu_read_fifo_full & cpu_write_fifo_empty & cpu_write_fifo_full & cmd_fifo_empty & cmd_fifo_full; + when X"08" => -- 08 + data := cpu_sdr_addr(7 downto 0); + when X"09" => -- 09 + data := cpu_sdr_addr(15 downto 8); + when X"0A" => -- 10 + data := cpu_sdr_addr(23 downto 16); + when X"0E" => + data := (not rst) & "00000" & cg_ready & vga_ready; + when X"13" => -- 10 + data := cpu_baudrate; + when others => + data := X"00"; + end case; + else + if cpu_addr(7) = '1' then + data := sdr_data; + else + data := xrom_data; + end if; + end if; + cpu_din <= data; + + end process; + +------------------------------------------------------------------ +ctrl_reg_write: + process(rst, clk) + variable addr : unsigned(dmem_addr_t'length-1 downto 0); + begin + if (rst = '1') then + cpu_color <= (X"80", X"80", X"80"); + cpu_error_leds <= (others => '0'); + int_force <= '0'; + int_en <= '0'; + timer_en <= '0'; + led_reg <= (others => '0'); + cpu_lcd_out_reg <= (others => '0'); + reg_uart_tx <= (others => '0'); + cpu_sdr_addr <= (others => '0'); + cg_ascii_data <= (others => '0'); + cg_ascii_posy_we <= '0'; + cg_ascii_posx_we <= '0'; + cg_ascii_data_we <= '0'; + cg_clr_line <= '0'; + cg_clr_screen <= '0'; + cpu_read_fifo_re <= '0'; + cpu_write_fifo_we <= '0'; + cpu_sd_cmd_we <= '0'; + cpu_sd_cmd <= UCMD_NOP; + cpu_sd_request_strobe <= '0'; + cpu_vga_enable <= '0'; + cpu_baudrate <= to_unsigned(53, dmem_data_t'length); + cpu_vga_read_offset <= (others => '0'); + elsif rising_edge(clk) then + int_force <= '0'; + write_to_uart <= '0'; + cpu_lcd_we <= '0'; + cpu_sdr_buf_we <= '0'; + cg_ascii_posy_we <= '0'; + cg_ascii_posx_we <= '0'; + cg_ascii_data_we <= '0'; + cg_clr_line <= '0'; + cg_clr_screen <= '0'; + cpu_read_fifo_re <= '0'; + cpu_write_fifo_we <= '0'; + cpu_sd_cmd_we <= '0'; + cpu_sd_request_strobe <= '0'; + addr := cpu_addr; + if cpu_we = '1' then + if io_sel = '1' then + case addr is + when X"01" => -- 01 + led_reg <= cpu_dout; + when X"02" => -- 02 + reg_uart_tx <= cpu_dout; + write_to_uart <= '1'; + when X"03" => -- 03 + cpu_lcd_we <= '1'; + cpu_lcd_out_reg <= cpu_dout; + when X"04" => -- 04 + int_force <= cpu_dout(7); + cpu_error_leds <= cpu_dout(5 downto 4); + cpu_vga_enable <= cpu_dout(2); + timer_en <= cpu_dout(1); + int_en <= cpu_dout(0); + when X"07" => -- 07 + cpu_sd_request_strobe <= cpu_dout(7); + cpu_read_fifo_re <= cpu_dout(5); + cpu_write_fifo_we <= cpu_dout(4); + cpu_sd_cmd_we <= cpu_dout(2); + cpu_sd_cmd <= cpu_dout(1 downto 0); + when X"08" => -- 08 + cpu_sdr_addr(7 downto 0) <= cpu_dout; + when X"09" => -- 09 + cpu_sdr_addr(15 downto 8) <= cpu_dout; + when X"0A" => -- 10 + cpu_sdr_addr(23 downto 16) <= cpu_dout; + when X"0B" => -- 08 + cg_ascii_data <= cpu_dout; + cg_ascii_posx_we <= '1'; + when X"0C" => -- 09 + cg_ascii_data <= cpu_dout; + cg_ascii_posy_we <= '1'; + when X"0D" => -- 0A + cg_ascii_data <= cpu_dout; + cg_ascii_data_we <= '1'; + when X"0E" => -- 0B + cg_clr_screen <= cpu_dout(0); + cg_clr_line <= cpu_dout(1); + when X"10" => -- 04 + cpu_color(r) <= cpu_dout; + when X"11" => -- 04 + cpu_color(g) <= cpu_dout; + when X"12" => -- 04 + cpu_color(b) <= cpu_dout; + when X"13" => -- 04 + cpu_baudrate <= cpu_dout; + when X"14" => + cpu_vga_read_offset(7 downto 0) <= cpu_dout; + when X"15" => + cpu_vga_read_offset(15 downto 8) <= cpu_dout; + when X"16" => + cpu_vga_read_offset(23 downto 16) <= cpu_dout; + when others => null; + end case; + else + case addr is + when X"80"|X"81"|X"82"|X"83"|X"84"|X"85"|X"86"|X"87" => + cpu_sdr_buf_we <= '1'; + when others => null; + end case; + end if; + end if; + end if; + end process; + +------------------------------------------------------------------ + cpu_sd_request_flag: process (rst, clk) + begin + if (rst = '1') then + sd_cpu_request <= '0'; + elsif rising_edge(clk) then + if cpu_sd_request_strobe = '1' then + sd_cpu_request <= '1'; + elsif cpu_sd_ack = '1' then + sd_cpu_request <= '0'; + end if; + end if; + end process; + +------------------------------------------------------------------ +sdram_write_control: + process(st, sd_cpu_request, sd_vga_request, cpu_sd_cmd_we, vga_sd_cmd_we) + begin + cpu_sd_ack <= '0'; + sd_vga_access <= '0'; + sd_cpu_access <= '0'; + stn <= st; + + case st is + when s_sd_idle => + if sd_vga_request = '1' then + stn <= s_sd_vga_access_grant; + elsif sd_cpu_request = '1' then + stn <= s_sd_cpu_access_grant; + end if; + when s_sd_vga_access_grant => + sd_vga_access <= '1'; + if vga_sd_cmd_we = '1' then + stn <= s_sd_vga_access; + end if; + when s_sd_vga_access => + sd_vga_access <= '1'; + if vga_sd_cmd_we = '0' then + stn <= s_sd_idle; + end if; + when s_sd_cpu_access_grant => + cpu_sd_ack <= '1'; + sd_cpu_access <= '1'; + if cpu_sd_cmd_we = '1' then + stn <= s_sd_cpu_access; + end if; + when s_sd_cpu_access => + sd_cpu_access <= '1'; + if cpu_sd_cmd_we = '0' then + stn <= s_sd_idle; + end if; + when others => + stn <= s_sd_idle; + end case; + end process; + + process(rst, clk) + begin + if rst = '1' then + st <= s_sd_idle; + elsif rising_edge(clk) then + st <= stn; + end if; + end process; + +------------------------------------------------------------------ + vga_to_sd_cmd: process (vga_cmd_s, vga_cmd_cnt, cpu_vga_enable, vga_scan_rdy, vga_ready, sd_vga_access, cmd_fifo_full, vga_read_fifo_empty, vga_read_fifo_almost_empty) + begin + sd_vga_request <= '0'; + vga_sd_cmd <= UCMD_NOP; + vga_sd_cmd_we <= '0'; + vga_pixel_cnt_en <= '0'; + + vga_cmd_sn <= vga_cmd_s; + case vga_cmd_s is + when vga_cmd_s_init => + if vga_ready = '1' and vga_scan_rdy = '1' then + vga_cmd_sn <= vga_cmd_s_idle; + end if; + when vga_cmd_s_idle => + if cpu_vga_enable = '1' and vga_read_fifo_almost_empty = '1' then + vga_cmd_sn <= vga_cmd_s_request; + end if; + + when vga_cmd_s_request => + sd_vga_request <= '1'; + if sd_vga_access = '1' then + vga_cmd_sn <= vga_cmd_s_access; + end if; + + when vga_cmd_s_access => + if cmd_fifo_full = '0' and vga_cmd_cnt /= 64 then + vga_pixel_cnt_en <= '1'; + vga_sd_cmd <= UCMD_READ; + vga_sd_cmd_we <= '1'; + else + vga_cmd_sn <= vga_cmd_s_idle; + end if; + + when others => + vga_cmd_sn <= vga_cmd_s_idle; + + end case; + + end process; + + vga_cmd_nxt: process (rst, clk) + begin + if (rst = '1') then + vga_cmd_s <= vga_cmd_s_init; + elsif rising_edge(clk) then + vga_cmd_s <= vga_cmd_sn; + end if; + end process; + +------------------------------------------------------------------ + pixel_counter: process (rst, clk) + begin + if rst = '1' then + vga_cmd_cnt <= 0; + vga_pixel_cnt <= 0; + vga_sd_addr <= (others => '0'); + elsif rising_edge(clk) then + if vga_pixel_cnt_en = '1' then + if vga_pixel_cnt < tsvga.ts_h.ncyc_scan*tsvga.ts_v.ncyc_scan-BURST_LEN then + vga_pixel_cnt <= vga_pixel_cnt + BURST_LEN; + vga_cmd_cnt <= vga_cmd_cnt + 1; + vga_sd_addr <= vga_sd_addr + BURST_LEN; + else + vga_pixel_cnt <= 0; + vga_sd_addr <= cpu_vga_read_offset; + end if; + else + vga_cmd_cnt <= 0; + end if; + end if; + end process; + +------------------------------------------------------------------ + vga_to_sd_data: process (vga_data_s, vga_fifo_full, vga_read_fifo_empty, vga_read_fifo_dout, vga_scan_rdy, vga_fifo_almost_full) + begin + vga_read_fifo_re <= '0'; + vga_color_w <= (vga_read_fifo_dout(23 downto 16), vga_read_fifo_dout(15 downto 8), vga_read_fifo_dout(7 downto 0)); + vga_color_we <= '0'; + + vga_data_sn <= vga_data_s; + case vga_data_s is + when vga_data_s_init => + if vga_read_fifo_empty = '0' and vga_scan_rdy = '1' then + vga_data_sn <= vga_data_s_idle; + end if; + when vga_data_s_idle => + if vga_fifo_almost_full = '0' then + vga_data_sn <= vga_data_s_read1; + end if; + when vga_data_s_read1 => + vga_color_w <= (vga_read_fifo_dout(23 downto 16), vga_read_fifo_dout(15 downto 8), vga_read_fifo_dout(7 downto 0)); + if vga_read_fifo_empty = '0' then + if vga_fifo_full = '0' then + vga_color_we <= '1'; + vga_data_sn <= vga_data_s_read2; + else + vga_data_sn <= vga_data_s_idle; + end if; + end if; + when vga_data_s_read2 => + vga_color_w <= (vga_read_fifo_dout(47 downto 40), vga_read_fifo_dout(39 downto 32), vga_read_fifo_dout(31 downto 24)); + if vga_fifo_full = '0' then + vga_color_we <= '1'; + vga_read_fifo_re <= '1'; + vga_data_sn <= vga_data_s_read1; + end if; + + when others => + vga_data_sn <= vga_data_s_idle; + + end case; + + end process; + + vga_data_nxt: process (rst, clk) + begin + if (rst = '1') then + vga_data_s <= vga_data_s_init; + elsif rising_edge(clk) then + vga_data_s <= vga_data_sn; + end if; + end process; + +------------------------------------------------------------------ +inst_cpu_embedded: cpu_embedded + PORT MAP( + rst => rst, + clk => clk, + ce => '1', + int_in => int_in, + int_ack => int_ack, + xmem_we => cpu_we, + xmem_re => cpu_re, + xmem_din => cpu_din, + xmem_dout => cpu_dout, + xmem_addr => cpu_addr, + io_sel => io_sel + ); + + inst_xrom: xrom + PORT MAP( + clk => clk, + ce => '1', + addr => cpu_addr, + dout => xrom_data + ); + + inst_lcd_port: lcd_port + PORT MAP( + rst => rst, + clk => clk, + we => cpu_lcd_we, + din => cpu_lcd_out_reg, + dout => cpu_lcd_in_reg, + lcd_d => sys_lcd_d, + lcd_e => sys_lcd_e, + lcd_rs => sys_lcd_rs, + lcd_rw => sys_lcd_rw + ); + + transmit: uart_tx + port map ( data_in => std_logic_vector(reg_uart_tx), + write_buffer => write_to_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + serial_out => sys_tx, + buffer_full => tx_full, + buffer_half_full => tx_half_full, + clk => clk ); + + receive: uart_rx + port map ( serial_in => sys_rx, + data_out => rx_data, + read_buffer => read_from_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + buffer_data_present => rx_data_present, + buffer_full => rx_full, + buffer_half_full => rx_half_full, + clk => clk ); + + + -- Instantiate synchronous FIFO + inst_command_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 8, + data_width => 4+2+24, + almost_full_thresh => 240, + almost_empty_thresh => 16 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cmd_fifo_we, + re => cmd_fifo_re, + fifo_full => cmd_fifo_full, + fifo_empty => cmd_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cmd_fifo_din, + data_r => cmd_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_cpu_write_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 8, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 252, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cpu_write_fifo_we, + re => cpu_write_fifo_re, + fifo_full => cpu_write_fifo_full, + fifo_empty => cpu_write_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cpu_write_fifo_din, + data_r => cpu_write_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_cpu_read_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 8, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 252, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cpu_read_fifo_we, + re => cpu_read_fifo_re, + fifo_full => cpu_read_fifo_full, + fifo_empty => cpu_read_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cpu_read_fifo_din, + data_r => cpu_read_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_vga_read_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 10, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 960, + almost_empty_thresh => 128 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => vga_read_fifo_we, + re => vga_read_fifo_re, + fifo_full => vga_read_fifo_full, + fifo_empty => vga_read_fifo_empty, + fifo_afull => vga_read_fifo_almost_full, + fifo_aempty => vga_read_fifo_almost_empty, + data_w => vga_read_fifo_din, + data_r => vga_read_fifo_dout + ); + + tag_fifo_in <= "0001" when sd_cpu_access = '1' else "0010" when sd_vga_access = '1' else "0000"; + addr_fifo_in <= cpu_sdr_addr(23 downto 0) when sd_cpu_access = '1' else vga_sd_addr; + cmd_fifo_in <= cpu_sd_cmd when sd_cpu_access = '1' else vga_sd_cmd; + cmd_fifo_we <= cpu_sd_cmd_we when sd_cpu_access = '1' else vga_sd_cmd_we; + sdr_ucmd_vld <= (not cmd_fifo_empty) and (not sdr_busy_q); + sdr_ucmd <= cmd_fifo_out; + sdr_addr <= addr_fifo_out; + sdr_tag_in <= tag_fifo_out; + + cmd_fifo_re <= sdr_ucmd_vld; + sdr_udata_in <= cpu_write_fifo_dout; + cpu_read_fifo_we <= sdr_udata_vld_q when sdr_tag_rd = "0001" else '0'; + vga_read_fifo_we <= sdr_udata_vld_q when sdr_tag_rd = "0010" else '0'; + cpu_read_fifo_din <= sdr_udata_out_q; + vga_read_fifo_din <= sdr_udata_out_q; + + cpu_write_fifo_din <= sdr_buf_in; + cpu_write_fifo_re <= sdr_udata_req_wr and (not cpu_write_fifo_empty); + + -- DDR SDRAM Controller Core + inst_sdram_ctrl : entity work.sdram_ctrl_top + Generic map + ( + BL => BURST_LEN, + read_phaseshift => ddr_phaseshift, + f_sysclk => ddr_frequency_hz + ) + Port map + ( + + sys_rst_in => rst_in, + sys_clk_in => sys_clk_in, + + sys_rst_out => rst, + sys_clk_out => clk, + sys_clk_fb => sys_sdr_clk_fb, + + -- User interface + u_data_vld => sdr_udata_vld_q, + u_data_req_w => sdr_udata_req_wr, + u_data_req_r => open, + u_tag_in => sdr_tag_in, + u_tag_rd => sdr_tag_rd, + u_tag_wr => sdr_tag_wr, + u_busy => sdr_busy_q, + u_addr => sdr_addr, + u_cmd => sdr_ucmd, + u_cmd_we => sdr_ucmd_vld, + u_data_wr => sdr_udata_in, + u_data_rd => sdr_udata_out_q, + + -- SDRAM signals + sd_clk_p => sys_sdr_clk_p, + sd_clk_n => sys_sdr_clk_n, + sd_cke => sys_sdr_cke_q, + sd_cs_n => sys_sdr_cs_qn, + sd_cas_n => sys_sdr_cas_qn, + sd_ras_n => sys_sdr_ras_qn, + sd_we_n => sys_sdr_we_qn, + sd_addr => sys_sdr_a_q, + sd_ba => sys_sdr_ba_q, + sd_dm => sys_sdr_dm_q, + sd_dqs => sys_sdr_dqs_q, + sd_data => sys_sdr_data + + ); + + inst_vga_backend: entity work.vga_backend + GENERIC MAP + ( + sys_freq => sys_freq, + fifo_depth => 2048, + fifo_almost_full_thresh => 1920, + fifo_almost_empty_thresh => 128, + tsvga => tsvga + ) + PORT MAP + ( + sys_rst => rst, + sys_clk => clk, + vga_ready => vga_ready, + color_in => vga_color_w, + color_fifo_we => vga_color_we, + color_fifo_full => vga_fifo_full, + color_fifo_afull => vga_fifo_almost_full, + direct_color_in => cg_color, + direct_draw_en => cg_draw_en, + stat_hsync => vga_hsync, + stat_vsync => vga_vsync, + stat_hready => vga_scan_rdy_h, + stat_vready => vga_scan_rdy_v, + stat_hscan => vga_scan_x, + stat_vscan => vga_scan_y, + stat_hpos => vga_pos_x, + stat_vpos => vga_pos_y, + vga_clk_out => vga_clk, + vga_color_out => vga_color, + vga_blank_n => sys_vga_blank_n, + vga_sync_n => sys_vga_sync_n, + vga_hsync => sys_vga_hsync, + vga_vsync => sys_vga_vsync + + ); + + inst_char_gen : entity work.char_gen + GENERIC MAP + ( + tsvga => tsvga, + CHARACTER_SCALE => 1, + CHAR_ROM_SIZE_X => 8, -- Pixels + CHAR_ROM_SIZE_Y => 16, -- Pixels + CHAR_ROM_DEPTH => 256, -- Chars + MAX_CHAR_PER_LINE => 80, -- Chars + MAX_LINE_PER_FRAME => 32, -- Chars + CHAR_SPACING_X => 0, -- Pixels + CHAR_SPACING_Y => 0, -- Pixels + SCREEN_OFFSET_X => 16, -- Pixels + SCREEN_OFFSET_Y => 16 -- Pixels + ) + PORT MAP + ( + rst => rst, + sys_clk => clk, + vga_clk => vga_clk, + ce => cg_en, + frame_pulse => vga_scan_rdy, + clr_screen => cg_clr_screen, + clr_line => cg_clr_line, + ascii_data => cg_ascii_data, + ascii_data_we => cg_ascii_data_we, + ascii_posy_we => cg_ascii_posy_we, + ascii_posx_we => cg_ascii_posx_we, + ready => cg_ready, + pos_x => vga_pos_x, + pos_y => vga_pos_y, + char_draw_en => cg_draw_en + ); + + ------------------------------------------------------------------ + STARTUP_VIRTEX4_inst : STARTUP_VIRTEX4 + port map ( + EOS => started_up, -- End of Startup 1-bit output + CLK => open, -- Clock input for start-up sequence + GSR => '0', -- Global Set/Reset input (GSR cannot be used for the port name) + GTS => '0', -- Global 3-state input (GTS cannot be used for the port name) + USRCCLKO => '0', -- USRCCLKO 1-bit input + USRCCLKTS => '0', -- USRCCLKTS 1-bit input + USRDONEO => '0', -- USRDONEO 1-bit input + USRDONETS => '0' -- USRDONETS 1-bit input + ); + +------------------------------------------------------------------ + -- + -- Set baud rate to 38400 for the UART communications + -- Requires en_16_x_baud to be 614400Hz which is a single cycle pulse every 163 cycles at 100MHz + -- + -- NOTE : If the highest value for baud_count exceeds 127 you will need to adjust + -- the range of integers in the signal declaration for baud_count. + -- + +------------------------------------------------------------------ + proc_cg_color_sample: + process (vga_clk) + variable p0, p1 : color_t; + begin + if rising_edge(vga_clk) then + cg_color <= p1; + p1 := p0; + p0 := cpu_color; + end if; + end process; + + baud_timer: process(clk) + begin + if clk'event and clk='1' then + if baud_count=cpu_baudrate then + baud_count <= 0; + en_16_x_baud <= '1'; + else + baud_count <= baud_count + 1; + en_16_x_baud <= '0'; + end if; + end if; + end process baud_timer; + +END; diff --git a/projects/cpu/src/systest/systest.orig.vhd b/projects/cpu/src/systest/systest.orig.vhd new file mode 100644 index 0000000..76ec222 --- /dev/null +++ b/projects/cpu/src/systest/systest.orig.vhd @@ -0,0 +1,408 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: system test using Xilinx ML-402 + +-- 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; +use std.textio.all; -- Imports the standard textio package. + +Library UNISIM; +use UNISIM.vcomponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY systest IS +PORT +( + sys_rst_n_in : in std_logic; + sys_clk_in : in std_logic; + sys_btn : in std_logic_vector(4 downto 0); + sys_dip : in std_logic_vector(7 downto 0); + sys_led : out std_logic_vector(8 downto 0); + sys_rx : in std_logic; + sys_tx : out std_logic; + sys_lcd_d : inout std_logic_vector(3 downto 0); + sys_lcd_e : out std_logic; + sys_lcd_rs : out std_logic; + sys_lcd_rw : out std_logic +); +END systest; + + +ARCHITECTURE behavior OF systest IS + + COMPONENT embedded_cpu + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_WIDTH-1 downto 0) + ); + END COMPONENT; + +-- +-- declaration of UART transmitter with integral 16 byte FIFO buffer +-- + component uart_tx + Port ( data_in : in std_logic_vector(7 downto 0); + write_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + serial_out : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; +-- +-- declaration of UART Receiver with integral 16 byte FIFO buffer +-- + component uart_rx + Port ( serial_in : in std_logic; + data_out : out std_logic_vector(7 downto 0); + read_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + buffer_data_present : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; + + signal rst : std_logic; + signal clk, clk0 : std_logic; + signal ce : std_logic; + signal int_req, int_in, int_ack, int_en : std_logic; + + signal cpu_din : data_t; + signal cpu_dout : data_t; + signal cpu_addr : unsigned (DMEM_WIDTH-1 downto 0); + signal cpu_we, reg_sel : std_logic; + signal cpu_re : std_logic; + signal led_reg_we, lcd_reg_we, ctrl_reg_we : std_logic; + signal rom_dout, reg_dout, ctrl_reg : data_t; + signal led_reg : data_t; + signal lcd_reg_out, lcd_reg_in: data_t; + -- + -- Signals for connection of peripherals + -- + signal uart_status_port : data_t; + -- + -- Signals to form an timer generating an interrupt every microsecond + -- + constant timer_reload : integer := 99999; + signal timer_count : integer range 0 to 99999 :=0; + signal timer_pulse, timer_en : std_logic; + -- + -- Signals for UART connections + -- + signal baud_count : integer range 0 to 255 :=0; + signal en_16_x_baud : std_logic; + signal write_to_uart : std_logic; + signal tx_full : std_logic; + signal tx_half_full : std_logic; + signal read_from_uart : std_logic; + signal rx_data : std_logic_vector(7 downto 0); + signal rx_data_present : std_logic; + signal rx_full : std_logic; + signal rx_half_full : std_logic; + + signal rom_addr : unsigned(5 downto 0); + signal reg_addr : unsigned(5 downto 0); + + constant rom_data : string(1 to 64) := + ( + "J-CPU V1.0 " & + ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & + ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & + ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & + ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' & ' ' + + ); + constant lcd_e : integer := 7; + constant lcd_rs : integer := 6; + constant lcd_rw : integer := 5; + +BEGIN + + int_in <= sys_btn(4) or sys_dip(7) or timer_pulse or ctrl_reg(7) or rx_data_present; + clk0 <= sys_clk_in; + ce <= not rst; + int_en <= ctrl_reg(0); + timer_en <= ctrl_reg(1); + sys_led(8) <= int_in; + sys_led (7 downto 0) <= std_logic_vector(led_reg(7 downto 0)); + uart_status_port <= "000" & rx_data_present & rx_full & rx_half_full & tx_full & tx_half_full ; + sys_lcd_d <= std_logic_vector(lcd_reg_out(3 downto 0)) when lcd_reg_out(lcd_rw) = '0' else (others => 'Z'); + sys_lcd_e <= lcd_reg_out(lcd_e); + sys_lcd_rw <= lcd_reg_out(lcd_rw); + sys_lcd_rs <= lcd_reg_out(lcd_rs); + rom_addr <= cpu_addr(5 downto 0); + reg_addr <= cpu_addr(5 downto 0); + + BUFG_inst : BUFG + port map ( + O => clk, -- Clock buffer output + I => clk0 -- Clock buffer input + ); + +clock_halbe: + process(sys_rst_n_in, sys_clk_in) + variable reset_latency : integer range 0 to 999 := 999; + begin + if sys_rst_n_in = '0' then +-- clk0 <= '0'; + rst <= '1'; + reset_latency := 999; + elsif rising_edge(sys_clk_in) then + rst <= '1'; +-- clk0 <= not clk0; + if reset_latency /= 0 then + reset_latency := reset_latency - 1; + else + rst <= '0'; + end if; + end if; + end process; + +timer: + process(rst, clk, timer_count, timer_en) + begin + if rst = '1' then + timer_count <= timer_reload; + timer_pulse <= '0'; + elsif rising_edge(clk) then + timer_pulse <= '0'; + if timer_count /= 0 then + if timer_en = '1' then + timer_count <= timer_count - 1; + end if; + else + timer_pulse <= '1'; + timer_count <= timer_reload; + end if; + end if; + end process; + +reg_mux: + process(clk, reg_addr, reg_sel, cpu_we, cpu_re, sys_btn, sys_dip, lcd_reg_in, led_reg, uart_status_port) + variable data : data_t; + begin + led_reg_we <= '0'; + lcd_reg_we <= '0'; + ctrl_reg_we <= '0'; + write_to_uart <= '0'; + read_from_uart <= '0'; + data := (others => '-'); + + if reg_sel = '1' then + case reg_addr(2 downto 0) is + + when "000" => -- C0 + data := "0000" & unsigned(sys_btn(3 downto 0)); + when "001" => -- C1 + data := led_reg; + led_reg_we <= cpu_we; + when "010" => -- C2 + data := unsigned(rx_data); + write_to_uart <= cpu_we; + read_from_uart <= cpu_re; + when "011" => -- C3 + data := lcd_reg_in; + lcd_reg_we <= cpu_we; + when "100" => -- C4 + data := ctrl_reg; + ctrl_reg_we <= cpu_we; + when "101" => -- C5 + data := unsigned(sys_dip); + when "110" => -- C6 + data := uart_status_port; + when others => null; + end case; + + end if; + + if rising_edge(clk) then + reg_dout <= data; + end if; + + end process; + +din_mux: + process(clk, cpu_addr, cpu_we, rom_dout, reg_dout) + variable data : data_t; + begin + reg_sel <= '0'; + + case cpu_addr(7 downto 6) is + when "00" | "01" => -- 00 .. 7F + data := X"AA"; + when "10" => -- 80 .. BF + data := rom_dout; + when "11" => -- C0 .. FF + data := reg_dout; + reg_sel <= '1'; + + when others => + data := (others => '-'); + end case; + + cpu_din <= data; + + end process; + +ctrl_reg_write: + process(rst, clk, ctrl_reg_we, cpu_dout) + begin + if (rst = '1') then + ctrl_reg <= (others => '0'); + elsif rising_edge(clk) then + if ctrl_reg_we = '1' then + ctrl_reg <= cpu_dout; + end if; + end if; + end process; + +led_reg_write: + process(rst, clk, led_reg_we, cpu_dout) + begin + if (rst = '1') then + led_reg <= (others => '0'); + elsif rising_edge(clk) then + if led_reg_we = '1' then + led_reg <= cpu_dout; + end if; + end if; + end process; + +proc_lcd_reg_write: + process(rst, clk, lcd_reg_we, cpu_dout) + begin + if (rst = '1') then + lcd_reg_out <= (others => '0'); + elsif rising_edge(clk) then + if lcd_reg_we = '1' then + lcd_reg_out <= cpu_dout; + end if; + end if; + end process; + +proc_lcd_reg_sample: + process(rst, clk, sys_lcd_d, lcd_reg_out) + begin + if (rst = '1') then + lcd_reg_in <= (others => '0'); + elsif rising_edge(clk) then + if lcd_reg_out(lcd_rw) = '1' then + lcd_reg_in <= unsigned("0000" & sys_lcd_d); + end if; + end if; + end process; + + +int_register: + process(rst, clk, int_in, int_ack) + begin + if (rst = '1') then + int_req <= '0'; + elsif rising_edge(clk) then + if int_ack = '1' then + int_req <= '0'; + elsif int_en = '1' and int_in = '1' then + int_req <= '1'; + end if; + end if; + end process; + + +the_embedded_cpu: embedded_cpu + PORT MAP( + rst => rst, + clk => clk, + ce => ce, + int_in => int_req, + int_ack => int_ack, + xmem_we => cpu_we, + xmem_re => cpu_re, + xmem_din => cpu_din, + xmem_dout => cpu_dout, + xmem_addr => cpu_addr + ); + + transmit: uart_tx + port map ( data_in => std_logic_vector(cpu_dout), + write_buffer => write_to_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + serial_out => sys_tx, + buffer_full => tx_full, + buffer_half_full => tx_half_full, + clk => clk ); + + receive: uart_rx + port map ( serial_in => sys_rx, + data_out => rx_data, + read_buffer => read_from_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + buffer_data_present => rx_data_present, + buffer_full => rx_full, + buffer_half_full => rx_half_full, + clk => clk ); + -- + -- Set baud rate to 38400 for the UART communications + -- Requires en_16_x_baud to be 614400Hz which is a single cycle pulse every 163 cycles at 100MHz + -- + -- NOTE : If the highest value for baud_count exceeds 127 you will need to adjust + -- the range of integers in the signal declaration for baud_count. + -- + + baud_timer: process(clk) + begin + if clk'event and clk='1' then + if baud_count=162 then + baud_count <= 0; + en_16_x_baud <= '1'; + else + baud_count <= baud_count + 1; + en_16_x_baud <= '0'; + end if; + end if; + end process baud_timer; + +ROM_RD: + process(rst, clk, rom_addr) + begin + if rising_edge(clk) then + rom_dout <= to_unsigned(character'pos(rom_data(to_integer(rom_addr)+1)), data_t'length); + end if; + end process; + +END; diff --git a/projects/cpu/src/systest/systest.vhd b/projects/cpu/src/systest/systest.vhd new file mode 100644 index 0000000..435aabb --- /dev/null +++ b/projects/cpu/src/systest/systest.vhd @@ -0,0 +1,1140 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: system test using Xilinx ML-402 + +-- 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; +use std.textio.all; -- Imports the standard textio package. + +Library UNISIM; +use UNISIM.vcomponents.all; + +library work; +use work.cpu_pkg.all; +use work.vga_types.all; +use work.fifo_ctrl_pkg.all; +use work.sdram_config.all; +use work.sdram_types.all; + +ENTITY systest IS +GENERIC +( + sys_freq : integer := 100E6; + ddr_phaseshift : integer := 0; + ddr_frequency_hz : integer := 100E6; + tsvga : vga_timespec_t := ts_vga_1280_1024_72 +); +PORT +( + sys_rst_n_in : in std_logic; + sys_clk_in : in std_logic; + + -- Buttons and LEDs + sys_btn : in unsigned(4 downto 0); + sys_dip : in unsigned(7 downto 0); + sys_led : out unsigned(8 downto 0); + + -- UART + sys_rx : in std_logic; + sys_tx : out std_logic; + + -- LCD + sys_lcd_d : inout unsigned(3 downto 0); + sys_lcd_e : out std_logic; + sys_lcd_rs : out std_logic; + sys_lcd_rw : out std_logic; + + -- Keybpard and mouse + sys_keyb_clk : in std_logic; + sys_keyb_data : in std_logic; + sys_mouse_clk : in std_logic; + sys_mouse_data : in std_logic; + + -- DDR SDRAM + sys_sdr_clk_p : out std_logic; -- ddr_sdram_clock + sys_sdr_clk_n : out std_logic; -- /ddr_sdram_clock + sys_sdr_cke_q : out std_logic; -- clock enable + sys_sdr_cs_qn : out std_logic; -- /chip select + sys_sdr_ras_qn : out std_logic; -- /ras + sys_sdr_cas_qn : out std_logic; -- /cas + sys_sdr_we_qn : out std_logic; -- /write enable + sys_sdr_dm_q : out unsigned(DDR_DM_WIDTH-1 downto 0); -- data mask bits, set to "00" + sys_sdr_dqs_q : inout unsigned(DDR_DQS_WIDTH-1 downto 0); -- data strobe, only for write + sys_sdr_ba_q : out unsigned(DDR_BANK_WIDTH-1 downto 0); -- bank select + sys_sdr_a_q : out unsigned(DDR_ADDR_WIDTH-1 downto 0); -- address bus + sys_sdr_data : inout unsigned(DDR_DATA_WIDTH-1 downto 0); -- bidir data bus + sys_sdr_clk_fb : in std_logic; + + -- VGA + sys_vga_red : out unsigned(7 downto 0); + sys_vga_green : out unsigned(7 downto 0); + sys_vga_blue : out unsigned(7 downto 0); + sys_vga_blank_n : out std_logic; + sys_vga_sync_n : out std_logic; + sys_vga_hsync : out std_logic; + sys_vga_vsync : out std_logic; + sys_vga_clk : out std_logic; + + sys_error : out unsigned(1 downto 0) -- indicates Errors + +); +-- attribute BUFFER_TYPE : string; +-- attribute BUFFER_TYPE of sys_clk_in : signal is "BUFG"; +-- attribute BUFFER_TYPE of sys_sdr_dcm_clk_fb : signal is "BUFG"; + +END systest; + +ARCHITECTURE behavior OF systest IS + + COMPONENT cpu_embedded + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); + END COMPONENT; + + COMPONENT xrom + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + END COMPONENT; + + COMPONENT lcd_port + PORT ( + rst : in std_logic; + clk : in std_logic; + we : in std_logic; + din : in unsigned(7 downto 0); + dout : out unsigned(7 downto 0); + lcd_d : inout unsigned(3 downto 0); + lcd_e : out std_logic; + lcd_rs : out std_logic; + lcd_rw : out std_logic + ); + END COMPONENT; + +-- +-- declaration of UART transmitter with integral 16 byte FIFO buffer +-- + component uart_tx + Port ( data_in : in std_logic_vector(7 downto 0); + write_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + serial_out : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; +-- +-- declaration of UART Receiver with integral 16 byte FIFO buffer +-- + component uart_rx + Port ( serial_in : in std_logic; + data_out : out std_logic_vector(7 downto 0); + read_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + buffer_data_present : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic); + end component; + + signal rst : std_logic; + signal rst_in : std_logic; + signal started_up : std_logic := '1'; + signal clk : std_logic; + signal int_in, int_ack, int_en, io_sel, int_force : std_logic; + + + signal cpu_baudrate : dmem_data_t; + signal cpu_din : dmem_data_t; + signal cpu_dout : dmem_data_t; + signal cpu_addr : dmem_addr_t; + signal cpu_we : std_logic; + signal cpu_re : std_logic; + signal cpu_wait : std_logic; + signal ctrl_reg : dmem_data_t; + signal led_reg : dmem_data_t; + signal cpu_lcd_out_reg, cpu_lcd_in_reg, reg_uart_tx: dmem_data_t; + signal cpu_lcd_we : std_logic; + signal cpu_sdr_buf_we, cpu_sdr_valid : std_logic; + signal cpu_color : color_t; + signal cpu_vga_enable : std_logic; + signal cpu_error_leds : unsigned(1 downto 0); + signal btn_ps2_reg : dmem_data_t; + + -- + -- Signals for connection of peripherals + -- + signal uart_status_port : dmem_data_t; + -- + -- Signals to form an timer generating an interrupt every microsecond + -- + signal cpu_tim_reload : unsigned(23 downto 0); + signal timer_count : integer range 0 to 99999 :=0; + signal timer_pulse, timer_en : std_logic; + -- + -- Signals for UART connections + -- + signal baud_count : integer range 0 to 255 :=0; + signal en_16_x_baud : std_logic; + signal write_to_uart : std_logic; + signal tx_full : std_logic; + signal tx_half_full : std_logic; + signal read_from_uart : std_logic; + signal rx_data : std_logic_vector(7 downto 0); + signal rx_data_present : std_logic; + signal rx_full : std_logic; + signal rx_half_full : std_logic; + + -- X-ROM + signal xrom_data : dmem_data_t; + signal sdr_data : dmem_data_t; + + -- DDR SDRAM + constant BURST_LEN : natural := 8; + subtype sdr_buf_t is unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_buf_in, sdr_vga_data : sdr_buf_t := (others => '0'); + + signal sdr_tag_in : user_tag_t; + signal sdr_tag_wr : user_tag_t; + signal sdr_tag_rd : user_tag_t; + signal sdr_ucmd : user_cmd_t; + signal cpu_sd_cmd : user_cmd_t; + signal cpu_sd_cmd_we : std_logic; + signal sdr_ucmd_vld : std_logic; + signal cpu_sdr_addr : user_addr_t; + signal cpu_vga_read_offset : user_addr_t; + signal sdr_addr : user_addr_t; + signal sdr_busy_q : std_logic; + signal sdr_udata_in : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_udata_req_wr : std_logic; + signal sdr_udata_out_q : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal sdr_udata_vld_q : std_logic; + signal sdr_dm : unsigned(SDR_DM_WIDTH-1 downto 0) := "00000000"; + + signal cpu_cat_fifo_din : unsigned(29 downto 0); + signal cpu_cat_fifo_dout : unsigned(29 downto 0); + signal cpu_cat_fifo_re : std_logic; + signal cpu_cat_fifo_we : std_logic; + signal cpu_cat_fifo_full : std_logic; + signal cpu_cat_fifo_empty : std_logic; + + signal cpu_write_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_write_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_write_fifo_re : std_logic; + signal cpu_write_fifo_we : std_logic; + signal cpu_write_fifo_full : std_logic; + signal cpu_write_fifo_empty : std_logic; + + signal cpu_read_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_read_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal cpu_read_fifo_re : std_logic; + signal cpu_read_fifo_we : std_logic; + signal cpu_read_fifo_full : std_logic; + signal cpu_read_fifo_empty : std_logic; + + alias cpu_tag_fifo_in is cpu_cat_fifo_din(29 downto 26); + alias cpu_cmd_fifo_in is cpu_cat_fifo_din(25 downto 24); + alias cpu_addr_fifo_in is cpu_cat_fifo_din(23 downto 0); + + alias cpu_tag_fifo_out is cpu_cat_fifo_dout(29 downto 26); + alias cpu_cmd_fifo_out is cpu_cat_fifo_dout(25 downto 24); + alias cpu_addr_fifo_out is cpu_cat_fifo_dout(23 downto 0); + +-- attribute rom_style: string; +-- attribute rom_style of cmd_fifo_dout: signal is "DISTRIBUTED"; +-- attribute rom_style of cpu_cpu_write_fifo_dout: signal is "DISTRIBUTED"; +-- attribute rom_style of cpu_read_fifo_dout: signal is "DISTRIBUTED"; + + -- VGA + signal vga_clk : std_logic; + signal vga_ready : std_logic; + signal vga_color_w : color_t; + signal vga_color : color_t; + signal vga_color_we : std_logic; + signal vga_fifo_full : std_logic; + signal vga_fifo_almost_full : std_logic; + signal vga_hsync : std_logic; + signal vga_vsync : std_logic; + signal vga_pos_x : natural range 0 to tsvga.ts_h.ncyc_scan-1; + signal vga_pos_y : natural range 0 to tsvga.ts_v.ncyc_scan-1; + signal vga_scan_x : std_logic; + signal vga_scan_y : std_logic; + signal vga_scan_rdy : std_logic; + signal vga_scan_rdy_h : std_logic; + signal vga_scan_rdy_v : std_logic; + signal vga_active : std_logic; + + type vga_cmd_state_t is (vga_cmd_s_init, vga_cmd_s_idle, vga_cmd_s_access); + signal vga_cmd_s, vga_cmd_sn : vga_cmd_state_t; + + type vga_data_state_t is (vga_data_s_init, vga_data_s_idle, vga_data_s_read1, vga_data_s_read2); + signal vga_data_s, vga_data_sn : vga_data_state_t; + + type sd_ctrl_state_t is (s_sd_idle, s_sd_vga_access, s_sd_cpu_access); + signal st, stn : sd_ctrl_state_t; + + -- Character generator + signal cg_rst : std_logic; + signal cg_en : std_logic; + signal cg_ready : std_logic; + signal cg_clr_screen : std_logic; + signal cg_clr_line : std_logic; + signal cg_ascii_data : dmem_data_t; + signal cg_ascii_data_we : std_logic; + signal cg_ascii_posy_we : std_logic; + signal cg_ascii_posx_we : std_logic; + signal cg_draw_en : std_logic; + signal cg_color : color_t; + + -- DDR to VGA + signal vga_pixel_cnt : natural range 0 to tsvga.ts_h.ncyc_scan*tsvga.ts_v.ncyc_scan-1; + signal vga_sd_addr : user_addr_t; + signal vga_sd_valid : std_logic; + signal vga_pixel_cnt_en : std_logic; + signal vga_sd_cmd : user_cmd_t; + signal vga_sd_cmd_we : std_logic; + + signal vga_cat_fifo_din : unsigned(29 downto 0); + signal vga_cat_fifo_dout : unsigned(29 downto 0); + signal vga_cat_fifo_re : std_logic; + signal vga_cat_fifo_we : std_logic; + signal vga_cat_fifo_full : std_logic; + signal vga_cat_fifo_empty : std_logic; + + signal vga_read_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal vga_read_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0); + signal vga_read_fifo_re : std_logic; + signal vga_read_fifo_we : std_logic; + signal vga_read_fifo_full : std_logic; + signal vga_read_fifo_empty : std_logic; + signal vga_read_fifo_almost_full : std_logic; + signal vga_read_fifo_almost_empty : std_logic; + + alias vga_tag_fifo_in is vga_cat_fifo_din(29 downto 26); + alias vga_cmd_fifo_in is vga_cat_fifo_din(25 downto 24); + alias vga_addr_fifo_in is vga_cat_fifo_din(23 downto 0); + + alias vga_tag_fifo_out is vga_cat_fifo_dout(29 downto 26); + alias vga_cmd_fifo_out is vga_cat_fifo_dout(25 downto 24); + alias vga_addr_fifo_out is vga_cat_fifo_dout(23 downto 0); + +BEGIN + + int_in <= sys_btn(4) or sys_dip(7) or timer_pulse or int_force or rx_data_present; + rst_in <= not (started_up and sys_rst_n_in); + uart_status_port <= "000" & rx_data_present & rx_full & rx_half_full & tx_full & tx_half_full ; + + -- VGA mapping + sys_vga_clk <= vga_clk; + sys_vga_red <= vga_color(r); + sys_vga_green <= vga_color(g); + sys_vga_blue <= vga_color(b); + vga_scan_rdy <= vga_scan_rdy_h and vga_scan_rdy_v; + + cg_en <= vga_scan_x and vga_scan_y; + cg_rst <= rst; + +------------------------------------------------------------------ +cpu_sdr_buffer: + process(clk) + variable index, lo, hi : integer; + begin + if rising_edge(clk) then + index := to_integer(cpu_addr(2 downto 0)); + hi := dmem_data_t'length*(index+1)-1; + lo := dmem_data_t'length*(index); + if cpu_sdr_buf_we = '1' then + sdr_buf_in(hi downto lo) <= cpu_dout; + end if; + sdr_data <= cpu_read_fifo_dout(hi downto lo); + end if; + end process; + +------------------------------------------------------------------ +led_out: + process(rst, clk) + begin + if rst = '1' then + sys_led <= (others => '0'); + sys_error <= (others => '0'); + elsif rising_edge(clk) then + sys_led <= int_in & led_reg; + sys_error <= cpu_error_leds; + end if; + end process; + +------------------------------------------------------------------ +btn_ps2_register: + process(clk) + begin + if rising_edge(clk) then + btn_ps2_reg <= sys_mouse_data & sys_mouse_clk & sys_keyb_data & sys_keyb_clk & unsigned(sys_btn(3 downto 0)); + end if; + end process; + +------------------------------------------------------------------ +timer: + process(rst, clk) + begin + if rst = '1' then + timer_count <= to_integer(cpu_tim_reload); + timer_pulse <= '0'; + elsif rising_edge(clk) then + timer_pulse <= '0'; + if timer_count /= 0 then + if timer_en = '1' then + timer_count <= timer_count - 1; + end if; + else + timer_pulse <= '1'; + timer_count <= to_integer(cpu_tim_reload); + end if; + end if; + end process; + +------------------------------------------------------------------ +reg_mux: + process(clk) + variable data : dmem_data_t; + variable addr : dmem_addr_t; + variable is_io : boolean; + variable cpu_read : std_logic; + begin + + read_from_uart <= '0'; + if rising_edge(clk) then + addr := cpu_addr; + is_io := (io_sel = '1'); + cpu_read := cpu_re; + end if; + + if is_io then + case addr is + when X"00" => -- 00 + data := btn_ps2_reg; + when X"01" => -- 01 + data := led_reg; + when X"02" => -- 02 + data := unsigned(rx_data); + read_from_uart <= cpu_read; + when X"03" => -- 03 + data := cpu_lcd_in_reg; + when X"04" => -- 04 + data := int_force & '0' & cpu_error_leds & '0' & cpu_vga_enable & timer_en & int_en; + when X"05" => -- 05 + data := unsigned(sys_dip); + when X"06" => -- 06 + data := uart_status_port; + when X"07" => -- 07 + data := '0' & '0' & cpu_read_fifo_empty & cpu_read_fifo_full & cpu_write_fifo_empty & cpu_write_fifo_full & cpu_cat_fifo_empty & cpu_cat_fifo_full; + when X"08" => -- 08 + data := cpu_sdr_addr(7 downto 0); + when X"09" => -- 09 + data := cpu_sdr_addr(15 downto 8); + when X"0A" => -- 10 + data := cpu_sdr_addr(23 downto 16); + when X"0E" => + data := (not rst) & "00000" & cg_ready & vga_ready; + when X"13" => -- 10 + data := cpu_baudrate; + when others => + data := X"00"; + end case; + else + if cpu_addr(7) = '1' then + data := sdr_data; + else + data := xrom_data; + end if; + end if; + cpu_din <= data; + + end process; + +------------------------------------------------------------------ +ctrl_reg_write: + process(rst, clk) + variable addr : unsigned(dmem_addr_t'length-1 downto 0); + begin + if (rst = '1') then + cpu_color <= (X"80", X"80", X"80"); + cpu_error_leds <= (others => '0'); + int_force <= '0'; + int_en <= '0'; + timer_en <= '0'; + led_reg <= (others => '0'); + cpu_lcd_out_reg <= (others => '0'); + reg_uart_tx <= (others => '0'); + cpu_sdr_addr <= (others => '0'); + cg_ascii_data <= (others => '0'); + cg_ascii_posy_we <= '0'; + cg_ascii_posx_we <= '0'; + cg_ascii_data_we <= '0'; + cg_clr_line <= '0'; + cg_clr_screen <= '0'; + cpu_read_fifo_re <= '0'; + cpu_write_fifo_we <= '0'; + cpu_sd_cmd_we <= '0'; + cpu_sd_cmd <= UCMD_NOP; + cpu_vga_enable <= '0'; + cpu_baudrate <= to_unsigned(53, dmem_data_t'length); + cpu_vga_read_offset <= (others => '0'); + cpu_tim_reload <= to_unsigned(99999, cpu_tim_reload'length); + elsif rising_edge(clk) then + int_force <= '0'; + write_to_uart <= '0'; + cpu_lcd_we <= '0'; + cpu_sdr_buf_we <= '0'; + cg_ascii_posy_we <= '0'; + cg_ascii_posx_we <= '0'; + cg_ascii_data_we <= '0'; + cg_clr_line <= '0'; + cg_clr_screen <= '0'; + cpu_read_fifo_re <= '0'; + cpu_write_fifo_we <= '0'; + cpu_sd_cmd_we <= '0'; + addr := cpu_addr; + if cpu_we = '1' then + if io_sel = '1' then + case addr is + when X"01" => -- 01 + led_reg <= cpu_dout; + when X"02" => -- 02 + reg_uart_tx <= cpu_dout; + write_to_uart <= '1'; + when X"03" => -- 03 + cpu_lcd_we <= '1'; + cpu_lcd_out_reg <= cpu_dout; + when X"04" => -- 04 + int_force <= cpu_dout(7); + cpu_error_leds <= cpu_dout(5 downto 4); + cpu_vga_enable <= cpu_dout(2); + timer_en <= cpu_dout(1); + int_en <= cpu_dout(0); + when X"07" => -- 07 + cpu_read_fifo_re <= cpu_dout(5); + cpu_write_fifo_we <= cpu_dout(4); + cpu_sd_cmd_we <= cpu_dout(2); + cpu_sd_cmd <= cpu_dout(1 downto 0); + when X"08" => -- 08 + cpu_sdr_addr(7 downto 0) <= cpu_dout; + when X"09" => -- 09 + cpu_sdr_addr(15 downto 8) <= cpu_dout; + when X"0A" => -- 10 + cpu_sdr_addr(23 downto 16) <= cpu_dout; + when X"0B" => -- 08 + cg_ascii_data <= cpu_dout; + cg_ascii_posx_we <= '1'; + when X"0C" => -- 09 + cg_ascii_data <= cpu_dout; + cg_ascii_posy_we <= '1'; + when X"0D" => -- 0A + cg_ascii_data <= cpu_dout; + cg_ascii_data_we <= '1'; + when X"0E" => -- 0B + cg_clr_screen <= cpu_dout(0); + cg_clr_line <= cpu_dout(1); + when X"10" => -- 04 + cpu_color(r) <= cpu_dout; + when X"11" => -- 04 + cpu_color(g) <= cpu_dout; + when X"12" => -- 04 + cpu_color(b) <= cpu_dout; + when X"13" => -- 04 + cpu_baudrate <= cpu_dout; + when X"14" => + cpu_vga_read_offset(7 downto 0) <= cpu_dout; + when X"15" => + cpu_vga_read_offset(15 downto 8) <= cpu_dout; + when X"16" => + cpu_vga_read_offset(23 downto 16) <= cpu_dout; + when X"17" => -- 04 + cpu_tim_reload(7 downto 0) <= cpu_dout; + when X"18" => -- 04 + cpu_tim_reload(15 downto 8) <= cpu_dout; + when X"19" => -- 04 + cpu_tim_reload(23 downto 16) <= cpu_dout; + when others => null; + end case; + else + case addr is + when X"80"|X"81"|X"82"|X"83"|X"84"|X"85"|X"86"|X"87" => + cpu_sdr_buf_we <= '1'; + when others => null; + end case; + end if; + end if; + end if; + end process; + +------------------------------------------------------------------ +sdram_write_control: + process(st, sdr_busy_q, vga_cat_fifo_empty, cpu_cat_fifo_empty, vga_cmd_fifo_out, vga_addr_fifo_out, vga_tag_fifo_out, cpu_cmd_fifo_out, cpu_addr_fifo_out, cpu_tag_fifo_out) + begin + + vga_cat_fifo_re <= '0'; + cpu_cat_fifo_re <= '0'; + sdr_ucmd_vld <= '0'; + sdr_ucmd <= vga_cmd_fifo_out; + sdr_addr <= vga_addr_fifo_out; + sdr_tag_in <= vga_tag_fifo_out; + + stn <= st; + case st is + when s_sd_idle => + if vga_cat_fifo_empty = '0' then + stn <= s_sd_vga_access; + elsif cpu_cat_fifo_empty = '0' then + stn <= s_sd_cpu_access; + end if; + when s_sd_vga_access => + sdr_ucmd <= vga_cmd_fifo_out; + sdr_addr <= vga_addr_fifo_out; + sdr_tag_in <= vga_tag_fifo_out; + if vga_cat_fifo_empty = '0' then + if sdr_busy_q = '0' then + sdr_ucmd_vld <= '1'; + vga_cat_fifo_re <= '1'; + end if; + else + stn <= s_sd_idle; + end if; + when s_sd_cpu_access => + sdr_ucmd <= cpu_cmd_fifo_out; + sdr_addr <= cpu_addr_fifo_out; + sdr_tag_in <= cpu_tag_fifo_out; + if cpu_cat_fifo_empty = '0' then + if sdr_busy_q = '0' then + sdr_ucmd_vld <= '1'; + cpu_cat_fifo_re <= '1'; + end if; + else + stn <= s_sd_idle; + end if; + when others => + stn <= s_sd_idle; + end case; + end process; + + process(rst, clk) + begin + if rst = '1' then + st <= s_sd_idle; + elsif rising_edge(clk) then + st <= stn; + end if; + end process; + +------------------------------------------------------------------ + vga_to_sd_cmd: process (vga_cmd_s, cpu_vga_enable, vga_scan_rdy, vga_ready, vga_cat_fifo_full, vga_read_fifo_empty, vga_read_fifo_almost_empty) + begin + vga_sd_cmd <= UCMD_NOP; + vga_sd_cmd_we <= '0'; + vga_pixel_cnt_en <= '0'; + + vga_cmd_sn <= vga_cmd_s; + case vga_cmd_s is + when vga_cmd_s_init => + if vga_ready = '1' and vga_scan_rdy = '1' then + vga_cmd_sn <= vga_cmd_s_idle; + end if; + + when vga_cmd_s_idle => + if cpu_vga_enable = '1' and vga_read_fifo_almost_empty = '1' then + vga_cmd_sn <= vga_cmd_s_access; + end if; + + when vga_cmd_s_access => + if vga_cat_fifo_full = '0' then + vga_pixel_cnt_en <= '1'; + vga_sd_cmd <= UCMD_READ; + vga_sd_cmd_we <= '1'; + else + vga_cmd_sn <= vga_cmd_s_idle; + end if; + + when others => + vga_cmd_sn <= vga_cmd_s_idle; + + end case; + + end process; + + vga_cmd_nxt: process (rst, clk) + begin + if (rst = '1') then + vga_cmd_s <= vga_cmd_s_init; + elsif rising_edge(clk) then + vga_cmd_s <= vga_cmd_sn; + end if; + end process; + +------------------------------------------------------------------ + pixel_counter: process (rst, clk) + begin + if rst = '1' then + vga_pixel_cnt <= 0; + vga_sd_addr <= (others => '0'); + elsif rising_edge(clk) then + if vga_pixel_cnt_en = '1' then + if vga_pixel_cnt < tsvga.ts_h.ncyc_scan*tsvga.ts_v.ncyc_scan-BURST_LEN then + vga_pixel_cnt <= vga_pixel_cnt + BURST_LEN; + vga_sd_addr <= vga_sd_addr + BURST_LEN; + else + vga_pixel_cnt <= 0; + vga_sd_addr <= cpu_vga_read_offset; + end if; + end if; + end if; + end process; + +------------------------------------------------------------------ + vga_to_sd_data: process (vga_data_s, vga_fifo_full, vga_read_fifo_empty, vga_read_fifo_dout, vga_scan_rdy, vga_fifo_almost_full) + begin + vga_read_fifo_re <= '0'; + vga_color_w <= (vga_read_fifo_dout(23 downto 16), vga_read_fifo_dout(15 downto 8), vga_read_fifo_dout(7 downto 0)); + vga_color_we <= '0'; + + vga_data_sn <= vga_data_s; + case vga_data_s is + when vga_data_s_init => + if vga_read_fifo_empty = '0' and vga_scan_rdy = '1' then + vga_data_sn <= vga_data_s_idle; + end if; + when vga_data_s_idle => + if vga_fifo_almost_full = '0' then + vga_data_sn <= vga_data_s_read1; + end if; + when vga_data_s_read1 => + vga_color_w <= (vga_read_fifo_dout(23 downto 16), vga_read_fifo_dout(15 downto 8), vga_read_fifo_dout(7 downto 0)); + if vga_read_fifo_empty = '0' then + if vga_fifo_full = '0' then + vga_color_we <= '1'; + vga_data_sn <= vga_data_s_read2; + else + vga_data_sn <= vga_data_s_idle; + end if; + end if; + when vga_data_s_read2 => + vga_color_w <= (vga_read_fifo_dout(47 downto 40), vga_read_fifo_dout(39 downto 32), vga_read_fifo_dout(31 downto 24)); + if vga_fifo_full = '0' then + vga_color_we <= '1'; + vga_read_fifo_re <= '1'; + vga_data_sn <= vga_data_s_read1; + end if; + + when others => + vga_data_sn <= vga_data_s_idle; + + end case; + + end process; + + vga_data_nxt: process (rst, clk) + begin + if (rst = '1') then + vga_data_s <= vga_data_s_init; + elsif rising_edge(clk) then + vga_data_s <= vga_data_sn; + end if; + end process; + +------------------------------------------------------------------ +inst_cpu_embedded: cpu_embedded + PORT MAP( + rst => rst, + clk => clk, + ce => '1', + int_in => int_in, + int_ack => int_ack, + xmem_we => cpu_we, + xmem_re => cpu_re, + xmem_din => cpu_din, + xmem_dout => cpu_dout, + xmem_addr => cpu_addr, + io_sel => io_sel + ); + + inst_xrom: xrom + PORT MAP( + clk => clk, + ce => '1', + addr => cpu_addr, + dout => xrom_data + ); + + inst_lcd_port: lcd_port + PORT MAP( + rst => rst, + clk => clk, + we => cpu_lcd_we, + din => cpu_lcd_out_reg, + dout => cpu_lcd_in_reg, + lcd_d => sys_lcd_d, + lcd_e => sys_lcd_e, + lcd_rs => sys_lcd_rs, + lcd_rw => sys_lcd_rw + ); + + transmit: uart_tx + port map ( data_in => std_logic_vector(reg_uart_tx), + write_buffer => write_to_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + serial_out => sys_tx, + buffer_full => tx_full, + buffer_half_full => tx_half_full, + clk => clk ); + + receive: uart_rx + port map ( serial_in => sys_rx, + data_out => rx_data, + read_buffer => read_from_uart, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + buffer_data_present => rx_data_present, + buffer_full => rx_full, + buffer_half_full => rx_half_full, + clk => clk ); + + + -- Instantiate synchronous FIFO + inst_cpu_cat_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 6, + data_width => 4+2+24, + almost_full_thresh => 60, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cpu_cat_fifo_we, + re => cpu_cat_fifo_re, + fifo_full => cpu_cat_fifo_full, + fifo_empty => cpu_cat_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cpu_cat_fifo_din, + data_r => cpu_cat_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_cpu_write_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 8, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 252, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cpu_write_fifo_we, + re => cpu_write_fifo_re, + fifo_full => cpu_write_fifo_full, + fifo_empty => cpu_write_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cpu_write_fifo_din, + data_r => cpu_write_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_cpu_read_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 8, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 252, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => cpu_read_fifo_we, + re => cpu_read_fifo_re, + fifo_full => cpu_read_fifo_full, + fifo_empty => cpu_read_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => cpu_read_fifo_din, + data_r => cpu_read_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_vga_cat_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 6, + data_width => 4+2+24, + almost_full_thresh => 60, + almost_empty_thresh => 4 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => vga_cat_fifo_we, + re => vga_cat_fifo_re, + fifo_full => vga_cat_fifo_full, + fifo_empty => vga_cat_fifo_empty, + fifo_afull => open, + fifo_aempty => open, + data_w => vga_cat_fifo_din, + data_r => vga_cat_fifo_dout + ); + + -- Instantiate synchronous FIFO + inst_vga_read_fifo: entity work.fifo_sync + GENERIC MAP + ( + addr_width => 10, + data_width => 2*DDR_DATA_WIDTH, + almost_full_thresh => 960, + almost_empty_thresh => 128 + ) + PORT MAP + ( + rst => rst, + clk => clk, + we => vga_read_fifo_we, + re => vga_read_fifo_re, + fifo_full => vga_read_fifo_full, + fifo_empty => vga_read_fifo_empty, + fifo_afull => vga_read_fifo_almost_full, + fifo_aempty => vga_read_fifo_almost_empty, + data_w => vga_read_fifo_din, + data_r => vga_read_fifo_dout + ); + + vga_tag_fifo_in <= "0010"; + vga_addr_fifo_in <= vga_sd_addr; + vga_cmd_fifo_in <= vga_sd_cmd; + vga_cat_fifo_we <= vga_sd_cmd_we; + + cpu_tag_fifo_in <= "0001"; + cpu_addr_fifo_in <= cpu_sdr_addr; + cpu_cmd_fifo_in <= cpu_sd_cmd; + cpu_cat_fifo_we <= cpu_sd_cmd_we; + + sdr_udata_in <= cpu_write_fifo_dout; + cpu_read_fifo_we <= sdr_udata_vld_q when sdr_tag_rd = "0001" else '0'; + vga_read_fifo_we <= sdr_udata_vld_q when sdr_tag_rd = "0010" else '0'; + cpu_read_fifo_din <= sdr_udata_out_q; + vga_read_fifo_din <= sdr_udata_out_q; + + cpu_write_fifo_din <= sdr_buf_in; + cpu_write_fifo_re <= sdr_udata_req_wr and (not cpu_write_fifo_empty); + cpu_wait <= '0'; + + -- DDR SDRAM Controller Core + inst_sdram_ctrl : entity work.sdram_ctrl_top + Generic map + ( + BL => BURST_LEN, + read_phaseshift => ddr_phaseshift, + f_sysclk => ddr_frequency_hz + ) + Port map + ( + + sys_rst_in => rst_in, + sys_clk_in => sys_clk_in, + + sys_rst_out => rst, + sys_clk_out => clk, + sys_clk_fb => sys_sdr_clk_fb, + + -- User interface + u_data_vld => sdr_udata_vld_q, + u_data_req_w => sdr_udata_req_wr, + u_data_req_r => open, + u_tag_in => sdr_tag_in, + u_tag_rd => sdr_tag_rd, + u_tag_wr => sdr_tag_wr, + u_busy => sdr_busy_q, + u_addr => sdr_addr, + u_cmd => sdr_ucmd, + u_cmd_we => sdr_ucmd_vld, + u_data_wr => sdr_udata_in, + u_data_rd => sdr_udata_out_q, + u_dm => sdr_dm, + + -- SDRAM signals + sd_clk_p => sys_sdr_clk_p, + sd_clk_n => sys_sdr_clk_n, + sd_cke => sys_sdr_cke_q, + sd_cs_n => sys_sdr_cs_qn, + sd_cas_n => sys_sdr_cas_qn, + sd_ras_n => sys_sdr_ras_qn, + sd_we_n => sys_sdr_we_qn, + sd_addr => sys_sdr_a_q, + sd_ba => sys_sdr_ba_q, + sd_dm => sys_sdr_dm_q, + sd_dqs => sys_sdr_dqs_q, + sd_data => sys_sdr_data + + ); + + inst_vga_backend: entity work.vga_backend + GENERIC MAP + ( + sys_freq => sys_freq, + fifo_depth => 2048, + fifo_almost_full_thresh => 1920, + fifo_almost_empty_thresh => 128, + tsvga => tsvga + ) + PORT MAP + ( + sys_rst => rst, + sys_clk => clk, + vga_ready => vga_ready, + color_in => vga_color_w, + color_fifo_we => vga_color_we, + color_fifo_full => vga_fifo_full, + color_fifo_afull => vga_fifo_almost_full, + direct_color_in => cg_color, + direct_draw_en => cg_draw_en, + stat_hsync => vga_hsync, + stat_vsync => vga_vsync, + stat_hready => vga_scan_rdy_h, + stat_vready => vga_scan_rdy_v, + stat_hscan => vga_scan_x, + stat_vscan => vga_scan_y, + stat_hpos => vga_pos_x, + stat_vpos => vga_pos_y, + vga_clk_out => vga_clk, + vga_color_out => vga_color, + vga_blank_n => sys_vga_blank_n, + vga_sync_n => sys_vga_sync_n, + vga_hsync => sys_vga_hsync, + vga_vsync => sys_vga_vsync + + ); + + inst_char_gen : entity work.char_gen + GENERIC MAP + ( + tsvga => tsvga, + CHARACTER_SCALE => 1, + CHAR_ROM_SIZE_X => 8, -- Pixels + CHAR_ROM_SIZE_Y => 16, -- Pixels + CHAR_ROM_DEPTH => 256, -- Chars + MAX_CHAR_PER_LINE => 80, -- Chars + MAX_LINE_PER_FRAME => 32, -- Chars + CHAR_SPACING_X => 0, -- Pixels + CHAR_SPACING_Y => 0, -- Pixels + SCREEN_OFFSET_X => 16, -- Pixels + SCREEN_OFFSET_Y => 16 -- Pixels + ) + PORT MAP + ( + rst => rst, + sys_clk => clk, + vga_clk => vga_clk, + ce => cg_en, + frame_pulse => vga_scan_rdy, + clr_screen => cg_clr_screen, + clr_line => cg_clr_line, + ascii_data => cg_ascii_data, + ascii_data_we => cg_ascii_data_we, + ascii_posy_we => cg_ascii_posy_we, + ascii_posx_we => cg_ascii_posx_we, + ready => cg_ready, + pos_x => vga_pos_x, + pos_y => vga_pos_y, + char_draw_en => cg_draw_en + ); + + ------------------------------------------------------------------ + STARTUP_VIRTEX4_inst : STARTUP_VIRTEX4 + port map ( + EOS => started_up, -- End of Startup 1-bit output + CLK => open, -- Clock input for start-up sequence + GSR => '0', -- Global Set/Reset input (GSR cannot be used for the port name) + GTS => '0', -- Global 3-state input (GTS cannot be used for the port name) + USRCCLKO => '0', -- USRCCLKO 1-bit input + USRCCLKTS => '0', -- USRCCLKTS 1-bit input + USRDONEO => '0', -- USRDONEO 1-bit input + USRDONETS => '0' -- USRDONETS 1-bit input + ); + +------------------------------------------------------------------ + -- + -- Set baud rate to 38400 for the UART communications + -- Requires en_16_x_baud to be 614400Hz which is a single cycle pulse every 163 cycles at 100MHz + -- + -- NOTE : If the highest value for baud_count exceeds 127 you will need to adjust + -- the range of integers in the signal declaration for baud_count. + -- + +------------------------------------------------------------------ + proc_cg_color_sample: + process (vga_clk) + variable p0, p1 : color_t; + begin + if rising_edge(vga_clk) then + cg_color <= p1; + p1 := p0; + p0 := cpu_color; + end if; + end process; + + baud_timer: process(clk) + begin + if clk'event and clk='1' then + if baud_count=cpu_baudrate then + baud_count <= 0; + en_16_x_baud <= '1'; + else + baud_count <= baud_count + 1; + en_16_x_baud <= '0'; + end if; + end if; + end process baud_timer; + +END; diff --git a/projects/cpu/src/systest/systest_cfg.vhd b/projects/cpu/src/systest/systest_cfg.vhd new file mode 100644 index 0000000..d2a0c0e --- /dev/null +++ b/projects/cpu/src/systest/systest_cfg.vhd @@ -0,0 +1,19 @@ +library IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +configuration cpu_irom of cpu_embedded is + for rtl + for inst_irom : irom + use entity work.irom(loadable); + end for; + end for; +end configuration cpu_irom; + +configuration system_xrom of systest is + for behavior + for inst_xrom : xrom + use entity work.xrom(loadable); + end for; + end for; +end configuration system_xrom; diff --git a/projects/cpu/src/systest/tb_systest.vhd b/projects/cpu/src/systest/tb_systest.vhd new file mode 100644 index 0000000..6f753ca --- /dev/null +++ b/projects/cpu/src/systest/tb_systest.vhd @@ -0,0 +1,166 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: testbench for system test using Xilinx ML-402 + +-- 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; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.cpu_pkg.all; +use work.ddr_sdr_conf_pkg.all; +use work.systest_cfg.all; + +ENTITY tb_systest IS +END tb_systest; + +ARCHITECTURE behavior OF tb_systest IS + + constant CLK_PERIOD : time := 10 ns; + signal sys_rst_n_in : std_logic := '0'; + signal sys_clk_in : std_logic := '1'; + signal dip : unsigned(7 downto 0) := (others => '0'); + signal btn : unsigned(4 downto 0) := (others => '0'); + signal led : unsigned(8 downto 0); + signal sys_rx : std_logic := '0'; + signal sys_tx : std_logic; + + signal sys_lcd_d : unsigned(3 downto 0); + signal sys_lcd_e : std_logic; + signal sys_lcd_rs : std_logic; + signal sys_lcd_rw : std_logic; + + signal refresh : boolean:= true; + + signal sys_sdr_clk_p : std_logic; -- ddr_sdram_clock + signal sys_sdr_clk_n : std_logic; -- /ddr_sdram_clock + signal sys_sdr_cke_q : std_logic; -- clock enable + signal sys_sdr_cs_qn : std_logic; -- /chip select + signal sys_sdr_ras_qn : std_logic; -- /ras + signal sys_sdr_cas_qn : std_logic; -- /cas + signal sys_sdr_we_qn : std_logic; -- /write enable + signal sys_sdr_dm_q : unsigned(DDR_DM_WIDTH-1 downto 0); -- data mask bits, set to "00" + signal sys_sdr_dqs_q : unsigned(DDR_DQS_WIDTH-1 downto 0); -- data strobe, only for write + signal sys_sdr_ba_q : unsigned(DDR_BANK_WIDTH-1 downto 0); -- bank select + signal sys_sdr_a_q : unsigned(DDR_ADDR_WIDTH-1 downto 0); -- address bus + signal sys_sdr_data : unsigned(DDR_DATA_WIDTH-1 downto 0); -- bidir data bus + + signal sys_error : unsigned(1 downto 0); -- indicates DCM Errors + signal sys_sdr_clk_fb : std_logic; + +BEGIN + +uut: entity work.systest +-- GENERIC MAP +-- ( +-- ddr_phaseshift => 90, +-- ddr_frequency_hz => 100E6 +-- ) + PORT MAP + ( + sys_rst_n_in => sys_rst_n_in, + sys_clk_in => sys_clk_in, + sys_btn => btn, + sys_dip => dip, + sys_led => led, + sys_rx => sys_rx, + sys_tx => sys_tx, + sys_lcd_d => sys_lcd_d, + sys_lcd_e => sys_lcd_e, + sys_lcd_rs => sys_lcd_rs, + sys_lcd_rw => sys_lcd_rw, + + sys_sdr_clk_p => sys_sdr_clk_p, + sys_sdr_clk_n => sys_sdr_clk_n, + sys_sdr_cke_q => sys_sdr_cke_q, + sys_sdr_clk_fb => sys_sdr_clk_fb, + sys_sdr_cs_qn => sys_sdr_cs_qn, + sys_sdr_ras_qn => sys_sdr_ras_qn, + sys_sdr_cas_qn => sys_sdr_cas_qn, + sys_sdr_we_qn => sys_sdr_we_qn, + sys_sdr_dm_q => sys_sdr_dm_q, + sys_sdr_dqs_q => sys_sdr_dqs_q, + sys_sdr_ba_q => sys_sdr_ba_q, + sys_sdr_a_q => sys_sdr_a_q, + sys_sdr_data => sys_sdr_data, + sys_error => sys_error + ); + + -- MICRON DDR SDRAM Simulation Model + i_mt46v16m16_0 : entity work.mt46v16m16 + port map ( + dq => std_logic_vector(sys_sdr_data(15 downto 0)), + dqs => std_logic_vector(sys_sdr_dqs_q(1 downto 0)), + addr => std_logic_vector(sys_sdr_a_q), + ba => std_logic_vector(sys_sdr_ba_q), + clk => sys_sdr_clk_p, + clk_n => sys_sdr_clk_n, + cke => sys_sdr_cke_q, + cs_n => sys_sdr_cs_qn, + ras_n => sys_sdr_ras_qn, + cas_n => sys_sdr_cas_qn, + we_n => sys_sdr_we_qn, + dm => std_logic_vector(sys_sdr_dm_q(1 downto 0)) + ); + + -- MICRON DDR SDRAM Simulation Model + i_mt46v16m16_1 : entity work.mt46v16m16 + port map ( + dq => std_logic_vector(sys_sdr_data(31 downto 16)), + dqs => std_logic_vector(sys_sdr_dqs_q(3 downto 2)), + addr => std_logic_vector(sys_sdr_a_q), + ba => std_logic_vector(sys_sdr_ba_q), + clk => sys_sdr_clk_p, + clk_n => sys_sdr_clk_n, + cke => sys_sdr_cke_q, + cs_n => sys_sdr_cs_qn, + ras_n => sys_sdr_ras_qn, + cas_n => sys_sdr_cas_qn, + we_n => sys_sdr_we_qn, + dm => std_logic_vector(sys_sdr_dm_q(3 downto 2)) + ); + + sys_sdr_clk_fb <= sys_sdr_clk_p after 2300 ps; + refresh <= true when falling_edge(sys_sdr_ras_qn) and falling_edge(sys_sdr_cas_qn) and sys_sdr_we_qn='1' else false; + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + sys_clk_in <= not sys_clk_in; + end process; + +STIMULUS: process + + begin + + wait for 3*CLK_PERIOD; + sys_rst_n_in <= '1'; + wait for 2*CLK_PERIOD; + + + wait; + + end process; + +END; diff --git a/projects/cpu/src/systest/vga_test_irom.vhdl b/projects/cpu/src/systest/vga_test_irom.vhdl new file mode 100644 index 0000000..8f12d8a --- /dev/null +++ b/projects/cpu/src/systest/vga_test_irom.vhdl @@ -0,0 +1,786 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 vga_test OF irom IS + + type imem_rom_t is array (0 to 724) of inst_t; + + -- Assembled from vga_test.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"02D", -- 0x000: JMP 0x02D + "111100" & X"000", -- 0x001: PUSH R00 + "111100" & X"001", -- 0x002: PUSH R01 + "101000" & X"061", -- 0x003: XIN R01, (0x06) + "011001" & X"101", -- 0x004: AND R01, 0x10 + "110001" & X"015", -- 0x005: JZ 0x015 + "101000" & X"020", -- 0x006: XIN R00, (0x02) + "001010" & X"5F1", -- 0x007: MOVC R01, (0x5F) + "001011" & X"010", -- 0x008: MOVC (R00), R01 + "010001" & X"011", -- 0x009: INC R01 + "001111" & X"5E1", -- 0x00A: CMP R01, 0x5E + "111010" & X"00D", -- 0x00B: JNE 0x00D + "000011" & X"1E1", -- 0x00C: MOV R01, 0x1E + "001101" & X"5F1", -- 0x00D: MOVC (0x5F), R01 + "001010" & X"5E0", -- 0x00E: MOVC R00, (0x5E) + "001110" & X"010", -- 0x00F: CMP R00, R01 + "111010" & X"003", -- 0x010: JNE 0x003 + "101000" & X"040", -- 0x011: XIN R00, (0x04) + "011011" & X"200", -- 0x012: OR R00, 0x20 + "100100" & X"040", -- 0x013: XOUT (0x04), R00 + "110000" & X"003", -- 0x014: JMP 0x003 + "111011" & X"019", -- 0x015: CALL 0x019 + "111101" & X"001", -- 0x016: POP R01 + "111101" & X"000", -- 0x017: POP R00 + "111111" & X"000", -- 0x018: RETI + "101000" & X"000", -- 0x019: XIN R00, (0x00) + "011001" & X"010", -- 0x01A: AND R00, 0x01 + "110001" & X"023", -- 0x01B: JZ 0x023 + "000011" & X"140", -- 0x01C: MOV R00, 0x14 + "100101" & X"000", -- 0x01D: XOUT (R00), 0x00 + "010001" & X"010", -- 0x01E: INC R00 + "100101" & X"000", -- 0x01F: XOUT (R00), 0x00 + "010001" & X"010", -- 0x020: INC R00 + "100101" & X"000", -- 0x021: XOUT (R00), 0x00 + "110000" & X"02C", -- 0x022: JMP 0x02C + "101000" & X"000", -- 0x023: XIN R00, (0x00) + "011001" & X"020", -- 0x024: AND R00, 0x02 + "110001" & X"02C", -- 0x025: JZ 0x02C + "000011" & X"140", -- 0x026: MOV R00, 0x14 + "100101" & X"000", -- 0x027: XOUT (R00), 0x00 + "010001" & X"010", -- 0x028: INC R00 + "100101" & X"000", -- 0x029: XOUT (R00), 0x00 + "010001" & X"010", -- 0x02A: INC R00 + "100101" & X"200", -- 0x02B: XOUT (R00), 0x20 + "111110" & X"000", -- 0x02C: RET + "111011" & X"1C6", -- 0x02D: CALL 0x1C6 + "111011" & X"1FB", -- 0x02E: CALL 0x1FB + "000011" & X"000", -- 0x02F: MOV R00, 0x00 + "100100" & X"010", -- 0x030: XOUT (0x01), R00 + "000011" & X"040", -- 0x031: MOV R00, 0x04 + "100100" & X"040", -- 0x032: XOUT (0x04), R00 + "101000" & X"040", -- 0x033: XIN R00, (0x04) + "011011" & X"020", -- 0x034: OR R00, 0x02 + "100100" & X"040", -- 0x035: XOUT (0x04), R00 + "000011" & X"030", -- 0x036: MOV R00, 0x03 + "100110" & X"030", -- 0x037: COUT (0x03), R00 + "000011" & X"010", -- 0x038: MOV R00, 0x01 + "111011" & X"218", -- 0x039: CALL 0x218 + "000011" & X"000", -- 0x03A: MOV R00, 0x00 + "000011" & X"C01", -- 0x03B: MOV R01, 0xC0 + "100100" & X"101", -- 0x03C: XOUT (0x10), R01 + "100100" & X"111", -- 0x03D: XOUT (0x11), R01 + "100100" & X"121", -- 0x03E: XOUT (0x12), R01 + "111011" & X"28C", -- 0x03F: CALL 0x28C + "111011" & X"271", -- 0x040: CALL 0x271 + "000011" & X"031", -- 0x041: MOV R01, 0x03 + "111011" & X"21D", -- 0x042: CALL 0x21D + "000011" & X"031", -- 0x043: MOV R01, 0x03 + "111011" & X"27D", -- 0x044: CALL 0x27D + "000011" & X"001", -- 0x045: MOV R01, 0x00 + "111011" & X"289", -- 0x046: CALL 0x289 + "101000" & X"040", -- 0x047: XIN R00, (0x04) + "011001" & X"CF0", -- 0x048: AND R00, 0xCF + "100100" & X"040", -- 0x049: XOUT (0x04), R00 + "000011" & X"000", -- 0x04A: MOV R00, 0x00 + "001101" & X"010", -- 0x04B: MOVC (0x01), R00 + "111011" & X"080", -- 0x04C: CALL 0x080 + "111011" & X"0D9", -- 0x04D: CALL 0x0D9 + "111011" & X"10D", -- 0x04E: CALL 0x10D + "001010" & X"010", -- 0x04F: MOVC R00, (0x01) + "010001" & X"010", -- 0x050: INC R00 + "001101" & X"010", -- 0x051: MOVC (0x01), R00 + "110000" & X"04D", -- 0x052: JMP 0x04D + "000011" & X"010", -- 0x053: MOV R00, 0x01 + "111011" & X"218", -- 0x054: CALL 0x218 + "000011" & X"0E1", -- 0x055: MOV R01, 0x0E + "111011" & X"21D", -- 0x056: CALL 0x21D + "000011" & X"0E1", -- 0x057: MOV R01, 0x0E + "111011" & X"286", -- 0x058: CALL 0x286 + "000011" & X"001", -- 0x059: MOV R01, 0x00 + "111011" & X"289", -- 0x05A: CALL 0x289 + "000011" & X"000", -- 0x05B: MOV R00, 0x00 + "000011" & X"001", -- 0x05C: MOV R01, 0x00 + "000011" & X"002", -- 0x05D: MOV R02, 0x00 + "111011" & X"16A", -- 0x05E: CALL 0x16A + "000011" & X"800", -- 0x05F: MOV R00, 0x80 + "000011" & X"08F", -- 0x060: MOV R15, 0x08 + "000111" & X"000", -- 0x061: MOVX (R00), 0x00 + "010001" & X"010", -- 0x062: INC R00 + "010101" & X"01F", -- 0x063: DEC R15 + "110010" & X"061", -- 0x064: JNZ 0x061 + "000011" & X"082", -- 0x065: MOV R02, 0x08 + "101000" & X"070", -- 0x066: XIN R00, (0x07) + "100100" & X"010", -- 0x067: XOUT (0x01), R00 + "011001" & X"040", -- 0x068: AND R00, 0x04 + "110010" & X"066", -- 0x069: JNZ 0x066 + "000011" & X"100", -- 0x06A: MOV R00, 0x10 + "100100" & X"070", -- 0x06B: XOUT (0x07), R00 + "010101" & X"022", -- 0x06C: SUB R02, 0x02 + "110010" & X"066", -- 0x06D: JNZ 0x066 + "111011" & X"147", -- 0x06E: CALL 0x147 + "000011" & X"060", -- 0x06F: MOV R00, 0x06 + "100100" & X"070", -- 0x070: XOUT (0x07), R00 + "101000" & X"080", -- 0x071: XIN R00, (0x08) + "001111" & X"F80", -- 0x072: CMP R00, 0xF8 + "111010" & X"07A", -- 0x073: JNE 0x07A + "101000" & X"090", -- 0x074: XIN R00, (0x09) + "001111" & X"FF0", -- 0x075: CMP R00, 0xFF + "111010" & X"07A", -- 0x076: JNE 0x07A + "101000" & X"0A0", -- 0x077: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x078: CMP R00, 0xFF + "111001" & X"07D", -- 0x079: JEQ 0x07D + "000011" & X"080", -- 0x07A: MOV R00, 0x08 + "111011" & X"16E", -- 0x07B: CALL 0x16E + "110000" & X"065", -- 0x07C: JMP 0x065 + "111011" & X"18E", -- 0x07D: CALL 0x18E + "111011" & X"292", -- 0x07E: CALL 0x292 + "111110" & X"000", -- 0x07F: RET + "000011" & X"010", -- 0x080: MOV R00, 0x01 + "111011" & X"218", -- 0x081: CALL 0x218 + "000011" & X"391", -- 0x082: MOV R01, 0x39 + "111011" & X"21D", -- 0x083: CALL 0x21D + "000011" & X"391", -- 0x084: MOV R01, 0x39 + "111011" & X"286", -- 0x085: CALL 0x286 + "000011" & X"001", -- 0x086: MOV R01, 0x00 + "111011" & X"289", -- 0x087: CALL 0x289 + "000011" & X"F80", -- 0x088: MOV R00, 0xF8 + "000011" & X"FF1", -- 0x089: MOV R01, 0xFF + "000011" & X"132", -- 0x08A: MOV R02, 0x13 + "111011" & X"16A", -- 0x08B: CALL 0x16A + "000011" & X"00F", -- 0x08C: MOV R15, 0x00 + "111011" & X"1D2", -- 0x08D: CALL 0x1D2 + "110011" & X"080", -- 0x08E: JC 0x080 + "010001" & X"01F", -- 0x08F: INC R15 + "001111" & X"0AF", -- 0x090: CMP R15, 0x0A + "111010" & X"08D", -- 0x091: JNE 0x08D + "111011" & X"1D2", -- 0x092: CALL 0x1D2 + "110011" & X"080", -- 0x093: JC 0x080 + "010001" & X"01F", -- 0x094: INC R15 + "001101" & X"020", -- 0x095: MOVC (0x02), R00 + "111011" & X"1D2", -- 0x096: CALL 0x1D2 + "110011" & X"080", -- 0x097: JC 0x080 + "010001" & X"01F", -- 0x098: INC R15 + "001101" & X"030", -- 0x099: MOVC (0x03), R00 + "111011" & X"1D2", -- 0x09A: CALL 0x1D2 + "110011" & X"080", -- 0x09B: JC 0x080 + "010001" & X"01F", -- 0x09C: INC R15 + "001101" & X"040", -- 0x09D: MOVC (0x04), R00 + "111011" & X"1D2", -- 0x09E: CALL 0x1D2 + "110011" & X"080", -- 0x09F: JC 0x080 + "010001" & X"01F", -- 0x0A0: INC R15 + "001101" & X"050", -- 0x0A1: MOVC (0x05), R00 + "001010" & X"021", -- 0x0A2: MOVC R01, (0x02) + "111011" & X"1D2", -- 0x0A3: CALL 0x1D2 + "110011" & X"080", -- 0x0A4: JC 0x080 + "010001" & X"01F", -- 0x0A5: INC R15 + "001110" & X"01F", -- 0x0A6: CMP R15, R01 + "111010" & X"0A3", -- 0x0A7: JNE 0x0A3 + "000011" & X"08F", -- 0x0A8: MOV R15, 0x08 + "000011" & X"1D1", -- 0x0A9: MOV R01, 0x1D + "000011" & X"032", -- 0x0AA: MOV R02, 0x03 + "010101" & X"012", -- 0x0AB: DEC R02 + "000010" & X"013", -- 0x0AC: MOV R03, R01 + "111011" & X"1D2", -- 0x0AD: CALL 0x1D2 + "110011" & X"0D7", -- 0x0AE: JC 0x0D7 + "010100" & X"023", -- 0x0AF: SUB R03, R02 + "001011" & X"030", -- 0x0B0: MOVC (R00), R03 + "001111" & X"002", -- 0x0B1: TST R02 + "110010" & X"0AB", -- 0x0B2: JNZ 0x0AB + "010101" & X"031", -- 0x0B3: SUB R01, 0x03 + "010101" & X"01F", -- 0x0B4: DEC R15 + "110010" & X"0AA", -- 0x0B5: JNZ 0x0AA + "000011" & X"082", -- 0x0B6: MOV R02, 0x08 + "000011" & X"061", -- 0x0B7: MOV R01, 0x06 + "000011" & X"803", -- 0x0B8: MOV R03, 0x80 + "001001" & X"010", -- 0x0B9: MOVC R00, (R01) + "000110" & X"030", -- 0x0BA: MOVX (R00), R03 + "010001" & X"011", -- 0x0BB: INC R01 + "010001" & X"013", -- 0x0BC: INC R03 + "001111" & X"863", -- 0x0BD: CMP R03, 0x86 + "111010" & X"0B9", -- 0x0BE: JNE 0x0B9 + "101000" & X"070", -- 0x0BF: XIN R00, (0x07) + "100100" & X"010", -- 0x0C0: XOUT (0x01), R00 + "011001" & X"040", -- 0x0C1: AND R00, 0x04 + "110010" & X"0BF", -- 0x0C2: JNZ 0x0BF + "000011" & X"100", -- 0x0C3: MOV R00, 0x10 + "100100" & X"070", -- 0x0C4: XOUT (0x07), R00 + "010101" & X"022", -- 0x0C5: SUB R02, 0x02 + "110010" & X"0B8", -- 0x0C6: JNZ 0x0B8 + "111011" & X"147", -- 0x0C7: CALL 0x147 + "000011" & X"060", -- 0x0C8: MOV R00, 0x06 + "100100" & X"070", -- 0x0C9: XOUT (0x07), R00 + "111011" & X"18E", -- 0x0CA: CALL 0x18E + "101000" & X"080", -- 0x0CB: XIN R00, (0x08) + "001111" & X"000", -- 0x0CC: TST R00 + "110010" & X"0D4", -- 0x0CD: JNZ 0x0D4 + "101000" & X"090", -- 0x0CE: XIN R00, (0x09) + "001111" & X"000", -- 0x0CF: TST R00 + "110010" & X"0D4", -- 0x0D0: JNZ 0x0D4 + "101000" & X"0A0", -- 0x0D1: XIN R00, (0x0A) + "001111" & X"000", -- 0x0D2: TST R00 + "110001" & X"0D7", -- 0x0D3: JZ 0x0D7 + "000011" & X"080", -- 0x0D4: MOV R00, 0x08 + "111011" & X"17E", -- 0x0D5: CALL 0x17E + "110000" & X"0A8", -- 0x0D6: JMP 0x0A8 + "111011" & X"292", -- 0x0D7: CALL 0x292 + "111110" & X"000", -- 0x0D8: RET + "000011" & X"010", -- 0x0D9: MOV R00, 0x01 + "111011" & X"218", -- 0x0DA: CALL 0x218 + "000011" & X"1D1", -- 0x0DB: MOV R01, 0x1D + "111011" & X"21D", -- 0x0DC: CALL 0x21D + "000011" & X"1D1", -- 0x0DD: MOV R01, 0x1D + "111011" & X"286", -- 0x0DE: CALL 0x286 + "000011" & X"001", -- 0x0DF: MOV R01, 0x00 + "111011" & X"289", -- 0x0E0: CALL 0x289 + "000011" & X"000", -- 0x0E1: MOV R00, 0x00 + "000011" & X"001", -- 0x0E2: MOV R01, 0x00 + "000011" & X"202", -- 0x0E3: MOV R02, 0x20 + "111011" & X"16A", -- 0x0E4: CALL 0x16A + "001010" & X"010", -- 0x0E5: MOVC R00, (0x01) + "001101" & X"000", -- 0x0E6: MOVC (0x00), R00 + "000011" & X"082", -- 0x0E7: MOV R02, 0x08 + "001010" & X"001", -- 0x0E8: MOVC R01, (0x00) + "000011" & X"800", -- 0x0E9: MOV R00, 0x80 + "000011" & X"08F", -- 0x0EA: MOV R15, 0x08 + "000110" & X"001", -- 0x0EB: MOVX (R01), R00 + "010001" & X"010", -- 0x0EC: INC R00 + "010001" & X"011", -- 0x0ED: INC R01 + "010101" & X"01F", -- 0x0EE: DEC R15 + "110010" & X"0EB", -- 0x0EF: JNZ 0x0EB + "101000" & X"070", -- 0x0F0: XIN R00, (0x07) + "100100" & X"010", -- 0x0F1: XOUT (0x01), R00 + "011001" & X"040", -- 0x0F2: AND R00, 0x04 + "110010" & X"0F0", -- 0x0F3: JNZ 0x0F0 + "000011" & X"100", -- 0x0F4: MOV R00, 0x10 + "100100" & X"070", -- 0x0F5: XOUT (0x07), R00 + "001010" & X"000", -- 0x0F6: MOVC R00, (0x00) + "010001" & X"010", -- 0x0F7: INC R00 + "001101" & X"000", -- 0x0F8: MOVC (0x00), R00 + "010101" & X"022", -- 0x0F9: SUB R02, 0x02 + "110010" & X"0E8", -- 0x0FA: JNZ 0x0E8 + "111011" & X"147", -- 0x0FB: CALL 0x147 + "000011" & X"060", -- 0x0FC: MOV R00, 0x06 + "100100" & X"070", -- 0x0FD: XOUT (0x07), R00 + "101000" & X"080", -- 0x0FE: XIN R00, (0x08) + "001111" & X"F80", -- 0x0FF: CMP R00, 0xF8 + "111010" & X"107", -- 0x100: JNE 0x107 + "101000" & X"090", -- 0x101: XIN R00, (0x09) + "001111" & X"FF0", -- 0x102: CMP R00, 0xFF + "111010" & X"107", -- 0x103: JNE 0x107 + "101000" & X"0A0", -- 0x104: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x105: CMP R00, 0xFF + "111001" & X"10A", -- 0x106: JEQ 0x10A + "000011" & X"080", -- 0x107: MOV R00, 0x08 + "111011" & X"16E", -- 0x108: CALL 0x16E + "110000" & X"0E7", -- 0x109: JMP 0x0E7 + "111011" & X"18E", -- 0x10A: CALL 0x18E + "111011" & X"292", -- 0x10B: CALL 0x292 + "111110" & X"000", -- 0x10C: RET + "000011" & X"010", -- 0x10D: MOV R00, 0x01 + "111011" & X"218", -- 0x10E: CALL 0x218 + "000011" & X"2B1", -- 0x10F: MOV R01, 0x2B + "111011" & X"21D", -- 0x110: CALL 0x21D + "000011" & X"2B1", -- 0x111: MOV R01, 0x2B + "111011" & X"286", -- 0x112: CALL 0x286 + "000011" & X"001", -- 0x113: MOV R01, 0x00 + "111011" & X"289", -- 0x114: CALL 0x289 + "000011" & X"000", -- 0x115: MOV R00, 0x00 + "000011" & X"001", -- 0x116: MOV R01, 0x00 + "000011" & X"202", -- 0x117: MOV R02, 0x20 + "111011" & X"16A", -- 0x118: CALL 0x16A + "001010" & X"010", -- 0x119: MOVC R00, (0x01) + "001101" & X"000", -- 0x11A: MOVC (0x00), R00 + "101000" & X"070", -- 0x11B: XIN R00, (0x07) + "100100" & X"010", -- 0x11C: XOUT (0x01), R00 + "011001" & X"200", -- 0x11D: AND R00, 0x20 + "110010" & X"122", -- 0x11E: JNZ 0x122 + "000011" & X"200", -- 0x11F: MOV R00, 0x20 + "100100" & X"070", -- 0x120: XOUT (0x07), R00 + "110000" & X"11B", -- 0x121: JMP 0x11B + "111011" & X"147", -- 0x122: CALL 0x147 + "000011" & X"050", -- 0x123: MOV R00, 0x05 + "100100" & X"070", -- 0x124: XOUT (0x07), R00 + "000011" & X"083", -- 0x125: MOV R03, 0x08 + "101000" & X"070", -- 0x126: XIN R00, (0x07) + "100100" & X"010", -- 0x127: XOUT (0x01), R00 + "011001" & X"200", -- 0x128: AND R00, 0x20 + "110010" & X"126", -- 0x129: JNZ 0x126 + "001010" & X"001", -- 0x12A: MOVC R01, (0x00) + "000011" & X"800", -- 0x12B: MOV R00, 0x80 + "000011" & X"08F", -- 0x12C: MOV R15, 0x08 + "000100" & X"002", -- 0x12D: MOVX R02, (R00) + "001110" & X"012", -- 0x12E: CMP R02, R01 + "111010" & X"15A", -- 0x12F: JNE 0x15A + "010001" & X"010", -- 0x130: INC R00 + "010001" & X"011", -- 0x131: INC R01 + "010101" & X"01F", -- 0x132: DEC R15 + "110010" & X"12D", -- 0x133: JNZ 0x12D + "000011" & X"200", -- 0x134: MOV R00, 0x20 + "100100" & X"070", -- 0x135: XOUT (0x07), R00 + "001010" & X"000", -- 0x136: MOVC R00, (0x00) + "010001" & X"010", -- 0x137: INC R00 + "001101" & X"000", -- 0x138: MOVC (0x00), R00 + "010101" & X"023", -- 0x139: SUB R03, 0x02 + "110010" & X"126", -- 0x13A: JNZ 0x126 + "101000" & X"080", -- 0x13B: XIN R00, (0x08) + "001111" & X"F80", -- 0x13C: CMP R00, 0xF8 + "111010" & X"144", -- 0x13D: JNE 0x144 + "101000" & X"090", -- 0x13E: XIN R00, (0x09) + "001111" & X"FF0", -- 0x13F: CMP R00, 0xFF + "111010" & X"144", -- 0x140: JNE 0x144 + "101000" & X"0A0", -- 0x141: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x142: CMP R00, 0xFF + "111001" & X"14E", -- 0x143: JEQ 0x14E + "000011" & X"080", -- 0x144: MOV R00, 0x08 + "111011" & X"16E", -- 0x145: CALL 0x16E + "110000" & X"122", -- 0x146: JMP 0x122 + "111100" & X"000", -- 0x147: PUSH R00 + "101000" & X"070", -- 0x148: XIN R00, (0x07) + "100100" & X"010", -- 0x149: XOUT (0x01), R00 + "011001" & X"010", -- 0x14A: AND R00, 0x01 + "110010" & X"148", -- 0x14B: JNZ 0x148 + "111101" & X"000", -- 0x14C: POP R00 + "111110" & X"000", -- 0x14D: RET + "000011" & X"010", -- 0x14E: MOV R00, 0x01 + "111011" & X"218", -- 0x14F: CALL 0x218 + "000011" & X"481", -- 0x150: MOV R01, 0x48 + "111011" & X"21D", -- 0x151: CALL 0x21D + "000011" & X"C00", -- 0x152: MOV R00, 0xC0 + "111011" & X"218", -- 0x153: CALL 0x218 + "111011" & X"199", -- 0x154: CALL 0x199 + "000011" & X"481", -- 0x155: MOV R01, 0x48 + "111011" & X"286", -- 0x156: CALL 0x286 + "000011" & X"001", -- 0x157: MOV R01, 0x00 + "111011" & X"289", -- 0x158: CALL 0x289 + "110000" & X"168", -- 0x159: JMP 0x168 + "000011" & X"010", -- 0x15A: MOV R00, 0x01 + "111011" & X"218", -- 0x15B: CALL 0x218 + "000011" & X"521", -- 0x15C: MOV R01, 0x52 + "111011" & X"21D", -- 0x15D: CALL 0x21D + "111011" & X"199", -- 0x15E: CALL 0x199 + "111011" & X"1B1", -- 0x15F: CALL 0x1B1 + "000011" & X"521", -- 0x160: MOV R01, 0x52 + "111011" & X"286", -- 0x161: CALL 0x286 + "000011" & X"001", -- 0x162: MOV R01, 0x00 + "111011" & X"289", -- 0x163: CALL 0x289 + "101000" & X"040", -- 0x164: XIN R00, (0x04) + "011011" & X"100", -- 0x165: OR R00, 0x10 + "100100" & X"040", -- 0x166: XOUT (0x04), R00 + "110000" & X"168", -- 0x167: JMP 0x168 + "111011" & X"292", -- 0x168: CALL 0x292 + "111110" & X"000", -- 0x169: RET + "100100" & X"080", -- 0x16A: XOUT (0x08), R00 + "100100" & X"091", -- 0x16B: XOUT (0x09), R01 + "100100" & X"0A2", -- 0x16C: XOUT (0x0A), R02 + "111110" & X"000", -- 0x16D: RET + "111100" & X"001", -- 0x16E: PUSH R01 + "111100" & X"002", -- 0x16F: PUSH R02 + "111100" & X"003", -- 0x170: PUSH R03 + "101000" & X"081", -- 0x171: XIN R01, (0x08) + "101000" & X"092", -- 0x172: XIN R02, (0x09) + "101000" & X"0A3", -- 0x173: XIN R03, (0x0A) + "010000" & X"001", -- 0x174: ADD R01, R00 + "010011" & X"002", -- 0x175: ADDC R02, 0x00 + "010011" & X"003", -- 0x176: ADDC R03, 0x00 + "100100" & X"081", -- 0x177: XOUT (0x08), R01 + "100100" & X"092", -- 0x178: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x179: XOUT (0x0A), R03 + "111101" & X"003", -- 0x17A: POP R03 + "111101" & X"002", -- 0x17B: POP R02 + "111101" & X"001", -- 0x17C: POP R01 + "111110" & X"000", -- 0x17D: RET + "111100" & X"001", -- 0x17E: PUSH R01 + "111100" & X"002", -- 0x17F: PUSH R02 + "111100" & X"003", -- 0x180: PUSH R03 + "101000" & X"081", -- 0x181: XIN R01, (0x08) + "101000" & X"092", -- 0x182: XIN R02, (0x09) + "101000" & X"0A3", -- 0x183: XIN R03, (0x0A) + "010100" & X"001", -- 0x184: SUB R01, R00 + "010111" & X"002", -- 0x185: SUBC R02, 0x00 + "010111" & X"003", -- 0x186: SUBC R03, 0x00 + "100100" & X"081", -- 0x187: XOUT (0x08), R01 + "100100" & X"092", -- 0x188: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x189: XOUT (0x0A), R03 + "111101" & X"003", -- 0x18A: POP R03 + "111101" & X"002", -- 0x18B: POP R02 + "111101" & X"001", -- 0x18C: POP R01 + "111110" & X"000", -- 0x18D: RET + "000011" & X"C00", -- 0x18E: MOV R00, 0xC0 + "111011" & X"218", -- 0x18F: CALL 0x218 + "111011" & X"199", -- 0x190: CALL 0x199 + "111110" & X"000", -- 0x191: RET + "111100" & X"001", -- 0x192: PUSH R01 + "111011" & X"1F4", -- 0x193: CALL 0x1F4 + "111011" & X"22F", -- 0x194: CALL 0x22F + "000010" & X"010", -- 0x195: MOV R00, R01 + "111011" & X"22F", -- 0x196: CALL 0x22F + "111101" & X"001", -- 0x197: POP R01 + "111110" & X"000", -- 0x198: RET + "111100" & X"000", -- 0x199: PUSH R00 + "101000" & X"0A0", -- 0x19A: XIN R00, (0x0A) + "111011" & X"192", -- 0x19B: CALL 0x192 + "101000" & X"090", -- 0x19C: XIN R00, (0x09) + "111011" & X"192", -- 0x19D: CALL 0x192 + "101000" & X"080", -- 0x19E: XIN R00, (0x08) + "111011" & X"192", -- 0x19F: CALL 0x192 + "111101" & X"000", -- 0x1A0: POP R00 + "111110" & X"000", -- 0x1A1: RET + "111100" & X"000", -- 0x1A2: PUSH R00 + "010001" & X"031", -- 0x1A3: ADD R01, 0x03 + "001001" & X"010", -- 0x1A4: MOVC R00, (R01) + "111011" & X"192", -- 0x1A5: CALL 0x192 + "010101" & X"011", -- 0x1A6: DEC R01 + "001001" & X"010", -- 0x1A7: MOVC R00, (R01) + "111011" & X"192", -- 0x1A8: CALL 0x192 + "010101" & X"011", -- 0x1A9: DEC R01 + "001001" & X"010", -- 0x1AA: MOVC R00, (R01) + "111011" & X"192", -- 0x1AB: CALL 0x192 + "010101" & X"011", -- 0x1AC: DEC R01 + "001001" & X"010", -- 0x1AD: MOVC R00, (R01) + "111011" & X"192", -- 0x1AE: CALL 0x192 + "111101" & X"000", -- 0x1AF: POP R00 + "111110" & X"000", -- 0x1B0: RET + "111100" & X"000", -- 0x1B1: PUSH R00 + "000011" & X"C00", -- 0x1B2: MOV R00, 0xC0 + "111011" & X"218", -- 0x1B3: CALL 0x218 + "000101" & X"870", -- 0x1B4: MOVX R00, (0x87) + "111011" & X"192", -- 0x1B5: CALL 0x192 + "000101" & X"860", -- 0x1B6: MOVX R00, (0x86) + "111011" & X"192", -- 0x1B7: CALL 0x192 + "000101" & X"850", -- 0x1B8: MOVX R00, (0x85) + "111011" & X"192", -- 0x1B9: CALL 0x192 + "000101" & X"840", -- 0x1BA: MOVX R00, (0x84) + "111011" & X"192", -- 0x1BB: CALL 0x192 + "000101" & X"830", -- 0x1BC: MOVX R00, (0x83) + "111011" & X"192", -- 0x1BD: CALL 0x192 + "000101" & X"820", -- 0x1BE: MOVX R00, (0x82) + "111011" & X"192", -- 0x1BF: CALL 0x192 + "000101" & X"810", -- 0x1C0: MOVX R00, (0x81) + "111011" & X"192", -- 0x1C1: CALL 0x192 + "000101" & X"800", -- 0x1C2: MOVX R00, (0x80) + "111011" & X"192", -- 0x1C3: CALL 0x192 + "111101" & X"000", -- 0x1C4: POP R00 + "111110" & X"000", -- 0x1C5: RET + "111100" & X"000", -- 0x1C6: PUSH R00 + "000011" & X"0D0", -- 0x1C7: MOV R00, 0x0D + "100100" & X"130", -- 0x1C8: XOUT (0x13), R00 + "000011" & X"1E0", -- 0x1C9: MOV R00, 0x1E + "001101" & X"5E0", -- 0x1CA: MOVC (0x5E), R00 + "001101" & X"5F0", -- 0x1CB: MOVC (0x5F), R00 + "000011" & X"E80", -- 0x1CC: MOV R00, 0xE8 + "001101" & X"600", -- 0x1CD: MOVC (0x60), R00 + "000011" & X"030", -- 0x1CE: MOV R00, 0x03 + "001101" & X"610", -- 0x1CF: MOVC (0x61), R00 + "111101" & X"000", -- 0x1D0: POP R00 + "111110" & X"000", -- 0x1D1: RET + "111100" & X"001", -- 0x1D2: PUSH R01 + "111100" & X"002", -- 0x1D3: PUSH R02 + "111100" & X"003", -- 0x1D4: PUSH R03 + "001010" & X"602", -- 0x1D5: MOVC R02, (0x60) + "001010" & X"613", -- 0x1D6: MOVC R03, (0x61) + "001010" & X"5E1", -- 0x1D7: MOVC R01, (0x5E) + "001010" & X"5F0", -- 0x1D8: MOVC R00, (0x5F) + "001110" & X"010", -- 0x1D9: CMP R00, R01 + "111001" & X"1E6", -- 0x1DA: JEQ 0x1E6 + "001001" & X"010", -- 0x1DB: MOVC R00, (R01) + "010001" & X"011", -- 0x1DC: INC R01 + "001111" & X"5E1", -- 0x1DD: CMP R01, 0x5E + "111010" & X"1E0", -- 0x1DE: JNE 0x1E0 + "000011" & X"1E1", -- 0x1DF: MOV R01, 0x1E + "001101" & X"5E1", -- 0x1E0: MOVC (0x5E), R01 + "010101" & X"000", -- 0x1E1: CLRC + "111101" & X"003", -- 0x1E2: POP R03 + "111101" & X"002", -- 0x1E3: POP R02 + "111101" & X"001", -- 0x1E4: POP R01 + "111110" & X"000", -- 0x1E5: RET + "111011" & X"2A7", -- 0x1E6: CALL 0x2A7 + "010101" & X"012", -- 0x1E7: DEC R02 + "010111" & X"003", -- 0x1E8: SUBC R03, 0x00 + "110010" & X"1D8", -- 0x1E9: JNZ 0x1D8 + "001111" & X"002", -- 0x1EA: TST R02 + "110010" & X"1D8", -- 0x1EB: JNZ 0x1D8 + "101011" & X"000", -- 0x1EC: SETC + "110000" & X"1E2", -- 0x1ED: JMP 0x1E2 + "011001" & X"0F0", -- 0x1EE: AND R00, 0x0F + "001111" & X"0A0", -- 0x1EF: CMP R00, 0x0A + "110101" & X"1F2", -- 0x1F0: JLT 0x1F2 + "010001" & X"070", -- 0x1F1: ADD R00, 0x07 + "010001" & X"300", -- 0x1F2: ADD R00, 0x30 + "111110" & X"000", -- 0x1F3: RET + "111100" & X"000", -- 0x1F4: PUSH R00 + "111011" & X"1EE", -- 0x1F5: CALL 0x1EE + "000010" & X"001", -- 0x1F6: MOV R01, R00 + "111101" & X"000", -- 0x1F7: POP R00 + "101010" & X"000", -- 0x1F8: SWAP R00 + "111011" & X"1EE", -- 0x1F9: CALL 0x1EE + "111110" & X"000", -- 0x1FA: RET + "000011" & X"002", -- 0x1FB: MOV R02, 0x00 + "000011" & X"030", -- 0x1FC: MOV R00, 0x03 + "111011" & X"247", -- 0x1FD: CALL 0x247 + "111011" & X"2A0", -- 0x1FE: CALL 0x2A0 + "000011" & X"002", -- 0x1FF: MOV R02, 0x00 + "000011" & X"030", -- 0x200: MOV R00, 0x03 + "111011" & X"247", -- 0x201: CALL 0x247 + "111011" & X"2A0", -- 0x202: CALL 0x2A0 + "000011" & X"002", -- 0x203: MOV R02, 0x00 + "000011" & X"020", -- 0x204: MOV R00, 0x02 + "111011" & X"247", -- 0x205: CALL 0x247 + "111011" & X"2A7", -- 0x206: CALL 0x2A7 + "000011" & X"280", -- 0x207: MOV R00, 0x28 + "111011" & X"218", -- 0x208: CALL 0x218 + "000011" & X"0C0", -- 0x209: MOV R00, 0x0C + "111011" & X"218", -- 0x20A: CALL 0x218 + "000011" & X"060", -- 0x20B: MOV R00, 0x06 + "111011" & X"218", -- 0x20C: CALL 0x218 + "000011" & X"010", -- 0x20D: MOV R00, 0x01 + "111011" & X"218", -- 0x20E: CALL 0x218 + "111110" & X"000", -- 0x20F: RET + "111100" & X"000", -- 0x210: PUSH R00 + "111011" & X"23B", -- 0x211: CALL 0x23B + "011001" & X"800", -- 0x212: AND R00, 0x80 + "110001" & X"216", -- 0x213: JZ 0x216 + "111011" & X"2BE", -- 0x214: CALL 0x2BE + "110000" & X"211", -- 0x215: JMP 0x211 + "111101" & X"000", -- 0x216: POP R00 + "111110" & X"000", -- 0x217: RET + "111100" & X"002", -- 0x218: PUSH R02 + "000011" & X"002", -- 0x219: MOV R02, 0x00 + "111011" & X"234", -- 0x21A: CALL 0x234 + "111101" & X"002", -- 0x21B: POP R02 + "111110" & X"000", -- 0x21C: RET + "111100" & X"000", -- 0x21D: PUSH R00 + "000100" & X"010", -- 0x21E: MOVX R00, (R01) + "010001" & X"011", -- 0x21F: INC R01 + "001111" & X"000", -- 0x220: TST R00 + "110001" & X"224", -- 0x221: JZ 0x224 + "111011" & X"22F", -- 0x222: CALL 0x22F + "110000" & X"21E", -- 0x223: JMP 0x21E + "111101" & X"000", -- 0x224: POP R00 + "111110" & X"000", -- 0x225: RET + "111100" & X"000", -- 0x226: PUSH R00 + "001001" & X"010", -- 0x227: MOVC R00, (R01) + "010001" & X"011", -- 0x228: INC R01 + "001111" & X"000", -- 0x229: TST R00 + "110001" & X"22D", -- 0x22A: JZ 0x22D + "111011" & X"22F", -- 0x22B: CALL 0x22F + "110000" & X"227", -- 0x22C: JMP 0x227 + "111101" & X"000", -- 0x22D: POP R00 + "111110" & X"000", -- 0x22E: RET + "111100" & X"002", -- 0x22F: PUSH R02 + "000011" & X"402", -- 0x230: MOV R02, 0x40 + "111011" & X"234", -- 0x231: CALL 0x234 + "111101" & X"002", -- 0x232: POP R02 + "111110" & X"000", -- 0x233: RET + "111011" & X"210", -- 0x234: CALL 0x210 + "111100" & X"000", -- 0x235: PUSH R00 + "101010" & X"000", -- 0x236: SWAP R00 + "111011" & X"247", -- 0x237: CALL 0x247 + "111101" & X"000", -- 0x238: POP R00 + "111011" & X"247", -- 0x239: CALL 0x247 + "111110" & X"000", -- 0x23A: RET + "111100" & X"002", -- 0x23B: PUSH R02 + "000011" & X"002", -- 0x23C: MOV R02, 0x00 + "111011" & X"240", -- 0x23D: CALL 0x240 + "111101" & X"002", -- 0x23E: POP R02 + "111110" & X"000", -- 0x23F: RET + "111011" & X"25A", -- 0x240: CALL 0x25A + "101010" & X"000", -- 0x241: SWAP R00 + "111100" & X"000", -- 0x242: PUSH R00 + "111011" & X"25A", -- 0x243: CALL 0x25A + "111101" & X"002", -- 0x244: POP R02 + "011010" & X"020", -- 0x245: OR R00, R02 + "111110" & X"000", -- 0x246: RET + "111100" & X"001", -- 0x247: PUSH R01 + "011001" & X"0F0", -- 0x248: AND R00, 0x0F + "000010" & X"001", -- 0x249: MOV R01, R00 + "011010" & X"021", -- 0x24A: OR R01, R02 + "100100" & X"031", -- 0x24B: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x24C: CALL 0x2BE + "000010" & X"001", -- 0x24D: MOV R01, R00 + "011010" & X"021", -- 0x24E: OR R01, R02 + "011011" & X"801", -- 0x24F: OR R01, 0x80 + "100100" & X"031", -- 0x250: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x251: CALL 0x2BE + "000010" & X"001", -- 0x252: MOV R01, R00 + "011010" & X"021", -- 0x253: OR R01, R02 + "100100" & X"031", -- 0x254: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x255: CALL 0x2BE + "011011" & X"201", -- 0x256: OR R01, 0x20 + "100100" & X"031", -- 0x257: XOUT (0x03), R01 + "111101" & X"001", -- 0x258: POP R01 + "111110" & X"000", -- 0x259: RET + "111100" & X"001", -- 0x25A: PUSH R01 + "000011" & X"201", -- 0x25B: MOV R01, 0x20 + "011010" & X"021", -- 0x25C: OR R01, R02 + "100100" & X"031", -- 0x25D: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x25E: CALL 0x2BE + "000011" & X"201", -- 0x25F: MOV R01, 0x20 + "011010" & X"021", -- 0x260: OR R01, R02 + "011011" & X"801", -- 0x261: OR R01, 0x80 + "100100" & X"031", -- 0x262: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x263: CALL 0x2BE + "101000" & X"030", -- 0x264: XIN R00, (0x03) + "011001" & X"0F0", -- 0x265: AND R00, 0x0F + "000011" & X"201", -- 0x266: MOV R01, 0x20 + "011010" & X"021", -- 0x267: OR R01, R02 + "100100" & X"031", -- 0x268: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x269: CALL 0x2BE + "111101" & X"001", -- 0x26A: POP R01 + "111110" & X"000", -- 0x26B: RET + "111100" & X"000", -- 0x26C: PUSH R00 + "000011" & X"020", -- 0x26D: MOV R00, 0x02 + "100100" & X"0E0", -- 0x26E: XOUT (0x0E), R00 + "111101" & X"000", -- 0x26F: POP R00 + "111110" & X"000", -- 0x270: RET + "111100" & X"000", -- 0x271: PUSH R00 + "000011" & X"010", -- 0x272: MOV R00, 0x01 + "100100" & X"0E0", -- 0x273: XOUT (0x0E), R00 + "111101" & X"000", -- 0x274: POP R00 + "111110" & X"000", -- 0x275: RET + "111011" & X"28C", -- 0x276: CALL 0x28C + "100100" & X"0C1", -- 0x277: XOUT (0x0C), R01 + "100100" & X"0B0", -- 0x278: XOUT (0x0B), R00 + "111110" & X"000", -- 0x279: RET + "111011" & X"28C", -- 0x27A: CALL 0x28C + "100100" & X"0D0", -- 0x27B: XOUT (0x0D), R00 + "111110" & X"000", -- 0x27C: RET + "111100" & X"000", -- 0x27D: PUSH R00 + "000100" & X"010", -- 0x27E: MOVX R00, (R01) + "010001" & X"011", -- 0x27F: INC R01 + "001111" & X"000", -- 0x280: TST R00 + "110001" & X"284", -- 0x281: JZ 0x284 + "111011" & X"27A", -- 0x282: CALL 0x27A + "110000" & X"27E", -- 0x283: JMP 0x27E + "111101" & X"000", -- 0x284: POP R00 + "111110" & X"000", -- 0x285: RET + "111011" & X"26C", -- 0x286: CALL 0x26C + "111011" & X"27D", -- 0x287: CALL 0x27D + "111110" & X"000", -- 0x288: RET + "111011" & X"27D", -- 0x289: CALL 0x27D + "111011" & X"26C", -- 0x28A: CALL 0x26C + "111110" & X"000", -- 0x28B: RET + "111100" & X"000", -- 0x28C: PUSH R00 + "101000" & X"0E0", -- 0x28D: XIN R00, (0x0E) + "011001" & X"020", -- 0x28E: AND R00, 0x02 + "110001" & X"28D", -- 0x28F: JZ 0x28D + "111101" & X"000", -- 0x290: POP R00 + "111110" & X"000", -- 0x291: RET + "111100" & X"00F", -- 0x292: PUSH R15 + "000011" & X"0AF", -- 0x293: MOV R15, 0x0A + "111011" & X"299", -- 0x294: CALL 0x299 + "010101" & X"01F", -- 0x295: DEC R15 + "110010" & X"294", -- 0x296: JNZ 0x294 + "111101" & X"00F", -- 0x297: POP R15 + "111110" & X"000", -- 0x298: RET + "111100" & X"00F", -- 0x299: PUSH R15 + "000011" & X"0AF", -- 0x29A: MOV R15, 0x0A + "111011" & X"2A0", -- 0x29B: CALL 0x2A0 + "010101" & X"01F", -- 0x29C: DEC R15 + "110010" & X"29B", -- 0x29D: JNZ 0x29B + "111101" & X"00F", -- 0x29E: POP R15 + "111110" & X"000", -- 0x29F: RET + "111100" & X"00F", -- 0x2A0: PUSH R15 + "000011" & X"0AF", -- 0x2A1: MOV R15, 0x0A + "111011" & X"2A7", -- 0x2A2: CALL 0x2A7 + "010101" & X"01F", -- 0x2A3: DEC R15 + "110010" & X"2A2", -- 0x2A4: JNZ 0x2A2 + "111101" & X"00F", -- 0x2A5: POP R15 + "111110" & X"000", -- 0x2A6: RET + "111100" & X"00F", -- 0x2A7: PUSH R15 + "000011" & X"0AF", -- 0x2A8: MOV R15, 0x0A + "111011" & X"2AE", -- 0x2A9: CALL 0x2AE + "010101" & X"01F", -- 0x2AA: DEC R15 + "110010" & X"2A9", -- 0x2AB: JNZ 0x2A9 + "111101" & X"00F", -- 0x2AC: POP R15 + "111110" & X"000", -- 0x2AD: RET + "111100" & X"00F", -- 0x2AE: PUSH R15 + "000011" & X"0AF", -- 0x2AF: MOV R15, 0x0A + "111011" & X"2B5", -- 0x2B0: CALL 0x2B5 + "010101" & X"01F", -- 0x2B1: DEC R15 + "110010" & X"2B0", -- 0x2B2: JNZ 0x2B0 + "111101" & X"00F", -- 0x2B3: POP R15 + "111110" & X"000", -- 0x2B4: RET + "111100" & X"00F", -- 0x2B5: PUSH R15 + "000011" & X"63F", -- 0x2B6: MOV R15, 0x63 + "000000" & X"000", -- 0x2B7: NOP + "000000" & X"000", -- 0x2B8: NOP + "000000" & X"000", -- 0x2B9: NOP + "010101" & X"01F", -- 0x2BA: DEC R15 + "110010" & X"2B7", -- 0x2BB: JNZ 0x2B7 + "111101" & X"00F", -- 0x2BC: POP R15 + "111110" & X"000", -- 0x2BD: RET + "111100" & X"00F", -- 0x2BE: PUSH R15 + "000011" & X"09F", -- 0x2BF: MOV R15, 0x09 + "000000" & X"000", -- 0x2C0: NOP + "000000" & X"000", -- 0x2C1: NOP + "000000" & X"000", -- 0x2C2: NOP + "010101" & X"01F", -- 0x2C3: DEC R15 + "110010" & X"2C0", -- 0x2C4: JNZ 0x2C0 + "111101" & X"00F", -- 0x2C5: POP R15 + "111110" & X"000", -- 0x2C6: RET + "111100" & X"001", -- 0x2C7: PUSH R01 + "101000" & X"061", -- 0x2C8: XIN R01, (0x06) + "011001" & X"021", -- 0x2C9: AND R01, 0x02 + "110010" & X"2C8", -- 0x2CA: JNZ 0x2C8 + "100100" & X"020", -- 0x2CB: XOUT (0x02), R00 + "111101" & X"001", -- 0x2CC: POP R01 + "111110" & X"000", -- 0x2CD: RET + "111100" & X"001", -- 0x2CE: PUSH R01 + "101000" & X"061", -- 0x2CF: XIN R01, (0x06) + "011001" & X"101", -- 0x2D0: AND R01, 0x10 + "110001" & X"2CF", -- 0x2D1: JZ 0x2CF + "101000" & X"020", -- 0x2D2: XIN R00, (0x02) + "111101" & X"001", -- 0x2D3: POP R01 + "111110" & X"000" -- 0x2D4: 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 vga_test; + diff --git a/projects/cpu/src/systest/vga_test_irom_ld.vhdl b/projects/cpu/src/systest/vga_test_irom_ld.vhdl new file mode 100644 index 0000000..9d936db --- /dev/null +++ b/projects/cpu/src/systest/vga_test_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from vga_test.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"02D", -- 0x000: JMP 0x02D + "111100" & X"000", -- 0x001: PUSH R00 + "111100" & X"001", -- 0x002: PUSH R01 + "101000" & X"061", -- 0x003: XIN R01, (0x06) + "011001" & X"101", -- 0x004: AND R01, 0x10 + "110001" & X"015", -- 0x005: JZ 0x015 + "101000" & X"020", -- 0x006: XIN R00, (0x02) + "001010" & X"5F1", -- 0x007: MOVC R01, (0x5F) + "001011" & X"010", -- 0x008: MOVC (R00), R01 + "010001" & X"011", -- 0x009: INC R01 + "001111" & X"5E1", -- 0x00A: CMP R01, 0x5E + "111010" & X"00D", -- 0x00B: JNE 0x00D + "000011" & X"1E1", -- 0x00C: MOV R01, 0x1E + "001101" & X"5F1", -- 0x00D: MOVC (0x5F), R01 + "001010" & X"5E0", -- 0x00E: MOVC R00, (0x5E) + "001110" & X"010", -- 0x00F: CMP R00, R01 + "111010" & X"003", -- 0x010: JNE 0x003 + "101000" & X"040", -- 0x011: XIN R00, (0x04) + "011011" & X"200", -- 0x012: OR R00, 0x20 + "100100" & X"040", -- 0x013: XOUT (0x04), R00 + "110000" & X"003", -- 0x014: JMP 0x003 + "111011" & X"019", -- 0x015: CALL 0x019 + "111101" & X"001", -- 0x016: POP R01 + "111101" & X"000", -- 0x017: POP R00 + "111111" & X"000", -- 0x018: RETI + "101000" & X"000", -- 0x019: XIN R00, (0x00) + "011001" & X"010", -- 0x01A: AND R00, 0x01 + "110001" & X"023", -- 0x01B: JZ 0x023 + "000011" & X"140", -- 0x01C: MOV R00, 0x14 + "100101" & X"000", -- 0x01D: XOUT (R00), 0x00 + "010001" & X"010", -- 0x01E: INC R00 + "100101" & X"000", -- 0x01F: XOUT (R00), 0x00 + "010001" & X"010", -- 0x020: INC R00 + "100101" & X"000", -- 0x021: XOUT (R00), 0x00 + "110000" & X"02C", -- 0x022: JMP 0x02C + "101000" & X"000", -- 0x023: XIN R00, (0x00) + "011001" & X"020", -- 0x024: AND R00, 0x02 + "110001" & X"02C", -- 0x025: JZ 0x02C + "000011" & X"140", -- 0x026: MOV R00, 0x14 + "100101" & X"000", -- 0x027: XOUT (R00), 0x00 + "010001" & X"010", -- 0x028: INC R00 + "100101" & X"000", -- 0x029: XOUT (R00), 0x00 + "010001" & X"010", -- 0x02A: INC R00 + "100101" & X"200", -- 0x02B: XOUT (R00), 0x20 + "111110" & X"000", -- 0x02C: RET + "111011" & X"1C6", -- 0x02D: CALL 0x1C6 + "111011" & X"1FB", -- 0x02E: CALL 0x1FB + "000011" & X"000", -- 0x02F: MOV R00, 0x00 + "100100" & X"010", -- 0x030: XOUT (0x01), R00 + "000011" & X"040", -- 0x031: MOV R00, 0x04 + "100100" & X"040", -- 0x032: XOUT (0x04), R00 + "101000" & X"040", -- 0x033: XIN R00, (0x04) + "011011" & X"020", -- 0x034: OR R00, 0x02 + "100100" & X"040", -- 0x035: XOUT (0x04), R00 + "000011" & X"030", -- 0x036: MOV R00, 0x03 + "100110" & X"030", -- 0x037: COUT (0x03), R00 + "000011" & X"010", -- 0x038: MOV R00, 0x01 + "111011" & X"218", -- 0x039: CALL 0x218 + "000011" & X"000", -- 0x03A: MOV R00, 0x00 + "000011" & X"C01", -- 0x03B: MOV R01, 0xC0 + "100100" & X"101", -- 0x03C: XOUT (0x10), R01 + "100100" & X"111", -- 0x03D: XOUT (0x11), R01 + "100100" & X"121", -- 0x03E: XOUT (0x12), R01 + "111011" & X"28C", -- 0x03F: CALL 0x28C + "111011" & X"271", -- 0x040: CALL 0x271 + "000011" & X"031", -- 0x041: MOV R01, 0x03 + "111011" & X"21D", -- 0x042: CALL 0x21D + "000011" & X"031", -- 0x043: MOV R01, 0x03 + "111011" & X"27D", -- 0x044: CALL 0x27D + "000011" & X"001", -- 0x045: MOV R01, 0x00 + "111011" & X"289", -- 0x046: CALL 0x289 + "101000" & X"040", -- 0x047: XIN R00, (0x04) + "011001" & X"CF0", -- 0x048: AND R00, 0xCF + "100100" & X"040", -- 0x049: XOUT (0x04), R00 + "000011" & X"000", -- 0x04A: MOV R00, 0x00 + "001101" & X"010", -- 0x04B: MOVC (0x01), R00 + "111011" & X"080", -- 0x04C: CALL 0x080 + "111011" & X"0D9", -- 0x04D: CALL 0x0D9 + "111011" & X"10D", -- 0x04E: CALL 0x10D + "001010" & X"010", -- 0x04F: MOVC R00, (0x01) + "010001" & X"010", -- 0x050: INC R00 + "001101" & X"010", -- 0x051: MOVC (0x01), R00 + "110000" & X"04D", -- 0x052: JMP 0x04D + "000011" & X"010", -- 0x053: MOV R00, 0x01 + "111011" & X"218", -- 0x054: CALL 0x218 + "000011" & X"0E1", -- 0x055: MOV R01, 0x0E + "111011" & X"21D", -- 0x056: CALL 0x21D + "000011" & X"0E1", -- 0x057: MOV R01, 0x0E + "111011" & X"286", -- 0x058: CALL 0x286 + "000011" & X"001", -- 0x059: MOV R01, 0x00 + "111011" & X"289", -- 0x05A: CALL 0x289 + "000011" & X"000", -- 0x05B: MOV R00, 0x00 + "000011" & X"001", -- 0x05C: MOV R01, 0x00 + "000011" & X"002", -- 0x05D: MOV R02, 0x00 + "111011" & X"16A", -- 0x05E: CALL 0x16A + "000011" & X"800", -- 0x05F: MOV R00, 0x80 + "000011" & X"08F", -- 0x060: MOV R15, 0x08 + "000111" & X"000", -- 0x061: MOVX (R00), 0x00 + "010001" & X"010", -- 0x062: INC R00 + "010101" & X"01F", -- 0x063: DEC R15 + "110010" & X"061", -- 0x064: JNZ 0x061 + "000011" & X"082", -- 0x065: MOV R02, 0x08 + "101000" & X"070", -- 0x066: XIN R00, (0x07) + "100100" & X"010", -- 0x067: XOUT (0x01), R00 + "011001" & X"040", -- 0x068: AND R00, 0x04 + "110010" & X"066", -- 0x069: JNZ 0x066 + "000011" & X"100", -- 0x06A: MOV R00, 0x10 + "100100" & X"070", -- 0x06B: XOUT (0x07), R00 + "010101" & X"022", -- 0x06C: SUB R02, 0x02 + "110010" & X"066", -- 0x06D: JNZ 0x066 + "111011" & X"147", -- 0x06E: CALL 0x147 + "000011" & X"060", -- 0x06F: MOV R00, 0x06 + "100100" & X"070", -- 0x070: XOUT (0x07), R00 + "101000" & X"080", -- 0x071: XIN R00, (0x08) + "001111" & X"F80", -- 0x072: CMP R00, 0xF8 + "111010" & X"07A", -- 0x073: JNE 0x07A + "101000" & X"090", -- 0x074: XIN R00, (0x09) + "001111" & X"FF0", -- 0x075: CMP R00, 0xFF + "111010" & X"07A", -- 0x076: JNE 0x07A + "101000" & X"0A0", -- 0x077: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x078: CMP R00, 0xFF + "111001" & X"07D", -- 0x079: JEQ 0x07D + "000011" & X"080", -- 0x07A: MOV R00, 0x08 + "111011" & X"16E", -- 0x07B: CALL 0x16E + "110000" & X"065", -- 0x07C: JMP 0x065 + "111011" & X"18E", -- 0x07D: CALL 0x18E + "111011" & X"292", -- 0x07E: CALL 0x292 + "111110" & X"000", -- 0x07F: RET + "000011" & X"010", -- 0x080: MOV R00, 0x01 + "111011" & X"218", -- 0x081: CALL 0x218 + "000011" & X"391", -- 0x082: MOV R01, 0x39 + "111011" & X"21D", -- 0x083: CALL 0x21D + "000011" & X"391", -- 0x084: MOV R01, 0x39 + "111011" & X"286", -- 0x085: CALL 0x286 + "000011" & X"001", -- 0x086: MOV R01, 0x00 + "111011" & X"289", -- 0x087: CALL 0x289 + "000011" & X"F80", -- 0x088: MOV R00, 0xF8 + "000011" & X"FF1", -- 0x089: MOV R01, 0xFF + "000011" & X"132", -- 0x08A: MOV R02, 0x13 + "111011" & X"16A", -- 0x08B: CALL 0x16A + "000011" & X"00F", -- 0x08C: MOV R15, 0x00 + "111011" & X"1D2", -- 0x08D: CALL 0x1D2 + "110011" & X"080", -- 0x08E: JC 0x080 + "010001" & X"01F", -- 0x08F: INC R15 + "001111" & X"0AF", -- 0x090: CMP R15, 0x0A + "111010" & X"08D", -- 0x091: JNE 0x08D + "111011" & X"1D2", -- 0x092: CALL 0x1D2 + "110011" & X"080", -- 0x093: JC 0x080 + "010001" & X"01F", -- 0x094: INC R15 + "001101" & X"020", -- 0x095: MOVC (0x02), R00 + "111011" & X"1D2", -- 0x096: CALL 0x1D2 + "110011" & X"080", -- 0x097: JC 0x080 + "010001" & X"01F", -- 0x098: INC R15 + "001101" & X"030", -- 0x099: MOVC (0x03), R00 + "111011" & X"1D2", -- 0x09A: CALL 0x1D2 + "110011" & X"080", -- 0x09B: JC 0x080 + "010001" & X"01F", -- 0x09C: INC R15 + "001101" & X"040", -- 0x09D: MOVC (0x04), R00 + "111011" & X"1D2", -- 0x09E: CALL 0x1D2 + "110011" & X"080", -- 0x09F: JC 0x080 + "010001" & X"01F", -- 0x0A0: INC R15 + "001101" & X"050", -- 0x0A1: MOVC (0x05), R00 + "001010" & X"021", -- 0x0A2: MOVC R01, (0x02) + "111011" & X"1D2", -- 0x0A3: CALL 0x1D2 + "110011" & X"080", -- 0x0A4: JC 0x080 + "010001" & X"01F", -- 0x0A5: INC R15 + "001110" & X"01F", -- 0x0A6: CMP R15, R01 + "111010" & X"0A3", -- 0x0A7: JNE 0x0A3 + "000011" & X"08F", -- 0x0A8: MOV R15, 0x08 + "000011" & X"1D1", -- 0x0A9: MOV R01, 0x1D + "000011" & X"032", -- 0x0AA: MOV R02, 0x03 + "010101" & X"012", -- 0x0AB: DEC R02 + "000010" & X"013", -- 0x0AC: MOV R03, R01 + "111011" & X"1D2", -- 0x0AD: CALL 0x1D2 + "110011" & X"0D7", -- 0x0AE: JC 0x0D7 + "010100" & X"023", -- 0x0AF: SUB R03, R02 + "001011" & X"030", -- 0x0B0: MOVC (R00), R03 + "001111" & X"002", -- 0x0B1: TST R02 + "110010" & X"0AB", -- 0x0B2: JNZ 0x0AB + "010101" & X"031", -- 0x0B3: SUB R01, 0x03 + "010101" & X"01F", -- 0x0B4: DEC R15 + "110010" & X"0AA", -- 0x0B5: JNZ 0x0AA + "000011" & X"082", -- 0x0B6: MOV R02, 0x08 + "000011" & X"061", -- 0x0B7: MOV R01, 0x06 + "000011" & X"803", -- 0x0B8: MOV R03, 0x80 + "001001" & X"010", -- 0x0B9: MOVC R00, (R01) + "000110" & X"030", -- 0x0BA: MOVX (R00), R03 + "010001" & X"011", -- 0x0BB: INC R01 + "010001" & X"013", -- 0x0BC: INC R03 + "001111" & X"863", -- 0x0BD: CMP R03, 0x86 + "111010" & X"0B9", -- 0x0BE: JNE 0x0B9 + "101000" & X"070", -- 0x0BF: XIN R00, (0x07) + "100100" & X"010", -- 0x0C0: XOUT (0x01), R00 + "011001" & X"040", -- 0x0C1: AND R00, 0x04 + "110010" & X"0BF", -- 0x0C2: JNZ 0x0BF + "000011" & X"100", -- 0x0C3: MOV R00, 0x10 + "100100" & X"070", -- 0x0C4: XOUT (0x07), R00 + "010101" & X"022", -- 0x0C5: SUB R02, 0x02 + "110010" & X"0B8", -- 0x0C6: JNZ 0x0B8 + "111011" & X"147", -- 0x0C7: CALL 0x147 + "000011" & X"060", -- 0x0C8: MOV R00, 0x06 + "100100" & X"070", -- 0x0C9: XOUT (0x07), R00 + "111011" & X"18E", -- 0x0CA: CALL 0x18E + "101000" & X"080", -- 0x0CB: XIN R00, (0x08) + "001111" & X"000", -- 0x0CC: TST R00 + "110010" & X"0D4", -- 0x0CD: JNZ 0x0D4 + "101000" & X"090", -- 0x0CE: XIN R00, (0x09) + "001111" & X"000", -- 0x0CF: TST R00 + "110010" & X"0D4", -- 0x0D0: JNZ 0x0D4 + "101000" & X"0A0", -- 0x0D1: XIN R00, (0x0A) + "001111" & X"000", -- 0x0D2: TST R00 + "110001" & X"0D7", -- 0x0D3: JZ 0x0D7 + "000011" & X"080", -- 0x0D4: MOV R00, 0x08 + "111011" & X"17E", -- 0x0D5: CALL 0x17E + "110000" & X"0A8", -- 0x0D6: JMP 0x0A8 + "111011" & X"292", -- 0x0D7: CALL 0x292 + "111110" & X"000", -- 0x0D8: RET + "000011" & X"010", -- 0x0D9: MOV R00, 0x01 + "111011" & X"218", -- 0x0DA: CALL 0x218 + "000011" & X"1D1", -- 0x0DB: MOV R01, 0x1D + "111011" & X"21D", -- 0x0DC: CALL 0x21D + "000011" & X"1D1", -- 0x0DD: MOV R01, 0x1D + "111011" & X"286", -- 0x0DE: CALL 0x286 + "000011" & X"001", -- 0x0DF: MOV R01, 0x00 + "111011" & X"289", -- 0x0E0: CALL 0x289 + "000011" & X"000", -- 0x0E1: MOV R00, 0x00 + "000011" & X"001", -- 0x0E2: MOV R01, 0x00 + "000011" & X"202", -- 0x0E3: MOV R02, 0x20 + "111011" & X"16A", -- 0x0E4: CALL 0x16A + "001010" & X"010", -- 0x0E5: MOVC R00, (0x01) + "001101" & X"000", -- 0x0E6: MOVC (0x00), R00 + "000011" & X"082", -- 0x0E7: MOV R02, 0x08 + "001010" & X"001", -- 0x0E8: MOVC R01, (0x00) + "000011" & X"800", -- 0x0E9: MOV R00, 0x80 + "000011" & X"08F", -- 0x0EA: MOV R15, 0x08 + "000110" & X"001", -- 0x0EB: MOVX (R01), R00 + "010001" & X"010", -- 0x0EC: INC R00 + "010001" & X"011", -- 0x0ED: INC R01 + "010101" & X"01F", -- 0x0EE: DEC R15 + "110010" & X"0EB", -- 0x0EF: JNZ 0x0EB + "101000" & X"070", -- 0x0F0: XIN R00, (0x07) + "100100" & X"010", -- 0x0F1: XOUT (0x01), R00 + "011001" & X"040", -- 0x0F2: AND R00, 0x04 + "110010" & X"0F0", -- 0x0F3: JNZ 0x0F0 + "000011" & X"100", -- 0x0F4: MOV R00, 0x10 + "100100" & X"070", -- 0x0F5: XOUT (0x07), R00 + "001010" & X"000", -- 0x0F6: MOVC R00, (0x00) + "010001" & X"010", -- 0x0F7: INC R00 + "001101" & X"000", -- 0x0F8: MOVC (0x00), R00 + "010101" & X"022", -- 0x0F9: SUB R02, 0x02 + "110010" & X"0E8", -- 0x0FA: JNZ 0x0E8 + "111011" & X"147", -- 0x0FB: CALL 0x147 + "000011" & X"060", -- 0x0FC: MOV R00, 0x06 + "100100" & X"070", -- 0x0FD: XOUT (0x07), R00 + "101000" & X"080", -- 0x0FE: XIN R00, (0x08) + "001111" & X"F80", -- 0x0FF: CMP R00, 0xF8 + "111010" & X"107", -- 0x100: JNE 0x107 + "101000" & X"090", -- 0x101: XIN R00, (0x09) + "001111" & X"FF0", -- 0x102: CMP R00, 0xFF + "111010" & X"107", -- 0x103: JNE 0x107 + "101000" & X"0A0", -- 0x104: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x105: CMP R00, 0xFF + "111001" & X"10A", -- 0x106: JEQ 0x10A + "000011" & X"080", -- 0x107: MOV R00, 0x08 + "111011" & X"16E", -- 0x108: CALL 0x16E + "110000" & X"0E7", -- 0x109: JMP 0x0E7 + "111011" & X"18E", -- 0x10A: CALL 0x18E + "111011" & X"292", -- 0x10B: CALL 0x292 + "111110" & X"000", -- 0x10C: RET + "000011" & X"010", -- 0x10D: MOV R00, 0x01 + "111011" & X"218", -- 0x10E: CALL 0x218 + "000011" & X"2B1", -- 0x10F: MOV R01, 0x2B + "111011" & X"21D", -- 0x110: CALL 0x21D + "000011" & X"2B1", -- 0x111: MOV R01, 0x2B + "111011" & X"286", -- 0x112: CALL 0x286 + "000011" & X"001", -- 0x113: MOV R01, 0x00 + "111011" & X"289", -- 0x114: CALL 0x289 + "000011" & X"000", -- 0x115: MOV R00, 0x00 + "000011" & X"001", -- 0x116: MOV R01, 0x00 + "000011" & X"202", -- 0x117: MOV R02, 0x20 + "111011" & X"16A", -- 0x118: CALL 0x16A + "001010" & X"010", -- 0x119: MOVC R00, (0x01) + "001101" & X"000", -- 0x11A: MOVC (0x00), R00 + "101000" & X"070", -- 0x11B: XIN R00, (0x07) + "100100" & X"010", -- 0x11C: XOUT (0x01), R00 + "011001" & X"200", -- 0x11D: AND R00, 0x20 + "110010" & X"122", -- 0x11E: JNZ 0x122 + "000011" & X"200", -- 0x11F: MOV R00, 0x20 + "100100" & X"070", -- 0x120: XOUT (0x07), R00 + "110000" & X"11B", -- 0x121: JMP 0x11B + "111011" & X"147", -- 0x122: CALL 0x147 + "000011" & X"050", -- 0x123: MOV R00, 0x05 + "100100" & X"070", -- 0x124: XOUT (0x07), R00 + "000011" & X"083", -- 0x125: MOV R03, 0x08 + "101000" & X"070", -- 0x126: XIN R00, (0x07) + "100100" & X"010", -- 0x127: XOUT (0x01), R00 + "011001" & X"200", -- 0x128: AND R00, 0x20 + "110010" & X"126", -- 0x129: JNZ 0x126 + "001010" & X"001", -- 0x12A: MOVC R01, (0x00) + "000011" & X"800", -- 0x12B: MOV R00, 0x80 + "000011" & X"08F", -- 0x12C: MOV R15, 0x08 + "000100" & X"002", -- 0x12D: MOVX R02, (R00) + "001110" & X"012", -- 0x12E: CMP R02, R01 + "111010" & X"15A", -- 0x12F: JNE 0x15A + "010001" & X"010", -- 0x130: INC R00 + "010001" & X"011", -- 0x131: INC R01 + "010101" & X"01F", -- 0x132: DEC R15 + "110010" & X"12D", -- 0x133: JNZ 0x12D + "000011" & X"200", -- 0x134: MOV R00, 0x20 + "100100" & X"070", -- 0x135: XOUT (0x07), R00 + "001010" & X"000", -- 0x136: MOVC R00, (0x00) + "010001" & X"010", -- 0x137: INC R00 + "001101" & X"000", -- 0x138: MOVC (0x00), R00 + "010101" & X"023", -- 0x139: SUB R03, 0x02 + "110010" & X"126", -- 0x13A: JNZ 0x126 + "101000" & X"080", -- 0x13B: XIN R00, (0x08) + "001111" & X"F80", -- 0x13C: CMP R00, 0xF8 + "111010" & X"144", -- 0x13D: JNE 0x144 + "101000" & X"090", -- 0x13E: XIN R00, (0x09) + "001111" & X"FF0", -- 0x13F: CMP R00, 0xFF + "111010" & X"144", -- 0x140: JNE 0x144 + "101000" & X"0A0", -- 0x141: XIN R00, (0x0A) + "001111" & X"FF0", -- 0x142: CMP R00, 0xFF + "111001" & X"14E", -- 0x143: JEQ 0x14E + "000011" & X"080", -- 0x144: MOV R00, 0x08 + "111011" & X"16E", -- 0x145: CALL 0x16E + "110000" & X"122", -- 0x146: JMP 0x122 + "111100" & X"000", -- 0x147: PUSH R00 + "101000" & X"070", -- 0x148: XIN R00, (0x07) + "100100" & X"010", -- 0x149: XOUT (0x01), R00 + "011001" & X"010", -- 0x14A: AND R00, 0x01 + "110010" & X"148", -- 0x14B: JNZ 0x148 + "111101" & X"000", -- 0x14C: POP R00 + "111110" & X"000", -- 0x14D: RET + "000011" & X"010", -- 0x14E: MOV R00, 0x01 + "111011" & X"218", -- 0x14F: CALL 0x218 + "000011" & X"481", -- 0x150: MOV R01, 0x48 + "111011" & X"21D", -- 0x151: CALL 0x21D + "000011" & X"C00", -- 0x152: MOV R00, 0xC0 + "111011" & X"218", -- 0x153: CALL 0x218 + "111011" & X"199", -- 0x154: CALL 0x199 + "000011" & X"481", -- 0x155: MOV R01, 0x48 + "111011" & X"286", -- 0x156: CALL 0x286 + "000011" & X"001", -- 0x157: MOV R01, 0x00 + "111011" & X"289", -- 0x158: CALL 0x289 + "110000" & X"168", -- 0x159: JMP 0x168 + "000011" & X"010", -- 0x15A: MOV R00, 0x01 + "111011" & X"218", -- 0x15B: CALL 0x218 + "000011" & X"521", -- 0x15C: MOV R01, 0x52 + "111011" & X"21D", -- 0x15D: CALL 0x21D + "111011" & X"199", -- 0x15E: CALL 0x199 + "111011" & X"1B1", -- 0x15F: CALL 0x1B1 + "000011" & X"521", -- 0x160: MOV R01, 0x52 + "111011" & X"286", -- 0x161: CALL 0x286 + "000011" & X"001", -- 0x162: MOV R01, 0x00 + "111011" & X"289", -- 0x163: CALL 0x289 + "101000" & X"040", -- 0x164: XIN R00, (0x04) + "011011" & X"100", -- 0x165: OR R00, 0x10 + "100100" & X"040", -- 0x166: XOUT (0x04), R00 + "110000" & X"168", -- 0x167: JMP 0x168 + "111011" & X"292", -- 0x168: CALL 0x292 + "111110" & X"000", -- 0x169: RET + "100100" & X"080", -- 0x16A: XOUT (0x08), R00 + "100100" & X"091", -- 0x16B: XOUT (0x09), R01 + "100100" & X"0A2", -- 0x16C: XOUT (0x0A), R02 + "111110" & X"000", -- 0x16D: RET + "111100" & X"001", -- 0x16E: PUSH R01 + "111100" & X"002", -- 0x16F: PUSH R02 + "111100" & X"003", -- 0x170: PUSH R03 + "101000" & X"081", -- 0x171: XIN R01, (0x08) + "101000" & X"092", -- 0x172: XIN R02, (0x09) + "101000" & X"0A3", -- 0x173: XIN R03, (0x0A) + "010000" & X"001", -- 0x174: ADD R01, R00 + "010011" & X"002", -- 0x175: ADDC R02, 0x00 + "010011" & X"003", -- 0x176: ADDC R03, 0x00 + "100100" & X"081", -- 0x177: XOUT (0x08), R01 + "100100" & X"092", -- 0x178: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x179: XOUT (0x0A), R03 + "111101" & X"003", -- 0x17A: POP R03 + "111101" & X"002", -- 0x17B: POP R02 + "111101" & X"001", -- 0x17C: POP R01 + "111110" & X"000", -- 0x17D: RET + "111100" & X"001", -- 0x17E: PUSH R01 + "111100" & X"002", -- 0x17F: PUSH R02 + "111100" & X"003", -- 0x180: PUSH R03 + "101000" & X"081", -- 0x181: XIN R01, (0x08) + "101000" & X"092", -- 0x182: XIN R02, (0x09) + "101000" & X"0A3", -- 0x183: XIN R03, (0x0A) + "010100" & X"001", -- 0x184: SUB R01, R00 + "010111" & X"002", -- 0x185: SUBC R02, 0x00 + "010111" & X"003", -- 0x186: SUBC R03, 0x00 + "100100" & X"081", -- 0x187: XOUT (0x08), R01 + "100100" & X"092", -- 0x188: XOUT (0x09), R02 + "100100" & X"0A3", -- 0x189: XOUT (0x0A), R03 + "111101" & X"003", -- 0x18A: POP R03 + "111101" & X"002", -- 0x18B: POP R02 + "111101" & X"001", -- 0x18C: POP R01 + "111110" & X"000", -- 0x18D: RET + "000011" & X"C00", -- 0x18E: MOV R00, 0xC0 + "111011" & X"218", -- 0x18F: CALL 0x218 + "111011" & X"199", -- 0x190: CALL 0x199 + "111110" & X"000", -- 0x191: RET + "111100" & X"001", -- 0x192: PUSH R01 + "111011" & X"1F4", -- 0x193: CALL 0x1F4 + "111011" & X"22F", -- 0x194: CALL 0x22F + "000010" & X"010", -- 0x195: MOV R00, R01 + "111011" & X"22F", -- 0x196: CALL 0x22F + "111101" & X"001", -- 0x197: POP R01 + "111110" & X"000", -- 0x198: RET + "111100" & X"000", -- 0x199: PUSH R00 + "101000" & X"0A0", -- 0x19A: XIN R00, (0x0A) + "111011" & X"192", -- 0x19B: CALL 0x192 + "101000" & X"090", -- 0x19C: XIN R00, (0x09) + "111011" & X"192", -- 0x19D: CALL 0x192 + "101000" & X"080", -- 0x19E: XIN R00, (0x08) + "111011" & X"192", -- 0x19F: CALL 0x192 + "111101" & X"000", -- 0x1A0: POP R00 + "111110" & X"000", -- 0x1A1: RET + "111100" & X"000", -- 0x1A2: PUSH R00 + "010001" & X"031", -- 0x1A3: ADD R01, 0x03 + "001001" & X"010", -- 0x1A4: MOVC R00, (R01) + "111011" & X"192", -- 0x1A5: CALL 0x192 + "010101" & X"011", -- 0x1A6: DEC R01 + "001001" & X"010", -- 0x1A7: MOVC R00, (R01) + "111011" & X"192", -- 0x1A8: CALL 0x192 + "010101" & X"011", -- 0x1A9: DEC R01 + "001001" & X"010", -- 0x1AA: MOVC R00, (R01) + "111011" & X"192", -- 0x1AB: CALL 0x192 + "010101" & X"011", -- 0x1AC: DEC R01 + "001001" & X"010", -- 0x1AD: MOVC R00, (R01) + "111011" & X"192", -- 0x1AE: CALL 0x192 + "111101" & X"000", -- 0x1AF: POP R00 + "111110" & X"000", -- 0x1B0: RET + "111100" & X"000", -- 0x1B1: PUSH R00 + "000011" & X"C00", -- 0x1B2: MOV R00, 0xC0 + "111011" & X"218", -- 0x1B3: CALL 0x218 + "000101" & X"870", -- 0x1B4: MOVX R00, (0x87) + "111011" & X"192", -- 0x1B5: CALL 0x192 + "000101" & X"860", -- 0x1B6: MOVX R00, (0x86) + "111011" & X"192", -- 0x1B7: CALL 0x192 + "000101" & X"850", -- 0x1B8: MOVX R00, (0x85) + "111011" & X"192", -- 0x1B9: CALL 0x192 + "000101" & X"840", -- 0x1BA: MOVX R00, (0x84) + "111011" & X"192", -- 0x1BB: CALL 0x192 + "000101" & X"830", -- 0x1BC: MOVX R00, (0x83) + "111011" & X"192", -- 0x1BD: CALL 0x192 + "000101" & X"820", -- 0x1BE: MOVX R00, (0x82) + "111011" & X"192", -- 0x1BF: CALL 0x192 + "000101" & X"810", -- 0x1C0: MOVX R00, (0x81) + "111011" & X"192", -- 0x1C1: CALL 0x192 + "000101" & X"800", -- 0x1C2: MOVX R00, (0x80) + "111011" & X"192", -- 0x1C3: CALL 0x192 + "111101" & X"000", -- 0x1C4: POP R00 + "111110" & X"000", -- 0x1C5: RET + "111100" & X"000", -- 0x1C6: PUSH R00 + "000011" & X"0D0", -- 0x1C7: MOV R00, 0x0D + "100100" & X"130", -- 0x1C8: XOUT (0x13), R00 + "000011" & X"1E0", -- 0x1C9: MOV R00, 0x1E + "001101" & X"5E0", -- 0x1CA: MOVC (0x5E), R00 + "001101" & X"5F0", -- 0x1CB: MOVC (0x5F), R00 + "000011" & X"E80", -- 0x1CC: MOV R00, 0xE8 + "001101" & X"600", -- 0x1CD: MOVC (0x60), R00 + "000011" & X"030", -- 0x1CE: MOV R00, 0x03 + "001101" & X"610", -- 0x1CF: MOVC (0x61), R00 + "111101" & X"000", -- 0x1D0: POP R00 + "111110" & X"000", -- 0x1D1: RET + "111100" & X"001", -- 0x1D2: PUSH R01 + "111100" & X"002", -- 0x1D3: PUSH R02 + "111100" & X"003", -- 0x1D4: PUSH R03 + "001010" & X"602", -- 0x1D5: MOVC R02, (0x60) + "001010" & X"613", -- 0x1D6: MOVC R03, (0x61) + "001010" & X"5E1", -- 0x1D7: MOVC R01, (0x5E) + "001010" & X"5F0", -- 0x1D8: MOVC R00, (0x5F) + "001110" & X"010", -- 0x1D9: CMP R00, R01 + "111001" & X"1E6", -- 0x1DA: JEQ 0x1E6 + "001001" & X"010", -- 0x1DB: MOVC R00, (R01) + "010001" & X"011", -- 0x1DC: INC R01 + "001111" & X"5E1", -- 0x1DD: CMP R01, 0x5E + "111010" & X"1E0", -- 0x1DE: JNE 0x1E0 + "000011" & X"1E1", -- 0x1DF: MOV R01, 0x1E + "001101" & X"5E1", -- 0x1E0: MOVC (0x5E), R01 + "010101" & X"000", -- 0x1E1: CLRC + "111101" & X"003", -- 0x1E2: POP R03 + "111101" & X"002", -- 0x1E3: POP R02 + "111101" & X"001", -- 0x1E4: POP R01 + "111110" & X"000", -- 0x1E5: RET + "111011" & X"2A7", -- 0x1E6: CALL 0x2A7 + "010101" & X"012", -- 0x1E7: DEC R02 + "010111" & X"003", -- 0x1E8: SUBC R03, 0x00 + "110010" & X"1D8", -- 0x1E9: JNZ 0x1D8 + "001111" & X"002", -- 0x1EA: TST R02 + "110010" & X"1D8", -- 0x1EB: JNZ 0x1D8 + "101011" & X"000", -- 0x1EC: SETC + "110000" & X"1E2", -- 0x1ED: JMP 0x1E2 + "011001" & X"0F0", -- 0x1EE: AND R00, 0x0F + "001111" & X"0A0", -- 0x1EF: CMP R00, 0x0A + "110101" & X"1F2", -- 0x1F0: JLT 0x1F2 + "010001" & X"070", -- 0x1F1: ADD R00, 0x07 + "010001" & X"300", -- 0x1F2: ADD R00, 0x30 + "111110" & X"000", -- 0x1F3: RET + "111100" & X"000", -- 0x1F4: PUSH R00 + "111011" & X"1EE", -- 0x1F5: CALL 0x1EE + "000010" & X"001", -- 0x1F6: MOV R01, R00 + "111101" & X"000", -- 0x1F7: POP R00 + "101010" & X"000", -- 0x1F8: SWAP R00 + "111011" & X"1EE", -- 0x1F9: CALL 0x1EE + "111110" & X"000", -- 0x1FA: RET + "000011" & X"002", -- 0x1FB: MOV R02, 0x00 + "000011" & X"030", -- 0x1FC: MOV R00, 0x03 + "111011" & X"247", -- 0x1FD: CALL 0x247 + "111011" & X"2A0", -- 0x1FE: CALL 0x2A0 + "000011" & X"002", -- 0x1FF: MOV R02, 0x00 + "000011" & X"030", -- 0x200: MOV R00, 0x03 + "111011" & X"247", -- 0x201: CALL 0x247 + "111011" & X"2A0", -- 0x202: CALL 0x2A0 + "000011" & X"002", -- 0x203: MOV R02, 0x00 + "000011" & X"020", -- 0x204: MOV R00, 0x02 + "111011" & X"247", -- 0x205: CALL 0x247 + "111011" & X"2A7", -- 0x206: CALL 0x2A7 + "000011" & X"280", -- 0x207: MOV R00, 0x28 + "111011" & X"218", -- 0x208: CALL 0x218 + "000011" & X"0C0", -- 0x209: MOV R00, 0x0C + "111011" & X"218", -- 0x20A: CALL 0x218 + "000011" & X"060", -- 0x20B: MOV R00, 0x06 + "111011" & X"218", -- 0x20C: CALL 0x218 + "000011" & X"010", -- 0x20D: MOV R00, 0x01 + "111011" & X"218", -- 0x20E: CALL 0x218 + "111110" & X"000", -- 0x20F: RET + "111100" & X"000", -- 0x210: PUSH R00 + "111011" & X"23B", -- 0x211: CALL 0x23B + "011001" & X"800", -- 0x212: AND R00, 0x80 + "110001" & X"216", -- 0x213: JZ 0x216 + "111011" & X"2BE", -- 0x214: CALL 0x2BE + "110000" & X"211", -- 0x215: JMP 0x211 + "111101" & X"000", -- 0x216: POP R00 + "111110" & X"000", -- 0x217: RET + "111100" & X"002", -- 0x218: PUSH R02 + "000011" & X"002", -- 0x219: MOV R02, 0x00 + "111011" & X"234", -- 0x21A: CALL 0x234 + "111101" & X"002", -- 0x21B: POP R02 + "111110" & X"000", -- 0x21C: RET + "111100" & X"000", -- 0x21D: PUSH R00 + "000100" & X"010", -- 0x21E: MOVX R00, (R01) + "010001" & X"011", -- 0x21F: INC R01 + "001111" & X"000", -- 0x220: TST R00 + "110001" & X"224", -- 0x221: JZ 0x224 + "111011" & X"22F", -- 0x222: CALL 0x22F + "110000" & X"21E", -- 0x223: JMP 0x21E + "111101" & X"000", -- 0x224: POP R00 + "111110" & X"000", -- 0x225: RET + "111100" & X"000", -- 0x226: PUSH R00 + "001001" & X"010", -- 0x227: MOVC R00, (R01) + "010001" & X"011", -- 0x228: INC R01 + "001111" & X"000", -- 0x229: TST R00 + "110001" & X"22D", -- 0x22A: JZ 0x22D + "111011" & X"22F", -- 0x22B: CALL 0x22F + "110000" & X"227", -- 0x22C: JMP 0x227 + "111101" & X"000", -- 0x22D: POP R00 + "111110" & X"000", -- 0x22E: RET + "111100" & X"002", -- 0x22F: PUSH R02 + "000011" & X"402", -- 0x230: MOV R02, 0x40 + "111011" & X"234", -- 0x231: CALL 0x234 + "111101" & X"002", -- 0x232: POP R02 + "111110" & X"000", -- 0x233: RET + "111011" & X"210", -- 0x234: CALL 0x210 + "111100" & X"000", -- 0x235: PUSH R00 + "101010" & X"000", -- 0x236: SWAP R00 + "111011" & X"247", -- 0x237: CALL 0x247 + "111101" & X"000", -- 0x238: POP R00 + "111011" & X"247", -- 0x239: CALL 0x247 + "111110" & X"000", -- 0x23A: RET + "111100" & X"002", -- 0x23B: PUSH R02 + "000011" & X"002", -- 0x23C: MOV R02, 0x00 + "111011" & X"240", -- 0x23D: CALL 0x240 + "111101" & X"002", -- 0x23E: POP R02 + "111110" & X"000", -- 0x23F: RET + "111011" & X"25A", -- 0x240: CALL 0x25A + "101010" & X"000", -- 0x241: SWAP R00 + "111100" & X"000", -- 0x242: PUSH R00 + "111011" & X"25A", -- 0x243: CALL 0x25A + "111101" & X"002", -- 0x244: POP R02 + "011010" & X"020", -- 0x245: OR R00, R02 + "111110" & X"000", -- 0x246: RET + "111100" & X"001", -- 0x247: PUSH R01 + "011001" & X"0F0", -- 0x248: AND R00, 0x0F + "000010" & X"001", -- 0x249: MOV R01, R00 + "011010" & X"021", -- 0x24A: OR R01, R02 + "100100" & X"031", -- 0x24B: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x24C: CALL 0x2BE + "000010" & X"001", -- 0x24D: MOV R01, R00 + "011010" & X"021", -- 0x24E: OR R01, R02 + "011011" & X"801", -- 0x24F: OR R01, 0x80 + "100100" & X"031", -- 0x250: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x251: CALL 0x2BE + "000010" & X"001", -- 0x252: MOV R01, R00 + "011010" & X"021", -- 0x253: OR R01, R02 + "100100" & X"031", -- 0x254: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x255: CALL 0x2BE + "011011" & X"201", -- 0x256: OR R01, 0x20 + "100100" & X"031", -- 0x257: XOUT (0x03), R01 + "111101" & X"001", -- 0x258: POP R01 + "111110" & X"000", -- 0x259: RET + "111100" & X"001", -- 0x25A: PUSH R01 + "000011" & X"201", -- 0x25B: MOV R01, 0x20 + "011010" & X"021", -- 0x25C: OR R01, R02 + "100100" & X"031", -- 0x25D: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x25E: CALL 0x2BE + "000011" & X"201", -- 0x25F: MOV R01, 0x20 + "011010" & X"021", -- 0x260: OR R01, R02 + "011011" & X"801", -- 0x261: OR R01, 0x80 + "100100" & X"031", -- 0x262: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x263: CALL 0x2BE + "101000" & X"030", -- 0x264: XIN R00, (0x03) + "011001" & X"0F0", -- 0x265: AND R00, 0x0F + "000011" & X"201", -- 0x266: MOV R01, 0x20 + "011010" & X"021", -- 0x267: OR R01, R02 + "100100" & X"031", -- 0x268: XOUT (0x03), R01 + "111011" & X"2BE", -- 0x269: CALL 0x2BE + "111101" & X"001", -- 0x26A: POP R01 + "111110" & X"000", -- 0x26B: RET + "111100" & X"000", -- 0x26C: PUSH R00 + "000011" & X"020", -- 0x26D: MOV R00, 0x02 + "100100" & X"0E0", -- 0x26E: XOUT (0x0E), R00 + "111101" & X"000", -- 0x26F: POP R00 + "111110" & X"000", -- 0x270: RET + "111100" & X"000", -- 0x271: PUSH R00 + "000011" & X"010", -- 0x272: MOV R00, 0x01 + "100100" & X"0E0", -- 0x273: XOUT (0x0E), R00 + "111101" & X"000", -- 0x274: POP R00 + "111110" & X"000", -- 0x275: RET + "111011" & X"28C", -- 0x276: CALL 0x28C + "100100" & X"0C1", -- 0x277: XOUT (0x0C), R01 + "100100" & X"0B0", -- 0x278: XOUT (0x0B), R00 + "111110" & X"000", -- 0x279: RET + "111011" & X"28C", -- 0x27A: CALL 0x28C + "100100" & X"0D0", -- 0x27B: XOUT (0x0D), R00 + "111110" & X"000", -- 0x27C: RET + "111100" & X"000", -- 0x27D: PUSH R00 + "000100" & X"010", -- 0x27E: MOVX R00, (R01) + "010001" & X"011", -- 0x27F: INC R01 + "001111" & X"000", -- 0x280: TST R00 + "110001" & X"284", -- 0x281: JZ 0x284 + "111011" & X"27A", -- 0x282: CALL 0x27A + "110000" & X"27E", -- 0x283: JMP 0x27E + "111101" & X"000", -- 0x284: POP R00 + "111110" & X"000", -- 0x285: RET + "111011" & X"26C", -- 0x286: CALL 0x26C + "111011" & X"27D", -- 0x287: CALL 0x27D + "111110" & X"000", -- 0x288: RET + "111011" & X"27D", -- 0x289: CALL 0x27D + "111011" & X"26C", -- 0x28A: CALL 0x26C + "111110" & X"000", -- 0x28B: RET + "111100" & X"000", -- 0x28C: PUSH R00 + "101000" & X"0E0", -- 0x28D: XIN R00, (0x0E) + "011001" & X"020", -- 0x28E: AND R00, 0x02 + "110001" & X"28D", -- 0x28F: JZ 0x28D + "111101" & X"000", -- 0x290: POP R00 + "111110" & X"000", -- 0x291: RET + "111100" & X"00F", -- 0x292: PUSH R15 + "000011" & X"0AF", -- 0x293: MOV R15, 0x0A + "111011" & X"299", -- 0x294: CALL 0x299 + "010101" & X"01F", -- 0x295: DEC R15 + "110010" & X"294", -- 0x296: JNZ 0x294 + "111101" & X"00F", -- 0x297: POP R15 + "111110" & X"000", -- 0x298: RET + "111100" & X"00F", -- 0x299: PUSH R15 + "000011" & X"0AF", -- 0x29A: MOV R15, 0x0A + "111011" & X"2A0", -- 0x29B: CALL 0x2A0 + "010101" & X"01F", -- 0x29C: DEC R15 + "110010" & X"29B", -- 0x29D: JNZ 0x29B + "111101" & X"00F", -- 0x29E: POP R15 + "111110" & X"000", -- 0x29F: RET + "111100" & X"00F", -- 0x2A0: PUSH R15 + "000011" & X"0AF", -- 0x2A1: MOV R15, 0x0A + "111011" & X"2A7", -- 0x2A2: CALL 0x2A7 + "010101" & X"01F", -- 0x2A3: DEC R15 + "110010" & X"2A2", -- 0x2A4: JNZ 0x2A2 + "111101" & X"00F", -- 0x2A5: POP R15 + "111110" & X"000", -- 0x2A6: RET + "111100" & X"00F", -- 0x2A7: PUSH R15 + "000011" & X"0AF", -- 0x2A8: MOV R15, 0x0A + "111011" & X"2AE", -- 0x2A9: CALL 0x2AE + "010101" & X"01F", -- 0x2AA: DEC R15 + "110010" & X"2A9", -- 0x2AB: JNZ 0x2A9 + "111101" & X"00F", -- 0x2AC: POP R15 + "111110" & X"000", -- 0x2AD: RET + "111100" & X"00F", -- 0x2AE: PUSH R15 + "000011" & X"0AF", -- 0x2AF: MOV R15, 0x0A + "111011" & X"2B5", -- 0x2B0: CALL 0x2B5 + "010101" & X"01F", -- 0x2B1: DEC R15 + "110010" & X"2B0", -- 0x2B2: JNZ 0x2B0 + "111101" & X"00F", -- 0x2B3: POP R15 + "111110" & X"000", -- 0x2B4: RET + "111100" & X"00F", -- 0x2B5: PUSH R15 + "000011" & X"63F", -- 0x2B6: MOV R15, 0x63 + "000000" & X"000", -- 0x2B7: NOP + "000000" & X"000", -- 0x2B8: NOP + "000000" & X"000", -- 0x2B9: NOP + "010101" & X"01F", -- 0x2BA: DEC R15 + "110010" & X"2B7", -- 0x2BB: JNZ 0x2B7 + "111101" & X"00F", -- 0x2BC: POP R15 + "111110" & X"000", -- 0x2BD: RET + "111100" & X"00F", -- 0x2BE: PUSH R15 + "000011" & X"09F", -- 0x2BF: MOV R15, 0x09 + "000000" & X"000", -- 0x2C0: NOP + "000000" & X"000", -- 0x2C1: NOP + "000000" & X"000", -- 0x2C2: NOP + "010101" & X"01F", -- 0x2C3: DEC R15 + "110010" & X"2C0", -- 0x2C4: JNZ 0x2C0 + "111101" & X"00F", -- 0x2C5: POP R15 + "111110" & X"000", -- 0x2C6: RET + "111100" & X"001", -- 0x2C7: PUSH R01 + "101000" & X"061", -- 0x2C8: XIN R01, (0x06) + "011001" & X"021", -- 0x2C9: AND R01, 0x02 + "110010" & X"2C8", -- 0x2CA: JNZ 0x2C8 + "100100" & X"020", -- 0x2CB: XOUT (0x02), R00 + "111101" & X"001", -- 0x2CC: POP R01 + "111110" & X"000", -- 0x2CD: RET + "111100" & X"001", -- 0x2CE: PUSH R01 + "101000" & X"061", -- 0x2CF: XIN R01, (0x06) + "011001" & X"101", -- 0x2D0: AND R01, 0x10 + "110001" & X"2CF", -- 0x2D1: JZ 0x2CF + "101000" & X"020", -- 0x2D2: XIN R00, (0x02) + "111101" & X"001", -- 0x2D3: POP R01 + "111110" & X"000", -- 0x2D4: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/src/systest/vga_test_xrom.vhdl b/projects/cpu/src/systest/vga_test_xrom.vhdl new file mode 100644 index 0000000..0024ec0 --- /dev/null +++ b/projects/cpu/src/systest/vga_test_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- 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 program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE vga_test OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from vga_test.jsm + constant xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"52", -- 0x39 + X"65", -- 0x3A + X"61", -- 0x3B + X"64", -- 0x3C + X"69", -- 0x3D + X"6E", -- 0x3E + X"67", -- 0x3F + X"20", -- 0x40 + X"42", -- 0x41 + X"69", -- 0x42 + X"74", -- 0x43 + X"6D", -- 0x44 + X"61", -- 0x45 + X"70", -- 0x46 + X"00", -- 0x47 + X"56", -- 0x48 + X"65", -- 0x49 + X"72", -- 0x4A + X"69", -- 0x4B + X"66", -- 0x4C + X"79", -- 0x4D + X"20", -- 0x4E + X"4F", -- 0x4F + X"4B", -- 0x50 + X"00", -- 0x51 + X"46", -- 0x52 + X"61", -- 0x53 + X"69", -- 0x54 + X"6C", -- 0x55 + X"65", -- 0x56 + X"64", -- 0x57 + X"20", -- 0x58 + X"61", -- 0x59 + X"74", -- 0x5A + X"20", -- 0x5B + X"00", -- 0x5C + X"2E", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end vga_test; + diff --git a/projects/cpu/src/systest/vga_test_xrom_ld.vhdl b/projects/cpu/src/systest/vga_test_xrom_ld.vhdl new file mode 100644 index 0000000..3f12592 --- /dev/null +++ b/projects/cpu/src/systest/vga_test_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program 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 General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- 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 UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from vga_test.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"0D", -- 0x00 + X"0A", -- 0x01 + X"00", -- 0x02 + X"53", -- 0x03 + X"44", -- 0x04 + X"52", -- 0x05 + X"41", -- 0x06 + X"4D", -- 0x07 + X"20", -- 0x08 + X"54", -- 0x09 + X"65", -- 0x0A + X"73", -- 0x0B + X"74", -- 0x0C + X"00", -- 0x0D + X"43", -- 0x0E + X"6C", -- 0x0F + X"65", -- 0x10 + X"61", -- 0x11 + X"72", -- 0x12 + X"69", -- 0x13 + X"6E", -- 0x14 + X"67", -- 0x15 + X"20", -- 0x16 + X"53", -- 0x17 + X"44", -- 0x18 + X"52", -- 0x19 + X"41", -- 0x1A + X"4D", -- 0x1B + X"00", -- 0x1C + X"57", -- 0x1D + X"72", -- 0x1E + X"69", -- 0x1F + X"74", -- 0x20 + X"69", -- 0x21 + X"6E", -- 0x22 + X"67", -- 0x23 + X"20", -- 0x24 + X"53", -- 0x25 + X"44", -- 0x26 + X"52", -- 0x27 + X"41", -- 0x28 + X"4D", -- 0x29 + X"00", -- 0x2A + X"52", -- 0x2B + X"65", -- 0x2C + X"61", -- 0x2D + X"64", -- 0x2E + X"69", -- 0x2F + X"6E", -- 0x30 + X"67", -- 0x31 + X"20", -- 0x32 + X"53", -- 0x33 + X"44", -- 0x34 + X"52", -- 0x35 + X"41", -- 0x36 + X"4D", -- 0x37 + X"00", -- 0x38 + X"52", -- 0x39 + X"65", -- 0x3A + X"61", -- 0x3B + X"64", -- 0x3C + X"69", -- 0x3D + X"6E", -- 0x3E + X"67", -- 0x3F + X"20", -- 0x40 + X"42", -- 0x41 + X"69", -- 0x42 + X"74", -- 0x43 + X"6D", -- 0x44 + X"61", -- 0x45 + X"70", -- 0x46 + X"00", -- 0x47 + X"56", -- 0x48 + X"65", -- 0x49 + X"72", -- 0x4A + X"69", -- 0x4B + X"66", -- 0x4C + X"79", -- 0x4D + X"20", -- 0x4E + X"4F", -- 0x4F + X"4B", -- 0x50 + X"00", -- 0x51 + X"46", -- 0x52 + X"61", -- 0x53 + X"69", -- 0x54 + X"6C", -- 0x55 + X"65", -- 0x56 + X"64", -- 0x57 + X"20", -- 0x58 + X"61", -- 0x59 + X"74", -- 0x5A + X"20", -- 0x5B + X"00", -- 0x5C + X"2E", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/projects/cpu/syn/ise91/systest/project/systest.lso b/projects/cpu/syn/ise91/systest/project/systest.lso new file mode 100644 index 0000000..22de730 --- /dev/null +++ b/projects/cpu/syn/ise91/systest/project/systest.lso @@ -0,0 +1 @@ +work diff --git a/projects/cpu/syn/ise91/systest/project/systest.prj b/projects/cpu/syn/ise91/systest/project/systest.prj new file mode 100644 index 0000000..2968956 --- /dev/null +++ b/projects/cpu/syn/ise91/systest/project/systest.prj @@ -0,0 +1,34 @@ +vhdl work "../../../../lib/FIFO/src/fifo_ctrl_pkg.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/vga_types.vhd" +vhdl work "../../src/systest/sdram_config.vhd" +vhdl work "../../../../lib/misc/utils_pkg.vhd" +vhdl work "../../../../lib/FIFO/src/gray_counter.vhd" +vhdl work "../../../../lib/CPUs/JCpu/src/core/cpu_pkg.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/vga_sync.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/dpram.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/sdram_types.vhd" +vhdl work "../../../../lib/FIFO/src/sync_fifo_ctrl.vhd" +vhdl work "../../../../lib/FIFO/src/async_fifo_ctrl.vhd" +vhdl work "../../src/systest/vga_test_irom_ld.vhdl" +vhdl work "../../../../lib/uart/kcuart_tx.vhd" +vhdl work "../../../../lib/uart/kcuart_rx.vhd" +vhdl work "../../../../lib/uart/bbfifo_16x8.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/vga_timing.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/linefifo.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x16.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/clkgen_virtex4.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/sdram_cmd.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/reset_virtex4.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/fifo_sync.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/ddr_phy_virtex4.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/clockgen_virtex4.vhd" +vhdl work "../../src/systest/vga_test_xrom_ld.vhdl" +vhdl work "../../src/systest/cpu_embedded.vhd" +vhdl work "../../../../lib/uart/uart_tx.vhd" +vhdl work "../../../../lib/uart/uart_rx.vhd" +vhdl work "../../../../lib/misc/lcd_port.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/vga_backend.vhd" +vhdl work "../../../../lib/VGA_ctrl/src/char_gen.vhd" +vhdl work "../../../../lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_top.vhd" +vhdl work "../../src/systest/systest.vhd" diff --git a/projects/cpu/syn/ise91/systest/project/systest.ucf b/projects/cpu/syn/ise91/systest/project/systest.ucf new file mode 100644 index 0000000..0492f71 --- /dev/null +++ b/projects/cpu/syn/ise91/systest/project/systest.ucf @@ -0,0 +1,337 @@ +# +# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +# SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR +# XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION +# AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION +# OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS +# IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +# AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +# FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +# WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +# IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +# REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +# INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +# (c) Copyright 2005 Xilinx, Inc. +# All rights reserved. +# + +CONFIG STEPPING = "ES"; + +# Bus clock nets +NET "clk" TNM_NET = "clk"; +TIMESPEC "TS_clk" = PERIOD "clk" 9.9 ns HIGH 50 %; + +NET "inst_vga_backend/inst_clkgen/vga_clk0" TNM_NET = "vga_clk"; +TIMESPEC TS_unrelate = FROM clk TO vga_clk TIG; + +NET "sys_clk_in" LOC = "AE14"; +#NET sys_clk_in IOSTANDARD = LVCMOS33; +NET "sys_rst_n_in" LOC = "D6"; +NET sys_rst_n_in PULLUP; +NET "sys_rst_n_in" TIG; +NET "rst" TIG; + +# Locate DCM/BUFG - Tools can probably figure them out automatically +# but just LOC them down to be safe +#INST inst_ddr_sdr/ctrl.inst_DCM_BASE_0 LOC = DCM_ADV_X0Y2; +#INST inst_ddr_sdr/ctrl.inst_DCM_BASE_1 LOC = DCM_ADV_X0Y1; + +//////////////////////////////////////////////////////////////////////////// +// Misc Board Signals +//////////////////////////////////////////////////////////////////////////// + +NET sys_error<0> LOC = V6; +NET sys_error<1> LOC = L24; +#NET sys_error<*> IOSTANDARD = LVCMOS33; +NET sys_error<*> DRIVE = 2; +NET sys_error<*> TIG; + +//////////////////////////////////////////////////////////////////////////// +// RS-232 +//////////////////////////////////////////////////////////////////////////// +NET sys_rx LOC = W2; +#NET sys_rx IOSTANDARD = LVCMOS33; +NET sys_rx TIG; +NET "sys_tx" LOC = "W1"; +#NET sys_tx IOSTANDARD = LVCMOS33; +NET "sys_tx" TIG; + +//////////////////////////////////////////////////////////////////////////// +// Buttons, LEDs, and DIP Switches +//////////////////////////////////////////////////////////////////////////// +# GPLED 0-3 +NET "sys_led<0>" LOC = "G5"; #GPLED0 +NET "sys_led<1>" LOC = "G6"; #GPLED1 +NET "sys_led<2>" LOC = "A11"; #GPLED2 +NET "sys_led<3>" LOC = "A12"; #GPLED3 +# North-East-South-West-Center LEDs +NET "sys_led<4>" LOC = "F9"; # W LED +NET "sys_led<5>" LOC = "E2"; # N LED +NET "sys_led<6>" LOC = "E10"; # E LED +NET "sys_led<7>" LOC = "A5"; # S LED +NET "sys_led<8>" LOC = "C6"; # C LED +NET "sys_led<*>" TIG; +NET "sys_led<*>" SLEW = SLOW; +NET "sys_led<*>" DRIVE = 2; +#NET "sys_led<*>" IOSTANDARD = LVCMOS33; +# North-East-South-West-Center Buttons +NET "sys_btn<0>" LOC = "E9"; # W Button +NET "sys_btn<1>" LOC = "E7"; # N Button +NET "sys_btn<2>" LOC = "F10"; # E Button +NET "sys_btn<3>" LOC = "A6"; # S Button +NET "sys_btn<4>" LOC = "B6"; # C Button +NET "sys_btn<*>" TIG; +NET "sys_btn<*>" PULLDOWN; +#NET "sys_btn<*>" IOSTANDARD = LVCMOS33; +# Dip Switches 1-8 +NET "sys_dip<7>" LOC = "U24"; # DIP SW 8 +NET "sys_dip<6>" LOC = "U25"; # DIP SW 7 +NET "sys_dip<5>" LOC = "V23"; # DIP SW 6 +NET "sys_dip<4>" LOC = "U23"; # DIP SW 5 +NET "sys_dip<3>" LOC = "U26"; # DIP SW 4 +NET "sys_dip<2>" LOC = "T26"; # DIP SW 3 +NET "sys_dip<1>" LOC = "R19"; # DIP SW 2 +NET "sys_dip<0>" LOC = "R20"; # DIP SW 1 +NET "sys_dip<*>" PULLDOWN; +#NET "sys_dip<*>" IOSTANDARD = LVCMOS33; +NET "sys_dip<*>" TIG; +//////////////////////////////////////////////////////////////////////////// +// LCD +//////////////////////////////////////////////////////////////////////////// +NET sys_lcd_e LOC = AE13; # LCD_E +#NET sys_lcd_e IOSTANDARD = LVCMOS33; +NET sys_lcd_e SLEW = SLOW; +NET sys_lcd_e DRIVE = 2; +NET sys_lcd_e TIG; +NET sys_lcd_rs LOC = AC17; # LCD_RS +#NET sys_lcd_rs IOSTANDARD = LVCMOS33; +NET sys_lcd_rs SLEW = SLOW; +NET sys_lcd_rs DRIVE = 2; +NET sys_lcd_rs TIG; +NET sys_lcd_rw LOC = AB17; # LCD_RW +#NET sys_lcd_rw IOSTANDARD = LVCMOS33; +NET sys_lcd_rw SLEW = SLOW; +NET sys_lcd_rw DRIVE = 2; +NET sys_lcd_rw TIG; +NET sys_lcd_d<3> LOC = AF12; # LCD_DB7 +NET sys_lcd_d<2> LOC = AE12; # LCD_DB6 +NET sys_lcd_d<1> LOC = AC10; # LCD_DB5 +NET sys_lcd_d<0> LOC = AB10; # LCD_DB4 +#NET sys_lcd_d<*> IOSTANDARD = LVCMOS33; +NET sys_lcd_d<*> SLEW = SLOW; +NET sys_lcd_d<*> DRIVE = 2; +NET sys_lcd_d<*> PULLDOWN; +NET sys_lcd_d<*> TIG; + +#------------------------------------------------------------------------------ +# IO Pad Location Constraints / Properties for DDR Controllers +#------------------------------------------------------------------------------ + +NET sys_sdr_a_q<0> LOC = C26; # DDR_A0 +NET sys_sdr_a_q<1> LOC = E17; # DDR_A1 +NET sys_sdr_a_q<2> LOC = D18; # DDR_A2 +NET sys_sdr_a_q<3> LOC = C19; # DDR_A3 +NET sys_sdr_a_q<4> LOC = F17; # DDR_A4 +NET sys_sdr_a_q<5> LOC = B18; # DDR_A5 +NET sys_sdr_a_q<6> LOC = B20; # DDR_A6 +NET sys_sdr_a_q<7> LOC = C20; # DDR_A7 +NET sys_sdr_a_q<8> LOC = D20; # DDR_A8 +NET sys_sdr_a_q<9> LOC = C21; # DDR_A9 +NET sys_sdr_a_q<10> LOC = A18; # DDR_A10 +NET sys_sdr_a_q<11> LOC = B21; # DDR_A11 +NET sys_sdr_a_q<12> LOC = A24; # DDR_A12 +NET sys_sdr_ba_q<0> LOC = B12; # DDR_BA0 +NET sys_sdr_ba_q<1> LOC = A16; # DDR_BA1 +NET sys_sdr_cas_qn LOC = F23; # DDR_CAS_N +NET sys_sdr_cke_q LOC = G22; # DDR_CKE +NET sys_sdr_cs_qn LOC = G21; # DDR_CS_N +NET sys_sdr_ras_qn LOC = F24; # DDR_RAS_N +NET sys_sdr_we_qn LOC = A23; # DDR_WE_N + +NET sys_sdr_clk_p LOC = A10; # DDR_CK1_P +NET sys_sdr_clk_fb LOC = B13; # DDR_CK1_P (FEEDBACK) +NET sys_sdr_clk_n LOC = B10; # DDR_CK1_N + +NET sys_sdr_dm_q<0> LOC = G19; # DDR_DM0 +NET sys_sdr_dm_q<1> LOC = G24; # DDR_DM1 +NET sys_sdr_dm_q<2> LOC = G20; # DDR_DM2 +NET sys_sdr_dm_q<3> LOC = C22; # DDR_DM3 + +NET sys_sdr_dqs_q<0> LOC = D25; # DDR_DQS0 +NET sys_sdr_dqs_q<1> LOC = G18; # DDR_DQS1 +NET sys_sdr_dqs_q<2> LOC = G17; # DDR_DQS2 +NET sys_sdr_dqs_q<3> LOC = D26; # DDR_DQS3 + +NET sys_sdr_data<0> LOC = H20; # DDR_D0 +NET sys_sdr_data<1> LOC = E23; # DDR_D1 +NET sys_sdr_data<2> LOC = H26; # DDR_D2 +NET sys_sdr_data<3> LOC = H22; # DDR_D3 +NET sys_sdr_data<4> LOC = E25; # DDR_D4 +NET sys_sdr_data<5> LOC = E26; # DDR_D5 +NET sys_sdr_data<6> LOC = F26; # DDR_D6 +NET sys_sdr_data<7> LOC = E24; # DDR_D7 +NET sys_sdr_data<8> LOC = E20; # DDR_D8 +NET sys_sdr_data<9> LOC = A22; # DDR_D9 +NET sys_sdr_data<10> LOC = C23; # DDR_D10 +NET sys_sdr_data<11> LOC = C24; # DDR_D11 +NET sys_sdr_data<12> LOC = A20; # DDR_D12 +NET sys_sdr_data<13> LOC = A21; # DDR_D13 +NET sys_sdr_data<14> LOC = D24; # DDR_D14 +NET sys_sdr_data<15> LOC = E18; # DDR_D15 +NET sys_sdr_data<16> LOC = F18; # DDR_D16 +NET sys_sdr_data<17> LOC = A19; # DDR_D17 +NET sys_sdr_data<18> LOC = F19; # DDR_D18 +NET sys_sdr_data<19> LOC = B23; # DDR_D19 +NET sys_sdr_data<20> LOC = E21; # DDR_D20 +NET sys_sdr_data<21> LOC = D22; # DDR_D21 +NET sys_sdr_data<22> LOC = D23; # DDR_D22 +NET sys_sdr_data<23> LOC = B24; # DDR_D23 +NET sys_sdr_data<24> LOC = E22; # DDR_D24 +NET sys_sdr_data<25> LOC = F20; # DDR_D25 +NET sys_sdr_data<26> LOC = H23; # DDR_D26 +NET sys_sdr_data<27> LOC = G25; # DDR_D27 +NET sys_sdr_data<28> LOC = G26; # DDR_D28 +NET sys_sdr_data<29> LOC = H25; # DDR_D29 +NET sys_sdr_data<30> LOC = H24; # DDR_D30 +NET sys_sdr_data<31> LOC = H21; # DDR_D31 + +NET sys_sdr_a_q<*> IOSTANDARD = SSTL2_I; +NET sys_sdr_a_q<*> FAST; + +NET sys_sdr_ba_q<*> IOSTANDARD = SSTL2_I; +NET sys_sdr_ba_q<*> FAST; + +NET sys_sdr_cas_qn IOSTANDARD = SSTL2_I; +NET sys_sdr_cas_qn FAST; + +NET sys_sdr_cke_q IOSTANDARD = SSTL2_I; +NET sys_sdr_cke_q FAST; + +NET sys_sdr_clk_p IOSTANDARD = SSTL2_I; +NET sys_sdr_clk_p FAST; +NET sys_sdr_clk_fb IOSTANDARD = LVCMOS25; +NET sys_sdr_clk_fb IOBDELAY = NONE; +NET sys_sdr_clk_n IOSTANDARD = SSTL2_I; +NET sys_sdr_clk_n FAST; + +NET sys_sdr_cas_qn IOSTANDARD = SSTL2_I; +NET sys_sdr_cas_qn FAST; + +NET sys_sdr_cs_qn IOSTANDARD = SSTL2_I; +NET sys_sdr_cs_qn FAST; + +NET sys_sdr_ras_qn IOSTANDARD = SSTL2_I; +NET sys_sdr_ras_qn FAST; + +NET sys_sdr_we_qn IOSTANDARD = SSTL2_I; +NET sys_sdr_we_qn FAST; + +NET sys_sdr_dqs_q<*> IOSTANDARD = SSTL2_II; +NET sys_sdr_dqs_q<*> IOBDELAY = NONE; +NET sys_sdr_dqs_q<*> FAST; + +NET sys_sdr_dm_q<*> IOSTANDARD = SSTL2_II; +NET sys_sdr_dm_q<*> IOBDELAY = NONE; +NET sys_sdr_dm_q<*> FAST; + +NET sys_sdr_data<*> IOSTANDARD = SSTL2_II; +NET sys_sdr_data<*> IOBDELAY = NONE; +NET sys_sdr_data<*> FAST; + +#NET "sys_sdr_data<*>" OFFSET=OUT 2.5 ns BEFORE "sys_sdr_clk_n"; + + +# Timing Constraint for DDR Feedback Clock +NET sys_sdr_clk_fb FEEDBACK = 1 ns NET sys_sdr_clk_p; + +#------------------------------------------------------------------------------ +# IO Pad Location Constraints / Properties for TFT VGA LCD Controller +#------------------------------------------------------------------------------ + +NET sys_vga_blue<0> LOC = M21; # VGA_B0 +NET sys_vga_blue<1> LOC = M26; # VGA_B1 +NET sys_vga_blue<2> LOC = L26; # VGA_B2 +NET sys_vga_blue<3> LOC = C5; # VGA_B3 +NET sys_vga_blue<4> LOC = C7; # VGA_B4 +NET sys_vga_blue<5> LOC = B7; # VGA_B5 +NET sys_vga_blue<6> LOC = G8; # VGA_B6 +NET sys_vga_blue<7> LOC = F8; # VGA_B7 +#NET sys_vga_blue<*> IOSTANDARD = LVCMOS33; +NET sys_vga_blue<*> SLEW = FAST; +NET sys_vga_blue<*> DRIVE = 8; + +NET sys_vga_clk LOC = AF8; +NET sys_vga_clk IOSTANDARD = LVDCI_25; +NET sys_vga_clk SLEW = FAST; +NET sys_vga_clk DRIVE = 8; + +NET sys_vga_green<0> LOC = M22; # VGA_G0 +NET sys_vga_green<1> LOC = M23; # VGA_G1 +NET sys_vga_green<2> LOC = M20; # VGA_G2 +NET sys_vga_green<3> LOC = E4; # VGA_G3 +NET sys_vga_green<4> LOC = D3; # VGA_G4 +NET sys_vga_green<5> LOC = H7; # VGA_G5 +NET sys_vga_green<6> LOC = H8; # VGA_G6 +NET sys_vga_green<7> LOC = C1; # VGA_G7 +#NET sys_vga_green<*> IOSTANDARD = LVCMOS33; +NET sys_vga_green<*> SLEW = FAST; +NET sys_vga_green<*> DRIVE = 8; + +NET sys_vga_hsync LOC = C10; +NET sys_vga_hsync SLEW = FAST; +NET sys_vga_hsync DRIVE = 8; +#NET sys_vga_hsync IOSTANDARD = LVCMOS33; + +NET sys_vga_red<0> LOC = N23; #VGA_R0 +NET sys_vga_red<1> LOC = N24; #VGA_R1 +NET sys_vga_red<2> LOC = N25; #VGA_R2 +NET sys_vga_red<3> LOC = C2; #VGA_R3 +NET sys_vga_red<4> LOC = G7; #VGA_R4 +NET sys_vga_red<5> LOC = F7; #VGA_R5 +NET sys_vga_red<6> LOC = E5; #VGA_R6 +NET sys_vga_red<7> LOC = E6; #VGA_R7 +#NET sys_vga_red<*> IOSTANDARD = LVCMOS33; +NET sys_vga_red<*> SLEW = FAST; +NET sys_vga_red<*> DRIVE = 8; + +NET sys_vga_vsync LOC = A8; +NET sys_vga_vsync SLEW = FAST; +NET sys_vga_vsync DRIVE = 8; +#NET sys_vga_vsync IOSTANDARD = LVCMOS33; + +NET sys_vga_blank_n LOC = M24; +NET sys_vga_blank_n SLEW = FAST; +NET sys_vga_blank_n DRIVE = 8; +#NET sys_vga_blank_n IOSTANDARD = LVCMOS33; + +NET sys_vga_sync_n LOC = L23; +NET sys_vga_sync_n SLEW = FAST; +NET sys_vga_sync_n DRIVE = 8; +#NET sys_vga_sync_n IOSTANDARD = LVCMOS33; + +#------------------------------------------------------------------------------ +# IO Pad Location Constraints / Properties for PS/2 Ports +#------------------------------------------------------------------------------ + +#Keyboard +NET sys_keyb_clk LOC = D2; +NET sys_keyb_clk SLEW = SLOW; +NET sys_keyb_clk DRIVE = 2; +NET sys_keyb_clk TIG; +NET sys_keyb_data LOC = G9; +NET sys_keyb_data SLEW = SLOW; +NET sys_keyb_data DRIVE = 2; +NET sys_keyb_data TIG; + +#Mouse +NET sys_mouse_clk LOC = B14; +NET sys_mouse_clk SLEW = SLOW; +NET sys_mouse_clk DRIVE = 2; +NET sys_mouse_clk TIG; +NET sys_mouse_data LOC = C14; +NET sys_mouse_data SLEW = SLOW; +NET sys_mouse_data DRIVE = 2; +NET sys_mouse_data TIG; + diff --git a/projects/cpu/syn/ise91/systest/project/systest.ut b/projects/cpu/syn/ise91/systest/project/systest.ut new file mode 100644 index 0000000..e6a6dd5 --- /dev/null +++ b/projects/cpu/syn/ise91/systest/project/systest.ut @@ -0,0 +1,33 @@ +-w +-g DebugBitstream:No +-g Binary:no +-g CRC:Enable +-g ConfigRate:4 +-g CclkPin:PullUp +-g M0Pin:PullUp +-g M1Pin:PullUp +-g M2Pin:PullUp +-g ProgPin:PullUp +-g DonePin:PullUp +-g InitPin:Pullup +-g CsPin:Pullup +-g DinPin:Pullup +-g BusyPin:Pullup +-g RdWrPin:Pullup +-g TckPin:PullUp +-g TdiPin:PullUp +-g TdoPin:PullUp +-g TmsPin:PullUp +-g UnusedPin:PullDown +-g UserID:0xBEEFBABE +-g DCIUpdateMode:AsRequired +-g StartUpClk:JtagClk +-g DONE_cycle:4 +-g GTS_cycle:5 +-g GWE_cycle:6 +-g LCK_cycle:NoWait +-g Match_cycle:Auto +-g Security:None +-g DonePipe:No +-g DriveDone:No +-g Encrypt:No diff --git a/projects/cpu/syn/ise91/systest/project/systest.xst b/projects/cpu/syn/ise91/systest/project/systest.xst new file mode 100644 index 0000000..fafe648 --- /dev/null +++ b/projects/cpu/syn/ise91/systest/project/systest.xst @@ -0,0 +1,59 @@ +set -tmpdir "./xst/projnav.tmp" +set -xsthdpdir "./xst" +run +-ifn systest.prj +-ifmt mixed +-ofn systest +-ofmt NGC +-p xc4vsx35-10-ff668 +-top systest +-opt_mode Speed +-opt_level 1 +-power NO +-iuc NO +-lso systest.lso +-keep_hierarchy NO +-rtlview Yes +-glob_opt AllClockNets +-read_cores YES +-write_timing_constraints NO +-cross_clock_analysis NO +-hierarchy_separator / +-bus_delimiter <> +-case maintain +-slice_utilization_ratio 100 +-bram_utilization_ratio 100 +-dsp_utilization_ratio 100 +-verilog2001 YES +-fsm_extract YES -fsm_encoding Auto +-safe_implementation No +-fsm_style lut +-ram_extract Yes +-ram_style Auto +-rom_extract Yes +-mux_style Auto +-decoder_extract YES +-priority_extract YES +-shreg_extract YES +-shift_extract YES +-xor_collapse YES +-rom_style Auto +-auto_bram_packing NO +-mux_extract YES +-resource_sharing YES +-async_to_sync NO +-use_dsp48 auto +-iobuf YES +-max_fanout 500 +-bufg 32 +-bufr 24 +-register_duplication YES +-register_balancing No +-slice_packing YES +-optimize_primitives NO +-use_clock_enable Auto +-use_sync_set Auto +-use_sync_reset Auto +-iob auto +-equivalent_register_removal NO +-slice_utilization_ratio_maxmargin 5