[comp.os.minix] Minix on the 6300+

clark@ihlpf.ATT.COM (Clark) (02/22/88)

This is a query for a friend of mine who doesn't have a Net
feed.

Has anybody gotten minix to run on the AT&T 6300+?  Looking
at Dr. T's list of 'puters on which Minix has been made to
run, I don't see the 6300+ mentioned one way or the other.

So, I thought I'd look to the incredible pool of expertise
that the Net represents for help.  Has anybody out there
addressed this issue before?

Ed Clark
AT&T Bell Labs
...!ihnp4!ihlpf!clark

kav@ihlpa.ATT.COM (Vangness) (02/23/88)

Minix is alive and well on the AT&T 6300+. The following are
the necessary modifications to Minix 1.2 to get it working.
I don't have diffs against the 1.2 sources here but the changes
are small and obvious from the following instructions.
The major problems with the 6300+ and Minix are:

1) The 6300+ looks like an AT when Minix reads it's BIOS, but
   the 6300+ looks more like an XT hardware-wise (the HD interrupt
   is at the XT address not the AT address for example).

2) The transfer rate port for the floppy is at a different port
   address on the 6300+ than the AT.

3) The HD parameters read from the parameter vector are garbage.
   

The following fixes solve the above problems.
------------------------------------
kernel/main.c:
	1) Before main, add the following line:

	   extern	int scan_code;

	2) At the point where the machine type is determined i.e,

	   if (t == PC_AT) pc_at = TRUE;

	   Modify it as follows:

	   /*
	    * AT&T 6300+ looks like an AT but the hardware is
	    * more like an XT. If scan_code is 13 (olivetti '=')
	    * and it looks like an AT then it is a 6300+ so set
	    * pc_at to FALSE.
	    */
	   if ((t == PC_AT) && (scan_code != 13)) {
		pc_at = TRUE;
	   } else {
		pc_at = FALSE;
	   }


kernel/floppy.c:

	1) Before main, add the following:

	   #define	ATTFDC_RATE       0x065    
	   extern	int	scan_code;

	2) In transfer() at about line 457 where the FDC rate
	   is set i.e.:

  /* The PC-AT requires the date rate to be set to 250 or 500 kbps */
  port_out(FDC_RATE, rate[d]);
	   
	    Modify it as follows:
  /* The PC-AT requires the date rate to be set to 250 or 500 kbps */
  if (pc_at) {
	  port_out(FDC_RATE, rate[d]);
  } else if (scan_code == 13) {
	  port_out(ATTFDC_RATE, rate[d]);
  }

	   Note that this change implys that all olivetti type
	   machines (6300+ and the 6300) will also have rate[d]
	   output to ATTFDC_RATE. This causes no problems on the
	   6300 I have at work, although I'm not sure what is at
	   port ATTFDC_RATE on the 6300.


  kernel/xt_wini.c:
	My fixes to xt_wini are not very elegant: I hard code
	the drive parameters for the ST225 drive (which the
	6300+ comes with). The parameters in memory pointed
	to by the parameter vector appear to be garbage. I
	seem to remember someone mentioning that Minix gets
	loaded over this section of memory on some PCs. I guess
	the real solution for the 6300+ would be to move Minix
	so that it isn't loaded over this parameter table. Does
	anyone have any ideas on this? Until then, the following
	changes to xt_wini.c work fine on the 6300+ and
	don't affect other machines.

	1)  Before main add the following:

	    extern	int scan_code;

	2) In init_parms at about line 740 add the following new code:

#if AUTO_BIOS
  /* close up the code to be executed when the controller has not been
   * set up to for auto configuration */
  }
#endif
	/* New code follows. */
	/* Hard code parameters for AT&T 6300+ */
	if (scan_code == 13) {
		param0.nr_heads = 4;
		param0.nr_cyl = 612;
		param0.reduced_wr = 613;
		param0.wr_precomp = 256;
		param0.max_ecc = 11;
	}
	/* End new code */
  /* Set the parameters in the drive structure */
  for (i = 0; i < DEV_PER_DRIVE; i++) {
	wini[i].wn_heads = param0.nr_heads;
	wini[i].wn_ctrl_byte = param0.ctrl_byte;
	wini[i].wn_drive = 0 << 5;	/* Set drive number */
  }


------------------------------------



  Thats all there is to it! Sorry I don't have diffs against the
  1.2 sources. 


  I have also been playing around with Jim Paradis' RS232 driver.
  I had noticed that the overhead of sitting in the interrupt
  routine grabbing characters was causing everything else on the
  system to come to a dead halt. I decided to make the interrupt
  routine only process 1 character, and I tried to make the
  interrupt routine as fast as possible. I ripped out all code
  pertaining to more than 1 COM port, and merged the two
  functions ser_int and ser_doint into one routine. This made
  1200 baud very smooth and nice on my 6300+. Only bad news
  is that my 6300 at work looses characters with this strategy
  so I imagine all but AT type machines will be unable to
  use this method. Maybe if ser_int was coded in assembler
  for speed?


		Kurt Vangsness
		AT&T Bell Laboratories - Naperville, Ill
		ihnp4!ihlpa!kav