Hi,
Also ich kopiers einfach mal hier rein. Vielleicht hilfts dir ja:
floppy_reset:
xor ax,ax
xor dl,dl
int 13h
jc floppy_reset ; wenns nicht geklappt hat nochmal versuchen
ret
;[DESC] Konvertiert eine LBA Sektorangabe in das CHS Format
; Siehe --> http://lowlevel.brainsware.org/wiki/index.php/LBA
;
; [IN] #1 = Linearer Sektor (#1 = 1. Stackparameter)
; [OUT] ax = Pointer zu einer CHS struktur
lba_to_chs:
push bp
mov bp, sp
mov ax, [bp+0x04]
xor dx,dx
mov cx,36
div cx
mov [0xD000],ax ; = C
mov ax,dx
xor dx,dx
mov cx,18
div cx
mov [0xD002],ax ; = H
inc dx
mov [0xD004],dx ; = S
mov ax,0xD000
pop bp
ret 2
; [IN] #1 = Startsektor (LBA Format => linear)
; #2 = Anzahl der zu lesenden Sektoren
;
; #3 = Zieldatensegment
; #4 = Offset
_floppy_read:
push bp
mov bp, sp
floppy_reset
lba_to_chs word [bp+0x04]
mov ch, byte [0xD000] ; Zylinder nach ch
mov dh, byte [0xD002] ; Kopf nach dh
mov cl, byte [0xD004] ; Sektor nach cl
mov al,byte [bp+0x06] ; Anzahl der Sektoren die gelesen werden sollen nach AH
mov dl, 0 ; Diskettenlaufwerk = 0
mov bx, word [bp+0x08]
mov es, bx
mov bx, word [bp+0x0A]
mov ah, 0x02
int 13h
pop bp
ret 8
Ich habe mir dann für floppy_read ein Makro definiert:
%macro floppy_read 4
push %4 ; Offset
push %3 ; Zielsegment
push %2 ; Count
push %1 ; Sektor (LBA)
call _floppy_read
%endmacro
Das ganze kann man dann so aufrufen:
floppy_read 0, 1, 0xFFFF, 0x0010 ; Sektor 0 an Adresse 0x100000 (1MB) lesen
das ganze kann man natürlich auch inne schleife packen.. muss halt immer den ersten parameter hochzählen und die Adresse um 512 Bytes erhöhen..
Lg
Cjreek