Undokumentierte Features von PB
Verfasst: 09.02.2005 19:59
Hi
Mal ne kleine Liste, die sicher noch ergänzt werden kann:
greetz
remi
Achtung: Einige Features sind nicht ohne Grund undokumentiert und können ev. auch wieder in zukünftigen Versionen von PB verschwinden!
Die ersten 2 Features stufe ich aber als "sicher" ein.
Mal ne kleine Liste, die sicher noch ergänzt werden kann:
Inline Asm mit ! am Anfang:
Einige sehen es als selbstverständlich an (ich auch), aber gehört auch dazu!
Wenn man nicht die Inline Assembler Option für den Compiler wählen will, dann kann man auch direkt Assembler in den Code eingeben. Dieser Assembler Code wird dann direkt, ohne von PB angefasst zu werden, in den AsmOutput eingesetzt. Man muss nur ein ! vor jeder Asm Zeile schreiben und noch einiges beachten:
###Variablen können nicht einfach so eingegeben werden wie beim Inline Asm von PB###
Bsp.:
;--------------------------
a.l
!MOV eax, [v_a]
*p
!MOV eax, [p_p]
!JMP l_label
label:
Procedure t()
k.l
k = 4
!MOV eax, [esp]
!MOV [v_a], eax
ProcedureReturn
EndProcedure
Debug t()
Debug a
;--------------------
Ausserdem sollten Push und Pop nur wohlbedacht in Prozeduren verwendet werden! Alle lokalen Variablen in der Prozedur sind auf dem Stack. Alle anderen Variablen sind global.
Array() = *pointer
Ein viel anwendbarer Trick um einen Speicherbereich als Array zu benutzen.
Man muss das Array zuerst deklarieren (mit einem Dim Array.typ(0)) und kann ihm dann einen Speicherbereich per Pointer zuweisen (mit Array() = Adresse).
Bsp. (Variables Array in Structure):
;--------------------------------
Structure Test
*Array
anzahlElemente.l
EndStructure
k.Test
k\anzahlElemente = 5
k\array = AllocateMemory(k\anzahlElemente * 4)
Dim Array2.l(0) ;Array für zugriff deklarieren
Array2() = k\array ;Array2 pointer auf structure array umbiegen
Array2(1) = 3 ;ganz normal wie ein array benutzen
Array2(2) = 54 ;er wird einfach in die structure geschrieben
SortArray(Array2(), 1,0,5) ;optionale parameter müssen angegeben werden, da PB hier die Grösse nicht weiss
Debug "----"
For z = 0 To k\anzahlElemente-1
Debug PeekL(k\array + z * 4)
Next
;--------------------------------
oder String auf Array aufsplitten:
;--------------------------------
String.s = "hallo"
Dim Array.b(0)
Array() = @String
For z = 0 To Len(String) - 1
Debug Chr(Array(z))
Next
;--------------------------------
Das Ganze funktioniert einfach so, dass PB bei Array() = addr einfach die Startadresse des Arrays auf die angegebene Adresse ändert, so kann man den Speicherbereich nun einfach als Array benutzen.
ACHTUNG: PB weiss jetzt die grösse des Arrays nicht mehr, deshalb kann der Debugger nicht vor Übertretung der Arraygrösse schützen. Die Anz. Elemente wäre bei der Adresse @Array()-8 gespeichert (ev. kann man sie dort angeben und der Debugger kann wieder Fehler abfangen, nicht getestet).
EventLParam()/EventWParam()
Ein Verweis auf http://www.purearea.net/pb/download/tut ... ndling.htm sollte genügen![]()
Bitte um Mithilfe noch mehr zu finden und die gefundenen noch zu dokumentieren!OpenComPort(): leider k.A. ob oder wie es funktioniert
KeyboardMode(): leider auch k.A.
greetz
remi
Achtung: Einige Features sind nicht ohne Grund undokumentiert und können ev. auch wieder in zukünftigen Versionen von PB verschwinden!
Die ersten 2 Features stufe ich aber als "sicher" ein.