#*\r
#------------------------------------------------------------------------------\r
\r
- \r
+ .stack: \r
+ .486p: \r
+ .code16\r
+ \r
.equ FAT_DIRECTORY_ENTRY_SIZE, 0x020\r
.equ FAT_DIRECTORY_ENTRY_SHIFT, 5\r
.equ BLOCK_SIZE, 0x0200\r
.equ BLOCK_SHIFT, 9\r
\r
.org 0x0\r
+\r
+.global _start\r
+_start:\r
+\r
Ia32Jump: \r
jmp BootSectorEntryPoint # JMP inst - 3 bytes\r
nop\r
NoVarStore: \r
pushw %es\r
# Set the 5th byte start @ 0:19000 to non-zero indicating we should init var store header in DxeIpl\r
- movb %al, %es:($4)\r
+ movb %al, %es:(4)\r
jmp SaveVolumeId\r
\r
CheckVarStoreSize: \r
\r
LoadVarStore: \r
movb $0, %al\r
- movb %al, %es:($4)\r
+ movb %al, %es:(4)\r
movw (%di), %cx\r
# ES:DI = 1500:0\r
xorw %di, %di\r
SaveVolumeId: \r
popw %es\r
movw VolId(%bp), %ax\r
- movw %ax, %es:($0) # Save Volume Id to 0:19000. we will find the correct volume according to this VolumeId\r
+ movw %ax, %es:(0) # Save Volume Id to 0:19000. we will find the correct volume according to this VolumeId\r
movw VolId+2(%bp), %ax\r
- movw %ax, %es:($2)\r
+ movw %ax, %es:(2)\r
\r
# Read Efildr\r
popw %cx\r
shrw %ax # FatOffset = ClusterNumber*3 / 2\r
pushw %si # Save si\r
movw %ax, %si # si = FatOffset\r
- shrw %ax # ax = FatOffset >> BLOCK_SHIFT\r
+ shrw $BLOCK_SHIFT, %ax # ax = FatOffset >> BLOCK_SHIFT\r
addw ReservedSectors(%bp), %ax # ax = FatSectorNumber = ReservedSectors + (FatOffset >> BLOCK_OFFSET)\r
- andw BLOCK_MASK,%si # si = FatOffset & BLOCK_MASK\r
+ andw $BLOCK_MASK,%si # si = FatOffset & BLOCK_MASK\r
cmpw %dx, %ax # Compare FatSectorNumber to CachedFatSectorNumber\r
je SkipFatRead\r
movw $2, %bx\r
\r
ReadBlocks: \r
pusha\r
- addl LBAOffsetForBootSector(%bp), %eax # Add LBAOffsetForBootSector to Start LBA\r
+ addl LBAOffsetForBootSector(%bp), %eax # Add LBAOffsetForBootSector to Start LBA\r
addl HiddenSectors(%bp), %eax # Add HiddenSectors to Start LBA\r
movl %eax, %esi # esi = Start LBA\r
movw %bx, %cx # cx = Number of blocks to read\r
LimitTransfer: \r
pushw %ax # save ax\r
movw %es, %ax # ax = es\r
- shrw %ax # ax = Number of blocks into mem system\r
+ shrw $(BLOCK_SHIFT-4), %ax # ax = Number of blocks into mem system\r
andw $0x7f, %ax # ax = Number of blocks into current seg\r
addw %bx, %ax # ax = End Block number of transfer\r
cmpw $0x80, %ax # See if it crosses a 64K boundry\r
addl %ebx, %esi # StartLBA = StartLBA + NumberOfBlocks\r
subw %bx, %cx # Blocks = Blocks - NumberOfBlocks\r
movw %es, %ax\r
- shlw %bx\r
+ shlw $(BLOCK_SHIFT-4), %bx\r
addw %bx, %ax\r
movw %ax, %es # es:di = es:di + NumberOfBlocks*BLOCK_SIZE\r
cmpw $0, %cx\r
DiskError: \r
pushw %cs\r
popw %ds\r
- leaw %cs:ErrorString, %si\r
+ leaw ErrorString, %si\r
movw $7, %cx\r
jmp PrintStringAndHalt\r
\r
ErrorString: \r
.byte 'S', 0x0c, 'E', 0x0c, 'r', 0x0c, 'r', 0x0c, 'o', 0x0c, 'r', 0x0c, '!',0x0c\r
\r
- #.org 0x0242 # For Code size overflow, Modified this just for pass build\r
+ .org 0x01fa\r
LBAOffsetForBootSector: \r
.long 0x0\r
\r
- #.org 0x0227 # For Code size overflow, Modified this just for pass build\r
+ .org 0x01fe\r
.word 0xaa55\r
\r
#******************************************************************************\r
.equ WRITE_DATA_PORT_CMD, 0x0d1 # 8042 command to write the data port\r
.equ ENABLE_A20_CMD, 0x0df # 8042 command to enable A20\r
\r
- #.org 0x200\r
+ .org 0x200\r
jmp start\r
Em64String: \r
.byte 'E', 0x0c, 'm', 0x0c, '6', 0x0c, '4', 0x0c, 'T', 0x0c, ' ', 0x0c, 'U', 0x0c, 'n', 0x0c, 's', 0x0c, 'u', 0x0c, 'p', 0x0c, 'p', 0x0c, 'o', 0x0c, 'r', 0x0c, 't', 0x0c, 'e', 0x0c, 'd', 0x0c, '!', 0x0c\r
xorl %ebx, %ebx\r
movw %cs, %bx # BX=segment\r
shll $4, %ebx # BX="linear" address of segment base\r
- leal GDT_BASE(%ebx), %eax #\r
- movl %eax, (gdtr + 2) #\r
- leal IDT_BASE(%ebx), %eax #\r
- movl %eax, (idtr + 2) #\r
- leal MemoryMapSize(%ebx), %edx #\r
+ leal GDT_BASE(%ebx), %eax # EAX=PHYSICAL address of gdt\r
+ movl %eax, (gdtr + 2) # Put address of gdt into the gdtr\r
+ leal IDT_BASE(%ebx), %eax # EAX=PHYSICAL address of idt\r
+ movl %eax, (idtr + 2) # Put address of idt into the idtr\r
+ leal MemoryMapSize(%ebx), %edx # Physical base address of the memory map\r
\r
addl $0x1000, %ebx # Source of EFI32\r
movl %ebx, JUMP+2\r
# data\r
##############################################################################\r
\r
- .align 0x2\r
+ .p2align 1\r
\r
gdtr: .long GDT_END - GDT_BASE - 1 # GDT limit \r
.long 0 # (GDT base gets set above)\r
# global descriptor table (GDT)\r
##############################################################################\r
\r
- .align 0x2\r
+ .p2align 1\r
\r
GDT_BASE: \r
# null descriptor\r
\r
GDT_END: \r
\r
- .align 0x2\r
+ .p2align 1\r
\r
\r
\r
##############################################################################\r
\r
#idt_tag db "IDT",0 \r
- .align 0x2\r
+ .p2align 1\r
\r
IDT_BASE: \r
# divide by zero (INT 0)\r
.word 0 # offset 31:16\r
\r
# 85 unspecified descriptors, First 12 of them are reserved, the rest are avail\r
- .fill 85 * 8, 1, 0 # db (85 * 8) dup(0)\r
+ .fill 85 * 8, 1, 0 # db (85 * 8) dup(0)\r
\r
# IRQ 0 (System timer) - (INT 0x68)\r
.equ IRQ0_SEL, .-IDT_BASE\r
\r
IDT_END: \r
\r
- .align 0x2\r
+ .p2align 1\r
\r
MemoryMapSize: .long 0\r
MemoryMap: .long 0,0,0,0,0,0,0,0\r