8051 Assembler - sehr Tolerant :-P

Anwendungen, Tools, Userlibs und anderes nützliches.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

8051 Assembler - sehr Tolerant :-P

Beitrag von DarkDragon »

Hallo,

Hab einiges aus einer OpCode Liste abschreiben müssen um folgendes Programm fertigstellen zu können:

Code: Alles auswählen

; 8051 Assembler
; Autor: Daniel Brall
; Date:  17.12.06

EnableExplicit

#BLOCK_SIZE           = 512
#RESIZE_TOLERANCE     = 10
#SEPARATOR$           = Chr(27)

Structure SLabel
  Name.s
  *Pointer.BYTE
EndStructure

Global NewList Labels.SLabel()
Global NewList WantedLabels.SLabel()

Macro GetParamDataType(sParam, sParamType, sParamLabel, dwParamWrite)
  firstChar = PeekC(@sParam)
  
  If firstChar = '#'
    sParamType = "#data"
    sParam = Trim(Right(sParam, Len(sParam)-1))
    
    ForEach Labels()
      If Labels()\Name = sParam
        AddElement(WantedLabels())
        WantedLabels()\Name = Labels()\Name
        sParamLabel = 1
        Break
      EndIf
    Next
    
    dwParamWrite = 1
  ElseIf firstChar >= '0' And firstChar <= '9'
    sParamType = "addr"
    dwParamWrite = 1
  ElseIf firstChar = '/'
    sParam = Right(sParam, Len(sParam)-1)
    sParamType = "/addr"
    dwParamWrite = 1
  Else
    dwParamWrite = 0
    
    sWithoutSpaces = RemoveString(sParam, " ")
    
    Select sWithoutSpaces
      Case "@A+DPTR"
        sParam = sWithoutSpaces
      Case "@A+PC"
        sParam = sWithoutSpaces
      Case "@DPTR"
        sParam = sWithoutSpaces
      Case "DPTR"
        sParam = sWithoutSpaces
      Default
        ForEach Labels()
          If Labels()\Name = sParam
            sParam = "rel"
            AddElement(WantedLabels())
            WantedLabels()\Name = Labels()\Name
            dwParamWrite = 1
            Break
          EndIf
        Next
    EndSelect
    
    sParamType = sParam
  EndIf
EndMacro

; Danke an GPI für die folgenden 2 Prozeduren:
Procedure BinVal(a.s)
  Protected Result.l, i.l
  Protected *adr.BYTE
  
  a = Trim(UCase(a))
  If Asc(Right(a, 1)) = 'B'
    a = Trim(Left(a, Len(a)-1))
  EndIf
  
  Result  = 0 
  *adr    = @a
  For i=1 To Len(a)
    Result  <<  1
    Select *adr\b
      Case '0'
      Case '1'  : Result + 1
      Default
        i = Len(a)
    EndSelect 
    *adr + 1
  Next
  
  ProcedureReturn Result 
EndProcedure 

Procedure HexVal(a.s)
  Protected Result.l, i.l
  Protected *adr.BYTE
  
  a = Trim(UCase(a))
  If Asc(Right(a, 1)) = 'H'
    a = Trim(Left(a, Len(a)-1))
  EndIf
  
  Result  = 0
  *adr    = @a
  For i=1 To Len(a)
    Result  <<  4
    Select *adr\b
      Case '0'
      Case '1' : Result + 1
      Case '2' : Result + 2
      Case '3' : Result + 3
      Case '4' : Result + 4
      Case '5' : Result + 5
      Case '6' : Result + 6
      Case '7' : Result + 7
      Case '8' : Result + 8
      Case '9' : Result + 9
      Case 'A' : Result + 10
      Case 'B' : Result + 11
      Case 'C' : Result + 12
      Case 'D' : Result + 13
      Case 'E' : Result + 14
      Case 'F' : Result + 15
      Default
        i = Len(a)
    EndSelect
    *adr + 1
  Next
  
  ProcedureReturn Result
EndProcedure

Procedure MixedVal(a.s)
  Protected char.s
  
  a = UCase(a)
  char = Right(a, 1)
  If char = "B"
    ProcedureReturn BinVal(a)
  ElseIf char = "H"
    ProcedureReturn HexVal(a)
  Else
    ProcedureReturn Val(a)
  EndIf
EndProcedure

Procedure AttachLabels(*pMemory)
  Protected dist.b
  
  ForEach WantedLabels()
    
    ForEach Labels()
      If Labels()\Name = WantedLabels()\Name
        dist = (WantedLabels()\Pointer - Labels()\Pointer)
        If dist < 0 : dist = $FF - dist + $90 : EndIf
        WantedLabels()\Pointer\b = dist
        Break
      EndIf
    Next
    
  Next
EndProcedure

Procedure Assembler(sCmd.s, sParam1.s, sParam2.s, sParam3.s, *pMemory)
  Protected dwResult.l
  Protected sParam1Type.s = "", dwParam1Write.l = 0, dwParam1Label.l = 0
  Protected sParam2Type.s = "", dwParam2Write.l = 0, dwParam2Label.l = 0
  Protected sParam3Type.s = "", dwParam3Write.l = 0, dwParam3Label.l = 0
  Protected firstChar.c
  Protected sWithoutSpaces.s
  Protected sCommandLine.s
  Protected sCommandEntry.s, sCommandEntrySize.b, sCommandEntryCode.b
  Protected k.l
  
  GetParamDataType(sParam1, sParam1Type, dwParam1Label, dwParam1Write)
  GetParamDataType(sParam2, sParam2Type, dwParam2Label, dwParam2Write)
  GetParamDataType(sParam3, sParam3Type, dwParam3Label, dwParam3Write)
  
  sCommandLine = sCmd
  
  If sParam1Type <> ""
    sCommandLine + " " + sParam1Type
  EndIf
  If sParam2Type <> ""
    sCommandLine + "," + sParam2Type
  EndIf
  If sParam3Type <> ""
    sCommandLine + "," + sParam3Type
  EndIf
  
  ; 8 Bit Befehle:
  For k = ?Commands To ?Commands_End - 1
    sCommandEntry = PeekS(k)
    k + MemoryStringLength(@sCommandEntry, #PB_UTF8) + 1
    
    sCommandEntrySize = PeekB(k) : k + 1
    sCommandEntryCode = PeekB(k)
    
    If sCommandEntry = sCommandLine
      PokeB(*pMemory, sCommandEntryCode)
      
      If dwParam3Write = 1
        *pMemory + 1
        If sParam3 = "rel" Or dwParam1Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeB(*pMemory, MixedVal(sParam3))
        EndIf
      EndIf
      
      If dwParam2Write = 1
        *pMemory + 1
        If sParam2 = "rel" Or dwParam2Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeB(*pMemory, MixedVal(sParam2))
        EndIf
      EndIf
      
      If dwParam1Write = 1
        *pMemory + 1
        If sParam1 = "rel" Or dwParam3Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeB(*pMemory, MixedVal(sParam1))
        EndIf
      EndIf
      
      dwResult = sCommandEntrySize
      
      Break
    EndIf
    
  Next k
  
  ; 16 Bit Befehle:
  For k = ?Commands16 To ?Commands_End16 - 1
    sCommandEntry = PeekS(k)
    k + MemoryStringLength(@sCommandEntry, #PB_UTF8) + 1
    
    sCommandEntrySize = PeekB(k) : k + 1
    sCommandEntryCode = PeekB(k)
    
    If sCommandEntry = sCommandLine
      PokeB(*pMemory, sCommandEntryCode)
      
      If dwParam3Write = 1
        *pMemory + 1
        If sParam3 = "rel" Or dwParam1Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeW(*pMemory, MixedVal(sParam3))
        EndIf
        *pMemory + 1
      EndIf
      
      If dwParam2Write = 1
        *pMemory + 1
        If sParam2 = "rel" Or dwParam2Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeW(*pMemory, MixedVal(sParam2))
        EndIf
        *pMemory + 1
      EndIf
      
      If dwParam1Write = 1
        *pMemory + 1
        If sParam1 = "rel" Or dwParam3Label
          WantedLabels()\Pointer = *pMemory
        Else
          PokeW(*pMemory, MixedVal(sParam1))
        EndIf
        *pMemory + 1
      EndIf
      
      dwResult = sCommandEntrySize
      
      Break
    EndIf
    
  Next k
  
  ProcedureReturn dwResult
EndProcedure

Procedure ParseCode(sCode.s, *pBufferAddress.LONG)
  Protected k.l, i.l
  Protected dwResult.l
  Protected sLine.s
  Protected pFile.l
  Protected sLineOld.s
  Protected newCode.s
  Protected dwFoundMacro.l, dwMacroNameLen.l
  Protected sCmd.s, sParam1.s, sParam2.s, sParam3.s
  Protected dwParamSeperatorCount.l
  Protected dwSize.l, dwBlockSize.l
  Protected dwAssemblerResult.l
  Protected sDataParam.s
  
  dwResult = 0
  
  ClearList(WantedLabels())
  ClearList(Labels())
  
  sCode = ReplaceString(sCode, Chr(9), Chr(32))
  sCode = ReplaceString(sCode, Chr(13), Chr(10))
  sCode = ReplaceString(sCode, Chr(10)+Chr(10), Chr(10))
  sCode = ReplaceString(sCode, Chr(10), #SEPARATOR$)
  
  dwBlockSize = #BLOCK_SIZE
  *pBufferAddress\l = AllocateMemory(dwBlockSize)
  
  ; First go-through: remove all comments and find all includes and pack them into one single string(sCode)
  sCode = UCase(sCode)
  For k=1 To CountString(sCode, #SEPARATOR$)+1
    sLine = StringField(sCode, k, #SEPARATOR$)
    sLine = StringField(sLine, 1, ";")
    sLine = Trim(sLine)
    
    newCode + sLine + #SEPARATOR$
    
    If StringField(sLine, 1, " ") = "INCLUDE"
      pFile = ReadFile(#PB_Any, LTrim(Right(sLine, Len(sLine)-8)))
      If pFile
        sLineOld = sLine
        sLine = Space(Lof(pFile)+1)
        ReadData(pFile, @sLine, Lof(pFile))
        CloseFile(pFile)
        
        sCode = ReplaceString(sCode, Chr(13), Chr(10))
        sCode = ReplaceString(sCode, Chr(10)+Chr(10), Chr(10))
        sCode = ReplaceString(sCode, Chr(10), #SEPARATOR$)
        
        sCode = ReplaceString(sCode, sLineOld, sLine)
      EndIf
    EndIf
  Next k
  
  sCode = newCode
  
  newCode = ""
  
  ; Second go-through: replace BIT and DATA declarations and note down the labelnames.
  sCode = UCase(sCode)
  For k=1 To CountString(sCode, #SEPARATOR$)+1
    sLine = StringField(sCode, k, #SEPARATOR$)
    sLine = Trim(sLine)
    
    dwFoundMacro = FindString(sLine, " BIT ", 1)
    If dwFoundMacro = 0
      dwFoundMacro = FindString(sLine, " DATA ", 1)
      dwMacroNameLen = 6
    Else
      dwMacroNameLen = 5
    EndIf
    
    If Right(sLine, 1) = ":"
      AddElement(Labels())
      Labels()\Name = Left(sLine, Len(sLine)-1)
    ElseIf dwFoundMacro > 0
      sCode = ReplaceString(sCode, Trim(Left(sLine, dwFoundMacro)), Trim(Right(sLine, Len(sLine) - (dwFoundMacro + dwMacroNameLen))))
      sLine = ""
    EndIf
    
    newCode + sLine + #SEPARATOR$
  Next k
  
  sCode = newCode
  ; Third go-through: change everything into hex code.
  For k=1 To CountString(sCode, #SEPARATOR$)+1
    sLine = Trim(StringField(sCode, k, #SEPARATOR$))
    sLineOld = sLine
    
    If sLine = ""
      Continue
    EndIf
    
    sCmd  = StringField(sLine, 1, " ")
    sLine = Trim(Right(sLine, Len(sLine) - (Len(sCmd) + 1)))
    
    If Len(sLine) > 0
      dwParamSeperatorCount = CountString(sLine, ",")
      Select dwParamSeperatorCount
        Case 0
          sParam1 = StringField(sLine, 1, ",")
          sParam2 = ""
          sParam3 = ""
          
        Case 1
          sParam1 = StringField(sLine, 1, ",")
          sParam2 = StringField(sLine, 2, ",")
          sParam3 = ""
          
        Case 2
          sParam1 = StringField(sLine, 1, ",")
          sParam2 = StringField(sLine, 2, ",")
          sParam3 = StringField(sLine, 3, ",")
      EndSelect
      
      sParam1 = Trim(sParam1)
      sParam2 = Trim(sParam2)
      sParam3 = Trim(sParam3)
    Else
      dwParamSeperatorCount = -1
      
      sParam1 = ""
      sParam2 = ""
      sParam3 = ""
    EndIf
    
    Select sCmd
      Case "ORG"
        dwSize + MixedVal(sParam1)
        
      Case "DB"
        For i=1 To CountString(sLine, ",")+1
          sDataParam = Trim(StringField(sLine, i, ","))
          If sDataParam <> ""
            PokeB(*pBufferAddress\l + dwSize, MixedVal(sDataParam))
            dwSize + 1
            
            While dwBlockSize - dwSize <= #RESIZE_TOLERANCE
              dwBlockSize + #BLOCK_SIZE
              *pBufferAddress\l = ReAllocateMemory(*pBufferAddress\l, dwBlockSize)
            Wend
          Else
            PrintN("Error in line "+Str(k+1)+": "+sLineOld)
            
            FreeMemory(*pBufferAddress\l)
            *pBufferAddress\l = 0
            
            ProcedureReturn 0
          EndIf
        Next i
        
      Case "DW"
        For i=1 To CountString(sLine, ",")+1
          sDataParam = Trim(StringField(sLine, i, ","))
          If sDataParam <> ""
            PokeW(*pBufferAddress\l + dwSize, MixedVal(sDataParam))
            dwSize + 2
            
            While dwBlockSize - dwSize <= #RESIZE_TOLERANCE
              dwBlockSize + #BLOCK_SIZE
              *pBufferAddress\l = ReAllocateMemory(*pBufferAddress\l, dwBlockSize)
            Wend
          Else
            PrintN("Error in line "+Str(k+1)+": "+sLineOld)
            
            FreeMemory(*pBufferAddress\l)
            *pBufferAddress\l = 0
            
            ProcedureReturn 0
          EndIf
        Next i
        
      Case "DD"
        For i=1 To CountString(sLine, ",")+1
          sDataParam = Trim(StringField(sLine, i, ","))
          If sDataParam <> ""
            PokeL(*pBufferAddress\l + dwSize, MixedVal(sDataParam))
            dwSize + 4
            
            While dwBlockSize - dwSize <= #RESIZE_TOLERANCE
              dwBlockSize + #BLOCK_SIZE
              *pBufferAddress\l = ReAllocateMemory(*pBufferAddress\l, dwBlockSize)
            Wend
          Else
            PrintN("Error in line "+Str(k+1)+": "+sLineOld)
            
            FreeMemory(*pBufferAddress\l)
            *pBufferAddress\l = 0
            
            ProcedureReturn 0
          EndIf
        Next i
        
      Default
        
        If Right(sLineOld, 1) = ":"
          ForEach Labels()
            If Labels()\Name = Left(sLineOld, Len(sLineOld)-1)
              Labels()\Pointer = dwSize
            EndIf
          Next
        Else
          dwAssemblerResult = Assembler(sCmd, sParam1, sParam2, sParam3, *pBufferAddress\l + dwSize)
          If dwAssemblerResult = 0
            PrintN("Error in line "+Str(k+1)+": "+sLineOld)
            
            FreeMemory(*pBufferAddress\l)
            *pBufferAddress\l = 0
            
            ProcedureReturn 0
          Else
            dwSize + dwAssemblerResult
          EndIf
        EndIf
    EndSelect
    
    While dwBlockSize - dwSize <= #RESIZE_TOLERANCE
      dwBlockSize + #BLOCK_SIZE
      *pBufferAddress\l = ReAllocateMemory(*pBufferAddress\l, dwBlockSize)
    Wend
    
  Next k
  
  If dwSize > 0
    AttachLabels(*pBufferAddress\l)
    ReAllocateMemory(*pBufferAddress\l, dwSize)
  Else
    FreeMemory(*pBufferAddress\l)
    *pBufferAddress\l = 0
  EndIf
  
  dwResult = dwSize
  
  ProcedureReturn dwResult
EndProcedure

Macro RHex(Val)
  RSet(Right(Hex(Val), 2), 2, "0")
EndMacro

Procedure.s EncodeHex(*Buffer, dwSize.l)
  Protected k.l
  Protected sResult.s
  Protected dwCount.l
  Protected bByte.l
  
  sResult = RHex(dwSize) + RHex(0) + RHex(0) + RHex(0)
  dwCount = dwSize
  
  For k=0 To dwSize-1
    bByte   = PeekB(*Buffer + k)
    sResult + RHex(bByte)
    dwCount + bByte
  Next k
  
  dwCount = $100 - HexVal(Right(Hex(dwCount), 2))
  
  sResult = ":" + sResult + Hex(dwCount) + Chr(13)+Chr(10) + ":00000001FF" + Chr(13)+Chr(10)
  
  ProcedureReturn sResult
EndProcedure

Define *pBuffer
Define dwSize.l
Define Text.s

If ReadFile(0, ProgramParameter(0))
  Text = Space(Lof(0)+1)
  ReadData(0, @Text, Lof(0))
  CloseFile(0)
EndIf

OpenConsole()
ConsoleTitle("8051 Assembler - Daniel Brall ( http://www.bradan.eu/ )")

Delay(1000)

PrintN("Compiling...")
dwSize = ParseCode(Text, @*pBuffer)
If *pBuffer
  If CreateFile(0, ProgramParameter(1))
    ;WriteData(0, *pBuffer, dwSize)
    WriteString(0, EncodeHex(*pBuffer, dwSize), #PB_Ascii)
    CloseFile(0)
  EndIf
  FreeMemory(*pBuffer)
EndIf

PrintN("Finished")
Delay(1000)

End

DataSection
    Commands:
      ; Datatransfer commands:
      
      ;       Command                 Size (Bytes)       Codes
      Data.s "MOV A,R0"             :   Data.b 1  :    Data.b $E8
      Data.s "MOV A,R1"             :   Data.b 1  :    Data.b $E9
      Data.s "MOV A,R2"             :   Data.b 1  :    Data.b $EA
      Data.s "MOV A,R3"             :   Data.b 1  :    Data.b $EB
      Data.s "MOV A,R4"             :   Data.b 1  :    Data.b $EC
      Data.s "MOV A,R5"             :   Data.b 1  :    Data.b $ED
      Data.s "MOV A,R6"             :   Data.b 1  :    Data.b $EE
      Data.s "MOV A,R7"             :   Data.b 1  :    Data.b $EF
      
      Data.s "MOV A,addr"           :   Data.b 2  :    Data.b $E5
      
      Data.s "MOV A,@R1"            :   Data.b 1  :    Data.b $E6
      Data.s "MOV A,@R2"            :   Data.b 1  :    Data.b $E7
      
      Data.s "MOV A,#data"          :   Data.b 2  :    Data.b $74
      
      Data.s "MOV R0,A"             :   Data.b 1  :    Data.b $F8
      Data.s "MOV R1,A"             :   Data.b 1  :    Data.b $F9
      Data.s "MOV R2,A"             :   Data.b 1  :    Data.b $FA
      Data.s "MOV R3,A"             :   Data.b 1  :    Data.b $FB
      Data.s "MOV R4,A"             :   Data.b 1  :    Data.b $FC
      Data.s "MOV R5,A"             :   Data.b 1  :    Data.b $FD
      Data.s "MOV R6,A"             :   Data.b 1  :    Data.b $FE
      Data.s "MOV R7,A"             :   Data.b 1  :    Data.b $FF
      
      Data.s "MOV R0,addr"          :   Data.b 2  :    Data.b $A8
      Data.s "MOV R1,addr"          :   Data.b 2  :    Data.b $A9
      Data.s "MOV R2,addr"          :   Data.b 2  :    Data.b $AA
      Data.s "MOV R3,addr"          :   Data.b 2  :    Data.b $AB
      Data.s "MOV R4,addr"          :   Data.b 2  :    Data.b $AC
      Data.s "MOV R5,addr"          :   Data.b 2  :    Data.b $AD
      Data.s "MOV R6,addr"          :   Data.b 2  :    Data.b $AE
      Data.s "MOV R7,addr"          :   Data.b 2  :    Data.b $AF
      
      Data.s "MOV R0,#data"         :   Data.b 2  :    Data.b $78
      Data.s "MOV R1,#data"         :   Data.b 2  :    Data.b $79
      Data.s "MOV R2,#data"         :   Data.b 2  :    Data.b $7A
      Data.s "MOV R3,#data"         :   Data.b 2  :    Data.b $7B
      Data.s "MOV R4,#data"         :   Data.b 2  :    Data.b $7C
      Data.s "MOV R5,#data"         :   Data.b 2  :    Data.b $7D
      Data.s "MOV R6,#data"         :   Data.b 2  :    Data.b $7E
      Data.s "MOV R7,#data"         :   Data.b 2  :    Data.b $7F
      
      Data.s "MOV addr,A"           :   Data.b 2  :    Data.b $F5
      
      Data.s "MOV addr,R0"          :   Data.b 2  :    Data.b $88
      Data.s "MOV addr,R1"          :   Data.b 2  :    Data.b $89
      Data.s "MOV addr,R2"          :   Data.b 2  :    Data.b $8A
      Data.s "MOV addr,R3"          :   Data.b 2  :    Data.b $8B
      Data.s "MOV addr,R4"          :   Data.b 2  :    Data.b $8C
      Data.s "MOV addr,R5"          :   Data.b 2  :    Data.b $8D
      Data.s "MOV addr,R6"          :   Data.b 2  :    Data.b $8E
      Data.s "MOV addr,R7"          :   Data.b 2  :    Data.b $8F
      
      Data.s "MOV addr,addr"        :   Data.b 3  :    Data.b $85
      
      Data.s "MOV addr,@R0"         :   Data.b 2  :    Data.b $88
      Data.s "MOV addr,@R1"         :   Data.b 2  :    Data.b $89
      
      Data.s "MOV addr,#data"       :   Data.b 3  :    Data.b $75
      
      Data.s "MOV DPTR,#data"       :   Data.b 2  :    Data.b $89
      
      Data.s "MOVC A,@A+DPTR"       :   Data.b 1  :    Data.b $93
      Data.s "MOVC A,@A+PC"         :   Data.b 1  :    Data.b $83
      
      Data.s "MOVX A,@R0"           :   Data.b 1  :    Data.b $E2
      Data.s "MOVX A,@R1"           :   Data.b 1  :    Data.b $E3
      
      Data.s "MOVX A,@DPTR"         :   Data.b 1  :    Data.b $E0
      
      Data.s "MOVX @R0,A"           :   Data.b 1  :    Data.b $F2
      Data.s "MOVX @R1,A"           :   Data.b 1  :    Data.b $F3
      
      Data.s "MOVX @DPTR,A"         :   Data.b 1  :    Data.b $F0
      
      Data.s "PUSH addr"            :   Data.b 2  :    Data.b $C0
      Data.s "POP addr"             :   Data.b 2  :    Data.b $D0
      
      Data.s "XCH A,R0"             :   Data.b 1  :    Data.b $C8
      Data.s "XCH A,R1"             :   Data.b 1  :    Data.b $C9
      Data.s "XCH A,R2"             :   Data.b 1  :    Data.b $CA
      Data.s "XCH A,R3"             :   Data.b 1  :    Data.b $CB
      Data.s "XCH A,R4"             :   Data.b 1  :    Data.b $CC
      Data.s "XCH A,R5"             :   Data.b 1  :    Data.b $CD
      Data.s "XCH A,R6"             :   Data.b 1  :    Data.b $CE
      Data.s "XCH A,R7"             :   Data.b 1  :    Data.b $CF
      
      Data.s "XCH A,addr"           :   Data.b 2  :    Data.b $C5
      
      Data.s "XCH A,@R0"            :   Data.b 1  :    Data.b $C6
      Data.s "XCH A,@R1"            :   Data.b 1  :    Data.b $C7
      
      Data.s "XCHD A,@R0"           :   Data.b 1  :    Data.b $D6
      Data.s "XCHD A,@R1"           :   Data.b 1  :    Data.b $D7
      
      
      ; Bitmanipulation commands:
      
      ;       Command                 Size (Bytes)       Codes
      Data.s "CLR C"                :   Data.b 1  :    Data.b $C3
      Data.s "CLR addr"             :   Data.b 2  :    Data.b $C2
      Data.s "SETB C"               :   Data.b 1  :    Data.b $D3
      Data.s "SETB addr"            :   Data.b 2  :    Data.b $D2
      Data.s "CPL C"                :   Data.b 1  :    Data.b $B3
      Data.s "CPL addr"             :   Data.b 2  :    Data.b $B2
      Data.s "ANL C,addr"           :   Data.b 2  :    Data.b $82
      Data.s "ANL C,/addr"          :   Data.b 2  :    Data.b $B0
      Data.s "ORL C,addr"           :   Data.b 2  :    Data.b $72
      Data.s "ORL C,/addr"          :   Data.b 2  :    Data.b $A0
      Data.s "MOV C,addr"           :   Data.b 2  :    Data.b $A2
      Data.s "MOV addr,C"           :   Data.b 2  :    Data.b $92
      
      
      ; Arithmetical commands:
      
      ;       Command                 Size (Bytes)       Codes
      Data.s "ADD A,R0"             :   Data.b 1  :    Data.b $28
      Data.s "ADD A,R1"             :   Data.b 1  :    Data.b $29
      Data.s "ADD A,R2"             :   Data.b 1  :    Data.b $2A
      Data.s "ADD A,R3"             :   Data.b 1  :    Data.b $2B
      Data.s "ADD A,R4"             :   Data.b 1  :    Data.b $2C
      Data.s "ADD A,R5"             :   Data.b 1  :    Data.b $2D
      Data.s "ADD A,R6"             :   Data.b 1  :    Data.b $2E
      Data.s "ADD A,R7"             :   Data.b 1  :    Data.b $2F
      
      Data.s "ADD A,addr"           :   Data.b 2  :    Data.b $25
      
      Data.s "ADD A,@R0"            :   Data.b 1  :    Data.b $26
      Data.s "ADD A,@R1"            :   Data.b 1  :    Data.b $27
      
      Data.s "ADD A,#data"          :   Data.b 2  :    Data.b $24
      
      Data.s "ADDC A,R0"            :   Data.b 1  :    Data.b $38
      Data.s "ADDC A,R1"            :   Data.b 1  :    Data.b $39
      Data.s "ADDC A,R2"            :   Data.b 1  :    Data.b $3A
      Data.s "ADDC A,R3"            :   Data.b 1  :    Data.b $3B
      Data.s "ADDC A,R4"            :   Data.b 1  :    Data.b $3C
      Data.s "ADDC A,R5"            :   Data.b 1  :    Data.b $3D
      Data.s "ADDC A,R6"            :   Data.b 1  :    Data.b $3E
      Data.s "ADDC A,R7"            :   Data.b 1  :    Data.b $3F
      
      Data.s "ADDC A,addr"          :   Data.b 2  :    Data.b $35
      
      Data.s "ADDC A,@R0"           :   Data.b 1  :    Data.b $36
      Data.s "ADDC A,@R1"           :   Data.b 1  :    Data.b $37
      
      Data.s "ADDC A,#data"         :   Data.b 2  :    Data.b $34
      
      Data.s "SUBB A,R0"            :   Data.b 1  :    Data.b $98
      Data.s "SUBB A,R1"            :   Data.b 1  :    Data.b $99
      Data.s "SUBB A,R2"            :   Data.b 1  :    Data.b $9A
      Data.s "SUBB A,R3"            :   Data.b 1  :    Data.b $9B
      Data.s "SUBB A,R4"            :   Data.b 1  :    Data.b $9C
      Data.s "SUBB A,R5"            :   Data.b 1  :    Data.b $9D
      Data.s "SUBB A,R6"            :   Data.b 1  :    Data.b $9E
      Data.s "SUBB A,R7"            :   Data.b 1  :    Data.b $9F
      
      Data.s "SUBB A,addr"          :   Data.b 2  :    Data.b $95
      
      Data.s "SUBB A,@R0"           :   Data.b 1  :    Data.b $96
      Data.s "SUBB A,@R1"           :   Data.b 1  :    Data.b $97
      
      Data.s "SUBB A,#data"         :   Data.b 2  :    Data.b $94
      
      Data.s "INC A"                :   Data.b 1  :    Data.b $04
      
      Data.s "INC R0"               :   Data.b 1  :    Data.b $08
      Data.s "INC R1"               :   Data.b 1  :    Data.b $09
      Data.s "INC R2"               :   Data.b 1  :    Data.b $0A
      Data.s "INC R3"               :   Data.b 1  :    Data.b $0B
      Data.s "INC R4"               :   Data.b 1  :    Data.b $0C
      Data.s "INC R5"               :   Data.b 1  :    Data.b $0D
      Data.s "INC R6"               :   Data.b 1  :    Data.b $0E
      Data.s "INC R7"               :   Data.b 1  :    Data.b $0F
      
      Data.s "INC addr"             :   Data.b 2  :    Data.b $05
      
      Data.s "INC @R0"              :   Data.b 1  :    Data.b $06
      Data.s "INC @R1"              :   Data.b 1  :    Data.b $07
      
      Data.s "DEC A"                :   Data.b 1  :    Data.b $14
      
      Data.s "DEC R0"               :   Data.b 1  :    Data.b $18
      Data.s "DEC R1"               :   Data.b 1  :    Data.b $19
      Data.s "DEC R2"               :   Data.b 1  :    Data.b $1A
      Data.s "DEC R3"               :   Data.b 1  :    Data.b $1B
      Data.s "DEC R4"               :   Data.b 1  :    Data.b $1C
      Data.s "DEC R5"               :   Data.b 1  :    Data.b $1D
      Data.s "DEC R6"               :   Data.b 1  :    Data.b $1E
      Data.s "DEC R7"               :   Data.b 1  :    Data.b $1F
      
      Data.s "DEC addr"             :   Data.b 2  :    Data.b $15
      
      Data.s "DEC @R0"              :   Data.b 1  :    Data.b $16
      Data.s "DEC @R1"              :   Data.b 1  :    Data.b $17
      
      Data.s "INC DPTR"             :   Data.b 1  :    Data.b $A3
      Data.s "MUL AB"               :   Data.b 1  :    Data.b $A4
      Data.s "DIV AB"               :   Data.b 1  :    Data.b $84
      Data.s "DA A"                 :   Data.b 1  :    Data.b $D4
      
      
      ; Logical commands:
      
      ;       Command                 Size (Bytes)       Codes
      Data.s "ANL A,R0"             :   Data.b 1  :    Data.b $58
      Data.s "ANL A,R1"             :   Data.b 1  :    Data.b $59
      Data.s "ANL A,R2"             :   Data.b 1  :    Data.b $5A
      Data.s "ANL A,R3"             :   Data.b 1  :    Data.b $5B
      Data.s "ANL A,R4"             :   Data.b 1  :    Data.b $5C
      Data.s "ANL A,R5"             :   Data.b 1  :    Data.b $5D
      Data.s "ANL A,R6"             :   Data.b 1  :    Data.b $5E
      Data.s "ANL A,R7"             :   Data.b 1  :    Data.b $5F
      
      Data.s "ANL A,addr"           :   Data.b 2  :    Data.b $55
      
      Data.s "ANL A,@R0"            :   Data.b 1  :    Data.b $56
      Data.s "ANL A,@R1"            :   Data.b 1  :    Data.b $57
      
      Data.s "ANL A,#data"          :   Data.b 2  :    Data.b $54
      
      Data.s "ANL addr,A"           :   Data.b 2  :    Data.b $52
      Data.s "ANL addr,#data"       :   Data.b 3  :    Data.b $53
      
      Data.s "ORL A,R0"             :   Data.b 1  :    Data.b $48
      Data.s "ORL A,R1"             :   Data.b 1  :    Data.b $49
      Data.s "ORL A,R2"             :   Data.b 1  :    Data.b $4A
      Data.s "ORL A,R3"             :   Data.b 1  :    Data.b $4B
      Data.s "ORL A,R4"             :   Data.b 1  :    Data.b $4C
      Data.s "ORL A,R5"             :   Data.b 1  :    Data.b $4D
      Data.s "ORL A,R6"             :   Data.b 1  :    Data.b $4E
      Data.s "ORL A,R7"             :   Data.b 1  :    Data.b $4F
      
      Data.s "ORL A,addr"           :   Data.b 2  :    Data.b $45
      
      Data.s "ORL A,@R0"            :   Data.b 1  :    Data.b $46
      Data.s "ORL A,@R1"            :   Data.b 1  :    Data.b $47
      
      Data.s "ORL A,#data"          :   Data.b 2  :    Data.b $44
      
      Data.s "ORL addr,A"           :   Data.b 2  :    Data.b $42
      Data.s "ORL addr,#data"       :   Data.b 3  :    Data.b $43
      
      Data.s "XRL A,R0"             :   Data.b 1  :    Data.b $68
      Data.s "XRL A,R1"             :   Data.b 1  :    Data.b $69
      Data.s "XRL A,R2"             :   Data.b 1  :    Data.b $6A
      Data.s "XRL A,R3"             :   Data.b 1  :    Data.b $6B
      Data.s "XRL A,R4"             :   Data.b 1  :    Data.b $6C
      Data.s "XRL A,R5"             :   Data.b 1  :    Data.b $6D
      Data.s "XRL A,R6"             :   Data.b 1  :    Data.b $6E
      Data.s "XRL A,R7"             :   Data.b 1  :    Data.b $6F
      
      Data.s "XRL A,addr"           :   Data.b 2  :    Data.b $65
      
      Data.s "XRL A,@R0"            :   Data.b 1  :    Data.b $66
      Data.s "XRL A,@R1"            :   Data.b 1  :    Data.b $67
      
      Data.s "XRL A,#data"          :   Data.b 2  :    Data.b $64
      
      Data.s "XRL addr,A"           :   Data.b 2  :    Data.b $62
      Data.s "XRL addr,#data"       :   Data.b 3  :    Data.b $63
      
      Data.s "CLR A"                :   Data.b 1  :    Data.b $E4
      Data.s "CPL A"                :   Data.b 1  :    Data.b $F4
      
      Data.s "RL A"                 :   Data.b 1  :    Data.b $23
      Data.s "RLC A"                :   Data.b 1  :    Data.b $33
      
      Data.s "RR A"                 :   Data.b 1  :    Data.b $03
      Data.s "RRC A"                :   Data.b 1  :    Data.b $13
      Data.s "RL A"                 :   Data.b 1  :    Data.b $23
      
      Data.s "SWAP A"               :   Data.b 1  :    Data.b $C4
      
      
      ; Jump commands:
      
      ;       Command                 Size (Bytes)       Codes
      ; *
      Data.s "RET"                  :   Data.b 1  :    Data.b $22
      Data.s "RETI"                 :   Data.b 1  :    Data.b $32
      
      ; *
      Data.s "SJMP rel"             :   Data.b 2  :    Data.b $80
      Data.s "JMP @A+DPTR"          :   Data.b 1  :    Data.b $73
      
      Data.s "JZ rel"               :   Data.b 2  :    Data.b $60
      Data.s "JNZ rel"              :   Data.b 2  :    Data.b $70
      
      Data.s "CJNE A,addr,rel"      :   Data.b 3  :    Data.b $B5
      Data.s "CJNE A,#data,rel"     :   Data.b 3  :    Data.b $B4
      
      Data.s "CJNE R0,#data,rel"    :   Data.b 3  :    Data.b $B8
      Data.s "CJNE R1,#data,rel"    :   Data.b 3  :    Data.b $B9
      Data.s "CJNE R2,#data,rel"    :   Data.b 3  :    Data.b $BA
      Data.s "CJNE R3,#data,rel"    :   Data.b 3  :    Data.b $BB
      Data.s "CJNE R4,#data,rel"    :   Data.b 3  :    Data.b $BC
      Data.s "CJNE R5,#data,rel"    :   Data.b 3  :    Data.b $BD
      Data.s "CJNE R6,#data,rel"    :   Data.b 3  :    Data.b $BE
      Data.s "CJNE R7,#data,rel"    :   Data.b 3  :    Data.b $BF
      
      Data.s "CJNE @R0,#data,rel"   :   Data.b 3  :    Data.b $B6
      Data.s "CJNE @R1,#data,rel"   :   Data.b 3  :    Data.b $B7
      
      Data.s "DJNZ R0,rel"          :   Data.b 2  :    Data.b $D8
      Data.s "DJNZ R1,rel"          :   Data.b 2  :    Data.b $D9
      Data.s "DJNZ R2,rel"          :   Data.b 2  :    Data.b $DA
      Data.s "DJNZ R3,rel"          :   Data.b 2  :    Data.b $DB
      Data.s "DJNZ R4,rel"          :   Data.b 2  :    Data.b $DC
      Data.s "DJNZ R5,rel"          :   Data.b 2  :    Data.b $DD
      Data.s "DJNZ R6,rel"          :   Data.b 2  :    Data.b $DE
      Data.s "DJNZ R7,rel"          :   Data.b 2  :    Data.b $DF
      
      Data.s "DJNZ addr,rel"        :   Data.b 3  :    Data.b $D5
      
      Data.s "JC rel"               :   Data.b 2  :    Data.b $40
      Data.s "JNC rel"              :   Data.b 2  :    Data.b $50
      
      Data.s "JB addr,rel"          :   Data.b 3  :    Data.b $20
      Data.s "JNB addr,rel"         :   Data.b 3  :    Data.b $30
      Data.s "JBC addr,rel"         :   Data.b 3  :    Data.b $10
      
      Data.s "NOP"                  :   Data.b 1  :    Data.b $00
      
    Commands_End:
    
    Commands16:
      
      ;       Command                 Size (Bytes)       Codes
      Data.s "MOV DPTR,#data"       :   Data.b 2  :    Data.b $89
      
      Data.s "LCALL addr"           :   Data.b 3  :    Data.b $12
      
      Data.s "LJMP addr"            :   Data.b 3  :    Data.b $02
      
    Commands_End16:
EndDataSection
Man hätte einiges besser machen können, z.B. die Param1, Param2, Param3 kommentierten Bereiche in Makros stecken. Das ganze sollte sowieso irgendwie generalüberholt werden. Der Stil ist nicht gerade gut, aber es funktioniert zumindest.

Es ist ein sehr Fehlertoleranter 8051 Assembler. Vielleicht kommt er beim ein oder anderen AMTEL bzw. generellen 8051 Prozessor Fanatiker zum einsatz, wär aber auch nicht traurig drüber wenn niemand das Teil je anfassen würde.

Probierts einfach aus. Startet die EXE so:
EXEName "HauptQuelltext.asm" "AusgabeDatei.hex"
2 Bekannte Fehler:
AJMP und ACALL gibt es noch nicht, da ich nicht weiß wie man diese blöden 11 bit Adress-Parameter am besten reinquetscht.

Mögliche Fehler(kanns nicht testen):
16 Bit Parameter sind eventuell noch Falschrum?

Mehr will ich darüber heut Abend nichtmehr hören, aber gern les ich morgen eure Kommentare. Ob ich daran weitermach weiß ich noch nicht.
Zuletzt geändert von DarkDragon am 17.12.2006 21:16, insgesamt 3-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Der Simulator muss nun folgen :allright:
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Update: Das Intel Hex File Format wird nun unterstützt und es werden nichtmehr einfach Rohdaten geschrieben ;-) . Außerdem wurden die Compiler-Direktiven db, dw, dd hinzugefügt. Leider muss ich dazusagen: Ich habe noch nichts eingebaut um die 16 und 32 bit Daten "umzudrehen"(PB hat ja son verkehrtes Endian oder so :freak: ). Die 11bit Befehle sind auch noch nicht drin.

@remi: Simulatoren gibts genug im Netz ;-) . Z.B. hier: http://bit.kuas.edu.tw/~8051/
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten