|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "iocon.h"
7: #include "mpu.h"
8:
9: IOConDevice *gIOCon;
10:
11: IOConDevice::IOConDevice()
12: {
13: logname = "iocon";
14: devname = "IOCtrler";
15: devaddr = baseaddr;
16: devlen = 0x2000;
17: }
18:
19: IOConDevice::~IOConDevice()
20: {
21: }
22:
23: uint64
24: IOConDevice::Read8(uint32 addr)
25: {
26: uint32 offset = addr - baseaddr;
27: switch (offset) {
28: case 1: // $E9C001 割り込みステータス
29: return (fdc_int ? 0x80 : 0)
30: | (fdd_int ? 0x40 : 0)
31: | (prt_int ? 0x20 : 0)
32: | (hdd_int ? 0x10 : 0)
33: | (hdd_en ? 0x08 : 0)
34: | (fdc_en ? 0x04 : 0)
35: | (fdd_en ? 0x02 : 0)
36: | (prt_en ? 0x01 : 0);
37: case 3: // $E9C003 割り込みベクタ
38: return vector;
39: break;
40: }
41: return (uint64)-1;
42: }
43:
44: uint64
45: IOConDevice::Read16(uint32 addr)
46: {
47: return 0xff00 | Read8(addr + 1);
48: }
49:
50: uint64
51: IOConDevice::Write8(uint32 addr, uint32 data)
52: {
53: uint32 offset = addr - baseaddr;
54: switch (offset) {
55: case 1: // $E9C001 割り込みマスク
56: hdd_en = (data & 0x08);
57: fdc_en = (data & 0x04);
58: fdd_en = (data & 0x02);
59: prt_en = (data & 0x01);
60: putlog(1, "割り込みマスク設定 HDD=%d FDC=%d FDD=%d PRT=%d",
61: hdd_en, fdc_en, fdd_en, prt_en);
62: return 0;
63: case 3: // $E9C003 割り込みベクタ
64: vector = data & 0xfc;
65: putlog(1, "割り込みベクタ設定 $%02x", vector);
66: return 0;
67: default:
68: break;
69: }
70: return (uint64)-1;
71: }
72:
73: uint64
74: IOConDevice::Write16(uint32 addr, uint32 data)
75: {
76: return Write8(addr + 1, data);
77: }
78:
79: uint64
80: IOConDevice::Peek8(uint32 addr)
81: {
82: uint32 offset = addr - baseaddr;
83: switch (offset) {
84: case 1:
85: return (fdc_int ? 0x80 : 0)
86: | (fdd_int ? 0x40 : 0)
87: | (prt_int ? 0x20 : 0)
88: | (hdd_int ? 0x10 : 0)
89: | (hdd_en ? 0x08 : 0)
90: | (fdc_en ? 0x04 : 0)
91: | (fdd_en ? 0x02 : 0)
92: | (prt_en ? 0x01 : 0);
93:
94: case 3:
95: return vector;
96:
97: default:
98: return 0xff;
99: }
100: }
101:
102: // FDC からの割り込み要求
103: void
104: IOConDevice::IntFDC()
105: {
106: fdc_int = true;
107: if (fdc_en) {
108: putlog(1, "FDC からの割り込み要求");
109: gMPU->Interrupt(1, vector + 0);
110: } else {
111: putlog(2, "FDC からの割り込み要求(マスク)");
112: }
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.