Update
Ganze zeilen können verarbeitet werden.
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Const Direkt = 1 Const Immediate = 2 Const VarInt = 3 Const CMarke = 4 Const RegisterEAX = 5 Const RegisterEBX = 6 Const RegisterIndirektEAX= 7 Const RegisterIndirektEBX= 8 Const KeinParameter = 9
Type ConstIntTyp Field Name$ Field Wert End Type
Type MarkeTyp Field Name$ Field Adresse End Type
Type VarrialbelTyp Field Name$ Field Adresse Field Wert End Type
Type AsmBefehlTypTyp Field BefehlNr Field Befehl$ Field Parameter1Typ Field Parameter2Typ Field Lang End Type
Type AssemblerTyp Field Position Field InputDatei$ Field OutputDatei$
Field Speicher
Field InputDateiNr Field OutputDateiNr
Field AusgabeArt End Type
Type AsmBefehlTyp Field Parameter1$ Field Parameter2$ Field Parameter1Typ Field Parameter2Typ Field Position Field BefehlNr End Type
Global ConstInt.ConstIntTyp Global Marke.MarkeTyp Global Varrialbel.VarrialbelTyp Global AsmBefehlTyp.AsmBefehlTypTyp Global Assembler.AssemblerTyp Global AsmBefehl.AsmBefehlTyp
Global BefehlLang[32] Global BefehlName$[32] Global BefehlTyp$[32]
Const MOV_EAX_EBX = 1 Const MOV_EBX_EAX = 2
Const MOV_EAX_Const = 3 Const MOV_EBX_Const = 4
Const RESTORE_EAX_CONST = 5 Const RESTORE_EBX_CONST = 6
Const RESTORE_EAX_EBX = 7 Const RESTORE_EBX_EAX = 8 Const LOAD_EAX_CONST = 9 Const LOAD_EBX_CONST = 10
Const LOAD_EAX_EBX = 11 Const LOAD_EBX_EAX = 12
Const ADD_EAX_EBX = 13 Const NEG_EAX = 14 Const SUB_EAX_EBX = 15 Const DIV_EAX_EBX = 16 Const MUL_EAX_EBX = 17
Const LT_EAX_EBX = 18 Const GT_EAX_EBX = 19 Const LE_EAX_EBX = 20 Const GE_EAX_EBX = 21 Const EQ_EAX_EBX = 22 Const NE_EAX_EBX = 23
Const Push_EAX = 24 Const Push_EBX = 25
Const POP_EAX = 26 Const POP_EBX = 27
Const Call_Int = 28
Const JMP_CONST = 29 Const JZ_CONST = 30
Const Ret = 31 Const Call = 32
Type TaskTyp Field Speicher Field SpeicherByte
Field EIP Field ZERO
Field EAX Field EBX
Field StackZeiger End Type
Global Task.TaskTyp
Task=New TaskTyp
Inst_Assembler Assembler=New AssemblerTyp Assembler\Position=0 Task\Speicher=CreateBank(200)
AsmZeile \"CALLINT 1\" AsmZeile \"CALLINT 2\"
Kompiliere_ASM
Run_VM
WaitKey
Function Upper$(S$) Slen=Len(S) If Slen>0 Then For P=1 To Slen ASCII=Asc(Mid$(S$,P,1)) If Ascii>96 And Ascii<123 Then Ascii=Ascii-32 ElseIf Ascii=252 Then Ascii=220 ElseIf Ascii=228 Then Ascii=196 ElseIf Ascii=246 Then Ascii=214 End If R$=R$+Chr$(ASCII) Next Return R$ End If End Function
Function Lower$(S$) Slen=Len(S) If Slen>0 Then For P=1 To Slen ASCII=Asc(Mid$(S$,P,1)) If Ascii>64 And Ascii<92 Then Ascii=Ascii+32 ElseIf Ascii=220 Then Ascii=252 ElseIf Ascii=196 Then Ascii=228 ElseIf Ascii=214 Then Ascii=246 End If R$=R$+Chr$(ASCII) Next Return R$ End If End Function Function Run_VM() Repeat Select PeekByte(Task\Speicher,Task\EIP) Case MOV_EAX_EBX Task\EAX=Task\EBX Task\EIP=Task\EIP+1 Case MOV_EBX_EAX Task\EBX=Task\EAX Task\EIP=Task\EIP+1 Case MOV_EAX_CONST Task\EAX=PeekInt(Task\Speicher,Task\EIP+1) Task\EIP=Task\EIP+5 Case MOV_EBX_CONST Task\EBX=PeekInt(Task\Speicher,Task\EIP+1) Task\EIP=Task\EIP+5
Case RESTORE_EAX_CONST PokeInt Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1),Task\EAX Task\EIP=Task\EIP+5 Case RESTORE_EBX_CONST PokeInt Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1),Task\EBX Task\EIP=Task\EIP+5
Case RESTORE_EAX_EBX PokeInt Task\Speicher,Task\EAX,Task\EBX Task\EIP=Task\EIP+1 Case RESTORE_EBX_EAX PokeInt Task\Speicher,Task\EBX,Task\EAX Task\EIP=Task\EIP+1
Case LOAD_EAX_CONST Task\EAX=PeekInt(Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1)) Task\EIP=Task\EIP+5 Case LOAD_EBX_CONST Task\EBX=PeekInt(Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1)) Task\EIP=Task\EIP+5
Case LOAD_EAX_EBX Task\EAX=PeekInt(Task\Speicher,Task\EBX) Task\EIP=Task\EIP+1 Case LOAD_EBX_EAX Task\EBX=PeekInt(Task\Speicher,Task\EAX) Task\EIP=Task\EIP+1
Case ADD_EAX_EBX Task\EAX=Task\EAX+Task\EBX Task\EIP=Task\EIP+1 Case NEG_EAX Task\EAX=-Task\EAX Task\EIP=Task\EIP+1 Case SUB_EAX_EBX Task\EAX=Task\EAX-Task\EBX Task\EIP=Task\EIP+1 Case DIV_EAX_EBX Task\EAX=Task\EAX/Task\EBX Task\EIP=Task\EIP+1 Case MUL_EAX_EBX Task\EAX=Task\EAX*Task\EBX Task\EIP=Task\EIP+1
Case LT_EAX_EBX If Task\EAX<Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1
Case GT_EAX_EBX If Task\EAX>Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1
Case LE_EAX_EBX If Task\EAX<=Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1
Case GE_EAX_EBX If Task\EAX>=Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1 Case EQ_EAX_EBX If Task\EAX<>Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1
Case NE_EAX_EBX If Task\EAX=Task\EBX Then Task\ZERO=True Else Task\ZERO=False End If Task\EIP=Task\EIP+1 Case Push_EAX PushInt Task\EAX Task\EIP=Task\EIP+1 Case Push_EBX PushInt Task\EBX Task\EIP=Task\EIP+1 Case POP_EAX Task\EAX=PopInt() Task\EIP=Task\EIP+1 Case POP_EBX Task\EAX=PopInt() Task\EIP=Task\EIP+1 Case Call_Int Select PeekInt(Task\Speicher,Task\EIP+1) Case 1 Print Task\EAX Case 2 Print \"ENDE\" Return End Select Task\EIP=Task\EIP+5
Case JMP_CONST Task\EIP=PeekInt(Task\Speicher,Task\EIP+1)
Case JZ_CONST If Task\ZERO=True Then Task\EIP=PeekInt(Task\Speicher,Task\EIP+1) Else Task\EIP=Task\EIP+5 End If
Case RET Task\EIP=PopInt() Case Call PushInt(Task\EIP+5) Task\EIP=PeekInt(Task\Speicher,Task\EIP+1) End Select Forever End Function
Function GetInt(IntNr) PeekInt(Task\Speicher,IntNr*4+5) End Function
Function PushInt(IntWert) PokeInt Task\Speicher,Task\StackZeiger,IntWert Task\StackZeiger=Task\StackZeiger+4 End Function
Function PopInt() Task\StackZeiger=Task\StackZeiger-4 Return PeekInt(Task\Speicher,Task\StackZeiger) End Function
Function Inst_Assembler() BefehlLang[ 1]=1 BefehlName[ 1]=\"MOV_EAX_EBX\" BefehlTyp [ 1]=\"MOV\"
BefehlLang[ 2]=1 BefehlName[ 2]=\"MOV_EBX_EAX\" BefehlTyp [ 2]=\"MOV\"
BefehlLang[ 3]=5 BefehlName[ 3]=\"MOV_EAX_Const\" BefehlTyp [ 3]=\"MOV\"
BefehlLang[ 4]=5 BefehlName[ 4]=\"MOV_EBX_Const\" BefehlTyp [ 4]=\"MOV\"
BefehlLang[ 5]=5 BefehlName[ 5]=\"RESTORE_EAX_CONST\" BefehlTyp [ 5]=\"RESTORE\"
BefehlLang[ 6]=5 BefehlName[ 6]=\"RESTORE_EBX_CONST\" BefehlTyp [ 6]=\"RESTORE\"
BefehlLang[ 7]=1 BefehlName[ 7]=\"RESTORE_EAX_EBX\" BefehlTyp [ 7]=\"RESTORE\"
BefehlLang[ 8]=1 BefehlName[ 8]=\"RESTORE_EBX_EAX\" BefehlTyp [ 8]=\"RESTORE\" BefehlLang[ 9]=5 BefehlName[ 9]=\"LOAD_EAX_CONST\" BefehlTyp [ 1]=\"LOAD\"
BefehlLang[10]=5 BefehlName[10]=\"LOAD_EBX_CONST\" BefehlTyp [10]=\"LOAD\"
BefehlLang[11]=1 BefehlName[11]=\"LOAD_EAX_EBX\" BefehlTyp [11]=\"LOAD\"
BefehlLang[12]=1 BefehlName[12]=\"LOAD_EBX_EAX\" BefehlTyp [12]=\"LOAD\"
BefehlLang[13]=1 BefehlName[13]=\"ADD_EAX_EBX\" BefehlTyp [13]=\"LOAD\"
BefehlLang[14]=1 BefehlName[14]=\"NEG_EAX\" BefehlTyp [14]=\"NEG\" BefehlLang[15]=1 BefehlName[15]=\"SUB_EAX_EBX\" BefehlTyp [15]=\"SUB\" BefehlLang[16]=1 BefehlName[16]=\"DIV_EAX_EBX\" BefehlTyp [16]=\"DIV\" BefehlLang[17]=1 BefehlName[17]=\"MUL_EAX_EBX\" BefehlTyp [17]=\"MUL\" BefehlLang[18]=1 BefehlName[18]=\"LT_EAX_EBX\" BefehlTyp [18]=\"LT\" BefehlLang[19]=1 BefehlName[19]=\"GT_EAX_EBX\" BefehlTyp [19]=\"GT\" BefehlLang[20]=1 BefehlName[20]=\"LE_EAX_EBX\" BefehlTyp [20]=\"LE\" BefehlLang[21]=1 BefehlName[21]=\"GE_EAX_EBX\" BefehlTyp [ 1]=\"GE\" BefehlLang[22]=1 BefehlName[22]=\"EQ_EAX_EBX\" BefehlTyp [22]=\"EQ\" BefehlLang[23]=1 BefehlName[23]=\"NE_EAX_EBX\" BefehlTyp [23]=\"NE\" BefehlLang[24]=1 BefehlName[24]=\"PUSH_EAX\" BefehlTyp [24]=\"PUSH\" BefehlLang[25]=1 BefehlName[25]=\"PUSH_EBX\" BefehlTyp [25]=\"PUSH\" BefehlLang[26]=1 BefehlName[26]=\"POP_EAX\" BefehlTyp [26]=\"POP\" BefehlLang[27]=1 BefehlName[27]=\"POP_EBX\" BefehlTyp [27]=\"POP\" BefehlLang[28]=5 BefehlName[28]=\"CALL_INT\" BefehlTyp [28]=\"CALL_INT\" BefehlLang[29]=5 BefehlName[29]=\"JMP_CONST\" BefehlTyp [29]=\"JMP\" BefehlLang[30]=5 BefehlName[30]=\"JZ_CONST\" BefehlTyp [30]=\"JZ\" BefehlLang[31]=1 BefehlName[31]=\"RET\" BefehlTyp [31]=\"RET\" BefehlLang[32]=5 BefehlName[32]=\"CAll\" BefehlTyp [32]=\"CALL\"
Inst_AsmBefehl \"MOV\" ,MOV_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"MOV\" ,MOV_EBX_EAX ,RegisterEBX ,RegisterEAX ,1
Inst_AsmBefehl \"MOV\" ,MOV_EAX_Const ,RegisterEAX ,Direkt ,5 Inst_AsmBefehl \"MOV\" ,MOV_EBX_Const ,RegisterEBX ,Direkt ,5 Inst_AsmBefehl \"MOV\" ,MOV_EAX_Const ,RegisterEAX ,CMarke ,5 Inst_AsmBefehl \"MOV\" ,MOV_EBX_Const ,RegisterEBX ,CMarke ,5
Inst_AsmBefehl \"RESTORE\",RESTORE_EAX_CONST,RegisterEAX ,Immediate ,5 Inst_AsmBefehl \"RESTORE\",RESTORE_EBX_CONST,RegisterEBX ,Immediate ,5 Inst_AsmBefehl \"RESTORE\",RESTORE_EAX_CONST,RegisterEAX ,CMarke ,5 Inst_AsmBefehl \"RESTORE\",RESTORE_EBX_CONST,RegisterEBX ,CMarke ,5 Inst_AsmBefehl \"RESTORE\",RESTORE_EAX_CONST,RegisterEAX ,VarInt ,5 Inst_AsmBefehl \"RESTORE\",RESTORE_EBX_CONST,RegisterEBX ,VarInt ,5
Inst_AsmBefehl \"RESTORE\",RESTORE_EAX_EBX ,RegisterEAX ,RegisterIndirektEBX,1 Inst_AsmBefehl \"RESTORE\",RESTORE_EBX_EAX ,RegisterEBX ,RegisterIndirektEAX,1 Inst_AsmBefehl \"LOAD\" ,LOAD_EAX_EBX ,RegisterEAX ,RegisterIndirektEBX,1 Inst_AsmBefehl \"LOAD\" ,LOAD_EBX_EAX ,RegisterEBX ,RegisterIndirektEAX,1 Inst_AsmBefehl \"LOAD\" ,LOAD_EAX_CONST ,RegisterEAX ,CMarke ,5 Inst_AsmBefehl \"LOAD\" ,LOAD_EBX_CONST ,RegisterEBX ,CMarke ,5 Inst_AsmBefehl \"LOAD\" ,LOAD_EAX_CONST ,RegisterEAX ,VarInt ,5 Inst_AsmBefehl \"LOAD\" ,LOAD_EBX_CONST ,RegisterEBX ,VarInt ,5 Inst_AsmBefehl \"LOAD\" ,LOAD_EAX_CONST ,RegisterEAX ,Immediate ,5 Inst_AsmBefehl \"LOAD\" ,LOAD_EBX_CONST ,RegisterEBX ,Immediate ,5
Inst_AsmBefehl \"ADD\" ,ADD_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"NEG\" ,NEG_EAX ,RegisterEAX ,KeinParameter ,1 Inst_AsmBefehl \"SUB\" ,SUB_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"DIV\" ,DIV_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"MUL\" ,MUL_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"LT\" ,LT_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"GT\" ,GT_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"LE\" ,LE_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"GE\" ,GE_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"EQ\" ,EQ_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"NE\" ,NE_EAX_EBX ,RegisterEAX ,RegisterEBX ,1 Inst_AsmBefehl \"PUSH\" ,Push_EAX ,RegisterEAX ,KeinParameter ,1 Inst_AsmBefehl \"PUSH\" ,Push_EBX ,RegisterEBX ,KeinParameter ,1 Inst_AsmBefehl \"POP\" ,POP_EAX ,RegisterEAX ,KeinParameter ,1 Inst_AsmBefehl \"POP\" ,POP_EBX ,RegisterEBX ,KeinParameter ,1 Inst_AsmBefehl \"CALLINT\",Call_Int ,Direkt ,KeinParameter ,5 Inst_AsmBefehl \"JMP\" ,JMP_CONST ,Immediate ,KeinParameter ,5 Inst_AsmBefehl \"JZ\" ,JZ_CONST ,Immediate ,KeinParameter ,5 Inst_AsmBefehl \"JMP\" ,JMP_CONST ,CMarke ,KeinParameter ,5 Inst_AsmBefehl \"JZ\" ,JZ_CONST ,CMarke ,KeinParameter ,5 Inst_AsmBefehl \"RET\" ,Ret ,KeinParameter,KeinParameter ,5 Inst_AsmBefehl \"CALL\" ,Call ,Immediate ,KeinParameter ,5 Inst_AsmBefehl \"CALL\" ,Call ,CMarke ,KeinParameter ,5 End Function
Function Inst_AsmBefehl(BefehlName$,BefehlNr,Parameter1Typ,Parameter2Typ,Befehllang) AsmBefehlTyp.AsmBefehlTypTyp = New AsmBefehlTypTyp AsmBefehlTyp\Befehl$=BefehlName$ AsmBefehlTyp\BefehlNr=BefehlNr AsmBefehlTyp\Parameter1Typ=Parameter1Typ AsmBefehlTyp\Parameter2Typ=Parameter2Typ AsmBefehlTyp\lang=Befehllang End Function
Function Kompiliere_ASM()
For AsmBefehl.AsmBefehlTyp=Each AsmBefehlTyp
If AsmBefehl\Parameter1Typ=Direkt Then PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter1$) ElseIf AsmBefehl\Parameter1Typ=Immediate Then PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter1$) ElseIf AsmBefehl\Parameter1Typ=CMarke Then For Marke=Each MarkeTyp If Upper$(Marke\Name$)=Upper$(Mid$(AsmBefehl\Parameter1$,2)) Then PokeByte Task\Speicher,AsmBefehl\Position+1,Marke\Adresse Return End If Next ElseIf AsmBefehl\Parameter1Typ=VarInt Then For Varrialbel = Each VarrialbelTyp If AsmBefehl\Parameter1$=Varrialbel\Name$ Then PokeByte Task\Speicher,AsmBefehl\Position+1,Varrialbel\Adresse End If Next
ElseIf AsmBefehl\Parameter2Typ=Direkt Then PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter2$) ElseIf AsmBefehl\Parameter2Typ=Immediate Then PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter2$) ElseIf AsmBefehl\Parameter2Typ=CMarke Then For Marke=Each MarkeTyp If Upper$(Marke\Name$)=Upper$(Mid$(AsmBefehl\Parameter2$,2)) Then PokeByte Task\Speicher,AsmBefehl\Position+1,Marke\Adresse Return End If Next ElseIf AsmBefehl\Parameter2Typ=VarInt Then For Varrialbel = Each VarrialbelTyp If AsmBefehl\Parameter2$=Varrialbel\Name$ Then PokeByte Task\Speicher,AsmBefehl\Position+1,Varrialbel\Adresse End If Next End If Next End Function
Function AsmZeile(Zeile$) Befehl$=Trim$(Upper$(Mid$(Zeile$,1,Instr(Zeile$+\" \",\" \")-1)))
Local ParameterS$[2] Parameter$=Mid$(Zeile$,Instr(Zeile$+\" \",\" \")+1) ParameterLang=Len(Parameter$) For Pos=1 To ParameterLang Select Mid$(Parameter$,Pos,1) Case \" \" If Len(ParameterS[ParameterNr])>0 Then ParameterNr=ParameterNr+1 End If Case \";\" Exit Default If ParameterNr=3 Then Return End If ParameterS[ParameterNr]=ParameterS[ParameterNr]+Mid$(Parameter$,Pos,1) End Select Next
Parameter1$=ParameterS[0] Parameter2$=ParameterS[1] Parameter3$=ParameterS[2]
If Len(ParameterS[ParameterNr])=0 Then ParameterNr=ParameterNr-1 End If If Befehl$=\"DB\" Then Zeilelang=Len(Zeile$) Pos=Instr(Zeile$+\" \",\" \")-1
If Start=0 Then Return End If
For POS=Start To Zeilelang Select Mid$(Zeile$,Pos) Case \" \" If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 Else If Len(ZahlenStrByte$)>0 Then ByteZahl=Int(ZahlenStrByte$) If ByteZahl>255 Then Return End If PokeByte Task\Speicher,Assembler\Position,ByteZahl Assembler\Position=Assembler\Position+1 ZahlenStrByte$=\"\" End If End If Case \",\" If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 Else If Len(ZahlenStrByte$)>0 Then ByteZahl=Int(ZahlenStrByte$) If ByteZahl>255 Then Return End If PokeByte Task\Speicher,Assembler\Position,ByteZahl Assembler\Position=Assembler\Position+1 ZahlenStrByte$=\"\" End If End If Case \"'\" If ZeichenAn=False Then PokeByte Task\Speicher,Assembler\Position,ByteZahl Assembler\Position=Assembler\Position+1 ZahlenStrByte$=\"\" End If ZeichenAn=True-ZeichenAn Case \"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\" If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 Else ZahlenStrByte$=ZahlenstrByte$+Mid$(Zeile$,Pos) End If Case \";\" If ZeichenAn=False Then Return End If PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 Default If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 Else Return End If End Select Next PokeByte Task\Speicher,Assembler\Position,ByteZahl Assembler\Position=Assembler\Position+1 ZahlenStrByte$=\"\" ElseIf Befehl$=\"DW\" Then Zeilelang=Len(Zeile$) Pos=Instr(Zeile$+\" \",\" \")-1
If Start=0 Then Return End If
For POS=Start To Zeilelang Select Mid$(Zeile$,Pos) Case \";\" If (ZahlenStrDB$)>0 Then Zahlshort=Int(ZahlenStrDB$) PokeShort Task\Speicher,Assembler\Position,Zahlshort ZahlenStrDB$=\"\" Else End If Return Case \" \" If (ZahlenStrDB$)>0 Then Zahlshort=Int(ZahlenStrDB$) PokeShort Task\Speicher,Assembler\Position,Zahlshort ZahlenStrDB$=\"\" Else End If Case \",\" If (ZahlenStrDB$)>0 Then Zahlshort=Int(ZahlenStrDB$) PokeShort Task\Speicher,Assembler\Position,Zahlshort ZahlenStrDB$=\"\" Else End If Case \"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\" ZahlenStrDB$=ZahlenstrDB$+Mid$(Zeile$,Pos) Default End Select Next
If (ZahlenStrDB$)>0 Then Zahlshort=Int(ZahlenStrDB$) PokeShort Task\Speicher,Assembler\Position,Zahlshort ZahlenStrDB$=\"\" End If
ElseIf MarkeTest(Befehl$)=True Then Marke=New MarkeTyp Marke\Name$= MarkeName$(Befehl$) Marke\Adresse=Assembler\Position ElseIf Befehl$=\"VAR\" Then If VarrialbelTest(Parameter1$)=False Then Return End If For Varrialbel=Each VarrialbelTyp If Upper$(Varrialbel\Name$)=Upper$(Parameter1$) Then Return End If Next
If Len(Parameter2$)=0 Or Parameter2$=\"?\" Then Varrialbel=New VarrialbelTyp Varrialbel\Name$=Upper$(Parameter1$) Varrialbel\Adresse=Assembler\Position Varrialbel\Wert=0 Return End If
If Parameter2$<>\"=\" Then Return End If
Varrialbel=New VarrialbelTyp Varrialbel\Name$=Upper$(Parameter1$) Varrialbel\Adresse=Assembler\Position Varrialbel\Wert=Int(Parameter3$) Return
ElseIf Befehl$=\";\" Then Return ElseIf Befehl$=\"INCLUDE$\" Then ElseIf MarkeTest(Befehl$)=True Then Marke=New MarkeTyp Marke\Name$= MarkeName$(Befehl$) Marke\Adresse=Assembler\Position Return Else ASM Befehl$,Parameter1$,Parameter2$ End If End Function
Function ASM(Befehl$,Parameter1$=\"\",Parameter2$=\"\") Befehl$=Upper(Befehl$)
If Parameter1$=\"@EAX\" Then Parameter1Typ=RegisterIndirektEAX
ElseIf Parameter1$=\"@EBX\" Then Parameter1Typ=RegisterIndirektEBX
ElseIf Parameter1$=\"EAX\" Then Parameter1Typ=RegisterEAX
ElseIf Parameter1$=\"EBX\" Then Parameter1Typ=RegisterEBX
ElseIf Parameter1$=\"\" Then Parameter1Typ=KeinParameter
ElseIf IntTest(Parameter1$) Then Parameter1Typ=Direkt
ElseIf MarkeTest(Parameter1$)Then Parameter1Typ=CMarke End If
If Parameter2$=\"@EAX\" Then Parameter2Typ=RegisterIndirektEAX
ElseIf Parameter2$=\"@EBX\" Then Parameter2Typ=RegisterIndirektEBX
ElseIf Parameter2$=\"EAX\" Then Parameter2Typ=RegisterEAX
ElseIf Parameter2$=\"EBX\" Then Parameter2Typ=RegisterEBX
ElseIf Parameter2$=\"\" Then Parameter2Typ=KeinParameter
ElseIf IntTest(Parameter2$) Then Parameter2Typ=Direkt
ElseIf MarkeTest(Parameter2$)Then Parameter2Typ=CMarke End If If AsmBefehlTyp=Null Then Print \"W\"
For AsmBefehlTyp=Each AsmBefehlTypTyp
If Upper$(Befehl$)=Upper$(AsmBefehlTyp\Befehl$) Then
If Parameter1Typ=AsmBefehlTyp\Parameter1Typ Then If Parameter2Typ=AsmBefehlTyp\Parameter2Typ Then AsmBefehl=New AsmBefehlTyp AsmBefehl\Parameter1$=Parameter1$ AsmBefehl\Parameter2$=Parameter2$ AsmBefehl\Parameter1Typ=Parameter1Typ AsmBefehl\Parameter2Typ=Parameter2Typ AsmBefehl\Position=Assembler\Position AsmBefehl\BefehlNr=AsmBefehlTyp\BefehlNr
PokeByte Task\Speicher,Assembler\Position,AsmBefehl\BefehlNr
Assembler\Position=Assembler\Position+AsmBefehlTyp\lang Return End If End If End If Next End Function
Function VarrialbelTest(S$) Slen=Len(S) If Slen>0 Then For P=1 To Slen ASCII=Asc(Mid$(S$,P,1)) If Ascii>64 And Ascii<92 Then ElseIf Ascii=220 Then ElseIf Ascii=196 Then ElseIf Ascii=214 Then Else Return False End If Next Return True End If End Function
Function MarkeName$(Marke$) Return Mid$(Marke$,2) End Function
Function MarkeTest(S$) Slen=Len(S) If Mid$(S$,1,1)<>\":\" Then Return False If Slen>0 Then For P=2 To Slen ASCII=Asc(Mid$(S$,P,1)) If Ascii>64 And Ascii<92 Then ElseIf Ascii=220 Then ElseIf Ascii=196 Then ElseIf Ascii=214 Then Else Return False End If Next Return True End If End Function
Function IntTest(S$) Slen=Len(S$) For P=1 To Slen If Instr(\"0123456789\",Mid$(S$,P,1))=0 Then Return False Next Return True End Function
Function Exist_Datei(Datei$) If FileType(datei)=1 Then Return True Else Return False End If End Function
|