Wie lese ich am geschicktesten 1000 Sektoren von der Diskette?



  • Hallo!
    Ich will von meiner Diskette den Kernel laden - dieser wird ca. 1000 Sektoren umfassen, doch wie mache ich dies am geschicktesten? Mit einem int 13 Aufruf kann ich doch maximal 18 Sektoren auslesen (da 18 Sektoren pro Spur vorhanden sind), und 1000/18 mal die Register neu zu initialisieren und int 13 zu verwenden um die nächsten Sektoren zu laden ist doch verdammt umständlich, geht dies nicht einfacher?

    Kevin



  • ja, 1000/18==56
    wenn du im bootloader 56 mal diese zeilen untereinanderschreiben mußt, dann wird er ja riesengroß und so. obwohl das gegenüber den 1000 sektoren, die geladen werden, kaum mehr ins gewicht fällt.



  • Original erstellt von Surkevin:
    **
    Ich will von meiner Diskette den Kernel laden - dieser wird ca. 1000 Sektoren umfassen, doch wie mache ich dies am geschicktesten? Mit einem int 13 Aufruf kann ich doch maximal 18 Sektoren auslesen (da 18 Sektoren pro Spur vorhanden sind), und 1000/18 mal die Register neu zu initialisieren und int 13 zu verwenden um die nächsten Sektoren zu laden ist doch verdammt umständlich, geht dies nicht einfacher?
    **

    Wie wärs mit ner Schleife?



  • Hm jo werds mal versuchen....is nur nicht ganz unkompliziert mit der Schleife da ich ja Bufferadresse und Spur verändern muss 🙂

    Naja ich werds hinkriegen, ich poste den Code dann hier

    Kevin



  • Hmmm das mit der Schleife kann nicht gehen, da ich ja cl und ch für int 13 benötige, jedoch cx um die Anzahl der Wiederholungen festzulegen! Was gibt es denn nun für einen Ausweg?

    Kevin



  • Original erstellt von Surkevin:
    Hmmm das mit der Schleife kann nicht gehen, da ich ja cl und ch für int 13 benötige, jedoch cx um die Anzahl der Wiederholungen festzulegen! Was gibt es denn nun für einen Ausweg?
    Kevin

    nimmst als laufvarieble nicht cx und loop, sondern dx und jnz, geht das?



  • und wenn das nicht hinhaut: es gibt immernoch so eine furchtbar intelligente Erfindung, die sich da stack nennt. 🙄



  • jou, oder variablen. was ich oft mach, ist den wert in einem der im RM unwichtigen Seg-regs (also FS oder GS) zu speichern (damit meine ich schlichtweg einen Move) und dann zurückladen (ebenfalls ein Move 🙂 nächste möglichkeit wäre noch die oberen 16 bit von 32bit-regs zu nutzen und dann einfach ein ROR oder ROL um 16 bits benutzen.

    cu todo



  • Das müsste doch gehen, ODERRRRRRRRRRR?

    load_kernel:
    
    mov ax, 1
    mov gs, ax ;nicht const
    mov ax, 0x0800
    mov es, ax ;nicht const
    xor bx, bx ; const
    mov dh, 0 ; const
    mov dl, 0 ; const
    mov ch, 0 ;nicht const
    mov cl, 2 ; const
    mov ah, 02h ;const
    mov al, 18 ;const
    
    get:
    int 0x13 
    jc error
    push ax ;Sicherung von ah und al
    mov ax, gs
    inc ax
    mov gs, ax ;da GS als schleifenzähler verwendet wird ums ein erhöhen
    mov ax, es
    add ax, 0x20
    mov es, ax ;512/16 = 32 => 20h zur Segmentaddresse dazufügen
    inc ch ;nächste Spur
    mov ax, gs
    cmp ax, 56 ;wurden schon 56 erreicht? (1000/18 = 56)
    pop ax
    mov cl, 1
    jng get ;kleiner als 56
    ret
    

Anmelden zum Antworten