Page 1

‫   ر

د را ا از â&#x20AC;¬ â&#x20AC;«â&#x20AC;ªHow To Program a Bootstrap Loaderâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø¯ ر زد  ا   â&#x20AC;ª bootstrapâ&#x20AC;¬Ù&#x2C6;د داردâ&#x20AC;ª  .â&#x20AC;¬Ø¯  ا   â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª ++ bootstrapâ&#x20AC;¬Ø§   *   دÙ&#x2020; )(Ù&#x2021; &دش در را â&#x20AC;ª ""#  $â&#x20AC;¬Ø± دÙ&#x2020;  â&#x20AC;¬ â&#x20AC;«Ø¯Ø± â&#x20AC;ª$0â&#x20AC;¬Ø­ â&#x20AC;ª4:)+,  -â&#x20AC;¬Ø± از â&#x20AC;ª 890 4â&#x20AC;¬Ø§â&#x20AC;ª56â&#x20AC;¬Ø§Ø± Ù&#x2C6;  Ù&#x2026; اâ&#x20AC;ª56â&#x20AC;¬Ø§Ø± Ù&#x2C6;  از â&#x20AC;ª 3$0 4â&#x20AC;¬Ø¯Ø§â&#x20AC;ª(2â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø§Ø² د" د اÙ&#x2020;  â&#x20AC;ª  RECOVERYâ&#x20AC;¬Ø¯Ù&#x2020; â&#x20AC;ª <+ >( ?6â&#x20AC;¬Ù&#x2C6;    â&#x20AC;ª ++ = >0â&#x20AC;¬Ø§ر<  دâ&#x20AC;ª.â&#x20AC;¬â&#x20AC;¬ â&#x20AC;« ا اâ&#x20AC;ªD:â&#x20AC;¬Ø± اâ&#x20AC;ªCâ&#x20AC;¬Ø¬ دا دâ&#x20AC;ª ""# @Aâ&#x20AC;¬Ø± د â&#x20AC;ª +, BIOSâ&#x20AC;¬Ù&#x2C6; اâ&#x20AC;ª E= "# D:â&#x20AC;¬Ø¯ â&#x20AC;ª+â&#x20AC;¬Ù&#x2020;  â&#x20AC;ª>0â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«= â&#x20AC;ªFâ&#x20AC;¬Ø¯â&#x20AC;ª.â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª   Bootstrapâ&#x20AC;¬Ø± â&#x20AC;ª BIOS(Basic Input Output System) G0  +, D#â&#x20AC;¬Ù&#x2021;â&#x20AC;ª":â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«  را رÙ&#x2C6; â&#x20AC;ª +H >:Dâ&#x20AC;¬Ø§Ø²  â&#x20AC;ª  POST(Power On Self Test) ?Câ&#x20AC;¬Ø¯Ø§& â&#x20AC;ª RAMâ&#x20AC;¬Ø±(â&#x20AC;ª5â&#x20AC;¬Ø§Ø± â&#x20AC;¬ â&#x20AC;«â&#x20AC;ªFâ&#x20AC;¬Ø¯â&#x20AC;ª.â&#x20AC;¬Ø§â&#x20AC;ªD:â&#x20AC;¬Ø±  ا د اâ&#x20AC;ªIâ&#x20AC;¬Ù&#x2026; â&#x20AC;ªFâ&#x20AC;¬Ø¯  â&#x20AC;ª#â&#x20AC;¬Ù&#x2020; â&#x20AC;ª BIOSâ&#x20AC;¬Ù&#x2021;â&#x20AC;ª "Jâ&#x20AC;¬Ø§â&#x20AC;ª =KLâ&#x20AC;¬Ø§Ø² â&#x20AC;ª = >0â&#x20AC;¬Ø±Ø¯ â&#x20AC;ª+  4â&#x20AC;¬Ø§Ø±Ø¯â&#x20AC;¬ â&#x20AC;«Ø¯Ø± Ù&#x2C6;اâ&#x20AC;ª OAâ&#x20AC;¬Ù&#x2C6;â&#x20AC;ª    Aâ&#x20AC;¬Ø±Ø§ â&#x20AC;ª + 9â&#x20AC;¬Ø§â&#x20AC;ª +â&#x20AC;¬Ø±Ù&#x2C6; )Ù&#x2020; Ù&#x2021; ( â&#x20AC;ª ?= >0â&#x20AC;¬Ø±Ø§  â&#x20AC;ª9â&#x20AC;¬Ø§Ù&#x2021;â&#x20AC;ªMN +â&#x20AC;¬â&#x20AC;¬ â&#x20AC;« د< Ù&#x2C6; از )Ù&#x2020; اâ&#x20AC;ªP0â&#x20AC;¬Ø¯< â&#x20AC;ª +:â&#x20AC;¬Ù&#x2C6;  Ù&#x2021; د â&#x20AC;ª (  BIOSâ&#x20AC;¬Ø§ â&#x20AC;ª Lâ&#x20AC;¬Ø§â&#x20AC;ª <+ Câ&#x20AC;¬Ø§â&#x20AC;ª  80â&#x20AC;¬Ù&#x2021;â&#x20AC;ª "Jâ&#x20AC;¬Ø¯& Ù&#x2C6; â&#x20AC;ª6 Nâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø¯Ø± â&#x20AC;ª = >0â&#x20AC;¬Ø± â&#x20AC;ª+â&#x20AC;¬Ø§  â&#x20AC;ª +â&#x20AC;¬Ø¯Ø± Ù&#x2C6;اâ&#x20AC;ª,+ BIOS OAâ&#x20AC;¬Ù&#x201E;  )درس â&#x20AC;ª  Q9Fâ&#x20AC;¬Ø±Ù&#x2C6; Ù&#x2021;رد دâ&#x20AC;¬ â&#x20AC;«" ددâ&#x20AC;ª) .â&#x20AC;¬Ù&#x2020; )درس  â&#x20AC;ª +, bootstrapâ&#x20AC;¬Ù&#x2C6; Ù&#x2C6;â&#x20AC;ª GU6 BIOS PTâ&#x20AC;¬Ø¯  دÙ&#x2020; )Ù&#x2020;   رÙ&#x2C6; â&#x20AC;ªRAMâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;« د< Ù&#x2C6; â&#x20AC;ª +Hâ&#x20AC;¬Ø§Ø² ا ا â&#x20AC;ª bootstrapâ&#x20AC;¬Ø§  Ù&#x2C6;â&#x20AC;ª PTâ&#x20AC;¬Ø§ ا â&#x20AC;ª = >0â&#x20AC;¬Ø±Ù&#x2C6; â&#x20AC;ª <+Hâ&#x20AC;¬Ø¯Ø§Ø±Ø¯ )اâ&#x20AC;ªD:â&#x20AC;¬Ø±  ا دâ&#x20AC;¬ â&#x20AC;«Ø§â&#x20AC;ªIâ&#x20AC;¬Ù&#x2026; â&#x20AC;ªFâ&#x20AC;¬Ø¯  اâ&#x20AC;ªDâ&#x20AC;¬Ù&#x2020; â&#x20AC;ª = >0â&#x20AC;¬Ø±Ø¯ â&#x20AC;ª 4â&#x20AC;¬Ù&#x2C6;â&#x20AC;ª W& XTâ&#x20AC;¬Ø±Ø§ دâ&#x20AC;ª,â&#x20AC;¬Ù&#x201E;  د< Ù&#x2C6;   رÙ&#x2C6; Ù&#x2021;ردâ&#x20AC;ª V Dâ&#x20AC;¬Ø§Ø²â&#x20AC;¬ â&#x20AC;«Ù&#x2021;ردد اÙ&#x2C6;Ù&#x201E; â&#x20AC;ª + <+ MNâ&#x20AC;¬Ù&#x2C6;  Ù&#x2021; د â&#x20AC;ª+-â&#x20AC;¬Ø§  دÙ&#x2020; Ù&#x2C6; ا ا  دÙ&#x2020; Ù&#x2021; â&#x20AC;ªbootstrap <+H = >0â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª. (+,â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª Bootstrapâ&#x20AC;¬Ø§Ø² اÙ&#x2C6; â&#x20AC;ª sectorâ&#x20AC;¬Ù&#x2021;ردد اÙ&#x2C6;Ù&#x201E; Ù&#x2C6; از â&#x20AC;ª PW trackâ&#x20AC;¬Ù&#x2C6; â&#x20AC;ª PWheadâ&#x20AC;¬Ù&#x2C6; â&#x20AC;ª)   sectorâ&#x20AC;¬Ù&#x2020;â&#x20AC;¬ â&#x20AC;«Ù&#x2021;ردد &اâ&#x20AC;ªF <+â&#x20AC;¬Ø¯ Ù&#x2C6; اâ&#x20AC;ª bootstrap D:â&#x20AC;¬Ø§Ø² â&#x20AC;ª+â&#x20AC;¬Ø§Ù&#x2026; دâ&#x20AC;ª <"0â&#x20AC;¬Ø¯ د "  â&#x20AC;ª4:â&#x20AC;¬Øª  در â&#x20AC;ªBIOSâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø¯Ø§Ø±Ø¯  â&#x20AC;ª+â&#x20AC;¬Ø§Ù&#x2026; دâ&#x20AC;ª <"0â&#x20AC;¬Ø±Ø§ â&#x20AC;ª:Hâ&#x20AC;¬Ø§Ù&#x2020; اÙ&#x2C6;  â&#x20AC;ª Oâ&#x20AC;¬Ø§ â&#x20AC;ª bootstrapâ&#x20AC;¬Ø§â&#x20AC;ª9â&#x20AC;¬Ø¨  د< â&#x20AC;ª.+â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ù&#x2021;â&#x20AC;ª":â&#x20AC;¬Ù&#x2026; د â&#x20AC;ª+â&#x20AC;¬Ù&#x2020; â&#x20AC;ª 8 [١٢ : bootstrapâ&#x20AC;¬Ø§Ø² اÙ&#x2C6; â&#x20AC;ªD0â&#x20AC;¬Ø± &اâ&#x20AC;ª <+ <+â&#x20AC;¬Ù&#x2C6;  دا& رÙ&#x2026; ر(â&#x20AC;ª5â&#x20AC;¬Ø§Ø± â&#x20AC;ªFâ&#x20AC;¬Ø¯ â&#x20AC;¬ â&#x20AC;«Ø§ â&#x20AC;ª 8 [١٢â&#x20AC;¬Ø¯Ø± )درس â&#x20AC;ª 0000:7C00 D56â&#x20AC;¬Ø¯Ø± رÙ&#x2026; â&#x20AC;ª Aâ&#x20AC;¬Ø§Ø± " د Ù&#x2C6; â&#x20AC;ª +Hâ&#x20AC;¬Ø§Ø² )Ù&#x2020; â&#x20AC;ª6 &) 8 Ù¢ BIOSâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª bootstrapâ&#x20AC;¬Ø±Ø§  در رÙ&#x2026; â&#x20AC;ª Aâ&#x20AC;¬Ø§Ø± دارد را ا^Ù&#x2020; â&#x20AC;ª) +:Dâ&#x20AC;¬Ù&#x2C6;اâ&#x20AC;ª OAâ&#x20AC;¬Ø¯Ø± اâ&#x20AC;ª (1FEh 86â&#x20AC;¬Ø§ â&#x20AC;ª+-â&#x20AC;¬Ø§  دÙ&#x2020; â&#x20AC;ª+Uâ&#x20AC;¬Ø§Ø± â&#x20AC;ªAA55hâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«  â&#x20AC;ª+-â&#x20AC;¬Ø§  دÙ&#x2020; ا â&#x20AC;ª+Uâ&#x20AC;¬Ø§Ø± â&#x20AC;ªF  BIOSâ&#x20AC;¬Ø¯  Ù&#x2021;ردد ردâ&#x20AC;ª bootable 4â&#x20AC;¬Ø¯<â&#x20AC;ª.â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ªL 8 [١٢ + Ù&#x2039; C Bootstrapâ&#x20AC;¬Ù&#x201E; دا â&#x20AC;ª 8?H +â&#x20AC;¬Ø§â&#x20AC;ª GU6 D:â&#x20AC;¬Ø±Ù&#x2C6;  â&#x20AC;ªD0â&#x20AC;¬Ø± â&#x20AC;ª +:F:â&#x20AC;¬Ù&#x2C6; â&#x20AC;ª &) 8 Ù¢â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«)Ù&#x2020; â&#x20AC;ªF # BIOS G0â&#x20AC;¬Ø¯â&#x20AC;ª +H .â&#x20AC;¬Ø§Ø² ا اâ&#x20AC;ª 8 Ù¢ BIOS D:â&#x20AC;¬Ø±Ø¯ â&#x20AC;ª 4â&#x20AC;¬Ø±Ø§ â&#x20AC;ª)  + ,â&#x20AC;¬Ø¯Ø±Ø³ â&#x20AC;ª0000:7C00â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø±â&#x20AC;ª 6â&#x20AC;¬Ù&#x2C6; â&#x20AC;ª :â&#x20AC;¬Ù&#x201E; را  â&#x20AC;ª bootstrapâ&#x20AC;¬Ù&#x2C6;ا(`ار â&#x20AC;ª.+:Dâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«Ø§ â&#x20AC;ª Dâ&#x20AC;¬Ø±  ا  Ù&#x2020; â&#x20AC;ª+  +,â&#x20AC;¬Ø§â&#x20AC;ª +:â&#x20AC;¬Ø¯Ø± â&#x20AC;ª 8Câ&#x20AC;¬Ù&#x2C6;اâ&#x20AC;ª - Real Mode HAâ&#x20AC;¬Ø¯Ø§Ø²â&#x20AC;ª  <+â&#x20AC;¬Ù&#x2021;Ù&#x2020;â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª GU6 CPUâ&#x20AC;¬Ù&#x2C6; â&#x20AC;ª GU6â&#x20AC;¬Ø¯Ø± â&#x20AC;ª 8 Ù¡a 8Câ&#x20AC;¬Ø± â&#x20AC;ª +:Dâ&#x20AC;¬Ù&#x2C6; â&#x20AC;ª) segment ,b  +â&#x20AC;¬Ø¯< â&#x20AC;ª + <+â&#x20AC;¬Ù&#x2C6; â&#x20AC;ªH$Aâ&#x20AC;¬Øª â&#x20AC;ª+â&#x20AC;¬Ù&#x2021;â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª 2 +,â&#x20AC;¬Ø§Ø² â&#x20AC;ª.+ 8 ? acâ&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª Bootstrapâ&#x20AC;¬Ø¯Ø± â&#x20AC;ª - 8C ? 8Câ&#x20AC;¬Ø¯Ø§Ø²â&#x20AC;ª <+â&#x20AC;¬Ø±Ø§ از â&#x20AC;ª+ e 8 ٣٢  8 Ù¡aâ&#x20AC;¬Ù&#x2021;â&#x20AC;ª +â&#x20AC;¬Ù&#x2C6; ا د â&#x20AC;ªFâ&#x20AC;¬Ø¯ â&#x20AC;¬ â&#x20AC;«اÙ&#x2020;  Ù&#x2C6;â&#x20AC;ª) ?0â&#x20AC;¬Ù&#x2020; اâ&#x20AC;ªD:â&#x20AC;¬Ø± را â&#x20AC;ª Dâ&#x20AC;¬Ø¯â&#x20AC;ª.â&#x20AC;¬â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª 8Aâ&#x20AC;¬Ø¯Ù&#x2C6;Ù&#x2026; â&#x20AC;ª  bootstrapâ&#x20AC;¬Ø±Ù&#x2021; د" â&#x20AC;ª eâ&#x20AC;¬Ø§Ø² ر  دÙ&#x2020; â&#x20AC;ª = >0â&#x20AC;¬Ø±Ø§ =â&#x20AC;ª <+â&#x20AC;¬Ø¯Ø§Ø±Ø¯ را اÙ&#x2020; در )Ù&#x2020;â&#x20AC;¬ â&#x20AC;«â&#x20AC;ª 8 [١٢â&#x20AC;¬Ø°& <  دâ&#x20AC;ª.â&#x20AC;¬â&#x20AC;¬ â&#x20AC;« â&#x20AC;ª0 bootstrapâ&#x20AC;¬Ø¯< اâ&#x20AC;ª +: +â&#x20AC;¬Ø² â&#x20AC;ª:+â&#x20AC;¬â&#x20AC;¬


‫**************************************;‬ ‫]‪[BITS 16‬‬ ‫‪ORG‬‬ ‫‪0‬‬ ‫‪INT‬‬ ‫‪0x18‬‬ ‫‪TIMES‬‬ ‫‪510-($-$$) DB 0‬‬ ‫‪DW‬‬ ‫‪0xAA55‬‬ ‫**************************************;‬ ‫از ا  ‪+  +H‬ه   ‪ +:,‬در ‪  ?6‬م ‪ bootstrap.asm‬ذ& < " دد‪.‬ا ‪h‬ل ان‬ ‫ ‪ <+   NASM ?0‬و  ‪ ( +,  +‬دد ا ‪W + + +‬رت د& < ( دد‪:‬‬ ‫‪Nasm –O bootstrap.asm bootstrap.bin‬‬ ‫و ‪ +  C‬ا>  ‪& <+ compile 6‬د را رو ‪ PW track‬و ‪ PW head‬و‪ sector‬اول‬ ‫ ‪0  >:‬د<   روش ا‪P0‬د< از ‪) +, debug‬ا‪ GU6  debug ?0 +:  ,‬ا‪+‬‬ ‫ رو ‪ floppy disk‬و  ‪ hard disk‬ا‪D:‬ر را ا‪I‬م داد< ‪:F-‬د ‪F‬د ا ا^ن ا‪D:‬ر رو ‬ ‫‪&hard disk‬د ‪ ,A‬از ا‪D:‬ر از )ن  ‪,F-‬ن  ‪.(+:‬‬ ‫‪Debug bootstrap.bin‬‬ ‫‪-W 100 0 0 1‬‬ ‫‪-Q‬‬

‫‪:+ 3i‬‬ ‫ ‪ ?0‬د‪0‬ر ‪ w‬ا> ‪ ?6‬را   دا& ‪ 46C‬د  د< ا> در   ‪9‬اه> ‪  >:‬در ا‪ I:‬‬ ‫‪9‬اه> ‪?6‬ن را در ‪  >:  sector ، PW head، PW track‬در ‪ debug‬ز  ‪Q9F‬‬ ‫ دن ‪ track‬و ‪ 8 head‬و ‪) I‬ن ر< د و ‪ +H‬از )ن ‪D0‬ر رد ‪ 4‬و ‪ +H‬از )ن ر< )ن را‬ ‫‪ >:D Q9F‬در وا‪ OA‬در ا د‪0‬ر ‪  0 0 1‬ا ‪ 6  +, :H‬را در ‪) -K6‬او ‪ ( PW‬در ‪D0‬ر‬ ‫‪  PW‬ر<  )ن  ‪ .‬ر< اول ‪  100 :H‬ا ‪ :H‬ه‪  6  8‬در )درس ‪ ١٠٠‬رم ذ& <‬ ‫‪) GU6  <+‬درس  وع را  ‪+ debug‬ه>‪.‬‬ ‫ ا ا‪=KL‬ت ‪ F‬ا‪  +‬راه‪  debug :‬ا‪.+: H‬‬ ‫در ا‪ unix based ?= >0 h‬ا‪ +‬از د‪0‬ر ز ا‪P0‬د< ‪:+:‬‬ ‫‪dd if=bootstrap.bin of=/dev/fd0‬‬ ‫ ا ا‪=KL‬ت ‪ F‬ا‪ +‬در ‪& unix‬د د‪0‬ر ز را ا ا  د<‬ ‫‪Man dd‬‬ ‫  ه ‪ Bootstrap‬ا‪ +:‬دارا ‪ ? A‬د" ‪ e‬از ت  دن ‪ >0‬را ‪.+ ( <+H‬ا‪":‬‬ ‫  ه ‪ - 8? A‬و را< ا‪+‬از ‪ mH‬از ‪ 890‬ا‪56‬اره‪ - 8C e،‬داز‪ <+ 846^ 8C  <+‬و‬ ‫ ‪D‬ر(  و‪& PT‬ص رو ‪ -‬داز‪.<+‬‬ ‫  ه ‪C‬ل  ه ‪ bootstrap‬ا‪5 ?6 +:‬ر( از ‪ 8 [١٢‬و  ‪ ? A‬ر ‪ F‬را ‬ ‫دا& ‪ 46C‬ر(‪5‬ار ‪.+::‬‬ ‫دو ‪P :D‬وت ا ‪-‬د< ‪0‬ز ا‪D:‬ر ود دارد)‪5 ?6‬ر( از ‪. (8 [١٢‬‬ ‫‪ -١‬او روش وا‪ XA‬دن  ا ‪+  +, D‬ا> ‪+U#‬ر ‪D0‬ر ‪ +‬در ‪ 46C‬د د و ا‪D:‬‬ ‫ا ‪+U‬ار ‪D0‬ر ‪+U#‬ر ‪L‬ل ‪   +FD‬دا& ‪ 46C‬ود و ان ‪ :‬ل را  )ن ‪  ?6‬در‬ ‫‪ 46C‬د ‪ <+‬ا‪  U: 80‬د و ا ‪$ +‬ر ‪H‬ل ‪ 6 >0‬ر رو د را از ‬ ‫‪ ,‬د و =‪ & E‬ا  ه‪5‬اران ‪F ?6‬د  رو ‪ 6 >0‬ر د ‪  +,‬ا د‬ ‫  ‪   bootstrap‬ا> ا‪C‬ج ‪ F‬از ‪ 8 [١٢‬دا و  ا د   از ‪>0‬‬ ‫‪ 6‬ر ا‪P0‬د< ‪ D‬د< در وا‪& OA‬دن دو ر< ‪ #‬خ را ا& اع  د<  ه د ا ر =‪E‬‬ ‫ > ر‪ "9‬در ‪ 6 >0‬ر ‪F‬د‪.‬‬


6 >0  8:â&#x20AC;«Ù&#x2020;  اâ&#x20AC;¬:Lâ&#x20AC;«<  Ù&#x2C6; در )& رد اâ&#x20AC;¬+J- â&#x20AC;«  Ù&#x2C6;â&#x20AC;¬890 :Jâ&#x20AC;«  Ù&#x2C6; Ù&#x2021;â&#x20AC;¬6 F- <â&#x20AC;« راâ&#x20AC;¬-Ù¢ 8 C (6 >0 â&#x20AC;«ر  دا ر )Ù&#x2020;â&#x20AC;¬4:) â&#x20AC;«&ر )Ù&#x2020;â&#x20AC;¬0 â&#x20AC;«  د< Ù&#x2C6; ا> درâ&#x20AC;¬0: â&#x20AC;«ر راâ&#x20AC;¬ â&#x20AC;«  د< Ù&#x2C6;â&#x20AC;¬0: 6 >0 â&#x20AC;« را از رÙ&#x2C6; Ù&#x2021;â&#x20AC;¬4 â&#x20AC;« ردâ&#x20AC;¬6  >â&#x20AC;« از< دÙ&#x2021;â&#x20AC;¬bootstrap  â&#x20AC;« د< Ù&#x2C6;â&#x20AC;¬ .+: â&#x20AC;« دâ&#x20AC;¬46C â&#x20AC;« رÙ&#x2C6;â&#x20AC;¬ â&#x20AC;«  ازâ&#x20AC;¬+, data block â&#x20AC;« دÙ&#x2C6;â&#x20AC;¬+, (floppy disk) â&#x20AC;«  Ù&#x2026;â&#x20AC;¬Dâ&#x20AC;«د< در دâ&#x20AC;¬P0â&#x20AC;« رد اâ&#x20AC;¬6 >0 FAT12 .+, BIOS r? â&#x20AC;«را Ù&#x2021;â&#x20AC;¬- "â&#x20AC;« Ù&#x2C6; دâ&#x20AC;¬OEM_ID â&#x20AC;« رâ&#x20AC;¬D +â&#x20AC;« ارث د< اâ&#x20AC;¬FAT12 +â&#x20AC;«Ù&#x2021;â&#x20AC;¬+ â&#x20AC;«Ù&#x2026;â&#x20AC;¬Iâ&#x20AC;« را اâ&#x20AC;¬80â&#x20AC;«< اâ&#x20AC;¬+ format â&#x20AC;«Ø§Ø±â&#x20AC;¬56â&#x20AC;«Ø§Ù&#x2026;  Ù&#x2026; اâ&#x20AC;¬+  8Dâ&#x20AC;« دâ&#x20AC;¬D:â&#x20AC;« از اâ&#x20AC;¬e â&#x20AC;«" رâ&#x20AC;¬Jâ&#x20AC;« Ù&#x2021;â&#x20AC;¬OEM_ID â&#x20AC;«Ø±â&#x20AC;¬ +, â&#x20AC;«  رردâ&#x20AC;¬80â&#x20AC;«< اâ&#x20AC;¬+ â&#x20AC;« از )Ù&#x2020; دâ&#x20AC;¬BPB â&#x20AC;«اÙ&#x2020;â&#x20AC;¬:H Microsoft â&#x20AC;«Ø§Øªâ&#x20AC;¬+: â&#x20AC;«  درâ&#x20AC;¬BIOS r? â&#x20AC;«را Ù&#x2021;â&#x20AC;¬.+â&#x20AC;«Ù&#x2021;â&#x20AC;¬+ 3i â&#x20AC;« د راâ&#x20AC;¬D56 â&#x20AC;«تâ&#x20AC;¬N9F  80â&#x20AC;«Ù&#x2021; اâ&#x20AC;¬+?6 â&#x20AC;«Ù&#x2C6;â&#x20AC;¬C  .â&#x20AC;« دâ&#x20AC;¬6 ( â&#x20AC;«رâ&#x20AC;¬D 8Dâ&#x20AC;«> ? دâ&#x20AC;¬IC +: â&#x20AC;« &اص دâ&#x20AC;¬0: â&#x20AC;« اâ&#x20AC;¬+â&#x20AC;«ت اâ&#x20AC;¬N9F â&#x20AC;«Ø§â&#x20AC;¬ â&#x20AC;« داد< Ù&#x2021;â&#x20AC;¬rK â&#x20AC;«Ù&#x2C6; اâ&#x20AC;¬C  â&#x20AC;« Ù&#x2C6;د داردâ&#x20AC;¬0000:7C00 â&#x20AC;«  در )درسâ&#x20AC;¬+ â&#x20AC;«  ا اâ&#x20AC;¬+:D â&#x20AC;«Ù&#x2039;  Ù&#x2C6;عâ&#x20AC;¬H 0 BIOS â&#x20AC;«رâ&#x20AC;¬0â&#x20AC;« ا ا  دâ&#x20AC;¬+â&#x20AC;«Ù&#x2021;â&#x20AC;¬+ â&#x20AC;«Ù&#x2026;â&#x20AC;¬Iâ&#x20AC;« اâ&#x20AC;¬bootstrap  â&#x20AC;« ا اÙ&#x2C6; رâ&#x20AC;¬: (+, OEM_ID,BPB â&#x20AC;«رâ&#x20AC;¬4:)+, .+, â&#x20AC;«=تâ&#x20AC;¬KLâ&#x20AC;« از ا اâ&#x20AC;¬+H  +, JMP .+:D â&#x20AC;«" رâ&#x20AC;¬# FAT >P  â&#x20AC;«ج  ا داردâ&#x20AC;¬Câ&#x20AC;«Ù&#x2026; اâ&#x20AC;¬Iâ&#x20AC;« اâ&#x20AC;¬F â&#x20AC;« ا  رÙ&#x2021;â&#x20AC;¬b 6  0 0â&#x20AC;«Ø¯â&#x20AC;¬ P( (cluster) 0K <â&#x20AC;«?Ù&#x201E; دادâ&#x20AC;¬0 â&#x20AC;« Ù&#x2C6;  Ù&#x2021;â&#x20AC;¬+:D â&#x20AC;«Ù&#x2021;â&#x20AC;¬+â&#x20AC;«زâ&#x20AC;¬0 ,  â&#x20AC;«رت )را Ù&#x2021;â&#x20AC;¬N â&#x20AC;« د راâ&#x20AC;¬FAT12 e +â&#x20AC;« اâ&#x20AC;¬cluster â&#x20AC;«رÙ&#x2021; رÙ&#x2C6; Ù&#x2021;â&#x20AC;¬D0 â&#x20AC;«Ø§Ø¯â&#x20AC;¬+H â&#x20AC;«  دâ&#x20AC;¬format ""#    â&#x20AC;« اâ&#x20AC;¬: â&#x20AC;«دâ&#x20AC;¬F â&#x20AC;« راâ&#x20AC;¬cluster â&#x20AC;«Ù&#x2021; Ù&#x2021;â&#x20AC;¬track â&#x20AC;«دâ&#x20AC;¬F &: FAT(File Allocation Table) â&#x20AC;«اÙ&#x2020;â&#x20AC;¬:=   â&#x20AC;«&رâ&#x20AC;¬0 .+

+H 0K  â&#x20AC;«  )Ù&#x2020; )درسâ&#x20AC;¬+, 3^W â&#x20AC;«Ø§Ø±â&#x20AC;¬+U  â&#x20AC;«Ù&#x2C6;â&#x20AC;¬C â&#x20AC;« &دشâ&#x20AC;¬FAT.+:D â&#x20AC;«Ø§Ø±â&#x20AC;¬+" â&#x20AC;« رÙ&#x2C6; دâ&#x20AC;¬ ?6 OAâ&#x20AC;« در Ù&#x2C6;اâ&#x20AC;¬+0â&#x20AC;« &اÙ&#x2021;> رâ&#x20AC;¬EOF(End Of File) 8K=   â&#x20AC;«Ø§Ø¯â&#x20AC;¬+=â&#x20AC;« < اâ&#x20AC;¬Iâ&#x20AC;«Ù&#x201E;  دÙ&#x2020; ا زâ&#x20AC;¬,â&#x20AC;«  دâ&#x20AC;¬+:D <â&#x20AC;«Ø§رâ&#x20AC;¬ .+F < &â&#x20AC;«" Ø°â&#x20AC;¬:â&#x20AC;« اâ&#x20AC;¬FAT 6 >0 â&#x20AC;«Ø¯Ø±â&#x20AC;¬ *+â&#x20AC;« اâ&#x20AC;¬PTâ&#x20AC;« Ù&#x2C6;â&#x20AC;¬OAâ&#x20AC;«  در Ù&#x2C6;اâ&#x20AC;¬80â&#x20AC;«د را داراâ&#x20AC;¬F P( Root Directory â&#x20AC;«   )Ù&#x2020;â&#x20AC;¬6iâ&#x20AC;«&ر اâ&#x20AC;¬0  FAT12 .â&#x20AC;«< داردâ&#x20AC;¬+= cluster â&#x20AC;«? را در اÙ&#x2C6;â&#x20AC;¬6 â&#x20AC;«(`ارâ&#x20AC;¬ Root â&#x20AC;«Ø§ Ù&#x2026; ) ا درâ&#x20AC;¬+ â&#x20AC;« اâ&#x20AC;¬6   0 0â&#x20AC;«  ا دâ&#x20AC;¬860â&#x20AC;« اÙ&#x2020;  > دâ&#x20AC;¬:â&#x20AC;« ار دادÙ&#x2020;  اâ&#x20AC;¬A >â&#x20AC;«ر Ù&#x2021;â&#x20AC;¬: 

.+â&#x20AC;« را &اâ&#x20AC;¬6 â&#x20AC;«Ù&#x201E;  د<  اÙ&#x2020;â&#x20AC;¬,â&#x20AC;« را دâ&#x20AC;¬FAT &â&#x20AC;«Ø§Ø¯ داâ&#x20AC;¬+=â&#x20AC;« < اâ&#x20AC;¬Iâ&#x20AC;« زâ&#x20AC;¬+H â&#x20AC;«  د< Ù&#x2C6;â&#x20AC;¬I Directory

SOURCE CODE

â&#x20AC;« Ù&#x2C6;â&#x20AC;¬+â&#x20AC;«Ù&#x2021;â&#x20AC;¬+ â&#x20AC;«Ù&#x2020;â&#x20AC;¬F Root Directory â&#x20AC;« را از رÙ&#x2C6;â&#x20AC;¬b 6  â&#x20AC;«Ù&#x2020;â&#x20AC;¬+â&#x20AC;«"" &اâ&#x20AC;¬#  80â&#x20AC;« ز   ا اâ&#x20AC;¬+ .â&#x20AC;« اÙ&#x2020; ) ا ا ا  دâ&#x20AC;¬D:â&#x20AC;«Ø§â&#x20AC;¬

;******************************************************************** ***** [BITS 16] ORG 0 jmp START OEM_ID BytesPerSector SectorsPerCluster ReservedSectors TotalFATs MaxRootEntries TotalSectorsSmall MediaDescriptor SectorsPerFAT SectorsPerTrack NumHeads HiddenSectors TotalSectorsLarge DriveNumber Flags Signature VolumeID VolumeLabel SystemID

db dw db dw db dw dw db dw dw dw dd dd db db db dd db db

"QUASI-OS" 0x0200 0x01 0x0001 0x02 0x00E0 0x0B40 0xF0 0x0009 0x0012 0x0002 0x00000000 0x00000000 0x00 0x00 0x29 0xFFFFFFFF "QUASI BOOT" "FAT12 "


START: ; code located at 0000:7C00, adjust segment registers cli mov ax, 0x07C0 mov ds, ax mov es, ax mov fs, ax mov gs, ax ; create stack mov ax, 0x0000 mov ss, ax mov sp, 0xFFFF sti ; post message mov si, msgLoading call DisplayMessage LOAD_ROOT: ; compute size of root directory and store in "cx" xor cx, cx xor dx, dx mov ax, 0x0020 ; 32 byte directory entry mul WORD [MaxRootEntries] ; total size of directory div WORD [BytesPerSector] ; sectors used by directory xchg ax, cx ; compute location of root directory and store in "ax" mov al, BYTE [TotalFATs] ; number of FATs mul WORD [SectorsPerFAT] ; sectors used by FATs add ax, WORD [ReservedSectors] ; adjust for bootsector mov WORD [datasector], ax ; base of root directory add WORD [datasector], cx ; read root directory into memory (7C00:0200) mov bx, 0x0200 ; copy root dir above bootcode call ReadSectors ; browse root directory for binary image mov cx, WORD [MaxRootEntries] ; load loop counter mov di, 0x0200 ; locate first root entry .LOOP: push cx mov cx, 0x000B ; eleven character name mov si, ImageName ; image name to find push di rep cmpsb ; test for entry match pop di je LOAD_FAT pop cx add di, 0x0020 ; queue next directory entry loop .LOOP jmp FAILURE LOAD_FAT:


; save starting cluster of boot image mov si, msgCRLF call DisplayMessage mov dx, WORD [di + 0x001A] mov WORD [cluster], dx cluster ; compute size of FAT and store in "cx" xor ax, ax mov al, BYTE [TotalFATs] mul WORD [SectorsPerFAT] FATs mov cx, ax ; compute location of FAT and store in "ax" mov ax, WORD [ReservedSectors] bootsector ; read FAT into memory (7C00:0200) mov bx, 0x0200 bootcode call ReadSectors ; read image file into memory (0050:0000) mov si, msgCRLF call DisplayMessage mov ax, 0x0050 mov es, ax image mov bx, 0x0000 image push bx LOAD_IMAGE: mov ax, WORD [cluster] pop bx into call ClusterLBA LBA xor cx, cx mov cl, BYTE [SectorsPerCluster] call ReadSectors push bx ; compute next cluster mov ax, WORD [cluster] cluster mov cx, ax cluster mov dx, ax cluster shr dx, 0x0001 add cx, dx mov bx, 0x0200 memory add bx, cx mov dx, WORD [bx] from FAT test ax, 0x0001 jnz .ODD_CLUSTER .EVEN_CLUSTER: and dx, 0000111111111111b bits jmp .DONE .ODD_CLUSTER: shr dx, 0x0004 bits

; file's first

; number of FATs ; sectors used by

; adjust for

; copy FAT above

; destination for ; destination for

; cluster to read ; buffer to read ; convert cluster to

; sectors to read

; identify current ; copy current ; copy current ;divide by two ; sum for (3/2) ; location of FAT in ; index into FAT ; read two bytes

; take low twelve

; take high twelve


.DONE: mov cmp file jb DONE: mov call push push retf FAILURE: mov call mov int int

WORD [cluster], dx dx, 0x0FF0

; store new cluster ; test for end of

LOAD_IMAGE si, msgCRLF DisplayMessage WORD 0x0050 WORD 0x0000

si, msgFailure DisplayMessage ah, 0x00 0x16 0x19

; await keypress ; warm boot computer

;******************************************************************** ***** ; PROCEDURE DisplayMessage ; display ASCIIZ string at "ds:si" via BIOS ;******************************************************************** ***** DisplayMessage: lodsb ; load next character or al, al ; test for NUL character jz .DONE mov ah, 0x0E ; BIOS teletype mov bh, 0x00 ; display page 0 mov bl, 0x07 ; text attribute int 0x10 ; invoke BIOS jmp DisplayMessage .DONE: ret ;******************************************************************** ***** ; PROCEDURE ReadSectors ; reads "cx" sectors from disk starting at "ax" into memory location "es:bx" ;******************************************************************** ***** ReadSectors: .MAIN mov di, 0x0005 ; five retries for error .SECTORLOOP push ax push bx push cx call LBACHS mov ah, 0x02 ; BIOS read sector mov al, 0x01 ; read one sector mov ch, BYTE [absoluteTrack] ; track mov cl, BYTE [absoluteSector] ; sector mov dh, BYTE [absoluteHead] ; head mov dl, BYTE [DriveNumber] ; drive int 0x13 ; invoke BIOS


jnc

.SUCCESS

; test for read

ax, ax 0x13 di

; BIOS reset disk ; invoke BIOS ; decrement error

cx bx ax .SECTORLOOP

; attempt to read

error xor int dec counter pop pop pop jnz again int .SUCCESS mov call pop pop pop add inc loop ret

0x18 si, msgProgress DisplayMessage cx bx ax bx, WORD [BytesPerSector] ax .MAIN

; queue next buffer ; queue next sector ; read next sector

;******************************************************************** ***** ; PROCEDURE ClusterLBA ; convert FAT cluster into LBA addressing scheme ; LBA = (cluster - 2) * sectors per cluster ;******************************************************************** ***** ClusterLBA: sub ax, 0x0002 ; zero base cluster number xor cx, cx mov cl, BYTE [SectorsPerCluster] ; convert byte to word mul cx add ax, WORD [datasector] ; base data sector ret ;******************************************************************** ***** ; PROCEDURE LBACHS ; convert "ax 2; LBA addressing scheme to CHS addressing scheme ; absolute sector = (logical sector / sectors per track) + 1 ; absolute head = (logical sector / sectors per track) MOD number of heads ; absolute track = logical sector / (sectors per track * number of heads) ;******************************************************************** ***** LBACHS: xor dx, dx ; prepare dx:ax for operation div WORD [SectorsPerTrack] ; calculate inc dl ; adjust for sector 0 mov BYTE [absoluteSector], dl xor dx, dx ; prepare dx:ax for operation div WORD [NumHeads] ; calculate


mov mov ret

BYTE [absoluteHead], dl BYTE [absoluteTrack], al

absoluteSector db 0x00 absoluteHead db 0x00 absoluteTrack db 0x00 datasector cluster ImageName msgLoading 0x0A, 0x00 msgCRLF msgProgress msgFailure

dw dw db db

0x0000 0x0000 "LOADER BIN" 0x0D, 0x0A, "Loading Boot Image ", 0x0D,

db 0x0D, 0x0A, 0x00 db ".", 0x00 db 0x0D, 0x0A, "ERROR : Press Any Key to Reboot", 0x00

TIMES 510-($-$$) DB 0 DW 0xAA55 ;*************************************************************************

:  â&#x20AC;ŤŘŻŘ§â&#x20AC;Ź

6iâ&#x20AC;Ť اâ&#x20AC;Ź+  â&#x20AC;Ť اعâ&#x20AC;ŹD â&#x20AC;Ť Ů&#x2C6;ŘŻ داعد  ازâ&#x20AC;Ź- O  â&#x20AC;ŤŘąâ&#x20AC;Ź# 8 &) â&#x20AC;Ť ŘŻŘąâ&#x20AC;Ź.â&#x20AC;ŤŘą داعدâ&#x20AC;ŹF ) Câ&#x20AC;Ť اâ&#x20AC;ŹL   + .+:D (? â&#x20AC;Ť Řą ŘąŮ&#x2C6;â&#x20AC;Ź8Hiâ&#x20AC;ŤŮž Ů&#x2C6;â&#x20AC;Ź# 8  <+ BIOS â&#x20AC;Ť از ŘąŮ&#x2C6;اâ&#x20AC;ŹD (â&#x20AC;ŤŘąâ&#x20AC;ŹD E= DisplayMessage . â&#x20AC;ŤŘš Řąâ&#x20AC;ŹKLâ&#x20AC;ŤŘą ا اâ&#x20AC;Ź 46C â&#x20AC;Ť ŘąŮ&#x2C6;â&#x20AC;Ź8Dâ&#x20AC;Ť=ŘŞ &Ů&#x2026; از ŘŻâ&#x20AC;ŹKLâ&#x20AC;ŤŮ&#x2020; اâ&#x20AC;Ź+â&#x20AC;Ť ا &اâ&#x20AC;ŹBIOS â&#x20AC;ŤŘą( ŘąŮ&#x2C6;اâ&#x20AC;ŹD E= ReadSectors .â&#x20AC;ŤŘŻâ&#x20AC;ŹF Logical Block  â&#x20AC;Ť عاâ&#x20AC;ŹMicrosoft's Cluster addressing scheme  â&#x20AC;Ť ŘąŮ&#x2C6;اâ&#x20AC;ŹClusterLBA Logical Ř&#x152; LBACHS â&#x20AC;Ť  ŘŻâ&#x20AC;Źmap â&#x20AC;Ť عا اŮ&#x2020; ŘąŮ&#x2C6; ŘŻâ&#x20AC;Ź6 D:â&#x20AC;Ť ا اâ&#x20AC;Ź+:D +, Addressing .8â&#x20AC;Ť> Ů&#x2021;â&#x20AC;Ź6  A BIOS ?0  SectorŘ&#x152;HeadŘ&#x152;Cylinder â&#x20AC;Ť&Řąâ&#x20AC;Ź0  +:D +, â&#x20AC;Ť عاâ&#x20AC;ŹBlock Address .+:D <â&#x20AC;Ť< عا )ŘŻâ&#x20AC;Ź+â&#x20AC;Ť دازâ&#x20AC;Ź- â&#x20AC;Ť Řą Ů&#x2021;â&#x20AC;Ź80â&#x20AC;Ť< اâ&#x20AC;Ź+ Q9F START M# ?0   ?Wâ&#x20AC;Ť اâ&#x20AC;Ź+

â&#x20AC;ŤŘŻ  ŘŻŘąâ&#x20AC;ŹU â&#x20AC;ŤŘŻâ&#x20AC;ŹF = >0 G^ - E=  +, + A   â&#x20AC;Ť ازâ&#x20AC;ŹD 8A â&#x20AC;ŤŘ§â&#x20AC;Ź ":â&#x20AC;Ť ŘŻ Ů&#x2021;â&#x20AC;Ź0â&#x20AC;Ť ا=Ů&#x201E; &اâ&#x20AC;ŹD â&#x20AC;ŤŮ&#x2026;â&#x20AC;ŹIâ&#x20AC;Ť اâ&#x20AC;ŹE= â&#x20AC;ŤŮ&#x2020; داعدâ&#x20AC;ŹDâ&#x20AC;Ť اâ&#x20AC;Ź+â&#x20AC;Ť ŘŻŘą اŮ&#x2C6;Ů&#x201E; Řą Ů&#x2C6;ŘŻ داعâ&#x20AC;ŹCPU â&#x20AC;Ť ŘŻŘąâ&#x20AC;Ź,b â&#x20AC;ŤŘŻŘąŮ&#x2C6;Ů&#x2020;â&#x20AC;Ź ":â&#x20AC;Ť Ů&#x2021;â&#x20AC;ŹOAâ&#x20AC;Ť ŘŻŘą Ů&#x2C6;اâ&#x20AC;Ź+, â&#x20AC;Ť< اâ&#x20AC;Ź+ &: 8C â&#x20AC;Ť ŘŻŘąâ&#x20AC;ŹCPU  ":â&#x20AC;ŤŮ&#x2C6; Ů&#x2021;â&#x20AC;Ź.>â&#x20AC;Ť Ů&#x2021;â&#x20AC;ŹBIOS O â&#x20AC;ŤŮ&#x201E; Řą  اâ&#x20AC;ŹC â&#x20AC;Ť ŘŻŘąâ&#x20AC;Ź â&#x20AC;ŤŘ§  ŘŻ< Ů&#x2C6; ) اâ&#x20AC;Ź+- BPB â&#x20AC;Ť عا ازâ&#x20AC;ŹRoot Directory <" +â&#x20AC;Ť  اâ&#x20AC;Ź+ +, ,b â&#x20AC;Ť ŘŻŘąâ&#x20AC;Ź0â&#x20AC;ŤŘŻ &اâ&#x20AC;ŹU  .+: â&#x20AC;Ť Řąâ&#x20AC;ŹRAM &â&#x20AC;Ť Ů&#x2C6; ) ا  داâ&#x20AC;Ź+: ,0^ â&#x20AC;Ť ŘŻŘą )Ů&#x2020;â&#x20AC;ŹI 8  RAM &â&#x20AC;Ť Ů&#x2C6; Řą  ŘŻŮ&#x2020; )Ů&#x2020;  داâ&#x20AC;ŹFAT â&#x20AC;ŤŘ§  ŘŻŮ&#x2020;â&#x20AC;Ź+- â&#x20AC;Ť اâ&#x20AC;ŹBPB â&#x20AC;ŤŘŻ< ازâ&#x20AC;ŹP0â&#x20AC;Ť ŘŻ" اâ&#x20AC;Ź8A  â&#x20AC;Ť  ŘŻ< Ů&#x2C6;â&#x20AC;ŹI â&#x20AC;Ť عاâ&#x20AC;ŹFAT 6 >0 bootstrap Ř&#x152; loader.bin â&#x20AC;Ť اâ&#x20AC;Źcluster â&#x20AC;ŤŘŻ< از اŮ&#x2C6;â&#x20AC;ŹP0â&#x20AC;Ť اâ&#x20AC;Ź+, â&#x20AC;Ť Ů&#x2C6; ŘŻŘą )& =?ŘŞâ&#x20AC;Ź+: â&#x20AC;Ť Řąâ&#x20AC;Ź46C &â&#x20AC;Ť عا  داâ&#x20AC;Źloader.bin 6 +â&#x20AC;Ť  اâ&#x20AC;Ź+â&#x20AC;ŤŮ&#x2021;â&#x20AC;Ź+ ReadSectors O   â&#x20AC;ŤŘ§ŘąŘšâ&#x20AC;Ź RETF "?= ?0 ,â&#x20AC;ŤŘŻ اâ&#x20AC;ŹF <â&#x20AC;Ť دادâ&#x20AC;Źloader.bin  â&#x20AC;Ť Ů&#x201E;â&#x20AC;Ź: â&#x20AC;ŤŮ&#x2020;â&#x20AC;Ź.+ 6 â&#x20AC;ŤŮ&#x201E;â&#x20AC;Ź0â&#x20AC;Ť اعâ&#x20AC;Źnetspc@gmail.com :â&#x20AC;Ťدات &ŘŻ عا  )دعسâ&#x20AC;ŹUâ&#x20AC;Ťدات Ů&#x2C6; اâ&#x20AC;Ź:F- 80â&#x20AC;Ť اâ&#x20AC;Ź+:Fâ&#x20AC;Ť&اŮ&#x2021;â&#x20AC;Ź ٥٣٨c +:P0â&#x20AC;ŤŘ§â&#x20AC;Ź May 2006 TR@NSL@T!0N BY netspc TH@NX TO _LOVE_CODER_ F0R @DVICE TH@NX TO MASTER F0R SUPP0RT

Operating system  

Operating system Ed

Advertisement