[comp.os.minix] Minix runs on PC230 + Bios_wini.c patch

cagney@chook.ua.oz (Andrew Cagney - aka Noid) (04/24/89)

OK I and others from Micro Byte have got minix running on a PC230 using
the hard disk driver bios_wini.c with the patch below applied.

The patch is to the initialization so that bios_wini.c gets the correct
number of "heads" etc on the hard disk device.

The code is much simpler than that of all the other xx_init_param routines.
It gets the disk parameters by using a bios call. (looking up the disk tables
directly was the cause of the problem on a pc230)

Notes:
	- This was tested using a 1.3b hybrid minix.
	- The tty driver works but how well we can not say until we finaly
	  get proper 1.3 minix with out any software bugs. More on this later.
	- A PC230 uses a SCSI interface for its disk drives. Micro Byte
	  are currently writing a SCSI driver for MINIX! When finished it will
	  be posted.
	- a PC230 is an Australian IBM-PC Look a like made here by
	  Micro Byte INC. It is not a direct clone.

					Andrew Cagney.

--------------------- cut here --------------------------------------
*** bios_wini.new	Tue Apr 25 00:46:44 1989
--- bios_wini.c	Tue Jan 17 14:43:31 1989
***************
*** 20,28 ****
   *
   *	 winchester_task:	main entry when system is brought up
   *
-  *	Changes:
-  *		- April 25th 89, Andrew Cagney: Add routine bios_init_params
-  *		  to initialise parameter tables using bios tables.
   */
  
  #include "../h/const.h"
--- 20,25 ----
***************
*** 116,129 ****
  	/* Initialize each drive at the moment it is first used. */
  	if (initialized[drive] == FALSE) {
  		if (putback++ == 0) replace();
! #ifdef PC_230
! 		bios_init_params(drive);
! #else
! 		if (pc_at /*|| ps (removed to get round a bug TN*/)
  			at_init_params(drive);
  		else
  			xt_init_params(drive);
- #endif
  		initialized[drive] = TRUE;
  	}
  
--- 109,118 ----
  	/* Initialize each drive at the moment it is first used. */
  	if (initialized[drive] == FALSE) {
  		if (putback++ == 0) replace();
! 		if (pc_at || ps)
  			at_init_params(drive);
  		else
  			xt_init_params(drive);
  		initialized[drive] = TRUE;
  	}
  
***************
*** 197,265 ****
    c3 = ((unsigned) wn->wn_sector) + 1;
    Cx = c1 | c2 | c3;
    Dx = (wn->wn_head<<8) | wn->wn_drive;
- 
    bios13();
- 
    r = (Ax >> 8) & 0xFF;
    return(r == 0 ? BLOCK_SIZE : EIO);
  }
  
- /*============================================================================*
-  *				bios_init_params			      *
-  *===========================================================================*/
- PRIVATE bios_init_params(drive)
- int drive;
- {
- /* This routine is called at startup to initialize the partition table,
-  * the number of drives and the controller
-  */
-   unsigned int i;
-   int nr_heads, nr_sec, nr_cyl;
-   extern phys_bytes umap();
  
-   /* Get the number of drives from the bios */
-   phys_copy(0x475L, umap(proc_addr(WINCHESTER), D, buf, 1), 1L);
-   nr_drives = (int) *buf > MAX_DRIVES ? MAX_DRIVES : (int) *buf;
- 
-   Ax = 0x0800; /* Get Current Drive Parameters */
-   Dx = DRIVE+drive; /* select the drive ???? */
-     
-   bios13();
-     
-   if (((Ax >> 8) & 0xff) != 0) { 
-     printf("Unable to get drive parameters for drive %d\n",drive);
-     delay();
-     return;
-   }
-   nr_heads = ((Dx >> 8) & 0xff)+1; /* DH = hr sides or heads */
-   nr_sec = Cx &0x3f; /* Cl = nr sectors */
-   nr_cyl = ((Cx >> 8) & 0xff) + ((Cx & 0xc0) << 2) + 1; /* cH = Nr cylinders  */
-   
-   /* Set the parameters in the drive structure */
-   for (i = drive*DEV_PER_DRIVE; i < ((drive+1)*DEV_PER_DRIVE); i++) {
- 	wini[i].wn_heads = nr_heads;
- 	wini[i].wn_maxsec = nr_sec;
- 	wini[i].wn_drive = DRIVE + drive;
- 	wini[i].wn_low = 0L;
- 	wini[i].wn_size = (long)((long)nr_cyl * 
- 				   (long)nr_heads * (long)nr_sec);
-   }
- 
-   /* Read the partition table for this drive and save it. */
-   w_extra.DEVICE = drive * DEV_PER_DRIVE;
-   w_extra.POSITION = 0L;
-   w_extra.COUNT = BLOCK_SIZE;
-   w_extra.ADDRESS = (char *) buf;
-   w_extra.PROC_NR = WINCHESTER;
-   w_extra.m_type = DISK_READ;
-   if (w_do_rdwt(&w_extra) != BLOCK_SIZE) {
- 	printf("Can't read partition table of winchester %d\n", drive);
- 	delay();
- 	return;
-   }
-   copy_prt(drive * DEV_PER_DRIVE);
- }
- 
  /*===========================================================================*
   *				at_init_params				     *
   *===========================================================================*/
--- 185,196 ----