Merkwürdiges Verhalten in Vice bei der Positionierung des Lesekopfs in der 1541-Emulation


  • M. J.
  • 556 Aufrufe 3 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Merkwürdiges Verhalten in Vice bei der Positionierung des Lesekopfs in der 1541-Emulation

    (Sorry, wenn ich hier in der falschen Rubrik schreibe, aber ich wußte nicht genau, wo ich das Thema einordnen sollte. Notfalls bitte umsortieren. Danke.)

    Beim Austesten eines alten Spiels mit einem Schnellader fiel mir folgendes merkwürdiges Verhalten in VICE auf (Version 2.4.30-x86-r31929 von Pokefinder):

    Wenn das Spiel beim Nachladen der Daten einen Lesefehler bemerkt (der Sektor kann nicht gefunden werden), wird als Notmaßnahme nach einiger Zeit eine Zwangskalibrierung des Lesekopfes auf Spur 1 vorgenommen. Dabei wird der Lesekopf 40 mal Richtung Spur 1 bewegt, so daß anschließend der Kopf unbedingt auf Spur 1 stehen müßte. Anschließend wird der Kopf auf die eigentlich gewünschte Spur gefahren. Den Effekt kann man beobachten, wenn man die Diskette vor dem Nachladen aus dem Laufwerk auswirft. Soll z. B. von Spur 10 gelesen werden, fährt das Programm den Kopf nach einiger Zeit auf Spur 1 und dann auf Spur 10... Nein, leider nicht ganz. Es fährt ihn nur auf Spur 9. Im internen Zähler des Schnelladers jedoch findet sich der Eintrag 10, und es wurden auch 10 mal die Routinen zum Bewegen des Lesekopfes durchlaufen. Trotzdem steht der Kopf erst auf Spur 9. 8|

    Jetzt wird es verrückt: Das Programm hält an und fordert zum Einlegen der Diskette auf. Ignoriert man dies und drückt einfach eine Taste, wird ein erneuter Leseversuch unternommen. Dabei wird nach einiger Zeit der Kopf wieder zwangsweise auf Spur 1 gefahren und zurück, doch diesmal korrekt auf Spur 10. :hae:

    Dieses Verhalten geschieht nun im steten Wechsel. Zuerst wird der Lesekopf falsch auf eine Spur unter der gewünschten gesetzt, dann auf die richtige Spur, dann darunter, dann richtig usw. In der alten VICE-Version 2.4 ist dieses Verhalten übrigens nicht zu beobachten. Hier wird der Lesekopf stets auf die korrekte Spur justiert.

    Nun frage ich mich, ob das ein Bug im neuen VICE ist oder vielleicht als neues Feature eine Eigenart der Floppy emuliert wird, die vorher fehlte. Gibt es z. B. unter der Spur 1 noch eine Spur 0, so daß der Lesekopf zu tief gesetzt wird und deswegen auf eine zu niedrige Spur bewegt wird? Aber wieso geschieht dies dann abwechselnd? :gruebel
    Mich würde sehr interessieren, ob dies ein Feature im Emulator ist oder ein ernstes Problem im Programm. (Im Programmcode selbst konnte ich bislang keinen Fehler feststellen. :/ ) Kennt vielleicht jemand den Grund?
  • Das Rom ist bei diesem Vorgang nicht involviert. Der Lader verwendet nur eigenen Code.

    Ob 1541 oder 1541-II ist egal. Auffallend ist nur, daß sich der Fehler manchmal nicht sofort zeigt, sondern erst nach einigen Diskettenzugriffen. Es macht einen recht willkürlichen Eindruck.

    Die Diskette liegt im D64-Standard vor.
  • Hier noch der isolierte Code zur Bewegung des Lesekopfs:

    Quellcode

    1. ;========================================
    2. ; kopf_bewegen
    3. ;
    4. ; A = gewünschte Spur
    5. ;
    6. ;========================================
    7. .kopf_bewegen: tay
    8. sec
    9. sbc $22 ; Differenz ermitteln
    10. beq ?q
    11. ldx #0
    12. bcs ?1
    13. eor #$ff
    14. adc #1
    15. inx
    16. ?1: sty $22
    17. asl
    18. tay
    19. ?10: txa
    20. eor $1c00
    21. sec
    22. rol
    23. and #3
    24. eor $1c00
    25. sta $1c00
    26. lda #$94 ; Warteschleife
    27. sta $1805
    28. ?11: bit $1805
    29. bmi ?11
    30. dey
    31. bne ?10
    32. ?q: rts
    33. ;========================================
    34. ; track_reset
    35. ;========================================
    36. .track_reset: lda #40
    37. sta $22 ; setze Spur auf 40
    38. lda #1
    39. jsr .kopf_bewegen ; erzwinge Positionierung des Lesekopfs auf Spur 1
    40. lda .track ; gewünschter Track
    41. jsr .kopf_bewegen
    42. ; Jetzt sollte der Lesekopf auf der Spur ".track" stehen, tatsächlich jedoch ist er abwechselnd mal eine Spur vorher oder darauf.
    Alles anzeigen