JTRANS_TS: logisches in physikalisches Format umwandeln

CEDC: 06 86     ASL $86          Soll umgewandelt werden (b7=0) ?
CEDE: B0 6E     BCS $CF4E        nein, Ende ==>
CEE0: A4 99     LDY $99          Index fuer 2-Byte Jobspeicher holen
CEE2: 06 85     ASL $85          Sind Parameter sowieso physikalisch (b7=0)?
CEE4: 90 44     BCC $CF2A        ja, ==>
CEE6: A6 83     LDX $83
CEE8: B5 9F     LDA $9F,X        b7=1: wurde das Format bereits umgewandelt?
CEEA: 10 01     BPL $CEED        nein, (also umwandeln) ==>
CEEC: 60        RTS              [ja: Wenigstens die Diskettenseite muesste
                                 neu nach $96 geschrieben werden !!!]

Einsprung von $CEEA:

CEED: B9 0B 00  LDA $000B,Y      logische Spur - 1
CEF0: 38        SEC
CEF1: E9 01     SBC #$01
CEF3: 99 BC 01  STA $01BC,Y      = physikalische Spur

CEF6: A5 75     LDA $75          Anzahl Sektoren pro Track
CEF8: 4A        LSR              / 2 = Sektoren pro Spur
CEF9: AA        TAX              = 1. logischer Block auf Rueckseite
CEFA: D9 0C 00  CMP $000C,Y      Sektornummer >= a ?
CEFD: F0 05     BEQ $CF04        ja, (Seite 1) ==>
CEFF: 90 03     BCC $CF04        ja, (Seite 1) ==>
CF01: A9 00     LDA #$00         Seite 0 waehlen
CF03: 2C         B $2C

Einsprung von $CEFD, $CEFF:

CF04: A9 01     LDA #$01         Seite 1 waehlen
CF06: 85 96     STA $96          als aktuelle Seite merken
CF08: F0 01     BEQ $CF0B        Aktuelle Seite =1 ? nein, ==>
CF0A: 8A        TXA              ja:

Einsprung von $CF08:

CF0B: 85 39     STA $39          als 1. log. Sek. der Seite merken
CF0D: A6 83     LDX $83
CF0F: B9 0C 00  LDA $000C,Y      logischer Sektor
CF12: 38        SEC
CF13: E5 39     SBC $39          - 1. log. Sektor der Disk-Seite
CF15: 09 80     ORA #$80         b7=1: Flag: 'T&S sind umgewandelt' setzen
CF17: 95 9F     STA $9F,X        als Zeiger (Hi) in Cachepuffer merken
CF19: 29 7F     AND #$7F         physikalische Sektornummer berechnen
CF1B: A6 91     LDX $91          Sektorgroesse holen

Einsprung von $CF21:

CF1D: CA        DEX              [Wenn ein physikalischer Sektor 512 Byte
CF1E: F0 04     BEQ $CF24         gross ist, passen immer 2 logische Sektoren
CF20: 4A        LSR               hinein. Also muss die Sektornummer /2
CF21: 4C 1D CF  JMP $CF1D         genommen werden (Normalfall).]

Einsprung von $CF1E:

CF24: 18        CLC
CF25: 65 94     ADC $94          + 1. physikalische Sektornummer der Spur
CF27: 4C 4A CF  JMP $CF4A        = phy. Sektornummer ==>
es wurden phy. T&S angegeben; Position im Cache berechnen

Einsprung von $CEE4:

CF2A: A6 83     LDX $83
CF2C: BD CE 01  LDA $01CE,X      Seitennummer
CF2F: 85 96     STA $96          uebernehmen
CF31: B9 0B 00  LDA $000B,Y      Tracknummer
CF34: 99 BC 01  STA $01BC,Y      uebernehmen
CF37: B9 0C 00  LDA $000C,Y      Sektornummer
CF3A: 48        PHA              merken
CF3B: 38        SEC
CF3C: E5 94     SBC $94          - 1. Sektornummer auf der Spur
CF3E: A6 91     LDX $91          Sektorgroesse

Einsprung von $CF44:

CF40: CA        DEX              [Sektornummer auf 256 Byte grosse Bloecke
CF41: F0 04     BEQ $CF47         umrechnen. Bei 512 Byte grossen Sektoren
CF43: 0A        ASL               muss die Sektor nummer also *2 genommen
CF44: 4C 40 CF  JMP $CF40         werden (Normalfall).]

Einsprung von $CF41:

CF47: 95 9F     STA $9F,X        Sektornummer merken
CF49: 68        PLA

Einsprung von $CF27:

CF4A: 99 BD 01  STA $01BD,Y      physikalische Sektornummer merken
CF4D: 2C         B $2C         Ende ==>

Einsprung von $CEDE:

CF4E: 06 85     ASL $85          [Die Routine muss $85 genau 1 mal nach Links
CF50: 60        RTS               shiften.]

    Previous Page / Next Page