home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 4
/
FreshFish_May-June1994.bin
/
bbs
/
may94
/
mus
/
play
/
delitracker.lha
/
DeliTracker
/
Files
/
developer.lha
/
Developer
/
Developer.dok
< prev
next >
Wrap
Text File
|
1994-04-17
|
36KB
|
829 lines
$VER: Developer.dok V2.00 (13.04.1994)
Copyright 1994 by Delirium Softdesign
(Peter Kunath and Frank Riffel)
DeliTracker Development Documentation
1.ÜBERBLICK
2.PLAYER
2.1 Normale Player
2.2 Custom Module
2.3 Interrupts
3.GENIES
3.1 Generic Kind
3.2 Converter
3.3 Decruncher
3.4 NotePlayer
4.TAGS
5.DELITRACKER SUPPORT FUNKTIONEN
1.ÜBERBLICK
DeliTracker kann mit externen Programmodulen erweitert werden. Diese
sehen vom DOS aus betrachtet genauso aus wie normale Objectfiles, mit
dem Unterschied allerdings, daß sie am Anfang des ersten Hunks eine
spezielle Struktur besitzen. Wenn DeliTracker ein solches Programmodul
nachlädt, wertet er diese Struktur aus. Sie besteht aus drei Teilen:
Einem Longword mit Code, zwei Longwords als Identifier und als letztes
einem Pointer auf ein Tagarray. Das erste Longword enthält normalerweise
moveq #-1,d0 gefolgt von einem rts Befehl. Dies soll einen Absturz
verhindern, wenn ein Player oder Genie irrtümlich vom Benutzer gestartet
wird. Um ein Programm zu erzeugen, das auch ohne DeliTracker lauffähig
ist, muß in das erste Longword in einen bra.w geändert werden, der dann
den eigentlichen Startupcode anspringt. Um die charakteristische Struktur
zu erzeugen sollte das PLAYERHEADER Macro aus 'deliplayer.i' verwendet
werden. Es hat zwei Parameter: einen Pointer auf ein Tagarray und
optional einen Pointer auf den Startupcode.
PLAYERHEADER <tagarray>,[startup]
tagarray Pointer auf ein Tag Array, das mit TAG_DONE
abgeschlossen sein muß.
startup Pointer auf einen optionalen Startupcode. Nur
notwendig, wenn das Programmodul auch ohne
DeliTracker lauffähig sein soll.
Bemerkung: Wenn der Startupcode angesprungen
wird, muß die gesamte Initialisierung etc. ohne
DeliTracker durchgeführt werden. In den meisten
Fällen macht die Startup Option wenig Sinn und
wird deshalb auch kaum benutzt.
Die Tagliste enthält dabei alle Informationen, die DeliTracker wissen
muß. Wir verwenden ein Tagarray deshalb, weil es sehr flexibel und leicht
erweiterbar ist. Zusätzlich können die externen Programmodule noch die
GlobalStructure sowie die eingebauten Supportfunktionen benutzen. Im
Moment unterscheidet DeliTracker zwei verschiedene Typen von externen
Programmodulen:
1) Player, um Module zu identifizieren und zu spielen
2) Genies können viele andere Dinge machen. Unter anderem Module
konvertieren, Dateien entpacken oder Informationen anzeigen.
Beide Arten können synchron oder asynchron laufen. Unter synchron
versteht man, daß der Player oder das Genie nicht als eigener Prozess
läuft. DeliTracker benutzt in diesem Fall echte Funktionsaufrufe (jsr)
zur Kommunikation. Im asynchronen Modus startet DeliTracker den Player
oder das Genie als eigenen Prozess und verwendet dann Messages um
Funktionen der externen Programmodule aufzurufen. Im allgemeinen laufen
Genies asynchron und Player synchron. Wenn ein Player oder ein Genie
asynchron läuft, dann muss man es durch Senden eines CTRL-C Signals an
den Prozeß beenden können. Offensichtlich sind DeliPlayer und DeliGenies
also sehr ähnlich. Sie werden von DeliTracker auch ziemlich gleich
verwaltet, wenn auch in zwei verschiedenen Listen. Jedes externe
Programmodul bei dem ein DTP_CustomPlayer, DTP_Check1 oder DTP_Check2
Tag benutzt wird, ist ein Player. Der Rest sind Genies.
Wenn eine GUI vorhanden ist, sollten normalerweise folgende Menüpunkte
zur Verfügung stehen:
Project
About A ? Kurzinformation über das Programmodul
==============
Save Prefs A S Speichern der aktuellen Einstellungen
==============
Hide A H GUI verbergen
==============
Quit A Q Genie beenden (ebenso wie CTRL-C)
Settings
Activate A A Aktiviert das Fenster beim Öffnen des GUI
Popup A P Öffnet das GUI nach dem Laden
==============
Other settings Hier können je nach Bedarf weitere
·············· Einstellungen folgen.
Ein paar Anmerkungen:
Bevor man einen DeliPlayer schreibt, sollte man sich die migelieferten
Beispielsourcen genau durchlesen. Um einen besseren Überblick davon zu
bekommen, wann und in welcher Reihenfolge DeliTracker die Funktionen des
Players aufruft, kann man den 'Testplayer.s' Source benutzen. Wenn eine
Konfigurationsdatei abgespeichert werden kann, sollte sie nicht nach
ENV:, sondern in das DeliTracker Konfiguartionsverzeichnis abgespeichert
werden. Der Pfad des Konfiguartionsverzeichnisses kann steht in der ENV-
Vaiable 'DeliConfig'. Falls diese nicht vorhanden ist, sollte stattdessen
'PROGDIR:DeliConfig' zum Abspeichern benutzt werden. Ein Player sollte
außerdem den Zustand der LED (Lowpass-Filter) unbeeinflußt lassen, da im
Optionfenster eine entsprechende Funktion existiert. Wenn von DeliTracker
eine Funktion des Players aufgerufen wird (außer bei den Interrupt-
Funktionen DTP_Interrupt und DTP_NoteSignal), enthält das Register a5
einen Pointer auf die Globale Struktur (Base). Da DeliTracker vor Aufruf
einer Routine (außer bei DTP_Interrupt und DTP_NoteSignal) alle Register
sichert, dürfen diese verändert werden.
2.PLAYERS
Es ist relativ einfach, eine Replayroutine an DeliTracker anzupassen.
Alles was Sie tun müssen ist ein wenig Interfacecode zu schreiben. Dies
ist im allgemeinen recht einfach, denn DeliTracker stellt ihnen viele
hilfreiche Routinen zur Verfügung. Um ein neues Soundsystem anzupassen,
benötigen Sie zum einen den Quellcode oder ein linkbares Objektfile der
Replayroutine, zum anderen sollten mindestens ca. 5 Module zum Testen der
Funktionstüchtigkeit des Players vorhanden sein. Ganz am Anfang eines
Players muß sie charakteristische Struktur stehen. DeliTracker unter-
scheidet dann zwei Arten von Playern: normale Player und Custom Module.
2.1 Normale Player
Normale Player identifizieren und spielen Module. Sie müssen immer eine
Check Routine besitzen. Der schematische Aufbau eines normalen Players
ist folgendermassen:
{ Playerheader } Kennzeichnet das Object als Player.
{ TagArray } Beschreibung, was der Player kann.
{ Interfacecode } Playername/Registerumsetzung/Checkcode u.ä.
{ Replaycode } Eigentlicher Musikabspielcode.
{ evtl. Daten } und Daten
Damit der Player die einzelnen Module unterscheiden kann, befindet sich
in jedem Player eine Erkennungsroutine, die auf ein zugehöriges Modul
testet und DeliTracker mitteilt, ob der Player dieses Modul spielen
kann oder nicht. Diese Routine prüft auf Stellen im Modul, die bei allen
Modulen eines Formats gleich sind. So z.B. auf 'M.K.' bei Offset $438
in ProTracker-Modulen. Nur auf einige wenige Sprungbefehle zu Prüfen
reicht im allgemeinen nicht aus, da viele Modulformate mit eingebauter
Abspielroutine Sprungbefehle am Anfang haben und der Player möglicher-
weise das falsche Modul erkennen könnte, was in den meisten Fällen zum
Absturz führt! Deshalb sollte die Check Routine auch eingehend getestet
werden. Es gibt zwei Typen von Check Funktionen, genau eine davon muß
der Player verwenden.
a) DTP_Check1: Diese Check Funktion wird aufgerufen, wenn DeliTracker
1K des Files geladen hat. Der Vorteil ist daß sich auch Player
realisieren lassen, die das Modul selbst nachladen. Der Nachteil ist,
daß der Player dann nicht von den Entpackroutinen in DeliTracker
profitiert. Meistens ist es deshalb schwerer, einen solchen Player zu
schreiben. Man sollte diesen Typ nur für Härtefälle verwenden, z.B.
wenn das Modul vom Player selbst geladen werden muß.