8051 Assembler - sehr Tolerant :-P
Verfasst: 07.12.2006 21:09
Hallo,
Hab einiges aus einer OpCode Liste abschreiben müssen um folgendes Programm fertigstellen zu können:
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:
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.
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
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:
2 Bekannte Fehler:EXEName "HauptQuelltext.asm" "AusgabeDatei.hex"
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.