home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / apps / telecomm / hsmoda06 / hsm_doku / midi_x.txt < prev    next >
Text File  |  1995-01-22  |  11KB  |  239 lines

  1. MIDI.PRG
  2. ********
  3.  
  4. (The English part is appended at the German, look for it.)
  5.  
  6. Dies ist ein Treiber zur Nutzung der MIDI-Schnittstelle über die in 
  7. SERSOFST.TXT definierten Filefunktionen.
  8.  
  9.  
  10. Allgemeines
  11. -----------
  12. ########## momentan ist das noch eine Experimentalversion ###########
  13. Dieser Treiber gehört zum HSMODA-Paket. Er ist nicht für Musiksoftware 
  14. gedacht, die die MIDI-Schnittstelle zu ihrem ursprünglichen Zweck benutzt, 
  15. sondern zur "ganz normalen" Datenübertragung. Wer die MIDI-Schnittstelle 
  16. nicht zur "ganz normalen" Datenübertragung nutzt, braucht diesen Treiber 
  17. nicht.
  18.  
  19.  
  20. Kommunikationsparameter
  21. -----------------------
  22. Es wird alles unterstützt, was das ACIA und die RxD/TxD-Schnittstelle 
  23. können.
  24. Baudraten: 31250, 7812
  25. Handshake: "keiner", "XON/XOFF"
  26. Zeichenformate: 7e2, 7o2, 7e1, 7o1, 8n2, 8n1, 8e1, 8o1
  27.  
  28.  
  29. Konfiguration
  30. -------------
  31. Die Konfiguration erfolgt mit dem SETTER.TTP. Zur Bedienung siehe 
  32. SETTER.TXT.
  33.  
  34. Momentan kann man nur die Empfangs- und Sendepuffergröße einstellen, die 
  35. standardmäßig 256 Byte geträgt.
  36.  
  37.  
  38.  
  39. (Interna:) Implementierungsvarianten
  40. ------------------------------------
  41. Das Senden erfolgt auch interruptgesteuert. Falls man im Sendeinterrupt 
  42. nochmal extra Statusregister Bit1 abfragt (braucht man auch nicht, denn 
  43. wenn im Polling gesendet wird, dann ist der Sendepuffer per Definition 
  44. leer (sonst gibt es sowieso Chaos), und es kann deshalb ohnehin nichts in 
  45. den ACIA geschrieben werden), braucht man Midiws und Bconout-MIDI nicht 
  46. abzufangen, da diese direkt im Polling senden und die Strukturen dieses 
  47. Treibers nicht stören. Sie könnten sich zwar in eine Interruptsendung 
  48. einmischen, das sollte aber nicht passieren, da entweder alte Programme 
  49. diese nicht-Interrupt-Aufrufe benutzen (wo das Polling-Midiws 
  50. möglicherweise zwecks Kompatibilität nötig ist) oder neue Programme über 
  51. GEMDOS oder die höhere BIOS-Nummer arbeiten. Da nämlich MIDI im BIOS nicht 
  52. immer #3 ist, muß man ohnehin im RSVF die Nummer eines extra eingehängten 
  53. Treibers eintragen und nur zu Kompatibilitätszwecken das alte #3 
  54. unterstützen.
  55.  
  56. Es ist zu entscheiden, wie weit man die Optimierung (tausche Speicherplatz 
  57. und Übersichtlichkeit gegen Geschwindigkeit) treibt. 31250Bd bedeutet beim 
  58. Empfang eine Interruptfrequenz von 3125Hz bei 8N1 und eine zu 
  59. unterschreitende Interruptantwortzeit von 320us. Der 68000/8MHz braucht 
  60. 0.5us für einen WORD-Speicherzugriff. Beim im TOS vorhandenen Sichern von 
  61. 8 Registern (als LONG) vergehen also schon 8us, zusätzlich zu der reinen 
  62. Reaktionszeit der CPU. Nach der Bearbeitung werden nochmal 8us im 
  63. Interrupt zur Wiederherstellung verbraucht. Der IKBD-ACIA ist mit 7812.5Bd 
  64. vergleichsweise langsam.
  65.  
  66. Direkt im MFP-Interrupt, sehr schnell, alle MIDI-Vektoren in KBDVECS sind 
  67. tot. ### Genau so mache ich es erstmal ### !!! Dürfte evtl mit einiger 
  68. Musiksoft inkompatibel sein, egal.
  69.  
  70. ### momentan BIOS-Funktionen nur über eigene Nummer, alte BIOS und 
  71. XBIOS-IOREC-MIDI noch nicht ersetzt (aufruf kann zu Absturz, Hängenbleiben 
  72. oder so führen), Nummer siehe RSVF-Objekt ####
  73.  
  74. Schmeißt bei Installation alles andere aus dem MFP-I4-Interrupt raus, wie 
  75. z.B. Templmon. (Also Templmon erst nach diesem Treiber starten)
  76.  
  77.  
  78.  
  79. Andere Varianten, evtl mal alternativ realisieren:
  80.  
  81. Nur als midisys(), etwas langsamer, nur midivec() und vmiderr() tot.
  82.  
  83. Als midisys(), langsamst, midivec() und vmiderr() werden benutzt, 
  84. restliche Interruptbedingungen bearbeitet midisys() selbst.
  85.  
  86.  
  87.  
  88.  
  89. (Für Programmierer:) Die MIDI-Schnittstelle auf der Softwareseite
  90. =================================================================
  91.  
  92. Im TOS werden MIDI-Daten immer direkt gesendet. Es gibt keinen 
  93. Sende-IOREC. Nur Empfangsdaten werden im Interrupt behandelt, ein 
  94. Empfangs-IOREC existiert (XBIOS 14 Iorec (Gerät 2)). XBIOS 15 Rsconf 
  95. existiert nicht. Zusätzlich gibt es XBIOS 12 Midiws zum Versenden von 
  96. Bytefolgen. Diese Funktion arbeitet im Polling. Im BIOS ist MIDI 
  97. normalerweise Gerät 3, außer bei BIOS 8 Bcostat, dort ist es 4.
  98.  
  99. XBIOS 34 Kbdvbase liefert einen Datenblock, der Zeiger auf einige Routinen 
  100. enthält, die mit MIDI und dem IKBD zusammenhängen. Leider werden diese 
  101. Routinen oft falsch beschrieben, auch im Profibuch sind Fehler drin.
  102.  
  103. MIDI-ACIA und IKBD-ACIA liefern ihre Interruptmeldung aktiv-oder-verknüpft 
  104. (ihre L-aktiven Open Collector Ausgänge sind miteinander verbunden) über 
  105. den gleichen Eingang (I4) des MFP (ST-MFP), der auf den 
  106. MFP-Interruptvektor auf Adresse $0118 führt.
  107.  
  108. Hier lauert bereits die erste Falle: Der MFP erzeugt einen Interrupt nur 
  109. bei einer H/L-Flanke am I4-Eingang. Diese Flanke tritt nur beim Wechsel 
  110. von "beide ACIA wollen keinen Interrupt" zu "mindestens ein ACIA fordert 
  111. Interrupt" auf. Setzt man jetzt die Interruptforderung nur im MFP zurück 
  112. und bearbeitet nicht beide ACIA so lange, bis I4 wieder H wird, so bleibt 
  113. I4 auf L und der MFP wird keine ACIA-Interrupts mehr melden. Dieser Fall 
  114. kann z.B. eintreten, wenn in einer sehr frühen Phase der 
  115. Systeminitialisierung Daten über den MIDI-Port reinkommen.
  116.  
  117.  
  118. Kbdvbase (XBIOS 34)
  119. -------------------
  120. Diese Funktion liefert einen Zeiger auf einen Datenblock mit Zeigern auf 
  121. verschiedene Routinen im Zusammenhang mit MIDI und IKBD.
  122.  
  123. typedef struct {
  124.  void (*midivec)();  /* Midi-Eingabe */
  125.  void (*vkbderr)();  /* Tastaturfehler (default: nur RTS) */
  126.  void (*vmiderr)();  /* MIDIfehler (default: nur RTS) */
  127.  void (*statvec)();  /* Status des IKBD gelesen (default: nur RTS) */
  128.  void (*mousevec)(); /* Mausabfrage */
  129.  void (*clockvec)(); /* Uhrzeitabfrage */
  130.  void (*joyvec)();   /* Joystickabfrage (default: nur RTS) */
  131.  void (*midisys)();  /* MIDI-Systemvektor */
  132.  void (*ikbdsys)();  /* IKBD-Systemvektor */
  133.  WORD drvstat;       /* IKBD-Treiberstatus (benutzt als zwei Bytes) */
  134. } KBDVECS;
  135.  
  136. Erzeugt I4 des MFP einen Interrupt, so werden in der Serviceroutine 
  137. nacheinander midisys() und ikbdsys() aufgerufen. Falls I4 jetzt immer noch 
  138. L (also aktiv) ist, wird der Aufruf dieser beiden Routinen solange 
  139. wiederholt, bis I4 nach der Bearbeitung von ikbdsys() endlich H ist. Dann 
  140. wird der Interrupt im MFP als bearbeitet markiert und die Serviceroutine 
  141. beendet. Die XXXXsys() müssen selbst anhand des Statusregisters ihrer ACIA 
  142. feststellen, ob sie arbeiten oder gleich zurückkehren. Vor dem Aufruf der 
  143. Routinen wurden die Register A0-A3/D0-D3 gesichert, so daß man sie 
  144. benutzen kann. Sicherheitshalber sollte man aber nur A0-A2/D0-D2 nutzen, 
  145. wie es die Konventionen der meisten C-Compiler auf dem Atari erlauben. 
  146. Diese ganzen Aktionen laufen bei einem Interrupt Priority Level von 6 ab, 
  147. so daß keine weiteren Interrupts dazwischen kommen können. Wenn man den 
  148. IPL heruntersetzt (zeitweilig in der XXXXsys-Routine), so können vom MFP aus 
  149. wenigstens höherpriorisierte Interrupts wie der für MODEM1 
  150. dazwischenkommen.
  151.  
  152. vmiderr() und vkbderr() werden von midisys() bzw. ikbdsys() aufgerufen, 
  153. wenn ein Empfangspufferüberlauf vorlag. Das empfangene Zeichen wird 
  154. trotzdem in D0.b übergeben. Die Fehlerbedingung wurde im ACIA bereits 
  155. zurückgesetzt. Andere Fehlerbedingungen werden ignoriert und führen nicht 
  156. zum Aufruf der vXXXerr(). Falls man eigene XXXXsys()-Routinen einsetzt, 
  157. werden die vXXXerr() also nur noch aufgerufen, wenn es die eigene 
  158. XXXXsys()-Routine tut. Die vXXXerr() dürfen A0-A2/D0-D2 benutzen und 
  159. bestehen im TOS nur aus einem RTS.
  160.  
  161. midivec() wird von midisys() aufgerufen, wenn ein Zeichen von der 
  162. MIDI_ACIA fehlerfrei empfangen wurde. Das Zeichen wird in D0.b übergeben. 
  163. Die Routine darf A0-A2/D0-D2 benutzen und schreibt im TOS das Zeichen in 
  164. den MIDI-Empfangspuffer.
  165.  
  166. Alle anderen Routinen werden von ikbdsys() aufgerufen, nachdem ikbdsys 
  167. alle Byte empfangen hat, die zu dem entsprechenden Paket gehören. Diese 
  168. Byte wurden in einem Puffer gesammelt und der Routine wird ein Zeiger auf 
  169. diesen Puffer im Register A0 und auf dem Stack übergeben. Die Routinen 
  170. dürfen A0-A2/D0-D2 benutzen. Sie sollten so kurz wie möglich sein, denn 
  171. eine Laufzeit von 1ms (wie im Profibuch angegeben) begrenzt die über 
  172. MODEM1 fehlerfrei empfangbare Datenrate bereits auf nur 9600Bd (die Daten 
  173. von MIDI mit 31250Bd gehen schon viel früher hops). Eine Alternative sind 
  174. reentrante Routinen (also den Pufferinhalt erst kopieren), die den IPL 
  175. während ihrer Laufzeit auf weniger als 6 setzen und so wenigstens den 
  176. MODEM1-Empfang (der im MFP höher priorisiert ist) erlauben.
  177.  
  178. Wenn man diese 4 anderen Routinen betrachtet, so fehlt eine Routine, die 
  179. die normalen Tastendrücke (Byte $00-$F5) verarbeitet. Der Zeiger auf diese 
  180. Routine liegt erfahrungsgemäß (das ist nicht dokumentiert) genau vor der 
  181. KBDVECS-Struktur. Dieser Routine wird das Zeichen in D0.b übergeben und 
  182. sie darf A0-A2/D0-D2 benutzen. Sie verarbeitet die Zeichen und schreibt 
  183. entsprechende Daten in den Empfangspuffer, der dann z.B. vom 
  184. Bconin-Tastatur gelesen wird. Beim TOS2.06 ist jeder Empfangspuffereintrag 
  185. ein LONG.
  186.  
  187. mousevec() kann nicht nur vom ikbdsys(), sondern auch von der 
  188. undokumentierten Tastenroutine und von der Tastaturrepeat-Routine 
  189. aufgerufen werden, wenn die Tastatur zur Mausemulation benutzt wird.
  190.  
  191. drvstat ist immer dann ungleich 0, wenn ibkdsys() gerade ein Paket 
  192. zusammensammelt. Undokumentiert wird beim TOS2.06 das Highbyte zum 
  193. Speichern der internen Routinennummer (abgeleitet aus dem empfangenen 
  194. Header) und das Lowbyte als Abwärtszähler für die Anzahl der noch zu 
  195. empfangenden Byte benutzt.
  196.  
  197. Wenn man einer der 4 Routinen selbstgebastelte Pakete zukommen lassen 
  198. will, so muß man sicherstellen, daß diese (im TOS) nicht reentranten 
  199. Routinen nicht zufälligerweise auch aus dem Interrupt heraus aufgerufen 
  200. werden. Also entweder IPL auf 6 oder 7 setzen, oder in KBDVECS kurzzeitig 
  201. eine Dummy-Routine (die sich möglicherweise nur das Paket irgendwo merkt) 
  202. anstelle der Originalroutine installieren, die man gerade selbst aufruft.
  203.  
  204.  
  205.  
  206. Versionen
  207. ---------
  208. (Datum in der Form Jahr-Monat-Tag)
  209. 1994-08-27  sollte erstmalig richtig funktionieren
  210. 1994-10-24  TIOCM_RER (overrun, frame, parity) mit TIOCCTLGET erfragbar
  211. 1994-12-30  schnelle Bconout-Parameterübergabe geändert 
  212. (und MAPT_APP/MAPT_OVE Funktiosnummer)
  213. 1995-01-15  läuft jetzt mit TOS-Versionen vor 2.00
  214.  
  215. Harun Scheutzow, Berlin den 27.08.1994 und später
  216.  
  217.  
  218.  
  219. MIDI.PRG
  220. ********
  221.  
  222. This is a SERSOFST.TXT-conform driver for the MIDI-interface. You 
  223. shouldn't use it together with music programs using the MIDI-interface 
  224. because it is intended for file transfer and terminal purposes.
  225.  
  226. I don't have the time to translate the whole text. If nobody else does it, 
  227. sorry, English-speaking world, you will never got an English version.
  228.  
  229. This driver installs with the GEMDOS-name "MIDI" and the first empty BIOS 
  230. device number. It is fully interrupt driven. It allows the two baud rates 
  231. possible on the MIDI-port(31250, 7812). It supports "none" and "XON/XOFF" 
  232. handshake. Zmodem usually escapes the XON and XOFF characters that's why 
  233. you can use this handshake with Zmodem. I got transfer rates of 
  234. approximately 3000cps, that means near the physical limit.
  235.  
  236. !!! Important: This is only a RSVF-driver, it doesn't replace the old 
  237. BIOS-MIDI-numbers nor the XBIOS-Midiws-function. Use it only if you need a 
  238. MIDI-RSVF-driver. !!!
  239.