Externe Bibliotheken nutzen

AmigaOs spezifisches Forum.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
cptdark
Beiträge: 56
Registriert: 28.02.2010 14:13
Kontaktdaten:

Externe Bibliotheken nutzen

Beitrag von cptdark »

Hallo,
gibt es bei der Amiga-Version die möglichkeit auf externe Bibliotheken zuzugreifen?
Entweder die im LIBS.-Ordner (und ROM) oder link-Libraries?
Oder irgendeine andere sinnvolle Möglichkeit? (Inline-Assembler?)
Manjaro x64 * Windows 10 x64 * PureBasic 5.50
planet-RK
Benutzeravatar
mk-soft
Beiträge: 3651
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Externe Bibliotheken nutzen

Beitrag von mk-soft »

Frag mal im englischen Forum nach ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
cptdark
Beiträge: 56
Registriert: 28.02.2010 14:13
Kontaktdaten:

Re: Externe Bibliotheken nutzen

Beitrag von cptdark »

mk-soft hat geschrieben: 02.04.2023 14:50 Frag mal im englischen Forum nach ...
Hab ich schon vor ner ganzen Weile. Leider gabs da nur viele views aber keine Antworten. Daher hab ich hier auch gefragt :(
Manjaro x64 * Windows 10 x64 * PureBasic 5.50
planet-RK
Benubi
Beiträge: 185
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Externe Bibliotheken nutzen

Beitrag von Benubi »

Ich denke schon. Du musst doch nur die alten Amiga Threads nachschauen (ich hoffe die gibt es noch alle).

Du kannst libs/dlls erstellen und auch per OpenLibrary/GetProcedure nutzen. Die Befehle sind vermutlich ein wenig anders benannt wegen den Versions-Unterschieden.

Ich glaube ich habe Beispiele gesehen wo die Funktionen von der Intuition-Library einfach mit Unterstrich am Ende genutzt wurden, so wie API Befehle in den anderen OS auch genutzt werden. Aber ich habe nie etwas auf dem Amiga mit PB gemacht, obwohl dies durchaus mal beabsichtigt war (!)

Ich habe jetzt das alte GFA Basic Buch aufgeschlagen, durch Zufall genau auf API/Library-Befehle gestoßen. Möglicherweise gehen die... aber möglicherweise ist das auch alles veraltet, weil damals war Kickstart 2.01 gerade erst erschienen (ich hatte gerade erst 1.2/1.3) und PB benötigt mindestens Kickstart 3.1 so viel ich weiß. Und selbstverständlich sollte PB eine Vollversion sein wegen der DLL/Library Einschränkungen.

Code: Alles auswählen

; Quelle: Das große GFA-BASIC-Buch, 1. Auflage 1990 (Data Becker)
; Feld-, Speicher- und Zeigeroperationen (Auszüge aus den Seiten 320-330)

Adr = OpenLibrary_(Name$, Version) ; Öffnet eine Funktionsbibliokthek und übergibt in 'Adr' die Adresse der zugehörigen Librarystruktur

; void AddLibrary(Adr)
AddLibrary_(Adr) ; Fügt eine neue Library zum System hinzu und macht sie für alle Tasks zugänglich.

; void CloseLibrary(Adr)
CloseLibrary_(Adr) ; Schließt eine Library, deren Adresse sich in 'Adr' befindet

; ???? RemLibrary(Adr)
Rueck = RemLibrary_(Adr) ; Löscht eine Library aus der Library-Liste des Systems

; Adr = MakeLibrary(...) ; Erzeugt eine neue Funktionsbibliothek und übergibt deren Adresse in 'Adr'

; Adr = SetFunction(Library, Funkoffset, Funkadr)
; Fügt in eine Funktionsbibliothek eine neue Funktion ein. In 'adr' wird die Adresse der alten Funktion zurrückgegeben, die an der angegebenen Position in der Bilbiothek stand.

; VOID SumLibrary(Library) ; Berechnet für die angegebene Library eine neue Checksumme
Wie es aussieht könnte man on-the-fly System-weite Libraries schreiben, und "Rootkits" bzw. alles mit einem Hook versehen?! Keine Ahnung ob das funzt aber ich glaube ich weiß jetzt wie SnoopDOS arbeitet. Ziemlich interessant das Ganze!

Jetzt bin ich neugierig ob man das alles nutzen kann^^
xperience2003
Beiträge: 961
Registriert: 04.10.2004 18:42
Computerausstattung: A1200, KS3.1, 128mb Fast, WB3.1
A4k, KS3.1, 256mb Fast, WB 3.9, RTG
und irgend nen lappy mit linux drauf
Wohnort: gotha

Re: Externe Bibliotheken nutzen

Beitrag von xperience2003 »

die systemlibraries sind gebunden, mit unterstrich
Ich habe jetzt das alte GFA Basic Buch aufgeschlagen, durch Zufall genau auf API/Library-Befehle gestoßen. Möglicherweise gehen die... aber möglicherweise ist das auch alles veraltet, weil damals war Kickstart 2.01 gerade erst erschienen (ich hatte gerade erst 1.2/1.3) und PB benötigt mindestens Kickstart 3.1 so viel ich weiß. Und selbstverständlich sollte PB eine Vollversion sein wegen der DLL/Library Einschränkungen.
es gehen alle api befehle, wie in jedem anderem betriebssystem werden die "alten" funktionen beibehalten
die 2.0/2.1 und 3.0/3.1 sind nur zusätzlich

pb ist in der vollversion 4.0 kostenlos zum download, es bedarf leider einen 20er prozessor und etwas mehr speicher

der editor von 4.0 ist allerdings ziemlich uncool, wegen dem albernen zusatzfenster, was mir erklärt was ich grad gemacht hab,
darum benutze ich den editor von 2.9
amiga rulez...und dann noch linux oder so
xperience2003
Beiträge: 961
Registriert: 04.10.2004 18:42
Computerausstattung: A1200, KS3.1, 128mb Fast, WB3.1
A4k, KS3.1, 256mb Fast, WB 3.9, RTG
und irgend nen lappy mit linux drauf
Wohnort: gotha

Re: Externe Bibliotheken nutzen

Beitrag von xperience2003 »

hab mich der sache hier nochmal angenommen:

im grunde hat man 2 möglichkeiten eine extrne lib zu benutzen

erste möglichkeit , die lib-befehle per hand mit assembler aufzurufen
pb-amiga hat keine befehle für die nutzung von libraries

Code: Alles auswählen

openexeclibrary_(0)
*ExecBase = ExecBase()
*SpassBase =0
vari.l=0

DisableDebugger

MOVE.l *ExecBase,a6      ;execbase nach a6
LEA.l  l_spassname,a1    ;name der library a1
MOVE.l #0,d0             ;versionsnummer
JSR    -552(a6)          ;system open lib
MOVE.l d0,*SpassBase     ;handle von d0 in *bla
TST    d0
BEQ    l_gehtnich

;hier ein aufruf einer funktion
;die erste funktion der spass.library
; sRND(d0) 
; ist ein randomizer 
; in d0 die maximale zahl
;das ergebniss wird auch in d0 zurückgegeben

MOVE.l *SpassBase,a6   ;get spassbase
MOVEQ  #30,d0          ;set random max
JSR    -$1e(a6)        ;call sRND()
MOVE.l d0,vari         ;ergebnis in vari

EnableDebugger

PrintNumber(vari)
MouseWait()
End

gehtnich:
Print("konnte lib nicht öffnen")
MouseWait()

;die libs sollten wieder geschlossen werden
; das übernimmt pb natürlich nicht
;was man selbst mit asm rumgehacked hat ;)

End

spassname:
dc.b "spass.library",0
;even

; MainProcessor=1
; Optimizations=0
; CommentedSource=1
; CreateIcon=0
; NoCliOutput=0
; Executable=
; Debugger=0
; EnableASM=1
man kann die ganzen befehle der library natürlich auch in handliche proceduren packen:

Code: Alles auswählen


;library funktion in eine Procedure verpacken

openexeclibrary_(0)
*ExecBase = ExecBase()
Global *SpassBase =0    ;muss Global sein

DisableDebugger

MOVE.l *ExecBase,a6      ;execbase nach a6
LEA.l  l_spassname,a1    ;name der library a1
MOVE.l #0,d0             ;versionsnummer
JSR    -552(a6)          ;system open lib
MOVE.l d0,*SpassBase     ;handle von d0 in *bla
TST    d0
BEQ    l_gehtnich


Procedure sRND(maxwert)
  vari.l=0
  MOVE.l *SpassBase,a6   ;get spassbase
  MOVE.l maxwert,d0      ;set random max
  JSR    -$1e(a6)        ;call sRND()
  MOVE.l d0,vari         ;ergebnis in vari
  ProcedureReturn vari
EndProcedure


EnableDebugger

PrintNumber( sRND(50) )
MouseWait()
End


gehtnich:
Print("konnte lib nicht öffnen")
MouseWait()

End

spassname:
dc.b "spass.library",0

wichtig ist:

debugger aus und inline-assembler support an !

die lib sollte natürlich im system im libs verzeichnis liegen
(oder im programm-ordner..müsste man mal testen)

hier das beispiel mit der lib
http://rebirthsoftware.rf.gd/amiga/spasslib.zip


zweite möglichkeit, man baut daraus eine "wrapper-userlib" damit werden die library befehle zu
pb-eigenen befehlen
amiga rulez...und dann noch linux oder so
xperience2003
Beiträge: 961
Registriert: 04.10.2004 18:42
Computerausstattung: A1200, KS3.1, 128mb Fast, WB3.1
A4k, KS3.1, 256mb Fast, WB 3.9, RTG
und irgend nen lappy mit linux drauf
Wohnort: gotha

Re: Externe Bibliotheken nutzen

Beitrag von xperience2003 »

mir fällt grad ein , dass die api-befehle der dos,exec,intuition und grafiklib
in pb-amiga enhalten sind

damit ergibt sich eine noch einfacherer code

Code: Alles auswählen

Global *sbase
openexeclibrary_(0)
*sbase=oldopenlibrary_("spass.library")

DisableDebugger

Procedure sRND(max.l)
 var.l=0
 MOVE.l max.l,d0
 MOVE.l *sbase,a6
 JSR -$1e(a6)
 MOVE.l d0,var
 ProcedureReturn var.l
EndProcedure

EnableDebugger

;smal test
For i=0 To 9
 PrintNumberN( sRND(50) )
Next

MouseWait()
closelibrary_(*sbase)
End
allerdings kommt man auch hier um das manuelle
wrappen der funktionen nicht herum
amiga rulez...und dann noch linux oder so
Benubi
Beiträge: 185
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Externe Bibliotheken nutzen

Beitrag von Benubi »

Nun ich habe von Assembler keine Ahnung, und mein Umgang mit Amiga Libraries war vor 30 Jahren unter GFA Basic sehr begrenzt. Gut, daß ein wenig API in PB vorhanden ist.

Ist die Spass.library auch in PB gemacht?
xperience2003
Beiträge: 961
Registriert: 04.10.2004 18:42
Computerausstattung: A1200, KS3.1, 128mb Fast, WB3.1
A4k, KS3.1, 256mb Fast, WB 3.9, RTG
und irgend nen lappy mit linux drauf
Wohnort: gotha

Re: Externe Bibliotheken nutzen

Beitrag von xperience2003 »

Ist die Spass.library auch in PB gemacht?
nein, war nurn test mit amiblitz


es gibt ja noch den fd converter
eigentlich sollte der automatisch alle funktionen mappen
und eben als include zur verfügung stellen oder so ähnlich

aber der funktioniert bei mir nicht, oder weiss nicht wohin er das
speichert, ist weder im pb-verzeichniss, noch im ram , noch sonstwo zu finden

man kann auch eine userlib daraus machen, dafür brauchst allerdings auch asm kenntnisse
dann hast du die lib funktionen als pb befehle
amiga rulez...und dann noch linux oder so
Antworten