From cce593d0100978334f024301191dab09bfe20f54 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Wed, 19 Feb 2020 09:15:59 -0500 Subject: [PATCH] Code Golf Part 2 - Basic --- src/Makefile | 8 +++++ src/codegolf_basic.c | 71 +++++++++++++++++++++++++++++++++++++++++++ src/rom/ehbasic.bin | Bin 0 -> 16384 bytes 3 files changed, 79 insertions(+) create mode 100644 src/codegolf_basic.c create mode 100644 src/rom/ehbasic.bin diff --git a/src/Makefile b/src/Makefile index 53bb545..5dd9c80 100644 --- a/src/Makefile +++ b/src/Makefile @@ -85,6 +85,11 @@ CODEGOLF_TEST_SOURCES=$(CPU_SOURCES) codegolf_test.c CODEGOLF_TEST_OBJECTS=$(CODEGOLF_TEST_SOURCES:.c=.o) CODEGOLD_TEST_LIBS=$(LUA_LIBS) +CODEGOLF_BASIC=codegolf_basic +CODEGOLF_BASIC_SOURCES=$(CPU_SOURCES) codegolf_basic.c +CODEGOLF_BASIC_OBJECTS=$(CODEGOLF_BASIC_SOURCES:.c=.o) +CODEGOLD_BASIC_LIBS=$(LUA_LIBS) + all: $(EWM_SOURCES) $(EWM_EXECUTABLE) $(CPU_TEST_SOURCES) $(CPU_TEST_EXECUTABLE) $(SCR_TEST_EXECUTABLE) $(TTY_TEST_EXECUTABLE) $(CPU_BENCH) $(MEM_BENCH) @@ -112,5 +117,8 @@ $(MEM_BENCH): $(MEM_BENCH_OBJECTS) $(CODEGOLF_TEST): $(CODEGOLF_TEST_OBJECTS) $(CC) $(LDFLAGS) $(CODEGOLF_TEST_OBJECTS) $(CODEGOLF_TEST_LIBS) -o $@ +$(CODEGOLF_BASIC): $(CODEGOLF_BASIC_OBJECTS) + $(CC) $(LDFLAGS) $(CODEGOLF_BASIC_OBJECTS) $(CODEGOLF_BASIC_LIBS) -o $@ + .c.o: $(CC) $(CFLAGS) $< -c -o $@ diff --git a/src/codegolf_basic.c b/src/codegolf_basic.c new file mode 100644 index 0000000..b60b9d9 --- /dev/null +++ b/src/codegolf_basic.c @@ -0,0 +1,71 @@ +// The MIT License (MIT) +// +// Copyright (c) 2020 Stefan Arentz - http://github.com/st3fan/ewm +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include + +#include "fmt.h" +#include "cpu.h" +#include "mem.h" + +// +// This implements the "Doing something more interactive with it" part of the code golf at +// https://codegolf.stackexchange.com/questions/12844/emulate-a-mos-6502-cpu +// + +uint8_t input_handler(struct cpu_t *cpu, struct mem_t *mem, uint16_t addr) { + return 0; +} + +void output_handler(struct cpu_t *cpu, struct mem_t *mem, uint16_t addr, uint8_t b) { + printf("Hello\n"); + if (addr == 0xf001) { + printf("Got: %c\n", b); + } +} + +int main() { + struct cpu_t *cpu = cpu_create(EWM_CPU_MODEL_6502); + cpu_add_ram(cpu, 0x0000, 0xbfff); + cpu_add_ram_file(cpu, 0xc000, "rom/ehbasic.bin"); + cpu_add_iom(cpu, 0xf000, 0xf0ff, NULL, input_handler, output_handler); + cpu_reset(cpu); + cpu->state.pc = 0xc000; + + while (true) { + char state[1024]; + cpu_format_state(cpu, state); + + char ins[1024]; + cpu_format_instruction(cpu, ins); + + printf("%.4X: %s %s\n", cpu->state.pc, state, ins); + + int ret = cpu_step(cpu); + if (ret < 0) { + fprintf(stderr, "Unexpected error %d\n", ret); + return 1; + } + } + + return 0; +} diff --git a/src/rom/ehbasic.bin b/src/rom/ehbasic.bin new file mode 100644 index 0000000000000000000000000000000000000000..485616a772da077947654e7e64a263a6de729a72 GIT binary patch literal 16384 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 Q-=JS0Bu*8Vj7}2&Z~YEH(EtDd literal 0 HcmV?d00001