[Back to DOS SWAG index] [Back to Main SWAG index] [Original]

    ;-------------------------
    ; REBOOT.ASM   ver 192.5.1beta  ;-)
    ; Public domain from James Vahn, flush routines from Tim Arheit.
    ; "oh no!!" idea stolen from David Kirschbaum.

    cseg segment
    assume cs:cseg,ds:cseg
    org 100h

    Begin:
            mov cx,100d             ;close everything in sight
    Close_Lup:                      ;Loop to close first 100 possible
            mov ah,03Eh             ;open files.
            mov bx,cx
            int 21h
            loop Close_Lup

            mov ax,cs               ;Set DS to code segment.
            mov ds,ax
            mov ax,5D01h            ;Flush buffers and update directory
            mov dx,offset Params    ;entries. This call may have problems
            int 21h                 ;under OS/2 and DR-DOS..

            mov ah,0Dh              ;DOS flush file buffers.
            int 21h                 ;Most cache programs catch this call.

            mov ah,21h              ;flush for QCASHE
            int 13h

            mov ah,0A1h             ;flush for PC Kwik, PC-Cache v5
            mov si,4358h            ;Qcache v4
            int 13h

            mov ax,0FFA5h           ;flush for PC-Cache v6+
            mov cx,0DDDDh
            int 16h

            mov ax,0FE03h           ;flush for Norton Utilities NCACHE
            mov di,"NU"
            mov si,"CF"
            int 2Fh

            mov ax,4A10h            ;flush for SMARTDRV v4.00+ -API
            mov bx,0002h
            int 2Fh

    ;-----------------
    ; Flushed. On with the resetting..
    ;
            mov ax,40h              ;Set ES to BIOS data area.
            mov es,ax
            mov word ptr es:[72h],1234h   ;Remove this for cold boot.

    ;-----------------
    ; First attempt at a reset. If 15/4F isn't supported, hopefully
    ; no harm will come.
    ;
            mov dl,byte ptr es:[17h]
            or  byte ptr es:[17h],0Ch     ;Simulates CTRL-ALT-DEL
            mov ax,4F53h                  ;on some machines. PS/2?
            int 15h
            mov byte ptr es:[17h],dl

    ;-----------------
    ; Second attempt. This jumps to 'Beep' via the CMOS shutdown byte
    ; and resets via the 8042 keyboard interface chip if present.
    ;
            mov ax,cs                         ;Set DS to code segment.
            mov ds,ax
            mov word ptr es:[69h],ax          ;Prepare BIOS for PM
            mov word ptr es:[67h],offset Beep ; style reset.
            mov al,0Fh
            out 70h,al
            call Delay
            mov al,0Ah                    ;Set CMOS for BIOS JMP.
            out 71h,al
            call Delay
            mov al,0FEh                   ;Reset via 8042
            out 64h,al
            call Delay

    ;------------------
    ; Failed.. No 8042!  Ye olde standard reboot. If CMOS is present,
    ; this will also jump to Beep.

            db  0EAh,0h,0h,0FFh,0FFh       ;jmp FFFF:0000

    ;------------------
    ; Delay routine, approx 1/18.2 seconds
    ;
    Delay:
            push    ds
            mov     ax,0040h
            mov     ds,ax
            mov     al,ds:[006Ch]
       lo1: cmp     al,ds:[006Ch]
            je      lo1
            pop     ds
            ret

    ;------------------
    ; If successful, the CMOS shutdown byte will cause a jump to here,
    ; making a tone and resetting via a triple exception error.
    ;
    Beep:
            push cs
            pop ds

            mov ax,0E07h            ; Make a Beep.
            int 10h

            mov al,0B6h             ; Make another Beep.
            out 43h,al
            in al,61h
            or al,3h
            out 61h,al
            mov al,82h
            out 42h,al
            mov al,9h
            out 42h,al
            mov cx, 02000h
      lo2:  in al,04Fh
            loop lo2
    .286p
            lidt fword ptr cs:Table       ; Forces a CPU reset.
            int 0
     Table  df 0
     msg    db 'Oh no!!!$'
     Params db 0                          ; Dynamic, 22 bytes.

    cseg ends
    end Begin

    { ----------------------   CUT -------------------------------}

    Cut the following to a seperate file.  Name it REBOOT.XX
    Use XX3402 to decode the following if you do not have TASM to build
    the above code.  The COM file will be created.

    example :  XX3402 D reboot.xx

    *XX3402-000212-190296--72--85-20361------REBOOT.COM--1-OF--1
    iKE+h1u9qQoVsjWAm6vMi+3RihA-nG4o1QoVh05B2vGVjZV1nFCsdTytrRrB3fU1zfxJHft4
    Ewoji--8ik6+nGysE+0Ck0P5-b6+B-6aWVML+0O+1VQ+19VHHwoJ7cUK3k0Am6vM7eBd+0P5
    -aQ+b+4k1yNku-A+g+faQSUA+91ytaHc-E1e++1zzlusE+0Cq8-g+1c4P+-oyVz11Vys-kvB
    290qtYDYMEk1ta4kUiN0g+baEfY+6CFDsjki1k2Sl+5B+++++++++2xc64tj6G2V7+++
    ***** END OF BLOCK 1 *****

[Back to DOS SWAG index] [Back to Main SWAG index] [Original]