Benutzer:ZAK256/Test2
Aus C64-Wiki
Zur Navigation springenZur Suche springenÜberprüfen auf gültige Spur— und Sektornummer
Auszug aus dem 1571 ROM | Bemerkung |
---|---|
_ $D55F: A5 80 LDA $80 $D561: F0 EA BEQ $D54D $D563: CD AC 02 CMP $02AC $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: 20 4F A7 JSR $A74F $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 $A74F: 48 PHA $A750: AD 0F 18 LDA $180F $A753: 29 20 AND #$20 $A755: F0 08 BEQ $A75F $A757: 68 PLA $A758: C9 24 CMP #$24 $A75A: 90 04 BCC $A760 $A75C: E9 23 SBC #$23 $A75E: .BYTE $24 $A75F: 68 PLA $A760: AE D6 FE LDX $FED6 $A763: 60 RTS $FED1: .BYTE $11 $FED2: .BYTE $12 $FED3: .BYTE $13 $FED4: .BYTE $15 $FED6: .BYTE $04 $FED7: .BYTE $24 $FED8: .BYTE $1F $FED9: .BYTE $19 $FEDA: .BYTE $12 Unterschiede zum 1541 ROM |
Überprüfen auf legale Spur— und Sektornummern. Spurnummer Fehler, wenn Null mit Maximum 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. Bearbeitung für Tracks größer 35 Spurummer mit Maximum vergleichen Zeiger minus 1 verzweige, wenn Spur größer Maximalzahl der Sektoren holen Ende Bei Spurnummern größer als 35 werden diese in die physikalischen Spurnummern kleiner als 36 umgewandelt. Tracknummer merken Steuerregister lesen Floppy im 1541-Modus? verzweige, wenn ja Tracknummer zurückholen und mit 36 vergleichen verzweige, wenn kleiner sonst 35 abziehen nächsten Befehl überspringen ($A75E: 24 68 BIT $68) Tracknummer zurückholen Anzahl der Zonen holen (4) 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 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ürtzt 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) { // ... gekürzt case DISK_IMAGE_TYPE_D71: if (track > MAX_TRACKS_1571) { return FSIMAGE_BAD_TRKNUM; } if (track > NUM_TRACKS_1541) { track -= NUM_TRACKS_1541; sectors = NUM_BLOCKS_1541; } 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) { // ... gekürzt case DISK_IMAGE_TYPE_D71: 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_D71: if (track > 35) { track -= 35; } 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_1571 70 #define NUM_TRACKS_1541 35 #define NUM_BLOCKS_1541 683 Unterschiede zum D64 Image-Disk Format |
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 70 ist, dann Fehler erzeugen wenn die prüfenden Spur größer als 35 ist dann 35 subtrahieren Sektor auf 683 setzten ─┐ 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 │ │ │ │ │ │ │ │ ◄┘ │ │ │ │ │ │ wenn die prüfenden Spur größer als 35 ist │ dann 35 subtrahieren │ │ │ │ │ │ │ ◄──┘ 17 .. für die Spuren 31-35, 66-70 18 .. für die Spuren 25-30, 60-65 19 .. für die Spuren 18-24, 53-59 21 .. für die Spuren 1-17, 36-52 maximale Anzahl der Spuren auf einer 1571-Diskette Anzahl der Spuren auf einer Standard 1541-Diskette Anzahl der Blöcke auf einer Standard 1541-Diskette (664 frei) Unterschiede zum D64 Image-Disk Format |