This is retarded, GAS supports Intel syntax. Why did this require rewriting everything in AT&T syntax and introducing bugs? And what's up with calling AT&T syntax "GAS" Syntax.
I wonder what Brian would say....
It's funny how this project gets rid of old developers, gets new developers, and has them make the same mistakes/idiotic things the old developers left for in the first place...
Good job!
Best regards, Alex Ionescu
On Thu, Sep 2, 2010 at 10:39 AM, akhaldi@svn.reactos.org wrote:
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