diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/cmd.src | |
| download | sdcc-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')
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 Binary files differnew file mode 100644 index 0000000..a00f07f --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_bp.o 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 Binary files differnew file mode 100644 index 0000000..0325ae4 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_conf.o 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 Binary files differnew file mode 100644 index 0000000..4ddc861 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_exec.o 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 Binary files differnew file mode 100644 index 0000000..8afa87b --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_get.o 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 Binary files differnew file mode 100644 index 0000000..cdecf77 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_gui.o 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 Binary files differnew file mode 100644 index 0000000..f80fc5b --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_info.o 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 Binary files differnew file mode 100644 index 0000000..bc5ec79 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_mem.o 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 Binary files differnew file mode 100644 index 0000000..bb5ed82 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_set.o 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 Binary files differnew file mode 100644 index 0000000..e1e064c --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_show.o 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 Binary files differnew file mode 100644 index 0000000..241a0c9 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_stat.o 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 Binary files differnew file mode 100644 index 0000000..6ef7ceb --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_timer.o 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 Binary files differnew file mode 100644 index 0000000..8606ef9 --- /dev/null +++ b/sim/ucsim/cmd.src/cmd_uc.o 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 Binary files differnew file mode 100644 index 0000000..a69612c --- /dev/null +++ b/sim/ucsim/cmd.src/cmdlex.o 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 Binary files differnew file mode 100644 index 0000000..37cc5f0 --- /dev/null +++ b/sim/ucsim/cmd.src/cmdpars.o 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 Binary files differnew file mode 100644 index 0000000..3f920cd --- /dev/null +++ b/sim/ucsim/cmd.src/cmdutil.o 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 Binary files differnew file mode 100644 index 0000000..a4a9ed5 --- /dev/null +++ b/sim/ucsim/cmd.src/command.o 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 Binary files differnew file mode 100644 index 0000000..88256bd --- /dev/null +++ b/sim/ucsim/cmd.src/newcmd.o 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 Binary files differnew file mode 100644 index 0000000..63149c2 --- /dev/null +++ b/sim/ucsim/cmd.src/newcmdposix.o 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 Binary files differnew file mode 100644 index 0000000..0574843 --- /dev/null +++ b/sim/ucsim/cmd.src/syntax.o 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 */ |
