From ccd38afce5ef3e98b669b732b36b65deb584bca8 Mon Sep 17 00:00:00 2001 From: Aki Date: Mon, 5 Jul 2021 22:37:40 +0200 Subject: Added mapped memory for display --- lc3.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lc3.c b/lc3.c index 5dc7112..250ca06 100644 --- a/lc3.c +++ b/lc3.c @@ -64,9 +64,14 @@ enum Trap TRAP_HALT = 0x25, }; -const uint16_t PC_START = 0x3000; -const uint16_t KBSR = 0xfe00; -const uint16_t KBDR = 0xfe02; +enum Memory +{ + MEMORY_START = 0x3000, + MEMORY_KBSR = 0xfe00, + MEMORY_KBDR = 0xfe02, + MEMORY_DSR = 0xfe04, + MEMORY_DDR = 0xfe06, +}; uint16_t memory[UINT16_MAX]; uint16_t registers[REGISTER_COUNT]; @@ -127,23 +132,33 @@ uint16_t check_key() uint16_t read_memory(const uint16_t address) { - if (address == KBSR) + if (MEMORY_KBSR == address) { if (check_key()) { - memory[KBSR] = 1u << 15; - memory[KBDR] = getchar(); + memory[MEMORY_KBSR] = 1u << 15; + memory[MEMORY_KBDR] = getchar(); } else { - memory[KBSR] = 0; + memory[MEMORY_KBSR] = 0; } } + else if (MEMORY_DSR == address) + { + memory[MEMORY_DSR] = 1u << 15; + } return memory[address]; } void write_memory(const uint16_t address, const uint16_t value) { + if (MEMORY_DDR == address) + { + uint8_t c = (uint8_t) value; + ssize_t r = write(1, &c, 1); + die(r, "write_memory write()"); + } memory[address] = value; } @@ -401,7 +416,7 @@ int main(int argc, char ** argv) signal(SIGINT, handle_interrupt); atexit(restore_terminal); prepare_terminal(); - registers[REGISTER_PC] = PC_START; + registers[REGISTER_PC] = MEMORY_START; for (;;) { const uint16_t instruction = read_memory(registers[REGISTER_PC]++); -- cgit v1.1