[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]