00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "checkbios.h"
00021
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <dos.h>
00025 #include <process.h>
00026 #include <stdlib.h>
00027
00028
00037 #define MAGIC_AUTO_UPLOAD "cmd /c upload.cmd"
00038
00039
00040 static void getFocus()
00041 {
00042 REGPACK regs;
00043 regs.r_ax = 0x1100 | 2;
00044 intr( 0xa0, ®s );
00045 }
00046
00047
00048 static void releaseFocus()
00049 {
00050 REGPACK regs;
00051 regs.r_ax = 0x1100 | 3;
00052 intr( 0xa0, ®s );
00053 }
00054
00055
00056 static int getBiosVersion()
00057 {
00058 REGPACK regs;
00059 regs.r_ax = 0x1300;
00060 intr(SYSTEM_INT, ®s);
00061
00062 return regs.r_ax;
00063 }
00064
00065
00066 static int getBootVersion()
00067 {
00068 REGPACK regs;
00069 regs.r_ax = 0x1200;
00070 intr(SYSTEM_INT, ®s);
00071
00072 return regs.r_ax;
00073 }
00074
00075
00076 static void getFeatures(int *ax, int *bx, int *dx)
00077 {
00078 REGPACK regs;
00079 regs.r_ax = 0x1600;
00080 intr(SYSTEM_INT, ®s);
00081
00082 *ax = regs.r_ax;
00083 *bx = regs.r_bx;
00084 *dx = regs.r_dx;
00085 }
00086
00087
00088 static int getIniString(char *section, char *item, char *target, int maxlen)
00089 {
00090 REGPACK regs;
00091
00092 regs.r_ax = 0x2400;
00093
00094 regs.r_cx = maxlen;
00095 regs.r_bx = FP_SEG(section);
00096 regs.r_si = FP_OFF(section);
00097
00098 regs.r_es = FP_SEG(item);
00099 regs.r_di = FP_OFF(item);
00100
00101 regs.r_ds = FP_SEG(target);
00102 regs.r_dx = FP_OFF(target);
00103
00104 intr(SYSTEM_INT, ®s);
00105
00106 return regs.r_ax;
00107 }
00108
00109
00116 static int getEquipment()
00117 {
00118 REGPACK regs;
00119 intr(0x11, ®s);
00120 return regs.r_ax;
00121 }
00122
00123
00127 static void trim(char *str)
00128 {
00129 char *head = str;
00130 char *tail = &str[strlen(str)-1];
00131 while (*head == ' ') head++;
00132 while (*tail == ' ') tail--;
00133
00134 ++tail = '\0';
00135 strcpy(str, head);
00136 }
00137
00138
00150 bool CheckBIOS()
00151 {
00152 if (getEquipment() != 0x013C) {
00153 printf( "This program only runs on an Beck IPC@Chip SC12.\n" );
00154 #ifdef MAGIC_AUTO_UPLOAD
00155 printf( "Trying to execute \""MAGIC_AUTO_UPLOAD"\"..\n");
00156 system(MAGIC_AUTO_UPLOAD);
00157 #endif
00158 return false;
00159 }
00160
00161 unsigned biosVersion = getBiosVersion();
00162 if (biosVersion < 0x0103) {
00163 printf( "You're using an outdated BIOS (%u.%02u).\n"
00164 "Please update your BIOS to at least v1.03b.\n",
00165 biosVersion >> 8, biosVersion & 255 );
00166 return false;
00167 }
00168
00169 unsigned bootVersion = getBootVersion();
00170 if (bootVersion < 0x0208) {
00171 printf( "You're using an outdated Bootstrap loader (%u.%02u).\n"
00172 "Please update your Bootstrap to at least v2.08.\n",
00173 bootVersion >> 8, bootVersion & 255 );
00174 return false;
00175 }
00176
00177 int ax, bx, dx;
00178 getFeatures(&ax, &bx, &dx);
00179 if ( !((ax & FEAT_AX_ETHERNET) &&
00180 (dx & FEAT_DX_I2C) &&
00181 (dx & FEAT_DX_HWAPI) &&
00182 (dx & FEAT_DX_RTOS) &&
00183 (dx & FEAT_DX_EXTDISK)) )
00184 {
00185 printf( "Your BIOS lacks some features that this program needs.\n"
00186 "Please use one of the medium (or better) BIOS versions.\n" );
00187 return false;
00188 }
00189
00190
00191 char str1[80], str2[80];
00192
00193 getIniString("SERIAL", "COM_DMA", str1, sizeof(str1));
00194 getIniString("SERIAL", "EXT_DMA", str2, sizeof(str2));
00195 trim(str1); trim(str2);
00196
00197 if (stricmp(str1, "DISABLE") || stricmp(str2, "DISABLE")) {
00198 printf( "This program makes extensive use of the DMA channels but\n"
00199 "they're currently in use by the BIOS. Please add the following\n"
00200 "lines to your chip.ini, and reboot your chip:\n"
00201 " [SERIAL]\n"
00202 " COM_DMA=DISABLE\n"
00203 " EXT_DMA=DISABLE\n"
00204 );
00205 return false;
00206 }
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 getIniString("STDIO", "STDIN", str1, sizeof(str1));
00217 getIniString("STDIO", "STDOUT", str2, sizeof(str2));
00218 trim(str1); trim(str2);
00219
00220 if (stricmp(str1, "TELNET") || stricmp(str2, "TELNET")) {
00221 printf( "This PCB layout is not compatible with console in/output on\n"
00222 "the serial ports. Please add the following lines to your\n"
00223 "chip.ini, and reboot your chip:\n"
00224 " [STDIO]\n"
00225 " STDIN=TELNET\n"
00226 " STDOUT=TELNET\n"
00227 );
00228 return false;
00229 }
00230
00231
00232
00233
00234 getFocus();
00235 atexit(releaseFocus);
00236
00237 return true;
00238 }
00239