Date: Thu Feb 15 18:05:39 GMT 1990 To: Info-IBMPC@WSMR-SIMTEL20.ARMY.MIL From: Mike O'Carroll Subject: Reboot of PC The program below works in TurboC (or MS C). In some compilers, you have to fold the address to 20 bits, but here the segment and offset are separate. Mike O'Carroll, Microsystems Unit, University of Leeds, LS2 9JT, UK E-mail: @ukc.ac.uk:mike@ee.leeds.ac.uk UUCP: ...!mcsun!ukc!lena!mike or mike@lena.uucp ---cut-here--- #define MAGIC 0 /* for cold restart */ /* #define MAGIC 0x1234 /* for warm restart */ #define BOOT_SEG 0xffffL #define BOOT_OFF 0x0000L #define BOOT_ADR ((BOOT_SEG << 16) | BOOT_OFF) #define DOS_SEG 0x0040L #define RESET_FLAG 0x0072L #define RESET_ADR ((DOS_SEG << 16) | RESET_FLAG) main() { void ((far *fp)()) = (void (far *)()) BOOT_ADR; *(int far *)RESET_ADR = MAGIC; (*fp)(); return 0; /* never gets here, but keeps compiler happy */ }