#undef ORB
+TEXT a20test(SB), $0
+ LONG $1234567
+
+TEXT a20check(SB), $0
+ MOVL $10000, CX
+_loop:
+ LEAL a20test(SB), AX
+ MOVL (AX), BX
+ ADDL $12345, BX
+ MOVL BX, (AX)
+ ORL $(1<<20), AX
+ MOVL (AX), AX
+ CMPL AX, BX
+ JNZ _done
+ LOOP _loop
+ RET
+_done:
+ /* return directly to caller of a20() */
+ ADDL $4, SP
+ XORL AX, AX
+ RET
+
TEXT a20(SB), $0
+ CALL a20check(SB)
+
+ /* try bios */
CALL rmode16(SB)
- CALL16(spllo(SB))
+ STI
LWI(0x2401, rAX)
BIOSCALL(0x15)
- JC _biosfail
CALL16(pmode32(SB))
- RET
-_biosfail:
- CALL16(pmode32(SB))
+ CALL a20check(SB)
- /* fast a20 */
+ /* try fast a20 */
MOVL $0x92, DX
INB
- ANDB $0xFE, AX
- ORB $0x02, AX
- OUTB
-
- /* slow a20 */
- CALL a20wait(SB)
- MOVL $0x64, DX
- MOVB $0xAD, AL
+ TESTB $2, AL
+ JNZ _no92
+ ORB $2, AL
+ ANDB $0xfe, AL
OUTB
+_no92:
+ CALL a20check(SB)
- CALL a20wait(SB)
+ /* try keyboard */
+ CALL kbdempty(SB)
MOVL $0x64, DX
- MOVB $0xD0, AL
+ MOVB $0xd1, AL /* command write */
OUTB
-
- CALL a20wait2(SB)
+ CALL kbdempty(SB)
MOVL $0x60, DX
- INB
- PUSHL AX
-
- CALL a20wait(SB)
+ MOVB $0xdf, AL /* a20 on */
+ OUTB
+ CALL kbdempty(SB)
MOVL $0x64, DX
- MOVB $0xD1, AL
+ MOVB $0xff, AL /* magic */
OUTB
+ CALL kbdempty(SB)
- CALL a20wait(SB)
- MOVL $0x60, DX
- POPL AX
- ORB $2, AL
- OUTB
+ CALL a20check(SB)
- CALL a20wait(SB)
- MOVL $0x64, DX
- MOVB $0xAE, AL
- OUTB
+ /* fail */
+ XORL AX, AX
+ DECL AX
+ RET
-TEXT a20wait(SB), $0
-_a20wait:
+TEXT kbdempty(SB), $0
+_kbdwait:
MOVL $0x64, DX
INB
TESTB $1, AL
- JZ _a20wait2
- RET
-
-TEXT a20wait2(SB), $0
-_a20wait2:
- MOVL $0x64, DX
+ JZ _kbdempty
+ MOVL $0x60, DX
INB
+ JMP _kbdwait
+_kbdempty:
TESTB $2, AL
- JNZ _a20wait
+ JNZ _kbdwait
RET