summaryrefslogtreecommitdiff
path: root/sim/ucsim/s51.src/test
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/s51.src/test
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/s51.src/test')
-rw-r--r--sim/ucsim/s51.src/test/Makefile16
-rw-r--r--sim/ucsim/s51.src/test/c517.h13
-rw-r--r--sim/ucsim/s51.src/test/conf.cmd1
-rw-r--r--sim/ucsim/s51.src/test/dummy.h0
-rw-r--r--sim/ucsim/s51.src/test/hw.h47
-rw-r--r--sim/ucsim/s51.src/test/mdu517.c124
-rw-r--r--sim/ucsim/s51.src/test/mdu517.h28
-rw-r--r--sim/ucsim/s51.src/test/mdu88x.c234
-rw-r--r--sim/ucsim/s51.src/test/mdu88x.h60
-rw-r--r--sim/ucsim/s51.src/test/monitor.c65
-rw-r--r--sim/ucsim/s51.src/test/monitor.mk7
-rw-r--r--sim/ucsim/s51.src/test/print.c189
-rw-r--r--sim/ucsim/s51.src/test/print.h26
-rw-r--r--sim/ucsim/s51.src/test/run.cmd2
-rwxr-xr-xsim/ucsim/s51.src/test/run.sh30
-rw-r--r--sim/ucsim/s51.src/test/sdcc.mk46
-rw-r--r--sim/ucsim/s51.src/test/serial.c216
-rw-r--r--sim/ucsim/s51.src/test/serial.h32
-rw-r--r--sim/ucsim/s51.src/test/st.cmd4
-rwxr-xr-xsim/ucsim/s51.src/test/st.sh108
-rw-r--r--sim/ucsim/s51.src/test/st_list.txt8
-rwxr-xr-xsim/ucsim/s51.src/test/stest.sh51
-rw-r--r--sim/ucsim/s51.src/test/stn.c35
-rw-r--r--sim/ucsim/s51.src/test/stn.mk5
-rw-r--r--sim/ucsim/s51.src/test/stp.c20
-rw-r--r--sim/ucsim/s51.src/test/stp.mk5
-rw-r--r--sim/ucsim/s51.src/test/strr.c16
-rw-r--r--sim/ucsim/s51.src/test/strr.mk5
-rw-r--r--sim/ucsim/s51.src/test/sts.c22
-rw-r--r--sim/ucsim/s51.src/test/sts.mk7
-rw-r--r--sim/ucsim/s51.src/test/stt.c68
-rw-r--r--sim/ucsim/s51.src/test/stt.mk7
-rw-r--r--sim/ucsim/s51.src/test/stt_large.mk8
-rw-r--r--sim/ucsim/s51.src/test/stt_small.mk8
-rw-r--r--sim/ucsim/s51.src/test/stxr.c25
-rw-r--r--sim/ucsim/s51.src/test/stxr.mk5
-rw-r--r--sim/ucsim/s51.src/test/stxrw.c22
-rw-r--r--sim/ucsim/s51.src/test/stxrw.mk3
-rw-r--r--sim/ucsim/s51.src/test/stxw.c16
-rw-r--r--sim/ucsim/s51.src/test/stxw.mk5
-rw-r--r--sim/ucsim/s51.src/test/t0.c89
-rw-r--r--sim/ucsim/s51.src/test/t0.h82
-rw-r--r--sim/ucsim/s51.src/test/test_extit.c15
-rw-r--r--sim/ucsim/s51.src/test/test_idlepd.c35
-rw-r--r--sim/ucsim/s51.src/test/test_mdu517.c284
-rw-r--r--sim/ucsim/s51.src/test/test_mdu517.mk7
-rw-r--r--sim/ucsim/s51.src/test/test_mdu517.type1
-rw-r--r--sim/ucsim/s51.src/test/test_mdu88x.c488
-rw-r--r--sim/ucsim/s51.src/test/test_mdu88x.cmd3
-rw-r--r--sim/ucsim/s51.src/test/test_mdu88x.mk7
-rw-r--r--sim/ucsim/s51.src/test/test_mdu88x.type1
-rw-r--r--sim/ucsim/s51.src/test/test_ser.c114
-rw-r--r--sim/ucsim/s51.src/test/test_ser.mk7
-rw-r--r--sim/ucsim/s51.src/test/test_stack.c9
-rw-r--r--sim/ucsim/s51.src/test/tim_ser.c73
-rw-r--r--sim/ucsim/s51.src/test/tim_ser.mk7
-rw-r--r--sim/ucsim/s51.src/test/timer.c27
-rw-r--r--sim/ucsim/s51.src/test/timer.h17
-rw-r--r--sim/ucsim/s51.src/test/xc88x.h14
59 files changed, 2869 insertions, 0 deletions
diff --git a/sim/ucsim/s51.src/test/Makefile b/sim/ucsim/s51.src/test/Makefile
new file mode 100644
index 0000000..5f1ec23
--- /dev/null
+++ b/sim/ucsim/s51.src/test/Makefile
@@ -0,0 +1,16 @@
+PRJ = test_mdu517 test_mdu88x \
+ stn stp strr sts stt stxr stxrw stxw \
+ stt_small stt_large \
+ monitor test_ser tim_ser
+
+all:
+ for p in $(PRJ); do \
+ $(MAKE) -f $$p.mk clean all ;\
+ done
+
+clean:
+ for p in $(PRJ); do \
+ $(MAKE) -f $$p.mk clean ;\
+ done
+ rm -f *.out *.sout *.tim *.csv *.sim
+ rm -f st*[56][0-9][0-9].cmd st*[56]*.txt
diff --git a/sim/ucsim/s51.src/test/c517.h b/sim/ucsim/s51.src/test/c517.h
new file mode 100644
index 0000000..445c312
--- /dev/null
+++ b/sim/ucsim/s51.src/test/c517.h
@@ -0,0 +1,13 @@
+#ifndef C517_HEADER
+#define C517_HEADER
+
+__sfr __at (0xE9) MD0;
+__sfr __at (0xEA) MD1;
+__sfr __at (0xEB) MD2;
+__sfr __at (0xEC) MD3;
+__sfr __at (0xED) MD4;
+__sfr __at (0xEE) MD5;
+
+__sfr __at (0xEF) ARCON;
+
+#endif
diff --git a/sim/ucsim/s51.src/test/conf.cmd b/sim/ucsim/s51.src/test/conf.cmd
new file mode 100644
index 0000000..54ea949
--- /dev/null
+++ b/sim/ucsim/s51.src/test/conf.cmd
@@ -0,0 +1 @@
+set hw simif xram 0xffff
diff --git a/sim/ucsim/s51.src/test/dummy.h b/sim/ucsim/s51.src/test/dummy.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sim/ucsim/s51.src/test/dummy.h
diff --git a/sim/ucsim/s51.src/test/hw.h b/sim/ucsim/s51.src/test/hw.h
new file mode 100644
index 0000000..a29d13e
--- /dev/null
+++ b/sim/ucsim/s51.src/test/hw.h
@@ -0,0 +1,47 @@
+#ifndef HW_HEADER
+#define HW_HEADER
+
+
+#if defined __SDCC || defined SDCC
+#include <mcs51/8052.h>
+#elif defined __C51__
+#include <reg52.h>
+#else /* IAR4 */
+#include <io51.h>
+#endif
+
+
+#if defined __SDCC || defined SDCC
+#define bit __bit
+#define CODE_PTR(TYPE) __code TYPE *
+#define XRAM_PTR(TYPE) __xdata TYPE *
+#elif defined __C51__
+#define __bit bit
+#define CODE_PTR(TYPE) TYPE code *
+#define XRAM_PTR(TYPE) TYPE xdata *
+#else /* IAR4 */
+#define __bit bit
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#define XRAM_SIZE (0x1000)
+#define PAGE_SIZE (0x0200)
+#define RESERVED_SPACE (2*PAGE_SIZE)
+
+#define LOADER_START (0xe000)
+#define LOADER_SIZE (0x10000 - LOADER_START)
+
+#define INFO_BLOCK_SIZE (0x0040)
+
+#define BOARD_INFO ((LOADER_START - RESERVED_SPACE - PAGE_SIZE - INFO_BLOCK_SIZE) + LOADER_SIZE)
+
+
+#endif
+
+/* End of hw.h */
diff --git a/sim/ucsim/s51.src/test/mdu517.c b/sim/ucsim/s51.src/test/mdu517.c
new file mode 100644
index 0000000..6c6bed0
--- /dev/null
+++ b/sim/ucsim/s51.src/test/mdu517.c
@@ -0,0 +1,124 @@
+#include "c517.h"
+
+#include "mdu517.h"
+
+static uint16_t v;
+static uint32_t d;
+
+uint8_t
+mdu_32udiv16(uint32_t op1, uint16_t op2, uint32_t *res, uint16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD2= (op1 >> 16) & 0xff;
+ MD3= (op1 >> 24) & 0xff;
+
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ __asm__ ("nop");
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return ARCON & 0xc0;
+}
+
+uint8_t
+mdu_16udiv16(uint16_t op1, uint16_t op2, uint16_t *res, uint16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ __asm__ ("nop");
+
+ v= MD1*256 + MD0;
+ if (res)
+ *res= v;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return ARCON & 0xc0;
+}
+
+uint8_t
+mdu_16umul16(uint16_t op1, uint16_t op2, uint32_t *res)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD4= op2 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ __asm__ ("nop");
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+
+ return ARCON & 0x80;
+}
+
+uint8_t
+mdu_norm(uint32_t op, uint32_t *res, uint8_t *nuof_shifts)
+ __reentrant
+{
+ uint8_t a;
+
+ MD0= op & 0xff;
+ MD1= (op >> 8) & 0xff;
+ MD2= (op >> 16) & 0xff;
+ MD3= (op >> 24) & 0xff;
+ ARCON= 0;
+
+ __asm__ ("nop");
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ a= ARCON;
+ if (nuof_shifts)
+ *nuof_shifts= a & 0x1f;
+ return a & 0xc0;
+}
+
+uint8_t
+mdu_lshift(uint32_t op, uint8_t shifts, uint8_t right, uint32_t *res)
+ __reentrant
+{
+ MD0= op & 0xff;
+ MD1= (op >> 8) & 0xff;
+ MD2= (op >> 16) & 0xff;
+ MD3= (op >> 24) & 0xff;
+ ARCON= (right?0x20:0) + (shifts&0x1f);
+
+ __asm__ ("nop");
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ return ARCON & 0x80;
+}
+
+uint8_t
+mdu_lshift_left(uint32_t op, uint8_t shifts, uint32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 0, res);
+}
+
+uint8_t
+mdu_lshift_right(uint32_t op, uint8_t shifts, uint32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 1, res);
+}
diff --git a/sim/ucsim/s51.src/test/mdu517.h b/sim/ucsim/s51.src/test/mdu517.h
new file mode 100644
index 0000000..148017a
--- /dev/null
+++ b/sim/ucsim/s51.src/test/mdu517.h
@@ -0,0 +1,28 @@
+#ifndef MDU517_HEADER
+#define MDU517_HEADER
+
+#include <stdint.h>
+
+extern uint8_t mdu_32udiv16(uint32_t op1, uint16_t op2,
+ uint32_t *res, uint16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16udiv16(uint16_t op1, uint16_t op2,
+ uint16_t *res, uint16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16umul16(uint16_t op1, uint16_t op2,
+ uint32_t *res)
+ __reentrant;
+extern uint8_t mdu_norm(uint32_t op,
+ uint32_t *res, uint8_t *nuof_shifts)
+ __reentrant;
+extern uint8_t mdu_lshift(uint32_t op, uint8_t shifts, uint8_t right,
+ uint32_t *res)
+ __reentrant;
+extern uint8_t mdu_lshift_left(uint32_t op, uint8_t shifts,
+ uint32_t *res)
+ __reentrant;
+extern uint8_t mdu_lshift_right(uint32_t op, uint8_t shifts,
+ uint32_t *res)
+ __reentrant;
+
+#endif
diff --git a/sim/ucsim/s51.src/test/mdu88x.c b/sim/ucsim/s51.src/test/mdu88x.c
new file mode 100644
index 0000000..248fef6
--- /dev/null
+++ b/sim/ucsim/s51.src/test/mdu88x.c
@@ -0,0 +1,234 @@
+#include "xc88x.h"
+
+#include "mdu88x.h"
+
+static uint16_t v;
+static uint32_t d;
+
+/* unsigned OPs */
+
+uint8_t
+mdu_32udiv16(uint32_t op1, uint16_t op2, uint32_t *res, uint16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD2= (op1 >> 16) & 0xff;
+ MD3= (op1 >> 24) & 0xff;
+
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x02;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_16udiv16(uint16_t op1, uint16_t op2, uint16_t *res, uint16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x01;
+ while (MDUSTAT & 0x04) ;
+
+ v= MD1*256 + MD0;
+ if (res)
+ *res= v;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_16umul16(uint16_t op1, uint16_t op2, uint32_t *res)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD4= op2 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x00;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+
+ return MDUSTAT & 0x02;
+}
+
+/* signed OPs */
+
+uint8_t
+mdu_32sdiv16(int32_t op1, int16_t op2, int32_t *res, int16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD2= (op1 >> 16) & 0xff;
+ MD3= (op1 >> 24) & 0xff;
+
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x06;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_16sdiv16(int16_t op1, int16_t op2, int16_t *res, int16_t *rem)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD4= op2 & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x05;
+ while (MDUSTAT & 0x04) ;
+
+ v= MD1*256 + MD0;
+ if (res)
+ *res= v;
+ v= MD5*256 + MD4;
+ if (rem)
+ *rem= v;
+
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_16smul16(int16_t op1, int16_t op2, int32_t *res)
+ __reentrant
+{
+ MD0= op1 & 0xff;
+ MD4= op2 & 0xff;
+ MD1= (op1 >> 8) & 0xff;
+ MD5= (op2 >> 8) & 0xff;
+
+ MDUCON= 0x10 + 0x04;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+
+ return MDUSTAT & 0x02;
+}
+
+/* normalize */
+
+uint8_t
+mdu_norm(uint32_t op, uint32_t *res, uint8_t *nuof_shifts)
+ __reentrant
+{
+ MD0= op & 0xff;
+ MD1= (op >> 8) & 0xff;
+ MD2= (op >> 16) & 0xff;
+ MD3= (op >> 24) & 0xff;
+
+ MDUCON= 0x10 + 0x08;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ if (nuof_shifts)
+ *nuof_shifts= MD4 & 0x1f;
+ return MDUSTAT & 0x02;
+}
+
+/* logical shifts */
+
+uint8_t
+mdu_lshift(uint32_t op, uint8_t shifts, uint8_t right, uint32_t *res)
+ __reentrant
+{
+ MD0= op & 0xff;
+ MD1= (op >> 8) & 0xff;
+ MD2= (op >> 16) & 0xff;
+ MD3= (op >> 24) & 0xff;
+ MD4= (right?0x20:0) + (shifts&0x1f);
+
+ MDUCON= 0x10 + 0x03;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_lshift_left(uint32_t op, uint8_t shifts, uint32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 0, res);
+}
+
+uint8_t
+mdu_lshift_right(uint32_t op, uint8_t shifts, uint32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 1, res);
+}
+
+/* arithmetic shifts */
+
+uint8_t
+mdu_ashift(int32_t op, int8_t shifts, int8_t right, int32_t *res)
+ __reentrant
+{
+ MD0= op & 0xff;
+ MD1= (op >> 8) & 0xff;
+ MD2= (op >> 16) & 0xff;
+ MD3= (op >> 24) & 0xff;
+ MD4= (right?0x20:0) + (shifts&0x1f);
+
+ MDUCON= 0x10 + 0x07;
+ while (MDUSTAT & 0x04) ;
+
+ d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
+ if (res)
+ *res= d;
+ return MDUSTAT & 0x02;
+}
+
+uint8_t
+mdu_ashift_left(int32_t op, int8_t shifts, int32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 0, res);
+}
+
+uint8_t
+mdu_ashift_right(int32_t op, int8_t shifts, int32_t *res)
+ __reentrant
+{
+ return mdu_lshift(op, shifts, 1, res);
+}
diff --git a/sim/ucsim/s51.src/test/mdu88x.h b/sim/ucsim/s51.src/test/mdu88x.h
new file mode 100644
index 0000000..65d41b2
--- /dev/null
+++ b/sim/ucsim/s51.src/test/mdu88x.h
@@ -0,0 +1,60 @@
+#ifndef MDU88X_HEADER
+#define MDU88X_HEADER
+
+#include <stdint.h>
+
+/* unsigned OPs */
+
+extern uint8_t mdu_32udiv16(uint32_t op1, uint16_t op2,
+ uint32_t *res, uint16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16udiv16(uint16_t op1, uint16_t op2,
+ uint16_t *res, uint16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16umul16(uint16_t op1, uint16_t op2,
+ uint32_t *res)
+ __reentrant;
+
+/* signed OPs */
+
+extern uint8_t mdu_32sdiv16(int32_t op1, int16_t op2,
+ int32_t *res, int16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16sdiv16(int16_t op1, int16_t op2,
+ int16_t *res, int16_t *rem)
+ __reentrant;
+extern uint8_t mdu_16smul16(int16_t op1, int16_t op2,
+ int32_t *res)
+ __reentrant;
+
+/* normalize */
+
+extern uint8_t mdu_norm(uint32_t op,
+ uint32_t *res, uint8_t *nuof_shifts)
+ __reentrant;
+
+/* logical shifts */
+
+extern uint8_t mdu_lshift(uint32_t op, uint8_t shifts, uint8_t right,
+ uint32_t *res)
+ __reentrant;
+extern uint8_t mdu_lshift_left(uint32_t op, uint8_t shifts,
+ uint32_t *res)
+ __reentrant;
+extern uint8_t mdu_lshift_right(uint32_t op, uint8_t shifts,
+ uint32_t *res)
+ __reentrant;
+
+/* arithmetic shifts */
+
+extern uint8_t mdu_ashift(int32_t op, int8_t shifts, int8_t right,
+ int32_t *res)
+ __reentrant;
+extern uint8_t mdu_ashift_left(int32_t op, int8_t shifts,
+ int32_t *res)
+ __reentrant;
+extern uint8_t mdu_ashift_right(int32_t op, int8_t shifts,
+ int32_t *res)
+ __reentrant;
+
+#endif
diff --git a/sim/ucsim/s51.src/test/monitor.c b/sim/ucsim/s51.src/test/monitor.c
new file mode 100644
index 0000000..319d5a2
--- /dev/null
+++ b/sim/ucsim/s51.src/test/monitor.c
@@ -0,0 +1,65 @@
+#include <string.h>
+#include "hw.h"
+
+#include "serial.h"
+#include "print.h"
+
+__xdata char *simif;
+
+int cnt;
+
+void process(char *cmd)
+{
+ if (strstr(cmd, "test") == cmd)
+ {
+ cnt++;
+ print_c('_');print(cmd);print_c('_');
+ print_f("This is a test %d\n", cnt);
+ }
+ else if (strstr(cmd, "dump") == cmd)
+ {
+ int i;
+ print_c('_');print(cmd);print_c('_');
+ for (i= 0; i<100; i++)
+ {
+ print_cx(i);
+ print(" ");
+ }
+ print("\n----\n");
+ }
+ else
+ {
+ print("Unknown command: \"");print(cmd);print("\"\n");
+ }
+}
+
+__xdata char cmd[40];
+char ptr;
+
+void main(void)
+{
+ simif= (__xdata char *)0xffff;
+ serial_init(9600);
+ cmd[ptr=0]= 0;
+ print("Hello World!\n");
+ P1= 0;
+ while (1)
+ {
+ if (serial_received())
+ {
+ char c= serial_receive();
+ if ((c == '\n') ||
+ (c == '\r'))
+ {
+ process(cmd);
+ cmd[ptr=0]= 0;
+ }
+ else if (ptr < 39)
+ {
+ cmd[ptr++]= c;
+ cmd[ptr]= 0;
+ print("cmd=");print(cmd);print_c('\n');
+ }
+ }
+ }
+}
diff --git a/sim/ucsim/s51.src/test/monitor.mk b/sim/ucsim/s51.src/test/monitor.mk
new file mode 100644
index 0000000..6b5a99f
--- /dev/null
+++ b/sim/ucsim/s51.src/test/monitor.mk
@@ -0,0 +1,7 @@
+MAIN = monitor
+
+OTHERS = serial print
+
+include sdcc.mk
+
+MODEL = small
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);
+}
diff --git a/sim/ucsim/s51.src/test/print.h b/sim/ucsim/s51.src/test/print.h
new file mode 100644
index 0000000..3cd6ee2
--- /dev/null
+++ b/sim/ucsim/s51.src/test/print.h
@@ -0,0 +1,26 @@
+#ifndef PRINT_HEADER
+#define PRINT_HEADER
+
+
+extern void print(char *s) __reentrant;
+extern void print_form(char *s, long l, void *p) __reentrant;
+#define print_f(A,B) print_form((A),(B),0)
+#define print_fp(A,B) print_form((A),0,(B))
+extern void print_d(long i) __reentrant;
+extern void print_u(unsigned int i) __reentrant;
+extern void print_cx(unsigned char i);
+extern void print_x(unsigned int i) __reentrant;
+extern void print_lx(unsigned long i) __reentrant;
+extern void print_p(void *p) __reentrant;
+extern void print_c(char c);
+
+extern void term_cls();
+extern void term_xy(char x1, char y1);
+extern void term_save();
+extern void term_restore();
+extern void term_hide();
+extern void term_show();
+extern void term_color(int bg, int fg) __reentrant;
+
+
+#endif
diff --git a/sim/ucsim/s51.src/test/run.cmd b/sim/ucsim/s51.src/test/run.cmd
new file mode 100644
index 0000000..972da4f
--- /dev/null
+++ b/sim/ucsim/s51.src/test/run.cmd
@@ -0,0 +1,2 @@
+run
+state
diff --git a/sim/ucsim/s51.src/test/run.sh b/sim/ucsim/s51.src/test/run.sh
new file mode 100755
index 0000000..1be2743
--- /dev/null
+++ b/sim/ucsim/s51.src/test/run.sh
@@ -0,0 +1,30 @@
+PRJ=$1
+
+if [ -z "$PRJ" ]; then
+ PRJ=test_mdu88x
+fi
+
+if [ -f ${PRJ}.ihx ]; then
+ if [ -f ${PRJ}_conf.cmd ]; then
+ CONF="-C ${PRJ}_conf.cmd"
+ elif [ -f conf.cmd ]; then
+ CONF="-C conf.cmd"
+ else
+ CONF=""
+ fi
+ if [ -f ${PRJ}.type ]; then
+ TYPE="-t $(cat ${PRJ}.type)"
+ else
+ TYPE="-t 52"
+ fi
+ if [ -f ${PRJ}.cmd ]; then
+ CMD="../s51 ${TYPE} ${CONF} -S in=/dev/null,out=${PRJ}.out ${PRJ}.ihx"
+ echo $CMD
+ $CMD <${PRJ}.cmd | tee ${PRJ}.sim
+ else
+ CMD="../s51 ${TYPE} ${CONF} -Z6666 -S in=/dev/null,out=${PRJ}.out -G ${PRJ}.ihx"
+ echo $CMD
+ $CMD|tee ${PRJ}.sim
+ fi
+ cat ${PRJ}.out
+fi
diff --git a/sim/ucsim/s51.src/test/sdcc.mk b/sim/ucsim/s51.src/test/sdcc.mk
new file mode 100644
index 0000000..3945642
--- /dev/null
+++ b/sim/ucsim/s51.src/test/sdcc.mk
@@ -0,0 +1,46 @@
+CC = sdcc
+
+MODEL = large
+CPPFLAGS =
+CFLAGS = --debug --model-$(MODEL)
+LDFLAGS =
+LIBS =
+
+ALL = $(MAIN) $(OTHERS)
+OBJECTS = $(MAIN).rel $(OTHERS:=.rel)
+
+APP ?= $(MAIN)
+
+all: $(APP).hex
+
+dep: $(APP).dep
+
+$(APP).dep: $(OBJECTS:.rel=.c) *.h
+ @>$(APP).dep
+ @for c in $(OBJECTS:.rel=.c); do \
+ $(CC) -MM $(CPPFALGS) $$c >>$(APP).dep ;\
+ done
+
+include $(APP).dep
+
+$(APP).ihx: $(OBJECTS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $@
+
+.SUFFIXES: .rel .ihx .hex
+
+.c.rel:
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
+
+.ihx.hex:
+ packihx $< >$@
+
+clean:
+ rm -f $(ALL:=.rel) $(ALL:=.asm) $(ALL:=.lst) $(ALL:=.rst) $(ALL:=.sym) $(ALL:=.adb)
+ rm -f $(MAIN).ihx $(MAIN).hex $(MAIN).lk $(MAIN).map $(MAIN).mem $(MAIN).cdb $(MAIN).omf $(MAIN).noi
+ rm -f $(APP).ihx $(APP).hex $(APP).lk $(APP).map $(APP).mem $(APP).cdb $(APP).omf $(APP).noi
+ rm -f *~
+ rm -f $(MAIN).dep $(APP).dep
+ rm -f $(MAIN).sim $(APP).sim
+
+
+# End of sdcc.mk
diff --git a/sim/ucsim/s51.src/test/serial.c b/sim/ucsim/s51.src/test/serial.c
new file mode 100644
index 0000000..2c5f385
--- /dev/null
+++ b/sim/ucsim/s51.src/test/serial.c
@@ -0,0 +1,216 @@
+#include "hw.h"
+
+#if defined __SDCC || defined SDCC
+#elif defined __C51__
+
+#else /* IAR4 */
+#include <stdio.h>
+#endif
+
+#include "serial.h"
+
+extern __xdata char *simif;
+
+volatile unsigned char serial_buffer[SERIAL_BUFFER_SIZE];
+volatile unsigned char first_occupied, first_free;
+volatile bit serial_sent;
+
+unsigned char
+serial_nuof_received()
+{
+ if (first_free == first_occupied)
+ return 0;
+ else if (first_free > first_occupied)
+ return first_free - first_occupied;
+ else
+ return SERIAL_BUFFER_SIZE - (first_occupied - first_free);
+}
+
+/* Serial line ISR puts received chars into a ring buffer */
+
+#if defined __SDCC || defined SDCC
+void serial_isr(void) __interrupt (4)
+#elif defined __C51__
+void serial_isr(void) interrupt 4
+#else /* IAR4 */
+interrupt void SCON_int(void)
+#endif
+{
+ if (RI)
+ {
+ unsigned char c;
+ unsigned char new, nr;
+ c= SBUF;
+ new= first_free+1;
+ new= new % SERIAL_BUFFER_SIZE;
+ *simif= 'p';*simif= '|';
+ *simif= 'p';*simif= c;
+ *simif= 'p';*simif= '|';
+ if (new != first_occupied)
+ {
+ serial_buffer[first_free]= c;
+ first_free= new;
+ }
+ else
+ {
+ *simif= 'p';*simif= '*';
+ *simif= 'p';*simif= c;
+ *simif= 'p';*simif= '*';
+ P1++;
+ }
+ nr= serial_nuof_received();
+ *simif= 'p';*simif= '/';
+ *simif= 'p';*simif= nr+'0';
+ *simif= 'p';*simif= '/';
+ RI= 0;
+ P0= first_free<<4 + first_occupied;
+ }
+ else if (TI)
+ {
+ serial_sent= 1;
+ TI= 0;
+ }
+}
+
+
+#if defined __SDCC || defined SDCC
+static __sfr __at(0x97) s97;
+#elif defined __C51__
+static sfr s97= 0x97;
+#endif
+
+/* Initialization of serial line */
+
+void
+serial_init(long int br)
+{
+ /* Set variables */
+ first_free= first_occupied= 0;
+ if (!(serial_sent= 1))
+ serial_dummy();
+
+ /* Set USART mode: 8 bit variable speed */
+ SCON= 0x40;
+ ES= 1;
+ REN= 1;
+
+ s97= 0xf0;
+ s97= 0x55;
+ if (s97 == 0x55)
+ {
+ beallitas();
+ return;
+ }
+
+ /* Set Timer2 as baudrate generator, XTAL=11.0592MHz */
+ C_T2= 0;
+ CP_RL2= 0;
+ {
+ long int l= (3*115200)/br;
+ TL2= RCAP2L= (65536-l)&0xff; /* 3=115200,6=57600,9=38400,18=19200,36=9600 */
+ TH2= RCAP2H= (65536-l)/256;
+ }
+ RCLK= 1;
+ TCLK= 1;
+ TR2= 1;
+
+ /* Start */
+ EA= 1; /* Enable interrupts */
+}
+
+
+void
+beallitas(void)
+{
+ /* Valtozok beallitasa */
+ if (first_occupied= 0)
+ ;/*serial_dummy();*/
+ first_free= 0;
+ serial_sent= 1;
+
+ /* Timer1 beallitasa 9600 baud-os sebesseg generalasahoz */
+ TMOD= (TMOD & 0x0f) | 0x20;
+ TH1= 0xfd;
+ TL1= 0xfd;
+ PCON&= 0x7f; /* SMOD=0 */
+ ET1= 0;
+
+ /* Soros vonal beallitasa, 8 bites valtoztathato sebessegu mod */
+ SCON= 0x40;
+ ES= 1;
+ REN= 1;
+
+ /* Start */
+ TR1= 1; /* Idozito indul */
+ EA= 1; /* Megszakitasok engedelyezese */
+}
+
+
+/************************************************** Low level line handling */
+
+/* Blocking send */
+
+unsigned char
+serial_send(unsigned char c)
+{
+ while (!serial_sent) ;
+ SBUF= c;
+ serial_sent= 0;
+ return c;
+}
+
+void
+putchar(char c)
+{
+ serial_send(c);
+}
+
+
+/* Check for recived chars */
+
+unsigned char
+serial_received(void)
+{
+ return first_free != first_occupied;
+}
+
+
+/* Blocking receive */
+
+unsigned char
+serial_receive(void)
+{
+ unsigned char c, nr;
+
+ while (!serial_received()) ;
+ ES= 0;
+ c= serial_buffer[first_occupied++];
+ first_occupied%= SERIAL_BUFFER_SIZE;
+ nr= serial_nuof_received();
+ *simif= 'p';*simif= '@';
+ *simif= 'p';*simif= nr+'0';
+ *simif= 'p';*simif= '@';
+ ES= 1;
+ return c;
+}
+
+char
+getchar(void)
+{
+ return serial_send(serial_receive());
+}
+
+
+void
+serial_dummy(void)
+{
+ serial_init(0);
+ beallitas();
+ serial_send(0);
+ serial_received();
+ putchar(0);
+ getchar();
+}
+
+
+/* End of serial.c */
diff --git a/sim/ucsim/s51.src/test/serial.h b/sim/ucsim/s51.src/test/serial.h
new file mode 100644
index 0000000..d9d9279
--- /dev/null
+++ b/sim/ucsim/s51.src/test/serial.h
@@ -0,0 +1,32 @@
+#ifndef SERIAL_HEADER
+#define SERIAL_HEADER
+
+
+#define SERIAL_BUFFER_SIZE 8
+
+#if defined __SDCC || defined SDCC
+extern void serial_isr(void) __interrupt(4);
+#elif defined __C51__
+extern void serial_isr(void);
+#else /* IAR4 */
+interrupt void SCON_int(void);
+#endif
+
+extern void serial_init(long int br);
+extern void beallitas(void);
+
+extern unsigned char serial_send(unsigned char c);
+extern unsigned char serial_received(void);
+extern unsigned char serial_receive(void);
+extern unsigned char serial_nuof_received();
+
+#define kikuld(c) serial_send(c)
+#define vetel_volt() serial_received()
+#define vett() serial_receive()
+
+extern void serial_dummy(void);
+
+
+#endif
+
+/* End of serial.h */
diff --git a/sim/ucsim/s51.src/test/st.cmd b/sim/ucsim/s51.src/test/st.cmd
new file mode 100644
index 0000000..746cf38
--- /dev/null
+++ b/sim/ucsim/s51.src/test/st.cmd
@@ -0,0 +1,4 @@
+break xram r 0xfffe
+run
+state
+quit
diff --git a/sim/ucsim/s51.src/test/st.sh b/sim/ucsim/s51.src/test/st.sh
new file mode 100755
index 0000000..df4426d
--- /dev/null
+++ b/sim/ucsim/s51.src/test/st.sh
@@ -0,0 +1,108 @@
+TEST=""
+S51v5=s515
+S51v6=s516
+VER=6
+S51=$S51v6
+
+PROF=""
+
+while [ -n "$1" ]; do
+ case "$1" in
+ -6)
+ S51=$S51v6
+ VER=6
+ shift
+ ;;
+ -5)
+ S51=$S51v5
+ VER=5
+ shift
+ ;;
+ -v)
+ shift
+ S51=s51-${1}
+ VER="${1}"
+ shift
+ ;;
+ -X)
+ S51=$S51vX
+ VER=X
+ shift
+ ;;
+ -p)
+ PROF="p"
+ shift
+ ;;
+ -P)
+ shift
+ TEST="$1"
+ CMD="gprof ${S51}p st${TEST}_v${VER}_gmon.out"
+ echo $CMD
+ $CMD
+ exit 0
+ ;;
+ *)
+ TEST="$1"
+ shift
+ ;;
+ esac
+done
+
+if [ -n "$PROF" ]; then
+ S51=${S51}p
+fi
+
+echo -e "*\n* st${TEST}\n*\n"
+
+make -f st${TEST}.mk clean all
+
+SIM=st${TEST}${VER}.sim
+OUT=st${TEST}${VER}.out
+TIM=st${TEST}${VER}.tim
+CSV=st${TEST}${VER}.csv
+CMD=st${TEST}${VER}.cmd
+
+rm -f $SIM $OUT $TIM $CSV
+
+>$CMD
+echo "set hardware simif xram 0xffff" >>$CMD
+echo "set hardware simif fout \"st${TEST}${VER}.sout\"" >>$CMD
+cat st.cmd >>$CMD
+
+ls -l st${TEST}.ihx
+
+/usr/bin/time -o $TIM -f '
+Elapsed\t%e
+Kernel\t%S
+User\t%U
+In\t%I
+Out\t%O
+SwT\t%c
+SwIO\t%w
+MaxFlt\t%F
+MinFlt\t%R
+Swaps\t%W
+Mem\t%M
+Unshr\t%D
+' $S51 -tC52 -Sin=/dev/null,out=$OUT st${TEST}.ihx <$CMD|tee $SIM
+tee -a $SIM <$TIM
+
+if [ -n "$PROF" ]; then
+ mv gmon.out st${TEST}_v${VER}_gmon.out
+fi
+
+E=$(grep Elapsed $SIM)
+#echo
+#echo $E
+
+E=$(echo $E|cut -d ' ' -f 2)
+C=$(grep 'Total time' $SIM|sed 's/^[^(]*(//'|sed 's/ .*//')
+S=$(echo "scale=3;${C}/${E}/1000000"|bc)
+ST=$(grep 'Simulated ' $SIM|cut -d' ' -f5)
+echo "st${TEST} speed= $S Mclk/sec"|tee -a $SIM
+
+echo "st${TEST},${VER},${E},${S}"|tee $CSV
+
+echo $E >st${TEST}${VER}_e.txt
+echo $ST >st${TEST}${VER}_st.txt
+echo $S >st${TEST}${VER}_s.txt
diff --git a/sim/ucsim/s51.src/test/st_list.txt b/sim/ucsim/s51.src/test/st_list.txt
new file mode 100644
index 0000000..c8e13e7
--- /dev/null
+++ b/sim/ucsim/s51.src/test/st_list.txt
@@ -0,0 +1,8 @@
+n
+p
+rr
+s
+t
+xr
+xrw
+xw
diff --git a/sim/ucsim/s51.src/test/stest.sh b/sim/ucsim/s51.src/test/stest.sh
new file mode 100755
index 0000000..4f60a55
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stest.sh
@@ -0,0 +1,51 @@
+VERS="504 505 606 610 615 620 625 645"
+
+TESTS=$(cat st_list.txt)
+
+rm -f *.csv
+echo -n "versions " >st_e.csv
+echo -n "versions " >st_st.csv
+echo -n "versions " >st_s.csv
+for v in $VERS; do
+ echo -n ", v${v}" >>st_e.csv
+ echo -n ", v${v}" >>st_st.csv
+ echo -n ", v${v}" >>st_s.csv
+done
+echo >>st_e.csv
+echo >>st_st.csv
+echo >>st_s.csv
+
+for t in $TESTS; do
+ for v in $VERS; do
+ make -f st${t}.mk clean all
+ ./st.sh -v $v $t
+ done
+
+ (
+ echo -n "st${t} "
+ for v in $VERS; do
+ echo -n ", $(cat st${t}${v}_e.txt) "
+ done
+ echo
+ ) >st${t}_e.csv
+ cat st${t}_e.csv >>st_e.csv
+
+ (
+ echo -n "st${t} "
+ for v in $VERS; do
+ echo -n ", $(cat st${t}${v}_st.txt) "
+ done
+ echo
+ ) >st${t}_st.csv
+ cat st${t}_st.csv >>st_st.csv
+
+ (
+ echo -n "st${t} "
+ for v in $VERS; do
+ echo -n ", $(cat st${t}${v}_s.txt) "
+ done
+ echo
+ ) >st${t}_s.csv
+ cat st${t}_s.csv >>st_s.csv
+
+done
diff --git a/sim/ucsim/s51.src/test/stn.c b/sim/ucsim/s51.src/test/stn.c
new file mode 100644
index 0000000..b5048bf
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stn.c
@@ -0,0 +1,35 @@
+char c1;
+char *ptr1_data;
+char *ptr2_idata;
+char *ptr3_pdata;
+char *ptr4_xdata;
+char *ptr5_code;
+char c2;
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i, j;
+ volatile __xdata int xi;
+ volatile int __xdata xii;
+
+ sif= (unsigned char __xdata *)0xffff;
+ xi= 1;
+ xii= 2;
+ c1= 'A';
+ c2= 'B';
+
+ for (j= 0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ {
+ ptr1_data = (__data char *)(0x1122); // 22 00 40
+ ptr2_idata= (__idata char *)(0x3344); // 44 00 40
+ ptr3_pdata= (__pdata char *)(0x5566); // 66 00 60
+ ptr4_xdata= (__xdata char *)(0x7788); // 88 77 00
+ ptr5_code = (__code char *)(0x99aa); // aa 99 80
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stn.mk b/sim/ucsim/s51.src/test/stn.mk
new file mode 100644
index 0000000..697ba4f
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stn.mk
@@ -0,0 +1,5 @@
+MAIN = stn
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/stp.c b/sim/ucsim/s51.src/test/stp.c
new file mode 100644
index 0000000..12c31b5
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stp.c
@@ -0,0 +1,20 @@
+#include "hw.h"
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i, j;
+ sif= (unsigned char __xdata *)0xffff;
+ for (j= 0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ {
+ P0= P1+1;
+ P1++;
+ P2= P3+1;
+ P3++;
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stp.mk b/sim/ucsim/s51.src/test/stp.mk
new file mode 100644
index 0000000..d034b33
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stp.mk
@@ -0,0 +1,5 @@
+MAIN = stp
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/strr.c b/sim/ucsim/s51.src/test/strr.c
new file mode 100644
index 0000000..d1cc203
--- /dev/null
+++ b/sim/ucsim/s51.src/test/strr.c
@@ -0,0 +1,16 @@
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i, j, x;
+ __code char *p= (__code char *)0;
+
+ sif= (unsigned char __xdata *)0xffff;
+ for (j= 0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ x= p[i];
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/strr.mk b/sim/ucsim/s51.src/test/strr.mk
new file mode 100644
index 0000000..bb27978
--- /dev/null
+++ b/sim/ucsim/s51.src/test/strr.mk
@@ -0,0 +1,5 @@
+MAIN = strr
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/sts.c b/sim/ucsim/s51.src/test/sts.c
new file mode 100644
index 0000000..3cd9ffa
--- /dev/null
+++ b/sim/ucsim/s51.src/test/sts.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include "serial.h"
+#include "print.h"
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i;
+ __code char *p= (__code char *)0;
+
+ sif= (unsigned char __xdata *)0xffff;
+ serial_init(19200);
+ for (i= 1; i<0x4000; i++)
+ {
+ print_cx(p[i]);
+ putchar('\n');
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/sts.mk b/sim/ucsim/s51.src/test/sts.mk
new file mode 100644
index 0000000..743aaac
--- /dev/null
+++ b/sim/ucsim/s51.src/test/sts.mk
@@ -0,0 +1,7 @@
+MAIN = sts
+
+OTHERS = serial print
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/stt.c b/sim/ucsim/s51.src/test/stt.c
new file mode 100644
index 0000000..a9905e1
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stt.c
@@ -0,0 +1,68 @@
+#include "hw.h"
+#include "timer.h"
+#include "t0.h"
+
+unsigned char __xdata * volatile sif;
+
+volatile unsigned int tr;
+
+void t0_isr(void) __interrupt (1)
+{
+ T0set(tr);
+}
+
+int var;
+__data int dvar;
+__idata int ivar;
+__xdata int xvar;
+__pdata int pvar;
+__code int cvar;
+__sfr __at(0x81) svar;
+__bit bvar;
+
+void
+fn(void)
+{
+ volatile int fn_local;
+ volatile int fn_hide;
+ fn_local= fn_hide= 1;
+ {
+ volatile int fn_blocked, fn_hide;
+ fn_blocked= fn_hide= 2;
+ }
+}
+
+void
+sfun(void)
+{
+ return ;
+}
+
+void
+main(void)
+{
+ volatile unsigned int i, x= 0, j;
+ __xdata char *p= (__xdata char *)0;
+
+ bvar= 1;
+ sif= (unsigned char __xdata *)0xffff;
+ tr= T_kezdoertek(10);
+ T0idozito1(0);
+ T0beallit(tr);
+ T0start();
+ ET0= 1;
+ EA= 1;
+
+ for (j=0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ {
+ char c= p[i];
+ unsigned int t= TL0 + (TH0*256);
+ p[i]= t&0xff;
+ if (p[i] != t&0xff)
+ x++;
+ p[i]= c;
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stt.mk b/sim/ucsim/s51.src/test/stt.mk
new file mode 100644
index 0000000..0bab42e
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stt.mk
@@ -0,0 +1,7 @@
+MAIN = stt
+
+OTHERS = timer t0 serial
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/stt_large.mk b/sim/ucsim/s51.src/test/stt_large.mk
new file mode 100644
index 0000000..92da79b
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stt_large.mk
@@ -0,0 +1,8 @@
+APP = stt_large
+MAIN = stt
+
+OTHERS = timer t0 serial
+
+include sdcc.mk
+
+MODEL = large
diff --git a/sim/ucsim/s51.src/test/stt_small.mk b/sim/ucsim/s51.src/test/stt_small.mk
new file mode 100644
index 0000000..71672be
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stt_small.mk
@@ -0,0 +1,8 @@
+APP = stt_small
+MAIN = stt
+
+OTHERS = timer t0 serial
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/stxr.c b/sim/ucsim/s51.src/test/stxr.c
new file mode 100644
index 0000000..93bc16d
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxr.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+
+unsigned char __xdata * volatile sif;
+
+int putchar(int c)
+{
+ *sif='p';*sif=c;
+}
+
+void
+main(void)
+{
+ volatile unsigned int i, x, j;
+ __xdata char *p= (__xdata char *)0;
+
+ sif= (unsigned char __xdata *)0xffff;
+ for (j= 0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ {
+ //printf("j=%4x i=%4x\n", j, i);
+ x= p[i];
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stxr.mk b/sim/ucsim/s51.src/test/stxr.mk
new file mode 100644
index 0000000..710a3e3
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxr.mk
@@ -0,0 +1,5 @@
+MAIN = stxr
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/stxrw.c b/sim/ucsim/s51.src/test/stxrw.c
new file mode 100644
index 0000000..db12a80
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxrw.c
@@ -0,0 +1,22 @@
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i, x= 0, j;
+ __xdata char *p= (__xdata char *)0;
+
+ sif= (unsigned char __xdata *)0xffff;
+ for (j=0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ {
+ char c= p[i];
+ p[i]= i&0xff;
+ if (p[i] != i&0xff)
+ x++;
+ p[i]= c;
+ }
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stxrw.mk b/sim/ucsim/s51.src/test/stxrw.mk
new file mode 100644
index 0000000..33939bf
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxrw.mk
@@ -0,0 +1,3 @@
+MAIN = stxrw
+
+include sdcc.mk
diff --git a/sim/ucsim/s51.src/test/stxw.c b/sim/ucsim/s51.src/test/stxw.c
new file mode 100644
index 0000000..a2232d2
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxw.c
@@ -0,0 +1,16 @@
+
+unsigned char __xdata * volatile sif;
+
+void
+main(void)
+{
+ volatile unsigned int i, j;
+ __xdata char *p= (__xdata char *)0;
+
+ sif= (unsigned char __xdata *)0xffff;
+ for (j=0; j<10; j++)
+ for (i= 0; i<0xfff0; i++)
+ p[i]= i&0xff;
+ * (char __idata *) 0 = * (char __xdata *) 0xfffe;
+ *sif= 's';
+}
diff --git a/sim/ucsim/s51.src/test/stxw.mk b/sim/ucsim/s51.src/test/stxw.mk
new file mode 100644
index 0000000..36d7ba1
--- /dev/null
+++ b/sim/ucsim/s51.src/test/stxw.mk
@@ -0,0 +1,5 @@
+MAIN = stxw
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/t0.c b/sim/ucsim/s51.src/test/t0.c
new file mode 100644
index 0000000..bb8c42b
--- /dev/null
+++ b/sim/ucsim/s51.src/test/t0.c
@@ -0,0 +1,89 @@
+/*
+ t0.c
+ Segedlet a T0 idozito/szamlalo kezelesehez
+ (c) Drotos Daniel, 2005
+*/
+
+#include "hw.h"
+#include <stdio.h>
+
+#include "timer.h"
+#include "t0.h"
+
+
+
+/* Adott idoziteshez szukseges szamlalo kezdoerteket szamolja ki.
+ A parametert msec-ben kell megadni (kb 0.02-71 kozott) */
+
+unsigned int T0kezdoertek(float ido /* msec */)
+{
+ return T_kezdoertek(ido);
+}
+
+
+/* Idozito uzemmod */
+
+void T0idozito1(bool kapuzott)
+{
+ TR0= 0;
+ TMOD&= 0xf0;
+ TMOD|= 0x01;
+ if (kapuzott)
+ TMOD|= 0x08;
+}
+
+
+/* Szamlalo uzemmod */
+
+void T0szamlalo(bool kapuzott)
+{
+ TR0= 0;
+ TMOD&= 0xf0;
+ TMOD|= 0x01;
+ TMOD|= 0x04;
+ if (kapuzott)
+ TMOD|= 0x08;
+}
+
+
+/* Szamlalo ertek beallitasa */
+
+void T0beallit(unsigned int kezdoertek)
+{
+ TH0= kezdoertek >> 8;
+ TL0= kezdoertek & 0xff;
+}
+
+
+/* Szamlalo ertek beallitasa */
+
+void T0ujratolt(unsigned int kezdoertek)
+{
+ TH0= kezdoertek >> 8;
+ TL0= kezdoertek & 0xff;
+}
+
+
+/* A szamlalo aktualis allapota usec-ben */
+
+float T0eltelt_us(void)
+{
+ unsigned char h, l;
+ h= TH0;
+ l= TL0;
+ return (12.0/Fosc) * ((unsigned int)(h*256+l));
+}
+
+
+/* A szamlalo tulcsordulasaig hatralevo ido usec-ben */
+
+float T0hatravan_us(void)
+{
+ unsigned char h, l;
+ h= TH0;
+ l= TL0;
+ return (12.0/Fosc) * (0x10000 - (unsigned int)(h*256+l));
+}
+
+
+/* End of t0.c */
diff --git a/sim/ucsim/s51.src/test/t0.h b/sim/ucsim/s51.src/test/t0.h
new file mode 100644
index 0000000..528bd91
--- /dev/null
+++ b/sim/ucsim/s51.src/test/t0.h
@@ -0,0 +1,82 @@
+/*
+ T0.h
+ Segedlet a T0 idozito hasznalatahoz
+ (c) Drotos Daniel, 2005
+*/
+
+#ifndef T0_HEADER
+#define T0_HEADER
+
+#ifndef bool
+#define bool char
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+/*
+ A megadott ideig tarto idoziteshez szukseges
+ szamlalo kezdoerteket szamolja ki. Az idot
+ msec-ben kell megadni, kb 0.02-71.1 kozott.
+ Felhasznalja az Fosc erteket a szamitashoz.
+*/
+extern unsigned int T0kezdoertek(float ido);
+
+
+/*
+ Beallitja a T0-t idozito 1 uzemmodba (leallitja
+ a szamlalot)
+*/
+extern void T0idozito1(bool kapuzott);
+
+
+/*
+ Beallitja a T0-t szamlalo uzemmodba (leallitja
+ a szamlalot.
+*/
+extern void T0szamlalo(bool kapuzott);
+
+
+/*
+ Ez a ket fuggveny a szamlalo aktualis erteket
+ modositja. Egyforma a ketto, az egyik pl a foprogrambol,
+ mig a masik a megszakitas kezelobol hivhato.
+*/
+extern void T0beallit(unsigned int kezdoertek);
+extern void T0ujratolt(unsigned int kezdoertek);
+
+#define T0set(x) { TH0=(x)>>8;TL0=(x)&0xff; }
+
+
+/*
+ A szamlalo elinditasahoz es leallitasahoz hasznalhato
+ makrok
+*/
+#define T0start() TR0=1
+#define T0stop() TR0=0
+
+
+/*
+ A szamlalo aktualis allapota es a tulcsordulasig hatralevo
+ ido usec-ben
+*/
+extern float T0eltelt_us(void);
+extern float T0hatravan_us(void);
+
+/*
+ A szamlalo aktualis allapota es a tulcsordulasig hatralevo
+ ido msec-ben
+*/
+#define T0eltelt() (T0eltelt_us()/1000.0)
+#define T0hatravan() (T0hatravan_us()/1000.0)
+
+
+#endif
+
+/* End of T0.h */
diff --git a/sim/ucsim/s51.src/test/test_extit.c b/sim/ucsim/s51.src/test/test_extit.c
new file mode 100644
index 0000000..f61fd41
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_extit.c
@@ -0,0 +1,15 @@
+#include <reg51.h>
+
+sfr at 0xa6 WDTRST;
+
+void jaj() interrupt 0 { P2= P0; P0++; }
+
+void main()
+{
+ IT0=0; /* low level triggered */
+ IT0=1; /* falling edge triggered */
+ EX0=1; /* enable ex #0 */
+ EA=1;
+ P0=0;
+ for(;;);
+}
diff --git a/sim/ucsim/s51.src/test/test_idlepd.c b/sim/ucsim/s51.src/test/test_idlepd.c
new file mode 100644
index 0000000..56b6aaa
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_idlepd.c
@@ -0,0 +1,35 @@
+#include <reg51.h>
+
+sfr at 0xa6 WDTRST;
+
+void jaj_ex0() interrupt 0 { P2= P0; }
+
+void jaj_t0() interrupt 1 { P2= P0; }
+
+void main()
+{
+ TH0= 0x80;
+ TL0= 0x80;
+ TMOD= 0x02;
+
+ IT0=0; /* low level triggered */
+ IT0=1; /* falling edge triggered */
+ EX0=1; /* enable ex #0 */
+ ET0=1; /* en t0 */
+
+ TR0= 1;
+
+ EA=1;
+ P0=0;
+ while (1)
+ {
+ P0= 0;
+ PCON|= 1;/*idle*/
+ P0++;
+ P0++;
+ P0++;
+ }
+ WDTRST= 0x1e;
+ WDTRST= 0xe1;
+ PCON|= 2;/*pd*/
+}
diff --git a/sim/ucsim/s51.src/test/test_mdu517.c b/sim/ucsim/s51.src/test/test_mdu517.c
new file mode 100644
index 0000000..494fdc7
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu517.c
@@ -0,0 +1,284 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "hw.h"
+#include "serial.h"
+#include "print.h"
+
+#include "c517.h"
+
+#include "mdu517.h"
+
+__xdata char *simif;
+
+unsigned long lop1, lop2, lres, mdu_lres;
+unsigned int iop1, iop2, ires1, ires2, mdu_ires1, mdu_ires2;
+
+int ok, fail, i;
+uint8_t r, shifts;
+
+void
+test_32div16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ lop1= labs(rand()) * abs(rand());
+ do {
+ iop2= abs(rand()) * abs(rand()%3);
+ }
+ while (!iop2);
+
+ lres= lop1 / iop2;
+ ires1= lop1 % iop2;
+
+ if (verbose)
+ printf("%8lx/%4x %10lu/%5u=%10lu,%5u ", lop1, iop2, lop1, iop2, lres, ires1);
+ r= mdu_32udiv16(lop1, iop2, &mdu_lres, &mdu_ires1);
+ if (verbose)
+ printf("mdu=%10lu,%5u ", mdu_lres, mdu_ires1);
+ if ((lres != mdu_lres) ||
+ (ires1 != mdu_ires1))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ if (r&0x40)
+ printf("ovr ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("32div16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16div16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ iop1= abs(rand()) * 1+abs(rand()%2);
+ do {
+ iop2= abs(rand());
+ }
+ while (!iop2);
+
+ ires1= iop1 / iop2;
+ ires2= iop1 % iop2;
+
+ if (verbose)
+ printf("%4x/%4x %5u/%5u=%5u,%5u ", iop1, iop2, iop1, iop2, ires1, ires2);
+ r= mdu_16udiv16(iop1, iop2, &mdu_ires1, &mdu_ires2);
+ if (verbose)
+ printf("mdu=%5u,%5u ", mdu_ires1, mdu_ires2);
+ if ((ires1 != mdu_ires1) ||
+ (ires2 != mdu_ires2))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ if (r&0x40)
+ printf("ovr ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16div16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16mul16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ iop1= abs(rand()) /*+abs(rand())*/;
+ iop2= abs(rand()) /*+abs(rand())*/;
+
+ lres= (unsigned long)iop1 * (unsigned long)iop2;
+
+ if (verbose)
+ printf("%4x*%4x %5u*%5u=%10lu ", iop1, iop2, iop1, iop2, lres);
+ r= mdu_16umul16(iop1, iop2, &mdu_lres);
+ if (verbose)
+ printf("mdu=%10lu ", mdu_lres);
+ if (lres != mdu_lres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16mul16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_norm(char verbose)
+{
+ uint8_t mdu_shifts;
+
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do
+ {
+ lop1= labs(rand()) * abs(rand());
+ }
+ while (lop1 == 0);
+
+ if (lop1 & 0x80000000)
+ {
+ lres= lop1;
+ shifts= 0;
+ }
+ else
+ {
+ shifts= 0;
+ lres= lop1;
+ while ((lres & 0x80000000) == 0)
+ {
+ lres<<= 1;
+ shifts++;
+ }
+ }
+
+ if (verbose)
+ printf("%8lx< %10lu=%8lx,%2d ", lop1, lop1, lres, shifts);
+ r= mdu_norm(lop1, &mdu_lres, &mdu_shifts);
+ if (verbose)
+ printf("mdu=%8lx,%2d ", mdu_lres, mdu_shifts);
+ if ((lres != mdu_lres) ||
+ (shifts != mdu_shifts))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ if (r&0x40)
+ printf("ovr ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("norm test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_shift(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do
+ {
+ lop1= labs(rand()) * abs(rand());
+ }
+ while (lop1 == 0);
+ do {
+ shifts= rand() & 0x1f;
+ }
+ while (shifts==0);
+
+ r= rand() & 1;
+
+ if (r)
+ lres= lop1 << shifts;
+ else
+ lres= lop1 >> shifts;
+
+ if (verbose)
+ printf("%8lx%c%2d=%8lx ", lop1, r?'<':'>', shifts, lres);
+ r= mdu_lshift(lop1, shifts, r, &mdu_lres);
+ if (verbose)
+ printf("mdu=%8lx ", mdu_lres);
+ if (lres != mdu_lres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("shift test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void main(void)
+{
+ simif= (__xdata char *)0xffff;
+ serial_init(9600);
+
+ test_32div16(0);
+ test_16div16(0);
+ test_16mul16(0);
+ test_norm(0);
+ test_shift(0);
+
+ *simif= 's';
+ while (1)
+ {
+ }
+}
diff --git a/sim/ucsim/s51.src/test/test_mdu517.mk b/sim/ucsim/s51.src/test/test_mdu517.mk
new file mode 100644
index 0000000..ade26b7
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu517.mk
@@ -0,0 +1,7 @@
+MAIN = test_mdu517
+
+OTHERS = serial print mdu517
+
+include sdcc.mk
+
+MODEL = large
diff --git a/sim/ucsim/s51.src/test/test_mdu517.type b/sim/ucsim/s51.src/test/test_mdu517.type
new file mode 100644
index 0000000..4f95481
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu517.type
@@ -0,0 +1 @@
+517 \ No newline at end of file
diff --git a/sim/ucsim/s51.src/test/test_mdu88x.c b/sim/ucsim/s51.src/test/test_mdu88x.c
new file mode 100644
index 0000000..b519c76
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu88x.c
@@ -0,0 +1,488 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "hw.h"
+#include "serial.h"
+#include "print.h"
+
+#include "xc88x.h"
+
+#include "mdu88x.h"
+
+__xdata char *simif;
+
+unsigned long lop1, lop2, lres, mdu_lres;
+unsigned int iop1, iop2, ires1, ires2, mdu_ires1, mdu_ires2;
+
+signed long slop1, slop2, slres, mdu_slres;
+signed int siop1, siop2, sires1, sires2, mdu_sires1, mdu_sires2;
+
+int ok, fail, i;
+uint8_t r, shifts;
+
+void
+test_32div16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ lop1= labs(rand()) * abs(rand());
+ do {
+ iop2= abs(rand()) * abs(rand()%3);
+ }
+ while (!iop2);
+
+ lres= lop1 / iop2;
+ ires1= lop1 % iop2;
+
+ if (verbose)
+ printf("%8lx/%4x %10lu/%5u=%10lu,%5u ", lop1, iop2, lop1, iop2, lres, ires1);
+ r= mdu_32udiv16(lop1, iop2, &mdu_lres, &mdu_ires1);
+ if (verbose)
+ printf("mdu=%10lu,%5u ", mdu_lres, mdu_ires1);
+ if ((lres != mdu_lres) ||
+ (ires1 != mdu_ires1))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("32udiv16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_32sdiv16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do {
+ slop1= (long)rand() * rand() * (rand()%3-1);
+ }
+ while (!slop1);
+ do {
+ siop2= rand() * (rand()%3-1);
+ }
+ while (!siop2);
+
+ slres= slop1 / siop2;
+ sires1= slop1 % siop2;
+
+ if (verbose)
+ printf("%8lx/%4x %+11ld/%+6d=%+11ld,%+6d ",
+ slop1, siop2,
+ slop1, siop2,
+ slres, sires1);
+ r= mdu_32sdiv16(slop1, siop2, &mdu_slres, &mdu_sires1);
+ if (verbose)
+ printf("mdu=%+11ld,%+6d ",
+ mdu_slres, mdu_sires1);
+ if ((slres != mdu_slres) ||
+ (sires1 != mdu_sires1))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("32sdiv16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16div16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ iop1= abs(rand()) * 1+abs(rand()%2);
+ do {
+ iop2= abs(rand());
+ }
+ while (!iop2);
+
+ ires1= iop1 / iop2;
+ ires2= iop1 % iop2;
+
+ if (verbose)
+ printf("%4x/%4x %5u/%5u=%5u,%5u ", iop1, iop2, iop1, iop2, ires1, ires2);
+ r= mdu_16udiv16(iop1, iop2, &mdu_ires1, &mdu_ires2);
+ if (verbose)
+ printf("mdu=%5u,%5u ", mdu_ires1, mdu_ires2);
+ if ((ires1 != mdu_ires1) ||
+ (ires2 != mdu_ires2))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16udiv16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16sdiv16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do {
+ siop1= rand() * (rand()%3-2);
+ }
+ while (!siop1);
+ do {
+ siop2= rand()/8 * (rand()%3-2);
+ }
+ while (!siop2);
+
+ sires1= siop1 / siop2;
+ sires2= siop1 % siop2;
+
+ if (verbose)
+ printf("%4x/%4x %+6d/%+6d=%+6d,%+6d ",
+ siop1, siop2,
+ siop1, siop2,
+ sires1, sires2);
+ r= mdu_16sdiv16(siop1, siop2, &mdu_sires1, &mdu_sires2);
+ if (verbose)
+ printf("mdu=%+6d,%+6d ", mdu_sires1, mdu_sires2);
+ if ((sires1 != mdu_sires1) ||
+ (sires2 != mdu_sires2))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16sdiv16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16mul16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ iop1= abs(rand()) /*+abs(rand())*/;
+ iop2= abs(rand()) /*+abs(rand())*/;
+
+ lres= (unsigned long)iop1 * (unsigned long)iop2;
+
+ if (verbose)
+ printf("%4x*%4x %5u*%5u=%10lu ", iop1, iop2, iop1, iop2, lres);
+ r= mdu_16umul16(iop1, iop2, &mdu_lres);
+ if (verbose)
+ printf("mdu=%10lu ", mdu_lres);
+ if (lres != mdu_lres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16umul16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_16smul16(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ siop1= rand() * (rand()%3-2);
+ do {
+ siop2= rand()/8 * (rand()%3-2);
+ }
+ while (!siop2);
+
+ slres= siop1 * (signed long)siop2;
+
+ if (verbose)
+ printf("%4x*%4x %+6d*%+6d=%+11ld ",
+ siop1, siop2,
+ siop1, siop2,
+ slres);
+ r= mdu_16smul16(siop1, siop2, &mdu_slres);
+ if (verbose)
+ printf("mdu=%+11ld ", mdu_slres);
+ if (slres != mdu_slres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("16sumul16 test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_norm(char verbose)
+{
+ uint8_t mdu_shifts;
+
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do
+ {
+ lop1= labs(rand()) * abs(rand());
+ }
+ while (lop1 == 0);
+
+ if (lop1 & 0x80000000)
+ {
+ lres= lop1;
+ shifts= 0;
+ }
+ else
+ {
+ shifts= 0;
+ lres= lop1;
+ while ((lres & 0x80000000) == 0)
+ {
+ lres<<= 1;
+ shifts++;
+ }
+ }
+
+ if (verbose)
+ printf("%8lx< %10lu=%8lx,%2d ", lop1, lop1, lres, shifts);
+ r= mdu_norm(lop1, &mdu_lres, &mdu_shifts);
+ if (verbose)
+ printf("mdu=%8lx,%2d ", mdu_lres, mdu_shifts);
+ if ((lres != mdu_lres) ||
+ (shifts != mdu_shifts))
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ if (r&0x40)
+ printf("ovr ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("norm test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_lshift(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do
+ {
+ lop1= labs(rand()) * abs(rand());
+ }
+ while (lop1 == 0);
+ do {
+ shifts= rand() & 0x1f;
+ }
+ while (shifts==0);
+
+ r= rand() & 1;
+
+ if (r)
+ lres= lop1 << shifts;
+ else
+ lres= lop1 >> shifts;
+
+ if (verbose)
+ printf("%8lx%c%2d=%8lx ", lop1, r?'<':'>', shifts, lres);
+ r= mdu_lshift(lop1, shifts, r, &mdu_lres);
+ if (verbose)
+ printf("mdu=%8lx ", mdu_lres);
+ if (lres != mdu_lres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x80)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("lshift test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void
+test_ashift(char verbose)
+{
+ ok= fail= 0;
+ for (i= 0; i<100; i++)
+ {
+ do
+ {
+ slop1= (long)rand()/64 * rand()/64 * (rand()%3-2+i%2);
+ }
+ while (slop1 == 0);
+ do {
+ shifts= rand() & 0x1f;
+ }
+ while (shifts==0);
+
+ r= rand() & 1;
+
+ if (r)
+ slres= slop1 << shifts;
+ else
+ slres= slop1 >> shifts;
+
+ if (verbose)
+ printf("%8lx%c%2d=%8lx ", slop1, r?'<':'>', shifts, slres);
+ r= mdu_ashift(slop1, shifts, r, &mdu_slres);
+ if (verbose)
+ printf("mdu=%8lx ", mdu_slres);
+ if (slres != mdu_slres)
+ {
+ if (verbose)
+ printf("fail ");
+ fail++;
+ }
+ else
+ {
+ if (verbose)
+ printf("ok ");
+ ok++;
+ }
+ if (r &&
+ verbose)
+ {
+ if (r&0x20)
+ printf("err ");
+ }
+ if (verbose)
+ printf("\n");
+ }
+ printf("ashift test: succ=%d fails=%d\n\n", ok, fail);
+}
+
+void main(void)
+{
+ simif= (__xdata char *)0xffff;
+ serial_init(9600);
+
+ test_32div16(0);
+ test_32sdiv16(0);
+ test_16div16(0);
+ test_16sdiv16(0);
+ test_16mul16(0);
+ test_16smul16(0);
+ test_norm(0);
+ test_lshift(0);
+ test_ashift(0);
+
+ *simif= 's';
+ while (1)
+ {
+ }
+}
diff --git a/sim/ucsim/s51.src/test/test_mdu88x.cmd b/sim/ucsim/s51.src/test/test_mdu88x.cmd
new file mode 100644
index 0000000..3d3ba38
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu88x.cmd
@@ -0,0 +1,3 @@
+run
+state
+kill
diff --git a/sim/ucsim/s51.src/test/test_mdu88x.mk b/sim/ucsim/s51.src/test/test_mdu88x.mk
new file mode 100644
index 0000000..b325986
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu88x.mk
@@ -0,0 +1,7 @@
+MAIN = test_mdu88x
+
+OTHERS = serial print mdu88x
+
+include sdcc.mk
+
+MODEL = large
diff --git a/sim/ucsim/s51.src/test/test_mdu88x.type b/sim/ucsim/s51.src/test/test_mdu88x.type
new file mode 100644
index 0000000..414859f
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_mdu88x.type
@@ -0,0 +1 @@
+xc88x \ No newline at end of file
diff --git a/sim/ucsim/s51.src/test/test_ser.c b/sim/ucsim/s51.src/test/test_ser.c
new file mode 100644
index 0000000..43f1f7a
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_ser.c
@@ -0,0 +1,114 @@
+#include "hw.h"
+
+#define BUFSIZE 16
+#define T0H 0xfc
+#define T0L 0x67
+
+unsigned char buf[BUFSIZE];
+unsigned char first_free= 0, last_occupied= 0;
+bit transmitting, overflow;
+volatile int t0cnt;
+
+void ser_it(void) __interrupt (4)
+{
+ unsigned char temp;
+ if (RI) {
+ buf[first_free]= SBUF;
+ first_free= ((temp= first_free)+1) % BUFSIZE;
+ if (first_free == last_occupied) {
+ first_free= temp;
+ overflow= 1;
+ }
+ RI= 0;
+ }
+ if (TI) {
+ transmitting= 0;
+ TI= 0;
+ }
+}
+
+void t0_it(void) __interrupt (1)
+{
+ TL0= T0L;
+ TH0= T0H;
+ if (t0cnt)
+ t0cnt--;
+}
+
+char empty(void)
+{
+ return(first_free == last_occupied);
+}
+
+unsigned char get_ch(void)
+{
+ unsigned char c;
+ c= buf[last_occupied];
+ last_occupied= (last_occupied+1) % BUFSIZE;
+ overflow= 0;
+ return(c);
+}
+
+void send_ch(unsigned char c)
+{
+ while (transmitting) ;
+ transmitting= 1;
+ SBUF= c;
+}
+
+void send_str(char *str)
+{
+ while (*str) {
+ send_ch(*str);
+ str++;
+ }
+}
+
+void process(void)
+{
+ unsigned char c;
+ c= get_ch();
+ if ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z'))
+ c^= 0x20;
+ send_ch(c);
+}
+
+void wait(int delay)
+{
+ t0cnt= delay;
+ while (t0cnt)
+ PCON|= 1;
+}
+
+char test(char c)
+{
+ return(c+1);
+}
+
+void main(void)
+{
+ t0cnt= 0;
+ transmitting= overflow= 0;
+ SCON= 0x7c;
+ TL1= TH1= 250; /* 9600 baud */
+ TH0= T0H;
+ TL0= T0L;
+ TMOD= 0x21;
+ TR0= TR1= 1;
+ ES= ET0= 1;
+ EA= 1;
+ send_str("\nOK\n");
+ test(0);
+ wait(1000);
+ test(1);
+ send_str("delay off\n");
+ for (;;) {
+ if (!empty()) {
+ if (overflow) {
+ send_str("Overflow!\n");
+ }
+ process();
+ }
+ }
+}
diff --git a/sim/ucsim/s51.src/test/test_ser.mk b/sim/ucsim/s51.src/test/test_ser.mk
new file mode 100644
index 0000000..272ce85
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_ser.mk
@@ -0,0 +1,7 @@
+MAIN = test_ser
+
+OTHERS =
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/test_stack.c b/sim/ucsim/s51.src/test/test_stack.c
new file mode 100644
index 0000000..25ba88d
--- /dev/null
+++ b/sim/ucsim/s51.src/test/test_stack.c
@@ -0,0 +1,9 @@
+void jaj(void)
+{
+ jaj();
+}
+
+void main(void)
+{
+ jaj();
+}
diff --git a/sim/ucsim/s51.src/test/tim_ser.c b/sim/ucsim/s51.src/test/tim_ser.c
new file mode 100644
index 0000000..91d109a
--- /dev/null
+++ b/sim/ucsim/s51.src/test/tim_ser.c
@@ -0,0 +1,73 @@
+#include "hw.h"
+
+#include "serial.h"
+#include "t0.h"
+#include "timer.h"
+#include "print.h"
+
+#define T0H 0xfc
+#define T0L 0x67
+
+unsigned int t0cnt;
+__xdata char *simif;
+
+void t0_it(void) __interrupt (1)
+{
+ TL0= T0L;
+ TH0= T0H;
+ if (t0cnt)
+ t0cnt--;
+}
+
+char min='a', max='z';
+
+void process(void)
+{
+ unsigned char c;
+ c= serial_receive();
+ if ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z'))
+ {
+ c^= 0x20;
+ min= 'a';
+ max= 'z';
+ P1= 1;
+ }
+ if ((c >= '0') && (c <= '9'))
+ {
+ min= '0';
+ max= '9';
+ P1= 2;
+ }
+ print_c(c);
+}
+
+void main(void)
+{
+ char c= 'a';
+ beallitas();
+
+ t0cnt= T_kezdoertek(1);
+ TL0= t0cnt & 0xff;
+ TH0= t0cnt >> 8;
+ T0idozito1(0);
+ T0beallit(t0cnt);
+ ET0= 1;
+ T0start();
+ EA= 1;
+ print("\nStart\n");
+
+ t0cnt= 10;
+ for (;;)
+ {
+ if (serial_received())
+ process();
+ if (!t0cnt)
+ {
+ print_c(c);
+ if (++c > max)
+ c= min;
+ t0cnt= 10;
+ }
+ }
+}
diff --git a/sim/ucsim/s51.src/test/tim_ser.mk b/sim/ucsim/s51.src/test/tim_ser.mk
new file mode 100644
index 0000000..6a2e4d2
--- /dev/null
+++ b/sim/ucsim/s51.src/test/tim_ser.mk
@@ -0,0 +1,7 @@
+MAIN = tim_ser
+
+OTHERS = timer t0 serial print
+
+include sdcc.mk
+
+MODEL = small
diff --git a/sim/ucsim/s51.src/test/timer.c b/sim/ucsim/s51.src/test/timer.c
new file mode 100644
index 0000000..057644a
--- /dev/null
+++ b/sim/ucsim/s51.src/test/timer.c
@@ -0,0 +1,27 @@
+#include "timer.h"
+
+
+float Fosc= 11.0592; /* MHz, Oszcillator orajel */
+
+
+/* Adott idoziteshez szukseges szamlalo kezdoerteket szamolja ki.
+ A parametert msec-ben kell megadni (kb 0.02-71 kozott) */
+
+unsigned int T_kezdoertek(float ido /* msec */)
+{
+ float tper; /* szamlalo periodusideje */
+ //float per; /* szukseges periodusok szama */
+
+ tper= 12.0/Fosc;
+ /* atvaltas usec-be */
+ ido*= 1000.0;
+ /* Max 65529 lepes */
+ if (ido > tper*65529.0)
+ return 0;
+ /* Min 20 lepes */
+ if (ido < tper*20.0)
+ return 0xffff-20;
+ //per= ido/tper;
+ return (unsigned int)(65541.0-ido/tper);
+}
+
diff --git a/sim/ucsim/s51.src/test/timer.h b/sim/ucsim/s51.src/test/timer.h
new file mode 100644
index 0000000..e043fae
--- /dev/null
+++ b/sim/ucsim/s51.src/test/timer.h
@@ -0,0 +1,17 @@
+#ifndef TIMER_HEADER
+#define TIMER_HEADER
+
+/*
+ Oszcillator orajele MHz-ben. Kezdoerteke 11.0592
+*/
+extern float Fosc;
+
+/*
+ A megadott ideig tarto idoziteshez szukseges
+ szamlalo kezdoerteket szamolja ki. Az idot
+ msec-ben kell megadni, kb 0.02-71.1 kozott.
+ Felhasznalja az Fosc erteket a szamitashoz.
+*/
+extern unsigned int T_kezdoertek(float ido);
+
+#endif
diff --git a/sim/ucsim/s51.src/test/xc88x.h b/sim/ucsim/s51.src/test/xc88x.h
new file mode 100644
index 0000000..fe4e110
--- /dev/null
+++ b/sim/ucsim/s51.src/test/xc88x.h
@@ -0,0 +1,14 @@
+#ifndef XC88X_HEADER
+#define XC88X_HEADER
+
+__sfr __at (0xB2) MD0;
+__sfr __at (0xB3) MD1;
+__sfr __at (0xB4) MD2;
+__sfr __at (0xB5) MD3;
+__sfr __at (0xB6) MD4;
+__sfr __at (0xB7) MD5;
+
+__sfr __at (0xB1) MDUCON;
+__sfr __at (0xB0) MDUSTAT;
+
+#endif