برای مشاهده مفیدترین ارسال در این موضوع اینجا کلیک کنید

نمایش نتایج: از شماره 1 تا 4 از مجموع 4
Like Tree4نفر پسندیدند
  • 3 ارسال توسط Hossein
  • 1 ارسال توسط H_afkhami60

موضوع: پروژه سیستم عامل در اسمبلی با توضیحات خط به خط برای اولین بار

  1. #1
    بنیانگذار
    تاریخ عضویت
    2010 January
    محل سکونت
    زیر سایه خدا
    سن
    37
    ارسال ها
    1,308
    تشکر
    2,923
    تشکر شده 2,205 بار در 886 پست
    نوشته های وبلاگ
    37


    2 امتياز مثبت از 2 راي
    آيا اين پست براي شما سودمند بود؟ بله | خیر

    پروژه سیستم عامل در اسمبلی با توضیحات خط به خط برای اولین بار

    بسم الله الرحمن الرحیم
    سلام
    این هم از سورس کد کامل سیستم عاملی که من سال 88 89 نوشتم .(از زمستان 88 تا تیر 89 که بعنوان پروژه برنامه نویسی سیستم تحویل دادیم) آموزشهای ساخت این سیستم عامل در انجمن هست و براحتی همونطور که خیلی های دیگه ازش یاد گرفتن و سیستم عامل خودشون رو ساختن شما هم میتونید این کارو بکنید .
    من در تاپیک مربوط به سیستم عامل و آموزشهاش نحوه اجرای این سیستم عامل رو گفتم و آموزش دادم. و ایمیج و فایل اجرایی اون رو گذاشتم . (اینجا رو ببینید : آموزش نحوه اجرای سیستم عامل نوشته شده توسط شما )
    سیستم عاملی که اونجا گذاشتم سورسش رو گم کردم ( در اصل چون تعداد زیادی ورژن ساخته بودم الان معلوم نیست کدوم ورژن نهاییه! و من فایل بالا رو از روش ساختم
    )
    تنها سورسی که بنظرم یکمی بروزتر بود رو پیدا کردم و اینجا براتون میزارم . نحوه کامپایل و غیره رو در فایل پیوست گذاشتم . نحوه استفاده و اجرای این سیستم عامل هم تو لینک بالا گفتم-اگه ورژن نهایی نبود این و ورژن جدیدتری رو پیدا کردم اینجا قرار میدم. اما این فایل هم بنظرم کامله و 100 درصد جواب باید بده .

    خب مشخصات این سیستم عامل چیه ؟

    1. این یه سیستم عامل هست که به زبان اسمبلی کاملا نوشته شده هم بوت لودرش و هم خود کرنلش
    2. درایور سیستم فایل براش نوشته شده و کار فایلینگ براحتی درش قابل انجام هست . (عمل جستجوی فایل ایجاد فایل و لود فایل )
    3. بصورت کاملا ماجولار نوشته شده تا برای توسعه بیشتر این سیستم عامل هیچ مشکلی نباشه . ( یعنی الان شما میتونید سورس رو دانلود کنید و توابع مختلف رو بهش اضافه کنید و از امکانات فایلینگش استفاده کنید برای ساخت بخشهای بیشتر این سیستم عامل )
    4. یه ورژن خیلی ساده از کامند پرامت درش قرار داده شده . ( همون اول که سیستم عامل اجرا میشه منتظر دستور ورودی هست - هرچند دستور ورودی ما یه ترکیب کلیدی ساده هست. کاملا مشخصه که میتونید انواع دستورات مختلف رو از این طریق فراهم کنید )
    5. توضیح و کامنت گذاری خط به خط پروژه . ( توضیحات انگلیسی داده شده تا پروژه برای همه افراد قابل استفاده باشه و منم موقع قرار دادن اون تو سایتهای مختلف مثل پلنت سورس کد و... مشکلی نداشته باشم -توضیحات بسیار واضحه و اگه باز به توضیح فارسی بیشتری نیاز دارین آموزش سیستم عامل من رو بخونید چون سورسهای قبلی(که 99درصد همین فایلم تشکیل میدن) همه توضیحات فارسی دارن. )



    امیدوارم برای همه علاقمندان مفید باشه . لطفا از کپی کردن صرف پرهیز کنید سوال کنید و یاد بگیرید . اگر شما هم تو این زمینه چیزی برای عرضه دارید اونو با ما به اشتراک بزارید .

    در پناه حق پیروز و سربلند باشید.


    در فایل پیوست بوت لودر و کرنل و ایمیج فلاپی دیسک و بقیه اطلاعات لازم در داخل فایل readme قرار داده شده . که میتونید استفاده کنید .

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; In the name of God ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Kernel ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SEYYED HOSSEIN HASAN POUR MATIKOLAEE ;;
    ;; MASTER.HURICANE@GMAIL.COM ;;
    ;; HTTP://FORUM.USTMB.IR ;;
    ;;Mazandaran University of Science And Technology;;
    ;; 1388-89 ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Code Segment (core) ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CODE SEGMENT
    ASSUME CS:CODE

    START: JMP BEGIN ;JUMP TO START POINT OF EXECUTABLE CODE
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; MESSAGES ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    NewLine Db 10,13,0


    GOD DB 'IN THE NAME OF GOD',10,13,0
    ME DB 'SEYYED HOSSEIN HASAN POUR',10,13,0
    WELCM DB 'WELCOME TO KERNELX OPERATING SYSTEM',10,13,0
    ENDMSG DB 'WHEN YOU ARE READY TO REBOOT PRESS R',10,13,0


    GETNAMEMSG DB 10,13,'FILE NAME: ',0
    MENUMSG DB 10,13,'______________________________________',10,13
    DB ' N:NEW S:SAVE L:LOAD E:EXIT',10,13
    DB '______________________________________',10,13,0
    FILESAVEMSG DB 'FILE SAVED.',10,13,0
    FILELOADMSG DB 'FILE LOADED.',10,13,0

    NOFREEFATMSG DB 'ERROR: NO FREE FAT ENTRY IS FOUND.',10,13,0
    NOFREEROOTMSG DB 'ERROR: NO FREE ROOT ENTRY IS FOUND.',10,13,0
    NOTHINGFOUND DB 'ERROR: NO FREE FAT ENTRY IS FOUND',10,13,0
    FILENOTFOUND DB 'FILE COULD NOT BE FOUND IN ROOT DIRECTORY',10,13,0
    FILEFOUND DB 10,13,'FILE IS LOADED SUCCESSFULLY ',10,13,0
    WriteFatIntoDisk DB 'Writing Fat Into Disk',10,13,0
    WriteRootIntoDisk DB 'Writing Root Into Disk',10,13,0
    ContinueMess DB 10,13,'Press any Key to Contine...',10,13,0
    NOFREEROOTENTRYFOUNDMSG DB 'ERROR: NO FREE DIRECTORY ENTRY FOUND',10,13,0

    MNMSG DB '<MENU ACTIVATED> ',10,13,0
    NOMENUMODE DB ' ',10,13,0
    LDMSG DB '<LOAD ACTIVATED> ',10,13,0
    SaveOperationMess DB '<Save Operation Is Done> ',10,13,0
    EXMSG DB '<EXIT ACTIVATED> ',10,13,0
    WRMSG DB '<WRITING ACTIVATED>',10,13,0


    STARTCLUSTER DW 10
    FREEFATENTRY1 DW 0000
    FREEROOTENTRY DW 0000
    FTBUFFERADDRESS DW 0 ;04000H ;~ 8400H
    RTBUFFERADDRESS DW 0 ;04000H ;~ 8400H
    KRBUFFERADDRESS DW 0
    DATASECTOR DW 33
    ABSOLUTESECTOR DB 0
    ABSOLUTEHEAD DB 0
    ABSOLUTETRACK DB 0
    BPBROOTENTRIES DW 224
    CLUSTER DW 0000H


    ;-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0
    BPBBYTESPERSECTOR DW 512
    BPBSECTORSPERCLUSTER DB 1
    BPBRESERVEDSECTORS DW 1
    BPBNUMBEROFFATS DB 2
    BPBTOTALSECTORS DW 2880
    BPBMEDIA DB 0F0H ;FA:IT IS A RAMDISK

    BPBSECTORSPERFAT DW 9
    BPBSECTORSPERTRACK DW 18
    BPBHEADSPERCYLINDER DW 2
    BPBHIDDENSECTORS DD 0
    BPBTOTALSECTORSBIG DD 0
    BSDRIVENUMBER DB 0H ;0 ;HARDDISK
    BSUNUSED DB 0

    ;-0-0-0-0-0-0-0-0-0-0-00-0--0-0-0-0-0-0-0-0-0--0-0-0-0-0-0-0-0-0-0-
    ;--------------------------------------
    TEXT DB 512 DUP(0),10,13,0
    STRLENGTH DW 512
    FILENAME DB 8 DUP('s'),'SOS',0 ;'12345678TXT',0
    Odd_Even_Fat DB 0

    OutPut_Bffer DB 512 Dup(?),10,13,0
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FUNCTIONS ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LBACHS:
    Push DX
    Push SI
    Push AX
    XOR DX, DX ; PREPARE DX:AX FOR OPERATION
    LEA SI, BPBSECTORSPERTRACK
    DIV WORD PTR[SI] ; CALCULATE
    INC DL ; ADJUST FOR SECTOR 0
    LEA SI, ABSOLUTESECTOR
    MOV BYTE PTR[SI], DL
    XOR DX, DX ; PREPARE DX:AX FOR OPERATION
    LEA SI, BPBHEADSPERCYLINDER
    DIV WORD PTR[SI] ; CALCULATE
    LEA SI, ABSOLUTEHEAD
    MOV BYTE PTR[SI], DL
    LEA SI, ABSOLUTETRACK
    MOV BYTE PTR[SI], AL
    Pop AX
    Pop SI
    Pop DX
    RET

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; CONVERT CLUSTER TO LBA ;;
    ;;LBA=(CLUSTER-2)*SECTORS PER CLUSTER ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CLUSTERLBA:
    SUB AX, 0002H ; ZERO BASE CLUSTER NUMBER
    MOV CX, 00001H ;[BPBSECTORSPERCLUSTER]
    MUL CX
    LEA SI, DATASECTOR ; BASE DATA SECTOR
    ADD AX, WORD PTR[SI] ; BASE DATA SECTOR
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; GOTOXY ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    GOTOXY:
    push AX
    push BX
    MOV AH,2
    MOV BH,0
    INT 10H
    pop bx
    pop ax
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; GOTOXYAfterMenu ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    GOTOXYAfterMenu:
    push AX
    push BX
    Push DX
    Mov DH,2
    Mov DL,6
    MOV AH,2
    MOV BH,0
    INT 10H
    Pop DX
    pop bx
    pop ax
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PUSHREGS ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PUSHREGS:
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; POPREGS ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    POPREGS:
    POP DX
    POP CX
    POP BX
    POP AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FIX ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    _FIX:
    ;MOV CX,07C00H
    ;MOV ES,CX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; GetCh ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    GetCh:
    push AX
    mov ah, 00H
    int 16H ; await keypress
    Pop AX
    ;cmp AL, 'r'
    ;jne GetCh
    Ret
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; CLEARSCREEN ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CLEARSCREEN:
    Push AX
    Push BX
    Push CX
    Push DX
    MOV AX, 0600H
    MOV BH, 07H
    MOV CX, 0000H
    MOV DX, 204FH
    INT 10H
    Pop AX
    Pop BX
    Pop CX
    Pop DX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; DELAY ;;@@
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    DELAY:
    CALL PUSHREGS

    MOV CX, 50
    L1: MOV DX, 10
    L2: DEC DX
    JNZ L2
    LOOP L1

    CALL POPREGS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PUTC ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PUTC:
    push AX
    Push BX
    MOV AH, 0EH
    MOV BL, 07H
    MOV BH, 00H
    INT 10H
    Pop BX
    Pop AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PUTS ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;LEA SI, YOURTEXT
    PUTS:
    push AX
    Push BX
    PutL: LODSB
    OR AL, AL
    JZ EXIT
    CALL PUTC
    JMP PutL
    EXIT:
    Pop BX
    Pop AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; GETNAME ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    GETNAME:
    Push SI
    Push DX
    Push AX
    ;CALL PRINT_MENU
    LEA SI, GETNAMEMSG
    CALL PUTS
    MOV DX,8
    LEA DI, FILENAME
    RD: MOV AH,00
    INT 16H
    CALL PUTC
    MOV BYTE PTR[DI],AL
    INC DI
    DEC DX
    CMP DX,0
    JNZ RD
    Pop AX
    Pop DX
    Pop SI
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; GETINPUT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    GETINPUT:
    ; MOV DH,6
    ; MOV DL,54
    ; CALL GOTOXY
    READAGAIN:
    MOV AH, 0 ;READ KEY OPCODE
    INT 16H
    CALL PUTC
    CMP AL, 0 ;SPECIAL FUNCTION?
    JZ READAGAIN ;IF SO, DON'T ECHO THIS KEYSTROKE
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT DIGIT ;;
    ;; AX = DIGIT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;========================================
    ;; THIS STRING TERMINATED BY 0 ;;
    ;========================================
    PRINTNUMBER:
    PUSH BX
    PUSH CX
    PUSH AX ; DIVIDEND
    PUSH DX
    Push SI
    MOV BX, 10 ; DIVISOR
    MOV CX, 0
    I2A:
    MOV DX, 0 ; DON'T NEED DX (IN THIS CASE)
    DIV BX ; DX:AX PAIR IS IMPLIED SOURCE/DESTINATION
    MOV DH, 0
    PUSH DX
    INC CX
    OR AX, 0 ; OR INSTRUCTION MODIFIES FLAGS (LOOKING FOR
    ;AX=0, NOTHING MORE TO DIVIDE)
    JNZ I2A ; JUMP IF NOT ZERO FLAG ENABLED
    PL1:
    POP AX
    OR AL, 30H
    MOV AH, 0EH
    INT 10H
    LOOP PL1

    Pop SI
    POP DX
    POP AX
    POP CX
    POP BX
    RET ; WE ARE DONE, SO RETURN
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; READTEXT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    READTEXT:
    XOR DI,DI
    MOV CX , 512
    LEA SI,TEXT
    READLOOP:
    MOV AH, 0 ;READ KEY OPCODE
    INT 16H
    CMP AL, 0 ;SPECIAL FUNCTION?
    JZ READLOOP ;IF SO, DON'T ECHO THIS KEYSTROKE
    CALL PUTC ;OTHERWISE PRINT IT ON SCREEN AND SAVE IT
    MOV BYTE PTR [SI], AL ; SAVE IT INTO TEXT
    INC SI
    INC DI
    CMP CX,0
    JE GETOUT
    DEC CX
    CMP AL, 0DH ;CARRIAGE RETURN (ENTER)?
    JNE READLOOP
    GETOUT:
    LEA SI,STRLENGTH
    MOV WORD PTR[SI],DI
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT ON SCREEN ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    View:
    push SI
    Push DI
    Push CX
    LEA SI,TEXT
    LEA DI,STRLENGTH
    MOV CX,WORD PTR [DI]
    NEXTO :
    LODSB ; COPIES [SI] TO AL , AND THEN INCREMENET SI BY ONE
    CALL PUTC
    LOOP NEXTO
    Pop CX
    Pop DI
    Pop SI
    RET

    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT GOD TEXT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_GOD:
    MOV DH,2 ;SATR
    MOV DL,30 ;SOTON
    CALL GOTOXY
    LEA SI, GOD
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT WELCOME TEXT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_WELCOME:
    MOV DH,3
    MOV DL,22
    CALL GOTOXY
    LEA SI, WELCM
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT MY NAME ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_ME:
    MOV DH,4
    MOV DL,26
    CALL GOTOXY
    LEA SI, ME
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT MENU ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_MENU:

    LEA SI, MENUMSG
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT FILE NAME ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRFNAME:
    LEA SI, FILENAME
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; MENU ACTIVATED TEXT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_MNAC:
    MOV DH,5
    MOV DL,54
    CALL GOTOXY
    LEA SI,MNMSG
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; MENU DEACTIAVTED ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINT_MNDAC:
    MOV DH,5
    MOV DL,54
    CALL GOTOXY
    LEA SI, NOMENUMODE
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE DONE MESSAGE ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    SAVE_DONE:
    MOV DH,5
    MOV DL,54
    CALL GOTOXY
    LEA SI, SaveOperationMess
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; LOAD ACTIAVTED ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LDAC:
    LEA SI, LDMSG
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; WRITE ACTIVATED ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    WRAC:
    LEA SI, WRMSG
    CALL PUTS
    RET
    ;=========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; EXIT ACTIVATED ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    EXITACTIVATED:
    MOV DH,5
    MOV DL,54
    CALL GOTOXY
    LEA SI, EXMSG
    CALL PUTS
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; PRINT INITI TEXT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PRINTINT:
    CALL PRINT_GOD
    CALL PRINT_WELCOME
    CALL PRINT_ME
    CALL PRINT_MENU
    RET
    ;=========================================

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FAT12 DRIVER ;;
    ;; ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;=========================================

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; READ SECTOR() ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; READS A SERIES OF SECTORS ;;
    ;; CX=>NUMBER OF SECTORS TO READ ;;
    ;; AX=>STARTING SECTOR ;;
    ;; ES:BX=>BUFFER TO READ TO ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    W DB 'ERROR CANT READ',10,13,0

    READSECTORS:
    MOV DI, 0005H ; FIVE RETRIES FOR ERROR
    SECTORLOOP:
    PUSH AX
    PUSH BX
    PUSH CX
    CALL LBACHS ; CONVERT STARTING SECTOR TO CHS
    MOV AX, 0201H ; BIOS READ SECTOR (AH=02H) READ ONE SECTOR (AL=01H)
    LEA SI, ABSOLUTETRACK
    MOV CH, BYTE PTR[SI] ; TRACK
    LEA SI, ABSOLUTESECTOR
    MOV CL, BYTE PTR[SI] ; SECTOR
    LEA SI, ABSOLUTEHEAD
    MOV DH, BYTE PTR[SI] ; HEAD
    LEA SI, BSDRIVENUMBER
    MOV DL, BYTE PTR[SI] ; DRIVE
    INT 13H ; INVOKE BIOS
    JNC SUCCESS ; TEST FOR READ ERROR
    XOR AX, AX ; BIOS RESET DISK
    INT 13H ; INVOKE BIOS
    DEC DI ; DECREMENT ERROR COUNTER
    POP CX
    POP BX
    POP AX
    JNZ SECTORLOOP ; ATTEMPT TO READ AGAIN

    LEA SI, W ; PRINT ERROR AND EXIT
    CALL PUTS
    JMP READ_ENDED

    SUCCESS:
    POP CX
    POP BX
    POP AX
    LEA SI, BPBBYTESPERSECTOR
    ADD BX, WORD PTR[SI] ; QUEUE NEXT BUFFER
    INC AX ; QUEUE NEXT SECTOR
    LOOP READSECTORS ; READ NEXT SECTOR
    READ_ENDED:

    RET

    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; LOAD ROOT DIRECTORY INTO RAM ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    RootLD DB 10,13,'ROOT LOADED...',10,13,0
    RootOffet DB 'Offset(Dec)= ',0
    RootSegment DB 10,13,'Segment(Dec)= ',0

    LDROOT:
    push AX
    push BX
    push CX
    push DX
    push SI
    mov AX, 2000H
    mov ES, AX
    MOV CX,14
    MOV AX,19
    LEA SI, RTBUFFERADDRESS
    MOV BX, WORD PTR[SI]
    CALL READSECTORS


    Lea SI, RootLD
    Call Puts
    Lea SI, RootOffet
    Call Puts
    LEA SI, RTBUFFERADDRESS
    Mov AX, WORD PTR[SI]
    Call PrintNumber
    Lea Si, RootSegment
    Call Puts
    Push ES
    Pop AX
    Call PrintNumber
    Lea Si, NewLine
    Call Puts

    pop SI
    pop DX
    pop CX
    pop BX
    pop AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SEARCH IN ROOT DIRECTORY ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    FreeRdMess DB 'Free RootDir/Start Cluster Number= ',0
    RTSCR:
    push SI
    push CX
    push DX
    push DI
    Push AX
    CALL _FIX
    LEA SI, BPBROOTENTRIES ;224
    MOV CX, WORD PTR[SI] ; LOAD LOOP COUNTER >>CX = 224
    LEA SI,RTBUFFERADDRESS
    MOV DX, WORD PTR[SI]
    MOV DI, DX ; LOCATE FIRST ROOT ENTRY(7C00:0200)
    _LOOPR:
    push ds
    push es
    pop ds
    MOV AL, BYTE PTR[DI] ; TEST FOR ENTRY MATCH
    pop ds
    CMP AL, 0;0E5H ;COMPARE [ DI ] WITH E5H TO SEE IF ITS AVAILABE
    JE FOUNDFREE ;
    CMP AL, 0E5H
    JE FOUNDFREE
    ADD DI, 0020H ; QUEUE NEXT DIRECTORY ENTRY(ADD DI + 32)
    LOOP _LOOPR
    MOV SI, OFFSET NOFREEROOTENTRYFOUNDMSG ;IF NO FREE ENRTY IS FOUND PRINT ERROR MESSAGE AND EXIT
    CALL PUTS
    JMP ENDOK

    FOUNDFREE:
    MOV SI, OFFSET FREEROOTENTRY
    MOV WORD PTR[SI], DI
    LEA SI,FreeRdMess
    CALL PUTS
    MOv AX, DI
    Call PrintNumber
    Lea SI,NewLine
    Call Puts
    ENDOK:
    pop AX
    pop DI
    pop DX
    pop CX
    pop SI

    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE NAME IN ROOT DIRECTORY ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    SaveName DB 'FILE NAME IS SAVED IN ROOT',10,13,0

    SAVE_NAME_INROOT:
    push AX
    push CX
    push SI
    push DI
    push DX

    LEA SI, FREEROOTENTRY
    MOV CX, WORD PTR[SI] ; THE BEGINNING OF ROOT ENTRY
    CLD ; INCREMENT SI AND DI IN EACH ITERATION
    MOV DI, CX ; COPY THE FREE ROOT ENTRY ADDRESS INTO DI
    MOV CX, 000BH ; ELEVEN CHARACTER NAME
    LEA SI, FILENAME ; FILENAME TO SAVE IN ROOT ENTRY
    ; 'REP MOVSB' COPIES CHARACTERS FROM DS:SI TO ES:DI.
    REP MOVSB ; COPY FILENAME INTO ROOT ENRTY
    ; THE ABOVE STATEMENT REPEATES WITH REGARDS TO THE VALUE STORED IN CX
    ;--------- Copy Kernel for this file
    LEA SI, FREEROOTENTRY
    MOV CX, WORD PTR[SI]
    Mov DX, CX
    Mov BX, 11
    Add CX, 11
    Mov SI, CX
    Mov CX, 15
    Push DS
    Push ES
    Pop DS
    Att:Mov AL, Byte Ptr ES:[BX]
    Mov Byte Ptr ES:[SI], AL
    Inc BX
    Inc SI
    Loop Att
    MOV CX, DX
    Add CX, 29
    Mov BX, CX
    Mov Byte Ptr ES:[BX], 1 ;Set Size of File
    Pop DS
    LEA SI, SaveName
    CALL PUTS
    Pop DX
    Pop DI
    Pop SI
    Pop CX
    Pop AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE START CLUSTER IN ROOT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    SaveStartClusterMess DB 'START CLUSTER IS SAVED IN ROOT',10,13,0

    SAVE_STARTCLUSTER_INROOT:
    push CX
    Push SI
    Push DI
    Push DX
    LEA SI, FREEFATENTRY1
    MOV CX, WORD PTR[SI] ; CX = FREE CLUSTER
    LEA SI, FREEROOTENTRY
    Mov DI, WORD PTR[SI] ;FREEROOTENTRY ; THE BEGINNING OF FREE ROOT ENTRY
    Push DS
    Push ES
    Pop DS
    MOV WORD PTR[DI + 001AH], CX ; COPY THE CLUSTER IN THE 'START CLUSTER' FIELD IN ROOT ENTRY
    Pop DS

    Lea SI, SaveStartClusterMess
    Call Puts

    ; Lea SI, AfterPutNo
    ; Call Puts
    ; LEA SI, FREEROOTENTRY
    ; MOV BX, WORD PTR[SI]
    ; mov cx, 32
    ; LLL00:
    ; Push DS
    ; Push ES
    ; Pop DS
    ; Mov AL, Byte Ptr [BX]
    ; Pop DS
    ; MOv AH, 0
    ; Call PrintNumber
    ; Call GetCh
    ; Inc BX
    ; Loop LLL00
    Pop DX
    Pop DI
    Pop SI
    Pop CX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE STUFF TO ROOT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;SAVED NAME AND START CLUSTER IN ROOT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    SAVE_IN_ROOT:
    CALL SAVE_STARTCLUSTER_INROOT
    CALL SAVE_NAME_INROOT
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; LOAD FAT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    FatLoadMess DB 10,13,'FAT LOADED... ',10,13,0
    FatOffset DB 'Offset(Dec)= ',0
    FatSegment DB 10,13,'Segment(Dec)= ',0

    LDFAT:
    Push AX
    Push CX
    Push BX
    Push DX
    Push SI
    Mov AX, 2000H
    Mov ES, AX
    MOV CX,9
    MOV AX,1
    LEA SI,FTBUFFERADDRESS
    MOV BX, WORD PTR[SI]
    CALL READSECTORS

    ;CALL GOTOXYAfterMenu
    Lea SI, FatLoadMess
    Call Puts
    Lea SI, FatOffset
    Call Puts
    LEA SI,FTBUFFERADDRESS
    MOV BX, WORD PTR[SI]
    Mov AX, BX
    Call PrintNumber

    Lea SI, FatSegment
    Call Puts
    Push ES
    Pop AX
    Call PrintNumber

    Lea SI, NewLine
    Call Puts

    Pop SI
    Pop DX
    Pop BX
    Pop CX
    Pop AX
    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FIND FREE CLUSTE IN FAT ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    FreeFatMess DB ' Free Cluster In FAT Is Found',0AH,0DH,0
    FreeFatNo DB ' Free Cluster In FAT = ',0

    FINDFREEFAT:
    Push CX
    MOV CX,0FEDH ;NUMBER OF CLUSTERS TO SEARCH
    PUSH CX
    Mov AX, 2000H
    Mov ES, AX
    READNEXT:
    LEA SI, STARTCLUSTER
    MOV AX, WORD PTR[SI] ; IDENTIFY CURRENT CLUSTER
    MOV CX, AX ; COPY CURRENT CLUSTER
    MOV DX, AX ; COPY CURRENT CLUSTER
    SHR DX, 0001H ; DIVIDE BY TWO
    ADD CX, DX ; SUM FOR (3/2)
    LEA DI, FTBUFFERADDRESS
    MOV BX, WORD PTR[DI] ; LOCATION OF FAT IN MEMORY
    ADD BX, CX ; INDEX INTO FAT *
    Push DS
    Push ES
    Pop DS
    MOV DX, WORD PTR[BX] ; READ TWO BYTES FROM FAT
    Pop DS
    ;-------------------
    TEST AX, 0001H
    jz EVEN_CLUSTER
    ODD_CLUSTER:
    Lea SI, Odd_Even_Fat
    Mov Byte Ptr[SI],1
    mov CL, 4
    shr dx, CL ; take high twelve bits
    jmp _DONE
    EVEN_CLUSTER:
    Lea SI, Odd_Even_Fat
    Mov Byte Ptr[SI],0
    and dx, 0000111111111111b ; take low twelve bits
    _DONE:
    CMP DX, 0000H ;TEST FOR BEIGN FREE
    JNE NEXTONE ;IF NOT GO CHECK THE NEXT ONE
    LEA SI, STARTCLUSTER ;THIS MEANS THE CURRENT CLUSTER WAS FREE
    MOV DX,WORD PTR[SI] ; SO GET ITS NUMBER
    LEA SI, FREEFATENTRY1 ; AND SAVE IT IN ANOTHER VARIABLE
    MOV WORD PTR[SI], DX ;COPY OUR FREE CLUSTER NUMBER IN VARIABLE
    Mov AX, DX
    JMP FINISH
    NEXTONE:
    LEA SI, STARTCLUSTER
    MOV AX, WORD PTR[SI]
    INC AX
    MOV WORD PTR [SI], AX
    POP CX ;RESTORE HOW MANY CLUSTERS REMAINED TO SEARCH
    DEC CX
    push cx ;DECREASE IT BY ONE
    CMP CX,0 ;FINISHED ALREADY?
    JE NOTFOUND ;NO MORE SEARCHING , PRINT ERROR AND EXIT
    JMP READNEXT ;IF NOT GO READ ONE MORE .
    NOTFOUND:
    pop cx
    LEA SI, NOTHINGFOUND
    CALL PUTS
    LEA SI, FREEFATENTRY1
    MOV WORD PTR[SI], 0
    Pop CX
    RET
    FINISH:
    pop cx
    Lea SI, Odd_Even_Fat ; IF cluster No is Odd THEN we must save Right Shift of Cluster No
    Mov AL, Byte Ptr[SI] ; Else if cluster No is Odd we must save Left Shift of Cluster No
    Mov AH,0
    Push DS
    Push ES
    Pop DS
    Cmp AX, 0
    Je _Even
    MOV Byte PTR[BX+1], 0FFH
    Mov CL, Byte Ptr[BX]
    OR CL,0F0H
    Mov Byte PTR[BX], CL
    Jmp __Done
    _Even: MOV WORD PTR[BX], 0FFFH ; BECAUSE OURFILE IS ONLY ONE CLUSTER, THEN WE SPECIFY END OF FILE HERE
    __Done: Pop DS
    ;--------------------------
    Lea SI, FreeFatMess
    Call Puts
    Lea SI, FreeFatNo
    Call Puts
    LEA SI, FREEFATENTRY1
    Mov AX, WORD PTR[SI]
    Call PrintNumber
    Lea Si, NewLine
    Call Puts

    Pop CX

    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FIND AND LOAD FILE ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LoadFileMess DB 10,13,'File Loading... ',10,13,0
    FileStartCluster DB 'Start Cluster of File= ',0
    LoddFileFatOffset DB 'Load Offset(Dec)= ',0
    LoddFileFatSegment DB 10,13,'Load Segment(Dec)= ',0


    FINDNLOAD:
    Lea SI,LoadFileMess
    Call Puts
    ; CALL _FIX ; LEA SI, BPBROOTENTRIES
    MOV CX, 224 ; WORD PTR[SI]; LOAD LOOP COUNTER
    LEA SI,RTBUFFERADDRESS ; LOCATE FIRST ROOT ENTRY(X:0200)
    MOV DX, WORD PTR[SI]
    MOV DI, DX
    _LOOP:
    PUSH CX
    PUSH DI
    MOV CX, 000BH ; ELEVEN CHARACTER NAME
    LEA SI, FILENAME ; FILENAME TO FIND
    CLD
    REP CMPSB ; TEST FOR ENTRY MATCH
    POP DI
    POP CX ;COMPARE ES:DI AND DS:SI FOR CX CHARACTER(BYRE)
    JE LOAD_FAT
    ADD DI, 0020H ; QUEUE NEXT DIRECTORY ENTRY
    LOOP _LOOP
    JMP DIDNTFIND
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;LOAD FAT;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LOAD_FAT:
    Mov AX, 2000H
    Mov ES, AX
    MOV DX, WORD PTR ES:[DI + 001AH] ; DX= STARTING CLUSTER OF FILE(BYTE 26 AND 27)
    LEA SI, CLUSTER
    MOV WORD PTR[SI], DX ; FILE'S FIRST CLUSTER
    LEA DI , FTBUFFERADDRESS
    MOV BX, WORD PTR[DI] ; READ FAT INTO MEMORY (X:C200)
    MOV CX, 9
    MOV AX,1
    CALL READSECTORS
    Lea SI,LoddFileFatOffset
    Call Puts
    LEA DI , FTBUFFERADDRESS
    MOV AX, WORD PTR[DI]
    Call PrintNumber
    Lea SI,LoddFileFatSegment
    Call Puts
    MOV AX, ES
    Call PrintNumber
    Lea SI, NewLine
    Call Puts
    Lea SI,FileStartCluster
    Call Puts
    LEA SI, CLUSTER
    MOV AX, WORD PTR[SI]
    Call PrintNumber
    Lea SI, NewLine
    Call Puts
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;READ FILE INTO MEMORY(X:OFFSET FILE)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Lea BX, OutPut_Bffer ;DESTINATION FOR FILE
    PUSH BX
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; LOAD FILE INTO RAM ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LOAD_IMAGE:
    LEA SI, CLUSTER
    MOV AX, WORD PTR[SI] ; CLUSTER TO READ
    POP BX ; BUFFER TO READ INTO
    CALL CLUSTERLBA ; CONVERT CLUSTER TO LBA: GET SECTOR NUMBER
    MOV CX, 1 ;[BPBSECTORSPERCLUSTER=1]: SECTORS TO BE READ
    Push ES
    Push DS
    Pop ES
    CALL READSECTORS
    Pop ES
    ;PUSH BX
    ;JMP ENDK
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; COMPUTE NEXT CLUSTER ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LEA SI, CLUSTER
    MOV AX, WORD PTR[SI] ; IDENTIFY CURRENT CLUSTER
    MOV CX, AX ; COPY CURRENT CLUSTER
    MOV DX, AX ; COPY CURRENT CLUSTER
    SHR DX, 0001H ; DIVIDE BY TWO
    ADD CX, DX ; SUM FOR (3/2)
    LEA DI, FTBUFFERADDRESS ; LOCATION OF FAT IN MEMORY
    MOV BX, WORD PTR[DI]
    ADD BX, CX ; INDEX INTO FAT
    MOV DX, WORD PTR ES:[BX] ; READ TWO BYTES FROM FAT
    TEST AX, 0001H
    JNZ _ODD_CLUSTER
    _EVEN_CLUSTER:
    AND DX, 0000111111111111B ; TAKE LOW TWELVE BITS
    JMP _DONE_
    _ODD_CLUSTER:
    MOV CL, 4
    SHR DX, CL ; TAKE HIGH TWELVE BITS
    _DONE_:
    LEA SI, CLUSTER
    MOV WORD PTR[SI], DX ; STORE NEW CLUSTER
    CMP DX, 0FF0H ; TEST FOR END OF FILE
    JB LOAD_IMAGE
    MOV SI, OFFSET FILEFOUND
    CALL PUTS
    JMP ENDK
    DIDNTFIND:
    MOV SI, OFFSET FILENOTFOUND
    CALL PUTS
    ENDK:
    Lea SI, OutPut_Bffer
    Call Puts
    Lea SI, ContinueMess
    Call Puts
    Call GetCh
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE FILE ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;=====================================;;
    ;; FOR TEXT FILE ONLY ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;====================================================================================
    ;MOV CX, 1 ; NUMBER OF SECTORS IN TOTAL TO BE WRITTEN TO THE HARD DISK =
    ;MOV BX,OFFSET TEXT ; WRITE THESE BYTES TO DISK =
    ;LEA SI,FREEFATENTRY1 ; COPY THIS CLUSTER INTO AX , FOR BEING CONVERTED TO LBA =
    ;MOV AX,WORD PTR[SI] =
    ;CALL CLUSTERLBA ; CONVERT THIS CLUSTER TO LBA ( STORES THE RESULT IN AX ) =
    ;====================================================================================

    WRITE_DONEMSG DB 'WRITTING WAS SUCCESSFUL',10,13,0
    CANT_WRITEMSG DB 'ERROR: WRITTING FAILED',0

    SAVEFILE:

    ;mov ax,50
    mov cx ,1
    mov bx, offset text
    push ds
    pop es
    WRITENEXT:
    MOV DI, 0005H ; FIVE RETRIES FOR ERROR
    WRITELOOP:
    ; CALL PUSHREGS
    PUSH AX
    PUSH BX
    PUSH CX
    CALL LBACHS ; CONVERT LBA TO CHS
    MOV AX, 0301H ; BIOS WRITE SECTOR (AH=03H) WRITE ONE SECTOR (AL=01H)
    LEA SI, ABSOLUTETRACK
    MOV CH, BYTE PTR[SI] ; TRACK
    LEA SI, ABSOLUTESECTOR
    MOV CL, BYTE PTR[SI] ; SECTOR
    LEA SI, ABSOLUTEHEAD
    MOV DH, BYTE PTR[SI] ; HEAD
    LEA SI, BSDRIVENUMBER
    MOV DL, Byte PTR[SI] ; HARD DRIVE
    INT 13H ; INVOKE BIOS
    JNC WRITE_DONE ; TEST FOR WRITE ERROR

    XOR AX, AX ; BIOS RESET DISK
    INT 13H ; INVOKE BIOS

    ;CALL RESET_HARD ; RESETS HARD DRIVE DRIVER
    ; CALL POPREGS
    POP CX
    POP BX
    POP AX
    DEC DI ; DECREMENT ERROR COUNTER
    JNZ WRITELOOP ; ATTEMPT TO WRITE AGAIN

    LEA SI, CANT_WRITEMSG ; PRINT ERROR AND EXIT
    CALL PUTS
    JMP WRITE_ENDED

    WRITE_DONE:
    LEA SI, WRITE_DONEMSG
    CALL PUTS
    POP CX
    POP BX
    POP AX ; CHECK TO SEE IF WE WROTE ALL NEEDED SECTORS
    ; CALL POPREGS ; THIS LINE MAKES IT CLEAR THAT , WE WRITE ANOTHER SECTOR
    ; OR NO, WE ARE DONE HERE, THE NUMBER OF SECTORS TO WRIE
    ; IS LOCATED IN CX.
    LEA SI, BPBBYTESPERSECTOR
    ADD BX, WORD PTR[SI] ; QUEUE NEXT BUFFER
    INC AX ; QUEUE NEXT SECTOR
    LOOP WRITENEXT ; IF WE HAVE MORE SECTORS TO WRITE, GO WRITE THE NEXT ONE

    WRITE_ENDED:

    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; RESET HARD DISK DRIVER ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    RESET_HARD:

    ; CALL PUSHREGS
    push CX
    Push AX

    MOV CX,5

    RESETHHD:
    CMP CX,0
    JE EXT
    MOV AH,00H ; RESET FUNCTION
    MOV AL,00H ; HARD DISK TO BE RESET
    INT 13H ; RESET
    DEC CX
    JC RESETHHD ; IF ANYTHING WENT WRONG TRY AGAIN

    EXT:
    pop ax
    pop cx
    ; CALL POPREGS
    RET
    ;========================================

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; SAVE FAT OR ROOT DIRECTORY ON DISK ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; BEFORE CALLING THIS FUNCTION ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; FOR FAT ONLY ;;
    ;; MOV CX, 18 ;;
    ;; MOV AX,1 ;;
    ;; MOV BX,[FTBUFFERADDRESS] ;;
    ;=======================================
    ;; FOR ROOT ONLY ;;
    ;; MOV CX,14 ;;
    ;; MOV AX,19 ;;
    ;; MOV BX,[RTBUFFERADDRESS] ;;
    ;=======================================
    ;TEXT DB 512 DUP(0),0
    ;ABSOLUTETRACK
    ;ABSOLUTESECTOR
    ;ABSOLUTEHEAD

    DUMP_DONEMSG DB 'DUMPP_SUCCESSFUL ',10,13,0
    CANT_DUMPMSG DB 'ERROR: DUMPP_FAILED',10,13,0
    Dup_ Db '.',0
    Dup__ Db '-',0
    DUMPONDISK:
    DUMPNEXT:
    MOV DI, 0005H ; FIVE RETRIES FOR ERROR
    DUMPLOOP:
    lea si, Dup_
    Call PutS
    PUSH AX
    PUSH BX
    PUSH CX

    ; push AX
    ; push CX
    ; Mov DI, 0
    ; Mov CX, 20
    ; lll:
    ; Mov AL, ES:[BX+DI]
    ; Mov AH, 0
    ; Call PrintNumber
    ; lea SI, Dup__
    ; Call Puts
    ; Inc DI
    ; Call GetCh
    ; Loop lll
    ; Pop CX
    ; Pop AX


    CALL LBACHS ; CONVERT LBA TO CHS
    MOV AX, 0301H ; BIOS WRITE SECTOR (AH=03H) WRITE ONE SECTOR (AL=01H)
    LEA SI, ABSOLUTETRACK
    MOV CH, BYTE PTR[SI] ; TRACK
    LEA SI, ABSOLUTESECTOR
    MOV CL, BYTE PTR[SI] ; SECTOR
    LEA SI, ABSOLUTEHEAD
    MOV DH, BYTE PTR[SI] ; HEAD
    LEA SI, BSDRIVENUMBER
    MOV DL, Byte PTR[SI] ; HARD DRIVE
    INT 13H ; INVOKE BIOS
    JNC DUMP_DONE ; TEST FOR WRITE ERROR
    XOR AX, AX ; BIOS RESET DISK
    INT 13H ; INVOKE BIOS
    ; CALL RESET_HARD ; RESETS HARD DRIVE DRIVER
    ; DECREMENT ERROR COUNTER
    POP CX
    POP BX
    POP AX
    DEC DI
    JNZ DUMPLOOP ; ATTEMPT TO WRITE AGAIN
    LEA SI, CANT_DUMPMSG ; PRINT ERROR AND EXIT
    CALL PUTS
    JMP DUMP_ENDED
    DUMP_DONE:
    ;CHECK TO SEE IF WE WROTE ALL NEEDED SECTORS
    ;CALL POPREGS ;THIS LINE MAKES IT CLEAR THAT , WE WRITE ANOTHER SECTOR
    ;OR NO, WE ARE DONE HERE, THE NUMBER OF SECTORS TO WRIE
    POP CX
    POP BX
    POP AX ;IS LOCATED IN CX.
    LEA SI, BPBBYTESPERSECTOR
    ADD BX, WORD PTR[SI] ; QUEUE NEXT BUFFER
    INC AX ; QUEUE NEXT SECTOR
    LOOP DUMPNEXT ; GO DUMP THE NEXT SECTOR ON HARD
    LEA SI, DUMP_DONEMSG
    CALL PUTS
    DUMP_ENDED:

    ;mov ax,1
    ;mov cx,1

    ;Push ES
    ;Push DS
    ;Pop ES
    ;lea bx,text
    ;call READSECTORS
    ;CALL View
    ;Pop ES
    ;Call GetCh


    RET
    ;========================================
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; TRACKER ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    X DB 'REACHED HERE ',10,13,0
    _X:
    MOV DH,15
    MOV DL,15
    CALL GOTOXY
    LEA SI, X
    CALL PUTS
    CALL GETCH
    RET
    got:
    push DX
    mov dh,18
    mov dl,25
    call gotoxy
    pop dx
    ret
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; MAIN FUNCTION ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;=======================================;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; BEGIN ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    BEGIN:
    CLI
    Pop AX
    Mov AH, 0
    Lea SI, BSDRIVENUMBER
    Mov Byte PTR[SI], AL
    MOV AX, 01000H ; CODE SEGMENT TA 6000H
    MOV DS, AX
    MOV ES, AX
    STI
    MENUF:
    CALL CLEARSCREEN
    Mov DH,1
    Mov DL,1
    Call GOTOXY
    CALL PRINT_MENU
    CALL GETINPUT
    CMP AL,'N'
    JE NEWF
    CMP AL,'S'
    JE SAVEF
    CMP AL,'L'
    JNE Next ;
    Jmp LOADF
    Next: CMP AL,'E'
    JNE ee
    MOv ah,0
    int 19H
    ee: JMP MENUF
    NEWF:
    CALL CLEARSCREEN
    CALL WRAC
    WRITEF:
    ;CALL PRFNAME
    CALL READTEXT
    JMP MENUF
    ;==================================================================================
    SAVEF:
    CALL GETNAME ;
    ;----------------------------------------------------------------------------------
    CALL LDFAT ; LOAD FAT
    CALL FINDFREEFAT ; SEARCH FOR FRRE CLUSTER & SAVE IN VARIABLE & SPECIFY END OF FILE
    Lea SI, WriteFatIntoDisk
    Call Puts
    MOV CX,9 ; NUMBER OF SECTORS IN TOTAL TO BE WRITTEN TO THE HARD DISK
    ;MOV CX,1 ; NUMBER OF SECTORS IN TOTAL TO BE WRITTEN TO THE HARD DISK
    LEA SI, FTBUFFERADDRESS ; THE ADDRESS OF FAT LOADED IN MEMORY
    MOV BX, WORD PTR[SI]
    Mov Ax,2000H
    Mov ES, AX
    MOV AX,1 ; START OF FAT ON DISK
    CALL DUMPONDISK ; WRITE BACK FAT TO HARD/FLOPPY DISK
    Lea SI, ContinueMess
    Call Puts
    Call GetCh
    ;----------------------------------------------------------------------------------
    ;Call CLEARSCREEN
    CALL LDROOT ; LOAD ROOT DIRECTORY
    CALL RTSCR ; SEARCH FOR FREE ENTRY
    CALL SAVE_IN_ROOT ; SAVE START CLUSTER IN ROOT DIRECTORY & ;SAVE FILE NAME IN ROOT DIRECTORY
    Lea SI, WriteRootIntoDisk
    Call Puts
    Mov Ax,2000H
    Mov ES, AX
    LEA SI,RTBUFFERADDRESS ; THE ADDRESS OF ROOT LOADED IN MEMORY
    MOV BX, WORD PTR[SI]
    MOV CX,14 ; NUMBER OF SECTORS IN TOTAL TO BE WRITTEN TO THE HARD DISK
    MOV AX,19 ; START OF ROOT ON DISK
    CALL DUMPONDISK ; WRITE BACK ROOT TO HARD /FLOPPY DISK
    Lea SI, ContinueMess
    Call Puts
    Call GetCh
    ;----------------------------------------------------------------------------------
    ;Call CLEARSCREEN ; FOR TEXT FILE ONLY ;
    LEA SI, FREEFATENTRY1
    MOV AX, WORD PTR[SI] ;200
    CALL CLUSTERLBA
    CALL SAVEFILE
    ;-----------------------------------------------------------------------------------
    LEA SI, SaveOperationMess
    CALL PUTS
    CALL GETCH
    JMP MENUF
    ;===================================================================================
    LOADF: ;CALL CLEARSCREEN
    CALL CLEARSCREEN
    CALL LDAC
    CALL PRINTINT
    CALL GETNAME
    CALL LDROOT
    CALL FINDNLOAD ;LOADFILE
    JMP MENUF ;WRITEF
    ;===================================================================================
    EXITP:
    CALL EXITACTIVATED
    mov ah,0
    RB: INT 19H ; BOOT COMPUTER

    CODE ENDS
    END





    موضوعات مشابه:
    فایل های پیوست شده
    Pouya, jellyfish و H_afkhami60 این نویسه را میپسندند.
    توکل بخدا
    http://DeepLearning.ir
    اولین و تنها مرجع یادگیری عمیق ایران


    هرکس از ظن خود شد یار من
    از درون من نجست اسرار من




  2. #2
    عضو تازه وارد
    تاریخ عضویت
    2014 November
    ارسال ها
    2
    تشکر
    3
    Thanked 1 Time in 1 Post


    آيا اين پست براي شما سودمند بود؟ بله | خیر
    سید حسین جان پسورد Operating System in Assembly.rar چیه؟


  3. #3
    بنیانگذار
    تاریخ عضویت
    2010 January
    محل سکونت
    زیر سایه خدا
    سن
    37
    ارسال ها
    1,308
    تشکر
    2,923
    تشکر شده 2,205 بار در 886 پست
    نوشته های وبلاگ
    37


    1 امتياز مثبت از 1 راي
    آيا اين پست براي شما سودمند بود؟ بله | خیر
    نقل قول نوشته اصلی توسط H_afkhami60 نمایش پست ها
    سید حسین جان پسورد Operating System in Assembly.rar چیه؟
    سلام
    در خود فایل rar هست وقتی بازش کنید مشخصه :
    کد:
    PASSWORD:ustmb.ir


    توکل بخدا
    http://DeepLearning.ir
    اولین و تنها مرجع یادگیری عمیق ایران


    هرکس از ظن خود شد یار من
    از درون من نجست اسرار من




  4. #4
    عضو تازه وارد
    تاریخ عضویت
    2014 November
    ارسال ها
    2
    تشکر
    3
    Thanked 1 Time in 1 Post


    آيا اين پست براي شما سودمند بود؟ بله | خیر
    سید حسین جان با توضیحات و راهنمایی های شما توانستم بالاخره ی بوتلودری که ی کرنل را لود می کنه بسازم و با موفقیت تست شد. از شما صمیمانه تشکر می کنم.

    Hossein این نویسه را میپسندد.

 

 

کاربران برچسب خورده در این موضوع

کلمات کلیدی این موضوع

علاقه مندی ها (Bookmarks)

علاقه مندی ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  


Powered by vBulletin
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.6.0
Persian Language By Ustmb.ir
این انجمن کاملا مستقل بوده و هیچ ارتباطی با دانشگاه علوم و فنون مازندران و مسئولان آن ندارد..این انجمن و تمامی محتوای تولید شده در آن توسط دانشجویان فعلی و فارغ التحصیل ادوار گذشته این دانشگاه برای استفاده دانشجویان جدید این دانشگاه و جامعه دانشگاهی کشور فراهم شده است.لطفا برای اطلاعات بیشتر در رابطه با ماهیت انجمن با مدیریت انجمن ارتباط برقرار کنید
ساعت 11:24 AM بر حسب GMT +4 می باشد.