📄 cpuclass.cls
字号:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CPUClass"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private CPUunRUNNING As Boolean
Private Setp As Boolean
Private FirstLoop As Boolean
Private Declare Function setHigh Lib "bitChng" (ByVal sources As Byte, ByVal irQ As Byte) As Byte 'A|B
Private Declare Function setLow Lib "bitChng" (ByVal sources As Byte, ByVal irQ As Byte) As Byte 'A&(~B)
Private Declare Function setHigh2 Lib "bitChng" (ByVal sources As Integer, ByVal irQ As Integer) As Integer 'A|B
Private Declare Function setLow2 Lib "bitChng" (ByVal sources As Integer, ByVal irQ As Integer) As Integer 'A&(~B)
Private Declare Function setHigh4 Lib "bitChng" (ByVal sources As Long, ByVal irQ As Long) As Long 'A|B
Private Declare Function setLow4 Lib "bitChng" (ByVal sources As Long, ByVal irQ As Long) As Long 'A&(~B)
Dim Low8_Data As Byte
Dim High8_CMD As Byte
'要引发该事件,请遵循下列语法使用 RaiseEvent:
'RaiseEvent InterruptEvent[(arg1, arg2, ... , argn)]
Public Event InterruptEvent(ByVal Data As Byte, ByVal PSW As Byte)
'要引发该事件,请遵循下列语法使用 RaiseEvent:
'RaiseEvent StartDevice[(arg1, arg2, ... , argn)]
Public Event StartDevice(ByVal TimeData As Byte, ByVal LetDevice As Byte)
'Private WithEvents Bus As BusClass
Private Bus As BusClass
Private WithEvents Timm As clsXTimer
Attribute Timm.VB_VarHelpID = -1
'local variable(s) to hold property value(s)
Private mvarIR As Integer 'local copy
Private mvarDR As Byte 'local copy
Private mvarPSW As Byte 'local copy
Private mvarPC As Integer 'local copy
'要引发该事件,请遵循下列语法使用 RaiseEvent:
'RaiseEvent CPUSETPEX[(arg1, arg2, ... , argn)]
Public Event CPUSETPEX()
Public Sub ResetCpu()
mvarIR = 0
mvarDR = 0
mvarPSW = 0
mvarPC = 0
Setp = True
FirstLoop = True
End Sub
Public Property Let PC(ByVal vData As Integer)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.PC = 5
mvarPC = vData
End Property
Public Property Get PC() As Integer
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.PC
PC = mvarPC
End Property
Public Property Let PSW(ByVal vData As Byte)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.PSW = 5
mvarPSW = vData
End Property
Public Property Get PSW() As Byte
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.PSW
PSW = mvarPSW
End Property
Public Property Let DR(ByVal vData As Byte)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.DR = 5
mvarDR = vData
End Property
Public Property Get DR() As Byte
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.DR
DR = mvarDR
End Property
Public Property Let IR(ByVal vData As Integer)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.IR = 5
mvarIR = vData
End Property
Public Property Get IR() As Integer
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.IR
IR = mvarIR
End Property
Public Sub Halt()
Timm.Enabled = False
End Sub
Public Sub Start()
Timm.Enabled = True
End Sub
Private Sub Class_Initialize()
mvarPC = 0
CPUunRUNNING = True
Set Bus = New BusClass
Set Timm = New clsXTimer
Timm.Interval = 10
Setp = True
FirstLoop = True
End Sub
Private Sub Class_Terminate()
Set Bus = Nothing
Set Timm = Nothing
End Sub
Private Sub Timm_Tick()
Timm.Enabled = False
If CPUunRUNNING Then
CPUunRUNNING = False
'MsgBox "PSW:&H" + Hex$(mvarPSW) + " PC:&H" + Hex$(mvarPC) + " IR:&H" + Hex$(mvarIR) + " DR:&H" + Hex$(mvarDR), vbOKOnly + vbInformation, "CPUmsg"
If Setp And FirstLoop Then
mvarPSW = setHigh(mvarPSW, CByte(setLow2(Bus.ControlBus, &HFF00)))
RaiseEvent CPUSETPEX
If mvarPSW Then
RaiseEvent InterruptEvent(Bus.DataBus, mvarPSW)
Bus.ControlBus = setLow2(Bus.ControlBus, mvarPSW)
mvarPSW = 0 'setLow(mvarPSW, mvarPSW)
End If
If mvarPC > &H3FF Then
mvarPC = 0
End If
Bus.AddressBus = mvarPC
mvarPC = mvarPC + 1
Bus.ControlBus = setLow2(Bus.ControlBus, &H6000)
Bus.ControlBus = setHigh2(Bus.ControlBus, &H2000)
Setp = False
End If
If setLow2(Bus.ControlBus, &HBFFF) = &H4000 And FirstLoop Then
mvarIR = Bus.DataBus * 256
High8_CMD = Bus.DataBus
If mvarPC > &H3FF Then
mvarPC = 0
End If
Bus.AddressBus = mvarPC
mvarPC = mvarPC + 1
Bus.ControlBus = setLow2(Bus.ControlBus, &H6000)
Bus.ControlBus = setHigh2(Bus.ControlBus, &H2000)
FirstLoop = False
End If
If setLow2(Bus.ControlBus, &HBFFF) = &H4000 And FirstLoop = False Then
RaiseEvent CPUSETPEX
mvarIR = mvarIR + Bus.DataBus
Low8_Data = Bus.DataBus
FirstLoop = True
Setp = True
Select Case setLow(High8_CMD, &H87)
Case 72 'restart
mvarPC = mvarPC - 2
Case 64 '==
mvarDR = Low8_Data
Case 32 '++
If DR = 255 Then
mvarPSW = setHigh(mvarPSW, 128)
mvarDR = 0
Else
mvarDR = mvarDR + 1
End If
Case 16 '--
If mvarDR = 0 Then
mvarPSW = setHigh(mvarPSW, 128)
mvarDR = 255
Else
mvarDR = mvarDR - 1
End If
Case 8 '!XY
Dim D3to5 As Byte
Select Case setLow(High8_CMD, &HF8)
Case 1
D3to5 = 1
Case 2
D3to5 = 2
Case 3
D3to5 = 4
Case 4
D3to5 = 8
Case 5
D3to5 = 16
Case Else
D3to5 = 0
End Select
RaiseEvent StartDevice(Low8_Data, D3to5)
Case 120 'end
mvarPSW = setHigh(mvarPSW, 64)
Bus.DataBus = mvarDR
End Select
End If
CPUunRUNNING = True
End If
Timm.Enabled = True
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -