summaryrefslogtreecommitdiff
path: root/sim/ucsim/cmd.src
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/cmd.src
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/cmd.src')
-rw-r--r--sim/ucsim/cmd.src/(c).125
-rw-r--r--sim/ucsim/cmd.src/Makefile137
-rw-r--r--sim/ucsim/cmd.src/Makefile.dep171
-rw-r--r--sim/ucsim/cmd.src/Makefile.in137
-rw-r--r--sim/ucsim/cmd.src/clean.mk30
-rw-r--r--sim/ucsim/cmd.src/cmd_bp.cc393
-rw-r--r--sim/ucsim/cmd.src/cmd_bp.obin0 -> 103280 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_bpcl.h70
-rw-r--r--sim/ucsim/cmd.src/cmd_conf.cc152
-rw-r--r--sim/ucsim/cmd.src/cmd_conf.obin0 -> 52160 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_confcl.h58
-rw-r--r--sim/ucsim/cmd.src/cmd_exec.cc542
-rw-r--r--sim/ucsim/cmd.src/cmd_exec.obin0 -> 145672 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_execcl.h60
-rw-r--r--sim/ucsim/cmd.src/cmd_get.cc147
-rw-r--r--sim/ucsim/cmd.src/cmd_get.obin0 -> 42528 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_getcl.h68
-rw-r--r--sim/ucsim/cmd.src/cmd_gui.cc91
-rw-r--r--sim/ucsim/cmd.src/cmd_gui.obin0 -> 35784 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_guicl.h45
-rw-r--r--sim/ucsim/cmd.src/cmd_info.cc266
-rw-r--r--sim/ucsim/cmd.src/cmd_info.obin0 -> 81024 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_infocl.h57
-rw-r--r--sim/ucsim/cmd.src/cmd_mem.cc516
-rw-r--r--sim/ucsim/cmd.src/cmd_mem.obin0 -> 153288 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_memcl.h61
-rw-r--r--sim/ucsim/cmd.src/cmd_set.cc401
-rw-r--r--sim/ucsim/cmd.src/cmd_set.obin0 -> 102696 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_setcl.h57
-rw-r--r--sim/ucsim/cmd.src/cmd_show.cc278
-rw-r--r--sim/ucsim/cmd.src/cmd_show.obin0 -> 100448 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_showcl.h54
-rw-r--r--sim/ucsim/cmd.src/cmd_stat.cc123
-rw-r--r--sim/ucsim/cmd.src/cmd_stat.obin0 -> 41536 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_statcl.h44
-rw-r--r--sim/ucsim/cmd.src/cmd_timer.cc326
-rw-r--r--sim/ucsim/cmd.src/cmd_timer.obin0 -> 98704 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_timercl.h58
-rw-r--r--sim/ucsim/cmd.src/cmd_uc.cc861
-rw-r--r--sim/ucsim/cmd.src/cmd_uc.obin0 -> 221728 bytes
-rw-r--r--sim/ucsim/cmd.src/cmd_uccl.h60
-rw-r--r--sim/ucsim/cmd.src/cmdlex.cc2093
-rw-r--r--sim/ucsim/cmd.src/cmdlex.l182
-rw-r--r--sim/ucsim/cmd.src/cmdlex.obin0 -> 66360 bytes
-rw-r--r--sim/ucsim/cmd.src/cmdlexcl.h9
-rw-r--r--sim/ucsim/cmd.src/cmdpars.cc2154
-rw-r--r--sim/ucsim/cmd.src/cmdpars.hh176
-rw-r--r--sim/ucsim/cmd.src/cmdpars.obin0 -> 75208 bytes
-rw-r--r--sim/ucsim/cmd.src/cmdpars.y418
-rw-r--r--sim/ucsim/cmd.src/cmdutil.cc178
-rw-r--r--sim/ucsim/cmd.src/cmdutil.h47
-rw-r--r--sim/ucsim/cmd.src/cmdutil.obin0 -> 26840 bytes
-rw-r--r--sim/ucsim/cmd.src/command.cc925
-rw-r--r--sim/ucsim/cmd.src/command.obin0 -> 183152 bytes
-rw-r--r--sim/ucsim/cmd.src/commandcl.h276
-rw-r--r--sim/ucsim/cmd.src/conf.mk12
-rw-r--r--sim/ucsim/cmd.src/newcmd.cc935
-rw-r--r--sim/ucsim/cmd.src/newcmd.obin0 -> 190640 bytes
-rw-r--r--sim/ucsim/cmd.src/newcmdcl.h269
-rw-r--r--sim/ucsim/cmd.src/newcmdposix.cc696
-rw-r--r--sim/ucsim/cmd.src/newcmdposix.obin0 -> 142336 bytes
-rw-r--r--sim/ucsim/cmd.src/newcmdposixcl.h133
-rw-r--r--sim/ucsim/cmd.src/syntax.cc31
-rw-r--r--sim/ucsim/cmd.src/syntax.obin0 -> 1264 bytes
-rw-r--r--sim/ucsim/cmd.src/syntaxcl.h33
65 files changed, 13855 insertions, 0 deletions
diff --git a/sim/ucsim/cmd.src/(c).1 b/sim/ucsim/cmd.src/(c).1
new file mode 100644
index 0000000..3fbc039
--- /dev/null
+++ b/sim/ucsim/cmd.src/(c).1
@@ -0,0 +1,25 @@
+/*
+ * Simulator of microcontrollers (cmd.src/@@F@@)
+ *
+ * Copyright (C) @@S@@,@@Y@@ Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
diff --git a/sim/ucsim/cmd.src/Makefile b/sim/ucsim/cmd.src/Makefile
new file mode 100644
index 0000000..16943dd
--- /dev/null
+++ b/sim/ucsim/cmd.src/Makefile
@@ -0,0 +1,137 @@
+#
+# ucsim cmd.src/Makefile
+#
+# (c) Drotos Daniel, Talker Bt. 1997
+#
+
+STARTYEAR = 1997
+
+SHELL = /bin/sh
+CXX = g++
+CPP = gcc -E
+CXXCPP = g++ -E
+RANLIB = ranlib
+INSTALL = /usr/bin/install -c
+MAKEDEP = g++ -MM
+AR = ar
+
+LEX = flex
+YACC = bison -y
+
+top_builddir = ..
+top_srcdir = ..
+
+DEFS = $(subs -DHAVE_CONFIG_H,,-DHAVE_CONFIG_H)
+CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -I$(top_builddir) \
+ -I$(top_srcdir)/sim.src -I$(top_srcdir)/gui.src
+CFLAGS = -g -O2 -Wall
+CXXFLAGS = -g -O2 -g -Wall
+WINSOCK_AVAIL = 0
+
+prefix = /usr/local
+exec_prefix = ${prefix}
+bindir = ${exec_prefix}/bin
+libdir = ${exec_prefix}/lib
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+includedir = ${prefix}/include
+mandir = ${datarootdir}/man
+man1dir = $(mandir)/man1
+man2dir = $(mandir)/man2
+infodir = ${datarootdir}/info
+srcdir = .
+
+
+OBJECTS = command.o cmdutil.o syntax.o newcmd.o newcmdposix.o\
+ cmd_exec.o cmd_get.o cmd_set.o cmd_timer.o cmd_bp.o \
+ cmd_info.o cmd_show.o cmd_gui.o \
+ cmd_conf.o cmd_uc.o cmd_stat.o cmd_mem.o
+
+#ifeq ($(WINSOCK_AVAIL), 1)
+#OBJECTS += newcmdwin32.o
+#else
+#OBJECTS += newcmdposix.o
+#endif
+
+LOCAL_OBJECTS = cmdpars.o cmdlex.o
+
+SOURCES = $(addprefix $(srcdir)/, $(OBJECTS:.o=.cc))
+LOCAL_SOURCES = $(LOCAL_OBJECTS:.o=.cc)
+
+# Compiling entire program or any subproject
+# ------------------------------------------
+all: checkconf cmdlib
+
+cmd.src: all
+
+
+# Compiling and installing everything and runing test
+# ---------------------------------------------------
+install: all installdirs
+
+
+# Deleting all the installed files
+# --------------------------------
+uninstall:
+
+
+# Performing self-test
+# --------------------
+check:
+
+test:
+
+
+# Performing installation test
+# ----------------------------
+installcheck:
+
+
+# Creating installation directories
+# ---------------------------------
+installdirs:
+
+
+# Creating dependencies
+# ---------------------
+dep: $(LOCAL_SOURCES) Makefile.dep
+
+Makefile.dep: $(SOURCES) $(LOCAL_SOURCES) $(srcdir)/*.h cmdpars.hh cmdpars.cc
+ $(MAKEDEP) $(CPPFLAGS) $(SOURCES) $(LOCAL_SOURCES) >Makefile.dep
+
+-include Makefile.dep
+include $(srcdir)/clean.mk
+
+cmdlex.cc: cmdlex.l cmdpars.hh
+
+# My rules
+# --------
+
+cmdlib: $(top_builddir)/libcmd.a
+
+$(top_builddir)/libcmd.a: $(OBJECTS) $(LOCAL_OBJECTS)
+ $(AR) -rc $@ $(OBJECTS) $(LOCAL_OBJECTS)
+ $(RANLIB) $@
+
+.cc.o:
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
+
+cmdpars.hh: cmdpars.cc
+
+cmdpars.cc: cmdpars.y
+ $(YACC) -d $<
+ mv y.tab.c $*.cc
+ mv y.tab.h $*.hh
+
+.l.cc:
+ rm -f $@
+ $(LEX) -t $< > $@
+
+# Remaking configuration
+# ----------------------
+checkconf:
+ @if [ -f $(top_builddir)/devel ]; then\
+ $(MAKE) -C $(top_builddir) -f conf.mk srcdir="$(srcdir)" top_builddir="$(top_builddir)" freshconf;\
+ fi
+
+# End of cmd.src/Makefile.in
diff --git a/sim/ucsim/cmd.src/Makefile.dep b/sim/ucsim/cmd.src/Makefile.dep
new file mode 100644
index 0000000..7a0b2f1
--- /dev/null
+++ b/sim/ucsim/cmd.src/Makefile.dep
@@ -0,0 +1,171 @@
+command.o: command.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../fiocl.h ../charscl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../utils.h \
+ ../stypes.h ../fiocl.h ../appcl.h ../optioncl.h ../sim.src/argcl.h \
+ ../pobjcl.h ../stypes.h ../sim.src/simcl.h newcmdcl.h ../optioncl.h \
+ commandcl.h newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h \
+ ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h \
+ ../sim.src/guiobjcl.h newcmdposixcl.h cmdutil.h ../sim.src/memcl.h \
+ ../eventcl.h ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h \
+ ../sim.src/varcl.h ../sim.src/uccl_instructions.h ../sim.src/argcl.h
+cmdutil.o: cmdutil.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../stypes.h ../globals.h ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h \
+ ../eventcl.h ../charscl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../sim.src/uccl.h
+syntax.o: syntax.cc syntaxcl.h
+newcmd.o: newcmd.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../globals.h ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h \
+ ../charscl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ ../appcl.h
+newcmdposix.o: newcmdposix.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../globals.h ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h \
+ ../charscl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ ../appcl.h newcmdposixcl.h
+cmd_exec.o: cmd_exec.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../utils.h ../stypes.h ../charscl.h ../fiocl.h ../pobjcl.h ../pobjt.h \
+ ../eventcl.h ../globals.h ../appcl.h ../optioncl.h ../sim.src/argcl.h \
+ ../pobjcl.h ../stypes.h ../sim.src/simcl.h newcmdcl.h ../optioncl.h \
+ commandcl.h newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h \
+ ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h \
+ ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h cmdutil.h \
+ ../sim.src/memcl.h ../eventcl.h ../errorcl.h ../sim.src/brkcl.h \
+ ../sim.src/stackcl.h ../sim.src/varcl.h ../sim.src/uccl_instructions.h \
+ ../sim.src/argcl.h ../sim.src/uccl.h cmd_execcl.h
+cmd_get.o: cmd_get.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../utils.h ../stypes.h ../charscl.h ../fiocl.h ../pobjcl.h ../pobjt.h \
+ ../eventcl.h ../appcl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h \
+ ../stypes.h ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h \
+ newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h cmd_getcl.h
+cmd_set.o: cmd_set.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../errorcl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h \
+ ../stypes.h ../appcl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h \
+ ../stypes.h ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h \
+ newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h cmd_setcl.h
+cmd_timer.o: cmd_timer.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../sim.src/simcl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h \
+ newcmdcl.h ../optioncl.h ../pobjcl.h ../stypes.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../stypes.h ../pobjt.h ../sim.src/hwcl.h \
+ ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h cmdutil.h \
+ ../sim.src/memcl.h ../eventcl.h ../errorcl.h ../sim.src/brkcl.h \
+ ../sim.src/stackcl.h ../sim.src/varcl.h ../sim.src/uccl_instructions.h \
+ ../sim.src/argcl.h cmd_timercl.h
+cmd_bp.o: cmd_bp.cc ../ddconfig.h ../sim.src/brkcl.h ../pobjcl.h \
+ ../ddconfig.h ../pobjt.h ../eventcl.h ../charscl.h ../stypes.h \
+ ../sim.src/memcl.h ../sim.src/guiobjcl.h ../eventcl.h ../errorcl.h \
+ ../pobjcl.h ../stypes.h ../sim.src/argcl.h ../sim.src/simcl.h newcmdcl.h \
+ ../optioncl.h commandcl.h newcmdcl.h ../gui.src/guicl.h \
+ ../gui.src/ifcl.h ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h \
+ ../sim.src/hwcl.h newcmdposixcl.h ../fiocl.h cmdutil.h \
+ ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h cmd_bpcl.h
+cmd_info.o: cmd_info.cc ../i_string.h ../ddconfig.h ../sim.src/simcl.h \
+ ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h newcmdcl.h \
+ ../ddconfig.h ../optioncl.h ../pobjcl.h ../stypes.h commandcl.h \
+ newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../stypes.h ../pobjt.h ../sim.src/hwcl.h \
+ ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h cmdutil.h \
+ ../sim.src/memcl.h ../eventcl.h ../errorcl.h ../sim.src/brkcl.h \
+ ../sim.src/stackcl.h ../sim.src/varcl.h ../sim.src/uccl_instructions.h \
+ ../sim.src/argcl.h cmd_infocl.h
+cmd_show.o: cmd_show.cc ../ddconfig.h ../i_string.h ../ddconfig.h \
+ ../globals.h ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h \
+ ../charscl.h ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ cmd_showcl.h newcmdposixcl.h
+cmd_gui.o: cmd_gui.cc ../ddconfig.h ../globals.h ../ddconfig.h \
+ ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h \
+ ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h cmd_guicl.h
+cmd_conf.o: cmd_conf.cc ../globals.h ../ddconfig.h ../stypes.h ../appcl.h \
+ ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h ../optioncl.h \
+ ../sim.src/argcl.h ../pobjcl.h ../stypes.h ../sim.src/simcl.h newcmdcl.h \
+ ../ddconfig.h ../optioncl.h commandcl.h newcmdcl.h ../gui.src/guicl.h \
+ ../gui.src/ifcl.h ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h \
+ ../sim.src/hwcl.h ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h \
+ cmdutil.h ../sim.src/memcl.h ../eventcl.h ../errorcl.h \
+ ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ cmd_confcl.h
+cmd_uc.o: cmd_uc.cc ../globals.h ../ddconfig.h ../stypes.h ../appcl.h \
+ ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h ../optioncl.h \
+ ../sim.src/argcl.h ../pobjcl.h ../stypes.h ../sim.src/simcl.h newcmdcl.h \
+ ../ddconfig.h ../optioncl.h commandcl.h newcmdcl.h ../gui.src/guicl.h \
+ ../gui.src/ifcl.h ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h \
+ ../sim.src/hwcl.h ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h \
+ cmdutil.h ../sim.src/memcl.h ../eventcl.h ../errorcl.h \
+ ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ ../sim.src/uccl.h cmd_uccl.h
+cmd_stat.o: cmd_stat.cc ../ddconfig.h ../globals.h ../ddconfig.h \
+ ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h \
+ ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h cmd_statcl.h
+cmd_mem.o: cmd_mem.cc ../globals.h ../ddconfig.h ../stypes.h ../appcl.h \
+ ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h ../optioncl.h \
+ ../sim.src/argcl.h ../pobjcl.h ../stypes.h ../sim.src/simcl.h newcmdcl.h \
+ ../ddconfig.h ../optioncl.h commandcl.h newcmdcl.h ../gui.src/guicl.h \
+ ../gui.src/ifcl.h ../sim.src/guiobjcl.h ../sim.src/uccl.h ../pobjt.h \
+ ../sim.src/hwcl.h ../sim.src/guiobjcl.h newcmdposixcl.h ../fiocl.h \
+ cmdutil.h ../sim.src/memcl.h ../eventcl.h ../errorcl.h \
+ ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h ../utils.h ../fiocl.h \
+ cmd_memcl.h
+cmdpars.o: cmdpars.cc cmdlexcl.h ../sim.src/memcl.h ../ddconfig.h \
+ ../stypes.h ../ddconfig.h ../pobjcl.h ../pobjt.h ../eventcl.h \
+ ../charscl.h ../sim.src/guiobjcl.h ../eventcl.h ../errorcl.h ../pobjcl.h \
+ ../stypes.h ../globals.h ../appcl.h ../optioncl.h ../sim.src/argcl.h \
+ ../sim.src/simcl.h newcmdcl.h ../optioncl.h commandcl.h newcmdcl.h \
+ ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h newcmdposixcl.h \
+ ../fiocl.h cmdutil.h ../sim.src/memcl.h ../sim.src/brkcl.h \
+ ../sim.src/stackcl.h ../sim.src/varcl.h ../sim.src/uccl_instructions.h \
+ ../sim.src/argcl.h
+cmdlex.o: cmdlex.cc cmdlexcl.h cmdpars.hh ../globals.h ../ddconfig.h \
+ ../stypes.h ../appcl.h ../pobjcl.h ../pobjt.h ../eventcl.h ../charscl.h \
+ ../optioncl.h ../sim.src/argcl.h ../pobjcl.h ../stypes.h \
+ ../sim.src/simcl.h newcmdcl.h ../ddconfig.h ../optioncl.h commandcl.h \
+ newcmdcl.h ../gui.src/guicl.h ../gui.src/ifcl.h ../sim.src/guiobjcl.h \
+ ../sim.src/uccl.h ../pobjt.h ../sim.src/hwcl.h ../sim.src/guiobjcl.h \
+ newcmdposixcl.h ../fiocl.h cmdutil.h ../sim.src/memcl.h ../eventcl.h \
+ ../errorcl.h ../sim.src/brkcl.h ../sim.src/stackcl.h ../sim.src/varcl.h \
+ ../sim.src/uccl_instructions.h ../sim.src/argcl.h
diff --git a/sim/ucsim/cmd.src/Makefile.in b/sim/ucsim/cmd.src/Makefile.in
new file mode 100644
index 0000000..d1ff0a6
--- /dev/null
+++ b/sim/ucsim/cmd.src/Makefile.in
@@ -0,0 +1,137 @@
+#
+# ucsim cmd.src/Makefile
+#
+# (c) Drotos Daniel, Talker Bt. 1997
+#
+
+STARTYEAR = 1997
+
+SHELL = /bin/sh
+CXX = @CXX@
+CPP = @CPP@
+CXXCPP = @CXXCPP@
+RANLIB = @RANLIB@
+INSTALL = @INSTALL@
+MAKEDEP = @MAKEDEP@
+AR = @AR@
+
+LEX = @LEX@
+YACC = @YACC@
+
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+DEFS = $(subs -DHAVE_CONFIG_H,,@DEFS@)
+CPPFLAGS = @CPPFLAGS@ -I$(srcdir) -I$(top_srcdir) -I$(top_builddir) \
+ -I$(top_srcdir)/sim.src -I$(top_srcdir)/gui.src
+CFLAGS = @CFLAGS@ @WALL_FLAG@
+CXXFLAGS = @CXXFLAGS@ @WALL_FLAG@
+WINSOCK_AVAIL = @WINSOCK_AVAIL@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+includedir = @includedir@
+mandir = @mandir@
+man1dir = $(mandir)/man1
+man2dir = $(mandir)/man2
+infodir = @infodir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+OBJECTS = command.o cmdutil.o syntax.o newcmd.o newcmdposix.o\
+ cmd_exec.o cmd_get.o cmd_set.o cmd_timer.o cmd_bp.o \
+ cmd_info.o cmd_show.o cmd_gui.o \
+ cmd_conf.o cmd_uc.o cmd_stat.o cmd_mem.o
+
+#ifeq ($(WINSOCK_AVAIL), 1)
+#OBJECTS += newcmdwin32.o
+#else
+#OBJECTS += newcmdposix.o
+#endif
+
+LOCAL_OBJECTS = cmdpars.o cmdlex.o
+
+SOURCES = $(addprefix $(srcdir)/, $(OBJECTS:.o=.cc))
+LOCAL_SOURCES = $(LOCAL_OBJECTS:.o=.cc)
+
+# Compiling entire program or any subproject
+# ------------------------------------------
+all: checkconf cmdlib
+
+cmd.src: all
+
+
+# Compiling and installing everything and runing test
+# ---------------------------------------------------
+install: all installdirs
+
+
+# Deleting all the installed files
+# --------------------------------
+uninstall:
+
+
+# Performing self-test
+# --------------------
+check:
+
+test:
+
+
+# Performing installation test
+# ----------------------------
+installcheck:
+
+
+# Creating installation directories
+# ---------------------------------
+installdirs:
+
+
+# Creating dependencies
+# ---------------------
+dep: $(LOCAL_SOURCES) Makefile.dep
+
+Makefile.dep: $(SOURCES) $(LOCAL_SOURCES) $(srcdir)/*.h cmdpars.hh cmdpars.cc
+ $(MAKEDEP) $(CPPFLAGS) $(SOURCES) $(LOCAL_SOURCES) >Makefile.dep
+
+-include Makefile.dep
+include $(srcdir)/clean.mk
+
+cmdlex.cc: cmdlex.l cmdpars.hh
+
+# My rules
+# --------
+
+cmdlib: $(top_builddir)/libcmd.a
+
+$(top_builddir)/libcmd.a: $(OBJECTS) $(LOCAL_OBJECTS)
+ $(AR) -rc $@ $(OBJECTS) $(LOCAL_OBJECTS)
+ $(RANLIB) $@
+
+.cc.o:
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
+
+cmdpars.hh: cmdpars.cc
+
+cmdpars.cc: cmdpars.y
+ $(YACC) -d $<
+ mv y.tab.c $*.cc
+ mv y.tab.h $*.hh
+
+.l.cc:
+ rm -f $@
+ $(LEX) -t $< > $@
+
+# Remaking configuration
+# ----------------------
+checkconf:
+ @if [ -f $(top_builddir)/devel ]; then\
+ $(MAKE) -C $(top_builddir) -f conf.mk srcdir="$(srcdir)" top_builddir="$(top_builddir)" freshconf;\
+ fi
+
+# End of cmd.src/Makefile.in
diff --git a/sim/ucsim/cmd.src/clean.mk b/sim/ucsim/cmd.src/clean.mk
new file mode 100644
index 0000000..b3028e8
--- /dev/null
+++ b/sim/ucsim/cmd.src/clean.mk
@@ -0,0 +1,30 @@
+#
+# ucsim cmd.src/clean.mk
+#
+
+# Deleting all files created by building the program
+# --------------------------------------------------
+clean:
+ rm -f *core *[%~] *.[oa]
+ rm -f .[a-z]*~
+ rm -f cmdpars.cc cmdpars.hh
+# rm -f cmdpars.cc cmdpars.hh cmdlex.cc
+
+# Deleting all files created by configuring or building the program
+# -----------------------------------------------------------------
+distclean: clean
+ rm -f config.cache config.log config.status
+ rm -f Makefile *.dep
+
+
+# Like clean but some files may still exist
+# -----------------------------------------
+mostlyclean: clean
+
+
+# Deleting everything that can reconstructed by this Makefile. It deletes
+# everything deleted by distclean plus files created by bison, etc.
+# -----------------------------------------------------------------------
+realclean: distclean
+
+# End of cmd.src/clean.mk
diff --git a/sim/ucsim/cmd.src/cmd_bp.cc b/sim/ucsim/cmd.src/cmd_bp.cc
new file mode 100644
index 0000000..f9106d5
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_bp.cc
@@ -0,0 +1,393 @@
+/*
+ * Simulator of microcontrollers (cmd.src/bp.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include <ctype.h>
+
+#include "ddconfig.h"
+
+#include "stdlib.h"
+
+// sim
+#include "brkcl.h"
+#include "argcl.h"
+#include "simcl.h"
+
+// cmd
+#include "cmd_bpcl.h"
+
+
+/*
+ * BREAK command
+ */
+
+//int
+//cl_break_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_break_cmd)
+{
+ t_addr addr= 0;
+ int hit= 1;
+ char op;
+ chars cond= "";
+ chars s;
+ class cl_address_space *mem;
+ class cl_cmd_arg *params[6]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3),
+ cmdline->param(4),
+ cmdline->param(5) };
+
+ if (0) {}
+ else if (cmdline->syntax_match(uc, CELL NUMBER STRING STRING)) {
+ hit= params[1]->value.number;
+ mem= uc->address_space(params[0]->value.cell, &addr);
+ if (!mem)
+ return syntax_error(con), false;
+ s= params[2]->get_svalue();
+ if (s && *s &&
+ (strcmp(s, "if") == 0))
+ cond= params[3]->get_svalue();
+ if (mem == uc->rom)
+ do_fetch(uc, addr, hit, cond, con);
+ else
+ {
+ do_event(uc, mem, 'r', addr, hit, cond, con);
+ do_event(uc, mem, 'w', addr, hit, cond, con);
+ }
+ }
+ else if (cmdline->syntax_match(uc, CELL STRING STRING)) {
+ hit= 1;
+ mem= uc->address_space(params[0]->value.cell, &addr);
+ if (!mem)
+ return syntax_error(con), false;
+ s= params[1]->get_svalue();
+ if (s && *s &&
+ (strcmp(s, "if") == 0))
+ cond= params[2]->get_svalue();
+ if (mem == uc->rom)
+ do_fetch(uc, addr, hit, cond, con);
+ else
+ {
+ do_event(uc, mem, 'r', addr, hit, cond, con);
+ do_event(uc, mem, 'w', addr, hit, cond, con);
+ }
+ }
+ else if (cmdline->syntax_match(uc, CELL NUMBER)) {
+ hit= params[1]->value.number;
+ mem= uc->address_space(params[0]->value.cell, &addr);
+ if (!mem)
+ return syntax_error(con), false;
+ if (mem == uc->rom)
+ do_fetch(uc, addr, hit, cond, con);
+ else
+ {
+ do_event(uc, mem, 'r', addr, hit, cond, con);
+ do_event(uc, mem, 'w', addr, hit, cond, con);
+ }
+ }
+ else if (cmdline->syntax_match(uc, CELL)) {
+ hit= 1;
+ mem= uc->address_space(params[0]->value.cell, &addr);
+ if (!mem)
+ return syntax_error(con), false;
+ if (mem == uc->rom)
+ do_fetch(uc, addr, hit, cond, con);
+ else
+ {
+ do_event(uc, mem, 'r', addr, hit, cond, con);
+ do_event(uc, mem, 'w', addr, hit, cond, con);
+ }
+ }
+ else if (cmdline->syntax_match(uc, MEMORY STRING ADDRESS NUMBER STRING STRING)) {
+ mem= params[0]->value.memory.address_space;
+ op= *(params[1]->get_svalue());
+ addr= params[2]->value.address;
+ hit= params[3]->value.number;
+ s= params[4]->get_svalue();
+ if (s && *s && (s=="if"))
+ cond= params[5]->get_svalue();
+ do_event(uc, mem, op, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY STRING ADDRESS NUMBER)) {
+ mem= params[0]->value.memory.address_space;
+ op= *(params[1]->get_svalue());
+ addr= params[2]->value.address;
+ hit= params[3]->value.number;
+ do_event(uc, mem, op, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY STRING ADDRESS STRING STRING)) {
+ mem= params[0]->value.memory.address_space;
+ op= *(params[1]->get_svalue());
+ addr= params[2]->value.address;
+ hit= 1;
+ s= params[3]->get_svalue();
+ if (s && *s && (s=="if"))
+ cond= params[4]->get_svalue();
+ do_event(uc, mem, op, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY STRING ADDRESS)) {
+ mem= params[0]->value.memory.address_space;
+ op= *(params[1]->get_svalue());
+ addr= params[2]->value.address;
+ hit= 1;
+ do_event(uc, mem, op, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS NUMBER STRING STRING)) {
+ addr= params[0]->value.address;
+ hit= params[1]->value.number;
+ s= params[2]->get_svalue();
+ if (s && *s && (s=="if"))
+ cond= params[3]->get_svalue();
+ do_fetch(uc, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS NUMBER)) {
+ addr= params[0]->value.address;
+ hit= params[1]->value.number;
+ do_fetch(uc, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS STRING STRING)) {
+ addr= params[0]->value.address;
+ hit= 1;
+ s= params[1]->get_svalue();
+ if (s && *s && (s=="if"))
+ cond= params[2]->get_svalue();
+ do_fetch(uc, addr, hit, cond, con);
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS)) {
+ addr= params[0]->value.address;
+ hit= 1;
+ do_fetch(uc, addr, hit, cond, con);
+ }
+ else
+ {
+ syntax_error(con);
+ return(false);
+ }
+ return(false);
+}
+
+CMDHELP(cl_break_cmd,
+ "break addr [hit [if expr]] | break mem_type r|w addr [hit [if expr]]",
+ "Set fix or event breakpoint",
+ "long help of break")
+
+void
+cl_break_cmd::do_fetch(class cl_uc *uc,
+ t_addr addr, int hit,
+ chars cond,
+ class cl_console_base *con)
+{
+ if (hit > 99999)
+ {
+ con->dd_printf("Hit value %d is too big.\n", hit);
+ return;
+ }
+ if (uc->fbrk->bp_at(addr))
+ con->dd_printf("Breakpoint at 0x%06x is already set.\n", AI(addr));
+ else
+ {
+ class cl_brk *b= new cl_fetch_brk(uc->rom/*address_space(MEM_ROM_ID)*/,
+ uc->make_new_brknr(),
+ addr, perm, hit);
+ b->init();
+ b->cond= cond;
+ uc->fbrk->add_bp(b);
+ const char *s= uc->disass(addr, NULL);
+ con->dd_printf("Breakpoint %d at 0x%06x: %s (cond=\"%s\")\n", b->nr, AI(addr), s, (char*)cond);
+ free((char *)s);
+ }
+}
+
+void
+cl_break_cmd::do_event(class cl_uc *uc,
+ class cl_address_space *mem,
+ char op, t_addr addr, int hit,
+ chars cond,
+ class cl_console_base *con)
+{
+ class cl_ev_brk *b= NULL;
+
+ b= uc->mk_ebrk(perm, mem, op, addr, hit);
+ if (b)
+ {
+ b->init();
+ b->cond= cond;
+ uc->ebrk->add_bp(b);
+ }
+ else
+ con->dd_printf("Couldn't make event breakpoint\n");
+}
+
+
+/*
+ * CLEAR address
+ */
+
+//int
+//cl_clear_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_clear_cmd)
+{
+ int idx;
+ class cl_brk *brk= uc->fbrk->get_bp(uc->PC, &idx);
+
+ if (cmdline->param(0) == 0)
+ {
+ if (!brk)
+ {
+ con->dd_printf("No breakpoint at this address.\n");
+ return(0);
+ }
+ uc->fbrk->del_bp(uc->PC);
+ return(0);
+ }
+
+ int i= 0;
+ class cl_cmd_arg *param;
+ while ((param= cmdline->param(i++)))
+ {
+ t_addr addr;
+ if (!param->as_address(uc))
+ return(false);
+ addr= param->value.address;
+ if (uc->fbrk->bp_at(addr) == 0)
+ con->dd_printf("No breakpoint at 0x%06x\n", addr);
+ else
+ uc->fbrk->del_bp(addr);
+ }
+
+ return(false);
+}
+
+CMDHELP(cl_clear_cmd,
+ "clear [addr...]",
+ "Clear fix breakpoint",
+ "long help of clear")
+
+/*
+ * DELETE nr nr ...
+ */
+
+//int
+//cl_delete_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_delete_cmd)
+{
+ if (cmdline->param(0) == 0)
+ {
+ // delete all
+ uc->remove_all_breaks();
+ }
+ else
+ {
+ int i= 0;
+ class cl_cmd_arg *param;
+ while ((param= cmdline->param(i++)))
+ {
+ long num;
+ if (param->get_ivalue(&num))
+ {
+ if (!uc->rm_brk(num))
+ con->dd_printf("Error\n");
+ }
+ }
+ }
+ return(false);
+}
+
+CMDHELP(cl_delete_cmd,
+ "delete [nr...]",
+ "Delete breakpoint(s)",
+ "long help of clear")
+
+/*
+ * COMMANDS [nr] cmdstring...
+ */
+
+COMMAND_DO_WORK_UC(cl_commands_cmd)
+{
+ int nr= -1;
+
+ cmdline->shift();
+ chars s= chars(cmdline->cmd);
+ if (cmdline->rest)
+ {
+ s+= ';';
+ s+= cmdline->rest;
+ }
+ if (!s.empty())
+ {
+ if (isdigit(((char*)s)[0]))
+ {
+ char *p0= (char*)s;
+ if (p0 && *p0)
+ {
+ long l=-2;
+ l= strtol(p0, 0, 0);
+ nr= l;
+ }
+ cmdline->shift();
+ s= chars(cmdline->cmd);
+ if (cmdline->rest)
+ {
+ s+= ';';
+ s+= cmdline->rest;
+ }
+ }
+ }
+ else
+ return con->dd_printf("command missing\n"), false;
+
+ if (nr < 0)
+ {
+ nr= uc->brk_counter;
+ }
+ if (nr == 0)
+ return con->dd_printf("breakpoint (%d) not found\n", nr), false;
+
+ class cl_brk *b= uc->brk_by_nr(nr);
+ if (!b)
+ return con->dd_printf("no breakpoint (%d)\n", nr), false;
+
+ if (!s.empty())
+ {
+ b->commands= s;
+ }
+ else
+ b->commands= chars("");
+ cmdline->rest= NULL;
+
+ return false;
+}
+
+CMDHELP(cl_commands_cmd,
+ "commands [breakpoint-nr]",
+ "command_string",
+ "long help of commands")
+
+/* End of cmd.src/cmd_bp.cc */
diff --git a/sim/ucsim/cmd.src/cmd_bp.o b/sim/ucsim/cmd.src/cmd_bp.o
new file mode 100644
index 0000000..a00f07f
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_bp.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_bpcl.h b/sim/ucsim/cmd.src/cmd_bpcl.h
new file mode 100644
index 0000000..530394b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_bpcl.h
@@ -0,0 +1,70 @@
+/*
+ * Simulator of microcontrollers (cmd.src/bpcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_BPCL_HEADER
+#define CMD_CMD_BPCL_HEADER
+
+#include "newcmdcl.h"
+
+
+// BREAK
+COMMAND_HEAD(cl_break_cmd)
+public:
+ enum brk_perm perm;
+COMMAND_METHODS_ON(uc,cl_break_cmd)
+ virtual void do_fetch(class cl_uc *uc,
+ t_addr addr, int hit,
+ chars cond,
+ class cl_console_base *con);
+ virtual void do_event(class cl_uc *uc,
+ class cl_address_space *mem,
+ char op, t_addr addr, int hit,
+ chars cond,
+ class cl_console_base *con);
+COMMAND_TAIL;
+
+// TBREAK
+class cl_tbreak_cmd: public cl_break_cmd
+{
+public:
+ cl_tbreak_cmd(const char *aname,
+ int can_rep):
+ cl_break_cmd(aname, can_rep) {perm=brkDYNAMIC;}
+};
+
+// CLEAR
+COMMAND_ON(uc,cl_clear_cmd);
+
+// DELETE
+COMMAND_ON(uc,cl_delete_cmd);
+
+// COMMANDS
+COMMAND_ON(uc,cl_commands_cmd);
+
+#endif
+
+/* End of cmd.src/cmd_bpcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_conf.cc b/sim/ucsim/cmd.src/cmd_conf.cc
new file mode 100644
index 0000000..4662dd6
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_conf.cc
@@ -0,0 +1,152 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdconf.cc)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+// prj
+#include "globals.h"
+#include "utils.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_confcl.h"
+
+
+void
+set_conf_help(class cl_cmd *cmd)
+{
+ cmd->set_help("conf [subcommand]",
+ "Information about simulator",
+ "Long of conf");
+}
+
+/*
+ * Command: conf
+ *----------------------------------------------------------------------------
+ */
+
+int
+cl_conf_cmd::do_work(class cl_uc *uc,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ int i;
+
+ con->dd_printf("ucsim version %s\n", VERSIONSTR);
+ con->dd_printf("Type of microcontroller: %s", uc->id_string());
+ if (cpus &&
+ uc->type)
+ {
+ const char *s= uc->type->sub_help;
+ if (s && *s)
+ con->dd_printf(" %s", s);
+ }
+ con->dd_printf("\n");
+ con->dd_printf("Controller has %d hardware element(s).\n",
+ uc->nuof_hws());
+ for (i= 0; i < uc->nuof_hws(); i++)
+ {
+ class cl_hw *hw= uc->get_hw(i);
+ con->dd_printf(" %3s %s[%d]\n", hw->on?"on":"off", hw->id_string, hw->id);
+ }
+ return(0);
+}
+
+CMDHELP(cl_conf_cmd,
+ "conf",
+ "Configuration",
+ "long help of conf 1")
+
+
+/*
+ * Command: conf objects
+ *----------------------------------------------------------------------------
+ */
+
+static void
+conf_objects_cmd_print_node(class cl_console_base *con,
+ int indent, class cl_base *node)
+{
+ if (!node)
+ return;
+ int i;
+ for (i= 0; i < indent; i++)
+ con->dd_printf(" ");
+ const char *name= node->get_name("unknown");
+ con->dd_printf("%s\n", name);
+ class cl_base *c= node->first_child();
+ while (c)
+ {
+ conf_objects_cmd_print_node(con, indent+2, c);
+ c= node->next_child(c);
+ }
+}
+
+//int
+//cl_conf_addmem_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_APP(cl_conf_objects_cmd)
+{
+ //class cl_address_space *mem= 0;
+ /*class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };*/
+ class cl_error *cl_error_base = new cl_error();
+ conf_objects_cmd_print_node(con, 0,
+ /*application*/cl_error_base->get_class());
+ delete cl_error_base;
+ return(false);
+}
+
+CMDHELP(cl_conf_objects_cmd,
+ "conf objects",
+ "Show object tree",
+ "long help of conf objects")
+
+COMMAND_DO_WORK_APP(cl_jaj_cmd)
+{
+ //class cl_address_space *mem= 0;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (params[0] != NULL)
+ {
+ int i= params[0]->i_value;
+ jaj= i?true:false;
+ }
+ con->dd_printf("%d\n", jaj);
+ return(false);
+}
+
+CMDHELP(cl_jaj_cmd,
+ "jaj [val]",
+ "Jaj",
+ "long help of jaj")
+
+/* End of cmd.src/cmd_conf.cc */
diff --git a/sim/ucsim/cmd.src/cmd_conf.o b/sim/ucsim/cmd.src/cmd_conf.o
new file mode 100644
index 0000000..0325ae4
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_conf.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_confcl.h b/sim/ucsim/cmd.src/cmd_confcl.h
new file mode 100644
index 0000000..bdf2d25
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_confcl.h
@@ -0,0 +1,58 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdconfcl.h)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_CONF_HEADER
+#define CMD_CMD_CONF_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_conf_help(class cl_cmd *cmd);
+
+// CONF
+//COMMAND_ON(uc,cl_conf_cmd);
+class cl_conf_cmd: public cl_cmd
+{
+ public:
+ cl_conf_cmd(const char *aname,
+ int can_rep):
+ cl_cmd(operate_on_uc, aname, can_rep) {}
+ virtual int do_work(class cl_uc *uc ,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual void set_help(void);
+};
+
+// CONF OBJECTS
+COMMAND_ON(app,cl_conf_objects_cmd);
+
+// JAJ
+COMMAND_ON(app,cl_jaj_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_confcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_exec.cc b/sim/ucsim/cmd.src/cmd_exec.cc
new file mode 100644
index 0000000..734e2eb
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_exec.cc
@@ -0,0 +1,542 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdset.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+#include <stdarg.h>
+#include "ddconfig.h"
+
+// prj
+#include "i_string.h"
+#include "utils.h"
+#include "globals.h"
+
+// sim.src
+#include "simcl.h"
+#include "uccl.h"
+
+// local, cmd.src
+#include "cmd_execcl.h"
+#include "cmdutil.h"
+
+
+/*
+ * Command: run
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_run_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_SIM(cl_run_cmd)
+{
+ class cl_brk *b;
+ t_addr start, end;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (params[0])
+ if (!(params[0]->get_address(sim->uc, &start)))
+ {
+ con->dd_printf(cchars("Error: wrong start address\n"));
+ return(false);
+ }
+ if (params[1])
+ if (!(params[1]->get_address(sim->uc, &end)))
+ {
+ con->dd_printf(cchars("Error: wromg end address\n"));
+ return(false);
+ }
+ if (params[0])
+ {
+ if (!sim->uc->inst_at(start))
+ con->dd_printf(cchars("Warning: maybe not instruction at 0x%06x\n"),
+ AI(start));
+ sim->uc->PC= start;
+ if (params[1])
+ {
+ if (start == end)
+ {
+ con->dd_printf(cchars("Addresses must be different.\n"));
+ return(false);
+ }
+ if ((b= sim->uc->fbrk_at(end)))
+ {
+ }
+ else
+ {
+ b= new cl_fetch_brk(sim->uc->rom,
+ sim->uc->make_new_brknr(), end,
+ brkDYNAMIC, 1);
+ sim->uc->fbrk->add_bp(b);
+ }
+ }
+ }
+ con->dd_printf(cchars("Simulation started, PC=0x%06x\n"), AI(sim->uc->PC));
+ /*
+ if (sim->uc->fbrk_at(sim->uc->PC))
+ sim->uc->do_inst(1);
+ */
+ sim->start(con, 0);
+ return(false);
+}
+
+CMDHELP(cl_run_cmd,
+ "run [start [stop]]",
+ "Go",
+ "long help of run")
+
+/*
+ * Command: stop
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_stop_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_SIM(cl_stop_cmd)
+{
+ sim->stop(resUSER);
+ sim->uc->print_disass(sim->uc->PC, con);
+ return(false);
+}
+
+CMDHELP(cl_stop_cmd,
+ "stop",
+ "Stop",
+ "long help of stop")
+
+/*
+ * Command: step
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_step_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_SIM(cl_step_cmd)
+{
+ class cl_cmd_arg *params[2];
+ params[0]= cmdline->param(0);
+ params[1]= cmdline->param(1);
+ int instrs= 1;
+ if (params[0] != NULL)
+ {
+ instrs= params[0]->i_value;
+ }
+ class cl_uc *uc= sim->get_uc();
+ if (uc && (params[1] != NULL))
+ {
+ chars s= params[1]->get_svalue();
+ unsigned long do_clk;
+ class cl_time_measurer *tm= NULL;
+ do_clk= instrs;
+ if (s == "clk")
+ {
+ tm= new cl_time_clk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "s") || (s == "sec"))
+ {
+ do_clk= uc->clocks_of_time(instrs);
+ tm= new cl_time_clk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "ms") || (s == "msec"))
+ {
+ do_clk= uc->clocks_of_time(instrs/1000.0);
+ tm= new cl_time_clk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "us") || (s == "usec"))
+ {
+ do_clk= uc->clocks_of_time(instrs/1000000.0);
+ tm= new cl_time_clk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "ns") || (s == "nsec"))
+ {
+ do_clk= uc->clocks_of_time(instrs/1000000000.0);
+ tm= new cl_time_clk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if (s == "vclk")
+ {
+ tm= new cl_time_vclk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "fclk") || (s == "fetch"))
+ {
+ tm= new cl_time_fclk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "rclk") || (s == "read"))
+ {
+ tm= new cl_time_rclk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else if ((s == "wclk") || (s == "write"))
+ {
+ tm= new cl_time_wclk(uc);
+ tm->init();
+ tm->from_now(do_clk);
+ }
+ else
+ {
+ con->dd_printf("Unknown unit.\n");
+ return 0;
+ }
+ if (tm)
+ {
+ uc->stop_when(tm);
+ sim->start(con, 0);
+ }
+ return 0;
+ }
+ if (instrs <= 0)
+ instrs= 1;
+ sim->start(con, instrs);
+ return(0);
+}
+
+CMDHELP(cl_step_cmd,
+ "step [number [unit]]",
+ "Step",
+ "long help of step")
+/*
+ * Command: next
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_next_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_SIM(cl_next_cmd)
+{
+ class cl_brk *b;
+ t_addr next;
+ int inst_len;
+
+ bool is_call;
+
+#if 0
+ struct dis_entry *de;
+ t_mem code= sim->uc->rom->get(sim->uc->PC);
+ int i= 0;
+ de= &(sim->uc->dis_tbl()[i]);
+ while ((code & de->mask) != de->code &&
+ de->mnemonic)
+ {
+ i++;
+ de= &(sim->uc->dis_tbl()[i]);
+ }
+#endif
+
+ inst_len = sim->uc->inst_length(sim->uc->PC);
+
+ is_call= sim->uc->is_call(sim->uc->PC);
+
+ if (is_call)
+ {
+ next= sim->uc->PC + inst_len;
+ if (!sim->uc->fbrk_at(next))
+ {
+ b= new cl_fetch_brk(sim->uc->rom,
+ sim->uc->make_new_brknr(),
+ next, brkDYNAMIC, 1);
+
+ b->init();
+// sim->uc->fbrk->add_bp(b);
+
+ sim->uc->fbrk->add(b);
+ b->activate();
+ }
+ /*if (sim->uc->fbrk_at(sim->uc->PC))
+ sim->uc->do_inst(1);*/
+ sim->start(con, 0);
+ //sim->uc->do_inst(-1);
+ }
+ else {
+ //sim->uc->do_inst(1);
+ sim->start(con, 1);
+ //sim->step();
+ //sim->stop(resSTEP);
+ //sim->uc->print_regs(con);
+ }
+ return(false);
+}
+
+CMDHELP(cl_next_cmd,
+ "next",
+ "Next",
+ "long help of next")
+
+/*
+ * Command: help
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_help_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_APP(cl_help_cmd)
+{
+ class cl_commander_base *commander;
+ class cl_cmdset *cmdset= 0;
+ int i;
+ class cl_cmd_arg *parm= cmdline->param(0);
+
+ if ((commander= app->get_commander()) != 0)
+ cmdset= commander->cmdset;
+ if (!cmdset)
+ return(false);
+ if (!parm) {
+ for (i= 0; i < cmdset->count; i++)
+ {
+ class cl_cmd *c= (class cl_cmd *)(cmdset->at(i));
+ /*if (c->short_help.nempty())
+ con->dd_printf("%s\n", (char*)c->short_help);
+ else
+ con->dd_printf("%s\n", (char*)(c->names->at(0)));*/
+ c->print_short(con);
+ }
+ }
+ else
+ {
+ matches= 0;
+ do_set(cmdline, 0, cmdset, con);
+ if (matches == 1 &&
+ cmd_found)
+ {
+ int names;
+ con->dd_printf("Names of command:");
+ for (names= 0; names < cmd_found->names->count; names++)
+ con->dd_printf(" %s", (char*)(cmd_found->names->at(names)));
+ con->dd_printf("\n");
+ class cl_cmdset *subset= cmd_found->get_subcommands();
+ if (subset)
+ {
+ con->dd_printf("\"%s\" must be followed by the name of a "
+ "subcommand\nList of subcommands:\n",
+ (char*)(cmd_found->names->at(0)));
+ for (i= 0; i < subset->count; i++)
+ {
+ class cl_cmd *c=
+ dynamic_cast<class cl_cmd *>(subset->object_at(i));
+ //con->dd_printf("%s\n", (char*)c->short_help);
+ c->print_short(con);
+ }
+ }
+ if (cmd_found->long_help.nempty())
+ con->dd_printf("%s\n", (char*)cmd_found->long_help);
+ }
+ if (!matches ||
+ !cmd_found)
+ con->dd_printf("No such command.\n");
+ }
+ return(false);
+}
+
+CMDHELP(cl_help_cmd,
+ "help [command [subcommand]]",
+ "List of known commands, or description of specified command",
+ "Long help of help command")
+
+bool
+cl_help_cmd::do_set(class cl_cmdline *cmdline, int pari,
+ class cl_cmdset *cmdset,
+ class cl_console_base *con)
+{
+ int i;
+ for (i= 0; i < cmdset->count; i++)
+ {
+ class cl_cmd *cmd= dynamic_cast<class cl_cmd *>(cmdset->object_at(i));
+ if (!cmd)
+ continue;
+ if (pari >= cmdline->nuof_params())
+ return(false);
+ class cl_cmd_arg *param= cmdline->param(pari);
+ if (!param)
+ return(false);
+ class cl_cmdset *next_set= cmd->get_subcommands();
+ if (cmd->name_match(param->s_value, false))
+ {
+ if (pari+1 >= cmdline->nuof_params())
+ {
+ matches++;
+ cmd_found= cmd;
+ /*if (cmd->short_help.nempty())
+ con->dd_printf("%s\n", (char*)cmd->short_help);
+ else
+ con->dd_printf("%s\n", (char*)(cmd->names->at(0)));*/
+ cmd->print_short(con);
+ //continue;
+ }
+ else
+ if (next_set)
+ do_set(cmdline, pari+1, next_set, con);
+ }
+ }
+ return(true);
+}
+
+
+/*
+ * Command: quit
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_quit_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline */*cmdline*/, class cl_console */*con*/)
+COMMAND_DO_WORK(cl_quit_cmd)
+{
+ return(1);
+}
+
+CMDHELP(cl_quit_cmd,
+ "quit",
+ "Quit",
+ "long help of quit")
+
+/*
+ * Command: kill
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_kill_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline */*cmdline*/, class cl_console */*con*/)
+COMMAND_DO_WORK_APP(cl_kill_cmd)
+{
+ app->going= 0;
+ if (app->sim)
+ app->sim->state|= SIM_QUIT;
+ return(1);
+}
+
+CMDHELP(cl_kill_cmd,
+ "kill",
+ "Shutdown simulator",
+ "long help of kill")
+
+/*
+ * EXEC file
+ */
+
+COMMAND_DO_WORK_APP(cl_exec_cmd)
+{
+ class cl_cmd_arg *parm= cmdline->param(0);
+ char *fn= 0;
+
+ if (cmdline->syntax_match(0, STRING)) {
+ fn= parm->value.string.string;
+ }
+ if (!fn || !*fn)
+ {
+ syntax_error(con);
+ return (false);
+ }
+
+ class cl_commander_base *c= app->get_commander();
+ c->exec_on(con, fn);
+
+ return(false);
+}
+
+CMDHELP(cl_exec_cmd,
+ "exec \"file\"",
+ "Execute commands from file",
+ "long help of exec")
+
+/*
+ * expression expression
+ */
+
+COMMAND_DO_WORK_APP(cl_expression_cmd)
+{
+ char *s= cmdline->cmd;
+ char *fmt= NULL;
+ int fmt_len= 0;
+ if (!s ||
+ !*s)
+ return(false);
+ int i= strspn(s, " \t\v\n\r");
+ s+= i;
+ i= strspn(s, "abcdefghijklmnopqrstuvwxyz");
+ s+= i;
+ i= strspn(s, " \t\v\n");
+ s+= i;
+ t_mem v= 0;
+ if (s && *s)
+ {
+ if (*s == '/')
+ {
+ i= strcspn(s, " \t\v\n\r");
+ fmt= s+1;
+ fmt_len= i;
+ s+= i;
+ i= strspn(s, " \t\v\n\r");
+ s+= i;
+ }
+ if (s && *s)
+ v= application->eval(s);
+ if (fmt)
+ {
+ for (i= 0; i < fmt_len; i++)
+ {
+ switch (fmt[i])
+ {
+ case 'x': con->dd_printf("%x\n", MU(v)); break;
+ case 'X': con->dd_printf("0x%x\n", MU(v)); break;
+ case '0': con->dd_printf("0x%08x\n", MU32(v)); break;
+ case 'd': con->dd_printf("%d\n", MI(v)); break;
+ case 'o': con->dd_printf("%o\n", MU(v)); break;
+ case 'u': con->dd_printf("%u\n", MU(v)); break;
+ case 'b': con->dd_printf("%s\n", (char*)cbin(v,8*sizeof(v))); break;
+ }
+ }
+ }
+ else
+ con->dd_printf("%d\n", MI(v));
+ }
+ return(false);
+}
+
+CMDHELP(cl_expression_cmd,
+ "expression [/format] expr",
+ "Evaluate the expression",
+ "long help of expression ")
+
+/* End of cmd.src/cmd_exec.cc */
diff --git a/sim/ucsim/cmd.src/cmd_exec.o b/sim/ucsim/cmd.src/cmd_exec.o
new file mode 100644
index 0000000..4ddc861
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_exec.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_execcl.h b/sim/ucsim/cmd.src/cmd_execcl.h
new file mode 100644
index 0000000..023a374
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_execcl.h
@@ -0,0 +1,60 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdsetcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_EXECCL_HEADER
+#define CMD_CMD_EXECCL_HEADER
+
+// local, cmd
+#include "commandcl.h"
+#include "newcmdcl.h"
+
+
+// Execution
+COMMAND_ON(sim,cl_run_cmd);
+COMMAND_ON(sim,cl_stop_cmd);
+COMMAND_ON(sim,cl_step_cmd);
+COMMAND_ON(sim,cl_next_cmd);
+
+//COMMAND_ON(app,cl_help_cmd);
+COMMAND_HEAD(cl_help_cmd)
+COMMAND_METHODS_ON(app,cl_help_cmd)
+ private:
+int matches;
+class cl_cmd *cmd_found;
+bool do_set(class cl_cmdline *cmdline, int pari, class cl_cmdset *cmdset,
+ class cl_console_base *con);
+COMMAND_TAIL;
+
+COMMAND(cl_quit_cmd);
+COMMAND_ON(app,cl_kill_cmd);
+COMMAND_ON(app,cl_exec_cmd);
+COMMAND_ON(app,cl_expression_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_execcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_get.cc b/sim/ucsim/cmd.src/cmd_get.cc
new file mode 100644
index 0000000..c538244
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_get.cc
@@ -0,0 +1,147 @@
+/*
+ * Simulator of microcontrollers (cmd.src/get.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <ctype.h>
+#include "i_string.h"
+
+#include <stdarg.h>
+// prj
+#include "utils.h"
+#include "appcl.h"
+
+// sim
+#include "simcl.h"
+#include "optioncl.h"
+
+// local
+#include "cmd_getcl.h"
+#include "cmdutil.h"
+
+
+void
+set_get_help(class cl_cmd *cmd)
+{
+ cmd->set_help("get subcommand",
+ "Get value of differend objects",
+ "Long of get");
+}
+
+/*
+ * Command: get sfr
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_get_sfr_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_get_sfr_cmd)
+{
+ class cl_address_space *mem= uc->address_space(MEM_SFR_ID);
+ class cl_cmd_arg *parm;
+ int i;
+
+ if (!mem)
+ {
+ con->dd_printf("Error: No SFR\n");
+ return(false);
+ }
+ for (i= 0, parm= cmdline->param(i);
+ parm;
+ i++, parm= cmdline->param(i))
+ {
+ if (!parm->as_address(uc) ||
+ !mem->valid_address(parm->value.address))
+ con->dd_printf("Warning: Invalid address %s\n",
+ (char*)cmdline->tokens->at(i));
+ else
+ mem->dump(parm->value.address, parm->value.address, 1, con/*->get_fout()*/);
+ }
+
+ return(false);;
+}
+
+CMDHELP(cl_get_sfr_cmd,
+ "get sfr address...",
+ "Get value of addressed SFRs",
+ "long help of get sfr")
+
+/*
+ * Command: get option
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_get_option_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_APP(cl_get_option_cmd)
+{
+ class cl_cmd_arg *parm= cmdline->param(0);
+ char *s= 0;
+
+ if (!parm)
+ ;
+ else if (cmdline->syntax_match(0/*app->get_uc()*/, STRING)) {
+ s= parm->value.string.string;
+ }
+ else
+ syntax_error(con);
+
+ int i;
+ for (i= 0; i < app->options->count; i++)
+ {
+ class cl_option *o= (class cl_option *)(/*uc*/app->options->at(i));
+ if ((!s ||
+ !strcmp(s, o->get_name())))
+ {
+ if (!o->hidden)
+ {
+ con->dd_printf("%2d. %s(by %s): ", i, object_name(o),
+ object_name(o->get_creator()));
+ o->print(con);
+ con->dd_printf(" - %s\n", o->help);
+ }
+ else
+ {
+ /*
+ con->dd_printf("%2d. %s(by %s) is hidden!\n", i, object_name(o),
+ object_name(o->get_creator()));
+ */
+ }
+ }
+ }
+
+ return(false);;
+}
+
+CMDHELP(cl_get_option_cmd,
+ "get option name",
+ "Get value of an option",
+ "long help of get option")
+
+/* End of cmd.src/cmd_get.cc */
diff --git a/sim/ucsim/cmd.src/cmd_get.o b/sim/ucsim/cmd.src/cmd_get.o
new file mode 100644
index 0000000..8afa87b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_get.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_getcl.h b/sim/ucsim/cmd.src/cmd_getcl.h
new file mode 100644
index 0000000..7f6579b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_getcl.h
@@ -0,0 +1,68 @@
+/*
+ * Simulator of microcontrollers (cmd.src/getcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_GETCL_HEADER
+#define CMD_CMD_GETCL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_get_help(class cl_cmd *cmd);
+
+// GET SFR
+/*class cl_get_sfr_cmd: public cl_cmd
+{
+public:
+ cl_get_sfr_cmd(//class cl_sim *asim,
+ char *aname,
+ int can_rep,
+ char *short_hlp,
+ char *long_hlp):
+ cl_cmd(aname, can_rep, short_hlp, long_hlp) {}
+ virtual int do_work(class cl_sim *sim,
+ class cl_cmdline *cmdline, class cl_console *con);
+};*/
+COMMAND_ON(uc,cl_get_sfr_cmd);
+
+// GET OPTION
+/*class cl_get_option_cmd: public cl_cmd
+{
+public:
+ cl_get_option_cmd(//class cl_sim *asim,
+ char *aname,
+ int can_rep,
+ char *short_hlp,
+ char *long_hlp):
+ cl_cmd(aname, can_rep, short_hlp, long_hlp) {}
+ virtual int do_work(class cl_sim *sim,
+ class cl_cmdline *cmdline, class cl_console *con);
+};*/
+COMMAND_ON(app,cl_get_option_cmd);
+
+#endif
+
+/* End of cmd.src/cmd_getcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_gui.cc b/sim/ucsim/cmd.src/cmd_gui.cc
new file mode 100644
index 0000000..d09d3f2
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_gui.cc
@@ -0,0 +1,91 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdgui.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+// prj
+#include "globals.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_guicl.h"
+
+
+void
+set_gui_help(class cl_cmd *cmd)
+{
+ cmd->set_help("gui subcommand",
+ "Operations to support GUI tools",
+ "Long of gui");
+}
+
+/*
+ * Command: gui start
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_gui_start_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_gui_start_cmd)
+{
+ if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS)) {
+ /*mem= params[0]->value.memory.memory;
+ start= params[1]->value.address;
+ end= params[2]->value.address;*/
+ }
+ else
+ syntax_error(con);
+ return(false);;
+}
+
+CMDHELP(cl_gui_start_cmd,
+ "gui start",
+ "Start interfacing with GUI tool",
+ "long help of gui start")
+
+/*
+ * Command: gui stop
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_gui_stop_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_gui_stop_cmd)
+{
+ return(false);;
+}
+
+CMDHELP(cl_gui_stop_cmd,
+ "gui stop",
+ "Stop interfacing with GUI tool",
+ "long help of gui stop")
+
+/* End of cmd.src/cmd_gui.cc */
diff --git a/sim/ucsim/cmd.src/cmd_gui.o b/sim/ucsim/cmd.src/cmd_gui.o
new file mode 100644
index 0000000..cdecf77
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_gui.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_guicl.h b/sim/ucsim/cmd.src/cmd_guicl.h
new file mode 100644
index 0000000..a3e6db5
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_guicl.h
@@ -0,0 +1,45 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdguicl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_GUICL_HEADER
+#define CMD_CMD_GUICL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_gui_help(class cl_cmd *cmd);
+
+// GUI START
+COMMAND_ON(uc,cl_gui_start_cmd);
+
+// GUI STOP
+COMMAND_ON(uc,cl_gui_stop_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_guicl.h */
diff --git a/sim/ucsim/cmd.src/cmd_info.cc b/sim/ucsim/cmd.src/cmd_info.cc
new file mode 100644
index 0000000..3ead2b3
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_info.cc
@@ -0,0 +1,266 @@
+/*
+ * Simulator of microcontrollers (cmd.src/info.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include <stdlib.h>
+#include "i_string.h"
+
+// sim.src
+#include "simcl.h"
+
+// local
+#include "cmd_infocl.h"
+
+void
+set_info_help(class cl_cmd *cmd)
+{
+ cmd->set_help("info subcommand",
+ "Information about simulator objects",
+ "Long of info");
+}
+
+/*
+ * INFO BREAKPOINTS command
+ */
+
+COMMAND_DO_WORK_UC(cl_info_bp_cmd)
+{
+ int i;
+ bool extra;
+
+ con->dd_printf("Num Type Disp Hit Cnt Address Cond What\n");
+ for (i= 0; i < uc->fbrk->count; i++)
+ {
+ class cl_brk *fb= (class cl_brk *)(uc->fbrk->at(i));
+ const char *s= uc->disass(fb->addr, NULL);
+ con->dd_printf("%-3d %-10s %s %-5d %-5d 0x%06x %-5s %s\n", fb->nr,
+ "fetch", (fb->perm==brkFIX)?"keep":"del ",
+ fb->hit, fb->cnt, AU(fb->addr),
+ fb->condition()?"true":"false",
+ s);
+ extra= false;
+ if (!(fb->cond.empty()))
+ con->dd_printf(" cond=\"%s\"", (char*)(fb->cond)), extra= true;
+ if (!(fb->commands.empty()))
+ con->dd_printf(" cmd=\"%s\"", (char*)(fb->commands)), extra= true;
+ free((char *)s);
+ if (extra) con->dd_printf("\n");
+ }
+ for (i= 0; i < uc->ebrk->count; i++)
+ {
+ class cl_ev_brk *eb= (class cl_ev_brk *)(uc->ebrk->at(i));
+ con->dd_printf("%-3d %-10s %s %-5d %-5d 0x%06x %s\n", eb->nr,
+ "event", (eb->perm==brkFIX)?"keep":"del ",
+ eb->hit, eb->cnt,
+ AU(eb->addr), eb->id);
+ extra= false;
+ if (!(eb->cond.empty()))
+ con->dd_printf(" cond=\"%s\"", (char*)(eb->cond)), extra= true;
+ if (!(eb->commands.empty()))
+ con->dd_printf(" cmd=\"%s\"", (char*)(eb->commands)), extra= true;
+ if (extra) con->dd_printf("\n");
+ }
+ return(0);
+}
+
+CMDHELP(cl_info_bp_cmd,
+ "info breakpoints",
+ "Status of user-settable breakpoints",
+ "long help of info breakpoints")
+
+/*
+ * INFO REGISTERS command
+ */
+
+COMMAND_DO_WORK_UC(cl_info_reg_cmd)
+{
+ uc->print_regs(con);
+ return(0);
+}
+
+CMDHELP(cl_info_reg_cmd,
+ "info registers",
+ "List of integer registers and their contents",
+ "long help of info registers")
+
+/*
+ * INFO HW command
+ */
+
+//int
+//cl_info_hw_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_info_hw_cmd)
+{
+ class cl_hw *hw;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (cmdline->syntax_match(uc, HW)) {
+ hw= params[0]->value.hw;
+ hw->print_info(con);
+ }
+ else if (cmdline->syntax_match(uc, STRING))
+ {
+ char *s= params[0]->get_svalue();
+ if (s && *s && (strcmp("cpu", s)==0))
+ {
+ if (uc->cpu)
+ uc->cpu->print_info(con);
+ }
+ }
+ else
+ syntax_error(con);
+
+ return(false);
+}
+
+CMDHELP(cl_info_hw_cmd,
+ "info hardware cathegory",
+ "Status of hardware elements of the CPU",
+ "long help of info hardware")
+
+/*
+ * INFO STACK command
+ */
+/*
+COMMAND_DO_WORK_UC(cl_info_stack_cmd)
+{
+ int i;
+
+ cl_stack_op::info_head(con);
+ for (i= uc->stack_ops->count-1; i >= 0; i--)
+ {
+ class cl_stack_op *so= (class cl_stack_op *)(uc->stack_ops->at(i));
+ so->info(con, uc);
+ }
+ return(false);
+}
+*/
+
+/*CMDHELP(cl_info_stack_cmd,
+ "info stack",
+ "Status of stack of the CPU",
+ "long help of info stack")*/
+
+/*
+ * INFO MEMORY command
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_info_memory_cmd)
+{
+ int i;
+ class cl_memory *mem= NULL;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (cmdline->syntax_match(uc, MEMORY))
+ {
+ mem= params[0]->value.memory.memory;
+ if (mem)
+ {
+ mem->print_info("", con);
+ }
+ return false;
+ }
+ con->dd_printf("Memory chips:\n");
+ for (i= 0; i < uc->memchips->count; i++)
+ {
+ class cl_memory_chip *m= (class cl_memory_chip *)(uc->memchips->at(i));
+ m->print_info(" ", con);
+ }
+ con->dd_printf("Address spaces:\n");
+ for (i= 0; i < uc->address_spaces->count; i++)
+ {
+ class cl_address_space *m=
+ (class cl_address_space *)(uc->address_spaces->at(i));
+ m->print_info(" ", con);
+ }
+ con->dd_printf("Address decoders:\n");
+ for (i= 0; i < uc->address_spaces->count; i++)
+ {
+ class cl_address_space *m=
+ (class cl_address_space *)(uc->address_spaces->at(i));
+ int j;
+ for (j= 0; j < m->decoders->count; j++)
+ {
+ class cl_address_decoder *d=
+ (class cl_address_decoder *)(m->decoders->at(j));
+ d->print_info(chars(" "), con);
+ }
+ }
+ return(0);
+}
+
+CMDHELP(cl_info_memory_cmd,
+ "info memory",
+ "Information about memory system",
+ "long help of info memory")
+
+/*
+ * INFO VARIABLES command
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_info_var_cmd)
+{
+ class cl_var *v;
+ int i;
+ class cl_cmd_arg *params[1]= { cmdline->param(0) };
+ char *s= NULL;
+
+ if (cmdline->syntax_match(uc, STRING))
+ {
+ s= params[0]->get_svalue();
+ if (!s ||
+ !*s)
+ s= NULL;
+ }
+ for (i= 0; i < uc->vars->count; i++)
+ {
+ v= (class cl_var *)(uc->vars->at(i));
+ if ((s == NULL) ||
+ (
+ (strstr(v->as->get_name(), s) != NULL) ||
+ (strstr(v->get_name(), s) != NULL)
+ )
+ )
+ v->print_info(con);
+ }
+ return 0;
+}
+
+CMDHELP(cl_info_var_cmd,
+ "info variables [filter]",
+ "Information about variables",
+ "long help of info variables")
+
+/* End of cmd.src/cmd_info.cc */
diff --git a/sim/ucsim/cmd.src/cmd_info.o b/sim/ucsim/cmd.src/cmd_info.o
new file mode 100644
index 0000000..f80fc5b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_info.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_infocl.h b/sim/ucsim/cmd.src/cmd_infocl.h
new file mode 100644
index 0000000..1243495
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_infocl.h
@@ -0,0 +1,57 @@
+/*
+ * Simulator of microcontrollers (cmd.src/infocl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_INFOCL_HEADER
+#define CMD_CMD_INFOCL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_info_help(class cl_cmd *cmd);
+
+// INFO BP
+COMMAND_ON(uc,cl_info_bp_cmd);
+
+// INFO REG
+COMMAND_ON(uc,cl_info_reg_cmd);
+
+// INFO HW
+COMMAND_ON(uc,cl_info_hw_cmd);
+
+// INFO STACK
+//COMMAND_ON(uc,cl_info_stack_cmd);
+
+// INFO MEMORY
+COMMAND_ON(uc,cl_info_memory_cmd);
+
+// INFO VARIABLES
+COMMAND_ON(uc,cl_info_var_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_infocl.h */
diff --git a/sim/ucsim/cmd.src/cmd_mem.cc b/sim/ucsim/cmd.src/cmd_mem.cc
new file mode 100644
index 0000000..34c6c2b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_mem.cc
@@ -0,0 +1,516 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdmem.cc)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+// prj
+#include "globals.h"
+#include "utils.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_memcl.h"
+
+
+void
+set_memory_help(class cl_cmd *cmd)
+{
+ cmd->set_help("memory subcommand",
+ "Manage memory chips and address spaces",
+ "Long of memory");
+}
+
+void
+set_memory_create_help(class cl_cmd *cmd)
+{
+ cmd->set_help("memory create subcommand",
+ "Set of commands to create memory objects",
+ "Long of memory create");
+}
+
+/*
+ * Command: memory create chip
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_conf_addmem_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_memory_create_chip_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ char *memid= NULL;
+ int size= -1;
+ int width= 8;
+
+ if (cmdline->syntax_match(uc, STRING NUMBER)) {
+ memid= params[0]->value.string.string;
+ size= params[1]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER)) {
+ memid= params[0]->value.string.string;
+ size= params[1]->value.number;
+ width= params[2]->value.number;
+ }
+ else
+ syntax_error(con);
+
+ if (!memid ||
+ !*memid)
+ con->dd_printf("Wrong id\n");
+ else if ((size < 1) ||
+ (size > max_mem_size))
+ con->dd_printf("Wrong size\n");
+ else if ((width < 1) ||
+ (width > 32))
+ con->dd_printf("Wrong width\n");
+ else
+ {
+ class cl_memory *mem= new cl_memory_chip(memid, size, width);
+ mem->init();
+ uc->memchips->add(mem);
+ mem->set_uc(uc);
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_chip_cmd,
+ "memory create chip id size cellsize",
+ "Create a new memory chip",
+ "long help of memory create chip")
+
+/*
+ * Command: memory create addressspace
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_conf_addmem_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_memory_create_addressspace_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ char *memid= NULL;
+ int start= 0, size= -1, width= 8;
+
+ if (cmdline->syntax_match(uc, STRING NUMBER)) {
+ memid= params[0]->value.string.string;
+ size= params[1]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER)) {
+ memid= params[0]->value.string.string;
+ start= params[1]->value.number;
+ size= params[2]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER NUMBER)) {
+ memid= params[0]->value.string.string;
+ start= params[1]->value.number;
+ size= params[2]->value.number;
+ width= params[3]->value.number;
+ }
+ else
+ syntax_error(con);
+
+ if (!memid ||
+ !*memid)
+ con->dd_printf("Wrong id\n");
+ else if ((size < 1) ||
+ (size > max_mem_size))
+ con->dd_printf("Wrong size\n");
+ else if ((width < 1) ||
+ (width > 32))
+ con->dd_printf("Wrong width\n");
+ else
+ {
+ class cl_address_space *mem=
+ new cl_address_space(memid, start, size, width);
+ mem->init();
+ uc->address_spaces->add(mem);
+ mem->set_uc(uc);
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_addressspace_cmd,
+ "memory create addressspace id startaddr size",
+ "Create a new address space",
+ "long help of memory create addressspace")
+
+/*
+ * Command: memory create addressdecoder
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_conf_addmem_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_memory_create_addressdecoder_cmd)
+{
+ class cl_cmd_arg *params[5]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3),
+ cmdline->param(4) };
+ class cl_memory *as= 0, *chip= 0;
+ t_addr as_begin= 0, as_end= 0, chip_begin= 0;
+
+ if (cmdline->syntax_match(uc, MEMORY MEMORY)) {
+ as= params[0]->value.memory.memory;
+ as_end= as->highest_valid_address();
+ chip= params[1]->value.memory.memory;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY MEMORY NUMBER)) {
+ as= params[0]->value.memory.memory;
+ as_end= as->highest_valid_address();
+ chip= params[1]->value.memory.memory;
+ chip_begin= params[2]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER MEMORY)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ as_end= as->highest_valid_address();
+ chip= params[2]->value.memory.memory;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER MEMORY NUMBER)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ as_end= as->highest_valid_address();
+ chip= params[2]->value.memory.memory;
+ chip_begin= params[3]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ as_end= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ as_end= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ chip_begin= params[4]->value.number;
+ }
+ else
+ syntax_error(con);
+
+ if (!as->is_address_space())
+ con->dd_printf("%s is not an address space\n", as->get_name("unknown"));
+ else if (!chip->is_chip())
+ con->dd_printf("%s is not a memory chip\n", chip->get_name("unknown"));
+ else if (as_begin > as_end)
+ con->dd_printf("Wrong address area specification\n");
+ else if (chip_begin >= chip->get_size())
+ con->dd_printf("Wrong chip area specification\n");
+ else if (as_begin < as->start_address ||
+ as_end > as->highest_valid_address())
+ con->dd_printf("Specified area is out of address space\n");
+ else if (as_end-as_begin > chip->get_size()-chip_begin)
+ con->dd_printf("Specified area is out of chip size\n");
+ else
+ {
+ class cl_address_decoder *d=
+ new cl_address_decoder(as, chip, as_begin, as_end, chip_begin);
+ d->init();
+ ((class cl_address_space *)as)->decoders->add(d);
+ d->activate(con);
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_addressdecoder_cmd,
+ "memory create addressdecoder addressspace begin end chip begin",
+ "Create a new address decoder",
+ "long help of memory create addressdecoder")
+
+/*
+ * Command: memory create banker
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_memory_create_banker_cmd)
+{
+ class cl_cmd_arg *params[6]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3),
+ cmdline->param(4),
+ cmdline->param(5) };
+ class cl_memory *banker_as= 0, *banked_as= 0;
+ t_addr addr= 0, asb= 0, ase= 0;
+ t_mem mask= 0;
+
+ if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER NUMBER)) {
+ banker_as= params[0]->value.memory.memory;
+ addr= params[1]->value.number;
+ mask= params[2]->value.number;
+ banked_as= params[3]->value.memory.memory;
+ asb= params[4]->value.number;
+ ase= params[5]->value.number;
+ }
+ else
+ return syntax_error(con), false;
+
+ if (!banker_as->is_address_space())
+ con->dd_printf("%s is not an address space\n", banker_as->get_name("unknown"));
+ else if (!banked_as->is_address_space())
+ con->dd_printf("%s is not an address space\n", banked_as->get_name("unknown"));
+ else if (addr < banker_as->start_address ||
+ addr > banker_as->highest_valid_address())
+ con->dd_printf("Specified banker address is out of address space\n");
+ else if (asb < banked_as->start_address ||
+ asb > banked_as->highest_valid_address())
+ con->dd_printf("Specified banked start address is out of address space\n");
+ else if (ase < banked_as->start_address ||
+ ase > banked_as->highest_valid_address())
+ con->dd_printf("Specified banked end address is out of address space\n");
+ else
+ {
+ class cl_banker *d=
+ new cl_banker((class cl_address_space *)banker_as, addr, mask, //0,
+ (class cl_address_space *)banked_as, asb, ase);
+ d->init();
+ ((class cl_address_space *)banked_as)->decoders->add(d);
+ ((class cl_address_space *)banked_as)->undecode_area(d, asb, ase, con);
+ d->activate(con);
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_banker_cmd,
+ "memory create banker switcher_addressspace switcher_address switcher_mask banked_addressspace start end",
+ "Create a new bank switcher",
+ "long help of memory create banker")
+
+/*
+ * Command: memory create bander
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_memory_create_bander_cmd)
+{
+ class cl_cmd_arg *params[7]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3),
+ cmdline->param(4),
+ cmdline->param(5),
+ cmdline->param(6) };
+ class cl_memory *as= 0;
+ t_addr asb= 0, ase= 0;
+ class cl_memory *chip= 0;
+ t_addr cb= 0;
+ int bpc= 0, dist= 1;
+
+ if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER NUMBER NUMBER))
+ {
+ as= params[0]->value.memory.memory;
+ asb= params[1]->value.number;
+ ase= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ cb= params[4]->value.number;
+ bpc= params[5]->value.number;
+ dist= params[6]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER NUMBER))
+ {
+ as= params[0]->value.memory.memory;
+ asb= params[1]->value.number;
+ ase= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ cb= params[4]->value.number;
+ bpc= params[5]->value.number;
+ }
+ else
+ return syntax_error(con), false;
+
+ if (!as->is_address_space())
+ con->dd_printf("%s is not an address space\n", as->get_name("unknown"));
+ else if (!chip->is_chip())
+ con->dd_printf("%s is not a chip\n", chip->get_name("unknown"));
+ else if (asb < as->start_address ||
+ asb > as->highest_valid_address())
+ con->dd_printf("Specified begin address is out of address space\n");
+ else if (ase < as->start_address ||
+ ase > as->highest_valid_address())
+ con->dd_printf("Specified end address is out of address space\n");
+ else if (cb < chip->start_address ||
+ cb > chip->highest_valid_address())
+ con->dd_printf("Specified chip address is out of size\n");
+ else
+ {
+ class cl_bander *b=
+ new cl_bander((class cl_address_space *)as, asb, ase,
+ (class cl_memory_chip *)chip, cb,
+ bpc, dist);
+ b->init();
+ ((class cl_address_space *)as)->decoders->add(b);
+ b->activate(con);
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_bander_cmd,
+ "memory create bander addressspace begin end chip begin bits_per_chip [distance]",
+ "Create a new bit bander",
+ "long help of memory create bander")
+
+/*
+ * Command: memory create bank
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_memory_create_bank_cmd)
+{
+ class cl_cmd_arg *params[5]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3),
+ cmdline->param(4) };
+ class cl_memory *as= 0, *chip= 0;
+ t_addr as_begin= 0, chip_begin= 0;
+ int bank= -1;
+
+ if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ bank= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ chip_begin= params[4]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY)) {
+ as= params[0]->value.memory.memory;
+ as_begin= params[1]->value.number;
+ bank= params[2]->value.number;
+ chip= params[3]->value.memory.memory;
+ }
+ else
+ return syntax_error(con), false;
+
+ if (!as->is_address_space())
+ con->dd_printf("%s is not an address space\n", as->get_name("unknown"));
+ else if (!chip->is_chip())
+ con->dd_printf("%s is not a memory chip\n", chip->get_name("unknown"));
+ else if (chip_begin >= chip->get_size())
+ con->dd_printf("Wrong chip area specification\n");
+ else if (as_begin < as->start_address ||
+ as_begin > as->highest_valid_address())
+ con->dd_printf("Specified area is out of address space\n");
+ else
+ {
+ class cl_banker *d=
+ (class cl_banker *)((class cl_address_space *)as)->get_decoder_of(as_begin);
+ if (!d)
+ con->dd_printf("Specified address is not decoded, create a banker first\n");
+ else if (!d->is_banker())
+ con->dd_printf("Specified area is not decoded by banker\n");
+ else
+ {
+ d->add_bank(bank, chip, chip_begin);
+ }
+ }
+ return(false);
+}
+
+CMDHELP(cl_memory_create_bank_cmd,
+ "memory create bank addressspace begin bank_nr chip begin",
+ "Add a new bank to bank switcher",
+ "long help of memory create bank")
+
+/*
+ * Command: memory cell
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_memory_cell_cmd)
+{
+ class cl_cmd_arg *params[5]= { cmdline->param(0),
+ cmdline->param(1) };
+ class cl_memory *m= 0;
+ t_addr a= 0;
+ class cl_address_space *as= 0;
+ class cl_memory_cell *c= 0;
+
+ if (cmdline->syntax_match(uc, CELL))
+ {
+ c= params[0]->value.cell;
+ m= as= uc->address_space(c, &a);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY ADDRESS /*NUMBER*/))
+ {
+ m= params[0]->value.memory.memory;
+ a= params[1]->value.number;
+ if (m->is_address_space())
+ as= (cl_address_space *)m;
+ }
+ if (as == 0)
+ return syntax_error(con), false;
+
+ if (!c)
+ c= as->get_cell(a);
+ con->dd_printf("%s", as->get_name());
+ con->dd_printf("[");
+ con->dd_printf(as->addr_format, a);
+ con->dd_printf("] %s\n", (char*)uc->cell_name(c));
+
+ con->dd_printf("cell data=%p/%d mask=%x flags=%x\n",
+ c->get_data(),
+ MU(c->get_width()),
+ MU(c->get_mask()),
+ MU(c->get_flags()));
+
+ int i;
+ for (i= 0; i < uc->memchips->count; i++)
+ {
+ cl_memory_chip *ch= (cl_memory_chip*)(uc->memchips->at(i));
+ t_addr ad;
+ if ((ad= ch->is_slot(c->get_data())) >= 0)
+ {
+ con->dd_printf(" decoded to %s[%u]\n",
+ ch->get_name(), AU(ad));
+ break;
+ }
+ }
+
+ con->dd_printf("Operators:\n");
+ c->print_operators(" ", con);
+
+ return false;
+}
+
+CMDHELP(cl_memory_cell_cmd,
+ "memory cell",
+ "Information about a memory cell",
+ "long help of memory cell")
+
+/* End of cmd.src/cmd_mem.cc */
diff --git a/sim/ucsim/cmd.src/cmd_mem.o b/sim/ucsim/cmd.src/cmd_mem.o
new file mode 100644
index 0000000..bc5ec79
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_mem.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_memcl.h b/sim/ucsim/cmd.src/cmd_memcl.h
new file mode 100644
index 0000000..b813afd
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_memcl.h
@@ -0,0 +1,61 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdmemcl.h)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_MEM_HEADER
+#define CMD_CMD_MEM_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_memory_help(class cl_cmd *cmd);
+extern void set_memory_create_help(class cl_cmd *cmd);
+
+// MEMORY CREATE CHIP
+COMMAND_ON(uc,cl_memory_create_chip_cmd);
+
+// MEMORY CREATE ADDRESSSPACE
+COMMAND_ON(uc,cl_memory_create_addressspace_cmd);
+
+// MEMORY CREATE ADDRESSDECODER
+COMMAND_ON(uc,cl_memory_create_addressdecoder_cmd);
+
+// MEMORY CREATE BANKER
+COMMAND_ON(uc,cl_memory_create_banker_cmd);
+
+// MEMORY CREATE BANDER
+COMMAND_ON(uc,cl_memory_create_bander_cmd);
+
+// MEMORY CREATE BANK
+COMMAND_ON(uc,cl_memory_create_bank_cmd);
+
+// MEMORY CELL
+COMMAND_ON(uc,cl_memory_cell_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_memcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_set.cc b/sim/ucsim/cmd.src/cmd_set.cc
new file mode 100644
index 0000000..68b1bc8
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_set.cc
@@ -0,0 +1,401 @@
+/*
+ * Simulator of microcontrollers (cmd.src/set.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/*
+ This file is part of microcontroller simulator: ucsim.
+
+ UCSIM is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ UCSIM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with UCSIM; see the file COPYING. If not, write to the Free
+ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA.
+*/
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <ctype.h>
+#include "i_string.h"
+
+// prj
+#include "errorcl.h"
+#include "appcl.h"
+
+// sim
+#include "simcl.h"
+#include "optioncl.h"
+
+// local
+#include "cmd_setcl.h"
+#include "cmdutil.h"
+
+
+void
+set_set_help(class cl_cmd *cmd)
+{
+ cmd->set_help("set subcommand",
+ "Set value of different objects",
+ "Long of set");
+}
+
+/*
+ * Command: set memory
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_set_mem_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_set_mem_cmd)
+{
+ class cl_memory *mem= 0;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (cmdline->syntax_match(uc, MEMORY ADDRESS DATALIST)) {
+ mem= params[0]->value.memory.memory;
+ t_addr start= params[1]->value.address;
+ t_mem *array= params[2]->value.data_list.array;
+ int len= params[2]->value.data_list.len;
+
+ if (len == 0)
+ con->dd_printf("Error: no data\n");
+ else if (start < mem->get_start_address())
+ con->dd_printf("Start address less then 0x%x\n",
+ AU(mem->get_start_address()));
+ else
+ {
+ int i;
+ t_addr addr;
+ for (i= 0, addr= start;
+ i < len && mem->valid_address(addr);
+ i++, addr++)
+ mem->write(addr, array[i]);
+ uc->check_errors();
+ mem->dump(start, start+len-1, 8, con/*->get_fout()*/);
+ }
+ }
+ else
+ syntax_error(con);
+
+ return(false);;
+}
+
+CMDHELP(cl_set_mem_cmd,
+ "set memory memory_type address data...",
+ "Place list of data into memory",
+ "long help of set memory")
+
+/*
+ * Command: set bit
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_set_bit_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_set_bit_cmd)
+{
+ class cl_memory *mem;
+ t_addr mem_addr= 0;
+ t_mem bit_mask= 0;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (cmdline->syntax_match(uc, BIT NUMBER)) {
+ mem= params[0]->value.bit.mem;
+ mem_addr= params[0]->value.bit.mem_address;
+ bit_mask= params[0]->value.bit.mask;
+ if (params[1]->value.number)
+ mem->set_bit1(mem_addr, bit_mask);
+ else
+ mem->set_bit0(mem_addr, bit_mask);
+ mem->dump(mem_addr, mem_addr, 1, con/*->get_fout()*/);
+ }
+ else
+ syntax_error(con);
+
+ return(false);;
+}
+
+CMDHELP(cl_set_bit_cmd,
+ "set bit addr 0|1",
+ "Set specified bit to 0 or 1",
+ "long help of set bit")
+
+/*
+ * Command: set hw
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_set_hw_cmd)
+{
+ class cl_hw *hw= 0;
+ class cl_cmd_arg *params[1]= { cmdline->param(0)/*,
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3)*/ };
+
+ if (params[0] && /*cmdline->syntax_match(uc, HW)*/params[0]->as_hw(uc)) {
+ hw= params[0]->value.hw;
+ //pn= hw->id;
+ //l= params[1]->value.number;
+ }
+ /*else if (cmdline->syntax_match(uc, NUMBER NUMBER)) {
+ pn= params[0]->value.number;
+ l= params[1]->value.number;
+ hw= uc->get_hw(HW_PORT, pn, 0);
+ }*/
+ else
+ syntax_error(con);
+ /*if (pn < 0 ||
+ pn > 3)
+ con->dd_printf("Error: wrong port\n");
+ else*/
+ {
+ if (hw)
+ {
+ cmdline->shift();
+ hw->set_cmd(cmdline, con);
+ }
+ else
+ con->dd_printf("Error: no hw\n");
+ }
+ return(false);;
+}
+
+CMDHELP(cl_set_hw_cmd,
+ "set hardware cathegory params...",
+ "Set parameters of specified hardware element",
+ "long help of set hardware")
+
+/*
+ * Command: set option
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_set_option_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_APP(cl_set_option_cmd)
+{
+ char *id= 0, *s= 0;
+ int idx;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ class cl_option *option= 0;
+
+ if (cmdline->syntax_match(0/*app->get_uc()*/, NUMBER STRING)) {
+ idx= params[0]->value.number;
+ s= params[1]->value.string.string;
+ option= app->options->get_option(idx);
+ }
+ else if (cmdline->syntax_match(0, STRING STRING STRING)) {
+ id= params[0]->value.string.string;
+ char *cr= params[1]->value.string.string;
+ s= params[2]->value.string.string;
+ int n= app->options->nuof_options(id, cr);
+ if (n > 1)
+ {
+ con->dd_printf("Ambiguous option name, use number instead\n");
+ return(false);
+ }
+ else if (n == 0)
+ ;//con->dd_printf("Named option does not exist\n");
+ else
+ {
+ if ((option= app->options->get_option(id, cr)) == 0)
+ option= app->options->get_option(cr, id);
+ }
+ }
+ else if (cmdline->syntax_match(0/*app->get_uc()*/, STRING STRING)) {
+ id= params[0]->value.string.string;
+ s= params[1]->value.string.string;
+ int n= app->options->nuof_options(id);
+ if (n > 1)
+ {
+ char *cr= (char*)con->get_name();
+ n= app->options->nuof_options(id, cr);
+ if (n > 1)
+ con->dd_printf("Ambiguous option name, use number instead\n");
+ else if (n == 0)
+ con->dd_printf("Option does not exist\n");
+ else
+ option= app->options->get_option(id, cr);
+ }
+ else if (n == 0)
+ ;//con->dd_printf("Named option does not exist\n");
+ else
+ option= app->options->get_option(id);
+ }
+ else
+ syntax_error(con);
+ if (!option)
+ {
+ con->dd_printf("Option does not exist\n");
+ return(false);
+ }
+
+ option->set_value(s);
+
+ return(false);
+}
+
+CMDHELP(cl_set_option_cmd,
+ "set option name|nr value",
+ "Set value of an option",
+ "long help of set option")
+
+/*
+ * Command: set error
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_set_option_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_APP(cl_set_error_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ char *error_name= 0, *value= 0;
+
+ if (cmdline->syntax_match(0/*app->get_uc()*/, STRING STRING)) {
+ error_name= params[0]->value.string.string;
+ value= params[1]->value.string.string;
+ }
+ else
+ syntax_error(con);
+
+ class cl_list *registered_errors = cl_error_registry::get_list();
+ if (error_name &&
+ value &&
+ registered_errors)
+ {
+ int i;
+ for (i= 0; i < registered_errors->count; i++)
+ {
+ class cl_error_class *e=
+ dynamic_cast<class cl_error_class *>(registered_errors->object_at(i));
+ if (e->is_inamed(error_name))
+ {
+ if (strchr("uU-?", *value) != NULL)
+ e->set_on(ERROR_PARENT);
+ else if (strchr("1tTyY", *value) != NULL ||
+ (strlen(value) > 1 &&
+ strchr("nN", value[2]) != NULL))
+ e->set_on(ERROR_ON);
+ else if (strchr("0fFnN", *value) != NULL ||
+ (strlen(value) > 1 &&
+ strchr("fF", value[2]) != NULL))
+ e->set_on(ERROR_OFF);
+ else
+ con->dd_printf("Bad value (%s)\n", value);
+ return(false);
+ }
+ }
+ }
+ con->dd_printf("Error %s not found\n", error_name);
+
+ return(false);
+}
+
+CMDHELP(cl_set_error_cmd,
+ "set error error_name on|off|unset",
+ "Set value of an error",
+ "long help of set error")
+
+/*
+ * Command: set console
+ *----------------------------------------------------------------------------
+ */
+COMMAND_DO_WORK_APP(cl_set_console_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ char *s1= 0, *s2= 0;
+ class cl_uc *uc= app->sim->uc;
+ if (params[0] && /*cmdline->syntax_match(uc, HW)*/params[0]->as_hw(uc))
+ {
+ class cl_hw *hw= params[0]->value.hw;
+ con->dd_printf("Converting console to display of %s[%d]...\n",
+ hw->id_string, hw->id);
+ hw->new_io(con->get_fin(), con->get_fout());
+ if (hw->get_io())
+ return con->drop_files(), true;
+ else
+ return con->dd_printf("%s[%d]: no display\n", hw->id_string, hw->id), false;
+ }
+
+ if (cmdline->syntax_match(0, STRING))
+ s1= params[0]->value.string.string;
+ else if (cmdline->syntax_match(0, STRING STRING))
+ {
+ s1= params[0]->value.string.string;
+ s2= params[1]->value.string.string;
+ }
+
+ if (!s1)
+ return false;
+
+ if (strstr(s1, "i") == s1)
+ {
+ // interactive
+ int val;
+ if (!bool_name(s2, &val))
+ val= 1;
+ con->set_interactive(val);
+ }
+ else if (strstr(s1, "n") == s1)
+ {
+ // non-interactive
+ con->set_interactive(false);
+ }
+ else if (strstr(s1, "r") == s1)
+ {
+ // raw
+ con->set_cooked(false);
+ }
+ else if ((strstr(s1, "c") == s1) ||
+ (strstr(s1, "e") == s1))
+ {
+ // coocked, edited
+ con->set_cooked(true);
+ }
+ else
+ syntax_error(con);
+
+ return false;
+}
+
+CMDHELP(cl_set_console_cmd,
+ "set console interactive [on|off]|noninteractive|raw|edited",
+ "Set console parameters",
+ "long help of set console")
+
+/* End of cmd.src/cmd_set.cc */
diff --git a/sim/ucsim/cmd.src/cmd_set.o b/sim/ucsim/cmd.src/cmd_set.o
new file mode 100644
index 0000000..bb5ed82
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_set.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_setcl.h b/sim/ucsim/cmd.src/cmd_setcl.h
new file mode 100644
index 0000000..d598f68
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_setcl.h
@@ -0,0 +1,57 @@
+/*
+ * Simulator of microcontrollers (cmd.src/setcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_SETCL_HEADER
+#define CMD_CMD_SETCL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_set_help(class cl_cmd *cmd);
+
+// SET MEMORY
+COMMAND_ON(uc,cl_set_mem_cmd);
+
+// SET BIT
+COMMAND_ON(uc,cl_set_bit_cmd);
+
+// SET HW
+COMMAND_ON(uc,cl_set_hw_cmd);
+
+// SET OPTION
+COMMAND_ON(app,cl_set_option_cmd);
+
+// SET ERROR
+COMMAND_ON(app,cl_set_error_cmd);
+
+// SET CONSOLE
+COMMAND_ON(app,cl_set_console_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_setcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_show.cc b/sim/ucsim/cmd.src/cmd_show.cc
new file mode 100644
index 0000000..d899375
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_show.cc
@@ -0,0 +1,278 @@
+/*
+ * Simulator of microcontrollers (cmd.src/show.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdlib.h>
+#include "i_string.h"
+
+// prj
+#include "globals.h"
+#include "utils.h"
+#include "errorcl.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_showcl.h"
+
+
+void
+set_show_help(class cl_cmd *cmd)
+{
+ cmd->set_help("show subcommand",
+ "Generic command for showing things about",
+ "Long of show");
+}
+
+/*
+ * Command: show copying
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_show_copying_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK(cl_show_copying_cmd)
+{
+ con->dd_printf("%s\n", copying);
+ return(false);;
+}
+
+CMDHELP(cl_show_copying_cmd,
+ "show copying",
+ "Conditions for redistributing copies of uCsim",
+ "long help of show copying")
+
+/*
+ * Command: show warranty
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_show_warranty_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK(cl_show_warranty_cmd)
+{
+ con->dd_printf("%s\n", warranty);
+ return(false);;
+}
+
+CMDHELP(cl_show_warranty_cmd,
+ "show warranty",
+ "Various kinds of warranty you do not have",
+ "long help of show warranty")
+
+/*
+ * Command: show option
+ *----------------------------------------------------------------------------
+ */
+COMMAND_DO_WORK_APP(cl_show_option_cmd)
+{
+ class cl_cmd_arg *parm= cmdline->param(0);
+ char *s= 0;
+
+ if (!parm)
+ ;
+ else if (cmdline->syntax_match(0/*app->get_uc()*/, STRING)) {
+ s= parm->value.string.string;
+ }
+ else
+ syntax_error(con);
+
+ int i;
+ for (i= 0; i < app->options->count; i++)
+ {
+ class cl_option *o= (class cl_option *)(/*uc*/app->options->at(i));
+ if (!s ||
+ !strcmp(s, o->get_name()))
+ {
+ int j;
+ con->dd_printf("%d. %s (%p): ", i, object_name(o), o);
+ o->print(con);
+ con->dd_printf(" - %s\n", o->help);
+ con->dd_printf(" Type: %s\n", o->get_type_name());
+ /*union option_value *val= o->get_value();
+ con->dd_printf(" Value: \"");
+ unsigned int uj;
+ TYPE_UBYTE *d= (TYPE_UBYTE*)val;
+ for (uj= 0; uj < sizeof(*val); uj++)
+ con->print_char_octal(d[uj]);
+ con->dd_printf("\"\n");*/
+ con->dd_printf(" Hidden: %s\n", (o->hidden)?"True":"False");
+ con->dd_printf(" Creator: \"%s\"\n %d Users:\n",
+ object_name(o->get_creator()),
+ o->users->count);
+ for (j= 0; j < o->users->count; j++)
+ {
+ class cl_optref *r= (class cl_optref *)(o->users->at(j));
+ con->dd_printf(" %2d. owner(s)=\"%s\"\n", j,
+ object_name(r->get_owner()));
+ }
+ if (i >= 0 &&
+ i < app->options->count-1)
+ con->dd_printf("\n");
+ }
+ }
+
+ return(false);
+}
+
+CMDHELP(cl_show_option_cmd,
+ "show option [name]",
+ "Show internal data of options",
+ "long help of show option")
+
+// prj
+#include "errorcl.h"
+
+static void
+show_error_cmd_print_node(class cl_console_base *con,
+ int indent, class cl_base *node)
+{
+ if (!node)
+ return;
+ int i;
+ for (i= 0; i < indent; i++)
+ con->dd_printf(" ");
+ const char *name= node->get_name("unknown");
+ class cl_error_class *ec= dynamic_cast<class cl_error_class *>(node);
+ char *str;
+ con->dd_printf("%s: %s [%s/%s]\n",
+ str= case_string(case_case, ec->get_type_name()),
+ name, get_id_string(error_on_off_names,
+ ec->get_on()),
+ (ec->is_on())?"ON":"OFF");
+ free(str);
+ class cl_base *c= node->first_child();
+ while (c)
+ {
+ show_error_cmd_print_node(con, indent+2, c);
+ c= node->next_child(c);
+ }
+}
+
+/*
+ * Command: show error
+ *----------------------------------------------------------------------------
+ */
+COMMAND_DO_WORK_APP(cl_show_error_cmd)
+{
+ /*class cl_cmd_arg *parm= cmdline->param(0);
+ char *s= 0;
+
+ if (!parm)
+ ;
+ else if (cmdline->syntax_match(0, STRING)) {
+ s= parm->value.string.string;
+ }
+ else
+ syntax_error(con);
+ */
+ class cl_list *registered_errors = cl_error_registry::get_list();
+ int i;
+ for (i= 0; i < registered_errors->count; i++)
+ {
+ class cl_error_class *ec;
+ ec= dynamic_cast<class cl_error_class*>(registered_errors->object_at(i));
+ if (!ec->get_parent())
+ show_error_cmd_print_node(con, 0, ec);
+ }
+ return(false);
+}
+
+CMDHELP(cl_show_error_cmd,
+ "show error",
+ "Show class of errors",
+ "long help of show error")
+
+#include "newcmdposixcl.h"
+
+/*
+ * Command: show console
+ *----------------------------------------------------------------------------
+ */
+
+static void
+print_fio_info(class cl_console_base *con, class cl_f *ff)
+{
+ if (ff)
+ {
+ char *n= ff->get_file_name();
+ chars t= fio_type_name(ff->type);
+ con->dd_printf("\"%s\",%s,", n, (char*)t);
+ con->dd_printf("%d,%d,", ff->file_id, ff->server_port);
+ con->dd_printf("%s,%s",
+ ff->tty?"tty":"non-tty",
+ ff->get_cooking()?"cooked":"raw");
+ class cl_f *e= ff->get_echo_to();
+ if (e)
+ con->dd_printf("(echo>%d)", e->file_id);
+ if (ff->get_telnet())
+ con->dd_printf(",telnet");
+ if (ff->get_escape())
+ con->dd_printf(",esc");
+ }
+ con->dd_printf("\n");
+}
+
+COMMAND_DO_WORK_APP(cl_show_console)
+{
+ class cl_commander_base *cm= app->get_commander();
+ class cl_console *cn;
+ int i;
+
+ for (i= 0; i < cm->cons->count; i++)
+ {
+ cn= (class cl_console *)(cm->cons->at(i));
+ con->dd_printf("%d %s %s(%d) ", cn->get_id(), cn->get_name(),
+ cn->prevent_quit()?"PrevQuit":"", cn->prev_quit);
+ int f= cn->get_flags();
+ con->dd_printf("%c", 'D'|((f&CONS_DEBUG)?0:0x20));
+ con->dd_printf("%c", 'F'|((f&CONS_FROZEN)?0:0x20));
+ con->dd_printf("%c", 'A'|((!(f&CONS_INACTIVE))?0:0x20));
+ con->dd_printf("%c", 'W'|((!(f&CONS_NOWELCOME))?0:0x20));
+ con->dd_printf("%c", 'I'|((f&CONS_INTERACTIVE)?0:0x20));
+ con->dd_printf("%c", 'E'|((f&CONS_ECHO)?0:0x20));
+ con->dd_printf("\n");
+ class cl_f *ff= cn->get_fin();
+ con->dd_printf(" <");
+ print_fio_info(con, ff);
+ ff= cn->get_fout();
+ con->dd_printf(" >");
+ print_fio_info(con, ff);
+ }
+ return false;
+}
+
+CMDHELP(cl_show_console,
+ "",
+ "",
+ "");
+
+/* End of cmd.src/cmd_show.cc */
diff --git a/sim/ucsim/cmd.src/cmd_show.o b/sim/ucsim/cmd.src/cmd_show.o
new file mode 100644
index 0000000..e1e064c
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_show.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_showcl.h b/sim/ucsim/cmd.src/cmd_showcl.h
new file mode 100644
index 0000000..b6d5a47
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_showcl.h
@@ -0,0 +1,54 @@
+/*
+ * Simulator of microcontrollers (cmd.src/showcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_SHOWCL_HEADER
+#define CMD_CMD_SHOWCL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_show_help(class cl_cmd *cmd);
+
+// SHOW COPYING
+COMMAND(cl_show_copying_cmd);
+
+// SHOW WARRANTY
+COMMAND(cl_show_warranty_cmd);
+
+// SHOW OPTION
+COMMAND_ON(app,cl_show_option_cmd);
+
+// SHOW ERROR
+COMMAND_ON(app,cl_show_error_cmd);
+
+// SHOW CONSOLE
+COMMAND_ON(app,cl_show_console);
+
+
+#endif
+
+/* End of cmd.src/cmd_showcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_stat.cc b/sim/ucsim/cmd.src/cmd_stat.cc
new file mode 100644
index 0000000..c77436b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_stat.cc
@@ -0,0 +1,123 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdstat.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+// prj
+#include "globals.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_statcl.h"
+
+
+#ifdef STATISTIC
+/*
+ * Command: statistic
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_stat_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_statistic_cmd)
+{
+ class cl_address_space *mem;
+ t_addr start= 0, end= 0;
+ bool addresses= false;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ mem= 0;
+ if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS)) {
+ mem= params[0]->value.memory.address_space;
+ start= params[1]->value.address;
+ end= params[2]->value.address;
+ addresses= true;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY ADDRESS)) {
+ mem= params[0]->value.memory.address_space;
+ start= end= params[1]->value.address;
+ addresses= true;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY)) {
+ mem= params[0]->value.memory.address_space;
+ addresses= false;
+ }
+ else
+ {
+ int i;
+ unsigned long wr, ww;
+ for (i= 0; i < uc->address_spaces->count; i++)
+ {
+ mem= (class cl_address_space *)(uc->address_spaces->at(i));
+ wr= mem->get_nuof_reads();
+ ww= mem->get_nuof_writes();
+ con->dd_printf("%s writes= %10lu "
+ "reads= %10lu "
+ "(%10lu operations)\n",
+ mem->get_name("mem"), ww, wr, ww+wr);
+ }
+ }
+ if (mem)
+ {
+ t_addr i;
+ unsigned long wr, ww;
+ wr= mem->get_nuof_reads();
+ ww= mem->get_nuof_writes();
+ if (!addresses)
+ con->dd_printf("%s writes= %10lu "
+ "reads= %10lu\n", mem->get_name("mem"), ww, wr);
+ else
+ for (i= start; i <= end; i++)
+ {
+ class cl_memory_cell *c= mem->get_cell(i);
+ unsigned long w= c->nuof_writes, r= c->nuof_reads;
+ double dr= wr?((double(r)*100.0)/double(wr)):0.0;
+ double dw= ww?((double(w)*100.0)/double(ww)):0.0;
+ con->dd_printf("%s[0x%06x] writes= %10lu (%6.2lf%%) "
+ "reads= %10lu (%6.2lf%%)\n",
+ mem->get_name("mem"), AU(i), w, dw, r, dr);
+ }
+ }
+
+ return(false);;
+}
+
+CMDHELP(cl_statistic_cmd,
+ "statistic [mem [startaddr [endaddr]]]",
+ "Statistic of memory accesses",
+ "long help of statistic")
+
+#endif
+
+
+/* End of cmd.src/cmd_stat.cc */
diff --git a/sim/ucsim/cmd.src/cmd_stat.o b/sim/ucsim/cmd.src/cmd_stat.o
new file mode 100644
index 0000000..241a0c9
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_stat.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_statcl.h b/sim/ucsim/cmd.src/cmd_statcl.h
new file mode 100644
index 0000000..d93914b
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_statcl.h
@@ -0,0 +1,44 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdstatcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_STATCL_HEADER
+#define CMD_CMD_STATCL_HEADER
+
+#include "ddconfig.h"
+
+#include "newcmdcl.h"
+
+
+#ifdef STATISTIC
+// STATISTIC
+COMMAND_ON(uc,cl_statistic_cmd);
+#endif
+
+
+#endif
+
+/* End of cmd.src/cmd_statcl.h */
diff --git a/sim/ucsim/cmd.src/cmd_timer.cc b/sim/ucsim/cmd.src/cmd_timer.cc
new file mode 100644
index 0000000..a4563b3
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_timer.cc
@@ -0,0 +1,326 @@
+/*
+ * Simulator of microcontrollers (cmd.src/timer.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include "stdio.h"
+#include "i_string.h"
+
+// sim
+#include "simcl.h"
+
+// local
+#include "cmd_timercl.h"
+
+
+void
+set_timer_help(class cl_cmd *cmd)
+{
+ cmd->set_help("timer subcommand",
+ "Manage timers",
+ "Long of timer");
+}
+
+/*
+ * Command: timer
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_timer_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_timer_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (!params[0])
+ {
+ con->dd_printf("Timer id is missing.");
+ return(false);
+ }
+ if (params[0]->as_number())
+ {
+ as_nr= true;
+ id_nr= params[0]->value.number;
+ id_str= 0;
+ if (id_nr <= 0)
+ {
+ con->dd_printf("Error: "
+ "Timer id must be greater than zero or a string\n");
+ return(true);
+ }
+ ticker= uc->get_counter(id_nr);
+ }
+ else
+ {
+ as_nr= false;
+ id_str= params[0]->s_value;
+ ticker= uc->get_counter(id_str);
+ }
+ cmdline->shift();
+ return(false);
+}
+
+CMDHELP(cl_timer_cmd,
+ "timer subcommand",
+ "Manage timers",
+ "long help of timer")
+
+/*
+ * Command: timer add
+ *-----------------------------------------------------------------------------
+ * Add a new timer to the list
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_add_cmd)
+ //add(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ long dir= +1, in_isr= 0;
+
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+ if (ticker)
+ {
+ if (!as_nr)
+ con->dd_printf("Error: Timer \"%s\" already exists\n", (char*)id_str);
+ else
+ con->dd_printf("Error: Timer %d already exists\n", id_nr);
+ return(false);
+ }
+
+ if (cmdline->nuof_params() > 0)
+ {
+ if (cmdline->syntax_match(uc, NUMBER))
+ dir= params[0]->value.number;
+ else if (cmdline->syntax_match(uc, NUMBER NUMBER))
+ {
+ dir= params[0]->value.number;
+ in_isr= params[1]->value.number;
+ }
+ }
+
+ if (!as_nr)
+ {
+ ticker= new cl_ticker(dir, in_isr, (char*)id_str);
+ uc->add_counter(ticker, id_str);
+ }
+ else
+ {
+ ticker= new cl_ticker(dir, in_isr, 0);
+ uc->add_counter(ticker, id_nr);
+ }
+
+ return(false);
+}
+
+CMDHELP(cl_timer_add_cmd,
+ "timer add id [direction [in_isr]]",
+ "Create a clock counter (timer)",
+ "log help of timer add")
+
+/*
+ * Command: timer delete
+ *-----------------------------------------------------------------------------
+ * Delete a timer from the list
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_delete_cmd)
+ //del(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+ if (!ticker)
+ {
+ if (!as_nr)
+ con->dd_printf("Timer \"%s\" does not exist\n", (char*)id_str);
+ else
+ con->dd_printf("Timer %d does not exist\n", id_nr);
+ return(false);
+ }
+ if (!as_nr)
+ uc->del_counter(id_str);
+ else
+ uc->del_counter(id_nr);
+
+ return(false);
+}
+
+CMDHELP(cl_timer_delete_cmd,
+ "timer delete id",
+ "Delete a timer",
+ "long help of timer delete")
+
+/*
+ * Command: timer get
+ *-----------------------------------------------------------------------------
+ * Get the value of just one timer or all of them
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_get_cmd)
+ //get(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ if (cmdline->nuof_params())
+ {
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+ }
+ else
+ ticker= 0;
+ if (ticker)
+ ticker->dump(id_nr, uc->xtal, con);
+ else
+ {
+ uc->ticks->dump(0, uc->xtal, con);
+ uc->isr_ticks->dump(0, uc->xtal, con);
+ uc->idle_ticks->dump(0, uc->xtal, con);
+ for (id_nr= 0; id_nr < uc->counters->count; id_nr++)
+ {
+ ticker= uc->get_counter(id_nr);
+ if (ticker)
+ ticker->dump(id_nr, uc->xtal, con);
+ }
+ }
+
+ return(false);
+}
+
+CMDHELP(cl_timer_get_cmd,
+ "timer get [id]",
+ "Get value of a timer, or all",
+ "long help of timer get")
+
+/*
+ * Command: timer run
+ *-----------------------------------------------------------------------------
+ * Allow a timer to run
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_run_cmd)
+ //run(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+ if (!ticker)
+ {
+ if (!as_nr)
+ con->dd_printf("Timer %s does not exist\n", (char*)id_str);
+ else
+ con->dd_printf("Timer %d does not exist\n", id_nr);
+ return(0);
+ }
+ ticker->options|= TICK_RUN;
+
+ return(false);
+}
+
+CMDHELP(cl_timer_run_cmd,
+ "timer start id",
+ "Start a timer",
+ "long help of timer run")
+
+/*
+ * Command: timer stop
+ *-----------------------------------------------------------------------------
+ * Stop a timer
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_stop_cmd)
+ //stop(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+
+ if (!ticker)
+ {
+ if (!as_nr)
+ con->dd_printf("Timer %s does not exist\n", (char*)id_str);
+ else
+ con->dd_printf("Timer %d does not exist\n", id_nr);
+ return(false);
+ }
+ ticker->options&= ~TICK_RUN;
+
+ return(false);
+}
+
+CMDHELP(cl_timer_stop_cmd,
+ "timer stop id",
+ "Stop a timer",
+ "long help of timer stop")
+
+/*
+ * Command: timer value
+ *-----------------------------------------------------------------------------
+ * Set a timer to a specified value
+ */
+
+COMMAND_DO_WORK_UC(cl_timer_value_cmd)
+ //val(class cl_uc *uc, class cl_cmdline *cmdline, class cl_console *con)
+{
+ /*class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2) };*/
+
+ if (cl_timer_cmd::do_work(uc, cmdline, con))
+ return(false);
+ if (!ticker)
+ {
+ if (!as_nr)
+ con->dd_printf("Error: Timer %s does not exist\n", (char*)id_str);
+ else
+ con->dd_printf("Error: Timer %d does not exist\n", id_nr);
+ return(false);
+ }
+ if (cmdline->param(0) == NULL)
+ {
+ con->dd_printf("Error: Value is missing\n");
+ return(false);
+ }
+ long val;
+ if (!cmdline->param(0)->get_ivalue(&val))
+ {
+ con->dd_printf("Error: Wrong parameter\n");
+ return(false);
+ }
+ ticker->ticks= val;
+
+ return(false);
+}
+
+CMDHELP(cl_timer_value_cmd,
+ "timer set id value",
+ "Set a timer value",
+ "long help of timer set")
+
+/* End of cmd.src/cmd_timer.cc */
diff --git a/sim/ucsim/cmd.src/cmd_timer.o b/sim/ucsim/cmd.src/cmd_timer.o
new file mode 100644
index 0000000..6ef7ceb
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_timer.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_timercl.h b/sim/ucsim/cmd.src/cmd_timercl.h
new file mode 100644
index 0000000..79cea7a
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_timercl.h
@@ -0,0 +1,58 @@
+/*
+ * Simulator of microcontrollers (cmd.src/timercl.h)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_TIMERCL_HEADER
+#define CMD_CMD_TIMERCL_HEADER
+
+#include "newcmdcl.h"
+
+
+extern void set_timer_help(class cl_cmd *cmd);
+
+COMMAND_HEAD(cl_timer_cmd)
+public:
+ class cl_ticker *ticker;
+ bool as_nr;
+ int id_nr;
+ chars id_str;
+COMMAND_METHODS_ON(uc,cl_timer_cmd)
+ void set_ticker(class cl_uc *uc,
+ class cl_cmd_arg *param);
+COMMAND_TAIL;
+
+
+COMMAND_ANCESTOR_ON(uc,cl_timer_add_cmd,cl_timer_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_timer_delete_cmd,cl_timer_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_timer_get_cmd,cl_timer_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_timer_run_cmd,cl_timer_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_timer_stop_cmd,cl_timer_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_timer_value_cmd,cl_timer_cmd);
+
+
+#endif
+
+/* End of cmd.src/cmd_timercl.h */
diff --git a/sim/ucsim/cmd.src/cmd_uc.cc b/sim/ucsim/cmd.src/cmd_uc.cc
new file mode 100644
index 0000000..030d1d9
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_uc.cc
@@ -0,0 +1,861 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmduc.cc)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include <ctype.h>
+
+// prj
+#include "globals.h"
+#include "utils.h"
+
+// sim.src
+#include "uccl.h"
+
+// local, cmd.src
+#include "cmd_uccl.h"
+
+
+/*
+ * Command: state
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_state_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_state_cmd)
+{
+ con->dd_printf("CPU state= %s PC= 0x%06x XTAL= %g\n",
+ get_id_string(cpu_states, uc->state),
+ AU(uc->PC),
+ uc->xtal);
+ con->dd_printf("Operation since last reset= (%lu vclks)\n",
+ (unsigned long)(uc->vc.fetch) +
+ (unsigned long)(uc->vc.rd) +
+ (unsigned long)(uc->vc.wr));
+ con->dd_printf("Inst= %lu ", (unsigned long)(uc->vc.inst));
+ con->dd_printf("Fetch= %lu ", (unsigned long)(uc->vc.fetch));
+ con->dd_printf("Read= %lu ", (unsigned long)(uc->vc.rd));
+ con->dd_printf("Write= %lu\n", (unsigned long)(uc->vc.wr));
+ con->dd_printf("Total time since last reset= %g sec (%lu clks)\n",
+ uc->get_rtime(), (unsigned long)(uc->ticks->ticks));
+ con->dd_printf("Time in isr = %g sec (%lu clks) %3.2g%%\n",
+ uc->isr_ticks->get_rtime(uc->xtal),
+ uc->isr_ticks->ticks,
+ (uc->ticks->ticks == 0)?0.0:
+ (100.0*((double)(uc->isr_ticks->ticks)/
+ (double)(uc->ticks->ticks))));
+ con->dd_printf("Time in idle= %g sec (%lu clks) %3.2g%%\n",
+ uc->idle_ticks->get_rtime(uc->xtal),
+ uc->idle_ticks->ticks,
+ (uc->ticks->ticks == 0)?0.0:
+ (100.0*((double)(uc->idle_ticks->ticks)/
+ (double)(uc->ticks->ticks))));
+ con->dd_printf("Max value of stack pointer= 0x%06x, avg= 0x%06x\n",
+ AU(uc->sp_max), AU(uc->sp_avg));
+ con->dd_printf("Simulation: %s\n",
+ (uc->sim->state & SIM_GO)?"running":"stopped");
+ return(0);
+}
+
+CMDHELP(cl_state_cmd,
+ "state",
+ "State of microcontroller",
+ "long help of state")
+
+/*
+ * Command: file
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_file_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_file_cmd)
+{
+ const char *fname= 0;
+ long l;
+
+ if ((cmdline->param(0) == 0) ||
+ ((fname= cmdline->param(0)->get_svalue()) == NULL))
+ {
+ con->dd_printf("File name is missing.\n");
+ return(0);
+ }
+
+ if ((l= uc->read_file(fname, con)) >= 0)
+ ;//con->dd_printf("%ld words read from %s\n", l, fname);
+
+ return(0);
+}
+
+CMDHELP(cl_file_cmd,
+ "file \"FILE\"",
+ "Load FILE into ROM",
+ "long help of file")
+
+/*
+ * Command: download
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_dl_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_dl_cmd)
+{
+ long l;
+
+ if ((l= uc->read_hex_file(con)) >= 0)
+ con->dd_printf("%ld words loaded\n", l);
+
+ return(0);
+}
+
+CMDHELP(cl_dl_cmd,
+ "download",
+ "Load (intel.hex) data",
+ "long help of download")
+
+/*
+ * Command: pc
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_pc_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_pc_cmd)
+{
+ t_addr addr;
+ class cl_cmd_arg *params[1]= { cmdline->param(0) };
+
+ if (params[0])
+ {
+ if (!(params[0]->get_address(uc, &addr)))
+ {
+ con->dd_printf("Error: wrong parameter\n");
+ return(false);
+ }
+ class cl_address_space *rom= uc->rom;
+ if (rom)
+ {
+ if (addr > rom->highest_valid_address())
+ addr= rom->highest_valid_address();
+ }
+ if (!uc->inst_at(addr))
+ con->dd_printf("Warning: maybe not instruction at 0x%06x\n", AU(addr));
+ uc->PC= addr;
+ }
+ uc->print_disass(uc->PC, con);
+ return(false);
+}
+
+CMDHELP(cl_pc_cmd,
+ "pc [addr]",
+ "Set/get PC",
+ "long help of pc")
+
+/*
+ * Command: reset
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_reset_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_reset_cmd)
+{
+ uc->reset();
+ return(0);
+}
+
+CMDHELP(cl_reset_cmd,
+ "reset",
+ "Reset processor to start state",
+ "long help of reset")
+
+/*
+ * Command: dump
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_dump_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_dump_cmd)
+{
+ class cl_memory *mem= 0;
+ long bpl= 8;
+ t_addr start= 0, end;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ /*enum dump_format*/int fmt= df_hex;
+
+ if (params[0] &&
+ params[0]->as_bit(uc))
+ {
+ int i= 0;
+ while (params[0] &&
+ params[0]->as_bit(uc))
+ {
+ t_mem m;
+ mem= params[0]->value.bit.mem;
+ m= mem->read(params[0]->value.bit.mem_address);
+ char *sn=
+ uc->symbolic_bit_name((t_addr)-1,
+ mem,
+ params[0]->value.bit.mem_address,
+ params[0]->value.bit.mask);
+ con->dd_printf("%10s ", sn?sn:"");
+ con->dd_printf(mem->addr_format, params[0]->value.bit.mem_address);
+ con->dd_printf(" ");
+ con->dd_printf(mem->data_format, m);
+ con->dd_printf(" %c\n", (m&(params[0]->value.bit.mask))?'1':'0');
+ i++;
+ params[0]= cmdline->param(i);
+ }
+ if (params[0])
+ syntax_error(con);
+ return false;
+ }
+ if (params[0] &&
+ params[0]->as_string())
+ {
+ char *s= params[0]->get_svalue();
+ if (s && *s &&
+ (strlen(s) > 1) &&
+ (s[0]=='/'))
+ {
+ size_t i;
+ for (i= 0; i < strlen(s); i++)
+ s[i]= tolower(s[i]);
+ switch (tolower(s[1]))
+ {
+ case 's': fmt= df_string; break;
+ case 'h': fmt= df_hex; break;
+ case 'i': fmt= df_ihex; bpl= 32; break;
+ case 'b':
+ if (con->get_fout() &&
+ con->get_fout()->tty)
+ return con->dd_printf("Error: binary format not supported on tty\n"),
+ false;
+ fmt= df_binary;
+ break;
+ }
+ if (strlen(s) > 2)
+ for (i= 2; i < strlen(s); i++)
+ {
+ switch (s[i])
+ {
+ case 'l': fmt|= df_little; break;
+ case 'b': fmt|= df_big; break;
+ case '1': fmt|= df_1; break;
+ case '2': fmt|= df_2; break;
+ case '4': fmt|= df_4; break;
+ case '8': fmt|= df_8; break;
+ }
+ }
+ cmdline->shift();
+ params[0]= cmdline->param(0);
+ params[1]= cmdline->param(1);
+ params[2]= cmdline->param(2);
+ params[3]= cmdline->param(3);
+ }
+ }
+
+ enum dump_format df= (enum dump_format)fmt;
+ if ((cmdline->param(0)==NULL) ||
+ (!(cmdline->param(0)->as_memory(uc))))
+ {
+ con->dd_printf("No memory specified. Use \"info memory\" for available memories\n");
+ return(false);
+ }
+ if (cmdline->syntax_match(uc, MEMORY))
+ {
+ mem= cmdline->param(0)->value.memory.memory;
+ mem->dump(df, -1, -1, bpl, con/*->get_fout()*/);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY ADDRESS)) {
+ mem = cmdline->param(0)->value.memory.memory;
+ start= cmdline->param(1)->value.address;
+ end = start+10*8-1;
+ mem->dump(df, start, end, bpl, con/*->get_fout()*/);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS)) {
+ mem = cmdline->param(0)->value.memory.memory;
+ start= cmdline->param(1)->value.address;
+ end = cmdline->param(2)->value.address;
+ mem->dump(df, start, end, bpl, con/*->get_fout()*/);
+ }
+ else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {
+ mem = cmdline->param(0)->value.memory.memory;
+ start= cmdline->param(1)->value.address;
+ end = cmdline->param(2)->value.address;
+ bpl = cmdline->param(3)->value.number;
+ mem->dump(df, start, end, bpl, con/*->get_fout()*/);
+ }
+ else
+ syntax_error(con);
+
+ return(false);;
+}
+
+CMDHELP(cl_dump_cmd,
+ "dump [/format] memory_type [start [stop [bytes_per_line]]] | dump bit...",
+ "Dump memory of specified type or bit(s)",
+ "long help of dump")
+
+/*
+ * Command: di
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_di_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_di_cmd)
+{
+ cmdline->insert_param(0, new cl_cmd_sym_arg("iram"));
+ cl_dump_cmd::do_work(uc, cmdline, con);
+ return(0);
+}
+
+CMDHELP(cl_di_cmd,
+ "di [start [stop]]",
+ "Dump Internal RAM",
+ "long help of di")
+
+/*
+ * Command: dx
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_dx_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_dx_cmd)
+{
+ cmdline->insert_param(0, new cl_cmd_sym_arg("xram"));
+ cl_dump_cmd::do_work(uc, cmdline, con);
+ return(0);
+}
+
+CMDHELP(cl_dx_cmd,
+ "dx [start [stop]]",
+ "Dump External RAM",
+ "long help of dx")
+
+/*
+ * Command: dch
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_dch_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_dch_cmd)
+{
+ cmdline->insert_param(0, new cl_cmd_sym_arg(/*"rom"*/uc->rom->get_name("rom")));
+ cl_dump_cmd::do_work(uc, cmdline, con);
+ return(0);
+}
+
+CMDHELP(cl_dch_cmd,
+ "dch [start [stop]]",
+ "Dump code in hex form",
+ "long help of dch")
+
+/*
+ * Command: ds
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_ds_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_ds_cmd)
+{
+ cmdline->insert_param(0, new cl_cmd_sym_arg("sfr"));
+ cl_dump_cmd::do_work(uc, cmdline, con);
+ return(0);
+}
+
+CMDHELP(cl_ds_cmd,
+ "ds [start [stop]]",
+ "Dump SFR",
+ "long help of ds")
+
+/*
+ * Command: dc
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_dc_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_dc_cmd)
+{
+ t_addr start= last, end= last+20;
+ class cl_cmd_arg *params[2]= { cmdline->param(0),
+ cmdline->param(1) };
+ class cl_address_space *rom= uc->rom;
+
+ if (!rom)
+ return(false);
+ if (params[0] == 0)
+ ;
+ else if (cmdline->syntax_match(uc, ADDRESS)) {
+ start= params[0]->value.address;
+ end= start+20;
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS ADDRESS)) {
+ start= params[0]->value.address;
+ end= params[1]->value.address;
+ }
+ if (start > rom->highest_valid_address())
+ {
+ con->dd_printf("Error: start address is too high\n");
+ return(false);
+ }
+ if (end > rom->highest_valid_address())
+ {
+ con->dd_printf("Error: end address is too high\n");
+ return(false);
+ }
+
+ for (;
+ start <= end;
+ start+= uc->inst_length(start))
+ uc->print_disass(start, con);
+ last= start;
+ return(false);
+}
+
+CMDHELP(cl_dc_cmd,
+ "dc [start [stop]]",
+ "Dump code in disass form",
+ "long help of dc")
+
+/*
+ * Command: disassemble
+ *----------------------------------------------------------------------------
+ */
+
+static int disass_last_stop= 0;
+
+//int
+//cl_disassemble_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_disassemble_cmd)
+{
+ t_addr start, realstart;
+ int offset= -1, dir, lines= 20;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ start= disass_last_stop;
+ if (params[0] == 0) ;
+ else if (cmdline->syntax_match(uc, ADDRESS)) {
+ start= params[0]->value.address;
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS NUMBER)) {
+ start= params[0]->value.address;
+ offset= params[1]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, ADDRESS NUMBER NUMBER)) {
+ start= params[0]->value.address;
+ offset= params[1]->value.number;
+ lines= params[2]->value.number;
+ }
+ else
+ {
+ syntax_error(con);
+ return(false);
+ }
+
+ if (lines < 1)
+ {
+ con->dd_printf("Error: wrong `lines' parameter\n");
+ return(false);
+ }
+ if (!uc->there_is_inst())
+ return(false);
+ realstart= start;
+ class cl_address_space *rom= uc->rom;
+ if (!rom)
+ return(false);
+ while (realstart <= rom->highest_valid_address() &&
+ !uc->inst_at(realstart))
+ realstart= realstart+1;
+ if (offset)
+ {
+ dir= (offset < 0)?-1:+1;
+ while (offset)
+ {
+ realstart= rom->inc_address(realstart, dir);
+ while (!uc->inst_at(realstart))
+ realstart= rom->inc_address(realstart, dir);
+ offset+= -dir;
+ }
+ }
+
+
+ while (lines)
+ {
+ int len;
+ uc->print_disass(realstart, con);
+ /* fix for #2383: start search next instruction after the actual one */
+ len= uc->inst_length(realstart);
+ realstart= rom->inc_address(realstart, /*+1*/len) + rom->start_address;
+ while (!uc->inst_at(realstart))
+ realstart= rom->inc_address(realstart, +1) + rom->start_address;
+ lines--;
+ }
+
+ disass_last_stop= realstart;
+
+ return(false);;
+}
+
+CMDHELP(cl_disassemble_cmd,
+ "disassemble [start [offset [lines]]]",
+ "Disassemble code",
+ "long help of disassemble")
+
+/*
+ * Command: fill
+ *----------------------------------------------------------------------------
+ */
+
+//int
+//cl_fill_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_fill_cmd)
+{
+ class cl_memory *mem= 0;
+ t_mem what= 0;
+ t_addr start= 0, end;
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+
+ if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {
+ mem = params[0]->value.memory.memory;
+ start= params[1]->value.address;
+ end = params[2]->value.address;
+ what = params[3]->value.number;
+ t_addr i;
+ for (i= start; i <= end; i++)
+ {
+ t_mem d;
+ d= what;
+ mem->write(i, d);
+ }
+ }
+ else
+ syntax_error(con);
+
+ return(false);;
+}
+
+CMDHELP(cl_fill_cmd,
+ "fill memory_type start end data",
+ "Fill memory region with data",
+ "long help of fill")
+
+/*
+ * Command: where
+ *----------------------------------------------------------------------------
+ */
+
+int
+cl_where_cmd::do_real_work(class cl_uc *uc,
+ class cl_cmdline *cmdline, class cl_console_base *con,
+ bool case_sensitive)
+{
+ class cl_memory *mem= 0;
+ class cl_cmd_arg *params[2]= { cmdline->param(0),
+ cmdline->param(1) };
+
+ if (cmdline->syntax_match(uc, MEMORY DATALIST)) {
+ mem= params[0]->value.memory.memory;
+ t_mem *array= params[1]->value.data_list.array;
+ int len= params[1]->value.data_list.len;
+ if (!len)
+ {
+ con->dd_printf("Error: nothing to search for\n");
+ return(false);
+ }
+ t_addr addr= 0;
+ bool found= mem->search_next(case_sensitive, array, len, &addr);
+ while (found)
+ {
+ if (con->get_fout())
+ mem->dump(addr, addr+len-1, 8, con/*->get_fout()*/);
+ addr++;
+ found= mem->search_next(case_sensitive, array, len, &addr);
+ }
+ }
+ else
+ syntax_error(con);
+
+ return(false);
+}
+
+//int
+//cl_where_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_where_cmd)
+{
+ return(do_real_work(uc, cmdline, con, false));
+}
+
+CMDHELP(cl_where_cmd,
+ "where memory_type data...",
+ "Case unsensitive search for data",
+ "long help of where")
+
+//int
+//cl_Where_cmd::do_work(class cl_sim *sim,
+// class cl_cmdline *cmdline, class cl_console *con)
+COMMAND_DO_WORK_UC(cl_Where_cmd)
+{
+ return(do_real_work(uc, cmdline, con, true));
+}
+
+CMDHELP(cl_Where_cmd,
+ "Where memory_type data...",
+ "Case sensitive search for data",
+ "long help of Where")
+
+
+/*
+ * Command: hole
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_hole_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2) };
+ class cl_memory *m= uc->rom;
+
+ if (m)
+ {
+ t_mem v, a;
+ if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER))
+ {
+ m= params[0]->value.memory.memory;
+ a= params[1]->value.number;
+ v= params[2]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY NUMBER))
+ {
+ m= params[0]->value.memory.memory;
+ a= params[1]->value.number;
+ v= 0;
+ }
+ else if (cmdline->syntax_match(uc, MEMORY))
+ {
+ m= params[0]->value.memory.memory;
+ a= 100;
+ v= 0;
+ }
+ else if (cmdline->syntax_match(uc, NUMBER NUMBER))
+ {
+ a= params[0]->value.number;
+ v= params[1]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, NUMBER))
+ {
+ a= params[0]->value.number;
+ v= 0;
+ }
+ else
+ {
+ a= 100;
+ v= 0;
+ }
+ t_addr ad, l, h, sa= 0, len= 0;
+ t_mem mv;
+ bool in= false;
+ l= m->lowest_valid_address();
+ h= m->highest_valid_address();
+ //con->dd_printf("%s[0x%x-0x%0x] len=%d val=%d\n", m->get_name("mem"),
+ // l, h, a, v);
+ for (ad= l; ad <= h; ad++)
+ {
+ mv= m->read(ad);
+ if (!in && (mv==v))
+ {
+ // found start
+ sa= ad;
+ in= true;
+ len= 0;
+ }
+ else if (in && (mv==v))
+ {
+ // still inside
+ len++;
+ }
+ else if (in && (mv!=v))
+ {
+ // found end
+ if (len >= a)
+ {
+ con->dd_printf(m->addr_format, sa);
+ con->dd_printf(" %u\n", AU(len));
+ }
+ in= false;
+ }
+ }
+ if (in &&
+ len >= a)
+ {
+ // found end after highest reached
+ con->dd_printf(m->addr_format, sa);
+ con->dd_printf(" %u\n", AU(len));
+ }
+ }
+ return false;
+}
+
+CMDHELP(cl_hole_cmd,
+ "hole [memory [length [value]]]",
+ "search area in memory (min length), filled with value",
+ "long help of hole")
+
+
+/*
+ * Command: var
+ *----------------------------------------------------------------------------
+ */
+
+COMMAND_DO_WORK_UC(cl_var_cmd)
+{
+ class cl_cmd_arg *params[4]= { cmdline->param(0),
+ cmdline->param(1),
+ cmdline->param(2),
+ cmdline->param(3) };
+ class cl_memory *m= NULL;
+ t_addr addr= -1;
+ int bit= -1;
+ class cl_var *v;
+
+ if (cmdline->syntax_match(uc, STRING MEMORY ADDRESS NUMBER))
+ {
+ m= params[1]->value.memory.memory;
+ addr= params[2]->value.address;
+ bit= params[3]->value.number;
+ }
+ else if (cmdline->syntax_match(uc, STRING MEMORY ADDRESS))
+ {
+ m= params[1]->value.memory.memory;
+ addr= params[2]->value.address;
+ }
+ else if (cmdline->syntax_match(uc, STRING CELL))
+ {
+ m= uc->address_space(params[1]->value.cell, &addr);
+ }
+ else if (cmdline->syntax_match(uc, STRING))
+ {
+ }
+ else
+ return syntax_error(con), false;
+
+ if (!valid_sym_name(params[0]->value.string.string))
+ return con->dd_printf("name is invalid\n"),
+ false;
+ if ((bit >= 0) &&
+ (bit >= (int)sizeof(t_mem)*8))
+ return con->dd_printf("max bit number is %d\n", (int)sizeof(t_mem)*8),
+ false;
+
+ if (m)
+ if (!m->is_address_space())
+ return con->dd_printf("%s is not address space\n", m->get_name()),
+ false;
+ if (addr > 0)
+ if (!m->valid_address(addr))
+ return con->dd_printf("invalid address\n"),
+ false;
+ if (bit >= 0)
+ if (bit >= 32)
+ return con->dd_printf("invalid bit number\n"),
+ false;
+
+ if (uc->symbol2address(params[0]->value.string.string,
+ (class cl_address_space **)NULL,
+ (t_addr*)NULL))
+ return con->dd_printf("already exists\n"),
+ false;
+
+ if (m)
+ {
+ v= new cl_var(params[0]->value.string.string,
+ (cl_address_space*)m, addr, chars(""), bit);
+ v->init();
+ uc->vars->add(v);
+ }
+ else
+ {
+ if (bit < 0)
+ {
+ if (addr < 0)
+ {
+ if (!uc->variables->search_cell(CELL_VAR, false, &addr))
+ return con->dd_printf("no space\n"),
+ false;
+ }
+ if (!uc->variables->valid_address(addr))
+ return con->dd_printf("out of range\n"),
+ false;
+ v= new cl_var(params[0]->value.string.string,
+ uc->variables, addr, chars(""), bit);
+ v->init();
+ uc->vars->add(v);
+ }
+ else
+ {
+ }
+ }
+
+ return false;
+}
+
+CMDHELP(cl_var_cmd,
+ "var name [memory addr [bit_nr]]",
+ "Create new variable",
+ "long help of var")
+
+/* End of cmd.src/cmd_uc.cc */
diff --git a/sim/ucsim/cmd.src/cmd_uc.o b/sim/ucsim/cmd.src/cmd_uc.o
new file mode 100644
index 0000000..8606ef9
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_uc.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmd_uccl.h b/sim/ucsim/cmd.src/cmd_uccl.h
new file mode 100644
index 0000000..31ec5aa
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmd_uccl.h
@@ -0,0 +1,60 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmduccl.h)
+ *
+ * Copyright (C) 2001,01 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMD_UCCL_HEADER
+#define CMD_CMD_UCCL_HEADER
+
+#include "newcmdcl.h"
+
+COMMAND_ON(uc,cl_state_cmd);
+COMMAND_ON(uc,cl_file_cmd);
+COMMAND_ON(uc,cl_dl_cmd);
+COMMAND_ON(uc,cl_pc_cmd);
+COMMAND_ON(uc,cl_reset_cmd);
+COMMAND_ON(uc,cl_dump_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_di_cmd,cl_dump_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_dx_cmd,cl_dump_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_ds_cmd,cl_dump_cmd);
+COMMAND_ANCESTOR_ON(uc,cl_dch_cmd,cl_dump_cmd);
+COMMAND_DATA_ON(uc,cl_dc_cmd,t_addr last);
+COMMAND_DATA_ON(uc,cl_disassemble_cmd,int last);
+COMMAND_DATA_ON(uc,cl_fill_cmd,int last);
+COMMAND_HEAD(cl_where_cmd)
+ public: int last;
+COMMAND_METHODS_ON(uc,cl_where_cmd)
+ virtual int do_real_work(class cl_uc *uc,
+ class cl_cmdline *cmdline, class cl_console_base *con,
+ bool case_sensitive);
+COMMAND_TAIL;
+COMMAND_DATA_ANCESTOR_ON(uc,cl_Where_cmd,cl_where_cmd,int last);
+
+COMMAND_ON(uc,cl_hole_cmd);
+COMMAND_ON(uc,cl_var_cmd);
+
+#endif
+
+/* End of cmd.src/cmd_uccl.h */
diff --git a/sim/ucsim/cmd.src/cmdlex.cc b/sim/ucsim/cmd.src/cmdlex.cc
new file mode 100644
index 0000000..68cb2c1
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdlex.cc
@@ -0,0 +1,2093 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
+void yy_delete_buffer ( YY_BUFFER_STATE b );
+void yy_flush_buffer ( YY_BUFFER_STATE b );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
+
+void *yyalloc ( yy_size_t );
+void *yyrealloc ( void *, yy_size_t );
+void yyfree ( void * );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 48
+#define YY_END_OF_BUFFER 49
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[62] =
+ { 0,
+ 1, 1, 49, 47, 1, 48, 42, 36, 33, 27,
+ 28, 25, 23, 43, 24, 32, 26, 44, 44, 39,
+ 40, 31, 41, 38, 46, 29, 30, 35, 46, 34,
+ 37, 1, 18, 5, 13, 10, 3, 15, 6, 16,
+ 7, 4, 44, 0, 0, 22, 20, 17, 19, 21,
+ 46, 11, 46, 12, 14, 45, 44, 8, 9, 2,
+ 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 1, 1, 1, 5, 6, 1, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 17, 17, 17, 17, 17, 17, 17, 18, 1, 19,
+ 20, 21, 22, 1, 23, 23, 23, 23, 23, 23,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 25, 1, 26, 27, 24, 1, 23, 28, 23, 23,
+
+ 23, 23, 24, 24, 29, 24, 24, 24, 24, 30,
+ 24, 24, 24, 24, 24, 31, 24, 24, 24, 32,
+ 24, 24, 1, 33, 1, 34, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static const YY_CHAR yy_meta[35] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 2, 2, 1, 1, 1,
+ 1, 1, 2, 2, 1, 1, 1, 2, 2, 2,
+ 2, 2, 1, 1
+ } ;
+
+static const flex_int16_t yy_base[63] =
+ { 0,
+ 0, 0, 84, 86, 81, 86, 62, 61, 29, 86,
+ 86, 59, 26, 86, 25, 86, 58, 23, 26, 86,
+ 28, 57, 32, 86, 0, 86, 86, 55, 40, 24,
+ 86, 67, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 43, 46, 48, 48, 86, 86, 86, 36,
+ 0, 86, 23, 86, 86, 51, 57, 86, 86, 0,
+ 86, 48
+ } ;
+
+static const flex_int16_t yy_def[63] =
+ { 0,
+ 61, 1, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 62, 61, 61, 61, 62, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 62, 61, 62, 61, 61, 61, 61, 61, 61, 62,
+ 0, 61
+ } ;
+
+static const flex_int16_t yy_nxt[121] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,
+ 23, 24, 25, 25, 26, 27, 28, 25, 29, 25,
+ 25, 25, 30, 31, 35, 38, 40, 43, 43, 43,
+ 43, 43, 43, 54, 41, 39, 46, 47, 36, 51,
+ 44, 49, 50, 60, 45, 59, 55, 43, 43, 43,
+ 56, 56, 57, 57, 57, 56, 56, 58, 32, 53,
+ 57, 57, 57, 57, 52, 57, 48, 42, 37, 57,
+ 34, 33, 32, 61, 57, 3, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61
+ } ;
+
+static const flex_int16_t yy_chk[121] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 9, 13, 15, 18, 18, 18,
+ 19, 19, 19, 30, 15, 13, 21, 21, 9, 62,
+ 18, 23, 23, 53, 18, 50, 30, 43, 43, 43,
+ 44, 44, 45, 45, 45, 56, 56, 46, 32, 29,
+ 45, 57, 57, 57, 28, 45, 22, 17, 12, 57,
+ 8, 7, 5, 3, 57, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "cmdlex.l"
+#line 2 "cmdlex.l"
+#include <stdio.h>
+//#include <stdint.h>
+#include "cmdlexcl.h"
+#include "cmdpars.hh"
+
+static int uc_yy_check_id(char *token);
+static int uc_yy_input(char *buf, int max_size);
+#define YY_INPUT(buf,result,max_size) result = uc_yy_input(buf, max_size)
+#line 495 "<stdout>"
+#line 496 "<stdout>"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in ( void );
+
+void yyset_in ( FILE * _in_str );
+
+FILE *yyget_out ( void );
+
+void yyset_out ( FILE * _out_str );
+
+ int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ {
+#line 14 "cmdlex.l"
+
+
+#line 714 "<stdout>"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 62 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 86 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 16 "cmdlex.l"
+;
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 18 "cmdlex.l"
+return(PTOK_INT);
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 19 "cmdlex.l"
+return(PTOK_MUL_ASSIGN);
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 20 "cmdlex.l"
+return(PTOK_DIV_ASSIGN);
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 21 "cmdlex.l"
+return(PTOK_MOD_ASSIGN);
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 22 "cmdlex.l"
+return(PTOK_ADD_ASSIGN);
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 23 "cmdlex.l"
+return(PTOK_SUB_ASSIGN);
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 24 "cmdlex.l"
+return(PTOK_LEFT_ASSIGN);
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 25 "cmdlex.l"
+return(PTOK_RIGHT_ASSIGN);
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 26 "cmdlex.l"
+return(PTOK_AND_ASSIGN);
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 27 "cmdlex.l"
+return(PTOK_XOR_ASSIGN);
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 28 "cmdlex.l"
+return(PTOK_OR_ASSIGN);
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 29 "cmdlex.l"
+return(PTOK_AND_OP);
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 30 "cmdlex.l"
+return(PTOK_OR_OP);
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 31 "cmdlex.l"
+return(PTOK_INC_OP);
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 32 "cmdlex.l"
+return(PTOK_DEC_OP);
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 33 "cmdlex.l"
+return(PTOK_EQ_OP);
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 34 "cmdlex.l"
+return(PTOK_NE_OP);
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 35 "cmdlex.l"
+return(PTOK_GE_OP);
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 36 "cmdlex.l"
+return(PTOK_LE_OP);
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 37 "cmdlex.l"
+return(PTOK_RIGHT_OP);
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 38 "cmdlex.l"
+return(PTOK_LEFT_OP);
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 39 "cmdlex.l"
+return(PTOK_PLUS);
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 40 "cmdlex.l"
+return(PTOK_MINUS);
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 41 "cmdlex.l"
+return(PTOK_ASTERIX);
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 42 "cmdlex.l"
+return(PTOK_SLASH);
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 43 "cmdlex.l"
+return(PTOK_LEFT_PAREN);
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 44 "cmdlex.l"
+return(PTOK_RIGHT_PAREN);
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 45 "cmdlex.l"
+return(PTOK_LEFT_BRACKET);
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 46 "cmdlex.l"
+return(PTOK_RIGHT_BRACKET);
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 47 "cmdlex.l"
+return(PTOK_EQUAL);
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 48 "cmdlex.l"
+return(PTOK_DOT);
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 49 "cmdlex.l"
+return(PTOK_AMPERSAND);
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 50 "cmdlex.l"
+return(PTOK_PIPE);
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 51 "cmdlex.l"
+return(PTOK_CIRCUM);
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 52 "cmdlex.l"
+return(PTOK_PERCENT);
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 53 "cmdlex.l"
+return(PTOK_TILDE);
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 54 "cmdlex.l"
+return(PTOK_QUESTION);
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 55 "cmdlex.l"
+return(PTOK_COLON);
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 56 "cmdlex.l"
+return(PTOK_LESS);
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 57 "cmdlex.l"
+return(PTOK_GREATHER);
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 58 "cmdlex.l"
+return(PTOK_EXCLAMATION);
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 59 "cmdlex.l"
+return(PTOK_COMMA);
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 61 "cmdlex.l"
+{
+ //printf("\nlexer found a nr: %s\n",yytext);
+ yylval.number = strtol(yytext, 0, 0);
+ return PTOK_NUMBER;
+}
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 67 "cmdlex.l"
+{
+ yylval.number = 0;
+ for (int i= 2; yytext[i]; i++)
+ yylval.number = (yylval.number << 1) | (yytext[i] == '0' ? 0 : 1);
+ return PTOK_NUMBER;
+}
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 74 "cmdlex.l"
+return(uc_yy_check_id(yytext));
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 76 "cmdlex.l"
+return(yytext[0]);
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 78 "cmdlex.l"
+ECHO;
+ YY_BREAK
+#line 1020 "<stdout>"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = (yytext_ptr);
+ int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 62 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ int yy_is_jam;
+ char *yy_cp = (yy_c_buf_p);
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 62 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 61);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf );
+
+ yyfree( (void *) b );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ *
+ */
+void yyset_lineno (int _line_number )
+{
+
+ yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str )
+{
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str )
+{
+ yyout = _out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug )
+{
+ yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = NULL;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = NULL;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 78 "cmdlex.l"
+
+
+int
+yywrap()
+{
+ return 1;
+}
+
+#include "globals.h"
+static char *string_to_parse = NULL;
+
+void
+uc_yy_set_string_to_parse(const char *str)
+{
+ string_to_parse = strdup(str);
+ //YY_FLUSH_BUFFER;
+ yy_flush_buffer(YY_CURRENT_BUFFER);
+}
+
+static const char *string_ptr = NULL;
+
+void
+uc_yy_free_string_to_parse()
+{
+ free(string_to_parse);
+ string_ptr=NULL;
+}
+
+static int
+uc_yy_input(char *buf, int max_size)
+{
+ //printf("\nuc_yy_input called for max=%d\n",max_size);
+ if (NULL == string_ptr)
+ {
+ string_ptr = string_to_parse;
+ //printf("\nstring_ptr is NULL, start over with %s\n",string_to_parse);
+ }
+ else
+ {
+ //printf("\ncontinue with %s\n",string_ptr);
+ }
+
+ if (NULL != string_ptr)
+ {
+ int lrem = strlen(string_ptr);
+ int n = max_size;
+ if (lrem < max_size)
+ n = lrem;
+ strncpy(buf, string_ptr, n);
+ string_ptr += n;
+ //printf("\n%d chars copied, left=%s\n",n,string_ptr);
+ return n;
+ }
+ else
+ return 0;
+}
+
+static int
+uc_yy_check_id(char *token)
+{
+ class cl_uc *uc= application->get_uc();
+ //printf("checking id=\"%s\"\n",token);
+
+ if (uc)
+ {
+ class cl_memory *mem = uc->memory(token);
+ if (mem)
+ {
+ yylval.memory_object = mem;
+ return PTOK_MEMORY_OBJECT;
+ }
+
+ t_addr addr;
+ class cl_address_space *as;
+ bool found;
+ if ((found= uc->symbol2address(yytext, &as, &addr)))
+ {
+ yylval.memory.memory= as;
+ yylval.memory.address= addr;
+ return PTOK_MEMORY;
+ }
+ /*
+ else if ((found= uc->symbol2address(yytext, uc->sfr_tbl(), &addr)))
+ {
+ //yylval.number= addr; return PTOK_NUMBER;
+ yylval.memory.memory = uc->address_space(MEM_SFR_ID);
+ yylval.memory.address = addr;
+ return PTOK_MEMORY;
+ }
+ */
+ //found= uc->symbol2address(yytext, uc->bit_tbl(), &addr);
+ if (found)
+ {
+ t_addr memaddr;
+ t_mem mask;
+ yylval.bit.memory= uc->bit2mem(addr, &memaddr, &mask);
+ yylval.bit.mem_address = memaddr;
+ yylval.bit.bit_address = addr;
+ yylval.bit.mask = mask;
+ return PTOK_BIT;
+ }
+ }
+
+ return 0;
+}
+
diff --git a/sim/ucsim/cmd.src/cmdlex.l b/sim/ucsim/cmd.src/cmdlex.l
new file mode 100644
index 0000000..0f4a558
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdlex.l
@@ -0,0 +1,182 @@
+%{
+#include <stdio.h>
+//#include <stdint.h>
+#include "cmdlexcl.h"
+#include "cmdpars.hh"
+
+static int uc_yy_check_id(char *token);
+static int uc_yy_input(char *buf, int max_size);
+#define YY_INPUT(buf,result,max_size) result = uc_yy_input(buf, max_size)
+%}
+
+%option nounput
+
+%%
+
+[ \t]* ;
+
+"int" return(PTOK_INT);
+"*=" return(PTOK_MUL_ASSIGN);
+"/=" return(PTOK_DIV_ASSIGN);
+"%=" return(PTOK_MOD_ASSIGN);
+"+=" return(PTOK_ADD_ASSIGN);
+"-=" return(PTOK_SUB_ASSIGN);
+"<<=" return(PTOK_LEFT_ASSIGN);
+">>=" return(PTOK_RIGHT_ASSIGN);
+"&=" return(PTOK_AND_ASSIGN);
+"^=" return(PTOK_XOR_ASSIGN);
+"|=" return(PTOK_OR_ASSIGN);
+"&&" return(PTOK_AND_OP);
+"||" return(PTOK_OR_OP);
+"++" return(PTOK_INC_OP);
+"--" return(PTOK_DEC_OP);
+"==" return(PTOK_EQ_OP);
+"!=" return(PTOK_NE_OP);
+">=" return(PTOK_GE_OP);
+"<=" return(PTOK_LE_OP);
+">>" return(PTOK_RIGHT_OP);
+"<<" return(PTOK_LEFT_OP);
+"+" return(PTOK_PLUS);
+"-" return(PTOK_MINUS);
+"*" return(PTOK_ASTERIX);
+"/" return(PTOK_SLASH);
+"(" return(PTOK_LEFT_PAREN);
+")" return(PTOK_RIGHT_PAREN);
+"[" return(PTOK_LEFT_BRACKET);
+"]" return(PTOK_RIGHT_BRACKET);
+"=" return(PTOK_EQUAL);
+"." return(PTOK_DOT);
+"&" return(PTOK_AMPERSAND);
+"|" return(PTOK_PIPE);
+"^" return(PTOK_CIRCUM);
+"%" return(PTOK_PERCENT);
+"~" return(PTOK_TILDE);
+"?" return(PTOK_QUESTION);
+":" return(PTOK_COLON);
+"<" return(PTOK_LESS);
+">" return(PTOK_GREATHER);
+"!" return(PTOK_EXCLAMATION);
+"," return(PTOK_COMMA);
+
+([0-9]+)|(0x[0-9a-fA-F]+) {
+ //printf("\nlexer found a nr: %s\n",yytext);
+ yylval.number = strtol(yytext, 0, 0);
+ return PTOK_NUMBER;
+}
+
+0b[01]+ {
+ yylval.number = 0;
+ for (int i= 2; yytext[i]; i++)
+ yylval.number = (yylval.number << 1) | (yytext[i] == '0' ? 0 : 1);
+ return PTOK_NUMBER;
+}
+
+[a-zA-Z_][0-9a-zA-Z_]* return(uc_yy_check_id(yytext));
+
+. return(yytext[0]);
+
+%%
+
+int
+yywrap()
+{
+ return 1;
+}
+
+#include "globals.h"
+static char *string_to_parse = NULL;
+
+void
+uc_yy_set_string_to_parse(const char *str)
+{
+ string_to_parse = strdup(str);
+ //YY_FLUSH_BUFFER;
+ yy_flush_buffer(YY_CURRENT_BUFFER);
+}
+
+static const char *string_ptr = NULL;
+
+void
+uc_yy_free_string_to_parse()
+{
+ free(string_to_parse);
+ string_ptr=NULL;
+}
+
+static int
+uc_yy_input(char *buf, int max_size)
+{
+ //printf("\nuc_yy_input called for max=%d\n",max_size);
+ if (NULL == string_ptr)
+ {
+ string_ptr = string_to_parse;
+ //printf("\nstring_ptr is NULL, start over with %s\n",string_to_parse);
+ }
+ else
+ {
+ //printf("\ncontinue with %s\n",string_ptr);
+ }
+
+ if (NULL != string_ptr)
+ {
+ int lrem = strlen(string_ptr);
+ int n = max_size;
+ if (lrem < max_size)
+ n = lrem;
+ strncpy(buf, string_ptr, n);
+ string_ptr += n;
+ //printf("\n%d chars copied, left=%s\n",n,string_ptr);
+ return n;
+ }
+ else
+ return 0;
+}
+
+static int
+uc_yy_check_id(char *token)
+{
+ class cl_uc *uc= application->get_uc();
+ //printf("checking id=\"%s\"\n",token);
+
+ if (uc)
+ {
+ class cl_memory *mem = uc->memory(token);
+ if (mem)
+ {
+ yylval.memory_object = mem;
+ return PTOK_MEMORY_OBJECT;
+ }
+
+ t_addr addr;
+ class cl_address_space *as;
+ bool found;
+ if ((found= uc->symbol2address(yytext, &as, &addr)))
+ {
+ yylval.memory.memory= as;
+ yylval.memory.address= addr;
+ return PTOK_MEMORY;
+ }
+ /*
+ else if ((found= uc->symbol2address(yytext, uc->sfr_tbl(), &addr)))
+ {
+ //yylval.number= addr; return PTOK_NUMBER;
+ yylval.memory.memory = uc->address_space(MEM_SFR_ID);
+ yylval.memory.address = addr;
+ return PTOK_MEMORY;
+ }
+ */
+ //found= uc->symbol2address(yytext, uc->bit_tbl(), &addr);
+ if (found)
+ {
+ t_addr memaddr;
+ t_mem mask;
+ yylval.bit.memory= uc->bit2mem(addr, &memaddr, &mask);
+ yylval.bit.mem_address = memaddr;
+ yylval.bit.bit_address = addr;
+ yylval.bit.mask = mask;
+ return PTOK_BIT;
+ }
+ }
+
+ return 0;
+}
diff --git a/sim/ucsim/cmd.src/cmdlex.o b/sim/ucsim/cmd.src/cmdlex.o
new file mode 100644
index 0000000..a69612c
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdlex.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmdlexcl.h b/sim/ucsim/cmd.src/cmdlexcl.h
new file mode 100644
index 0000000..0100ab5
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdlexcl.h
@@ -0,0 +1,9 @@
+#ifndef CMDLEXCL_HEADER
+#define CMDLEXCL_HEADER
+
+int yylex();
+int yyparse();
+void uc_yy_set_string_to_parse(const char *cmdstr);
+void uc_yy_free_string_to_parse();
+
+#endif
diff --git a/sim/ucsim/cmd.src/cmdpars.cc b/sim/ucsim/cmd.src/cmdpars.cc
new file mode 100644
index 0000000..bc8d9bb
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdpars.cc
@@ -0,0 +1,2154 @@
+/* A Bison parser, made by GNU Bison 3.0.4. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "3.0.4"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 1 "cmdpars.y" /* yacc.c:339 */
+
+
+#include "cmdlexcl.h"
+#include "memcl.h"
+#include "globals.h"
+#include "stypes.h"
+
+static void yyerror (const char *msg);
+
+#line 76 "y.tab.c" /* yacc.c:339 */
+
+# ifndef YY_NULLPTR
+# if defined __cplusplus && 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* In a future release of Bison, this section will be replaced
+ by #include "y.tab.h". */
+#ifndef YY_YY_Y_TAB_H_INCLUDED
+# define YY_YY_Y_TAB_H_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token type. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ PTOK_PLUS = 258,
+ PTOK_MINUS = 259,
+ PTOK_ASTERIX = 260,
+ PTOK_SLASH = 261,
+ PTOK_EQUAL = 262,
+ PTOK_LEFT_PAREN = 263,
+ PTOK_RIGHT_PAREN = 264,
+ PTOK_LEFT_BRACKET = 265,
+ PTOK_RIGHT_BRACKET = 266,
+ PTOK_DOT = 267,
+ PTOK_AMPERSAND = 268,
+ PTOK_PIPE = 269,
+ PTOK_CIRCUM = 270,
+ PTOK_PERCENT = 271,
+ PTOK_TILDE = 272,
+ PTOK_QUESTION = 273,
+ PTOK_COLON = 274,
+ PTOK_EXCLAMATION = 275,
+ PTOK_LESS = 276,
+ PTOK_GREATHER = 277,
+ PTOK_COMMA = 278,
+ PTOK_AND_OP = 279,
+ PTOK_OR_OP = 280,
+ PTOK_INC_OP = 281,
+ PTOK_DEC_OP = 282,
+ PTOK_EQ_OP = 283,
+ PTOK_NE_OP = 284,
+ PTOK_GE_OP = 285,
+ PTOK_LE_OP = 286,
+ PTOK_LEFT_OP = 287,
+ PTOK_RIGHT_OP = 288,
+ PTOK_MUL_ASSIGN = 289,
+ PTOK_DIV_ASSIGN = 290,
+ PTOK_MOD_ASSIGN = 291,
+ PTOK_ADD_ASSIGN = 292,
+ PTOK_SUB_ASSIGN = 293,
+ PTOK_LEFT_ASSIGN = 294,
+ PTOK_RIGHT_ASSIGN = 295,
+ PTOK_AND_ASSIGN = 296,
+ PTOK_XOR_ASSIGN = 297,
+ PTOK_OR_ASSIGN = 298,
+ PTOK_INT = 299,
+ PTOK_MEMORY_OBJECT = 300,
+ PTOK_MEMORY = 301,
+ PTOK_NUMBER = 302,
+ PTOK_BIT = 303
+ };
+#endif
+/* Tokens. */
+#define PTOK_PLUS 258
+#define PTOK_MINUS 259
+#define PTOK_ASTERIX 260
+#define PTOK_SLASH 261
+#define PTOK_EQUAL 262
+#define PTOK_LEFT_PAREN 263
+#define PTOK_RIGHT_PAREN 264
+#define PTOK_LEFT_BRACKET 265
+#define PTOK_RIGHT_BRACKET 266
+#define PTOK_DOT 267
+#define PTOK_AMPERSAND 268
+#define PTOK_PIPE 269
+#define PTOK_CIRCUM 270
+#define PTOK_PERCENT 271
+#define PTOK_TILDE 272
+#define PTOK_QUESTION 273
+#define PTOK_COLON 274
+#define PTOK_EXCLAMATION 275
+#define PTOK_LESS 276
+#define PTOK_GREATHER 277
+#define PTOK_COMMA 278
+#define PTOK_AND_OP 279
+#define PTOK_OR_OP 280
+#define PTOK_INC_OP 281
+#define PTOK_DEC_OP 282
+#define PTOK_EQ_OP 283
+#define PTOK_NE_OP 284
+#define PTOK_GE_OP 285
+#define PTOK_LE_OP 286
+#define PTOK_LEFT_OP 287
+#define PTOK_RIGHT_OP 288
+#define PTOK_MUL_ASSIGN 289
+#define PTOK_DIV_ASSIGN 290
+#define PTOK_MOD_ASSIGN 291
+#define PTOK_ADD_ASSIGN 292
+#define PTOK_SUB_ASSIGN 293
+#define PTOK_LEFT_ASSIGN 294
+#define PTOK_RIGHT_ASSIGN 295
+#define PTOK_AND_ASSIGN 296
+#define PTOK_XOR_ASSIGN 297
+#define PTOK_OR_ASSIGN 298
+#define PTOK_INT 299
+#define PTOK_MEMORY_OBJECT 300
+#define PTOK_MEMORY 301
+#define PTOK_NUMBER 302
+#define PTOK_BIT 303
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+
+union YYSTYPE
+{
+#line 57 "cmdpars.y" /* yacc.c:355 */
+
+ long number;
+ class cl_memory *memory_object;
+ struct {
+ class cl_memory *memory;
+ long address;
+ } memory;
+ struct {
+ class cl_memory *memory;
+ long mem_address, bit_address;
+ long mask;
+ } bit;
+
+#line 226 "y.tab.c" /* yacc.c:355 */
+};
+
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+int yyparse (void);
+
+#endif /* !YY_YY_Y_TAB_H_INCLUDED */
+
+/* Copy the second part of user declarations. */
+
+#line 243 "y.tab.c" /* yacc.c:358 */
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__ \
+ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
+ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+# define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+#if !defined _Noreturn \
+ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(E) ((void) (E))
+#else
+# define YYUSE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 48
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 148
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 49
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 23
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 71
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 115
+
+/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+ by yylex, with out-of-bounds checking. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 303
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, without out-of-bounds checking. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48
+};
+
+#if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
+ 0, 74, 74, 140, 141, 142, 144, 149, 156, 162,
+ 176, 178, 185, 193, 194, 203, 204, 205, 206, 226,
+ 227, 242, 246, 247, 248, 249, 253, 254, 255, 259,
+ 260, 261, 265, 266, 267, 268, 269, 273, 274, 275,
+ 279, 280, 284, 285, 289, 290, 294, 295, 299, 300,
+ 304, 305, 309, 312, 354, 372, 373, 374, 375, 376,
+ 377, 378, 379, 380, 381, 382, 386, 387, 391, 392,
+ 399, 400
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || 0
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "PTOK_PLUS", "PTOK_MINUS",
+ "PTOK_ASTERIX", "PTOK_SLASH", "PTOK_EQUAL", "PTOK_LEFT_PAREN",
+ "PTOK_RIGHT_PAREN", "PTOK_LEFT_BRACKET", "PTOK_RIGHT_BRACKET",
+ "PTOK_DOT", "PTOK_AMPERSAND", "PTOK_PIPE", "PTOK_CIRCUM", "PTOK_PERCENT",
+ "PTOK_TILDE", "PTOK_QUESTION", "PTOK_COLON", "PTOK_EXCLAMATION",
+ "PTOK_LESS", "PTOK_GREATHER", "PTOK_COMMA", "PTOK_AND_OP", "PTOK_OR_OP",
+ "PTOK_INC_OP", "PTOK_DEC_OP", "PTOK_EQ_OP", "PTOK_NE_OP", "PTOK_GE_OP",
+ "PTOK_LE_OP", "PTOK_LEFT_OP", "PTOK_RIGHT_OP", "PTOK_MUL_ASSIGN",
+ "PTOK_DIV_ASSIGN", "PTOK_MOD_ASSIGN", "PTOK_ADD_ASSIGN",
+ "PTOK_SUB_ASSIGN", "PTOK_LEFT_ASSIGN", "PTOK_RIGHT_ASSIGN",
+ "PTOK_AND_ASSIGN", "PTOK_XOR_ASSIGN", "PTOK_OR_ASSIGN", "PTOK_INT",
+ "PTOK_MEMORY_OBJECT", "PTOK_MEMORY", "PTOK_NUMBER", "PTOK_BIT",
+ "$accept", "ucsim_grammar", "primary_expr", "postfix_expr", "unary_expr",
+ "cast_expr", "type_name", "multiplicative_expr", "additive_expr",
+ "shift_expr", "relational_expr", "equality_expr", "and_expr",
+ "exclusive_or_expr", "inclusive_or_expr", "logical_and_expr",
+ "logical_or_expr", "conditional_expr", "assignment_expr",
+ "assignment_operator", "expr", "memory", "bit", YY_NULLPTR
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, 298, 299, 300, 301, 302, 303
+};
+# endif
+
+#define YYPACT_NINF -64
+
+#define yypact_value_is_default(Yystate) \
+ (!!((Yystate) == (-64)))
+
+#define YYTABLE_NINF -1
+
+#define yytable_value_is_error(Yytable_value) \
+ 0
+
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int8 yypact[] =
+{
+ 74, 89, 89, 10, -2, 89, 89, 16, 16, 22,
+ -64, -64, -64, 12, -64, -64, -64, -64, 29, 48,
+ 63, 19, 70, 13, 14, 24, 18, -3, -64, -64,
+ 42, 105, 62, 74, -64, -10, -64, -64, -64, 64,
+ 2, 76, -64, -64, -64, -64, -64, 74, -64, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, -64,
+ 74, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, 74, 74, 16, -64, 8, -64, -64,
+ -64, 29, 29, 48, 48, 63, 63, 63, 63, 19,
+ 19, 70, 13, 14, 24, 5, 18, -64, 42, -64,
+ -64, -64, -64, 74, -64
+};
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint8 yydefact[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 5, 70, 0, 7, 10, 19, 22, 26, 29,
+ 32, 37, 40, 42, 44, 46, 48, 50, 52, 66,
+ 2, 3, 4, 0, 16, 3, 4, 15, 21, 0,
+ 0, 13, 14, 17, 18, 11, 12, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,
+ 0, 8, 9, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 0, 0, 0, 6, 0, 23, 24,
+ 25, 27, 28, 30, 31, 33, 34, 36, 35, 38,
+ 39, 41, 43, 45, 47, 0, 49, 67, 71, 53,
+ 54, 20, 69, 0, 51
+};
+
+ /* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -64, -64, -64, -64, 58, 30, -64, 51, 53, 67,
+ 50, 43, 23, 11, 49, 46, -64, 15, -63, -64,
+ 1, 0, 6
+};
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ -1, 13, 14, 15, 16, 17, 39, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 83,
+ 40, 35, 36
+};
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_uint8 yytable[] =
+{
+ 31, 30, 70, 31, 41, 107, 32, 45, 46, 32,
+ 42, 86, 48, 1, 2, 66, 71, 72, 3, 112,
+ 109, 110, 67, 4, 113, 68, 62, 5, 68, 63,
+ 6, 68, 47, 31, 49, 50, 7, 8, 64, 32,
+ 56, 57, 65, 9, 10, 51, 12, 31, 87, 58,
+ 59, 52, 53, 32, 38, 9, 10, 11, 12, 34,
+ 37, 9, 10, 43, 44, 68, 31, 105, 31, 84,
+ 31, 108, 32, 85, 32, 103, 32, 1, 2, 88,
+ 89, 90, 3, 31, 31, 111, 102, 4, 70, 32,
+ 32, 5, 1, 2, 6, 54, 55, 33, 60, 61,
+ 7, 8, 4, 91, 92, 101, 5, 93, 94, 6,
+ 99, 100, 69, 106, 104, 7, 8, 70, 0, 9,
+ 10, 11, 12, 95, 96, 97, 98, 0, 114, 0,
+ 0, 71, 72, 0, 9, 10, 11, 12, 0, 73,
+ 74, 75, 76, 77, 78, 79, 80, 81, 82
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 0, 0, 12, 3, 4, 68, 0, 7, 8, 3,
+ 4, 9, 0, 3, 4, 18, 26, 27, 8, 11,
+ 83, 84, 25, 13, 19, 23, 13, 17, 23, 15,
+ 20, 23, 10, 33, 5, 6, 26, 27, 14, 33,
+ 21, 22, 24, 45, 46, 16, 48, 47, 47, 30,
+ 31, 3, 4, 47, 44, 45, 46, 47, 48, 1,
+ 2, 45, 46, 5, 6, 23, 66, 66, 68, 7,
+ 70, 70, 66, 9, 68, 64, 70, 3, 4, 49,
+ 50, 51, 8, 83, 84, 85, 63, 13, 12, 83,
+ 84, 17, 3, 4, 20, 32, 33, 8, 28, 29,
+ 26, 27, 13, 52, 53, 62, 17, 54, 55, 20,
+ 60, 61, 7, 67, 65, 26, 27, 12, -1, 45,
+ 46, 47, 48, 56, 57, 58, 59, -1, 113, -1,
+ -1, 26, 27, -1, 45, 46, 47, 48, -1, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43
+};
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 3, 4, 8, 13, 17, 20, 26, 27, 45,
+ 46, 47, 48, 50, 51, 52, 53, 54, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 69, 70, 71, 8, 53, 70, 71, 53, 44, 55,
+ 69, 70, 71, 53, 53, 70, 70, 10, 0, 5,
+ 6, 16, 3, 4, 32, 33, 21, 22, 30, 31,
+ 28, 29, 13, 15, 14, 24, 18, 25, 23, 7,
+ 12, 26, 27, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 68, 7, 9, 9, 69, 54, 54,
+ 54, 56, 56, 57, 57, 58, 58, 58, 58, 59,
+ 59, 60, 61, 62, 63, 69, 64, 67, 69, 67,
+ 67, 70, 11, 19, 66
+};
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 49, 50, 51, 51, 51, 51, 52, 52, 52,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 54,
+ 54, 55, 56, 56, 56, 56, 57, 57, 57, 58,
+ 58, 58, 59, 59, 59, 59, 59, 60, 60, 60,
+ 61, 61, 62, 62, 63, 63, 64, 64, 65, 65,
+ 66, 66, 67, 67, 67, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 69, 69, 70, 70,
+ 71, 71
+};
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 1, 1, 1, 1, 3, 1, 2, 2,
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 1,
+ 4, 1, 1, 3, 3, 3, 1, 3, 3, 1,
+ 3, 3, 1, 3, 3, 3, 3, 1, 3, 3,
+ 1, 3, 1, 3, 1, 3, 1, 3, 1, 3,
+ 1, 5, 1, 3, 3, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 3, 1, 4,
+ 1, 3
+};
+
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (0)
+
+/* Error token number */
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*----------------------------------------.
+| Print this symbol's value on YYOUTPUT. |
+`----------------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyo = yyoutput;
+ YYUSE (yyo);
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ YYUSE (yytype);
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyoutput, "%s %s (",
+ yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
+{
+ unsigned long int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ yystos[yyssp[yyi + 1 - yynrhs]],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ );
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+yystrlen (const char *yystr)
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+ about the unexpected token YYTOKEN for the state stack whose top is
+ YYSSP.
+
+ Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
+ not large enough to hold the message. In that case, also set
+ *YYMSG_ALLOC to the required number of bytes. Return 2 if the
+ required number of bytes is too large to store. */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+ yytype_int16 *yyssp, int yytoken)
+{
+ YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+ YYSIZE_T yysize = yysize0;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ /* Internationalized format string. */
+ const char *yyformat = YY_NULLPTR;
+ /* Arguments of yyformat. */
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ /* Number of reported tokens (one for the "unexpected", one per
+ "expected"). */
+ int yycount = 0;
+
+ /* There are many possibilities here to consider:
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+ tokens because there are none.
+ - The only way there can be no lookahead present (in yychar) is if
+ this state is a consistent state with a default action. Thus,
+ detecting the absence of a lookahead is sufficient to determine
+ that there is no unexpected or expected token to report. In that
+ case, just report a simple "syntax error".
+ - Don't assume there isn't a lookahead just because this state is a
+ consistent state with a default action. There might have been a
+ previous inconsistent state, consistent state with a non-default
+ action, or user semantic action that manipulated yychar.
+ - Of course, the expected token list depends on states to have
+ correct lookahead information, and it depends on the parser not
+ to perform extra reductions after fetching a lookahead from the
+ scanner and before detecting a syntax error. Thus, state merging
+ (from LALR or IELR) and default reductions corrupt the expected
+ token list. However, the list is correct for canonical LR with
+ one exception: it will still contain any token that will not be
+ accepted due to an error action in a later state.
+ */
+ if (yytoken != YYEMPTY)
+ {
+ int yyn = yypact[*yyssp];
+ yyarg[yycount++] = yytname[yytoken];
+ if (!yypact_value_is_default (yyn))
+ {
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. In other words, skip the first -YYN actions for
+ this state because they are default actions. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yyx;
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+ && !yytable_value_is_error (yytable[yyx + yyn]))
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ {
+ YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
+ if (! (yysize <= yysize1
+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
+ }
+ }
+ }
+
+ switch (yycount)
+ {
+# define YYCASE_(N, S) \
+ case N: \
+ yyformat = S; \
+ break
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+ }
+
+ {
+ YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
+
+ if (*yymsg_alloc < yysize)
+ {
+ *yymsg_alloc = 2 * yysize;
+ if (! (yysize <= *yymsg_alloc
+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+ return 1;
+ }
+
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ {
+ char *yyp = *yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyformat) != '\0')
+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyformat += 2;
+ }
+ else
+ {
+ yyp++;
+ yyformat++;
+ }
+ }
+ return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+{
+ YYUSE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YYUSE (yytype);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+ 'yyss': related to states.
+ 'yyvs': related to semantic values.
+
+ Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
+
+ YYSIZE_T yystacksize;
+
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ yyssp = yyss = yyssa;
+ yyvsp = yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+#line 74 "cmdpars.y" /* yacc.c:1646 */
+ { application->/*dd_printf("%d\n", $1)*/expr_result=(yyvsp[0].number); }
+#line 1419 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 3:
+#line 140 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address); }
+#line 1425 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 4:
+#line 141 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[0].bit).memory->read((yyvsp[0].bit).mem_address) & (yyvsp[0].bit).mask)?1:0; }
+#line 1431 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 5:
+#line 142 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1437 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 6:
+#line 144 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-1].number); }
+#line 1443 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 7:
+#line 149 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1449 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 8:
+#line 157 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[-1].memory).memory->read((yyvsp[-1].memory).address);
+ (yyvsp[-1].memory).memory->write((yyvsp[-1].memory).address, (yyval.number)+1);
+ }
+#line 1458 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 9:
+#line 163 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[-1].memory).memory->read((yyvsp[-1].memory).address);
+ (yyvsp[-1].memory).memory->write((yyvsp[-1].memory).address, (yyval.number)-1);
+ }
+#line 1467 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 10:
+#line 176 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1473 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 11:
+#line 179 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address);
+ (yyvsp[0].memory).memory->write((yyvsp[0].memory).address, (yyval.number)+1);
+ (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address);
+ }
+#line 1483 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 12:
+#line 186 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address);
+ (yyvsp[0].memory).memory->write((yyvsp[0].memory).address, (yyval.number)-1);
+ (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address);
+ }
+#line 1493 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 13:
+#line 193 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].memory).address; }
+#line 1499 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 14:
+#line 195 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[0].bit).bit_address;
+ if ((yyval.number) < 0)
+ {
+ yyerror("Bit has no address.");
+ (yyval.number)= 0;
+ }
+ }
+#line 1512 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 15:
+#line 203 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= -(yyvsp[0].number); }
+#line 1518 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 16:
+#line 204 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= +(yyvsp[0].number); }
+#line 1524 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 17:
+#line 205 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ~(yyvsp[0].number); }
+#line 1530 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 18:
+#line 206 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[0].number))?0:1; }
+#line 1536 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 19:
+#line 226 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1542 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 20:
+#line 228 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.number)= (yyvsp[0].memory).memory->read((yyvsp[0].memory).address);
+ if ((yyvsp[-2].number) == PTOK_INT)
+ {
+ // If the highest bit for the memory width is set
+ // sign extend by setting all the bits above that.
+ long smask= 1U << ((yyvsp[0].memory).memory->width - 1);
+ if ((yyval.number) & smask)
+ (yyval.number) |= ~(smask - 1);
+ }
+ }
+#line 1558 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 21:
+#line 242 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_INT; }
+#line 1564 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 22:
+#line 246 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1570 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 23:
+#line 247 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) * (yyvsp[0].number); }
+#line 1576 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 24:
+#line 248 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) / (yyvsp[0].number); }
+#line 1582 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 25:
+#line 249 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) % (yyvsp[0].number); }
+#line 1588 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 26:
+#line 253 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1594 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 27:
+#line 254 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) + (yyvsp[0].number); }
+#line 1600 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 28:
+#line 255 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) - (yyvsp[0].number); }
+#line 1606 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 29:
+#line 259 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1612 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 30:
+#line 260 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) << (yyvsp[0].number); }
+#line 1618 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 31:
+#line 261 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) >> (yyvsp[0].number); }
+#line 1624 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 32:
+#line 265 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1630 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 33:
+#line 266 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) < (yyvsp[0].number))?1:0; }
+#line 1636 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 34:
+#line 267 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) > (yyvsp[0].number))?1:0; }
+#line 1642 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 35:
+#line 268 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) <= (yyvsp[0].number))?1:0; }
+#line 1648 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 36:
+#line 269 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) >= (yyvsp[0].number))?1:0; }
+#line 1654 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 37:
+#line 273 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1660 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 38:
+#line 274 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number)==(yyvsp[0].number))?1:0; }
+#line 1666 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 39:
+#line 275 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number)!=(yyvsp[0].number))?1:0; }
+#line 1672 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 40:
+#line 279 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1678 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 41:
+#line 280 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) & (yyvsp[0].number); }
+#line 1684 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 42:
+#line 284 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1690 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 43:
+#line 285 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) ^ (yyvsp[0].number); }
+#line 1696 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 44:
+#line 289 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1702 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 45:
+#line 290 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[-2].number) | (yyvsp[0].number); }
+#line 1708 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 46:
+#line 294 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1714 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 47:
+#line 295 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) && (yyvsp[0].number))?1:0; }
+#line 1720 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 48:
+#line 299 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1726 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 49:
+#line 300 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-2].number) || (yyvsp[0].number))?1:0; }
+#line 1732 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 50:
+#line 304 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1738 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 51:
+#line 305 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= ((yyvsp[-4].number))?((yyvsp[-2].number)):((yyvsp[0].number)); }
+#line 1744 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 52:
+#line 309 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1750 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 53:
+#line 313 "cmdpars.y" /* yacc.c:1646 */
+ {
+ t_mem org= (yyvsp[-2].memory).memory->read((yyvsp[-2].memory).address);
+ (yyval.number)= (yyvsp[0].number);
+ switch ((yyvsp[-1].number))
+ {
+ case PTOK_EQUAL:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, (yyvsp[0].number));
+ break;
+ case PTOK_MUL_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org *= (yyvsp[0].number));
+ break;
+ case PTOK_DIV_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org /= (yyvsp[0].number));
+ break;
+ case PTOK_MOD_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org %= (yyvsp[0].number));
+ break;
+ case PTOK_ADD_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org += (yyvsp[0].number));
+ break;
+ case PTOK_SUB_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org -= (yyvsp[0].number));
+ break;
+ case PTOK_LEFT_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org <<= (yyvsp[0].number));
+ break;
+ case PTOK_RIGHT_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org >>= (yyvsp[0].number));
+ break;
+ case PTOK_AND_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org &= (yyvsp[0].number));
+ break;
+ case PTOK_XOR_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org ^= (yyvsp[0].number));
+ break;
+ case PTOK_OR_ASSIGN:
+ (yyvsp[-2].memory).memory->write((yyvsp[-2].memory).address, org |= (yyvsp[0].number));
+ break;
+ }
+ (yyval.number)= (yyvsp[-2].memory).memory->read((yyvsp[-2].memory).address);
+ }
+#line 1796 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 54:
+#line 355 "cmdpars.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[0].number))
+ {
+ (yyvsp[-2].bit).memory->write((yyvsp[-2].bit).mem_address,
+ (yyvsp[-2].bit).memory->read((yyvsp[-2].bit).mem_address) | (yyvsp[-2].bit).mask);
+ (yyval.number)= 1;
+ }
+ else
+ {
+ (yyvsp[-2].bit).memory->write((yyvsp[-2].bit).mem_address,
+ (yyvsp[-2].bit).memory->read((yyvsp[-2].bit).mem_address) & ~((yyvsp[-2].bit).mask));
+ (yyval.number)= 0;
+ }
+ }
+#line 1815 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 55:
+#line 372 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_EQUAL; }
+#line 1821 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 56:
+#line 373 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_MUL_ASSIGN; }
+#line 1827 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 57:
+#line 374 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_DIV_ASSIGN; }
+#line 1833 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 58:
+#line 375 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_MOD_ASSIGN; }
+#line 1839 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 59:
+#line 376 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_ADD_ASSIGN; }
+#line 1845 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 60:
+#line 377 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_SUB_ASSIGN; }
+#line 1851 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 61:
+#line 378 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_LEFT_ASSIGN; }
+#line 1857 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 62:
+#line 379 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_RIGHT_ASSIGN; }
+#line 1863 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 63:
+#line 380 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_AND_ASSIGN; }
+#line 1869 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 64:
+#line 381 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_XOR_ASSIGN; }
+#line 1875 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 65:
+#line 382 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= PTOK_OR_ASSIGN; }
+#line 1881 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 66:
+#line 386 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1887 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 67:
+#line 387 "cmdpars.y" /* yacc.c:1646 */
+ { (yyval.number)= (yyvsp[0].number); }
+#line 1893 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 69:
+#line 393 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.memory).memory= (yyvsp[-3].memory_object);
+ (yyval.memory).address= (yyvsp[-1].number);
+ }
+#line 1902 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 71:
+#line 401 "cmdpars.y" /* yacc.c:1646 */
+ {
+ (yyval.bit).memory= (yyvsp[-2].memory).memory;
+ (yyval.bit).mem_address= (yyvsp[-2].memory).address;
+ (yyval.bit).mask= 1 << (yyvsp[0].number);
+ (yyval.bit).bit_address= -1;
+ class cl_uc *uc= application->get_uc();
+ if (uc)
+ (yyval.bit).bit_address= uc->bit_address((yyvsp[-2].memory).memory, (yyvsp[-2].memory).address, (yyvsp[0].number));
+ }
+#line 1916 "y.tab.c" /* yacc.c:1646 */
+ break;
+
+
+#line 1920 "y.tab.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+ yyssp, yytoken)
+ {
+ char const *yymsgp = YY_("syntax error");
+ int yysyntax_error_status;
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ if (yysyntax_error_status == 0)
+ yymsgp = yymsg;
+ else if (yysyntax_error_status == 1)
+ {
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+ if (!yymsg)
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ yysyntax_error_status = 2;
+ }
+ else
+ {
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ yymsgp = yymsg;
+ }
+ }
+ yyerror (yymsgp);
+ if (yysyntax_error_status == 2)
+ goto yyexhaustedlab;
+ }
+# undef YYSYNTAX_ERROR
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#if !defined yyoverflow || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ return yyresult;
+}
+#line 412 "cmdpars.y" /* yacc.c:1906 */
+
+
+static void
+yyerror (const char *msg)
+{
+ application->dd_cprintf ("error", "Parser error: %s\n", msg);
+}
diff --git a/sim/ucsim/cmd.src/cmdpars.hh b/sim/ucsim/cmd.src/cmdpars.hh
new file mode 100644
index 0000000..cbc6e16
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdpars.hh
@@ -0,0 +1,176 @@
+/* A Bison parser, made by GNU Bison 3.0.4. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+#ifndef YY_YY_Y_TAB_H_INCLUDED
+# define YY_YY_Y_TAB_H_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token type. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ PTOK_PLUS = 258,
+ PTOK_MINUS = 259,
+ PTOK_ASTERIX = 260,
+ PTOK_SLASH = 261,
+ PTOK_EQUAL = 262,
+ PTOK_LEFT_PAREN = 263,
+ PTOK_RIGHT_PAREN = 264,
+ PTOK_LEFT_BRACKET = 265,
+ PTOK_RIGHT_BRACKET = 266,
+ PTOK_DOT = 267,
+ PTOK_AMPERSAND = 268,
+ PTOK_PIPE = 269,
+ PTOK_CIRCUM = 270,
+ PTOK_PERCENT = 271,
+ PTOK_TILDE = 272,
+ PTOK_QUESTION = 273,
+ PTOK_COLON = 274,
+ PTOK_EXCLAMATION = 275,
+ PTOK_LESS = 276,
+ PTOK_GREATHER = 277,
+ PTOK_COMMA = 278,
+ PTOK_AND_OP = 279,
+ PTOK_OR_OP = 280,
+ PTOK_INC_OP = 281,
+ PTOK_DEC_OP = 282,
+ PTOK_EQ_OP = 283,
+ PTOK_NE_OP = 284,
+ PTOK_GE_OP = 285,
+ PTOK_LE_OP = 286,
+ PTOK_LEFT_OP = 287,
+ PTOK_RIGHT_OP = 288,
+ PTOK_MUL_ASSIGN = 289,
+ PTOK_DIV_ASSIGN = 290,
+ PTOK_MOD_ASSIGN = 291,
+ PTOK_ADD_ASSIGN = 292,
+ PTOK_SUB_ASSIGN = 293,
+ PTOK_LEFT_ASSIGN = 294,
+ PTOK_RIGHT_ASSIGN = 295,
+ PTOK_AND_ASSIGN = 296,
+ PTOK_XOR_ASSIGN = 297,
+ PTOK_OR_ASSIGN = 298,
+ PTOK_INT = 299,
+ PTOK_MEMORY_OBJECT = 300,
+ PTOK_MEMORY = 301,
+ PTOK_NUMBER = 302,
+ PTOK_BIT = 303
+ };
+#endif
+/* Tokens. */
+#define PTOK_PLUS 258
+#define PTOK_MINUS 259
+#define PTOK_ASTERIX 260
+#define PTOK_SLASH 261
+#define PTOK_EQUAL 262
+#define PTOK_LEFT_PAREN 263
+#define PTOK_RIGHT_PAREN 264
+#define PTOK_LEFT_BRACKET 265
+#define PTOK_RIGHT_BRACKET 266
+#define PTOK_DOT 267
+#define PTOK_AMPERSAND 268
+#define PTOK_PIPE 269
+#define PTOK_CIRCUM 270
+#define PTOK_PERCENT 271
+#define PTOK_TILDE 272
+#define PTOK_QUESTION 273
+#define PTOK_COLON 274
+#define PTOK_EXCLAMATION 275
+#define PTOK_LESS 276
+#define PTOK_GREATHER 277
+#define PTOK_COMMA 278
+#define PTOK_AND_OP 279
+#define PTOK_OR_OP 280
+#define PTOK_INC_OP 281
+#define PTOK_DEC_OP 282
+#define PTOK_EQ_OP 283
+#define PTOK_NE_OP 284
+#define PTOK_GE_OP 285
+#define PTOK_LE_OP 286
+#define PTOK_LEFT_OP 287
+#define PTOK_RIGHT_OP 288
+#define PTOK_MUL_ASSIGN 289
+#define PTOK_DIV_ASSIGN 290
+#define PTOK_MOD_ASSIGN 291
+#define PTOK_ADD_ASSIGN 292
+#define PTOK_SUB_ASSIGN 293
+#define PTOK_LEFT_ASSIGN 294
+#define PTOK_RIGHT_ASSIGN 295
+#define PTOK_AND_ASSIGN 296
+#define PTOK_XOR_ASSIGN 297
+#define PTOK_OR_ASSIGN 298
+#define PTOK_INT 299
+#define PTOK_MEMORY_OBJECT 300
+#define PTOK_MEMORY 301
+#define PTOK_NUMBER 302
+#define PTOK_BIT 303
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+
+union YYSTYPE
+{
+#line 57 "cmdpars.y" /* yacc.c:1909 */
+
+ long number;
+ class cl_memory *memory_object;
+ struct {
+ class cl_memory *memory;
+ long address;
+ } memory;
+ struct {
+ class cl_memory *memory;
+ long mem_address, bit_address;
+ long mask;
+ } bit;
+
+#line 164 "y.tab.h" /* yacc.c:1909 */
+};
+
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+int yyparse (void);
+
+#endif /* !YY_YY_Y_TAB_H_INCLUDED */
diff --git a/sim/ucsim/cmd.src/cmdpars.o b/sim/ucsim/cmd.src/cmdpars.o
new file mode 100644
index 0000000..37cc5f0
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdpars.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/cmdpars.y b/sim/ucsim/cmd.src/cmdpars.y
new file mode 100644
index 0000000..48f0439
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdpars.y
@@ -0,0 +1,418 @@
+%{
+
+#include "cmdlexcl.h"
+#include "memcl.h"
+#include "globals.h"
+#include "stypes.h"
+
+static void yyerror (const char *msg);
+%}
+/*%expect 6*/
+
+%token PTOK_PLUS PTOK_MINUS PTOK_ASTERIX PTOK_SLASH PTOK_EQUAL
+%token PTOK_LEFT_PAREN PTOK_RIGHT_PAREN
+%token PTOK_LEFT_BRACKET PTOK_RIGHT_BRACKET
+%token PTOK_DOT PTOK_AMPERSAND PTOK_PIPE PTOK_CIRCUM
+%token PTOK_PERCENT PTOK_TILDE PTOK_QUESTION PTOK_COLON PTOK_EXCLAMATION
+%token PTOK_LESS PTOK_GREATHER PTOK_COMMA
+
+%token PTOK_AND_OP PTOK_OR_OP
+%token PTOK_INC_OP PTOK_DEC_OP
+%token PTOK_EQ_OP PTOK_NE_OP
+%token PTOK_GE_OP PTOK_LE_OP
+%token PTOK_LEFT_OP PTOK_RIGHT_OP
+
+%token PTOK_MUL_ASSIGN
+%token PTOK_DIV_ASSIGN
+%token PTOK_MOD_ASSIGN
+%token PTOK_ADD_ASSIGN
+%token PTOK_SUB_ASSIGN
+%token PTOK_LEFT_ASSIGN
+%token PTOK_RIGHT_ASSIGN
+%token PTOK_AND_ASSIGN
+%token PTOK_XOR_ASSIGN
+%token PTOK_OR_ASSIGN
+
+%token PTOK_INT
+
+%token <memory_object> PTOK_MEMORY_OBJECT
+%token <memory> PTOK_MEMORY
+%token <number> PTOK_NUMBER
+%token <bit> PTOK_BIT
+
+%type <number> ucsim_grammar expr
+%type <number> primary_expr postfix_expr
+%type <number> unary_expr cast_expr
+%type <number> multiplicative_expr additive_expr shift_expr
+%type <number> relational_expr equality_expr
+%type <number> and_expr exclusive_or_expr inclusive_or_expr
+%type <number> logical_and_expr logical_or_expr
+%type <number> conditional_expr assignment_expr
+
+%type <number> type_name assignment_operator
+
+%type <memory> memory
+%type <bit> bit
+
+%union {
+ long number;
+ class cl_memory *memory_object;
+ struct {
+ class cl_memory *memory;
+ long address;
+ } memory;
+ struct {
+ class cl_memory *memory;
+ long mem_address, bit_address;
+ long mask;
+ } bit;
+}
+
+%%
+
+ucsim_grammar:
+expr { application->/*dd_printf("%d\n", $1)*/expr_result=$1; }
+ ;
+/*
+assignment:
+ memory PTOK_EQUAL expression
+ {
+ $1.memory->write($1.address, $3);
+ $$= $3;
+ }
+ | bit PTOK_EQUAL expression
+ {
+ if ($3)
+ {
+ $1.memory->write($1.mem_address,
+ $1.memory->read($1.mem_address) | $1.mask);
+ $$= 1;
+ }
+ else
+ {
+ $1.memory->write($1.mem_address,
+ $1.memory->read($1.mem_address) & ~($1.mask));
+ $$= 0;
+ }
+ }
+ ;
+*/
+/*
+expression:
+ assignment { $$= $1; }
+ | expression PTOK_PLUS expression { $$= $1 + $3; }
+ | expression PTOK_MINUS expression { $$= $1 - $3; }
+ | expression PTOK_ASTERIX expression { $$= $1 * $3; }
+ | expression PTOK_SLASH expression
+ {
+ if ($3 == 0)
+ yyerror("Divide by zero");
+ else
+ $$= $1 / $3;
+ }
+ | PTOK_MINUS expression %prec UNARYMINUS { $$= -$2; }
+ | address_of_expression { $$= $1; }
+ | PTOK_LEFT_PAREN expression PTOK_RIGHT_PAREN { $$= $2; }
+ | PTOK_NUMBER { $$= $1; }
+ | memory { $$= $1.memory->read($1.address); }
+ | bit { $$= ($1.memory->read($1.mem_address) & $1.mask)?1:0; }
+ ;
+*/
+
+/*
+address_of_expression:
+ PTOK_AMPERSAND memory { $$= $2.address; }
+ | PTOK_AMPERSAND bit
+ {
+ $$= $2.bit_address;
+ if ($$ < 0)
+ {
+ yyerror("Bit has no address.");
+ $$= 0;
+ }
+ }
+ ;
+*/
+
+
+primary_expr
+/* : identifier */
+: memory { $$= $1.memory->read($1.address); }
+| bit { $$= ($1.memory->read($1.mem_address) & $1.mask)?1:0; }
+| PTOK_NUMBER { $$= $1; }
+ /* | string_literal_val*/
+| PTOK_LEFT_PAREN expr PTOK_RIGHT_PAREN { $$= $2; }
+ /* | generic_selection*/
+ ;
+
+postfix_expr
+: primary_expr { $$= $1; }
+/* | postfix_expr PTOK_LEFT_BRACKET expr PTOK_RIGHT_BRACKET */
+/* | postfix_expr PTOK_LEFT_PAREN PTOK_RIGHT_PAREN */
+/* | postfix_expr PTOK_LEFT_PAREN argument_expr_list PTOK_RIGHT_PAREN*/
+/* | postfix_expr PTOK_DOT identifier*/
+/* | postfix_expr PTOK_AMPERSAND identifier*/
+/*| postfix_expr PTOK_INC_OP*/
+| memory PTOK_INC_OP
+ {
+ $$= $1.memory->read($1.address);
+ $1.memory->write($1.address, $$+1);
+ }
+/*| postfix_expr PTOK_DEC_OP*/
+| memory PTOK_DEC_OP
+ {
+ $$= $1.memory->read($1.address);
+ $1.memory->write($1.address, $$-1);
+ }
+;
+/*
+argument_expr_list
+ : assignment_expr
+ | assignment_expr PTOK_COLON argument_expr_list
+ ;
+*/
+
+unary_expr
+: postfix_expr { $$= $1; }
+/*| PTOK_INC_OP unary_expr */
+| PTOK_INC_OP memory
+ {
+ $$= $2.memory->read($2.address);
+ $2.memory->write($2.address, $$+1);
+ $$= $2.memory->read($2.address);
+ }
+/*| PTOK_DEC_OP unary_expr */
+| PTOK_DEC_OP memory
+ {
+ $$= $2.memory->read($2.address);
+ $2.memory->write($2.address, $$-1);
+ $$= $2.memory->read($2.address);
+ }
+/*| unary_operator cast_expr */
+/*| PTOK_AMPERSAND unary_expr*/
+|PTOK_AMPERSAND memory { $$= $2.address; }
+|PTOK_AMPERSAND bit
+ {
+ $$= $2.bit_address;
+ if ($$ < 0)
+ {
+ yyerror("Bit has no address.");
+ $$= 0;
+ }
+ }
+| PTOK_MINUS unary_expr { $$= -$2; }
+| PTOK_PLUS unary_expr { $$= +$2; }
+| PTOK_TILDE unary_expr { $$= ~$2; }
+| PTOK_EXCLAMATION unary_expr { $$= ($2)?0:1; }
+ /* | SIZEOF unary_expr */
+ /* | SIZEOF PTOK_LEFT_PAREN type_name PTOK_RIGHT_PAREN */
+ /* | ALIGNOF PTOK_LEFT_PAREN type_name PTOK_RIGHT_PAREN*/
+ /* | TYPEOF unary_expr */
+ /* | OFFSETOF PTOK_LEFT_PAREN type_name PTOK_COMMA offsetof_member_designator PTOK_RIGHT_PAREN */
+;
+
+/*
+unary_operator
+ : '&'
+ | '*'
+ | '+'
+ | '-'
+ | '~'
+ | '!'
+ ;
+*/
+
+cast_expr
+: unary_expr { $$= $1; }
+| PTOK_LEFT_PAREN type_name PTOK_RIGHT_PAREN /*cast_expr*/ memory
+ {
+ $$= $4.memory->read($4.address);
+ if ($2 == PTOK_INT)
+ {
+ // If the highest bit for the memory width is set
+ // sign extend by setting all the bits above that.
+ long smask= 1U << ($4.memory->width - 1);
+ if ($$ & smask)
+ $$ |= ~(smask - 1);
+ }
+ }
+;
+
+type_name
+: PTOK_INT { $$= PTOK_INT; }
+;
+
+multiplicative_expr
+: cast_expr { $$= $1; }
+| multiplicative_expr PTOK_ASTERIX cast_expr { $$= $1 * $3; }
+| multiplicative_expr PTOK_SLASH cast_expr { $$= $1 / $3; }
+| multiplicative_expr PTOK_PERCENT cast_expr { $$= $1 % $3; }
+;
+
+additive_expr
+: multiplicative_expr { $$= $1; }
+| additive_expr PTOK_PLUS multiplicative_expr { $$= $1 + $3; }
+| additive_expr PTOK_MINUS multiplicative_expr { $$= $1 - $3; }
+;
+
+shift_expr
+: additive_expr { $$= $1; }
+| shift_expr PTOK_LEFT_OP additive_expr { $$= $1 << $3; }
+| shift_expr PTOK_RIGHT_OP additive_expr { $$= $1 >> $3; }
+;
+
+relational_expr
+: shift_expr { $$= $1; }
+| relational_expr PTOK_LESS shift_expr { $$= ($1 < $3)?1:0; }
+| relational_expr PTOK_GREATHER shift_expr { $$= ($1 > $3)?1:0; }
+| relational_expr PTOK_LE_OP shift_expr { $$= ($1 <= $3)?1:0; }
+| relational_expr PTOK_GE_OP shift_expr { $$= ($1 >= $3)?1:0; }
+;
+
+equality_expr
+: relational_expr { $$= $1; }
+| equality_expr PTOK_EQ_OP relational_expr { $$= ($1==$3)?1:0; }
+| equality_expr PTOK_NE_OP relational_expr { $$= ($1!=$3)?1:0; }
+;
+
+and_expr
+: equality_expr { $$= $1; }
+| and_expr PTOK_AMPERSAND equality_expr { $$= $1 & $3; }
+;
+
+exclusive_or_expr
+: and_expr { $$= $1; }
+| exclusive_or_expr PTOK_CIRCUM and_expr { $$= $1 ^ $3; }
+;
+
+inclusive_or_expr
+: exclusive_or_expr { $$= $1; }
+| inclusive_or_expr PTOK_PIPE exclusive_or_expr { $$= $1 | $3; }
+;
+
+logical_and_expr
+: inclusive_or_expr { $$= $1; }
+| logical_and_expr PTOK_AND_OP inclusive_or_expr { $$= ($1 && $3)?1:0; }
+;
+
+logical_or_expr
+: logical_and_expr { $$= $1; }
+| logical_or_expr PTOK_OR_OP logical_and_expr { $$= ($1 || $3)?1:0; }
+;
+
+conditional_expr
+: logical_or_expr { $$= $1; }
+| logical_or_expr PTOK_QUESTION expr PTOK_COLON conditional_expr { $$= ($1)?($3):($5); }
+;
+
+assignment_expr
+: conditional_expr { $$= $1; }
+/*| cast_expr assignment_operator assignment_expr*/
+/*| cast_expr PTOK_EQUAL assignment_expr*/
+| memory assignment_operator assignment_expr
+ {
+ t_mem org= $1.memory->read($1.address);
+ $$= $3;
+ switch ($2)
+ {
+ case PTOK_EQUAL:
+ $1.memory->write($1.address, $3);
+ break;
+ case PTOK_MUL_ASSIGN:
+ $1.memory->write($1.address, org *= $3);
+ break;
+ case PTOK_DIV_ASSIGN:
+ $1.memory->write($1.address, org /= $3);
+ break;
+ case PTOK_MOD_ASSIGN:
+ $1.memory->write($1.address, org %= $3);
+ break;
+ case PTOK_ADD_ASSIGN:
+ $1.memory->write($1.address, org += $3);
+ break;
+ case PTOK_SUB_ASSIGN:
+ $1.memory->write($1.address, org -= $3);
+ break;
+ case PTOK_LEFT_ASSIGN:
+ $1.memory->write($1.address, org <<= $3);
+ break;
+ case PTOK_RIGHT_ASSIGN:
+ $1.memory->write($1.address, org >>= $3);
+ break;
+ case PTOK_AND_ASSIGN:
+ $1.memory->write($1.address, org &= $3);
+ break;
+ case PTOK_XOR_ASSIGN:
+ $1.memory->write($1.address, org ^= $3);
+ break;
+ case PTOK_OR_ASSIGN:
+ $1.memory->write($1.address, org |= $3);
+ break;
+ }
+ $$= $1.memory->read($1.address);
+ }
+| bit PTOK_EQUAL assignment_expr
+ {
+ if ($3)
+ {
+ $1.memory->write($1.mem_address,
+ $1.memory->read($1.mem_address) | $1.mask);
+ $$= 1;
+ }
+ else
+ {
+ $1.memory->write($1.mem_address,
+ $1.memory->read($1.mem_address) & ~($1.mask));
+ $$= 0;
+ }
+ }
+;
+
+assignment_operator
+: PTOK_EQUAL { $$= PTOK_EQUAL; }
+| PTOK_MUL_ASSIGN { $$= PTOK_MUL_ASSIGN; }
+| PTOK_DIV_ASSIGN { $$= PTOK_DIV_ASSIGN; }
+| PTOK_MOD_ASSIGN { $$= PTOK_MOD_ASSIGN; }
+| PTOK_ADD_ASSIGN { $$= PTOK_ADD_ASSIGN; }
+| PTOK_SUB_ASSIGN { $$= PTOK_SUB_ASSIGN; }
+| PTOK_LEFT_ASSIGN { $$= PTOK_LEFT_ASSIGN; }
+| PTOK_RIGHT_ASSIGN { $$= PTOK_RIGHT_ASSIGN; }
+| PTOK_AND_ASSIGN { $$= PTOK_AND_ASSIGN; }
+| PTOK_XOR_ASSIGN { $$= PTOK_XOR_ASSIGN; }
+| PTOK_OR_ASSIGN { $$= PTOK_OR_ASSIGN; }
+;
+
+expr
+: assignment_expr { $$= $1; }
+| expr PTOK_COMMA assignment_expr { $$= $3; }
+;
+
+memory:
+ PTOK_MEMORY
+ | PTOK_MEMORY_OBJECT PTOK_LEFT_BRACKET expr PTOK_RIGHT_BRACKET
+ {
+ $$.memory= $1;
+ $$.address= $3;
+ }
+
+bit:
+ PTOK_BIT
+ | memory PTOK_DOT expr
+ {
+ $$.memory= $1.memory;
+ $$.mem_address= $1.address;
+ $$.mask= 1 << $3;
+ $$.bit_address= -1;
+ class cl_uc *uc= application->get_uc();
+ if (uc)
+ $$.bit_address= uc->bit_address($1.memory, $1.address, $3);
+ }
+ ;
+
+%%
+
+static void
+yyerror (const char *msg)
+{
+ application->dd_cprintf ("error", "Parser error: %s\n", msg);
+}
diff --git a/sim/ucsim/cmd.src/cmdutil.cc b/sim/ucsim/cmd.src/cmdutil.cc
new file mode 100644
index 0000000..697b4dd
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdutil.cc
@@ -0,0 +1,178 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdutil.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <assert.h>
+#include <sys/types.h>
+#include "i_string.h"
+
+#include "stypes.h"
+#include "globals.h"
+#include "uccl.h"
+#include "cmdutil.h"
+
+
+/*
+ * Processing escape sequencies in a string
+ */
+
+char *
+proc_escape(char *string, int *len)
+{
+ char spec_chars[]= "fnrtvab\"";
+ char spec[]= "\f\n\r\t\v\a\b\"";
+ char *s, *str, *p;
+
+ s = string;
+ str= (char *)malloc(strlen(string)+1);
+ p = str;
+ while (*s)
+ {
+ char *spec_c;
+
+ if (*s == '\\' &&
+ *(s+1))
+ {
+ s++;
+ if (*s == '0')
+ {
+ if (!isdigit(*(s+1)))
+ {
+ *p++= '\0';
+ s++;
+ }
+ else
+ {
+ char *octal, *chk, data;
+ int i, j;
+ i= strspn(s, "01234567");
+ octal= (char *)malloc(i+1);
+ j= 0;
+ while (*s &&
+ (j < i))
+ octal[j++]= *s++;
+ octal[j]= '\0';
+ data= strtol(octal, &chk, 8);
+ if (!chk || !(*chk))
+ *p++= data;
+ }
+ }
+ else
+ if ((spec_c= strchr(spec_chars, *s)) != NULL)
+ {
+ *p++= spec[spec_c-spec_chars];
+ s++;
+ }
+ else
+ *p++= *s++;
+ }
+ else
+ *p++= *s++;
+ }
+ *p= '\0';
+ *len= p-str;
+ return(str);
+}
+
+
+
+extern "C" int vasprintf(char **strp, const char *format, va_list ap);
+extern "C" int vsnprintf(char *str, size_t size,const char *format,va_list ap);
+
+int
+cmd_vfprintf(FILE *f, char *format, va_list ap)
+{
+ int ret, i;
+ if (!f)
+ return(0);
+#ifdef HAVE_VASPRINTF
+ char *msg= NULL;
+ i= vasprintf(&msg, format, ap);
+ if (i < 0)
+ ;
+ ret= fprintf(f, "%s", msg);
+ free(msg);
+#else
+ char msg[80*25];
+ i= vsnprintf(msg, 80*25, format, ap);
+ if (i < 0)
+ ;
+ ret= fprintf(f, "%s", msg);
+#endif
+ fflush(f);
+ return(ret);
+}
+
+int
+cmd_fprintf(FILE *f, char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int ret= cmd_vfprintf(f, format, ap);
+ va_end(ap);
+ return(ret);
+}
+
+int
+bool_name(char *s, int *val)
+{
+ int v= 0;
+
+ if (!s || !*s)
+ return 0;
+ if (strspn(s, "0nNfF") > 0)
+ {
+ if (val)
+ *val= 0;
+ return 1;
+ }
+ if (strspn(s, "1yYtT") > 0)
+ {
+ if (val)
+ *val= 1;
+ return 1;
+ }
+ if (strspn(s, "oO") == 1)
+ {
+ if (toupper(s[1]) == 'N')
+ v= 1;
+ else if (toupper(s[1]) == 'F')
+ v= 0;
+ else
+ return 0;
+ if (val)
+ *val= v;
+ return 1;
+ }
+ return 0;
+}
+
+/* End of cmd.src/cmdutil.cc */
diff --git a/sim/ucsim/cmd.src/cmdutil.h b/sim/ucsim/cmd.src/cmdutil.h
new file mode 100644
index 0000000..5d0bd70
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdutil.h
@@ -0,0 +1,47 @@
+/*
+ * Simulator of microcontrollers (cmd.src/cmdutil.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_CMDUTIL_HEADER
+#define CMD_CMDUTIL_HEADER
+
+#ifdef SOCKET_AVAIL
+# include HEADER_SOCKET
+#endif
+
+#include "ddconfig.h"
+
+
+extern char *proc_escape(char *string, int *len);
+extern int cmd_vfprintf(FILE *f, char *format, va_list ap);
+extern int cmd_fprintf(FILE *f, char *format, ...);
+
+extern int bool_name(char *s, int *val);
+
+
+#endif
+
+/* End of cmd.src/cmdutil.h */
diff --git a/sim/ucsim/cmd.src/cmdutil.o b/sim/ucsim/cmd.src/cmdutil.o
new file mode 100644
index 0000000..3f920cd
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdutil.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/command.cc b/sim/ucsim/cmd.src/command.cc
new file mode 100644
index 0000000..99da95e
--- /dev/null
+++ b/sim/ucsim/cmd.src/command.cc
@@ -0,0 +1,925 @@
+/*
+ * Simulator of microcontrollers (cmd.src/command.cc)
+ *
+ * Copyright (C) 2002,02 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include "i_string.h"
+
+// prj
+#include "fiocl.h"
+#include "utils.h"
+#include "appcl.h"
+
+// local, cmd
+#include "commandcl.h"
+#include "argcl.h"
+
+
+/*
+ * Command line
+ *____________________________________________________________________________
+ */
+
+cl_cmdline::cl_cmdline(class cl_app *the_app,
+ char *acmd, class cl_console_base *acon):
+ cl_base()
+{
+ app= the_app;
+ cmd= strdup(acmd);
+ params= new cl_list(2, 2, "command line params");
+ tokens= new cl_ustrings(2, 2, "command line tokens");
+ set_name(0);
+ matched_syntax= 0;
+ con= acon;
+}
+
+cl_cmdline::~cl_cmdline(void)
+{
+ if (cmd)
+ free(cmd);
+ delete params;
+ delete tokens;
+}
+
+int
+cl_cmdline::init(void)
+{
+ rest= NULL;
+ params->free_all();
+ tokens->free_all();
+ split();
+ return(0);
+}
+
+char *
+cl_cmdline::skip_delims(char *start)
+{
+ while (*start &&
+ strchr(" \t\v\r,", *start))
+ start++;
+ return(start);
+}
+
+int
+cl_cmdline::split(void)
+{
+ //class cl_sim *sim;
+ char *start= cmd;
+ int i;//, j;
+ class cl_cmd_arg *arg;
+
+ set_name("\n");
+ if (!cmd ||
+ !*cmd)
+ return(0);
+ start+= strspn(start, " \t\v\r,");
+ if (!start)
+ return 0;
+ set_name(0);
+ if (*start == '\n')
+ {
+ // never, as \n stripped by readline
+ set_name("\n");
+ return(0);
+ }
+ else if (*start == '#')
+ return *start= 0;
+ else if (*start == ';')
+ {
+ rest= start+1;
+ *start= 0;
+ return 0;
+ }
+ if (!*start)
+ return(0);
+ // start now points to first word
+ i= strcspn(start, " \t\v\r,;#");
+ // i should be at end of it
+ if (i)
+ {
+ if (*start == '#')
+ return set_name("\n"), *start= 0;
+ char *n= (char*)malloc(i+1);
+ strncpy(n, start, i);
+ n[i]= '\0';
+ set_name(n);
+ free(n);
+ }
+ start+= i;
+ start= skip_delims(start);
+ while (*start)
+ {
+ char *end= start, *param_str;
+ if (*start == '#')
+ return *start= '\0';
+ else if (*start == ';')
+ {
+ rest= start+1;
+ *start= 0;
+ return 0;
+ }
+ else if (*start == '"')
+ split_out_string(&start, &end);
+ else if (*start == '>')
+ split_out_output_redirection(&start, &end);
+ else
+ {
+ char *dot;
+ i= strcspn(start, " \t\v\r,#;");
+ end= start+i;
+ param_str= (char *)malloc(i+1);
+ strncpy(param_str, start, i);
+ param_str[i]= '\0';
+ tokens->add(strdup(param_str));
+ if ((dot= strchr(param_str, '.')) != NULL)
+ split_out_bit(dot, param_str);
+ else if ((dot= strchr(param_str, '[')) != NULL)
+ split_out_array(dot, param_str);
+ else if (param_str[0] == '0' && param_str[1] == 'b')
+ {
+ long n= 0;
+ for (int i= 2; param_str[i] == '0' || param_str[i] == '1'; i++)
+ n = (n << 1) | (param_str[i] == '0' ? 0 : 1);
+ params->add(arg= new cl_cmd_int_arg(n));
+ arg->init();
+ }
+ else if (strchr("0123456789-+", *param_str) != NULL)
+ {
+ // number
+ params->add(arg= new cl_cmd_int_arg((long)
+ strtol(param_str, 0, 0)));
+ arg->init();
+ }
+ else
+ {
+ // symbol
+ params->add(arg= new cl_cmd_sym_arg(param_str));
+ arg->init();
+ }
+ free(param_str);
+ }
+ start= end;
+ start= skip_delims(start);
+ }
+ return(0);
+}
+
+void
+cl_cmdline::split_out_string(char **_start, char **_end)
+{
+ char *start= *_start, *end;
+ start++;
+ end= start;
+ while (*end &&
+ *end != '"')
+ {
+ if (*end == '\\')
+ {
+ end++;
+ if (*end)
+ end++;
+ }
+ else
+ end++;
+ }
+ if (*end == '"')
+ end--;
+ else
+ con->dd_printf("Unterminated string\n");
+ char *param_str= (char *)malloc(end-start+2);
+ strncpy(param_str, start, 1+end-start);
+ param_str[1+end-start]= '\0';
+ tokens->add(strdup(param_str));
+ class cl_cmd_arg *arg;
+ params->add(arg= new cl_cmd_str_arg(param_str));
+ arg->init();
+ free(param_str);
+ if (*end)
+ end++;
+ if (*end == '"')
+ end++;
+ *_start= start;
+ *_end= end;
+}
+
+void
+cl_cmdline::split_out_output_redirection(char **_start, char **_end)
+{
+ char *start= *_start, *end/*= *_end*/;
+ int i;
+ char mode[2];
+
+ mode[0]= 'w';
+ mode[1]= '\0';
+ start++;
+ i= strcspn(start, " \t\v\r,");
+ end= start+i;
+ char *param_str= (char *)malloc(i+1);
+ char *n= param_str;
+ strncpy(param_str, start, i);
+ param_str[i]= '\0';
+ if (param_str &&
+ param_str[0] == '>')
+ {
+ n++;
+ mode[0]= 'a';
+ }
+ tokens->add(strdup(n));
+ con->redirect(n, mode);
+ free(param_str);
+ *_start= start;
+ *_end= end;
+}
+
+void
+cl_cmdline::split_out_bit(char *dot, char *param_str)
+{
+ class cl_cmd_arg *sfr, *bit;
+
+ *dot= '\0';
+ dot++;
+ if (strchr("0123456789", *param_str) != NULL)
+ {
+ sfr= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
+ sfr->init();
+ }
+ else
+ {
+ sfr= new cl_cmd_sym_arg(param_str);
+ sfr->init();
+ }
+ if (*dot == '\0')
+ {
+ bit= 0;
+ con->dd_printf("Uncomplete bit address\n");
+ delete sfr;
+ }
+ else
+ {
+ if (strchr("0123456789", *dot) != NULL)
+ {
+ bit= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
+ bit->init();
+ }
+ else
+ {
+ bit= new cl_cmd_sym_arg(dot);
+ bit->init();
+ }
+ class cl_cmd_arg *arg;
+ params->add(arg= new cl_cmd_bit_arg(sfr, bit));
+ arg->init();
+ }
+}
+
+void
+cl_cmdline::split_out_array(char *dot, char *param_str)
+{
+ class cl_cmd_arg *aname, *aindex;
+
+ *dot= '\0';
+ dot++;
+ if (strchr("0123456789", *param_str) != NULL)
+ {
+ aname= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
+ aname->init();
+ }
+ else
+ {
+ aname= new cl_cmd_sym_arg(param_str);
+ aname->init();
+ }
+ if (*dot == '\0')
+ {
+ aname= 0;
+ con->dd_printf("Uncomplete array\n");
+ }
+ else
+ {
+ char *p;
+ p= dot + strlen(dot) - 1;
+ while (p > dot &&
+ *p != ']')
+ {
+ *p= '\0';
+ p--;
+ }
+ if (*p == ']')
+ *p= '\0';
+ if (strlen(dot) == 0)
+ {
+ con->dd_printf("Uncomplete array index\n");
+ delete aname;
+ }
+ else
+ {
+ if (strchr("0123456789", *dot) != NULL)
+ {
+ aindex= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
+ aindex->init();
+ }
+ else
+ {
+ aindex= new cl_cmd_sym_arg(dot);
+ aindex->init();
+ }
+ class cl_cmd_arg *arg;
+ params->add(arg= new cl_cmd_array_arg(aname, aindex));
+ arg->init();
+ }
+ }
+}
+
+int
+cl_cmdline::shift(void)
+{
+ char *s= skip_delims(cmd);
+
+ params->free_all();
+ tokens->free_all();
+ set_name(0);
+ if (s && *s)
+ {
+ while (*s &&
+ strchr(" \t\v\r,;#", *s) == NULL)
+ s++;
+ s= skip_delims(s);
+ char *p= strdup(s), *r= rest?strdup(rest):NULL;
+ free(cmd);
+ cmd= p;
+ rest= r;
+ //params= new cl_list(2, 2, "params");
+ split();
+ if (strcmp(get_name(), "\n") == 0)
+ set_name(0);
+ }
+ return(have_real_name());
+}
+
+int
+cl_cmdline::repeat(void)
+{
+ const char *n;
+ return((n= get_name()) &&
+ *n == '\n');
+}
+
+class cl_cmd_arg *
+cl_cmdline::param(int num)
+{
+ if (num >= params->count)
+ return(0);
+ return((class cl_cmd_arg *)(params->at(num)));
+}
+
+void
+cl_cmdline::insert_param(int pos, class cl_cmd_arg *param)
+{
+ if (pos >= params->count)
+ params->add(param);
+ else
+ params->add_at(pos, param);
+}
+
+bool
+cl_cmdline::syntax_match(class cl_uc *uc, const char *syntax)
+{
+ if (!syntax)
+ return(false);
+ if (!*syntax &&
+ !params->count)
+ {
+ matched_syntax= syntax;
+ return(true);
+ }
+ if (!params->count)
+ return(false);
+ //printf("syntax %s?\n",syntax);
+ const char *p= syntax;
+ int iparam= 0;
+ class cl_cmd_arg *parm= (class cl_cmd_arg *)(params->at(iparam));
+ while (*p &&
+ parm)
+ {
+ //printf("***Checking %s as %c\n",parm->get_svalue(),*p);
+ if (uc)
+ {
+ switch (*p)
+ {
+ case SY_ADDR:
+ if (!parm->as_address(uc))
+ return(false);
+ //printf("ADDRESS match %lx\n",parm->value.address);
+ break;
+ case SY_MEMORY:
+ if (!parm->as_memory(uc))
+ return(false);
+ //printf("MEMORY match %s\n",parm->value.memory->class_name);
+ break;
+ case SY_BIT:
+ if (!parm->as_bit(uc))
+ return(false);
+ break;
+ case SY_HW:
+ if (!parm->as_hw(uc))
+ return(false);
+ break;
+ case SY_CELL:
+ if (!parm->as_cell(uc))
+ return false;
+ break;
+ }
+ }
+ //else
+ {
+ switch (*p)
+ {
+ case SY_ADDR: case SY_MEMORY: case SY_BIT: break;
+ case SY_NUMBER:
+ if (!parm->as_number())
+ return(false);
+ break;
+ case SY_DATA:
+ if (!parm->as_data())
+ return(false);
+ break;
+ case SY_STRING:
+ if (!parm->as_string())
+ return(false);
+ break;
+ case SY_DATALIST:
+ if (!set_data_list(parm, &iparam))
+ return(false);
+ break;
+ //default: return(false);
+ }
+ }
+ p++;
+ iparam++;
+ if (iparam < params->count)
+ parm= (class cl_cmd_arg *)(params->at(iparam));
+ else
+ parm= 0;
+ }
+ if (!*p &&
+ !parm)
+ {
+ matched_syntax= syntax;
+ return(true);
+ }
+ return(false);
+}
+
+bool
+cl_cmdline::set_data_list(class cl_cmd_arg *parm, int *iparm)
+{
+ class cl_cmd_arg *next_parm;
+ int len, i, j;
+ t_mem *array;
+
+ len= 0;
+ array= 0;
+ for (i= *iparm, next_parm= param(i); next_parm; i++, next_parm= param(i))
+ {
+ if (next_parm->is_string())
+ {
+ int l;
+ char *s;
+ //s= proc_escape(next_parm->get_svalue(), &l);
+ if (!next_parm->as_string())
+ continue;
+ s= next_parm->value.string.string;
+ l= next_parm->value.string.len;
+ if (!array)
+ array= (t_mem*)malloc(sizeof(t_mem)*l);
+ else
+ array= (t_mem*)realloc(array, sizeof(t_mem)*(l+len));
+ for (j= 0; j < l; j++)
+ {
+ array[len]= s[j];
+ len++;
+ }
+ //if (s)
+ //free(s);
+ }
+ else
+ {
+ if (!next_parm->as_data())
+ {
+ if (array)
+ free(array);
+ return(false);
+ }
+ if (!array)
+ array= (t_mem*)malloc(sizeof(t_mem));
+ else
+ array= (t_mem*)realloc(array, sizeof(t_mem)*(1+len));
+ array[len]= next_parm->value.data;
+ len++;
+ }
+ }
+ *iparm= i;
+ parm->value.data_list.array= array;
+ parm->value.data_list.len= len;
+ return(true);
+}
+
+bool
+cl_cmdline::restart_at_rest(void)
+{
+ char *newcmd;
+ if ((rest == NULL) ||
+ (*rest == 0))
+ {
+ return false;
+ }
+ newcmd= strdup(rest);
+ if (cmd)
+ free(cmd);
+ cmd= newcmd;
+ return true;
+}
+
+
+/*
+ * Command
+ *____________________________________________________________________________
+ */
+
+cl_cmd::cl_cmd(enum cmd_operate_on op_on,
+ const char *aname,
+ int can_rep):
+ cl_base()
+{
+ operate_on= op_on;
+ names= new cl_strings(1, 1, "names of a command");
+ names->add(aname?strdup(aname):strdup("unknown"));
+ can_repeat= can_rep;
+ usage_help= 0;
+ short_help= 0;//short_hlp;//?strdup(short_hlp):NULL;
+ long_help= 0;//long_hlp;//?strdup(long_hlp):NULL;
+}
+
+/*cl_cmd::cl_cmd(class cl_sim *asim):
+ cl_base()
+{
+ sim= asim;
+ name= short_help= long_help= 0;
+ can_repeat= 0;
+}*/
+
+void
+cl_cmd::set_help(const char *usage_hlp, const char *short_hlp, const char *long_hlp)
+{
+ usage_help= usage_hlp;
+ short_help= short_hlp;
+ long_help= long_hlp;
+}
+
+cl_cmd::~cl_cmd(void)
+{
+ delete names;
+ //if (short_help) free((void*)short_help);
+ //if (long_help) free((void*)long_help);
+}
+
+void
+cl_cmd::add_name(const char *nam)
+{
+ if (nam)
+ names->add(strdup(nam));
+}
+
+int
+cl_cmd::name_match(const char *aname, int strict)
+{
+ int i;
+
+ if (names->count == 0 &&
+ !aname)
+ return(1);
+ if (!aname)
+ return(0);
+ if (strict)
+ {
+ for (i= 0; i < names->count; i++)
+ {
+ char *n= (char*)(names->at(i));
+ if (strcmp(aname, n) == 0)
+ return(1);
+ }
+ }
+ else
+ {
+ for (i= 0; i < names->count; i++)
+ {
+ char *n= (char*)(names->at(i));
+ if (strstr(n, aname) == n)
+ return(1);
+ }
+ }
+ return(0);
+}
+
+int
+cl_cmd::name_match(class cl_cmdline *cmdline, int strict)
+{
+ return(name_match(cmdline->get_name(), strict));
+}
+
+int
+cl_cmd::syntax_ok(class cl_cmdline *cmdline)
+{
+ return(1);
+}
+
+int
+cl_cmd::work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ if (!syntax_ok(cmdline))
+ return(0);
+ class cl_sim *sim= app->get_sim();
+ class cl_uc *uc= 0;
+ if (sim)
+ uc= sim->uc;
+ switch (operate_on)
+ {
+ case operate_on_app:
+ if (!app)
+ {
+ con->dd_printf("There is no application to work on!\n");
+ return(false);
+ }
+ return(do_work(app, cmdline, con));
+ case operate_on_sim:
+ if (!sim)
+ {
+ con->dd_printf("There is no simulator to work on!\n");
+ return(false);
+ }
+ return(do_work(sim, cmdline, con));
+ case operate_on_uc:
+ if (!sim)
+ {
+ con->dd_printf("There is no microcontroller to work on!\n");
+ return(false);
+ }
+ return(do_work(uc, cmdline, con));
+ default:
+ return(do_work(cmdline, con));
+ }
+}
+
+int
+cl_cmd::do_work(class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ con->dd_printf("Command \"%s\" does nothing.\n",
+ (char*)(names->at(0)));
+ return(0);
+}
+
+int
+cl_cmd::do_work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ con->dd_printf("Command \"%s\" does nothing on application.\n",
+ (char*)(names->at(0)));
+ return(0);
+}
+
+int
+cl_cmd::do_work(class cl_sim *sim,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ con->dd_printf("Command \"%s\" does nothing on simulator.\n",
+ (char*)(names->at(0)));
+ return(0);
+}
+
+int
+cl_cmd::do_work(class cl_uc *uc,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ con->dd_printf("Command \"%s\" does nothing on microcontroller.\n",
+ (char*)(names->at(0)));
+ return(0);
+}
+
+void
+cl_cmd::print_short(class cl_console_base *con)
+{
+ int l= usage_help.len();
+
+ if (!con)
+ return;
+
+ if (usage_help.nempty())
+ con->dd_printf("%s", (char*)usage_help);
+ if (l > 19)
+ {
+ con->dd_printf("\n");
+ l=0;
+ }
+ while (l < 20)
+ {
+ con->dd_printf(" ");
+ l++;
+ }
+ if (short_help.nempty())
+ {
+ con->dd_printf("%s", (char*)short_help);
+ }
+ else
+ con->dd_printf("%s", (char*)(names->at(0)));
+ con->dd_printf("\n");
+}
+
+void
+cl_cmd::syntax_error(class cl_console_base *con)
+{
+ if (con)
+ {
+ if (short_help.nempty())
+ print_short(con);
+ else
+ con->dd_printf("Error: wrong syntax\n");
+ }
+}
+
+/*
+ * Set of commands
+ *____________________________________________________________________________
+ */
+
+cl_cmdset::cl_cmdset(void):
+ cl_list(5, 5, "cmdset")
+{
+ //sim= 0;
+ //last_command= 0;
+}
+
+/*cl_cmdset::cl_cmdset(class cl_sim *asim):
+ cl_list(5, 5)
+{
+ sim= asim;
+ last_command= 0;
+}*/
+
+class cl_cmd *
+cl_cmdset::get_cmd(class cl_cmdline *cmdline, bool accept_last)
+{
+ int i;
+
+ // exact match
+ for (i= 0; i < count; i++)
+ {
+ class cl_cmd *c= (class cl_cmd *)at(i);
+ if (c->name_match(cmdline, 1))
+ return(c);
+ }
+ // not exact match
+ class cl_cmd *c_matched= 0;
+ for (i= 0; i < count; i++)
+ {
+ class cl_cmd *c= (class cl_cmd *)at(i);
+ if (c->name_match(cmdline, 0))
+ {
+ if (!c_matched)
+ c_matched= c;
+ else
+ return(0);
+ }
+ }
+ return(c_matched);
+ //return(0);
+}
+
+class cl_cmd *
+cl_cmdset::get_cmd(const char *cmd_name)
+{
+ int i;
+
+ for (i= 0; i < count; i++)
+ {
+ class cl_cmd *c= (class cl_cmd *)at(i);
+ if (c->name_match(cmd_name, 1))
+ return(c);
+ }
+ return(0);
+}
+
+void
+cl_cmdset::del(char *nam)
+{
+ int i;
+
+ if (!nam)
+ return;
+ for (i= 0; i < count; i++)
+ {
+ class cl_cmd *cmd= (class cl_cmd *)(at(i));
+ if (cmd->name_match(nam, 1))
+ free_at(i);
+ }
+}
+
+void
+cl_cmdset::replace(char *nam, class cl_cmd *cmd)
+{
+ int i;
+
+ if (!nam)
+ return;
+ for (i= 0; i < count; i++)
+ {
+ class cl_cmd *c= (class cl_cmd *)(at(i));
+ if (c->name_match(nam, 1))
+ {
+ delete c;
+ put_at(i, cmd);
+ }
+ }
+}
+
+
+/*
+ * Composed command: subset of commands
+ *____________________________________________________________________________
+ */
+
+cl_super_cmd::cl_super_cmd(const char *aname,
+ int can_rep,
+ class cl_cmdset *acommands):
+ cl_cmd(operate_on_none, aname, can_rep)
+{
+ commands= acommands;
+}
+
+cl_super_cmd::~cl_super_cmd(void)
+{
+ if (commands)
+ delete commands;
+}
+
+int
+cl_super_cmd::work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con)
+{
+ class cl_cmd *cmd= 0;
+
+ if (!commands)
+ return(0);
+
+ if (!cmdline->shift())
+ {
+ if ((cmd= commands->get_cmd("_no_parameters_")) != 0)
+ return(cmd->work(app, cmdline, con));
+ int i;
+ con->dd_printf("\"%s\" must be followed by the name of a subcommand\n"
+ "List of subcommands:\n", (char*)(names->at(0)));
+ for (i= 0; i < commands->count; i++)
+ {
+ cmd= (class cl_cmd *)(commands->at(i));
+ //con->dd_printf("%s\n", (char*)cmd->short_help);
+ cmd->print_short(con);
+ }
+ return(0);
+ }
+ if ((cmd= commands->get_cmd(cmdline, con->is_interactive())) == NULL)
+ {
+ con->dd_printf("Undefined subcommand: \"%s\". Try \"help %s\".\n",
+ cmdline->get_name(), (char*)(names->at(0)));
+ return(0);
+ }
+ return(cmd->work(app, cmdline, con));
+}
+
+
+/* End of cmd.src/command.cc */
diff --git a/sim/ucsim/cmd.src/command.o b/sim/ucsim/cmd.src/command.o
new file mode 100644
index 0000000..a4a9ed5
--- /dev/null
+++ b/sim/ucsim/cmd.src/command.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/commandcl.h b/sim/ucsim/cmd.src/commandcl.h
new file mode 100644
index 0000000..c7cd599
--- /dev/null
+++ b/sim/ucsim/cmd.src/commandcl.h
@@ -0,0 +1,276 @@
+/*
+ * Simulator of microcontrollers (cmd.src/commandcl.h)
+ *
+ * Copyright (C) 2002,02 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_COMMAND_HEADER
+#define CMD_COMMAND_HEADER
+
+#include "ddconfig.h"
+
+// prj
+#include "pobjcl.h"
+
+// local, cmd
+#include "newcmdcl.h"
+
+
+enum cmd_operate_on {
+ operate_on_none,
+ operate_on_app,
+ operate_on_sim,
+ operate_on_uc
+};
+
+
+/*
+ * Command line with parameters
+ */
+
+class cl_cmdline: public cl_base
+{
+public:
+ class cl_app *app;
+ char *cmd;
+ char *rest;
+ //char *name;
+ class cl_list *params;
+ class cl_ustrings *tokens;
+ const char *matched_syntax;
+ class cl_console_base *con;
+
+public:
+ cl_cmdline(class cl_app *the_app, char *acmd, class cl_console_base *acon);
+ virtual ~cl_cmdline(void);
+ virtual int init(void);
+
+private:
+ virtual void split_out_string(char **_start, char **_end);
+ virtual void split_out_output_redirection(char **_start, char **_end);
+ virtual void split_out_bit(char *dot, char *param_str);
+ virtual void split_out_array(char *dot, char *param_str);
+public:
+ virtual int split(void);
+ virtual int shift(void);
+ virtual int repeat(void);
+ virtual class cl_cmd_arg *param(int num);
+ virtual void insert_param(int pos, class cl_cmd_arg *param);
+ virtual bool syntax_match(class cl_uc *uc, const char *syntax);
+ virtual bool set_data_list(class cl_cmd_arg *parm, int *iparm);
+ virtual int nuof_params(void) { return(params->get_count()); }
+ virtual bool restart_at_rest(void);
+private:
+ char *skip_delims(char *start);
+};
+
+
+/*
+ * Command and container
+ */
+
+class cl_cmdset;
+
+// simple command
+class cl_cmd: public cl_base
+{
+public:
+ enum cmd_operate_on operate_on;
+ class cl_strings *names;
+ int can_repeat;
+ chars usage_help;
+ chars short_help;
+ chars long_help;
+
+public:
+ cl_cmd(enum cmd_operate_on opon,
+ const char *aname,
+ int can_rep);
+ virtual ~cl_cmd(void);
+
+ virtual int init(void) { set_help(); return 0; }
+ virtual void set_help(void) {}
+ virtual void set_help(const char *usage_hlp, const char *short_hlp, const char *long_hlp);
+ virtual class cl_cmdset *get_subcommands(void) { return(0); }
+ virtual void add_name(const char *nam);
+ virtual int name_match(const char *aname, int strict);
+ virtual int name_match(class cl_cmdline *cmdline, int strict);
+ virtual int syntax_ok(class cl_cmdline *cmdline);
+ virtual int work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual int do_work(class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual int do_work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual int do_work(class cl_sim *sim,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual int do_work(class cl_uc *uc,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+ virtual void print_short(class cl_console_base *con);
+ virtual void syntax_error(class cl_console_base *con);
+};
+
+#define COMMAND_HEAD(CLASS_NAME) \
+class CLASS_NAME : public cl_cmd\
+{
+#define COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
+class CLASS_NAME : public ANCESTOR \
+{
+
+#define COMMAND_METHODS(CLASS_NAME) \
+public:\
+ CLASS_NAME (const char *aname,\
+ int can_rep):\
+ cl_cmd(operate_on_none, aname, can_rep) {} \
+ virtual int do_work(class cl_cmdline *cmdline, class cl_console_base *con);\
+ virtual void set_help(void);
+
+#define COMMAND_METHODS_ON(ON,CLASS_NAME) \
+public:\
+ CLASS_NAME (const char *aname,\
+ int can_rep):\
+ cl_cmd(operate_on_ ## ON, aname, can_rep) {} \
+ virtual int do_work(class cl_ ## ON * ON ,\
+ class cl_cmdline *cmdline, class cl_console_base *con);\
+ virtual void set_help(void);
+
+#define COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR) \
+public:\
+ CLASS_NAME (const char *aname, int can_rep):\
+ ANCESTOR (aname, can_rep) {} \
+ virtual int do_work(class cl_cmdline *cmdline, class cl_console_base *con);\
+ virtual void set_help(void);
+
+#define COMMAND_METHODS_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR) \
+public:\
+ CLASS_NAME (const char *aname, int can_rep):\
+ ANCESTOR (aname, can_rep) {} \
+ virtual int do_work(class cl_ ## ON * ON ,\
+ class cl_cmdline *cmdline, class cl_console_base *con);\
+ virtual void set_help(void); \
+
+
+#define COMMAND_TAIL }
+
+#define COMMAND(CLASS_NAME) \
+COMMAND_HEAD(CLASS_NAME) \
+COMMAND_METHODS(CLASS_NAME) \
+COMMAND_TAIL
+
+#define COMMAND_ON(ON,CLASS_NAME) \
+COMMAND_HEAD(CLASS_NAME) \
+COMMAND_METHODS_ON(ON,CLASS_NAME) \
+COMMAND_TAIL
+
+#define COMMAND_DATA(CLASS_NAME,DATA) \
+COMMAND_HEAD(CLASS_NAME) \
+public: DATA ; \
+COMMAND_METHODS(CLASS_NAME)\
+COMMAND_TAIL
+
+#define COMMAND_DATA_ON(ON,CLASS_NAME,DATA) \
+COMMAND_HEAD(CLASS_NAME) \
+public: DATA ; \
+COMMAND_METHODS_ON(ON,CLASS_NAME)\
+COMMAND_TAIL
+
+#define COMMAND_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR) \
+COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
+COMMAND_METHODS_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR) \
+COMMAND_TAIL
+
+#define COMMAND_DATA_ANCESTOR(CLASS_NAME,ANCESTOR,DATA) \
+COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
+public: DATA ; \
+COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR)\
+COMMAND_TAIL
+
+#define COMMAND_DATA_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR,DATA) \
+COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
+public: DATA ; \
+COMMAND_METHODS_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR)\
+COMMAND_TAIL
+
+#define COMMAND_DO_WORK(CLASS_NAME) \
+int \
+CLASS_NAME::do_work(class cl_cmdline *cmdline, class cl_console_base *con)
+#define COMMAND_DO_WORK_APP(CLASS_NAME) \
+int \
+CLASS_NAME::do_work(class cl_app *app,\
+ class cl_cmdline *cmdline, class cl_console_base *con)
+#define COMMAND_DO_WORK_SIM(CLASS_NAME) \
+int \
+CLASS_NAME::do_work(class cl_sim *sim,\
+ class cl_cmdline *cmdline, class cl_console_base *con)
+#define COMMAND_DO_WORK_UC(CLASS_NAME) \
+int \
+CLASS_NAME::do_work(class cl_uc *uc,\
+ class cl_cmdline *cmdline, class cl_console_base *con)
+
+#define CMDHELP(CLASS_NAME,USAGE_HLP,SHORT_HLP,LONG_HLP) \
+ void \
+ CLASS_NAME::set_help(void) \
+ { \
+ usage_help=(char*)USAGE_HLP; \
+ short_help=(char*)SHORT_HLP; \
+ long_help=(char*)LONG_HLP; \
+ }
+
+// Command set is list of cl_cmd objects
+class cl_cmdset: public cl_list
+{
+public:
+ //class cl_sim *sim;
+ //class cl_cmd *last_command;
+
+public:
+ cl_cmdset(void);
+ //cl_cmdset(class cl_sim *asim);
+
+ virtual class cl_cmd *get_cmd(class cl_cmdline *cmdline, bool accept_last);
+ virtual class cl_cmd *get_cmd(const char *cmd_name);
+ virtual void del(char *nam);
+ virtual void replace(char *nam, class cl_cmd *cmd);
+};
+
+// subset of commands
+class cl_super_cmd: public cl_cmd
+{
+public:
+ class cl_cmdset *commands;
+
+public:
+ cl_super_cmd(const char *aname,
+ int can_rep,
+ class cl_cmdset *acommands);
+ virtual ~cl_super_cmd(void);
+
+ virtual class cl_cmdset *get_subcommands(void) { return(commands); }
+ virtual int work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console_base *con);
+};
+
+
+#endif
+
+/* End of cmd.src/commandcl.h */
diff --git a/sim/ucsim/cmd.src/conf.mk b/sim/ucsim/cmd.src/conf.mk
new file mode 100644
index 0000000..446ddee
--- /dev/null
+++ b/sim/ucsim/cmd.src/conf.mk
@@ -0,0 +1,12 @@
+#
+# ucsim cmd.src/conf.mk
+#
+# Makefile targets to remake configuration
+#
+
+freshconf: Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_srcdir)/configure.ac
+ cd $(top_builddir) && $(SHELL) ./config.status
+
+# End of cmd.src/conf.mk
diff --git a/sim/ucsim/cmd.src/newcmd.cc b/sim/ucsim/cmd.src/newcmd.cc
new file mode 100644
index 0000000..ecc3c75
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmd.cc
@@ -0,0 +1,935 @@
+/*
+ * Simulator of microcontrollers (cmd.src/newcmd.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ * Copyright (C) 2006, Borut Razem - borut.razem@siol.net
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY RANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "i_string.h"
+
+//#include "cmdlexcl.h"
+
+// prj
+#include "globals.h"
+#include "utils.h"
+#include "fiocl.h"
+
+// sim
+#include "simcl.h"
+#include "argcl.h"
+#include "appcl.h"
+
+// local
+#include "newcmdcl.h"
+#include "cmdutil.h"
+
+
+/*
+ * Options of console
+ */
+
+cl_prompt_option::cl_prompt_option(class cl_console_base *console):
+ cl_optref(console)
+{
+ con= console;
+}
+
+int
+cl_prompt_option::init(void)
+{
+ char *help;
+ help= format_string("Prompt string of console%d", con->get_id());
+ create(con, string_opt, "prompt", help);
+ free(help);
+ default_option("prompt");
+ return(0);
+}
+
+void
+cl_prompt_option::option_changed(void)
+{
+ if (!con)
+ return;
+ char *s;
+ option->get_value(&s);
+ con->set_prompt(s);
+}
+
+
+cl_debug_option::cl_debug_option(class cl_console_base *console):
+ cl_prompt_option(console)
+{}
+
+int
+cl_debug_option::init(void)
+{
+ char *help;
+ help= format_string("Debug messages to console%d", con->get_id());
+ create(con, bool_opt, "debug", help);
+ free(help);
+ default_option("debug");
+ return(0);
+}
+
+void
+cl_debug_option::option_changed(void)
+{
+ if (!con)
+ return;
+ bool b;
+ option->get_value(&b);
+ con->set_flag(CONS_DEBUG, b);
+}
+
+
+/*
+ * Command console
+ *____________________________________________________________________________
+ */
+
+cl_console_base::cl_console_base(void):
+ cl_base()
+{
+ app= 0;
+ flags= 0;
+ prompt= 0;
+ nl= 0;
+ lbuf= 0;
+ prompt_option= 0;
+ null_prompt_option= 0;
+ debug_option= 0;
+}
+
+cl_console_base::~cl_console_base(void)
+{
+ if (prompt_option)
+ delete prompt_option;
+ if (null_prompt_option)
+ delete null_prompt_option;
+ if (debug_option)
+ delete debug_option;
+}
+
+int
+cl_console_base::init(void)
+{
+ cl_base::init();
+ prompt_option= new cl_prompt_option(this);
+ prompt_option->init();
+ null_prompt_option= new cl_optref(this);
+ null_prompt_option->init();
+ null_prompt_option->use("null_prompt");
+ debug_option= new cl_debug_option(this);
+ debug_option->init();
+ welcome();
+ print_prompt();
+ if (get_fin() != NULL)
+ get_fin()->set_echo_color(get_color_ansiseq("command"));
+ last_command= 0;
+ //last_cmdline= 0;
+ last_cmd= chars("");
+ prev_quit= -1;
+ return(0);
+}
+
+void
+cl_console_base::set_startup(chars the)
+{
+ startup_command= the;
+}
+
+void
+cl_console_base::welcome(void)
+{
+ if (!(flags & CONS_NOWELCOME))
+ {
+ dd_printf("uCsim %s, Copyright (C) 1997 Daniel Drotos.\n"
+ "uCsim comes with ABSOLUTELY NO WARRANTY; for details type "
+ "`show w'.\n"
+ "This is free software, and you are welcome to redistribute it\n"
+ "under certain conditions; type `show c' for details.\n",
+ VERSIONSTR);
+ }
+}
+
+void
+cl_console_base::print_prompt(void)
+{
+ if (flags & (CONS_FROZEN | CONS_INACTIVE))
+ return;
+
+ if (!(flags & CONS_INTERACTIVE))
+ return;
+
+ if (null_prompt_option->get_value(bool(0)))
+ {
+ class cl_f *fo= get_fout(), *fi= get_fin();
+ char c= 0;
+ if (fi &&
+ fi->eof() &&
+ (fi->id() == fo->id()))
+ return;
+ fo->write(&c, 1);
+ }
+ else
+ {
+ dd_cprintf("prompt_console", "%d", id);
+ dd_cprintf("prompt", "%s", (prompt && prompt[0]) ? prompt : "> ");
+ }
+}
+
+int
+cl_console_base::dd_printf(const char *format, ...)
+{
+ va_list ap;
+ int ret= 0;
+
+ va_start(ap, format);
+ ret= cmd_do_print(format, ap);
+ va_end(ap);
+
+ return(ret);
+}
+
+int
+cl_console_base::dd_cprintf(const char *color_name, const char *format, ...)
+{
+ va_list ap;
+ int ret= 0;
+ bool bw= false;
+ char *cc;
+ chars cce;
+ class cl_f *fo= get_fout();
+ class cl_option *o= application->options->get_option("black_and_white");
+
+ if (o) o->get_value(&bw);
+ if (!fo ||
+ (fo &&
+ !fo->tty)
+ )
+ bw= true;
+
+ o= application->options->get_option((char*)chars("", "color_%s", color_name));
+ cc= NULL;
+ if (o) o->get_value(&cc);
+ cce= colopt2ansiseq(cc);
+ if (!bw) dd_printf("\033[0m%s", (char*)cce);
+
+ va_start(ap, format);
+ ret= cmd_do_print(format, ap);
+ va_end(ap);
+
+ if (!bw) dd_printf("\033[0m");
+
+ return(ret);
+}
+
+chars
+cl_console_base::get_color_ansiseq(const char *color_name, bool add_reset)
+{
+ bool bw= false;
+ char *cc;
+ chars cce= "";
+ class cl_f *fo= get_fout();
+ class cl_option *o= application->options->get_option("black_and_white");
+ if (o) o->get_value(&cc);
+
+ if (!fo ||
+ (fo &&
+ !fo->tty) ||
+ bw
+ )
+ return cce;
+
+ o= application->options->get_option((char*)chars("", "color_%s", color_name));
+ cc= NULL;
+ if (o) o->get_value(&cc);
+ if (add_reset)
+ cce.append("\033[0m");
+ cce.append(colopt2ansiseq(cc));
+
+ return cce;
+}
+
+
+void
+cl_console_base::dd_color(const char *color_name)
+{
+ dd_printf("%s", (char*)(get_color_ansiseq(color_name, true)));
+}
+
+int
+cl_console_base::debug(const char *format, ...)
+{
+ if ((flags & CONS_DEBUG) == 0)
+ return(0);
+
+ va_list ap;
+ int ret= 0;
+
+ va_start(ap, format);
+ ret= cmd_do_cprint("debug", format, ap);
+ va_end(ap);
+
+ return(ret);
+}
+
+/*
+ * Printing out an integer in binary format
+ */
+
+void
+cl_console_base::print_bin(long data, int bits)
+{
+ long mask= 1;
+
+ mask= mask << ((bits >= 1)?(bits-1):0);
+ while (bits--)
+ {
+ dd_printf("%c", (data&mask)?'1':'0');
+ mask>>= 1;
+ }
+}
+
+void
+cl_console_base::print_char_octal(char c)
+{
+ if (strchr("\a\b\f\n\r\t\v\"", c))
+ switch (c)
+ {
+ case '\a': dd_printf("\a"); break;
+ case '\b': dd_printf("\b"); break;
+ case '\f': dd_printf("\f"); break;
+ case '\n': dd_printf("\n"); break;
+ case '\r': dd_printf("\r"); break;
+ case '\t': dd_printf("\t"); break;
+ case '\v': dd_printf("\v"); break;
+ case '\"': dd_printf("\""); break;
+ }
+ else if (isprint(c))
+ dd_printf("%c", c);
+ else
+ dd_printf("\\%03hho", c);
+}
+
+int
+cl_console_base::cmd_do_print(const char *format, va_list ap)
+{
+ int ret;
+ class cl_f *fo= get_fout(), *fi= get_fin();
+
+ if (fo)
+ {
+ if (fi &&
+ fi->eof() &&
+ (fi->id() == fo->id()))
+ {
+ return 0;
+ }
+ ret= fo->vprintf((char*)format, ap);
+ //fo->flush();
+ return ret;
+ }
+ else
+ return 0;
+}
+
+int
+cl_console_base::cmd_do_cprint(const char *color_name, const char *format, va_list ap)
+{
+ int ret;
+ class cl_f *fo= get_fout(), *fi= get_fin();
+ bool bw= false;
+ char *cc;
+ chars cce;
+ class cl_option *o= application->options->get_option("black_and_white");
+
+ if (o) o->get_value(&bw);
+ if (!fo ||
+ (fo &&
+ !fo->tty)
+ )
+ bw= true;
+
+ o= application->options->get_option((char*)chars("", "color_%s", color_name));
+ cc= NULL;
+ if (o) o->get_value(&cc);
+ cce= colopt2ansiseq(cc);
+
+ if (fo)
+ {
+ if (fi &&
+ fi->eof() &&
+ (fi->id() == fo->id()))
+ {
+ return 0;
+ }
+ if (!bw) fo->prntf("\033[0m%s", (char*)cce);
+ ret= fo->vprintf((char*)format, ap);
+ if (!bw) fo->prntf("\033[0m");
+ //fo->flush();
+ return ret;
+ }
+ else
+ return 0;
+}
+
+int
+cl_console_base::write(char *buf, int count)
+{
+ int ret;
+ class cl_f *fo= get_fout(), *fi= get_fin();
+
+ if (fo)
+ {
+ if (fi &&
+ fi->eof() &&
+ (fi->id() == fo->id()))
+ {
+ //deb("do not attempt to write on console, where input is at file_end\n");
+ return 0;
+ }
+ ret= fo->write(buf, count);
+ //fo->flush();
+ return ret;
+ }
+ else
+ return 0;
+}
+
+void
+cl_console_base::tu_cls(void)
+{
+ dd_printf("\033[2J");
+}
+
+void
+cl_console_base::tu_cll(void)
+{
+ dd_printf("\033[K");
+}
+
+void
+cl_console_base::tu_clc(void)
+{
+ tu_save();
+ dd_printf(" ");
+ tu_restore();
+}
+
+void
+cl_console_base::tu_go(int x1, int y1)
+{
+ dd_printf("\033[%d;%dH", y1, x1);
+}
+
+void
+cl_console_base::tu_save(void)
+{
+ dd_printf("\033[s");
+}
+
+void
+cl_console_base::tu_restore(void)
+{
+ dd_printf("\033[u");
+}
+
+void
+cl_console_base::tu_hide(void)
+{
+ dd_printf("\033[?25l");
+}
+
+void
+cl_console_base::tu_show(void)
+{
+ dd_printf("\033[?25h");
+}
+
+void
+cl_console_base::tu_color(int bg, int fg)
+{
+ if (bg >= 0)
+ dd_printf("\033[%dm", (tu_bg_color= bg)+40);
+ if (fg >= 0)
+ dd_printf("\033[%dm", (tu_fg_color= fg)+30);
+}
+
+void
+cl_console_base::tu_mouse_on(void)
+{
+ // enable mouse click reports of terminal
+ dd_printf("\033[1;2'z"); // enable locator reporting, as character cells
+ dd_printf("\033[?9h"); // send mouse X,Y on btn press (X10 mode)
+}
+
+void
+cl_console_base::tu_mouse_off(void)
+{
+ dd_printf("\033[?9l"); // do not send mouse X,Y on btn press
+ dd_printf("\033[0;0'z"); // disable locator reporting
+}
+
+void
+cl_console_base::tu_reset(void)
+{
+ tu_mouse_off();
+ //dd_printf("\033c"); // terminal reset
+ dd_printf("\033[!p"); // soft terminal reset
+}
+
+/*void
+cl_console_base::flush(void)
+{
+ class cl_f *fo= get_fout();
+ if (fo)
+ fo->flush();
+ }*/
+
+bool
+cl_console_base::interpret(char *cmd)
+{
+ dd_printf("Unknown command\n");
+ return(0);
+}
+
+void
+cl_console_base::set_id(int new_id)
+{
+ //char *s;
+ id= new_id;
+ if (!have_real_name())
+ set_name(/*s= format_string*/chars("", "console%d", id));
+ //free(s);
+}
+
+void
+cl_console_base::set_prompt(char *p)
+{
+ if (prompt)
+ free(prompt);
+ if (p && *p)
+ prompt= strdup(p);
+ else
+ prompt= 0;
+}
+
+bool
+cl_console_base::input_active(void) const
+{
+ if ((
+ (flags & CONS_FROZEN) == 0 ||
+ (flags & CONS_INTERACTIVE) != 0
+ )
+ &&
+ (flags & CONS_INACTIVE) == 0
+ )
+ {
+ return true;
+ }
+ else
+ return false;
+}
+
+int
+cl_console_base::proc_input(class cl_cmdset *cmdset)
+{
+ int retval= 0, i, do_print_prompt= 1;
+
+ un_redirect();
+ char *cmdstr;
+ i= read_line();
+ if (i < 0)
+ {
+ return 1;
+ }
+ if (i == 0)
+ return 0;
+ cmdstr= lbuf;
+ if (cmdstr==NULL)
+ cmdstr= (char*)"";
+ if (is_frozen())
+ {
+ application->get_sim()->stop(resUSER);
+ set_flag(CONS_FROZEN, false);
+ retval = 0;
+ do_print_prompt= 0;
+ }
+ else
+ {
+ if (cmdstr && *cmdstr == '\004')
+ retval = 1;
+ else
+ {
+ class cl_cmdline *cmdline= 0;
+ class cl_cmd *cm = 0;
+ if (get_flag(CONS_ECHO))
+ dd_printf("%s\n", cmdstr);
+ do
+ {
+ cmdline= new cl_cmdline(app, cmdstr, this);
+ cmdline->init();
+ if (cmdline->repeat() &&
+ is_interactive() &&
+ last_command)
+ {
+ cm= last_command;
+ }
+ else
+ {
+ cm= cmdset->get_cmd(cmdline, is_interactive());
+ last_command = 0;
+ }
+ if (cm)
+ {
+ dd_color("answer");
+ retval= cm->work(app, cmdline, this);
+ if (cm->can_repeat)
+ {
+ last_command = cm;
+ last_cmd= cmdline->cmd;
+ }
+ }
+ else if (cmdline->get_name() != 0)
+ {
+ char *e= cmdline->cmd;
+ if (strlen(e) > 0)
+ {
+ long l= application->eval(e);
+ dd_cprintf("result", "%ld\n", l);
+ }
+ }
+ if (get_fin() != NULL)
+ get_fin()->set_echo_color(get_color_ansiseq("command"));
+ lbuf= cmdline->rest;
+ cmdstr= lbuf;
+ delete cmdline;
+ }
+ while (!lbuf.empty());
+ }
+ }
+ if (!is_frozen())
+ un_redirect();
+ if (!retval &&
+ //cmdstr &&
+ do_print_prompt &&
+ !get_flag(CONS_REDIRECTED))
+ {
+ print_prompt();
+ }
+ lbuf= 0;
+ return(retval);
+}
+
+int
+cl_console_base::set_flag(int flag, bool value)
+{
+ if (value)
+ flags|= flag;
+ else
+ flags&= ~flag;
+ return flags;
+}
+
+void
+cl_console_base::set_interactive(bool new_value)
+{
+ set_flag(CONS_INTERACTIVE, new_value);
+}
+
+bool
+cl_console_base::get_flag(int flag)
+{
+ return flags & flag;
+}
+
+bool
+cl_console_base::set_cooked(bool new_val)
+{
+ return false;
+}
+
+
+/*
+ * Command interpreter
+ *____________________________________________________________________________
+ */
+
+cl_commander_base::cl_commander_base(class cl_app *the_app, class cl_cmdset *acmdset):
+ cl_base()
+{
+ app= the_app;
+ cons= new cl_list(1, 1, "consoles");
+ actual_console= frozen_console= config_console= 0;
+ cmdset= acmdset;
+}
+
+cl_commander_base::~cl_commander_base(void)
+{
+ cons->free_all();
+ delete cons;
+ delete cmdset;
+}
+
+void
+cl_commander_base::add_console(class cl_console_base *console)
+{
+ if (!console)
+ return;
+ int i=cons->add(console);
+ console->set_id(i);
+ console->init();
+ update_active();
+}
+
+void
+cl_commander_base::del_console(class cl_console_base *console)
+{
+ cons->disconn(console);
+ update_active();
+ delete console;
+}
+
+void
+cl_commander_base::activate_console(class cl_console_base *console)
+{
+ console->set_flag(CONS_INACTIVE, false);
+ console->print_prompt();
+ update_active();
+}
+
+void
+cl_commander_base::deactivate_console(class cl_console_base *console)
+{
+ console->set_flag(CONS_INACTIVE, true);
+ update_active();
+}
+
+int
+cl_commander_base::consoles_prevent_quit(void)
+{
+ int i, r= 0;
+
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console_base *c= (class cl_console_base*)(cons->at(i));
+ bool p= c->prevent_quit();
+ if (p)
+ r++;
+ }
+ return r;
+}
+
+
+/*
+ * Printing to all consoles
+ */
+
+int
+cl_commander_base::all_printf(const char *format, ...)
+{
+ va_list ap;
+ int i, ret= 0;
+
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console_base *c= (class cl_console_base*)(cons->at(i));
+
+ va_start(ap, format);
+ ret= c->cmd_do_print(format, ap);
+ va_end(ap);
+ }
+ return(ret);
+}
+
+
+/*
+ * Printing to actual_console
+ */
+
+int
+cl_commander_base::dd_printf(const char *format, va_list ap)
+{
+ int ret= 0;
+ class cl_console_base *con;
+
+ if (actual_console)
+ {
+ con= actual_console;
+ }
+ else if (frozen_console)
+ {
+ con= frozen_console;
+ }
+ else
+ {
+ con= 0;
+ }
+ if (con)
+ {
+ ret= con->cmd_do_print(format, ap);
+ }
+ return(ret);
+}
+
+int
+cl_commander_base::dd_cprintf(const char *color_name, const char *format, va_list ap)
+{
+ int ret= 0;
+ class cl_console_base *con;
+
+ if (actual_console)
+ {
+ con= actual_console;
+ }
+ else if (frozen_console)
+ {
+ con= frozen_console;
+ }
+ else
+ {
+ con= 0;
+ }
+ if (con)
+ {
+ ret= con->cmd_do_cprint(color_name, format, ap);
+ }
+ return(ret);
+}
+
+int
+cl_commander_base::dd_printf(const char *format, ...)
+{
+ va_list ap;
+ int ret= 0;
+
+ va_start(ap, format);
+ ret= dd_printf(format, ap);
+ va_end(ap);
+
+ return(ret);
+}
+
+int
+cl_commander_base::dd_cprintf(const char *color_name, const char *format, ...)
+{
+ va_list ap;
+ int ret= 0;
+
+ va_start(ap, format);
+ ret= dd_cprintf(color_name, format, ap);
+ va_end(ap);
+
+ return(ret);
+}
+
+/*
+ * Printing to consoles which have CONS_DEBUG flag set
+ */
+
+int
+cl_commander_base::debug(const char *format, ...)
+{
+ va_list ap;
+ int i, ret= 0;
+
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console_base *c= (class cl_console_base*)(cons->at(i));
+ if (c->get_flag(CONS_DEBUG))
+ {
+ va_start(ap, format);
+ ret= c->cmd_do_cprint("debug", format, ap);
+ va_end(ap);
+ }
+ }
+ return(ret);
+}
+
+int
+cl_commander_base::debug(const char *format, va_list ap)
+{
+ int i, ret= 0;
+
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console_base *c= (class cl_console_base*)(cons->at(i));
+ if (c->get_flag(CONS_DEBUG))
+ {
+ ret= c->cmd_do_cprint("debug", format, ap);
+ }
+ }
+ return(ret);
+}
+
+int
+cl_commander_base::flag_printf(int iflags, const char *format, ...)
+{
+ va_list ap;
+ int i, ret= 0;
+
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console_base *c= (class cl_console_base*)(cons->at(i));
+ if ((c->get_flag(iflags)) == iflags)
+ {
+ va_start(ap, format);
+ ret= c->cmd_do_print(format, ap);
+ va_end(ap);
+ }
+ }
+ return(ret);
+}
+
+int
+cl_commander_base::input_avail_on_frozen(void)
+{
+ if (!frozen_console || frozen_console->is_tty())
+ return(0);
+ return(frozen_console->input_avail());
+}
+
+class cl_console_base *
+cl_commander_base::exec_on(class cl_console_base *cons, char *file_name)
+{
+ if (!cons || !file_name || !fopen(file_name, "r"))
+ return 0;
+
+ class cl_console_base *subcon = cons->clone_for_exec(file_name);
+ subcon->set_flag(CONS_NOWELCOME, true);
+ subcon->set_flag(CONS_INTERACTIVE, false);
+ add_console(subcon);
+ return subcon;
+}
+
+
+/* End of cmd.src/newcmd.cc */
diff --git a/sim/ucsim/cmd.src/newcmd.o b/sim/ucsim/cmd.src/newcmd.o
new file mode 100644
index 0000000..88256bd
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmd.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/newcmdcl.h b/sim/ucsim/cmd.src/newcmdcl.h
new file mode 100644
index 0000000..b469fe8
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmdcl.h
@@ -0,0 +1,269 @@
+/*
+ * Simulator of microcontrollers (cmd.src/newcmdcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ * Copyright (C) 2006, Borut Razem - borut.razem@siol.net
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_NEWCMDCL_HEADER
+#define CMD_NEWCMDCL_HEADER
+
+
+#include "ddconfig.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
+
+// prj
+#include "pobjcl.h"
+#include "optioncl.h"
+
+// sim.src
+//#include "appcl.h"
+
+// local, cmd
+#include "commandcl.h"
+
+
+// Flags of consoles
+enum con_flags {
+ CONS_NONE = 0,
+ CONS_DEBUG = 0x01, // Print debug messages on this console
+ CONS_FROZEN = 0x02, // Console is frozen (g command issued)
+ CONS_INTERACTIVE = 0x08, // Interactive console
+ CONS_NOWELCOME = 0x10, // Do not print welcome message
+ CONS_INACTIVE = 0x20, // Do not do any action
+ CONS_ECHO = 0x40, // Echo commands
+ CONS_REDIRECTED = 0x80, // Console is actually redirected
+};
+
+#define SY_ADDR 'a'
+#define ADDRESS "a"
+#define SY_NUMBER 'n'
+#define NUMBER "n"
+#define SY_DATA 'd'
+#define DATA "d"
+#define SY_STRING 's'
+#define STRING "s"
+#define SY_MEMORY 'm'
+#define MEMORY "m"
+#define SY_HW 'h'
+#define HW "h"
+#define SY_DATALIST 'D'
+#define DATALIST "D"
+#define SY_BIT 'b'
+#define BIT "b"
+#define SY_CELL 'c'
+#define CELL "c"
+
+
+class cl_prompt_option: public cl_optref
+{
+protected:
+ class cl_console_base *con;
+public:
+ cl_prompt_option(class cl_console_base *console);
+ virtual int init(void);
+ virtual void option_changed(void);
+};
+
+class cl_debug_option: public cl_prompt_option
+{
+public:
+ cl_debug_option(class cl_console_base *console);
+ virtual int init(void);
+ virtual void option_changed(void);
+};
+
+/*
+ * Command console
+ */
+
+class cl_console_base: public cl_base
+{
+ protected:
+ class cl_prompt_option *prompt_option;
+ class cl_optref *null_prompt_option;
+ class cl_debug_option *debug_option;
+ class cl_ustrings *lines_printed;
+ class cl_cmd *last_command;
+ //class cl_cmdline *last_cmdline;
+ chars last_cmd;
+ chars startup_command;
+
+ char nl;
+ chars lbuf;
+
+ int tu_bg_color, tu_fg_color;
+ public:
+ int prev_quit;
+
+ public:
+ cl_console_base(void);
+ virtual ~cl_console_base(void);
+
+ virtual class cl_console_base *clone_for_exec(char *fin) = 0;
+
+ virtual void redirect(char *fname, char *mode) = 0;
+ virtual void un_redirect(void) = 0;
+ virtual bool is_tty(void) const = 0;
+ virtual bool is_eof(void) const = 0;
+ virtual bool input_avail(void) = 0;
+ virtual int read_line(void) = 0;
+ virtual class cl_f *get_fout(void)= 0;
+ virtual class cl_f *get_fin(void)= 0;
+ virtual void drop_files(void)= 0; // do not close, just ignore
+ virtual void close_files(bool close_in, bool close_out)= 0;
+ virtual void replace_files(bool close_old, cl_f *new_in, cl_f *new_out)= 0;
+
+ virtual int init(void);
+ virtual void set_startup(chars the);
+ virtual chars *get_startup() { return &startup_command; }
+ virtual bool has_startup() { return startup_command.nempty(); }
+
+ virtual void welcome(void);
+ virtual int proc_input(class cl_cmdset *cmdset);
+ virtual bool need_check(void) { return false; }
+
+ virtual void print_prompt(void);
+ virtual int dd_printf(const char *format, ...);
+ virtual int dd_cprintf(const char *color_name, const char *format, ...);
+ virtual chars get_color_ansiseq(const char *color_name, bool add_reset= false);
+ virtual void dd_color(const char *color_name);
+ virtual int write(char *buf, int count);
+ virtual int debug(const char *format, ...);
+ virtual void print_bin(long data, int bits);
+ virtual void print_char_octal(char c);
+ virtual int cmd_do_print(const char *format, va_list ap);
+ virtual int cmd_do_cprint(const char *color_name, const char *format, va_list ap);
+ //virtual void flush(void);
+ virtual void tu_cls(void);
+ virtual void tu_clc(void);
+ virtual void tu_cll(void);
+ virtual void tu_go(int x1, int y1);
+ virtual void tu_save(void);
+ virtual void tu_restore(void);
+ virtual void tu_hide(void);
+ virtual void tu_show(void);
+ virtual void tu_color(int bg, int fg);
+ virtual void tu_mouse_on(void);
+ virtual void tu_mouse_off(void);
+ virtual void tu_reset(void);
+
+ virtual bool interpret(char *cmd);
+ virtual int get_id(void) const { return(id); }
+ virtual void set_id(int new_id);
+ virtual void set_prompt(char *p);
+
+ virtual bool input_active(void) const;
+ //virtual bool accept_last(void) { return /*is_tty() ? DD_TRUE : DD_FALSE;*/flags&CONS_INTERACTIVE; }
+ virtual bool prevent_quit(void) { return (prev_quit>=0)?prev_quit:true; }
+
+ private:
+ int flags; // See CONS_XXXX
+ public:
+ virtual int set_flag(int flag, bool value);
+ virtual void set_interactive(bool new_val);
+ virtual bool get_flag(int flag);
+ virtual int get_flags() { return flags; };
+ virtual bool is_interactive() { return get_flag(CONS_INTERACTIVE); }
+ virtual bool is_frozen() { return get_flag(CONS_FROZEN); }
+ virtual bool set_cooked(bool new_val);
+
+ protected:
+ class cl_app *app;
+ char *prompt;
+ int id;
+};
+
+class cl_console_dummy: public cl_console_base
+{
+ public:
+ cl_console_dummy(void): cl_console_base() {}
+
+ virtual class cl_console_base *clone_for_exec(char *fin) { return NULL; }
+
+ virtual void redirect(char *fname, char *mode) {}
+ virtual void un_redirect(void) {}
+ virtual bool is_tty(void) const { return false; }
+ virtual bool is_eof(void) const { return false; }
+ virtual bool input_avail(void) { return false; }
+ virtual int read_line(void) { return 0; }
+ virtual class cl_f *get_fout(void) { return NULL; }
+ virtual class cl_f *get_fin(void) { return NULL; }
+ virtual void drop_files(void) {}
+ virtual void close_files(bool close_in, bool close_out) {}
+ virtual void replace_files(bool close_old, cl_f *new_in, cl_f *new_out) {}
+};
+
+/*
+ * Command interpreter
+ */
+
+class cl_commander_base: public cl_base
+{
+ public:
+ class cl_app *app;
+ class cl_list *cons;
+ class cl_console_base *actual_console, *frozen_console, *config_console;
+ class cl_cmdset *cmdset;
+ protected:
+ class cl_list *active_inputs;
+ class cl_list *check_list;
+
+ public:
+ cl_commander_base(class cl_app *the_app, class cl_cmdset *acmdset);
+ virtual ~cl_commander_base(void);
+
+ virtual void add_console(class cl_console_base *console);
+ virtual void del_console(class cl_console_base *console);
+ virtual void activate_console(class cl_console_base *console);
+ virtual void deactivate_console(class cl_console_base *console);
+ virtual int consoles_prevent_quit(void);
+
+ //void prompt(void);
+ int all_printf(const char *format, ...); // print to all consoles
+ int dd_printf(const char *format, va_list ap); // print to actual_console
+ int dd_cprintf(const char *color_name, const char *format, va_list ap); // print to actual_console
+ int dd_printf(const char *format, ...); // print to actual_console
+ int dd_cprintf(const char *color_name, const char *format, ...); // print to actual_console
+ int debug(const char *format, ...); // print consoles with debug flag set
+ int debug(const char *format, va_list ap); // print consoles with debug flag set
+ int flag_printf(int iflags, const char *format, ...);
+ int input_avail_on_frozen(void);
+ class cl_console_base *exec_on(class cl_console_base *cons, char *file_name);
+
+ virtual int init(void) = 0;
+ virtual void update_active(void) = 0;
+ virtual int proc_input(void) = 0;
+ virtual int input_avail(void) = 0;
+ virtual int wait_input(void) = 0;
+ virtual void check(void) { return; }
+};
+
+
+#endif
+
+/* End of cmd.src/newcmdcl.h */
diff --git a/sim/ucsim/cmd.src/newcmdposix.cc b/sim/ucsim/cmd.src/newcmdposix.cc
new file mode 100644
index 0000000..ce36d89
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmdposix.cc
@@ -0,0 +1,696 @@
+/*
+ * Simulator of microcontrollers (cmd.src/newcmdposix.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ * Copyright (C) 2006, Borut Razem - borut.razem@siol.net
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#include "ddconfig.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include "i_string.h"
+
+// prj
+#include "globals.h"
+#include "utils.h"
+
+// sim
+#include "simcl.h"
+#include "argcl.h"
+#include "appcl.h"
+
+// local
+#include "newcmdposixcl.h"
+
+
+/*
+ * Command console
+ *____________________________________________________________________________
+ */
+
+cl_console::cl_console(const char *_fin, const char *_fout, class cl_app *the_app)
+{
+ app= the_app;
+ fin= 0;
+ if (_fin)
+ {
+ fin= mk_io(_fin, cchars("r"));
+ }
+ fout= 0;
+ if (_fout)
+ {
+ fout= mk_io(_fout, cchars("w"));
+ }
+ prompt= 0;
+ set_flag(~CONS_NONE, false);
+ if ((fin && fin->tty) && (fout && fout->tty))
+ {
+ set_interactive(true);
+ fin->echo(fout);
+ fin->cooked();
+ }
+ else
+ ;
+ frout= 0;
+ id= 0;
+ lines_printed= new cl_ustrings(100, 100, "console_cache");
+}
+
+cl_console::cl_console(cl_f *_fin, cl_f *_fout, class cl_app *the_app)
+{
+ app= the_app;
+ fin= _fin;
+ fout= _fout;
+ prompt= 0;
+ set_flag(~CONS_NONE, false);
+ if ((fin && fin->tty) && (fout && fout->tty))
+ {
+ set_interactive(true);
+ fin->echo(fout);
+ fin->cooked();
+ }
+ else
+ ;
+ frout= 0;
+ id= 0;
+ lines_printed= new cl_ustrings(100, 100, "console_cache");
+}
+
+class cl_console *
+cl_console::clone_for_exec(char *_fin)
+{
+ class cl_f *fi= 0, *fo= 0;
+
+ if (!_fin)
+ return(0);
+ if (fi= mk_io(_fin, "r"), !fi)
+ {
+ fprintf(stderr, "Can't open `%s': %s\n", _fin, strerror(errno));
+ return(0);
+ }
+
+ if ((fo= fout->copy("a")) == 0)
+ {
+ delete fi;
+ fprintf(stderr, "Can't re-open output file: %s\n", strerror(errno));
+ return(0);
+ }
+
+ class cl_console *con= new cl_sub_console(this, fi, fo, app);
+ return(con);
+}
+
+void
+cl_console::drop_files(void) // do not close, just ignore
+{
+ fin= 0;
+ fout= 0;
+ frout= 0;
+ application->get_commander()->update_active();
+}
+
+void
+cl_console::close_files(bool close_in, bool close_out)
+{
+ if (frout)
+ delete frout;
+ if (close_out)
+ {
+ if (fout)
+ {
+ if (fout->tty)
+ tu_reset();
+ delete fout;
+ }
+ fout= 0;
+ }
+ if (close_in)
+ {
+ if (fin)
+ delete fin;
+ fin= 0;
+ application->get_commander()->update_active();
+ }
+ //drop_files();
+}
+
+void
+cl_console::replace_files(bool close_old, cl_f *new_in, cl_f *new_out)
+{
+ if (frout)
+ delete frout;
+ frout= 0;
+ if (close_old)
+ close_files(fin != new_in, fout != new_out);
+ fin= new_in;
+ fout= new_out;
+ application->get_commander()->update_active();
+}
+
+/*
+void
+cl_console::set_id(int new_id)
+{
+ char *s;
+
+ id= new_id;
+ set_name(s= format_string("console%d fin=%s,%d fout=%s,%d",
+ id,
+ fin?fin->get_file_name():"",
+ fin?fin->file_id:-1,
+ fout?fout->get_file_name():"",
+ fout?fout->file_id:-1));
+ free(s);
+}
+*/
+
+cl_console::~cl_console(void)
+{
+ un_redirect();
+ if (fout)
+ {
+ //if (flags & CONS_PROMPT)
+ //fout->write_str("\n");
+ //fout->flush();
+ if (fout->tty)
+ tu_reset();
+ delete fout;
+ }
+ if (fin)
+ {
+ delete fin;
+ }
+}
+
+
+/*
+ * Output functions
+ */
+
+void
+cl_console::redirect(char *fname, char *mode)
+{
+ frout= mk_io(fname, mode);
+ set_flag(CONS_REDIRECTED, true);
+}
+
+void
+cl_console::un_redirect(void)
+{
+ set_flag(CONS_REDIRECTED, false);
+ if (!frout)
+ return;
+ delete frout;
+ frout= 0;
+}
+
+/*
+ * Input functions
+ */
+
+bool
+cl_console::input_avail(void)
+{
+ bool ret= false;
+ if (startup_command.nempty())
+ return true;
+ if (input_active())
+ {
+ ret= fin->input_avail();
+ if (ret)
+ ;
+ }
+ return ret;
+}
+
+bool
+cl_console::need_check(void)
+{
+ return fin && (fin->type == F_CONSOLE);
+}
+
+bool
+cl_console::set_cooked(bool new_val)
+{
+ if (!fin)
+ return false;
+ if (new_val)
+ {
+ if (!fin->get_cooking())
+ fin->interactive(fout);
+ }
+ else
+ {
+ // raw
+ fin->raw();
+ }
+ return fin->get_cooking();
+}
+
+
+/* Return
+ -1 if EOF (and buffer is empty) or ^C found
+ 0 buffer is not ready yet
+ 1 buffer filled (EOL detected)
+*/
+
+int
+cl_console::read_line(void)
+{
+ int i= 0;
+ int b[2]= { 0, 0 };
+
+ do {
+ if (startup_command.nempty())
+ {
+ char *s= startup_command;
+ b[0]= s[0];
+ startup_command= &s[1];
+ i= 1;
+ }
+ else
+ {
+ i= fin->read(b, 1);
+ }
+ if (i < -1)
+ {
+ return -1;
+ }
+ if (i == 0)
+ {
+ // EOF
+ if (lbuf.len() == 0)
+ return -1;
+ // execute last line, assuming \n
+ return 1;
+ }
+ if (i > 0)
+ {
+ // Got a char
+ if (b[0] == 3)
+ // ^C, drop and close
+ return -1;
+ if ((b[0] == '\n') ||
+ (b[0] == '\r'))
+ {
+ if (nl &&
+ (nl != b[0]))
+ {
+ nl= 0;
+ continue;
+ }
+ nl= b[0];
+ /*
+ if (lbuf.len() != 0)
+ {
+ b[0]= '\n';
+ lbuf+= b;
+ }
+ */
+ return 1;
+ }
+ {
+ char s[2];
+ s[0]= b[0];
+ s[1]= b[1];
+ lbuf+= s;
+ }
+ }
+ }
+ while (i > 0);
+ return 0;
+}
+
+
+/*
+ * This console listen on a socket and can accept connection requests
+ */
+//#ifdef SOCKET_AVAIL
+
+cl_listen_console::cl_listen_console(int serverport, class cl_app *the_app)
+{
+ app= the_app;
+ fin= mk_srv(serverport);
+ fout= frout= 0;
+}
+
+/*
+void
+cl_listen_console::set_id(int new_id)
+{
+ char *s;
+
+ id= new_id;
+ set_name(s= format_string("listen_console%d port=%d",
+ id,
+ fin?fin->server_port:-1));
+ free(s);
+}
+*/
+
+int
+cl_listen_console::proc_input(class cl_cmdset *cmdset)
+{
+ //int newsock;
+
+ class cl_commander_base *cmd;
+ cl_f *in, *out;
+
+ cmd= app->get_commander();
+
+ srv_accept(fin, &in, &out);
+ class cl_console_base *c= new cl_console(in, out, app);
+ c->set_flag(CONS_INTERACTIVE, true);
+ in->interactive(out);
+ cmd->add_console(c);
+ return(0);
+}
+
+//#endif /* SOCKET_AVAIL */
+
+
+/*
+ * Sub-console
+ */
+/*
+cl_sub_console::cl_sub_console(class cl_console_base *the_parent,
+ FILE *fin, FILE *fout, class cl_app *the_app):
+ cl_console(fin, fout, the_app)
+{
+ parent= the_parent;
+}
+*/
+cl_sub_console::cl_sub_console(class cl_console_base *the_parent,
+ class cl_f *fin, class cl_f *fout, class cl_app *the_app):
+ cl_console(fin, fout, the_app)
+{
+ parent= the_parent;
+}
+
+cl_sub_console::~cl_sub_console(void)
+{
+ class cl_commander_base *c= app->get_commander();
+
+ if (parent && c)
+ {
+ c->activate_console(parent);
+ }
+}
+
+int
+cl_sub_console::init(void)
+{
+ class cl_commander_base *c= app->get_commander();
+
+ if (parent && c)
+ {
+ c->deactivate_console(parent);
+ }
+ cl_console::init();
+ set_flag(CONS_ECHO, true);
+ return(0);
+}
+
+/*
+void
+cl_sub_console::set_id(int new_id)
+{
+ char *s;
+
+ id= new_id;
+ set_name(s= format_string("sub_console%d (of %d) fin=%s,%d fout=%s,%d",
+ id,
+ parent?parent->get_id():-1,
+ fin?fin->get_file_name():"",
+ fin?fin->file_id:-1,
+ fout?fout->get_file_name():"",
+ fout?fout->file_id:-1));
+ free(s);
+}
+*/
+
+/*
+ * Command interpreter
+ *____________________________________________________________________________
+ */
+
+int
+cl_commander::init(void)
+{
+ class cl_optref console_on_option(this);
+ class cl_optref config_file_option(this);
+ class cl_optref port_number_option(this);
+ class cl_console_base *con;
+ int ccnt= 0;
+ cl_console_base *c;
+
+ console_on_option.init();
+ console_on_option.use("console_on");
+ config_file_option.init();
+ config_file_option.use("config_file");
+ port_number_option.init();
+
+ cl_base::init();
+ set_name("Commander");
+ active_inputs= new cl_list(10, 5, "active_inputs");
+ check_list= new cl_list(10, 5, "check_list");
+
+ bool need_config= true;
+
+ if (port_number_option.use("port_number"))
+ {
+ add_console(c= new cl_listen_console(port_number_option.get_value((long)0), app));
+ }
+ /*
+ else
+ {
+ c= new cl_listen_console(5559, app);
+ add_console(c);
+ c->prev_quit= 0;
+ ccnt= 1;
+ }
+ */
+ char *Config= config_file_option.get_value("");
+ char *cn= console_on_option.get_value("");
+
+ if (cn)
+ {
+ if (strcmp(cn, "-") == 0)
+ {
+ class cl_f *in, *out;
+ in= cp_io(fileno(stdin), cchars("r"));
+ out= cp_io(fileno(stdout), cchars("w"));
+ in->interactive(out);
+ add_console(con= new cl_console(in, out, app));
+ config_console= exec_on(con, Config);
+ if (config_console)
+ config_console->set_startup(app->startup_command);
+ else
+ con->set_startup(app->startup_command);
+ need_config= false;
+ if (in->tty)
+ con->set_flag(CONS_INTERACTIVE, true);
+ }
+ else
+ {
+ add_console(con= new cl_console(cn, cn, app));
+ config_console= exec_on(con, Config);
+ need_config= false;
+ }
+ }
+ if (cons->get_count() == ccnt)
+ {
+ class cl_f *in, *out;
+ in= cp_io(fileno(stdin), cchars("r"));
+ out= cp_io(fileno(stdout), cchars("w"));
+ in->interactive(out);
+ add_console(con= new cl_console(in, out, app));
+ config_console= exec_on(con, Config);
+ if (config_console)
+ config_console->set_startup(app->startup_command);
+ else
+ con->set_startup(app->startup_command);
+ need_config= false;
+ if (in->tty)
+ con->set_flag(CONS_INTERACTIVE, true);
+ }
+ if (
+ need_config &&
+ (
+ (Config && *Config)
+ ||
+ app->startup_command.nempty()
+ )
+ )
+ {
+ class cl_f *i= NULL, *o;
+ if (Config && *Config)
+ i= mk_io(Config, "r");
+ o= cp_io(fileno(stderr), "w");
+ con= new cl_console(/*fc*/i, /*stderr*/o, app);
+ con->set_flag(CONS_NOWELCOME|CONS_ECHO, true);
+ //exec_on(con, Config);
+ config_console= con;
+ con->set_startup(app->startup_command);
+ add_console(con);
+ }
+ return(0);
+}
+
+void
+cl_commander::update_active(void)
+{
+ int i;
+
+ active_inputs->disconn_all();
+ check_list->disconn_all();
+
+ if (config_console)
+ {
+ if (!cons->index_of(config_console, NULL))
+ config_console= 0;
+ }
+
+ //printf("List of active cons: ");
+ for (i= 0; i < cons->count; i++)
+ {
+ class cl_console *c=
+ (class cl_console *)cons->at(i);
+ class cl_f *f= c->get_fin();
+
+ if (config_console &&
+ (config_console != c))
+ continue;
+
+ if (f &&
+ (f->file_id < 0))
+ continue;
+
+ if (c->input_active() &&
+ f)
+ {
+ active_inputs->add(f);
+ //printf("%d,",c->get_id());
+ }
+ if (c->need_check() &&
+ f)
+ check_list->add(f);
+ }
+ //printf("\n");
+ //printf("List of check cons: ");
+ /*for (i= 0; i < check_list->count; i++)
+ {
+ class cl_console *c=
+ (class cl_console *)cons->at(i);
+ printf("%d,", c->get_id());
+ }*/
+ //printf("\n");
+}
+
+int
+cl_commander::input_avail(void)
+{
+ class cl_list *avail= new cl_list(10,5,"avail");
+ bool ret= check_inputs(active_inputs, avail);
+ avail->disconn_all();
+ delete avail;
+ if (!ret)
+ for (int j = 0; j < cons->count; j++)
+ {
+ class cl_console *c = dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(j)));
+ chars *s= c->get_startup();
+ if (s->nempty())
+ {
+ return true;
+ }
+ }
+ return ret;
+}
+
+int
+cl_commander::wait_input(void)
+{
+ while (!input_avail())
+ loop_delay();
+ return 0;
+}
+
+int
+cl_commander::proc_input(void)
+{
+ if (config_console)
+ {
+ if (!cons->index_of(config_console, NULL))
+ config_console= 0;
+ }
+
+ for (int j = 0; j < cons->count; j++)
+ {
+ class cl_console *c = dynamic_cast<class cl_console*>((class cl_console_base*)(cons->at(j)));
+ class cl_f *f= c->get_fin();
+
+ if (config_console &&
+ (config_console != c))
+ continue;
+
+ if (c->input_active() &&
+ (f || c->has_startup()))
+ {
+ if (c->input_avail())
+ {
+ actual_console = c;
+ int retval = c->proc_input(cmdset);
+ if (retval)
+ {
+ del_console(c);
+ //delete c;
+ }
+ actual_console = 0;
+ int i= consoles_prevent_quit();
+ return(i == 0);
+ }
+ }
+ }
+ return 0;
+}
+
+
+void
+cl_commander::check(void)
+{
+ int i;
+
+ for (i= 0; i < check_list->count; i++)
+ {
+ class cl_f *f= (class cl_f *)check_list->at(i);
+ f->check();
+ }
+}
+
+/* End of cmd.src/newcmdposix.cc */
diff --git a/sim/ucsim/cmd.src/newcmdposix.o b/sim/ucsim/cmd.src/newcmdposix.o
new file mode 100644
index 0000000..63149c2
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmdposix.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/newcmdposixcl.h b/sim/ucsim/cmd.src/newcmdposixcl.h
new file mode 100644
index 0000000..b76fa1f
--- /dev/null
+++ b/sim/ucsim/cmd.src/newcmdposixcl.h
@@ -0,0 +1,133 @@
+/*
+ * Simulator of microcontrollers (cmd.src/newcmdposixcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ * Copyright (C) 2006, Borut Razem - borut.razem@siol.net
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_NEWCMDFDCL_HEADER
+#define CMD_NEWCMDFDCL_HEADER
+
+#include "fiocl.h"
+#include "newcmdcl.h"
+#include "cmdutil.h"
+
+
+/*
+ * Command fd console
+ */
+
+class cl_console: public cl_console_base
+{
+ protected:
+ //FILE *in/*, *out, *rout*//*redirected output*/;
+ cl_f *fin, *fout, *frout;
+
+ public:
+ cl_console(void) { fin= fout= frout= 0; }
+ cl_console(const char *_fin, const char *_fout, class cl_app *the_app);
+ //cl_console(FILE *_fin, FILE *_fout, class cl_app *the_app);
+ cl_console(cl_f *_fin, cl_f *_fout, class cl_app *the_app);
+
+ virtual ~cl_console(void);
+ //virtual void set_id(int new_id);
+ virtual class cl_console *clone_for_exec(char *_fin);
+ virtual void drop_files(void); // do not close, just ignore
+ virtual void close_files(bool close_in, bool close_out);
+ virtual void replace_files(bool close_old, cl_f *new_in, cl_f *new_out);
+
+ virtual void redirect(char *fname, char *mode);
+ virtual void un_redirect(void);
+ virtual UCSOCKET_T get_in_fd(void) { return(fin ? (fin->file_id) : -1); }
+ virtual bool is_tty(void) const { return fin && (fin->tty); }
+ virtual bool is_eof(void) const { return fin ? (fin->eof()) : true; }
+ virtual bool input_avail(void);// { return input_active() ? (fin->input_avail()) : false; };
+ virtual int read_line(void);
+ virtual bool need_check(void);
+ virtual bool set_cooked(bool new_val);
+
+ public:
+ //FILE *get_out(void) { return rout ? rout : out; }
+ class cl_f *get_fout(void) { return frout ? frout : fout; }
+ class cl_f *get_fin(void) { return fin; }
+};
+
+//#ifdef SOCKET_AVAIL
+class cl_listen_console: public cl_console
+{
+ public:
+ cl_listen_console(int serverport, class cl_app *the_app);
+
+ //virtual void set_id(int new_id);
+ virtual void welcome(void) {}
+
+ //virtual UCSOCKET_T get_in_fd(void) { return(sock); }
+ virtual int proc_input(class cl_cmdset *cmdset);
+ virtual bool set_cooked(bool new_val) { return false; }
+};
+//#endif
+
+
+class cl_sub_console: public cl_console
+{
+ private:
+ class cl_console_base *parent;
+
+ public:
+ //cl_sub_console(class cl_console_base *the_parent, FILE *fin, FILE *fout, class cl_app *the_app);
+ cl_sub_console(class cl_console_base *the_parent,
+ class cl_f *fin, class cl_f *fout, class cl_app *the_app);
+ virtual ~cl_sub_console(void);
+ virtual int init(void);
+ //virtual void set_id(int new_id);
+};
+
+
+/*
+ * Command interpreter
+ */
+
+class cl_commander: public cl_commander_base
+{
+ private:
+ //fd_set read_set, active_set;
+ //UCSOCKET_T fd_num;
+
+ public:
+ cl_commander(class cl_app *the_app, class cl_cmdset *acmdset)
+ : cl_commander_base(the_app, acmdset)
+ {
+ }
+
+ virtual int init(void);
+ virtual void update_active(void);
+ virtual int input_avail(void);
+ virtual int wait_input(void);
+ virtual int proc_input(void);
+ virtual void check(void);
+};
+
+#endif
+
+/* End of cmd.src/newcmdposixcl.h */
diff --git a/sim/ucsim/cmd.src/syntax.cc b/sim/ucsim/cmd.src/syntax.cc
new file mode 100644
index 0000000..d99f09b
--- /dev/null
+++ b/sim/ucsim/cmd.src/syntax.cc
@@ -0,0 +1,31 @@
+/*
+ * Simulator of microcontrollers (cmd.src/syntax.cc)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+// local
+#include "syntaxcl.h"
+
+/* End of cmd.src/syntax.cc */
diff --git a/sim/ucsim/cmd.src/syntax.o b/sim/ucsim/cmd.src/syntax.o
new file mode 100644
index 0000000..0574843
--- /dev/null
+++ b/sim/ucsim/cmd.src/syntax.o
Binary files differ
diff --git a/sim/ucsim/cmd.src/syntaxcl.h b/sim/ucsim/cmd.src/syntaxcl.h
new file mode 100644
index 0000000..c49d047
--- /dev/null
+++ b/sim/ucsim/cmd.src/syntaxcl.h
@@ -0,0 +1,33 @@
+/*
+ * Simulator of microcontrollers (cmd.src/syntaxcl.h)
+ *
+ * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
+ *
+ * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ *
+ */
+
+/* This file is part of microcontroller simulator: ucsim.
+
+UCSIM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+UCSIM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with UCSIM; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+/*@1@*/
+
+#ifndef CMD_SYNTAXCL_HEADER
+#define CMD_SYNTAXCL_HEADER
+
+#endif
+
+/* End of cmd.src/syntaxcl.h */