====== src-Datei ====== Für ein einfaches MP3 sieht ein Skripteintrag folgendermaßen aus: Precode=15313 TYPE=1 [Note] Ein optionaler mehrzeiliger Kommentar [Content] c:\users\m\abc.mp3 Die TingID ist in diesem Fall 15313. Ein richtiger Skrtipteintrag hat die folgende Form: Precode=16134 TYPE=0 [Note] Kran [Content] cmp v71, 1 je falsch cmp v72, 1 je falsch cmp v73, 1 je falsch cmp v70, 1 je richtig jmp aussage :falsch playoid 15306 jmp end :aussage playoid 15298 jmp end :richtig playoid 15299 clearver jmp end :end end Precode entspricht der TingID. Der TYPE ist 0. Unter [Note] steht der Code. Innerhalb des Quellcodes gelten Zeilen die mit ''%%//%%'' beginnen als Kommentar. ====== Binärcode in der ouf-Datei ====== Der Binärcode wird zusätzlich zum Befehl ''end'' immer nochmals mit ''0x00'' angeschlossen. [Register] und [Value] sind jeweils 16 Bit Werte. Für jemanden mit Grundkenntissen in Assembler sollten die nachfolgenden Infos genügen um eigene Skripte zu erstellen. ===== Kommando-Referenz ===== ^ Assembler ^ Beschreibung ^ Binärcode ^ | end | Programmende | 0x0000 | | clearver | Löscht alle Variablen (???) | 0x0100 | | set [Register] [Value] | Setzt ein Register auf einen Wert | 0x0201 | | set [Register] [Register] | Kopiert ein Register in ein anderes | 0x0202 | | cmp [Register] [Value] | Vergleich zw. einem Register und einem Wert | 0x0301 | | cmp [Register] [Register] | Vergleich zw. zwei Registern | 0x0302 | | and [Register] [Value] | Binäres-Und eines Registers mit einem Wert | 0x0401 | | and [Register] [Register] | Binäres-Und eines Registers mit einem anderen Register | 0x0402 | | or [Register] [Value] | Binäres-Oder eines Registers mit einem Wert | 0x0501 | | or [Register] [Register] | Binäres-Oder eines Registers mit einem anderen Register | 0x0502 | | not [Register] 0x0000 | Binäre-Verneinung eines Registers (Der zweite Parameter scheint nicht genutzt zu weden) | 0x0602 | | jmp [Label] | Sprung | 0x0800 | | je [Label] | bedingter Sprung bei Gleichheit | 0x0900 | | jne [Label] | bedingter Sprung bei Ungleichheit | 0x0a00 | | jg [Label] | bedingter Sprung wenn größer | 0x0b00 | | jge [Label] | bedingter Sprung wenn größer oder gleich | 0x0c00 | | jb [Label] | bedingter Sprung wenn kleiner | 0x0d00 | | jbe [Label] | bedingter Sprung wenn kleiner oder gleich | 0x0e00 | | add [Register] [Value] | Addiert einen Wert zu einem Register | 0x0f01 | | add [Register] [Register] | Addiert ein Register zu einem anderen | 0x0f02 | | sub [Register] [Value] | Subtrahiert einen Wert von einem Register | 0x1001 | | sub [Register] [Register] | Subtrahiert ein Register von einem anderen Register | 0x1002 | | playoid [Value] | Spielt eine OID, gegeben als Wert, ab (siehe Abschnitt ''playoid & callid'') | 0x1601 | | playoid [Register] | Spielt eine OID, gegeben als Register, ab (siehe Abschnitt ''playoid & callid'') | 0x1602 | | pause [Value] | Pausiert für x Zehntelsekunden | 0x1701 | | pause [Register] | Pausiert für x Zehntelsekunden | 0x1702 | | call [Value] | siehe: Abschnitt ''call & return''| - | | callid [Value] | siehe: Abschnitt ''playoid & callid'' (kein offiziell unterstützter Befehl)| 0x1501 | | return | siehe: Abschnitt ''call & return''| 0x1400 | ===== Kommando-Referenz (inoffizielle Befehle) ===== ^ Assembler ^ Beschreibung ^ | mul [Register] [Value] | arg1 = arg1 * arg2 | | mul [Register] [Register] | arg1 = arg1 * arg2 | | div [Register] [Value] | arg1 = arg1 / arg2 | | div [Register] [Register] | arg1 = arg1 / arg2 | | mod [Register] [Value] | arg1 = arg1 mod arg2 | | mod [Register] [Register] | arg1 = arg1 mod arg2 | | divmod [Register] [Register] | help = arg1
arg1 = arg1 / arg2
arg2 = help mod arg2 | | min [Register] [Value] | arg1 = min( arg1, arg2) | | min [Register] [Register] | arg1 = min( arg1, arg2) | | max [Register] [Value] | arg1 = max( arg1, arg2) | | max [Register] [Register] | arg1 = max( arg1, arg2) | | exp2 [Register] | arg1 = 2 ^ arg1 | | rnd [Register] [Register] | arg1 = "Zufallszahl zwischen 0 (incl.) und arg2 (incl.)" | | rnd [Register] [Value] | arg1 = "Zufallszahl zwischen 0 (incl.) und arg2 (incl.)" | | volume [Register] | setzt die Stiftlautstärke (1-20) | | volume [Value] | setzt die Stiftlautstärke (1-20) | | lastid [Register] | arg1 = "letzte angewählte Ting-OID" | | lang [Register] | arg1 = "Sprachcode" | | setbit [Register] [Register] | setzt das arg2-te Bit im Register arg1 auf 1 | | setbit [Register] [Value] | setzt das arg2-te Bit im Register arg1 auf 1 | | unsetbit [Register] [Register] | setzt das arg2-te Bit im Register arg1 auf 0 | | unsetbit [Register] [Value] | setzt das arg2-te Bit im Register arg1 auf 0 | | getbit [Register] [Register] [Register] | arg1 = 1 wenn das arg3-te Bit von arg2 auf 1 gesetzt ist, ansonsten 0 | | getbit [Register] [Value] [Register] | arg1 = 1 wenn das arg3-te Bit von arg2 auf 1 gesetzt ist, ansonsten 0 | | getbit [Register] [Register] [Value] | arg1 = 1 wenn das arg3-te Bit von arg2 auf 1 gesetzt ist, ansonsten 0 | | getbit [Register] [Value] [Value] | arg1 = 1 wenn das arg3-te Bit von arg2 auf 1 gesetzt ist, ansonsten 0 | | lock | siehe Abschnitt "lock & unlock" | | unlock | siehe Abschnitt "lock & unlock" | Als inoffizielle Erweiterung ist es möglich im Skript-Code anstatt Dezimalzahlen auch Hexadiezimalzahlen zu verwenden. Hierzu muss ''0x'' als Präfix der Zahl vorangestellt werden. ===== Register ===== Die Register sind jeweils 16 bit unsigned Werte. Es gibt keinen Überlauf, d.h. es gilt: ''0xffff + 1 = 0''. | V0 bis V91 | Speicherregister (read + write) | | V92 | lock & unlock (siehe Abschnitt "lock & unlock") | | V93 | Sprachcode (siehe Dateisystem für eine Liste der Codes) (read) | | V94 | Volume (2-20) (write)| | V95 | Lezter mit dem Stift angewählter Code (read) | | V96 | ? | | V97 | Interrupt | | V98 | ein zufälliger Wert von 0 bis 32767 (0x7FFF) (read) | | V99 | ? | | V100 - ? | ? | ===== playoid & callid ===== Wenn ''playoid'' auf ein MP3 zeigt, wird das MP3 abgespielt und das Skript danach fortgesetzt. Wenn es auf ein weiteres Skript zeigt, wird scheinbar erst einmal das Skript fortgesetzt ohne, dass das zweite Skript aufgerufen wird. Wenn das ursprüngliche Skript abgearbeitet ist, wird das zweite Skript aufgerufen. Diese Art der Verwendung habe ich nirgends bei offiziellen Büchern gefunden, d.h. es könnten unerwünschte Effekte auftreten. ''callid'' habe ich in keinem offiziellen Buch gefunden. Somit ist der Name dieses Befehls auch willkürlich von mir gewählt. Es entspricht aber scheinbar einer Auswahl der Ting-ID mit dem Stift. Wenn man hier eine MID angibt, kann man auch das aktuelle Buch wechseln. ===== call & return ===== In einer Unterroutine wird der Befehl ''return'' als ''0x1400'' kodiert. In der aufrufenden Routine wird der Befehl ''call'' durch den Code der Unterroutine ersetzt! Der Befehl ''return'' wird durch einen ''jmp'' Befehl ersetzt, der auf das Ende der eingebetteten Unterroutine zeigt. Durch dieses untypische Vorgehen ist z.B. keine Rekursion möglich. ===== lock & unlock (das Register V92) ===== Mit dem Register V92 kann der "Ting-Smart (neu)" in einen Modus versetzt werden, der verhindert, dass wenn gerade ein Track abspielt kein neuer angewählt werden kann. Das funktioniert nicht mit dem "Ting-Smart". Hier wird das Register ignoriert. Um den Modus anzuschalten nutzt man ''set V92,1'' (oder ''lock''), um ihn auszuschalten ''set V92,0'' (oder ''unlock''). Der Lock bleibt auch nach dem Befehl ''end'' aktiv. (Vielen Dank an Markus)