home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / asm / wasm / boot.asm < prev    next >
Assembly Source File  |  1988-03-06  |  4KB  |  146 lines

  1.  
  2.  Title 'Wolfware Sample Program', 'Computer Reboot'
  3.  
  4. ;=============================================================================
  5. ; Computer Reboot
  6. ;
  7. ; Carry out a cold (with memory check) or warm (without memory check) boot.
  8. ; A cold boot is just as if the computer has been turned off and then back
  9. ; on.  The memory will be checked for errors.  A warm boot is the same as
  10. ; pressing CTRL-ALT-DEL.  The memory is not checked for errors.  This program
  11. ; might be useful in a batch file that changes the system parameters and then
  12. ; must restart the computer.
  13. ;
  14. ; Examples:
  15. ;
  16. ;  BOOT warm
  17. ;    this will initiate a warm boot
  18. ;
  19. ;  BOOT cold
  20. ;    this will initiate a cold boot
  21. ;
  22. ; WARNING: All data in the computer will be lost, including that which is in
  23. ; memory resident programs or RAM disks.  Please save all data before 
  24. ; executing this program.
  25.  
  26.  Mov Si, Command_Line   ;get command line location
  27.  Lodsb                  ;load length and point to first byte
  28.  Or Al, Al              ;check if no parameter
  29.  Jz Main2
  30.  
  31.  Mov Cl, Al
  32.  Sub Ch, Ch             ;CX has byte count
  33.  
  34. ;--- skip preceding spaces in command line
  35.  
  36. Main1
  37.  Cmp Byte [Si], ' '     ;check if space
  38.  Jne Main3
  39.  Inc Si                 ;next byte
  40.  Loop Main1             ;loop back if more
  41.  
  42. ;--- illegal parameter
  43.  
  44. Main2
  45.  Mov Dx, Offset Error_Message   ;message
  46.  Mov Ah, 9                      ;DOS print function
  47.  Int 21h                        ;execute
  48.  
  49.  Mov Ax, 4cffh          ;exit with error code 255
  50.  Int 21h                ;execute
  51.  
  52. ;--- found start of parameter
  53.  
  54. Main3
  55.  Cmp Cx, 4              ;check if too few bytes
  56.  Jb Main2               ;jump if so, error
  57.  Je Main4               ;jump if same length
  58.  Mov Cx, 4              ;set to max length, ignore other characters
  59.  
  60. Main4
  61.  Push Cx
  62.  Push Si
  63.  
  64. ;--- check if cold parameter
  65.  
  66.  Mov Ax, Cold_Boot      ;cold boot flag
  67.  Mov Di, Offset Cold    ;check if cold message 
  68.  Call Cmp_Str           ;compare strings
  69.  Jz Main5               ;jump if equal, cold boot
  70.  
  71. ;--- not cold, check if warm parameter
  72.  
  73.  Pop Si
  74.  Pop Cx
  75.  
  76.  Mov Ax, Warm_Boot      ;warm boot flag
  77.  Mov Di, Offset Warm    ;check if warm message 
  78.  Call Cmp_Str           ;compare strings
  79.  Jnz Main2              ;jump if not equal, error
  80.  
  81. ;--- continue with reboot, reset flag in AX
  82.  
  83. Main5
  84.  Sub Bx, Bx
  85.  Mov Ds, Bx             ;segment zero
  86.  Mov Word [Reset_Flag], Ax ;set reset flag
  87.  
  88. ;--- the following code initializes the registers and is probably not needed,
  89. ;--- the "Intel iAPX 86/88, 186/188 User's Manual Programmer's Reference" says
  90. ;--- this is done by a hardware reset (through the RESET lines) and it does
  91. ;--- seem to work okay without it
  92.  
  93.  Sub Ax, Ax     ;zero to AX
  94.  Push Ax
  95.  Popf           ;clear all flags
  96.  
  97.  Mov Ds, Ax
  98.  Mov Es, Ax
  99.  Mov Ss, Ax     ;clear segment regs
  100.  
  101. ;--- initiate reboot, jump to first instruction
  102.  
  103.  Jmp 0, 0ffffh  ;branch to FFFF:0000
  104.  
  105. ;================================================
  106. ; Compare two (text) strings.
  107. ;  In: DI= string one; SI= string two, which is
  108. ;   converted to lower-case; CX= bytes to check.
  109. ;  Out: ZF= set if strings are equal.
  110.  
  111. Cmp_Str Proc Near
  112.  
  113. Cmpstr1
  114.  Or Byte [Si], 'a'-'A' ;make lower-case
  115.  Cmpsb          ;compare bytes
  116.  Jne Cmpstr2    ;jump if no match
  117.  Loop Cmpstr1   ;loop back if more to check
  118.  
  119. Cmpstr2
  120.  Ret
  121.  Endp           ;Cmp_Str
  122.  
  123. ;================================================
  124. ; Program data.
  125.  
  126. ;--- parameter data
  127.  
  128. Command_Line Equ 80h    ;offset of command line
  129. Cold Db 'cold'          ;cold parameter
  130. Warm Db 'warm'          ;warm parameter
  131.  
  132. ;--- reset flag data; note that since the flag's cleared value (cold boot) is
  133. ;--- is not defined in the BIOS data area, I used an abitrary number that is
  134. ;--- not equal to the set value; if the operating system or BIOS uses this
  135. ;--- variable for other purposes, doing a cold boot might cause unexpected
  136. ;--- results or a system crash
  137.  
  138. Reset_Flag Equ 0472h    ;memory offset, at segment 0
  139. Cold_Boot Equ 0000h     ;value to set if cold boot, <> WARM_BOOT
  140. Warm_Boot Equ 1234h     ;value to set if warm boot
  141.  
  142. ;--- error message
  143.  
  144. Error_Message Label Byte
  145.  Db 'BOOT: usage is BOOT WARM or BOOT COLD',13,10,'$'
  146.