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
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