|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
9: #include "device.h"
10: #include <atomic>
11:
1.1.1.7 ! root 12: class TVRAMDevice : public IODevice
1.1 root 13: {
1.1.1.3 root 14: using inherited = IODevice;
1.1 root 15: private:
16: static const int baseaddr = 0xe00000;
17:
18: struct tvram {
19: bool sa; // 同時アクセス
20: bool ap[4]; // 同時アクセスプレーン
1.1.1.3 root 21: int xscroll; // X スクロール
22: int yscroll; // Y スクロール
1.1 root 23: };
24:
25: public:
26: TVRAMDevice();
1.1.1.6 root 27: virtual ~TVRAMDevice() override;
1.1 root 28:
1.1.1.3 root 29: void ResetHard() override;
1.1 root 30:
1.1.1.3 root 31: uint64 Read8(uint32 addr) override;
32: uint64 Read16(uint32 addr) override;
33: uint64 Write8(uint32 addr, uint32 data) override;
34: uint64 Write16(uint32 addr, uint32 data) override;
35: uint64 Peek8(uint32 addr) override;
1.1 root 36:
37: void set_crtc_21(uint16 data);
1.1.1.3 root 38: void SetScrollX(int x);
39: void SetScrollY(int y);
1.1 root 40:
41: bool Render(uint8 *);
42:
43: private:
1.1.1.2 root 44: // アドレスデコーダ
45: uint64 Decoder(uint32 addr) const;
46:
1.1 root 47: void Invalidate();
48:
1.1.1.2 root 49: std::unique_ptr<uint8[]> mem {};
1.1 root 50: // XXX 実際には縦がこれ以上になる可能性はある
51: std::atomic<uint8> atomic_dirty[1024] {};
52: struct tvram tvram {};
1.1.1.4 root 53:
54: // レンダリング時に使う変換テーブル
55: static uint32 deptable[256];
56:
57: // RGB24 形式(3バイト)を4バイトあるいは SSE なら 16バイト単位で
58: // 書き込むための1ライン分の中間バッファ。
1.1.1.5 root 59: ALIGNAS_IF_X86(16) uint32 rb[768] {};
1.1 root 60: };
61:
1.1.1.2 root 62: extern std::unique_ptr<TVRAMDevice> gTVRAM;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.