TEXT pmode32(SB), $0
CLI
- /* disable nmi */
- PUSHA
- LWI(0x70, rDX)
- INB
- ANDB $0x7F, AL
- OUTB
- POPA
-
/* get return pc */
POPR(rDI)
JMP _segret
TEXT rmode16x(SB), $0
- /* reload idt */
- SEGSS; LIDT(tidtptr(SB))
-
/* disable protected mode */
MFCR(rCR0, rCX)
ANDB $0xfe, CL
WORD $(5*8)
LONG $tgdt(SB)
-TEXT tidtptr(SB), $0
- WORD $0x3ff
- LONG $0
-
TEXT jump(SB), $0
MOVL 4(SP), AX
JMP *AX
_halt:
JMP _halt
-TEXT spllo(SB), $0
- /* enable nmi */
- PUSHA
- LWI(0x70, rDX)
- INB
- ORB $0x80, AL
- OUTB
- POPA
-
- STI
- RET
-
TEXT getc(SB), $0
CALL rmode16(SB)
- CALL16(spllo(SB))
+ STI
MOVB $0x00, AH
BIOSCALL(0x16)
_getcret:
TEXT gotc(SB), $0
CALL rmode16(SB)
- CALL16(spllo(SB))
+ STI
MOVB $0x01, AH
BIOSCALL(0x16)
JNZ _getcret
TEXT putc(SB), $0
MOVL 4(SP),AX
CALL rmode16(SB)
- CALL16(spllo(SB))
+ STI
MOVB $0x0E, AH
BIOSCALL(0x10)
_pret32:
ANDL $0xFFFF, AX
RET
+TEXT usleep(SB), $0
+ MOVL t+4(SP), AX
+ PUSHL AX
+ CALL rmode16(SB)
+ STI
+ POPR(rDX)
+ POPR(rCX)
+ MOVB $0x86, AH
+ BIOSCALL(0x15)
+ JMP _pret32
+
#ifdef PXE
+TEXT pxeinit(SB), $0
+ CALL rmode16(SB)
+
+ /* get pxe env structure in ES:BX */
+ LWI(0x5650, rAX)
+ BIOSCALL(0x1A)
+ JC _pret32
+
+ /* !PXE or PXEENV+ signature */
+ SEGES; LXW(0, xBX, rAX)
+ CMPI((('!'<<0)|('P'<<8)), rAX)
+ JEQ _getentry
+ CMPI((('P'<<0)|('X'<<8)), rAX)
+ JNE _pret32
+
+ SEGES; LXW(0x2A, xBX, rAX)
+ SEGES; LXW(0x28, xBX, rBX)
+ MTSR(rAX, rES)
+
+_getentry:
+ SEGES; LXW(0x12, xBX, rAX)
+ SW(rAX, pxepseg(SB))
+ SEGES; LXW(0x10, xBX, rAX)
+ SW(rAX, pxepoff(SB))
+ CLR(rAX)
+ JMP _pret32
+
TEXT pxecallret(SB), $0
ADDI(6, rSP)
JMP _pret32
PUSHR(rCX)
PUSHI(pxecallret(SB))
- /* get pxe env structure in ES:BX */
- LWI(0x5650, rAX)
- BIOSCALL(0x1A)
- JC _farret
-
- /* !PXE or PXEENV+ signature */
- SEGES; LXW(0, xBX, rAX)
- CMPI((('!'<<0)|('P'<<8)), rAX)
- JEQ _getentry
- CMPI((('P'<<0)|('X'<<8)), rAX)
- JNE _farret
-
- SEGES; LXW(0x2A, xBX, rAX)
- SEGES; LXW(0x28, xBX, rBX)
- MTSR(rAX, rES)
-
-_getentry:
- SEGES; LXW(0x12, xBX, rAX)
+ LW(pxepseg(SB), rAX)
PUSHR(rAX)
- SEGES; LXW(0x10, xBX, rAX)
+ LW(pxepoff(SB), rAX)
PUSHR(rAX)
- CALL16(spllo(SB))
+ STI
CLR(rAX)
CLR(rBX)
CLR(rDX)
CLR(rDI)
CLR(rSI)
-_farret:
FARRET
+TEXT pxepseg(SB), $0
+ WORD $0
+TEXT pxepoff(SB), $0
+ WORD $0
+
#else /* PXE */
/*
MOVW 10(SP), BX
MOVL 12(SP), SI
CALL rmode16(SB)
- CALL16(spllo(SB))
+ STI
CALL16(readsect16(SB))
CALL16(pmode32(SB))
ANDL $0xFFFF, AX