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

Show entire file | Details | Blame | View Log

Rev 11 Rev 14
Line 145... Line 145...
        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
Line 174... Line 192...
        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)
Line 190... Line 208...
        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
Line 223... Line 241...
            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
Line 323... Line 373...
            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
Line 353... Line 471...
        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
Line 455... Line 598...
    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"
Line 618... Line 809...
                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"
Line 632... Line 825...
                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
 
 

powered by: WebSVN 2.1.0

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