NNNNNNRDp NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN<+O  @! #@')+-/1 3o79;=?A C@E`GIOQ S@U`WY[_a c@e`gikoq s@u`wy{} `` @ ` @ ` @ ` ǀ ɠ o @` @`!Aa  !Ao!O%aO  @! #@')+-/1 3o79;=?A C@E`GIOQ S@U`WY[_a c@e`gikoq s@u`wy{} `` @ ` @ ` @ ` ǀ ɠ o @` @`!Aa  !Ao!O%aAUTO jFASTDISK oFILECOPY tPROFIL x%SPEEDER KTASKCOPY FCOPY 2_0PROFDISK77 FORMATERORDDESKTOP INF F *LEES DITC&+&g A k$gB@A2@Pd@dH H ??<+NAXGp/apkLCJ@g(p;.GaZk6CB+J@gGaDk CXAB@HPP??<-NAX`?< NA\G#aR0:fa?BWNA?p//?<NN NuGua(v CBB92B Bd2GaG|`NPBdg2GmaGI`8G)`2B fG`&VBeB dA,J6p `vG[aG5av2|xaVE@xaFaDXa@8Sf 6ava,a`E:aZa"aVG&0000arGa`kBNuG6&G&0000aJG&0000a>Ga,QBNuG6&T&0000BaGaNu/ ?< NA\NuB0H@0 9o^B@H@fNup @v A0@IGa0@IGa0@PG @de@daNu p0@@v A0@IHGax0@?IGaf0GaZNuaD6<` ??<NAX?<NAT @ g* @ e,2@0 @ b @oc`oepNuJCkB@NupNuGgGa0@G @g>G @g$U@n Gg]aGgZaGaGgZaNuAD"x(f-NuY&&D0 00000000&:::A0 ='NSSP &NUSP ,NADDR+NINST)NSR (NPC 1$DumpY.:Prozessor-Y.:Peripherie-DatenAnweisungsleseschreibzugriff, UserSupervisorInterruptvektorzugriff?????? Y$(Letzter Bombenerfolg durch Busfehlerungerade Wortadresseunzulssige AnweisungDivision durch Nullchk - Anweisungtrapv - BefehlPrivileg-VerletzungTrace ohne geeignete Routinea... - Anweisungf... - Anweisungnicht initialisierten InterruptFehler statt VektornummerAutovektor-Interrupt Stufe 0trap #00Interrupt mit Vektornummer $00Eb1Y5$V1.2 25.9.1987Y6#Spaghetti-Fan-ClubY7(NrnbergY!( KB RRR-Disk mit Ausfhrungsprofil als Drive pA:q installiert.Y48Floppy - Hochlaufzeiten :Y6@Lesen 0.00sY7@Schreiben 0.00sEb1Y#&pRamdisk zerstrt, Speicherkonfiguration anders oder Fremdprogramm.Y%AReset?q [JjYy]fY5\Datum: 0. 0.00Y6\Zeit: 0.00:00Y7[in Ordnung? [JjYy]Y5ceY7[KY5c Y5e. Y5h.KY6c Y6e. Y6h:K W.%;O_n0/2/"zAt`0/BA"zAzfNU@d>0|00(Jk.pQ01|0<JAg0<xrHAxkSjN0/"zx @ d\zdg8N2/ A o4CPB0/ JofHBeSA""""QBNuASAQ`A Nu @&dLH0;NPp.anAJfB 0 g0<BQBNupNupNu2|$a f"x1i,2k1|Ns&,`2|A~0NJfJhg AD"`2|ag2|$af"x3zZ,` AfA>"BNuA@ Nu :,NuH瀀A.R / i@ @dRpLN`` #d?<NNTA0fpahA1z1z0:@2D!A2A IIRAAd0RA0A\A0AH0B?< NAT.v7A6"z&Vg *.lfX : %@.%@6%@N *rRAf%@"z2"r"v"~v8A"Q6<BQF'.Z RNGa?<NAT@ Jg YfdB ` z (vfC2%IrC %IvC%I~G *2%@+Cv aNCGaBG a:GVa(?< NAX0:"faBWNA?p//?<NN Nu/ ?< NA\NuB0H@0 9o^B@H@fNuEY*@V1.2 25.9.1987Y+?Spaghetti-Fan-ClubY,DNrnbergY!1 KB RRR-Disk als Drive pA:q installiert.Y48Floppy - Hochlaufzeiten :Y6@Lesen 0.00sY7@Schreiben 0.00sEY!1pRamdisk zerstrt. Reset?q [JjYy]0/2/"zAn`0/BA"zAzfNU@d>0|00(Jk.pQ01|0<JAg0<xrHAxkSjN0/"zxzjg8N2/ A o4CVB0/ JofHBeSA""""QBNuASAQ`A$ Nu. o.. FASTDISKDOC 9F XFASTDISKPRG =F  +-------------------------------------------------------+ | FASTDISK - Formatierprogramm fr Schnelladedisketten | +-------------------------------------------------------+ ein Public-Domain-Programm des Spaghetti-Fan-Club Nrnberg ______________________________________________________________________ Die Formatierfunktion des Betriebssystems schreibt immer den Sektor 1 an die erste Stelle nach der Indexmarke, also Spur 0: 123456789 Spur 1: 123456789 Spur 2: 123456789 Dateien, die auf eine neu formatierte Diskette geschrieben werden, legt das Betriebssystem auf aufeinanderfolgenden Sektoren mit aufsteigender logischer Sektornummer an. Besonders Anwenderprogramme sind hiervon betroffen. Beim Laden dieser Programme werden die Sektoren einer Spur in aufsteigender Reihenfolge gelesen, also beginnend mit Sektor 1 bis z.B. Sektor 9 bei neun Sektoren pro Spur. Danach erfolgt Spur- bzw. Seitenwechsel mit anschlieendem Lesen eines Sektoradrefeldes zur berprfung der neuen Spur. Bei normaler Formatierung ist dies Sektor 1 oder Sektor 2 je nachdem, ob Magnetkopf und Controller rechtzeitig aktiviert wurden. Um nun diese Spur auszulesen, mu Sektor 1, der eben erst den Magnetkopf passiert hat, dort wieder vorbeikommen, was fast eine ganze Umdrehung erfordert. (Lesezeit zwei Umdrehungen pro Spur, Intervall 0,4s/0,8s zwischen zwei Kopfschritten einseitig/zweiseitig) Bei 9 Sektoren/Spur kann man durch eine nderung des Betriebssystems (Spurpositionierung ohne Verifizieren) Abhilfe schaffen, da zwischen Sektor 9 und Indexmarke gengend Zeit ist (20ms), um die Spur zu wechseln und Sektor 1 der folgenden Spur rechtzeitig zu erreichen. Bei 10 Sektoren/Spur ist die Zeit dafr zu kurz, das Adrefeld von Sektor 1 der folgenden Spur kann nach Step und Kopfberuhigung nicht mehr gelesen werden, was auch wieder eine Extrarunde bedeutet. Auerdem ist bei einem ROM-Betriebssystem die nderung schwierig. Eine andere Mglichkeit der Beschleunigung von Diskettenoperationen ist, beim Formatieren Sektor 1 in einem vorher gewhlten Abstand vom letzten Sektor der vorhergehenden Spur anzulegen, mglicherweise auch abhngig davon, ob dabei der Zylinder oder nur die Seite gewechselt werden mu, also z.B. Spur 0: 123456789 Spur 1: 891234567 Spur 2: 678912345 (Abstand 3) Dabei findet der Spurwechsel jeweils ber Sektor 8 der folgenden Spur statt, Sektor 9 dient zum Verifizieren der Spur (dazu reicht ein beliebiges Adrefeld eines Sektors) und beim folgenen Sektor 1 kann sofort weitergelesen werden. Bei 10 Sektoren/Spur kann ein langes Programm nun in 0,48s statt in 0,8s pro Spur geladen werden, wobei allerdings der Zugriff auf FAT und Verzeichnis und das Lschen des RAMs hinzukommen. Da mit dem Betriebssystem die Erzeugung eines solchen Diskettenformats unmglich ist (die erste Sektornummer nach der Indexmarke ist nicht whlbar), mu dieses Format unter Zugriff auf den Floppy-Controller WDC1772 am Betriebssystem vorbei erzeugt werden. Genau dies macht FASTDISK und bietet dazu noch einige andere Mglichkeiten: + whlbare Anzahl von Spuren + whlbare Anzahl von Sektoren/Spur + einseitig/zweiseitig (nur auf zweiseitigen Laufwerken) + Einlesen und Anpassung eines ausfhrbaren Bootsektors + Erkennen von defekten Sektoren und Markierung in FAT, falls mglich (wurde erfolgreich mit absichtlich falsch formatierter Diskette und 159 defekten Sektoren getestet, aber man sollte keine wichtigen Daten auf einer Diskette mit defekten Sektoren speichern) + Seriennummer immer als Zufallszahl zur korrekten Diskettenwechselerkennung Die Erzeugung einer zweiseitigen bootfhigen Systemdiskette mit 80 Spuren/10 Sektoren ist damit problemlos mglich durch: Einstellen der Parameter Spuren/Seiten/Sektoren Einstellen der Versatzzahlen (Skew/Interleave, siehe unten) Einlesen des Bootsektors von der vorhandenen Systemdiskette Formatieren der Zieldiskette ( ist nun die richtige Diskette im Laufwerk ?!?) dateiweises Kopieren der Systemdiskette (TOS.IMG zuerst) *** BEDIENUNG DES PROGRAMMS + wo angezeigt, kann mit CTRL-C das Programm beendet werden (gengend hufiges Drcken der Tastenkombination hilft immer!) + Bedeutung der Funktionstasten: Taste Name Funktion F1 Spuren Einstellung Anzahl der Spuren (sinnvoll: 80 - 83) F2 Seiten Umschaltung einseitig / zweiseitig F3 Sektor Einstellung Anzahl der Sektoren pro Spur (sinnvoll: 8 - 10) F4 FAT-S. Umschaltung 5 FAT-Sektoren / minimale FAT (2|3 S.) F5 Dir.-S. Einstellung Anzahl der Sektoren fr Verzeichnis (Directory; sinnvoll: 3 - 7) F7 Bootd. Standardversatzzahlen fr TOS.IMG-Diskette F8 Prog-d. Standardversatzzahlen fr Programmdiskette F9 Eint. Einstellung der KB-Einteilung F10 Vers. Einstellung der gesamten Versatzzahlen + unsinnige Werte bei Spuren/Seiten/Sektoren geben spter Fehler oder werden nicht angenommen: noch einmal mit sinn- vollen Werten wiederholen. + Bedeutung der Versatzzahlen: Spur: Abstand letzter Sektor - 1. Sektor folgende Spur (Zylinderwechsel) z.B. 6789A12345 Spur 3/Seite 1 | 4 | Versatzzahl 4 3456789A12 Spur 4/Seite 0 Seite: Abstand letzter Sektor - 1. Sektor andere Seite z.B. 89A1234567 Spur 3/Seite 0 | 3| Versatzzahl 3 6789A12345 Spur 3/Seite 1 Sektor: Abstand Sektor - Sektor mit der nchsthheren Nummer (konventioneller Skewfaktor/Interleave) z.B. 162738495A ; Versatzzahl 2 ^ ^ ^ 1852963A74 ; Versatzzahl 3 ^ ^ ^ Der Wert 0 hat eine Sonderbedeutung: Bei ungerader Anzahl der Sektoren pro Spur ist er gleichbedeutend mit Versatzzahl 1, bei gerader Anzahl von Sektoren steht er fr das clusterorientierte Format mit der Reihenfolge 1278349A56 "".."".."".."".."".. Dieses Format ist nur sinnvoll mit einer ungeraden Anzahl von Sektoren im Verzeichnis, denn nur dann ist die Anzahl der Systemsektoren Boot + 2*FAT + Dir. gerade und die groen Abstnde liegen an Cluster- grenzen. Die fr ein bestimmtes Anwenderprogramm und seine erzeugten Dateien optimalen Werte mssen durch Probieren herausgefunden werden. Die Voreinstellung von FASTDISK hat sich beim Laden von TOS.IMG (6.2.1986) als geeignet erwiesen. TOS.IMG braucht zum Spurwechsel beim Laden etwas mehr Zeit als Anwender- programme, weshalb an den ersten 200 KB ein grerer Spur- versatz verwendet wird. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FASTDISK.PRG ist ein Public-Domain-Programm des Spaghetti-Fan-Club Nrnberg und darf mit seiner Beschreibung beliebig weitergegeben werden. Auch die Beseitigung von Fehlern im Objektcode oder Einsen- dung von Fehlerberichten an unten erwhnte Adresse ist immer erwnscht. Der Sourcecode (ca. 1500 Zeilen 68000-Assembler) mit den etwas vernderten FDC-Routinen aus unten erwhntem Floppybuch (statt in Basic nun in Assembler und nach nderung einiger globaler Variablennamen auch in C verwendbar, etwas verkrzt und optimiert) ist erhltlich bei +-----------------------+ | Wolfgang Windsheimer | | Johannisstrae 62 | | 8500 Nrnberg 90 | +-----------------------+ unter Einsendung von + ausreichend frankiertem Briefumschlag mit formatierter Diskette (einseitig oder zweiseitig, aber max. 81 Spuren, Panasonic JU363 schafft nicht mehr) + Aufkleber mit eigener Adresse und ausreichendem Rck- porto (fr einfache Bearbeitung) + 20.- DM als Unkostenbeitrag und Anerkennung fr FASTDISK.PRG Das Programm ist nicht mit ROM-TOS und auf der MEGA-Serie getestet. Es sollte jedoch auch dort funktionieren, da nur offizielle Systemtraps und Hardware-I/O-Adressen verwendet wurden. ______________________________________________________________________ Verwendete Literatur: Braun, Dittrich, Schramm/ ATARI ST Floppy und Harddisk (Data Becker) Brckmann, Englisch, Gerits/ ATARI ST intern (Data Becker) `@@ o ( ШШO//Bg?<JNA GV&P6 HyN XGVaa2aBapa`G!AR( 0H/?N\A0<0JfHhN X SmHyN XA=aGV @gH@@; @ d@0;N4 j?`BgG?< Y?<RW/|N 2SAoH6 [e\`(Jof/| N 2SAo6TPo o0c Sm `A 1|`A 1|`/< /< N 2SAo @TdJ@g6Pa`B@+S@jp@A PgT@0aa`A Pg0`p+0`/< /<@N 2SAo J@g3 Pa`x/< /<N 2SAo @ dJ@g7@Pa4`LHy?N\< Hy`0p1+A@ /`Hy?+N\< HyN XNuA(0(` A0(<0@ /`GVAadfRAaXaETAHBP%H %|4a yTf 09T@g A]a`HyN X/< /< 1N 2P fagHyGN X`A6 0<~BQA02< ?| ?|NN?9RW?<ET/ %|H 4%| Rj0*kca2$W5|4a$W0* @\fH j f@Jog SonSogm2%|J ?y`%|R ?y `HyhN XP# TaA /!| ?+,N\Aag`/N X/<NA.HyDN X  Jg YNuBgNAA0XXF@7@'X7P B B+ETB,$ a~ByTat9TNuA 0+k7@PPl7` '`J+g(3 TyT a0kf 0+kpNu0+kRk 0+ Sd3TapNu?<HyT$W4A0%H5|a$W2*k*e0* @Df4~5|%|/ 5G%|N,a$WB, jf0* @fJk.jRGkc\B@NuSolxRk, k ,fAad$Wg\Nu2+Go.VAA6Ie `p`Sol$\AaNuHy?<&NN\Nu j "|4<V3Nu1Qq$*0`T6xET3>BjB0A0@H0;NJj0gBy>Nu:0aaNu04*a:{`:v`:q`:l`:l0a$*,gH BNLNu4<QNu$* aZ5|2000t a04*a:0axaaFNu$*a5|2000taN:`$*$a000ta.0?* W"j(:aa.JjfSWnTaNu$* a5|2000t a04*a:`0aaaNu$*af5|2000ta:/`0a@5@`0a@5@0Nu0av|5@ Nu04*|aP`%BBBBB0*Ъ%@Nu0@5@B(J((%B5BNuaB1BaNua0(rQNu2<Q"< R f"<A(sg*So4Jj2gB(J((maBj20(@5@ Nu0(@5@ a5|Nu0atJkNu4*faRj0FB@||(@FNu/ &o` ?/<NM\B@f&_NuBg?/ W ?<Y/a NuHHy4aX&o?/?/>/aRWaX`do Я/a?< /<NM\aX`6ހHy9aXB LNuHHy4ar.F/9B0/ @$d @ b /|`|9//>/SGe//aFX?< /<NM\Q//a*XB>/SG/<NMX On2OAJIdrVWgrWf`2?0" HA HABA܁H܀/<NM\Qr`BBA>Hy9aX 2PLNu2/"op @0@IAaD0@IAa60@PA 0m 9n@lT` @de@da Nu oB0/ H@0B@H@fNu2/"o p0@@0@IHAa0@?IAa0AaNu o"/HAB0g 2HA0 2H@@0HAfNuEY4%FASTDISK - Formatierungsprogramm fr optimierte Schnellade-DiskettenY6)V1.1 28.5.1987 Spaghetti-Fan-Club NrnbergY%VCursortaste: keineY&Vnderung an dieser StelleY(XProgrammende mit CTRL-CY"!Spuren: Y#!Seiten: Y$!Sektoren/Spur: Y"ZFAT: SektorenY#ZDir.: SektorenY!5Versatz: Spur Seite SektorY8!pSpuren Seiten Sektor FAT-S. Dir.-S. Bootd. Prog-d. Eint. Vers.qY(:Besttigung mit Y"4 ab KB : Y8 KY($mit speziellem ausfhrbarem Bootsektor? [JjYy]Y(#Diskette mit diesem Bootsektor in Lw. A einlegen und eine Taste drckenY($Bootsektor konnte nicht gelesen werdenY($Sind die Parameter in Ordnung? Y)$pIst die richtige Diskette in Laufwerk A ???q (42195 eingeben)JY,0Spur / : Y.* defekte Sektoren. Weitere Diskette genauso formatieren?Kl Diskette ist schreibgeschtzt.Y,*Fehler beim Schreiben von Bootsektor oder FAT !!!Y,*Fehler beim Formatieren oder Verifizieren. Weitermachen?Y,)Schon 10 defekte Sektoren. Weitermachen?epfq //@6`V07W , @&("0(       $B f   " (4D LJ $4^F ~V. t.. FILECOPYPRG E8`8BQ` Efv*oM m HPHUBg?<JNA(m)m -:gS)@ -OK1C#hNfHx?<HNA@)@l/?<HNA)@h&@)@X)@\Ьl)@d)@`ANCpr Ѝ"QHNXALNHz.?< NA\pdAxr0XQNN*VXXdvvN~ ,`NuJrBjCAp$L Qp NBlJpNNpMN9@pdAr 0Q0tr N9lNupeaZp` aN\BgNA`C2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNtrҌpsNB0,Nu9@NtrDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu  2$NuE`B<gJEgEjCDEDF Fe" F dF8BCHC` F0b(v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@NV?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NhJFkSFk&aQNh`Ha"FFaQL8N6.JgtBnNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?N<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`HQ2: A d@C 5e*!R 0c 9c0`<R"_`^2:C0 Ef"_NuHQN(aCr  g 00VJAgB @ nN @mHJ@j0.4DBUBk0QSAg Q.`S@k 0`0BAF "_Nu.WAkQA" 0g` @eA0Nur$g4jDk( b4<J@`@[H@0Nu4<Ѐ[Nu4<NuNuAd RdQRBBkBjDBJjDNupNufJj fJAkNupNdRdRrxaAffBWHNuJjDBDA@JBfprJjDEDD@JEfvxNuaغBffAVHNuCDEaEf fDUHNu]HNuCDEaEffDftNu"l`Qd&&|-KNuN~"l`Qep[N c R nPNu _\-KNE`$@Hz ?<&NN\Nu NuNNp `p ap Cdpln<,(AL$I"vz x `gfURf~QjJFj4\Fk.aNHS&I.Nt`p???<NM\Qj&_Nu|HQ/??<@NAXXfNuJkp%NNu09JBfNu <r$<Nup`pN @ddAgH`p`p9@(9@*BlNuNCpNEN`p`pN0<9@:, INJ@g@8 FN EdbAJfE @e4r$Wf"FANuPRN:LST:AUX:CON:MID:IKB:VID:,J@fC E& B Og& Rgl Ag@ Ug2 Ig $CpNp=`pNAXJ@jNNu?Hl?<6NAP0,NuNJ@g,A,BBgHQ?<=NAP FJ@k??<>NAXtNutNuJ@jD@vqapvN )@p `H@)@prtNAHplrtNB 2pNpNpapaprapalpalpalpaTpaTpaTBp'a?<NNT@B){L9|0<rtNpapap9@p`pvN v`v`vj`v `v`v`v`?Aa*` Al 2l 4)lVH)lRprtNAl 2l 4HVNuAl 2l 4L VA0000000000prtN0<}N& ?<NNC`&?<NNT"@ C <}NtNT(* 9AJA)H@@[000][ˈN Evz`* [g" ]g |g QSz` zQSpQ][ɈN Dvx`* [g" ]g |g QSx` xQSpQ]Bp4NHNu*( INA)H @depd ae zb QB DNA\)H @ e` ae zb \gQBA BhNpZNA BP"`#|}NA"H0,tg"Hg \f`A\fS A ENAR@H`2QNur|<N @xepw2A$JBjDFHB t`0QBl9F)lVTAtp 9| N2(g"P@g2RADAH""l`r2oZAe 1@#)I`Nuk1@Nup NN~"l`dpNAtrdJhk\QpaNH ld$l`"Hg: k&@0+R`g k#&@0+S@H3 Q&f)I`LNuApNNV$Nf$BS@kH2QNupC ұd"X0Pg"RA$D#Nu"X0Nu _0HpN _0HpNp"_0HqNp"_0HqNE ұeHHQ0)N$_$ZR@H`2QNu$Y0gHR@@"D%$X0P2g# R@%NupE $ $X0dP.gRG,D%pr Y2dP.gRG,D!p4Ae4v`VfANuNWHNuNVHNu Ihd"*Nf$E8*$R`"QˈN ENu(* 0(iNf$E 4R`Q$D 4R`QˈN DN ENu2p <0Nf`QNur ,* N& ( EN C"Sj|AcJ@fCAHPBHQ?NA\ _JjNNuH&NրN𘶀jNuHRp` HRpJQfpNzNq Y QfdЀЀ 0NuNjNdNq Y Qfd ЀЀNuNdNj$_& Y Qfdփփ!8NNhNb$_& if"QdփփHRNTNbNh~,Nq8DRzXEEg"7PNqR$HBJBgpNJgJigp`eetЂ`"ЀeЁdp`ЀeЀe"Ѕe$W.H@@NL"2` NqR YEjrd0` SjNp"X4g S`"QNuNuNJPgBP, d4d<e<Ѐ"ЀЁE Y0gR@2DAH!b` `ЀЀ`Ѐ"ЀЁE. l ,`2"X2g,e($UAk&QHPS Y2g RSj _b l ,"X2geb J"F\NT" KC`e N~`d \N l\Ӭ\ NupNd d3 d# d# # d# # # # d# # # # # # # # dB` # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # QNudd2d"d""d""""d""""""""dB` """"""""""""""""""""""""""""""""QNu?k?<NM"UAf J@fH@NuDW?<NMXNu0,p2,rR@RANuS@SA9@p9ArNu9@pN4, 6fprta0,2,NuA4, 6f9@9Ap rt`"p`tdbBA0Hg:<R@f|0Nf*JFk*HQ/??<?NAXfX ENuJkpNp`p`\F( &I.` ??<NMXJ[j E&DkNuak NupNuakfpNupNtddA0oH?<?B?<BNA Jk.,?<?B?<BNA *kBg?/?<BNA JkNuNp`pNu)H9@Jp4N9|&J&f H LNu9|&Jl&lHByeC! B,&LNu-W)K20, 8k8@ gJl&f"Nu , 8g"P 8 @/, 8NV  8fQ 8J,'gNupB <``L@ H)l26)z @W , Jf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C]fApN`NHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Fehler # ][Abbruch]\f*&lX)K\)ld` lp ,BQjNup(NT"l`Yd&-KNN~"l`YepN&#k"C-KN"Cփk փk2##`փk##`3#`$Y8gHRDD*D%H8#$c2g# HRDD%H`C ҳfHP0(Nf$W$RR@H`2Q"H _$l` dd" $X&0BP6Y&|Hg R@@%E ҳeHQ0)N$_$RR@H`2QNu$Y 0P1@Hg R@@%NuN~$l` epZNA7*NVNprNFNF Features: NNprNFNF; - ldt bis zu 100 Dateien auch von verschiedenen DiskettenNNprNFN80 - ignorieren der gerade geladenen Datei mglichNNprNFNFC - bei 1 MB RAM stehen fr die 100 Dateien ca. 850 KB zur VerfgungNNp rNFNF; - bestmgliche Ausnutzung des RAM, wenn lange Datei nicht %NNp rNFN8< mehr reinpasst knnen krzere Dateien noch geladen werdenNNp rNFNF9 - Dateien knnen mehrmals und auf verschiedene Disketten4NNp rNFNF? gespeichert werden auch beim Speichern kann ignoriert werden4NNp rNFNFE - es knnen Dateien auf der Zieldiskette gelscht werden, wenn diese4NNprNFN8F zu wenig Speicherplatz hat oder es wird auf andere Disk gespeichertNNprNFN86 - auf der Zieldisk vorhandene Dateien gleichen NamensNNprNFN8< knnen beim Speichern berschrieben oder umbenannt werdenNNprNFN82 - kinderleichte Bedienung fast ausschlielich mitNNprNFN82 der Maus, weil sich das Programm selbst erklrtNNprNFN8F Das Programm ist Shareware, also frei kopierbar. Der Autor erwartetNNprNFN8F allerdings ein Honarar von DM 20.- (an obige Adresse) von jedem Be-NNprNFNFE nutzer des Programms, die dann den Update-Service beanspruchen und4NNprNFNF; auf Wunsch eine ausfhrliche Anleitung bekommen knnen !!N <w"<N <"<hN <"<NN, TASTE DRCKEN4NpNNA7*NVpcCXNpcC^NpcCdNpcCjNpcCpNB*B.B2NpNNHxN,SLegen Sie die Disk ein von|der die zu kopierenden Da-|teien geladen werden sollen !4HPN OKAYr"_ N4+@6 -2JWHfN&B2 <"<NN,Whlen Sie die eHP -.N:&<x*<NN"_NDHPN, . Datei !l"_NDNA)ZNV <"<NpNN -2JWHfN$A.NV -2UWHfN$NpNNHxN, Es sind noch 4HPN.N:H <r$<L8NN"_NDHPN,7 Bytes|Speicher vorhanden, um|krzere Dateien zu laden."_NDHPN OKr"_ N4+@6B2N% -2JWHfN&NpNNHxN Wollten Sie HPA"_NDHPN,G|wirklich laden ? Wenn ja|bleibt es im Speicher|sonst wird es gelscht!"_NDHPN,JA|NEIN4r"_ N4+@6 -6UWHfN%S. -.CdNx+@* -. c^HfN&6HxN DSie haben bereits 100|Dateien geladen. Erst mu|gespeichert werden !HPN OKAYr"_ N4+@6+|c2N&HxN "Wollen Sie noch|eine Datei laden ?HPN,JA|NEINdr"_ N4+@6 -6UWHfN&+|c2 -2WWHfN&B2` -.J^HfN&A0NVNpNNHxN FP R O G R A M M E N D E !|Wollen Sie das Programm|wirklich verlassen ?HPN,JA|NEIN4r"_ N4+@6 -6SWHfN)(pNppNtpNxpN <r NN,% Wenn Sie nun das Programm weiterhiniN <r NN,'benutzen, seien Sie und bersenden4NpNpp NtpNxpN <"<@NN fairNpNppNtpNxpN <r NN & das Honorar, falls Sie es nicht schonN <,r NN  getan haben.NpNppNtpNxpN <,"<NN,DANKE !4NpNpp NtpNxpN <,"<NN, TSCHSS !4N <,NLNN)VAXNA^NAdNAjNApNN"~NB2A CNTA CNTN \*.*HPA HPA""_NHmA "_NfN)+|2N+rHmp\N"_NfN)NpNNN)ZACNTHmp\N"_NJ^HfN*RHmANN:HHmp\N"_NN:L8NNz"_NCNT`ANzpJBgpF$VHfN+r <"<NpNNNpNNHxN,Die Datei existiert nicht !4HPN Zurck|Abbruchr"_ N4+@6 -6SWHfN+j <"<NN,Whlen Sie die HP -.N:&<x*<NN"_NDHPN, . Datei !4"_NDNN)ZN+r+|2 -RSWHfN+BRN,BmVBN -.N:H <r$<L8NNzANNP -NC^NHPA"_NfN+t;BVN~`NqNq4-VpJBgp/HmA "_NpJBgp$VHfN, <rdNp <"<NN,Lade zHPA"_NDHPN, mit "_NDHP -.CpNxN:N"_NDHPN  Bytes !"_NDN -:>_HfN04+m:>/-*p"->NdCXNR* -:>+@: -:J_Hg/-. -*CjNR.pN0 <"<Np(NNN|NBB -.N:H <r$<L8NNzABNPNpNNHxN,/Legen Sie die Diskette|zum Speichern der|Datei HP -BC^N"_NDHPN, ein!4"_NDHPN SPEICHER|VERGISSr"_ N4+@6 -6SWHfN7 -BCpNxN:HpN^N:L8N fN2NpNNHxN,Diskette zu voll, hat nur|noch nHPpN^N:N"_NDHPN,5 freie Bytes !|Neue einlegen oder|Datei(en) lschen ?"_NDHPN NEUE|LSCHENr"_ N4+@6 -6UWHfN2A-NVN1|N2N0N7 <r2NN BWhlen Sie den Namen unter dem die Datei gespeichert werden soll !N -BC^NHPA,NV <r2NpFNN -2JWHfN4ANzNfJBfN4NpNNHxN Datei HPA"_NDHPN,# existiert|bereits. berschreiben ?r"_NDHPN,JA|NEINar"_ N4+@6 -6UWHfN4 <"<NN ndern Sie den Namen !NN2pONHPAr"_N <"<NN Speichere HPA"_NDHPN  !"_NDN -BCdNx+@F -BCjNxN:H <r$<L8NNzAFNPpN -FCXNNN~`NqNqpN0 <"<NpNNN5lNpNNHxN Speichern der Datei|HPA"_NDHPN, ignorieren ?4"_NDHPN,JA|NEINr"_ N4+@6 -6UWHfN5lN2NpNNHxN,Wollen Sie die Datei|HP -BC^N"_NDHPN  nochmal|speichern ?"_NDHPN,NEIN|JA4r"_ N4+@6 -6UWHfN7 -BCpNxN:HpN^N:L8NfN6:N2N7NpNNHxN,Diskette zu voll, hat nur|noch HPpN^N:N"_NDHPN,5 freie Bytes !|Neue einlegen oder|Datei(en) lschen ?4"_NDHPN NEUE|LSCHENr"_ N4+@6 -6UWHfN7A-NVN1|N7N0N~`NqN|pNpNprNpNppNtpNxpNprNp2"<zNp$rNN FILECOPY - PROGRAMM V 5.0NpNppNtpNxpNp"<NN Copyright: Andr StorkNp"<NN Wingertstr. 19Np("<NN 6106 ErzhausenNpNppNtpNxp NN|Npr0*v\.T*dn VD\*,fhbP. l,6. . x%.. PDIS PRG bQ&2PRIM S bQ,PRIM TOS bQ4IRAMDISK DOC bQ5_IRDMODIF TOS bQH| `~<*o - ЭЭмO// Bg?<JNA A#~HpC"Q?<NNT3fpa(/< #NMJj.~N X`h&@.&N .N XHyN XHyNMX @g6H@@; @ dH0; Nf`RvLDJ(?<NAT"ypA"Q09faBgNA?p//?<NN NuHyN .N X?<?<?<?<N X@.?<?<?<,?<N P"Jg6dSR@?//< NM JgHy}N X`aBNuHy>Hy%/< !`HyZHy0/< "/< N 8.N XNMXJf N PpNuXN XpNu?<`BgHyN .?<'?<'?<?<N T kHy+?<F?<F?<?<N T k*JWg&HyN Xa 9~ѫ/< !NMXHy&N 09faX.Hy*HyBg?<KNAJk JWHy6g/< "NMX 9~`Hy09fpaWN \BNuA&|2/N aN WTJg|1.N XBNu/< "NM.N .NMXH@@; @dH0;N`jHhN .t?<???< ?<N T NuAx Auf akBgHyt/?<ANA\?<NAXJ@k  fHy`Hy\`HyN XB@NuaNgk3H /< ?<HNAT.f .#`Hy?<*NA>N \Hy?<,NA>N\$+ BHy0+H?HpAa$Aa*oAcfSAfSN \fW Aaa2AaAfS/& /?9?<@NA f\x*WBCTD DdL03@ gA/r< Q?S4+ԫa,N \AfSRC Cdea*g`a$?<INA\?9?<>NAXL0nz`f*oC@tRBCd. Bd(2`0HApQACeW  ` Hm@/ 6 ?9?<@NA NuHy&N X/< $NMXJgHy{N Xaa~`Hy,N X3!!TG Gd^03p gA/!< 1< ?4+ԫaN \HyN XAR 6e! pea`BNuHyN .NMXNu ATa.aD/fHyON X AxaHy:N XNu/r < Q/NPPNuA BB4<2ЁQNu$+ BHy0+H?HpAa*$Aa HyN XN .N \Nur0@0 9c^QNuH (yK ygPBl4)|.Bl29|Bl$?<@??<@3a"Roa\??<@SW?-?/9|"aPa@a/<N 8.G` ?/<NM\B@f&_Baha/<NMX"H@ @Pg* @Hg4HA @Kg @Mf4RA Ao`SAk>a`RA An?Aaz`SA Am?A`XL0Nu2/VAph UdHA 0) 0 /?N Hy N X^9 N \< Hy N XNu?<NNT @2-0A2-IS@2-SABBBBQ2-IQNu/<5?3a .@GaXNu?/??/a W o @.mn\Nu0??<@P@ @eX@??<@9|"aB oW@o@ W@o?|@0V@ @eT@?@>@aPoPW W@oPNuAC&""NuAC&"2Nu0//+їA 07)A$NHhN  _B0+ї( (pe.0/HG ??<@??<@9|"B0g,D2/g k`DAr2Ё2-n0-?@aFRoRW W@eP&_Nu/ &o` ?/<NM\B@f&_NuBg?/ W ?<Y/a NuHHy^aX&o?/?/>/aRW/SGe//aFX?< /<NM\Q//a*XB>/SG/<NMX On2OAtIdrVWgrWf`2?0" HA HABA܁H܀/<NM\Qr`BBA>HycaX 2PLNu2/"op @0@IAaD0@IAa60@PA 0m 9n@lT` @de@da Nu oB0/ H@0B@H@fNu2/"o p0@@0@IHAa0@?IAa0AaNu o"/HAB0g 2HA0 2H@@0HAfNuEY,$Ausfhrungsprofil nicht installiert.Y*@V1.2 30.9.1987Y+?Spaghetti-Fan-ClubY,DNrnbergY.'*** Anzeige- und Auswertungsprogramm fr das Ausfhrungsprofil ***Eb1Y5odb1 Y )Gesamt: p qY Adavon im Bereich: p qY apProfil luft!qY7,oBereich von $000000 bis $000000, Bytes pro EintragKY!!000000 Y7D(min.) $JY7!p MEHR q lY7'o K pInit Start Stop Txtanz. Graphik EProfil Exec. Datei ENDEqY*3Keine Programmausfhrung im ProfilbereichY7,oSystemstrung (Interruptvektor verndert)EY4!Prog. Args.Y69(relativ zum Programmbeginn)b1Y7,oFehler: Programm nicht ausgefhrtKoAusfhrungsprofil luft.K angehalten.Klief schon oder StrungK lief nicht oder StrungKY7!Von Datei: Y7#oBinrdatei Textdatei von den ProfildatenK K pabsp. laden erzeugenqY7,oDateioperation erfolgreichKY7,oFehler beim Zugriff auf die DateiKY7,oNicht genug RAM fr Bildung des Textes vorhandenKY7 l *** Ausfhrungsprofil vom 0. 0.1900, 0.00:00 *** Ereignisse aufgenommen: davon im Profilbereich: 000000: hP Y Mit Cursortasten  vert. Mastab, mit  horizontalen Ausschnitt whlenepfq //@6`V07W 0  N "0      2 &B    ($$h "$ & ,">  T  F ~V* * * * * * * * * * * * 32-bit-Primzahlensuche * * geeignet z.B. fr den DR-Assembler * * ohne Unterprogrammbibliotheken zu verwenden * * * * * * * * * * * * gemdos = 1 bios = 13 conout = 2 conin = 7 printlin = 9 setblk = $4a p_init = $90020 ; Funktionsnummern des Ausfhrungs- p_start = $90021 ; profils p_stop = $90022 p_addr = $90023 tp_start = $90025 totcnt = 0 ; Profildatenstruktur startad = 4 scale = 8 entries = 10 .data prim_m dc.b ' ',0,0 pr1 dc.b 27,'E',27,'Y',$21,$2c dc.b '*** Primzahlsuche bis 4.2E9 27.9.1987 ***' dc.b 27,'Y',$22,$2c dc.b '*** Spaghetti - Fan - Club Nrnberg V1.2 ***' dc.b 27,'Y',$24,$28,'von Zahl: ',27,'e',0 in_1 dc.b 27,'Y',$24,$32,27,'K',0 pr2 dc.b 27,'Y',$26,$28,'bis Zahl: ',0 in_2 dc.b 27,'Y',$26,$32,27,'K',0 s_stepm dc.b 27,'Y',$28,$28,'mit Einzelschrittprofil? [JjYy]',0 in_e dc.b 27,'f',13,10,10,0 all_m1 dc.b 13,10,10,' Das waren alle ',0,' ' all_m2 dc.b ' Primzahlen im angegebenen Bereich.',13,10,0 .text entry: move.l 4(a7),A5 ; base page address move.l 12(a5),D0 ; Code add.l 20(a5),D0 ; Daten add.l 28(a5),D0 ; BSS addi.l #$300,D0 ; $100 base page + $200 Stack lea 0(A5,D0.l),A7 ; Stackpointer ber den RAM-Bereich move.l D0,-(A7) ; setzen move.l a5,-(A7) clr.w -(A7) ; junk word move #setblk,-(A7) ; RAM freigeben trap #1 adda.w #12,A7 link A6,#-12 ; Variablen anlegen move.w #1,-(A7) ; 2KB 1:1 Profilbereich pea entry(PC) ; vom Beginn an move.l #p_init,-(A7) ; Initialisierung Ausfhrungsprofil trap #bios adda.w #10,A7 error0: lea in_1,A3 pea pr1-in_1(A3) move.w #printlin,-(A7) trap #gemdos ; Aufforderung zur Eingabe der addq.l #6,A7 ; unteren Grenze numlp1 bsr getnum ; Zahl einlesen bmi sexit bne numlp1 move.l D3,-8(A6) ; und merken adda.w #in_2-in_1,A3 pea pr2-in_2(A3) move.w #printlin,-(A7) trap #gemdos ; Aufforderung zur Eingabe der addq.l #6,A7 ; oberen Grenze numlp2 bsr getnum ; Zahl einlesen bmi sexit bne numlp2 move.l D3,-4(A6) ; und merken move.l -8(A6),D3 ; zu untersuchende Zahl (32 bit) bset #0,D3 ; ungerade machen clr.l -12(A6) ; Primzahlzhler initialisieren adda.w #prim_m-in_2,A3 ; Meldung fr Primzahlen move.l #p_start,-(A7) ; Startcode fr Ausfhrungsprofil pea s_stepm-prim_m(A3) ; Meldung: Einzelschritt oder move.w #printlin,-(A7) ; normal statistisch? trap #gemdos addq.l #6,A7 bsr query ; anfragen: bne.s was_no ; ja oder nein geantwortet? addq.l #tp_start-p_start,(A7) ; wenn ja, dann Einzelschritt was_no trap #bios ; Ausfhrungsprofil starten addq.l #4,A7 * * * * * * * * * * Ab diesem Programmschritt wirkt das Ausfhrungsprofil. * * * * * * * * * * pea in_e-prim_m(A3) move.w #printlin,-(A7) trap #gemdos ; Zeilenvorschub, Cursor aus addq.l #6,A7 move.b #6,13(A3) ; anzeigen: soeben Zeilenvorscub prim0 moveq #1,D2 ; Teiler fr Untersuchung (16 bit) prim1 addq.w #2,D2 ; nchster ungerader Teiler bcs.s isprim ; falls >= 65536, dann D3 auch Primzahl move.l D3,D0 moveq #0,D1 swap D3 ; obere 16 Bits nach unten cmp.w D2,D3 ; wenn obere 16 Bits < Teiler, bcs.s is16b ; dann nur einmal dividieren * ; (Quotient nur 16 bit breit) move.w D3,D1 ; nur obere 16 Bits divu D2,D1 ; obere 16 Bits dividieren move.l D1,D0 ; Rest in oberen 16 Bits swap D1 ; wird obere 16 Bits des Quotienten is16b swap D3 ; nun die unteren 16 Bits move.w D3,D0 ; zusammen mit Rest von letzter Div. divu D2,D0 ; dividieren move.w D0,D1 ; Quotient in D1 (32 bit) swap D0 ; Rest in D0 (16 bit) cmp.l D2,D1 ; falls Quotient < Teiler bcs.s isprim ; dann Primzahl gefunden * ; (hnlich Quadratwurzelkriterium) tst.w D0 bne.s prim1 ; nicht aufgegangen: nchster Teiler p_cont addq.l #2,D3 ; aufgegangen: keine Primzahl, bcs.s all_ps ; nchste ungerade Zahl versuchen, cmp.l -4(A6),D3 ; wenn nchste Zahl > obere Grenze bcs.s prim0 ; oder berlauf, dann Ende bra.s all_ps isprim addq.l #1,-12(A6) ; Primzahl gefunden: mitzhlen lea 10(A3),A0 move.l D3,D1 bsr ltoa ; Zahl aus D3 dezimal umwandeln subq.b #1,13(A3) bne.s nonl ; nach jeder 6. Zahl Zeilenvorschub move.w #$0d0a,10(A3) move.b #6,13(A3) ; neue 6 Zahlen in nchster Zeile bra.s nl nonl move.w #' ',10(A3) nl move.l A3,-(A7) move.w #printlin,-(A7) trap #gemdos ; Zahl ausgeben addq.l #6,A7 bra.s p_cont ; mit nchster Zahl fortsetzen all_ps pea all_m1-prim_m(A3) move.w #printlin,-(A7) trap #gemdos ; Meldung ber Anzahl 1. Teil addq.l #6,A7 lea all_m2-prim_m(A3),A0 move.l -12(A6),D1 ; Anzahl der Primzahlen bsr ltoa ; dezimal umwandeln move.l A0,(A7) ; von Anfang der Ziffernfolge move.w #printlin,-(A7) trap #gemdos ; 2. Teil der Meldung ausgeben addq.l #6,A7 move.l #p_stop,-(A7) trap #bios ; Ausfhrungsprofil anhalten * * * * * * * * * * Dieser Programmschritt wird vom Ausfhrungsprofil nicht * * mehr erfat. * * * * * * * * * * move.l #p_addr,(A7) trap #bios ; Adresse der Profildatenstruktur addq.l #4,A7 ; holen tst.l D0 bmi.s notadr ; wenn gltige Adresse, move.l D0,A0 ; Profiladressen relativ zu Programm- subi.l #entry,startad(A0) ; anfang machen (Assemblerlisting!) notadr move.w #conin,-(A7) ; exit-Bremse trap #1 sexit unlk A6 clr.w (A7) * back to gemdos trap #1 * * * * * * * * * * Zahlen dezimal einlesen * * A3 -> Adresse der Bildschirm-Initialisierungssequenz * * D3 <- 32 bit-Zahl * * D0 0: CR, neg.: sonst. Steuerz., pos.: Nicht-Ziffer * * * * * * * * * * getnum move.l A3,-(A7) move.w #printlin,-(A7) ; Cursor zurcksetzen fr nchste trap #gemdos ; Eingabe addq.l #6,A7 moveq #0,D3 ; dorthin kommt die Zahl bra.s getnbeg getnlp move.w D1,-(A7) move.w #conout,-(A7) ; Echo von letztem Zeichen trap #gemdos addq.l #4,A7 getnbeg move.w #conin,-(A7) trap #gemdos ; ein Zeichen von der Tastatur addq.l #2,A7 cmpi.w #8,D0 ; ? beq.s getnum cmpi.w #13,D0 ; ? beq.s gexit0 ; mit D0=0 zurck cmpi.w #$20,D0 ; sonstiges Steuerzeichen bcs.s gexitN ; mit D0<0 zurck move.w D0,D1 ; fr sptere Ausgabe subi.w #$30,D0 ; Dezimalziffern -> 0 .. 9 cmpi.w #9,D0 ; Dezimalziffer? bhi.s numend move.l D3,D2 swap D2 mulu #10,D2 ; obere 16 Bits * 10 swap D2 tst.w D2 ; wenn berlauf, bne.s getnum ; dann Beginn von vorne move.w D0,D2 ; nur noch obere 16 Bits + neue Ziffer mulu #10,D3 add.l D2,D3 ; alle Bits * 10 + neue Ziffer bcc.s getnlp ; nchste Ziffer bra.s getnum numend moveq #1,D0 ; mit D0>0 zurck rts gexit0 clr.w D0 rts gexitN moveq #-1,D0 rts * * * * * * * * * * 32-Bit-Zahl in dezimale Ziffernfolge umwandeln * * A0 -> Adress ein Byte oberhalb des Zielstrings * * (Ausgabe rechtsbndig) * * D1 -> umzuwandelnde Zahl * * A0 <- Anfangsadresse der umgewandelten Zahl im * * Zielstring * * * * * * * * * * ltoa swap D1 ; obere 16 bit jetzt unten divlp clr.l D0 move.w D1,D0 ; obere 16 bit beq.s b16 divu #10,D0 move.w D0,D1 ; Quotient nach oben, Rest oben in D0 b16 swap D1 move.w D1,D0 ; Rest von oben + untere 16 bit divu #10,D0 move.w D0,D1 ; Quotient nach unten swap D0 ; Rest (16 bit) addi.w #48,D0 ; zugehrige Dezimalziffer move.b D0,-(A0) ; von rechts nach links in String swap D1 ; obere 16 bit wieder unten + CCR bne.s divlp ; solange, bis Zahl vollst. behandelt rts * * * * * * * * * * Ja-Nein-Anfrage * * Z=1 <- ja * * Z=0 <- nein * * * * * * * * * * query move.w #conin,-(A7) trap #gemdos ; ein Zeichen von der Tastatur addq.l #2,A7 andi.b #$df,D0 ; Klein- -> Grobuchstaben cmpi.b #'J',D0 beq.s queryes cmpi.b #'Y',D0 queryes rts ; Z=0 fr Ja zurckgeben .end ` *o - ЭЭO// Bg?<JNA NV?<Hz/< NM GHk?< NA\a"kf-CHk?< NA\akf-C&.Bg/< !Hk?< NA\a^fXNMXHk?< NA\| tTBe0 rHCBe2 HAHC02H@eJ@fTe ohne nderung des Datums gleich zur Zeit. Eingabemglichkeiten (statt "." jedes Sonderzeichen): Datum bleibt gleich, nur Zeit ndern [x]x nur Tag [x]x.[x]x Tag und Monat [x]x.[x]x.xx ganzes Datum keine nderung der Zeit [x]x.xx Stunden und Minuten (Sekunden auf 00) [x]x.xx.xx Stunden, Minuten, Sekunden *---------------------------------------------------------------------* FLOPPY-HOCHLAUFZEITEN Diskettenlaufwerke brachen nach dem Einschalten des Motors eine bestimmte Zeit, um ihre Nenndrehzahl zu erreichen. Erst danach knnen Schreib- und Leseoperationen sicher durchgefhrt werden. Der im Atari ST eingesetzte Floppy-Controller bercksichtigt dies durch eine Wartezeit von fnf Indexpulsen (etwa eine Sekunde), wenn der Laufwerksmotor nicht eingeschaltet war. Fr moderne Diskettenlaufwerke reicht jedoch erheblich weniger Zeit zum Hoch- laufen des Motors aus (z.B. Panasonic JU363 0.5s), auerdem braucht beim Lesen nicht unbedingt die angegebene Zeit gewartet zu werden, denn das TOS liest bei einem Fehler den Sektor ein zweites Mal. Lesefehler drften dabei selten sein, denn der FDC erkennt ein Sektoradrefeld erst dann, wenn sich die Diskette schnell genug dreht. Bei Schreiboperationen mu jedoch im Interesse der Datensicherheit auf die Einhaltung der Hochlauf- zeiten geachtet werden. Um die Diskettenoperationen unter diesen Bedingungen zu beschleu- nigen, nimmt der Ramdisktreiber dem FDC das Abwarten der Hochlauf- zeit ab, in dem er, falls der Laufwerksmotor nicht schon luft, diesen einschaltet und anschlieend die vorgegebene Zeit (abhngig von Lesen/Schreiben) wartet. Die Standardwerte 0.1s (Lesen) und 0.5s (Schreiben) sollten fr die meisten 89mm-Diskettenlaufwerke geeignet sein. Bei mehrmonatigem Betrieb mit einem Panasonic JU363 gab es dabei noch keine Fehler bei Diskettenoperationen. Leider bedient sich das Desktop in einigen Fllen direkt in den Floppy-Routinen des BIOS, ohne ber die hdv-Adressen zu gehen. Diese Operationen (ffnen von Ordnern im Desktop) bleiben natr- lich langsam. Zu dem Artikel "Starten statt warten" in c't 7/87, S 162: Was die auf IBM-Nachbauten knnen, knnen wir auf dem ST schon lange. *---------------------------------------------------------------------* AUSFHRUNGPROFIL Bei dieser Betriebssystemerweiterung wird ein Bereich im 68000- Adreraum ausgewhlt und dieser (bei dieser Implementation) in 1024 gleich groe Unterbereiche aufgeteilt (der Bereich mu dann ein Vielfaches von 2KB an Lnge haben). Jedem Unterbereich wird eine Zhlvariable (unsigned) zugeordnet. Nach Aktivierung des Ausfhrungsprofils wird 200-mal pro Sekunde (mit einem im Atari-ST vorhandenen Interrupt) der aktuelle Stand des Programmzeigers bestimmt und dann, wenn er in den Bereich fllt, die Zhlvariable des entsprechenden Unterbereichs inkrementiert. Durch Auslesen der Zhlvariablen kann ermittelt werden, im welchem Teil von Programmen ein groer Teil der Rechenzeit verbraucht wird (vielleicht sind noch optimierbare kurze Schleifen darunter). UNIX-Erfahrene kennen etwas hnliches mit der Option -p des C-Compilers und dem Kommando prof (a.out) Nachteile dieser Implementation gegenber UNIX: * Datenstruktur der Zhlvariablen nur einmal vorhanden (eben kein Mehrprogrammbetriebssystem) * Keine Angabe von Prozedurnamen (knnte noch hinzugefgt werden bei Programmen mit Symboltabelle) Vorteile gegenber UNIX: * Hhere Auflsung (200 Takte/Sekunde statt 50..100 Takte/Sekunde) * Wahl des Bereiches auch im Betriebssystem mglich. (dort gibt es noch so einige Mglichkeiten zum Auffrisieren, und im Gegensatz zu Mofas und Mopeds strt hier keine Polizei!) V1.2 NEU: * Zustzlich zur statistischen Interruptmethode gibt es nun auch das Einzelschrittprofil. Dabei wird fr jeden zwischen Start- und Stop-Aufruf im Bereich ausgefhrten Programmschritt die seiner Adresse entsprechende Variable hochgezhlt. * Die Datenstruktur des Ausfhrungsprofils bleibt vollstndig ber einen Reset hinaus erhalten und wird somit eine im Profilbereich liegende Endlosschleife zuverlssig anzeigen. * - - - - - - - - Die Datenstruktur des Ausfhrungsprofils in Assembler: (Offset gegenber getpad-Rckgabewert) tcount = 0 * Gesamtzahl der 200Hz-Impulse * bzw. Programmschritte, * whrend das Profil lief * ACHTUNG: * nderung (Verbesserung) in V1.2! startad = 4 * Anfangsadresse des Profilbereiches pscale = 8 * Skalierungsfaktor fr Profil: * 1 -> eine Zhlvariable pro 2 Byte * (Bereichslnge 2KB) * * 2 -> eine Zhlvariable pro 4 Byte * * (Bereichslnge 4KB) .... ptab = 10 * Tabelle der Zhlvariablen * (1024 16bit-Eintrge) in C: struct profil { unsigned long tcount; long startad; /* eigentlich Pointer auf Funktion */ unsigned scale; unsigned ptab[1024]; } .... ; Die Systemaufrufe des Ausfhrungsprofils: pinit = $90020 pstart = $90021 pstop = $90022 getpad = $90023 bios = 13 V1.2 NEU: pstatus = $90024 tpstart = $90025 ........................................................ pinit -- Initialisierung des Ausfhrungsprofils Argumente: newaddr (.l) Anfangsadresse des neuen Profilbereiches newscale (.w) neuer Skalierungsfaktor Der Profilbereiches geht somit von newaddr bis newaddr + 1024 * newscale Funktion: Das Ausfhrungsprofil wird, falls es luft, angehalten. Die Zhlvariablen werden mit 0 besetzt und der neue Profilbereich in der Datenstruktur gesetzt. Aufruf in Assembler: move.w #newscale,-(A7) ; oder andere Quelladressierungsart pea newaddr move.l #pinit,-(A7) trap #bios adda.w #10,A7 in C: #define pinit(newaddr, newscale) bios(0x90020L, newaddr, newscale) Rckgabewert in D0: 0 normale Ausfhrung -1 Skalierungsfaktor 0: nicht erlaubt. -2 Vektor des 200Hz-Interrupts oder Trace-Vektor wurde nach pstart bzw. tpstart von einem anderen Programm verndert: Keine Profil- operationen mehr mglich, sonst Chaos ... <-2 Ausfhrungsprofil nicht installiert .......................................................... pstart -- Ausfhrungsprofil laufen lassen (statistische Methode mit regelmigem Interrupt) Aufruf in Assembler: move.l #pstart,-(A7) trap #bios addq.l #4,A7 in C: #define pstart() bios(0x90021L) Rckgabewert in D0: 0 Ausfhrungsprofil gestartet -1 Ausfhrungsprofil lief schon, Skalierungsfaktor = 0 oder Interrupt-/Tracevektor verndert <-1 Ausfhrungsprofil nicht installiert .......................................................... pstop -- Ausfhrungsprofil anhalten (Interrupt oder Einzelschritt) Aufruf in Assembler: move.l #pstop,-(A7) trap #bios addq.l #4,A7 in C: #define pstop() bios(0x90022L) Rckgabewert in D0: 0 Ausfhrungsprofil angehalten -1 Ausfhrungsprofil lief nicht oder Interruptvektor verndert <-1 Ausfhrungsprofil nicht installiert .......................................................... getpad -- Adresse der Profildatenstruktur ermitteln Aufruf in Assembler: move.l #getpad,-(A7) trap #bios addq.l #4,A7 in C: #define getpad() bios(0x90022L) ... ... = (struct profil *)getpad(); Rckgabewert in D0: Adresse der Profildatenstruktur (falls Profil installiert). Auf die einzelnen Variablen wird mit obigen Offsets zugegriffen, z.B. move.l D0,A0 move.l (A0),... ; tcount move.l startad(A0),.. move.w #100,D0 ; oder andere Quelladressierungsart lsl.w #1,D0 ; .w-Index move.w ptab(A0,D0.w),. ; Zhlvariable 100 (beginnend mit 0) .......................................................... V1.2 NEU: .......................................................... pstatus -- Abfrage: Profil luft/luft nicht Aufruf in Assembler: move.l #pstatus,-(A7) trap #bios addq.l #4,A7 in C: #define getpad() bios(0x90024L) Rckgabewert in D0.l: == 0 , falls Ausfhrungsprofil nicht luft != 0 , falls Ausfhrungsprofil luft .......................................................... tpstart -- Ausfhrungsprofil laufen lassen (Einzelschrittzhlung) Aufruf in Assembler: move.l #tpstart,-(A7) trap #bios addq.l #4,A7 in C: #define tpstart() bios(0x90025L) Rckgabewert in D0: 0 Ausfhrungsprofil gestartet -1 Ausfhrungsprofil lief schon, Skalierungsfaktor = 0 oder Interrupt-/Tracevektor verndert -2 ungeeignete Version von TOS: Bei Einzelschrittzhlung mu dem trap #bios aufrufenden Programm das Trace-Bit im Status- register gesetzt werden. Dies geht nur ber den von TOS an undokumentierter Stelle abgelegten Wert. Bei Installation der RAM-Disk wird ber- prft, ob das Statusregister an der vorgesehenen Stelle (bezglich der in der dokumentierten Systemvariablen $4a2 abgelegten Adresse) steht. Alle bisherigen TOS-Versionen (ROM und Diskette) sind jedoch geeignet. <-1 Ausfhrungsprofil nicht installiert Die Einzelschrittzhluung verlangsamt ein Programm erheb- lich und ist daher besonders zur genauen Untersuchung einzelner Programmteile geeignet. Auerden kann es durch die Verwendung des Trace-Vektors zu Unvertrglichkeiten mit Debuggern kommen. Zwischen tpstart und pstop (nach Breakpoint oder Tastaturunterbrechung) mit dem Debugger auf Einzelschrittbetrieb umzuschalten, ist eine sichere Methode, einen Systemabsturz herbeizufhren oder wenig- stens das Ausfhrungsprofil bis zum nchsten Reset lahm- zulegen. Normaler Programmablauf zwischen tpstart und pstop sollte jedoch auch mit einem geladenen Debugger funktionieren. *---------------------------------------------------------------------* | | | pdis.prg -- Auswertungsprogramm fr Ausfhrungsprofil | | | *---------------------------------------------------------------------* pdis.prg ist ein einfaches Programm zur Inbetriebnahme des Ausfhrungsprofils, zur Ausfhrung von Anwenderprogrammen mit Profil und zur Anzeige (als Text und graphisch) der erhaltenen Informationen. Die einzelnen Funktionen werden mit Hilfe der Funktionstasten angewhlt. F1 Init Aufruf von pinit anzugeben ist die Startadresse des Profilbereiches und die minimale Endadresse des Bereiches. Der Skalierungsfaktor fr pinit wird unter dieser Bedingung minimal gewhlt und der entstandene Profilbereich angegeben. F2 Start Aufruf von pstart Erfolg bzw. Mierfolg wird angezeigt F3 Stop Aufruf von pstop Erfolg bzw. Mierfolg wird angezeigt F4 Txtanz. Ausgabe der Profilinformationen als Text auf dem Bildschirm: Profilbereich Gesamtzahl der 200Hz-Takte bzw. Programmschritte, whrend Profil lief Anzahl der davon in den Bereich gefallenen Takte bzw. Programmschritte Meldung, falls Profil luft alle Zhlvariablen ungleich 0 mit Angabe der Start- adresse des dazugehrigen Unterbereiches F5 Graphik Dasselbe als Sulendiagramm (V1.2 auch Farbmonitor) Der angezeigte Ausschnitt kann mit Hilfe der Cursortasten verndert werden. F6 EProfil Ausfhrung eines Anwenderprogramms mit Einstellung des Ausfhrungsprofils. Nur zu verwenden bei Programmen ohne eigene bios-Profil-Aufrufe. Einzugeben sind: Pfadname des Programms Argumentstring Profilbereich bezglich Startadresse des Programms F7 Exec. Ausfhrung eines Anwenderprogramms, vorzugsweise nach Einstellung von Init und Start oder bei Programmen mit bios-Profil-Aufrufen F8 Datei Die wichtigsten Dateioperationen (weitere Funktionstaste): Der Pfadname der Datei mu angegeben werden. ACHTUNG: Eine Datei gleichen Namens geht bei F1 und F3 verloren!! F1 absp. Profildatenstruktur in eine Binrdatei zur spteren Auswertung abspeichern. F2 laden Profildatenstruktur wird von einer Binrdatei geladen. F3 Textd. Textdatei mit allen Angaben aus der Profildaten- struktur und Systemdatum und -zeit in mehrspal- tigem Format zum Ausdrucken und Editieren erzeugen. F10 ENDE Beenden von pdis.prg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Das Ramdisksystem ist Public Domain und darf in seinem vollstndigen Zustand mit allen Programmen und Beschreibungen beliebig weitergegeben werden. Quelltexte (in 68000-Assembler, Schlabber-Lechz!), neuere Versionen und neuere andere Programme sind erhltlich bei +-----------------------+ | Wolfgang Windsheimer | | Johannisstrae 62 | | 8500 Nrnberg 90 | +-----------------------+ unter folgenden Bedingungen: + ein ausreichend frankierter Briefumschlag mit formatierter Diskette (einseitig oder zweiseitig, aber max. 81 Spuren, Panasonic JU363 schafft nicht mehr) + ein Aufkleber mit eigener Adresse und ausreichendem Rck- porto (fr einfache Bearbeitung) + 20.- DM als Unkostenbeitrag und Anerkennung fr das Ramdisksystem ______________________________________________________________________ Verwendete Literatur: Brckmann, Englisch, Gerits/ ATARI ST intern (Data Becker) c't 11/86 (Heise Verlag) `~@ o ( ШШO//Bg?<JNA HzHz?<&NN\# J.Av3 Z/?<&NN Je^v C J Y2Gat3<#v]GabGaXG~alGVRyT gBg/?<=NAPJ@k6Hy /<*??<?NAP.??<>NAX *fGav A >C B@"f" yTd0Qf` 2 VfZaaC ZGXaaC N2X"r0202aaaG\a2a0+@7@gaj?<NAT @g0J@fH@@; @ bH0;NB\|?9 Z?< Ga$Xk 3 NaG\a`Gkfa`|?<BgGaXk3 Ra`?<BgGaXk3 Ta`aJ@kbfl`akRBgGR0H/3?<=NAP6m$Hy /<*??<?NAP.??<>NAX *fA > h` f h#fCrp02p02C pHVf0kff +?g^`A JCp2Q?<0H/3?<=NAP6mHy /<*??<@NAP.??<>NAX *f^J@kZa fdBg?< NA\F'B B:.X PNG6ah?<NAT@ Jg YNuGj`G`G`Ga0?<NAG a"BgNAB0H@0 9o^B@H@fNu/ ?< NA\NuG`& C N`(GjC R` GtC T6 ? Qdv aNuAT0H @dF/0/0`0AR0Pg0 @da09RH @dAV/0/0Bg?<VNA Nu0|/Hz0@# \F'CF o`FP0F@0PgFX# 9rD@3 N#. V Nu.y \NsaBC` ??<NAX?<NAT @ g @ e$2@0 @ b @oc`oepNupNuEY".RAM-Disk - M o d i f i k a t i o n s p r o g r a m mY$0 KB RAM vorhanden (Obergrenze $000000).Y'QV1.2 25.9.1987Y)PSpaghetti-Fan-ClubY*UNrnbergY'(Eingerichtet: ???? KB RAM-DiskY)(Verfgbar: KBY5! KBY52 ms Y59 msfY5*mit Y5*ohneY6"pRAM-Y7!Disk-Y8!GreY6(Ausfh-Y7)rungs-Y8)profilY72HochlaufzeitY80LesenY86SchreibenY6XEinrich-Y7ZtungY8XRAM-DiskY6bkeineY7bRAM-Y8bDiskY8hAbbruchqY,8ACHTUNGY-(Diese nderung fhrt zum Reset.Y.(Der Inhalt der vorherigen Ramdisk undY/(alle residenten Programme gehen dabeiY0(verloren. Ist das beabsichtigt? [JjYy]Y5! Y5!eY52 eY59 e\auto\ramdisk.prg\auto\profdisk.prg\auto\ramdisk.pr\auto\profdisk.pr /@Y,(Systemfehler: RAM-Obergrenze nicht im 128KB-Raster.Y0(Ramdiskprogramm fehlt!KY0(Ramdiskprogramm unbrauchbar!KY0(Modifikation des Ramdiskprogramms unmglich!KEF  ,*j  (,R,P 6 (> 2. K.. ANLEITUNG LSPEEDER PRG m2 SPEEDER Q pH. L.. KSPEEDER DOC M=SPEEDER S ]<07202030309800 1 2Seite # F0000000 9[...................................................]011  StefanSchreiber Kesselweg14 8650Kulmbach Tel.:09221/75365 SpeederST (BeschleunigungszusatzfrDiskettenzugriffedesAtariST) DasProgrammSpeeder.prgdarffreikopiertwerden,sollteaber nichtvondenanderenFilesimOrdnergetrenntwerden. SiesolltenfolgendeFilesaufderPD-Diskettevorfinden: 1.Speeder.prg:daseigentlicheProgramm 2.Speeder.q:derdazugehrigeAssembler-Quelltext 3.Speeder.doc:wenndiesesFilenichtvorhandenist,knnenSie diesenTextnichtlesen/genieen/indenDesktop-Papierkorb werfen.  I.Einfhrung DasProgrammSpeeder.prgverdoppeltdie Schreib/LesegeschwindigkeitderDiskettenlaufwerkemitallen TOS-Versionen,sogarwenndiesesaufROM(!)installiertist.Es arbeitetmitjederAtariST-Konfigurationzusammen. DadiesereineSoftwarelsungauchmitROM-Betriebssystemzu sammenarbeitet,isteinekleineSensation.Gerechterweisemuich aberzugeben,dadasProgrammFastloaddesMarkt&Technik-Verlags diesebenfallserreicht,wasichabererstnachderFertigstel lungmeineseigenenProgramms"Speeder"erfahrenhabe. "Speeder"istvlligunabhngigvomProgramm"Fastload" entstanden,dasmirkeineswegsalsInspirationgedienthat. FolglichunterscheidensichbeideProgrammeauchimverwendeten Algorithmus.InsgesamthalteichmeineigenesProgrammabersogar fretwasleistungsfhigeralsdasKonkurrenzproduktFastload,da "Speeder"wenigerSpeicherplatzreserviertundmitjeder Betriebssystemsversionlauffhigist. II.TheoretischeGrundlagendesProjekts"Speeder" MagebendfrdieGeschwindigkeiteinesComputersistnicht nurseineProzessorleistung,sondernvorallemauchdie LeistungsfhigkeitseinerPeripherie,v.a.Diskettenlaufwerkund Drucker.DerAtariSTweisthiervonHausausguteFhigkeiten aus:BeimLesenergibtsicheinedurchschnittliche Geschwindigkeitvon8KByte/sec.bzw.ungefhr4KByte/sec.beim Schreiben. Allerdingsistschonseitca.einemJahrinderST-Szenebekannt, dadieseGeschwindigkeitendurchdieAusschaltungeinesVerifys verdoppeltwerdenknnen.DiesbringtsogutwiekeineNachteile mitsich,wieichspternochgenauererluternwerde.Einerder erstendazueinschlgigenTipsstammtebeispielsweisevonOliver Joppich,dereinenentsprechendenBetriebssystempatchineiner "ST-Computer"beschrieb(AusgabeMai1986).Allerdingssprach ernurvoneinerVerdopplungderLesegeschwindigkeit,obwohl durchdiesenPatch(direkteVernderungineinemProgramm,hier imTOS)sichauchdieSchreibgeschwindigkeitverdoppelnmu,wie mantheoretischleichtbegrndenkann. MeinesWissenswirdimvorliegendenTextzumerstenmaldetail liertbeschrieben,wasdieAusschaltungdesTrack-Verifysfr Konsequenzenhat.EineWarnungimvoraus:Diesistkeine"leichte Materie".EtwasAufmerksamkeitwirddurchausgefordert. Also:Konzentration!Spannung!Aufwachen!!!!! (Ichdementiereentschieden,dadieserTextdieDemoversion deserstendeutschenInfocom-Adventuresist.Eristzwar "interaktiv",ansonstenfehlenihmjedochsmtlicheMerkmale einesSpiels...)  WasbewirktdasProgramm"Speeder.prg"nunkonkretundistbei derSachenichtdocheinHaken?Umevtl.ngstederSkeptikerund Sicherheitsfanatikerzuzerstreuen,mchteicheinenkurzen AusflugindieTheoriedesFloppyDiscControllers(FDC)des AtariSTunternehmen. DerFDCbietetunterschiedlicheVorkehrungen,dieDatensicherheit zuerhhen.EsexistierenhauptschlichdreiArteneinesVerifys: 1.LeseneinesSektors:DerFDCarbeitetbereitshardwaremig mitPrfsummen.WenneinSektoraufdieDiskettegeschrieben wird,fgtderFDCautomatischeine16-BitPrfsummean,die er ausdenbertragenenDatenbytesberechnet.DerAnwender merktvon diesemVorgangberhauptnichts.DiesePrfsumme wirdauchals "CyclicRedudancyCheck"oderkurzCRC bezeichnet.BeimLesen vergleichtderFDCdieCRC-Prf summe,dieerbeimLesenberechnet,mitderbereitsabgespei cherten.EinLesefehlerwirdmit hchsterWahrscheinlichkeit bemerkt. 2.SchreibeneinesSektors:HieristdasVerifizierennichtganz soeinfach.DerFDCkannjedenfallsnichtunmittelbar herausfinden,obdieDatenaufderDisketterichtigangekommen sind.DieVerify-RoutinedesTOSverwendethiereinenkleinen Trick: AllegeschriebenenSektorenwerdennachdemSchreibenineinen eigenen1024Byte-Puffereingelesen(512Byteswren mindestenserforderlich).WennbeimSchreibeneinFehler aufgetretenist,kanndiesberdieCRC-Logikfestgestellt werden,dalogischerweisenunaucheinCRC-Fehlerauftreten mu.Esistsoimmerhinnichtnotwendig,daallegeschrie benenDatenmitdenimSpeichervorhandenenBytefrByte verglichenwerdenmssen. DurchdieseMethodehalbiertsichimallgemeinendieSchreib- gegenberderLesegeschwindigkeit,dajedergeschriebene SektornocheinmalzumVerifizierengelesenwerdenmu.Dieses VerifykannberdasBetriebssystemausgeschaltetwerden, indemdieSystemvariable$444aufeinenWertungleich0 gesetztwird.DiesistaberausGrndenderDatensicherheit wirklichriskant.  3.Track-VerifynachPositionierungdesSchreib/Lesekopfes: NacheinerPositionierungdesSchreib/Lesekopfesdurcheinen SEEK-,RESTOREoderSTEP-BefehldesFDCbestehtdieMglich keit,zuberprfen,obderlogischeTrackmitdemphysikal. TrackaufderDiskettebereinstimmt.Eskannnmlich vorkommen,daderSchrittmotordesDiskettenlaufwerksden BefehlsimpulsenzurPositionierungnichtfolgenkannundsich dannaufeinemfalschenTrackbefindet.ZumVerifizierenliest derFDCdasID-FelddesnchstenSektors,indemSeite,Track, SektornummerundGrealsInformationenberdenbetreffenden Sektorabgelegtsind. DieBIOS-Routine4("rwabs"),berdiefastalleDisketten zugriffelaufen,machtvondiesemVerifybeimPositionieren Gebrauch.DieentsprechendeStelleliegtbeijederBetriebs systemversionnatrlichwoanders.BeiderROM-Versionliegt sieanderAddresse$FC1B8A: $FC1B8A: moveq.l #14,d6 ;SEEKmitVerify $FC1B90: bsr $FC1BB6 ;anFDCschicken Im"AtariSTINTERN"vonDataBecker-gewissermaendie BibelfrSystemprogrammierer-wirddieRoutine,inder dieseSequenzenthaltenist,als"go2track"bezeichnet,aller dingsistdieserNamenicht"offiziell".Siedientdazu,einen bestimmtenTrackanzusteuern. SpeederschaltetdiesesVerifyaus,indemderBefehl14durch 10(SEEKohneVerify)ersetztwird.Dieshatbeilngeren FileseineVerdopplungderSchreibundLesegeschwindigkeitzur Folge.DerGrundliegtinnutzloserWartezeitdesFDC: Nehmenwireinmalan,da50KByteoder100Sektoren,die hintereinanderliegen,gelesenwerdensollen.Nach9Sektoren (bzw.10beieinerFATDISK)muderSchreib/Lesekopfaufden nchstenTrackpositioniertwerden.BeieingeschaltetemVerify holtderFDCdiephysik.TracknummerausdemnchstenID-Feld, daszuSektor1desnchstenTracksgehrt.Sektor1istaber gleichzeitigderSektor,deralsnchstergelesenwerdenmu. DadessenBeginnsoebenamLesekopfvorbeigerauschtist,mu eineganzeUmdrehungabgewartetwerden,biserdasnchsteMal gefundenwird.FrdasLeseneinesTrackswerdenalsostatt einerUmdrehungjeweilszweibentigt.Diemglichebertra gungsratewirddadurchhalbiert!  WelcheNebenwirkungentretenbeiderAusschaltungdiesesVerifys auf?berhauptkeine!EinTrack-Verifyfindetnmlichauchbei jedemSchreib/LesevorgangaufDiskettestatt.DerFDCprftbei einemREAD-SECTOR-Befehl(bzw.WRITE-SECTOR),obdievorhandene TracknummerimID-FeldmitdergewnschtenNummerimTrack- RegisterdesFDCbereinstimmt.EinFehlerwirdbereinStatus biterkannt("Recordnotfound")undauchvomBetriebssystem registriert.WennwirklicheinmaleinfalscherTrackangesteuert ist,suchtdasBetriebssystemdiebetreffendeSpurnocheinmal( ein"RESEEK"-Vorgang).TechnischgelingtdiesbereinRESTORE( setzendesLesekopfesaufTrack0)undeinemanschlieenden SEEK-BefehlandenFDC.DamitwirddiegewnschteSpurauchbei einemFehlermitanSicherheitgrenzenderWahrscheinlichkeit gefunden.  BeimeingeschaltetenTrack-Verifywirdsogutwiekein zustzlicherSicherheitseffekterreicht,daimPrinzipbeieinem PositionierungsfehlerdiegleichenVorgngewieobenbeschrieben ablaufen.berschreibenoderfehlerhaftesLesenvonDaten aufgrundderAusschaltungdieserSicherheitsvorkehrungistin jedemFallsogutwieunmglich.DaichdieRoutine4desBIOS bereitsvonvornebishintenzerlegthabe,kannichzwarkeine Haftungfrevtl.Schdenbernehmen(hhh...),schlieesie abersogutwieaus.InderPraxisarbeiteichseiteinemJahr miteinemgepatchtenBetriebssystemundkonntenochnieeinen Fehlerentdecken,dersichaufdieAusschaltungdiesesVerifys zurckfhrenlie. UmdennochunvermeidlichenMorddrohungenvorzubeugen,hiernoch einpaarallgemeineFaktenzurDiskettensicherheit: FehlerbeiderArbeitmitDiskettensinddurchausmglich,wenn vonDiskettenlaufwerkenunterschiedlicherHerstelleraufeinander kopiertwird.Esltsichz.B.immerwiedervonSchwierigkeiten mitFremdlaufwerkenhren,derenDiskettenunterUmstndennicht vondenATARI-Laufwerkengelesenwerdenknnen.Diesistnatr lichkeinallgemeinerProduktionsfehler,aberichselbsterlebe obigesPhnomenabundzu.DieserFehlerhngtnatrlichnicht vomAusschalteneinesVerifysab,dadieDateneinwandfrei gelesenwerdenknnen,solangenichtmitderDisketteaufdem anderenLaufwerkgearbeitetwird.Auch1000Verifysknnenan dieserTatsachenichtsndern.  VonderMglichkeit,seinBetriebssystemdurcheinen einfachenPatchzu"frisieren",habenleiderbeiweitemnicht alleST-AnwenderGebrauchgemacht,obwohldiesmiteinemguten DiskettenmonitorkeinProblemist.DieshingmeinerMeinungnach vonmehrerenFaktorenab:Zumeinenexistiertenunterschiedliche TOS-Versionen,diejeweilseinenanderenPatcherforderten. ZweitensgaltdieserEingrifffrdieDatensicherheitals "gefhrlich",weilvieleST-Besitzernichtwuten,umwasfr einenEingriffessichgenauhandelte.DiesesVerifyistaber nichtdieeinzigeSicherheitsvorkehrungimBetriebssystem,son derneineehernebenschliche,diesichallerdingsfatalaufdie bertragungsrateauswirkt.UnddrittensisteinPatchineinem ROM-Betriebssystemeinfachunmglich,esseidenn,manhatdie Mglichkeit,EPROMszubrennen. 9[...................................................]011 AlsFolgedieserUmstndemachtnureineoffensichtlichelitre MinderheitderST-AnwendervondieserVerbesserungGebrauch( entwedermitEPROMsodergendertenTOS.IMG-File).Frdiese Gruppebringt"Speeder"natrlichkeinenNutzen. III.Algorithmusvon"Speeder.prg"  NachdiesentheoretischenVorbemerkungenknnenwirendlichzum PrinzipderBetriebssystemserweiterung"Speeder"kommen.Beider ProgrammierungdiesesProgrammsdurfte,damitessowohlmitROMs alsauchmitdenverschiedenenVersionendesRAM-TOSzusammenar beitet,keindirekterPatchinsBetriebssystemverwendetwerden. EsmutefolglicheinandererWeggefundenwerden.Fastalle ZugriffeaufdasDiskettenlaufwerklaufen,wieschongesagt,ber dieFunktion4desBIOS,indernureineinzigesBytegendert werdenmu.ImROMistesallerdingsunmglich,diesesBytezu ndern(wasnatrlichrgerlichist).ZumGlckwirddiese RoutinebereinenVektorangesprungen(Addressein$476),der aufeineeigeneRoutineumgebogenwerdenkann.Vondieser TatsachemachensowohlRamdisksalsauchFestplatten-Treiber Gebrauch.DieGrundideedes"Speeders"sahsoaus,daein residentesProgrammmitleichtenModifizierungenundausgeschal tetemPositionierungs-Verifydieneuerwabs-Routinebilden knnte.LeideristdieseRoutinemitihrendazugehrigenUnter programmenzurDMA-Kontrolle,Fehlerbehandlungetc.eineder lngstenimBetriebssystemundzumsimplenAbschreibeneinfachzu lang.DieskanndenwahrenAssembler-Freakabernichtschrecken, wennerberentsprechendmchtigeHilfsmittelverfgt.Mitdem PROFIMATvonDATABECKERistesmglich,ProgrammeoderTeiledes Betriebssystemszureassemblieren.AbsoluteSprungaddressenwer dendabeizuLabels(symbolisch)umgewandelt.Obwohlder ReassemblerimPROFIMATnichtganzfehlerfreiarbeitet( grrrrrrrrrrrr!!!!),haterdiesesProjektentscheidendverein facht.ReineAbschreibungsarbeitwarfolglichmeistens(!)nicht ntig.DadurchdieReassemblierungvieleberflssigeTeileder rwabs-Routineausgelassenwerdenkonnten,isteinsehrkompakter Codeentstanden. DerreassemblierteCodebasiertaufderROM-VersiondesTOS, luftaberauchmitjederanderenVersion.Ob"Speeder"mitdem Blitter-TOSlauffhigist,dasbeimErscheinungsterminmg licherweiseschonaufdemMarktseinwird,kannichnochnicht beurteilen.Fallsnicht,wirdaufjedenFalleinUpdatedes Programmsherauskommen.WennSiediesesProgrammverwenden knnen,kopierenSieesambestenineinenAUTO-Ordner,damites beimBootenautomatischgestartetwird.Esvertrgtsichmit RamdisksoderHarddisk-Treibern,egal,obdiesevorodernachder Initialisierunggestartetwerden. "Speeder"arbeitetbisjetztmitjedemgetestetenProgramm zusammen,wasbeiderkurzenProgrammlngeauchkeinWunderist. 2.5KBytesolltenjedenfallsauchaufeinem260STohneROMszu entbehrensein. Kulmbach,den20.5.87 StephanostheMagician P.S.: "Speeder"isteinuerstntzlichesUtilityundsteigertdie LeistungsfhigkeitIhresSystemsevtl.ganzerheblich.FallsSie diesesProgrammstndigbenutzen,wrdeichesfrfairhalten, wennSiealsAnerkennungfrdiesesWerkanmicheinenBetragvon 20.-DMberweisen. Sietragendamitdazubei,dasevtl.nochmehrProgrammedieser KlassealsPD-Softwareverffentlichtwerden(diesistkeine Floskel!!!).VielenDankimvorausan"zahlungswilligeST- Anwender"! Stefan Schreiber Kesselweg 14 8650 Kulmbach Tel.: 09221/75365 Speeder ST ( Beschleunigungszusatz fr Diskettenzugriffe des Atari ST ) Das Programm Speeder.prg darf frei kopiert werden, sollte aber nicht von den anderen Files im Ordner getrennt werden. Sie sollten folgende Files auf der PD-Diskette vorfinden: 1. Speeder.prg: das eigentliche Programm 2. Speeder.q : der dazugehrige Assembler-Quelltext 3. Speeder.doc: wenn dieses File nicht vorhanden ist, knnen Sie diesen Text nicht lesen / genieen / in den Desktop-Papierkorb werfen. I. Einfhrung Das Programm Speeder.prg verdoppelt die Schreib/Lesegeschwindigkeit der Diskettenlaufwerke mit allen TOS-Versionen, sogar wenn dieses auf ROM(!) installiert ist. Es arbeitet mit jeder Atari ST-Konfiguration zusammen. Da diese reine Softwarelsung auch mit ROM-Betriebssystem zu- sammenarbeitet, ist eine kleine Sensation. Gerechterweise mu ich aber zugeben, da das Programm Fastload des Markt&Technik-Verlags dies ebenfalls erreicht, was ich aber erst nach der Fertigstel- lung meines eigenen Programms "Speeder" erfahren habe. "Speeder" ist vllig unabhngig vom Programm "Fastload" entstanden, das mir keineswegs als Inspiration gedient hat. Folglich unterscheiden sich beide Programme auch im verwendeten Algorithmus. Insgesamt halte ich mein eigenes Programm aber sogar fr etwas leistungsfhiger als das Konkurrenzprodukt Fastload, da "Speeder" weniger Speicherplatz reserviert und mit jeder Betriebssystemsversion lauffhig ist. II. Theoretische Grundlagen des Projekts "Speeder" Magebend fr die Geschwindigkeit eines Computers ist nicht nur seine Prozessorleistung, sondern vor allem auch die Leistungsfhigkeit seiner Peripherie, v.a. Diskettenlaufwerk und Drucker. Der Atari ST weist hier von Haus aus gute Fhigkeiten aus: Beim Lesen ergibt sich eine durchschnittliche Geschwindigkeit von 8 KByte/sec. bzw. ungefhr 4 KByte/sec. beim Schreiben. Allerdings ist schon seit ca. einem Jahr in der ST-Szene bekannt, da diese Geschwindigkeiten durch die Ausschaltung eines Verifys verdoppelt werden knnen. Dies bringt so gut wie keine Nachteile mit sich, wie ich spter noch genauer erlutern werde. Einer der ersten dazu einschlgigen Tips stammte beispielsweise von Oliver Joppich, der einen entsprechenden Betriebssystempatch in einer "ST- Computer" beschrieb ( Ausgabe Mai 1986 ). Allerdings sprach er nur von einer Verdopplung der Lesegeschwindigkeit, obwohl durch diesen Patch ( direkte Vernderung in einem Programm, hier im TOS ) sich auch die Schreibgeschwindigkeit verdoppeln mu, wie man theoretisch leicht begrnden kann. Meines Wissens wird im vorliegenden Text zum erstenmal detail- liert beschrieben, was die Ausschaltung des Track-Verifys fr Konsequenzen hat. Eine Warnung im voraus: Dies ist keine "leichte Materie". Etwas Aufmerksamkeit wird durchaus gefordert. Also: Konzentration! Spannung! Aufwachen!!!!! ( Ich dementiere entschieden, da dieser Text die Demoversion des ersten deutschen Infocom-Adventures ist. Er ist zwar "interaktiv", ansonsten fehlen ihm jedoch smtliche Merkmale eines Spiels... ) Was bewirkt das Programm "Speeder.prg" nun konkret und ist bei der Sache nicht doch ein Haken? Um evtl. ngste der Skeptiker und Sicherheitsfanatiker zu zerstreuen, mchte ich einen kurzen Ausflug in die Theorie des Floppy Disc Controllers ( FDC ) des Atari ST unternehmen. Der FDC bietet unterschiedliche Vorkehrungen, die Datensicherheit zu erhhen. Es existieren hauptschlich drei Arten eines Verifys: 1. Lesen eines Sektors: Der FDC arbeitet bereits hardwaremig mit Prfsummen. Wenn ein Sektor auf die Diskette geschrieben wird, fgt der FDC automatisch eine 16-Bit Prfsumme an, die er aus den bertragenen Datenbytes berechnet. Der Anwender merkt von diesem Vorgang berhaupt nichts. Diese Prfsumme wird auch als "Cyclic Redudancy Check" oder kurz CRC bezeichnet. Beim Lesen vergleicht der FDC die CRC-Prf- summe, die er beim Lesen berechnet, mit der bereits abgespei- cherten. Ein Lesefehler wird mit hchster Wahrscheinlichkeit bemerkt. 2. Schreiben eines Sektors: Hier ist das Verifizieren nicht ganz so einfach. Der FDC kann jedenfalls nicht unmittelbar herausfinden, ob die Daten auf der Diskette richtig angekommen sind. Die Verify-Routine des TOS verwendet hier einen kleinen Trick: Alle geschriebenen Sektoren werden nach dem Schreiben in einen eigenen 1024 Byte-Puffer eingelesen ( 512 Bytes wren mindestens erforderlich ). Wenn beim Schreiben ein Fehler aufgetreten ist, kann dies ber die CRC-Logik festgestellt werden, da logischerweise nun auch ein CRC-Fehler auftreten mu. Es ist so immerhin nicht notwendig, da alle geschrie- benen Daten mit den im Speicher vorhandenen Byte fr Byte verglichen werden mssen. Durch diese Methode halbiert sich im allgemeinen die Schreib- gegenber der Lesegeschwindigkeit, da jeder geschriebene Sektor noch einmal zum Verifizieren gelesen werden mu. Dieses Verify kann ber das Betriebssystem ausgeschaltet werden, indem die Systemvariable $444 auf einen Wert ungleich 0 gesetzt wird. Dies ist aber aus Grnden der Datensicherheit wirklich riskant. 3. Track-Verify nach Positionierung des Schreib/Lesekopfes: Nach einer Positionierung des Schreib/Lesekopfes durch einen SEEK-, RESTORE oder STEP-Befehl des FDC besteht die Mglich- keit, zu berprfen, ob der logische Track mit dem physikal. Track auf der Diskette bereinstimmt. Es kann nmlich vorkommen, da der Schrittmotor des Diskettenlaufwerks den Befehlsimpulsen zur Positionierung nicht folgen kann und sich dann auf einem falschen Track befindet. Zum Verifizieren liest der FDC das ID-Feld des nchsten Sektors, in dem Seite, Track, Sektornummer und Gre als Informationen ber den betreffenden Sektor abgelegt sind. Die BIOS-Routine 4 ( "rwabs" ), ber die fast alle Disketten- zugriffe laufen, macht von diesem Verify beim Positionieren Gebrauch. Die entsprechende Stelle liegt bei jeder Betriebs- systemversion natrlich woanders. Bei der ROM-Version liegt sie an der Addresse $FC1B8A: $FC1B8A: moveq.l #14,d6 ; SEEK mit Verify $FC1B90: bsr $FC1BB6 ; an FDC schicken Im "Atari ST INTERN" von Data Becker - gewissermaen die Bibel fr Systemprogrammierer - wird die Routine, in der diese Sequenz enthalten ist, als "go2track" bezeichnet, aller- dings ist dieser Name nicht "offiziell". Sie dient dazu, einen bestimmten Track anzusteuern. Speeder schaltet dieses Verify aus, indem der Befehl 14 durch 10 ( SEEK ohne Verify ) ersetzt wird. Dies hat bei lngeren Files eine Verdopplung der Schreib und Lesegeschwindigkeit zur Folge. Der Grund liegt in nutzloser Wartezeit des FDC: Nehmen wir einmal an, da 50KByte oder 100 Sektoren, die hintereinanderliegen, gelesen werden sollen. Nach 9 Sektoren ( bzw. 10 bei einer FATDISK ) mu der Schreib/Lesekopf auf den nchsten Track positioniert werden. Bei eingeschaltetem Verify holt der FDC die physik. Tracknummer aus dem nchsten ID-Feld, das zu Sektor 1 des nchsten Tracks gehrt. Sektor 1 ist aber gleichzeitig der Sektor, der als nchster gelesen werden mu. Da dessen Beginn soeben am Lesekopf vorbeigerauscht ist, mu eine ganze Umdrehung abgewartet werden, bis er das nchste Mal gefunden wird. Fr das Lesen eines Tracks werden also statt einer Umdrehung jeweils zwei bentigt. Die mgliche bertra- gungsrate wird dadurch halbiert! Welche Nebenwirkungen treten bei der Ausschaltung dieses Verifys auf? berhaupt keine! Ein Track-Verify findet nmlich auch bei jedem Schreib/Lesevorgang auf Diskette statt. Der FDC prft bei einem READ-SECTOR-Befehl ( bzw. WRITE-SECTOR ), ob die vorhandene Tracknummer im ID-Feld mit der gewnschten Nummer im Track- Register des FDC bereinstimmt. Ein Fehler wird ber ein Status- bit erkannt ( "Record not found" ) und auch vom Betriebssystem registriert. Wenn wirklich einmal ein falscher Track angesteuert ist, sucht das Betriebssystem die betreffende Spur noch einmal ( ein "RESEEK"-Vorgang ). Technisch gelingt dies ber ein RESTORE ( setzen des Lesekopfes auf Track 0 ) und einem anschlieenden SEEK-Befehl an den FDC. Damit wird die gewnschte Spur auch bei einem Fehler mit an Sicherheit grenzender Wahrscheinlichkeit gefunden. Beim eingeschalteten Track-Verify wird so gut wie kein zustzlicher Sicherheitseffekt erreicht, da im Prinzip bei einem Positionierungsfehler die gleichen Vorgnge wie oben beschrieben ablaufen. berschreiben oder fehlerhaftes Lesen von Daten aufgrund der Ausschaltung dieser Sicherheitsvorkehrung ist in jedem Fall so gut wie unmglich. Da ich die Routine 4 des BIOS bereits von vorne bis hinten zerlegt habe, kann ich zwar keine Haftung fr evtl. Schden bernehmen ( hhh... ), schliee sie aber so gut wie aus. In der Praxis arbeite ich seit einem Jahr mit einem gepatchten Betriebssystem und konnte noch nie einen Fehler entdecken, der sich auf die Ausschaltung dieses Verifys zurckfhren lie. Um dennoch unvermeidlichen Morddrohungen vorzubeugen, hier noch ein paar allgemeine Fakten zur Diskettensicherheit: Fehler bei der Arbeit mit Disketten sind durchaus mglich, wenn von Diskettenlaufwerken unterschiedlicher Hersteller aufeinander kopiert wird. Es lt sich z.B. immer wieder von Schwierigkeiten mit Fremdlaufwerken hren, deren Disketten unter Umstnden nicht von den ATARI-Laufwerken gelesen werden knnen. Dies ist natr- lich kein allgemeiner Produktionsfehler, aber ich selbst erlebe obiges Phnomen ab und zu. Dieser Fehler hngt natrlich nicht vom Ausschalten eines Verifys ab, da die Daten einwandfrei gelesen werden knnen, solange nicht mit der Diskette auf dem anderen Laufwerk gearbeitet wird. Auch 1000 Verifys knnen an dieser Tatsache nichts ndern. Von der Mglichkeit, sein Betriebssystem durch einen einfachen Patch zu "frisieren", haben leider bei weitem nicht alle ST-Anwender Gebrauch gemacht, obwohl dies mit einem guten Diskettenmonitor kein Problem ist. Dies hing meiner Meinung nach von mehreren Faktoren ab: Zum einen existierten unterschiedliche TOS-Versionen, die jeweils einen anderen Patch erforderten. Zweitens galt dieser Eingriff fr die Datensicherheit als "gefhrlich", weil viele ST-Besitzer nicht wuten, um was fr einen Eingriff es sich genau handelte. Dieses Verify ist aber nicht die einzige Sicherheitsvorkehrung im Betriebssystem, son- dern eine eher nebenschliche, die sich allerdings fatal auf die bertragungsrate auswirkt. Und drittens ist ein Patch in einem ROM-Betriebssystem einfach unmglich, es sei denn, man hat die Mglichkeit, EPROMs zu brennen. Als Folge dieser Umstnde macht nur eine offensichtlich elitre Minderheit der ST-Anwender von dieser Verbesserung Gebrauch ( entweder mit EPROMs oder genderten TOS.IMG-File ). Fr diese Gruppe bringt "Speeder" natrlich keinen Nutzen. III. Algorithmus von "Speeder.prg" Nach diesen theoretischen Vorbemerkungen knnen wir endlich zum Prinzip der Betriebssystemserweiterung "Speeder" kommen. Bei der Programmierung dieses Programms durfte, damit es sowohl mit ROMs als auch mit den verschiedenen Versionen des RAM-TOS zusammenar- beitet, kein direkter Patch ins Betriebssystem verwendet werden. Es mute folglich ein anderer Weg gefunden werden. Fast alle Zugriffe auf das Diskettenlaufwerk laufen, wie schon gesagt, ber die Funktion 4 des BIOS, in der nur ein einziges Byte gendert werden mu. Im ROM ist es allerdings unmglich, dieses Byte zu ndern ( was natrlich rgerlich ist ). Zum Glck wird diese Routine ber einen Vektor angesprungen ( Addresse in $476 ), der auf eine eigene Routine umgebogen werden kann. Von dieser Tatsache machen sowohl Ramdisks als auch Festplatten-Treiber Gebrauch. Die Grundidee des "Speeders" sah so aus, da ein residentes Programm mit leichten Modifizierungen und ausgeschal- tetem Positionierungs-Verify die neue rwabs-Routine bilden knnte. Leider ist diese Routine mit ihren dazugehrigen Unter- programmen zur DMA-Kontrolle, Fehlerbehandlung etc. eine der lngsten im Betriebssystem und zum simplen Abschreiben einfach zu lang. Dies kann den wahren Assembler-Freak aber nicht schrecken, wenn er ber entsprechend mchtige Hilfsmittel verfgt. Mit dem PROFIMAT von DATA BECKER ist es mglich, Programme oder Teile des Betriebssystems zu reassemblieren. Absolute Sprungaddressen wer- den dabei zu Labels ( symbolisch ) umgewandelt. Obwohl der Reassembler im PROFIMAT nicht ganz fehlerfrei arbeitet ( grrrrrrrrrrrr!!!! ), hat er dieses Projekt entscheidend verein- facht. Reine Abschreibungsarbeit war folglich meistens (!) nicht ntig. Da durch die Reassemblierung viele berflssige Teile der rwabs-Routine ausgelassen werden konnten, ist ein sehr kompakter Code entstanden. Der reassemblierte Code basiert auf der ROM-Version des TOS, luft aber auch mit jeder anderen Version. Ob "Speeder" mit dem Blitter-TOS lauffhig ist, das beim Erscheinungstermin mg- licherweise schon auf dem Markt sein wird, kann ich noch nicht beurteilen. Falls nicht, wird auf jeden Fall ein Update des Programms herauskommen. Wenn Sie dieses Programm verwenden knnen, kopieren Sie es am besten in einen AUTO-Ordner, damit es beim Booten automatisch gestartet wird. Es vertrgt sich mit Ramdisks oder Harddisk-Treibern, egal, ob diese vor oder nach der Initialisierung gestartet werden. "Speeder" arbeitet bis jetzt mit jedem getesteten Programm zusammen, was bei der kurzen Programmlnge auch kein Wunder ist. 2.5 KByte sollten jedenfalls auch auf einem 260ST ohne ROMs zu entbehren sein. Kulmbach, den 20.5.87 Stephanos the Magician P.S.: "Speeder" ist ein uerst ntzliches Utility und steigert die Leistungsfhigkeit Ihres Systems evtl. ganz erheblich. Falls Sie dieses Programm stndig benutzen, wrde ich es fr fair halten, wenn Sie als Anerkennung fr dieses Werk an mich einen Betrag von 20.- DM berweisen. Sie tragen damit dazu bei, das evtl. noch mehr Programme dieser Klasse als PD-Software verffentlicht werden ( dies ist keine Floskel!!! ). Vielen Dank im voraus an "zahlungswillige ST- Anwender"! ` z,o.. ޮޮB?< NA\#v !Zv/?< NA\/< ?< NA\?<NATOBg/?<1NA od`l y N/8pNu o"o0<?QNuNVH nmp`H>.:GM fp`2 | J0pg 82G ")lB@`HJL N^NuNVH<.0@H*@M>a|>|f 0``|f>BgBg?<?B/<zN*Jl> ?NpT*gJl `FBG` |z0pH5pHAgp`(RG|m0F 2F f 0FMBB@JL N^NuNVH>.0|mp`fJxfp`ZJ f0."|M4nB`> nl>aH,Jgf| `>??./. ?.a JLN^NuNVH?0.@H*@M. fB@`p=@Jmf p ;@;@`|Jng <z` . -@<.Hƍ8.HĉHDmlBE`zmJngv`0-Dnl6-D`6.RD. g| . g./. abX>????.B/.N`.Jf????.B/<zN.Jf.zaJ@g~`:>????.B/.N. . g. /.NxXJl2> ?NpT. nlf>a|f~gJl `0Hr Ѯ nnJnfBJL N^NuNV n(H|@"nH|AN^NuC Jo gC 3x@pBiaaJ3|ag ~ aZfag`apaZaaf1 <<<1 ʆ<><a^.<$m 8g.Sgx x x ݵ na` ;| a`<0g<a<gna m faSm j``Frfrf rg2- ;A Nuapa0- S@m Ām fpaa4af|;| <<<><a<><at.<8g Sfa`4<adajf<\fRm  Sm ga` m faSm jp`na4paaafXa``;| $m  ;| <>- a φ  Ά  ͆ <<<><a<><a.<8g Sfa`6<0g*<aa<fRm Sm f| BRNu m faSm jn4 `Hx MP ;@ ;@ ;|>+o ;o ;o ;o ;o ;o ;| C Jm gC ~>- OO m +H Jij aTBiag~ affag3|Nupa0- H`B/<>)a<<a08 HA ! xf!m Lx Bx>Nu>8 1 <a@<<`n1 aNfJBi<BGa <><a<<aBf(3|1 <>- a|a$f 3m <NuBFaf <fBiNu0)<.<<af.<aSg8faBFNua|Nu<><a~><QazNuBm 0- Rm <a,<>)aJB- <>- a< φ  Ά  ͆ Nu@|8<FNua1Ɔ`a1dž`a >8`a08@?>< Q>FNu xf&0/xV"g??0<" DC.W $96 ;">0<" L0008C:CMP.W #K00014,D7 BNE L0008E L00090:MOVE.W #K00014,(A7) CLR.W -(A7) CLR.W -(A7) MOVE.W #K00014,-(A7) MOVE.W D6,-(A7) CLR.L -(A7) MOVE.L #K00004,-(A7) JSR L00063 ADDA.L #K00064,A7 MOVE.L D0,D5 TST.L D5 BGE.S L0008F MOVE.W D6,(A7) MOVE.L D5,D0 MOVE.W D0,-(A7) JSR L00066 ADDQ.L #2,A7 MOVE.L D0,D5 L0008F:CMP.L #K00067,D5 BEQ.S L00090 TST.L D5 BGE.S L00091 MOVE.L D5,D0 BRA.S L0008D L00091:CLR.W D7 BRA.S L00092 L00093:DC.W $207C ;" |" DC.W K00005 DC.W K00004 ;"z" DC.W $1030 ;"0" DC.W $7008 ;"p" DC.W $4880 ;"H" DC.W $1235 ;"5" DC.W $701C ;"p" DC.W $4881 ;"H" DC.W $B041 ;"A" DC.W $6704 ;"g" DC.W $7002 ;"p" DC.W $6028 ;"`(" DC.W $5247 ;"RG" L00092:CMP.W #K00000,D7 BLT.S L00093 MOVEA.W D6,A0 ADDA.L #K0007F,A0 MOVEA.W D6,A1 ADDA.L #K00080,A1 MOVE.B (A1),(A0) BNE.S L0008E MOVEA.W D6,A0 ADDA.L #K00083,A0 CLR.B (A0) L0008E:CLR.W D0 L0008D:TST.L (A7)+ MOVEM.L (A7)+,D5-D7/A5 UNLK A6 RTS neu: LINK A6,#K00005 ; rwabs MOVEM.L D5-D7,-(A7) MOVE.W K0007C(A6),D7 MOVE.W D7,D0 CMP.W #K00012,D0 BLT.S L00094 MOVEQ #-K00042,D0 BRA L00095 L00094:TST.W K0005A BNE.S L00096 MOVEQ #-K00012,D0 BRA.S L00095 L00096:TST.L K0001E(A6) BNE.S L00097 MOVE.W K00074(A6),D0 MOVEA.L #K00083,A1 MOVEA.W K0007C(A6),A2 ADDA.L A2,A1 MOVE.B D0,(A1) CLR.L D0 BRA.S L00095 L00097:CMPI.W #K00012,K00019(A6) BGE.S L00098 MOVE.W D7,(A7) BSR L00099 EXT.L D0 MOVE.L D0,D6 TST.L D6 BEQ.S L00098 CMP.L #K00012,D6 BNE.S L0009A MOVEQ #-K00074,D6 L0009A:MOVE.L D6,D0 BRA.S L00095 L00098:MOVE.W K00074(A6),(A7) MOVE.W D7,-(A7) MOVE.W K00064(A6),-(A7) MOVE.L K0001E(A6),-(A7) MOVE.W K00019(A6),-(A7) BSR.S L0009C ADDA.L #K0001E,A7 L00095:TST.L (A7)+ MOVEM.L (A7)+,D6-D7 UNLK A6 RTS L0009C:LINK A6,#-K00071 ; floprw MOVEM.L D2-D7/A5,-(A7) MOVE.W K00064(A6),D0 ASL.W #K00026,D0 EXT.L D0 MOVEA.L D0,A5 ADDA.L #K00062,A5 BTST #K00005,K0009E(A6) BNE.S L0009F CLR.W D0 BRA.S L000A0 L0009F:MOVEQ #K00014,D0 L000A0:MOVE.W D0,-K00012(A6) TST.W K00079(A5) BNE.S L000A1 MOVEQ #K000A2,D0 MOVE.W D0,K00079(A5) MOVE.W D0,K00078(A5) L000A1:BRA L000A3 l000a4:TST.W -K00220(A6) BEQ.S L00201 MOVE.L #K00202,D0 BRA.S L00203 L00201:MOVE.L K00204(A6),D0 L00203:MOVE.L D0,-6(A6) MOVE.W K00206(A6),D6 ; recno, logische Sektornummer EXT.L D6 DIVS K00207(A5),D6 ; durch dspc MOVE.W K00206(A6),D4 EXT.L D4 DIVS K00207(A5),D4 ; recno/dspc, Rest Offset zu Sector1 SWAP D4 CMP.W K00208(A5),D4 ; mit dspt vergleichen BGE.S L00209 ; Seite 1 anwhlen CLR.W D5 ; Seite 0 BRA.S L0020A L00209:MOVEQ #K0020B,D5 ; Seite 1 SUB.W K00208(A5),D4 ; dspt abziehen L0020A:TST.W -K00220(A6) ; Oddflag gesetzt? BEQ.S L0020C MOVEQ #K0020B,D3 BRA.S L0020D L0020C:MOVE.W K00208(A5),D0 ; dspt SUB.W D4,D0 ; -Sektornummer CMP.W K0020E(A6),D0 ; Zhler und Organisation fr viele Sectors BGE.S L0020F MOVE.W K00208(A5),D3 SUB.W D4,D3 BRA.S L0020D L0020F:MOVE.W K0020E(A6),D3 L0020D: ADDQ.W #1,D4 L00225:BTST #K00210,K00211(A6) BEQ L00212 MOVE.L -6(A6),D0 CMP.L K00204(A6),D0 BEQ.S L00213 MOVE.L -6(A6),(A7) MOVE.L K00204(A6),-(A7) BSR fastcopy ADDQ.L #4,A7 L00213:MOVE.W D3,(A7) MOVE.W D5,-(A7) MOVE.W D6,-(A7) MOVE.W D4,-(A7) MOVE.W K00215(A6),-(A7) CLR.L -(A7) MOVE.L -6(A6),-(A7) JSR write_sector ADDA.L #K00215,A7 MOVE.L D0,D7 TST.L D7 BNE.S L00217 TST.W K00218 BEQ.S L00217 MOVE.W D3,(A7) MOVE.W D5,-(A7) MOVE.W D6,-(A7) MOVE.W D4,-(A7) MOVE.W K00215(A6),-(A7) CLR.L -(A7) MOVE.L #K00202,-(A7) JSR flopver ADDA.L #K00215,A7 MOVE.L D0,D7 TST.L D7 BNE.S L00217 MOVE.L #K00202,(A7) BSR u2i TST.W D0 BEQ.S L00217 MOVEQ #-K00215,D7 L00217:BRA.S L0021C L00212:MOVE.W D3,(A7) MOVE.W D5,-(A7) MOVE.W D6,-(A7) MOVE.W D4,-(A7) MOVE.W K00215(A6),-(A7) CLR.L -(A7) MOVE.L -6(A6),-(A7) JSR read_sector ADDA.L #K00215,A7 MOVE.L D0,D7 MOVE.L -6(A6),D0 CMP.L K00204(A6),D0 BEQ.S L0021C MOVE.L K00204(A6),(A7) MOVE.L -6(A6),-(A7) JSR fastcopy ADDQ.L #4,A7 L0021C:TST.L D7 BGE.S L0021E MOVE.W K00215(A6),(A7) MOVE.L D7,D0 MOVE.W D0,-(A7) JSR critical ADDQ.L #2,A7 MOVE.L D0,D7 CMPI.W #K00220,K00221(A6) BGE.S L0021E CMP.L #K00222,D7 BNE.S L0021E MOVE.W K00215(A6),(A7) bsr mediach CMP.W #K00220,D0 BNE.S L0021E MOVEQ #-14,D7 L0021E:CMP.L #K00222,D7 BEQ L00225 TST.L D7 BGE.S L00226 MOVE.L D7,D0 BRA.S L00227 L00226: MOVE D3,D0 EXT.L D0 MOVEQ #K00211,D1 ASL.L D1,D0 ADD.L D0,K00204(A6) ADD.W D3,K00206(A6) SUB.W D3,K0020E(A6) L000A3:TST.W K0007C(A6) BNE L000A4 CLR.L D0 l00227: TST.L (A7)+ MOVEM.L (A7)+,D3-D7/A5 UNLK A6 RTS u2i: ; 8086 Integer in 68000-Format L0006B:LINK A6,#-K0002D MOVEA.L K00019(A6),A0 MOVE.B K00014(A0),D0 EXT.W D0 AND.W #K00009,D0 ASL.W #K00019,D0 MOVEA.L K00019(A6),A1 MOVE.B (A1),D1 EXT.W D1 AND.W #K00009,D1 OR.W D1,D0 UNLK A6 RTS LEA K000B8,A1 TST.W K00072(A7) BEQ.S L000B9 LEA K000BA,A1 L000B9:MOVE.W K000BB,K00012(A1) MOVEQ #-K00014,D0 CLR.W K00005(A1) BSR L000BC BSR L000BD MOVE.W #-K000B3,K00005(A1) BSR L000BF BEQ.S L000C0 MOVEQ #K0001E,D7 BSR L000C1 BNE.S L000C2 BSR L000BF L000C0:BEQ L000C3 L000C2:BRA L000C4 read_sector: L00063:BSR L000C5 ; floprd-Routine MOVEQ #-K000FD,D0 BSR L000BC L000DC:BSR L000BD BSR L000C7 BNE L000C8 MOVE.W #-K00014,K000C9 MOVE.W #K000CA,(A6) MOVE.W #K0001F,(A6) MOVE.W #K000CA,(A6) MOVE.W K000CB(A5),-$79FC MOVE.W #K00024,(A6) MOVE.W #K000CA,D7 BSR L000CC MOVE.L #K000CD,D7 MOVEA.L K000CE(A5),A2 L000D5:BTST #K00026,-$5FF BEQ.S L000CF SUBQ.L #1,D7 BEQ.S L000D0 MOVE.B -$79F7,K000D1(A5) MOVE.B -$79F5,K000D2(A5) MOVE.B -$79F3,K000D3(A5) CMPA.L K000D4(A5),A2 BGT.S L000D5 BSR L000D6 BRA.S L000CF L000D0:MOVE.W #-K00012,K000C9(A5) BSR L000D6 BRA.S L000C8 L000CF:MOVE.W #K000CA,(A6) MOVE.W (A6),D0 BTST #K00005,D0 BEQ.S L000C8 MOVE.W #K00024,(A6) BSR L000D7 AND.B #K00078,D0 BEQ L000C3 BSR.S L000D8 L000C8:CMPI.W #K00014,K000D9(A5) BNE.S L000DA BSR L000DB L000DA:SUBQ.W #1,K000D9(A5) BPL L000DC BRA L000C4 L000D8:MOVEQ #-K0009E,D1 BTST #K00071,D0 BNE.S L000DE MOVEQ #-K00019,D1 BTST #K0002D,D0 BNE.S L000DE MOVEQ #-K0002D,D1 BTST #K00000,D0 BEQ.S L000DE MOVE.W K000E0(A5),D1 L000DE:MOVE.W D1,K000C9(A5) RTS ; write_sector: BSR L000C5 ; flopwr-Routine MOVEQ #-K0001E,D0 BSR L000BC MOVE.W K000E2(A5),D0 SUBQ.W #1,D0 OR.W K000E3(A5),D0 OR.W K000E4(A5),D0 BNE.S L000E5 MOVEQ #K00012,D0 BSR L000E6 L000E5:BSR L000BD BSR L000C7 BNE L000E7 L000F1:MOVE.W #-K00014,K000C9(A5) MOVE.W #K0001F,(A6) MOVE.W #K000CA,(A6) MOVE.W #K0001F,(A6) move #1,d7 BSR L000CC MOVE.W #K000E8,(A6) MOVE.W #K000E9,D7 BSR L000CC MOVE.L #K000CD,D7 L000EB:BTST #K00026,-$5FF BEQ.S L000EA SUBQ.L #1,D7 BNE.S L000EB BSR L000D6 BRA.S L000EC L000EA:MOVE.W #K000E8,(A6) BSR L000D7 BSR L000D8 BTST #K00071,D0 BNE L000C4 AND.B #K000ED,D0 BNE.S L000EC ADDQ.W #1,K000E2(A5) ADD.L #512,$9CC(A5) SUBQ.W #1,K000CB(A5) BEQ L000C3 BSR L000F0 BRA L000F1 L000EC:CMPI.W #K00014,K000D9(A5) BNE.S L000F2 L000E7:BSR L000DB L000F2:SUBQ.W #1,K000D9(A5) BPL L000E5 BRA L000C4 flopver: BSR L000C5 MOVEQ #-K000FD,D0 BSR L000BC BSR L000BD BSR L000C7 BNE L000C4 BSR.S L000F9 BRA L000C3 L000F9:MOVE.W #-K000FD,K000E0(A5) ; verify1 MOVEA.L K000EF(A5),A2 ADD.L #512,$9CC(A5) L00117:MOVE.W #K00012,K000D9(A5) MOVE.W #K00112,(A6) MOVE.W K000E2(A5),D7 BSR L000CC L00119:MOVE.B K00109(A5),-$79F3 MOVE.B K0010A(A5),-$79F5 MOVE.B K0010B(A5),-$79F7 MOVE.W #K000CA,(A6) MOVE.W #K0001F,(A6) MOVE.W #K000CA,(A6) move #1,d7 BSR L000CC MOVE.W #K00024,(A6) MOVE.W #K00024,D7 BSR L000CC MOVE.L #K000CD,D7 L00114:BTST #K00026,-$5FF BEQ.S L00113 SUBQ.L #1,D7 BNE.S L00114 BSR L000D6 BRA.S L00115 L00113:MOVE.W #K000CA,(A6) MOVE.W (A6),D0 BTST #K00005,D0 BEQ.S L00115 MOVE.W #K00024,(A6) BSR L000D7 BSR L000D8 AND.B #K00116,D0 BNE.S L00115 L0011A:ADDQ.W #1,K000E2(A5) SUBQ.W #1,K000CB(A5) BNE L00117 SUB.L #512,$9CC(A5) CLR.W (A2) RTS L00115:CMPI.W #K00014,K000D9(A5) BNE.S L00118 BSR L000DB L00118:SUBQ.W #1,K000D9(A5) BPL L00119 MOVE.W $9C6(A5),(A2)+ BRA.S L0011A L000BC:MOVEM.L D3-D7/A3-A6,K00122 ; floplock SUBA.L A5,A5 LEA -$79FA,A6 ST.B K0011B MOVE.W D0,K000E0(A5) MOVE.W D0,K000C9(A5) MOVE.W #K00014,K00010(A5) MOVE.L K00019(A7),K000EF(A5) MOVE.W K00064(A7),K00123(A5) MOVE.W K0007C(A7),K000E2(A5) MOVE.W K00076(A7),K000E3(A5) MOVE.W K00079(A7),K000E4(A5) MOVE.W K00078(A7),K000CB(A5) MOVE.W #K00012,K000D9(A5) LEA K000B8(A5),A1 TST.W K00123(A5) BEQ.S L00124 LEA K000BA(A5),A1 L00124: MOVEQ.L #0,D7 MOVE.W $9CA(A5),D7 LSL.W #K00019,D7 LSL.W #K00014,D7 MOVEA.L K000EF(A5),A0 ADDA.L D7,A0 MOVE.L A0,K000CE(A5) TST.W K00005(A1) BPL.S L00125 BSR L000BD CLR.W K00005(A1) BSR L000BF BEQ.S L00125 MOVEQ #K0001E,D7 BSR.S L000C1 BNE.S L00126 BSR L000BF BEQ.S L00125 L00126:MOVE.W #-K000B3,K00005(A1) L00125:RTS L000C4:MOVEQ #K00014,D0 BSR L000E6 MOVE.W K000C9(A5),D0 EXT.L D0 BRA.S L00127 L000C3:CLR.L D0 L00127:MOVE.L D0,-(A7) MOVE.W #K00128,(A6) MOVE.W K00005(A1),D7 BSR L000CC MOVE.W #K00064,D6 BSR L00129 MOVE.W K00123,D0 LSL.W #K00012,D0 LEA K00089,A0 MOVE.L K00025(A5),K00005(A0,D0.W) CMPI.W #K00014,K0005A BNE.S L0012A MOVE.L K00025(A5),K0002D(A0) L0012A:MOVE.L (A7)+,D0 MOVEM.L K00122,D3-D7/A3-A6 CLR.W K00010 RTS L000F7:MOVE.W K000E3,D7 L000C1:MOVE.W #-K00071,K000C9 MOVE.W #K00128,(A6) BSR L000CC MOVE.W #K00064,D6 BRA L00129 L000DB:MOVE.W #-K00071,K000C9 BSR.S L000BF BNE.S L0012B CLR.W K00005(A1) MOVE.W #K0012C,(A6) CLR.W D7 BSR L000CC MOVE.W #K00128,(A6) MOVE.W #K00026,D7 BSR L000CC MOVE.W #K00064,D6 BSR.S L00129 BNE.S L0012B MOVE.W #K00026,K00005(A1) L000C7:MOVE.W #-K00071,K000C9 MOVE.W #K00128,(A6) MOVE.W K000E3(A5),D7 BSR L000CC MOVEQ.L #$10,D6 ; doppelte Schreib/Lesegeschwindigkeit!!! BSR.S L00129 BNE.S L0012B MOVE.W K000E3(A5),K00005(A1) AND.B #K00078,D7 L0012B:RTS L000BF:CLR.W D6 BSR.S L00129 BNE.S L0012D BTST #K00012,D7 EORI.B #K0002D,CCR BNE.S L0012D CLR.W K00005(A1) L0012D:RTS L00129:MOVE.W K00012(A1),D0 AND.B #K00000,D0 OR.B D0,D6 MOVE.L #K000CD,D7 MOVE.W #K00024,(A6) BSR L000D7 BTST #K00036,D0 BNE.S L0012E MOVE.L #K0012F,D7 L0012E:BSR L00130 L00132:SUBQ.L #1,D7 BEQ.S L00131 BTST #K00026,-$5FF BNE.S L00132 BSR L00133 CLR.W D6 RTS L00131:BSR.S L000D6 MOVEQ #K00014,D6 RTS L000D6:MOVE.W #K00024,(A6) MOVE.W #K00134,D7 BSR L000CC MOVE.W #K00042,D7 L00135:DBRA D7,L00135 BSR L00133 RTS L000BD:CLR.W K00120(A5) MOVE.W K00123(A5),D0 ADDQ.B #1,D0 LSL.B #K00014,D0 OR.W K000E4(A5),D0 EORI.B #K00036,D0 AND.B #K00036,D0 BSR.S L0011F MOVE.W #K0012C,(A6) MOVE.W K00005(A1),D7 BSR.S L000CC CLR.B K000D4(A5) L000F0:MOVE.W #K00112,(A6) MOVE.W K000E2(A5),D7 BSR.S L000CC MOVE.B K00109(A5),-$79F3 MOVE.B K0010A(A5),-$79F5 MOVE.B K0010B(A5),-$79F7 RTS L0011F:MOVE.W SR,-(A7) ORI.W #K00136,SR MOVE.B #K00074,-$7800 MOVE.B -$7800,D1 MOVE.B D1,D2 AND.B #-K00019,D1 OR.B D0,D1 MOVE.B D1,-$77FE MOVE.W (A7)+,SR RTS L00130:BSR.S L00139 MOVE.W D6,-$79FC BRA.S L00139 L000CC:BSR.S L00139 MOVE.W D7,-$79FC BRA.S L00139 L00133:BSR.S L00139 MOVE.W -$79FC,D7 BRA.S L00139 L000D7:BSR.S L00139 MOVE.W -$79FC,D0 L00139:MOVE.W SR,-(A7) MOVE.W D7,-(A7) MOVE.W #K0000C,D7 L0013A:DBRA D7,L0013A MOVE.W (A7)+,D7 MOVE.W (A7)+,SR RTS L000C5:CMPI.W #K00014,K0005A BNE.S L0013B MOVE.W K00064(A7),D0 CMP.W K0005B,D0 BEQ.S L0013C MOVE.W D0,-(A7) MOVE.W #-$11,-(A7) BSR L00066 ADDQ.W #4,A7 MOVE.W #-K00014,K0007F MOVE.W K00064(A7),K0005B L0013C:CLR.W K00064(A7) L0013B:RTS L000E6:LEA K00083,A0 MOVE.B D0,-(A7) MOVE.W K00123(A5),D0 MOVE.B (A7)+,K00005(A0,D0.W) RTS END . .. COPY ACC &COPY ANL COPY RSC `#!CE.I#$#$#$By$NNV?.?. ?. ?.?././.?<NNN^ _ONNV?.?. ?. ?.?././.?< NNN^ _ON/,HNVA*-HBnBn/9)N/9)BgN 3)/9)BgN 3)09)rAf*p=@/9)?9)0|AeBg?<N09)rAfJ/9)?<0|Ae?<?<N/9)?<0|AeBg?<NBy)09)rAfL/9)?<0|Ae?<?<N/9)?<0|AeBg?<Np3)09)rAfL/9)?<0|Ae?<?<N/9)?<0|AeBg?<Np3)09)rAfJ/9)?<0|Ae?<?<N/9)?<0|AeBg?<NBy)09)r Af/9)?9)0|AeBg?<N/9)Nl?< BgBgBg0<H/BgBgBgBgBgBgBgBgBgBgHy)Hy)Hy)Hy)Hy)Hy)Hy)N3)/9)N/9)BgN 3)/9)?9)0|AeBg?<N/9)Nlp=@p=@0.|r|AfV/9)Nl0.@e?< NXHy'b09)H/?<?9'^?9'`Bg?9'\Nr3'V09)@dpHy%?N?<YNp ?NpO?NHz?<N?9'VNHz?<N?9'`NHz?<N?9'^NHzf?< NX09)@d?< BgBgBg0<H/BgBgBgBgBgBgBgBgBgBgHy)Hy)Hy)Hy)Hy)Hy)Hy)N3)Hy'b09)H/Bg?9'^?9'`?<?9'\N3'V09)@dpHy%?N?<YNp ?NpO?NHz?<N?9'VNHz?<N?9'`NHzj?<N?9'^NHz&?< NXHy'b09)H/?<?9'^?9'`?<?9'\Nt3'V09)@dpHy%?N?<YNp ?NpO?NHz?<N?9'VNHz?<N?9'`NHz?<N?9'^NHzL?< NX09'^R@3'^09'^r Ao09'`R@3'`09'`rOAoN^,_Nu WRITE SIDE 1 READ SIDE 1 WRITE SIDE 0 READ SIDE 0 SEC: TR.:ERR.:A#$A$0B1|A%01|N(3&T09&TJ@kfCO$OpQN @e2CVO$O)p(Q?<N3)N`p3)BgHy)N ?<Hy)N p3)By)/9)?<0|Ae?<BgN/9)?<0|Ae?<BgNCE&VpQ?9&THy&VN 3&R?<BgBgBgp/BgBgBgBgBgBgBgBgBgBgHy)Hy)Hy)Hy)Hy)Hy)Hy)N3)09)r(AfNp@dHy%NBgNA COPY[3][Wo ist die Resource Datei ?][Abbruch]copy.rscNu/,HNVnN"AL-Hp. R@rA Hn N-@r?<nHnHnzHnrHnnN0.zJ@V=B0.N^,_ _ON/,HNVnN"AD-H=n=n ?<pHnHnzHnrHnnN0.zJ@g -nn`B .N^,_ _XN/,HNVN"A-H"n / Bg?.Nz"_"N^,_ _\N/,HNVN"A-H"n / Bg?.NF"_"N^,_ _\N/,HNVtN"A -H?<oHnHnHnxHntNN^,_NuNu/,HNVtN"A8-H=n0. rA=@-nx?<HnHnHnxHntNN^,_ _PN/,HNVtN"A2-H=n p=@-nx?< HnHnHnxHntNN^,_ _\N/,HNVtN"A0-H=n Bn-nx?< HnHnHnxHntNN^,_ _\N/,HNVN"A*-H/.?. A O"Op?"QBgBgN N^,_ _ON/,HNVnN"AL-H"n $n p*R@r=n"n / N-@r?<#HnHnzHnrHnnN0.N^,_ _\NNu/,HNVtN"AV-H=n=n=n=n=n=n=n=n=n ?<3HnHnHnxHntNN^,_ _ON/,HNVnN"A@-H0. J@jBn =n -nr?<2HnHnzHnrHnnN=nz0.N^,_ _\N/,HNVN"Ap-H/.BgHnHnHnHnNBgBgBgBgBg?.?.?.?.N/.Bg?<?.?.?.?.N/.?. N(=@0.N^,_ _\N/,HNVN"AB-H/. BgHnHnHnHnN?<BgBgBgBg?.?.?.?.NRN^,_ _XN/,HNVtN"A&-H-n x?<6HnHnHnxHntNN^,_ _XN/,HNVN"AR-HBn"n0.r1JAg*"n 0.R@$n2.t20.R@=@`"n 0.@N^,_ _PN/,HNVN"Az-H"n Jfp. R@?"n / Np=@p. =@0.nn&"n $Q0.S@2.tA 0Rn`"n $Qp. rN^,_ _ON/,HNVN"Av-H"n0.-I"n0)rAW"n0)r AWÄC"n0)rAWÄCBd("n / AO"Op?"QN`"n0)rAW"n0)rAWÄC"n0)rAWÄC"n0)rAWÄCBd"n$i -J"n0)rAW"n0)rAWÄCp."ni\CBd"n0)S@@"n Jf"np.R@3@"n/ AO"Op?"QN"n0)rAW"n0)rAWÄCBd"n3n "n3n N^,_ _O N/,HNVN"AT-H"n0.-I"n0)rAW"n0)rAWÄCBd"n$i /"n / N`N^,_ _O NNu/,HNVxN"=n=n -n|?<(HnHnHn|HnxNN^,_ _PN/,HNVxN"=n -n|?<rHnHnHn|HnxNN^,_ _\N/,HNVxN"-n|=n=n=n=n=n=n ?<*HnHnHn|HnxNN^,_ _ON/,HNVN""n0. =i 0.N^,_ _\N/,HNVxN"-n|=nBn=n=n=n=n=n0. rA=@?</HnHnHn|HnxNN^,_ _ON/,HNVN"/.?.HnHnHnHnN/.?.?.?.?.?.?.?. NDN^,_ _O N/,HNVN""n0. =i0.N^,_ _\N/,HNVN""n0.3n N^,_ _PN/,HNVrN"-nv=n=n=n=n ?<+HnHn~HnvHnrN=n~0.N^,_ _O NNu/,HNVtN"/.?."n/ "n/ NL"n0.-It"n$nt2"n $nt2"nt0) rAJ@g:"n$n0W@2"n$n0W@2"n$n0\@2"n $n 0\@2N^,_ _ONNu/,HNVxN"=n-n|?<,HnHnHn|HnxN"n2"n 2N^,_ _ONNu/,HNVN"p.R@rAHnN/?. N=@0.N^,_ _ONNu/,HNVN"A-H=nF=n@=nD=nB0.:rA=@=n8=n6=n4=n20.0rA=@=n. =n, =n*=n(=n>=n<-n$?<HnHnHnHnN=n"n2"n2"n2"n 2"n 2"n20.N^,_ _O"_#F::3E3_3_ 2/3yFN Jg( yFB8DSEk0 yFV00 yFT0Q?"<F:0<sNBJ_`.:9EH yFJSEk0 yFV00 yFV0QNu _3FNN09FNNu _3FPN09FPNu _3FV3FTN _"_$_2FV4FTN _3FZ3FXN _"_$_2FZ4FXN _3FRN09FRNu _ RN _"_/) g g f0)k @e??<>3|NAXNu _4` _t6 Bo r aSB`2aNH? _r ar a/L?Nu _r aN _4` _t"x0HgJJjDxvCXzp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCXp0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtJCkgCe4`BSCr aQSBk aQN _v` _60@d C{t`CvtJCgkCe4`BSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH "oA/ NXL NuBy$(_ _/ C( g  f4t4(H / /?(?<@NA LJkn gffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHy K` Hy $0< LNPREWRITE required prior to WRITE or PUTDisk or directory full $Nu#"0 _ g$e$d 9"0NHy"H`Hy"TNft`t _"_0gR@| e.G",$S" ghjebb"*f&"`v&A%S"`l&J`ذ|gb*|f8"9" g0$A#" `""9"$g$A#"$`"9"(g $A#"("`"E$&R"$b Hy"4NfJgr"QHd2S@k"QN _"_0" g$e$d gR@ @mz @ e@E","fB3@B$`\&A2+@ef "'I`F"3@B$`8$K`ư|f""(#"(` |f""$#"$` "" #" NHeap overruns stackPointer NILPointer not in heap _ hNVf 0(gr"OD@Hd2S@k "Q` _"y$e Hy"NfN#Fd#F` .f -|"`-|" nNнF`f yFdNStack overruns heap09$Nu _3$NBy$Nu[3][][ Abort ]Copyright 1986, CCD and OSS, Inc. ~,&,     2     b"&   (L$*.444":42,0X<"$>,$8(l*lr,&D0T>0,8&&, $LD"2 T &( 0&  >        p2J X L  <   , Fz   Multitasking Copy V1.0 ---------------------- ************************************************************************* * Dieses Programm ist PUPLIC DOMAIN !!! Das heit: * * Man darf und soll dieses Programm beliebig oft kopieren und an * * Freunde weitergeben !!!! * ************************************************************************* ************************************************************************* * Zu dem Programm gehrt: * * 1. COPY.ACC (File: das Programm) * * 2. COPY.RSC (Datei: der Resourcefile) * * 3. COPY.ANL (Datei: Anleitung) * ************************************************************************* 1. Allgemeines Das Programm ist ein Desk-Accessory, d.h. es ist jederzeit durch den An- klick des entsprechenden Eintrages in der ersten Menleiste zu erreichen. Dieses Programm habe ich geschrieben um Programme zu kopieren whrend man Sie benutzt. 2. Starten des Programmes Da es sich um ein Accessory handelt mssen Sie das Programm durch einen Reset starten. Sie mssen also die Diskette auf der sich das Programm befindet einlegen und dann den Resetknopf bettigen. Ganz wichtig ist es, da sich der Resourcefile (COPY.RSC) mit auf der Diskette befindet. Bitte beachten sie auch, da Accessorys in Ordnern nicht geladen werden. 3. Bedienung Die Bedienung erklrt sich von selbst. Zu beachten ist, da man die Knpfe schnell anklickt, um ein Bildschirmchaos zu verhindern. In einer spteren Version wird dieser Programmfehler behoben sein ! $Meldung anMeldung ausMultitasking CopyEinseitigZweiseitigStart CopyInfoMultitasking CopyPUPLIC DOMAIN PROGRAMgeschrieben vonJrgen HollfelderGnesener Str. 777000 Stuttgart 50 Ok ;MNt A@$ @/  1@O @Y   d 'o    A    (   D `|' . .. FCOPY2_0DOC 1FCOPY2_0PRG [FC_DEMO PRG ƓpKurzanleitung FCOPY 2.00: ------------------------- NEUHEIT: Beim Kopieren und Formatieren wird ab jetzt automatisch ein FASTLOAD-Disk angelegt, die zu den 'normalen' alten Disketten 100% kompatibel und keinerlei Nachteile fr den Anwender bringt. Der entscheidende VORTEIL ist, da ab jetzt die Disketten unter GEM bzw. TOS DOPPELT (Faktor 2!!!) mal so schnell geladen bzw. bearbeitet werden, ohne jede Software!!!! - VERIFY: Ist diese Option aktiviert, so wird eine 100% sichere Kopie der Quelldisk gemacht, bzw. beim Formatieren eine 100% einwandfreie Disk formatiert. Leider wird die Arbeit dadurch drastisch verlangsamt! Also nur bei wichtigen Daten anwenden! - SET DISK INFO: Diese Option entscheidet, ob beim Kopieren/Scannen die Diskettenkonfiguration (Anzahl Seiten/Tracks...) von der Quelldisk geholt werden sollen oder nicht. Deshalb ist bei einer Aktivierung dieser Option auch das Formatieren, da dabei keine Quelldisk vorliegt, von der die Konf. gelesen werden knnte, deaktiviert. Ansonsten wre nur noch zu erwhnen, da FCopy nur in MID- und HIRES funktio- niert. Dank gilt an dieser Stelle auch Peter Melzer, durch dessen fantastischen Malprogramm STAD das FCOPY-Titelbild entstand. -- Viel Spa beim Kopieren wnscht euch MABA! -- `W`44N N.2*O*m - ЭЭм!"ҍ¼.A// Bg?<JNA m"m -So Q m -SBQ(m)M*mN lHhN,X/,?,N\?<N&V?<A?<NAXNuNV?N$Nj?<N)T9@@0,@fHlT?<N%.\` l@fA )@N` Az )@NBG`?/,NN%n\RG GCm l@f9|2<9|L:9|d8`9|<9|#:9|28BG`0RGAV0 G m9|jHlnHl>HlVN) BBgN$\?<N) T)@NN(>N^NuNuNV?,>N)TN#FBgN)TN^NuNVHnHnHnHn/,NN$<?.?.?.?.?.?.?.?.BgN#?.?.?.?.?<?<?< ?< ?<N#?.?.?.?.?<Bg/,NN"NN?<?<?<?<BgBgBg?<(/,NN"?<?<?<?<BgBgBg?</,NN"`HlbN X?<//,NN"\=@ nfR?<?<?<?<BgBgBg?<(/,NN"T?<?<?<?<BgBgBg?</,NN".`0 nfN?<Bg?<?<BgBgBg?<(/,NN!?<Bg?<?<BgBgBg?</,NN!`?<Bg?<?<BgBgBg?./,NN!?</N0T9@& l &o9| &?<4NT9@$?<9NT9@"?<>NT9@ 0, f9| ?,&?</NJX?,$?<4NN X0.`|g` N^`|g`BgN^T`V`|g`?<N@T`8`|g`?<N"T``|g`N NZN"``|.g`( l&mSl&0,&??</NbX`f`|0g`( l &lRl&0,&??</N0X`4`|3g`&0,$gSl$0,$??<4NX``|5g`*0,$l"lRl$0,$??<4N X``|8g`*0,"l$oSl"0,"??<9N X``|:g`( lU"lRl"0,"??<9N fX`j`|=g`( l mSl 0, ??<>N 4X`8`|?g`( lc lRl 0, ??<>N X``0<fV?.?.?.?.?<?<?< ?< ?<N.?.?.?.?.?.?.?.?.?<NN^NuNVH9nN NX lf$/, HlHlN J@g```0,fx , gl?<?<HlNP ,м@A4"X A , м@A4"Ҽ A?<?<N#lXHl4NX @f`` /,HlHlN8 J@g`?<NT0,,g?<NTBn(,Pؼ DH Dl| ,Pм @H@ ,Pм @H=@ ,Pм @H9@0HHS@=@Sn`=l(=l$=l"9l&0,g lf9|F9|H`9|UUF9|H lfHlNXBgNT` Hl2NXBl9n`JBl` lff?<NT0,0gP?<NT0,4g>?,?,N XHlNX=@ nf `B` nf``t?<NjT0,4gb?,?,N X?<?<N!|X ,м@A"X AHlNX=@ nf `` nf`?,?,N &XRl0,no?< N!TJ@g0?<N!T8 D f N` Df`Rl0,no?<NT lfHBD` ,H2RDHЁ @B DmBg0<n?/</,H?<N ^0.R@2.RA=@0.|",HҼ A0.@|",HҼ A0,",HҼ A?<BgBg?< , S@?B/,H?< NBD` ,H2RDHЁ @B Dm lH ,HR @ ,HT @?<BgBg?< , S@?B/,H?< N~?<BgBg?< , S@?B/,H?< NX`BgN0T*<2.HR/*/N.*2,H/*/N*2.H6.HÒR/*/N*/*,/N*X0,9@ ,/0,H/N^ XS=@>.BFBl9n9l6Bn`@HlN>X0.g, , f /,HlHlN J@g`9|UUF9|HB`?<N8T?,?,N\X0,4gT?<?<NJX ,м@A"X AHlNzX=@ nf `` nf`Rl0,noBlRl0,no`T?< NTJ@g0?<NT8 D f NN` Df`"R ,2.Hm?<NLT0,.g A `A /NX=|`0.??<>NX , g no /, HlhHlN J@g` no N N^9F9G9|F9|HB`"0,.g ?<NT?<NT?,?,NX0,4g0HlNfX=@ nf `` nf`0,0gP?<N>T0,4g>?,?,NZXHlNX=@ nf `` nf`LRl0,noBlRl0,no`T?< NTJ@g0?<NT8 D f Nx` Df`LR ,2.HmRn0.l oP<,>,0,no`Rn0.Eo?<N@TBgBgNhXHlJNX?, ?<>NXN zLN^NuNV/ &n?<?<N0X , м@" X A/ NfX`&_N^NuNVH0&n$n ..?<?</ N PP м@" X A?<?<NX/ NXS@`L N^NuNVH&nN / ?<N\>N 0`LN^NuNV/ &n?<?</ N P&_N^NuNVHlzNXN^NuNV/< ?<HN>\)@H ,Hм)@D/< ?<HN\)@L/NX?,*?<NX?,.?<NzX?,0?<NlX?,,?<N^X ,SW|??<!NFX , SW|??<%N.X0,(W|??<*NXN^NuNV)| ,Nмм @ Pf )|)| ,Nмxм @ Pf )| 9|( ,Nмм @ PfBl(Bl* ,Nмм @ Pf9|*Bl. ,Nмм @ Pf9|.Bl0 ,NмXм @ Pf9|0Bl, ,Nмм @ Pf9|,N^NuNVH>.<. 0<",N4RB H҂Ҽ A0",N4 H҂Ҽ A0?<?<?<?<BgBgBg02W|A?/,NNLN^NuNVH>.<. Hn?NB\B?<0H//.N ?<?<BgBgBg?/,NNxLN^NuNVH0>. ,N$@ 2Ё @ ( &@ n L N^NuNVHn?.N\Bn ngJ .R @g, .R @H|0 nH|0 A=@` nH|0=@0.`N^NuNVH&n,. >.0f`TSG0? / < /N X// N ` l0<0"HA" Ҭ ARLN^NuNVH>.<. 0,*g0,4f^?<HlFBg0,:20<2,4DA=@0,4nA PA/NfP9l4LN^NuNV?NBNBgHlJ?<:?,:?<6N BgHlJ?<:0,:l8??<6Nd BgHlJ?<:0,:2,8HA??<6N< ?<0,:l8??<6?,:?<6N ?<0,:l8??<:?,:?<:N ><`:?<0,:l8?0<62<A??,:0<62<A?Nr RG GWmN>N^NuNVBgHlLBg0,:l8??<:?,:?<6NN^NuNVHN <,@SFg <<Z`<<R ,S@??<NXHn?<Nz\NBgHn?<6NfP lHl?<N \`)| (./(./N(/(./N(?</HlN )| ?< ./ ./N / ./N /HlNZ ??< HlN,P0|??< HlNP ,м@A HHl?<;N\?<7Hl?<NN|P l`>< |3??HnNPB8.ȼ/(</N(6.Ƽ؃?</HlN ?0|?HlNpP.H`|g`?0|?HlNFP``|g`?0|?HlNP`r`|g`?0|?HlNP`J`|g`6?0|?HlNP`"`?0|?HlNP``| FmV<,@SFg <<Z`<<R G-f4?<NT-@ <f`,N4>< `><-?<ONTJgn?<NTNLN^NuNVN?<0,:l8U@??<@0,:T@??<@N N^NuNV lR1n& lR1n ( lR1n * lR1n, lR1n lR1n lR1n lR1nN^NuNVH>.&n <. lR1G$ l!@. lR1F2LN^NuNV?.?.?.?.?.?. ?. ?.NL?./.?.NPN^NuNV/. )@ ,)@R lRBh6.N^NuNVBgBgBg?<?.?. ?. ?.N lR1| lR1n" lRBh$N^NuNVBgBgBg?<Bg?. ?. ?.N?./.BgNPN^NuNV?./.?.BgBgBg?<?.?. ?. ?.NN^NuNV/ l&h T @BP \ @0 l&hBS &_N^NuNV N^NuNVH&n>. <. l@f&/ 0H?0??,>N* `/ ?0??,>N LN^NuNVH0.HAN``4`````<` lf 9|2` ava lL|>,)l aaZJl4f,2 lLa,2g 9|4`Bl4`$lHvr;pNar BarpaBB rpNaxr BaprpahBBrpNaNr BaFrpa>"<SBBQr'pNaRlopNDf`QNua`$lHLvRRlo lH~|)l aa:3<3.<9glSf`Xa ,.a g , aBl6Bx>Bl4`X lP|~BlBl)la&a`6a|>,)l a aT`a~|>,)laaj./,?< NA.G` , ga*<369l6Jlfl6Bx>`.B?< NA)@.GM1>Nu lP ,Nu*<<09f*<3Sg9fBl4Nu<3Nu@|9<FNu)H9GaX9|4*| l>,)H ,㈀l <a<3   <3|Jl0gF`9|4<<<3<3.<$l9g:Sg*y y y nBl4`9|4a<0g <09<\g a`Bl4Bx>Nurfrfrg2,49A4NuBRFln<3a63<3.<9gSfa6`<<<Nua|Jl0gF`㈀| <` 0,S@BQA2`LN^Nu)I)J"/0<NB"l$lNu NV9n0.| A" AA-H=|` nR2.AH0Rn nm/, N.X0,PN^NuNVA)H$A)H(A`)H,AP)H0AD)H4A<)H8A$)H ?< NXT9lP0,N^NuNV?<NNX9@g0<`0<N^NuNV?.?<LNXN^NuNV/ Aj&H`0+ |g/ N*X Aj"Ҽm?.NT&_N^NuNV/ &n/ NDXJ@g0<`00+ |g /+NXBk ?+ N,TJ@g0<`0<&_N^NuNVH&n0+ |f0<`.0+ |gV0+ |f0<`v0+ |g?<B?+ NFP?/+?+ NP @f0<`@k 0Hѫ`$ k o?<0+D@H/?+ NP'@&Bk0<LN^NuNVH$.f BB`J". BnJlVnDJlRnDvd`Bbd nmDdD-@-A LN^NuNV/BnJlRnDJ lRnD 0. -@0.n0. nngD -n N^.JNuN^NuNV nl <`?.?./. ?<BN -@ m .`?<?.B?<BN` -@?<?.B?<BNF -@ nf .Ю -@ `$ nf .Ю -@ `0.g <`b . oHn . /?.?<@N Bg?./. ?<BN ]|9@g <` `Bl . N^NuNV/.?<IN\N^NuNVBn`&0.A0nf0.ABPRn nLmN^NuNV?>.=|0A"HPgXHf0(>N^Nu)I)J)_NN"l$l/,Nu)I)J)_NA"l$l/,Nu)I)JHl)_Hl" <sNB"l$lNuNV)n)n .мZ)@9|dBl9| n 9PN n 0A)HA)HA)HA)HN^NuNV9|eBlBl9nNXN^NuNV9n 9n Bn nR2.RnA|0f9|9|Sn0.9@9nNN^NuNV`4 nH| f?< ?<NX nRH??<NX0. Sn J@fN^NuNV` nRH??<NvX0. Sn J@fN^NuNV` nRH??<NHX0. Sn J@fN^NuNVH0&n $KA0-H nf?./ N4\=n`L nf?./ N`\=n`. nf?./ Np\=n`-KBn?.NlTJ@f`H| f |o@ H-@/./.?.?<@Nr 9@Hg0<`0,n/./<?.?<@N< 9@ @g0<`tRnR -@`R ned` 6.ƼЃ$@ H-@/./.?.?<@N 9@Hg0<`0,nBl0.L N^NuCA"AB"AD"AF"AV"A\"Ab"Aj"At"Az"A"A"A"A"A"A"A"A"A"AD"AF"AH"AZ"A^"Ab"At"Ax"A|"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A"A "A$"A("A4"A8"A<"A@"AL"AP"AT"AX"Ah"Al"Ap"At"A|"A"C ," ," , " 2222!222A2 ,&"& ,*"* ,.".2222222=2 ,2"2 ,6"6 ,:":2222s222!2 ,>"> ,B"B ,F"F222222232 ,J"J ,N"N ,R"R2222222*2 ," ," ,"222222222 ," ," ,"22222222 ," ," ,"22222222 ," ," ,"22222222C222 222"222L2222222A"222H22 22 222"!s222J2 222222 ,"22 22222222 ,"22 2 2222222 ,"22 2 2222222 ,"2'2 2 2222222 ,"222 2 22 22222 ,"""2>2 2 22 22222A""222-22 22222A>"202222 22222AZ"222%2222222Av"2)222222B222"22 2J2 2'22#222"r222 2 222222"r2222222222 ,V"V2222222222 ,Z"Z2222222222 ,^"^2222222222"r2222222222 ,b"b2222222222 ,f"f2222222222 ,j"j2222222222"r2222222222 ,n"n2222222222 ,r"r2222222222 ,v"v2222222222"r2222222222 ,z"z2222222222 ,~"~2222222222 ,"22222#2 2"222"r22222!22222 ,"22222"22222 ,"2222222222 ,"222222$2&222"r22222%22222 ,"22222&22222 ,"22222#22222 ,"22222;2(26222"r2!222 2)22222 ,"22222,2*2+222"r22222+22222 ,"222 22)22222 ,"2 22 2212-20222"r22222.22222 ,"222 22/22222"-p2 2222022222A"22222,22222"+2222262225222"r22222322222 ,"222 22422222"-2 2222522222A"22222122222"+22222'272:222"r22222822222 ,"222 22922222"-2 2222:22222A"22222622222"+22222@2<2?222"r2:2222=22222 ,"22222>22222"-22222?22222A"22222;22222"+2 2222A22222 ,"2:2222B22222 ,"2:2222 2222 2 ,"2:222C ," ," , " 2222222@2 ,&"& ,*"* ,.".2222222=2 ,2"2 ,6"6 ,:":2222222!2 ,>"> ,B"B ,F"F222222232 ,J"J ,N"N ,R"R2222222*2 ," ," ,"222222222 ," ," ,"22222222 ," ," ,"22222222 ," ," ,"22222222Cz222 222"222L2222222A"22 2H22 22 222"222J2 222222 ,"22 22222222 ,"22 2 2222222 ,"22 2 2222222 ,"2'2 2 2222222 ,"222 2 22 22222 ,"""2>2 2 22 22222A"222-22 22222A"202222 22222A"222%2222222A2"2)222222B222"22 2J2 2'22#222"222 2222222"2222222222 ,V"V2222222222 ,Z"Z2222222222 ,^"^2222222222"22 22222222 ,b"b2222222222 ,f"f2222222222 ,j"j2222222222"2222222222 ,n"n2222222222 ,r"r2222222222 ,v"v2222222222"2222222222 ,z"z2222222222 ,~"~2222222222 ,"22222#2 2"222"22222!22222 ,"22222"22222 ,"2222222222 ,"222222$2&222"22 222%22222 ,"22222&22222 ,"22222#22222 ,"22222;2(26222"2!2222)22222 ,"22222,2*2+222"22222+22222 ,"222 22)22222 ,"2 22 2212-20222"22222.22222 ,"222 22/22222"-p2 2222022222AN"22222,22222"+2222262225222"22222322222 ,"222 22422222"-2 2222522222Aj"22222122222"+22222'272:222"22 222822222 ,"222 22922222"-2 2222:22222A"22222622222"+22222@2<2?222"2:222 2=22222 ,"22222>22222"-22222?22222A"22222;22222"+2 2222A22222 ,"2;2 222B22222 ,"2;2222 2222 2 ,"2:222Cb Please select option! CJ        Ready.         C2      Scanning...      C      Reading...       C      Writing...       C     Formatting...     CFormatting & Writing...CC[0][A: Unformatted Disk][OK|CANCEL]C[0][A: Source Disk][OK|CANCEL]Ch[0][A: Destination Disk][OK|CANCEL]C4[0][A: Source Disk|B: Destination Disk][OK|CANCEL]C[1][B: Write-Error on|Destination Disk!][RETRY|CONT|CANCEL]C[1][B: Verify-Error on|Destination Disk!][RETRY|CONT|CANCEL]C[1][A: Read-Error on|Source Disk!][RETRY|CONT|CANCEL]CT[1][Only working with|Mid- and Hires!][ QUIT ]CA"A"A"A"A"A"A"A"A"A"A"A"A"A&"A4"AB"AR"A^"Al"CL2CJ2CB229|09|.9|,9|*9|(9| &9|$9|O"9| )|)| 9|C_C__CA:\\*.*Cfree Bytes: _______Cused Bytes: _______C______Cj"2"2 2"2"2"22"2"2"22"2x9|hNu FastCopy . -- written by Martin Backschat (28/5/87)Select option:CopyScanFormatDirectoryQuit00000000001111111111222222222233333333334444444444555555555566666666667777777777888888 x1001234567890123456789012345678901234567890123456789012345678901234567890123456789012345 x1Graphic Display:onoffFormat Dest. :yesnoVerify :yesnoDisk-def. Infos:yesnoSource Disk :A:B:Dest. Disk :A:B:Set disk konfigurationOne SideTwo SidesSectors :____99Start at :____99End at :____99Multiple Copy:____99Side :Track:Status OKDon't knowDRV not readyUnknown errorCRC errorBad requestSeek errorUnknown mediaSector errorNo paperWrite errorRead errorDon't knowWRITE PRTCEDChanged diskUnknown deviceBad SectorsInsert Disk!VERIFY ERROR[0][Work paused!][CONT][1][I need at minimum|$10000 Bytes for me!][ QUIT ][1][Can't get DIR!|Check your disk again!][CANCEL]*.*NO_WRTHIDDENSYSTEMSUBR/WCON:AUX:PRT: `N?<NNT @gHyl?< NA\BgNAHy?< NN\?<NNT,@ @KN0< BQ<< .<?<NNT5Sf`Wrong Resolution! Please restart in hires!`Hz ?< NNBWNA8    nol\]lnonolII$'l Il  nol\]lnonolIIq  no (q'qq\]   q{|I no {|I{|I{|no bcl\]q\]bc nobc{|{| {|Inol\]lnonolII$'l Il  nol\]lnonolIIq  no (q'qq\]   q{|I no {|I{|I{|no bcl\]q\]bc nobc{|{| {|I{| $'I I Ill{|ll ( no(  (I(;Il({|Pno(no{|{|I( qII\] I KbcI IIno\]lno{|  no!{|   !!$'H $'IIII qI Ino lIl {| $'I I Ill{|ll ( no(  (I(;Il({|Pno(no{|{|I( qII\] I KbcI IIno\]lno{|  no!{|   !!$'H $'IIIIqIInol  I    lhh8@>' p/0/'p0G/~>_|8??[p8ǀhv= 6? p;aO`m0? :?}@=`~?pR(T0v۬`R(P;}<~`o<(_]^@n0(~/oqa0i|80`0~?`>?ai``0$$X$pX0~>9'~~(0$&$X$$$$$$X&~X^d?J($(($$$($(3PN#ߐeK~800$00$$$0$0|?H g7'8R$$$P$$$$$$$p=I ゛ͽ߀G^ ,(XX XZ"ZXZX p}uŲ2߆ ~?<׷Wxt߆xo?|<0 }6ӿ |ߟy{8`/ߞϯ|3<pp?/O~?} p870Ǽ7??nnc`Çc8?@>?nnc`Çc|c?noÇnn`g`n` _/noÇnn`g`n`g?_ncoc?~>pncoc?= mハnノ#86ハnノ>b g`Ãg07g`Ãg8p,~p?x aϜό`x?l0`~||fxx07`~$pp/`yy? 0`98?> ` ``A>?`?b`@ `0`?KC@@ `?Ǣ?A@@ `I?ÄgA@@`ǃ>0{A_@01@@|x<~@G`_~0=aXp`p^=?&@p 800=?"x>< @@00~>< `>` y<|`0 B `}|> B`}`_?`Ήu |_<0G0ǀ<y< 9E0<<@D0{>|@`?0? | ?p;l0?.?l0@?<p " `???<<  @?`> } @??0`7x0?|000o~ ?? `"Zg ?x ~>`x0ڀ0L> xp s Kxi;<8?0 8ex88~ pr|  8| σ` pF?Ү  8~ σ0UP~p_>0 8~ 0>8/|` 8~?  a0p5x>@ 8~>܀|03u<wp> 8?889 0z|><xxs?; || ? |`8`~ |?p000 p00p <(?p  0 0p: 8  0x0g:8  `` l~:?8 q'8l~:>8,  , ?%0f ?p~8, R,``'pf?r|00` `C r|_` ` aÀpr 12"  `@?@ r  -$,,`\ ; r  `T@ r(`00~\@ r@`Á`@@r @ ``@ s 00@ps"?00@``us*  \`x g` Ts9;*'~ C7 \?x;('~*0@ 39~ ``|``@2`*p?0]g6⢊ 88<<8z*@??  8{*((A@88!q<`2쮪Ìa  `<18p1d8<<ap * 20<xxa  竮 `8<<`&?@ _ f@pG<<@yv8 ##<!g8?<ǿwpAG<##`x =F<Ca?c<A>g?ǟ~<@~>9x<  ?p ?<<x<| `??~p6<<<<<`30|<<>xx` 10<x<xx`?;3x <x<xz<><x<s_~p 8x<8{\5x<<pox<<ǀ|ưx<xA<߀>{x< xÀ>Àx<1  B x< B ?yx<<À|x<x0<!px<x0 < 8 xx<x 0 l`xx<xx0 p<x<x0<x<<xp0\<<<<x0p08<x<x`8x<x`pp<x`p0<x `>88G<x 0G <x0, # <x`    1<x`  @'<xp @  p9 pN<x0 A 8q<x0 A Px<x8  s<<x  P8?ǀ<x p0?><<0p~?`>??@xჀ@ <@0< <ÀC À@~?|x@ 0@x?Ǹ@?|p`     ? `p 8?x p~?ap ` <  @@@@@@@  @@ OππOϏOO HH@BH@BHBHBHBHHH@HHHHH@H@HH@ @H H@HBHBHBHHH@HHH@H@HH@ @H H@HBHBHBHH HHH@HHH O  H@ O O LC LL L LL L@  N@ L L LC LL  L LL L@ @  O L L LC LL  L LL LH @  @@ LC LC LC L L LL H@ L LL @@C O Op@aR@@ R@@pR@@`R@@@ <HHBHHH@R@@H@HHHHC HHBHH@ Z@H@@HHHC HHBH@ Z@H@ @HHHC LC O Z@@ OOC LLC L Z@ @` LLL C LLCLL Z@ @ LLL @ LLCLL@ Z@ L@ LLLL@O@ OC@ ,2 "2"s2"3 t"@ \60`2 0` 8f``  8f`` fpll` ) 8fpll`TD  Ldf0f`  Ldf0f`P@@  Ldf0f`A@ Ldf0f`Pǿldf0fư/ldf0fԃou xl`j{\oxl`\:8s?@;V1F0Mq4(O`"DS@QLhE0? ,`^xXE .pP@Esހ1*^axE`*2CA D0  *yBG * F4@  *SuMGP??~; ;  .P]KtE ~/; ;  $PIJ$D1  10Pc0xy1  p>&?@ ?< >;;w ;   8< >;;w ; `81 13821 181pO1 13821 181O?` ;3121 ;1{`Ϳ ;3121 ;1ٰ?`61 3313203 06, r1 3313203 02 K ;<<<0<0=; >` S?d ;<<<0<0=; >8 i<6 q:%&@G r    `3o0` ;@ o`fG `xEXl N@@;;;  p 'LPh6@J@@H;;;I" XP(@kP`h813111@fs0" Xh @-00T813111 @B o ; ;3;;; "  00?@,;3;;; fs0"   D|W300 0  B  0~C300 0 "  `0?dU;===@fs0" ` ?{:;===@B ` ~U?-Uu]"Ϟ ~~@ &fs0"Ϟ 7g~]W !cU]UVB  ,`A" >8(v UUW )X@]UUI" Gl;, )H@j 4 7p uu\<),WUՀ #,;$~ Dy;|U}p㔤UWUUaccg`~ |"h4z|>y\0ֆaccg` (@u<X^]U`ӏUUuA1&3  ?,`5W KA1&3 ~~~ 1.4/SWUk1]_UU`Aq's ~~~ +,_2ۀaAq's ~vv A)hF|ˀ UWUUUpa& ~vv (XXr|&ZC *a& vv (`l-3 UA*UP3dzvv F, 7i*Z3dz~v c4 `ڀ0wU׀kUUuX~v  <> uZ~p~~~  ÀUWEUWu\~p~~~ Ns 4`~7kp+_Z Ns ,x5U]`UUWuT  <jWUڪ 9 0>?8UUqUWuT 8@`9j [Z 9@?U_NUUUT 19@ sjhz@ !@{?=v,UUUT@ a8@0w.$j@ Cp@`vx5vՕUUUV@ DӘ@<8l*Cjj F Ә@l8~ufUtX}]UV F @> kU 5`UuV . Ъ* 0@ U5PUuV p?np𺪆:ꪪ `{xUI PUUV 0<xપ몪 0ǀ<|πUF0XUUV`|>ꪠ`:|>UU`XUUUV}|j}<`UU[=UTUUUUV0| yj8~>x5U]VUWUUW =?x?:^= UWUVUWWUU8|8`_~0=5((x?3 UWuUUUWUU*(P@(*(P@(p%UUu]UU]WUU *( ZP@(n`0Iꮪ *.V8@.c0UWWU@UUUUU *bLH8 b p*ShN `VFb(,aNA>??88}UWU`Uu]UU*h ZţXflhp?98>3<<;檫ꪪ0*( Z0Zh(?yy~sUUUPUU]UU 0.. Xh. 8|q` jͰ*6͡l6l*~|lc<@`[JP6)Jad)Ҕ6`x?l?c@qp|??sόfs h0,?p 06 1A>b8~ˈ $A$0x#8/x?_ 6A|?=/?A@?~>?@0Axgv AC?!A  r| >Bche hA$|c>w?8~[At8?@>{8 cZAT870Ǽ7_{ 6[64At p?/O~_> 00$.$a$`/ߞ۫: <7` 1`-`,!y{|k`oBx|@ ?8?|<0 }6ᣀ/x 4@~?<]?߀ ᛂ} p}u?qa%xpp=I ゛O~q%?|@S44 |?H g?p??@H$ x`3PN#ߐ?L0_40H@K2d&~X^d780?4>h@KTppX0~>9ppn p 0JXT@`0~?`> pv7@ʠt 3??<~/Qu`J'che _]^@?y}o0J8h6E[?;}<~?߰{?kJXZcZ0v۬p;|@ K8[? ?}@{ w`I 6 h p;a-`" Ҙ`ǀh?/> >s\?8xPB8?p~0G@ p. .. AUTO PROFIL . .. PROFDISKPRG z RAMDISK PR }` ` #d?<NNTA 0fpa Hz?<&NN\Ai1|* 1z \1z d0:@2D!A Y@2A IIRAA 0RA0A\A0AH0B?< NAT.vuA l"z VVg *.VfV z :%H.A%H6%HN *rRAf%@"z 2"r"v"~vvA "Q6< BQF'.Z RNGad?<NAT@ Jg YfB ` z (vfC2%IrC %IvC%I~BG *2%@+.Cv aCGHaGRaGa 4Vxfa?<*NAT2Ca?<,NAT2CaGva68C/<NAXxk(JgJ@g6 Jg YgGwa`0BCA.Gg/<NXkC=J@gG\/< aXkjC/GP+%A+$g30+bJ@gpc/aXk>C&+&g A k$gB@A2@Pd@dH H ??<+NAXGp/apkLCJ@g(p;.GaZk6CB+J@gGaDk CXAB@HPP??<-NAX`?< NA\G#aR0:fa?BWNA?p//?<NN NuGua(v CBB92B Bd2GaG|`NPBdg2GmaGI`8G)`2B fG`&VBeB dA,J6p `vG[aG5av2|xaVE@xaFaDXa@8Sf 6ava,a`E:aZa"aVG&0000arGa`kBNuG6&G&0000aJG&0000a>Ga,QBNuG6&T&0000BaGaNu/ ?< NA\NuB0H@0 9o^B@H@fNup @v A0@IGa0@IGa0@PG @de@daNu p0@@v A0@IHGax0@?IGaf0GaZNuaD6<` ??<NAX?<NAT @ g* @ e,2@0 @ b @oc`oepNuJCkB@NupNuGgGa0@G @g>G @g$U@n Gg]aGgZaGaGgZaNuAD"x(f-NuY&&D0 = 00000000&:A0 ='NSSP &NUSP ,NADDR+NINST)NSR (NPC 1$DumpY.:Prozessor-Y.:Peripherie-DatenAnweisungsleseschreibzugriff, UserSupervisorInterruptvektorzugriff?????? Y$(Letzter Bombenerfolg durch Busfehlerungerade Wortadresseunzulssige AnweisungDivision durch Nullchk - Anweisungtrapv - BefehlPrivileg-VerletzungTrace ohne geeignete Routinea... - Anweisungf... - Anweisungnicht initialisierten InterruptFehler statt VektornummerAutovektor-Interrupt Stufe 0trap #00Interrupt mit Vektornummer $00Eb1Y5$V1.2 25.9.1987Y6#Spaghetti-Fan-ClubY7(NrnbergY!( KB RRR-Disk mit Ausfhrungsprofil als Drive pA:q installiert.Y48Floppy - Hochlaufzeiten :Y6@Lesen 0.00sY7@Schreiben 0.00sEb1Y#&pRamdisk zerstrt, Speicherkonfiguration anders oder Fremdprogramm.Y%AReset?q [JjYy]fY5\Datum: 0. 0.00Y6\Zeit: 0.00:00Y7[in Ordnung? [JjYy]Y5ceY7[KY5c Y5e. Y5h.KY6c Y6e. Y6h:K W.%;O_n0/2/"zAt`0/BA"zAzfNU@d>0|00(Jk.pQ01|0<JAg0<xrHAxkSjN0/"zx @ d\zdg8N2/ A o4CPB0/ JofHBeSA""""QBNuASAQ`A Nu @&dLH0;NPp.anAJfB 0 g0<BQBNupNupNu2|$a f"x1i,2k1|Ns&,`2|A~0NJfJhg AD"`2|ag2|$af"x3zZ,` AfA>"BNuA@ Nu :,NuH瀀A.R / i@ @dRpLN`` #d?<NNTA0fpahA1z1z0:@2D!A2A IIRAAd0RA0A\A0AH0B?< NAT.v7A6"z&Vg *.lfX : %@.%@6%@N *rRAf%@"z2"r"v"~v8A"Q6<BQF'.Z RNGa?<NAT@ Jg YfdB ` z (vfC2%IrC %IvC%I~G *2%@+Cv aNCGaBG a:GVa(?< NAX0:"faBWNA?p//?<NN Nu/ ?< NA\NuB0H@0 9o^B@H@fNuEY*@V1.2 25.9.1987Y+?Spaghetti-Fan-ClubY,DNrnbergY!1 KB RRR-Disk als Drive pA:q installiert.Y48Floppy - Hochlaufzeiten :Y6@Lesen 0.00sY7@Schreiben 0.00sEY!1pRamdisk zerstrt. Reset?q [JjYy]0/2/"zAn`0/BA"zAzfNU@d>0|00(Jk.pQ01|0<JAg0<xrHAxkSjN0/"zxzjg8N2/ A o4CVB0/ JofHBeSA""""QBNuASAQ`A$ Nu. .. PDIS PRG 2PRIM S PRIM TOS IRAMDISK DOC _IRDMODIF TOS | `~<*o - ЭЭмO// Bg?<JNA A#~HpC"Q?<NNT3fpa(/< #NMJj.~N X`h&@.&N .N XHyN XHyNMX @g6H@@; @ dH0; Nf`RvLDJ(?<NAT"ypA"Q09faBgNA?p//?<NN NuHyN .N X?<?<?<?<N X@.?<?<?<,?<N P"Jg6dSR@?//< NM JgHy}N X`aBNuHy>Hy%/< !`HyZHy0/< "/< N 8.N XNMXJf N PpNuXN XpNu?<`BgHyN .?<'?<'?<?<N T kHy+?<F?<F?<?<N T k*JWg&HyN Xa 9~ѫ/< !NMXHy&N 09faX.Hy*HyBg?<KNAJk JWHy6g/< "NMX 9~`Hy09fpaWN \BNuA&|2/N aN WTJg|1.N XBNu/< "NM.N .NMXH@@; @dH0;N`jHhN .t?<???< ?<N T NuAx Auf akBgHyt/?<ANA\?<NAXJ@k  fHy`Hy\`HyN XB@NuaNgk3H /< ?<HNAT.f .#`Hy?<*NA>N \Hy?<,NA>N\$+ BHy0+H?HpAa$Aa*oAcfSAfSN \fW Aaa2AaAfS/& /?9?<@NA f\x*WBCTD DdL03@ gA/r< Q?S4+ԫa,N \AfSRC Cdea*g`a$?<INA\?9?<>NAXL0nz`f*oC@tRBCd. Bd(2`0HApQACeW  ` Hm@/ 6 ?9?<@NA NuHy&N X/< $NMXJgHy{N Xaa~`Hy,N X3!!TG Gd^03p gA/!< 1< ?4+ԫaN \HyN XAR 6e! pea`BNuHyN .NMXNu ATa.aD/fHyON X AxaHy:N XNu/r < Q/NPPNuA BB4<2ЁQNu$+ BHy0+H?HpAa*$Aa HyN XN .N \Nur0@0 9c^QNuH (yK ygPBl4)|.Bl29|Bl$?<@??<@3a"Roa\??<@SW?-?/9|"aPa@a/<N 8.G` ?/<NM\B@f&_Baha/<NMX"H@ @Pg* @Hg4HA @Kg @Mf4RA Ao`SAk>a`RA An?Aaz`SA Am?A`XL0Nu2/VAph UdHA 0) 0 /?N Hy N X^9 N \< Hy N XNu?<NNT @2-0A2-IS@2-SABBBBQ2-IQNu/<5?3a .@GaXNu?/??/a W o @.mn\Nu0??<@P@ @eX@??<@9|"aB oW@o@ W@o?|@0V@ @eT@?@>@aPoPW W@oPNuAC&""NuAC&"2Nu0//+їA 07)A$NHhN  _B0+ї( (pe.0/HG ??<@??<@9|"B0g,D2/g k`DAr2Ё2-n0-?@aFRoRW W@eP&_Nu/ &o` ?/<NM\B@f&_NuBg?/ W ?<Y/a NuHHy^aX&o?/?/>/aRW/SGe//aFX?< /<NM\Q//a*XB>/SG/<NMX On2OAtIdrVWgrWf`2?0" HA HABA܁H܀/<NM\Qr`BBA>HycaX 2PLNu2/"op @0@IAaD0@IAa60@PA 0m 9n@lT` @de@da Nu oB0/ H@0B@H@fNu2/"o p0@@0@IHAa0@?IAa0AaNu o"/HAB0g 2HA0 2H@@0HAfNuEY,$Ausfhrungsprofil nicht installiert.Y*@V1.2 30.9.1987Y+?Spaghetti-Fan-ClubY,DNrnbergY.'*** Anzeige- und Auswertungsprogramm fr das Ausfhrungsprofil ***Eb1Y5odb1 Y )Gesamt: p qY Adavon im Bereich: p qY apProfil luft!qY7,oBereich von $000000 bis $000000, Bytes pro EintragKY!!000000 Y7D(min.) $JY7!p MEHR q lY7'o K pInit Start Stop Txtanz. Graphik EProfil Exec. Datei ENDEqY*3Keine Programmausfhrung im ProfilbereichY7,oSystemstrung (Interruptvektor verndert)EY4!Prog. Args.Y69(relativ zum Programmbeginn)b1Y7,oFehler: Programm nicht ausgefhrtKoAusfhrungsprofil luft.K angehalten.Klief schon oder StrungK lief nicht oder StrungKY7!Von Datei: Y7#oBinrdatei Textdatei von den ProfildatenK K pabsp. laden erzeugenqY7,oDateioperation erfolgreichKY7,oFehler beim Zugriff auf die DateiKY7,oNicht genug RAM fr Bildung des Textes vorhandenKY7 l *** Ausfhrungsprofil vom 0. 0.1900, 0.00:00 *** Ereignisse aufgenommen: davon im Profilbereich: 000000: hP Y Mit Cursortasten  vert. Mastab, mit  horizontalen Ausschnitt whlenepfq //@6`V07W 0  N "0      2 &B    ($$h "$ & ,">  T  F ~V* * * * * * * * * * * * 32-bit-Primzahlensuche * * geeignet z.B. fr den DR-Assembler * * ohne Unterprogrammbibliotheken zu verwenden * * * * * * * * * * * * gemdos = 1 bios = 13 conout = 2 conin = 7 printlin = 9 setblk = $4a p_init = $90020 ; Funktionsnummern des Ausfhrungs- p_start = $90021 ; profils p_stop = $90022 p_addr = $90023 tp_start = $90025 totcnt = 0 ; Profildatenstruktur startad = 4 scale = 8 entries = 10 .data prim_m dc.b ' ',0,0 pr1 dc.b 27,'E',27,'Y',$21,$2c dc.b '*** Primzahlsuche bis 4.2E9 27.9.1987 ***' dc.b 27,'Y',$22,$2c dc.b '*** Spaghetti - Fan - Club Nrnberg V1.2 ***' dc.b 27,'Y',$24,$28,'von Zahl: ',27,'e',0 in_1 dc.b 27,'Y',$24,$32,27,'K',0 pr2 dc.b 27,'Y',$26,$28,'bis Zahl: ',0 in_2 dc.b 27,'Y',$26,$32,27,'K',0 s_stepm dc.b 27,'Y',$28,$28,'mit Einzelschrittprofil? [JjYy]',0 in_e dc.b 27,'f',13,10,10,0 all_m1 dc.b 13,10,10,' Das waren alle ',0,' ' all_m2 dc.b ' Primzahlen im angegebenen Bereich.',13,10,0 .text entry: move.l 4(a7),A5 ; base page address move.l 12(a5),D0 ; Code add.l 20(a5),D0 ; Daten add.l 28(a5),D0 ; BSS addi.l #$300,D0 ; $100 base page + $200 Stack lea 0(A5,D0.l),A7 ; Stackpointer ber den RAM-Bereich move.l D0,-(A7) ; setzen move.l a5,-(A7) clr.w -(A7) ; junk word move #setblk,-(A7) ; RAM freigeben trap #1 adda.w #12,A7 link A6,#-12 ; Variablen anlegen move.w #1,-(A7) ; 2KB 1:1 Profilbereich pea entry(PC) ; vom Beginn an move.l #p_init,-(A7) ; Initialisierung Ausfhrungsprofil trap #bios adda.w #10,A7 error0: lea in_1,A3 pea pr1-in_1(A3) move.w #printlin,-(A7) trap #gemdos ; Aufforderung zur Eingabe der addq.l #6,A7 ; unteren Grenze numlp1 bsr getnum ; Zahl einlesen bmi sexit bne numlp1 move.l D3,-8(A6) ; und merken adda.w #in_2-in_1,A3 pea pr2-in_2(A3) move.w #printlin,-(A7) trap #gemdos ; Aufforderung zur Eingabe der addq.l #6,A7 ; oberen Grenze numlp2 bsr getnum ; Zahl einlesen bmi sexit bne numlp2 move.l D3,-4(A6) ; und merken move.l -8(A6),D3 ; zu untersuchende Zahl (32 bit) bset #0,D3 ; ungerade machen clr.l -12(A6) ; Primzahlzhler initialisieren adda.w #prim_m-in_2,A3 ; Meldung fr Primzahlen move.l #p_start,-(A7) ; Startcode fr Ausfhrungsprofil pea s_stepm-prim_m(A3) ; Meldung: Einzelschritt oder move.w #printlin,-(A7) ; normal statistisch? trap #gemdos addq.l #6,A7 bsr query ; anfragen: bne.s was_no ; ja oder nein geantwortet? addq.l #tp_start-p_start,(A7) ; wenn ja, dann Einzelschritt was_no trap #bios ; Ausfhrungsprofil starten addq.l #4,A7 * * * * * * * * * * Ab diesem Programmschritt wirkt das Ausfhrungsprofil. * * * * * * * * * * pea in_e-prim_m(A3) move.w #printlin,-(A7) trap #gemdos ; Zeilenvorschub, Cursor aus addq.l #6,A7 move.b #6,13(A3) ; anzeigen: soeben Zeilenvorscub prim0 moveq #1,D2 ; Teiler fr Untersuchung (16 bit) prim1 addq.w #2,D2 ; nchster ungerader Teiler bcs.s isprim ; falls >= 65536, dann D3 auch Primzahl move.l D3,D0 moveq #0,D1 swap D3 ; obere 16 Bits nach unten cmp.w D2,D3 ; wenn obere 16 Bits < Teiler, bcs.s is16b ; dann nur einmal dividieren * ; (Quotient nur 16 bit breit) move.w D3,D1 ; nur obere 16 Bits divu D2,D1 ; obere 16 Bits dividieren move.l D1,D0 ; Rest in oberen 16 Bits swap D1 ; wird obere 16 Bits des Quotienten is16b swap D3 ; nun die unteren 16 Bits move.w D3,D0 ; zusammen mit Rest von letzter Div. divu D2,D0 ; dividieren move.w D0,D1 ; Quotient in D1 (32 bit) swap D0 ; Rest in D0 (16 bit) cmp.l D2,D1 ; falls Quotient < Teiler bcs.s isprim ; dann Primzahl gefunden * ; (hnlich Quadratwurzelkriterium) tst.w D0 bne.s prim1 ; nicht aufgegangen: nchster Teiler p_cont addq.l #2,D3 ; aufgegangen: keine Primzahl, bcs.s all_ps ; nchste ungerade Zahl versuchen, cmp.l -4(A6),D3 ; wenn nchste Zahl > obere Grenze bcs.s prim0 ; oder berlauf, dann Ende bra.s all_ps isprim addq.l #1,-12(A6) ; Primzahl gefunden: mitzhlen lea 10(A3),A0 move.l D3,D1 bsr ltoa ; Zahl aus D3 dezimal umwandeln subq.b #1,13(A3) bne.s nonl ; nach jeder 6. Zahl Zeilenvorschub move.w #$0d0a,10(A3) move.b #6,13(A3) ; neue 6 Zahlen in nchster Zeile bra.s nl nonl move.w #' ',10(A3) nl move.l A3,-(A7) move.w #printlin,-(A7) trap #gemdos ; Zahl ausgeben addq.l #6,A7 bra.s p_cont ; mit nchster Zahl fortsetzen all_ps pea all_m1-prim_m(A3) move.w #printlin,-(A7) trap #gemdos ; Meldung ber Anzahl 1. Teil addq.l #6,A7 lea all_m2-prim_m(A3),A0 move.l -12(A6),D1 ; Anzahl der Primzahlen bsr ltoa ; dezimal umwandeln move.l A0,(A7) ; von Anfang der Ziffernfolge move.w #printlin,-(A7) trap #gemdos ; 2. Teil der Meldung ausgeben addq.l #6,A7 move.l #p_stop,-(A7) trap #bios ; Ausfhrungsprofil anhalten * * * * * * * * * * Dieser Programmschritt wird vom Ausfhrungsprofil nicht * * mehr erfat. * * * * * * * * * * move.l #p_addr,(A7) trap #bios ; Adresse der Profildatenstruktur addq.l #4,A7 ; holen tst.l D0 bmi.s notadr ; wenn gltige Adresse, move.l D0,A0 ; Profiladressen relativ zu Programm- subi.l #entry,startad(A0) ; anfang machen (Assemblerlisting!) notadr move.w #conin,-(A7) ; exit-Bremse trap #1 sexit unlk A6 clr.w (A7) * back to gemdos trap #1 * * * * * * * * * * Zahlen dezimal einlesen * * A3 -> Adresse der Bildschirm-Initialisierungssequenz * * D3 <- 32 bit-Zahl * * D0 0: CR, neg.: sonst. Steuerz., pos.: Nicht-Ziffer * * * * * * * * * * getnum move.l A3,-(A7) move.w #printlin,-(A7) ; Cursor zurcksetzen fr nchste trap #gemdos ; Eingabe addq.l #6,A7 moveq #0,D3 ; dorthin kommt die Zahl bra.s getnbeg getnlp move.w D1,-(A7) move.w #conout,-(A7) ; Echo von letztem Zeichen trap #gemdos addq.l #4,A7 getnbeg move.w #conin,-(A7) trap #gemdos ; ein Zeichen von der Tastatur addq.l #2,A7 cmpi.w #8,D0 ; ? beq.s getnum cmpi.w #13,D0 ; ? beq.s gexit0 ; mit D0=0 zurck cmpi.w #$20,D0 ; sonstiges Steuerzeichen bcs.s gexitN ; mit D0<0 zurck move.w D0,D1 ; fr sptere Ausgabe subi.w #$30,D0 ; Dezimalziffern -> 0 .. 9 cmpi.w #9,D0 ; Dezimalziffer? bhi.s numend move.l D3,D2 swap D2 mulu #10,D2 ; obere 16 Bits * 10 swap D2 tst.w D2 ; wenn berlauf, bne.s getnum ; dann Beginn von vorne move.w D0,D2 ; nur noch obere 16 Bits + neue Ziffer mulu #10,D3 add.l D2,D3 ; alle Bits * 10 + neue Ziffer bcc.s getnlp ; nchste Ziffer bra.s getnum numend moveq #1,D0 ; mit D0>0 zurck rts gexit0 clr.w D0 rts gexitN moveq #-1,D0 rts * * * * * * * * * * 32-Bit-Zahl in dezimale Ziffernfolge umwandeln * * A0 -> Adress ein Byte oberhalb des Zielstrings * * (Ausgabe rechtsbndig) * * D1 -> umzuwandelnde Zahl * * A0 <- Anfangsadresse der umgewandelten Zahl im * * Zielstring * * * * * * * * * * ltoa swap D1 ; obere 16 bit jetzt unten divlp clr.l D0 move.w D1,D0 ; obere 16 bit beq.s b16 divu #10,D0 move.w D0,D1 ; Quotient nach oben, Rest oben in D0 b16 swap D1 move.w D1,D0 ; Rest von oben + untere 16 bit divu #10,D0 move.w D0,D1 ; Quotient nach unten swap D0 ; Rest (16 bit) addi.w #48,D0 ; zugehrige Dezimalziffer move.b D0,-(A0) ; von rechts nach links in String swap D1 ; obere 16 bit wieder unten + CCR bne.s divlp ; solange, bis Zahl vollst. behandelt rts * * * * * * * * * * Ja-Nein-Anfrage * * Z=1 <- ja * * Z=0 <- nein * * * * * * * * * * query move.w #conin,-(A7) trap #gemdos ; ein Zeichen von der Tastatur addq.l #2,A7 andi.b #$df,D0 ; Klein- -> Grobuchstaben cmpi.b #'J',D0 beq.s queryes cmpi.b #'Y',D0 queryes rts ; Z=0 fr Ja zurckgeben .end ` *o - ЭЭO// Bg?<JNA NV?<Hz/< NM GHk?< NA\a"kf-CHk?< NA\akf-C&.Bg/< !Hk?< NA\a^fXNMXHk?< NA\| tTBe0 rHCBe2 HAHC02H@eJ@fTe ohne nderung des Datums gleich zur Zeit. Eingabemglichkeiten (statt "." jedes Sonderzeichen): Datum bleibt gleich, nur Zeit ndern [x]x nur Tag [x]x.[x]x Tag und Monat [x]x.[x]x.xx ganzes Datum keine nderung der Zeit [x]x.xx Stunden und Minuten (Sekunden auf 00) [x]x.xx.xx Stunden, Minuten, Sekunden *---------------------------------------------------------------------* FLOPPY-HOCHLAUFZEITEN Diskettenlaufwerke brachen nach dem Einschalten des Motors eine bestimmte Zeit, um ihre Nenndrehzahl zu erreichen. Erst danach knnen Schreib- und Leseoperationen sicher durchgefhrt werden. Der im Atari ST eingesetzte Floppy-Controller bercksichtigt dies durch eine Wartezeit von fnf Indexpulsen (etwa eine Sekunde), wenn der Laufwerksmotor nicht eingeschaltet war. Fr moderne Diskettenlaufwerke reicht jedoch erheblich weniger Zeit zum Hoch- laufen des Motors aus (z.B. Panasonic JU363 0.5s), auerdem braucht beim Lesen nicht unbedingt die angegebene Zeit gewartet zu werden, denn das TOS liest bei einem Fehler den Sektor ein zweites Mal. Lesefehler drften dabei selten sein, denn der FDC erkennt ein Sektoradrefeld erst dann, wenn sich die Diskette schnell genug dreht. Bei Schreiboperationen mu jedoch im Interesse der Datensicherheit auf die Einhaltung der Hochlauf- zeiten geachtet werden. Um die Diskettenoperationen unter diesen Bedingungen zu beschleu- nigen, nimmt der Ramdisktreiber dem FDC das Abwarten der Hochlauf- zeit ab, in dem er, falls der Laufwerksmotor nicht schon luft, diesen einschaltet und anschlieend die vorgegebene Zeit (abhngig von Lesen/Schreiben) wartet. Die Standardwerte 0.1s (Lesen) und 0.5s (Schreiben) sollten fr die meisten 89mm-Diskettenlaufwerke geeignet sein. Bei mehrmonatigem Betrieb mit einem Panasonic JU363 gab es dabei noch keine Fehler bei Diskettenoperationen. Leider bedient sich das Desktop in einigen Fllen direkt in den Floppy-Routinen des BIOS, ohne ber die hdv-Adressen zu gehen. Diese Operationen (ffnen von Ordnern im Desktop) bleiben natr- lich langsam. Zu dem Artikel "Starten statt warten" in c't 7/87, S 162: Was die auf IBM-Nachbauten knnen, knnen wir auf dem ST schon lange. *---------------------------------------------------------------------* AUSFHRUNGPROFIL Bei dieser Betriebssystemerweiterung wird ein Bereich im 68000- Adreraum ausgewhlt und dieser (bei dieser Implementation) in 1024 gleich groe Unterbereiche aufgeteilt (der Bereich mu dann ein Vielfaches von 2KB an Lnge haben). Jedem Unterbereich wird eine Zhlvariable (unsigned) zugeordnet. Nach Aktivierung des Ausfhrungsprofils wird 200-mal pro Sekunde (mit einem im Atari-ST vorhandenen Interrupt) der aktuelle Stand des Programmzeigers bestimmt und dann, wenn er in den Bereich fllt, die Zhlvariable des entsprechenden Unterbereichs inkrementiert. Durch Auslesen der Zhlvariablen kann ermittelt werden, im welchem Teil von Programmen ein groer Teil der Rechenzeit verbraucht wird (vielleicht sind noch optimierbare kurze Schleifen darunter). UNIX-Erfahrene kennen etwas hnliches mit der Option -p des C-Compilers und dem Kommando prof (a.out) Nachteile dieser Implementation gegenber UNIX: * Datenstruktur der Zhlvariablen nur einmal vorhanden (eben kein Mehrprogrammbetriebssystem) * Keine Angabe von Prozedurnamen (knnte noch hinzugefgt werden bei Programmen mit Symboltabelle) Vorteile gegenber UNIX: * Hhere Auflsung (200 Takte/Sekunde statt 50..100 Takte/Sekunde) * Wahl des Bereiches auch im Betriebssystem mglich. (dort gibt es noch so einige Mglichkeiten zum Auffrisieren, und im Gegensatz zu Mofas und Mopeds strt hier keine Polizei!) V1.2 NEU: * Zustzlich zur statistischen Interruptmethode gibt es nun auch das Einzelschrittprofil. Dabei wird fr jeden zwischen Start- und Stop-Aufruf im Bereich ausgefhrten Programmschritt die seiner Adresse entsprechende Variable hochgezhlt. * Die Datenstruktur des Ausfhrungsprofils bleibt vollstndig ber einen Reset hinaus erhalten und wird somit eine im Profilbereich liegende Endlosschleife zuverlssig anzeigen. * - - - - - - - - Die Datenstruktur des Ausfhrungsprofils in Assembler: (Offset gegenber getpad-Rckgabewert) tcount = 0 * Gesamtzahl der 200Hz-Impulse * bzw. Programmschritte, * whrend das Profil lief * ACHTUNG: * nderung (Verbesserung) in V1.2! startad = 4 * Anfangsadresse des Profilbereiches pscale = 8 * Skalierungsfaktor fr Profil: * 1 -> eine Zhlvariable pro 2 Byte * (Bereichslnge 2KB) * * 2 -> eine Zhlvariable pro 4 Byte * * (Bereichslnge 4KB) .... ptab = 10 * Tabelle der Zhlvariablen * (1024 16bit-Eintrge) in C: struct profil { unsigned long tcount; long startad; /* eigentlich Pointer auf Funktion */ unsigned scale; unsigned ptab[1024]; } .... ; Die Systemaufrufe des Ausfhrungsprofils: pinit = $90020 pstart = $90021 pstop = $90022 getpad = $90023 bios = 13 V1.2 NEU: pstatus = $90024 tpstart = $90025 ........................................................ pinit -- Initialisierung des Ausfhrungsprofils Argumente: newaddr (.l) Anfangsadresse des neuen Profilbereiches newscale (.w) neuer Skalierungsfaktor Der Profilbereiches geht somit von newaddr bis newaddr + 1024 * newscale Funktion: Das Ausfhrungsprofil wird, falls es luft, angehalten. Die Zhlvariablen werden mit 0 besetzt und der neue Profilbereich in der Datenstruktur gesetzt. Aufruf in Assembler: move.w #newscale,-(A7) ; oder andere Quelladressierungsart pea newaddr move.l #pinit,-(A7) trap #bios adda.w #10,A7 in C: #define pinit(newaddr, newscale) bios(0x90020L, newaddr, newscale) Rckgabewert in D0: 0 normale Ausfhrung -1 Skalierungsfaktor 0: nicht erlaubt. -2 Vektor des 200Hz-Interrupts oder Trace-Vektor wurde nach pstart bzw. tpstart von einem anderen Programm verndert: Keine Profil- operationen mehr mglich, sonst Chaos ... <-2 Ausfhrungsprofil nicht installiert .......................................................... pstart -- Ausfhrungsprofil laufen lassen (statistische Methode mit regelmigem Interrupt) Aufruf in Assembler: move.l #pstart,-(A7) trap #bios addq.l #4,A7 in C: #define pstart() bios(0x90021L) Rckgabewert in D0: 0 Ausfhrungsprofil gestartet -1 Ausfhrungsprofil lief schon, Skalierungsfaktor = 0 oder Interrupt-/Tracevektor verndert <-1 Ausfhrungsprofil nicht installiert .......................................................... pstop -- Ausfhrungsprofil anhalten (Interrupt oder Einzelschritt) Aufruf in Assembler: move.l #pstop,-(A7) trap #bios addq.l #4,A7 in C: #define pstop() bios(0x90022L) Rckgabewert in D0: 0 Ausfhrungsprofil angehalten -1 Ausfhrungsprofil lief nicht oder Interruptvektor verndert <-1 Ausfhrungsprofil nicht installiert .......................................................... getpad -- Adresse der Profildatenstruktur ermitteln Aufruf in Assembler: move.l #getpad,-(A7) trap #bios addq.l #4,A7 in C: #define getpad() bios(0x90022L) ... ... = (struct profil *)getpad(); Rckgabewert in D0: Adresse der Profildatenstruktur (falls Profil installiert). Auf die einzelnen Variablen wird mit obigen Offsets zugegriffen, z.B. move.l D0,A0 move.l (A0),... ; tcount move.l startad(A0),.. move.w #100,D0 ; oder andere Quelladressierungsart lsl.w #1,D0 ; .w-Index move.w ptab(A0,D0.w),. ; Zhlvariable 100 (beginnend mit 0) .......................................................... V1.2 NEU: .......................................................... pstatus -- Abfrage: Profil luft/luft nicht Aufruf in Assembler: move.l #pstatus,-(A7) trap #bios addq.l #4,A7 in C: #define getpad() bios(0x90024L) Rckgabewert in D0.l: == 0 , falls Ausfhrungsprofil nicht luft != 0 , falls Ausfhrungsprofil luft .......................................................... tpstart -- Ausfhrungsprofil laufen lassen (Einzelschrittzhlung) Aufruf in Assembler: move.l #tpstart,-(A7) trap #bios addq.l #4,A7 in C: #define tpstart() bios(0x90025L) Rckgabewert in D0: 0 Ausfhrungsprofil gestartet -1 Ausfhrungsprofil lief schon, Skalierungsfaktor = 0 oder Interrupt-/Tracevektor verndert -2 ungeeignete Version von TOS: Bei Einzelschrittzhlung mu dem trap #bios aufrufenden Programm das Trace-Bit im Status- register gesetzt werden. Dies geht nur ber den von TOS an undokumentierter Stelle abgelegten Wert. Bei Installation der RAM-Disk wird ber- prft, ob das Statusregister an der vorgesehenen Stelle (bezglich der in der dokumentierten Systemvariablen $4a2 abgelegten Adresse) steht. Alle bisherigen TOS-Versionen (ROM und Diskette) sind jedoch geeignet. <-1 Ausfhrungsprofil nicht installiert Die Einzelschrittzhluung verlangsamt ein Programm erheb- lich und ist daher besonders zur genauen Untersuchung einzelner Programmteile geeignet. Auerden kann es durch die Verwendung des Trace-Vektors zu Unvertrglichkeiten mit Debuggern kommen. Zwischen tpstart und pstop (nach Breakpoint oder Tastaturunterbrechung) mit dem Debugger auf Einzelschrittbetrieb umzuschalten, ist eine sichere Methode, einen Systemabsturz herbeizufhren oder wenig- stens das Ausfhrungsprofil bis zum nchsten Reset lahm- zulegen. Normaler Programmablauf zwischen tpstart und pstop sollte jedoch auch mit einem geladenen Debugger funktionieren. *---------------------------------------------------------------------* | | | pdis.prg -- Auswertungsprogramm fr Ausfhrungsprofil | | | *---------------------------------------------------------------------* pdis.prg ist ein einfaches Programm zur Inbetriebnahme des Ausfhrungsprofils, zur Ausfhrung von Anwenderprogrammen mit Profil und zur Anzeige (als Text und graphisch) der erhaltenen Informationen. Die einzelnen Funktionen werden mit Hilfe der Funktionstasten angewhlt. F1 Init Aufruf von pinit anzugeben ist die Startadresse des Profilbereiches und die minimale Endadresse des Bereiches. Der Skalierungsfaktor fr pinit wird unter dieser Bedingung minimal gewhlt und der entstandene Profilbereich angegeben. F2 Start Aufruf von pstart Erfolg bzw. Mierfolg wird angezeigt F3 Stop Aufruf von pstop Erfolg bzw. Mierfolg wird angezeigt F4 Txtanz. Ausgabe der Profilinformationen als Text auf dem Bildschirm: Profilbereich Gesamtzahl der 200Hz-Takte bzw. Programmschritte, whrend Profil lief Anzahl der davon in den Bereich gefallenen Takte bzw. Programmschritte Meldung, falls Profil luft alle Zhlvariablen ungleich 0 mit Angabe der Start- adresse des dazugehrigen Unterbereiches F5 Graphik Dasselbe als Sulendiagramm (V1.2 auch Farbmonitor) Der angezeigte Ausschnitt kann mit Hilfe der Cursortasten verndert werden. F6 EProfil Ausfhrung eines Anwenderprogramms mit Einstellung des Ausfhrungsprofils. Nur zu verwenden bei Programmen ohne eigene bios-Profil-Aufrufe. Einzugeben sind: Pfadname des Programms Argumentstring Profilbereich bezglich Startadresse des Programms F7 Exec. Ausfhrung eines Anwenderprogramms, vorzugsweise nach Einstellung von Init und Start oder bei Programmen mit bios-Profil-Aufrufen F8 Datei Die wichtigsten Dateioperationen (weitere Funktionstaste): Der Pfadname der Datei mu angegeben werden. ACHTUNG: Eine Datei gleichen Namens geht bei F1 und F3 verloren!! F1 absp. Profildatenstruktur in eine Binrdatei zur spteren Auswertung abspeichern. F2 laden Profildatenstruktur wird von einer Binrdatei geladen. F3 Textd. Textdatei mit allen Angaben aus der Profildaten- struktur und Systemdatum und -zeit in mehrspal- tigem Format zum Ausdrucken und Editieren erzeugen. F10 ENDE Beenden von pdis.prg - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Das Ramdisksystem ist Public Domain und darf in seinem vollstndigen Zustand mit allen Programmen und Beschreibungen beliebig weitergegeben werden. Quelltexte (in 68000-Assembler, Schlabber-Lechz!), neuere Versionen und neuere andere Programme sind erhltlich bei +-----------------------+ | Wolfgang Windsheimer | | Johannisstrae 62 | | 8500 Nrnberg 90 | +-----------------------+ unter folgenden Bedingungen: + ein ausreichend frankierter Briefumschlag mit formatierter Diskette (einseitig oder zweiseitig, aber max. 81 Spuren, Panasonic JU363 schafft nicht mehr) + ein Aufkleber mit eigener Adresse und ausreichendem Rck- porto (fr einfache Bearbeitung) + 20.- DM als Unkostenbeitrag und Anerkennung fr das Ramdisksystem ______________________________________________________________________ Verwendete Literatur: Brckmann, Englisch, Gerits/ ATARI ST intern (Data Becker) c't 11/86 (Heise Verlag) `~@ o ( ШШO//Bg?<JNA HzHz?<&NN\# J.Av3 Z/?<&NN Je^v C J Y2Gat3<#v]GabGaXG~alGVRyT gBg/?<=NAPJ@k6Hy /<*??<?NAP.??<>NAX *fGav A >C B@"f" yTd0Qf` 2 VfZaaC ZGXaaC N2X"r0202aaaG\a2a0+@7@gaj?<NAT @g0J@fH@@; @ bH0;NB\|?9 Z?< Ga$Xk 3 NaG\a`Gkfa`|?<BgGaXk3 Ra`?<BgGaXk3 Ta`aJ@kbfl`akRBgGR0H/3?<=NAP6m$Hy /<*??<?NAP.??<>NAX *fA > h` f h#fCrp02p02C pHVf0kff +?g^`A JCp2Q?<0H/3?<=NAP6mHy /<*??<@NAP.??<>NAX *f^J@kZa fdBg?< NA\F'B B:.X PNG6ah?<NAT@ Jg YNuGj`G`G`Ga0?<NAG a"BgNAB0H@0 9o^B@H@fNu/ ?< NA\NuG`& C N`(GjC R` GtC T6 ? Qdv aNuAT0H @dF/0/0`0AR0Pg0 @da09RH @dAV/0/0Bg?<VNA Nu0|/Hz0@# \F'CF o`FP0F@0PgFX# 9rD@3 N#. V Nu.y \NsaBC` ??<NAX?<NAT @ g @ e$2@0 @ b @oc`oepNupNuEY".RAM-Disk - M o d i f i k a t i o n s p r o g r a m mY$0 KB RAM vorhanden (Obergrenze $000000).Y'QV1.2 25.9.1987Y)PSpaghetti-Fan-ClubY*UNrnbergY'(Eingerichtet: ???? KB RAM-DiskY)(Verfgbar: KBY5! KBY52 ms Y59 msfY5*mit Y5*ohneY6"pRAM-Y7!Disk-Y8!GreY6(Ausfh-Y7)rungs-Y8)profilY72HochlaufzeitY80LesenY86SchreibenY6XEinrich-Y7ZtungY8XRAM-DiskY6bkeineY7bRAM-Y8bDiskY8hAbbruchqY,8ACHTUNGY-(Diese nderung fhrt zum Reset.Y.(Der Inhalt der vorherigen Ramdisk undY/(alle residenten Programme gehen dabeiY0(verloren. Ist das beabsichtigt? [JjYy]Y5! Y5!eY52 eY59 e\auto\ramdisk.prg\auto\profdisk.prg\auto\ramdisk.pr\auto\profdisk.pr /@Y,(Systemfehler: RAM-Obergrenze nicht im 128KB-Raster.Y0(Ramdiskprogramm fehlt!KY0(Ramdiskprogramm unbrauchbar!KY0(Modifikation des Ramdiskprogramms unmglich!KEF  ,*j  (,R,P 6 (> 2. .. FATDISK C ؓ\'FORMACC C ܓ *FORMAT ACC aFORMAT DEF FORMAT PRG GFORMAT RSC "GEMDEFS H #*MOUSE INC 'MUD INC (_WORK INC )/************************************************************************/ /* GEM Deklarationen */ /************************************************************************/ #define NORMAL 0x0 #define SELECTED 0x1 #define SHADOWED 0x20 extern long xbios(); #define Dosound(a) xbios(32,a) #define format(a,b,c,d,e,f,g,h,i) xbios(0x0a,a,b,c,d,e,f,g,h,i) #define writes(a,b,c) xbios(0x09,a,0l,0,c,b,0,1) #define makeboot(a) xbios(0x12,a,0x01111111l,2 + (s1 ? 1 : 0),0) #define state(x) *(zeiger + (x * 12) + 5) #define TRUE 1 #define FALSE 0 /************************************************************************/ /* Included Files ~ Nachzuladende Routinen */ /************************************************************************/ #include "gemdefs.h" #include "mud.inc" int phys_handle; #include "_work.inc" int hidden; #include "mouse.inc" /************************************************************************/ /* Titelindex und Eintragsindex */ /************************************************************************/ #define TREE1 0 #define spt9 13 #define spt10 14 #define sf354 17 #define sf314 18 #define tracks79 8 #define tracks80 9 #define tracks81 10 #define tracks82 11 #define QUIT 5 #define START 4 /************************************************************************/ /* Globale Deklarationen */ /************************************************************************/ int *menuaddr; /* Adresse des Menbaumes */ int hhchar,hwchar,hhbox,hwbox; int xdesk,ydesk,wdesk,hdesk; int xwork,ywork,wwork,hwork; int *zeiger; short int index,x1,y1,w1,h1; int xk,yk,radius = 85,x2k; int sides,spt; char c,*sbuff,track,tracks; int count,sector,tr,se; long buffn[2048],ser_number,s1,*buff; /************************************************************************/ /* Hauptverwaltungs- und Initialisierungsroutine */ /************************************************************************/ main() { int ergebnis; char *resource = "format.rsc"; appl_init(); phys_handle = graf_handle (&hhchar,&hwchar,&hhbox,&hwbox); open_work(); rsrc_load (resource); graf_mouse (ARROW, 0x0L); /* Pfeil als Maus */ hidden = FALSE; rsrc_gaddr(1,TREE1,&zeiger); /* holt Startadresse */ set_select(spt10); /* setzt 10 SpT invers */ set_select(sf314); /* setzt SF314 invers */ set_select(tracks82); /* setzt 82 Tracks invers */ while (TRUE) { hide_mouse(); /* Maus verstecken */ formular(); /* gibt Formular aus */ circle(); /* zeichnet den leeren Kreis */ show_mouse(); /* Maus wieder zulassen */ edit(); /* wartet das Formular */ if (index == QUIT) break; test_select(); /* testet auf SELECTED & setzt */ /* tracks, sides */ format_disk(); /* formatiert diskette */ objc_change(zeiger,index,0,x1,y1,w1,h1,NORMAL,1); } schliess(); /* schliesst Formular */ close_work(); } /************************************************************************/ /* Subroutine zum ausgeben eines nicht-editierbaren formulares */ /************************************************************************/ formular() { form_center (zeiger, &x1,&y1,&w1,&h1); form_dial (0, x1,y1,w1,h1, x1,y1,w1,h1); form_dial (1, 10,10,20,20, x1,y1,w1,h1); objc_draw (zeiger,0,2, x1,y1,w1,h1); music(); xk = x1+95; x2k = xk+(radius*2)+4; yk = y1+160; } /************************************************************************/ /* wartet das Formular */ /************************************************************************/ edit() { index=form_do (zeiger,0); } /************************************************************************/ /* Schliesst Formular */ /************************************************************************/ schliess() { form_dial (2, 10,10,20,20, x1,y1,w1,h1); form_dial (3, x1,y1,w1,h1, x1,y1,w1,h1); } /***********************************************************************/ /* Musik spielen */ /***********************************************************************/ music() { static char sound[]={0,200,1,0,7,254,11,255,12,110,13,9,8,16,255,0}; Dosound(sound); } /********************** Setzt Fllattribute ****************************/ set_attr() { vsf_color(handle,1); vsf_interior(handle,1); vsf_perimeter(handle,0); vswr_mode(handle,1); } /***********************************************************************/ /* gibt Kreis aus */ /***********************************************************************/ circle() { int pxyarray[4],x; pxyarray[0] = xk + radius; pxyarray[1] = yk; pxyarray[2] = xk; pxyarray[3] = yk; vsl_color(handle,1); vsl_type(handle,1); vswr_mode(handle,1); vsl_width(handle,1); vsl_ends(handle,0,0); v_arc(handle,xk,yk,radius,0,3600); pxyarray[0] = x2k + radius; pxyarray[2] = x2k; v_arc(handle,x2k,yk,radius,0,3600); vsf_color(handle,1); vsf_interior(handle,0); vsf_perimeter(handle,1); for (x=0; x < 3600; x=x+86) { /* 86 = Abstand */ v_pieslice(handle,xk,yk,radius,x,x+86); v_pieslice(handle,x2k,yk,radius,x,x+86); } } /******************* setzt Select von 1 Button ******************/ set_select(index) int index; { /* objc_change(zeiger,index,0,x1,y1,w1,h1,SELECTED | SHADOWED,1); */ state(index) = (SELECTED | SHADOWED); } /************************************************************************/ /* Testet auf SELECTED */ /************************************************************************/ test_select() { if ((state(spt9) & SELECTED) == SELECTED) spt = 9; else spt = 10; if ((state(sf314) & SELECTED) == SELECTED) sides = 1; else sides = 0; tracks=1; if ((state(tracks79) & SELECTED) == SELECTED) tracks = 80; /* 790 */ if ((state(tracks80) & SELECTED) == SELECTED) tracks = 81; /* 800 */ if ((state(tracks81) & SELECTED) == SELECTED) tracks = 82; /* 810 */ if ((state(tracks82) & SELECTED) == SELECTED) tracks = 83; /* 820 */ } /************************************************************************/ /* Formatiert eine ganze Diskette */ /************************************************************************/ format_disk() { int bttn,blk; blk = tracks * spt; buff = buffn; sbuff = buff; s1 = sides; bttn = form_alert(1,"[1][Insert the Diskette,|then press RETURN|Note: All Data will be|erased !][ OK | Cancel ]"); if (bttn == 1) { if (!write_disk(buff,s1)) { for(count = 0; count < 512; *(sbuff + count++) = 0); makeboot(buff); *(sbuff + 0x13) = (blk + (s1 ? blk : 0)) & 0xff; *(sbuff + 0x14) = ((blk + (s1 ? blk : 0)) >> 8) & 0xff; *(sbuff + 0x18) = spt; tr = 0; se = 1; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); *(sbuff) = 0xf7; *(sbuff + 1) = 0xff; *(sbuff + 2) = *(sbuff + 1); tr = 0; se = 7; writes(buff,tr,se); tr = 0; se = 2; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); tr = 1; se = 3; writes(buff,tr,se); } else form_alert(1,"[1][Error found while|formatting Diskette!|Check it or use|another one!][ OK ]"); } } /************************************************************************/ /* Formatiert alle tracks */ /************************************************************************/ write_disk(puffer,s) /* formatiert tracks */ long *puffer,s; { int winkel,abstand = 86; set_attr(); /* setzt PIE-Attribute */ for(track = 0,winkel = 0; track < tracks; track++,winkel=(winkel+abstand)) { if(0 == format(puffer,0l,0,10,track,0,1,0x87654321,0l) && (s ? 0 == format(puffer,0l,0,10,track,1,1,0x87654321,0l) : 1)) { if ((winkel+abstand) <= 3612) { /* 3612=42tracks*abstand */ hide_mouse(); v_pieslice(handle,xk,yk,radius,winkel,winkel+abstand); show_mouse(); } else { hide_mouse(); v_pieslice(handle,x2k,yk,radius,winkel-3612,winkel+abstand-3600); show_mouse(); } } else return(2); } return(0); } /************************************************************************/ /* GEM Deklarationen */ /************************************************************************/ #define NORMAL 0x0 #define SELECTED 0x1 #define SHADOWED 0x20 extern long xbios(); #define Dosound(a) xbios(32,a) #define format(a,b,c,d,e,f,g,h,i) xbios(0x0a,a,b,c,d,e,f,g,h,i) #define writes(a,b,c) xbios(0x09,a,0l,0,c,b,0,1) #define makeboot(a) xbios(0x12,a,0x01111111l,2 + (s1 ? 1 : 0),0) #define state(x) *(zeiger + (x * 12) + 5) #define TRUE 1 #define FALSE 0 /************************************************************************/ /* Included Files ~ Nachzuladende Routinen */ /************************************************************************/ #include "gemdefs.h" #include "mud.inc" int phys_handle; #include "_work.inc" int hidden; #include "mouse.inc" /************************************************************************/ /* Titelindex und Eintragsindex */ /************************************************************************/ #define TREE1 0 #define spt9 13 #define spt10 14 #define sf354 17 #define sf314 18 #define tracks79 8 #define tracks80 9 #define tracks81 10 #define tracks82 11 #define QUIT 5 #define START 4 /************************************************************************/ /* Globale Deklarationen */ /************************************************************************/ int *menuaddr; /* Adresse des Menbaumes */ int hhchar,hwchar,hhbox,hwbox; int xdesk,ydesk,wdesk,hdesk; int xwork,ywork,wwork,hwork; int *zeiger; short int index,x1,y1,w1,h1; int xk,yk,radius = 85,x2k; int sides,spt; char c,*sbuff,track,tracks; int count,sector,tr,se; long buffn[2048],s1,*buff; extern int gl_apid; /************************************************************************/ /* Hauptverwaltungs- und Initialisierungsroutine */ /************************************************************************/ main() { int msgbuff[8],mx,my,ret,event; int ergebnis,menu_id; char *resource = "format.rsc"; appl_init(); menu_id = menu_register(gl_apid," MaxiTrack v0.2 "); rsrc_load (resource); hidden = FALSE; rsrc_gaddr(1,TREE1,&zeiger); /* holt Startadresse */ set_select(spt10); /* setzt 10 SpT invers */ set_select(sf314); /* setzt SF314 invers */ set_select(tracks82); /* setzt 82 Tracks invers */ /*************************************************/ /* Multi-Event... */ /*************************************************/ while (TRUE) { event=evnt_multi(0x0012,1,1,1,0,0,0,0,0,0,0,0,0,0,msgbuff,0,0,&mx,&my,&ret,&ret,&ret,&ret); wind_update(TRUE); /* andere Programme abschalten */ if((msgbuff[0] == 40) && (msgbuff[4] == menu_id)) { /* case of AC_OPEN */ phys_handle = graf_handle (&hhchar,&hwchar,&hhbox,&hwbox); open_work(); while (TRUE) { hide_mouse(); /* Maus verstecken */ formular(); /* gibt Formular aus */ circle(); /* zeichnet den leeren Kreis */ show_mouse(); /* Maus wieder zulassen */ edit(); /* wartet das Formular */ if (index == QUIT) break; test_select(); /* testet auf SELECTED & setzt */ /* tracks, sides */ format_disk(); /* formatiert diskette */ objc_change(zeiger,index,0,x1,y1,w1,h1,NORMAL,1); } /* end of while */ objc_change(zeiger,index,0,x1,y1,w1,h1,NORMAL,0); /* QUIT deinvert */ schliess(); /* schliesst Formular */ v_clsvwk(handle); /* und STATION wieder closen */ } /* end of if-- */ wind_update(FALSE); /* Multitasking wieder erlauben */ } /* end of Event-Loop */ } /* end of Main */ /************************************************************************/ /* Subroutine zum ausgeben eines nicht-editierbaren formulares */ /************************************************************************/ formular() { form_center (zeiger, &x1,&y1,&w1,&h1); form_dial (0, x1,y1,w1,h1, x1,y1,w1,h1); form_dial (1, 10,10,20,20, x1,y1,w1,h1); objc_draw (zeiger,0,2, x1,y1,w1,h1); music(); xk = x1+95; x2k = xk+(radius*2)+4; yk = y1+160; } /************************************************************************/ /* wartet das Formular */ /************************************************************************/ edit() { index=form_do (zeiger,0); } /************************************************************************/ /* Schliesst Formular */ /************************************************************************/ schliess() { form_dial (2, 10,10,20,20, x1,y1,w1,h1); form_dial (3, x1,y1,w1,h1, x1,y1,w1,h1); } /***********************************************************************/ /* Musik spielen */ /***********************************************************************/ music() { static char sound[]={0,200,1,0,7,254,11,255,12,110,13,9,8,16,255,0}; Dosound(sound); } /********************** Setzt Fllattribute ****************************/ set_attr() { vsf_color(handle,1); vsf_interior(handle,1); vsf_perimeter(handle,0); vswr_mode(handle,1); } /***********************************************************************/ /* gibt Kreis aus */ /***********************************************************************/ circle() { int pxyarray[4],x; pxyarray[0] = xk + radius; pxyarray[1] = yk; pxyarray[2] = xk; pxyarray[3] = yk; vsl_color(handle,1); vsl_type(handle,1); vswr_mode(handle,1); vsl_width(handle,1); vsl_ends(handle,0,0); v_arc(handle,xk,yk,radius,0,3600); pxyarray[0] = x2k + radius; pxyarray[2] = x2k; v_arc(handle,x2k,yk,radius,0,3600); vsf_color(handle,1); vsf_interior(handle,0); vsf_perimeter(handle,1); for (x=0; x < 3600; x=x+86) { /* 86 = Abstand */ v_pieslice(handle,xk,yk,radius,x,x+86); v_pieslice(handle,x2k,yk,radius,x,x+86); } } /******************* setzt Select von 1 Button ******************/ set_select(index) int index; { /* objc_change(zeiger,index,0,x1,y1,w1,h1,SELECTED | SHADOWED,1); */ state(index) = (SELECTED | SHADOWED); } /************************************************************************/ /* Testet auf SELECTED */ /************************************************************************/ test_select() { if ((state(spt9) & SELECTED) == SELECTED) spt = 9; else spt = 10; if ((state(sf314) & SELECTED) == SELECTED) sides = 1; else sides = 0; tracks=1; if ((state(tracks79) & SELECTED) == SELECTED) tracks = 80; /* 790 */ if ((state(tracks80) & SELECTED) == SELECTED) tracks = 81; /* 800 */ if ((state(tracks81) & SELECTED) == SELECTED) tracks = 82; /* 810 */ if ((state(tracks82) & SELECTED) == SELECTED) tracks = 83; /* 820 */ } /************************************************************************/ /* Formatiert eine ganze Diskette */ /************************************************************************/ format_disk() { int bttn,blk; blk = tracks * spt; buff = buffn; sbuff = buff; s1 = sides; bttn = form_alert(1,"[1][Insert the Diskette,|then press RETURN|Note: All Data will be|erased !][ OK | Cancel ]"); if (bttn == 1) { if (!write_disk(buff,s1)) { for(count = 0; count < 512; *(sbuff + count++) = 0); makeboot(buff); *(sbuff + 0x13) = (blk + (s1 ? blk : 0)) & 0xff; *(sbuff + 0x14) = ((blk + (s1 ? blk : 0)) >> 8) & 0xff; *(sbuff + 0x18) = spt; tr = 0; se = 1; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); *(sbuff) = 0xf7; *(sbuff + 1) = 0xff; *(sbuff + 2) = *(sbuff + 1); tr = 0; se = 7; writes(buff,tr,se); tr = 0; se = 2; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); tr = 1; se = 3; writes(buff,tr,se); } else form_alert(1,"[1][Error found while|formatting Diskette!|Check it or use|another one!][ OK ]"); } } /************************************************************************/ /* Formatiert alle tracks */ /************************************************************************/ write_disk(puffer,s) /* formatiert tracks */ long *puffer,s; { int winkel,abstand = 86; set_attr(); /* setzt PIE-Attribute */ for(track = 0,winkel = 0; track < tracks; track++,winkel=(winkel+abstand)) { if(0 == format(puffer,0l,0,10,track,0,1,0x87654321,0l) && (s ? 0 == format(puffer,0l,0,10,track,1,1,0x87654321,0l) : 1)) { if ((winkel+abstand) <= 3612) { /* 3612=42tracks*abstand */ hide_mouse(); v_pieslice(handle,xk,yk,radius,winkel,winkel+abstand); show_mouse(); } else { hide_mouse(); v_pieslice(handle,x2k,yk,radius,winkel-3612,winkel+abstand-3600); show_mouse(); } } else return(2); } return(0); } `$6).|^N.NA"/0<NBNuNV3Bn`0n0Rn n m3.(/</<N PN^NuNV>N NN^NuNVJyfB?<NT3N^NuNVJygB?<NTByN^NuNV-|N(.?9NT=@.NBy.Bg?<NX>aH>a@> a8`p./////BgBg/BgBgBgBgBgBgBgBgBgBg?<?<?<?<N8=@>N n(f0.nf./<>/</<Nb 3a `^aaaaa y>gBara>Bg?9>?9?9?9Bg?9>/9N2`BWBg?9>?9?9?9Bg?9>/9N2aN>N BWN`N^NuNV.>/</</</9N>>?9?9?9?9>?9?9?9BgN>>?9?9?9?<?<?< ?< ?<N>>?9?9?9?<Bg/9Na09|_3z09@yzX@3>09|3|N^NuNVBW/9NzX3>N^NuNV>>?9?9?9?<?<?< ?< ?<N>>?9?9?9?9>?9?9?9?<NN^NuNV.?< NTN^NuNV>?9N T>?9N DTBW?9N ~T>?9N .TN^NuNV09zy=@=y|=yz=y|>?9N T>?9N.T>?9N .T>?9NhTBWBg?9N X>Bg?9?9|?9z?9N h 09>y=@=y>>Bg?9?9|?9>?9N h >?9N TBW?9N DT>?9N ~TBn`l>WV?.?9?9|?9z?9N >WV?.?9?9|?9>?9N 0.|V=@ nmN^NuNV0.Hй @1|! N^NuNV y(Cg 3 >`3 > y(g 3>`By> y(gP y(gQ y(gR y(gSN^NuNV9H>=@##>0y>#.?<NT=@ nf8./9a,XJ@fBy`0y>BRy ymBWJg?<`BgTW/</9?<N Jg0.`B@n|"y>@Jg0.`B@n@|"y>@09>"y>@By3>>Bg?9?9>BgB/9?< NBy`0y>BRy ym y> y>| y>"y>iBy3>>Bg?9?9>BgB/9?< NBy3>>Bg?9?9>BgB/9?< NBy`0y>BRy ym33>>Bg?9?9>BgB/9?< N`. ?<NTN^NuNV=|VaB9>Bn`0B/H??< BgB/.?< NJfJ gBB/H??< BgB/.?< NJgB@`p`pJ@g0.n|n0.W?.?9?9|?9z?9N a`Ba>0.WW?.W?9?9|?9>?9N a`p`&R9>0.n=@9>H9mB@N^NuNV3 z3 By33N09zN^NuNV3 3 ByByByBy3By3z3|3 3333NN^NuNV3eByBy3NN^NuNV#f#n .мZ#r3dBy3  n 3N n 0#zf#zn#r#jN^NuNV3 3 ByByByBy3By3z3|3 3333NN^NuNV3 z3By33N09zN^NuNV3 z3By33N09zN^NuNV3 z3hBy33N09zN^NuNV3 z3By33N09zN^NuNV3 z3 |3lBy33NN^NuNV3 z3By33N09zN^NuNV3 By33By3N09N^Nu#b"<bpsNBNuNV30.|Hм$-@=|` nH2n2RRn nm.NB@09N^NuNV#~####>#>#~> aF3pN^NuNV>a*pN^NuNV33 3 333333 3 333 3"#$>3(3*>N n,0 n00 n40 n80" n<0$ n@0&B@09N^NuNV#>3 >2NN^NuNV33 3 333333 >3NN^NuNV3# >>4NN^NuNV#>>6N n 0 n0 n0 n0"B@09N^NuNV>MN n0 n 0 n0 n0"B@09N^NuNV3# >>NNN^NuNV3# >>#NN^NuNV#>3 33333>*NN^NuNV#>3 3333333>/NN^NuNV#>>nNN^NuNV33 >pN n >B@09N^NuNV3>kNN^Nu#vNN/9vNu#vNM/9vNu#vNA/9vNu U n format.rsc MaxiTrack v0.2 [1][Insert the Diskette,|then press RETURN|Note: All Data will be|erased !][ OK | Cancel ][1][Error found while|formatting Diskette!|Check it or use|another one!][ OK ]   "                      2                    (@,    $             TREE1`H$)*O.|l*m - ЭЭм// ??<JNA N/<NA"/0<NBNuNV3Bn`0n0Rn n m3.:/</<N LPN^NuNV>N "NN^NuNVJyfB?<NT3N^NuNVJygB?<NTByN^NuNV-|Nf./<a:>a2> a*`\a*adazaFal yBg?9?9N HT>?9N TBW?9N T>?9N lTN^NuNV09y=@=y=y=y>?9N T>?9N lT>?9N lT>?9N TBWBg?9N 0X>Bg?9?9?9?9N 09Bg?9?9?9?9N HTBW?9N T>?9N TBn`l>WV?.?9?9?9?9N >WV?.?9?9?9Bg?9?9Bg?9?9Bg?9?9Bg?9?90.W?.?9?9?9?9N a`Ba>0.WW?.W?9?9?9B@09,N^NuNV### #,#<#<#> aF3,pN^NuNV>a*pN^NuNV#<3  >2N N^NuNV3 3 3 333333>3N N^NuNV3 # <>4N N^NuNV#<>6N n 0. n00 n02 n04B@09,N^NuNV>MN n0. n 00 n02 n04B@09,N^NuNV3 # <>NN N^NuNV#<3  33333>*N N^NuNV#<3  3333333>/N N^NuNV#<>nN N^NuNV3 3 >pN n