Autor Thema: Bootloader Konzept  (Gelesen 12695 mal)

T0ast3r

  • Gast
Gespeichert
« am: 31. March 2006, 17:26 »
Ich denke es ist bereits an der Zeit einen Bootloader zu erstellen.
Wer will ihn programmieren? bitmaster?

der bootloader soll ziemlich simpel gehalten werden und "nur" einen kernel oder einen OS Loader laden
schreibt eure ideen hierzu einfach in den thread

eine wichtige frage wäre auch ob der bootloader 512 bytes übersteigt oder nicht, den je nach dem kann man (interessante) funktionen einbauen

wichtig ist auch auf welchem server das LOST Projekt kommt, hat jemand eine Idee?

ps: wegen dem kernel (design) [@Steffan2005] wird später ein thread eröffnet

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 31. March 2006, 17:59 »
Jo, also ich würde gerne den Bootstrap schreiben. Nee, der wird nicht größer als 512 Byte. Also dann mit FAT12 unterstützung oder erst mal nur einzelnde Sektore?

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 31. March 2006, 19:08 »
Zitat von: T0ast3r
wichtig ist auch auf welchem server das LOST Projekt kommt, hat jemand eine Idee?

Ich hab meine Empfehlung hier gepostet.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

T0ast3r

  • Gast
Gespeichert
« Antwort #3 am: 31. March 2006, 19:58 »
ok, dann schreib du den bootloader bitmaster, die aufgabenstellung ganz klar:
 512 byte großer bootloader, lädt eine (welche im code angegeben wird) datei in den ram und springt

solltest du ein paar nützliche routinen brauchen, sags einfach

die nächste frage ist, wie geht es weiter, also ob dann gleich der kernel geladen wird, oder wie schon mein Vorschlag war, ein OS Loader.
Ich werde mich ganz an der Allgemeinheit richten.
Ein OS Loader würde zuerst alles initialisieren, hätte auch Fehlerroutinen, RAM check, (erweiterte) textausgabe usw.; ein OS Loader würde halt das ganze Betriebssystem (stabil) laden

Damian

  • Beiträge: 100
    • Profil anzeigen
    • http://www.cosysda.de
Gespeichert
« Antwort #4 am: 31. March 2006, 20:59 »
Zitat von: bluecode
Zitat von: T0ast3r
wichtig ist auch auf welchem server das LOST Projekt kommt, hat jemand eine Idee?

Ich hab meine Empfehlung hier gepostet.


Hmm, ich verstehe das nicht.. Ihr braucht eine platzt wo die sourcen, sotusagen gehostet werden?. Wenn ja, ich habe in die Schweiz einen Server, wo ich admin bin, von dort aus könnte ich wohl space anbieten.
Habe mein eigenen Code syntax ;)
Und rechtschreibfehlern dürft ihr behalten.
if (user =="user"){Rechtschreibfehler_behalten();}elseif (user >= "moderator"){Rechtschreibfehlern_korrigieren();}

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 31. March 2006, 21:39 »
Zitat von: T0ast3r
ok, dann schreib du den bootloader bitmaster, die aufgabenstellung ganz klar:
 512 byte großer bootloader, lädt eine (welche im code angegeben wird) datei in den ram und springt

solltest du ein paar nützliche routinen brauchen, sags einfach

die nächste frage ist, wie geht es weiter, also ob dann gleich der kernel geladen wird, oder wie schon mein Vorschlag war, ein OS Loader.
Ich werde mich ganz an der Allgemeinheit richten.
Ein OS Loader würde zuerst alles initialisieren, hätte auch Fehlerroutinen, RAM check, (erweiterte) textausgabe usw.; ein OS Loader würde halt das ganze Betriebssystem (stabil) laden
OK, ich schreibe den FAT12 kompatible. Dann fang ich mal an....
In the Future everyone will need OS-64!!!

Damian

  • Beiträge: 100
    • Profil anzeigen
    • http://www.cosysda.de
Gespeichert
« Antwort #6 am: 31. March 2006, 22:24 »
Jah, husch husch fangt an ^^.
Habe mein eigenen Code syntax ;)
Und rechtschreibfehlern dürft ihr behalten.
if (user =="user"){Rechtschreibfehler_behalten();}elseif (user >= "moderator"){Rechtschreibfehlern_korrigieren();}

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 31. March 2006, 23:09 »
Zitat von: Damian
Hmm, ich verstehe das nicht.. Ihr braucht eine platzt wo die sourcen, sotusagen gehostet werden?. Wenn ja, ich habe in die Schweiz einen Server, wo ich admin bin, von dort aus könnte ich wohl space anbieten.

Hm, kannst du da einen SVN-Server laufen lassen? Dann wäre das wohl schon möglich. Aber wenn es die Möglichkeit gibt, das woanders kostenlos zu bekommen, brauchst du dir die Mühe eigentlich nicht machen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 01. April 2006, 00:52 »
Hi,

ich habe jetzt einen FAT12 Bootstrap geschrieben. Der läd dann einfach die Datei LOST.SYS an Adresse 1000:0000. Funktioniert eigentlich wunderbar. Das einzige was man vielleicht noch verbessern kann ist, dass ich nur eine FAT-Tabelle lese und die andere gar nicht beachte. Aber dann brauch man ja einfach nur mit dem int 13h die erste Tabelle laden, und wenn nach ein paar versuchen immer noch ein Fehler auftritt (nach lesen mit int 13h CF gesetzt) wird die zweite FAT-Tabelle gelesen. Aber sonst ist eigentlich alles sehr gut. Wo soll ich denn jetzt die boot.asm hin schicken?

bitmaster
In the Future everyone will need OS-64!!!

Damian

  • Beiträge: 100
    • Profil anzeigen
    • http://www.cosysda.de
Gespeichert
« Antwort #9 am: 01. April 2006, 01:02 »
zu mir ^^, ne mal im ernst, wo ist jetzt unsere space?
Habe mein eigenen Code syntax ;)
Und rechtschreibfehlern dürft ihr behalten.
if (user =="user"){Rechtschreibfehler_behalten();}elseif (user >= "moderator"){Rechtschreibfehlern_korrigieren();}

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 01. April 2006, 08:41 »
In den Bootloader sollte noch eine CRC-Pfüfung rein.
db 0x55AA

T0ast3r

  • Gast
Gespeichert
« Antwort #11 am: 01. April 2006, 11:14 »
wegen des spaces:
ich schlage vor mich bei ohost zu reigistrieren, um dann ein (oder das) wiki raufzugeben, wobei dort auch immer aktuelle sourcen usw. raufgegeben werden

wegen dem repository informiere ich mich gerade (umfangreich)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 01. April 2006, 11:59 »
So, wie gesagt habe ich schon einen FAT12-Bootstrap geschrieben. Er läd einfach die Datei LOST.SYS an Adresse 1000:0000. Und falls die Datei nicht gefunden wurde, gibt er eine Meldung aus. Ein paar verbesserungen kann man noch einbauen, wie z.B. beide FAT-Tabellen nutzen (fals eine beschädigt ist). Hier der Code:

;Bootstrap für LOST assemblieren mit nasm

org 7C00h

jmp EndBPB ;unter dem BIOS-Parameter-Block

OSName db "L O S T "
BytesPerSec dw 512
SecPerClus db 1
RsvdSecCnt dw 1
NumFATs db 2
RootEntCnt dw 224
TotSec dw 2880
MediaType db 0F0h
FATsize dw 9
SecPerTrack dw 18
NumHeads dw 2
HiddenSec dd 0
TotSec32 dd 0
DrvNum db 0
Reserved db 0
ExBPSign db 29h ;keine Ahnung wofür das ist
VolumeID dd 0FFFFFFFFh
DiskLabel db "LOST       "
FileSysType db "FAT12   "

EndBPB:
cli
xor ax,ax
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti

mov [drive],dl ;Laufwerk

;load rootdirectory
mov ax,32 ;32 Byte pro Eintrag
mul word [RootEntCnt]
div word [BytesPerSec]
mov cx,ax ;Anzahl der Sektoren für das Wurzelverzeichnis

mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
add ax,[RsvdSecCnt] ;Startposition des Wurzelverzeichnisses nach ax

mov bx,7E00h ;nach 0000:7E00 das Wurzelverzeichnis laden
call ReadSectors

mov cx,[RootEntCnt]
mov di,7E00h

;search the filename
SearchFile:
push cx
mov cx,11 ;länge des Dateinamens
mov si,FileName
push di
rep cmpsb
pop di
pop cx
je LoadFAT
add di,32
loop SearchFile
jmp Error ;Datei nicht gefunden

LoadFAT:
mov dx,[di+001Ah] ;Startcluster der Datei
mov [FileCluster],dx
mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
mov cx,ax ;Anzahl der Sektore für die beiden FAT-Tabellen
mov ax,[RsvdSecCnt] ;StartSektor der beiden FAT-Tabellen
mov bx,7E00h ;FAT-Tabellen nach 7E00h laden
call ReadSectors

;Lade Datei nach 1000:0000
mov ax,1000h
mov es,ax
xor bx,bx
push bx

LoadFile:
mov ax,[FileCluster]
pop bx
call CluSec ;Cluster zum Sektor umwandeln
mov cl,[SecPerClus]
xor ch,ch
call ReadSectors
push bx

;Aus FAT-Eintrag lesen (12 Bit)
mov ax,[FileCluster]
mov cx,ax
mov dx,ax
shr dx,1 ;durch zwei
add cx,dx
mov bx,7E00h
add bx,cx
mov dx,[bx]
test ax,0001h ;gerader oder ungerader Cluster?
jnz OddCluster ;ungerader Cluster
and dx,0FFFh
jmp Finish

OddCluster:
shr dx,4

Finish:
mov [FileCluster],dx
cmp dx,0FFFh ;letzter zu ladender Cluster der Datei?
jne LoadFile
pop bx

mov ax,1000h
mov ds,ax
mov es,ax

db 0EAh ;springe
dw 0000h ;Offset
dw 1000h ;Segment

;Datei wurde nicht gefunden
Error:
mov si,ErrorMsg
callWriteMsg
xor ah,ah
int 16h
;neu starten
db 0EAh
dw 0000h
dw 0FFFFh

WriteMsg:
lodsb
or al,al
jz WriteMsgBack
mov ah,0Eh
int 10h
jmp WriteMsg

WriteMsgBack:
ret

;input: ax = logischer Startsektor
;       bx = Offsetadresse an dem die Sektoren geladen werden sollen
;       cx = Anzahl der zu ladenden Sektore
;       es = Segmentadresse an dem die Sektoren geladen werden sollen
;output: ax = letzter Sektor + 1
;        bx = letze 512 Byte + 512
ReadSectors:
push ax
push bx
push cx
call LogPhySec
ReadSectors2:
mov ax,0201h ;ein Sektor laden
mov cl,[PhySector]
mov ch,[PhyTrack]
mov dl,[drive]
mov dh,[PhyPage]
int 13h
jc ReadSectors2
pop cx
pop bx
pop ax
add bx,[BytesPerSec]
inc ax
loop ReadSectors
ret

;input:  ax = logischer Sektor
;output: ds:PhySec = physikalischer Sektor
;        ds:PhyTrack = Spur
;        ds:PhyPage = Seite
LogPhySec:
push ax
push dx
xor dx,dx
div word [SecPerTrack]
inc dl
mov [PhySector],dl
xor dx,dx
div word [NumHeads]
mov [PhyPage],dl
mov [PhyTrack],al
pop dx
pop ax
ret

;input:  ax = Cluster
;output: ax = Sektor
CluSec:
push cx
push dx
sub ax,2 ;die ersten beiden Cluster-Einträge sind in der FAT reserviert
mov cl,[SecPerClus]
xor ch,ch
mul cx
mov cx,[RsvdSecCnt]
add ax,cx
push ax
mov ax,32
mul word [RootEntCnt]
div word [BytesPerSec]
mov cx,ax
pop ax
add ax,cx
push ax
mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
mov dx,ax
pop ax
add ax,dx
pop dx
pop cx
ret

Msg db "LOST wird geladen...",00h
ErrorMsg db "LOST: Datei nicht gefunden.",0
FileName db "LOST    SYS"
drive db 0
FileCluster dw 0
PhySector db 0
PhyTrack db 0
PhyPage db 0

times 510-($-$$) db 0
dw 0AA55h
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 01. April 2006, 13:34 »
hi,
ich weiss nicht, aber könntest du den Code vielleicht ein bisschen übersichtlicher gestalten.
Damit mein in mehr Labels einfügen und Code (per TAB z.B.) einrücken, da tut man sich dann um einiges einfacher beim lesen.

Oder liegt die Formatierung am Forum ? :roll:

mfg,
stefan

T0ast3r

  • Gast
Gespeichert
« Antwort #14 am: 01. April 2006, 14:44 »
jaa ich gebe stefan2005 recht, gestalte deinen code bitte übersichtlicher (als positive Kritik gemeint)
hast du auch ev. ein listing davon? (mit nasm geht das schön)
damit du sagst wie viele bytes frei wären (ohne den times)
je nach dem kann man noch ein paar user pics reingeben

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 am: 01. April 2006, 15:48 »
Wieso übersichtlicher? Der Code ist doch recht gut zu verstehen. Wie ihr die TAB-Sachen haben wollt kann ich ja nicht wissen. Ich habe doch extra Kommentare eingefügt. Du willst wissen wie viel Byte von den 510 noch frei sind? Also so wie der Code jetzt ist, wären noch 49 Byte frei.

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 am: 01. April 2006, 15:50 »
Zitat von: T0ast3r
hast du auch ev. ein listing davon? (mit nasm geht das schön)
Was meinst du damit? Was ist ein listing? Habe ich noch nie gehört.  :oops:
Zitat von: T0ast3r
je nach dem kann man noch ein paar user pics reingeben
Was meinst du damit?

bitmaster
In the Future everyone will need OS-64!!!

T0ast3r

  • Gast
Gespeichert
« Antwort #17 am: 01. April 2006, 15:58 »
also ein Listing kann beim compilieren erstellt werden, da siehst du neben allen befehlen die adressen der befehle und auch die assemblierung
also ungefähr so als würdest du etwas disassemblieren
bei nasm ist der parameter (glaub ich auswendig) "-l [Dateiname]"

mit user pics meine ich ein paar mehr-benutzerfreundliche sachen, eben wie z.B. Textausgabe, oder bei Fehlern eine Fehlerroutine mit Tastenabfragung (ja/nein), neue Versuche wenn etwas Fehlschlägt usw.

wegen der übersichtlichkeit, dass würde ich schon noch ändern
einrückung, abstände, kommentare, usw.
ich kann ja ev. den text "herrichten" wenn du es gestattest

ps: hab den code gerade flüchtig durchgelesen:
bei OSName (FAT BIOS Parameter Block) steht "L O S T", was du in "MSWIN4.1" ändern solltest, wegen der kompatibilität

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #18 am: 01. April 2006, 16:07 »
Zitat von: T0ast3r
also ein Listing kann beim compilieren erstellt werden, da siehst du neben allen befehlen die adressen der befehle und auch die assemblierung
also ungefähr so als würdest du etwas disassemblieren
bei nasm ist der parameter (glaub ich auswendig) "-l [Dateiname]"
Ach so, wie man das bei tasm auch machen kann. Ja, gut mache ich.

Zitat von: T0ast3r
mit user pics meine ich ein paar mehr-benutzerfreundliche sachen, eben wie z.B. Textausgabe, oder bei Fehlern eine Fehlerroutine mit Tastenabfragung (ja/nein), neue Versuche wenn etwas Fehlschlägt usw.
Aber das verbraucht viele Bytes und davon haben wir nur noch 49 übrig.

Zitat von: T0ast3r
wegen der übersichtlichkeit, dass würde ich schon noch ändern
einrückung, abstände, kommentare, usw.
ich kann ja ev. den text "herrichten" wenn du es gestattest
Ja, gerne.

Zitat von: T0ast3r
ps: hab den code gerade flüchtig durchgelesen:
bei OSName (FAT BIOS Parameter Block) steht "L O S T", was du in "MSWIN4.1" ändern solltest, wegen der kompatibilität
Nein da steht nicht "L O S T", sondern "L O S T ". Es sind genau 8 Byte die eingehalten werden müssen. Was da steht ist egal.


bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #19 am: 01. April 2006, 16:15 »
So hier ist das Listing, was ihr unbedingt haben wolltet:

    1                                  ;Bootstrap für LOST assemblieren mit nasm
     2                                  
     3                                  org 7C00h
     4                                  
     5 00000000 E93B00                  jmp EndBPB ;unter dem BIOS-Parameter-Block
     6                                  
     7 00000003 4C204F2053205420        OSName db "L O S T "
     8 0000000B 0002                    BytesPerSec dw 512
     9 0000000D 01                      SecPerClus db 1
    10 0000000E 0100                    RsvdSecCnt dw 1
    11 00000010 02                      NumFATs db 2
    12 00000011 E000                    RootEntCnt dw 224
    13 00000013 400B                    TotSec dw 2880
    14 00000015 F0                      MediaType db 0F0h
    15 00000016 0900                    FATsize dw 9
    16 00000018 1200                    SecPerTrack dw 18
    17 0000001A 0200                    NumHeads dw 2
    18 0000001C 00000000                HiddenSec dd 0
    19 00000020 00000000                TotSec32 dd 0
    20 00000024 00                      DrvNum db 0
    21 00000025 00                      Reserved db 0
    22 00000026 29                      ExBPSign db 29h ;keine Ahnung wofür das ist
    23 00000027 FFFFFFFF                VolumeID dd 0FFFFFFFFh
    24 0000002B 4C4F53542020202020-     DiskLabel db "LOST       "
    25 00000034 2020              
    26 00000036 4641543132202020        FileSysType db "FAT12   "
    27                                  
    28                                  EndBPB:
    29 0000003E FA                      cli
    30 0000003F 31C0                    xor ax,ax
    31 00000041 8ED8                    mov ds,ax
    32 00000043 8EC0                    mov es,ax
    33 00000045 8ED0                    mov ss,ax
    34 00000047 BCFFFF                  mov sp,0FFFFh
    35 0000004A FB                      sti
    36                                  
    37 0000004B 8816[C901]              mov [drive],dl ;Laufwerk
    38                                  
    39                                  ;load rootdirectory
    40 0000004F B82000                  mov ax,32 ;32 Byte pro Eintrag
    41 00000052 F726[1100]              mul word [RootEntCnt]
    42 00000056 F736[0B00]              div word [BytesPerSec]
    43 0000005A 89C1                    mov cx,ax ;Anzahl der Sektoren für das Wurzelverzeichnis
    44                                  
    45 0000005C A0[1000]                mov al,[NumFATs]
    46 0000005F 30E4                    xor ah,ah
    47 00000061 F726[1600]              mul word [FATsize]
    48 00000065 0306[0E00]              add ax,[RsvdSecCnt] ;Startposition des Wurzelverzeichnisses nach ax
    49                                  
    50 00000069 BB007E                  mov bx,7E00h ;nach 0000:7E00 das Wurzelverzeichnis laden
    51 0000006C E8A200                  call ReadSectors
    52                                  
    53 0000006F 8B0E[1100]              mov cx,[RootEntCnt]
    54 00000073 BF007E                  mov di,7E00h
    55                                  
    56                                  ;search the filename
    57                                  SearchFile:
    58 00000076 51                      push cx
    59 00000077 B90B00                  mov cx,11 ;länge des Dateinamens
    60 0000007A BE[BE01]                mov si,FileName
    61 0000007D 57                      push di
    62 0000007E F3A6                    rep cmpsb
    63 00000080 5F                      pop di
    64 00000081 59                      pop cx
    65 00000082 7409                    je LoadFAT
    66 00000084 81C72000                add di,32
    67 00000088 E2EC                    loop SearchFile
    68 0000008A E96C00                  jmp Error ;Datei nicht gefunden
    69                                  
    70                                  LoadFAT:
    71 0000008D 8B551A                  mov dx,[di+001Ah] ;Startcluster der Datei
    72 00000090 8916[CA01]              mov [FileCluster],dx
    73 00000094 A0[1000]                mov al,[NumFATs]
    74 00000097 30E4                    xor ah,ah
    75 00000099 F726[1600]              mul word [FATsize]
    76 0000009D 89C1                    mov cx,ax ;Anzahl der Sektore für die beiden FAT-Tabellen
    77 0000009F A1[0E00]                mov ax,[RsvdSecCnt] ;StartSektor der beiden FAT-Tabellen
    78 000000A2 BB007E                  mov bx,7E00h ;FAT-Tabellen nach 7E00h laden
    79 000000A5 E86900                  call ReadSectors
    80                                  
    81                                  ;Lade Datei nach 1000:0000
    82 000000A8 B80010                  mov ax,1000h
    83 000000AB 8EC0                    mov es,ax
    84 000000AD 31DB                    xor bx,bx
    85 000000AF 53                      push bx
    86                                  
    87                                  LoadFile:
    88 000000B0 A1[CA01]                mov ax,[FileCluster]
    89 000000B3 5B                      pop bx
    90 000000B4 E8A000                  call CluSec ;Cluster zum Sektor umwandeln
    91 000000B7 8A0E[0D00]              mov cl,[SecPerClus]
    92 000000BB 30ED                    xor ch,ch
    93 000000BD E85100                  call ReadSectors
    94 000000C0 53                      push bx
    95                                  
    96                                  ;Aus FAT-Eintrag lesen (12 Bit)
    97 000000C1 A1[CA01]                mov ax,[FileCluster]
    98 000000C4 89C1                    mov cx,ax
    99 000000C6 89C2                    mov dx,ax
   100 000000C8 D1EA                    shr dx,1 ;durch zwei
   101 000000CA 01D1                    add cx,dx
   102 000000CC BB007E                  mov bx,7E00h
   103 000000CF 01CB                    add bx,cx
   104 000000D1 8B17                    mov dx,[bx]
   105 000000D3 A90100                  test ax,0001h ;gerader oder ungerader Cluster?
   106 000000D6 7507                    jnz OddCluster ;ungerader Cluster
   107 000000D8 81E2FF0F                and dx,0FFFh
   108 000000DC E90300                  jmp Finish
   109                                  
   110                                  OddCluster:
   111 000000DF C1EA04                  shr dx,4
   112                                  
   113                                  Finish:
   114 000000E2 8916[CA01]              mov [FileCluster],dx
   115 000000E6 81FAFF0F                cmp dx,0FFFh ;letzter zu ladender Cluster der Datei?
   116 000000EA 75C4                    jne LoadFile
   117 000000EC 5B                      pop bx
   118                                  
   119 000000ED B80010                  mov ax,1000h
   120 000000F0 8ED8                    mov ds,ax
   121 000000F2 8EC0                    mov es,ax
   122                                  
   123 000000F4 EA                      db 0EAh ;springe
   124 000000F5 0000                    dw 0000h ;Offset
   125 000000F7 0010                    dw 1000h ;Segment
   126                                  
   127                                  ;Datei wurde nicht gefunden
   128                                  Error:
   129 000000F9 BE[A201]                mov si,ErrorMsg
   130                                  callWriteMsg
   131 000000FC 30E4                    xor ah,ah
   132 000000FE CD16                    int 16h
   133                                  ;neu starten
   134 00000100 EA                      db 0EAh
   135 00000101 0000                    dw 0000h
   136 00000103 FFFF                    dw 0FFFFh
   137                                  
   138                                  WriteMsg:
   139 00000105 AC                      lodsb
   140 00000106 08C0                    or al,al
   141 00000108 7406                    jz WriteMsgBack
   142 0000010A B40E                    mov ah,0Eh
   143 0000010C CD10                    int 10h
   144 0000010E EBF5                    jmp WriteMsg
   145                                  
   146                                  WriteMsgBack:
   147 00000110 C3                      ret
   148                                  
   149                                  ;input: ax = logischer Startsektor
   150                                  ;       bx = Offsetadresse an dem die Sektoren geladen werden sollen
   151                                  ;       cx = Anzahl der zu ladenden Sektore
   152                                  ;       es = Segmentadresse an dem die Sektoren geladen werden sollen
   153                                  ;output: ax = letzter Sektor + 1
   154                                  ;        bx = letze 512 Byte + 512
   155                                  ReadSectors:
   156 00000111 50                      push ax
   157 00000112 53                      push bx
   158 00000113 51                      push cx
   159 00000114 E82200                  call LogPhySec
   160                                  ReadSectors2:
   161 00000117 B80102                  mov ax,0201h ;ein Sektor laden
   162 0000011A 8A0E[CC01]              mov cl,[PhySector]
   163 0000011E 8A2E[CD01]              mov ch,[PhyTrack]
   164 00000122 8A16[C901]              mov dl,[drive]
   165 00000126 8A36[CE01]              mov dh,[PhyPage]
   166 0000012A CD13                    int 13h
   167 0000012C 72E9                    jc ReadSectors2
   168 0000012E 59                      pop cx
   169 0000012F 5B                      pop bx
   170 00000130 58                      pop ax
   171 00000131 031E[0B00]              add bx,[BytesPerSec]
   172 00000135 40                      inc ax
   173 00000136 E2D9                    loop ReadSectors
   174 00000138 C3                      ret
   175                                  
   176                                  ;input:  ax = logischer Sektor
   177                                  ;output: ds:PhySec = physikalischer Sektor
   178                                  ;        ds:PhyTrack = Spur
   179                                  ;        ds:PhyPage = Seite
   180                                  LogPhySec:
   181 00000139 50                      push ax
   182 0000013A 52                      push dx
   183 0000013B 31D2                    xor dx,dx
   184 0000013D F736[1800]              div word [SecPerTrack]
   185 00000141 FEC2                    inc dl
   186 00000143 8816[CC01]              mov [PhySector],dl
   187 00000147 31D2                    xor dx,dx
   188 00000149 F736[1A00]              div word [NumHeads]
   189 0000014D 8816[CE01]              mov [PhyPage],dl
   190 00000151 A2[CD01]                mov [PhyTrack],al
   191 00000154 5A                      pop dx
   192 00000155 58                      pop ax
   193 00000156 C3                      ret
   194                                  
   195                                  ;input:  ax = Cluster
   196                                  ;output: ax = Sektor
   197                                  CluSec:
   198 00000157 51                      push cx
   199 00000158 52                      push dx
   200 00000159 2D0200                  sub ax,2 ;die ersten beiden Cluster-Einträge sind in der FAT reserviert
   201 0000015C 8A0E[0D00]              mov cl,[SecPerClus]
   202 00000160 30ED                    xor ch,ch
   203 00000162 F7E1                    mul cx
   204 00000164 8B0E[0E00]              mov cx,[RsvdSecCnt]
   205 00000168 01C8                    add ax,cx
   206 0000016A 50                      push ax
   207 0000016B B82000                  mov ax,32
   208 0000016E F726[1100]              mul word [RootEntCnt]
   209 00000172 F736[0B00]              div word [BytesPerSec]
   210 00000176 89C1                    mov cx,ax
   211 00000178 58                      pop ax
   212 00000179 01C8                    add ax,cx
   213 0000017B 50                      push ax
   214 0000017C A0[1000]                mov al,[NumFATs]
   215 0000017F 30E4                    xor ah,ah
   216 00000181 F726[1600]              mul word [FATsize]
   217 00000185 89C2                    mov dx,ax
   218 00000187 58                      pop ax
   219 00000188 01D0                    add ax,dx
   220 0000018A 5A                      pop dx
   221 0000018B 59                      pop cx
   222 0000018C C3                      ret
   223                                  
   224 0000018D 4C4F53542077697264-     Msg db "LOST wird geladen...",00h
   225 00000196 2067656C6164656E2E-
   226 0000019F 2E2E00            
   227 000001A2 4C4F53543A20446174-     ErrorMsg db "LOST: Datei nicht gefunden.",0
   228 000001AB 6569206E6963687420-
   229 000001B4 676566756E64656E2E-
   230 000001BD 00                
   231 000001BE 4C4F53542020202053-     FileName db "LOST    SYS"
   232 000001C7 5953              
   233 000001C9 00                      drive db 0
   234 000001CA 0000                    FileCluster dw 0
   235 000001CC 00                      PhySector db 0
   236 000001CD 00                      PhyTrack db 0
   237 000001CE 00                      PhyPage db 0
   238                                  
   239 000001CF 00<rept>                times 510-($-$$) db 0
   240 000001FE 55AA                    dw 0AA55h
In the Future everyone will need OS-64!!!

 

Einloggen