summaryrefslogtreecommitdiff
path: root/sim/ucsim/sim.src/port_hw.cc
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/sim.src/port_hw.cc
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/sim.src/port_hw.cc')
-rw-r--r--sim/ucsim/sim.src/port_hw.cc324
1 files changed, 324 insertions, 0 deletions
diff --git a/sim/ucsim/sim.src/port_hw.cc b/sim/ucsim/sim.src/port_hw.cc
new file mode 100644
index 0000000..4c365bc
--- /dev/null
+++ b/sim/ucsim/sim.src/port_hw.cc
@@ -0,0 +1,324 @@
+/*
+ * Simulator of microcontrollers (sim.src/port_hw.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 "globals.h"
+
+#include "port_hwcl.h"
+
+
+const char *keysets[8]= {
+ "12345678",
+ "qwertyui",
+ "asdfghjk",
+ "zxcvbnm,",
+ "QWERTYUI",
+ "ASDFGHJK",
+ "ZXCVBNM,",
+ "9opl.OPL"
+};
+
+
+cl_port_ui::cl_port_ui(class cl_uc *auc, int aid, chars aid_string):
+ cl_hw(auc, HW_DUMMY, aid, aid_string)
+{
+ int i;
+
+ for (i= 0; i < NUOF_PORT_UIS; i++)
+ {
+ pd[i].init();
+ pd[i].cell_p= NULL;
+ pd[i].cell_in= NULL;
+ pd[i].cell_dir= NULL;
+ pd[i].cache_p= 0;
+ pd[i].cache_in= 0;
+ pd[i].cache_dir= 0;
+ pd[i].keyset= NULL;
+ }
+ act_port= -1;
+}
+
+
+bool
+cl_port_ui::add_port(class cl_port_data *p, int nr)
+{
+ if (nr >= NUOF_PORT_UIS)
+ return false;
+ if (pd[nr].cell_p)
+ return false;
+
+ if ((pd[nr].cell_p= p->cell_p))
+ pd[nr].cache_p= pd[nr].cell_p->get();
+ if ((pd[nr].cell_in= p->cell_in))
+ pd[nr].cache_in= pd[nr].cell_in->read();
+ if ((pd[nr].cell_dir= p->cell_dir))
+ pd[nr].cache_dir= pd[nr].cell_dir->read();
+ pd[nr].keyset = p->keyset;
+ pd[nr].basx = p->basx;
+ pd[nr].basy = p->basy;
+
+ pd[nr].set_name(p->get_name());
+
+ if (act_port < 0)
+ act_port= nr;
+
+ return true;
+}
+
+
+void
+cl_port_ui::make_io()
+{
+ if (!io)
+ {
+ io= new cl_port_io(this);
+ io->init();
+ application->get_commander()->add_console(io);
+ }
+}
+
+
+void
+cl_port_ui::new_io(class cl_f *f_in, class cl_f *f_out)
+{
+ cl_hw::new_io(f_in, f_out);
+ io->tu_mouse_on();
+ io->dd_printf("\033[2 q");
+ if (f_in)
+ f_in->set_escape(true);
+}
+
+
+bool
+cl_port_ui::proc_input(void)
+{
+ return cl_hw::proc_input();
+}
+
+bool
+cl_port_ui::handle_input(int c)
+{
+ class cl_port_io *pio= (class cl_port_io *)io;
+ int i;
+ i8_t i8= c;
+
+ if (i8 < 0)
+ {
+ //fprintf(stderr, "Port: spec key= %d\n", i8);
+ }
+ else
+ {
+ for (i= 0; i < NUOF_PORT_UIS; i++)
+ {
+ if (pd[i].cell_p == NULL)
+ continue;
+
+ if (pd[i].keyset != NULL)
+ {
+ int bit;
+ for (bit= 0; pd[i].keyset[bit]; bit++)
+ if (pd[i].keyset[bit] == c)
+ {
+ t_mem m= pd[i].cell_in->read();
+ pd[i].cell_in->write(m ^ (1<<(7-bit)));
+ pio->tu_go(1,1);
+ return true;
+ }
+ }
+ }
+ }
+ pio->tu_go(1,24);
+ pio->tu_cll();
+ int ret= cl_hw::handle_input(c); // handle default keys
+ pio->tu_go(1,1);
+ //pio->tu_cll();
+ if (!ret)
+ {
+ u8_t u= c;
+ //fprintf(stderr, "Unknown command: %c (%d,0x%x)\n", isprint(u)?u:'?', i8, c);
+ }
+ return ret;
+}
+
+void
+cl_port_ui::refresh_display(bool force)
+{
+ class cl_port_io *pio= (class cl_port_io *)io;
+ if (!io)
+ return;
+
+ int i, m;
+ bool pc= false, ic= false;
+ pio->tu_hide();
+ for (i= 0; i < NUOF_PORT_UIS; i++)
+ {
+ if (pd[i].cell_p == NULL)
+ continue;
+ // name
+ pio->tu_go(pd[i].basx, pd[i].basy);
+ pio->dd_printf("\033[%dm", (act_port == i)?7:0);
+ if (pd[i].have_name())
+ pio->dd_printf(pd[i].get_name());
+ else
+ pio->dd_printf("port_%d", i);
+
+ if (pd[i].cell_dir)
+ {
+ t_mem d= pd[i].cell_dir->get();
+ if (pd[i].cache_dir != d)
+ force= true;
+ pd[i].cache_dir= d;
+ }
+
+ pio->dd_printf("\033[0m");
+ if (force ||
+ (pd[i].cell_p->get() != pd[i].cache_p))
+ {
+ // Out
+ pd[i].cache_p= pd[i].cell_p->get();
+ pio->tu_go(pd[i].basx+4, pd[i].basy+1);
+ m= 0x80;
+ for ( ; m; m>>= 1)
+ {
+ char v= (pd[i].cache_p&m)?'*':'-';
+ if (pd[i].cell_dir != NULL)
+ {
+ if ((pd[i].cache_dir & m) == 0)
+ v= '.';
+ }
+ pio->dd_printf("%c", v);
+ }
+ pio->tu_go(pd[i].basx+4+8+1, pd[i].basy+1);
+ pio->dd_printf("%02x", pd[i].cache_p);
+ pc= true;
+ }
+ if (force ||
+ (pd[i].cell_in &&
+ (pd[i].cell_in->get() != pd[i].cache_in)))
+ {
+ // In
+ pd[i].cache_in= pd[i].cell_in->get();
+ pio->tu_go(pd[i].basx+4, pd[i].basy+3);
+ m= 0x80;
+ for ( ; m; m>>= 1)
+ pio->dd_printf("%c", (pd[i].cache_in&m)?'*':'-');
+ pio->tu_go(pd[i].basx+4+8+1, pd[i].basy+3);
+ pio->dd_printf("%02x", pd[i].cache_in);
+ ic= true;
+ }
+ if (force ||
+ ((pc || ic)/* &&
+ pd[i].cell_dir == NULL*/))
+ {
+ // port value on "Bits" line
+ int b, val, pval= pd[i].cache_in;
+ pio->tu_go(pd[i].basx+4, pd[i].basy+2);
+ for (b= 7; b>=0; b--)
+ {
+ m= 1<<b;
+ val= pd[i].cache_in & m;
+ if (pd[i].cell_dir == NULL)
+ val&= (pd[i].cache_p & m);
+ //if (val)
+ pio->dd_printf("\033[%dm", val?7:0);
+ //else
+ //pio->dd_printf("\033[0m");
+ pio->dd_printf("%d", b);
+ }
+ if (!pd[i].cell_dir)
+ pval&= pd[i].cache_p;
+ pio->dd_printf("\033[0m %02x", pval);
+ }
+ }
+ pio->tu_show();
+ cl_hw::refresh_display(force);
+ if (act_port >= 0)
+ pio->tu_go(pd[act_port].basx+4, pd[act_port].basy+1);
+ else
+ pio->tu_go(1, 1);
+}
+
+void
+cl_port_ui::draw_display(void)
+{
+ class cl_port_io *pio= (class cl_port_io *)io;
+ if (!io)
+ return;
+ pio->tu_cls();
+
+ cl_hw::draw_display();
+
+ int i;
+ for (i= 0; i < NUOF_PORT_UIS; i++)
+ {
+ if (pd[i].cell_p == NULL)
+ continue;
+
+ pio->tu_go(pd[i].basx, pd[i].basy+1);
+ pio->dd_printf("Out ");
+ pio->tu_go(pd[i].basx, pd[i].basy+2);
+ pio->dd_printf("Bit 76543210");
+ pio->tu_go(pd[i].basx, pd[i].basy+3);
+ pio->dd_printf("In ");
+ pio->tu_go(pd[i].basx, pd[i].basy+4);
+ if (pd[i].keyset)
+ pio->dd_printf("Key %s", pd[i].keyset);
+
+ pd[i].cache_p= pd[i].cell_p->get();
+ pd[i].cache_in= pd[i].cell_in->read();
+ }
+
+ refresh_display(true);
+}
+
+
+/* IO console for port display */
+
+cl_port_io::cl_port_io(class cl_hw *ihw):
+ cl_hw_io(ihw)
+{
+}
+
+int
+cl_port_io::init(void)
+{
+ cl_hw_io::init();
+ return 0;
+}
+
+/*
+bool
+cl_port_io::input_avail(void)
+{
+ if (hw)
+ hw->refresh_display(false);
+ return cl_console::input_avail();
+}
+*/
+
+/* End of sim.src/port_hw.cc */