summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/coldboot.asm
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/coldboot.asm')
-rwxr-xr-xreference/C/CONTRIB/SNIP/coldboot.asm42
1 files changed, 42 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/coldboot.asm b/reference/C/CONTRIB/SNIP/coldboot.asm
new file mode 100755
index 0000000..828c79d
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/coldboot.asm
@@ -0,0 +1,42 @@
+; by: David Nugent via ECPROG echo
+;
+; works VERY reliably under all the protected mode environments I've
+; tried (namely DV and PC-MOS). Haven't tried VM386 or NX386 yet, but
+; I'm hopeful.... ;-)
+
+
+BIOS_POST equ 0472H ; POST (warm boot) flag
+
+
+ xor BX,BX ; AL=1 for warm boot, 0 for cold
+ mov ES,BX
+ cmp AL,1
+ jnz @NcB
+ mov AX,1234H ; Avoid POST
+@NcB:
+ mov ES:[BIOS_POST],AX ; Install flag
+
+ cli ; Reboot
+ xor AX,AX
+ mov DS,AX
+ mov ES,AX
+ mov SS,AX
+ mov SP,AX
+@cP:
+ in AL,64H ; Wait on AT keyboard controller
+ test AL,2
+ jne @cP
+
+ xor AL,AL ; Try reset lines
+ out 64H,AL
+ iodelay
+ mov AL,0FEh
+ out 64H,AL
+ iodelay
+ mov AX,0002H ; Jump to reset vector
+ push AX ; via IRET
+ mov AX,0F000H
+ push AX
+ mov AX,0FFF0H
+ push AX
+ iret