OpenCores
URL https://opencores.org/ocsvn/klc32/klc32/trunk

Subversion Repositories klc32

[/] [klc32/] [trunk/] [software/] [klasm/] [klasm/] [klasm/] [Module1.vb] - Diff between revs 11 and 14

Only display areas with differences | Details | Blame | View Log

Rev 11 Rev 14
Imports System.IO
Imports System.IO
Module Module1
Module Module1
    Dim strs() As String
    Dim strs() As String
    Dim pass As Integer
    Dim pass As Integer
    Dim lname As String
    Dim lname As String
    Dim address As Int32
    Dim address As Int32
    Public ofs As System.IO.TextWriter
    Public ofs As System.IO.TextWriter
    Public lfs As System.IO.TextWriter
    Public lfs As System.IO.TextWriter
    Public labels As New Collection
    Public labels As New Collection
    Public symbols As New Collection
    Public symbols As New Collection
    Dim iline As String
    Dim iline As String
    Dim lnc As Integer
    Dim lnc As Integer
    Sub Main()
    Sub Main()
        Dim tr As TextReader
        Dim tr As TextReader
        Dim fn As String
        Dim fn As String
        Dim args() As String
        Dim args() As String
        Dim text As String
        Dim text As String
        Dim lines() As String
        Dim lines() As String
        Dim line As String
        Dim line As String
        Dim n As Integer
        Dim n As Integer
        Dim s As String
        Dim s As String
        Dim delimiters As String = " ," & vbTab
        Dim delimiters As String = " ," & vbTab
        Dim p() As Char = delimiters.ToCharArray()
        Dim p() As Char = delimiters.ToCharArray()
        args = System.Environment.GetCommandLineArgs()
        args = System.Environment.GetCommandLineArgs()
        lname = args(1)
        lname = args(1)
        lname = lname.Replace(".s", ".lst")
        lname = lname.Replace(".s", ".lst")
        lname = lname.Replace(".asm", ".lst")
        lname = lname.Replace(".asm", ".lst")
        tr = System.IO.File.OpenText(args(1))
        tr = System.IO.File.OpenText(args(1))
        text = tr.ReadToEnd()
        text = tr.ReadToEnd()
        tr.Close()
        tr.Close()
        text = text.Replace(vbCr, "")
        text = text.Replace(vbCr, "")
        lines = text.Split(vbLf.ToCharArray)
        lines = text.Split(vbLf.ToCharArray)
        For pass = 1 To 2
        For pass = 1 To 2
            If pass = 2 Then
            If pass = 2 Then
                ofs = System.IO.File.CreateText(args(2))
                ofs = System.IO.File.CreateText(args(2))
                lfs = System.IO.File.CreateText(lname)
                lfs = System.IO.File.CreateText(lname)
            End If
            End If
            address = 0
            address = 0
            lnc = 0
            lnc = 0
            For Each iline In lines
            For Each iline In lines
                lnc = lnc + 1
                lnc = lnc + 1
                line = iline
                line = iline
                n = line.IndexOf(";")
                n = line.IndexOf(";")
                If n >= 0 Then
                If n >= 0 Then
                    line = line.Substring(0, n - 1)
                    line = line.Substring(0, n - 1)
                End If
                End If
                line = line.Trim()
                line = line.Trim()
                line = CompressSpaces(line)
                line = CompressSpaces(line)
                line = line.Replace(", ", ",")
                line = line.Replace(", ", ",")
                If line.Length = 0 Then
                If line.Length = 0 Then
                    emitEmptyLine(iline)    ' there could be comments on the line
                    emitEmptyLine(iline)    ' there could be comments on the line
                Else
                Else
                    strs = line.Split(p)
                    strs = line.Split(p)
                    s = strs(0)
                    s = strs(0)
                    s = s.Trim()
                    s = s.Trim()
                    If s.EndsWith(":") Then
                    If s.EndsWith(":") Then
                        ProcessLabel(s)
                        ProcessLabel(s)
                    Else
                    Else
                        ProcessOp(s)
                        ProcessOp(s)
                    End If
                    End If
                End If
                End If
            Next
            Next
        Next
        Next
        ofs.Close()
        ofs.Close()
        lfs.Close()
        lfs.Close()
    End Sub
    End Sub
    Function CompressSpaces(ByVal s As String) As String
    Function CompressSpaces(ByVal s As String) As String
        Dim l As Integer
        Dim l As Integer
        Do
        Do
            l = s.Length
            l = s.Length
            s = s.Replace(vbTab, " ")
            s = s.Replace(vbTab, " ")
            s = s.Replace("  ", " ")
            s = s.Replace("  ", " ")
        Loop While s.Length <> l
        Loop While s.Length <> l
        Return s
        Return s
    End Function
    End Function
    Sub ProcessTrap(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessTrap(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Cra As Integer
        Dim Cra As Integer
        Cra = GetCrRegister(strs(1))
        Cra = GetCrRegister(strs(1))
        oc = n << 26
        oc = n << 26
        oc = oc Or (Cra << 21)
        oc = oc Or (Cra << 21)
        oc = oc Or (m << 16)
        oc = oc Or (m << 16)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessSet(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessSet(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Cra As Integer
        Dim Cra As Integer
        Dim Rt As Integer
        Dim Rt As Integer
        Cra = GetCrRegister(strs(1))
        Cra = GetCrRegister(strs(1))
        Rt = GetRegister(strs(2))
        Rt = GetRegister(strs(2))
        oc = n << 26
        oc = n << 26
        oc = oc Or (Cra << 21)
        oc = oc Or (Cra << 21)
        oc = oc Or (m << 16)
        oc = oc Or (m << 16)
        oc = oc Or (Rt << 11)
        oc = oc Or (Rt << 11)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessBranch(ByVal oc As Integer, ByVal func As Integer)
    Sub ProcessBranch(ByVal oc As Integer, ByVal func As Integer)
        Dim opcode As Integer
        Dim opcode As Integer
        Dim ra As Int64
        Dim ra As Int64
        Dim rb As Int64
        Dim rb As Int64
        Dim imm As Int64
        Dim imm As Int64
        Dim disp As Int64
        Dim disp As Int64
        Dim L As Label
        Dim L As Label
        Dim P As LabelPatch
        Dim P As LabelPatch
        ra = GetCrRegister(strs(1))
        ra = GetCrRegister(strs(1))
        strs(2) = strs(2).Trim
        strs(2) = strs(2).Trim
        Try
        Try
            L = labels.Item(strs(2))
            L = labels.Item(strs(2))
        Catch
        Catch
            L = Nothing
            L = Nothing
        End Try
        End Try
        If L Is Nothing Then
        If L Is Nothing Then
            L = New Label
            L = New Label
            L.name = strs(2)
            L.name = strs(2)
            L.address = -1
            L.address = -1
            L.slot = -1
            L.slot = -1
            L.defined = False
            L.defined = False
            labels.Add(L, L.name)
            labels.Add(L, L.name)
        End If
        End If
        If Not L.defined Then
        If Not L.defined Then
            P = New LabelPatch
            P = New LabelPatch
            P.type = "B"
            P.type = "B"
            P.address = address
            P.address = address
            L.PatchAddresses.Add(P)
            L.PatchAddresses.Add(P)
        End If
        End If
        'If slot = 2 Then
        'If slot = 2 Then
        '    imm = ((L.address - address - 16) + (L.slot << 2)) >> 2
        '    imm = ((L.address - address - 16) + (L.slot << 2)) >> 2
        'Else
        'Else
        disp = L.address - (address + 4)
        disp = L.address - (address + 4)
        'End If
        'End If
        'imm = (L.address + (L.slot << 2)) >> 2
        'imm = (L.address + (L.slot << 2)) >> 2
        opcode = oc << 26
        opcode = oc << 26
        opcode = opcode Or (ra << 21)
        opcode = opcode Or (ra << 21)
        opcode = opcode Or (func << 16)
        opcode = opcode Or (func << 16)
        opcode = opcode Or (disp And &HFFFF)
        opcode = opcode Or (disp And &HFFFF)
        emit(opcode)
        emit(opcode)
    End Sub
    End Sub
 
 
    Sub ProcessRRop(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessRRop(ByVal n As Integer, ByVal m As Integer, ByVal rc As Boolean)
        Dim oc As Integer
        Dim oc As Integer
        Dim Rt As Integer
        Dim Rt As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim Rb As Integer
        Dim Rb As Integer
        Rt = GetRegister(strs(1))
        Rt = GetRegister(strs(1))
        Ra = GetRegister(strs(2))
        Ra = GetRegister(strs(2))
        Rb = GetRegister(strs(3))
        Rb = GetRegister(strs(3))
        oc = n << 26
        oc = n << 26
 
        oc = oc Or (Ra << 21)
 
        oc = oc Or (Rb << 16)
 
        oc = oc Or (Rt << 11)
 
        oc = oc Or m
 
        If rc Then oc = oc Or 64
 
        emit(oc)
 
    End Sub
 
 
 
    Sub ProcessCRRop(ByVal n As Integer, ByVal m As Integer)
 
        Dim oc As Integer
 
        Dim Rt As Integer
 
        Dim Ra As Integer
 
        Dim Rb As Integer
 
 
 
        Rt = GetCrRegister(strs(1))
 
        Ra = GetCrRegister(strs(2))
 
        Rb = GetCrRegister(strs(3))
 
        oc = n << 26
        oc = oc Or Ra << 21
        oc = oc Or Ra << 21
        oc = oc Or Rb << 16
        oc = oc Or Rb << 16
        oc = oc Or Rt << 11
        oc = oc Or Rt << 11
        oc = oc Or m
        oc = oc Or (m << 1)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessCmpOp(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessCmpOp(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim CRt As Integer
        Dim CRt As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim Rb As Integer
        Dim Rb As Integer
        CRt = GetCrRegister(strs(1))
        CRt = GetCrRegister(strs(1))
        Ra = GetRegister(strs(2))
        Ra = GetRegister(strs(2))
        Rb = GetRegister(strs(3))
        Rb = GetRegister(strs(3))
        oc = n << 26
        oc = n << 26
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 21)
        oc = oc Or (Rb << 16)
        oc = oc Or (Rb << 16)
        oc = oc Or (CRt << 11)
        oc = oc Or (CRt << 13)
        oc = oc Or m
        oc = oc Or m
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessCmpiOp(ByVal n As Integer)
    Sub ProcessCmpiOp(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim CRt As Integer
        Dim CRt As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim imm As Integer
        Dim imm As Integer
        CRt = GetCrRegister(strs(1))
        CRt = GetCrRegister(strs(1))
        Ra = GetRegister(strs(2))
        Ra = GetRegister(strs(2))
        imm = GetImmediate(strs(3))
        imm = GetImmediate(strs(3))
        oc = n << 26
        oc = n << 26
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 21)
        oc = oc Or (CRt << 16)
        oc = oc Or (CRt << 18)
        If imm < -32767 Or imm > 32767 Then
        If imm < -32767 Or imm > 32767 Then
            oc = oc Or &H8000
            oc = oc Or &H8000
            emit(oc)
            emit(oc)
            emit1(imm, True)
            emit1(imm, True)
        Else
        Else
            oc = oc Or (imm And &HFFFF)
            oc = oc Or (imm And &HFFFF)
            emit(oc)
            emit(oc)
        End If
        End If
    End Sub
    End Sub
    Sub ProcessLdi(ByVal n As Integer)
    Sub ProcessLdi(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Rt As Integer
        Dim Rt As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim imm As Integer
        Dim imm As Integer
        Rt = GetRegister(strs(1))
        Rt = GetRegister(strs(1))
        Ra = 0
        Ra = 0
        imm = GetImmediate(strs(2))
        imm = GetImmediate(strs(2))
        oc = n << 26
        oc = n << 26
        oc = oc Or Ra << 21
        oc = oc Or Ra << 21
        oc = oc Or Rt << 16
        oc = oc Or Rt << 16
        If imm < -32767 Or imm > 32767 Then
        If imm < -32767 Or imm > 32767 Then
            oc = oc Or &H8000
            oc = oc Or &H8000
            emit(oc)
            emit(oc)
            emit1(imm, True)
            emit1(imm, True)
        Else
        Else
            oc = oc Or (imm And &HFFFF)
            oc = oc Or (imm And &HFFFF)
            emit(oc)
            emit(oc)
        End If
        End If
    End Sub
    End Sub
 
 
 
    Sub ProcessExec()
 
        Dim oc As Integer
 
        Dim Ra As Integer
 
 
 
        Ra = GetRegister(strs(1))
 
        oc = 1 << 26
 
        oc = oc Or (Ra << 21)
 
        oc = oc Or 63
 
        emit(oc)
 
    End Sub
 
 
    Sub ProcessOri(ByVal n As Integer)
    Sub ProcessOri(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Rt As Integer
        Dim Rt As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim imm As Integer
        Dim imm As Integer
 
 
 
        If strs(1).ToLower = "cr" Then
 
            imm = GetImmediate(strs(2))
 
            oc = 19 << 26
 
            Select Case (strs(0))
 
                Case "andi"
 
                    oc = oc Or (8 << 16)
 
                Case "ori"
 
                    oc = oc Or (9 << 16)
 
                Case "eori"
 
                    oc = oc Or (10 << 16)
 
            End Select
 
            If imm < -32767 Or imm > 32767 Then
 
                oc = oc Or &H8000
 
                emit(oc)
 
                emit1(imm, True)
 
            Else
 
                oc = oc Or (imm And &HFFFF)
 
                emit(oc)
 
            End If
 
            Return
 
        End If
        Rt = GetRegister(strs(1))
        Rt = GetRegister(strs(1))
        Ra = GetRegister(strs(2))
        Ra = GetRegister(strs(2))
        imm = GetImmediate(strs(3))
        imm = GetImmediate(strs(3))
        oc = n << 26
        oc = n << 26
        oc = oc Or Ra << 21
        oc = oc Or Ra << 21
        oc = oc Or Rt << 16
        oc = oc Or Rt << 16
        If imm < -32767 Or imm > 32767 Then
        If imm < -32767 Or imm > 32767 Then
            oc = oc Or &H8000
            oc = oc Or &H8000
            emit(oc)
            emit(oc)
            emit1(imm, True)
            emit1(imm, True)
        Else
        Else
            oc = oc Or (imm And &HFFFF)
            oc = oc Or (imm And &HFFFF)
            emit(oc)
            emit(oc)
        End If
        End If
    End Sub
    End Sub
    Sub ParseAm(ByRef offset As Integer, ByRef reg1 As Integer, ByRef reg2 As Integer)
    Sub ParseAm(ByRef offset As Integer, ByRef reg1 As Integer, ByRef reg2 As Integer)
        Dim s() As String
        Dim s() As String
        Dim t() As String
        Dim t() As String
        offset = 0
        offset = 0
        reg1 = 0
        reg1 = 0
        reg2 = 0
        reg2 = 0
        s = strs(2).Split("(".ToCharArray)
        s = strs(2).Split("(".ToCharArray)
        If s(0).Length > 0 Then
        If s(0).Length > 0 Then
            offset = GetImmediate(s(0))
            offset = GetImmediate(s(0))
        Else
        Else
            offset = 0
            offset = 0
        End If
        End If
        If s.Length > 1 Then
        If s.Length > 1 Then
            s(1) = s(1).TrimEnd(")".ToCharArray)
            s(1) = s(1).TrimEnd(")".ToCharArray)
            t = s(1).Split("+".ToCharArray)
            t = s(1).Split("+".ToCharArray)
            reg1 = GetRegister(t(0))
            reg1 = GetRegister(t(0))
            If t.Length = 2 Then
            If t.Length = 2 Then
                reg2 = GetRegister(t(1))
                reg2 = GetRegister(t(1))
            Else
            Else
                reg2 = 0
                reg2 = 0
            End If
            End If
        End If
        End If
    End Sub
    End Sub
    Sub ProcessLabel(ByVal s As String)
    Sub ProcessLabel(ByVal s As String)
        Dim L As Label
        Dim L As Label
        Dim M As Label
        Dim M As Label
        s = s.TrimEnd(":")
        s = s.TrimEnd(":")
        L = New Label
        L = New Label
        L.name = s
        L.name = s
        L.address = address
        L.address = address
        L.defined = True
        L.defined = True
        If labels.Count > 0 Then
        If labels.Count > 0 Then
            Try
            Try
                M = labels.Item(s)
                M = labels.Item(s)
            Catch
            Catch
                M = Nothing
                M = Nothing
            End Try
            End Try
        Else
        Else
            M = Nothing
            M = Nothing
        End If
        End If
        If M Is Nothing Then
        If M Is Nothing Then
            labels.Add(L, L.name)
            labels.Add(L, L.name)
        Else
        Else
            M.defined = True
            M.defined = True
            M.address = L.address
            M.address = L.address
            M.slot = L.slot
            M.slot = L.slot
        End If
        End If
        emitLabel(L.name)
        emitLabel(L.name)
    End Sub
    End Sub
    Sub ProcessEquate()
    Sub ProcessEquate()
        Dim sym As Symbol
        Dim sym As Symbol
        Dim sym2 As Symbol
        Dim sym2 As Symbol
        If strs(1).ToUpper = "EQU" Then
        If strs(1).ToUpper = "EQU" Then
            sym = New Symbol
            sym = New Symbol
            sym.name = strs(0)
            sym.name = strs(0)
            sym.value = GetImmediate(strs(2))
            sym.value = GetImmediate(strs(2))
            If symbols Is Nothing Then
            If symbols Is Nothing Then
                symbols = New Collection
                symbols = New Collection
            Else
            Else
                Try
                Try
                    sym2 = symbols.Item(sym.name)
                    sym2 = symbols.Item(sym.name)
                Catch
                Catch
                    sym2 = Nothing
                    sym2 = Nothing
                End Try
                End Try
            End If
            End If
            If sym2 Is Nothing Then
            If sym2 Is Nothing Then
                symbols.Add(sym, sym.name)
                symbols.Add(sym, sym.name)
            End If
            End If
            emitEmptyLine(iline)
            emitEmptyLine(iline)
        End If
        End If
    End Sub
    End Sub
 
 
 
    Sub ProcessMov()
 
        Dim oc As Integer
 
        Dim Ra As Integer
 
        Dim Rt As Integer
 
        Dim Crt As Integer
 
        Dim Cra As Integer
 
 
 
        oc = 1 << 26
 
        Rt = GetRegister(strs(1))
 
        Ra = GetRegister(strs(2))
 
        Crt = GetCrRegister(strs(1))
 
        Cra = GetCrRegister(strs(2))
 
        If Crt <> -1 And Cra <> -1 Then
 
            oc = oc Or (Crt << 16)
 
            oc = oc Or (Cra << 21)
 
            oc = oc Or 48
 
            emit(oc)
 
            Return
 
        End If
 
        If Crt <> -1 And Ra <> -1 Then
 
            oc = oc Or (Crt << 16)
 
            oc = oc Or (Ra << 21)
 
            oc = oc Or 50
 
            emit(oc)
 
            Return
 
        End If
 
        If Rt <> -1 And Cra <> -1 Then
 
            oc = oc Or (Cra << 21)
 
            oc = oc Or (Rt << 16)
 
            oc = oc Or 49
 
            emit(oc)
 
            Return
 
        End If
 
        If Rt <> -1 Then
 
            Select Case (strs(2).ToLower)
 
                Case "usp"
 
                    oc = oc Or (Rt << 16)
 
                    oc = oc Or 33
 
                    emit(oc)
 
                    Return
 
                Case "im"
 
                    oc = oc Or (Rt << 16)
 
                    oc = oc Or 54
 
                    emit(oc)
 
                    Return
 
            End Select
 
        Else
 
            Select Case (strs(1))
 
                ' MOV USP,Rn
 
            Case "usp"
 
                    oc = 1 << 26
 
                    oc = oc Or (Ra << 21)
 
                    oc = oc Or 32
 
                    emit(oc)
 
                    Return
 
                    ' MOV IM,Rn
 
                Case "im"
 
                    oc = 1 << 26
 
                    oc = oc Or (Ra << 21)
 
                    oc = oc Or 53
 
                    emit(oc)
 
                    Return
 
            End Select
 
        End If
 
    End Sub
 
 
    Sub ProcessOrg()
    Sub ProcessOrg()
        Dim imm As Int32
        Dim imm As Int32
        imm = GetImmediate(strs(1))
        imm = GetImmediate(strs(1))
        address = imm
        address = imm
        emitLabel("")
        emitLabel("")
    End Sub
    End Sub
 
 
 
    ' PUSH R1/R2/R3/R4/R5
 
    '
    Sub ProcessPush(ByVal n As Integer)
    Sub ProcessPush(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim rs() As String
        Dim rs() As String
        Dim regs(5) As Integer
        Dim regs(5) As Integer
        Dim c As Integer
        Dim c As Integer
        rs = strs(1).Split("/".ToCharArray)
        rs = strs(1).Split("/".ToCharArray)
        For c = 1 To 5
        For c = 1 To 5
            If rs.Length < c Then
            If rs.Length < c Then
                regs(c - 1) = 0
                regs(c - 1) = 0
            Else
            Else
                regs(c - 1) = GetRegister(rs(c - 1))
                regs(c - 1) = GetRegister(rs(c - 1))
            End If
            End If
        Next
        Next
        oc = n << 26
        oc = n << 26
        oc = oc Or regs(0) << 21
        oc = oc Or regs(0) << 21
        oc = oc Or regs(1) << 16
        oc = oc Or regs(1) << 16
        oc = oc Or regs(2) << 11
        oc = oc Or regs(2) << 11
        oc = oc Or regs(3) << 6
        oc = oc Or regs(3) << 6
        oc = oc Or regs(4) << 1
        oc = oc Or regs(4) << 1
        emit(oc)
        emit(oc)
    End Sub
    End Sub
 
 
 
    ' JSR SomeSubroutine
 
    ' JSR (R1+R2)
 
    '
    Sub ProcessJsr(ByVal n As Integer)
    Sub ProcessJsr(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim adr As Integer
        Dim adr As Integer
 
        Dim Ra As Integer
 
        Dim Rb As Integer
 
        Dim s() As String
 
        Dim t() As String
 
        Dim m As Integer
 
 
 
        Ra = 0
 
        Rb = 0
 
        m = strs(1).IndexOf("(")
 
        If m >= 0 Then
 
            s = strs(1).Split("(".ToCharArray)
 
            t = s(1).Split("+".ToCharArray)
 
            Ra = GetRegister(t(0))
 
            If t.Length > 1 Then
 
                Rb = GetRegister(t(1))
 
            End If
 
            oc = 2 << 26
 
            oc = oc Or (Ra << 21)
 
            oc = oc Or (Rb << 16)
 
            oc = oc Or n
 
            emit(oc)
 
        Else
        adr = GetImmediate(strs(1))
        adr = GetImmediate(strs(1))
        oc = n << 26
            oc = n << 26
        oc = oc Or (adr And &H3FFFFFF)
            oc = oc Or (adr And &H3FFFFFF)
        emit(oc)
        emit(oc)
 
        End If
    End Sub
    End Sub
    Sub ProcessMemop(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessMemop(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim Rb As Integer
        Dim Rb As Integer
        Dim Rt As Integer
        Dim Rt As Integer
        Dim offs As Integer
        Dim offs As Integer
        Rt = GetRegister(strs(1))
        Rt = GetRegister(strs(1))
        ParseAm(offs, Ra, Rb)
        ParseAm(offs, Ra, Rb)
        If Ra <> 0 And Rb <> 0 Then
        If Ra <> 0 And Rb <> 0 Then
            oc = n << 26
            oc = n << 26
            oc = oc Or (Ra << 21)
            oc = oc Or (Ra << 21)
            oc = oc Or (Rb << 16)
            oc = oc Or (Rb << 16)
            oc = oc Or m
            oc = oc Or m
            emit(oc)
            emit(oc)
        Else
        Else
            oc = n << 26
            oc = n << 26
            oc = oc Or (Ra << 21)
            oc = oc Or (Ra << 21)
            oc = oc Or (Rt << 16)
            oc = oc Or (Rt << 16)
            If offs < -32767 Or offs > 32767 Then
            If offs < -32767 Or offs > 32767 Then
                oc = oc Or &H8000
                oc = oc Or &H8000
                emit(oc)
                emit(oc)
                emit1(offs, True)
                emit1(offs, True)
            Else
            Else
                oc = oc Or (offs And &HFFFF)
                oc = oc Or (offs And &HFFFF)
                emit(oc)
                emit(oc)
            End If
            End If
        End If
        End If
    End Sub
    End Sub
    Sub ProcessLink(ByVal n As Integer)
    Sub ProcessLink(ByVal n As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Dim imm As Integer
        Dim imm As Integer
        Ra = GetRegister(strs(1))
        Ra = GetRegister(strs(1))
        imm = GetImmediate(strs(2))
        imm = GetImmediate(strs(2))
        oc = n << 26
        oc = n << 26
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 16)
        oc = oc Or (Ra << 16)
        oc = oc Or (imm And &HFFFF)
        oc = oc Or (imm And &HFFFF)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessUnlk(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessUnlk(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim Ra As Integer
        Dim Ra As Integer
        Ra = GetRegister(strs(1))
        Ra = GetRegister(strs(1))
        oc = n << 26
        oc = n << 26
        oc = oc Or m
        oc = oc Or m
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 21)
        oc = oc Or (Ra << 16)
        oc = oc Or (Ra << 16)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessRts(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessRts(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        Dim offs As Integer
        Dim offs As Integer
        Dim imm As Integer
        Dim imm As Integer
        Dim k As Integer
        Dim k As Integer
        k = 1
        k = 1
        offs = 0
        offs = 0
        imm = 0
        imm = 0
        If strs.Length = 2 Then
        If strs.Length = 2 Then
            offs = GetImmediate(strs(1))
            offs = GetImmediate(strs(1))
            k = k + 1
            k = k + 1
        End If
        End If
        If strs.Length > 1 Then
        If strs.Length > 1 Then
            imm = GetImmediate(strs(k))
            imm = GetImmediate(strs(k))
        End If
        End If
        oc = n << 26
        oc = n << 26
        oc = oc Or m
        oc = oc Or m
        oc = oc Or (offs << 22)
        oc = oc Or (offs << 22)
        oc = oc Or ((imm And &HFFFF) << 6)
        oc = oc Or ((imm And &HFFFF) << 6)
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessStop(ByVal n As Integer, ByVal m As Integer)
    Sub ProcessStop(ByVal n As Integer, ByVal m As Integer)
        Dim oc As Integer
        Dim oc As Integer
        oc = n << 26
        oc = n << 26
        oc = n Or m
        oc = n Or m
        emit(oc)
        emit(oc)
    End Sub
    End Sub
    Sub ProcessOp(ByVal s As String)
    Sub ProcessOp(ByVal s As String)
        Select Case (s.ToLower)
        Select Case (s.ToLower)
            Case "org"
            Case "org"
                ProcessOrg()
                ProcessOrg()
            Case "add"
            Case "add"
                ProcessRRop(2, 4)
                ProcessRRop(2, 4, False)
 
            Case "add."
 
                ProcessRRop(2, 4, True)
            Case "sub"
            Case "sub"
                ProcessRRop(2, 5)
                ProcessRRop(2, 5, False)
 
            Case "sub."
 
                ProcessRRop(2, 5, True)
            Case "cmp"
            Case "cmp"
                ProcessCmpOp(2, 6)
                ProcessCmpOp(2, 6)
            Case "and"
            Case "and"
                ProcessRRop(2, 8)
                ProcessRRop(2, 8, False)
 
            Case "and."
 
                ProcessRRop(2, 8, True)
            Case "or"
            Case "or"
                ProcessRRop(2, 9)
                ProcessRRop(2, 9, False)
 
            Case "or."
 
                ProcessRRop(2, 9, True)
            Case "eor"
            Case "eor"
                ProcessRRop(2, 10)
                ProcessRRop(2, 10, False)
 
            Case "eor."
 
                ProcessRRop(2, 10, True)
            Case "nand"
            Case "nand"
                ProcessRRop(2, 12)
                ProcessRRop(2, 12, False)
 
            Case "nand."
 
                ProcessRRop(2, 12, True)
            Case "nor"
            Case "nor"
                ProcessRRop(2, 13)
                ProcessRRop(2, 13, False)
 
            Case "nor."
 
                ProcessRRop(2, 13, True)
            Case "enor"
            Case "enor"
                ProcessRRop(2, 14)
                ProcessRRop(2, 14, False)
 
            Case "enor."
 
                ProcessRRop(2, 14, True)
 
            Case "cror"
 
                ProcessCRRop(19, 449)
 
            Case "crorc"
 
                ProcessCRRop(19, 417)
 
            Case "crand"
 
                ProcessCRRop(19, 257)
 
            Case "crandc"
 
                ProcessCRRop(19, 129)
 
            Case "crxor"
 
                ProcessCRRop(19, 193)
 
            Case "crnor"
 
                ProcessCRRop(19, 33)
 
            Case "crnand"
 
                ProcessCRRop(19, 225)
 
            Case "crxnor"
 
                ProcessCRRop(19, 289)
            Case "shl"
            Case "shl"
                ProcessRRop(2, 16)
                ProcessRRop(2, 16, False)
 
            Case "shl."
 
                ProcessRRop(2, 16, True)
            Case "shr"
            Case "shr"
                ProcessRRop(2, 17)
                ProcessRRop(2, 17, False)
 
            Case "shr."
 
                ProcessRRop(2, 17, True)
            Case "rol"
            Case "rol"
                ProcessRRop(2, 18)
                ProcessRRop(2, 18, False)
 
            Case "rol."
 
                ProcessRRop(2, 18, True)
            Case "ror"
            Case "ror"
                ProcessRRop(2, 19)
                ProcessRRop(2, 19, False)
 
            Case "ror."
 
                ProcessRRop(2, 19, True)
 
            Case "min"
 
                ProcessRRop(2, 23, False)
 
            Case "min."
 
                ProcessRRop(2, 23, True)
 
            Case "max"
 
                ProcessRRop(2, 24, False)
 
            Case "max."
 
                ProcessRRop(2, 24, True)
            Case "ldi"
            Case "ldi"
                ProcessLdi(9)
                ProcessLdi(9)
            Case "addi"
            Case "addi"
                ProcessOri(4)
                ProcessOri(4)
            Case "subi"
            Case "subi"
                ProcessOri(5)
                ProcessOri(5)
            Case "cmpi"
            Case "cmpi"
                ProcessCmpiOp(6)
                ProcessCmpiOp(6)
            Case "andi"
            Case "andi"
                ProcessOri(8)
                ProcessOri(8)
            Case "ori"
            Case "ori"
                ProcessOri(9)
                ProcessOri(9)
            Case "eori"
            Case "eori"
                ProcessOri(10)
                ProcessOri(10)
            Case "bra"
            Case "bra"
                ProcessBranch(16, 0)
                ProcessBranch(16, 0)
            Case "bhi"
            Case "bhi"
                ProcessBranch(16, 2)
                ProcessBranch(16, 2)
            Case "bls"
            Case "bls"
                ProcessBranch(16, 3)
                ProcessBranch(16, 3)
            Case "bhs"
            Case "bhs"
                ProcessBranch(16, 4)
                ProcessBranch(16, 4)
            Case "blo"
            Case "blo"
                ProcessBranch(16, 5)
                ProcessBranch(16, 5)
            Case "bne"
            Case "bne"
                ProcessBranch(16, 6)
                ProcessBranch(16, 6)
            Case "beq"
            Case "beq"
                ProcessBranch(16, 7)
                ProcessBranch(16, 7)
            Case "bvc"
            Case "bvc"
                ProcessBranch(16, 8)
                ProcessBranch(16, 8)
            Case "bvs"
            Case "bvs"
                ProcessBranch(16, 9)
                ProcessBranch(16, 9)
            Case "bpl"
            Case "bpl"
                ProcessBranch(16, 10)
                ProcessBranch(16, 10)
            Case "bmi"
            Case "bmi"
                ProcessBranch(16, 11)
                ProcessBranch(16, 11)
            Case "bge"
            Case "bge"
                ProcessBranch(16, 12)
                ProcessBranch(16, 12)
            Case "blt"
            Case "blt"
                ProcessBranch(16, 13)
                ProcessBranch(16, 13)
            Case "bgt"
            Case "bgt"
                ProcessBranch(16, 14)
                ProcessBranch(16, 14)
            Case "ble"
            Case "ble"
                ProcessBranch(16, 15)
                ProcessBranch(16, 15)
            Case "trap"
            Case "trap"
                ProcessTrap(17, 0)
                ProcessTrap(17, 0)
            Case "thi"
            Case "thi"
                ProcessTrap(17, 2)
                ProcessTrap(17, 2)
            Case "tls"
            Case "tls"
                ProcessTrap(17, 3)
                ProcessTrap(17, 3)
            Case "ths"
            Case "ths"
                ProcessTrap(17, 4)
                ProcessTrap(17, 4)
            Case "tlo"
            Case "tlo"
                ProcessTrap(17, 5)
                ProcessTrap(17, 5)
            Case "tne"
            Case "tne"
                ProcessTrap(17, 6)
                ProcessTrap(17, 6)
            Case "teq"
            Case "teq"
                ProcessTrap(17, 7)
                ProcessTrap(17, 7)
            Case "tvc"
            Case "tvc"
                ProcessTrap(17, 8)
                ProcessTrap(17, 8)
            Case "tvs"
            Case "tvs"
                ProcessTrap(17, 9)
                ProcessTrap(17, 9)
            Case "tpl"
            Case "tpl"
                ProcessTrap(17, 10)
                ProcessTrap(17, 10)
            Case "tmi"
            Case "tmi"
                ProcessTrap(17, 11)
                ProcessTrap(17, 11)
            Case "tge"
            Case "tge"
                ProcessTrap(17, 12)
                ProcessTrap(17, 12)
            Case "tlt"
            Case "tlt"
                ProcessTrap(17, 13)
                ProcessTrap(17, 13)
            Case "tgt"
            Case "tgt"
                ProcessTrap(17, 14)
                ProcessTrap(17, 14)
            Case "tle"
            Case "tle"
                ProcessTrap(17, 15)
                ProcessTrap(17, 15)
            Case "set"
            Case "set"
                ProcessSet(18, 0)
                ProcessSet(18, 0)
            Case "shi"
            Case "shi"
                ProcessSet(18, 2)
                ProcessSet(18, 2)
            Case "sls"
            Case "sls"
                ProcessSet(18, 3)
                ProcessSet(18, 3)
            Case "shs"
            Case "shs"
                ProcessSet(18, 4)
                ProcessSet(18, 4)
            Case "slo"
            Case "slo"
                ProcessSet(18, 5)
                ProcessSet(18, 5)
            Case "sne"
            Case "sne"
                ProcessSet(18, 6)
                ProcessSet(18, 6)
            Case "seq"
            Case "seq"
                ProcessSet(18, 7)
                ProcessSet(18, 7)
            Case "svc"
            Case "svc"
                ProcessSet(18, 8)
                ProcessSet(18, 8)
            Case "svs"
            Case "svs"
                ProcessSet(18, 9)
                ProcessSet(18, 9)
            Case "spl"
            Case "spl"
                ProcessSet(18, 10)
                ProcessSet(18, 10)
            Case "smi"
            Case "smi"
                ProcessSet(18, 11)
                ProcessSet(18, 11)
            Case "sge"
            Case "sge"
                ProcessSet(18, 12)
                ProcessSet(18, 12)
            Case "slt"
            Case "slt"
                ProcessSet(18, 13)
                ProcessSet(18, 13)
            Case "sgt"
            Case "sgt"
                ProcessSet(18, 14)
                ProcessSet(18, 14)
            Case "sle"
            Case "sle"
                ProcessSet(18, 15)
                ProcessSet(18, 15)
            Case "sw"
            Case "sw"
                ProcessMemop(56, 0)
                ProcessMemop(56, 0)
            Case "sh"
            Case "sh"
                ProcessMemop(57, 0)
                ProcessMemop(57, 0)
            Case "sb"
            Case "sb"
                ProcessMemop(58, 0)
                ProcessMemop(58, 0)
            Case "lw"
            Case "lw"
                ProcessMemop(48, 0)
                ProcessMemop(48, 0)
            Case "lh"
            Case "lh"
                ProcessMemop(49, 0)
                ProcessMemop(49, 0)
            Case "lb"
            Case "lb"
                ProcessMemop(50, 0)
                ProcessMemop(50, 0)
            Case "lhu"
            Case "lhu"
                ProcessMemop(51, 0)
                ProcessMemop(51, 0)
            Case "lbu"
            Case "lbu"
                ProcessMemop(52, 0)
                ProcessMemop(52, 0)
            Case "tas"
            Case "tas"
                ProcessMemop(46, 0)
                ProcessMemop(46, 0)
            Case "swx"
            Case "swx"
                ProcessMemop(2, 56)
                ProcessMemop(2, 56)
            Case "shx"
            Case "shx"
                ProcessMemop(2, 57)
                ProcessMemop(2, 57)
            Case "sbx"
            Case "sbx"
                ProcessMemop(2, 58)
                ProcessMemop(2, 58)
            Case "lwx"
            Case "lwx"
                ProcessMemop(2, 48)
                ProcessMemop(2, 48)
            Case "lhx"
            Case "lhx"
                ProcessMemop(2, 49)
                ProcessMemop(2, 49)
            Case "lbx"
            Case "lbx"
                ProcessMemop(2, 50)
                ProcessMemop(2, 50)
            Case "lhux"
            Case "lhux"
                ProcessMemop(2, 51)
                ProcessMemop(2, 51)
            Case "lbux"
            Case "lbux"
                ProcessMemop(2, 52)
                ProcessMemop(2, 52)
 
            Case "jmp"
 
                ProcessJsr(20)
            Case "jsr"
            Case "jsr"
                ProcessJsr(21)
                ProcessJsr(21)
            Case "push"
            Case "push"
                ProcessPush(59)
                ProcessPush(59)
            Case "pop"
            Case "pop"
                ProcessPush(53)
                ProcessPush(53)
            Case "link"
            Case "link"
                ProcessLink(54)
                ProcessLink(54)
            Case "unlk"
            Case "unlk"
                ProcessUnlk(1, 24)
                ProcessUnlk(1, 24)
            Case "rts"
            Case "rts"
                ProcessRts(0, 34)
                ProcessRts(0, 34)
            Case "stop"
            Case "stop"
                ProcessStop(0, 53)
                ProcessStop(0, 53)
 
            Case "mov"
 
                ProcessMov()
 
            Case "exec"
 
                ProcessExec()
            Case Else
            Case Else
                ProcessEquate()
                ProcessEquate()
        End Select
        End Select
    End Sub
    End Sub
    Sub emitEmptyLine(ByVal ln As String)
    Sub emitEmptyLine(ByVal ln As String)
        Dim s As String
        Dim s As String
        If pass = 2 Then
        If pass = 2 Then
            s = "                " & "  " & vbTab & "           " & vbTab & vbTab & ln
            s = "                " & "  " & vbTab & "           " & vbTab & vbTab & ln
            lfs.WriteLine(s)
            lfs.WriteLine(s)
        End If
        End If
    End Sub
    End Sub
    Sub emitLabel(ByVal lbl As String)
    Sub emitLabel(ByVal lbl As String)
        Dim s As String
        Dim s As String
        If pass = 2 Then
        If pass = 2 Then
            s = Hex(address).PadLeft(8, "0") & vbTab & "           " & vbTab & vbTab & iline
            s = Hex(address).PadLeft(8, "0") & vbTab & "           " & vbTab & vbTab & iline
            lfs.WriteLine(s)
            lfs.WriteLine(s)
        End If
        End If
    End Sub
    End Sub
    Function GetRegister(ByVal s As String) As Integer
    Function GetRegister(ByVal s As String) As Integer
        Dim r As Int16
        Dim r As Int16
        If s.StartsWith("R") Or s.StartsWith("r") Then
        If s.StartsWith("R") Or s.StartsWith("r") Then
            s = s.TrimStart("Rr".ToCharArray)
            s = s.TrimStart("Rr".ToCharArray)
            Try
            Try
                r = Int16.Parse(s)
                r = Int16.Parse(s)
            Catch
            Catch
                r = -1
                r = -1
            End Try
            End Try
            Return r
            Return r
        Else
        Else
            Return -1
            Return -1
        End If
        End If
    End Function
    End Function
    Function GetCrRegister(ByVal s As String) As Integer
    Function GetCrRegister(ByVal s As String) As Integer
        Dim r As Int16
        Dim r As Int16
        If s.ToLower.StartsWith("cr") Then
        If s.ToLower.StartsWith("cr") Then
            s = s.Substring(2)
            s = s.Substring(2)
            Try
            Try
                r = Int16.Parse(s)
                r = Int16.Parse(s)
            Catch
            Catch
                r = -1
                r = -1
            End Try
            End Try
            Return r
            Return r
        Else
        Else
            Return -1
            Return -1
        End If
        End If
    End Function
    End Function
    Function GetImmediate(ByVal s As String) As Int64
    Function GetImmediate(ByVal s As String) As Int64
        Dim s1 As String
        Dim s1 As String
        Dim s2 As String
        Dim s2 As String
        Dim s3 As String
        Dim s3 As String
        Dim n As Int64
        Dim n As Int64
        Dim q As Integer
        Dim q As Integer
        Dim sym As Symbol
        Dim sym As Symbol
        Dim L As Label
        Dim L As Label
        s = s.TrimStart("#".ToCharArray)
        s = s.TrimStart("#".ToCharArray)
        s = s.Replace("_", "")
        s = s.Replace("_", "")
        If s.Length = 0 Then Return 0
        If s.Length = 0 Then Return 0
        If s.Chars(0) = "$" Then
        If s.Chars(0) = "$" Then
            s1 = "&H" & s.Substring(1)
            s1 = "&H" & s.Substring(1)
            n = Val(s1)
            n = Val(s1)
        ElseIf s.Chars(0) = "0" Then
        ElseIf s.Chars(0) = "0" Then
            If s.Length = 1 Then Return 0
            If s.Length = 1 Then Return 0
            If s.Chars(1) = "x" Or s.Chars(1) = "X" Then
            If s.Chars(1) = "x" Or s.Chars(1) = "X" Then
                If s.Length >= 18 Then
                If s.Length >= 18 Then
                    s1 = "&H0000" & s.Substring(2, 6) & "&"
                    s1 = "&H0000" & s.Substring(2, 6) & "&"
                    s2 = "&H0000" & s.Substring(8, 6) & "&"
                    s2 = "&H0000" & s.Substring(8, 6) & "&"
                    s3 = "&H0000" & s.Substring(14) & "&"
                    s3 = "&H0000" & s.Substring(14) & "&"
                    n = Val(s1) << 40
                    n = Val(s1) << 40
                    n = n Or (Val(s2) << 16)
                    n = n Or (Val(s2) << 16)
                    n = n Or Val(s3)
                    n = n Or Val(s3)
                Else
                Else
                    s1 = "&H" & s.Substring(2)
                    s1 = "&H" & s.Substring(2)
                    n = Val(s1)
                    n = Val(s1)
                End If
                End If
            End If
            End If
        Else
        Else
            If s.Chars(0) > "9" Then
            If s.Chars(0) > "9" Then
                sym = Nothing
                sym = Nothing
                Try
                Try
                    sym = symbols.Item(s)
                    sym = symbols.Item(s)
                Catch
                Catch
                    sym = Nothing
                    sym = Nothing
                End Try
                End Try
                If Not sym Is Nothing Then
                If Not sym Is Nothing Then
                    n = sym.value
                    n = sym.value
                    Return n
                    Return n
                End If
                End If
                Try
                Try
                    L = labels.Item(s)
                    L = labels.Item(s)
                Catch ex As Exception
                Catch ex As Exception
                    L = Nothing
                    L = Nothing
                End Try
                End Try
                If Not L Is Nothing Then
                If Not L Is Nothing Then
                    n = L.address
                    n = L.address
                    Return n
                    Return n
                End If
                End If
            End If
            End If
            n = Int64.Parse(s)
            n = Int64.Parse(s)
        End If
        End If
        Return n
        Return n
    End Function
    End Function
    Overloads Sub emit(ByVal n As Int32)
    Overloads Sub emit(ByVal n As Int32)
        emit1(n, False)
        emit1(n, False)
    End Sub
    End Sub
    Sub emit1(ByVal n As Int32, ByVal pfx As Boolean)
    Sub emit1(ByVal n As Int32, ByVal pfx As Boolean)
        Dim wdhi As Int64
        Dim wdhi As Int64
        Dim wdlo As Int64
        Dim wdlo As Int64
        Dim s As String
        Dim s As String
        If pass = 2 Then
        If pass = 2 Then
            If pfx Then
            If pfx Then
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab
            Else
            Else
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab & vbTab & iline
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab & vbTab & iline
            End If
            End If
            lfs.WriteLine(s)
            lfs.WriteLine(s)
        End If
        End If
        If pass = 2 Then
        If pass = 2 Then
            s = "32'h" & Hex(address) & ":" & vbTab & "romout <= 32'h" & Hex(n).PadLeft(8, "0") & ";"
            s = "32'h" & Hex(address) & ":" & vbTab & "romout <= 32'h" & Hex(n).PadLeft(8, "0") & ";"
            ofs.WriteLine(s)
            ofs.WriteLine(s)
        End If
        End If
        address = address + 4
        address = address + 4
    End Sub
    End Sub
End Module
End Module
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.