Author: akhaldi Date: Thu Sep 2 17:39:45 2010 New Revision: 48687
URL: http://svn.reactos.org/svn/reactos?rev=48687&view=rev Log: [FREELDR] - Convert fat12/16 boot sector helper code to gas syntax. Brought to you by the Arty. [CMAKE] - Add freeldr and setupldr to build.
Added: branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.S - copied, changed from r48568, branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm Removed: branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm Modified: branches/cmake-bringup/boot/CMakeLists.txt
Modified: branches/cmake-bringup/boot/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/boot/CMakeLists.tx... ============================================================================== --- branches/cmake-bringup/boot/CMakeLists.txt [iso-8859-1] (original) +++ branches/cmake-bringup/boot/CMakeLists.txt [iso-8859-1] Thu Sep 2 17:39:45 2010 @@ -5,3 +5,203 @@ CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/freeldr/bootsect/fat.asm ${CMAKE_CURRENT_BINARY_DIR}/freeldr/bootsect/fat.bin) CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/freeldr/bootsect/isoboot.asm ${CMAKE_CURRENT_BINARY_DIR}/freeldr/bootsect/isoboot.bin) CreateBootSectorTarget(isobtrt ${CMAKE_CURRENT_SOURCE_DIR}/freeldr/bootsect/isobtrt.asm ${CMAKE_CURRENT_BINARY_DIR}/freeldr/bootsect/isobtrt.bin) + +include_directories(BEFORE freeldr/freeldr/include) +include_directories(${REACTOS_SOURCE_DIR}/ntoskrnl/include) + +if(ARCH MATCHES i386) +list(APPEND FREELDR_STARTUP_SOURCE + freeldr/freeldr/arch/i386/fathelp.S + freeldr/freeldr/arch/i386/arch.S) +elseif(ARCH MATCHES amd64) +list(APPEND FREELDR_STARTUP_SOURCE + freeldr/freeldr/arch/amd64/fathelp.S + freeldr/freeldr/arch/amd64/arch.S) +endif(ARCH MATCHES i386) + +if(ARCH MATCHES i386) +list(APPEND FREELDR_BASE64K_SOURCE + freeldr/freeldr/arch/i386/boot.S + freeldr/freeldr/arch/i386/drvmap.S + freeldr/freeldr/arch/i386/i386cpu.S + freeldr/freeldr/arch/i386/i386idt.S + freeldr/freeldr/arch/i386/i386pnp.S + freeldr/freeldr/arch/i386/i386trap.S + freeldr/freeldr/arch/i386/int386.S + freeldr/freeldr/arch/i386/linux.S + freeldr/freeldr/arch/i386/mb.S) +elseif(ARCH MATCHES amd64) +list(APPEND FREELDR_BASE64K_SOURCE + freeldr/freeldr/arch/amd64/drvmap.S + freeldr/freeldr/arch/amd64/i386cpu.S + freeldr/freeldr/arch/amd64/i386idt.S + freeldr/freeldr/arch/amd64/i386trap.S + freeldr/freeldr/arch/amd64/mb.S) +endif(ARCH MATCHES i386) + +set_source_files_properties(${FREELDR_BASE64K_SOURCE} PROPERTIES COMPILE_DEFINITIONS "_NTHAL_") + +include_directories(${REACTOS_SOURCE_DIR}/lib/cmlib) + +list(APPEND FREELDR_BASE_SOURCE + freeldr/freeldr/arcemul/mm.c + freeldr/freeldr/arcemul/time.c + freeldr/freeldr/cache/blocklist.c + freeldr/freeldr/cache/cache.c + freeldr/freeldr/comm/rs232.c + freeldr/freeldr/disk/disk.c + freeldr/freeldr/disk/partition.c + freeldr/freeldr/disk/ramdisk.c + freeldr/freeldr/fs/ext2.c + freeldr/freeldr/fs/fat.c + freeldr/freeldr/fs/fs.c + freeldr/freeldr/fs/iso.c + freeldr/freeldr/fs/ntfs.c + freeldr/freeldr/inifile/ini_init.c + freeldr/freeldr/inifile/inifile.c + freeldr/freeldr/inifile/parse.c + freeldr/freeldr/mm/meminit.c + freeldr/freeldr/mm/mm.c + freeldr/freeldr/reactos/registry.c + freeldr/freeldr/reactos/arcname.c + freeldr/freeldr/reactos/archwsup.c + freeldr/freeldr/reactos/binhive.c + freeldr/freeldr/reactos/reactos.c + freeldr/freeldr/reactos/imageldr.c + freeldr/freeldr/rtl/bget.c + freeldr/freeldr/rtl/libsupp.c + freeldr/freeldr/ui/directui.c + freeldr/freeldr/ui/gui.c + freeldr/freeldr/ui/minitui.c + freeldr/freeldr/ui/noui.c + freeldr/freeldr/ui/tui.c + freeldr/freeldr/ui/tuimenu.c + freeldr/freeldr/ui/ui.c + freeldr/freeldr/video/fade.c + freeldr/freeldr/video/palette.c + freeldr/freeldr/video/video.c + freeldr/freeldr/windows/conversion.c + freeldr/freeldr/windows/peloader.c + freeldr/freeldr/windows/winldr.c + freeldr/freeldr/windows/wlmemory.c + freeldr/freeldr/windows/wlregistry.c + freeldr/freeldr/freeldr.c + freeldr/freeldr/debug.c + freeldr/freeldr/version.c + freeldr/freeldr/cmdline.c + freeldr/freeldr/machine.c + freeldr/freeldr/options.c + freeldr/freeldr/linuxboot.c + freeldr/freeldr/oslist.c) + +if(ARCH MATCHES i386) +list(APPEND FREELDR_BASE_SOURCE freeldr/freeldr/disk/scsiport.c) +endif(ARCH MATCHES i386) + +set_source_files_properties(${FREELDR_BASE_SOURCE} PROPERTIES COMPILE_DEFINITIONS "_NTHAL_;_BLDR_;_NTSYSTEM_") + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/libs) +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/elf) + +if(ARCH MATCHES i386) +list(APPEND FREELDR_ARCH_SOURCE + freeldr/freeldr/arch/i386/_alloca.S + freeldr/freeldr/arch/i386/archmach.c + freeldr/freeldr/arch/i386/custom.c + freeldr/freeldr/arch/i386/drivemap.c + freeldr/freeldr/arch/i386/halstub.c + freeldr/freeldr/arch/i386/hardware.c + freeldr/freeldr/arch/i386/hwacpi.c + freeldr/freeldr/arch/i386/hwapm.c + freeldr/freeldr/arch/i386/hwpci.c + freeldr/freeldr/arch/i386/i386disk.c + freeldr/freeldr/arch/i386/i386rtl.c + freeldr/freeldr/arch/i386/i386vid.c + freeldr/freeldr/arch/i386/loader.c + freeldr/freeldr/arch/i386/machpc.c + freeldr/freeldr/arch/i386/miscboot.c + freeldr/freeldr/arch/i386/ntoskrnl.c + freeldr/freeldr/arch/i386/pccons.c + freeldr/freeldr/arch/i386/pcdisk.c + freeldr/freeldr/arch/i386/pcmem.c + freeldr/freeldr/arch/i386/pcrtc.c + freeldr/freeldr/arch/i386/pcvideo.c + freeldr/freeldr/arch/i386/machxbox.c + freeldr/freeldr/arch/i386/xboxcons.c + freeldr/freeldr/arch/i386/xboxdisk.c + freeldr/freeldr/arch/i386/xboxfont.c + freeldr/freeldr/arch/i386/xboxhw.c + freeldr/freeldr/arch/i386/xboxi2c.c + freeldr/freeldr/arch/i386/xboxmem.c + freeldr/freeldr/arch/i386/xboxrtc.c + freeldr/freeldr/arch/i386/xboxvideo.c + freeldr/freeldr/windows/i386/ntsetup.c + freeldr/freeldr/windows/i386/wlmemory.c) +else() +#TBD +endif(ARCH MATCHES i386) + +set_source_files_properties(${FREELDR_ARCH_SOURCE} PROPERTIES COMPILE_DEFINITIONS "_NTHAL_;_BLDR_;_NTSYSTEM_") + +list(APPEND SETUPLDR_MAIN_SOURCE + freeldr/freeldr/bootmgr.c + freeldr/freeldr/inffile/inffile.c + freeldr/freeldr/reactos/setupldr.c) + +if(ARCH MATCHES i386) +list(APPEND SETUPLDR_MAIN_SOURCE freeldr/freeldr/windows/setupldr2.c) +elseif(ARCH MATCHES amd64) +list(APPEND SETUPLDR_MAIN_SOURCE freeldr/freeldr/windows/setupldr2.c) +endif(ARCH MATCHES i386) + +set_source_files_properties(${SETUPLDR_MAIN_SOURCE} PROPERTIES COMPILE_DEFINITIONS "_NTHAL_;FREELDR_REACTOS_SETUP" COMPILE_FLAGS "-ffreestanding -fno-builtin -fno-inline -fno-zero-initialized-in-bss") + +set(CMAKE_C_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") + +list(APPEND FREELDR_SOURCE + freeldr/freeldr/bootmgr.c + ${FREELDR_STARTUP_SOURCE} + ${FREELDR_BASE64K_SOURCE} + ${FREELDR_BASE_SOURCE} + ${FREELDR_ARCH_SOURCE}) + +add_library(freeldr SHARED + ${CMAKE_CURRENT_BINARY_DIR}/freeldr_freeldr.h.gch + ${FREELDR_SOURCE}) + +set_target_properties(freeldr PROPERTIES LINK_FLAGS "-Wl,--strip-all -Wl,-entry,_mainCRTStartup -Wl,--image-base,0x8000 -Wl,--exclude-all-symbols -Wl,--subsystem,native" SUFFIX ".sys") + +if(ARCH MATCHES i386) +target_link_libraries(freeldr mini_hal) +endif(ARCH MATCHES i386) + +target_link_libraries(freeldr + rossym + cmlib + rtl + libcntpr) +add_pch(freeldr ${CMAKE_CURRENT_SOURCE_DIR}/freeldr/freeldr/include/freeldr.h ${FREELDR_SOURCE}) + +list(APPEND SETUPLDR_SOURCE + ${FREELDR_STARTUP_SOURCE} + ${FREELDR_BASE64K_SOURCE} + ${FREELDR_BASE_SOURCE} + ${FREELDR_ARCH_SOURCE} + ${SETUPLDR_MAIN_SOURCE}) + +add_library(setupldr SHARED + ${CMAKE_CURRENT_BINARY_DIR}/freeldr_freeldr.h.gch + ${SETUPLDR_SOURCE}) + +set_target_properties(setupldr PROPERTIES LINK_FLAGS "-Wl,--strip-all -Wl,-entry,_mainCRTStartup -Wl,--image-base,0x8000 -Wl,--exclude-all-symbols -Wl,--subsystem,native" SUFFIX ".sys") + +if(ARCH MATCHES i386) +target_link_libraries(setupldr mini_hal) +endif(ARCH MATCHES i386) + +target_link_libraries(setupldr + rossym + cmlib + rtl + libcntpr) +add_pch(setupldr ${CMAKE_CURRENT_SOURCE_DIR}/freeldr/freeldr/include/freeldr.h ${SETUPLDR_SOURCE})
Copied: branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.S (from r48568, branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm) URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/boot/freeldr/freel... ============================================================================== --- branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm [iso-8859-1] (original) +++ branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.S [iso-8859-1] Thu Sep 2 17:39:45 2010 @@ -1,226 +1,222 @@ -; FATHELP.ASM -; FAT12/16 Boot Sector Helper Code -; Copyright (c) 1998, 2001, 2002, 2003 Brian Palmer - - - -;org 8000h - -segment .text - -bits 16 - - -BootSectorStackTop equ 0x7bf2 -DataAreaStartHigh equ 0x2 -DataAreaStartLow equ 0x4 -BiosCHSDriveSizeHigh equ 0x6 -BiosCHSDriveSizeLow equ 0x8 -BiosCHSDriveSize equ 0x8 -ReadSectorsOffset equ 0xa -ReadClusterOffset equ 0xc -PutCharsOffset equ 0xe - -OEMName equ 3 -BytesPerSector equ 11 -SectsPerCluster equ 13 -ReservedSectors equ 14 -NumberOfFats equ 16 -MaxRootEntries equ 17 -TotalSectors equ 19 -MediaDescriptor equ 21 -SectorsPerFat equ 22 -SectorsPerTrack equ 24 -NumberOfHeads equ 26 -HiddenSectors equ 28 -TotalSectorsBig equ 32 -BootDrive equ 36 -Reserved equ 37 -ExtendSig equ 38 -SerialNumber equ 39 -VolumeLabel equ 43 -FileSystem equ 54 - -BootPartition equ 0x7dfd +// FATHELP.ASM +// FAT12/16 Boot Sector Helper Code +// Copyright (c) 1998, 2001, 2002, 2003 Brian Palmer + + .text + .code16 + .intel_syntax + +#define BootSectorStackTop 0x7bf2 +#define DataAreaStartHigh 0x2 +#define DataAreaStartLow 0x4 +#define BiosCHSDriveSizeHigh 0x6 +#define BiosCHSDriveSizeLow 0x8 +#define BiosCHSDriveSize 0x8 +#define ReadSectorsOffset 0xa +#define ReadClusterOffset 0xc +#define PutCharsOffset 0xe + +#define OEMName 3 +#define BytesPerSector 11 +#define SectsPerCluster 13 +#define ReservedSectors 14 +#define NumberOfFats 16 +#define MaxRootEntries 17 +#define TotalSectors 19 +#define MediaDescriptor 21 +#define SectorsPerFat 22 +#define SectorsPerTrack 24 +#define NumberOfHeads 26 +#define HiddenSectors 28 +#define TotalSectorsBig 32 +#define BootDrive 36 +#define Reserved 37 +#define ExtendSig 38 +#define SerialNumber 39 +#define VolumeLabel 43 +#define FileSystem 54 + +#define BootPartition 0x7dfd
-; This code will be stored in the first 512 bytes -; of freeldr.sys. The first 3 bytes will be a jmp -; instruction to skip past the FAT helper code -; that is stored in the rest of the 512 bytes. -; -; This code is loaded at 0000:8000 so we have to -; encode a jmp instruction to jump to 0000:8200 - -global _mainCRTStartup ; For Mingw32 builds where the linker looks for this symbol +// This code will be stored in the first 512 bytes +// of freeldr.sys. The first 3 bytes will be a jmp +// instruction to skip past the FAT helper code +// that is stored in the rest of the 512 bytes. +// +// This code is loaded at 0000:8000 so we have to +// encode a jmp instruction to jump to 0000:8200 + +.globl _mainCRTStartup /* For Mingw32 builds where the linker looks for this symbol */ _mainCRTStartup: -global start +.globl start start: - db 0xe9 - db 0xfd - db 0x01 - -; Now starts the extra boot code that we will store -; in the first 512 bytes of freeldr.sys. This code -; allows the FAT12/16 bootsector to navigate the -; FAT table so that we can still load freeldr.sys -; even if it is fragmented. + .byte 0xe9 + .byte 0xfd + .byte 0x01 + +// Now starts the extra boot code that we will store +// in the first 512 bytes of freeldr.sys. This code +// allows the FAT12/16 bootsector to navigate the +// FAT table so that we can still load freeldr.sys +// even if it is fragmented.
FatHelperEntryPoint:
- push ax ; First save AX - the start cluster of freeldr.sys - - - ; Display "Loading FreeLoader..." message - mov esi,msgLoading ; Loading message - call [bp-PutCharsOffset] ; Display it + push %ax /* First save AX - the start cluster of freeldr.sys */ + + + // Display "Loading FreeLoader..." message + mov %esi,msgLoading /* Loading message */ + call [%bp-PutCharsOffset] /* Display it */
call ReadFatIntoMemory
- pop ax ; Restore AX (start cluster) - ; AX has start cluster of freeldr.sys - - mov bx,800h - mov es,bx + pop %ax /* Restore AX (start cluster) */ + // AX has start cluster of freeldr.sys + + mov %bx,0x800 + mov %es,%bx
LoadFile: - push ax + push %ax call IsFat12 - pop ax + pop %ax jnc LoadFile2 - cmp ax,0ff8h ; Check to see if this is the last cluster in the chain + cmp %ax,0xff8 /* Check to see if this is the last cluster in the chain */ jmp LoadFile3 LoadFile2: - cmp ax,0fff8h + cmp %ax,0xfff8 LoadFile3: - jae LoadFile_Done ; If so continue, if not then read then next one - push ax - xor bx,bx ; Load ROSLDR starting at 0000:8000h - push es - call [bp-ReadClusterOffset] - pop es - - xor bx,bx - mov bl,BYTE [BYTE bp+SectsPerCluster] - shl bx,5 ; BX = BX * 512 / 16 - mov ax,es ; Increment the load address by - add ax,bx ; The size of a cluster - mov es,ax + jae LoadFile_Done /* If so continue, if not then read then next one */ + push %ax + xor %bx,%bx /* Load ROSLDR starting at 0000:8000h */ + push %es + call [%bp-ReadClusterOffset] + pop %es + + xor %bx,%bx + mov %bl,BYTE [%bp+SectsPerCluster] + shl %bx,5 /* BX = BX * 512 / 16 */ + mov %ax,%es /* Increment the load address by */ + add %ax,%bx /* The size of a cluster */ + mov %es,%ax
call IsFat12 - pop ax - push es + pop %ax + push %es jnc LoadFile4 - call GetFatEntry12 ; Get the next entry + call GetFatEntry12 /* Get the next entry */ jmp LoadFile5 LoadFile4: call GetFatEntry16 LoadFile5: - pop es - - jmp LoadFile ; Load the next cluster (if any) + pop %es + + jmp LoadFile /* Load the next cluster (if any) */
LoadFile_Done: - mov dl,BYTE [BYTE bp+BootDrive] ; Load the boot drive into DL - mov dh,[BootPartition] ; Load the boot partition into DH - - push 0 ; push segment (0x0000) - mov bx, [0x8000 + 0xA8] ; load the RVA of the EntryPoint into eax - add bx, 0x8000 ; RVA -> VA and skip 3 bytes (jump to fathelper code) - push bx ; push offset - retf ; Transfer control to FreeLoader - -; Reads the entire FAT into memory at 7000:0000 + mov %dl,BYTE [%bp+BootDrive] /* Load the boot drive into DL */ + mov %dh,[BootPartition] /* Load the boot partition into DH */ + + push 0 /* push segment (0x0000) */ + mov %bx, [0x80A8] /* load the RVA of the EntryPoint into eax */ + add %bx, 0x8000 /* RVA -> VA and skip 3 bytes (jump to fathelper code) */ + push %bx /* push offset */ + retf /* Transfer control to FreeLoader */ + +// Reads the entire FAT into memory at 7000:0000 ReadFatIntoMemory: - mov ax,WORD [BYTE bp+HiddenSectors] - mov dx,WORD [BYTE bp+HiddenSectors+2] - add ax,WORD [BYTE bp+ReservedSectors] - adc dx,byte 0 - mov cx,WORD [BYTE bp+SectorsPerFat] - mov bx,7000h - mov es,bx - xor bx,bx - call [bp-ReadSectorsOffset] - ret - - -; Returns the FAT entry for a given cluster number for 16-bit FAT -; On entry AX has cluster number -; On return AX has FAT entry for that cluster + mov %ax,WORD [%bp+HiddenSectors] + mov %dx,WORD [%bp+HiddenSectors+2] + add %ax,WORD [%bp+ReservedSectors] + adc %dx,0 + mov %cx,WORD [%bp+SectorsPerFat] + mov %bx,0x7000 + mov %es,%bx + xor %bx,%bx + call [%bp-ReadSectorsOffset] + ret + + +// Returns the FAT entry for a given cluster number for 16-bit FAT +// On entry AX has cluster number +// On return AX has FAT entry for that cluster GetFatEntry16:
- mov cx,2 ; AX = AX * 2 (since FAT16 entries are 2 bytes) - mul cx - shl dx,12 - - mov bx,7000h - add bx,dx - mov es,bx - mov bx,ax ; Restore FAT entry offset - mov ax,WORD [es:bx] ; Get FAT entry - - ret - - -; Returns the FAT entry for a given cluster number for 12-bit FAT -; On entry AX has cluster number -; On return AX has FAT entry for that cluster + mov %cx,2 /* AX = AX * 2 (since FAT16 entries are 2 bytes) */ + mul %cx + shl %dx,12 + + mov %bx,0x7000 + add %bx,%dx + mov %es,%bx + mov %bx,%ax /* Restore FAT entry offset */ + es mov %ax,WORD [%bx] /* Get FAT entry */ + + ret + + +// Returns the FAT entry for a given cluster number for 12-bit FAT +// On entry AX has cluster number +// On return AX has FAT entry for that cluster GetFatEntry12:
- push ax - mov cx,ax - shr ax,1 - add ax,cx ; AX = AX * 1.5 (AX = AX + (AX / 2)) (since FAT12 entries are 12 bits) - - mov bx,7000h - mov es,bx - mov bx,ax ; Put FAT entry offset into BX - mov ax,WORD [es:bx] ; Get FAT entry - pop cx ; Get cluster number from stack - and cx,1 + push %ax + mov %cx,%ax + shr %ax,1 + add %ax,%cx /* AX = AX * 1.5 (AX = AX + (AX / 2)) (since FAT12 entries are 12 bits) */ + + mov %bx,0x7000 + mov %es,%bx + mov %bx,%ax /* Put FAT entry offset into BX */ + es mov %ax,WORD [%bx] /* Get FAT entry */ + pop %cx /* Get cluster number from stack */ + and %cx,1 jz UseLow12Bits - and ax,0fff0h - shr ax,4 + and %ax,0xfff0 + shr %ax,4 jmp GetFatEntry12_Done
UseLow12Bits: - and ax,0fffh + and %ax,0x0fff
GetFatEntry12_Done:
ret
-; Returns CF = 1 if this is a FAT12 file system -; Otherwise CF = 0 for FAT16 +// Returns CF = 1 if this is a FAT12 file system +// Otherwise CF = 0 for FAT16 IsFat12:
- mov ebx,DWORD [BYTE bp-DataAreaStartLow] - ; EBX now has the number of the starting sector of the data area - ; starting from the beginning of the disk, so subtrace hidden sectors - sub ebx,DWORD [BYTE bp+HiddenSectors] - - - xor eax,eax - mov ax,WORD [BYTE bp+TotalSectors] - cmp ax,byte 0 + mov %ebx,DWORD [%bp-DataAreaStartLow] + // EBX now has the number of the starting sector of the data area + // starting from the beginning of the disk, so subtrace hidden sectors + sub %ebx,DWORD [%bp+HiddenSectors] + + + xor %eax,%eax + mov %ax,WORD [%bp+TotalSectors] + cmp %ax,0 jnz IsFat12_2 - mov eax,DWORD [BYTE bp+TotalSectorsBig] - - ; EAX now contains the number of sectors on the volume + mov %eax,DWORD [%bp+TotalSectorsBig] + + // EAX now contains the number of sectors on the volume
IsFat12_2: - sub eax,ebx ; Subtract data area start sector - xor edx,edx ; from total sectors of volume - - ; EDX:EAX now contains the number of data sectors on the volume - movzx ebx,BYTE [BYTE bp+SectsPerCluster] - div ebx - ; EAX now has the number of clusters on the volume + sub %eax,%ebx /* Subtract data area start sector */ + xor %edx,%edx /* from total sectors of volume */ + + // EDX:EAX now contains the number of data sectors on the volume + xor %ebx,%ebx + mov %bl,BYTE [%bp+SectsPerCluster] + div %ebx + // EAX now has the number of clusters on the volume stc - cmp eax,4085 + cmp %eax,4085 jb IsFat12_Done clc
@@ -229,7 +225,9 @@
-msgLoading db 'Loading FreeLoader...',0dh,0ah,0 - - times 510-($-$$) db 0 ; Pad to 510 bytes - dw 0aa55h ; BootSector signature +msgLoading: + .asciz "Loading FreeLoader...\r\n" + + .org 0x1fe +blockend: + .word 0x0aa55 /* BootSector signature */
Removed: branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm URL: http://svn.reactos.org/svn/reactos/branches/cmake-bringup/boot/freeldr/freel... ============================================================================== --- branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm [iso-8859-1] (original) +++ branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm (removed) @@ -1,235 +1,0 @@ -; FATHELP.ASM -; FAT12/16 Boot Sector Helper Code -; Copyright (c) 1998, 2001, 2002, 2003 Brian Palmer - - - -;org 8000h - -segment .text - -bits 16 - - -BootSectorStackTop equ 0x7bf2 -DataAreaStartHigh equ 0x2 -DataAreaStartLow equ 0x4 -BiosCHSDriveSizeHigh equ 0x6 -BiosCHSDriveSizeLow equ 0x8 -BiosCHSDriveSize equ 0x8 -ReadSectorsOffset equ 0xa -ReadClusterOffset equ 0xc -PutCharsOffset equ 0xe - -OEMName equ 3 -BytesPerSector equ 11 -SectsPerCluster equ 13 -ReservedSectors equ 14 -NumberOfFats equ 16 -MaxRootEntries equ 17 -TotalSectors equ 19 -MediaDescriptor equ 21 -SectorsPerFat equ 22 -SectorsPerTrack equ 24 -NumberOfHeads equ 26 -HiddenSectors equ 28 -TotalSectorsBig equ 32 -BootDrive equ 36 -Reserved equ 37 -ExtendSig equ 38 -SerialNumber equ 39 -VolumeLabel equ 43 -FileSystem equ 54 - -BootPartition equ 0x7dfd - - -; This code will be stored in the first 512 bytes -; of freeldr.sys. The first 3 bytes will be a jmp -; instruction to skip past the FAT helper code -; that is stored in the rest of the 512 bytes. -; -; This code is loaded at 0000:8000 so we have to -; encode a jmp instruction to jump to 0000:8200 - -global _mainCRTStartup ; For Mingw32 builds where the linker looks for this symbol -_mainCRTStartup: -global start -start: - db 0xe9 - db 0xfd - db 0x01 - -; Now starts the extra boot code that we will store -; in the first 512 bytes of freeldr.sys. This code -; allows the FAT12/16 bootsector to navigate the -; FAT table so that we can still load freeldr.sys -; even if it is fragmented. - - -FatHelperEntryPoint: - - push ax ; First save AX - the start cluster of freeldr.sys - - - ; Display "Loading FreeLoader..." message - mov esi,msgLoading ; Loading message - call [bp-PutCharsOffset] ; Display it - - - call ReadFatIntoMemory - - pop ax ; Restore AX (start cluster) - ; AX has start cluster of freeldr.sys - - mov bx,800h - mov es,bx - -LoadFile: - push ax - call IsFat12 - pop ax - jnc LoadFile2 - cmp ax,0ff8h ; Check to see if this is the last cluster in the chain - jmp LoadFile3 -LoadFile2: - cmp ax,0fff8h -LoadFile3: - jae LoadFile_Done ; If so continue, if not then read then next one - push ax - xor bx,bx ; Load ROSLDR starting at 0000:8000h - push es - call [bp-ReadClusterOffset] - pop es - - xor bx,bx - mov bl,BYTE [BYTE bp+SectsPerCluster] - shl bx,5 ; BX = BX * 512 / 16 - mov ax,es ; Increment the load address by - add ax,bx ; The size of a cluster - mov es,ax - - call IsFat12 - pop ax - push es - jnc LoadFile4 - call GetFatEntry12 ; Get the next entry - jmp LoadFile5 -LoadFile4: - call GetFatEntry16 -LoadFile5: - pop es - - jmp LoadFile ; Load the next cluster (if any) - -LoadFile_Done: - mov dl,BYTE [BYTE bp+BootDrive] ; Load the boot drive into DL - mov dh,[BootPartition] ; Load the boot partition into DH - - push 0 ; push segment (0x0000) - mov bx, [0x8000 + 0xA8] ; load the RVA of the EntryPoint into eax - add bx, 0x8000 ; RVA -> VA and skip 3 bytes (jump to fathelper code) - push bx ; push offset - retf ; Transfer control to FreeLoader - -; Reads the entire FAT into memory at 7000:0000 -ReadFatIntoMemory: - mov ax,WORD [BYTE bp+HiddenSectors] - mov dx,WORD [BYTE bp+HiddenSectors+2] - add ax,WORD [BYTE bp+ReservedSectors] - adc dx,byte 0 - mov cx,WORD [BYTE bp+SectorsPerFat] - mov bx,7000h - mov es,bx - xor bx,bx - call [bp-ReadSectorsOffset] - ret - - -; Returns the FAT entry for a given cluster number for 16-bit FAT -; On entry AX has cluster number -; On return AX has FAT entry for that cluster -GetFatEntry16: - - mov cx,2 ; AX = AX * 2 (since FAT16 entries are 2 bytes) - mul cx - shl dx,12 - - mov bx,7000h - add bx,dx - mov es,bx - mov bx,ax ; Restore FAT entry offset - mov ax,WORD [es:bx] ; Get FAT entry - - ret - - -; Returns the FAT entry for a given cluster number for 12-bit FAT -; On entry AX has cluster number -; On return AX has FAT entry for that cluster -GetFatEntry12: - - push ax - mov cx,ax - shr ax,1 - add ax,cx ; AX = AX * 1.5 (AX = AX + (AX / 2)) (since FAT12 entries are 12 bits) - - mov bx,7000h - mov es,bx - mov bx,ax ; Put FAT entry offset into BX - mov ax,WORD [es:bx] ; Get FAT entry - pop cx ; Get cluster number from stack - and cx,1 - jz UseLow12Bits - and ax,0fff0h - shr ax,4 - jmp GetFatEntry12_Done - -UseLow12Bits: - and ax,0fffh - -GetFatEntry12_Done: - - ret - - -; Returns CF = 1 if this is a FAT12 file system -; Otherwise CF = 0 for FAT16 -IsFat12: - - mov ebx,DWORD [BYTE bp-DataAreaStartLow] - ; EBX now has the number of the starting sector of the data area - ; starting from the beginning of the disk, so subtrace hidden sectors - sub ebx,DWORD [BYTE bp+HiddenSectors] - - - xor eax,eax - mov ax,WORD [BYTE bp+TotalSectors] - cmp ax,byte 0 - jnz IsFat12_2 - mov eax,DWORD [BYTE bp+TotalSectorsBig] - - ; EAX now contains the number of sectors on the volume - -IsFat12_2: - sub eax,ebx ; Subtract data area start sector - xor edx,edx ; from total sectors of volume - - ; EDX:EAX now contains the number of data sectors on the volume - movzx ebx,BYTE [BYTE bp+SectsPerCluster] - div ebx - ; EAX now has the number of clusters on the volume - stc - cmp eax,4085 - jb IsFat12_Done - clc - -IsFat12_Done: - ret - - - -msgLoading db 'Loading FreeLoader...',0dh,0ah,0 - - times 510-($-$$) db 0 ; Pad to 510 bytes - dw 0aa55h ; BootSector signature