[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]
{
Rebooting in itself is rather easy to do...call the right interrupt with
the right values and you go it--most of the time. I'd noticed that any
reboot I tried to do from my program under windows would fail. I'm not a
windows programmer and seldom use it, but I do have one program that needs
to be able to call this routine under certain conditions. A clean reboot
is favored to a lock up or data corruption. I searched for pascal source
to work under win, but found none. I finally ran into a short .com file
which did in fact work. I ran the code through a .com to pas inline
conversion utility and ended up with pages of ugly code. I finally got
around to converting it into inline assembly code which shortened things up
substantially (10 pages or so-the inline tranlsation was bad, loops were
iterative/non existant). I then killed the code not necessary for pascal,
and this is what I ended up with:
}
UNIT BOOTSYS;
(* Unit for unconditional reboot (TESTED UNDER DOS 5/6 & WIN 3.0/3.1) *)
(* (C) Copyright 1993 Frank Young, all rights reserved *)
INTERFACE
PROCEDURE REBOOT;
IMPLEMENTATION
Procedure Reboot; Assembler;
ASM
MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV SS,AX
MOV SP,030Dh
MOV BYTE PTR [00FFh],00
@LOOP1:
CALL @LOOP3
MOV AH,4Ch
INT 21h
JMP @LOOP1
MOV CX,250
@LOOP2:
ADD [BX+SI],AL
LOOP @LOOP2
ADD DL,BH
@LOOP3:
MOV AX,0040h
MOV DS,AX
MOV BX,0072h
MOV WORD PTR [BX],1234h
@LOOP4:
IN AL,64h
TEST AL,02h
JNZ @LOOP4
MOV AL,0D1h
OUT 64,AL
XOR AL,AL
OUT 64,AL
STI
MOV CX,0003h
@LOOP5:
MOV AX,[$006C]
@LOOP6:
CMP AX,[$006C]
JZ @LOOP6
LOOP @LOOP5
CLI
IN AL,60h
XOR AX,AX
MOV DS,AX
MOV ES,AX
MOV SS,AX
MOV SP,AX
MOV AX,0062h
CLI
PUSH AX
MOV AX,$F000
PUSH AX
MOV AX,$FFF0
PUSH AX
XOR AX,AX
IRET
end;
end.
[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]