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