📄 main.cc
字号:
// U4600 Programmable Interrupt Controller// Matt Chapman <matthewc@cse.unsw.edu.au>#include <stdio.h>#include <string.h>#include <assert.hh>#include "pic.hh"// Serialization information.SerialType<U4600_PIC> U4600_PIC::type( "U4600_PIC", "U4600 Programmable Interrupt Controller");// Runtime constructor.U4600_PIC::U4600_PIC(const SimArgs& args) : Module(args), Device(8){ if (args.length() > 2) throw Error("Too many arguments to \"sim::install U4600_PIC\".");}// Serialized constructor.U4600_PIC::U4600_PIC(Checkpoint& cp) : Module(cp), Device(8){}// Module interface.voidU4600_PIC::reset(bool warm){ intr_pending = 0; intr_mask = 0xffff;}// Serialization interface.voidU4600_PIC::checkpoint(Checkpoint& cp, bool parent) const{}voidU4600_PIC::check_interrupts(void){ if (intr_pending & ~intr_mask) bus->clock->deliver_interrupt(1); else bus->clock->clear_interrupt(1);}ClockValueU4600_PIC::read(UInt64 addr, UInt64* buf, int size){ unsigned int reg = addr & 3; switch (reg) { case 0: *buf = intr_pending; break; case 1: *buf = intr_pending >> 8; break; case 2: *buf = intr_mask; break; case 3: *buf = intr_mask >> 8; break; } return 0; // ignore latency}ClockValueU4600_PIC::write(UInt64 addr, const UInt64* buf, int size){ unsigned int reg = addr & 3; UInt16 val = *buf & 0xff; switch (reg) { case 0: intr_pending = val | (intr_pending & 0xff00); break; case 1: intr_pending = (val << 8) | (intr_pending & 0x00ff); break; case 2: intr_mask = val | (intr_mask & 0xff00); break; case 3: intr_mask = (val << 8) | (intr_mask & 0x00ff); break; } check_interrupts(); return 0; // ignore latency}voidU4600_PIC::deliver_interrupt(unsigned int irq){ intr_pending |= (1 << irq); check_interrupts();}voidU4600_PIC::clear_interrupt(unsigned int irq){ intr_pending &= ~(1 << irq); check_interrupts();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -