summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2021-07-05 22:37:40 +0200
committerAki <please@ignore.pl>2021-07-05 22:37:40 +0200
commitccd38afce5ef3e98b669b732b36b65deb584bca8 (patch)
tree1a91b9a9dd84ecc171b1cdf7caf6eee951d6919b
parent9da369813121c8446e7e1b08973ca4e0f706c296 (diff)
downloadlc3-ccd38afce5ef3e98b669b732b36b65deb584bca8.zip
lc3-ccd38afce5ef3e98b669b732b36b65deb584bca8.tar.gz
lc3-ccd38afce5ef3e98b669b732b36b65deb584bca8.tar.bz2
Added mapped memory for display
-rw-r--r--lc3.c31
1 files 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]++);