Я пытался закодировать собственный 8-битный двоичный вывод виртуального устройства Emu8086 (эмулятор микропроцессора 8086), который отображает ввод сборки как двоичный вывод:
MOV AX, 0FFH -> ВЫХОД: 1111 1111
Мне удалось получить пользовательский интерфейс из исходного кода образца виртуального устройства Visual Basic 6.0, который отображает десятичный вывод из ввода сборки.
Исходный пользовательский интерфейс из образца виртуального устройства LED_Display
Пользовательский интерфейс, полученный из образца виртуального устройства LED_Display (изображение)
Мне пришлось обновить исходный код Visual Basic 6.0 до кода, совместимого с Visual Studio 2008, и подумал, может быть, проблема в этом?
Но всякий раз, когда я отлаживаю код, он работает по своему желанию, прослушивая номер порта, назначенный для ввода сборки, когда я запускаю эмулятор, и отображает желаемые двоичные эквивалентные числа.
Однако при использовании автономного файла .exe он больше не работает. Я включил IO.VB (io.bas перед обновлением), который необходимо было включить как отдельный модуль в один файл VB, думая, что он может быть виновником, но безрезультатно.
Option Strict Off
Option Explicit On
Module io
Const sIO_FILE As String = "C:\emu8086.io"
Function READ_IO_BYTE(ByRef lPORT_NUM As Integer) As Byte
On Error GoTo err_rib
Dim sFileName As String
Dim tb As Byte
Dim fNum As Short
sFileName = sIO_FILE
fNum = FreeFile()
FileOpen(fNum, sFileName, OpenMode.Random, , OpenShare.Shared, 1)
' File's first byte has Index 1 in VB
' compatibility for Port 0:
'UPGRADE_WARNING: Get was upgraded to FileGet and has a new behavior. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"'
FileGet(fNum, tb, lPORT_NUM + 1)
FileClose(fNum)
READ_IO_BYTE = tb
Exit Function
err_rib:
Debug.Print("READ_IO_BYTE: " & Err.Description)
FileClose(fNum)
End Function
Sub WRITE_IO_BYTE(ByRef lPORT_NUM As Integer, ByRef uValue As Byte)
On Error GoTo err_wib
Dim sFileName As String
Dim fNum As Short
sFileName = sIO_FILE
fNum = FreeFile()
FileOpen(fNum, sFileName, OpenMode.Random, , OpenShare.Shared, 1)
' File's first byte has Index 1 in VB
' compatibility for Port 0:
'UPGRADE_WARNING: Put was upgraded to FilePut and has a new behavior. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"'
FilePut(fNum, uValue, lPORT_NUM + 1)
FileClose(fNum)
Exit Sub
err_wib:
Debug.Print("WRITE_IO_BYTE: " & Err.Description)
FileClose(fNum)
End Sub
Function READ_IO_WORD(ByRef lPORT_NUM As Integer) As Short
Dim tb1 As Byte
Dim tb2 As Byte
' Read lower byte:
tb1 = READ_IO_BYTE(lPORT_NUM)
' Write higher byte:
tb2 = READ_IO_BYTE(lPORT_NUM + 1)
READ_IO_WORD = make16bit_SIGNED_WORD(tb1, tb2)
End Function
Sub WRITE_IO_WORD(ByRef lPORT_NUM As Integer, ByRef iValue As Short)
Dim tb1 As Byte
Dim tb2 As Byte
' Write lower byte:
WRITE_IO_BYTE(lPORT_NUM, iValue And 255) ' 00FF
' Write higher byte:
WRITE_IO_BYTE(lPORT_NUM + 1, CShort(iValue And 65280) / 256) ' FF00 >> 8
End Sub
' This function corrects the file path by adding "\"
' in the end if required:
Function AddTrailingSlash(ByRef sPath As String) As String
If (sPath <> "") Then
If (Mid(sPath, Len(sPath), 1) <> "\") Then
AddTrailingSlash = sPath & "\"
Exit Function
End If
End If
AddTrailingSlash = sPath
End Function
Function make16bit_SIGNED_WORD(ByRef byteL As Byte, ByRef byteH As Byte) As Short
Dim temp As Integer
' lower byte - on lower address!
' byte1 - lower byte!
temp = byteH
temp = temp * 256 ' shift left by 8 bit.
temp = temp + byteL
make16bit_SIGNED_WORD = make_signed_int(temp)
End Function
' Makes a Long to be a SIGNED Integer:
Function make_signed_int(ByRef l As Integer) As Short
If l >= -32768 And l < 65536 Then
If l <= 32767 Then
make_signed_int = l
Else
make_signed_int = l - 65536
End If
Else
make_signed_int = 0
Debug.Print("wrong param calling make_signed_int(): " & l)
End If
End Function
End Module
Вот код виртуального устройства:
Friend Class frmLed
Inherits System.Windows.Forms.Form
Dim lPrevResult As Integer ' #1122d
Function PrevInstance() As Boolean
If UBound(Diagnostics.Process.GetProcessesByName _
(Diagnostics.Process.GetCurrentProcess.ProcessName)) _
> 0 Then
Return True
Else
Return False
End If
End Function
Private Sub frmLed_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
' do not allow more than one copy of this program to run simuateniously
'UPGRADE_ISSUE: App property App.PrevInstance was not upgraded. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="076C26E5-B7A9-4E77-B69C-B4448DF39E58"'
If PrevInstance() Then
ShowPrevInstance()
End ' terminate this instance!
End If
GetWindowPos(Me)
If allow_on_top() Then set_on_top(Me)
End Sub
Private Sub frmLed_FormClosed(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
SaveWindowState(Me)
End Sub
Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick
On Error GoTo err1
' Intenger values:
' -32,768 to 32,767
Dim lResult As Integer
' Read SIGNED WORD from port 199:
lResult = READ_IO_WORD(199)
If lPrevResult <> lResult Then ' #1122d
If shall_activate(Me) Then Me.Show()
lPrevResult = lResult
End If
' Show minus if required:
If lResult < 0 Then
imgMINUS.Visible = True
lResult = System.Math.Abs(lResult)
Else
imgMINUS.Visible = False
End If
' Display 5 digits:
Dim i As Short
Dim v As Byte
Dim dec, bin As Integer
For i = 0 To 7
v = lResult Mod 10
bin = Fix(lResult) Mod 2
dig(i).Image = d(bin).Image
lResult = Int(lResult / 2)
Next i
Exit Sub
err1:
Debug.Print("err1")
Resume Next
End Sub
End Class
Я не понимаю, почему он работает в состоянии отладки IDE, но не работает при запуске в виде файла .exe. Любые идеи будут очень признательны! Спасибо!