D64

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Ein geöffnetes D64-Disk-Image im Emulator VICE.

Das Disk-Image-Format D64 bildet eine Seite einer 5,25-Zoll-Diskette im CBM-DOS-Format ab. Es handelt sich dabei um eine 1:1-Abbildung der Sektoren auf der Diskette, mit der Option auch die Sektoren in den Tracks 36 bis 40 zu erfassen. Hinzu kommt optional ein kurzer Anhang mit einem Fehler-Byte für jeden Sektor. Ein D64 Disk-Image ist eine Datei, welche den Inhalt einer einseitig beschriebenen 5,25"-Single-Density oder Double-Density Diskette abbildet. Die Abbildung erfolgt ausschließlich auf Datenblockebene. Die Anzahl der abgebildeten Datenblöcke und die abgebildete Blockgröße entspricht den Vorgaben, des Commodore-DOS der Diskettenlaufwerke 1540, 1541, 1551, 1570 und 1571. Das Commodore-DOS nutzt standardmäßig nur 35 Spuren. Es werden jedoch je nach D64 Disk-Image Variante 35, 40 oder 42 Spuren abgebildet. Die Anzahl der Sektoren pro Spur ist dabei variabel und entspricht bei 35 Spuren den Vorgaben des Commodore-DOS. Bei 40 Spuren entspricht die Anzahl der Sektoren den Vorgaben von Speed DOS, Dolphin DOS, Professional-DOS und ProLogic DOS. Die 42 Spuren Variante, mit zwei zusätzlichen Spuren zu je 17 Sektoren, ist äußerst ungewöhnlich, da reale Laufwerke oft Probleme mit dem Zugriff auf diese Spuren haben. Software, die mehr als 40 Spuren verwendet, ist auch recht selten.

Das D64-Disk-Image Format ist wohl das bekannteste Format im Commodore Heimcomputerumfeld.

Aufbau[Bearbeiten | Quelltext bearbeiten]

Die Datei besteht aus 683 oder 768 Segmenten zu je 256 Byte. Daran schließt noch ein optionaler Fehlerblock an, der aus 683 oder 768 Byte besteht.

Jedes Segment der Datei enthält einen vollständigen Sektor der Diskette. Innerhalb der Datei sind die Tracks einfach aneinander gereiht, beginnend mit Track 1. Für jeden Track sind wiederum die Sektoren dieses Tracks aneinandergereiht, beginnend mit Sektor 0.

Da die Tracks im CBM-DOS-Format unterschiedlich viele Sektoren enthalten, kann man die Tracknummer nicht einfach mit einer festen Zahl multiplizieren, um die Position des Tracks in der Datei zu finden. Die folgende Tabelle enthält die Startpositionen der Tracks:

Track Position Track Position Track Position Track Position Track Position
1 $00000 9 $0A800 17 $15000 25 $1EA00 33 $27800
2 $01500 10 $0BD00 18 $16500 26 $1FC00 34 $28900
3 $02A00 11 $0D200 19 $17800 27 $20E00 35 $29A00
4 $03F00 12 $0E700 20 $18B00 28 $22000 36 $2AB00
5 $05400 13 $0FC00 21 $19E00 29 $23200 37 $2BC00
6 $06900 14 $11100 22 $1B100 30 $24400 38 $2CD00
7 $07E00 15 $12600 23 $1C400 31 $25600 39 $2DE00
8 $09300 16 $13B00 24 $1D700 32 $26700 40 $2EF00

Nach dem letzten Track kommt optional noch ein Fehlerblock, bestehend aus 683 Bytes (oder 768, wenn die Datei 40 Tracks enthält). Jedes Byte steht dabei für einen Sektor, in der selben Reihenfolge wie zuvor. Der Wert des Bytes gibt die interne Fehlernummer der Floppy wieder. $01 bedeutet dabei, dass der Sektor keinen Fehler aufweist.

Einschränkungen[Bearbeiten | Quelltext bearbeiten]

Einige Informationen, die sich auf einer echten Diskette befinden, werden von diesem Format nicht erfasst. Darunter unter anderem die Prüfsumme für jeden Sektor oder SYNC-Markierungen zwischen Sektoren. Mit den Diskettenlaufwerken ist es auch möglich, Tracks zwischen den eigentlich vorgesehenen Tracks anzulegen. Derartige Zwischentracks werden ebenfalls nicht abgebildet. Dadurch kann es sein, dass sich ein D64-Disk-Image in einem Emulator anders verhält, als die Original-Diskette in einem Original-Laufwerk. Insbesondere im Zusammenhang mit Kopierschutzen kann dies dazu führen, das auf dem Image gespeicherte Software nicht mehr funktioniert.

Abgrenzung[Bearbeiten | Quelltext bearbeiten]

Ein D64 Disk-Image speichert nur die Daten von mehreren Datenblöcken. Die Interpretation des Inhalts dieser Datenblöcke, ist nicht Bestandteil des D64 Disk-Image Formats. Die Datenblöcke müssen also nicht zwangsläufig einem Dateisystem (z. B. Commodore-DOS) entsprechen. Ein D64 Disk-Image kann z. B. auch reine Datenblöcke eines Demos enthalten, welche von einer speziellen Laderoutine eingelesen werden. Begriffe wie BAM, Directory oder der Aufbau von Dateien gehören thematisch zum Dateisystem des Commodore-DOS und haben nichts mit dem D64 Disk-Image Format zu tun.

Varianten[Bearbeiten | Quelltext bearbeiten]

Es existieren 6 verschiedene Varianten von D64 Disk-Image Dateien.

  1. 35 Spuren, ohne Fehlerinformation
  2. 35 Spuren, mit Fehlerinformation
  3. 40 Spuren, ohne Fehlerinformation
  4. 40 Spuren, mit Fehlerinformation
  5. 42 Spuren, ohne Fehlerinformation
  6. 42 Spuren, mit Fehlerinformation

Eigenschaften der 6 Varianten[Bearbeiten | Quelltext bearbeiten]

Nr. Variante Dateigröße Anzahl der Datenblöcke Bytes pro Datenblock Bytes für Datenblöcke Bytes für Fehler-informationen
1 35 Spuren, ohne Fehlerinformation 174848 683 256 174848 0
2 35 Spuren, mit Fehlerinformation 175531 683 256 174848 683
3 40 Spuren, ohne Fehlerinformation 196608 768 256 196608 0
4 40 Spuren, mit Fehlerinformation 197376 768 256 196608 768
5 42 Spuren, ohne Fehlerinformation 205312 802 256 205312 0
6 42 Spuren, mit Fehlerinformation 206114 802 256 205312 802

Schematische Darstellung der 6 Varinaten[Bearbeiten | Quelltext bearbeiten]

            Variante 1      Variante 2      Variante 3      Variante 4      Variante 5      Variante 6
            ──────────      ──────────      ──────────      ──────────      ──────────      ──────────
            35 Spuren       35 Spuren       40 Spuren       40 Spuren       42 Spuren       42 Spuren
            ohne            mit             ohne            mit             ohne            mit
            Fehler-         Fehler-         Fehler-         Fehler-         Fehler-         Fehler-
            infor-          infor-          infor-          infor-          infor-          infor-
            mationen        mationen        mationen        mationen        mationen        mationen  
$00000 ...┌───────────┐...┌───────────┐...┌───────────┐...┌───────────┐...┌───────────┐...┌───────────┐
          │           │   │           │   │           │   │           │   │           │   │           │
          │ Daten     │   │ Daten     │   │ Daten     │   │ Daten     │   │ Daten     │   │ Daten     │
          │ von       │   │ von       │   │ von       │   │ von       │   │ von       │   │ von       │
          │ 683       │   │ 683       │   │ 768       │   │ 768       │   │ 802       │   │ 802       │
          │ Daten-    │   │ Daten-    │   │ Daten-    │   │ Daten-    │   │ Daten-    │   │ Daten-    │
          │ blöcken   │   │ blöcken   │   │ blöcken   │   │ blöcken   │   │ blöcken   │   │ blöcken   │
          │           │   │           │   │           │   │           │   │           │   │           │
          │ 174848    │   │ 174848    │   │ 196608    │   │ 196608    │   │ 205312    │   │ 205312    │
          │ Bytes     │   │ Bytes     │   │ Bytes     │   │ Bytes     │   │ Bytes     │   │ Bytes     │
          │           │   │           │   │           │   │           │   │           │   │           │
          │           │   │           │   │           │   │           │   │           │   │           │
$2AAFF ...│           │...│           │   │           │   │           │   │           │   │           │
$2AB00 ...└───────────┘...├───────────┤   │           │   │           │   │           │   │           │
                          │ Fehler-   │   │           │   │           │   │           │   │           │
                          │ inform.   │   │           │   │           │   │           │   │           │
$2ADAA ...................│ 683 Bytes │   │           │   │           │   │           │   │           │
                          └───────────┘   │           │   │           │   │           │   │           │
$2FFFF ...................................│           │...│           │   │           │   │           │
$30000 ...................................└───────────┘...├───────────┤   │           │   │           │
                                                          │ Fehler-   │   │           │   │           │
                                                          │ inform.   │   │           │   │           │
$302FF ...................................................│ 768 Bytes │   │           │   │           │
                                                          └───────────┘   │           │   │           │
$321FF ...................................................................│           │...│           │
$32200 ...................................................................└───────────┘...├───────────┤
                                                                                          │ Fehler-   │
                                                                                          │ inform.   │
$32521 ...................................................................................│ 802 Bytes │
                                                                                          └───────────┘

Wodurch wird die Gesamtanzahl der Sektoren auf einer Diskette (bzw. D64) bestimmt?[Bearbeiten | Quelltext bearbeiten]

Die Anzahl der gesamten Sektoren einer Diskette bestimmt sich aus der Anzahl der Spuren und der jeweiligen Anzahl der Sektoren pro Spur.

Wodurch wird die Anzahl der Spuren bestimmt?[Bearbeiten | Quelltext bearbeiten]

Was begrenzt die Spuren am äußeren Radius?[Bearbeiten | Quelltext bearbeiten]

  • Äußerer Radius der Diskette
    • Die Größe der Scheibe bestimmt den größten möglichen Radius für eine Spur. Die Scheibe hat einen Radius von 65,1 mm.
  • Aufzeichnungsmaterial der Diskette
    • Das Aufzeichnungsmaterial müsste nicht ganz bis an den äußersten Rand einer Diskette vorhanden sein. In den meisten Fällen sollte dies aber der Fall sein. Eine Diskette müsste nur gewährleisten, das im Aufzeichnungsbereich (Recording Area) Aufzeichnungsmaterial vorhanden ist.
  • Schreib-/Lesekopf Fenster der Diskette
    • Das Schreib-/Lesekopf Fenster schränkt den Bereich, in dem der Schreib-/Lesekopf auf das Aufzeichnungsmaterial einer Diskette zugreifen kann, ein. Die Öffnung beginnt außen bei einem Radius von 63,35 mm und hat eine volle Öffnungsbreite bei einem Radius von 57,00 mm erreicht.
  • Aufzeichnungsbereich (Recording Area)
    • Das Aufzeichnungsmaterial müsste nur in dem Aufzeichnungsbereich einer Diskette vorhanden sein. Der Aufzeichnungsbereich ist in Spezifikationen festgelegt worden.
  • Mechanischer Anschlag bei Spur 00
    • Die Commodore Laufwerke besitzen einen mechanischen Anschlag. Der Schreib-/Lesekopf kann nur bis zu diesem Anschlag nach außen bewegt werden. Der Schreib-/Lesekopf befindet sich dann auf dem Radius 57,15.

Was begrenzt die Spuren am inneren Radius?[Bearbeiten | Quelltext bearbeiten]

  • Innerer Radius der Diskette
    • Die Größe der Scheibe bestimmt den kleinsten möglichen Radius für eine Spur. Das große Loch in der Mitte der Diskette hat einen Radius von 14,285 mm.
  • Aufzeichnungsmaterial der Diskette
    • Das Aufzeichnungsmaterial müsste nicht ganz bis an den kleinsten Rand einer Diskette vorhanden sein. In den meisten Fällen sollte dies aber der Fall sein. Eine Diskette müsste nur gewährleisten, das im Aufzeichnungsbereich (Recording Area) Aufzeichnungsmaterial vorhanden ist.
  • Das Index Loch
    • Die Scheibe einer Diskette besitzt ein (oder mehrere) Loch für die Index-Erkennung, daher kann ein dieser Position keine Spur vorhanden sein. Das Loch befindet sich bei einem Radius von 25,40 mm und hat einen Durchmesser von 2,54 mm.
  • Schreib-/Lesekopf Fenster der Diskette
    • Das Schreib-/Lesekopf Fenster schränkt den Bereich, in dem der Schreib-/Lesekopf auf das Aufzeichnungsmaterial einer Diskette zugreifen kann, ein. Die Öffnung beginnt sich innen bei einem Radius von 34,70 mm zu schließen und ist bei einem Radius 28,35 mm vollständig geschlossen.
  • Die Mechanik, bestehend aus Schrittmotor und Gewindestange:
    • Die Mechanik kann den Schreib-/Lesekopf nicht unbeschränkt weit nach innen bewegen. Bei den meisten Commodore Laufwerken ist bei 40 Spuren schluss. Einige Laufwerke schaffen wohl auch noch 42 Spuren.
  • Aufzeichnungsbereich (Recording Area)
    • Das Aufzeichnungsmaterial müsste nur in dem Aufzeichnungsbereich einer Diskette vorhanden sein. Der Aufzeichnungsbereich ist in Spezifikationen festgelegt worden. Der Aufzeichnungsbereich befindet sich zwischen Radius 57,40 mm und 34,00 mm.
  • 40 Spuren DOS (wie z. B. Speed DOS, Dolphin DOS, Professional DOS und ProLogic DOS)
    • Die DOS Varianten (wie z. B. Speed DOS, Dolphin DOS, Professional DOS und ProLogic DOS) können 40 Spuren benutzen.
  • Commodore-DOS
    • Das Commodore-DOS verwendet nur 35 Spuren.

Was bestimmt den Abstand zwischen den Spuren?[Bearbeiten | Quelltext bearbeiten]

  • Aufzeichnungsmaterial der Diskette
    • Das Aufzeichnungsmaterial von DD Diskette ist für 40 Spuren (48 TPI[1]) ausgelegt. Das Aufzeichnungsmaterial von QD Diskette ist für 80 Spuren (96 TPI) ausgelegt. Sicherlich sind noch weit mehr Spuren möglich. Mindestens 100 TPI bei QD Disketten sollten möglichen sein, da es dafür auch spezielle 100 TPI Laufwerke gibt.
  • Die Mechanik, bestehend aus Schrittmotor und Gewindestange
    • Die Mechanik, bestehend aus Schrittmotor und Gewindestange der Commodore Laufwerke entsprechen einem 96 TPI Laufwerk. D.h. die Commodore Laufwerke können 96 Spuren pro Zoll anfahren. Dadurch ist der Abstand zwischen den Spuren festgelegt.
  • Schreibkopf (Breite der Spur)
    • Der Schreibkopf schreibt zu breite Spuren, um alle 96 TPI Spuren benutzen zu können. Um die geschrieben Daten auch wieder lesen zu können kann nur jede zweite Spur beschrieben werden. Dies entspricht dann einen Spurabstand von 48 TPI.

Was bestimmt die Position der Spuren?[Bearbeiten | Quelltext bearbeiten]

  • Die Mechanik, bestehend aus Schrittmotor und Gewindestange
    • Die Mechanik, bestehend aus Schrittmotor und Gewindestange legt auch Position der Spuren fest. Somit ist der Radius aller Spuren durch Mechanik fest vorgegeben.
  • Commodore-DOS / 40 Spuren DOS (wie z. B. Speed DOS, Dolphin DOS, Professional DOS und ProLogic DOS)
    • Das Commodore-DOS als auch die anderen DOS Varianten verwenden die nur die "ganzen" Spuren beginnend mit der Spur 0, welche aber als Spur 1 bezeichnet wird. Die halben Spuren werden überspringen.

Wodurch wird die Anzahl der Sektoren pro Spur bestimmt?[Bearbeiten | Quelltext bearbeiten]

Die Anzahl der Sektoren sind, auf einer Commodore-DOS formatierten Diskette, nicht auf allen Spuren gleich. Die Anzahl der Sektoren variiert von 17 bis 21 Sektoren. Dies ist der Aufzeichnungstechnik - Zone Bit Recording (ZBR) - geschuldet, welche vom Commodore-DOS eingesetzt wird. Diese Aufzeichnungstechnik wird benutzt, um mehr Sektoren auf den äußeren Spuren zu speichern als auf den Inneren. Das Commodore-DOS verwendet nur 35 Spuren, in denen in Summe 683 Datenblöcke gespeichert werden. Diese Summe entspricht genau der Anzahl von Datenblöcken, welche ein D64 Disk-Image (Variante A und B) beinhaltet. Das D64 Disk-Image Format ist somit speziell für die Abbildung der Commodore-DOS Zonenaufteilung ausgelegt. Bei den 40 bzw. 42 Spur Varianten wurde die Zone 4, um 5 bzw. 7 Spuren erweitert, so dass in Summe 768 bzw. 802 Datenblöcke in einem D64 Disk-Image enthalten sind.

Was begrenzt die Anzahl der Bits pro Zoll?[Bearbeiten | Quelltext bearbeiten]

  • Aufzeichnungsmaterial der Diskette

Was legt die Länge eines Sektors fest?[Bearbeiten | Quelltext bearbeiten]

Anzahl der Sektoren pro Spur[Bearbeiten | Quelltext bearbeiten]

Die Anzahl der Sektoren sind, auf einer Commodore-DOS formatierten Diskette, nicht auf allen Spuren gleich. Die Anzahl der Sektoren variiert von 17 bis 21 Sektoren. Dies ist der Aufzeichnungstechnik - Zone Bit Recording (ZBR) - geschuldet, welche vom Commodore-DOS eingesetzt wird. Diese Aufzeichnungstechnik wird benutzt, um mehr Sektoren auf den äußeren Spuren zu speichern als auf den Inneren. Das Commodore-DOS verwendet nur 35 Spuren, in denen in Summe 683 Datenblöcke gespeichert werden. Diese Summe entspricht genau der Anzahl von Datenblöcken, welche ein D64 Disk-Image beinhaltet. Das D64 Disk-Image Format (mit 35 Spuren) ist somit speziell für die Abbildung der Commodore-DOS Zonenaufteilung ausgelegt.

Spur Seite Zone Spurenanzahl Sektoren/Spur Sektoren Sektorensumme Sektorensumme (35 Spuren) Sektorensumme (40 Spuren) Sektorensumme (42 Spuren)
01 - 17 Seite 1 Zone 1 17 21 00 - 20 357 683 768 802
18 - 24 Seite 1 Zone 2 7 19 00 - 18 133
25 - 30 Seite 1 Zone 3 6 18 00 - 17 108
31 - 35 Seite 1 Zone 4 5 17 00 - 16 85
36 - 40 Seite 1 5 17 00 - 16 85
41 - 42 Seite 1 2 17 00 - 16 34

Position der Datenblöcke[Bearbeiten | Quelltext bearbeiten]

Die folgende Tabelle zeigt die Positionen der einzelnen Datenblöcke.

Spur/Sektor 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Zone Seite
1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Zone 1
357 Sektoren
(21 Sektoren/Spur)
Seite 1
2 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
3 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
4 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
5 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
6 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
7 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
8 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
9 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
10 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
11 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
12 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
13 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
14 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
15 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
16 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
17 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
18 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 Zone 2
133 Sektoren
(19 Sektoren/Spur)
19 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
20 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
21 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
22 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
23 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
24 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
25 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 Zone 3
108 Sektoren
(18 Sektoren/Spur)
26 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
27 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
28 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
29 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
30 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
31 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 Zone 4
85 Sektoren
+ 85 Sektoren (Spur 36-40)
+ 34 Sektoren (Spur 41-42)
(17 Sektoren/Spur)
32 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
33 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
34 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
35 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
36 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
37 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717
38 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
39 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
40 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
41 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
42 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802


Überprüfen auf gültige Spur- und Sektornummer

Da die Anzahl der Sektoren pro Spur aufgrund der Aufzeichnungstechnik (Zone Bit Recording - ZBR) variiert, ist es nicht ganz einfach zu bestimmen, ob eine Spur-Sektor-Kombination gültig ist. Die folgende Tabelle enthält, deshalb die entsprechende Assembler-Routine eines 1541 Diskettenlaufwerks mit Kommentaren. Weiter unten ist dann noch die C-Routine aus dem Quellcode von Vice 3.1 kommentiert dargestellt.

Auszug aus dem 1541 ROM Bemerkung
_                
$D55F: A5 80      LDA $80
$D561: F0 EA      BEQ $D54D
$D563: CD D7 FE   CMP $FED7
$D566: B0 E5      BCS $D54D
$D568: 20 4B F2   JSR $F24B
$D56B: C5 81      CMP $81
$D56D: F0 DE      BEQ $D54D
$D56F: 90 DC      BCC $D54D
$D571: 60         RTS
 
$D54D: A9 66      LDA #$66
$D54F: 4C 45 E6   JMP $E645
 
 
$F24B: AE D6 FE   LDX $FED6
$F24E: DD D6 FE   CMP $FED6,X
$F251: CA         DEX
$F252: B0 FA      BCS $F24E
$F254: BD D1 FE   LDA $FED1,X
$F257: 60         RTS
 
 
$FED1:            .BYTE $11
$FED2:            .BYTE $12
$FED3:            .BYTE $13
$FED4:            .BYTE $15
 
$FED5:            .BYTE $41
$FED6:            .BYTE $04
 
 
$FED7:            .BYTE $24
$FED8:            .BYTE $1F
$FED9:            .BYTE $19
$FEDA:            .BYTE $12
Überprüfen auf gültige Spur- und Sektornummer
Spurnummer
Fehler, wenn Null
mit 36 vergleichen
Fehler, wenn größer gleich
maximale Sektornummer holen
mit aktueller Nummer vergleichen
Fehler, wenn gleich
Fehler, wenn kleiner
Ende

Nummer der Fehlermeldung
'66, ILLEGAL TRACK OR SECTOR' ausgeben

Stellt die Maximalanzahl der Sektoren dieser Spur fest; Spurnummer in A.;
Anzahl der Zonen holen (4)
Spurummer mit Maximum vergleichen
Zeiger minus 1
verzweige, wenn Spur größer
Maximalzahl der Sektoren holen
Ende

Anzahl der Sektoren pro Spur
17 Sektoren auf Spur 35—31
18 Sektoren auf Spur 30-25
19 Sektoren auf Spur 24-18
21 Sektoren auf Spur 17-01

Formatkennzeichen der DOS—Version ('A')
"Anzahl der Zonen auf Diskette mit

unterschiedlichen Sektorzahlen pro Spur" Spurnummern bei denen ein Zonenwechsel stattfindet
Spur 36 = Ende der Zone 31-35 (4)
Spur 31 = Ende der Zone 25-30 (3)
Spur 25 = Ende der Zone 18-24 (2)
Spur 18 = Ende der Zone 01-17 (1)
Auszug aus dem Quellcode von Vice 3.1 (etwas gekürzt an einigen Stellen) Bemerkung
int disk_image_check_sector(const disk_image_t *image, unsigned int track,
                            unsigned int sector)
{
    if (image->device == DISK_IMAGE_DEVICE_FS) {
        return fsimage_check_sector(image, track, sector);                           
    }                                                                                
    return 0;                                                                        
}                                                                                    
                                                                                     
int fsimage_check_sector(const disk_image_t *image, unsigned int track,              
                         unsigned int sector)
{
    unsigned int sectors = 0, i;
    if (track < 1) {
        return FSIMAGE_BAD_TRKNUM;
    }
    switch (image->type) {
        case DISK_IMAGE_TYPE_D64:
            if (track > MAX_TRACKS_1541) {
               return FSIMAGE_BAD_TRKNUM;
            }
            if (sector >= disk_image_sector_per_track(DISK_IMAGE_TYPE_D64, track)) { 
                return FSIMAGE_BAD_SECNUM;                                           
            }                                                                        
            for (i = 1; i < track; i++) {                                            
                sectors += disk_image_sector_per_track(DISK_IMAGE_TYPE_D64, i);      
            }                                                                        
            sectors += sector;                                                       
            break;                                                                   
        // ... gekürzt                                                               
        default:                                                                     
            return -1;                                                               
    }                                                                                
    return (int)(sectors);                                                           
}                                                                                    
                                                                                     
unsigned int disk_image_sector_per_track(unsigned int format,                        
                                         unsigned int track)
{
    switch (format) {
        case DISK_IMAGE_TYPE_D64:
            return sector_map_d64[disk_image_speed_map(format, track)];              
        // ... gekürzt                                                               
    }                                                                                
    return 0;                                                                        
}                                                                                    
       
unsigned int disk_image_speed_map(unsigned int format, unsigned int track)           
{
    switch (format) {
        // ... gekürzt
        case DISK_IMAGE_TYPE_D64:
            return (track < 31) + (track < 25) + (track < 18);
        // ... gekürzt
    }
    return 0;
}
                                                                             
static const unsigned int sector_map_d64[SPEED_ZONE_COUNT] = {                       
    17,
    18,
    19,
    21
};                                                                                   
 
#define MAX_TRACKS_1541        42


     Die Funtion disk_image_check_sector
 
 
 
─┐   Aufruf der Funktion fsimage_check_sector
 │
 │
 │
 │
◄┘
 
 
     prüfen, ob Spur kleier 1 ist,
     wenn ja, dann Fehler erzeugen
 
 
 
     wenn Spur größer 42 ist, 
     dann Fehler erzeugen
 
 
─┐   Aufruf der Funktion disk_image_sector_per_track
 │   Wenn der zu prüfende Sektor größer ist als die Anzahl
 │   der Sektoren der zu prüfenden Spur, Fehler erzeugen
 │   Schleife von 1 bis zur prüfenden Spur -1
─┤     Aufruf der Funktion disk_image_sector_per_track
 │     Summieren der Anzahl der Sektoren für jede Spur
 │   Addieren der Sektoren der zu prüfenden Spur
 │
 │
 │
 │
 │
 │
 │
 │
◄┘   Die Funktion disk_image_sector_per_track
     berechnet die Anzahl der Sektoren für einen Spur
 
 
 
─┐─┐ Aufruf der Funktionen disk_image_speed_map
 │ │                   und sector_map_d64
 │ │
 │ │
 │ │
 │ │
◄┘ │
   │
   │
   │
   │
   │
   │
   │
   │
   │
   │
◄──┘
17 .. für die Spuren 31-[35/40/42] 
18 .. für die Spuren 25-30
19 .. für die Spuren 18-24 
21 .. für die Spuren  1-17
 
 
Maximale Anzahl der erreichbaren Spuren eines 1541-Laufwerks.
Nicht alle 1541-Laufwerke sind dazu in der Lage.

Erkennung des Dateiformats[Bearbeiten | Quelltext bearbeiten]

Eine Datei kann nur an der Dateiendung als ein D64 Disk-Image erkannt werden. Eine D64 Disk-Image Datei besitzt keinerlei Formatkennzeichen wie Kopfdaten oder Magische Zahl, um eine Erkennung zu ermöglichen. So können die unterschiedlichen Varianten nur mittels der Dateilänge erkannt werden.

Fehlerinformationen[Bearbeiten | Quelltext bearbeiten]

Ein D64 kann auch zusätzlich zu den Daten der einzelnen Datenblöcke auch Fehlerinformationen enthalten. Diese Fehlerinformationen bestehen aus jeweils genau einem Byte pro Datenblock. Diese Bytes sind in einem D64 Image genau nach den einzelnen Datenblöcken zu finden. Jedes Fehlerinformationsbyte bezieht sich dabei genau auf einen Datenblock des D64 Disk-Image. Die Bytes der Fehlerinformationen repräsentieren die Fehlernummer, wie sie auch ein 1541 oder 1571 Diskettenlaufwerk zurückgeben würde, wenn ein Fehler auftritt. Die folgende Tabelle zeigt, welche Fehler für ein D64 Disk-Image sinnvoll sind.

Code Fehler Typ D64 Beschreibung
$01 00 N/A * Kein Fehler.
$02 20 Seek * Header Block nicht gefunden / Header Deskriptor Byte nicht gefunden
$03 21 Seek * Keine SYNC-Sequenz gefunden
$04 22 Read * Datenbeschreibungsbyte nicht gefunden
$05 23 Read * Prüfsummenfehler im Datenblock
$06 24 Write Schreibprüfung auf Format (tritt nie auf 1541 auf)
$07 25 Write Schreibverifizierungsfehler
$08 26 Write Schreibschutz ein beim Schreiben
$09 27 Seek * Checksummenfehler im Kopfbereich
$0A 28 Write Schreibfehler (tritt nie bei 1541 auf)
$0B 29 Seek * Disk-Sektor ID Nichtübereinstimmung
$0F 74 Read Laufwerk nicht bereit (keine Diskette im Laufwerk oder kein Gerät 1)

Weblinks[Bearbeiten | Quelltext bearbeiten]

Fußnoten[Bearbeiten | Quelltext bearbeiten]

  1. TPI - Abkürzung für "Tracks Per Inch", Track-Dichte, also Anzahl der Tracks auf 25,4 mm des magnetischen Mediums


Artikel des Monats.gif Dieser Artikel wurde Artikel des Monats.