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/s51.src/test/print.c | |
| 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/s51.src/test/print.c')
| -rw-r--r-- | sim/ucsim/s51.src/test/print.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/sim/ucsim/s51.src/test/print.c b/sim/ucsim/s51.src/test/print.c new file mode 100644 index 0000000..32d51e9 --- /dev/null +++ b/sim/ucsim/s51.src/test/print.c @@ -0,0 +1,189 @@ +#if defined __SDCC || defined SDCC
+#include <stdio.h>
+#elif defined __C51__
+#include <stdio.h>
+#endif
+
+#include "print.h"
+
+void
+print(char *s) __reentrant
+{
+ if (s)
+ for (; *s; putchar(*s++)) ;
+}
+
+void
+print_form(char *s, long l, void *p) __reentrant
+{
+ if (s)
+ for (; *s; s++)
+ if (*s != '%')
+ putchar(*s);
+ else
+ {
+ s++;
+ if (*s)
+ switch (*s)
+ {
+ case 'u': print_u(l); break;
+ case 'd': print_d(l); break;
+ case 'p': print_p(p); break;
+ case 'x': print_x(l); break;
+ case '2': print_cx(l); break;
+ case '4': print_lx(l); break;
+ }
+ }
+}
+
+/* signed integer in decimal */
+
+void
+print_d(long i) __reentrant
+{
+ long x= 1000000000;
+ char in= 0;
+ if (i<0)
+ {
+ putchar('-');
+ i= -i;
+ }
+ while (x)
+ {
+ int j= i/x;
+ if (in || j || (x==1))
+ putchar(j+'0');
+ in= in || j;
+ i%= x;
+ x/= 10;
+ }
+}
+
+
+/* unsigned integer in decimal */
+
+void
+print_u(unsigned int i) __reentrant
+{
+ int x= 10000;
+ while (x)
+ {
+ int j= i/x;
+ putchar(j+'0');
+ i%= x;
+ x/= 10;
+ }
+}
+
+
+/* unsigned int in hex */
+
+void
+print_cx(unsigned char i)
+{
+ putchar((i/16)+(((i/16)<10)?'0':('A'-10)));
+ putchar((i&15)+(((i&15)<10)?'0':('A'-10)));
+}
+
+void
+print_x(unsigned int i) __reentrant
+{
+/*
+ unsigned char j;
+ for (j= 0; j<4; j++)
+ {
+ char v= (i&0xf000)>>12;
+ putchar(v+((v<10)?'0':('A'-10)));
+ i<<= 4;
+ }
+*/
+ print_cx(i/256);
+ print_cx(i&0xff);
+}
+
+void
+print_lx(unsigned long i) __reentrant
+{
+ print_x(i >> 16);
+ print_x(i & 0xffff);
+}
+
+void
+print_p(void *p) __reentrant
+{
+ unsigned char t= ((long)p)/0x10000;
+ if (t>=0x80)
+ putchar('C');
+ else if (t>=0x60)
+ putchar('P');
+ else if (t>=0x40)
+ putchar('I');
+ else
+ putchar('X');
+ putchar(':');
+ print_x(((long)p)&0xffff);
+}
+
+
+void
+print_c(char c)
+{
+ putchar(c);
+}
+
+
+void
+term_cls()
+{
+ print("\033[2J");
+}
+
+
+void
+term_xy(char x1, char y1)
+{
+ putchar('\033');
+ putchar('[');
+ print_u(y1);
+ putchar(';');
+ print_u(x1);
+ putchar('H');
+}
+
+
+void
+term_save()
+{
+ print("\033[s");
+}
+
+
+void
+term_restore()
+{
+ print("\033[u");
+}
+
+
+void
+term_hide()
+{
+ print("\033[?25l");
+}
+
+
+void
+term_show()
+{
+ print("\033[?25h");
+}
+
+
+void
+term_color(int bg, int fg) __reentrant
+{
+ if (bg >= 0)
+ print_form("\033[%um", bg+40, NULL);
+ if (fg >= 0)
+ print_form("\033[%um", fg+30, NULL);
+}
|
