From acfcf9b2083179614873a65fc2c09efc9700040a Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Wed, 6 May 2026 01:30:54 +1000 Subject: [PATCH] Add 8051 (alternate backend only, based on http://git.hugovil.com/git/emu8051.git), /bas52all.zip retrieved from https://www.nomad.ee/micros/8052core.shtml, /basic-52_test.txt, also turn off tracing in /emu_6809.c (used for comparison of numeric results) --- .gitignore | 2 + .gitmodules | 3 + Makefile | 50 +++++- bas52all.zip | Bin 0 -> 65743 bytes basic-52_test.txt | 58 +++++++ emu8051 | 1 + emu_6809.c | 4 +- emu_8051.c | 376 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 490 insertions(+), 4 deletions(-) create mode 100644 bas52all.zip create mode 100644 basic-52_test.txt create mode 160000 emu8051 create mode 100644 emu_8051.c diff --git a/.gitignore b/.gitignore index a9cd20b..32f3ee1 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ /emu_68000_alt /emu_6809 /emu_6809_alt +/emu_8051 +/emu_8051_alt /emu_8080 /emu_8080_alt /emu_8086 diff --git a/.gitmodules b/.gitmodules index 8a8b523..718e830 100644 --- a/.gitmodules +++ b/.gitmodules @@ -55,3 +55,6 @@ [submodule "udis"] path = udis url = https://github.com/nickd4/udis.git +[submodule "emu8051"] + path = emu8051 + url = https://github.com/nickd4/emu8051.git diff --git a/Makefile b/Makefile index 7d7b3f9..297962f 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ BIN2HEX=bin2hex.py CFLAGS=-g -Og -Wall -Wno-attributes -Wno-unused-function ALT_65C02_CFLAGS=-DALT_BACKEND=1 -DVR_6502_EMU_STATIC=1 -ALT_6800_CFLAGS=-DALT_BACKEND=1 -DUSE_PROTOTYPES -DM6800 -Isim68xx/inc/arch/m6800 -Isim68xx/inc/arch/m68xx -Isim68xx/inc/base +ALT_6800_CFLAGS=-DALT_BACKEND=1 -DUSE_PROTOTYPES -DM6800 -Wno-implicit-int -Isim68xx/inc/arch/m6800 -Isim68xx/inc/arch/m68xx -Isim68xx/inc/base ALT_68000_CFLAGS=-DALT_BACKEND=1 -IMusashi -IMusashi/softfloat ALT_6809_CFLAGS=-DALT_BACKEND=1 -IVCC ALT_8086_CFLAGS=-DALT_BACKEND=1 -Ivirtualxt/lib/vxt -Ivirtualxt/lib/vxt/include @@ -12,6 +12,7 @@ ALT_MIPS_CFLAGS=-DALT_BACKEND=1 -DHAVE_CONFIG_H -Iyams -Iyams/src -Wno-enum-comp ALT_PDP11_CFLAGS=-DALT_BACKEND=1 -Isimh -Isimh/PDP11 ALT_Z80_CFLAGS=-DALT_BACKEND=1 ALT_8080_CFLAGS=-DALT_BACKEND=1 +ALT_8051_CFLAGS=-DALT_BACKEND=1 .PHONY: all all: \ @@ -36,7 +37,9 @@ zexall.ihx \ zexdoc.ihx \ mbasic.ihx \ emu_8080 \ -emu_8080_alt +emu_8080_alt \ +emu_8051_alt \ +basic-52.ihx #emu_mips #emu_pdp11 #emu_68000 @@ -323,6 +326,49 @@ mbasic.ihx: cpm_compilers/Microsoft\ BASIC-80\ v521/MBASIC.COM ./entry_point.py 0x100 __temp__.ihx $@ rm __temp__.ihx +# 8051 +emu_8051_alt: \ +emu_8051_alt.o \ +cpu8051.o \ +instructions_8051.o \ +memory.o \ +operations.o \ +psw.o \ +sfr.o + ${CC} ${CFLAGS} -o $@ $^ + +emu_8051_alt.o: \ +emu_8051.c \ +emu8051/src/common/cpu8051.h \ +emu8051/src/common/memory.h \ +emu8051/src/common/reg8051.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +cpu8051.o: emu8051/src/common/cpu8051.c emu8051/src/common/cpu8051.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +instructions_8051.o: \ +emu8051/src/common/instructions_8051.c \ +emu8051/src/common/instructions_8051.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +memory.o: emu8051/src/common/memory.c emu8051/src/common/memory.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +operations.o: emu8051/src/common/operations.c emu8051/src/common/operations.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +psw.o: emu8051/src/common/psw.c emu8051/src/common/psw.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +sfr.o: emu8051/src/common/sfr.c emu8051/src/common/sfr.h + ${CC} ${CFLAGS} ${ALT_8051_CFLAGS} -o $@ -c $< + +basic-52.ihx: + unzip bas52all.zip BASIC-52.HEX + mv BASIC-52.HEX $@ + dos2unix $@ + .PHONY: clean clean: rm -f \ diff --git a/bas52all.zip b/bas52all.zip new file mode 100644 index 0000000000000000000000000000000000000000..ea08b73ace3c6adb3d7188b6a14ec72103d42cba GIT binary patch literal 65743 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 z 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 literal 0 HcmV?d00001 diff --git a/basic-52_test.txt b/basic-52_test.txt new file mode 100644 index 0000000..42cde48 --- /dev/null +++ b/basic-52_test.txt @@ -0,0 +1,58 @@ +10 PRINT "HELLO" +20 REM P9=X9^Y9 === GOSUB 60030 +30 X9=.3:Y9=.7:GOSUB 60030:PRINT P9 +40 REM L9=LOG(X9) === GOSUB 60090 +50 X9=.4:GOSUB 60090:PRINT L9 +60 REM E9=EXP(X9) === GOSUB 60160 +70 X9=.5:GOSUB 60160:PRINT E9 +80 REM C9=COS(X9) === GOSUB 60240 +90 X9=.6:GOSUB 60240:PRINT C9 +100 REM T9=TAN(X9) === GOSUB 60280 +110 X9=.7:GOSUB 60280:PRINT T9 +120 REM A9=ATN(X9) === GOSUB 60310 +130 X9=.8:GOSUB 60310:PRINT A9 +140 END +60000 REM EXPONENTIATION: P9=X9^Y9 +60010 REM NEED: EXP, LOG +60020 REM VARIABLES USED: A9,B9,C9,E9,L9,P9,X9,Y9 +60030 P9=1 : E9=0 : IF Y9=0 THEN RETURN +60040 IF X9<0 THEN IF INT(Y9)=Y9 THEN P9=1-2*Y9+4*INT(Y9/2) : X9=-X9 +60050 IF X9<>0 THEN GOSUB 60090 : X9=Y9*L9 : GOSUB 60160 +60060 P9=P9*E9 : RETURN +60070 REM NATURAL LOGARITHM: L9=LOG(X9) +60080 REM VARIABLES USED: A9,B9,C9,E9,L9,X9 +60090 E9=0 : IF X9<=0 THEN PRINT "LOG FC ERROR"; : STOP +60095 A9=1 : B9=2 : C9=.5 : REM THIS WILL SPEED UP THE FOLLOWING +60100 IF X9>=A9 THEN X9=C9*X9 : E9=E9+A9 : GOTO 60100 +60110 IF X90 THEN PRINT "EXP OV ERROR"; : STOP +60175 E9=0 : RETURN +60180 E9=.693147*L9-X9 : A9=1.32988E-3-1.41316E-4*E9 +60190 A9=((A9*E9-8.30136E-3)*E9+4.16574E-2)*E9 +60195 E9=(((A9-.166665)*E9+.5)*E9-1)*E9+1 : A9=2 +60197 IF L9<=0 THEN A9=.5 : L9=-L9 : IF L9=0 THEN RETURN +60200 FOR X9=1 TO L9 : E9=A9*E9 : NEXT X9 : RETURN +60210 REM COSINE: C9=COS(X9) +60220 REM N.B. SIN MUST BE RETAINED AT LOAD-TIME +60230 REM VARIABLES USED: C9,X9 +60240 C9=SIN(X9+1.5708) : RETURN +60250 REM TANGENT: T9=TAN(X9) +60260 REM NEEDS COS. (SIN NUST BE RETAINED AT LOAD-TIME) +60270 REM VARIABLES USED: C9,T9,X9 +60280 GOSUB 60240 : T9=SIN(X9)/C9 : RETURN +60290 REM ARCTANGENT: A9=ATN(X9) +60300 REM VARIABLES USED: A9,B9,C9,T9,X9 +60310 T9=SGN(X9): X9=ABS(X9): C9=0 : IF X9>1 THEN C9=1 : X9=1/X9 +60320 A9=X9*X9 : B9=((2.86623E-3*A9-1.61657E-2)*A9+4.29096E-2)*A9 +60330 B9=((((B9-7.5289E-2)*A9+.106563)*A9-.142089)*A9+.199936)*A9 +60340 A9=((B9-.333332)*A9+1)*X9 : IF C9=1 THEN A9=1.5708-A9 +60350 A9=T9*A9 : RETURN +RUN + +PRINT "DONE" diff --git a/emu8051 b/emu8051 new file mode 160000 index 0000000..32aeb9b --- /dev/null +++ b/emu8051 @@ -0,0 +1 @@ +Subproject commit 32aeb9be8b67793a887a8a2bf841fba4c9738086 diff --git a/emu_6809.c b/emu_6809.c index def3d62..56b7421 100644 --- a/emu_6809.c +++ b/emu_6809.c @@ -10,8 +10,8 @@ #include "cpu_6809.h" #endif -#define REG_TRACE 1 -#define MEM_TRACE 1 +#define REG_TRACE 0 +#define MEM_TRACE 0 #define MEM_SIZE 0x10000 uint8_t mem[MEM_SIZE]; diff --git a/emu_8051.c b/emu_8051.c new file mode 100644 index 0000000..90ced63 --- /dev/null +++ b/emu_8051.c @@ -0,0 +1,376 @@ +#include +#include +#include +#include +#include +#if ALT_BACKEND +#include "emu8051/src/common/cpu8051.h" +#include "emu8051/src/common/memory.h" +#include "emu8051/src/common/reg8051.h" +#else +#include "cpu_8051.h" +#endif + +#define REG_TRACE 0 +#define MEM_TRACE 0 + +// certain SFRs aren't available with alt backend, +// their values have to be taken from globals instead +#define MEM_P0 0x20100 +#define MEM_SP 0x20101 +#define MEM_DPL 0x20102 +#define MEM_DPH 0x20103 +#define MEM_PCON 0x20107 +#define MEM_TCON 0x20108 +#define MEM_TMOD 0x20109 +#define MEM_TL0 0x2010A +#define MEM_TL1 0x2010B +#define MEM_TH0 0x2010C +#define MEM_TH1 0x2010D +#define MEM_P1 0x20110 +#define MEM_SCON 0x20118 +#define MEM_SBUF 0x20119 +#define MEM_P2 0x20120 +#define MEM_IE 0x20128 +#define MEM_P3 0x20130 +#define MEM_IP 0x20138 +#define MEM_PSW 0x20150 +#define MEM_ACC 0x20160 +#define MEM_B 0x20170 + +#define SCON_RI 0 +#define SCON_TI 1 + +#define P3_RXD 0 + +#define PSW_P 0 +#define PSW_UD 1 +#define PSW_OV 2 +#define PSW_RS0 3 +#define PSW_RS1 4 +#define PSW_F0 5 +#define PSW_AC 6 +#define PSW_CY 7 + +// 0x00000..0x0ffff: code +// 0x10000..0x1ffff: xram +// 0x20000..0x200ff: idata +// 0x20100..0x2017f: sfr +#define MEM_SIZE 0x20180 +uint8_t mem[MEM_SIZE]; + +int load_ihx(char *name) { + FILE *fp = fopen(name, "r"); + if (fp == NULL) { + perror(name); + exit(EXIT_FAILURE); + } + + int base = 0, entry_point = 0; + bool had_eof = false; + char line[0x100]; + while (fgets(line, 0x100, fp)) { + for (char *p = line; *p; ++p) + if (*p == '\n') { + *p = 0; + break; + } + + if (had_eof) { + fprintf(stderr, "garbage after EOF record: %s\n", line); + exit(EXIT_FAILURE); + } + + if (line[0] != ':') { + fprintf(stderr, "require colon: %s\n", line); + exit(EXIT_FAILURE); + } + + uint8_t buf[0x7f]; + int len; + for (len = 0; len < 0x7f; ++len) { + char *p = line + 1 + len * 2; + if (*p == 0) + break; + if (*p == '\n') { + *p = 0; + break; + } + uint8_t c = p[2]; + p[2] = 0; + + char *q; + buf[len] = (uint8_t)strtol(p, &q, 16); + p[2] = c; + if (q != p + 2) { + fprintf(stderr, "not hex byte: %s\n", p); + exit(EXIT_FAILURE); + } + } + + if (len == 0) { + fprintf(stderr, "empty line: %s\n", line); + exit(EXIT_FAILURE); + } + + uint8_t checksum = 0; + for (int i = 0; i < len; ++i) + checksum += buf[i]; + if (checksum) { + fprintf( + stderr, + "checksum %02x, should be %02x\n", + buf[len - 1], + (buf[len - 1] - checksum) & 0xff + ); + exit(EXIT_FAILURE); + } + + len -= 5; + if (len != buf[0]) { + fprintf(stderr, "incorrect length: %s\n", line); + exit(EXIT_FAILURE); + } + + int addr = (buf[1] << 8) | buf[2], end_addr; + switch (buf[3]) { + case 0: + addr += base; + end_addr = addr + len; + if (end_addr < addr || end_addr > MEM_SIZE) { + fprintf(stderr, "invalid load range: [0x%x, 0x%x)\n", addr, end_addr); + exit(EXIT_FAILURE); + } + memcpy(mem + addr, buf + 4, len); + break; + case 1: + had_eof = true; + break; + case 4: + if (len < 2) { + fprintf(stderr, "invalid extended linear address record: %s\n", line); + exit(EXIT_FAILURE); + } + base = (buf[4] << 24) | (buf[5] << 16); + break; + case 5: + if (len < 4) { + fprintf(stderr, "invalid start linear address record: %s\n", line); + exit(EXIT_FAILURE); + } + entry_point = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; + break; + default: + fprintf(stderr, "unknown record type: 0x%x\n", buf[3]); + exit(EXIT_FAILURE); + } + } + if (!had_eof) { + fprintf(stderr, "no EOF record\n"); + exit(EXIT_FAILURE); + } + + fclose(fp); + return entry_point; +} + +int read_byte(void *context, int addr) { + int data; + static int rxd_count; + switch (addr) { + case MEM_P3: + // make RXD input toggle after each 2 reads + // necessary to pass the auto-baud code in basic-52.ihx + data = ((rxd_count >> 1) & (1 << P3_RXD)) | (mem[MEM_P3] & ~(1 << P3_RXD)); + ++rxd_count; + break; + default: + data = mem[addr]; + break; + } +#if MEM_TRACE + // don't trace any of the locations printed in register dump + switch (addr) { + case MEM_ACC: + case MEM_B: + case 0x20000: + case 0x20001: + case 0x20002: + case 0x20003: + case 0x20004: + case 0x20005: + case 0x20006: + case 0x20007: + case MEM_SP: + case MEM_DPL: + case MEM_DPH: + case MEM_PSW: + break; + default: + fprintf(stderr, "addr=%05x rd=%02x\n", addr, data); + break; + } +#endif + return data; +} + +void write_byte(void *context, int addr, int data) { +#if MEM_TRACE + // don't trace any of the locations printed in register dump + switch (addr) { + case MEM_ACC: + case MEM_B: + case 0x20000: + case 0x20001: + case 0x20002: + case 0x20003: + case 0x20004: + case 0x20005: + case 0x20006: + case 0x20007: + case MEM_SP: + case MEM_DPL: + case MEM_DPH: + case MEM_PSW: + break; + default: + fprintf(stderr, "addr=%05x wr=%02x\n", addr, data); + break; + } +#endif + switch (addr) { + case MEM_SBUF: + putchar(data); + mem[MEM_SCON] |= 1 << SCON_TI; + break; + default: + mem[addr] = data; + break; + } +} + +#if ALT_BACKEND +void mem_write8(enum mem_id_t id, unsigned long address, uint8_t value) { + switch (id) { + case INT_MEM_ID: + write_byte(NULL, 0x20000 + (address & 0xff) + (address & 0x80), value); + break; + case EXT_MEM_ID: + write_byte(NULL, 0x20080 + (address & 0x7f), value); + break; + case XRAM_MEM_ID: + write_byte(NULL, 0x10000 + (address & 0xffff), value); + break; + default: + abort(); + } +} + +uint8_t mem_read8(enum mem_id_t id, unsigned long address) { + switch (id) { + case PGM_MEM_ID: + return read_byte(NULL, address & 0xffff); + case INT_MEM_ID: + return read_byte(NULL, 0x20000 + (address & 0xff) + (address & 0x80)); + case EXT_MEM_ID: + return read_byte(NULL, 0x20080 + (address & 0x7f)); + case XRAM_MEM_ID: + return read_byte(NULL, 0x10000 + (address & 0xffff)); + default: + abort(); + } +} +#endif + +int main(int argc, char **argv) { + if (argc < 2) { + printf("usage: %s image.ihx\n", argv[0]); + exit(EXIT_FAILURE); + } + int entry_point = load_ihx(argv[1]); + +#if ALT_BACKEND + cpu8051_init(); + cpu8051_reset(); + cpu8051.pc = entry_point; + + while (true) { +#if REG_TRACE + fprintf( + stderr, + "pc=%04x a=%02x b=%02x r0=%02x r1=%02x r2=%02x r3=%02x r4=%02x r5=%02x r6=%02x r7=%02x sp=%02x dptr=%04x p=%d ud=%d ov=%d rs=%d f0=%d ac=%d cy=%d\n", + cpu8051.pc, + mem[MEM_ACC], + mem[MEM_B], + mem[0x20000], + mem[0x20001], + mem[0x20002], + mem[0x20003], + mem[0x20004], + mem[0x20005], + mem[0x20006], + mem[0x20007], + mem[MEM_SP], + mem[MEM_DPL] | (mem[MEM_DPH] << 8), + (mem[MEM_PSW] >> PSW_P) & 1, + (mem[MEM_PSW] >> PSW_UD) & 1, + (mem[MEM_PSW] >> PSW_OV) & 1, + (mem[MEM_PSW] >> PSW_RS0) & 3, + (mem[MEM_PSW] >> PSW_F0) & 1, + (mem[MEM_PSW] >> PSW_AC) & 1, + (mem[MEM_PSW] >> PSW_CY) & 1 + ); +#endif + + if (cpu8051.pc == 0x79b && (mem[MEM_SCON] & (1 << SCON_RI)) == 0) { + int c = getchar(); + switch (c) { + case EOF: + exit(EXIT_SUCCESS); + case '\n': + c = '\r'; + break; + } + mem[MEM_SBUF] = (uint8_t)c; + mem[MEM_SCON] |= 1 << SCON_RI; + } + cpu8051_exec(); + } +#else + struct cpu_8051 cpu; + cpu_8051_init(&cpu, read_byte, NULL, write_byte, NULL); + cpu_8051_reset(&cpu); + cpu.regs.word.pc = entry_point; + cpu.regs.byte.s = 0xff; + + while (true) { +#if REG_TRACE + fprintf( + stderr, + "pc=%04x a=%02x x=%02x y=%02x s=%02x p=%02x cf=%d zf=%d if=%d df=%d vf=%d nf=%d\n", + cpu.regs.word.pc, + cpu.regs.byte.a, + cpu.regs.byte.x, + cpu.regs.byte.y, + cpu.regs.byte.s, + cpu.regs.byte.p, + cpu.regs.bit.cf, + cpu.regs.bit.zf, + cpu.regs.bit._if, + cpu.regs.bit.df, + cpu.regs.bit.vf, + cpu.regs.bit.nf + ); +#endif + + int pc = cpu.regs.word.pc; + cpu_8051_execute(&cpu); + if (pc == cpu.regs.word.pc) { + printf("hung at %04x\n", pc); + break; + } + } +#endif + + return 0; +} -- 2.34.1