برنامج أقلاع عربي BOOT LOADER + الشفرة المصدرية

الناقل : elmasry | الكاتب الأصلى : neo | المصدر : www.arabteam2000-forum.com

أخيرا كود الأقلاع هاهو جربوة أن ألحقت معه الـnasm الذى يتجم البرنامج برنامج الأقلاع مصمم بالأسيمبلي

[BITS 16]      ; بدء العمل مع البيوس بنظام16 بت

[ORG 0] ; أنزياح البيانات = 0



jmp start      ; القفز لبداية البرنامج



[BITS 16]      ; بدء العمل مع البيوس بنظام16 بت

[ORG 0] ; أنزياح البيانات = 0



jmp start      ; القفز لبداية البرنامج


; -------------------------------------
; البانات المستخدمة فى عملية الأقلاع و بعض الرسائل
; ------------------------------------------------------------------------

        bootdrv         db 0

        bootmsg         db 'Ahmed Essam system ',39,' -> Boot Sector Example',13,10,0



        rebootmsg    db 'Ahmed Essam Boot loader Press to reboot',13,10,0



        processormsg    db 'Ahmed Essam OS Checking for 386+ processor: ',0

        need386         db 'Sorry... 386+ required!',13,10,0

        found386        db 'Found!',13,10,0



        whatever        db 'in the name of ALLAH -> good Bluss us Arab',13,10,0


;*******************************************
; بعض الدوال المستخدمة
;*******************************************

        detect_cpu:

                mov si, processormsg   ; أخبار المستخدم بما نقوم به

                call message



               ; أختبار ما أذا كان المعالج 80386 أما لا

                pushf                  ; حفظ القيمة الأصلية للأعلام

               

                xor ah,ah              ; ah = 0

                push ax                ; نسخ ax فى الأعلام

                popf                   ; مع مسخ 15-12بت

               

                pushf                  ; قراْة الأعلام الخارجة من ax

                pop ax      

                and ah,0f0h            ; أختبار البت 12- 15 م أذا وضعت أم لا

                cmp ah,0f0h

                je no386               ; فى حالة عدم وجدو المعالج 386



               ; أختبار 286

                mov ah,0f0h            ; وضع البت 12-15

                push ax                ;نسخ الـ ax فى الأعلام

                popf

               

                pushf                  ; نسخ العلم فى ax

                pop ax

                and ah,0f0h            ; أختبار ما أذا كانت البت 12-15 تم مسحها

                jz no386               ; فى حالة عدم وجدو المعالج 386

                popf                   ; أرجع القيم الأصلية للأعلام

               

                mov si, found386     ; نقل محتوى المتغير found386 الى si

                call message    ; أظهار ما يوجد فى si

               

                ret                    ; عدم وجود 386

         no386:

                mov si,need386         ; نقل محتوى المتغير need386 الى si

                call message    ; أظهار ما يوجد فى si

                jmp reboot             ; أعادة التشغيل عند الضغط على أى مفتاح

                     
;       الدالة message و التى تظهر أى قيمة موجودة فى si

        message:                       ;

                lodsb                  ; تحميل الحروف الموجودة فى الـsi

                or al,al               ; أختبار ما أذا كان الحرف 0 موجود

                jz done

                mov ah,0eh             ; وضع الحروف

                mov bx,0007            ;

                int 0x10               ; نداء البيوس و مجموعة الدوال الـ21

                jmp message

        done:

                ret
;       أخذ المفتيح

        getkey:

                mov ah, 0              ; الأنتظار حتى الضغط

                int 016h

                ret


;       أعاة التحميل

        reboot:

                mov si, rebootmsg      ; وضع قيمة rebootmsg فى الـsi

                call message  ; عرض ما هو موجود فى الـsi

                call getkey            ; الأنتظار حتى الضغط على أى زر



                db 0EAh                ; أعادة التحميل



                dw 0000h

                dw 0FFFFh

               
; *******************************************
; بداية الكود الأساسى
; *******************************************

start:

        mov ax,0x7c0 ; البيوس فى العنوان 0:07C00h, يجب وضعها فى الـDS

        mov ds,ax      ; نقل مختويات الـax الى الـds

data



        mov [bootdrv], dl;



        cli            ; مسح المقاطع

        mov ax,0x9000  

        mov ss,ax

        mov sp,0xffff  

        sti            ; أعادة المقاطع

               

        mov si,bootmsg ; عرض رسالة الأقلاع

        call message



        call detect_cpu; أختبار المعاج 386



.386 ;أستخدام التعليمات الخاصة بالمعالج 286



        mov si,whatever  

        call message

        call getkey

       

        call reboot



        times 510-($-$$) db 0

        dw 0xAA55



و هذا هو برنامج نسخ برنامج الأقلاع على الـقرص المرن مصمم بالسي وهو بسيط جدا


#include <bios.h>   

#include <stdio.h>

 

void main()

{

        FILE *in; // حجز متغير مؤشر من النوع file

        unsigned char buffer[520]; // حجز متغير buffer

 

        if((in = fopen("bootsect", "rb"))==NULL) //  أختبار ما أذا كان الملف bootsect موجود أم لا و أذا كان موجود يفتحة على الأساس الثنائي

        {

                printf("Error loading filen"); // عرض رسالة خطاء فى حالة عدم القدرة على قراءة الملف أو خطأ فى الفتح



        }

 

        fread(&buffer, 512, 1, in); // وضع مختويات الملف فى العنوان الخاص بالمتغير buffer

 

        while(biosdisk(3, 0, 0, 0, 1, 1, buffer)); // نسخ محتويات العنوان buffer فى القرص المرن على

// المقطع 1

//  القرص 0

// الرأس 0

// و على مساحة 512 حرف فقط

 

        fclose(in); // أغلاق الملف

}



/*

أرجوا فتح الـhelp الخاص بالسي و معرفة أكثر عن الدوال الأتية



abswrite

absread

biosdisk

_biosdisk



 */




أنتظروا قريبا الكثير

لقد أرفقت الكود و برنامج الترجمة و لكن تواخوا الحذر لان برنامج النسخ هذا من الممكن أن يضيع كل البيانات من على القرص الصلب أذا قمتم يتغيير القيم لأنه يقوم بمسح القديم و نسخ الجديد لذا أكرر تواخوا الحذر فى تعديل البرنامج

أخوكم أحمد عصام
 
ملف مرفق(ملفات)
 
ملف مرفق  ahmed_essam_os_with_nasm.zip (0بايتات )