Ist ja in Ordnung. Lowlevel.eu kenne ich bereits. Habe dort nur leider nichts Genaueres zu diesem Thema gefunden. Ich habe nur die Subroutinen die für das laden der Diskette verantwortlich ist gepostet. Diese Routine ist jedoch erst einmal nur ein Prototyp der sobald das Problem gelöst ist weiter ausgebaut und verbessert wird.
Da ich tatsächlich nicht absichtlich den Protected-Mode aktiviert habe muss ich deiner antwort zu folge durchaus im Real-Mode sein.
Beiträge von Klebestreifen
-
-
Es ging ja darum, dass das eben NICHT so offensichtlich gemacht werden soll
Ups -
-
Es gibt nen guten grund dafür, dass ich mir keinen eigenen Bootloader baue..Hast du mal ein paar Details?
Programmiersprache?
Prozessor?
Realmode/Protected Mode?
Du rufst da das BIOS auf? Den Luxus hab ich nicht.. (Protected Mode, noch keinen VM86-support)...Assembler (NASM)
...x86-Prozessor (Standard-Computer)
...Ich glaube Realmode. Kann ich aber nicht sicher sagen.
Das sieht mir eher nach einer Art Bootloader aus, aber kein Betriebssystem, oder?Mir fehlen da grundlegende Dinge, wie IDT, GDT, Paging, Sheduler, Multitasking und Multithreading
Ich sagte ja auch das es ein Bootfähiges System ist und versuche die Bezeichnung als „Betriebsystem“ noch zu vermeiden da (noch) nicht die von dir genanten Funktionen enthalten sind. Ich jedoch frage mich woher du das weist? Wobei du nicht einmal den kompletten Code kennst…
-
Sehr geehrte WINHISTORY-User,
Ich bin ein Hobbyprogrammierer und besonders „Spaßig“ finde ich das programmieren von bootfähigen Systemen (Betriebsystemen). Nur bin ich auch da noch eine Art Anfänger. Somit weis ich bei der Assemblerprogrammierung nicht wie man korrekt von Datenträgern, in meinem Fall Disketten, liest und frage daher euch
Mein Problem: Ich möchte, da ich mein System nicht nur sechs Sektoren groß sein soll, die komplette Diskette in den Arbeitsspeicher laden. Doch schon beim tüfteln an einer Subroutine die die ersten 3 Spuren lädt scheitere ich.
Spur 1 und Spur 2 werden korrekt geladen doch bei Spur 3 scheitert es.
Hier erstmal der Code:Code
Alles anzeigen; Dieser Code ist nur so ineffektiv verschachtelt damit ich es beim debugen einfacher habe! load: call load1 call load2 call load3 retn load_rs: push ds mov ax, 0 mov dl, [bootdriv] int 13h pop ds jc load_rs retn loader: call load_rs mov ax, 0x1000 mov es, ax mov ah, 0x2 mov dx, 0 retn load1: call loader mov bx, 0 mov al, 17 mov cl, 2 mov ch, 0 int 13h jc reset retn load2: call loader mov bx, 0x2200 mov al, 18 mov cl, 1 mov ch, 1 int 13h ;0x7c64 jc reset retn load3: call loader mov bx, 0x4600 mov al, 18 mov cl, 1 mov ch, 2 int 13h jc reset retn
Die Subroutine „load3“ ist dabei das Sorgenkind und lädt leider nicht das, was sie soll. Aber warum nicht? Diese Subroutine lädt irgend etwas aus dem freien Speicher der Diskette was ich daran erkenne das jede menge ‚F6’-Bytes in den Arbeitsspeicher geladen werden wo eigentlich der weiterführende Code des Kernels hin sollte.
Wie kann ich dafür sorgen das die 3. Spur die ich möchte geladen wird?Zusammenfassend: Ich habe ein Image geschrieben welches auf Diskette formatiert wird (oder halt mit Bochs emuliert wird) welches sich beim booten in den RAM laden soll (nur der Bootsektor soll aber draußen bleiben). Die Test-Subroutine lädt jedoch ab spur 3 vom falschen Ort. Was ist der Fehler an der Subroutine?
Danke im Voraus!
Mit freundlichen Grüßen euer Klebestreifchien.PS.: Dieser Thread wurde hierher verschoben weil Thema treffender ist!
EDIT: Habe hier noch schnell Korrekturen am Code vorgenommen. Funkt aber immer noch nicht, ist aber richtiger als vorher!