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?
Kevinnimmst 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