File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / ioctlr.cpp
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:04:41 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v006, HEAD
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 からの割り込み要求(マスク)");
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.