home *** CD-ROM | disk | FTP | other *** search
- {
- 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.