C 64
Anwendung

Drucker/Floppy ein- oder ausgeschaltet?

Diese Prüfroutine verhindert wirkungsvoll die Fehlermeldung: DEVICE NOT PRESENT ERROR und hilft, ein Programm absturzsicher zu machen.

Bei der Prüfroutine handelt es sich um ein Unterprogramm, das mit GOSUB 10080 aufgerufen wird. Vor dem Aufruf der Routine muß festgelegt werden, welches Gerät überprüft werden soll (Gerätenummer DN%: 4 für Drucker, 8 für Floppy). Die Auswertung der Variablen DR% (0 = aus, 1 = ein) ermöglicht eine Aussage über den Einschaltzustand.
Prüfroutine
Zeile 10080:
Um die Maschinenroutine nicht bei jedem Aufruf des Unterprogramms einzulesen, wird sie nur beim ersten Aufruf eingelesen.
Zeile 10090 und 10100:
In die vom Computer nicht benutzte Speicherstelle 2 der Zeropage wird die Device-Nummer DN% (4 für Drucker, 8 für Floppy) gePOKEt, das Maschinenprogramm aufgerufen und anschließend der Inhalt der Speicherstelle 2 überprüft. War das Carry-Bit gesetzt, ist das entsprechende Gerät ausgeschaltet. Die Variable DR% wird entsprechend dem Einschaltzustand 1 (= ein) oder 0 (= aus) gesetzt.
Zeile 10140 bis 10170:
Basic-Lader der Maschinenroutine

Nach dem Löschen des Bildschirms wird der Variablen DN% die entsprechende Geräte-Nummer (4 für Drucker, 8 für Floppy) zugewiesen und die Prüfroutine aufgerufen. Die Abfrage der Variablen DR% (Device ready) ermöglicht es, eine Aussage über den Einschaltzustand (0 = aus, 1 = ein) des entsprechenden Gerätes zu machen.

Wird die Prüfroutine beim Diskettenlaufwerk angewendet (DN%=8), so muß nach dem Aufruf der Routine der Fehlerkanal der Floppy gelöscht werden, da durch die Prüfung ein Syntax Error (31) vom DOS gemeldet wird (Ansprung des NMI-Vektors in Zeile 160).

(Werner Pfeil/gk)
10 print"{clr}       werner pfeil"
20 print"       am malzbuechel 4"
30 print"  5000 koeln 1"
40 print"       0221/24 25 53"
50 print:print"               eingang: 21.5.84"
51 print"serieller bus - test":print
52 print"ueberpruefung ob drucker oder
53 print"floppy ein/ausgeschaltet sind"
60 print:print:print"     taste"
70 poke198,0:wait198,1
100 rem * dem-programm *
110 :
120 print chr$(147)
130 dn%=4:gosub 10080:rem drucker
140 if dr%=1thenprint"drucker eingeschaltet"
150 if dr%=0thenprint"drucker ausgeschaltet"
160 dn%=8:gosub 10080:if dr%=1 then open1,8,15,"ui:":close 1:rem floppy
170 if dr%=1thenprint"floppy  eingeschaltet"
180 if dr%=0thenprint"floppy  ausgeschaltet"
190 end
200 :
210 :
220 :
10000 rem * pruefroutine device ein? *
10070 :
10080 if ft%=0 then ft%=1:gosub 10140:rem routine nur beim 1. mal einlesen
10090 poke 2,dn%:sys49152:if peek(2)=0 thendr%=1:return:rem device 'ein'
10100 dr%=0:return:                             rem device 'aus'
10110 :
10120 rem * maschinenroutine einlesen *
10130 :
10140 for ad=49152to49185:read a:poke ad,a:next ad
10150 data169,1,160,192,162,33,32,189,255,169,1,160,15,166,2,32,186,255,32
10160 data192,255,176,2,169,0,133,2,169,1,32,195,255,96,32
10170 return
Ein Demo-Programm. Die Prüfroutine befindet sich ab Zeile 10000
                0010            ; *****************************
                0020            ; *   ASSEMBLER-LISTING DER   *
                0030            ; * PRUEFROUTINE DEVICE EIN ? *
                0040            ; *  GESCHRIEBEN FUER  C- 64  *
                0050            ; * (C) 1984 BY  WERNER PFEIL *
                0060            ; *****************************
                0070            ;
                0100            .BA $C000
C000- A9 01     0110            lda #$01              ; LAENGE
C002- A0 C0     0120            ldy #$C0              ; ADRESSE HIGH
C006- A2 21     0130            ldx #$21              ; ADRESSE LOW
C006- 20 BD FF  0140            JSR $FFBD             ; PARAMETER FUER FILENAMEN
C009- A9 01     0150            LDA #$01              ; FILE-NR.
C00B- A0 0F     0160            LDY #$0F              ; SEKUNDAERADRESSE
C00D- A6 02     0170            LDX $02               ; DEVICE-NR.
C00F- 20 BA FF  0180            JSR $FFBA             ; FILEPARAMETER SETZEN
C012- 20 C0 FF  0190            JSR $FFC0             ; OPEN
C015- B0 02     0200            BCS $C019             ; WENN AUSGESCHALTET, DANN
C017- A9 00     0210            LDA #$00
C019- 85 02     0220            STA $02               ; ERGEBNIS DER PRUEFUNG
C01B- A9 01     0230            LDA #$01              ; FILE-NR.
C01D- 20 C3 FF  0240            JSR $FFC3             ; CLOSE
C020- 60        0250            RTS
C021- 20        0260            .BY $20
                0270            .EN
Der Inhalt der DATA-Zeilen mit zugehörigem Assembler-Listing
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →