]> git.saurik.com Git - apple/boot.git/blob - i386/boot1/gonext.c
0fb0d8bf826b9435ab536e3601242b884fdd1c44
[apple/boot.git] / i386 / boot1 / gonext.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.1 (the "License"). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24 #include <bios.h>
25 #include <dos.h>
26 #include <stdio.h>
27
28 char bufold[512];
29
30 int main(int argc, char *argv[])
31 {
32 void far (*reset)();
33 #define CMD 2
34 #define DRIVE 0x80
35 #define HEAD 0
36 #define TRACK 0
37 #define SECT 1
38 #define NSECT 1
39 int result, i;
40 int found;
41 unsigned char *p1, *p2, key;
42 int softReboot=0;
43 int dontAsk=0;
44
45 for (i=1; i<argc; i++)
46 {
47 if (!strcmp(argv[i],"-dontask")) dontAsk=1;
48 else if (!strcmp(argv[i],"-soft")) softReboot=1;
49 }
50
51 if (!dontAsk)
52 {
53 printf("Do you want to reboot into NEXTSTEP?\n");
54 printf(" (This will immediately terminate all processes!)\n");
55 key = bioskey(0);
56 if (!(key=='y' || key=='Y'))
57 {
58 printf("Cancelled\n");
59 exit(0);
60 }
61 }
62
63 result = biosdisk(CMD,DRIVE,HEAD,TRACK,SECT,NSECT,bufold);
64 if (result != 0)
65 { printf("Couldn't read bootsectorread\n");
66 exit(0);
67 }
68
69 p1 = bufold + 445;
70
71 if (*p1 != 0xa7)
72 {
73 printf("GONEXT can only work if NeXT's BOOT0 bootsector"
74 " is installed.\n");
75 exit(0);
76 }
77
78 found = 0;
79 p1=bufold + 446;
80 for (i=0; i<4; i++)
81 { p2 = p1 + (i*16) + 4;
82 if (*p2 == 0xa7)
83 { found=1;
84 break;
85 }
86 }
87
88 if (!found)
89 { printf("No NEXTSTEP partition installed\n");
90 exit(0);
91 }
92
93 /* now do the proper CMOS write! */
94
95
96 outportb(0x70,6); /* select */
97 key = inportb(0x71);
98 key |= 0x10;
99 outportb(0x70,6); /* select */
100 outportb(0x71,key);
101
102 if (softReboot) geninterrupt(0x19);
103 else
104 {
105 printf("'Scuse me while I kiss the sky!\n");
106 reset = MK_FP(0xf000,0xfff0);
107 reset();
108 geninterrupt(0x19); /* try again - shouldn't get here */
109 }
110
111 printf("Reboot failed\n");
112 return -1; /* you never get here */
113 }