Пользовательская отладка 8-битного двоичного виртуального устройства Emu8086

Я пытался закодировать собственный 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. Любые идеи будут очень признательны! Спасибо!


person Heidrake    schedule 14.04.2018    source источник


Ответы (1)


Установил Visual Basic 6.0 на свой компьютер, изменил там образец кода и все получилось. Виртуальное устройство в действии

person Heidrake    schedule 27.04.2018