?? main.bas
字號:
Attribute VB_Name = "ModMain"
Option Explicit
'該類型數據用于存儲機器碼數據
Public Type MyType
D As Byte
F As Boolean
End Type
'0~FFFFH個數據
Public BD(0 To 65535) As MyType
'入口地址的數據結構
Public Type MyPort
Addr As Long
Label As String
End Type
'
Public Type MyDataDBDW
Label As String
Addr As Long
Length As Long
DType As Boolean
End Type
'作為入口地址的FIFO
Public PortIn(0 To 5000) As MyPort
Public ProIn(0 To 1000) As MyPort
Public IP As Long
Public DataIn(0 To 1000) As MyDataDBDW
Public CDB As MyDataDBDW
Public CP As MyPort
Public L As String '回車換行符
'Public CP.addr As Long '下一個待編譯的語句的開始地址
'Public CP.label As String '下一個語句的開始字符
Public Const MyTab = " "
Public OpenFilePathName As String
Public SaveFilePathName As String
Public ASM(-1 To 65535) As String
Public SP As Integer 'FIFO入口指針
Public SO As Integer 'FIFO出口指針
Public DP As Integer 'FIFO入口指針
'Public DU As Integer 'FIFO出口指針
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Reg_code As Long
Public CDKey As String
Public Reg_OK As Boolean '軟件是否注冊
Public User_OK As Boolean '軟件是否還能使用
Public Num As Integer '軟件使用的次數
Public Const ASCode = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Public Sub Main()
User_OK = True
Reg_OK = RegMe
'init
SO = 0
SP = 0
DP = 0
Dim i As Long
L = Chr(13) + Chr(10)
For i = 0 To 65535
BD(i).D = 255
BD(i).F = False
ASM(i) = ""
Next i
For i = 0 To 5000
PortIn(i).Addr = -1
Next i
For i = 0 To 1000
DataIn(i).Addr = -1
Next i
For i = 1 To 1000
ProIn(i).Addr = -1
Next i
IP = 1
ProIn(0).Addr = 0
ProIn(0).Label = "BEGIN:"
FrmMain.Show
End Sub
Public Function Val4Hex(ByVal Str As String) As Long
'四位十六進制字符轉為Int數據
If Len(Str) > 4 Then Str = Right(Str, 4)
Val4Hex = Val("&H" + Right(Str, 2)) + 256 * Val("&H" + Left(Str, Len(Str) - 2))
End Function
Public Function NonASM(ByVal Addr As Integer) As String
'使用的全局變量有CP.addr,CP.label
'CP.addr表示下一個要編譯的數據地址
'CP.label表示下一個語句前面的字符
Dim Dt As Integer
Dim Op As Long '暫存操作數
Dim SOp As String
Dim LAddr As Long
Dim SLAddr As String
Dim i As Integer
If BD(Addr).F Then
i = Len(ASM(Addr))
If i > 7 Then NonASM = CP.Label + Right(ASM(Addr), Len(ASM(Addr)) - 6)
CP.Label = MyTab
CP.Addr = -1
Exit Function
End If
Dt = BD(Addr).D
BD(Addr).F = True
CP.Addr = Addr + 1
Select Case Dt
Case 0
NonASM = CP.Label + "NOP"
CP.Label = MyTab
Case 1, 33, 65, 97, 129, 161, 193, 225 'AJMP
CP.Addr = -1
Op = (Addr \ &H800) * &H800 + 256 * (Dt \ 32)
Op = Op + BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = Hex(Op)
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
SOp = "L" + SOp
PUSH SOp + ":", Op
NonASM = CP.Label + "AJMP " + SOp
CP.Label = MyTab
Case 2
Op = BD(Addr + 1).D
Op = Op * 256 + BD(Addr + 2).D
BD(Addr + 1).F = True
BD(Addr + 2).F = True
SLAddr = Hex(Op)
If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
SLAddr = "L" + SLAddr
NonASM = CP.Label + "LJMP " + SLAddr
CP.Addr = Op
CP.Label = SLAddr + ":"
Case 3
NonASM = CP.Label + "RR A"
CP.Label = MyTab
Case 4
NonASM = CP.Label + "INC A"
' CP.addr = Addr + 1
CP.Label = MyTab
Case 5
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "INC " + SOp
CP.Addr = CP.Addr + 1
CP.Label = MyTab
Case 6
NonASM = CP.Label + "INC @R0"
' CP.addr = Addr + 1
CP.Label = MyTab
Case 7
NonASM = CP.Label + "INC @R1"
' CP.addr = Addr + 1
CP.Label = MyTab
Case 8 To 15
Op = Dt Mod 16 '求Rn的下標n的串
SOp = Hex(Op Mod 8)
NonASM = CP.Label + "INC R" + SOp
' CP.addr = Addr + 1
CP.Label = MyTab
Case 16 'JBC BIT,REL
CP.Addr = CP.Addr + 2
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "JBC " + SOp + ","
Op = BD(Addr + 2).D
BD(Addr + 2).F = True
SOp = RelAddrFunc(Op)
NonASM = NonASM + SOp
CP.Label = MyTab
Case 17, 49, 81, 113, 145, 177, 209, 241
CP.Addr = CP.Addr + 1
Op = (Addr \ &H800) * &H800 + 256 * (Dt \ 32)
Op = Op + BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = Hex(Op)
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
SOp = "L" + SOp
PUSH SOp + ":", Op
NonASM = CP.Label + "ACALL " + SOp
CP.Label = MyTab
Case 18
CP.Addr = CP.Addr + 2
Op = BD(Addr + 1).D * 256 + BD(Addr + 2).D
BD(Addr + 1).F = True
BD(Addr + 2).F = True
SOp = Hex(Op)
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
If Len(SOp) < 4 Then SOp = "0" + SOp
SOp = "L" + SOp
PUSH SOp + ":", Op 'Save Port In
NonASM = CP.Label + "LCALL " + SOp
CP.Label = MyTab
Case 19
' CP.addr = Addr + 1
NonASM = CP.Label + "RRC A"
CP.Label = MyTab
Case 20
NonASM = CP.Label + "DEC A"
' CP.addr = Addr + 1
CP.Label = MyTab
Case 21
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "DEC " + SOp
CP.Label = MyTab
Case 22
NonASM = CP.Label + "DEC @R0"
CP.Addr = CP.Addr + 1
CP.Label = MyTab
Case 23
NonASM = "DEC @R1"
CP.Label = MyTab
Case 24 To 31
Op = Dt Mod 16
SOp = Hex(Op Mod 8)
NonASM = "DEC R" + SOp
CP.Label = MyTab
Case 32
CP.Addr = CP.Addr + 2
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "JB " + SOp + ","
Op = BD(Addr + 2).D
BD(Addr + 2).F = True
SOp = RelAddrFunc(Op) '計算rel,得到addr$
NonASM = NonASM + SOp
CP.Label = MyTab
Case 34
NonASM = CP.Label + "RET"
CP.Addr = -1
Case 35
NonASM = CP.Label + "RL A"
CP.Label = MyTab
Case 36
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ADD A,#" + SOp
CP.Label = MyTab
Case 37
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ADD A," + SOp
CP.Label = MyTab
Case 38
NonASM = CP.Label + "ADD A,@R0"
CP.Label = MyTab
Case 39
NonASM = CP.Label + "ADD A,@R1"
CP.Label = MyTab
Case 40 To 47
Op = Dt Mod 16
SOp = Hex(Op Mod 8)
NonASM = CP.Label + "ADD A,R" + SOp
CP.Label = MyTab
Case 48
CP.Addr = CP.Addr + 2
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "JNB " + SOp + ","
Op = BD(Addr + 2).D
BD(Addr + 2).F = True
SOp = RelAddrFunc(Op)
'計算rel,得到addr$
NonASM = NonASM + SOp
CP.Label = MyTab
Case 50
NonASM = CP.Label + "RETI"
CP.Addr = -1
Case 51
NonASM = CP.Label + "RLC A"
CP.Label = MyTab
Case 52
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ADDC A,#" + SOp
CP.Label = MyTab
Case 53
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ADDC A," + SOp
CP.Label = MyTab
Case 54
NonASM = CP.Label + "ADDC A,@R0"
CP.Label = MyTab
Case 55
NonASM = CP.Label + "ADDC A,@R1"
CP.Label = MyTab
Case 56 To 63
Op = Dt Mod 16
SOp = Hex(Op Mod 8)
NonASM = CP.Label + "ADDC A,R" + SOp
Case 64
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = RelAddrFunc(Op)
NonASM = CP.Label + "JC " + SOp
CP.Label = MyTab
Case 66
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ORL " + SOp + ",A"
Case 67
CP.Addr = CP.Addr + 2
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ORL " + SOp + ",#"
Op = BD(Addr + 2).D
BD(Addr + 2).F = True
SOp = MyHex(Op)
NonASM = NonASM + SOp
CP.Label = MyTab
Case 68
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = MyHex(Op)
NonASM = CP.Label + "ORL A,#" + SOp
CP.Label = MyTab
Case 69
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
SOp = MyHex(Op)
NonASM = CP.Label + "ORL A," + SOp
CP.Label = MyTab
Case 70
NonASM = CP.Label + "ORL A,@R0"
CP.Label = MyTab
Case 71
NonASM = CP.Label + "ORL A,@R1"
CP.Label = MyTab
Case 72 To 79
Op = Dt Mod 16
SOp = Hex(Op Mod 8)
NonASM = CP.Label + "ORL A,R" + SOp
CP.Label = MyTab
Case 80
CP.Addr = CP.Addr + 1
Op = BD(Addr + 1).D
BD(Addr + 1).F = True
SOp = RelAddrFunc(Op)
NonASM = CP.Label + "JNC " + SOp
CP.Label = MyTab
Case 82
CP.Addr = CP.Addr + 1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -