atari-home.de - Foren
Software => Coding => Thema gestartet von: Count am So 25.03.2018, 20:21:55
-
Hallo zusammen,
wie kann ich feststellen, ob eine Diskette im Laufwerk eingelegt ist und so die Alertbox "Laufwerk A: antwortet nicht..." umgehen?
Mupfel antwortet auf "ls a:" zum Beispiel mit "a: existiert nicht (oder ist blockiert)". COMMAND.PRG von Oliver Scholz meldet "Drive A: does not respond!".
Gruß
Oliver
-
[Original gelöscht wg. Blödsinn]
Es gibt keine GEMDOS-Funktion, mit der man feststellen könnte, ob eine Diskette im Laufwerk ist.
Das kriegst Du nur mit einem Leseversuch raus. Wenn Du dafür eine BIOS-Funktion nimmst, wird der GEMDOS Critical-Error Handler nicht ausgeführt, wenn der Leseversuch fehlschlägt.
-
Leider kommt die Alertbox auch bei BIOS-Aufrufen.
Ich habe es mit Getbpb() und Rwabs() probiert.
Stattdessen muss der Critical Error Handler auf eine eigene Routine, die nichts tut, verbogen werden:
static void install_handlers();
static void critical_error_handler();
static void process_termination();
static void (*orig_critical_error_handler)() = NULL;
static void (*orig_process_termination)();
int main()
{
install_handlers();
...
}
void
install_handlers()
{
if (orig_critical_error_handler == NULL) {
orig_process_termination = Setexc((long)etv_term / 4, process_termination);
orig_critical_error_handler = Setexc((long)etv_critic / 4, critical_error_handler);
}
}
void
critical_error_handler()
{
}
void
process_termination()
{
if (orig_critical_error_handler != NULL) {
(void)Setexc((long)etv_critic / 4, orig_critical_error_handler);
(void)Setexc((long)etv_term / 4, orig_process_termination);
orig_critical_error_handler = NULL;
orig_process_termination();
}
}
-
So kann man's natürlich auch machen. Bei Rwabs() hätte ich tatsächlich angenommen, dass der Critical Error Handler nicht anspringt (so kann man sich täuschen).