|
@ -27,23 +27,23 @@ start: |
|
|
# address line 20 is tied low, so that addresses higher than |
|
|
# address line 20 is tied low, so that addresses higher than |
|
|
# 1MB wrap around to zero by default. This code undoes this. |
|
|
# 1MB wrap around to zero by default. This code undoes this. |
|
|
seta20.1: |
|
|
seta20.1: |
|
|
inb $0x64, %al # Wait for not busy |
|
|
|
|
|
|
|
|
inb $0x64, %al # Wait for not busy(8042 input buffer empty). |
|
|
testb $0x2, %al |
|
|
testb $0x2, %al |
|
|
jnz seta20.1 |
|
|
jnz seta20.1 |
|
|
|
|
|
|
|
|
movb $0xd1, %al # 0xd1 -> port 0x64 |
|
|
movb $0xd1, %al # 0xd1 -> port 0x64 |
|
|
outb %al, $0x64 |
|
|
|
|
|
|
|
|
outb %al, $0x64 # 0xd1 means: write data to 8042's P2 port |
|
|
|
|
|
|
|
|
seta20.2: |
|
|
seta20.2: |
|
|
inb $0x64, %al # Wait for not busy |
|
|
|
|
|
|
|
|
inb $0x64, %al # Wait for not busy(8042 input buffer empty). |
|
|
testb $0x2, %al |
|
|
testb $0x2, %al |
|
|
jnz seta20.2 |
|
|
jnz seta20.2 |
|
|
|
|
|
|
|
|
movb $0xdf, %al # 0xdf -> port 0x60 |
|
|
movb $0xdf, %al # 0xdf -> port 0x60 |
|
|
outb %al, $0x60 |
|
|
|
|
|
|
|
|
outb %al, $0x60 # 0xdf = 11011111, means set P2's A20 bit(the 1 bit) to 1 |
|
|
|
|
|
|
|
|
movb $0xdf, %al # 0xdf -> port 0x60 |
|
|
|
|
|
outb %al, $0x60 |
|
|
|
|
|
|
|
|
movb $0xdf, %al # 0xdf -> port 0x60, do it again! |
|
|
|
|
|
outb %al, $0x60 # 0xdf = 11011111, means set P2's A20 bit(the 1 bit) to 1 |
|
|
|
|
|
|
|
|
# Switch from real to protected mode, using a bootstrap GDT |
|
|
# Switch from real to protected mode, using a bootstrap GDT |
|
|
# and segment translation that makes virtual addresses |
|
|
# and segment translation that makes virtual addresses |
|
|