Hi
mit diesem code möchte ich den inhalt der gesamten Diskette (1.44MB) in den RAM laden (nach 0x100000)
In bochs läuft das auch wunderbar, allerding nicht auf einem echten PC.
Befor ein Sektor geladen wird, wird der LBA und CHS-Wert auf den Bildschirm ausgegeben. Daheir weiß ich, das es an folgender stelle probleme bei int 0x13 gibt:
LBA: 0x7E
C: 0x03
H: 0x01
S: 0x01
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; loaddisk
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ah -> RamDisk (1..8)
; al -> FloppyDisk
loaddisk:
jmp ld.start
var_movedesc:
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; used by BIOS
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; used by BIOS
; db 0x02,0x00 ; source segment length
; ; (2*cx-1 or greater)
db 0xFF,0xFF ; MeOS
db 0x00,0xA0,0x00 ; 00A000 24-bit linear source address ; E 130506
db 0x93, ; source segment access rights (93h)
db 0x00,0x00 ;
; db 0x02,0x00 ; destination segment length
; ; (2*cx-1 or greater)
db 0xFF,0xFF ; MeOS
db 0x00,0x00,0x10 ; 100000 24-bit linear destination address
; Von hier muss die RD später in ihre Richtige
; Position kopiert werden (im C-Kernel)
db 0x93 ; destination segment access rights (93h)
db 0x00,0x00 ;
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; used by BIOS
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; used by BIOS
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; MeOS
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; MeOS
var_rd db 0x00
var_fd db 0x00
var_addrbx dw 0xA000 ; Hier soll int 0x13 hinschreiben
var_addres dw 0x0000 ; (0x1:A000) (es:bx
var_diskaddr dw 0x0000 ; Lineare Sectoraddresse (0x0000 .. 0x0B40)
ld.start:
; Laufwerke sichern
mov [var_rd+os], ah
mov [var_fd+os], al
; FD Reseten (int 0x13>0)
ld.reset:
push ds ; DS sichern
xor ax, ax
mov dl, [var_fd+os]; Floppydrive resetten
int 0x13
pop ds
or ah, ah
jnz ld.reset ; Bei fehler, widerholen
ld.loadfd:
mov ax, [var_diskaddr+os] ; Lineare Sektoradresse
;cl=Sector
;dh=Head
;ch=Cylinder
call Lsn2Chs
call writeuserinfos ; ES WIRD NIX GEÄNDERT, nur die Werte ausgegeben
mov dl, [var_fd+os] ;Laufwerk
; Adresse im RAM
mov ax, [var_addres+os]
mov es, ax
mov bx, [var_addrbx+os]
; Sonstige einstellungen
mov ah, 0x02 ; Funktion 2 (lesen)
mov al, 0x01 ; nur einen Sektor lesen
int 0x13
or ah, ah
;jnz ld.loadfd ; Fehler? Wiederholen
jnz ld.error ; Fehlermeldung ausgeben
;;;; HIER WIRD ABGEBROCHEN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;;;;
; Daten verschieben ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ld.move:
mov cx, 0x0100 ; [WORD] => 0x200 Byte => 1 Sektor
mov si, var_movedesc+os ; Offsetadresse
mov ax, 0x1000 ; Segmentadresse
mov es, ax
xor al, al
mov ah, 0x87 ; Copy Extended memory
int 0x15 ; move
or ah, ah ; ah == 0?
jnz ld.error
; Neue Werte für ld.loadfd und ld.move errechen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ld.calc:
mov ax, [var_diskaddr+os]
cmp ax, 0x0B40-1
jz ld.ende ; Ende erreicht??
inc ax
mov [var_diskaddr+os], ax
; desc bearbeiten (zieladresse) ;(+26)
mov al, [var_movedesc+os+27] ;Lower part
mov ah, [var_movedesc+os+28] ;Higher part
add ax, 0x02 ; Einen Sektor drauf-addieren
mov [var_movedesc+os+28], ah ;Higher part
mov [var_movedesc+os+27], al ;Lower part
jmp ld.loadfd
; Fehler
ld.error:
mov si, str_error+os
call writestring
call getkey
jmp ld.ende
ld.ende:
mov dx, 0x03F2 ; fd Adresse
mov al, 0
out dx, al ; fd-motor aus
retn
Wo ist der Fehler??
bzw wo muss ich ihn suchen??
ps.: Es wird immer 1(!) Sector geladen, und dieser dann in den höheren Speicherbereich kopiert.