Vor einigen Monaten wurde ein Patch von mir abgedruckt, mit dem das zu MultiTOS gehörige „GEM.PRG“ so verändert wird, daß es auch mit einem MC 68010-Prozessor korrekt arbeitet. Leider war dies nur für KAOS-TOS-Besitzer interessant, da das TOS 2.06 von ATARI die Variable „_longframe“ an Adresse $59e nicht wie KAOS mit der Nummer des Prozessortyps (0,10,20,30,40) beschreibt; außerdem hat TOS 2.06 denselben Fehler bei der Prozessorabfrage wie der eingebaute Desktop des „GEM.PRG“, so daß bei eingebautem 68010 von einem 68020 oder 68030 ausgegangen wird und das Programmieren des beim 68010 nicht vorhandenen Caches zu einem illegalen Befehl führt. Der folgende Patch zeigt, wie einfach es ist, den Fehler zu beheben, so daß es schön wäre, wenn ATARI diesen Fehler beseitigen würde! Außerdem arbeitet ein gepatchtes Multi-TOS auf Basis eines ebenfalls gepatchten TOS 2.06 nun auch mit einem 68010 zusammen.
Nun zum Patch:
An drei Stellen im TOS müssen Änderungen vorgenommen werden:
$E1A9BE tst.w $59e.l ; $4a79, $0000, $059e
$E1A9C4 beq.b $e1a9ea ; $6724
muß ersetzt werden durch:
$E1A9BE cmp.w #20,$59e.w ; $0c78, $0014, $059e
$E1A9C4 bcs.b $e1a9ea ; $6524
weiterhin wird:
$E003C4 sne $59f.w ; $56f8, $059f
ersetzt durch:
$E003C4 move.w d1, $59e.w ; $31C1, $059E
Auch die Prüfsumme an Adresse $E3FFFC muß angepaßt werden:
TOS 2.06 original ATARI: $6f450ab6 wird zu $64a15ad3
TOS 2.06 gepatcht mit „WIN22.PRG“: $742fae89 wird zu $7fcbfeec
Christian Fuchs
Das Problem dieses Einzuges sind die metallenen Zentrierungsführungen am unteren Ende des Einzugsschachtes. Werden die seitlichen Führungen soweit zusammengeschoben, daß sie den Papierstapel korrekt führen, hakt sich das oberste Blatt in der Zentrierung fest und kann nicht mehr eingezogen werden. Lassen die seitlichen Führungen allerdings dem Papier Stapel soviel Platz links und rechts, daß das Papier sich nicht mehr verhakt, so verrutschen die obersten Blätter und werden dann schief eingezogen. Abhilfe schaffen zwei kleine Distanzstücke (z.B. aus Pappe), die links und rechts innen an die seitlichen Führungen geklebt werden und diesen konstruktiven Mangel beheben. Vielleicht leiden noch andere Einzüge unter ähnlichen Problemen - der Einzug des NEC Pöplus benötigt das abgebildete Distanzstück.
Je glatter die Oberfläche der Distanzstücke auf den Innenseiten ist, desto besser läßt sich daß Papier dann einziehen. Dazu genügt es z.B., stark geleimtes Papier aufzukleben (gibt es in Schreibwarenläden oder solchen für Zeichenbedarf - stolze Besitzer eines Plotters sind hier fein raus, wenn sie Plotter-Papier verwenden.)
Thomas Müller
Beim Umstieg von TOS 2.06 auf ein „alternatives Desktop“ steht man mitunter vor dem Problem, daß es keinen Drucker mehr gibt, dem man mal eben eine Datei „unterschieben“ kann. Nun funktioniert aber z.B. der Epson-Druckertreiber aus Multi-TeX nicht mit CrazySounds. Druckt man jedoch in eine Datei und schiebt diese auf dem Desktop zum Drucker, dann gibt es (warum auch immer) keine Probleme, und man kann CrazySounds aktiv lassen.
Das folgende mit Pure C erstellte Programm ersetzt ein fehlendes Druckersymbol, sofern Sie die Möglichkeit haben, Datei-Icons auf dem Desktop abzulegen. Compilieren Sie dazu das Programm und nennen Sie es z.B. DRUCKER.GTP (TTP wäre falsch, da Alert-Boxen verwendet werden) oder einfach DRUCKER.PRG (zwar theoretisch falsch, die Kommandozeile wird aber trotzdem übergeben). Malen Sie sich ein hübsches Drucker-Icon, das Sie dem Programm zu weisen, und legen Sie das ganze auf dem Desktop ab. Melden Sie es am besten so an. daß eine daraufgezogene Datei mit vollem Pfad übergeben wird, um eventuelle Probleme zu vermeiden.
Das Programm meldet sich nach 5 Sekunden, wenn der Drucker nicht mehr reagiert. Man kann dann z.B. ein neues Blatt einlegen oder aber den Druckvorgang abbrechen. Der Zeitwert (250) läßt sich natürlich ändern, dabei entsprechen 50er-Schritte einer Sekunde. Man sollte den Wert nicht zu niedrig wählen, damit der Drucker Zeit hat, seinen Puffer zu leeren und man nicht ständig mit einer Alert-Box genervt wird. Außerdem kann anderen Programmen währenddessen Rechenzeit zugeteilt werden. Unter MagiX! macht sich der Druckvorgang so praktisch nicht bemerkbar (mal abgesehen vom Ausdruck).
Man kann die Ausgabe natürlich auch via GEMDOS tätigen, bei mir gibt’s aber unter MagiX! keine Probleme mit den BIOS-Funktionen. Für die GEMDOS-Ausgabe (die wesentlich langsamer ist) muß man lediglich folgende Befehle ersetzen:
char item
ersetzen durch
unsigned char item,
Bcostat(0)
ersetzen durch
Cprnos(),
Bconout(0, item)
ersetzen durch
Cprnout(item)
Mit der Ausgabe via fputc gibt es dagegen gerade beim Ausdruck von TeX-Dateien jede Menge Fehler (verträgt wohl die Grafik-Codes nicht).
Sven Kopacz
/* EC_PRINT */
/* (c)1994 by MAXON-Computer */
/* Autor: Sven Kopacz */
#include <aes.h>
#include <tos.h>
#include <stdio.h>
main(int arge, char *argv[])
{
/* Der erste Eintrag der Kommando-Zeile steht in argv[1]
Wenn's überhaupt einen gibt. Anzahl der Einträge (incl.
argv[0]) steht in argc, sollte mindestens 2 sein */
int ap_id, handle, cont, time;
size_t got, one;
char item;
char *doprint, *anofile, *anready, *aeropen, *aerfile;
doprint="[2][Datei drucken ?][ OK |Abbruch]";
anofile="[1][Drück mich, ich |bin der Drucker ! ][ OK ] ";
anready="[1][Bitte Drucker |bereit schalten. ][ OK | Abbruch]";
aeropen="[3][Datei konnte nicht |geöffnet werden.][Abbruch]";
aerfile="[3][Fehler beim Lesen der|Datei.][Abbruch]";
ap_id=appl_init();
if ((argc>1) && (ap_id != -1))
/* Wenn überhaupt was in der TTP-Line war...*/
{
handle=open(argv[1], O_RDONLY);
/* Datei öffnen */
one=1; /* Immer nur ein Byte lesen */
cont=1; /* Rückgabewert vordefinieren */
got=1;
if (((form_alert(1,doprint)) == 1) && (handle != -1) )
{ /* Wenns was zu drucken gibt... */
while (((got=read(handle, &item, one)) == 1) && (cont == 1))
{ /* Ein Byte aus Datei geholt */
while ((Bcostat(0) == 0) && (cont == 1)
{ /* Solange Drucker nicht bereit... */
time=0;
while ((Bcostat(0) == 0) && (time < 250))
/* Timeout, 50=lsek */
{
/* ...5 Sekunden prüfen... */
evnt_timer(20,0);
/* (wichtig für Multi-Tasking) */
time++;
}
if (Bcostat(0) == 0)
/* ...und Beschwerde ablassen */
cont = form_alert(1, anready);
}
if (cont == 1)
/* Zeichen an Drucker */
Bconout(0, item);
}
close(handle);
/* Fertig - Datei schließen */
}
if (handle == -1)
/* Melden, falls Abbruch wegen Fehler */
form_alert (1, aeropen);
if (got == -1)
form_alert(1, aerfile);
}
else
/* Drucker ohne Parameter aufgerufen */
form_alert(1,anofile);
if (ap_id != -1)
/* Das war's */
appl_exit();
return 0;
}