summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2021-07-10 15:13:20 +0200
committerAki <please@ignore.pl>2021-07-10 15:13:20 +0200
commit583b4154ca6783ba03ddaace51f698a14efc3733 (patch)
tree9fd0465e06c18098afd3896cd7e0d7505311d890
parent7c9b380f475387e43b385a8b67cd6fcbdd2e6ded (diff)
downloadlc3-583b4154ca6783ba03ddaace51f698a14efc3733.zip
lc3-583b4154ca6783ba03ddaace51f698a14efc3733.tar.gz
lc3-583b4154ca6783ba03ddaace51f698a14efc3733.tar.bz2
Fixed interrupt/exception and related initialization
-rw-r--r--lc3.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/lc3.c b/lc3.c
index ca511cf..7a0c4ec 100644
--- a/lc3.c
+++ b/lc3.c
@@ -127,7 +127,7 @@ uint16_t sign_extend(uint16_t value, const int bits)
void fire(const uint16_t interrupt, const uint16_t priority)
{
const uint16_t current_priority = (registers[REGISTER_PSR] >> 8) & 0x07;
- if (current_priority >= priority)
+ if (0x00 != interrupt && 0x01 != interrupt && current_priority > priority)
{
return;
}
@@ -321,7 +321,7 @@ void step(const uint16_t instruction)
{
if (FLAG_SUP & registers[REGISTER_PSR])
{
- fire(0, (registers[REGISTER_PSR] >> 8) & 0x07);
+ fire(0x00, (registers[REGISTER_PSR] >> 8) & 0x07);
}
else
{
@@ -421,6 +421,7 @@ int main(int argc, char ** argv)
atexit(restore_terminal);
prepare_terminal();
registers[REGISTER_PC] = MEMORY_USER;
+ registers[REGISTER_PSR] |= FLAG_SUP;
for (;;)
{
const uint16_t instruction = read_memory(registers[REGISTER_PC]++);