Autor Thema: Problem beim laden einer FD im RM  (Gelesen 5167 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 05. August 2006, 11:53 »
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.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. August 2006, 13:40 »
Zitat von: RedEagle
Hi
mit diesem code möchte ich den inhalt der gesamten Diskette (1.44MB) in den RAM laden (nach 0x100000)

Also aus deiner überschrifft lese ich, dass das alles im Realmode geschehen soll. Nur im RealMode kann mann keine 1,44MB addressieren dass hört mit 1MB auf (Mit A20 noch 'n bischen mehr)
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 05. August 2006, 16:18 »
Mit hilfe des BIOS geht das auch anders (mein MenuetOS wird die Diskette ja auch anfangs geladen.

Deshalb habe ich das ganze Daten am Anfang der Funktion.
Die brauche ich später um mit int 0x15 (Funktion 0x87 (Copy Extended memory)) den gelesenen Sektor an eine addresse > 1MB zu schreiben.

Es wird ein Sektor gelesen, der wird dann verschoben.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 06. August 2006, 15:11 »
Hab leider grad keine zeit mir den Code Genauer anzu gucken. aber vieleicht ist auch einfach nur ein sektor von der diskette defect oder so
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 06. August 2006, 17:10 »
Ich habe die Diekette jetzt formatiert, und dann gründlichst mit ScanDisk geprüft.
Es wurde zwar kein Fehlerhafter Sektor gefunden, aber jetzt läufts :)

Danke für den hinweis, an hardware-fehler habe ich überhaupt nicht gedacht...

 

Einloggen