Bootsektor Dos 5.0 Assembler Quellcode Label: Adresse Befehl ";Kommentar ------------------------------------------------------------------------------ hex zum_anfang 0 JMP zu_prg ";Sprung zur Bootrotiene" 2 NOP 3 Dc.b 8 ";Infoeinträge 8" byte_pro_sec B dc.w 1 ";Byte pro Sector" sec_pro_clust D dc.b 1 ";sectoren pro Cluster" anz_rese_sec E dc.w 1 ";anz Reservierter Sec" anz_fats 10 dc.b 1 ";anz Fat s" anz_hauptver 11 dc.w 1 ";anz Hauptverzeichnise" anz_sek_disk 13 dc.w 1 ";anz Sec im Volumen Bei Festplatte null ?" med_deskrip 15 dc.b 1 ";Media-Desciptor" anz_sec_fats 16 dc.w 1 ";anz sec pro Fats" sec_pro_spur 18 dc.w 1 ";Sec pro Spur" anz_kopfe 1A dc.w 1 ";anz Köpfe" sec_partio_bis_boot 1C dc.w 1 ";endfernung bis Bootsectors" 1D geheim 1E ";gesamtanzahl Sec im Volumen" ... merk1 20 laufwerk 24 merk7 25 DDPT ... "Bootrotiene" zu_prg 3E CLI ";Interrupt Sperren" 3F XOR AX,AX ";AX=0" 41 MOV SS,AX ";SS=0" 43 MOV SP,zum_anfang ";Stackpointer setzen" 46 PUSH SS ";SS an ES übergeben" 47 POP ES ";ES=0" 48 MOV BX,$78 ";Adr der DDPT"DiskParameter Tabelle merk4 49 merk5 4B SS: ";:ss=0 4C LDS SI,[BX] ";SI=adr der DDPT" merk8 4D 4E PUSH DS ";Stack merk6 4F PUSH SI merk2 50 PUSH SS 51 PUSH BX DDPT Kopieren merk3 52 MOV DI,zu_prg 55 MOV CX,$B ";CX=11" 58 CLD ";D Flag löschen" 59 REPZ von[$78]+zu[zu_prg]+ ";DDPT nach zu_prg kopieren" 5A MOVSB ";Byteweise" 5B PUSH ES 5C POP DS ";DS=0" 5D MOV Byte Ptr [DI-2],$F ";Head Settel-Time auf 15ms setzen" 61 MOV CX,[sec_pro_spur] ";CX=Sectoren pro Spur" 65 MOV [DI-7],CL ";und in DDPT Schreiben" 68 MOV [BX+2],AX ";DDPT adresse Hi =0" 6B MOV word Ptr [BX],zu_prg ";adr in Interrupt Vektor Tabelle 78$" 6F STI ";Interrupt Freigabe" 70 INT #$13 ";Diskreset" 72 JB Error ";Diskreset fehlgeschlagen" 74 XOR AX,AX ";AX=0" 76 CMP [anz_sek_disk],AX ";Teste ob Festplatte oder Disk" 7A JZ Festplatte 7C MOV CX,[anz_sek_disk] ";Diskette" 80 MOV [merk1],CX ";anz sec pro Disk merken" Festplatte 84 Mov AL,[anz_fats] ";anz Fatïs in AL" 87 MUL Word Ptr[anz_sec_fats] ";mal anz sectoren pro fat" 8B ADD AX,[sec_partio_bis_boot]";+sec von Partiontabelle bis Bootsector" 8F ADC DX,[geheim] ";gesamtanzahl sec im volumen" 93 ADD AX,[anz_rese_sec] ";+anz reservierte sectoren" 97 ADC AX,#0 9A MOV [merk2],AX ";merken" 9D MOV [merk3],DX A1 MOV [merk4],AX A4 MOV [merk5],DX A8 MOV AX,#$20 ";AX=32" AB MUL Word Ptr[anz_hauptver] ";32*anz einträge Hauptverzeichnis" AF MOV BX,[byte_pro_sec] ";+byte pro sector" B3 ADD AX,BX B5 DEC AX ";-1" B6 DIV BX ";geteilt durch byte pro sector" B8 ADD [merk4],AX ";+fats+partitiontabelle+AX" BC ADC Word Ptr[merk5],#0 C1 MOV BX,500 ";Ofsetadresse zum laden ?ist 500 hex oder dec" C4 MOV DX,[merk3] ";=0" C8 MOV AX,[merk2] ";anz gesamt sectoren bis verzeichnis" CB CALL log_in_phy ";umrechnen von logisch in Physikalisch" CE JB Error ";fehler aufgetreten" D0 MOV AL,1 ";anz der zu lesenden Sectoren" D2 CALL lese_sector ";lese verzeichnis" D5 JB Error ";fehler aufgetreten" D7 MOV DI,BX ";ofsetadresse des geladennen 500" D9 MOV CX,#B ";CX=11" DC MOV SI,io_sys ";IO_SYS" DF REPZ ";steht io_sys im verzeichnis" E0 CMPSB ";gleich" E1 JNZ Error ";nein" E3 LEA DI,[BX+20] ";500+20 nächster verzeichniseintrag" E6 MOV CX,B ";CX=11" E9 REPZ ";nocheinmal testen EA CMPSB EB JZ weiter1 error ED MOV SI,error_str ";'Kein System Disk '" F0 CALL Print ";text ausgabe" F3 XOR AX,AX F5 INT #16 ";tastaturabfrage" F7 POP SI F8 POP DS F9 POP [SI] FB POP [SI+2] FE INT #19 ";System Reset" fehlerxx 100 POP AX 101 POP AX 102 POP AX 103 JMP Error berechnet die logiche ardresse wo io_sys weiter1 105 MOV AX,[BX+1A] ";500+26 gibt Dateigrösse von Io sys an" 108 DEC AX ";-1" 109 DEC AX ";-1" 10A MOV BL,[sec_pro_clust] 10E XOR BH,BH ";BH=0" 110 MUL BX ";dateigrösse*sec_pro_cluster" 112 ADD AX,[merk4] ";+datenanfang" 116 ADC DX,[merk5] ";Lo" 11A MOV BX,700 ";Ofsetadr wo io_sys hingeladen wird" 11D MOV CX,3 ";Segment adr" Do_Loop 120 PUSH AX 121 PUSH DX 122 PUSH CX 123 CALL log_in_phy ";umrechnen in phy sectoren" 126 JB fehlerxx ";fehler aufgetreten" 128 MOV AL,1 12A CALL lese_sector 12D POP CX 12E POP DX 12F POP AX 130 JB Error 132 ADD AX,1 135 ADC DX,#0 138 ADD BX,[byte_pro_sec] 13C LOOP Do_Loop 13E MOV CH,[med_deskrip] 142 MOV DL,[laufwerk] 146 MOV BX,[merk4] ";ende des Verzeichnises" 14A MOV AX,[merk5] 14D JMP 0070:0000 Print 152 LODSB 153 OR AL,AL 155 JZ weiter3 ";Alle zeichen ausgegeben dann RET" 157 MOV AH,#E ";Funktion ein zeichen ausgeben" 159 MOV BX,#7 ";Farbe" 15C INT #10 ";Funktion Bios 10" 15E JMP Print log_in_phy 160 CMP DX,[sec_pro_spur] 164 JNB weiter2 166 DIV Word Ptr [sec_pro_spur] ";anfang verzeichnis / sec_pro_spur" 16A INC DL ";+1" 16C MOV [merk6],DL ";Spur" 170 XOR DX,DX 172 DIV Word Ptr [anz_kopfe] 176 MOV [merk7],DL ";Sektoren" 17A MOV [merk8],AX ";Köpfe" 17D CLC ";C Flag=0" 17E RET weiter2 17F STC ";C Flag=1" weiter3 180 RET lese_sector 181 MOV AH,#2 ";Bios Funktion Lese Sektor 183 MOV DX,[merk8] ";Sector" 187 MOV CL,#6 189 SHL DH,CL 18B OR DH,[merk6] ";Spur" 18F MOV CX,DX 191 XCHG CH,CL 193 MOV DL,[laufwerk] ";Laufwerk" 197 MOV DH,[merk7] ";kopf" 19B INT #13 19D RET 19E DB """Kein System oder Laufwerksfehler wechseln und taste drücken"",0,0" 1DF DB """IO.SYS""" 1EA DB """MSDOS.SYS"""