ref: 293243fe8380b6c9f5d6215dcff72a378175aaa4
parent: cdaa6b4dc96f6b425861de16d01f26332834c7e2
author: cinap_lenrek <cinap_lenrek@localhost>
date: Tue Apr 12 19:43:22 EDT 2011
9boot a20 gate
--- /dev/null
+++ b/sys/src/boot/pc/a20.s
@@ -1,0 +1,67 @@
+#include "x16.h"
+
+#undef ORB
+
+TEXT a20(SB), $0
+ CALL rmode16(SB)
+ STI
+ LWI(0x2401, rAX)
+ BIOSCALL(0x15)
+ JC _biosfail
+ CLI
+ CALL16(pmode32(SB))
+ RET
+
+_biosfail:
+ LWI((0x0E00|'!'), rAX)
+ BIOSCALL(0x10);
+
+ CLI
+ CALL16(pmode32(SB))
+
+ CALL a20wait(SB)
+ MOVL $0x64, DX
+ MOVB $0xAD, AL
+ OUTB
+
+ CALL a20wait(SB)
+ MOVL $0x64, DX
+ MOVB $0xD0, AL
+ OUTB
+
+ CALL a20wait2(SB)
+ MOVL $0x60, DX
+ INB
+ PUSHL AX
+
+ CALL a20wait(SB)
+ MOVL $0x64, DX
+ MOVB $0xD1, AL
+ OUTB
+
+ CALL a20wait(SB)
+ MOVL $0x60, DX
+ POPL AX
+ ORB $2, AL
+ OUTB
+
+ CALL a20wait(SB)
+ MOVL $0x64, DX
+ MOVB $0xAE, AL
+ OUTB
+
+TEXT a20wait(SB), $0
+_a20wait:
+ MOVL $0x64, DX
+ INB
+ TESTB $1, AL
+ JZ _a20wait2
+ RET
+
+TEXT a20wait2(SB), $0
+_a20wait2:
+ MOVL $0x64, DX
+ INB
+ TESTB $2, AL
+ JNZ _a20wait
+ RET
--- a/sys/src/boot/pc/l.s
+++ b/sys/src/boot/pc/l.s
@@ -111,13 +111,6 @@
ANDL $0xFFFF, AX
RET
-TEXT a20(SB), $0
- CALL rmode16(SB)
- STI
- LWI(0x2401, rAX)
- BIOSCALL(0x15)
- JMP _pret32
-
#ifdef PXE
TEXT pxecallret(SB), $0
--- a/sys/src/boot/pc/mkfile
+++ b/sys/src/boot/pc/mkfile
@@ -36,7 +36,7 @@
$LD -o $target -H3 -T0x0600 -l $prereq
ls -l $target
-9boot&: l%.$O %.$O sub.$O
+9boot&: l%.$O %.$O sub.$O a20.$O
$LD -o $target -H3 -T0x7c00 -l $prereq
ls -l $target
@@ -59,7 +59,7 @@
touch tmp/baz
touch tmp/386aaa
mkdir tmp/386
- cp /386/9bootiso tmp/386
+ cp 386/9bootiso tmp/386
cp /386/9pc tmp/386
cp /386/9pcload tmp/386
cp /386/9pcf tmp/386
--
⑨