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 | |
| 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')
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 |
