|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #pragma once
7:
8: #include <atomic>
9: #include "device.h"
10:
11: class BitmapDevice
12: : public IODevice
13: {
14: typedef IODevice inherited;
15:
16: static const uint32 plane0base = 0xb10c0000;
17: static const uint32 plane7end = 0xb12c0000;
18: static const uint32 fcset0base = 0xb1300000;
19: static const uint32 fcset7end = 0xb1500000;
20: public:
21: BitmapDevice();
22: virtual ~BitmapDevice();
23:
24: virtual void ResetHard();
25:
26: virtual uint64 Read8(uint32 addr);
27: virtual uint64 Read16(uint32 addr);
28: virtual uint64 Read32(uint32 addr);
29: virtual uint64 Write8(uint32 addr, uint32 data);
30: virtual uint64 Write16(uint32 addr, uint32 data);
31: virtual uint64 Write32(uint32 addr, uint32 data);
32: virtual uint64 Peek8(uint32 addr);
33: virtual bool MonitorUpdate();
34:
35: // プレーン数を取得
36: int GetPlaneCount() const { return nplane; }
37:
38: // RFCNT によるオフセットを取得 (レンダラ用)
39: void GetRFCNT(int *h, int *v) const {
40: *h = hscroll;
41: *v = vscroll;
42: }
43:
44: // ビットマップのアドレスを取得
45: const uint8 *GetBuf() const { return mem; }
46:
47: // 更新フラグのアドレスを取得
48: std::atomic<uint8> *GetDirty() { return atomic_dirty; }
49:
50: private:
51: void Invalidate();
52: void WriteRFCNT(uint32);
53: void WriteCommonBitmap8(uint32, uint32);
54: void WriteCommonBitmap16(uint32, uint32);
55: void WriteCommonBitmap32(uint32, uint32);
56: void WritePlane8(uint, uint32, uint32);
57: void WritePlane16(uint, uint32, uint32);
58: void WritePlane32(uint, uint32, uint32);
59:
60: // ROP 文字列を返す
61: static const char *RopStr(uint rop);
62:
63: // プレーン数の上限
64: static const int MAX_PLANES = 8;
65:
66: // プレーン数 (設定による)
67: int nplane = 0;
68:
69: // RFCNT
70: // b31..b24 b23..b16 b15..b10 b09..b00
71: // 無効 水平カウンタ 無効 ラスタカウンタ
72: uint32 rfcnt = 0;
73: int hscroll = 0;
74: int vscroll = 0;
75:
76: // プレーンセレクタ
77: // b31...b4 b3 b2 b1 b0
78: // <-無効-> | | | +-- プレーン0 (%1=同時設定/書き込み有効、%0=無効)
79: // | | +----- プレーン1
80: // | +-------- プレーン2
81: // +----------- プレーン3
82: uint32 bmsel = 0;
83:
84: // ビットマッププレーン。
85: // ロングワードでホストバイトオーダー。
86: // 1枚が 256KB。1 or 4枚
87: uint8 *mem = NULL;
88:
89: // 更新フラグ。
90: // 更新があったラインは 1、なければ 0。
91: // 1ラインごとなので 1プレーンにつき 1024 エントリ。
92: // XXX 水平の非描画区間は今の所検出していないので描画側で多少無駄足。
93: std::atomic<uint8> atomic_dirty[1024] {};
94:
95: // ファンクションセットとアクセスマスク
96: u_int fcs[MAX_PLANES] {};
97: uint32 mask[MAX_PLANES] {};
98: };
99:
100: extern BitmapDevice *gBitmap;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.