⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpuclass.cls

📁 简单的操作系统程序
💻 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 + -