File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / scc.h
Revision 1.1.1.13 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:59 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//

//
// SCC (Z8530)
//

#pragma once

#include "mpscc.h"

class Keyboard;

class SCCDevice : public MPSCCDevice
{
	using inherited = MPSCCDevice;

 public:
	SCCDevice();
	~SCCDevice() override;

	bool Init() override;
	void ResetHard(bool poweron) override;

	// 割り込みアクノリッジ
	busdata InterruptAcknowledge();

 protected:
	// BusIO インタフェース
	busdata ReadPort(uint32 offset);
	busdata WritePort(uint32 offset, uint32 data);
	busdata PeekPort(uint32 offset);

	void Tx(int ch, uint32 data) override;
	uint GetHighestInt() const override;

 private:
	// 指定のレジスタ名を返す
	const char *CRName(const MPSCCChan&, uint n) const override;
	const char *SRName(const MPSCCChan&, uint n) const override;

	// WR, RR のほうが通りがいいので結局用意する
	const char *WRName(const MPSCCChan& chan, int n) const {
		return CRName(chan, n);
	}
	const char *WRName(const MPSCCChan& chan) const {
		return inherited::CRName(chan);
	}
	const char *RRName(const MPSCCChan& chan, int n) const {
		return SRName(chan, n);
	}
	const char *RRName(const MPSCCChan& chan) const {
		return inherited::SRName(chan);
	}

	void ResetChannel(MPSCCChan&);

	uint8 ReadCtrl(MPSCCChan&);
	void WriteCtrl(MPSCCChan&, uint32 data);
	uint8 PeekCtrl(const MPSCCChan&) const;

	uint8 GetWR1(const MPSCCChan&) const;
	uint8 GetWR9() const;
	uint8 GetRR0(const MPSCCChan&) const;
	uint8 GetRR2B() const;
	uint8 GetRR3A() const;

	void WriteWR0(MPSCCChan&, uint32 data);
	void WriteWR1(MPSCCChan&, uint32 data);
	void WriteWR2(uint32 data);
	void WriteWR5(MPSCCChan&, uint32 data);
	void WriteWR9(uint32 data);
	void WriteWR10(MPSCCChan&, uint32 data);
	void WriteWR11(MPSCCChan&, uint32 data);
	void WriteWR12(MPSCCChan&, uint32 data);
	void WriteWR13(MPSCCChan&, uint32 data);
	void WriteWR14(MPSCCChan&, uint32 data);
	void WriteWR15(MPSCCChan&, uint32 data);

	void SetXC(MPSCCChan&);

	DECLARE_MONITOR_SCREEN(MonitorScreen);
	void MonitorScreenCh(TextScreen&, int ch, int xbase, int ybase);

	// PCLK (入力クロック) の時間表現 [tsec]
	uint64 pclk_tsec {};

	Keyboard *keyboard {};

	static const char * const wrnames[32];
	static const char * const rrnames[32];
};

inline SCCDevice *GetSCCDevice() {
	return Object::GetObject<SCCDevice>(OBJ_MPSCC);
}

unix.superglobalmegacorp.com

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