Autor Thema: Feststellen, ob eine Diskette im Laufwerk ist  (Gelesen 9738 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Count

  • Benutzer
  • Beiträge: 247
Feststellen, ob eine Diskette im Laufwerk ist
« 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

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Feststellen, ob eine Diskette im Laufwerk ist
« Antwort #1 am: So 25.03.2018, 21:10:48 »
[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.
« Letzte Änderung: So 25.03.2018, 21:14:26 von mfro »
And remember: Beethoven wrote his first symphony in C

Offline Count

  • Benutzer
  • Beiträge: 247
Re: Feststellen, ob eine Diskette im Laufwerk ist
« Antwort #2 am: Mo 26.03.2018, 11:32:48 »
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();
    }
}

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Feststellen, ob eine Diskette im Laufwerk ist
« Antwort #3 am: Mo 26.03.2018, 12:36:31 »
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).
And remember: Beethoven wrote his first symphony in C