mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
4.0 KiB
186 lines
4.0 KiB
#include "insignia.h"
|
|
#include "host_def.h"
|
|
#ifdef SECURE
|
|
#include "xt.h"
|
|
#include "config.h"
|
|
#endif
|
|
/*
|
|
* VPC-XT Revision 1.0
|
|
*
|
|
* Title : Bios bootstrap function
|
|
*
|
|
* Description : This function is called by the BIOS reset function, using
|
|
* the bop call, to load the first sector of DOS into memory
|
|
* and then jump to this loaded section.
|
|
*
|
|
* The bootstrap function uses other parts of the Bios. Since
|
|
* at the time this code is run it is impossible for anyone
|
|
* to have patched the interrupt vector table, you would have
|
|
* thought we could call the Bios C code directly (using bop()).
|
|
* However, this is only true if the C code we are calling does
|
|
* not use interrupts itself. The Bios disk/diskette code does
|
|
* of course use interrupts and hence we must call this via a
|
|
* software interrupt. It is therefore split into a number
|
|
* of functions order that the CPU can service the interrupt
|
|
* before procceeding to the next part.
|
|
*
|
|
* Software interrupts to the disk_io function are loaded
|
|
* into Intel memory by sas_init(), viz
|
|
*
|
|
* BOP bootstrap()
|
|
* INT disk_io()
|
|
* BOP bootstrap1()
|
|
* INT disk_io()
|
|
* BOP bootstrap2()
|
|
* INT disk_io()
|
|
* BOP bootstrap3()
|
|
*
|
|
* Author : Henry Nash
|
|
*
|
|
* Notes : The Jump to DOS is actually coded as an 8088 instruction
|
|
* in memory following the above BOPs.
|
|
*
|
|
*/
|
|
|
|
#ifdef SCCSID
|
|
static char SccsID[]="@(#)bootstrap.c 1.9 09/19/94 Copyright Insignia Solutions Ltd.";
|
|
#endif
|
|
|
|
#ifdef SEGMENTATION
|
|
/*
|
|
* The following #include define specifies the code segment into which this
|
|
* module will by placed by the MPW C compiler on the Mac II running
|
|
* MultiFinder.
|
|
*/
|
|
#include "SOFTPC_INIT.seg"
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
* O/S include files.
|
|
*/
|
|
#include <stdio.h>
|
|
#include TypesH
|
|
|
|
/*
|
|
* SoftPC include files
|
|
*/
|
|
#include "xt.h"
|
|
#include "bios.h"
|
|
#include "sas.h"
|
|
#include CpuH
|
|
|
|
#ifdef SECURE
|
|
LOCAL IBOOL boot_has_finished = FALSE;
|
|
GLOBAL void end_secure_boot IFN0()
|
|
{
|
|
boot_has_finished = TRUE;
|
|
}
|
|
GLOBAL IBOOL has_boot_finished IFN0()
|
|
{
|
|
return boot_has_finished;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* ============================================================================
|
|
* External functions
|
|
* ============================================================================
|
|
*/
|
|
|
|
void bootstrap()
|
|
{
|
|
/*
|
|
* First reset the disk and diskette.
|
|
*/
|
|
|
|
#ifdef SECURE
|
|
boot_has_finished = FALSE;
|
|
#endif
|
|
setAX(0); /* reset floppy */
|
|
setDX(0x80); /* drive 0 */
|
|
}
|
|
|
|
void bootstrap1()
|
|
{
|
|
/*
|
|
* Try and read the first sector off the diskette
|
|
*/
|
|
|
|
setAH(2); /* read */
|
|
setAL(1); /* 1 block */
|
|
#ifdef SECURE
|
|
if ((IBOOL) config_inquire(C_SECURE, NULL))
|
|
{
|
|
setDH(0); /* Head 0 */
|
|
setDL(0x80); /* on Hard Disk */
|
|
}
|
|
else
|
|
{
|
|
setDX(0); /* head 0 on drive 0 (floppy)*/
|
|
}
|
|
#else
|
|
setDX(0); /* head 0 on drive 0 (floppy)*/
|
|
#endif
|
|
setCX(1); /* track 0, sector 1 */
|
|
setES(DOS_SEGMENT); /* Load address */
|
|
setBX(DOS_OFFSET);
|
|
}
|
|
|
|
|
|
void bootstrap2()
|
|
{
|
|
/*
|
|
* If the Carry Flag is set then the previous read failed and we go and
|
|
* try the hard disk.
|
|
*/
|
|
|
|
if (getCF())
|
|
{
|
|
/*
|
|
* Load up the registers to call the disk routine that will load
|
|
* the first sector of DOS into memory. This ALWAYS resides on the
|
|
* first sector of the disk.
|
|
*/
|
|
|
|
setAH(2); /* Read sector */
|
|
setAL(1); /* 1 block */
|
|
setCH(0); /* Cylinder 0 */
|
|
setCL(1); /* Sector 1 */
|
|
setDH(0); /* Head 0 */
|
|
setDL(0x80); /* Hard disk */
|
|
setES(DOS_SEGMENT); /* Load address */
|
|
setBX(DOS_OFFSET);
|
|
}
|
|
}
|
|
|
|
void bootstrap3()
|
|
{
|
|
char *p;
|
|
char error_str[80];
|
|
|
|
if (getCF())
|
|
{
|
|
/*
|
|
* Write error on PC screen - assumes reset has positioned the
|
|
* cursor for us. Note that we can call the video using a BOP since
|
|
* the video code does not itself use interrupts.
|
|
*/
|
|
|
|
sprintf(error_str,"DOS boot error - cannot open hard disk file");
|
|
p = error_str;
|
|
while (*p != '\0')
|
|
{
|
|
setAH(14);
|
|
setAL(*p++);
|
|
bop(BIOS_VIDEO_IO);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* enable hardware interrupts before we jump to DOS
|
|
*/
|
|
|
|
setIF(1);
|
|
}
|