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