From 2c32ab39e70e6b4c74004731525572be24cccfef Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Mon, 21 Sep 2020 20:52:58 +0200 Subject: [PATCH] Fixed build issues and added upload to vimlocal --- .vimlocal | 1 + Makefile | 2 +- hdmi.xise | 8 +- ipcore_dir/gen_hdmi_clk.tcl | 37 + ipcore_dir/gen_microblaze_mcs.tcl | 37 + ipcore_dir/hdmi_clk.sym | 2 +- ipcore_dir/hdmi_clk.xco | 2 +- ipcore_dir/hdmi_clk.xise | 4 +- ipcore_dir/microblaze_mcs.sym | 2 +- ipcore_dir/microblaze_mcs.v | 2 +- ipcore_dir/microblaze_mcs.xco | 2 +- ipcore_dir/microblaze_mcs.xise | 4 +- ipcore_dir/microblaze_mcs_bd.bmm | 16 +- ipcore_dir/microblaze_mcs_sdk.xml | 2 +- .../tmp/customization_gui.0.405988320432.out | 505 +++++++++++ .../tmp/customization_gui.0.901080844412.out | 505 +++++++++++ mb/.metadata/.lock | 0 .../com.xilinx.sdk.hw/dialog_settings.xml | 4 + .../dialog_settings.xml | 4 + .../Graphics.1600550500723.pdom | Bin 0 -> 24576 bytes .../Graphics_bsp.1600550481305.pdom | Bin 0 -> 729088 bytes .../org.eclipse.cdt.make.core/Graphics.sc | 793 ++++++++++++++++++ .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.make.core/specs.cpp | 1 + .../dialog_settings.xml | 3 + .../org.eclipse.cdt.ui/cHelpSettings.xml | 6 + .../org.eclipse.cdt.ui/dialog_settings.xml | 17 + .../15/20a916bbf2f8001a1591e56b2da69a2d | 208 +++++ .../16/307548faf5f8001a1591e56b2da69a2d | 212 +++++ .../1e/506725ceebf9001a1594f754340f23a0 | 252 ++++++ .../29/c0b2566ebdfa001a16bcb0432cb239eb | 268 ++++++ .../2d/006e0b7af3f9001a1594f754340f23a0 | 264 ++++++ .../2e/f0ada384f3f9001a1594f754340f23a0 | 266 ++++++ .../2f/e07ac67ce9f9001a1594f754340f23a0 | 247 ++++++ .../32/904df402eaf9001a1594f754340f23a0 | 252 ++++++ .../40/b0e30a03f6f8001a1591e56b2da69a2d | 213 +++++ .../42/9026d6c2f2f8001a1591e56b2da69a2d | 208 +++++ .../47/d023e48af3f8001a1591e56b2da69a2d | 208 +++++ .../48/40f584f1f5f8001a1591e56b2da69a2d | 210 +++++ .../4d/407df999cbf6001a1baecb89e4fed027 | 202 +++++ .../5/d0d0d38bcbf6001a1baecb89e4fed027 | 199 +++++ .../55/a06a718beef9001a1594f754340f23a0 | 256 ++++++ .../59/d08dccc1faf9001a1594f754340f23a0 | 268 ++++++ .../59/f0ade47cfcf8001a1591e56b2da69a2d | 230 +++++ .../62/109d196ee9f9001a1594f754340f23a0 | 232 +++++ .../64/500397c5faf9001a1594f754340f23a0 | 268 ++++++ .../6b/40bd6ed0faf9001a1594f754340f23a0 | 268 ++++++ .../7b/304a29e3f1f9001a1594f754340f23a0 | 260 ++++++ .../8/4025aea1cbf6001a1baecb89e4fed027 | 204 +++++ .../81/403f3f97cbf6001a1baecb89e4fed027 | 202 +++++ .../83/305bbca1eef9001a1594f754340f23a0 | 258 ++++++ .../8a/1060b65e03f9001a1591e56b2da69a2d | 231 +++++ .../8b/b03c3ee1e9f9001a1594f754340f23a0 | 248 ++++++ .../9f/30387ff6f5f8001a1591e56b2da69a2d | 211 +++++ .../a/30342cfdf5f8001a1591e56b2da69a2d | 213 +++++ .../a8/309ae6a801f9001a1591e56b2da69a2d | 230 +++++ .../af/b027dbd12dfc001a1d38c6f066e572ed | 265 ++++++ .../b0/40ccb57bcaf6001a1baecb89e4fed027 | 198 +++++ .../b7/d09455cfe9f9001a1594f754340f23a0 | 246 ++++++ .../b9/203e4dede9f9001a1594f754340f23a0 | 252 ++++++ .../ba/a087dfd72dfc001a1d38c6f066e572ed | 267 ++++++ .../bb/e0bf3d9bf6f8001a1591e56b2da69a2d | 212 +++++ .../be/40cd6993cbf6001a1baecb89e4fed027 | 202 +++++ .../bf/a0337580cbf6001a1baecb89e4fed027 | 198 +++++ .../cd/305a6603f3f9001a1594f754340f23a0 | 264 ++++++ .../ce/4018d09f01f9001a1591e56b2da69a2d | 231 +++++ .../d/60635348f2f8001a1591e56b2da69a2d | 205 +++++ .../d3/20aec944f7f8001a1591e56b2da69a2d | 228 +++++ .../d8/803d3aebf5f8001a1591e56b2da69a2d | 209 +++++ .../de/902d4436ebf9001a1594f754340f23a0 | 252 ++++++ .../e9/20afbe7eeef9001a1594f754340f23a0 | 256 ++++++ .../f0/e0c805f3f5f8001a1591e56b2da69a2d | 212 +++++ .../f2/80e7b08af3f9001a1594f754340f23a0 | 268 ++++++ .../f3/d0c67fe9f6f8001a1591e56b2da69a2d | 220 +++++ .../f7/3077b75576f7001a116fc72c51299c73 | 205 +++++ .../f9/e0bf90a2f6f8001a1591e56b2da69a2d | 220 +++++ .../fa/70d0696fbdfa001a16bcb0432cb239eb | 269 ++++++ .../Graphics/.indexes/e4/history.index | Bin 0 -> 2441 bytes .../Graphics/.indexes/e4/properties.index | Bin 0 -> 129 bytes .../Graphics/.indexes/properties.index | Bin 0 -> 535 bytes .../.projects/Graphics/.markers | Bin 0 -> 231 bytes .../Graphics_bsp/.indexes/properties.index | Bin 0 -> 435 bytes .../hardware/.indexes/properties.index | Bin 0 -> 194 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 104 bytes .../.root/.indexes/properties.version | 1 + .../org.eclipse.core.resources/.root/17.tree | Bin 0 -> 20450 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 505 bytes .../.settings/org.eclipse.cdt.core.prefs | 3 + .../org.eclipse.cdt.core.prj-Graphics.prefs | 3 + ...rg.eclipse.cdt.core.prj-Graphics_bsp.prefs | 3 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../.settings/org.eclipse.cdt.make.core.prefs | 2 + .../org.eclipse.cdt.managedbuilder.core.prefs | 5 + .../.settings/org.eclipse.cdt.ui.prefs | 4 + .../org.eclipse.cdt.ui.prj-Graphics.prefs | 3 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.debug.core.prefs | 5 + .../.settings/org.eclipse.debug.ui.prefs | 3 + .../.settings/org.eclipse.search.prefs | 2 + .../.settings/org.eclipse.ui.browser.prefs | 2 + .../.settings/org.eclipse.ui.editors.prefs | 2 + .../.settings/org.eclipse.ui.ide.prefs | 6 + .../.settings/org.eclipse.ui.prefs | 3 + .../.settings/org.eclipse.ui.workbench.prefs | 7 + .../.workspace/2020/9/37/refactorings.history | 4 + .../.workspace/2020/9/37/refactorings.index | 1 + .../.workspace/2020/9/38/refactorings.history | 3 + .../.workspace/2020/9/38/refactorings.index | 4 + .../Graphics/2020/9/38/refactorings.history | 4 + .../Graphics/2020/9/38/refactorings.index | 1 + .../dialog_settings.xml | 7 + .../org.eclipse.search/dialog_settings.xml | 6 + .../dialog_settings.xml | 5 + .../org.eclipse.ui.ide/dialog_settings.xml | 5 + .../dialog_settings.xml | 30 + .../dialog_settings.xml | 20 + .../org.eclipse.ui.workbench/workbench.xml | 276 ++++++ .../org.eclipse.ui.workbench/workingsets.xml | 4 + mb/.metadata/version.ini | 1 + mb/hardware/system.xml | 2 +- src/main.v | 22 +- syn/main.ut | 2 +- 123 files changed, 14049 insertions(+), 34 deletions(-) create mode 100644 ipcore_dir/gen_hdmi_clk.tcl create mode 100644 ipcore_dir/gen_microblaze_mcs.tcl create mode 100644 ipcore_dir/tmp/customization_gui.0.405988320432.out create mode 100644 ipcore_dir/tmp/customization_gui.0.901080844412.out create mode 100644 mb/.metadata/.lock create mode 100644 mb/.metadata/.plugins/com.xilinx.sdk.hw/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.codan.ui/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics.1600550500723.pdom create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics_bsp.1600550481305.pdom create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.make.core/Graphics.sc create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/15/20a916bbf2f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/16/307548faf5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/1e/506725ceebf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/29/c0b2566ebdfa001a16bcb0432cb239eb create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/2d/006e0b7af3f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/2e/f0ada384f3f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e07ac67ce9f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/32/904df402eaf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/40/b0e30a03f6f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/42/9026d6c2f2f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/47/d023e48af3f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/48/40f584f1f5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/4d/407df999cbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0d0d38bcbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/55/a06a718beef9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/d08dccc1faf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/f0ade47cfcf8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/62/109d196ee9f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/64/500397c5faf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/6b/40bd6ed0faf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/7b/304a29e3f1f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/8/4025aea1cbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/81/403f3f97cbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/83/305bbca1eef9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/8a/1060b65e03f9001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b03c3ee1e9f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/9f/30387ff6f5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/a/30342cfdf5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/a8/309ae6a801f9001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/af/b027dbd12dfc001a1d38c6f066e572ed create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/b0/40ccb57bcaf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/b7/d09455cfe9f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/b9/203e4dede9f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a087dfd72dfc001a1d38c6f066e572ed create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/bb/e0bf3d9bf6f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/be/40cd6993cbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/bf/a0337580cbf6001a1baecb89e4fed027 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/cd/305a6603f3f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/ce/4018d09f01f9001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/d/60635348f2f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/d3/20aec944f7f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/d8/803d3aebf5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/de/902d4436ebf9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20afbe7eeef9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0c805f3f5f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/f2/80e7b08af3f9001a1594f754340f23a0 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/f3/d0c67fe9f6f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/f7/3077b75576f7001a116fc72c51299c73 create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/f9/e0bf90a2f6f8001a1591e56b2da69a2d create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.history/fa/70d0696fbdfa001a16bcb0432cb239eb create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/e4/history.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/e4/properties.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/properties.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.markers create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics_bsp/.indexes/properties.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.projects/hardware/.indexes/properties.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.root/17.tree create mode 100644 mb/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics_bsp.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.make.core.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-Graphics.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.browser.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.history create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.index create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.history create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.index create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.history create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.index create mode 100644 mb/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.search/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml create mode 100644 mb/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 mb/.metadata/version.ini diff --git a/.vimlocal b/.vimlocal index 6b16e68..2abe03f 100644 --- a/.vimlocal +++ b/.vimlocal @@ -1 +1,2 @@ map :Make +map :Dispatch upload --mojo syn/main.bin diff --git a/Makefile b/Makefile index 8d3dfae..7ba584a 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ syn/main.bin: syn/main.ncd mb/Graphics/Release/Graphics.elf syn/main.ncd: syn/main.prj syn/main.xst src/*.v ipcore_dir/*.v syn/xst/projnav.tmp/ @cd syn && xst -intstyle ise -ifn "main.xst" -ofn "main.syr" - @cd syn && ngdbuild -intstyle ise -dd _ngo -sd ../ipcore_dir -nt timestamp -i -p xc6slx9-tqg144-2 main.ngc main.ngd -bm "../ipcore_dir/microblaze_mcs.bmm" + @cd syn && ngdbuild -intstyle ise -dd _ngo -sd ../ipcore_dir -nt timestamp -uc /home/tim/Projects/z80/hdmi/src/constraints.ucf -p xc6slx9-tqg144-2 main.ngc main.ngd -bm "../ipcore_dir/microblaze_mcs.bmm" @cd syn && map -intstyle ise -p xc6slx9-tqg144-2 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off -pr off -lc off -power off -o main_map.ncd main.ngd main.pcf @cd syn && par -w -intstyle ise -ol high -mt off main_map.ncd main.ncd main.pcf @cd syn && trce -intstyle ise -v 3 -s 2 -n 3 -fastpaths -xml main.twx main.ncd -o main.twr main.pcf diff --git a/hdmi.xise b/hdmi.xise index 7b19b9c..f24bc90 100644 --- a/hdmi.xise +++ b/hdmi.xise @@ -91,7 +91,7 @@ - + @@ -297,7 +297,7 @@ - + @@ -406,7 +406,7 @@ - + @@ -534,7 +534,7 @@ - + diff --git a/ipcore_dir/gen_hdmi_clk.tcl b/ipcore_dir/gen_hdmi_clk.tcl new file mode 100644 index 0000000..fdfdfa6 --- /dev/null +++ b/ipcore_dir/gen_hdmi_clk.tcl @@ -0,0 +1,37 @@ +## +## Core Generator Run Script, generator for Project Navigator regen command +## + +proc findRtfPath { relativePath } { + set xilenv "" + if { [info exists ::env(XILINX) ] } { + if { [info exists ::env(MYXILINX)] } { + set xilenv [join [list $::env(MYXILINX) $::env(XILINX)] $::xilinx::path_sep ] + } else { + set xilenv $::env(XILINX) + } + } + foreach path [ split $xilenv $::xilinx::path_sep ] { + set fullPath [ file join $path $relativePath ] + if { [ file exists $fullPath ] } { + return $fullPath + } + } + return "" +} + +source [ findRtfPath "data/projnav/scripts/dpm_cgUtils.tcl" ] + +set result [ run_cg_regen "hdmi_clk" xc6slx9-2tqg144 Verilog CURRENT ] + +if { $result == 0 } { + puts "Core Generator regen command completed successfully." +} elseif { $result == 1 } { + puts "Core Generator regen command failed." +} elseif { $result == 3 || $result == 4 } { + # convert 'version check' result to real return range, bypassing any messages. + set result [ expr $result - 3 ] +} else { + puts "Core Generator regen cancelled." +} +exit $result diff --git a/ipcore_dir/gen_microblaze_mcs.tcl b/ipcore_dir/gen_microblaze_mcs.tcl new file mode 100644 index 0000000..8251920 --- /dev/null +++ b/ipcore_dir/gen_microblaze_mcs.tcl @@ -0,0 +1,37 @@ +## +## Core Generator Run Script, generator for Project Navigator regen command +## + +proc findRtfPath { relativePath } { + set xilenv "" + if { [info exists ::env(XILINX) ] } { + if { [info exists ::env(MYXILINX)] } { + set xilenv [join [list $::env(MYXILINX) $::env(XILINX)] $::xilinx::path_sep ] + } else { + set xilenv $::env(XILINX) + } + } + foreach path [ split $xilenv $::xilinx::path_sep ] { + set fullPath [ file join $path $relativePath ] + if { [ file exists $fullPath ] } { + return $fullPath + } + } + return "" +} + +source [ findRtfPath "data/projnav/scripts/dpm_cgUtils.tcl" ] + +set result [ run_cg_regen "microblaze_mcs" xc6slx9-2tqg144 Verilog CURRENT ] + +if { $result == 0 } { + puts "Core Generator regen command completed successfully." +} elseif { $result == 1 } { + puts "Core Generator regen command failed." +} elseif { $result == 3 || $result == 4 } { + # convert 'version check' result to real return range, bypassing any messages. + set result [ expr $result - 3 ] +} else { + puts "Core Generator regen cancelled." +} +exit $result diff --git a/ipcore_dir/hdmi_clk.sym b/ipcore_dir/hdmi_clk.sym index 5ea4f73..1f842a4 100644 --- a/ipcore_dir/hdmi_clk.sym +++ b/ipcore_dir/hdmi_clk.sym @@ -1,7 +1,7 @@ BLOCK - 2020-9-17T15:18:55 + 2020-9-21T18:2:44 diff --git a/ipcore_dir/hdmi_clk.xco b/ipcore_dir/hdmi_clk.xco index b3e4514..7b44c9f 100644 --- a/ipcore_dir/hdmi_clk.xco +++ b/ipcore_dir/hdmi_clk.xco @@ -1,7 +1,7 @@ ############################################################## # # Xilinx Core Generator version 14.7 -# Date: Thu Sep 17 15:18:44 2020 +# Date: Mon Sep 21 18:02:33 2020 # ############################################################## # diff --git a/ipcore_dir/hdmi_clk.xise b/ipcore_dir/hdmi_clk.xise index df07c32..31edc03 100644 --- a/ipcore_dir/hdmi_clk.xise +++ b/ipcore_dir/hdmi_clk.xise @@ -50,8 +50,8 @@ - - + + diff --git a/ipcore_dir/microblaze_mcs.sym b/ipcore_dir/microblaze_mcs.sym index 12b464b..43fcaf4 100644 --- a/ipcore_dir/microblaze_mcs.sym +++ b/ipcore_dir/microblaze_mcs.sym @@ -1,7 +1,7 @@ BLOCK - 2020-9-20T19:27:36 + 2020-9-21T18:2:10 diff --git a/ipcore_dir/microblaze_mcs.v b/ipcore_dir/microblaze_mcs.v index a42419b..516e68f 100644 --- a/ipcore_dir/microblaze_mcs.v +++ b/ipcore_dir/microblaze_mcs.v @@ -7,7 +7,7 @@ // \ \ \/ Version: P.20131013 // \ \ Application: netgen // / / Filename: microblaze_mcs.v -// /___/ /\ Timestamp: Sun Sep 20 21:27:36 2020 +// /___/ /\ Timestamp: Mon Sep 21 20:02:10 2020 // \ \ / \ // \___\/\___\ // diff --git a/ipcore_dir/microblaze_mcs.xco b/ipcore_dir/microblaze_mcs.xco index 4f2403a..1db2feb 100644 --- a/ipcore_dir/microblaze_mcs.xco +++ b/ipcore_dir/microblaze_mcs.xco @@ -1,7 +1,7 @@ ############################################################## # # Xilinx Core Generator version 14.7 -# Date: Sun Sep 20 19:25:41 2020 +# Date: Mon Sep 21 18:00:15 2020 # ############################################################## # diff --git a/ipcore_dir/microblaze_mcs.xise b/ipcore_dir/microblaze_mcs.xise index 49cb27b..33634bf 100644 --- a/ipcore_dir/microblaze_mcs.xise +++ b/ipcore_dir/microblaze_mcs.xise @@ -66,8 +66,8 @@ - - + + diff --git a/ipcore_dir/microblaze_mcs_bd.bmm b/ipcore_dir/microblaze_mcs_bd.bmm index 81a0e82..99257ad 100644 --- a/ipcore_dir/microblaze_mcs_bd.bmm +++ b/ipcore_dir/microblaze_mcs_bd.bmm @@ -20,14 +20,14 @@ ADDRESS_MAP microblaze_mcs MICROBLAZE-LE 100 ADDRESS_SPACE lmb_bram RAMB16 [0x00000000:0x00003FFF] BUS_BLOCK - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 RAMB16 [31:28] [0:4095] INPUT = microblaze_mcs.lmb_bram_0.mem PLACED = X1Y18; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1 RAMB16 [27:24] [0:4095] INPUT = microblaze_mcs.lmb_bram_1.mem PLACED = X1Y24; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1 RAMB16 [23:20] [0:4095] INPUT = microblaze_mcs.lmb_bram_2.mem PLACED = X1Y8; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[3].RAMB16_S4_1 RAMB16 [19:16] [0:4095] INPUT = microblaze_mcs.lmb_bram_3.mem PLACED = X1Y28; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[4].RAMB16_S4_1 RAMB16 [15:12] [0:4095] INPUT = microblaze_mcs.lmb_bram_4.mem PLACED = X1Y20; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[5].RAMB16_S4_1 RAMB16 [11:8] [0:4095] INPUT = microblaze_mcs.lmb_bram_5.mem PLACED = X1Y26; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[6].RAMB16_S4_1 RAMB16 [7:4] [0:4095] INPUT = microblaze_mcs.lmb_bram_6.mem PLACED = X1Y16; - mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1 RAMB16 [3:0] [0:4095] INPUT = microblaze_mcs.lmb_bram_7.mem PLACED = X1Y22; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 RAMB16 [31:28] [0:4095] INPUT = microblaze_mcs.lmb_bram_0.mem PLACED = X0Y26; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1 RAMB16 [27:24] [0:4095] INPUT = microblaze_mcs.lmb_bram_1.mem PLACED = X0Y20; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1 RAMB16 [23:20] [0:4095] INPUT = microblaze_mcs.lmb_bram_2.mem PLACED = X0Y24; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[3].RAMB16_S4_1 RAMB16 [19:16] [0:4095] INPUT = microblaze_mcs.lmb_bram_3.mem PLACED = X0Y18; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[4].RAMB16_S4_1 RAMB16 [15:12] [0:4095] INPUT = microblaze_mcs.lmb_bram_4.mem PLACED = X0Y30; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[5].RAMB16_S4_1 RAMB16 [11:8] [0:4095] INPUT = microblaze_mcs.lmb_bram_5.mem PLACED = X0Y22; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[6].RAMB16_S4_1 RAMB16 [7:4] [0:4095] INPUT = microblaze_mcs.lmb_bram_6.mem PLACED = X0Y28; + mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1 RAMB16 [3:0] [0:4095] INPUT = microblaze_mcs.lmb_bram_7.mem PLACED = X0Y16; END_BUS_BLOCK; END_ADDRESS_SPACE; diff --git a/ipcore_dir/microblaze_mcs_sdk.xml b/ipcore_dir/microblaze_mcs_sdk.xml index 848fe48..44471b3 100644 --- a/ipcore_dir/microblaze_mcs_sdk.xml +++ b/ipcore_dir/microblaze_mcs_sdk.xml @@ -1,6 +1,6 @@ - + diff --git a/ipcore_dir/tmp/customization_gui.0.405988320432.out b/ipcore_dir/tmp/customization_gui.0.405988320432.out new file mode 100644 index 0000000..a8315da --- /dev/null +++ b/ipcore_dir/tmp/customization_gui.0.405988320432.out @@ -0,0 +1,505 @@ +SET_FLAG DEBUG FALSE +SET_FLAG MODE BATCH +SET_FLAG STANDALONE_MODE FALSE +SET_PREFERENCE devicefamily spartan6 +SET_PREFERENCE device xc6slx9 +SET_PREFERENCE speedgrade -2 +SET_PREFERENCE package tqg144 +SET_PREFERENCE verilogsim true +SET_PREFERENCE vhdlsim false +SET_PREFERENCE simulationfiles Behavioral +SET_PREFERENCE busformat BusFormatAngleBracketNotRipped +SET_PREFERENCE outputdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/ +SET_PREFERENCE workingdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/ +SET_PREFERENCE subworkingdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/_cg/ +SET_PREFERENCE transientdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/_cg/_dbg/ +SET_PREFERENCE designentry Verilog +SET_PREFERENCE flowvendor Other +SET_PREFERENCE addpads false +SET_PREFERENCE projectname coregen +SET_PREFERENCE formalverification false +SET_PREFERENCE asysymbol false +SET_PREFERENCE implementationfiletype Ngc +SET_PREFERENCE foundationsym false +SET_PREFERENCE createndf false +SET_PREFERENCE removerpms false +SET_PARAMETER Component_Name hdmi_clk +SET_PARAMETER Use_Freq_Synth true +SET_PARAMETER Use_Phase_Alignment false +SET_PARAMETER Use_Min_Power false +SET_PARAMETER Use_Dyn_Phase_Shift false +SET_PARAMETER Use_Dyn_Reconfig false +SET_PARAMETER Jitter_Sel No_Jitter +SET_PARAMETER Use_Spread_Spectrum false +SET_PARAMETER Use_Spread_Spectrum_1 false +SET_PARAMETER Prim_In_Freq 50 +SET_PARAMETER In_Freq_Units Units_MHz +SET_PARAMETER In_Jitter_Units Units_UI +SET_PARAMETER Relative_Inclk REL_PRIMARY +SET_PARAMETER Secondary_In_Freq 100.000 +SET_PARAMETER Jitter_Options UI +SET_PARAMETER Clkin1_UI_Jitter 0.010 +SET_PARAMETER Clkin2_UI_Jitter 0.010 +SET_PARAMETER Prim_In_Jitter 0.010 +SET_PARAMETER Secondary_In_Jitter 0.010 +SET_PARAMETER Clkin1_Jitter_Ps 200.0 +SET_PARAMETER Clkin2_Jitter_Ps 100.0 +SET_PARAMETER Clkout2_Used true +SET_PARAMETER Clkout3_Used false +SET_PARAMETER Clkout4_Used false +SET_PARAMETER Clkout5_Used false +SET_PARAMETER Clkout6_Used false +SET_PARAMETER Clkout7_Used false +SET_PARAMETER Num_Out_Clks 2 +SET_PARAMETER Clk_Out1_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out2_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out3_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out4_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out5_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out6_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out7_Use_Fine_Ps_GUI false +SET_PARAMETER primary_port CLK_IN1 +SET_PARAMETER CLK_OUT1_port CLK_OUT1 +SET_PARAMETER CLK_OUT2_port CLK_OUT2 +SET_PARAMETER CLK_OUT3_port CLK_OUT3 +SET_PARAMETER CLK_OUT4_port CLK_OUT4 +SET_PARAMETER CLK_OUT5_port CLK_OUT5 +SET_PARAMETER CLK_OUT6_port CLK_OUT6 +SET_PARAMETER CLK_OUT7_port CLK_OUT7 +SET_PARAMETER DADDR_port DADDR +SET_PARAMETER DCLK_port DCLK +SET_PARAMETER DRDY_port DRDY +SET_PARAMETER DWE_port DWE +SET_PARAMETER DIN_port DIN +SET_PARAMETER DOUT_port DOUT +SET_PARAMETER DEN_port DEN +SET_PARAMETER PSCLK_port PSCLK +SET_PARAMETER PSEN_port PSEN +SET_PARAMETER PSINCDEC_port PSINCDEC +SET_PARAMETER PSDONE_port PSDONE +SET_PARAMETER Clkout1_Requested_Out_Freq 75 +SET_PARAMETER Clkout1_Requested_Phase 0.000 +SET_PARAMETER Clkout1_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout2_Requested_Out_Freq 150 +SET_PARAMETER Clkout2_Requested_Phase 0.000 +SET_PARAMETER Clkout2_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout3_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout3_Requested_Phase 0.000 +SET_PARAMETER Clkout3_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout4_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout4_Requested_Phase 0.000 +SET_PARAMETER Clkout4_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout5_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout5_Requested_Phase 0.000 +SET_PARAMETER Clkout5_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout6_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout6_Requested_Phase 0.000 +SET_PARAMETER Clkout6_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout7_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout7_Requested_Phase 0.000 +SET_PARAMETER Clkout7_Requested_Duty_Cycle 50.000 +SET_PARAMETER Use_Max_I_Jitter false +SET_PARAMETER Use_Min_O_Jitter false +SET_PARAMETER Prim_Source Single_ended_clock_capable_pin +SET_PARAMETER Use_Inclk_Switchover false +SET_PARAMETER secondary_port CLK_IN2 +SET_PARAMETER Secondary_Source Single_ended_clock_capable_pin +SET_PARAMETER Clkout1_Drives BUFG +SET_PARAMETER Clkout2_Drives BUFG +SET_PARAMETER Clkout3_Drives BUFG +SET_PARAMETER Clkout4_Drives BUFG +SET_PARAMETER Clkout5_Drives BUFG +SET_PARAMETER Clkout6_Drives BUFG +SET_PARAMETER Clkout7_Drives BUFG +SET_PARAMETER Feedback_Source FDBK_AUTO +SET_PARAMETER Clkfb_In_Signaling SINGLE +SET_PARAMETER CLKFB_IN_port CLKFB_IN +SET_PARAMETER CLKFB_IN_P_port CLKFB_IN_P +SET_PARAMETER CLKFB_IN_N_port CLKFB_IN_N +SET_PARAMETER CLKFB_OUT_port CLKFB_OUT +SET_PARAMETER CLKFB_OUT_P_port CLKFB_OUT_P +SET_PARAMETER CLKFB_OUT_N_port CLKFB_OUT_N +SET_PARAMETER Platform lin64 +SET_PARAMETER Summary_Strings empty +SET_PARAMETER Use_Locked false +SET_PARAMETER calc_done DONE +SET_PARAMETER Use_Reset false +SET_PARAMETER Use_Power_Down false +SET_PARAMETER Use_Status false +SET_PARAMETER Use_Freeze false +SET_PARAMETER Use_Clk_Valid false +SET_PARAMETER Use_Inclk_Stopped false +SET_PARAMETER Use_Clkfb_Stopped false +SET_PARAMETER RESET_port RESET +SET_PARAMETER LOCKED_port LOCKED +SET_PARAMETER Power_Down_port POWER_DOWN +SET_PARAMETER CLK_VALID_port CLK_VALID +SET_PARAMETER STATUS_port STATUS +SET_PARAMETER CLK_IN_SEL_port CLK_IN_SEL +SET_PARAMETER INPUT_CLK_STOPPED_port INPUT_CLK_STOPPED +SET_PARAMETER CLKFB_STOPPED_port CLKFB_STOPPED +SET_PARAMETER Override_Mmcm false +SET_PARAMETER Mmcm_Notes None +SET_PARAMETER Mmcm_Divclk_Divide 1 +SET_PARAMETER Mmcm_Bandwidth OPTIMIZED +SET_PARAMETER Mmcm_Clkfbout_Mult_F 4.000 +SET_PARAMETER Mmcm_Clkfbout_Phase 0.000 +SET_PARAMETER Mmcm_Clkfbout_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkin1_Period 10.000 +SET_PARAMETER Mmcm_Clkin2_Period 10.000 +SET_PARAMETER Mmcm_Clkout4_Cascade false +SET_PARAMETER Mmcm_Clock_Hold false +SET_PARAMETER Mmcm_Compensation ZHOLD +SET_PARAMETER Mmcm_Ref_Jitter1 0.010 +SET_PARAMETER Mmcm_Ref_Jitter2 0.010 +SET_PARAMETER Mmcm_Startup_Wait false +SET_PARAMETER Mmcm_Clkout0_Divide_F 4.000 +SET_PARAMETER Mmcm_Clkout0_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout0_Phase 0.000 +SET_PARAMETER Mmcm_Clkout0_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout1_Divide 1 +SET_PARAMETER Mmcm_Clkout1_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout1_Phase 0.000 +SET_PARAMETER Mmcm_Clkout1_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout2_Divide 1 +SET_PARAMETER Mmcm_Clkout2_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout2_Phase 0.000 +SET_PARAMETER Mmcm_Clkout2_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout3_Divide 1 +SET_PARAMETER Mmcm_Clkout3_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout3_Phase 0.000 +SET_PARAMETER Mmcm_Clkout3_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout4_Divide 1 +SET_PARAMETER Mmcm_Clkout4_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout4_Phase 0.000 +SET_PARAMETER Mmcm_Clkout4_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout5_Divide 1 +SET_PARAMETER Mmcm_Clkout5_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout5_Phase 0.000 +SET_PARAMETER Mmcm_Clkout5_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout6_Divide 1 +SET_PARAMETER Mmcm_Clkout6_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout6_Phase 0.000 +SET_PARAMETER Mmcm_Clkout6_Use_Fine_Ps false +SET_PARAMETER Override_Dcm false +SET_PARAMETER Dcm_Notes None +SET_PARAMETER Dcm_Clkdv_Divide 2.0 +SET_PARAMETER Dcm_Clkfx_Divide 2 +SET_PARAMETER Dcm_Clkfx_Multiply 3 +SET_PARAMETER Dcm_Clkin_Divide_By_2 false +SET_PARAMETER Dcm_Clkin_Period 20.000 +SET_PARAMETER Dcm_Clkout_Phase_Shift NONE +SET_PARAMETER Dcm_Deskew_Adjust SYSTEM_SYNCHRONOUS +SET_PARAMETER Dcm_Phase_Shift 0 +SET_PARAMETER Dcm_Clk_Feedback NONE +SET_PARAMETER Dcm_Startup_Wait false +SET_PARAMETER Dcm_Clk_Out1_Port CLKFX +SET_PARAMETER Dcm_Clk_Out2_Port CLK0 +SET_PARAMETER Dcm_Clk_Out3_Port CLK0 +SET_PARAMETER Dcm_Clk_Out4_Port CLK0 +SET_PARAMETER Dcm_Clk_Out5_Port CLK0 +SET_PARAMETER Dcm_Clk_Out6_Port CLK0 +SET_PARAMETER Override_Dcm_Clkgen false +SET_PARAMETER Dcm_Clkgen_Notes None +SET_PARAMETER Dcm_Clkgen_Clkfx_Divide 1 +SET_PARAMETER Dcm_Clkgen_Clkfx_Multiply 4 +SET_PARAMETER Dcm_Clkgen_Clkfxdv_Divide 2 +SET_PARAMETER Dcm_Clkgen_Clkfx_Md_Max 0.000 +SET_PARAMETER Dcm_Clkgen_Startup_Wait false +SET_PARAMETER Dcm_Clkgen_Clkin_Period 10.000 +SET_PARAMETER Dcm_Clkgen_Spread_Spectrum NONE +SET_PARAMETER Dcm_Clkgen_Clk_Out1_Port CLKFX +SET_PARAMETER Dcm_Clkgen_Clk_Out2_Port CLKFX +SET_PARAMETER Dcm_Clkgen_Clk_Out3_Port CLKFX +SET_PARAMETER Override_Pll false +SET_PARAMETER Pll_Notes None +SET_PARAMETER Pll_Bandwidth OPTIMIZED +SET_PARAMETER Pll_Clkfbout_Mult 9 +SET_PARAMETER Pll_Clkfbout_Phase 0.000 +SET_PARAMETER Pll_Clk_Feedback CLKFBOUT +SET_PARAMETER Pll_Divclk_Divide 1 +SET_PARAMETER Pll_Clkin_Period 20.000 +SET_PARAMETER Pll_Compensation INTERNAL +SET_PARAMETER Pll_Ref_Jitter 0.010 +SET_PARAMETER Pll_Clkout0_Divide 6 +SET_PARAMETER Pll_Clkout0_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout0_Phase 0.000 +SET_PARAMETER Pll_Clkout1_Divide 3 +SET_PARAMETER Pll_Clkout1_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout1_Phase 0.000 +SET_PARAMETER Pll_Clkout2_Divide 1 +SET_PARAMETER Pll_Clkout2_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout2_Phase 0.000 +SET_PARAMETER Pll_Clkout3_Divide 1 +SET_PARAMETER Pll_Clkout3_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout3_Phase 0.000 +SET_PARAMETER Pll_Clkout4_Divide 1 +SET_PARAMETER Pll_Clkout4_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout4_Phase 0.000 +SET_PARAMETER Pll_Clkout5_Divide 1 +SET_PARAMETER Pll_Clkout5_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout5_Phase 0.000 +SET_PARAMETER dcm_pll_cascade NONE +SET_PARAMETER clock_mgr_type AUTO +SET_PARAMETER primtype_sel PLL_BASE +SET_PARAMETER primitive MMCM +SET_PARAMETER SS_Mode CENTER_HIGH +SET_PARAMETER SS_Mod_Freq 250 +SET_SIM_PARAMETER c_clkout2_used 1 +SET_SIM_PARAMETER c_clkout3_used 0 +SET_SIM_PARAMETER c_clkout4_used 0 +SET_SIM_PARAMETER c_clkout5_used 0 +SET_SIM_PARAMETER c_clkout6_used 0 +SET_SIM_PARAMETER c_clkout7_used 0 +SET_SIM_PARAMETER c_use_clkout1_bar 0 +SET_SIM_PARAMETER c_use_clkout2_bar 0 +SET_SIM_PARAMETER c_use_clkout3_bar 0 +SET_SIM_PARAMETER c_use_clkout4_bar 0 +SET_SIM_PARAMETER c_component_name hdmi_clk +SET_SIM_PARAMETER c_platform lin64 +SET_SIM_PARAMETER c_use_freq_synth 1 +SET_SIM_PARAMETER c_use_phase_alignment 0 +SET_SIM_PARAMETER c_prim_in_jitter 0.010 +SET_SIM_PARAMETER c_secondary_in_jitter 0.010 +SET_SIM_PARAMETER c_jitter_sel No_Jitter +SET_SIM_PARAMETER c_use_min_power 0 +SET_SIM_PARAMETER c_use_min_o_jitter 0 +SET_SIM_PARAMETER c_use_max_i_jitter 0 +SET_SIM_PARAMETER c_use_dyn_phase_shift 0 +SET_SIM_PARAMETER c_use_inclk_switchover 0 +SET_SIM_PARAMETER c_use_dyn_reconfig 0 +SET_SIM_PARAMETER c_use_spread_spectrum 0 +SET_SIM_PARAMETER c_use_spread_spectrum_1 0 +SET_SIM_PARAMETER c_primtype_sel PLL_BASE +SET_SIM_PARAMETER c_use_clk_valid 0 +SET_SIM_PARAMETER c_prim_in_freq 50 +SET_SIM_PARAMETER c_in_freq_units Units_MHz +SET_SIM_PARAMETER c_secondary_in_freq 100.000 +SET_SIM_PARAMETER c_feedback_source FDBK_AUTO +SET_SIM_PARAMETER c_prim_source Single_ended_clock_capable_pin +SET_SIM_PARAMETER c_secondary_source Single_ended_clock_capable_pin +SET_SIM_PARAMETER c_clkfb_in_signaling SINGLE +SET_SIM_PARAMETER c_use_reset 0 +SET_SIM_PARAMETER c_use_locked 0 +SET_SIM_PARAMETER c_use_inclk_stopped 0 +SET_SIM_PARAMETER c_use_clkfb_stopped 0 +SET_SIM_PARAMETER c_use_power_down 0 +SET_SIM_PARAMETER c_use_status 0 +SET_SIM_PARAMETER c_use_freeze 0 +SET_SIM_PARAMETER c_num_out_clks 2 +SET_SIM_PARAMETER c_clkout1_drives BUFG +SET_SIM_PARAMETER c_clkout2_drives BUFG +SET_SIM_PARAMETER c_clkout3_drives BUFG +SET_SIM_PARAMETER c_clkout4_drives BUFG +SET_SIM_PARAMETER c_clkout5_drives BUFG +SET_SIM_PARAMETER c_clkout6_drives BUFG +SET_SIM_PARAMETER c_clkout7_drives BUFG +SET_SIM_PARAMETER c_inclk_sum_row0 "Input Clock Freq (MHz) Input Jitter (UI)" +SET_SIM_PARAMETER c_inclk_sum_row1 __primary______________50____________0.010 +SET_SIM_PARAMETER c_inclk_sum_row2 no_secondary_input_clock +SET_SIM_PARAMETER c_outclk_sum_row0a "Output Output Phase Duty Pk-to-Pk Phase" +SET_SIM_PARAMETER c_outclk_sum_row0b "Clock Freq (MHz) (degrees) Cycle (%) Jitter (ps) Error (ps)" +SET_SIM_PARAMETER c_outclk_sum_row1 CLK_OUT1____75.000______0.000______50.0______248.869____240.171 +SET_SIM_PARAMETER c_outclk_sum_row2 CLK_OUT2___150.000______0.000______50.0______216.897____240.171 +SET_SIM_PARAMETER c_outclk_sum_row3 no_CLK_OUT3_output +SET_SIM_PARAMETER c_outclk_sum_row4 no_CLK_OUT4_output +SET_SIM_PARAMETER c_outclk_sum_row5 no_CLK_OUT5_output +SET_SIM_PARAMETER c_outclk_sum_row6 no_CLK_OUT6_output +SET_SIM_PARAMETER c_outclk_sum_row7 no_CLK_OUT7_output +SET_SIM_PARAMETER c_clkout1_requested_out_freq 75 +SET_SIM_PARAMETER c_clkout2_requested_out_freq 150 +SET_SIM_PARAMETER c_clkout3_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout4_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout5_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout6_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout7_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout1_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout2_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout3_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout4_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout5_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout6_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout7_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout1_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout2_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout3_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout4_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout5_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout6_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout7_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout1_out_freq 75.000 +SET_SIM_PARAMETER c_clkout2_out_freq 150.000 +SET_SIM_PARAMETER c_clkout3_out_freq N/A +SET_SIM_PARAMETER c_clkout4_out_freq N/A +SET_SIM_PARAMETER c_clkout5_out_freq N/A +SET_SIM_PARAMETER c_clkout6_out_freq N/A +SET_SIM_PARAMETER c_clkout7_out_freq N/A +SET_SIM_PARAMETER c_clkout1_phase 0.000 +SET_SIM_PARAMETER c_clkout2_phase 0.000 +SET_SIM_PARAMETER c_clkout3_phase N/A +SET_SIM_PARAMETER c_clkout4_phase N/A +SET_SIM_PARAMETER c_clkout5_phase N/A +SET_SIM_PARAMETER c_clkout6_phase N/A +SET_SIM_PARAMETER c_clkout7_phase N/A +SET_SIM_PARAMETER c_clkout1_duty_cycle 50.0 +SET_SIM_PARAMETER c_clkout2_duty_cycle 50.0 +SET_SIM_PARAMETER c_clkout3_duty_cycle N/A +SET_SIM_PARAMETER c_clkout4_duty_cycle N/A +SET_SIM_PARAMETER c_clkout5_duty_cycle N/A +SET_SIM_PARAMETER c_clkout6_duty_cycle N/A +SET_SIM_PARAMETER c_clkout7_duty_cycle N/A +SET_SIM_PARAMETER c_mmcm_notes None +SET_SIM_PARAMETER c_mmcm_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_mmcm_clkfbout_mult_f 4.000 +SET_SIM_PARAMETER c_mmcm_clkin1_period 10.000 +SET_SIM_PARAMETER c_mmcm_clkin2_period 10.000 +SET_SIM_PARAMETER c_mmcm_clkout4_cascade FALSE +SET_SIM_PARAMETER c_mmcm_clock_hold FALSE +SET_SIM_PARAMETER c_mmcm_compensation ZHOLD +SET_SIM_PARAMETER c_mmcm_divclk_divide 1 +SET_SIM_PARAMETER c_mmcm_ref_jitter1 0.010 +SET_SIM_PARAMETER c_mmcm_ref_jitter2 0.010 +SET_SIM_PARAMETER c_mmcm_startup_wait FALSE +SET_SIM_PARAMETER c_mmcm_clkout0_divide_f 4.000 +SET_SIM_PARAMETER c_mmcm_clkout1_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout2_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout3_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout4_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout5_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout6_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout0_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout1_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout2_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout3_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout4_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout5_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout6_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkfbout_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout0_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout1_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout2_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout3_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout4_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout5_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout6_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkfbout_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout0_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout1_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout2_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout3_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout4_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout5_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout6_use_fine_ps FALSE +SET_SIM_PARAMETER c_pll_notes None +SET_SIM_PARAMETER c_pll_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_pll_clk_feedback CLKFBOUT +SET_SIM_PARAMETER c_pll_clkfbout_mult 9 +SET_SIM_PARAMETER c_pll_clkin_period 20.000 +SET_SIM_PARAMETER c_pll_compensation INTERNAL +SET_SIM_PARAMETER c_pll_divclk_divide 1 +SET_SIM_PARAMETER c_pll_ref_jitter 0.010 +SET_SIM_PARAMETER c_pll_clkout0_divide 6 +SET_SIM_PARAMETER c_pll_clkout1_divide 3 +SET_SIM_PARAMETER c_pll_clkout2_divide 1 +SET_SIM_PARAMETER c_pll_clkout3_divide 1 +SET_SIM_PARAMETER c_pll_clkout4_divide 1 +SET_SIM_PARAMETER c_pll_clkout5_divide 1 +SET_SIM_PARAMETER c_pll_clkout0_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout1_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout2_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout3_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout4_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout5_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkfbout_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout0_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout1_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout2_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout3_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout4_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout5_phase 0.000 +SET_SIM_PARAMETER c_dcm_notes None +SET_SIM_PARAMETER c_dcm_clkdv_divide 2.000 +SET_SIM_PARAMETER c_dcm_clkfx_divide 2 +SET_SIM_PARAMETER c_dcm_clkfx_multiply 3 +SET_SIM_PARAMETER c_dcm_clkin_divide_by_2 FALSE +SET_SIM_PARAMETER c_dcm_clkin_period 20.0 +SET_SIM_PARAMETER c_dcm_clkout_phase_shift NONE +SET_SIM_PARAMETER c_dcm_clk_feedback NONE +SET_SIM_PARAMETER c_dcm_clk_feedback_port NONE +SET_SIM_PARAMETER c_dcm_deskew_adjust SYSTEM_SYNCHRONOUS +SET_SIM_PARAMETER c_dcm_phase_shift 0 +SET_SIM_PARAMETER c_dcm_startup_wait FALSE +SET_SIM_PARAMETER c_dcm_clk_out1_port CLKFX +SET_SIM_PARAMETER c_dcm_clk_out2_port CLK0 +SET_SIM_PARAMETER c_dcm_clk_out3_port NONE +SET_SIM_PARAMETER c_dcm_clk_out4_port NONE +SET_SIM_PARAMETER c_dcm_clk_out5_port NONE +SET_SIM_PARAMETER c_dcm_clk_out6_port NONE +SET_SIM_PARAMETER c_dcm_clkgen_notes None +SET_SIM_PARAMETER c_dcm_clkgen_clkfxdv_divide 2 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_divide 1 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_multiply 4 +SET_SIM_PARAMETER c_dcm_clkgen_dfs_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_dcm_clkgen_prog_md_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_dcm_clkgen_clkin_period 20.0 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_md_max 0.000 +SET_SIM_PARAMETER c_dcm_clkgen_spread_spectrum NONE +SET_SIM_PARAMETER c_dcm_clkgen_startup_wait FALSE +SET_SIM_PARAMETER c_dcm_clkgen_clk_out1_port CLKFX +SET_SIM_PARAMETER c_dcm_clkgen_clk_out2_port CLKFX +SET_SIM_PARAMETER c_dcm_clkgen_clk_out3_port NONE +SET_SIM_PARAMETER c_clock_mgr_type AUTO +SET_SIM_PARAMETER c_override_mmcm 0 +SET_SIM_PARAMETER c_override_pll 0 +SET_SIM_PARAMETER c_override_dcm 0 +SET_SIM_PARAMETER c_override_dcm_clkgen 0 +SET_SIM_PARAMETER c_dcm_pll_cascade NONE +SET_SIM_PARAMETER c_primary_port CLK_IN1 +SET_SIM_PARAMETER c_secondary_port CLK_IN2 +SET_SIM_PARAMETER c_clk_out1_port CLK_OUT1 +SET_SIM_PARAMETER c_clk_out2_port CLK_OUT2 +SET_SIM_PARAMETER c_clk_out3_port CLK_OUT3 +SET_SIM_PARAMETER c_clk_out4_port CLK_OUT4 +SET_SIM_PARAMETER c_clk_out5_port CLK_OUT5 +SET_SIM_PARAMETER c_clk_out6_port CLK_OUT6 +SET_SIM_PARAMETER c_clk_out7_port CLK_OUT7 +SET_SIM_PARAMETER c_reset_port RESET +SET_SIM_PARAMETER c_locked_port LOCKED +SET_SIM_PARAMETER c_clkfb_in_port CLKFB_IN +SET_SIM_PARAMETER c_clkfb_in_p_port CLKFB_IN_P +SET_SIM_PARAMETER c_clkfb_in_n_port CLKFB_IN_N +SET_SIM_PARAMETER c_clkfb_out_port CLKFB_OUT +SET_SIM_PARAMETER c_clkfb_out_p_port CLKFB_OUT_P +SET_SIM_PARAMETER c_clkfb_out_n_port CLKFB_OUT_N +SET_SIM_PARAMETER c_power_down_port POWER_DOWN +SET_SIM_PARAMETER c_daddr_port DADDR +SET_SIM_PARAMETER c_dclk_port DCLK +SET_SIM_PARAMETER c_drdy_port DRDY +SET_SIM_PARAMETER c_dwe_port DWE +SET_SIM_PARAMETER c_din_port DIN +SET_SIM_PARAMETER c_dout_port DOUT +SET_SIM_PARAMETER c_den_port DEN +SET_SIM_PARAMETER c_psclk_port PSCLK +SET_SIM_PARAMETER c_psen_port PSEN +SET_SIM_PARAMETER c_psincdec_port PSINCDEC +SET_SIM_PARAMETER c_psdone_port PSDONE +SET_SIM_PARAMETER c_clk_valid_port CLK_VALID +SET_SIM_PARAMETER c_status_port STATUS +SET_SIM_PARAMETER c_clk_in_sel_port CLK_IN_SEL +SET_SIM_PARAMETER c_input_clk_stopped_port INPUT_CLK_STOPPED +SET_SIM_PARAMETER c_clkfb_stopped_port CLKFB_STOPPED +SET_SIM_PARAMETER c_clkin1_jitter_ps 200.0 +SET_SIM_PARAMETER c_clkin2_jitter_ps 100.0 +SET_SIM_PARAMETER c_primitive MMCM +SET_SIM_PARAMETER c_ss_mode CENTER_HIGH +SET_SIM_PARAMETER c_ss_mod_period 4000 +SET_CORE_NAME Clocking Wizard +SET_CORE_VERSION 3.6 +SET_CORE_VLNV xilinx.com:ip:clk_wiz:3.6 +SET_CORE_CLASS com.xilinx.ip.clk_wiz_v3_6.clk_wiz_v3_6 +SET_CORE_PATH /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6 +SET_CORE_GUIPATH /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6/gui/clk_wiz_v3_6.tcl +SET_CORE_DATASHEET /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6/doc/pg065_clk_wiz.pdf +ADD_CORE_DOCUMENT +ADD_CORE_DOCUMENT +ADD_CORE_DOCUMENT diff --git a/ipcore_dir/tmp/customization_gui.0.901080844412.out b/ipcore_dir/tmp/customization_gui.0.901080844412.out new file mode 100644 index 0000000..a8315da --- /dev/null +++ b/ipcore_dir/tmp/customization_gui.0.901080844412.out @@ -0,0 +1,505 @@ +SET_FLAG DEBUG FALSE +SET_FLAG MODE BATCH +SET_FLAG STANDALONE_MODE FALSE +SET_PREFERENCE devicefamily spartan6 +SET_PREFERENCE device xc6slx9 +SET_PREFERENCE speedgrade -2 +SET_PREFERENCE package tqg144 +SET_PREFERENCE verilogsim true +SET_PREFERENCE vhdlsim false +SET_PREFERENCE simulationfiles Behavioral +SET_PREFERENCE busformat BusFormatAngleBracketNotRipped +SET_PREFERENCE outputdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/ +SET_PREFERENCE workingdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/ +SET_PREFERENCE subworkingdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/_cg/ +SET_PREFERENCE transientdirectory /home/tim/Projects/z80/hdmi/ipcore_dir/tmp/_cg/_dbg/ +SET_PREFERENCE designentry Verilog +SET_PREFERENCE flowvendor Other +SET_PREFERENCE addpads false +SET_PREFERENCE projectname coregen +SET_PREFERENCE formalverification false +SET_PREFERENCE asysymbol false +SET_PREFERENCE implementationfiletype Ngc +SET_PREFERENCE foundationsym false +SET_PREFERENCE createndf false +SET_PREFERENCE removerpms false +SET_PARAMETER Component_Name hdmi_clk +SET_PARAMETER Use_Freq_Synth true +SET_PARAMETER Use_Phase_Alignment false +SET_PARAMETER Use_Min_Power false +SET_PARAMETER Use_Dyn_Phase_Shift false +SET_PARAMETER Use_Dyn_Reconfig false +SET_PARAMETER Jitter_Sel No_Jitter +SET_PARAMETER Use_Spread_Spectrum false +SET_PARAMETER Use_Spread_Spectrum_1 false +SET_PARAMETER Prim_In_Freq 50 +SET_PARAMETER In_Freq_Units Units_MHz +SET_PARAMETER In_Jitter_Units Units_UI +SET_PARAMETER Relative_Inclk REL_PRIMARY +SET_PARAMETER Secondary_In_Freq 100.000 +SET_PARAMETER Jitter_Options UI +SET_PARAMETER Clkin1_UI_Jitter 0.010 +SET_PARAMETER Clkin2_UI_Jitter 0.010 +SET_PARAMETER Prim_In_Jitter 0.010 +SET_PARAMETER Secondary_In_Jitter 0.010 +SET_PARAMETER Clkin1_Jitter_Ps 200.0 +SET_PARAMETER Clkin2_Jitter_Ps 100.0 +SET_PARAMETER Clkout2_Used true +SET_PARAMETER Clkout3_Used false +SET_PARAMETER Clkout4_Used false +SET_PARAMETER Clkout5_Used false +SET_PARAMETER Clkout6_Used false +SET_PARAMETER Clkout7_Used false +SET_PARAMETER Num_Out_Clks 2 +SET_PARAMETER Clk_Out1_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out2_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out3_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out4_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out5_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out6_Use_Fine_Ps_GUI false +SET_PARAMETER Clk_Out7_Use_Fine_Ps_GUI false +SET_PARAMETER primary_port CLK_IN1 +SET_PARAMETER CLK_OUT1_port CLK_OUT1 +SET_PARAMETER CLK_OUT2_port CLK_OUT2 +SET_PARAMETER CLK_OUT3_port CLK_OUT3 +SET_PARAMETER CLK_OUT4_port CLK_OUT4 +SET_PARAMETER CLK_OUT5_port CLK_OUT5 +SET_PARAMETER CLK_OUT6_port CLK_OUT6 +SET_PARAMETER CLK_OUT7_port CLK_OUT7 +SET_PARAMETER DADDR_port DADDR +SET_PARAMETER DCLK_port DCLK +SET_PARAMETER DRDY_port DRDY +SET_PARAMETER DWE_port DWE +SET_PARAMETER DIN_port DIN +SET_PARAMETER DOUT_port DOUT +SET_PARAMETER DEN_port DEN +SET_PARAMETER PSCLK_port PSCLK +SET_PARAMETER PSEN_port PSEN +SET_PARAMETER PSINCDEC_port PSINCDEC +SET_PARAMETER PSDONE_port PSDONE +SET_PARAMETER Clkout1_Requested_Out_Freq 75 +SET_PARAMETER Clkout1_Requested_Phase 0.000 +SET_PARAMETER Clkout1_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout2_Requested_Out_Freq 150 +SET_PARAMETER Clkout2_Requested_Phase 0.000 +SET_PARAMETER Clkout2_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout3_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout3_Requested_Phase 0.000 +SET_PARAMETER Clkout3_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout4_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout4_Requested_Phase 0.000 +SET_PARAMETER Clkout4_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout5_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout5_Requested_Phase 0.000 +SET_PARAMETER Clkout5_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout6_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout6_Requested_Phase 0.000 +SET_PARAMETER Clkout6_Requested_Duty_Cycle 50.000 +SET_PARAMETER Clkout7_Requested_Out_Freq 100.000 +SET_PARAMETER Clkout7_Requested_Phase 0.000 +SET_PARAMETER Clkout7_Requested_Duty_Cycle 50.000 +SET_PARAMETER Use_Max_I_Jitter false +SET_PARAMETER Use_Min_O_Jitter false +SET_PARAMETER Prim_Source Single_ended_clock_capable_pin +SET_PARAMETER Use_Inclk_Switchover false +SET_PARAMETER secondary_port CLK_IN2 +SET_PARAMETER Secondary_Source Single_ended_clock_capable_pin +SET_PARAMETER Clkout1_Drives BUFG +SET_PARAMETER Clkout2_Drives BUFG +SET_PARAMETER Clkout3_Drives BUFG +SET_PARAMETER Clkout4_Drives BUFG +SET_PARAMETER Clkout5_Drives BUFG +SET_PARAMETER Clkout6_Drives BUFG +SET_PARAMETER Clkout7_Drives BUFG +SET_PARAMETER Feedback_Source FDBK_AUTO +SET_PARAMETER Clkfb_In_Signaling SINGLE +SET_PARAMETER CLKFB_IN_port CLKFB_IN +SET_PARAMETER CLKFB_IN_P_port CLKFB_IN_P +SET_PARAMETER CLKFB_IN_N_port CLKFB_IN_N +SET_PARAMETER CLKFB_OUT_port CLKFB_OUT +SET_PARAMETER CLKFB_OUT_P_port CLKFB_OUT_P +SET_PARAMETER CLKFB_OUT_N_port CLKFB_OUT_N +SET_PARAMETER Platform lin64 +SET_PARAMETER Summary_Strings empty +SET_PARAMETER Use_Locked false +SET_PARAMETER calc_done DONE +SET_PARAMETER Use_Reset false +SET_PARAMETER Use_Power_Down false +SET_PARAMETER Use_Status false +SET_PARAMETER Use_Freeze false +SET_PARAMETER Use_Clk_Valid false +SET_PARAMETER Use_Inclk_Stopped false +SET_PARAMETER Use_Clkfb_Stopped false +SET_PARAMETER RESET_port RESET +SET_PARAMETER LOCKED_port LOCKED +SET_PARAMETER Power_Down_port POWER_DOWN +SET_PARAMETER CLK_VALID_port CLK_VALID +SET_PARAMETER STATUS_port STATUS +SET_PARAMETER CLK_IN_SEL_port CLK_IN_SEL +SET_PARAMETER INPUT_CLK_STOPPED_port INPUT_CLK_STOPPED +SET_PARAMETER CLKFB_STOPPED_port CLKFB_STOPPED +SET_PARAMETER Override_Mmcm false +SET_PARAMETER Mmcm_Notes None +SET_PARAMETER Mmcm_Divclk_Divide 1 +SET_PARAMETER Mmcm_Bandwidth OPTIMIZED +SET_PARAMETER Mmcm_Clkfbout_Mult_F 4.000 +SET_PARAMETER Mmcm_Clkfbout_Phase 0.000 +SET_PARAMETER Mmcm_Clkfbout_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkin1_Period 10.000 +SET_PARAMETER Mmcm_Clkin2_Period 10.000 +SET_PARAMETER Mmcm_Clkout4_Cascade false +SET_PARAMETER Mmcm_Clock_Hold false +SET_PARAMETER Mmcm_Compensation ZHOLD +SET_PARAMETER Mmcm_Ref_Jitter1 0.010 +SET_PARAMETER Mmcm_Ref_Jitter2 0.010 +SET_PARAMETER Mmcm_Startup_Wait false +SET_PARAMETER Mmcm_Clkout0_Divide_F 4.000 +SET_PARAMETER Mmcm_Clkout0_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout0_Phase 0.000 +SET_PARAMETER Mmcm_Clkout0_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout1_Divide 1 +SET_PARAMETER Mmcm_Clkout1_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout1_Phase 0.000 +SET_PARAMETER Mmcm_Clkout1_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout2_Divide 1 +SET_PARAMETER Mmcm_Clkout2_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout2_Phase 0.000 +SET_PARAMETER Mmcm_Clkout2_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout3_Divide 1 +SET_PARAMETER Mmcm_Clkout3_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout3_Phase 0.000 +SET_PARAMETER Mmcm_Clkout3_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout4_Divide 1 +SET_PARAMETER Mmcm_Clkout4_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout4_Phase 0.000 +SET_PARAMETER Mmcm_Clkout4_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout5_Divide 1 +SET_PARAMETER Mmcm_Clkout5_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout5_Phase 0.000 +SET_PARAMETER Mmcm_Clkout5_Use_Fine_Ps false +SET_PARAMETER Mmcm_Clkout6_Divide 1 +SET_PARAMETER Mmcm_Clkout6_Duty_Cycle 0.500 +SET_PARAMETER Mmcm_Clkout6_Phase 0.000 +SET_PARAMETER Mmcm_Clkout6_Use_Fine_Ps false +SET_PARAMETER Override_Dcm false +SET_PARAMETER Dcm_Notes None +SET_PARAMETER Dcm_Clkdv_Divide 2.0 +SET_PARAMETER Dcm_Clkfx_Divide 2 +SET_PARAMETER Dcm_Clkfx_Multiply 3 +SET_PARAMETER Dcm_Clkin_Divide_By_2 false +SET_PARAMETER Dcm_Clkin_Period 20.000 +SET_PARAMETER Dcm_Clkout_Phase_Shift NONE +SET_PARAMETER Dcm_Deskew_Adjust SYSTEM_SYNCHRONOUS +SET_PARAMETER Dcm_Phase_Shift 0 +SET_PARAMETER Dcm_Clk_Feedback NONE +SET_PARAMETER Dcm_Startup_Wait false +SET_PARAMETER Dcm_Clk_Out1_Port CLKFX +SET_PARAMETER Dcm_Clk_Out2_Port CLK0 +SET_PARAMETER Dcm_Clk_Out3_Port CLK0 +SET_PARAMETER Dcm_Clk_Out4_Port CLK0 +SET_PARAMETER Dcm_Clk_Out5_Port CLK0 +SET_PARAMETER Dcm_Clk_Out6_Port CLK0 +SET_PARAMETER Override_Dcm_Clkgen false +SET_PARAMETER Dcm_Clkgen_Notes None +SET_PARAMETER Dcm_Clkgen_Clkfx_Divide 1 +SET_PARAMETER Dcm_Clkgen_Clkfx_Multiply 4 +SET_PARAMETER Dcm_Clkgen_Clkfxdv_Divide 2 +SET_PARAMETER Dcm_Clkgen_Clkfx_Md_Max 0.000 +SET_PARAMETER Dcm_Clkgen_Startup_Wait false +SET_PARAMETER Dcm_Clkgen_Clkin_Period 10.000 +SET_PARAMETER Dcm_Clkgen_Spread_Spectrum NONE +SET_PARAMETER Dcm_Clkgen_Clk_Out1_Port CLKFX +SET_PARAMETER Dcm_Clkgen_Clk_Out2_Port CLKFX +SET_PARAMETER Dcm_Clkgen_Clk_Out3_Port CLKFX +SET_PARAMETER Override_Pll false +SET_PARAMETER Pll_Notes None +SET_PARAMETER Pll_Bandwidth OPTIMIZED +SET_PARAMETER Pll_Clkfbout_Mult 9 +SET_PARAMETER Pll_Clkfbout_Phase 0.000 +SET_PARAMETER Pll_Clk_Feedback CLKFBOUT +SET_PARAMETER Pll_Divclk_Divide 1 +SET_PARAMETER Pll_Clkin_Period 20.000 +SET_PARAMETER Pll_Compensation INTERNAL +SET_PARAMETER Pll_Ref_Jitter 0.010 +SET_PARAMETER Pll_Clkout0_Divide 6 +SET_PARAMETER Pll_Clkout0_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout0_Phase 0.000 +SET_PARAMETER Pll_Clkout1_Divide 3 +SET_PARAMETER Pll_Clkout1_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout1_Phase 0.000 +SET_PARAMETER Pll_Clkout2_Divide 1 +SET_PARAMETER Pll_Clkout2_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout2_Phase 0.000 +SET_PARAMETER Pll_Clkout3_Divide 1 +SET_PARAMETER Pll_Clkout3_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout3_Phase 0.000 +SET_PARAMETER Pll_Clkout4_Divide 1 +SET_PARAMETER Pll_Clkout4_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout4_Phase 0.000 +SET_PARAMETER Pll_Clkout5_Divide 1 +SET_PARAMETER Pll_Clkout5_Duty_Cycle 0.500 +SET_PARAMETER Pll_Clkout5_Phase 0.000 +SET_PARAMETER dcm_pll_cascade NONE +SET_PARAMETER clock_mgr_type AUTO +SET_PARAMETER primtype_sel PLL_BASE +SET_PARAMETER primitive MMCM +SET_PARAMETER SS_Mode CENTER_HIGH +SET_PARAMETER SS_Mod_Freq 250 +SET_SIM_PARAMETER c_clkout2_used 1 +SET_SIM_PARAMETER c_clkout3_used 0 +SET_SIM_PARAMETER c_clkout4_used 0 +SET_SIM_PARAMETER c_clkout5_used 0 +SET_SIM_PARAMETER c_clkout6_used 0 +SET_SIM_PARAMETER c_clkout7_used 0 +SET_SIM_PARAMETER c_use_clkout1_bar 0 +SET_SIM_PARAMETER c_use_clkout2_bar 0 +SET_SIM_PARAMETER c_use_clkout3_bar 0 +SET_SIM_PARAMETER c_use_clkout4_bar 0 +SET_SIM_PARAMETER c_component_name hdmi_clk +SET_SIM_PARAMETER c_platform lin64 +SET_SIM_PARAMETER c_use_freq_synth 1 +SET_SIM_PARAMETER c_use_phase_alignment 0 +SET_SIM_PARAMETER c_prim_in_jitter 0.010 +SET_SIM_PARAMETER c_secondary_in_jitter 0.010 +SET_SIM_PARAMETER c_jitter_sel No_Jitter +SET_SIM_PARAMETER c_use_min_power 0 +SET_SIM_PARAMETER c_use_min_o_jitter 0 +SET_SIM_PARAMETER c_use_max_i_jitter 0 +SET_SIM_PARAMETER c_use_dyn_phase_shift 0 +SET_SIM_PARAMETER c_use_inclk_switchover 0 +SET_SIM_PARAMETER c_use_dyn_reconfig 0 +SET_SIM_PARAMETER c_use_spread_spectrum 0 +SET_SIM_PARAMETER c_use_spread_spectrum_1 0 +SET_SIM_PARAMETER c_primtype_sel PLL_BASE +SET_SIM_PARAMETER c_use_clk_valid 0 +SET_SIM_PARAMETER c_prim_in_freq 50 +SET_SIM_PARAMETER c_in_freq_units Units_MHz +SET_SIM_PARAMETER c_secondary_in_freq 100.000 +SET_SIM_PARAMETER c_feedback_source FDBK_AUTO +SET_SIM_PARAMETER c_prim_source Single_ended_clock_capable_pin +SET_SIM_PARAMETER c_secondary_source Single_ended_clock_capable_pin +SET_SIM_PARAMETER c_clkfb_in_signaling SINGLE +SET_SIM_PARAMETER c_use_reset 0 +SET_SIM_PARAMETER c_use_locked 0 +SET_SIM_PARAMETER c_use_inclk_stopped 0 +SET_SIM_PARAMETER c_use_clkfb_stopped 0 +SET_SIM_PARAMETER c_use_power_down 0 +SET_SIM_PARAMETER c_use_status 0 +SET_SIM_PARAMETER c_use_freeze 0 +SET_SIM_PARAMETER c_num_out_clks 2 +SET_SIM_PARAMETER c_clkout1_drives BUFG +SET_SIM_PARAMETER c_clkout2_drives BUFG +SET_SIM_PARAMETER c_clkout3_drives BUFG +SET_SIM_PARAMETER c_clkout4_drives BUFG +SET_SIM_PARAMETER c_clkout5_drives BUFG +SET_SIM_PARAMETER c_clkout6_drives BUFG +SET_SIM_PARAMETER c_clkout7_drives BUFG +SET_SIM_PARAMETER c_inclk_sum_row0 "Input Clock Freq (MHz) Input Jitter (UI)" +SET_SIM_PARAMETER c_inclk_sum_row1 __primary______________50____________0.010 +SET_SIM_PARAMETER c_inclk_sum_row2 no_secondary_input_clock +SET_SIM_PARAMETER c_outclk_sum_row0a "Output Output Phase Duty Pk-to-Pk Phase" +SET_SIM_PARAMETER c_outclk_sum_row0b "Clock Freq (MHz) (degrees) Cycle (%) Jitter (ps) Error (ps)" +SET_SIM_PARAMETER c_outclk_sum_row1 CLK_OUT1____75.000______0.000______50.0______248.869____240.171 +SET_SIM_PARAMETER c_outclk_sum_row2 CLK_OUT2___150.000______0.000______50.0______216.897____240.171 +SET_SIM_PARAMETER c_outclk_sum_row3 no_CLK_OUT3_output +SET_SIM_PARAMETER c_outclk_sum_row4 no_CLK_OUT4_output +SET_SIM_PARAMETER c_outclk_sum_row5 no_CLK_OUT5_output +SET_SIM_PARAMETER c_outclk_sum_row6 no_CLK_OUT6_output +SET_SIM_PARAMETER c_outclk_sum_row7 no_CLK_OUT7_output +SET_SIM_PARAMETER c_clkout1_requested_out_freq 75 +SET_SIM_PARAMETER c_clkout2_requested_out_freq 150 +SET_SIM_PARAMETER c_clkout3_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout4_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout5_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout6_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout7_requested_out_freq 100.000 +SET_SIM_PARAMETER c_clkout1_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout2_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout3_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout4_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout5_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout6_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout7_requested_phase 0.000 +SET_SIM_PARAMETER c_clkout1_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout2_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout3_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout4_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout5_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout6_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout7_requested_duty_cycle 50.000 +SET_SIM_PARAMETER c_clkout1_out_freq 75.000 +SET_SIM_PARAMETER c_clkout2_out_freq 150.000 +SET_SIM_PARAMETER c_clkout3_out_freq N/A +SET_SIM_PARAMETER c_clkout4_out_freq N/A +SET_SIM_PARAMETER c_clkout5_out_freq N/A +SET_SIM_PARAMETER c_clkout6_out_freq N/A +SET_SIM_PARAMETER c_clkout7_out_freq N/A +SET_SIM_PARAMETER c_clkout1_phase 0.000 +SET_SIM_PARAMETER c_clkout2_phase 0.000 +SET_SIM_PARAMETER c_clkout3_phase N/A +SET_SIM_PARAMETER c_clkout4_phase N/A +SET_SIM_PARAMETER c_clkout5_phase N/A +SET_SIM_PARAMETER c_clkout6_phase N/A +SET_SIM_PARAMETER c_clkout7_phase N/A +SET_SIM_PARAMETER c_clkout1_duty_cycle 50.0 +SET_SIM_PARAMETER c_clkout2_duty_cycle 50.0 +SET_SIM_PARAMETER c_clkout3_duty_cycle N/A +SET_SIM_PARAMETER c_clkout4_duty_cycle N/A +SET_SIM_PARAMETER c_clkout5_duty_cycle N/A +SET_SIM_PARAMETER c_clkout6_duty_cycle N/A +SET_SIM_PARAMETER c_clkout7_duty_cycle N/A +SET_SIM_PARAMETER c_mmcm_notes None +SET_SIM_PARAMETER c_mmcm_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_mmcm_clkfbout_mult_f 4.000 +SET_SIM_PARAMETER c_mmcm_clkin1_period 10.000 +SET_SIM_PARAMETER c_mmcm_clkin2_period 10.000 +SET_SIM_PARAMETER c_mmcm_clkout4_cascade FALSE +SET_SIM_PARAMETER c_mmcm_clock_hold FALSE +SET_SIM_PARAMETER c_mmcm_compensation ZHOLD +SET_SIM_PARAMETER c_mmcm_divclk_divide 1 +SET_SIM_PARAMETER c_mmcm_ref_jitter1 0.010 +SET_SIM_PARAMETER c_mmcm_ref_jitter2 0.010 +SET_SIM_PARAMETER c_mmcm_startup_wait FALSE +SET_SIM_PARAMETER c_mmcm_clkout0_divide_f 4.000 +SET_SIM_PARAMETER c_mmcm_clkout1_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout2_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout3_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout4_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout5_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout6_divide 1 +SET_SIM_PARAMETER c_mmcm_clkout0_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout1_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout2_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout3_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout4_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout5_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkout6_duty_cycle 0.500 +SET_SIM_PARAMETER c_mmcm_clkfbout_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout0_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout1_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout2_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout3_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout4_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout5_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkout6_phase 0.000 +SET_SIM_PARAMETER c_mmcm_clkfbout_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout0_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout1_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout2_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout3_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout4_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout5_use_fine_ps FALSE +SET_SIM_PARAMETER c_mmcm_clkout6_use_fine_ps FALSE +SET_SIM_PARAMETER c_pll_notes None +SET_SIM_PARAMETER c_pll_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_pll_clk_feedback CLKFBOUT +SET_SIM_PARAMETER c_pll_clkfbout_mult 9 +SET_SIM_PARAMETER c_pll_clkin_period 20.000 +SET_SIM_PARAMETER c_pll_compensation INTERNAL +SET_SIM_PARAMETER c_pll_divclk_divide 1 +SET_SIM_PARAMETER c_pll_ref_jitter 0.010 +SET_SIM_PARAMETER c_pll_clkout0_divide 6 +SET_SIM_PARAMETER c_pll_clkout1_divide 3 +SET_SIM_PARAMETER c_pll_clkout2_divide 1 +SET_SIM_PARAMETER c_pll_clkout3_divide 1 +SET_SIM_PARAMETER c_pll_clkout4_divide 1 +SET_SIM_PARAMETER c_pll_clkout5_divide 1 +SET_SIM_PARAMETER c_pll_clkout0_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout1_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout2_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout3_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout4_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkout5_duty_cycle 0.500 +SET_SIM_PARAMETER c_pll_clkfbout_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout0_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout1_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout2_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout3_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout4_phase 0.000 +SET_SIM_PARAMETER c_pll_clkout5_phase 0.000 +SET_SIM_PARAMETER c_dcm_notes None +SET_SIM_PARAMETER c_dcm_clkdv_divide 2.000 +SET_SIM_PARAMETER c_dcm_clkfx_divide 2 +SET_SIM_PARAMETER c_dcm_clkfx_multiply 3 +SET_SIM_PARAMETER c_dcm_clkin_divide_by_2 FALSE +SET_SIM_PARAMETER c_dcm_clkin_period 20.0 +SET_SIM_PARAMETER c_dcm_clkout_phase_shift NONE +SET_SIM_PARAMETER c_dcm_clk_feedback NONE +SET_SIM_PARAMETER c_dcm_clk_feedback_port NONE +SET_SIM_PARAMETER c_dcm_deskew_adjust SYSTEM_SYNCHRONOUS +SET_SIM_PARAMETER c_dcm_phase_shift 0 +SET_SIM_PARAMETER c_dcm_startup_wait FALSE +SET_SIM_PARAMETER c_dcm_clk_out1_port CLKFX +SET_SIM_PARAMETER c_dcm_clk_out2_port CLK0 +SET_SIM_PARAMETER c_dcm_clk_out3_port NONE +SET_SIM_PARAMETER c_dcm_clk_out4_port NONE +SET_SIM_PARAMETER c_dcm_clk_out5_port NONE +SET_SIM_PARAMETER c_dcm_clk_out6_port NONE +SET_SIM_PARAMETER c_dcm_clkgen_notes None +SET_SIM_PARAMETER c_dcm_clkgen_clkfxdv_divide 2 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_divide 1 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_multiply 4 +SET_SIM_PARAMETER c_dcm_clkgen_dfs_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_dcm_clkgen_prog_md_bandwidth OPTIMIZED +SET_SIM_PARAMETER c_dcm_clkgen_clkin_period 20.0 +SET_SIM_PARAMETER c_dcm_clkgen_clkfx_md_max 0.000 +SET_SIM_PARAMETER c_dcm_clkgen_spread_spectrum NONE +SET_SIM_PARAMETER c_dcm_clkgen_startup_wait FALSE +SET_SIM_PARAMETER c_dcm_clkgen_clk_out1_port CLKFX +SET_SIM_PARAMETER c_dcm_clkgen_clk_out2_port CLKFX +SET_SIM_PARAMETER c_dcm_clkgen_clk_out3_port NONE +SET_SIM_PARAMETER c_clock_mgr_type AUTO +SET_SIM_PARAMETER c_override_mmcm 0 +SET_SIM_PARAMETER c_override_pll 0 +SET_SIM_PARAMETER c_override_dcm 0 +SET_SIM_PARAMETER c_override_dcm_clkgen 0 +SET_SIM_PARAMETER c_dcm_pll_cascade NONE +SET_SIM_PARAMETER c_primary_port CLK_IN1 +SET_SIM_PARAMETER c_secondary_port CLK_IN2 +SET_SIM_PARAMETER c_clk_out1_port CLK_OUT1 +SET_SIM_PARAMETER c_clk_out2_port CLK_OUT2 +SET_SIM_PARAMETER c_clk_out3_port CLK_OUT3 +SET_SIM_PARAMETER c_clk_out4_port CLK_OUT4 +SET_SIM_PARAMETER c_clk_out5_port CLK_OUT5 +SET_SIM_PARAMETER c_clk_out6_port CLK_OUT6 +SET_SIM_PARAMETER c_clk_out7_port CLK_OUT7 +SET_SIM_PARAMETER c_reset_port RESET +SET_SIM_PARAMETER c_locked_port LOCKED +SET_SIM_PARAMETER c_clkfb_in_port CLKFB_IN +SET_SIM_PARAMETER c_clkfb_in_p_port CLKFB_IN_P +SET_SIM_PARAMETER c_clkfb_in_n_port CLKFB_IN_N +SET_SIM_PARAMETER c_clkfb_out_port CLKFB_OUT +SET_SIM_PARAMETER c_clkfb_out_p_port CLKFB_OUT_P +SET_SIM_PARAMETER c_clkfb_out_n_port CLKFB_OUT_N +SET_SIM_PARAMETER c_power_down_port POWER_DOWN +SET_SIM_PARAMETER c_daddr_port DADDR +SET_SIM_PARAMETER c_dclk_port DCLK +SET_SIM_PARAMETER c_drdy_port DRDY +SET_SIM_PARAMETER c_dwe_port DWE +SET_SIM_PARAMETER c_din_port DIN +SET_SIM_PARAMETER c_dout_port DOUT +SET_SIM_PARAMETER c_den_port DEN +SET_SIM_PARAMETER c_psclk_port PSCLK +SET_SIM_PARAMETER c_psen_port PSEN +SET_SIM_PARAMETER c_psincdec_port PSINCDEC +SET_SIM_PARAMETER c_psdone_port PSDONE +SET_SIM_PARAMETER c_clk_valid_port CLK_VALID +SET_SIM_PARAMETER c_status_port STATUS +SET_SIM_PARAMETER c_clk_in_sel_port CLK_IN_SEL +SET_SIM_PARAMETER c_input_clk_stopped_port INPUT_CLK_STOPPED +SET_SIM_PARAMETER c_clkfb_stopped_port CLKFB_STOPPED +SET_SIM_PARAMETER c_clkin1_jitter_ps 200.0 +SET_SIM_PARAMETER c_clkin2_jitter_ps 100.0 +SET_SIM_PARAMETER c_primitive MMCM +SET_SIM_PARAMETER c_ss_mode CENTER_HIGH +SET_SIM_PARAMETER c_ss_mod_period 4000 +SET_CORE_NAME Clocking Wizard +SET_CORE_VERSION 3.6 +SET_CORE_VLNV xilinx.com:ip:clk_wiz:3.6 +SET_CORE_CLASS com.xilinx.ip.clk_wiz_v3_6.clk_wiz_v3_6 +SET_CORE_PATH /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6 +SET_CORE_GUIPATH /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6/gui/clk_wiz_v3_6.tcl +SET_CORE_DATASHEET /opt/Xilinx/14.7/ISE_DS/ISE/coregen/ip/xilinx/primary/com/xilinx/ip/clk_wiz_v3_6/doc/pg065_clk_wiz.pdf +ADD_CORE_DOCUMENT +ADD_CORE_DOCUMENT +ADD_CORE_DOCUMENT diff --git a/mb/.metadata/.lock b/mb/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/mb/.metadata/.plugins/com.xilinx.sdk.hw/dialog_settings.xml b/mb/.metadata/.plugins/com.xilinx.sdk.hw/dialog_settings.xml new file mode 100644 index 0000000..39cb11d --- /dev/null +++ b/mb/.metadata/.plugins/com.xilinx.sdk.hw/dialog_settings.xml @@ -0,0 +1,4 @@ + +
+ +
diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.codan.ui/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.cdt.codan.ui/dialog_settings.xml new file mode 100644 index 0000000..bad736e --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.codan.ui/dialog_settings.xml @@ -0,0 +1,4 @@ + +
+ +
diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics.1600550500723.pdom b/mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics.1600550500723.pdom new file mode 100644 index 0000000000000000000000000000000000000000..820016dc7e60e17d8ffcb9abbe73795bb2475986 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics_bsp.1600550481305.pdom b/mb/.metadata/.plugins/org.eclipse.cdt.core/Graphics_bsp.1600550481305.pdom new file mode 100644 index 0000000000000000000000000000000000000000..dca1ab3479a3b1364e22cd2d3a9f698595277b5d GIT binary patch literal 729088 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°=^|~MqPp!kR>{?^! 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml new file mode 100644 index 0000000..5ca0b77 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml @@ -0,0 +1,3 @@ + +

+
diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml b/mb/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml new file mode 100644 index 0000000..ee11f9a --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/mb/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 0000000..1855495 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,17 @@ + +
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/15/20a916bbf2f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/15/20a916bbf2f8001a1591e56b2da69a2d new file mode 100644 index 0000000..ac9d80c --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/15/20a916bbf2f8001a1591e56b2da69a2d @@ -0,0 +1,208 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/16/307548faf5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/16/307548faf5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..81aa6a4 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/16/307548faf5f8001a1591e56b2da69a2d @@ -0,0 +1,212 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + Xint16 temp = (y << 8); + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/1e/506725ceebf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/1e/506725ceebf9001a1594f754340f23a0 new file mode 100644 index 0000000..fd3e611 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/1e/506725ceebf9001a1594f754340f23a0 @@ -0,0 +1,252 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/29/c0b2566ebdfa001a16bcb0432cb239eb b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/29/c0b2566ebdfa001a16bcb0432cb239eb new file mode 100644 index 0000000..8968a97 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/29/c0b2566ebdfa001a16bcb0432cb239eb @@ -0,0 +1,268 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < (80+24); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2d/006e0b7af3f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2d/006e0b7af3f9001a1594f754340f23a0 new file mode 100644 index 0000000..2a7c527 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2d/006e0b7af3f9001a1594f754340f23a0 @@ -0,0 +1,264 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 3) + background) << 8; + } else { + properties = ((background << 3) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2e/f0ada384f3f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2e/f0ada384f3f9001a1594f754340f23a0 new file mode 100644 index 0000000..de84024 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2e/f0ada384f3f9001a1594f754340f23a0 @@ -0,0 +1,266 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 3) + background) << 8; + } else { + properties = ((background << 3) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e07ac67ce9f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e07ac67ce9f9001a1594f754340f23a0 new file mode 100644 index 0000000..ee8b7a7 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e07ac67ce9f9001a1594f754340f23a0 @@ -0,0 +1,247 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reverse = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void set_foreground(Xint8 color) { + foreground = color; + + XIOModule_DiscreteWrite(&gpo, 3, (reverse << 7) + (background << 4) + (foreground << 1) + 0); +} + +void set_background(Xint8 color) { + background = color; + + XIOModule_DiscreteWrite(&gpo, 3, (reverse << 7) + (background << 4) + (foreground << 1) + 0); +} + +void reverse(u8 enable) { + reversed = 0; + + XIOModule_DiscreteWrite(&gpo, 3, (reverse << 7) + (background << 4) + (foreground << 1) + 0); +} + + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/32/904df402eaf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/32/904df402eaf9001a1594f754340f23a0 new file mode 100644 index 0000000..a068a68 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/32/904df402eaf9001a1594f754340f23a0 @@ -0,0 +1,252 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = 0; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/40/b0e30a03f6f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/40/b0e30a03f6f8001a1591e56b2da69a2d new file mode 100644 index 0000000..3060cdb --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/40/b0e30a03f6f8001a1591e56b2da69a2d @@ -0,0 +1,213 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/42/9026d6c2f2f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/42/9026d6c2f2f8001a1591e56b2da69a2d new file mode 100644 index 0000000..b82e8f5 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/42/9026d6c2f2f8001a1591e56b2da69a2d @@ -0,0 +1,208 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, y << 8 + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/47/d023e48af3f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/47/d023e48af3f8001a1591e56b2da69a2d new file mode 100644 index 0000000..47ef832 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/47/d023e48af3f8001a1591e56b2da69a2d @@ -0,0 +1,208 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/48/40f584f1f5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/48/40f584f1f5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..9bcdd39 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/48/40f584f1f5f8001a1591e56b2da69a2d @@ -0,0 +1,210 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + Xint16 temp = (y << 8); + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/4d/407df999cbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/4d/407df999cbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..ceef6a3 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/4d/407df999cbf6001a1baecb89e4fed027 @@ -0,0 +1,202 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + + int i; + for (i = 1; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0d0d38bcbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0d0d38bcbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..559b143 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/5/d0d0d38bcbf6001a1baecb89e4fed027 @@ -0,0 +1,199 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + + int i; + for (i = 0; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + commit(); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + int i; + for (i = 0; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + commit(); + } +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/55/a06a718beef9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/55/a06a718beef9001a1594f754340f23a0 new file mode 100644 index 0000000..6a6bb79 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/55/a06a718beef9001a1594f754340f23a0 @@ -0,0 +1,256 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/d08dccc1faf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/d08dccc1faf9001a1594f754340f23a0 new file mode 100644 index 0000000..4700a28 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/d08dccc1faf9001a1594f754340f23a0 @@ -0,0 +1,268 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/f0ade47cfcf8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/f0ade47cfcf8001a1591e56b2da69a2d new file mode 100644 index 0000000..d5a3624 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/59/f0ade47cfcf8001a1591e56b2da69a2d @@ -0,0 +1,230 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } + if (escape_parameter_1 == 7) { + reverse(1); + } + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/62/109d196ee9f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/62/109d196ee9f9001a1594f754340f23a0 new file mode 100644 index 0000000..d10d775 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/62/109d196ee9f9001a1594f754340f23a0 @@ -0,0 +1,232 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/64/500397c5faf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/64/500397c5faf9001a1594f754340f23a0 new file mode 100644 index 0000000..dc9ff18 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/64/500397c5faf9001a1594f754340f23a0 @@ -0,0 +1,268 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) {x + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/6b/40bd6ed0faf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/6b/40bd6ed0faf9001a1594f754340f23a0 new file mode 100644 index 0000000..09b92d1 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/6b/40bd6ed0faf9001a1594f754340f23a0 @@ -0,0 +1,268 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) {x + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < (80+24); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/7b/304a29e3f1f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/7b/304a29e3f1f9001a1594f754340f23a0 new file mode 100644 index 0000000..87cce62 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/7b/304a29e3f1f9001a1594f754340f23a0 @@ -0,0 +1,260 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8/4025aea1cbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8/4025aea1cbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..d130826 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8/4025aea1cbf6001a1baecb89e4fed027 @@ -0,0 +1,204 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + + int i; + for (i = 1; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/81/403f3f97cbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/81/403f3f97cbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..57f473a --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/81/403f3f97cbf6001a1baecb89e4fed027 @@ -0,0 +1,202 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + + int i; + for (i = 0; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 0; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/83/305bbca1eef9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/83/305bbca1eef9001a1594f754340f23a0 new file mode 100644 index 0000000..b9733da --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/83/305bbca1eef9001a1594f754340f23a0 @@ -0,0 +1,258 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8a/1060b65e03f9001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8a/1060b65e03f9001a1591e56b2da69a2d new file mode 100644 index 0000000..4fd03a0 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8a/1060b65e03f9001a1591e56b2da69a2d @@ -0,0 +1,231 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b03c3ee1e9f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b03c3ee1e9f9001a1594f754340f23a0 new file mode 100644 index 0000000..9e1e645 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b03c3ee1e9f9001a1594f754340f23a0 @@ -0,0 +1,248 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void set_foreground(Xint8 color) { + foreground = color; + + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_background(Xint8 color) { + background = color; + + XIOModule_DiscreteWrite(&gpo, 3, (reversed << 7) + (background << 4) + (foreground << 1) + 0); +} + +void reverse(u8 enable) { + reversed = 0; + + XIOModule_DiscreteWrite(&gpo, 3, (reversed << 7) + (background << 4) + (foreground << 1) + 0); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/9f/30387ff6f5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/9f/30387ff6f5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..a0e456d --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/9f/30387ff6f5f8001a1591e56b2da69a2d @@ -0,0 +1,211 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a/30342cfdf5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a/30342cfdf5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..cc5234c --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a/30342cfdf5f8001a1591e56b2da69a2d @@ -0,0 +1,213 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a8/309ae6a801f9001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a8/309ae6a801f9001a1591e56b2da69a2d new file mode 100644 index 0000000..4468200 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/a8/309ae6a801f9001a1591e56b2da69a2d @@ -0,0 +1,230 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/af/b027dbd12dfc001a1d38c6f066e572ed b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/af/b027dbd12dfc001a1d38c6f066e572ed new file mode 100644 index 0000000..52392c6 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/af/b027dbd12dfc001a1d38c6f066e572ed @@ -0,0 +1,265 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + for (int y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (int x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + for (int i = x; i < (80+24); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b0/40ccb57bcaf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b0/40ccb57bcaf6001a1baecb89e4fed027 new file mode 100644 index 0000000..e411712 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b0/40ccb57bcaf6001a1baecb89e4fed027 @@ -0,0 +1,198 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 2); + XIOModule_DiscreteClear(&gpo, 3, 2); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + + int i; + for (i = 0; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + commit(); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + int i; + for (i = 0; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + commit(); + } +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b7/d09455cfe9f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b7/d09455cfe9f9001a1594f754340f23a0 new file mode 100644 index 0000000..a0b871c --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b7/d09455cfe9f9001a1594f754340f23a0 @@ -0,0 +1,246 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void set_foreground(Xint8 color) { + foreground = color; + + XIOModule_DiscreteWrite(&gpo, 3, (reversed << 7) + (background << 4) + (foreground << 1) + 0); +} + +void set_background(Xint8 color) { + background = color; + + XIOModule_DiscreteWrite(&gpo, 3, (reversed << 7) + (background << 4) + (foreground << 1) + 0); +} + +void reverse(u8 enable) { + reversed = 0; + + XIOModule_DiscreteWrite(&gpo, 3, (reversed << 7) + (background << 4) + (foreground << 1) + 0); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b9/203e4dede9f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b9/203e4dede9f9001a1594f754340f23a0 new file mode 100644 index 0000000..a068a68 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/b9/203e4dede9f9001a1594f754340f23a0 @@ -0,0 +1,252 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = 0; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a087dfd72dfc001a1d38c6f066e572ed b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a087dfd72dfc001a1d38c6f066e572ed new file mode 100644 index 0000000..c6721bf --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a087dfd72dfc001a1d38c6f066e572ed @@ -0,0 +1,267 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int y; + int x; + for (y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + for (int i = x; i < (80+24); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bb/e0bf3d9bf6f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bb/e0bf3d9bf6f8001a1591e56b2da69a2d new file mode 100644 index 0000000..e1804aa --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bb/e0bf3d9bf6f8001a1591e56b2da69a2d @@ -0,0 +1,212 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/be/40cd6993cbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/be/40cd6993cbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..337877f --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/be/40cd6993cbf6001a1baecb89e4fed027 @@ -0,0 +1,202 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + + int i; + for (i = 0; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + commit(); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 0; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bf/a0337580cbf6001a1baecb89e4fed027 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bf/a0337580cbf6001a1baecb89e4fed027 new file mode 100644 index 0000000..54258cd --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/bf/a0337580cbf6001a1baecb89e4fed027 @@ -0,0 +1,198 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + + int i; + for (i = 0; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + commit(); + } + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + int i; + for (i = 0; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + commit(); + } +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/cd/305a6603f3f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/cd/305a6603f3f9001a1594f754340f23a0 new file mode 100644 index 0000000..5eb6da3 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/cd/305a6603f3f9001a1594f754340f23a0 @@ -0,0 +1,264 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((background << 3) + foreground) << 8; + } else { + properties = ((foreground << 3) + background) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ce/4018d09f01f9001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ce/4018d09f01f9001a1591e56b2da69a2d new file mode 100644 index 0000000..dc5a8db --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/ce/4018d09f01f9001a1591e56b2da69a2d @@ -0,0 +1,231 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } + if (escape_parameter_1 == 7) { + reverse(1); + } + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d/60635348f2f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d/60635348f2f8001a1591e56b2da69a2d new file mode 100644 index 0000000..996c8d6 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d/60635348f2f8001a1591e56b2da69a2d @@ -0,0 +1,205 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d3/20aec944f7f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d3/20aec944f7f8001a1591e56b2da69a2d new file mode 100644 index 0000000..86b6b16 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d3/20aec944f7f8001a1591e56b2da69a2d @@ -0,0 +1,228 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } + if (escape_parameter_1 == 7) { + reverse(1); + } + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d8/803d3aebf5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d8/803d3aebf5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..a06aa99 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/d8/803d3aebf5f8001a1591e56b2da69a2d @@ -0,0 +1,209 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/de/902d4436ebf9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/de/902d4436ebf9001a1594f754340f23a0 new file mode 100644 index 0000000..9efcaa2 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/de/902d4436ebf9001a1594f754340f23a0 @@ -0,0 +1,252 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = 0; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20afbe7eeef9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20afbe7eeef9001a1594f754340f23a0 new file mode 100644 index 0000000..8ae3017 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20afbe7eeef9001a1594f754340f23a0 @@ -0,0 +1,256 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + properties = ((reversed << 6) + (background << 3) + foreground) << 8; +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_foreground(escape_parameter_1 - 40); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0c805f3f5f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0c805f3f5f8001a1591e56b2da69a2d new file mode 100644 index 0000000..54762a7 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f0/e0c805f3f5f8001a1591e56b2da69a2d @@ -0,0 +1,212 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f2/80e7b08af3f9001a1594f754340f23a0 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f2/80e7b08af3f9001a1594f754340f23a0 new file mode 100644 index 0000000..da9c5f0 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f2/80e7b08af3f9001a1594f754340f23a0 @@ -0,0 +1,268 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 3) + background) << 8; + } else { + properties = ((background << 3) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f3/d0c67fe9f6f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f3/d0c67fe9f6f8001a1591e56b2da69a2d new file mode 100644 index 0000000..a64fa95 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f3/d0c67fe9f6f8001a1591e56b2da69a2d @@ -0,0 +1,220 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(u8 enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f7/3077b75576f7001a116fc72c51299c73 b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f7/3077b75576f7001a116fc72c51299c73 new file mode 100644 index 0000000..f715316 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f7/3077b75576f7001a116fc72c51299c73 @@ -0,0 +1,205 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < 45*80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = 1; i < (80 - x); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll) + i) % (80*45)); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (x + 80*(y + scroll)) % (80*45)); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_2 - 1; + y = escape_parameter_1 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f9/e0bf90a2f6f8001a1591e56b2da69a2d b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f9/e0bf90a2f6f8001a1591e56b2da69a2d new file mode 100644 index 0000000..965d2be --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/f9/e0bf90a2f6f8001a1591e56b2da69a2d @@ -0,0 +1,220 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void reverse(uint8_t enable) { + if (enable) { + XIOModule_DiscreteSet(&gpo, 3, 2); + } else { + XIOModule_DiscreteClear(&gpo, 3, 2); + } +} + +void clear_screen() { + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < 45; ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < 80; ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + +void clear_eol() { + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < 80; ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.history/fa/70d0696fbdfa001a16bcb0432cb239eb b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/fa/70d0696fbdfa001a16bcb0432cb239eb new file mode 100644 index 0000000..7aa6b73 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.resources/.history/fa/70d0696fbdfa001a16bcb0432cb239eb @@ -0,0 +1,269 @@ +#include +#include + +XIOModule gpo; + +Xint8 x = 0; +Xint8 y = 0; +Xint8 scroll = 0; + +Xint8 reversed = 0; +Xint8 foreground = 0b111; +Xint8 background = 0; + +Xint16 properties = 0; + +void commit() { + XIOModule_DiscreteSet(&gpo, 3, 1); + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void calculate_properties() { + if (reversed) { + properties = ((foreground << 4) + background) << 8; + } else { + properties = ((background << 4) + foreground) << 8; + } +} + +void set_foreground(Xint8 color) { + foreground = color; + + calculate_properties(); +} + +void set_background(Xint8 color) { + background = color; + + calculate_properties(); +} + +void reverse(u8 enable) { + reversed = enable; + + calculate_properties(); +} + +void clear_screen() { + reverse(0); + set_foreground(0b111); + set_background(0); + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, 0); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int x; + int y; + for (y = 0; y < (45+2); ++y) { + Xint16 temp = (y << 8); + for (x = 0; x < (80+24); ++x) { + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + } + } + + XIOModule_DiscreteClear(&gpo, 3, 1); + + x = 0; + y = 0; + scroll = 0; + XIOModule_DiscreteWrite(&gpo, 4, scroll); +} + + +void clear_eol() { + reverse(0); + Xint16 temp = (y << 8); + + XIOModule_DiscreteWrite(&gpo, 1, 0); + XIOModule_DiscreteWrite(&gpo, 2, temp + x); + XIOModule_DiscreteSet(&gpo, 3, 1); + + int i; + for (i = x; i < (80+24); ++i) { + XIOModule_DiscreteWrite(&gpo, 2, temp + i); + } + + XIOModule_DiscreteClear(&gpo, 3, 1); +} + +void write(u8 c) { + XIOModule_DiscreteWrite(&gpo, 1, properties + c); + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + commit(); +} + +void next() { + x++; + if (x >= 80) { + y++; + x %= 80; + } + + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } +} + +// @todo This does not appear to work quite correctly +void previous() { + x--; + if (x < 0) { + y--; + x %= 80; + } + + if (y < 0) { + y = 0; + x = 0; + } +} + +u8 data = 0; +u8 had = 0; +u8 escape = 0; +u8 escape_parameter_1 = 0; +u8 escape_parameter_2 = 0; + + +void clock() { + u8 signals = XIOModule_DiscreteRead(&gpo, 3) & 0b11; + + if (!(signals & 0b01)) { + return; + } + + if (signals & 0b10) { + data = XIOModule_DiscreteRead(&gpo, 1) & 0xFF; + had = 1; + } else if (had) { + had = 0; + + if (escape == 1) { + if (data == '[') { + escape = 2; + } else { + escape = 0; + } + } else if (escape) { + switch (data) { + // For now we are only going to implement what we actually use + case 'K': + // Assume parameter 0 + clear_eol(); + escape = 0; + break; + + case 'H': + if (escape_parameter_1 == 0) { + escape_parameter_1 = 1; + } + + if (escape_parameter_2 == 0) { + escape_parameter_2 = 1; + } + + x = escape_parameter_1 - 1; + y = escape_parameter_2 - 1; + escape = 0; + break; + + case 'm': + if (escape_parameter_1 == 0) { + reverse(0); + set_foreground(0b111); + set_background(0); + } else if (escape_parameter_1 == 7) { + reverse(1); + } else if (escape_parameter_1 >= 30 && escape_parameter_1 <= 37) { + set_foreground(escape_parameter_1 - 30); + } else if (escape_parameter_1 >= 40 && escape_parameter_1 <= 47) { + set_background(escape_parameter_1 - 40); + } else if (escape_parameter_1 >= 90 && escape_parameter_1 <= 97) { + set_foreground(escape_parameter_1 - 90 + 8); + } else if (escape_parameter_1 >= 100 && escape_parameter_1 <= 107) { + set_background(escape_parameter_1 - 100 + 8); + } + escape = 0; + break; + + case 'J': + // Assume parameter 2 + clear_screen(); + escape = 0; + break; + + case '0' ... '9': + escape_parameter_1 *= 10; + escape_parameter_1 += (data - 48); + break; + + case ';': + escape_parameter_2 = escape_parameter_1; + escape_parameter_1 = 0; + break; + + default: + escape = 0; + break; + } + } else { + switch (data) { + case '\n': + y++; + if (y >= 45) { + y--; + scroll = (scroll + 1) % 45; + XIOModule_DiscreteWrite(&gpo, 4, scroll); + clear_eol(); + } + break; + + case '\r': + x = 0; + break; + + case 0x08: + previous(); + break; + + case 0x1B: + escape = 1; + escape_parameter_1 = 0; + escape_parameter_2 = 0; + // Handle escape code + break; + + default: + write(data - 32); + next(); + break; + } + } + XIOModule_DiscreteWrite(&gpo, 2, (y << 8) + x); + } +} + +int main() { + XIOModule_Initialize(&gpo, XPAR_IOMODULE_0_DEVICE_ID); // Initialize the GPO module + + microblaze_register_handler(XIOModule_DeviceInterruptHandler, + XPAR_IOMODULE_0_DEVICE_ID); // register the interrupt handler + + XIOModule_Start(&gpo); // start the GPO module + + XIOModule_Connect(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR, clock, + NULL); // register timerTick() as our interrupt handler + XIOModule_Enable(&gpo, XIN_IOMODULE_GPI_2_INTERRUPT_INTR); // enable the interrupt + + microblaze_enable_interrupts(); // enable global interrupts + + // Clear the screen + clear_screen(); + + while (1) { + + } +} diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/e4/history.index b/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/e4/history.index new file mode 100644 index 0000000000000000000000000000000000000000..665cf3af3a9bb93c4f7d86744f98916f1b70b5dc GIT binary patch literal 2441 zcmeIy`%9Bi7zgmTK{<+34f;$@VPn3j>6B-CPLEo5t<*HY?}lw(otulW4}PRZ={av(ng@0mk*O1b7@~Wbf$fXxZwIaHFSe*qM5q~ zf#UulKKI?)@oY(ZlceO~C*snkuLd9Bt}^QKwfF{f)9WrWZ|@i@Uvw?ynDvdsMaF^n zdEm_M2I9D{a?%N0QCd&j{7BmhUAOC>$6SN1QPz@q*0PEZJvW-VR3`pC2l6LEJzkXH zhF;?Dai-D~_c8g-LT6^E%jc>b(B=KqH8D|E=&p#f^t?f1)w5t9MPNB`?WVU+ zXMpQ0WyD3d0=uBIjuPSu<^BZditoLb$$LKiAgy>F3H@{W#rwjV3r4pnE|LE<*w`}Y zM8fsP!3$%5aEOcN@rs2;=(#@*)A_i#2Iy$ie(3zXmF@9469c5D2Z!OY57u?RE z`9t^0UVwcJIR}U%e^OsbJL9*XRH?I%=5r^OPUoDPWgvw6b!%~ZWSAngi2ss4v#_B*D}g}Yb10AR8# AO8@`> literal 0 HcmV?d00001 diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/properties.index b/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/Graphics/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..cc205108fb18beaa357c2d797f64f31141f3fb9e GIT binary patch literal 535 zcmZ{gJx{|h5QZ-)0}==!Q3k{S1GAMcC+*DFf>`(g$aN0K!m%UADe1q*Nd*$289cp@ z@1A=D00{g$4dM9NvZj)}g-g;{)1Y-b(lCLfLMbW-M{z`>0R~u3h%Z^X$^%)l+5_hk zp!Z>(<%h!^EV4Kb;q2w{;r-rdXN^*5=R6igx*i4vvl?_YdIoSvgBCNP*PwY3!qQkl zkSp1=NOr40m~h7M+t?{9ShYe_4r}PLMRok|fF2AzV$>Yxe1H e82oQa*>bZ*i{%?26Li5oe$gVnY|?0#lFGSWPm6?SOhLZovUKOV^z|=`F1H z@dJPwp4&GGd0^C51=}g`>=6Jqg$32Ef_;*+CmcB|d5q>U33&^8fd-n1RKuBSc4p2!gj67s}1aM2=Zw`tlUip4S(EPMbm_N!x&#Fp(A`uD_Sfe5A!Z@TB{ zo?8GwG2Oa^%cmfHXH|TCiymj?lI6MAU~JF=!ruxjfz^8nQX_^>*4aKRa4GjP2C zKBus4{s~X85`0%e<$^&{z4eh$>4eG!f*YxlJ<@|4_tqSOOxBHnf1#*pFAshG%Pev( z>So)D-F=oSVC}UVp5;KW`8gMP!rw57bVA$!rb*}d-@i=`Xw6G7qm!(X#fBK literal 0 HcmV?d00001 diff --git a/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/hardware/.indexes/properties.index b/mb/.metadata/.plugins/org.eclipse.core.resources/.projects/hardware/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..f58eb3d065cfe107f2339bad46eb0123eddb1655 GIT binary patch literal 194 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 cJ3XTjIhh5;sd~vNC3?yEMX9zWMWv~@6s4pl zm8R>JW+6*irKZ{%nsXh9 k`288|)xgg^)w|1&IndJUX^A<-g#8XtMHA0MjK=MI0B0w&>;M1& literal 0 HcmV?d00001 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..d80fa54 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +macros/workspace=\n\n +org.eclipse.cdt.core.showSourceRootsAtTopLevelOfProject=true diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics.prefs new file mode 100644 index 0000000..2c80fdc --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 +language.settings.providers.disabled=true diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics_bsp.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics_bsp.prefs new file mode 100644 index 0000000..2c80fdc --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-Graphics_bsp.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 +language.settings.providers.disabled=true diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 0000000..b8c9267 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\n\n\n\n\n\n\n\n diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.make.core.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.make.core.prefs new file mode 100644 index 0000000..b2cb58a --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.make.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.make.core.scanner.discovery.console.enabled=false diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..14af7b3 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +properties/LED_Controller.xilinx.gnu.mb.exe.1814969487/xilinx.gnu.mb.exe.debug.32422249=\#\n\#Mon Sep 21 19\:24\:22 CEST 2020\nxilinx.gnu.mb.c.toolchain.linker.debug.963016491\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.compiler.debug.1526133289.453942197\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.32422249.1916704164\=\\\#\\n\\\#Mon Sep 21 19\\\:13\\\:04 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.compiler.debug.1526133289.444111638\=\\\#\\n\\\#Thu Sep 17 17\\\:39\\\:25 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.32422249\=\\\#\\n\\\#Mon Sep 21 19\\\:13\\\:04 CEST 2020\\nrcState\\\=-1\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.compiler.debug.1526133289\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.size.debug.1827824083\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\norg.eclipse.cdt.managedbuilder.ui.rcbs.835513525\=\\\#\\n\\\#Thu Sep 17 17\\\:39\\\:25 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.toolchain.archiver.967447973\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.elfcheck.mb.debug.497589591\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.32422249.1321561043\=\\\#\\n\\\#Thu Sep 17 17\\\:39\\\:25 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.cxx.toolchain.linker.debug.2014002494\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.toolchain.1375698673\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.assembler.debug.503356807\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.cxx.toolchain.compiler.debug.2077065818\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=false\\n\norg.eclipse.cdt.managedbuilder.ui.rcbs.704915466\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:22 CEST 2020\\nrebuildState\\\=true\\n\n +properties/LED_Controller.xilinx.gnu.mb.exe.1814969487/xilinx.gnu.mb.exe.release.1608365019=\#\n\#Mon Sep 21 19\:24\:18 CEST 2020\norg.eclipse.cdt.managedbuilder.ui.rcbs.964590779\=\\\#\\n\\\#Thu Sep 17 17\\\:41\\\:22 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.1363891138.1568151430\=\\\#\\n\\\#Thu Sep 17 17\\\:41\\\:22 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.1363891138.1347973672\=\\\#\\n\\\#Thu Sep 17 17\\\:41\\\:22 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.cxx.toolchain.linker.release.219817069\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.elfcheck.mb.release.2093836222\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\norg.eclipse.cdt.managedbuilder.ui.rcbs.585520295\=\\\#\\n\\\#Thu Sep 17 17\\\:39\\\:56 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.1363891138.188090075\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.cxx.toolchain.compiler.release.623808407\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.release.1608365019\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrcState\\\=0\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.1363891138.1472073695\=\\\#\\n\\\#Thu Sep 17 17\\\:39\\\:56 CEST 2020\\nrebuildState\\\=true\\n\norg.eclipse.cdt.managedbuilder.ui.rcbs.303281880\=\\\#\\n\\\#Thu Sep 17 17\\\:41\\\:22 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.toolchain.archiver.728941664\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.size.release.805765542\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.release.1608365019.2101405724\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.release.toolchain.449620394\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\norg.eclipse.cdt.managedbuilder.ui.rcbs.941823551\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.linker.release.948464890\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.release.1608365019.1177911836\=\\\#\\n\\\#Thu Sep 17 17\\\:41\\\:22 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.assembler.release.1529446162\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.1363891138\=\\\#\\n\\\#Mon Sep 21 19\\\:24\\\:18 CEST 2020\\nrebuildState\\\=false\\n\n +properties/LED_Controller.xilinx.gnu.mb.exe.1958147925/xilinx.gnu.mb.exe.debug.1340360104=\#\n\#Sun Sep 13 01\:13\:41 CEST 2020\nxilinx.gnu.mb.cxx.toolchain.compiler.debug.1718510779\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.elfcheck.mb.debug.1120413088\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.toolchain.archiver.1415277683\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.compiler.debug.284561060\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.1340360104\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:28 CEST 2020\\nrcState\\\=0\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.cxx.toolchain.linker.debug.819611121\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.size.debug.2065098265\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.assembler.debug.1411310899\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.exe.debug.toolchain.2009906249\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\nxilinx.gnu.mb.c.toolchain.linker.debug.1517138700\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:41 CEST 2020\\nrebuildState\\\=false\\n\n +properties/LED_Controller.xilinx.gnu.mb.exe.1958147925/xilinx.gnu.mb.exe.release.183079614=\#\n\#Sun Sep 13 01\:13\:33 CEST 2020\nxilinx.gnu.mb.c.toolchain.assembler.release.39538095\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.elfcheck.mb.release.1610739964\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.cxx.toolchain.compiler.release.1977882343\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.toolchain.archiver.340405373\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.size.release.414266922\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.exe.release.183079614\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.exe.release.toolchain.659377477\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.cxx.toolchain.linker.release.1164015715\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.compiler.release.910828759\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\nxilinx.gnu.mb.c.toolchain.linker.release.105016765\=\\\#\\n\\\#Sun Sep 13 01\\\:13\\\:33 CEST 2020\\nrebuildState\\\=true\\n\n diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 0000000..5e2da66 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-Graphics.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-Graphics.prefs new file mode 100644 index 0000000..82196b4 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prj-Graphics.prefs @@ -0,0 +1,3 @@ +buildConsole/keepLog=true +buildConsole/logLocation=/home/tim/Projects/z80/hdmi-mb/.metadata/.plugins/org.eclipse.cdt.ui/Graphics.build.log +eclipse.preferences.version=1 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..dffc6b5 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..57e3b77 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug;org.eclipse.cdt.cdi.launch.localCLaunch,run +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.remoteApplicationLaunchType=org.eclipse.rse.remotecdt.dsf.debug,debug +eclipse.preferences.version=1 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..a2917e5 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\n\n +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs new file mode 100644 index 0000000..cec65c4 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.search.defaultPerspective=org.eclipse.search.defaultPerspective.none diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.browser.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.browser.prefs new file mode 100644 index 0000000..eff1d89 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.browser.prefs @@ -0,0 +1,2 @@ +browsers=\n\n\n +eclipse.preferences.version=1 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 0000000..61f3bb8 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 0000000..3457147 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,6 @@ +PROBLEMS_FILTERS_MIGRATE=true +TASKS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1599945748943 +quickStart=false +tipsAndTricks=true diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 0000000..62252c0 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,3 @@ +CURRENT_THEME_ID=org.eclipse.ui.ide.systemDefault +eclipse.preferences.version=1 +showIntro=false diff --git a/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..8ceca34 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,7 @@ +ColorsAndFontsPreferencePage.expandedCategories=Torg.eclipse.cdt.ui.presentation\tTorg.eclipse.cdt.ui.CEditor.presentation +ColorsAndFontsPreferencePage.selectedElement=Forg.eclipse.cdt.ui.editors.textfont +eclipse.preferences.version=1 +org.eclipse.cdt.ui.CPerspective_persp=\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n +org.eclipse.ui.commands=\n +org.eclipse.ui.ide.systemDefault.org.eclipse.cdt.ui.editors.textfont=1|Source Code Pro|10.0|0|GTK|1|; +perspectives=org.eclipse.cdt.ui.CPerspective diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.history b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.history new file mode 100644 index 0000000..c82ab7c --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.index b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.index new file mode 100644 index 0000000..e4eb0ce --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/37/refactorings.index @@ -0,0 +1 @@ +1599952443965 Delete 2 resources diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.history b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.history new file mode 100644 index 0000000..7cf410d --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.history @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.index b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.index new file mode 100644 index 0000000..7064137 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/9/38/refactorings.index @@ -0,0 +1,4 @@ +1600550205135 Delete resource 'HDMIGraphics' +1600550416603 Rename resource 'micro_test' +1600550480249 Rename resource 'LED_Controller_bsp' +1600550500535 Rename resource 'LED_Controller' diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.history b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.history new file mode 100644 index 0000000..3d983a6 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.index b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.index new file mode 100644 index 0000000..05e2fad --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/Graphics/2020/9/38/refactorings.index @@ -0,0 +1 @@ +1600551239458 Rename resource 'LEDBlinker.c' diff --git a/mb/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 0000000..27eb404 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/mb/.metadata/.plugins/org.eclipse.search/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.search/dialog_settings.xml new file mode 100644 index 0000000..5138536 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.search/dialog_settings.xml @@ -0,0 +1,6 @@ + +
+
+ +
+
diff --git a/mb/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 0000000..50f1edb --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/mb/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 0000000..36e36c6 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/mb/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml new file mode 100644 index 0000000..0e91340 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml @@ -0,0 +1,30 @@ + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + +
+
diff --git a/mb/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/mb/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 0000000..dcf1e21 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,20 @@ + +
+
+ + +
+
+ + + + +
+
+ + + +
+
+
+
diff --git a/mb/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml b/mb/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml new file mode 100644 index 0000000..0d291c4 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mb/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/mb/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..332e913 --- /dev/null +++ b/mb/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/mb/.metadata/version.ini b/mb/.metadata/version.ini new file mode 100644 index 0000000..c51ff74 --- /dev/null +++ b/mb/.metadata/version.ini @@ -0,0 +1 @@ +org.eclipse.core.runtime=1 \ No newline at end of file diff --git a/mb/hardware/system.xml b/mb/hardware/system.xml index 023c73b..44471b3 100644 --- a/mb/hardware/system.xml +++ b/mb/hardware/system.xml @@ -1,6 +1,6 @@ - + diff --git a/src/main.v b/src/main.v index e43372c..3e7ebe4 100644 --- a/src/main.v +++ b/src/main.v @@ -36,6 +36,8 @@ reg [12:0] raddr; wire [15:0] read_data; wire [255:0] char; +reg cursor; + reg [1:0] control_in; // 0 Correct address // 1 Write @@ -64,7 +66,7 @@ hdmi_encoder #(.Y_RES(HEIGHT), .X_RES(WIDTH), .Y_FRAME(HEIGHT+2*16), .X_FRAME(WI .green(green), .blue(blue) ); - + microblaze_mcs mcs_0 ( .Clk(mclk), // input Clk .Reset(rst), // input Reset @@ -108,7 +110,7 @@ color_map backgroundground_map ( .colorcode(read_data[15:12]), .color(background) ); - + always @(*) begin charx = (x >> 0) % 16; chary = (y >> 0) % 16; @@ -127,17 +129,19 @@ always @(*) begin end else begin control_in[1] = 0; end + + cursor = ((x >> 4) == screen_x) && ((y >> 4) == screen_y); // @todo Instead of doing + 17 we safe space in the char rom if (char[255 - charx - 16*chary] == 1) begin - red = foreground[23:16]; - green = foreground[15:8]; - blue = foreground[7:0]; + red = cursor ? 8'h00 : foreground[23:16]; + green = cursor ? 8'h00 : foreground[15:8]; + blue = cursor ? 8'h00 : foreground[7:0]; end else begin - red = background[23:16]; - green = background[15:8]; - blue = background[7:0]; + red = cursor ? 8'hAA : background[23:16]; + green = cursor ? 8'hAA : background[15:8]; + blue = cursor ? 8'hAA : background[7:0]; end end -endmodule \ No newline at end of file +endmodule diff --git a/syn/main.ut b/syn/main.ut index 0a46560..80a7b4c 100644 --- a/syn/main.ut +++ b/syn/main.ut @@ -1,4 +1,4 @@ --bd "/home/tim/Projects/z80/hdmi-mb/Graphics/Release/Graphics.elf" tag microblaze_mcs +-bd "/home/tim/Projects/z80/hdmi/mb/Graphics/Release/Graphics.elf" tag microblaze_mcs -w -g Binary:yes -g Compress