Script-Wie gehe ich vor [Der 2. versuch in Deutsch]

Übersicht BlitzBasic Allgemein

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

Geeecko

Betreff: Script-Wie gehe ich vor [Der 2. versuch in Deutsch]

BeitragMo, März 20, 2006 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich möchte mir eine Script-Engine programmieren.
Doch ich stehe vor einem Problem, wie gehe ich nun vor?
WAS sollte alles drinn sein
WO sollte es stehen
WIE würdet ihr das programmieren

mfg gaia

(sind ncoh Rechtschreibfeheler da?) Wink


EDIT:
(sind noch Rechtschreibfeheler da?) Wink
 

Florian

BeitragMo, März 20, 2006 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Script-Engine

Was sollte alles drinn sein


Möglichkeit 1:

- ein P-Code Compiler
- ein P-Code Interpreter
- eine Schnittstelle die die Script-Funktionen zuverfügung stellt

Möglichkeit 2:

- ein Interpreter
- eine Schnittstelle die die Script-Funktionen zuverfügung stellt


Hier das ist der Code einer Stackmaschine.

Bestandteile Der Stackmaschine sind.


Code: [AUSKLAPPEN]


VM
Speicher    Codesegment    Datensegment   Stack    Returnstack
Name            CS              DS          SS          RS
Zeiger          IP               -          SP          RP




Befehlsübersicht
Code: [AUSKLAPPEN]

Push 
Pop 
Dbl 
Swap 

Mul 
Div
Sub 
Add   
Neg   
Incr 
Decr 

And   
Not 
Or   
Xor   
 
Call 
Ret   
Jmp   
Jle   

AStor
ALoad
Stor 
Load 

Int   


Edit:
Version 1.0

Code: [AUSKLAPPEN]


Const MaxCode =4096
Const MaxData =4096

Const MaxStack      =1024
Const MaxReturnStack=1024

Const cPush  = 1
Const cPop   = 2
Const cDbl   = 3
Const cSwap  = 4

Const cMul   = 5
Const cDiv   = 6
Const cSub   = 7
Const cAdd   = 8
Const cNeg   = 9
Const cIncr  =10
Const cDecr  =11

Const cAnd   =12
Const cNot   =13
Const cOr    =14
Const cXor   =15
 
Const cCall  =16
Const cRet   =17
Const cJmp   =18
Const cJle   =19

Const cAStor =20
Const cALoad =21
Const cStor  =22
Const cLoad  =23

Const cInt   =24


Global PCodeName$[24]

PCodeName[cPush]  = "Push "
PCodeName[cPop]   = "Pop  "
PCodeName[cDbl]   = "Dbl  "
PCodeName[cSwap]  = "Swap "

PCodeName[cMul]   = "Mul  "
PCodeName[cDiv]   = "Div  "
PCodeName[cSub]   = "Sub  "
PCodeName[cAdd]   = "Add  "
PCodeName[cNeg]   = "Neg  "
PCodeName[cIncr]  = "Incr "
PCodeName[cDecr]  = "Decr "

PCodeName[cAnd]   = "And  "
PCodeName[cNot]   = "Not  "
PCodeName[cOr]    = "Or   "
PCodeName[cXor]   = "Xor  "

PCodeName[cCall]  = "Call "
PCodeName[cRet]   = "Ret  "
PCodeName[cJmp]   = "Jmp  "
PCodeName[cJle]   = "Jle  "

PCodeName[cAStor] = "AStor"
PCodeName[cALoad] = "ALoad"
PCodeName[cStor]  = "Stor "
PCodeName[cLoad]  = "Load "
PCodeName[cInt]   = "Int  "

Type TVM
 Field CS[MaxCode       ]
 Field DS[MaxData       ]
 Field SS[MaxStack      ]
 Field RS[MaxReturnStack]
 Field IP
 Field SP
 Field RP
End Type

Global VM.TVM

VM=New TVM

;Push
;Int
;Incr
;Decr
;Mul
;Add
;div
;sub
;Not
;and
;Or
;Xor



VM\CS[0]=cPush
VM\CS[1]=100

VM\CS[2]=CPush
VM\CS[3]=20


VM\CS[4]=cAStor
VM\CS[5]=1

VM\CS[6]=cincr

VM\CS[7]=CPush
VM\CS[8]=1000


VM\CS[9]=cALoad
VM\CS[10]=1

VM\CS[11]=CInt
VM\CS[12]=1

VM\CS[13]=CInt
VM\CS[14]=2

Run_VM

 
Function Load_VM(Dateiname$)
 FileNr=ReadFile(DateiName$)
 If FileNr=0 Then Return False

 WMaxCode=ReadInt(FileNr)
 WMaxData=ReadInt(FileNr)
 WMaxStack=ReadInt(FileNr)
 WMaxReturnStack=ReadFile(FileNr)
 
 IP=ReadInt(FileNr)
 SP=ReadInt(FileNr)
 RP=ReadInt(FileNr)

 VM=New TVM
 
 For Zeiger=0 To WMaxCode
  VM\CS[Zeiger]=ReadInt(FileNr)
 Next

 For Zeiger=0 To WMaxData
  VM\DS[Zeiger]=ReadInt(FileNr)
 Next

 For Zeiger=0 To WMaxStack
  VM\SS[Zeiger]=ReadInt(FileNr)
 Next 

 For Zeiger=0 To WMaxReturnStack
  VM\RS[Zeiger]=ReadInt(FileNr)
 Next
 
 CloseFile FileNr

 Return True
End Function

Function Save_VM(Dateiname$)
 FileNr=WriteFile(Dateiname$)
 If FileNr=0 Then Return False

 WriteInt FileNr,MaxCode
 WriteInt FileNr,MaxData
 WriteInt FileNr,MaxStack
 WriteInt FileNr,MaxReturnStack

 WriteInt FileNr,VM\IP
 WriteInt FileNr,VM\SP
 WriteInt FileNr,VM\RP

 For Zeiger=0 To MaxCode
  WriteInt FileNr,VM\CS[Zeiger]
 Next
 
 For Zeiger=0 To MaxData
  WriteInt FileNr,VM\DS[Zeiger]
 Next

 For Zeiger=0 To MaxStack
  WriteInt FileNr,VM\SS[Zeiger]
 Next

 For Zeiger=0 To MaxReturnStack
  WriteInt FileNr,VM\RS[Zeiger]
 Next

 CloseFile FileNr

 Return True
End Function

Function Run_VM()
 Repeat
  IP=VM\IP
  Select VM\CS[VM\IP]
   Case cPush
    VM\SS[VM\SP]=VM\CS[VM\IP+1]
    VM\SP=VM\SP+1
    VM\IP=VM\IP+2
 
   Case cPop 
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1

   Case cDbl
    VM\DS[VM\SP]=VM\DS[VM\SP-1]
    VM\SP=VM\SP+1
    VM\IP=VM\IP+1
     
   Case cSwap
    VM\DS[VM\SP-1]=VM\DS[VM\SP-1]+VM\DS[VM\SP-2]
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2]
    VM\DS[VM\SP-1]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2]   
    VM\IP=VM\IP+1
   
   Case cMul 
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1]*VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1
   
   Case cDiv   
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1]/VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1

   Case cSub
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1]-VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1
 
   Case cAdd 
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1]+VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1
 
   Case cNeg 
    VM\DS[VM\SP-1]=-VM\DS[VM\SP-1]
    VM\IP=VM\IP+1

   Case cIncr
    VM\DS[VM\SP-1]=VM\DS[VM\SP-1]+1
    VM\IP=VM\IP+1

   Case cNot   
    VM\DS[VM\SP-1]=Not VM\DS[VM\SP-1]
    VM\IP=VM\IP+1

   Case cDecr
    VM\DS[VM\SP-1]=VM\DS[VM\SP-1]-1
    VM\IP=VM\IP+1

   Case cAnd 
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1] And VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1
 
   Case cOr
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1] Or VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1
 
   Case cXor 
    VM\DS[VM\SP-2]=VM\DS[VM\SP-1] Xor VM\DS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1

   Case cCall 
    VM\RS[VM\RP]=VM\IP+2
    VM\IP=VM\CS[VM\IP+1]
    VM\RP=VM\RP+1

   Case cRet   
    VM\IP=VM\RS[VM\RP]
    VM\RP=VM\RP-1

   Case cJmp   
    VM\IP=VM\CS[VM\IP+1]
 
   Case cJle 
    If VM\DS[VM\SP-1]=<0 Then
     VM\IP=VM\CS[VM\IP+1]
    Else
     VM\IP=VM\IP+2
    EndIf 

   Case cAStor
    VM\SP=VM\SP-1
    VM\DS[VM\CS[VM\IP+1]]=VM\SS[VM\SP]
    VM\IP=VM\IP+2

   Case cALoad
    VM\SS[VM\SP]=VM\DS[VM\CS[VM\IP+1]]
    VM\SP=VM\SP+1
    VM\IP=VM\IP+2   

   Case cStor
    VM\DS[VM\SS[SP-1]]=VM\SS[VM\SP-2]
    VM\SP=VM\SP-1
    VM\IP=VM\IP+1

   Case cLoad
    VM\SS[SP-1]=VM\DS[VM\SS[VM\SP-1]]
    VM\IP=VM\IP+1     

   Case cInt
    Schnittstelle VM\CS[VM\IP+1]
    VM\IP=VM\IP+2
   Default 
  End Select

  Print PCodeName[VM\CS[IP]]+" SP: "+Str(VM\SP)+" Stack: "+VM\SS[VM\SP-1]
  Delay 200

 Forever
End Function 

Function Schnittstelle(Nr)
 Select Nr
  Case 1
   Print Pop()
  Case 2
   WaitKey
   End
 End Select
End Function

Function Push(Wert)
 VM\SS[VM\SP]=Wert
 VM\SP=VM\SP+1
End Function

Function Pop()
 VM\SP=VM\SP-1
 Return VM\SS[VM\SP]
End Function

Function PopString$()
 Wert=Pop()
 While Wert<>0
  S$=Chr$(Wert)+S$
  Wert=Pop()
 Wend

 Return S$
End Function

Function PushString(S$)
 Slen=Len(S$)

 Push 0
 For P=1 To SLEN
  Push Asc(Mid$(S$,P,1))
 Next
End Function





Das große BlitzBasic Community Tutorial
Stackmaschine 2.0

Geeecko

BeitragDi, März 21, 2006 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe mir auch was überlegt Smile

Es gibt z.b. sowas wie eine Funktion im script die On_Collision() heist.
Wenn man dann OnCollision(1) macht:
1=Explodieren
3=Weglaufen
1+3= 4=Explodierent weglaufen (^^)
5=schwimmern
6=Explodierent wegschwimmen
8=geht schlecht Wink (so wie die andere Wink)

Edit:
Habe deins net richtig verstanden ;(
 

Dreamora

BeitragDi, März 21, 2006 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du additive Flags willst (also kombiniertes verhalten), dann musst du für die werte 2er Potenzen nehmen. Sonst geht das nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Geeecko

BeitragDi, März 21, 2006 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also 2laufen 4=rennen 6=hüfen oder wie?
Aber dann komme ich ja mit 2+4 auf 6 (hüpfen)
 

Dreamora

BeitragDi, März 21, 2006 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
2er Potenzen heisst: 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Geeecko

BeitragDi, März 21, 2006 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
... Idea achja... Embarassed

Geeecko

BeitragDi, März 21, 2006 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es irgednwo so ein TUT für script-engine sachen oder so?

BladeRunner

Moderator

BeitragDi, März 21, 2006 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
~GESCHLOSSEN~

er benutze den Editbutton. Ich werde keine weitere Threadpusherei dulden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group