54 lines
1.2 KiB
NASM
54 lines
1.2 KiB
NASM
DOSSEG
|
|
.MODEL LARGE
|
|
|
|
CRTL equ 4
|
|
ALT equ 8
|
|
DEL equ 53h
|
|
|
|
INTERCEPT equ 4f00h
|
|
|
|
WARM_BOOT_CODE equ 1234h
|
|
|
|
|
|
ROM_DATA SEGMENT AT 040h
|
|
org 17h
|
|
KB_FLAG LABEL BYTE
|
|
org 72h
|
|
WARM_BOOT_FLAG LABEL WORD
|
|
ROM_DATA ENDS
|
|
|
|
|
|
.CODE
|
|
ASSUME ds:nothing, es:nothing
|
|
.286
|
|
|
|
public _RebootSystem
|
|
_RebootSystem proc far
|
|
|
|
mov ax,3515h
|
|
int 21h ; Get int 15h vector in ES:BX
|
|
mov ax,es ; AX == Segment
|
|
or ax,bx ; Is this a NULL ptr
|
|
mov ax,seg ROM_DATA
|
|
mov ds,ax ; ds addresses ROM BIOS data area
|
|
assume ds:ROM_DATA
|
|
jz WarmBoot ; If zero we can't do an int 15h
|
|
|
|
DoInt15:
|
|
mov KB_FLAG,CRTL+ALT
|
|
mov ax,INTERCEPT OR DEL ; keyboard intercept, del key
|
|
int 15h ; Put Ctrl/Alt/Del into key buffer
|
|
|
|
WarmBoot:
|
|
cli
|
|
cld
|
|
|
|
mov WARM_BOOT_FLAG,WARM_BOOT_CODE
|
|
push 0ffffh
|
|
push 0
|
|
retf ; to processor power-on at ffff:0.
|
|
|
|
_RebootSystem ENDP
|
|
|
|
END
|