Scripts in Game
Übersicht

SCRJBetreff: Scripts in Game |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi
Kennt sich jemand mit gamescripts aus? (ich meine jetzt nicht lua o.ä.) sondern wirklich die einbindung einer kleinen simplen scriptsprache. (bzw Bytecode interpreter) folgendes sind meine hauptfragen. Variabeln: wie sollte man die am besten speichern? in einer LinkedList / Array? oder gibts da schnelleres? ich kann es mir bis jetzt nur so vorstellen.... Funktionsaufrufe ich habe zb die prozedur HalloWelt(Etwas) wie würdet ihr die am besten aufrufen? Wenn Befehl = "Hallo Welt" Dann HalloWelt(Parameter1) Sonnst, Wenn Befehl = "Etwas Anderes" Dann EtwasAnderes() etcetc. (edit: natürlich nicht als strings vergleichen, sondern zahlen ![]() sowas ist doch nicht gerade schnell, oder? sinvoller wäre es, die funktion per pointer direck anzuspringen, also ohne IF (da sich die funktionspositionen nicht ändern (im laufe des programms), kann man diese ja "ganz" einfach in den bytecodescript schreiben.) nunja, ob das wirklich gut ist? naja, vieleicht wisst ihr mehr? ![]() Gruss SCRJ |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Funktionspointer gehen nicht.
ansonsten, fange mit einenParser an, der dir alles auseinandernimmt und den sin dahintererkennt. |
||
between angels and insects |
SCRJ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
>>Funktionspointer gehen nicht.
warum denn nicht? |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
weil keine Pointerrückgabe möglich ist. | ||
between angels and insects |
SCRJ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du meinst mit Blitz?
wer sagt denn, dass ich die scriptengine mit blitz mache? *ggg* ich werde sie wohl in einer anderen sprache schreiben, und in blitz nutzen. ![]() edit: sollten wir aneinander vorbei reden: du meinst die rückgabe ist in blitz nicht möglich, oder allgemein? *ooopsss...sehe grad, dass ich es demfall im falschen bereich gepotet habe ![]() sorry edit 2 hasts wohl auch gerade gemerk (falsches forum ![]() |
||
- Zuletzt bearbeitet von SCRJ am Mi, Jan 18, 2006 16:18, insgesamt einmal bearbeitet
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Allgemein(BB) ist das Subforum, das sagt es mir. | ||
between angels and insects |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Nur um das mal kurz einzuwerfen. Funktionspointer haben nichts mit Rückgabewerten zu tuen! ![]() grüße |
||
http://bl4ckd0g.funpic.de |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Also ich habe das für mein BMax Projekt so gelöst, dass ich mir zu allererst ein Sammelobjekt für allerlei Daten geschrieben habe. In dieses Objekt kann ich beliebig neue Variablen, andere Objekte und/oder Funktionen eintragen, neu erstellen und/oder verändern lassen. Das Objekt (mein t_collector) verwaltet diese Einträge über Handles (Namen der Variablen/Objekte/Funktionen) und direkte Pointer auf diese. Alles lässt sich über ein paar wenige Funktionen sehr einfach von ausserhalb steuern und es klappt wunderbar.
Für das eigentliche Skript habe ich dann einen Parser geschrieben. Dieser zerlegt das Text-Skript komplett in seine Einzelteile und speichert diese als Skript-Parts (Objekte) in einer Liste. Damit verhinder ich unnötiges Neu-Parsen, wenn das Skript öffter ausgeführt wird (und bei mir wird es in der Hauptschleife jeden Loop neu ausgeführt - da bringt es das enorm). Im Skript siehts dann zb so aus: <string var=name person 1,Bob Schulz> <function=name anzeigen,name person 1> Der erste Befehl richtet direkt eine String-Variable in meinem Collector ein und gibt ihr den Namen "name person 1" und den Wert "Bob Schulz" (wenn die Variable "name person 1" schon vorhanden ist, wird nur der Wert angepasst). Für den zweiten Skriptbefehl muss ich im Programm selbst eine Funktion erstellen und diese unter dem Namen "name anzeigen" in den Collector eintragen lassen. Ich rufe dann später im Skript den Collector mit seiner Funktion CollectorRunFunction("name anzeigen", "name person 1") auf. Erstes ist das Handle (nach diesem Funktionsnamen sucht er) und das zweite ist der Übergabewert an die Funktion. Mal angenommen, ich schreibe dann in die Funktion "name anzeigen", dass er einen Text anzeigen soll wie zb. DrawText "Sein Name ist " + collectorGetString(Funktionsparameter), 0, 0 ... wobei in diesem Fall der Funktionsparameter "name person 1" wäre und der Collector für dieses Handle den Wert "Bob Schulz" zurückgibt. Puh, kompliziert zu beschreiben! aber ich hoffe, es ist mir ein bisschen gelungen und vielleicht kann ich Dir damit eine Inspiration geben. ![]() Lieben Gruss, + Ava + |
||
SCRJ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke dir ava, für die sehr genaue beschreibung ![]() |
||
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Jmp :C var t = 3 MOV EAX 1000 :Z DB 'Das ist ein Test' :C MOV EAX :Z CALLINT 3 LOAD EAX T Mov EBX 1 EQ EAX EBX SUB EAX EBX RESTORE EAX t JZ :C CALLINT 2 Code: [AUSKLAPPEN] 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] ;MOV 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 ;Mathe Const ADD_EAX_EBX = 13 Const NEG_EAX = 14 Const SUB_EAX_EBX = 15 Const DIV_EAX_EBX = 16 Const MUL_EAX_EBX = 17 ;Setzt Zero=True ;EAX und EBX 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 ;* = ;Push Const Push_EAX = 24 Const Push_EBX = 25 ;Pop Const POP_EAX = 26 Const POP_EBX = 27 ;Function 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 ;Register Field EAX Field EBX Field StackZeiger End Type Global Task.TaskTyp Inst_Assembler KompiliereASM_Datei "I:\VM.TXT" Function KompiliereASM_Datei(DateiName$) DateiNr=ReadFile(DateiName$) If DateiNr=0 Then Return Task=New TaskTyp Assembler=New AssemblerTyp Assembler\Position=0 Task\Speicher=CreateBank(1024) While Not(Eof(DateiNr)) Asmzeile ReadLine(DateiNr) Wend CloseFile DateiNr Return True End Function Kompiliere_ASM ;WaitKey Task=First TaskTyp 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 3 Print GetString$(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 SetString(P,S$) LenS=Len(S$)-1 For X=0 To LenS PokeByte Task\Speicher,P+X,Asc(Mid$(S$,X,1)) Next End Function Function GetString$(P) Zeichen=PeekByte(Task\Speicher,P) While Zeichen<>0 S$=S$+Chr$(Zeichen) P=P+1 Zeichen=PeekByte(Task\Speicher,P) Wend Return S$ 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 ;#ImmediateInt ;#ImmediateByte ;DirektInt ;RegisterEAX ;RegisterEBX ;@registerindirektEAX ;@registerindirektEBX Function Kompiliere_ASM() For AsmBefehl.AsmBefehlTyp=Each AsmBefehlTyp ;Print BefehlName[AsmBefehl\BefehlNr] ;Print AsmBefehl\Parameter2Typ 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 End If Next ElseIf AsmBefehl\Parameter1Typ=VarInt Then For Varrialbel = Each VarrialbelTyp If Upper$(AsmBefehl\Parameter1$)=Upper$(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 End If Next ElseIf AsmBefehl\Parameter2Typ=VarInt Then For Varrialbel = Each VarrialbelTyp If Upper$(AsmBefehl\Parameter2$)=Upper$(Varrialbel\Name$) Then PokeByte Task\Speicher,AsmBefehl\Position+1,Varrialbel\Adresse End If Next End If Next End Function Function AsmZeile(Zeile$) Zeile$=Trim$(Zeile$) Befehl$=Trim$(Upper$(Mid$(Zeile$,1,Instr(Zeile$+" "," ")-1))) Local ParameterS$[8] 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=8 Then Return ;Error 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$) Start=Instr(Zeile$+" "," ") If Start=0 Then Return End If For POS=Start To Zeilelang Select Mid$(Zeile$,Pos,1) Case " " If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 ZahlenStrByte$="" Else If Len(ZahlenStrByte$)>0 Then ByteZahl=Int(ZahlenStrByte$) If ByteZahl>255 Then Return ;ERROR 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 ZahlenStrByte$="" Else If Len(ZahlenStrByte$)>0 Then ByteZahl=Int(ZahlenStrByte$) If ByteZahl>255 Then Return ;ERROR 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,ZahlenStrByte$ 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,1) End If Case ";" If ZeichenAn=False Then ;ERROR Return End If PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 ZahlenStrByte$="" Default If ZeichenAn=True Then PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos)) Assembler\Position=Assembler\Position+1 ZahlenStrByte$="" Else Return ;ERROR End If End Select Next If ZahlenStrByte$<>"" Then PokeByte Task\Speicher,Assembler\Position,Int(ZahlenStrByte$) Assembler\Position=Assembler\Position+1 ZahlenStrByte$="" End If 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(Upper$(Parameter1$))=False Then Return ;ERROR End If For Varrialbel=Each VarrialbelTyp If Upper$(Varrialbel\Name$)=Upper$(Parameter1$) Then Return ;ERROR 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 ;ERROR End If Varrialbel=New VarrialbelTyp Varrialbel\Name$=Upper$(Parameter1$) Varrialbel\Adresse=Assembler\Position Varrialbel\Wert=Int(Parameter3$) PokeInt Task\Speicher,Assembler\Position,Varrialbel\Wert Assembler\Position=Assembler\Position+4 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$,Upper$(Parameter1$),Upper$(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 ElseIf VarrialbelTest(Upper$(Parameter1$))=True Then Parameter1Typ=VarInt ElseIf Parameter1$=";" Then Parameter1$="" 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 ElseIf VarrialbelTest(Upper$(Parameter2$))=True Then Parameter2Typ=VarInt ElseIf Parameter2$=";" Then Parameter2$="" End If 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 If Slen=0 Then Return False End If Return True End Function Function Exist_Datei(Datei$) If FileType(datei)=1 Then Return True Else Return False End If End Function |
||
- Zuletzt bearbeitet von Florian am Mi, Jan 18, 2006 23:21, insgesamt einmal bearbeitet
SCRJ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hey, Danke! ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Ava, wir reden hier von BB nciht von Bmax, das macht bei sowas einen Deutlichen unterschied. | ||
between angels and insects |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
SCRJ hat Folgendes geschrieben: du meinst mit Blitz?
wer sagt denn, dass ich die scriptengine mit blitz mache? *ggg* ich werde sie wohl in einer anderen sprache schreiben, und in blitz nutzen. ![]() Was weis denn ich, ich wollt nur helfen ... ![]() |
||
SCRJ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
>>Was weis denn ich, ich wollt nur helfen ...
hast du auch ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group