From 63ce22544923b5c5a3a42a41206d3a929146b7fc Mon Sep 17 00:00:00 2001 From: Michael Steil Date: Tue, 12 Oct 2010 14:29:11 +0000 Subject: [PATCH] added apple1basic --- Makefile.apple1basic | 12 ++++ apple1basic.bin | Bin 0 -> 4096 bytes apple1basic.c | 131 +++++++++++++++++++++++++++++++++++++++++++ perfect6502.h | 1 + 4 files changed, 144 insertions(+) create mode 100644 Makefile.apple1basic create mode 100644 apple1basic.bin create mode 100644 apple1basic.c diff --git a/Makefile.apple1basic b/Makefile.apple1basic new file mode 100644 index 0000000..c9a99e3 --- /dev/null +++ b/Makefile.apple1basic @@ -0,0 +1,12 @@ +OBJS=perfect6502.o apple1basic.o +CFLAGS=-Werror -Wall -O3 +CC=clang + +all: apple1basic + +apple1basic: $(OBJS) + $(CC) -o apple1basic $(OBJS) + +clean: + rm -f $(OBJS) apple1basic + diff --git a/apple1basic.bin b/apple1basic.bin new file mode 100644 index 0000000000000000000000000000000000000000..9681b0e373cfc08091be2e3d05ff6d5c200e5872 GIT binary patch literal 4096 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 TAn}T-w+Gc|rA#{M7193(*@6NV literal 0 HcmV?d00001 diff --git a/apple1basic.c b/apple1basic.c new file mode 100644 index 0000000..0ca22db --- /dev/null +++ b/apple1basic.c @@ -0,0 +1,131 @@ +#include +#ifndef _WIN32 +#include + +#include "perfect6502.h" + +/************************************************************ + * + * Interface to OS Library Code / Monitor + * + ************************************************************/ + +/* imported by runtime.c */ +unsigned char A, X, Y, S, P; +unsigned short PC; +int N, Z, C; + +void +init_monitor() +{ + FILE *f; + f = fopen("apple1basic.bin", "r"); + fread(memory + 0xE000, 1, 4096, f); + fclose(f); + + memory[0xfffc] = 0x00; + memory[0xfffd] = 0xE0; + +} + + +void +charout(char ch) { + unsigned short S = readSP(); + unsigned char a = 1 + memory[0x0100+S+1] | memory[0x0100+((S+2) & 0xFF)] << 8; + + /* + * Apple I BASIC prints every character received + * from the terminal. UNIX terminals do this + * anyway, so we have to avoid printing every + * line again + */ + if (a==0xe2a6) /* character echo */ + return; + if (a==0xe2b6) /* CR echo */ + return; + + /* + * Apple I BASIC prints a line break and 6 spaces + * after every 37 characters. UNIX terminals do + * line breaks themselves, so ignore these + * characters + */ + if (a==0xe025 && (ch==10 || ch==' ')) + return; + + /* INPUT */ + if (a==0xe182) { +#if _WIN32 + if (!isatty(0)) + return; +#else + struct stat st; + fstat(0, &st); + if (S_ISFIFO (st.st_mode)) + return; +#endif + } +#endif + + putc(ch, stdout); + fflush(stdout); +} + +void +handle_monitor() +{ + if (readRW()) { + unsigned short a = readAddressBus(); + if ((a & 0xFF1F) == 0xD010) { + unsigned char c = getchar(); + if (c == 10) + c = 13; + c |= 0x80; + writeDataBus(c); + } + if ((a & 0xFF1F) == 0xD011) { + if (readPC() == 0xE006) + /* if the code is reading a character, we have one ready */ + writeDataBus(0x80); + else + /* if the code checks for a STOP condition, nothing is pressed */ + writeDataBus(0); + } + if ((a & 0xFF1F) == 0xD012) { + /* 0x80 would mean we're not yet ready to receive a character */ + writeDataBus(0); + } + } else { + unsigned short a = readAddressBus(); + unsigned char d = readDataBus(); + if ((a & 0xFF1F) == 0xD012) { + unsigned char temp8 = d & 0x7F; + if (temp8 == 13) + temp8 = 10; + charout(temp8); + } + } +} + +int +main() +{ + int clk = 0; + + initAndResetChip(); + + /* set up memory for user program */ + init_monitor(); + + /* emulate the 6502! */ + for (;;) { + step(); + clk = !clk; + if (!clk) + handle_monitor(); + +// chipStatus(); + //if (!(cycle % 1000)) printf("%d\n", cycle); + }; +} diff --git a/perfect6502.h b/perfect6502.h index 070acf0..7f3aa60 100644 --- a/perfect6502.h +++ b/perfect6502.h @@ -10,6 +10,7 @@ extern unsigned char readSP(); extern unsigned char readP(); extern unsigned int readRW(); extern unsigned short readAddressBus(); +extern void writeDataBus(unsigned char); extern unsigned char readDataBus(); extern unsigned char readIR();