2013-04-07 2 views
0

Я пытаюсь создать конвертер смещения Z80, но когда я скомпилирую программу и протестирую ее, выходные переменные выходят как ноль.Преобразователь указателя, возвращающий неверные значения

Математика за ней идет как это:

  1. Возьмите смещение, которое вы хотите указать.
  2. Возьмите последние четыре цифры смещения и отрежьте остальные.
  3. Если смещение находится вне диапазона & H4000 - & H7FFF, он должен быть преобразован следующим образом: (смещение% & H4000) + & H4000. Другими словами:
    • Если смещение составляет от & H0000 до & H3FFF, добавьте & H4000 на смещение.
    • Если смещение составляет от & H4000 до & H7FFF, ничего не делайте со смещением.
    • Если смещение составляет от & H8000 до & HBFFF, вычесть & H4000 со смещения.
    • Если смещение составляет от & HC000 до & HFFFF, вычесть & H8000 со смещения.

Код события, вызываемой по нажатию кнопки преобразования, как так:

Private Sub ConvertButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConvertButton.Click 
    If GetOffsetRadioButton.Checked Then 
     If OffsetTextBox.TextLength > 0 Then 
      CoreActions.OffsetToPointer() 
      PointerTextBox.Text = CoreActions.NewOffset 
      PointerBankTextBox.Text = CoreActions.NewBank 
     End If 
    End If 
End Sub 

Кроме того, вот код за преобразования в модуле CoreActions

Module CoreActions 
    Friend HexOffset As String = CoreForm.OffsetTextBox.Text 
    Friend PointerOffset As UInteger 
    Friend PointerBank As UInteger 
    Friend NewBank As String 
    Friend NewOffset As String 
    Friend Sub OffsetToPointer() 
     Dim DecOffset As Integer = Val("&H" & HexOffset) 
     PointerBank = DecOffset Mod 16384 ' 16384 = &H4000 
     PointerOffset = DecOffset Mod 65536 ' 65536 = &H10000 
     NewBank = Convert.ToString(PointerBank, 16) 
     NewOffset = Convert.ToString(PointerOffset, 16) 
    End Sub 
End Module 

Что именно происходит, когда выходы выходят как ничто? Я не получаю никаких исключений или предупреждений во время выполнения ...

+0

Что вы хотите сделать, это побитовая операция и смещение бит, правильно? – Fredou

+0

да, в основном. – AlexTheRose

+0

Что такое 'PointerOffset'? Мне кажется, что вы просто хотите взять «PointerBank» и добавить 4000h. Если вы действительно хотите «PointerOffset», то вы, вероятно, захотите разделить на 4000 часов, поскольку я не думаю, что ваш modulo достигает чего-то. У вас также есть две вещи, которые называются противоположными нормальными соглашениями. – Tommy

ответ

1

В основном это даст желаемый результат.

Dim FixedOffset As Integer = (DecOffset And &H3FFF) Or &H4000