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,Oxff,Oxff
/* 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 */
}