Skip to content

Commit a36a013

Browse files
committed
Minor Adlib Emulation improvements
1 parent adc7d3b commit a36a013

File tree

6 files changed

+65
-63
lines changed

6 files changed

+65
-63
lines changed

x8086NetEmu/Adapters/Audio/AdlibAdapter.vb

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ Public Class AdlibAdapter ' Based on fake86's implementation
1010

1111
Private mCPU As X8086
1212

13-
Private waveForm()() As Byte = {
14-
New Byte() {1, 8, 13, 20, 25, 32, 36, 42, 46, 50, 54, 57, 60, 61, 62, 64, 63, 65, 61, 61, 58, 55, 51, 49, 44, 38, 34, 28, 23, 16, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
15-
New Byte() {1, 8, 13, 21, 25, 31, 36, 43, 45, 50, 54, 57, 59, 62, 63, 63, 63, 64, 63, 59, 59, 55, 52, 48, 44, 38, 34, 28, 23, 16, 10, 4, 2, 7, 14, 20, 26, 31, 36, 42, 45, 51, 54, 56, 60, 62, 62, 63, 65, 63, 62, 60, 58, 55, 52, 48, 44, 38, 34, 28, 23, 17, 10, 3},
16-
New Byte() {1, 8, 13, 20, 26, 31, 36, 42, 46, 51, 53, 57, 60, 62, 61, 66, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 21, 25, 32, 36, 41, 47, 50, 54, 56, 60, 62, 61, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
17-
New Byte() {1, 8, 13, 20, 26, 31, 37, 41, 47, 49, 54, 58, 58, 62, 63, 63, 64, 63, 62, 61, 58, 55, 52, 47, 45, 38, 34, 27, 23, 17, 10, 4, -2, -8, -15, -21, -26, -34, -36, -42, -48, -51, -54, -59, -60, -62, -64, -65, -65, -63, -64, -61, -59, -56, -53, -48, -46, -39, -36, -28, -24, -17, -11, -6}
13+
Private waveForm()() As Short = {
14+
New Short() {1, 8, 13, 20, 25, 32, 36, 42, 46, 50, 54, 57, 60, 61, 62, 64, 63, 65, 61, 61, 58, 55, 51, 49, 44, 38, 34, 28, 23, 16, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
15+
New Short() {1, 8, 13, 21, 25, 31, 36, 43, 45, 50, 54, 57, 59, 62, 63, 63, 63, 64, 63, 59, 59, 55, 52, 48, 44, 38, 34, 28, 23, 16, 10, 4, 2, 7, 14, 20, 26, 31, 36, 42, 45, 51, 54, 56, 60, 62, 62, 63, 65, 63, 62, 60, 58, 55, 52, 48, 44, 38, 34, 28, 23, 17, 10, 3},
16+
New Short() {1, 8, 13, 20, 26, 31, 36, 42, 46, 51, 53, 57, 60, 62, 61, 66, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 21, 25, 32, 36, 41, 47, 50, 54, 56, 60, 62, 61, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
17+
New Short() {1, 8, 13, 20, 26, 31, 37, 41, 47, 49, 54, 58, 58, 62, 63, 63, 64, 63, 62, 61, 58, 55, 52, 47, 45, 38, 34, 27, 23, 17, 10, 4, -2, -8, -15, -21, -26, -34, -36, -42, -48, -51, -54, -59, -60, -62, -64, -65, -65, -63, -64, -61, -59, -56, -53, -48, -46, -39, -36, -28, -24, -17, -11, -6}
1818
}
1919

20-
Private oplWave()() As Byte = {
21-
New Byte() {
20+
Private oplWave()() As Short = {
21+
New Short() {
2222
0, 1, 3, 4, 6, 7, 9, 11, 12, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 36, 37, 38, 40, 40, 42, 43, 44, 46, 46, 48, 49, 50, 51, 51, 53,
2323
53, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 116, 116, 116, 116, 116, 116, 116, 116, 116, 64, 64, 64, 63, 63, 63, 62, 62, 61, 61, 60,
2424
59, 59, 58, 57, 57, 56, 55, 54, 53, 53, 51, 51, 50, 49, 48, 46, 46, 44, 43, 42, 40, 40, 38, 37, 36, 34, 33, 31, 30, 29, 27, 26, 24, 23, 22, 20, 18, 17, 15, 14,
@@ -27,7 +27,7 @@ Public Class AdlibAdapter ' Based on fake86's implementation
2727
-63, -63, -63, -62, -62, -61, -61, -60, -59, -59, -58, -57, -57, -56, -55, -54, -53, -53, -51, -51, -50, -49, -48, -46, -46, -44, -43, -42, -40, -40, -38, -37, -36, -34, -33, -31, -30, -29, -27, -26,
2828
-24, -23, -22, -20, -18, -17, -15, -14, -12, -11, -9, -7, -6, -4, -3, -1
2929
},
30-
New Byte() {
30+
New Short() {
3131
0, 1, 3, 4, 6, 7, 9, 11, 12, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 36, 37, 38, 40, 40, 42, 43, 44, 46, 46, 48, 49, 50, 51, 51, 53,
3232
53, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 116, 116, 116, 116, 116, 116, 116, 116, 116, 64, 64, 64, 63, 63, 63, 62, 62, 61, 61, 60,
3333
59, 59, 58, 57, 57, 56, 55, 54, 53, 53, 51, 51, 50, 49, 48, 46, 46, 44, 43, 42, 40, 40, 38, 37, 36, 34, 33, 31, 30, 29, 27, 26, 24, 23, 22, 20, 18, 17, 15, 14,
@@ -36,7 +36,7 @@ Public Class AdlibAdapter ' Based on fake86's implementation
3636
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3737
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
3838
},
39-
New Byte() {
39+
New Short() {
4040
0, 1, 3, 4, 6, 7, 9, 11, 12, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 36, 37, 38, 40, 40, 42, 43, 44, 46, 46, 48, 49, 50, 51, 51, 53,
4141
53, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 116, 116, 116, 116, 116, 116, 116, 116, 116, 64, 64, 64, 63, 63, 63, 62, 62, 61, 61, 60,
4242
59, 59, 58, 57, 57, 56, 55, 54, 53, 53, 51, 51, 50, 49, 48, 46, 46, 44, 43, 42, 40, 40, 38, 37, 36, 34, 33, 31, 30, 29, 27, 26, 24, 23, 22, 20, 18, 17, 15, 14,
@@ -45,7 +45,7 @@ Public Class AdlibAdapter ' Based on fake86's implementation
4545
63, 63, 63, 62, 62, 61, 61, 60, 59, 59, 58, 57, 57, 56, 55, 54, 53, 53, 51, 51, 50, 49, 48, 46, 46, 44, 43, 42, 40, 40, 38, 37, 36, 34, 33, 31, 30, 29, 27, 26,
4646
24, 23, 22, 20, 18, 17, 15, 14, 12, 11, 9, 7, 6, 4, 3, 1
4747
},
48-
New Byte() {
48+
New Short() {
4949
0, 1, 3, 4, 6, 7, 9, 11, 12, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 36, 37, 38, 40, 40, 42, 43, 44, 46, 46, 48, 49, 50, 51, 51, 53,
5050
53, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5151
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -56,41 +56,40 @@ Public Class AdlibAdapter ' Based on fake86's implementation
5656
}
5757
}
5858

59-
Private oplStep() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0}
59+
Private oplStep() As UShort = {0, 0, 0, 0, 0, 0, 0, 0, 0}
6060

6161
Private Structure AdlibOpStruct
62-
Public wave As Byte
62+
Public wave As UShort
6363
End Structure
6464
Private adlibOp(9 - 1)() As AdlibOpStruct
6565

6666
Private Structure AdlibChanStruct
6767
Public Frequency As UShort
6868
Public ConvFreq As Double
69-
Public KeyOn As Byte
69+
Public KeyOn As Boolean
7070
Public Octave As UShort
71-
Public WaveformSelect As Byte
71+
Public WaveformSelect As UShort
7272
End Structure
7373
Private adlibChan(9 - 1) As AdlibChanStruct
7474

75-
Private attackTable() As Double = {1.0003, 1.00025, 1.0002, 1.00015, 1.0001, 1.00009, 1.00008, 1.00007, 1.00006, 1.00005, 1.00004, 1.00003, 1.00002, 1.00001, 1.000005} ' 1.003, 1.05, 1.01, 1.015, 1.02, 1.025, 1.03, 1.035, 1.04, 1.045, 1.05, 1.055, 1.06, 1.065, 1.07, 1.075 }
75+
Private attackTable() As Double = {1.0003, 1.00025, 1.0002, 1.00015, 1.0001, 1.00009, 1.00008, 1.00007, 1.00006, 1.00005, 1.00004, 1.00003, 1.00002, 1.00001, 1.000005}
7676
Private decayTable() As Double = {0.99999, 0.999985, 0.99998, 0.999975, 0.99997, 0.999965, 0.99996, 0.999955, 0.99995, 0.999945, 0.99994, 0.999935, 0.99994, 0.999925, 0.99992, 0.99991}
77-
Private opTable() As Byte = {0, 0, 0, 1, 1, 1, 255, 255, 0, 0, 0, 1, 1, 1, 255, 255, 0, 0, 0, 1, 1, 1}
77+
Private opTable() As UShort = {0, 0, 0, 1, 1, 1, 255, 255, 0, 0, 0, 1, 1, 1, 255, 255, 0, 0, 0, 1, 1, 1}
7878

7979
Private adlibEnv(9 - 1) As Double
8080
Private adlibDecay(9 - 1) As Double
8181
Private adlibAttack(9 - 1) As Double
8282

83-
Private sampleRateAdjust As Double = 1.0
84-
Private Const SampleRate As UInteger = 48000
83+
Private Const SampleRate As UInteger = 44100
8584

8685
Private adlibRegMem(&HFF - 1) As UShort
8786
Private adlibAddr As UShort = 0
8887
Private adlibPrecussion As Boolean = False
8988
Private adlibStatus As Byte = 0
90-
Private adlibStep(9 - 1) As ULong
89+
Private adlibStep(9 - 1) As Long
9190

92-
Private adlibTicks As ULong = X8086.GHz / SampleRate
93-
Private lastAdlibTicks As ULong
91+
Private adlibTicks As Long
92+
Private lastAdlibTicks As Long
9493

9594
Public Sub New(cpu As X8086)
9695
mCPU = cpu
@@ -106,16 +105,6 @@ Public Class AdlibAdapter ' Based on fake86's implementation
106105
ReDim Preserve attackTable(16 - 1)
107106
ReDim Preserve decayTable(16 - 1)
108107
ReDim Preserve opTable(16 - 1)
109-
110-
mCPU.TryAttachHook(8, New X8086.IntHandler(Function()
111-
Dim t As Long = mCPU.Sched.CurrentTime
112-
If t >= (lastAdlibTicks - adlibTicks) Then
113-
AdlibTick()
114-
lastAdlibTicks = t - (t - (lastAdlibTicks + adlibTicks))
115-
End If
116-
117-
Return False
118-
End Function))
119108
End Sub
120109

121110
Public Property Volume As Double
@@ -146,18 +135,35 @@ Public Class AdlibAdapter ' Based on fake86's implementation
146135

147136
Public Overrides Sub InitiAdapter()
148137
waveOut = New WaveOut() With {
149-
.NumberOfBuffers = 32,
138+
.NumberOfBuffers = 8,
150139
.DesiredLatency = 200
151140
}
152-
audioProvider = New CustomBufferProvider(AddressOf FillAudioBuffer, SampleRate)
141+
audioProvider = New CustomBufferProvider(AddressOf FillAudioBuffer, SampleRate, 16, 1)
153142
waveOut.Init(audioProvider)
143+
144+
adlibTicks = (Scheduler.CLOCKRATE / SampleRate) '* waveOut.NumberOfBuffers ' FIXME: I don't this is 100% correct
145+
lastAdlibTicks = Now.Ticks
146+
154147
waveOut.Play()
155148
End Sub
156149

150+
Dim n As Integer = 0
157151
Public Sub FillAudioBuffer(buffer() As Byte)
158-
For i As Integer = 0 To buffer.Length - 1
159-
buffer(i) = Math.Min(255, (AdlibGenerateSample() << 8) * mVolume)
160-
Next
152+
Dim t As Long = Now.Ticks
153+
If t >= (lastAdlibTicks + adlibTicks) Then
154+
Dim v As Integer
155+
For i As Integer = 0 To buffer.Length - 1 Step 2
156+
v = AdlibGenerateSample()
157+
buffer(i) = (v >> 8) And &HFF
158+
buffer(i + 1) = v And &HFF
159+
Next
160+
161+
n += 1
162+
n = n Mod waveOut.NumberOfBuffers
163+
If n = 0 Then AdlibTick()
164+
165+
lastAdlibTicks = t - (t - (lastAdlibTicks + adlibTicks))
166+
End If
161167
End Sub
162168

163169
Public Overrides Function [In](port As UInteger) As UInteger
@@ -197,14 +203,14 @@ Public Class AdlibAdapter ' Based on fake86's implementation
197203
End If
198204
ElseIf port >= &HA0 AndAlso port <= &HB8 Then ' Octave / Frequency / Key On
199205
port = port And 15
200-
If adlibChan(port).KeyOn = 0 AndAlso ((adlibRegMem(&HB0 + port) >> 5) And 1) Then
206+
If Not adlibChan(port).KeyOn AndAlso ((adlibRegMem(&HB0 + port) >> 5) And 1) = 1 Then
201207
adlibAttack(port) = 0
202208
adlibEnv(port) = 0.0025
203209
End If
204210

205211
adlibChan(port).Frequency = adlibRegMem(&HA0 + port) Or ((adlibRegMem(&HB0 + port) And 3) << 8)
206212
adlibChan(port).ConvFreq = adlibChan(port).Frequency * 0.7626459
207-
adlibChan(port).KeyOn = (adlibRegMem(&HB0 + port) >> 5) And 1
213+
adlibChan(port).KeyOn = ((adlibRegMem(&HB0 + port) >> 5) And 1) = 1
208214
adlibChan(port).Octave = (adlibRegMem(&HB0 + port) >> 2) And 7
209215
ElseIf port >= &HE0 And port <= &HF5 Then ' Waveform select
210216
port = port And 15
@@ -215,7 +221,7 @@ Public Class AdlibAdapter ' Based on fake86's implementation
215221
Private Function AdlibFrequency(channel As Byte) As UShort
216222
Dim tmpFrequency As UShort
217223

218-
If adlibChan(channel).KeyOn = 0 Then Return 0
224+
If Not adlibChan(channel).KeyOn Then Return 0
219225
tmpFrequency = adlibChan(channel).ConvFreq
220226

221227
Select Case adlibChan(channel).Octave
@@ -231,29 +237,25 @@ Public Class AdlibAdapter ' Based on fake86's implementation
231237
Return tmpFrequency
232238
End Function
233239

234-
Private Function AdlibSample(currentChannel As Byte) As UInteger
235-
Dim tmpSample As UInteger
236-
Dim tmpStep As Double
237-
Dim fullStep As ULong
238-
239-
If adlibPrecussion AndAlso currentChannel >= 6 AndAlso currentChannel <= 8 Then Return 0
240+
Private Function AdlibSample(channel As Byte) As Integer
241+
If adlibPrecussion AndAlso channel >= 6 AndAlso channel <= 8 Then Return 0
240242

241-
fullStep = SampleRate / AdlibFrequency(currentChannel)
243+
Dim fullStep As Double = SampleRate / AdlibFrequency(channel)
244+
Dim tmpSample As Integer = Int(oplWave(adlibChan(channel).WaveformSelect)(Int(adlibStep(channel) / (fullStep / 256.0) Mod 256)))
242245

243-
tmpSample = oplWave(adlibChan(currentChannel).WaveformSelect)((CDbl(adlibStep(currentChannel)) / (CDbl(fullStep) / 256.0)) Mod 255)
244-
tmpStep = adlibEnv(currentChannel)
245-
If tmpStep > 1 Then tmpStep = 1
246-
tmpSample = CDbl(tmpSample) * tmpStep * 2.0
246+
Dim tmpStep As Double = adlibEnv(channel)
247+
If tmpStep > 1.0 Then tmpStep = 1.0
248+
tmpSample = Int(tmpSample * tmpStep * 2.0)
247249

248-
adlibStep(currentChannel) += 1
249-
If adlibStep(currentChannel) > fullStep Then adlibStep(currentChannel) = 0
250+
adlibStep(channel) += 1
251+
If adlibStep(channel) > fullStep Then adlibStep(channel) = 0
250252
Return tmpSample
251253
End Function
252254

253-
Private Function AdlibGenerateSample() As UShort
254-
Dim adlibAccumulator As UShort = 0
255+
Private Function AdlibGenerateSample() As Integer
256+
Dim adlibAccumulator As Integer = 0
255257
For currentChannel As Byte = 0 To 9 - 1
256-
If AdlibFrequency(currentChannel) <> 0 Then adlibAccumulator += AdlibSample(currentChannel)
258+
If AdlibFrequency(currentChannel) <> 0 Then adlibAccumulator += Int(AdlibSample(currentChannel))
257259
Next
258260
Return adlibAccumulator
259261
End Function

x8086NetEmu/Adapters/Audio/Speaker.vb renamed to x8086NetEmu/Adapters/Audio/SpeakerAdapter.vb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ Public Class CustomBufferProvider
1010
Private wf As WaveFormat
1111
Private fb As FillBuffer
1212

13-
Public Sub New(bufferFiller As FillBuffer, sampleRate As Integer)
14-
wf = New WaveFormat(sampleRate, 8, 1)
13+
Public Sub New(bufferFiller As FillBuffer, sampleRate As Integer, bitDepth As Integer, channels As Integer)
14+
wf = New WaveFormat(sampleRate, bitDepth, channels)
1515
fb = bufferFiller
1616
End Sub
1717

@@ -160,7 +160,7 @@ Public Class SpeakerAdpater
160160
.NumberOfBuffers = 32,
161161
.DesiredLatency = 200
162162
}
163-
audioProvider = New CustomBufferProvider(AddressOf FillAudioBuffer, SampleRate) ' / (1 / mCPU.PIT.Channel(2).GetSquareWavePeriod()))
163+
audioProvider = New CustomBufferProvider(AddressOf FillAudioBuffer, SampleRate, 8, 1)
164164
waveOut.Init(audioProvider)
165165
waveOut.Volume = 1
166166
waveOut.Play()

x8086NetEmu/Adapters/Video/VGA/VGAAdapter.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@
360360
End If
361361
End Function))
362362

363-
'mCPU.TryAttachHook(8, New X8086.IntHandler(Function()
363+
'mCPU.TryAttachHook(&h1c, New X8086.IntHandler(Function()
364364
' Dim t As Long = mCPU.Sched.CurrentTime
365365
' If t >= (lastScanLineTick + scanLineTiming) Then
366366
' curScanLine = (curScanLine + 1) Mod 525

x8086NetEmu/x8086.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Public Class X8086
7676

7777
Public Const KHz As Long = 1000
7878
Public Const MHz As Long = KHz * KHz
79-
Public Const GHz As Long = KHz * MHz
79+
Public Const GHz As Long = MHz * KHz
8080
Private Const BaseClock As Long = 4.77273 * MHz ' http://dosmandrivel.blogspot.com/2009/03/ibm-pc-design-antics.html
8181
Private mCyclesPerSecond As Long = BaseClock
8282
Private clkCyc As Long = 0

x8086NetEmu/x8086NetEmu.vbproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
<Compile Include="Adapters\Adapter.vb" />
144144
<Compile Include="Adapters\Adapters.vb" />
145145
<Compile Include="Adapters\Audio\AdlibAdapter.vb" />
146-
<Compile Include="Adapters\Audio\Speaker.vb" />
146+
<Compile Include="Adapters\Audio\SpeakerAdapter.vb" />
147147
<Compile Include="Adapters\Disk\FileSystem\FAT12_16.vb" />
148148
<Compile Include="Adapters\Disk\FileSystem\StandardDiskFormat.vb" />
149149
<Compile Include="Adapters\Disk\FloppyController.vb" />

x8086NetEmuWinForms/FormEmulator.vb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ Public Class FormEmulator
249249
videoPort.Focus()
250250

251251
cpu.Adapters.Add(New FloppyControllerAdapter(cpu))
252-
cpu.Adapters.Add(New CGAWinForms(cpu, videoPort, If(ConsoleCrayon.RuntimeIsMono, VideoAdapter.FontSources.TrueType, VideoAdapter.FontSources.BitmapFile), "asciivga.dat"))
253-
'cpu.Adapters.Add(New VGAWinForms(cpu, videoPort, If(ConsoleCrayon.RuntimeIsMono, VideoAdapter.FontSources.TrueType, VideoAdapter.FontSources.BitmapFile), "asciivga.dat"))
252+
'cpu.Adapters.Add(New CGAWinForms(cpu, videoPort, If(ConsoleCrayon.RuntimeIsMono, VideoAdapter.FontSources.TrueType, VideoAdapter.FontSources.BitmapFile), "asciivga.dat"))
253+
cpu.Adapters.Add(New VGAWinForms(cpu, videoPort, If(ConsoleCrayon.RuntimeIsMono, VideoAdapter.FontSources.TrueType, VideoAdapter.FontSources.BitmapFile), "asciivga.dat"))
254254
cpu.Adapters.Add(New KeyboardAdapter(cpu))
255255
cpu.Adapters.Add(New MouseAdapter(cpu)) ' This breaks many things (For example, MINIX won't start)
256256

0 commit comments

Comments
 (0)