Seitdem Atari die Preise fĂŒr die Festplatten gesenkt hat, bekommen immer mehr STs solch einen schnurrenden Schuhkarton (neuerdings ein schnurrender Aktenkoffer) als schnellen Speicher dazugestellt. Doch wenn die Platte langsam voll wird, kommen einem bedenken, ob man auch wirklich alles getan hat, um die Datensicherheit zu gewĂ€hrleisten.
Langsam fĂ€ngt man an, Backups von allen wichtigen Dateien anzufertigen. Viele Gefahren drohen unseren Daten! Eine dieser Gefahren ist der Headcrash. Dabei kommt der Schreib-Lese-Kopf auf die PlattenoberflĂ€che. Die Folgen sind Datenverlust und Verlust eines Schreib-Lese-Kopfes. Dies kann bei ein- oder ausgeschaltetem GerĂ€t passieren. Aber ein Headcrash kommt glĂŒcklicherweise nicht sehr hĂ€ufig vor. Die Festplatte ist gegen hĂ€rtere StöĂe sehr empfindlich. Um sie beim Transport dagegen zu schĂŒtzen, werden die Köpfe in nicht benutzte Spuren gefahren. Somit ist ein Datenverlust fast ausgeschlossen. Bei portablen PCs mit Festplatte findet man schon einige Modelle mit Autoparkingfunktionen, d.h. die Köpfe werden beim Abschalten des GerĂ€tes in die Parkposition gefahren. So etwas wĂ€re natĂŒrlich fĂŒr unsere Festplatte auch eine sehr schöne Sache. Um nicht an der Hardware basteln zu mĂŒssen, habe ich das Problem ĂŒber die Software gelöst. Atari hat auch schon an eine derartige Möglichkeit gedacht und das âSHIP.PRG' seiner Bootdisk beigelegt. Dies ist aber keine sehr schöne Lösung, wie ich meine. Da die meisten Festplatten schon autobootfĂ€hig sind, braucht man nicht mehr unbedingt eine Floppy zum Starten des Systems. Wenn man nun aber die Festplatte parken möchte und das âSHIP.PRGâ dazu benutzt, braucht man auf jeden Fall eine Floppy. Denn wenn man das Parkprogramm von der Festplatte startet, wird die Platte zunĂ€chst geparkt, danach jedoch kommt man wieder auf den Desktop zurĂŒck, der sofort versucht, das Directory erneut zu öffnen. Die Köpfe werden bei dieser Aktion wieder aus der Parkposition gefahren. Also bleibt nur noch die Möglichkeit, alle Festplattenfenster zu schlieĂen, und âSHIP.PRGâ von der Floppy zu laden. Aus diesem Grunde habe ich ein Programm geschrieben, das als Accessory stĂ€ndig im Desktop zugĂ€nglich ist. Mit diesem kann man nach jeder Sitzung (am ST natĂŒrlich!) die Festplatte parken und dann das System abschalten. So kann die Festplatte optimal geschĂŒtzt werden.
ErlÀuterung zum Programm:
In der vorliegenden Version wird nur das Laufwerk 0 am Harddisk-Controller 0 geparkt. Es gibt neuerdings aber schon AufrĂŒstkits fĂŒr die Festplatte, bei denen ein zweites Laufwerk installiert wird. Andererseits gibt es auch die Möglichkeit, mehrere Festplattensysteme Ă la SH205 (mit DMAIn und DMA_out) parallel anzuschlieĂen. FĂŒr diese Systeme muĂ das Programm etwas modifiziert werden. Ab dem Label âcd_tblâ steht eine Tabelle der zu parkenden Festplatten. FĂŒr jedes zu parkende Laufwerk sind zwei Angaben nötig. Das sind HD-Controller und HD-Laufwerk. Die Tabelle muĂ mit â0xff,0xffâ abgeschlossen werden. Dies kennzeichnet das Ende der Tabelle.
Soll also z.B. eine zusĂ€tzlich angeschlossene Festplatte mit der Adresse 1 (DIP-Schalter im GehĂ€use) auch geparkt werden, lautet die Tabelle: â0,0,l,0,0xff,0xffâ
Wenn in dieser Festplatte 2 Laufwerke mit den Nummern 0 und 1 eingebaut sind, lautet die Tabelle: â0,0,1,0,1,1,0xff,0xffâ ^^ Controller Nr.-+ +- Laufwerk
Nr. usw.
Jetzt kann ich nur noch fröhliches Parken wĂŒnschen...
Holger Brieger
/**********************************/
/* */
/* Festplatte(n) parken */
/* */
/* programmiert mit MEGAMAX C */
/* */
/* von: Holger Brieger */
/* Luftschifferweg 19 */
/* 1000 Berlin 20 */
/* v.31.10.87 */
/**********************************/
#include <gemdefs.h>
#include <osbind.h>
int contrl[12],intin[128],ptsin[128],
intout[128],ptsout[128],
msgbuff [8] ,menu_id, auswahl;
char alert_string [ ] =
"[2][| Festplatte(n)| parken?]
[Ja|Abbruch]";
long save_ssp;
extern gl_apid;
main()
{
appl_init();
/* Applikation initialisieren */
menu_id=menu_register (gl_apid,
" Harddisk parken"); /* ACC einklinken */
while(1) /* Endlosschleife */
{
evnt_mesag(msgbuff) ;
/* Auf Ereignis warten */
if (msgbuff [0] ==AC_OPEN)
/* ACC oeffnen ? */
{
auswahl=form_alert(1,alert_string) ;
/* Alertbox zeichnen */
if (auswahl==1)
/* HD wirklich parken ? */
{
park_hd(); /* Ja, parken */
}
}
}
}
park_hd()
{
register int lp_count, command, com_count,
cd; /* Einige Variablen */
register char *wdc, *wdl;
/* brauch man schon */
save_ssp=Super(0L);
/* Supervisor anschalten */
asm
{
st 0x43E
/* Floppy VBL sperren */
lea 0xFFFF8604,wdc
/* FDC Access Reg. */
lea 0xFFFF8606,wdl
/* DMA Mode/Status Reg. */
lea cd_tbl,A0
/* Addresse der Tabelle */
/* zu parken den HDs */
test_table:
tst.b (A0)
/* Alle HD' s geparkt ? */
bmi. s ende
/* Ja, fertig! */
move.w #0x88,(wdl)
/* DMA selektieren */
move.l #0x001bO088,command
/* Park Kommando */
bsr. s set_cd
/* Controllernr. einsetzen */
bsr.s com_out
/* 1. Byte senden */
move.l #0x0000008a,command
/* Kommandobyte sichern */
bsr.s set_cd
/* Laufwerknr. einsetzen */
bsr.s com_out
/* 2. Byte senden */
move.1 #2, com_count
/* es folgen 3 kommandobytes */
next_command:
move.l #0x0000008a,command
/* Kommandobyte sichern */
bsr.s com_out
/* und 3.-5. Byte senden */
dbf com_count, next_command
/* naechstes Byte */
move.l #10,(wdc)
/* 6. Byte senden */
move #0x190,lp_count
/* timeout jetzt laenger */
bsr.s timeout_lp
/* timeout testen */
move #0x8a,(wdl) ;
/* Status Reg. selektieren */
move (wdc) , lp__count
/* Status lesen */
move #0x80,(wdl)
/* HDC deselektieren */
bra.s test_table
/* Zur naechsten HD */ j
cd_tbl:
/* Tabelle der zu parkenden */
dc.b 0,0,0xff,0xff
/* Controller und Laufwerken */
com_out:
/* Kommandobyte senden */
move.l command,(wdc)
move.1 #10,lp_count
/* Timeoutzaehler */
timeout_lp:
add.1 0x 4BA,lp_count
/* 200Hz Zaehler addieren */
timer_lp:
btst #5,0xFFFFFA01
/* HDC interrupt ? */
beq.s dma_ready
/* ok, fertig */
cmp.l 0x4BA,lp_count
/* timeout? */
bne.s timer_lp
/* noch nicht */
dma_ready:
rts
set_cd:
clr.l cd
/* Controller bzw Laufwerksnr. */
move.b (A0)+,cd /* holen */
lsl.l #5, cd
/* in Bit 5 schieben */
swap cd
/* High und Low word vertauschen */
or.l cd,command
/* und mit Kommando verknuepfen */
rts
ende:
sf 0x43E
/* Floppy VBL freigeben */
}
Super(save_ssp); /* Supervisor abschalten */
Cconout(7); /* und einmal Bellen */
}