|
|
nono 0.1.2
//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//
#include "ioctlr.h"
#include "mpu680x0.h"
std::unique_ptr<IOCtlrDevice> gIOCtlr;
IOCtlrDevice::IOCtlrDevice()
{
logname = "ioctlr";
devname = "IOCtlr";
devaddr = baseaddr;
devlen = 0x2000;
}
IOCtlrDevice::~IOCtlrDevice()
{
}
void
IOCtlrDevice::ResetHard()
{
// XXX not yet
}
uint64
IOCtlrDevice::Read(uint32 addr)
{
switch (addr) {
case 0: // $E9C001 割り込みステータス
return (fdc_int ? 0x80 : 0)
| (fdd_int ? 0x40 : 0)
| (prt_int ? 0x20 : 0)
| (hdd_int ? 0x10 : 0)
| (hdd_en ? 0x08 : 0)
| (fdc_en ? 0x04 : 0)
| (fdd_en ? 0x02 : 0)
| (prt_en ? 0x01 : 0);
case 1: // $E9C003 割り込みベクタ
// 書き込み専用
return 0xff;
default:
return 0xff;
}
}
uint64
IOCtlrDevice::Write(uint32 addr, uint32 data)
{
switch (addr) {
case 0: // $E9C001 割り込みマスク
hdd_en = (data & 0x08);
fdc_en = (data & 0x04);
fdd_en = (data & 0x02);
prt_en = (data & 0x01);
putlog(1, "割り込みマスク設定 HDD=%d FDC=%d FDD=%d PRT=%d",
hdd_en, fdc_en, fdd_en, prt_en);
return 0;
case 1: // $E9C003 割り込みベクタ
vector = data & 0xfc;
putlog(1, "割り込みベクタ設定 $%02x", vector);
return 0;
default:
return 0;
}
}
uint64
IOCtlrDevice::Peek(uint32 addr)
{
switch (addr) {
case 0:
return (fdc_int ? 0x80 : 0)
| (fdd_int ? 0x40 : 0)
| (prt_int ? 0x20 : 0)
| (hdd_int ? 0x10 : 0)
| (hdd_en ? 0x08 : 0)
| (fdc_en ? 0x04 : 0)
| (fdd_en ? 0x02 : 0)
| (prt_en ? 0x01 : 0);
case 1:
// 書き込み専用
return 0xff;
default:
return 0xff;
}
}
// FDC からの割り込み要求
void
IOCtlrDevice::IntFDC()
{
fdc_int = true;
if (fdc_en) {
putlog(1, "FDC からの割り込み要求");
gMPU680x0->Interrupt(this, 1, vector + 0);
} else {
putlog(2, "FDC からの割り込み要求(マスク)");
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.