]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/a20.s
merge
[plan9front.git] / sys / src / boot / pc / a20.s
1 #include "x16.h"
2
3 #undef ORB
4
5 TEXT a20test(SB), $0
6         LONG $1234567
7
8 TEXT a20check(SB), $0
9         MOVL $10000, CX
10 _loop:
11         LEAL a20test(SB), AX
12         MOVL (AX), BX
13         ADDL $12345, BX
14         MOVL BX, (AX)
15         ORL $(1<<20), AX
16         MOVL (AX), AX
17         CMPL AX, BX
18         JNZ _done
19         LOOP _loop
20         RET
21 _done:
22         /* return directly to caller of a20() */
23         ADDL $4, SP
24         XORL AX, AX
25         RET
26
27 TEXT a20(SB), $0
28         CALL a20check(SB)
29
30         /* try bios */
31         CALL rmode16(SB)
32         STI
33         LWI(0x2401, rAX)
34         BIOSCALL(0x15)
35         CALL16(pmode32(SB))
36
37         CALL a20check(SB)
38
39         /* try fast a20 */
40         MOVL $0x92, DX
41         INB
42         TESTB $2, AL
43         JNZ _no92
44         ORB $2, AL
45         ANDB $0xfe, AL
46         OUTB
47 _no92:
48         CALL a20check(SB)
49
50         /* try keyboard */
51         CALL kbdempty(SB)
52         MOVL $0x64, DX
53         MOVB $0xd1, AL  /* command write */
54         OUTB
55         CALL kbdempty(SB)
56         MOVL $0x60, DX
57         MOVB $0xdf, AL  /* a20 on */
58         OUTB
59         CALL kbdempty(SB)
60         MOVL $0x64, DX
61         MOVB $0xff, AL  /* magic */
62         OUTB
63         CALL kbdempty(SB)
64
65         CALL a20check(SB)
66
67         /* fail */
68         XORL AX, AX
69         DECL AX
70         RET
71
72 TEXT kbdempty(SB), $0
73 _kbdwait:
74         MOVL $0x64, DX
75         INB
76         TESTB $1, AL
77         JZ _kbdempty
78         MOVL $0x60, DX
79         INB
80         JMP _kbdwait
81 _kbdempty:
82         TESTB $2, AL
83         JNZ _kbdwait
84         RET