PC Protocol of Suunto EON/Solution/Vario

This document describes the transfer protocol and memory layout of these Suunto diving computers:

  • Suunto Eon
  • Suunto Eon Lux
  • Suunto Solution Alpha
  • Suunto Solution Alpha Lux
  • Suunto Solution Nitrox
  • Suunto Vario (same as the Nitrox model)

The [[Suunto Solution]] is an older model with a different communication scheme.

Open Questions / Unknown things

  • Does more than the 3 bytes for the transmission exist? I checked all letters, but there may be others?!?
  • Any way to set the time of the EON? I don’t think so 🙁
  • Does the EON really has a 3 byte counter for the number of dives? Or is it only 2 bytes and the first byte has a special meaning?
  • What meanings have the other bytes in the header (32..255 with the exception of the serial number in 244..246)? I think 32..210 are unused, but the other contains constant (they never changed at my EON) data.
  • How does the PC software find out, where the first dive in the log starts? At the moment I get the $82 position from the header and search for next $80 (end of dive), skip the temperature and pressure byte and – viola – the first (oldest) dive.
  • information about the Nitrox model missing

Communication

The protocol uses 1200 8N2, which means 1200 baud with 8 bits, no parity and 2 stop-bits.

Transfer

You can send the following data to the EON:

  • ‘N’ ($4E) followed by 20 bytes, sets the owner name of the dive computer.
  • ‘T’ ($54) followed by 1 byte ($14, $1E, $3C, which are 20s, 30s and 60s) sets the data rate for the diving profile. Other values may be possible, so the profile values may be recorded with a 1s to a 255s interval – but they should not be used (information from the developer of the EON)
  • ‘P’ ($50) The computer sends $901 bytes (I call it the P-block) back to the computer.

Format of the P-block

The P-block has a $100 byte header and a $800 byte ring-buffer for the profile data plus a one byte checksum. The ring-buffer on a new interface only consists of $FF bytes.

The last byte after the P-block is a checksum: c
unsigned char chk = 0x00;
for(int i=0; i<0x900; ++i)
chk += buf[i];

The default name of the LOG files are: * ‘‘PROFILE.EON’’ for the Suunto Eon * ‘‘PROFILE.SOA’’ for the Suunto Solution Alpha * ‘‘PROFILE.SNV’’ for the Suunto Solution Nitrox/Vario

Header of the P-block

offset |     format     |  testvalue  | content
0–2 MSB binary $00015E number of dives made with the computer (here: 180; from the history). I am not sure, if the upper byte is used (I haven’t made 65536 dives yet 🙂
3–4 MSB binary $0258 divetime under water in minutes (here: 600; from the history)
5–6 MSB binary $3F46 max. depth (here: $3F46 / 128.0 = 126.5 feet; from the history)
7–8 MSB binary $0100 $900 – this value = offset after the last dive (here: $800)
9 MSB binary $3C current profile interval (here: 60s)
10 MSB binary $18 altitude settings (value / 32 = Altitude, here: $18 / 32 = 0, so A0) [bit 0: unknown (always = 0?), bit 1: nitrox, bit 2: unknown (always = 0?), bit 3: metric, bit 4: air (= EON)]
11 MSB binary $60 current year – 1900 (here: 96 => 1996, 00 would be 2000)
12..31 ASCII “EON – Markus Fritze ” 20 bytes string, that is filled with spaces. Not zero terminated! If the owner name is never set, it contains $FF..$FF
32..210 binary $FF unused?
211..243 binary $?? unknown
244..246 BCD $502159 serial number of the computer (here: 502159)
247..255 binary $?? unknown

Ring-Buffer of the P-block

The ring-buffer is a stream of data, which ends at the position, that is marked in the header. At this position the computer starts writing the information from the next dive. If the write pointer reaches the value $900, it jumps back to $100.

Format for one dive

offset format testvalue content
0 MSB binary $05 surface interval (minutes)
1 MSB binary $01 surface interval (hours) (here: 1:05)
2 MSB binary $01 repetitive dive counter (here: the first dive). The counter resets to 1, when the computer turns off after a longer pause. Every dive before that is a repetitive dive and increments the counter.
3 MSB binary $3C profile interval for this dive (here: 60s), this is necessary, because the interval may be changed after every dive and the ring-buffer still contains information about dives with other profile intervals.
4 MSB binary $38 altitude settings (value / 32 = Altitude, here: $18 / 32 = 0, so A0) – bit 0: unknown (always = 0?), bit 3: metric, bit 4: air (= EON)
5 MSB binary $64 A solution alpha always transmits a 0. on nitrox: nitrogen level
6 BCD $97 year (here: 1997). Year 2000 is $00
7 BCD $01 month (here: 1 = January)
8 BCD $31 day (here: 31)
9 BCD $13 hour (here: 13 or 1pm)
10 BCD $35 minute (here: 35)
11 … binary profile data
n MSB binary $80 end of the dive marker
n + 1 MSB binary $3C temperature at the dive in degree celcius – 40 (here: 60 – 40 = 20 degree celcius)
n + 2 MSB binary $19 tank preassure at the end of the dive in bar (here: 25 * 2 = 50bar) – A solution alpha always transmits a 0.

Profile information

The profile data is a stream of bytes. Every minute (or 30s or 20s – see the profile interval) a byte is recorded. This byte is the delta depth in ft to the last depth! E.g. you start your dive at a depth of 0 feet go down to 30ft in a minute, so the value is –30ft (because you go 30ft down) or $E2 in binary, if you then go up to 20ft, the next value will be +10ft (because you go 10ft up) or $0A in binary.

Some values have special meanings:

Byte Type Description
$7d Surfaced you have reached the surface while (or after) the dive
$7e ASC dive now is a decompression dive
$7f ERR decompression missed
$80 End end of the dive.
$81 Slow Slow warning while the dive. If the dive ends with $7d8180 (Surfaced, Slow, End) it means, you finished the dive with a blinking SLOW warning in the display.
$82 End of data set after the last dive (written after the dive as a marker, so technically not profile information)

Necessary conversions

meter = (int)(feet * 0.3048 * 10) / 10
psi = bar * 14.50377377
fahrenheit = celcius * 1.8 + 32

Altitude:

value meters feet
0 700m 2300ft
1 1500m 5000ft
2 2400m 8000ft

ATTN: the computers (checked on the solution alpha) don’t round after the 2. digit, when calculating feet => meter! They cut it after the 2. digit. This results to the modified formula.

Soneva Fushi, September 1997

http://six-senses.com/soneva-fushi/

Unterkunft Soneva Fushi Resort
Zeitraum Ende September 1997
Veranstalter SubAqua, Airtours
Ort Kunfunadhoo, Malediven

Allgemeines

Soneva Fushi ist eine 6-Sterne Insel im “Robinson Stil”. Die Insel ist mit 1.4km Länge und 400m Breite eine der größten Malediveninseln, jedoch mit 62 Bungalows und Villen kaum bebaut. Aus der Luft bzw. vom Wasser aus, kann man fast keine Bebauung erkennen. Die Insel ist naturbelassen worden – es wurden beim Bau z.B. fast keine Bäume bzw. Palmen gefällt – wo nötig wurde nur umgepflanzt. Hinter den Bungalows beginnt ein fast undurchdringlicher Dschungel (anders kann man es nicht umschreiben), der nur von einigen Wegen durchzogen wird (ideal zum Joggen und Spazieren gehen, Fahrräder kann man sich auch leihen).

Der “Robinson Stil” zieht sich durch die gesamte Insel: jeder Bungalow, jeder Trinkbecher, einfach alles harmoniert und paßt zusammen. Beeindruckend! Trotz der 6-Sterne gibt es z.B. keine Kleiderordnung beim Essen: T-Shirt und Shorts sind vollkommen ausreichend um im Restaurant zu essen. Barfuß ist angebracht, da überall Sand liegt. Überhaupt alles wirkt unaufdringlich: der Gast ist König, wird aber nicht behelligt. Wer etwas unternehmen will, kann – möglich ist fast alles, aber es gibt kein festes Programm oder gar Partystimmung am Strand. Wer einen Wunsch hat, dem wird er erfüllt. Das Personal ist immer da, wenn man es braucht. Hat man z.B. abends seine Akku-Taschenlampe (befindet sich auf jedem Zimmer) vergessen, wird es keine 30 Sekunden dauern und ein Angestellter leuchtet einem “nach Hause”. Ach ja, ein kleiner Tip: am letzten Tag sollte man seine gesamte Dreckwäsche in den Koffer stopfen und der Wäscherei geben. Für $25 wird alles gewaschen, gebügelt und der Koffer ordentlich gepackt.

Naturschutz wird auf der Insel ganz groß geschrieben, so wird mit Sonnenenergie Strom erzeugt, das gesamte Wasser wieder aufbereitet u.s.w. Auf der Insel ist fast kein Plastik zu finden (Ausnahme: die Trinkhalme und die 1.5l Wasserflaschen in der Zimmerbar…), alles ist aus natürlichen Baustoffen (Bambus, Holz, Stein) gebaut – wobei nur die edelsten Materialien verarbeitet werden (natürlich nur aus Platagenanbau). Der Strand ist leider vor den Bungalows 15–34 nicht so schön, da dort einige Korallenblöcke am Strand liegen. Aber so ist halt die Natur, ansonsten ist er perfekt.

Unterkünfte

Alle Zimmer/Villen haben direkten Zugang zum Strand (teilweise durch ein paar Büsche verdeckt – das Wasser kann man aber von allen Zimmern aus sehen), ein großes Schlafzimmer mit “King Size” Bett, Klimaanlage (inkl. Fernbedienung), Zimmerbar, Regenschirme, Deckenventilator, sowie viel Platz in den Schränken, ein offenes Badezimmer (ideal für die Wäscheleine), Badewanne mit Dusche, Bademäntel, Föhn, u.s.w. Alle Zimmer haben auch einen Safe, sowie ein Telefon mit internationaler Durchwahl. Vor dem Zimmer/Villa gibt es eine private Sitzecke mit dicken Polstern, sowie zwei Liegen. Fernseher und Videorekorder sind kostenlos zu erhalten (z.B. wenn man sich die Videos für einen OWD Kurs ansehen will). Es gibt auch einige Leihvideos und CDs. Wobei sich das Hotel bereits im Vorwege entschuldigt: die Videos sind teilweise durch die maledivische Zensur arg entstellt. Momentan gibt es drei Kategorien für die Zimmer/Villen:

  • Rehendi Room (Zimmernummer 1–25, $220-$415)
  • ca. 34 qm groß
  • In Einheiten von 2–3 zusammenliegend. Die sich auch den “privaten” Garten teilen, sowie den Zugang zum Strand.
  • Einige Zimmer haben keine Klimaanlage
  • Zumindest die Zimmer 9–10 und 11–12 sind zweier Einheiten. Je kleiner die Nummer, desto weiter muß man zur Bar, Rezeption, u.s.w. laufen (bis zu ca. 500m). Diese liegen zwischen der Zimmernummer 25 und 26.
  • Crusoe Villa (Zimmernummer 26–37, $300-$575)
  • ca. 42 qm groß
  • Zweistöckige Villa, im oberen Stockwerk liegt das Schlafzimmer. Im unteren Stockwerk befindet sich ein Wohnraum, sowie ein Ankleidebereich.
  • Einige Villen haben zwei Einzelbetten anstatt des “King Size” Bettes
  • CD-Player mit quadraphonic HiFi
  • Die oberen Nummern (35–37) haben den schöneren Strand! Vor den anderen gibt es Korallenblöcke.
  • Soneva Fushi villa (Zimmernummer 38–42, $450-$775)
  • ca. 54 qm groß
  • Seiteneingang mit Foyer
  • Zwei Waschbecken im Bad
  • zusätzliche open-air Dusche im Badezimmer
  • Separater Ankleidebereich
  • CD-Player mit quadraphonic HiFi
  • Perfekt, aber auch abseits gelegen. Inzwischen deutlich zentraler, da das neue SPA, sowie das zweite Restaurant sich “direkt” (nunja, 200–300m) hinter den Villen befinden.
  • Residential villa (Zimmernummer 42, $1693-$2658)
  • Auf der “Rückseite” der Insel neu erbaute Villen mit extremem Luxus – unbezahlbar…
  • bis 180qm groß!
  • Schöner Strand, jedoch mit Blick auf den “Hafen” der Nachbarinsel (jedoch kein Problem bzgl. Lärm)

Tierwelt

Die Überwasser-Tierwelt auf der Insel ist übrigens für Maledivenverhältnisse ziemlich umfangreich: diverse Gekkoarten, Kaninchen (übrigens alle mit einem ähnlichen s/w Muster), “unendlich” viele Hühnerfamilien, Flughunde, Mücken und Ameisen… Letztere waren aber kaum lästig: die Gekkos waren reichlich vorhanden und abends im Schein der Beleuchtung habe sie kräftig reingehauen… zudem gab es eine ganze Auswahl an Insektenmitteln auf den Zimmern (von Autan, bis zu den grünen Spiralen, die vor sich hin glimmen). Ein Moskitonetz über dem Bett tat ein übriges.

Über das Vorhandensein der Kaninchen und Hühner gibt es übrigens zwei Aussagen: (a – die offizielle) die waren schon da, als das Resort gebaut wurde, (b) die wurden von der Inhaberin auf die Insel gebracht und in zwei Zwingern gehalten. Leider waren die etwas “ungeschickt” gebaut: die Kaninchen haben sie freigegraben und die Hühner sind rausgeflattert. Aussage (b) kommt aus einer zuverlässigeren Quelle 🙂

Die Küche

Die Küche ist absolut herausragend. Vom perfekten Frühstücksbüffet bis zum Dinner (üblich sind 3 Vorspeisen zur Auswahl, 4 Hauptgerichte, sowie 3 Nachspeisen). Zweimal in der Woche gibt es Thai-, China- o.ä. Büffets (Achtung: sehr scharf!), sonntags ist Barbaque Abend. Natürlich kann man jederzeit auch bestellen, was man möchte – wer lieber auf dem Zimmer essen möchte: kein Problem. Auch ein Barbaque (mit privatem Koch und Kellner) ist natürlich möglich ($70 pro Nase) – wer will, kann das Essen auch auf eine unbewohnte Insel oder die Sandbank verlegen und dort beim Sonnenuntergang zu zweit speisen. Das Essen ist recht teuer ($40–50 für das Dinner), deswegen empfehle ich dringend HP bzw. VP von Deutschland aus zu buchen! Ansonsten muß man dann für 14 Tage leicht $600-$700 für Essen rechnen (wer mittags auch ißt, darf nochmal $25 pro Tag aufschlagen). Getränke sind dagegen eher günstig (Säfte z.B. $2).

Transfer

Der Transfer vom Flughafen Hulule zum Hotel ist der momentan einzige Kritikpunkt: die Hubschrauber (Hummingbird) fliegen nur recht selten (insbesondere, wenn es einmal wieder ein Mangel an Piloten gibt) und man muß sich auf lange Wartezeiten gefaßt machen. Inzwischen hat das Resort ein eigenes Wasserflugzeug, so daß der Transfer kein Problem mehr darstellen sollte.

Ankunft, Besuch in Male

Nach der Ankunft in Hulule hatten wir 3h Wartezeit, von der wir immerhin 2h in Male verbracht haben. Mehr Zeit braucht man in der Hauptstadt auch kaum verbringen, dann hat man alles gesehen. Um das Gepäck brauchten wir uns in der Zeit glücklicherweise nicht kümmern: wir haben es gleich abgenommen bekommen und erst auf unserem Zimmer wiedergesehen.

Der Hubschrauberlandeplatz befindet sich auf der Insel, jedoch am äußersten Ende. Gerade gelandet wird man in in eine Art Dschungelbahn verladen (einen offenen Anhänger mit Palmendach, der von einem Jeep gezogen wird) um nach ein paar Minuten im Zentrum des Resorts bei dem Bootsanleger, Restaurant, Bar, Rezeption, Gift-Shop, Surfbrett-Verleih und SPA anzukommen. Dort bekommt man ersteinmal die obligatorischen Handtücher, sowie einen Welcome-Drink. Nach dem üblichen Papierkram wird man dann zu seinem Zimmer/Villa gebracht.

Rückreise, 4h Stop-Over auf Kuda Huraa

Bei der Abreise war es noch extremer: wir mußten 7h vor unserem Flug los! Um 6 Uhr morgens ging unser Flieger! Das Resort hat jedoch vorgesorgt und uns vom Flughafen gleich weiter nach Kuda Huraa (Concorde Reef) verfrachten lassen. Extrem genial! Durch die Zeitverschiebung kamen wir um 7 Uhr in Kuda Hurra an (um um 11 Uhr wieder abzureisen…)

In diesem – angeblich ebenfalls 6-Sterne Resort – haben wir ein Zimmer bekommen, konnten frühstücken, uns ausruhen und z.B. den riesigen Süßwasserpool nutzen. Kuda Huraa selbst gefällt mir gar nicht: völlig verbaut, kaum Natur und ein ausgesprochen mittelmäßiges Frühstücksbuffet (mit toter Fliege in der Butter, langweiligen Kellnern, etc.). Die Zimmer sind lange nicht so schön wie auf Soneva Fushi, aber durchaus als Luxuszimmer zu bezeichnen. Die Tauchbasis sieht aber ganz gut aus (ist aber wahrscheinlich viel zu klein, wenn die Insel ausgebucht ist). Für einen 4h Zwischenstop ist die Insel natürlich allemal deutlich besser, als Hulule International Airport oder ein Hotel in Male.

Info: Die Insel ist sehr sehr schlank, dafür sehr lang. Das bekannte Photo in Zeitschriften und Reisekatalogen gibt gerade mal den Poolbereich mit einigen wenigen Bungalows wieder. Die restliche Insel ist quasi (vom Ozean aus gesehen): Wasser – Strand – Straße – Bungalow – Straße – Bunglow – Strand – Wasser. Nix Natur! Die “Straße” ist zwar nur ein fester Sandweg und die Autos sind alle Elektrokarren, aber eben kein feiner Sand. Die Anlage wird allerdings sehr liebevoll gepflegt: ständig sieht man irgendwo Gärtner arbeiten. Schnorcheln an der Insel ist wegen des fehlenden Hausriffes kaum sinnvoll – die Strömung zudem scheint teilweise gefährlich zu sein: überall hängen Warnhinweise zu bestimmten Zeiten nicht ins Wasser zu gehen.

Tip: Wer nicht gerade eine Suite oder einen Wasserbungalows will, sollte sich Zimmer 105 (? Ich bin mir nicht ganz sicher wegen der Nummer) reservieren lassen. Das liegt direkt an der Tauchbasis (aber auch nicht zu nah) auf der Lagunenseite und nur ganz wenige Schritte vom Pool, Restaurant, SPA, etc. entfernt. Alle anderen Gäste haben weitere Wege zu gehen und die Insel sieht überall gleich aus. Ruhig ist es trotz des “Verkehrs” auf der Insel.

Wetter (September 97)

Das Wetter war für die Jahreszeit normal: einige wunderschöne Tage, die meisten eher bedeckt, teilweise mit kurzen Regenschauern, 2–3 Tage, die eher mies waren. Abends bzw. nachts ging häufig die Welt unter: Sturm und heftigste Regenschauer. Aber wenn man im Bett liegt, stört sowas ja eh nicht. Ich war jedenfalls dankbar, nicht wie im Vorjahr eine Safaritour ins Baa Atoll unternommen zu haben, auf einem Boot kommt Sturm nicht ganz so gut…

Tauchen

Die Insel ist keine Taucherinsel im Malediven-Sinne. Obwohl die Insel zu 2/3 bis 3/4 ausgebucht war, gab es pro Tauchgang kaum mehr als 5–8 Taucher. Der Rekord waren einmal fast 15 Taucher – die dann natürlich auf 2 Dhonis verteilt wurden. Die meisten Leute nutzen die Insel einfach als Ort der Entspannung und Erholung. Am kilometerlangen Strand finden sich leicht Plätze, die man nur für sich alleine hat.

Tauchbasis Soleni Dive Center
Flaschen 10,5 Liter INT- und DIN Anschlüsse
Ausbildung PADI (4 Tauchlehrer: Thomas, Lisa, Alessandra, Keiko)
Sprachen English, Italienisch, Japanisch, Deutsch
Ausrüstung Zustand gut
Service herrausragend, die eigene Ausrüstung wird der Ankunft entgegengenommen und befindet sich bei jedem Tauchgang gespült und trocken auf dem Boot im Korb. Am letzten Tag bekommt man sie dann wieder “zurück”.
Preise (siehe auch Webseite der Tauchschule)
1 TG inkl. Flasche/Blei $49 (plus Bootsfahrt)
10 TG inkl. Flasche/Blei $410 (plus Bootsfahrt)
6 Tage Non-Limit-Tauchen $500 (inkl. Boot, max. 3 TG am Tag)
1 Bootsfahrt $12

Ein OWD Kurs ist mit $630 abartig teuer! Der Rest ist IMO ok. Immerhin ist die OWD Ausbildung sehr persönlich: ich habe nie mehr als zwei Tauchschüler zusammen mit einem Lehrer gesehen. Die Theorie wird übrigens nicht in der Tauchbasis gegeben, sondern in der Bar. Das hat auch einen praktischen Grund: die Tauchbasis ist ca. einen km von der Bar und vom Anleger entfernt. Die Tauchlehrer kommen jedenfalls immer mit dem Rad…

Ich habe die Tauchbasis während des gesamten Urlaubs nur einmal “besucht”: Moderner Bauer-Kompressor, reichlich Flaschen, Videoanlage, reichlich Mietausrüstung. Ferner eine nette Sitzecke, zwei Duschen, sowie ein großes Süßwasserbecken für die Ausrüstung. Die Ausrüstung der Gäste wird sehr ordentlich auf Bügeln und in Körben unter zwei Unterständen gelagert. Also nicht in einem abgeschlossenen Raum, so daß Langfinger auf ein paar Gedanken kommen könnten 🙁 Während meines Aufenthaltes ist es sowas nie passiert, allerdings ist hin- und wieder das eine oder andere Teil beim Transport aus dem Korb gefallen. Legt euren Kleinkram also ganz nach unten. Tauchcomputer würde ich mit aufs Zimmer nehmen (alleine um das Logbuch auszufüllen).

Am 1. Tag ist ein Check-Dive Pflicht (Maske ab, Tarierung, Oktopus- bzw. Wechselatmung). Die Gruppe von Tauchern dieses Tages blieb übrigens während des gesamten Urlaubes zusammen – mit wenigen Ausnahmen immer mit der gleichen Tauchlehrerin als Führerin. Da alle Tauchgänge von Tauchlehrern begleitet wurden, spielt bei der Basis ein Logbuch, etc. kaum eine Rolle – man guckt sich den Taucher lieber an. Bei 30bar (im 10m Bereich) ist Schluß und ggf. werden die Buddy-Teams neu gemischt, damit die verbleibenden Taucher noch länger unten bleiben können. War bei unserer Gruppe allerdings auch extrem: die Männer waren Divemaster mit reichlich Maledivenerfahrung, die Frauen OWD Frischlinge mit um die 10 TG. Somit war bei den Frauen nach 35–45 Minuten Schluß, wohingegen wir erst nach 60–90 Minuten die Tauchgänge beendet haben. Das Tiefenlimit von 30m (oder gar 18m mit OWD Tauchern) wurde übrigens nicht sonderlich eng gesehen – was auch immer man davon hält, denn lohnen tut es sich ja nur in den allerseltensten Fällen.

Hausriff

Das Hausriff ist ca. 30–100 m entfernt und ist zum Schnorcheln ideal, wobei man vorzugsweise bei Flut starten sollte, da man sonst Schwierigkeiten bekommt über das teilweise flache Riff zu gelangen. Die Insel selbst liegt quer zum Atollrand, so daß es sich quasi um ein Außenriff handelt – was im Dezember/Januar zu extremer Strömung führen kann (dann werden normalerweise keine Nachttauchgänge angeboten). Zu sehen gibt es am Hausriff das “Übliche”: Rochen, Haie, Schildkröten, Langusten, u.s.w. Das Riff ist in einem sehr guten Zustand (mit Ausnahme der flachen Stellen um den Bootsanleger herum). Die meisten Ausbildungstauchgänge erfolgen in der Lague der bereits oben erwähnten Sandbank – ca. 5 Minuten Bootsfahrt entfernt, da das Hausriff sehr steil abfällt.

Im Lichte des Bootsanlegers finden sich abends bis zu 7 Riffhaie an, sowie tausende von sonstigen Korallenfischen. Die Riffhaie sind aber auch tagsüber dort immer zu finden.

Tauchen am Hausriff ist möglich, sogar “no-limit”. Voraussetzung ist das beide Taucher zumindest AOWD Taucher sind. Gesehen habe ich dort allerdings nie einen Taucher – Ausnahme: bei einem Nachttauchgang (ist dort sehr zu empfehlen!)

Tauchplätze

Die Tauchplätze werden wie fast überall auf den Malediven üblich 2x täglich angefahren. Alle Tauchgänge werden von Tauchlehrern begleitet, mit jeweils maximal 8 Tauchern. Mehr als 10 Taucher pro Dhoni gibt es allerdings nicht. Die Wahl des jeweiligen Tauchplatzes ist ein Mittelding aus Vorschlag vom Tauchlehrer und gruppendynamischer Entscheidung 🙂 Die Anfahrten zu den über 20 Tauchplätzen dauern zwischen 5 und 60 Minuten. Die Briefings sind ausführlich (Strömung, Skizze vom Tauchplatz, Besonderheiten, Gefahren, u.s.w.)

Besonders zu empfehlende Tauchplätze sind

  • Kuda tila – ein sehr schönes Tila mit abertausenden von Fischen. Sehr viele Feuerfische, Steinfische, Langusten, Mantas, Schildkröten, sowie – hin und wieder – auch Walhaie
  • Digalhi haa – ebenfalls eine Art Tila mit Unmengen an Fisch: Makrelen, Tunfische, Muränen, Barakudas, Grauhaie (quasi mit Garantie), Adlerrochen, sowie Schildkröten und zwei Delphine. Immer mit Strömung (mal mehr, mal weniger).
  • Nelivaru haa – der Mantapoint im Baa-Atoll! (nur 5 Minuten Bootsfahrt vom Anleger entfernt) Ansonsten ebenfalls die üblichen Makrelenschwärme, Tunfische, Fledermauschfische, Stachelrochen, Röhrenaale, u.s.w. Wir hatten allerdings Pech: seit Wochen waren keine Mantas oder Walhaie (das Jahr vorher habe ich am gleichen Platz zur gleichen Zeit (ok, um 6 Uhr morgens…) 6 Mantas und einen Walhai gesehen – es sollen zu der Zeit reichlich Walhaie dort gewesen sein) zu sehen, bis zu einem “Stichtag”, ab dem die Mantas dann wieder da waren.

Christoph Pagalies 1968-1997

Diese Seite soll an Christoph Pagalies erinnern, der am 31. Mai 1997 nach einem 3/4 Jahr des Leidens an Krebs verstorben ist.

Christoph wurde nur 29 Jahre alt. Er studierte technische Informatik an der FH-Wedel und beendete das Studium nur Tage vor dem Ausbruch der Krankheit erfolgreich als Dipl. Ing. Schon seit seiner Schulzeit beschäftigte er sich mit der Software-Entwicklung, sowohl PD- und Shareware, als auch kommerziell. Viele Projekte haben wir zusammen geschrieben – sowohl zur guten, alten C–64 und Atari-Zeit wie auch auf dem Macintosh und dem Newton. So hat Christoph zusammen mit mir an Midi-Maze II (fast der komplette Editor stammt von Christoph), TurboAss, HyperText, Transfile Mac IQ, u.v.a.m. gearbeitet.

Die Mausefalle

Für das Studium mußten wir ein Pascal Praktikum einreichen, so begann Christoph die Mausefalle zu entwickeln. Die Mausefalle ist ein MausTausch-FrontEnd, das heißt, ein Offline-Reader für das [[http://www.maus.net|MausNet]]. Das MausNet ist ein Mailboxnetz, das im deutschsprachigen Raum mit weit über einhundert Mailboxen vertreten ist.

Durch den Maustausch kann mit Mailboxen Nachrichten tauschen und nachher lesen. Dies bietet mehrere Vorteile gegenüber dem konventionellen online-Lesen:

  • Man spart Telefongebühren, weil die Tauschzeit sehr viel kürzer ist als die Zeit, die man zum Lesen benötigt,
  • Die Mailbox wird schneller wieder frei, so daß mehr User die Mailbox frequentieren können, und
  • Man hat mehr Zeit, um sich seine Antworten in Ruhe zu überlegen.

Systemanforderungen

Um mit der Mausefalle arbeiten zu können, benötigt man:

  • Einen Macintosh
  • System 7.0 oder neuer
  • Mindestens 4 MB (eher 6 MB) Hauptspeicher (die Mausefalle selbst benötigt minimal 1 MB) Platz auf einem Volume (Festplatte), um eine Database anzulegen (je nach Lesegewohnheiten um 2 MB–5 MB oder mehr)
  • Ein Modem und ein Terminalprogramm, um mit der Mailbox zu tauschen.

Wie teuer ist die Mausefalle?

Die Mausefalle habe ich in Erinnerung an Christoph frei verfügbar gemacht, wer die Mausefalle jedoch länger als 30 Tage nutzt, muß eine Spende von mindestens 10 Euro an die Deutsche Leukämie-Forschungshilfe – Aktion für krebskranke Kinder e.V. überweisen.

Download

ZAP


Audio files that are compressed with ZAP will unpack as an absolutely bit identical 1:1 copy of the original file. ZAP is the ideal money-saving tool for cost effective archiving of audio data or for sending production quality audio via the Internet. ZAP is extremely easy to use, runs in the background and creates self extracting archives.

Features

  • Supports 16- and 24-Bit-files
  • Supports WAV and AIFF, Mono and Stereo
  • Target format can be chosen prior to compression
  • Typical compression rate: 20–60 %
  • Background Processing
  • Archives with multiple audio files
  • Simple Drag & Drop interface
  • Restores data from corrupted files

Audiowerk8 and VMR

The Audiowerk8 is a PCI recording card with 2 analog inputs, 8 individual outputs, and stereo digital I/O (S/P-DIF). Audiowerk8 is fully compatible with any MacOS or Windows 95 PCI computer. The high quality A/D D/A converters feature bitstream technology (18 bit equivalent) to ensure professional sounding results. The PCI busmaster technology allows for an uninterrupted data transfer to the card independently from the CPU load and therefore optimizes overall system performance.

Audiowerk8 is an integral part of the Logic Audio System. Up to 12 audio tracks are possible with the current versions.

The Audiowerk will ship with VMR, Virtual Multitrack Recorder software. Availability and Price Audiowerk8 with VMR will be available in the 1st Quarter 1997, and will have a suggested retail price of $799.

Download the original CD as a disk image from GitHub (158MB).

Keys 3/97 Audiowerk8 Test

Newton Keyboard Enabler

The Newton Keyboard Enabler (NKE) allows you to connect the Newton keyboard to any Macintosh and use it as a replacement for the big ADB keyboards. Very nice for presentations where space is rare.

The NKE is a system extension, but it does not do any trap patching. To be exact: the NKE is a FBA (faceless background application), that works like a normal application, but without any human interface. The NKE should work on any Macintosh with Mac OS 7 and at least one free serial port. NKE will grab the serial port, so it is not possible for any other application to use the port.

You may quit the NKE with a “Quit” AppleEvent or with the hotkey Control-Option-^. Hold the three keys for about 2 seconds down, if it doesn’t work: retry. If you are lucky, you hear three beeps, then you have to press a key on the Newton keyboard. After that, the NKE has quit.

The Newton Keyboard Enabler is freeware. You may use it as you wish, but need written permission for any commercial distribution!

Configuring the NKE

The configuration is a bit tricky, you have to use ResEdit or Resorcerer!

  • Choose the serial port — Open NKE with ResEdit and open the STR# 128 Resource. For the modem port (the default) enter “.AIn” and “.AOut”; for the printer port enter “.BIn” and “.BOut”. Pay attention to internal modems on PowerBooks etc.
  • Choose the keyboard layout and language — Open the PREF 128 resource (attention: only a Resorcerer template is available, ResEdit users have to use the hex-editor). The resource is 4 bytes long:
    • The last byte is the keyboard language. 3 is default (Germany), you may want to change it to 0 (US-English).
    • The first byte (default: 0 = off) allows you to send different codes for the shift keys of the Newton keyboard (set the value to 1). You should leave this value unchanged.

After installing NKE (dragging it onto the system folder) and connecting the keyboard to the right serial port, restart your Macintosh. If NKE can’t recognize the keyboard, you may have to check the serial port. If the keyboard layout is wrong, you have to change the keyboard language.

Hint: You may change the Filetype of NKE from “appe” to “APPL” and launch NKE directly from your desktop – no restart necessary!

The current version

NKE MacOpen Artikel

Newton Keyboard am Mac

Dieses mal will ich etwas zu dem Anschluß eines Newton Keyboards am Mac schreiben. Das Newton Keyboard ist nämlich durch seine kleinen Abmessungen ideal für Messen etc. zu verwenden.

Der Anschluß

Das Newton Keyboard ist für etwas über 100,- DM im Apple Fachhandel zu erhalten. Das kleine schwarze Keyboard wird inklusiver einer Tasche geliefert. Da es beim Newton an die serielle Schnittstelle angeschlossen wird, kam mir die Idee das Keyboard an einen Mac anzuschließen. Mit Hilfe eines Terminalprogramms habe ich schnell ermitteln können, daß das Keyboard mit 9600 Baud seine Daten an den Rechner sendet – 8 Bits pro Zeichen, keine Parität, ein Stop-Bit. Elektrisch war die Ansteuerung also kein Problem.

Nun mußte ich rausbekommen, was für Daten von der Tastatur gesendet werden. Auch hier: keine Überraschungen. Die Tastatur sendet bei jedem Tastendruck bzw. beim Loslassen einer Taste ein Byte. Unterscheiden kann man das Drücken bzw. Loslassen einer Taste daran, daß beim Loslassen Bit 7 gesetzt wird. Der 7 Bit Scancode entspricht quasi zu 100% denen der normalen Mac-Keyboards.

Sobald die Schnittstelle geöffnet wird, sendet das Keyboard einen String mit Identifikationsdaten. Leider habe ich keine genaueren Informationen über den Aufbau der Daten, es reicht jedoch zur Erkennung der Newton-Tastatur.

Die Software

Die Aufgabe eines Newton Keyboard Treibers ist also recht klar umrissen: Serielle Schnittstelle öffnen, die ersten Bytes ignorieren, dann bei jedem gesendeten Byte entweder das Drücken oder das Loslassen einer Taste melden. So weit so gut. Nur wie macht man das?

Ich wollte versuchen keine Systemerweiterung zu schreiben, die irgendwelche Traps patched, sondern dachte zuerst: das muß ja einfach sein, einfach per PostEvent() das Drücken und Loslassen melden und fertig. Leider ist es “etwas” komplizierter…

Der einfache Teil ist klar: ich schreibe eine “faceless background application” kurz FBA. Ein FBA verhält sich für den normalen Anwender, wie eine Systemerweiterung und wird auch in dem Ordner installiert. Für das MacOS handelt es sich aber um ein ganz normales Mac-Programm mit Event-Loop. FBAs dürfen jedoch – mit Ausnahme des Notification Managers – keine Bildschirmausgaben tätigen. Für einen Tastaturtreiber stellt dies aber kein Problem dar. FBAs erlauben AppleEvents und so kann man sehr elegant kleinere Erweiterungen für viele Programme als FBA implementieren z.B. AppleScript-Erweiterungen für FileMaker Pro.

Die serielle Schnittstelle

Das Öffnen der Schnittstelle mit OpenDriver() ist relativ einfach und klar. Die Namen der Ports habe ich in den Resource-Fork abgelegt, so daß man sie bei Bedarf leicht ändern kann. Besser wäre natürlich ein Kontrollfeld, wo man den Port direkt wählen kann – oder die Möglichkeit den Port automatisch zu ermitteln. Die Baudrate setze ich danach auf 9600 8N1 – ist normalerweise eh Standard, aber sicher ist sicher. Handshaking ist für die Tastatur nicht nötig. Um der Tastatur die Möglichkeit zu geben ihre Identifikation zu senden, wartet der Treiber 1/2 Sekunde und liest dann alle an der seriellen Schnittstelle anliegenden Bytes ein. Welche Bytes erwartet werden, kann man dem Listing entnehmen. Ein kleiner Plausibilitätstest stellt sicher, daß auch wirklich eine Newton Tastatur angeschlossen ist.

Nun kommt aber der Trick: anstatt im Event-Loop die serielle Schnittstelle zu pollen, lese ich asynchron von der Schnittstelle! Dies belastet das MacOS fast gar nicht und bei jedem Byte, das an der Schnittstelle ankommt, wird automatisch eine Callback-Routine von mir aufgerufen. Dort verarbeite ich das gelesene Byte und starte den nächsten Lesevorgang. Einzige Falle ist hier, daß man den Parameterblock und andere Variablen globale halten muß, denn auf dem lokalen Stack würden sie ja beim Verlassen des Unterprogramms gleich gelöscht werden. Abstürze wären die Folge.

In der Testphase hat es sich als nützlich erwiesen, wenn man den Treiber beenden kann. Dazu setzt man den Dateityp nicht auf ‘appe’ (der Filetype von FBAs), sondern ganz normal auf ‘APPL’. Nun kann man den Treiber einfach per Doppelklick starten. Per Hot-Key (Control-Option-^) bzw. Quit-AppleEvent verläßt der Treiber nun den Event-Loop. Nach drei SysBeeps() wartet er auf ein letztes Byte an der serielle Schnittstelle und beendet sich dann selbst. Den Hot-Key muß man etwas länger drücken, denn der Event-Loop wird nur einmal pro Sekunde durchlaufen. Normalerweise braucht der Treiber ja diesen Event-Loop gar nicht und so kostet er wenigstens kaum Rechenzeit.

Die Scancodes

Die Tastatur meldet ja nur ein Byte für einen Tastendruck. Dieses Byte (Scancode genannt) muß nun in einen ASCII-Code umgerechnet werden. Dazu gibt es im MacOS die KMAP- und KCHR-Resourcen. KMAP erlaubt es Scancodes von verschiedenen Tastaturen zu normalisieren, d.h. auf gleiche Scancodes umzurechnen. Jede Tastatur kann ja völlig eigene Scancodes senden. Ferner wird in der KMAP-Resource definiert, bei welchen Tastendrücken die LEDs am erweiterten Keyboard angeschaltet werden. Das Newton Keyboard hat keine LEDs, so erübrigt sich weiterer Aufwand in diese Richtung.

Ebenfalls muß das Verhalten der Capslock-Taste simuliert werden. Beim Newton Keyboard wird sie ja nicht mechanisch blockiert. Man muß also per Software einen Caps-Schalter implementieren.

Den erzeugten normalisierten Keycode muß man nun in die KeyMap-Bitmaske übertragen. Diese Bitmaske erhält man, wenn man die Funktion GetKeys() aufruft. Viele Programme tun dies und wir müssen diese Bitmaske selbst aktualisieren. Hierbei gibt es folgendes zu beachten: es können mehrere Tastaturen angeschlossen sein! Jede Tastatur braucht ihre eigene interne KeyMap, die bei jedem Tastendruck einfach in die KeyMap des Systems kopiert wird.

Ferner müssen noch einige (undokumentierte) globale Variablen richtig gesetzt werden, damit u.a. Auto-Repeat funktioniert. Diese Variablen habe ich durch Analyse des originalen ADB-Treibers von Apple gefunden. Nunja, eine andere Möglichkeit kenne ich nicht und Auto-Repeat ist irgendwie zu witzig, als das man es nicht unterstützt.

Zu guter Letzt wird der Scancode in einen (oder zwei) ASCII-Codes umgerechnet. Dazu braucht man lediglich die Funktion KeyTranslate() aufrufen. Diese Funktion bekommt eine KCHR-Routine übergeben, welche beschreibt, wie man einen Scancode in einen ASCII-Code umrechnet. Unterschiedliche KCHR-Resourcen erlauben es z.B. für verschiedene Sprachen verschiedene Tastaturlayouts zu unterstützen. Die Scancodes sind nämlich – trotz unterschiedlich beschrifteter Tastenkappen – gleich! Es gibt aber noch ein paar Dinge zu beachten: Die Funktion kann zwei ASCII-Codes erzeugen, da einige Tastaturen auf einen realen Tastendruck zwei Tastendrücke simulieren. Ich glaube in Japan ist soetwas nicht unüblich. Ferner muß man den Status “state” global halten. In diesem Status wird zwischen zwei Tastendrücken gespeichert, ob z.B. ein Dead-Key gedrückt wurde. Beispiel: man drückt ein Taste, die ein Akzent einleitet und danach eine Taste, auf welche das Akzent gesetzt werden soll.

Zu guter Letzt wird der Tastendruck als keyDown bzw. keyUp Message an MacOS gepostet. Natürlich nicht ohne vorher noch ein paar undokumentierte Variablen im MacOS zu setzen. Nunja.

Die Kompilierung

Um das Programm zu kompilieren muß lediglich der Source, wie auch die Resource kompiliert werden. Das Programm bekommt als Dateityp ‘appe’ und als Creatorcode ‘NwtK’ zugewiesen. 64k Speicherzuteilung reichen dicke. Lediglich die Flags müssen sorgfältig gesetzt werden (siehe Grafik). Wer will, kann den Dateityp auf ‘APPL’ setzen und den Treiber per Doppelklick bei Bedarf starten.

Um die serielle Schnittstelle zu ändern, muß man lediglich in der STR# 128 Resource die Einträge von “.AIn” und “.AOut” (Modemanschluß) z.B. auf “.BIn” und “.BOut” (Druckeranschluß) ändern.

In der PREF 128 Resource kann man sowohl das Keyboard Layout umschalten: das letzte Byte ist 3 für Deutschland oder 0 für US-Englisch. Weitere Layouts sind möglich, man muß lediglich entsprechende KCHR-Resourcen zur Verfügung stellen. Üblichweise sind seit MacOS 7.5 alle internationalen Keyboard-Layouts bereits im System vorhanden.

Das erste Byte ermöglicht es zwischen der KMAP 0 und KMAP 1 Resource zu wählen. Diese Layouts unterscheiden sich durch die Behandlung der gemeinsamen Shift-Tasten. Üblich ist es, daß beide Shift, Command, etc. Tasten den gleichen Scancode an die Anwenderprogramme melden. Wählt man die KMAP 1 Resource, so werden diese Tasten unterschiedlich gemeldet. Programme können dies zwar per Software umschalten (MagicMac nutzt dies z.B.), aber dies erfordert die direkte Programmierung der ADB-Tastaturen, was bei unserer Newton Tastatur an der seriellen Schnittstelle halt nicht möglich ist.

Die aktuelle Version des Newton Keyboard Enablers findet sich auf http://www.emagic.de/mmm/ – neben vielen anderen Programmen von mir.

########################################
############### LISTINGs ###############
########################################
/***
 *  Newton Keyboard Enabler.c
 *
 *  Erlaubt die Nutzung eines seriellen Newton-
 *  Keyboards an einem Mac. Das Keyboard verhält
 *  sich in fast allen Fällen genau wie ein
 *  originales ADB-Keyboard (Ausnahme: MacsBug
 *  kann es nicht nutzen)
 *
 *  Entwickelt mit dem CodeWarrior 9 von
 *  Metrowerks.
 *
 *  (c)1996 MAXON Computer, Markus Fritze
 ***/

// c_moeller@macopen.com

// true, wenn das Programm beendet werden soll
Boolean gDoQuitFlag;

/***
 *  unsere AppleEvent-Routinen
 *  (schließlich sind wir ein ordentliches
 *  MacOS Programm)
 ***/
static pascal OSErr DoAENoErr(
    const AppleEvent*, AppleEvent*, long)
{
  return noErr;   // AppleEvent ist ok
}

static pascal OSErr DoAEQuitAppl(
    const AppleEvent*, AppleEvent*, long)
{
  gDoQuitFlag = true; // Programm beenden
  return noErr;
}


// einen (hoffentlich) undefinierten Code
// benutzen wir als ID-Code für die Tastatur
#define NEWTON_KEYBOARD_CODE    117L


// Zugriffsfunktionen ähnlich <LowMem.h>
// für den Tastaturtreiber
static inline SInt16 LMGetKeyLast()
        { return *(SInt16*)0x0184; };
static inline void LMSetKeyLast(SInt16 value)
        { *(SInt16*)0x0184 = value; };
static inline SInt16 LMGetHiKeyLast()
        { return *(SInt16*)0x0216; };
static inline void LMSetHiKeyLast(SInt16 value)
        { *(SInt16*)0x0216 = value; };

static inline SInt32 LMGetKeyTime()
        { return *(SInt32*)0x0186; };
static inline void LMSetKeyTime(SInt32 value)
        { *(SInt32*)0x0186 = value; };
static inline SInt32 LMGetKeyRepTime()
        { return *(SInt32*)0x018A; };
static inline void LMSetKeyRepTime(SInt32 value)
        { *(SInt32*)0x018A = value; };

// ohne "inline", wegen eines 68k Compilerbugs
// beim CodeWarrior 9
static /*inline*/ KeyMap *LMGetKeyMapPtr()
        { return (KeyMap*)0x0174; };

// Unsere globalen Variablen für die Tastatur
Handle      gKMAP;
Handle      gKCHR;
UInt8     gKeyMap[16];

/***
 *  Keyboard-Variablen initialisieren
 ***/
static void InitKeyboard()
{
  Handle  thePref =
    ::Get1Resource('PREF', 128);

  // eigener Typ: Newton Keyboard
  gKMAP = ::Get1Resource('KMAP', **thePref);
  if(!gKMAP) ::ExitToShell();
  ::HLockHi(gKMAP);

  // ein deutsches Keyboard:
  gKCHR = ::GetResource('KCHR',
          ((short*)*thePref)[1]);
  if(!gKCHR)
    // ein US-Keyboard:
    gKCHR = ::GetResource('KCHR', 0);
  if(!gKCHR) ::ExitToShell();
  ::HLockHi(gKCHR);

  // eigene Keymap löschen
  for(int i=0; i<sizeof(gKeyMap); i++)
    gKeyMap[i] = 0;

  ::ReleaseResource(thePref);
}

/***
 *  Tastencode senden
 ***/
static void PostKeyMessage(
        UInt8 inKey, UInt8 inKeyCode)
{
  // keine Taste => raus
  if(inKey == 0x00L) return;

  // Message zusammensetzen
  UInt32  theMessage = inKey
        | UInt16(inKeyCode << 8)
        | (NEWTON_KEYBOARD_CODE << 16);

  // Taste gedrückt
  if(!(inKeyCode & 0x80)) {
    SInt32  theTicks = LMGetTicks();
    LMSetKeyTime(theTicks);
    LMSetKeyRepTime(theTicks);
    LMSetKeyLast(theMessage);
    LMSetHiKeyLast(NEWTON_KEYBOARD_CODE);
    ::PostEvent(keyDown, theMessage);

  // Taste losgelassen
  } else {
    // Key-Up-Flag löschen
    theMessage &= 0xFFFF7FFF;
    ::PostEvent(keyUp, theMessage);
  }
}

/***
 *  Tastendruck (bzw. das Loslassen) dem MacOS
 *  melden
 ***/
static void EnterKeycode(UInt8 inCode)
{
  // aktuelle Taste im System löschen
  LMSetKeyLast(0);
  LMSetHiKeyLast(0);

  // true, wenn Taste losgelassen wurde
  Boolean theDownFlag =
                (inCode & 0x80) == 0x80;

  // MacOS-Keycode erzeugen
  UInt8 theKeyCode;
  Ptr   theKMAP = *gKMAP;
  theKeyCode = theKMAP[(inCode & 0x7F) + 4];
  // Sondercode erkannt?
  if(theKeyCode & 0x80) {

    // erstmal das Kennungs-Bit löschen
    theKeyCode &= 0x7F;

    // Anzahl der Sondereinträge
    SInt16  theCount =
      *reinterpret_cast<SInt16*>
            (&theKMAP[0x84]);

    // ab hier geht es mit den Tabellen los
    UInt8 *theKMapP =
      reinterpret_cast<UInt8*>
            (&theKMAP[0x86]);
    while(theCount-- > 0) {
      // Code gefunden?
      if(*theKMapP++ != theKeyCode) {
        // zum nächsten Eintrag
        theKMapP += theKMapP[1] + 2;
        continue;
      }
      if((*theKMapP & 0x0F) == 0x00)
        return;
      break;
    }
  }

  // Capslock Abfrage
  if(theKeyCode == 0x39) {
    if(theDownFlag) { // Taste gedrückt?

      // Caps bereits gesetzt?
      if(gKeyMap[theKeyCode >> 3]
        & (1 << (theKeyCode & 7))) {
        // dann lösen!
        theDownFlag = false;
      }
    } else {  // Taste losgelassen?
      // (das interessiert uns nie!)
      return;
    }
  }

  // in die KeyMap eintragen (vorerst nur in
  // die eigene)
  if(theDownFlag) {
    gKeyMap[theKeyCode >> 3] |=
        1 << (theKeyCode & 7);
  } else {
    gKeyMap[theKeyCode >> 3] &=
        ~(1 << (theKeyCode & 7));

    // Flag für "losgelassen"
    theKeyCode |= 0x80;
  }

  // Tastencodes in globalen Variablen merken
  LMSetKbdLast(theKeyCode);
  LMSetKbdType(NEWTON_KEYBOARD_CODE);

  // globale KeyMap updaten
  ::BlockMoveData(gKeyMap, LMGetKeyMapPtr(),
          sizeof(KeyMap));

  // aktuelle Modifiers für KeyTranslate lesen
  UInt16  theModifiers = *(3 +
          reinterpret_cast<UInt16*>
          (LMGetKeyMapPtr()));

  // ROL.W #1,<ea>
  theModifiers = (theModifiers >> 15)
        | (theModifiers << 1);

  // ASCII-Codes (denkbar: zwei pro
  // Tastendruck!) errechnen
  static UInt32 state = 0;
  UInt32  lStructure = ::KeyTranslate(*gKCHR,
        theKeyCode | (theModifiers << 8),
                    &state);

  // ggf. zwei Tasten posten
  PostKeyMessage(lStructure >> 16, theKeyCode);
  PostKeyMessage(lStructure, theKeyCode);
}

/***
 *  diese asynchrone Routine pollt das Keyboard
 *  an der Seriellen
 ***/
#include <Serial.h>

// UPP für die Callback-Routine
IOCompletionUPP gIOUPP;

// Refnums für Serial ein/aus
SInt16      gSDIn, gSDOut;

// das empfangene Zeichen
UInt8     gInChar;

// der Parameterblock (asynchron!)
ParamBlockRec gParamBlk;

/***
 *  das nächste Byte von der
 *  Tastatur asynchron lesen
 ***/
static void   GetNextByte()
{
  if(gDoQuitFlag) return;
  // Callback setzen
  gParamBlk.ioParam.ioCompletion = gIOUPP;
  // Port lesen
  gParamBlk.ioParam.ioRefNum = gSDIn;
  // Buffer auf unser Byte
  gParamBlk.ioParam.ioBuffer = (Ptr)&gInChar;
    // ein Byte lesen
  gParamBlk.ioParam.ioReqCount = 1L;
  // ab der aktuellen Position
  gParamBlk.ioParam.ioPosMode = fsAtMark;
  // kein Offset...
  gParamBlk.ioParam.ioPosOffset = 0L;
  // Anforderung absetzen
  PBReadAsync(&gParamBlk);
}

/***
 *  Diese Routine wird angesprungen,
 *  wenn ein Byte eingetroffen ist.
 ***/
static void   MyCompletion(
          ParmBlkPtr ioParam : __A0)
{
#pragma unused(ioParam)

  // Byte verarbeiten
  EnterKeycode(gInChar);

  // nächstes Byte anfordern
  GetNextByte();
}

/***
 *  main()
 ***/
void    main()
{
  // 16k anstatt 2k an Stack!
  ::SetApplLimit((Ptr)((UInt32)
          ::GetApplLimit() - 0x4000));

  // Crasht vor MacOS 7.5.4, falls eine zweite
  // FBA ebenfalls MaxApplZone() aufruft:
  // ::MaxApplZone();

  // weitere Init-Calls sind bei FBAs nicht
  // erlaubt
  ::InitGraf(&qd.thePort);

  // AppleEvents installieren (wenn vorhanden)
  long  response;
  if(!::Gestalt(gestaltAppleEventsAttr,
          &response)) {
    if(response &
      (1L<<gestaltAppleEventsPresent)) {

      if(::AEInstallEventHandler(
            kCoreEventClass,
            kAEOpenApplication,
            NewAEEventHandlerProc(DoAENoErr),
            0L, 0))
        return;

      if(::AEInstallEventHandler(
            kCoreEventClass,
            kAEOpenDocuments,
            NewAEEventHandlerProc(DoAENoErr),
            0L, 0))
        return;

      if(::AEInstallEventHandler(
            kCoreEventClass,
            kAEPrintDocuments,
            NewAEEventHandlerProc(DoAENoErr),
            0L, 0))
        return;

      if(::AEInstallEventHandler(
            kCoreEventClass,
            kAEQuitApplication,
            NewAEEventHandlerProc(DoAEQuitAppl),
            0L, 0))
        return;
    }
  }

  // globale Keyboard-Variablen initialisieren
  InitKeyboard();

  // ".AIn" und ".AOut" öffnen
  OSErr theErr;
  Str255  theStr;
  ::GetIndString(theStr, 128, 2);
  theErr = ::OpenDriver(theStr, &gSDOut);
  if(theErr) ::ExitToShell();
  ::GetIndString(theStr, 128, 1);
  theErr = ::OpenDriver(theStr, &gSDIn);
  if(theErr) goto raus;

  // 9600 8N1
  theErr = ::SerReset(gSDOut,
                baud9600+data8+stop10+noParity);
  if(theErr) goto raus;

  // Handshaking ausschalten
  SerShk  theSHandShk;
  theSHandShk.fXOn = 0;
  theSHandShk.fCTS = 0;
  theSHandShk.errs = 0;
  theSHandShk.evts = 0;
  theSHandShk.fInX = 0;
  theSHandShk.fDTR = 0;
  theErr = ::Control(gSDOut, 14, &theSHandShk);
  if(theErr) goto raus;

  long  theTicks;
  // 1/2 Sekunde auf das Keyboard warten
  ::Delay(30, &theTicks);

  // Anzahl der Byte an der Schnittstelle ermitteln
  SInt32  theCount;
  ::SerGetBuf(gSDIn, &theCount);

  // und alle lesen
  Str255  theBuf;
  ::FSRead(gSDIn, &theCount, &theBuf);

  // Daten von der Tastatur zum Rechner, wenn die
  // Schnittstelle angeschaltet wird (9600 8N1):
  //  <0x16><0x10> 0x02,
  //  'd_id', 0x0CL,        // Device-ID?
  //  'kybd','appl', 0x01L,   // Keyboard-Typ
  //  'nofm', 0L, 0x1003dde7L   // ???
  if(reinterpret_cast<long*>(&theBuf)[3]
        != 'ybda')
    goto raus;

  gIOUPP = NewIOCompletionProc(MyCompletion);
  GetNextByte();  // erstes Byte erwarten

  gDoQuitFlag = false;
  while(!gDoQuitFlag) {
    EventRecord theEvent;
    // nur einmal pro Sekunde erwarten wir einen
    // Null-Event!
    ::WaitNextEvent(
            everyEvent, &theEvent, 60, 0L);
    if(theEvent.what == kHighLevelEvent)
      ::AEProcessAppleEvent(&theEvent);

#if DEBUG
    // zum Debuggen: '^' + Control + Option
    // beendet das Programm!
    KeyMap  theMap;
    ::GetKeys(theMap);
    if((theMap[0] & 0x40000) &&
        ((theMap[1] & 0xC) == 0xC)) {
      break;
    }
#endif
  }
  // auf ein letztes Byte warten!
  SysBeep(10); SysBeep(10); SysBeep(10);

  // auf Abschluß des aktuellen Polls warten
  while(gParamBlk.ioParam.ioResult > 0) {}

  // Tastaturstatus zurücksetzen
  LMSetKeyLast(0);
  LMSetHiKeyLast(0);
  for(int i=0; i<sizeof(gKeyMap); i++)
    gKeyMap[i] = 0;
  ::BlockMoveData(gKeyMap, LMGetKeyMapPtr(),
                  sizeof(KeyMap));

raus:
  if(gSDOut) ::KillIO(gSDOut);
  if(gSDIn) ::CloseDriver(gSDIn);
  if(gSDOut) ::CloseDriver(gSDOut);
}


/***
 *  Newton Keyboard.r
 ***/
resource 'KMAP' (0) {
    0,
    0,
    {   0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
        18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
        33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
        48,49,50,51,52,53,59,55,56,57,58,59,56,58,59,
        63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,
        78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,
        93,94,95,96,97,98,99,100,101,102,103,104,105,
        106,107,108,109,110,111,112,113,114,115,116,
        117,118,119,120,121,122,123,124,125,126,127
    },
    {
    }
};

resource 'KMAP' (1) {
    0,
    0,
    {   0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
        18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
        33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
        48,49,50,51,52,53,59,55,56,57,58,59,60,61,62,
        63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,
        78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,
        93,94,95,96,97,98,99,100,101,102,103,104,105,
        106,107,108,109,110,111,112,113,114,115,116,
        117,118,119,120,121,122,123,124,125,126,127
    },
    {
    }
};

resource 'STR#' (128, "Portnames") {
    {   ".AIn",
        ".AOut"
    }
};

data 'TMPL' (128, "PREF") {
    /* .Different Shift */
    $"1544 6966 6665 7265 6E74 2053 6869 6674"
    /* -Keys?BOOL.Keybo */
    $"2D4B 6579 733F 424F 4F4C 0E4B 6579 626F"
    /* ardregionRGNC */
    $"6172 6472 6567 696F 6E52 474E 43"
};

data 'PREF' (128) {
    $"0000 0003"
};

/***
 *  ab hier: optional!
 ***/
resource 'vers' (1) {
    0x1,
    0x0,
    release,
    0x0,
    verGermany,
    "1.0",
    "1.0, ©1996 MAXON Computer, Markus Fritze"
};

resource 'BNDL' (128) {
    'NwtK',
    0,
    {   'FREF', { 0, 128 },
        'ICN#', { 0, 128 }
    }
};

resource 'FREF' (128) {
    'appe',
    0,
    ""
};

resource 'icl4' (128) {
    $"0FFF FFFF FFFF FFFF FFFF FFFF FFFF 0000"
    $"F000 0000 0000 0000 0000 0000 000C F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"FF0F CCCC CCCC CCCC CCCC CCCC CCCC F0F0"
    $"F0FF CCCC CCCC CCCC CCCC CCCC CCCC FF0F"
    $"000F CC99 9999 9999 9999 9999 99CC F0CF"
    $"000F CC99 9999 9999 9999 9999 99CC CCCF"
    $"000F CC99 C9C9 C9C9 C9C9 C9C9 99CC CCCF"
    $"000F CC99 9999 9999 9999 9999 99CC CCCF"
    $"000F CC99 9C9C 9C9C 9C9C 9C9C 99CC CCCF"
    $"000F CC99 9999 9999 9999 9999 99CC CCCF"
    $"000F CC99 C9C9 C9C9 C9C9 C9C9 99CC CCCF"
    $"000E CC99 9999 9999 9999 9999 99CC CCCF"
    $"000E CC99 9C9C 9CCC CCCC 9C9C 99CC CCCF"
    $"000F CC99 9999 9999 9999 9999 99CC FCCF"
    $"F00F CC99 9999 9999 9999 9999 99CC FFCF"
    $"FF0F CCCC CCCC CCCC CCCC CCCC CCCC F0F0"
    $"F0F0 CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"FCCC CCCC CCCC CCCC CCCC CCCC CCCC F000"
    $"0FFF FFFF FFFF FFFF FFFF FFFF FFFF"
};

resource 'icl8' (128, purgeable) {
    $"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
    $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000"
    $"FF00 0000 0000 0000 0000 0000 0000 0000"
    $"0000 0000 0000 0000 0000 00F6 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FFFF 00FF F8F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 FF00"
    $"FF00 FFFF F8F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FFFF 00FF"
    $"0000 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F8 FF00 F6FF"
    $"0000 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 F8A5 F8A5 F8A5 F8A5"
    $"F8A5 F8A5 F8A5 F8A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 A5F8 A5F8 A5F8 A5F8"
    $"A5F8 A5F8 A5F8 A5F8 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 F8A5 F8A5 F8A5 F8A5"
    $"F8A5 F8A5 F8A5 F8A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FC F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FC F8F6 A5A5 A5F8 A5F8 A5F8 F8F8"
    $"F8F8 F8F8 A5F8 A5F8 A5A5 F6F6 F6F6 F8FF"
    $"0000 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F8 FFF8 F8FF"
    $"FF00 00FF F8F6 A5A5 A5A5 A5A5 A5A5 A5A5"
    $"A5A5 A5A5 A5A5 A5A5 A5A5 F6F8 FFFF F8FF"
    $"FFFF 00FF F8F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 FF00"
    $"FF00 FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
    $"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
    $"FFF6 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8"
    $"F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 FF00 0000"
    $"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
    $"FFFF FFFF FFFF FFFF FFFF FFFF"
};

resource 'ICN#' (128) {
    {   $"7FFF FFF0 8000 0008 8000 0008 8000 0008"
        $"8000 0008 8000 0008 8000 0008 8000 0008"
        $"8000 0008 D000 000A B000 000D 13FF FFC9"
        $"13FF FFC1 1355 55C1 13FF FFC1 13AA AAC1"
        $"13FF FFC1 1355 55C1 13FF FFC1 13A8 0AC1"
        $"13FF FFC9 93FF FFCD D000 000A A000 0008"
        $"8000 0008 8000 0008 8000 0008 8000 0008"
        $"8000 0008 8000 0008 8000 0008 7FFF FFF0",

        $"7FFF FFF0 FFFF FFF8 FFFF FFF8 FFFF FFF8"
        $"FFFF FFF8 FFFF FFF8 FFFF FFF8 FFFF FFF8"
        $"FFFF FFF8 DFFF FFFA 9FFF FFFF 1FFF FFFF"
        $"1FFF FFFF 1FFF FFFF 1FFF FFFF 1FFF FFFF"
        $"1FFF FFFF 1FFF FFFF 1FFF FFFF 1FFF FFFF"
        $"1FFF FFFF 9FFF FFFF DFFF FFFA FFFF FFF8"
        $"FFFF FFF8 FFFF FFF8 FFFF FFF8 FFFF FFF8"
        $"FFFF FFF8 FFFF FFF8 FFFF FFF8 7FFF FFF0"
    }
};

resource 'ics#' (128) {
    {   $"FFFE 8002 8002 8002 C003 DFFB 5559 5FF9"
        $"5A29 5FF9 DFFB C003 8002 8002 8002 FFFE",

        $"FFFE FFFE FFFE FFFE FFFE FFFF 7FFF 7FFF"
        $"7FFF 7FFF FFFF FFFE FFFE FFFE FFFE FFFE"
    }
};

resource 'ics4' (128) {
    $"FFFF FFFF FFFF FFF0 FCCC CCCC CCCC CCF0"
    $"FCCC CCCC CCCC CCF0 FCCC CCCC CCCC CCF0"
    $"FFCC CCCC CCCC CCFF FFC9 9999 9999 9CFF"
    $"0FC9 D9D9 D9D9 9CCF 0FC9 9999 9999 9CCF"
    $"0FC9 9D9D DD9D 9CCF 0EC9 9999 9999 9CCF"
    $"FFC9 9999 9999 9CFF FFCC CCCC CCCC CCFF"
    $"FCCC CCCC CCCC CCF0 FCCC CCCC CCCC CCF0"
    $"FCCC CCCC CCCC CCF0 FFFF FFFF FFFF FFF0"
};

resource 'ics8' (128) {
    $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FF00"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFFF F8F6 F6F6 F6F6 F6F6 F6F6 F6F8 FFFF"
    $"FFFF F8A5 A5A5 A5A5 A5A5 A5A5 A5F8 FFFF"
    $"00FF F8A5 F8A5 F8A5 F8A5 F8A5 A5F6 F6FF"
    $"00FF F8A5 A5A5 A5A5 A5A5 A5A5 A5F6 F6FF"
    $"00FF F8A5 A5F8 A5F8 F8F8 A5F8 A5F6 F6FF"
    $"00FC F8A5 A5A5 A5A5 A5A5 A5A5 A5F6 F6FF"
    $"FFFF F8A5 A5A5 A5A5 A5A5 A5A5 A5F8 FFFF"
    $"FFFF F8F6 F6F6 F6F6 F6F6 F6F6 F6F8 FFFF"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFF6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00"
    $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FF"
};

data 'NwtK' (0, "Owner resource") {
    $"00"
};

ISDN Config

ISDN Config ist ein Programm, welches die einfache Konfiguration sämtlicher ISTEC ISDN-Telefonanlagen der Firma Emmerich mit dem Macintosh erlaubt. Ferner kann man – auch automatisch – die Gebühren auslesen und in eine Logbuch-Datei wegschreiben lassen.

Emmerich liefert ja leider nur ein DOS-Programm zur Konfiguration mit und nachdem – nur für die Konfiguration einer ISTEC – ein kompletter 486er mit 17” Monitor fünf Stockwerke geschleppt werden mußte, kam mir die Idee, so ein Programm für meinen PowerBook zu schreiben…

Systemanforderungen

Um ISDN Config einsetzen zu können, benötigt man:

  • einen Macintosh mit 68020 (oder höher) oder PowerPC Prozessor.
  • Mac OS 7.0 oder neuer
  • eine ISTEC Telefonanlage 1003 bzw. 1008 (nunja, ansehen und ausprobieren kann man sich das Programm auch ohne ISTEC), wobei auch alle anderen ISTEC Anlagen unterstützt werden (soweit möglich)
  • Ein Verbindungskabel von der ISTEC zum Mac (eine Anweisung zum Selbstbau ist in der Anleitung von ISDN Config beschrieben)

Support

Bei Problemen mit der ISTEC Telefonanlage wenden Sie sich bitte direkt an Ihren Händler. Da es Emmerich inzwischen nicht mehr gibt, muß man sich an Hörmann Funkwerk Kölleda wenden. Und wie es scheint, haben die die ISTEC auch eingestellt.

Die Version 3.0 der Firmware kann ich leider nicht unterstützen.

Die aktuelle Programmversion

  • ISDN Config 2.1.1 (Neu: Support for die 2.1.3 Firmware der ISTEC, sowie Bugfixes damit die Firmware <2.0 wieder unterstützt wird)

PADI Tauchtabelle

This small Newton package allows to do the standard RDP (Recreational Dive Planer von PADI) calculations on an Apple Newton.

Warning! This program is only for training, not for planning real dives! It is not tested for real dives, but if you stuck in the Divemaster theory and want to check you RDP exercises, than this program is fine. Also don’t use it as a replacement for a real RDP: a Newton doesn’t work under water…

The current version:

Transfile Mac IQ

Dieses Projekt war die erste Zusammenarbeit von Christoph Pagalies und mir auf dem Macintosh – vorher haben wir ja schon auf dem Atari zusammen programmiert. Hier die Informationstexte von Yellow Computing:

TRANSFILE MAC IQ Grundlagen

Verbindet alle SHARP Organizer IQ–7000 bis 8500 und ZQ–5000 bis 6300 mit Apple Macintosh.

Passend für Sharp

  • IQ–7000, IQ–7100, IQ–7200, IQ–7300
  • IQ–7520
  • IQ–7700, IQ–7720
  • ZQ–5100, ZQ–5300
  • ZQ–6000, ZQ–6100, ZQ–6300
  • IQ–8000, IQ–8100, IQ–8300 und IQ–8500

Leistungsmerkmale

TRANSFILE MAC IQ verbindet die SHARP Organizer der Serien ZQ–5×00, ZQ–6×00, IQ–7×00, IQ–7×20 und IQ–8×00 mit dem Apple Macintosh Schnelle und fehlerfreie Übertragung in beide Richtungen Batteriesparfunktion schont die Batterien Ihres SHARP Organizers Unterstützt verschiedene Datenformate (BASIC, SYLK, Tab, Komma und Serienbrief) zum Datenaustausch mit anderen Programmen wie z.B. 4th Dimension, FileMaker Pro, MS Word usw. Beliebige Anzahl von Dokumenten und Fenstern gleichzeitig darstellbar Spezieller Editor zum Bearbeiten der einzelnen Datenbereiche auf dem Apple Macintosh Länderspezifische, frei einstellbare Datumsformate Leistungsfähige Druckfunktionen Ausführliches deutsches Handbuch und deutsches Programm Lauffähig auf System 6.0 und 7.0 Mindestanforderungen

läuft ab Macintosh Plus oder besser mit System 6.0 oder 7.0. Auf System 7.0 unterstützt Transfile aktive Hilfe für alle Menüpunkte und Fenster.

Lieferumfang

  • Interface-Kabel
  • Software auf 3,5” und 5,25” Diskette
  • Handbuch
  • Sprache (aktuelle Version): Deutsch (1.04) oder Englisch (1.04)

Bestellnummer: 2044 Preis: 199,00 DM *

Update Bestellnummer: 2744 Preis: 49,00 DM *

  • unverbindliche Preisempfehlung

TRANSFILE MAC IQ Flyer

TRANSFILE MAC IQ verbindet die SHARP-Organizer IQ–7000, IQ–7100, IQ–7200, IQ–7300, IQ–7520, IQ–7700, IQ–7720, ZQ–5100, ZQ–5300, ZQ–6000, ZQ–6100, ZQ–6300 sowie IQ–8000, IQ–8100, IQ–8300 und IQ–8500 mit dem Apple Macintosh. Es werden auch die entsprechenden RAM-Karten unterstützt.

Die Übertragung

Mit Transfile ist es möglich, sämtliche Daten der SHARP-Organizer schnell und fehlerfrei auf den Apple Macintosh zu übertragen. Der Datenaustausch wird dabei vollständig vom Macintosh gesteuert, eine Einstellung der Übertragungsparameter ist nicht erforderlich. Die auf dem Macintosh bearbeiteten Daten können natürlich auch wieder in den SHARP-Organizer zurückgeladen werden. Die Übertragung erfolgt nach dem original SHARP-Protokoll über den PC-Link-Modus der Organizer.

Die Batteriesparfunktion von TRANSFILE MAC IQ schaltet auf Wunsch den Organizer nach dem Ende der Datenübertragung automatisch ab.

Das Interfacekabel

Für die Verbindung der beiden Rechner wird das im Lieferumfang enthaltene Interfacekabel verwendet. Der Anschluß des Interfacekabels erfolgt an der Computer-Link-Schnittstelle der SHARP-Organizer. Am Macintosh kann das Interfacekabel an der Drucker- oder Modembuchse angeschlossen werden. Das zur Verbindung mitgelieferte Interfacekabel erhält seinen Strom direkt aus dem Macintosh und benötigt daher keine externe Stromversorgung, keine Batterien und keinen Strom aus dem SHARP-Organizer.

Die Software auf dem Macintosh

Die Daten der einzelnen Datenbereiche (Kalender, Terminplaner, Notizblock, Telefonlisten, Benutzerwörterbuch, Visitenkarten und Outliner) können auf dem Macintosh komfortabel bearbeitet werden. Die leistungsfähigen Funktionen des Programms werden durch das neuartige Konzept der Untermengenauswahl in ihren Anwendungsmöglichkeiten wesentlich verstärkt. Dieses Konzept der Untermengenauswahl gibt dem Anwender die Möglichkeit, bei vielen Funktionen auswählen zu können, ob diese Funktion auf alle, auf die markierten, auf die unmarkierten, auf die gefundenen oder auf die nicht gefundenen Datensätze wirken soll. Somit kann der Anwender bestimmen, welche Untermengen des Datenbestandes angezeigt, durchsucht, bearbeitet, … werden sollen.

Datenbanken und Fenster

Für jeden Datenbereich (Kalender, Terminplaner, Notizblock, Telefonlisten, Visitenkarten, Outliner und Ausgaben) eines Organizer-Dokumentes können eines oder mehrere Fenster geöffnet werden. Somit ist es möglich, mehrere Kalenderfenster zu öffnen, von denen jedes einzelne einen anderen Monat beinhalten kann.

Weiterhin können Sie soviele Organizer-Dokumente neu anlegen oder bereits vorhandene Dokumente öffnen wie es der Arbeitsspeicher Ihres Macintosh zuläßt. Dabei kann das Erscheinungsbild der einzelnen Fenster vom Anwender selbst definiert werden. Er kann für die Datenfelder separat wählen, ob diese im jeweiligen Fenster angezeigt werden sollen oder nicht. Der dabei verwendete Zeichensatz und die Schriftgröße kann unter allen verfügbaren Zeichensätzen ausgewählt werden. Somit sind der übersichtlichen Darstellung nach persönlichen Wünschen keine Grenzen gesetzt.

Der Kalender

Der Kalender der SHARP-Organizer wurde entsprechend in Transfile umgesetzt und verfügt über eine Tages-, Wochen- und Monatsübersicht. Alle Terminarten des Terminplaners können dargestellt werden: einfache Termine, Jahrestage, periodische Termine und tägliche Alarme. Durch Anklicken eines Datums in der Monatsübersicht können Termine für diesen Tag eingegeben werden.

Der Anwender hat die Wahl zwischen den verschiedenen länderspezifischen Formaten der Datums- und Zeiteingabe. Kann sich jemand mit keinem der bereits vordefinierten Formate anfreunden, so kann er sich sein persönliches Format selbst zusammenstellen.

Die Bereichsnamen und Freifelder

Die Bezeichnungen der drei Telefonlisten können frei gewählt werden. Weiterhin sind auch die Bezeichnungen der Freifelder der drei Telefonlisten und der Visitenkarten frei wählbar und können beim IQ–8×00 auch mit übertragen werden.

Der Editor

Zum Editieren der Daten enthält das Programm einen speziellen, auf die Bedürfnisse der SHARP-Organizer zugeschnittenen, sehr leistungsfähigen Editor. Mit einem Doppelklick auf den zu ändernden Datensatz gelangt man direkt in den Editor. Wie auf dem SHARP-Organizer kann hiermit ein Datenfeld mehrzeilig eingegeben werden. Der Editor erweitert das aktuelle Datenfeld dann selbständig um die gewünschte Zeilenanzahl.

Die Bearbeitungsfunktionen

Es stehen folgende Bearbeitungsfunktionen zur Verfügung: Suchen, Suchen/Ersetzen, doppelte Einträge löschen, Markieren, Editieren, Kopieren und Ausschneiden. Die Inhalte aller Datenbereiche sind immer alphabetisch bzw. chronologisch sortiert. Das Ausschneiden und Kopieren der Datensätze ist sowohl zwischen verschiedenen Datenbereichen als auch zwischen verschiedenen Applikationen über die Zwischenablage möglich.

Beim Speichern im Transfile-Format können geheime Daten mit einem Kennwort verschlüsselt abgespeichert und so vor unbefugtem Zugriff geschützt werden.

Der Datenaustausch

Die Daten der SHARP-Datenbankdokumente können von Transfile in den verschiedensten Formaten gespeichert oder gelesen werden. Damit können die Daten schnell und bequem auch in anderen Programmen verwendet werden. Transfile erlaubt das Einlesen oder Abspeichern in den Formaten BASIC, SYLK, Tab, Komma und Serienbrief. Bei den Export- und Importfunktionen kann die Reihenfolge der Datenfelder innerhalb eines Datensatzes beliebig festgelegt werden.

Natürlich können die Daten mit Hilfe der Zwischenablage auch direkt in andere Programme übernommen werden. Mit diesen Import-/Exportfunktionen können die Daten ohne Probleme zwischen FileMaker Pro, 4th Dimension, MS-Word, Hypercard, etc. und dem SHARP-Organizer ausgetauscht werden.

Die Druckfunktionen

Mit Transfile können Sie die Daten der SHARP-Organizer auf jedem beliebigen Drucker in übersichtlicher Form ausgeben. Die Ausgabe kann mehrspaltig mit oder ohne Feldnamen und Seitenüberschriften erfolgen. Der Kalender erzeugt für jeden Monat eine einseitige Druckausgabe mit grafischer Darstellung der vorhandenen Termine.

©1992 Yellow Computing, Bad Friedrichshall