-
Notifications
You must be signed in to change notification settings - Fork 551
/
IOPort.cs
122 lines (111 loc) · 4.32 KB
/
IOPort.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using IL2CPU.API.Attribs;
namespace Cosmos.Core
{
/// <summary>
/// IOPort static class.
/// </summary>
public static class IOPort
{
//TODO: Reads and writes can use this to get port instead of argument
/// <summary>
/// Write byte to port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to write to.</param>
/// <param name="aData">A data.</param>
[PlugMethod(PlugRequired = true)]
public static void Write8(int aPort, byte aData) => throw null;
/// <summary>
/// Write many bytes to port with 400ns waits between each word
/// Plugged.
/// </summary>
/// <param name="aPort">A port to write to.</param>
/// <param name="aData">The data.</param>
[PlugMethod(PlugRequired = true)]
public static void WriteMany8WithWait(int aPort, byte[] aData) => throw null;
/// <summary>
/// Write Word to port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to write to.</param>
/// <param name="aData">A data.</param>
[PlugMethod(PlugRequired = true)]
public static void Write16(int aPort, ushort aData) => throw null;
/// <summary>
/// Write DWord to port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to write to.</param>
/// <param name="aData">A data.</param>
[PlugMethod(PlugRequired = true)]
public static void Write32(int aPort, uint aData) => throw null;
/// <summary>
/// Read byte from port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to read from.</param>
/// <returns>byte value.</returns>
[PlugMethod(PlugRequired = true)]
public static byte Read8(int aPort) => throw null;
/// <summary>
/// Read Word from port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to read from.</param>
/// <returns>ushort value.</returns>
[PlugMethod(PlugRequired = true)]
public static ushort Read16(int aPort) => throw null;
/// <summary>
/// Read DWord from port.
/// Plugged.
/// </summary>
/// <param name="aPort">A port to read from.</param>
/// <returns>uint value.</returns>
[PlugMethod(PlugRequired = true)]
public static uint Read32(int aPort) => throw null;
//TODO: Plug these Reads with asm to read directly to RAM
// REP INSW
/// <summary>
/// Read byte from base port.
/// </summary>
/// <param name="aData">Output data array.</param>
/// <exception cref="System.OverflowException">Thrown if aData lenght is greater than Int32.MaxValue.</exception>
[PlugMethod(PlugRequired = true)]
public static void Read8(int aPort, byte[] aData) => throw null;
/// <summary>
/// Read Words from base port.
/// </summary>
/// <param name="aData">Output data array.</param>
/// <exception cref="System.OverflowException">Thrown if aData lenght is greater than Int32.MaxValue.</exception>
[PlugMethod(PlugRequired = true)]
public static void Read16(int aPort, ushort[] aData)
{
throw null;
}
/// <summary>
/// Read DWord from base port.
/// </summary>
/// <param name="aData">Output data array.</param>
/// <exception cref="System.OverflowException">Thrown if aData lenght is greater than Int32.MaxValue.</exception>
public static void Read32(int aPort, uint[] aData)
{
for (int i = 0; i < aData.Length; i++)
{
aData[i] = Read32(aPort);
}
}
/// <summary>
/// Wait for the previous IO read/write to complete.
/// </summary>
public static void Wait()
{
// Write to an unused port. This assures whatever we were waiting on for a previous
// IO read/write has completed.
// Port 0x80 is unused after BIOS POST.
// 0x22 is just a random byte.
// Since IO is slow - its just a dummy sleep to wait long enough for the previous operation
// to have effect on the target.
Write8(0x80, 0x22);
}
}
}