Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf


Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von Bernd » Fr 4. Jun 2010, 07:27
Hallöchen,
wer kann mir Helfen? Was wird in den X,Y-Registern und dem Akku nach einem Aufruf der CIOV bei einem Fehler übertragen?
Eine Datei wird geöffnet, die Dateilänge ist jedoch zu kurz. Mit den anschließenden Daten kann ich leider nichts anfangen.

Bernd

Re: Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von tfhh » Fr 4. Jun 2010, 07:57
Moin,
Bernd hat geschrieben:Hallöchen,
wer kann mir Helfen? Was wird in den X,Y-Registern und dem Akku nach einem Aufruf der CIOV bei einem Fehler übertragen?
Eine Datei wird geöffnet, die Dateilänge ist jedoch zu kurz. Mit den anschließenden Daten kann ich leider nichts anfangen.

Was das X-Register nach dem Aufruf enthält, ist, soweit ich weiß, nicht spezifiziert. Das Y-Register enthält den Fehlercode oder 0, wenn es keinen Fehler gab.

Die Länge der tatsächlich gelesenen/geschriebenen Bytes kannst Du nach dem CIOV Aufruf in ICBLEN (dez. 840,841 plus Offset (Kanalnummer*16)) abfragen, das funktioniert meines Erachtens auch überall (d.h. mit allen DOS-Versionen) gut.

Gruß, Jürgen

Re: Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von Dietrich » Fr 4. Jun 2010, 19:45
Das X-Register ist nach dem Aufruf unverändert, d.h. für Folge-Aufrufe des CIO musst Du X nicht erneut setzen, solange Du denselben Kanal benutzt.
Wenn ein Fehler auftritt, kommt in Y ein Wert >=128 zurück und das M-Bit des Statusregisters ist gesetzt, d.h. Du kannst einfach mit BMI ERROR zu Deiner Fehlerroutine verzweigen.
Ansonsten kommt in Y ein Wert <128 zurück. In der Regel ist das immer 1. Nur beim Lesen aus einem DOS-File kann auch 3 zurückkommen, nämlich dann, wenn das Fileende erreicht wurde (d.h. wenn der nächste Leseaufruf einen Error 136 - end of file - liefern würde).
Im Akku kommt (nach Lese/Schreibaufrufen) das zuletzt gelesene bzw. geschriebene Byte zurück. Praktisch benutzt man das eigentlich nur, wenn man das CIO mit Datenlänge 0 (lda #0: sta $348,x; sta $349,x) aufruft. Dann nämlich liest bzw. schreibt das CIO genau 1 Byte und benutzt den Akku zur Datenübergabe.

Re: Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von Bernd » Fr 4. Jun 2010, 22:48
Hallo zusammen,
Danke euch beiden für die Infos.... Gerade habe ich ein Test durchgeführt. Scheinbar wird aus der CIOV $E456
DSKINV $E453 aufgerufen. Der Fehlercode im Y-Register wird aus DSTATS $303 übernommen.
Ist der File zum Lesen zu kurz, gibt es einen Fehler, der mit BMI ausgewertet wird, jedoch hat das Y-Register eine "1"...
Verwendet: MyDos4.53
Nach Dietrich müßte ich versuchen die Daten weiter zu lesen, den Test mache ich noch mal.

Viele Grüße,
Bernd

Re: Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von Dietrich » Sa 5. Jun 2010, 11:56
Bernd hat geschrieben:Ist der File zum Lesen zu kurz, gibt es einen Fehler, der mit BMI ausgewertet wird, jedoch hat das Y-Register eine "1"...

Das ist ausgeschlossen. Wenn das CIO mit gesetzem M-Bit zurückkehrt, ist Y immer >=128 ! Zur Verdeutlichung:

Code: Alles auswählen
CIOV  = $e456
      ...
      JSR CIOV
      BMI ERROR
      RTS
ERROR          ; hier ist Y immer >=128

Was willst Du eigentlich tun? Wenn Du versuchst, über das Fileende hinaus zu lesen, kriegst Du Error 136 (end of file), also y=136. Dann ist es natürlich sinnlos, weitere Daten zu lesen.

Re: Assembler: CIOV ($E456) -> Dos -> Fehler tritt auf

von Dietrich » Sa 5. Jun 2010, 13:05
Ahh, ich glaube Du willst einfach nur ein ganzes File einlesen. Das geht so:

Code: Alles auswählen
         ldx #$10               ; IOCB1
         ; hier den OPEN machen
         ; ...
read     lda #<buffer           ; das File soll ab Adresse buffer (s. unten) im RAM stehen
         sta $344,x
         lda #>buffer
         sta $345,x
         lda #<[bufend-buffer]  ; Maximal-Anzahl der Bytes, die gelesen werden sollen
         sta $348,x             ; die Länge unseres Puffers ist ja begrenzt
         lda #>[bufend-buffer]
         sta $349,x
         lda #7                 ; Kommando GET BYTES
         sta $342,x
         jsr ciov               ; $e456
         bpl buf_full           ; hat geklappt, d.h. der Puffer ist vollgelesen
         cpy #136       
         bne error              ; andere Fehler als 136 sind ein Problem
ok                       ; end of file erreicht, d.h. die Daten passen in den Puffer
         lda #$348,x
         sta laenge
         lda #$349,x
         sta laenge+1           ; Das ist die Anzahl der Bytes, die bis zum EOF gelesen wurden
                                ; d.h. die Filelänge (wenn das File in den Puffer passt)
         ; hier eingelesene Daten verarbeiten
         rts

buf_full ; tja, der Puffer ist vollgelesen, aber das Dateiende noch nicht erreicht
         ; (d.h. das File passt nicht vollständig in den Puffer)
         ; wir müssen also die Daten im Puffer verarbeiten und dann den nächsten Teil
         ; der Datei in den Puffer einlesen (jmp read)
         ; (Die Anzahl der gelesenen Bytes entspricht der Pufferlänge,
         ; sie steht auch in $348/9,x)

error    ; print "Fehler aufgetreten"
         rts

laenge  .ds 2
buffer  .ds $4000              ; wir reservieren 16 KB, können also max. 16 KB auf einmal lesen
bufend

Falls Du keine Dateien verarbeiten willst, die länger als Dein Puffer sind, entfällt der bpl buf_full, d.h. jeder y-Code ungleich 136 ist dann für Dich ein "Fehler". (y<128 bedeutet dann "File too long".)