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, <akha...@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.txt?rev=48687&r1=48686&r2=48687&view=diff > ============================================================================== > --- 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/freeldr/arch/i386/fathelp.S?p2=branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.S&p1=branches/cmake-bringup/boot/freeldr/freeldr/arch/i386/fathelp.asm&r1=48568&r2=48687&rev=48687&view=diff > ============================================================================== > --- 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/freeldr/arch/i386/fathelp.asm?rev=48686&view=auto > ============================================================================== > --- 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 > > > _______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev