[comp.os.minix] Turbo C diff's for Minix 1.2; here they are ! Part 2 of 9

evas@euraiv1.UUCP (10/02/87)

Here is part 2 of 9:						Eelco van Asperen.


echo Extracting kernel/mpx88.dif
sed 's/^X//' > kernel/mpx88.dif << '+ END-OF-FILE 'kernel/mpx88.dif
X12c12
X< ; restart, to run the process or task whose number is in 'cur_proc'.
X---
X> ; _restart, to run the process or task whose number is in 'cur_proc'.
X23c23
X< ;   restart:	start running a	task or	process
X---
X> ;   _restart:	start running a	task or	process
X34a35
X> WINCHESTER	EQU -6
X38,39c39,41
X< PUBLIC $main, tty_int, lpr_int,	clock_in, disk_int
X< PUBLIC s_call, surprise, trp, divide, restart
X---
X> PUBLIC $main, _tty_int, _lpr_int,	_clock_int, _disk_int
X> public _wini_int
X> PUBLIC _s_call, _surprise, _trp, _divide, _restart
X43,44c45,46
X< EXTRN main:NEAR,  sys_call:NEAR, interrup:NEAR,	keyboard:NEAR
X< EXTRN panic:NEAR, unexpect:NEAR, trap:NEAR, div_trap:NEAR, pr_char:NEAR
X---
X> EXTRN _main:NEAR,  _sys_call:NEAR, _interrupt:NEAR,	_keyboard:NEAR
X> EXTRN _panic:NEAR, _unexpected_int:NEAR, _trap:NEAR, _div_trap:NEAR, _pr_char:NEAR
X48,50c50,52
X< PUBLIC sizes, brksize, splimit,	@end
X< EXTRN  cur_proc:WORD, proc_ptr:WORD, int_mess:WORD
X< EXTRN  scan_cod:WORD, k_stack:WORD
X---
X> PUBLIC _sizes, _brksize, _splimit,	__end
X> EXTRN  _cur_proc:WORD, _proc_ptr:WORD, _int_mess:WORD
X> EXTRN  _scan_code:WORD, _k_stack:WORD
X69,70c71,72
X< @CODE	SEGMENT
X< 	assume	cs:@code,ds:dgroup
X---
X> _TEXT	SEGMENT
X> 	assume	cs:_TEXT,ds:dgroup
X87,90c89,92
X< 	mov dgroup:scan_cod,bx		; save scan code for '=' key from bootstrap
X< 	mov sp,offset dgroup:k_stack	; set sp to point to the top of	the
X< 	add sp,K_STACK_BYTES		; kernel stack
X< 	call main		; start	the main program of Minix
X---
X> 	mov dgroup:_scan_code,bx		; save scan code for '=' key from bootstrap
X> 	mov sp,offset dgroup:_k_stack	; set sp to point to the top of	the
X> 	add sp,K_STACK_BYTES		; kernel stack
X> 	call _main		; start	the main program of Minix
X98,106c100,108
X< s_call:				; System calls are vectored here.
X< 	call save		; save the machine state
X< 	mov bp,dgroup:proc_ptr	; use bp to access sys call parameters
X< 	push 2[bp]		; push(pointer to user message)	(was bx)
X< 	push [bp]		; push(src/dest) (was ax)
X< 	push dgroup:cur_proc	; push caller
X< 	push 4[bp]		; push(SEND/RECEIVE/BOTH) (was cx)
X< 	call sys_call		; sys_call(function, caller, src_dest, m_ptr)
X< 	jmp restart		; jump to code to restart proc/task running
X---
X> _s_call:				; System calls are vectored here.
X> 	call save		; save the machine state
X> 	mov bp,dgroup:_proc_ptr	; use bp to access sys call parameters
X> 	push 2[bp]		; push(pointer to user message)	(was bx)
X> 	push [bp]		; push(src/dest) (was ax)
X> 	push dgroup:_cur_proc	; push caller
X> 	push 4[bp]		; push(SEND/RECEIVE/BOTH) (was cx)
X> 	call _sys_call		; sys_call(function, caller, src_dest, m_ptr)
X> 	jmp _restart		; jump to code to _restart proc/task running
X112,115c114,117
X< tty_int:			; Interrupt routine for	terminal input.
X< 	call save		; save the machine state
X< 	call keyboard		; process a keyboard interrupt
X< 	jmp  restart		; continue execution
X---
X> _tty_int:			; Interrupt routine for	terminal input.
X> 	call save		; save the machine state
X> 	call _keyboard		; process a keyboard interrupt
X> 	jmp  _restart		; continue execution
X121,124c123,126
X< lpr_int:			; Interrupt routine for	terminal input.
X< 	call save		; save the machine state
X< 	call pr_char		; process a line printer interrupt
X< 	jmp  restart		; continue execution
X---
X> _lpr_int:			; Interrupt routine for	terminal input.
X> 	call save		; save the machine state
X> 	call _pr_char		; process a line printer interrupt
X> 	jmp  _restart		; continue execution
X128,133c130,148
X< ;				disk_int
X< ;===========================================================================
X< disk_int:			; Interrupt routine for	the floppy disk.
X< 	call save			; save the machine state
X< 	mov  dgroup:int_mess+2,DISKINT	; build	message	for disk task
X< 	mov  ax,offset dgroup:int_mess	; prepare to call interrupt[FLOPPY, &intmess]
X---
X> ;				_wini_int
X> ;===========================================================================
X> _wini_int:			; Interrupt routine for	the floppy disk.
X> 	call save			; save the machine state
X> 	mov  dgroup:_int_mess+2,DISKINT	; build	message	for disk task
X> 	mov  ax,offset dgroup:_int_mess	; prepare to call interrupt[FLOPPY, &intmess]
X> 	push ax				; push second parameter
X> 	mov  ax,WINCHESTER		; prepare to push first	parameter
X> 	push ax			; push first parameter
X> 	call _interrupt		; this is the call
X> 	jmp  _restart		; continue execution
X> 
X> ;===========================================================================
X> ;				disk_int
X> ;===========================================================================
X> _disk_int:			; Interrupt routine for	the floppy disk.
X> 	call save			; save the machine state
X> 	mov  dgroup:_int_mess+2,DISKINT	; build	message	for disk task
X> 	mov  ax,offset dgroup:_int_mess	; prepare to call interrupt[FLOPPY, &intmess]
X137,138c152,153
X< 	call interrup		; this is the call
X< 	jmp  restart		; continue execution
X---
X> 	call _interrupt		; this is the call
X> 	jmp  _restart		; continue execution
X144,147c159,162
X< clock_in:			; Interrupt routine for	the clock.
X< 	call save			; save the machine state
X< 	mov dgroup:int_mess+2,CLOCK_TICK; build	message	for clock task
X< 	mov ax,offset dgroup:int_mess	; prepare to call interrupt(CLOCK,&intmess)
X---
X> _clock_int:			; Interrupt routine for	the clock.
X> 	call save			; save the machine state
X> 	mov dgroup:_int_mess+2,CLOCK_TICK; build	message	for clock task
X> 	mov ax,offset dgroup:_int_mess	; prepare to call interrupt(CLOCK,&intmess)
X151,152c166,167
X< 	call interrup		; this is the call
X< 	jmp  restart		; continue execution
X---
X> 	call _interrupt		; this is the call
X> 	jmp  _restart		; continue execution
X158,161c173,176
X< surprise:			; This is where	unexpected interrupts come.
X< 	call save		; save the machine state
X< 	call unexpect		; go panic
X< 	jmp  restart		; never	executed
X---
X> _surprise:			; This is where	unexpected interrupts come.
X> 	call save		; save the machine state
X> 	call _unexpected_int		; go panic
X> 	jmp  _restart		; never	executed
X167,170c182,185
X< trp:				; This is where	unexpected traps come.
X< 	call save		; save the machine state
X< 	call trap		; print	a message
X< 	jmp restart		; this error is	not fatal
X---
X> _trp:				; This is where	unexpected traps come.
X> 	call save		; save the machine state
X> 	call _trap		; print	a message
X> 	jmp _restart		; this error is	not fatal
X176,179c191,194
X< divide:				; This is where divide overflow traps come.
X< 	call save		; save the machine state
X< 	call div_trap		; print a message
X< 	jmp restart		; this error is not fatal
X---
X> _divide:			; This is where divide overflow traps come.
X> 	call save		; save the machine state
X> 	call _div_trap		; print a message
X> 	jmp _restart		; this error is not fatal
X193c208
X< 	mov bx,dgroup:proc_ptr	; start	save set up; make bx point to save area
X---
X> 	mov bx,dgroup:_proc_ptr	; start	save set up; make bx point to save area
X213,216c228,231
X< 	mov sp,offset dgroup:k_stack	    ; temporary	stack for interrupts
X< 	add sp,K_STACK_BYTES		    ; set sp to	top of temporary stack
X< 	mov splimit,offset dgroup:k_stack   ; limit for	temporary stack
X< 	add splimit,8			    ; splimit checks for stack overflow
X---
X> 	mov sp,offset dgroup:_k_stack	    ; temporary	stack for interrupts
X> 	add sp,K_STACK_BYTES		    ; set sp to	top of temporary stack
X> 	mov _splimit,offset dgroup:_k_stack   ; limit for	temporary stack
X> 	add _splimit,8			    ; splimit checks for stack overflow
X222,228c237,243
X< ;				restart
X< ;===========================================================================
X< restart:			; This routine sets up and runs	a proc or task.
X< 	cmp dgroup:cur_proc,IDLE; restart user; if cur_proc = IDLE, go	idle
X< 	je _idle		; no user is runnable, jump to idle routine
X< 	cli			; disable interrupts
X< 	mov sp,dgroup:proc_ptr	; return to user, fetch	regs from proc table
X---
X> ;				_restart
X> ;===========================================================================
X> _restart:			; This routine sets up and runs	a proc or task.
X> 	cmp dgroup:_cur_proc,IDLE; _restart user; if cur_proc = IDLE, go	idle
X> 	je _idle		; no user is runnable, jump to idle routine
X> 	cli			; disable interrupts
X> 	mov sp,dgroup:_proc_ptr	; return to user, fetch	regs from proc table
X238c253
X< 	mov splimit,bp		; ditto
X---
X> 	mov _splimit,bp		; ditto
X260c275
X< @CODE	ENDS
X---
X> _TEXT	ENDS
X267,270c282,285
X< @DATAB	SEGMENT			; datab	ensures	it is the beginning of all data
X< sizes	 DW	526Fh		; this must be the first data entry (magic nr)
X< 	 DW	7 dup(0)	; space	for build table	- total	16b
X< splimit	 DW	0		; stack	limit for current task (kernel only)
X---
X> _DATABEG SEGMENT		; DATABEG	ensures	it is the beginning of all data
X> _sizes	 DW	526Fh		; this must be the first data entry (magic nr)
X> 	 DW	7 dup(0)	; space	for build table	- total	16b
X> _splimit DW	0		; stack	limit for current task (kernel only)
X275,288c290,302
X< brksize	 DW	offset dgroup:@END+2	; first	free memory in kernel
X< ttyomess DB	"RS232 interrupt",0
X< @DATAB	ENDS
X< 
X< 
X< @DATAV	SEGMENT			; DATAV	holds nothing. The label in
X< @end	label	byte		; the segment just tells us where
X< @DATAV	ENDS			; the data+bss ends.
X< 
X< @STACK	SEGMENT	BYTE STACK 'STACK'	; Satisfy DOS-linker (dummy stack)
X< @STACK	ENDS
X< 
X< 	END	; end of assembly-file
X< 
X---
X> _brksize DW	offset dgroup:__end+2	; first	free memory in kernel
X> ttyomess DB	"RS232 interrupt",0
X> _DATABEG	ENDS
X> 
X> 
X> _DATAEND	SEGMENT			; DATAEND	holds nothing. The label in
X> __end	label	byte		; the segment just tells us where
X> _DATAEND	ENDS			; the data+bss ends.
X> 
X> _STACK	SEGMENT	BYTE STACK 'STACK'	; Satisfy DOS-linker (dummy stack)
X> _STACK	ENDS
X> 
X> 	END	; end of assembly-file
+ END-OF-FILE kernel/mpx88.dif
chmod u=rw,g=r,o=r kernel/mpx88.dif
set `sum kernel/mpx88.dif`
sum=$1
case $sum in
50985)	:;;
*)	echo 'Bad sum in 'kernel/mpx88.dif >&2
esac
echo Extracting kernel/printer.dif
sed 's/^X//' > kernel/printer.dif << '+ END-OF-FILE 'kernel/printer.dif
X33,34c33,34
X< #define NORMAL_STATUS   0xDF	/* printer gives this status when idle */
X< #define BUSY_STATUS     0x5F	/* printer gives this status when busy */
X---
X> #define NORMAL_STATUS   0x90	/* printer gives this status when idle */
X> #define BUSY_STATUS     0x10	/* printer gives this status when busy */
X48a49
X> #define STATUS_MASK	0xB0	/* mask to filter out status bits */ 
X121c122
X< 	  	if (value == NORMAL_STATUS) {
X---
X> 	  	if ((value&STATUS_MASK) == NORMAL_STATUS) {
X127c128
X< 			if (value == BUSY_STATUS) {
X---
X> 			if ((value&STATUS_MASK) == BUSY_STATUS) {
X139c140
X<   if (value == BUSY_STATUS) r = EAGAIN;
X---
X>   if ((value&STATUS_MASK) == BUSY_STATUS) r = EAGAIN;
X253c254
X<   	if (value == NORMAL_STATUS) {
X---
X>   	if ((value&STATUS_MASK) == NORMAL_STATUS) {
X264c265
X< 	} else if (value == BUSY_STATUS) {
X---
X> 	} else if ((value&STATUS_MASK) == BUSY_STATUS) {
X275a277,278
X> 
X> 
+ END-OF-FILE kernel/printer.dif
chmod u=rw,g=r,o=r kernel/printer.dif
set `sum kernel/printer.dif`
sum=$1
case $sum in
63911)	:;;
*)	echo 'Bad sum in 'kernel/printer.dif >&2
esac
echo Extracting kernel/proc.dif
sed 's/^X//' > kernel/proc.dif << '+ END-OF-FILE 'kernel/proc.dif
X40c40,42
X<   if (pc_at) port_out(INT2_CTL, ENABLE);	/* re-enable second 8259A */
X---
X>   if (pc_at && task == WINCHESTER)
X> 	  /* this re-enables the second controller chip */
X> 	  port_out(INT2_CTL, ENABLE);
+ END-OF-FILE kernel/proc.dif
chmod u=rw,g=r,o=r kernel/proc.dif
set `sum kernel/proc.dif`
sum=$1
case $sum in
15207)	:;;
*)	echo 'Bad sum in 'kernel/proc.dif >&2
esac
echo Extracting kernel/system.dif
sed 's/^X//' > kernel/system.dif << '+ END-OF-FILE 'kernel/system.dif
X154,204c154
X<   );
X<     cursor(6,7,0); LowVideo;
X<     with t[n] do
X<     if (dir[1] = '!')
X<     then begin
X<            ViaCommand:=False; Pause:=False; Finito:=True;
X<            if (dir[2] = '/')
X<             then begin
X<                    i:=pos(' ',dir);
X<                    cmd:=copy(dir,i+1,length(dir)-i);
X<                    options:=copy(dir,2,i-2);
X<                    InOpt:=False;
X<                    for i:=1 to length(options) do
X<                     if (options[i] = '/')
X<                     then InOpt:=True
X<                     else if InOpt
X<                          then begin
X<                                 case UpCase(options[i]) of
X<                                  'C': ViaCommand:=True;
X<                                  'P': Pause:=True;
X<                                  'R': Finito:=False;
X<                                 end;
X<                                 InOpt:=False;
X<                               end;
X<                  end
X<             else cmd:=copy(dir,2,length(dir)-1);
X< 
X<            if ViaCommand
X<             then error:=SubProcessViaCOMMAND(cmd)
X<             else error:=SubProcess(cmd);
X<            LowVideo;
X<            if (error <> ok)
X<             then writeln(^m^j'Error: ',DosErrorStr(error));
X<            if Pause
X<             then begin
X<                    write(^m^j'Hit any key to continue: ');
X<                    if ReadKey > 0 then {please Pascal God's};
X<                    writeln;
X<                  end;
X<          end
X<     else begin
X<            {$I-}
X<              ChDir(dir); error:=IOresult;
X<              if (error <> ok) then writeln('Error: sub-directory not found');
X<              Finito:=True;
X<            {$I+}
X<          end;
X<   until Finito or (error <> ok);
X<   Halt(error);
X< end.
X< register struct proc *rp, *rsrc;
X---
X>   register struct proc *rp, *rsrc;
X506c456,508
X<   /* MM is waiting for new input.  Find a process with ---
X>   /* MM is waiting for new input.  Find a process with pending signals. */
X>   for (rp = proc_addr(0); rp < proc_addr(NR_PROCS); rp++)
X> 	if (rp->p_pending != 0) {
X> 		m.m_type = KSIG;
X> 		m.PROC1 = rp - proc - NR_TASKS;
X> 		m.SIG_MAP = rp->p_pending;
X> 		sig_procs--;
X> 		if (mini_send(HARDWARE, proc_nr, &m) != OK) 
X> 			panic("can't inform MM", NO_NUM);
X> 		rp->p_pending = 0;	/* the ball is now in MM's court */
X> 		return;
X> 	}
X> }
X> 
X> 
X> /*===========================================================================*
X>  *				umap					     * 
X>  *===========================================================================*/
X> PUBLIC phys_bytes umap(rp, seg, vir_addr, bytes)
X> register struct proc *rp;	/* pointer to proc table entry for process */
X> int seg;			/* T, D, or S segment */
X> vir_bytes vir_addr;		/* virtual address in bytes within the seg */
X> vir_bytes bytes;		/* # of bytes to be copied */
X> {
X> /* Calculate the physical memory address for a given virtual address. */
X>   vir_clicks vc;		/* the virtual address in clicks */
X>   phys_bytes seg_base, pa;	/* intermediate variables as phys_bytes */
X> 
X>   /* If 'seg' is D it could really be S and vice versa.  T really means T.
X>    * If the virtual address falls in the gap,  it causes a problem. On the
X>    * 8088 it is probably a legal stack reference, since "stackfaults" are
X>    * not detected by the hardware.  On 8088s, the gap is called S and
X>    * accepted, but on other machines it is called D and rejected.
X>    */
X>   if (bytes <= 0) return( (phys_bytes) 0);
X>   vc = (vir_addr + bytes - 1) >> CLICK_SHIFT;	/* last click of data */
X> 
X> #ifdef i8088
X>   if (seg != T)
X> 	seg = (vc < rp->p_map[D].mem_vir + rp->p_map[D].mem_len ? D : S);
X> #else
X>   if (seg != T)
X> 	seg = (vc < rp->p_map[S].mem_vir ? D : S);
X> #endif
X> 
X>   if((vir_addr>>CLICK_SHIFT) >= rp->p_map[seg].mem_vir + rp->p_map[seg].mem_len)
X> 	return( (phys_bytes) 0 );
X>   seg_base = (phys_bytes) rp->p_map[seg].mem_phys;
X>   seg_base = seg_base << CLICK_SHIFT;	/* segment orgin in bytes */
X>   pa = (phys_bytes) vir_addr;
X>   pa -= rp->p_map[seg].mem_vir << CLICK_SHIFT;
X>   return(seg_base + pa);
X> }
+ END-OF-FILE kernel/system.dif
chmod u=rw,g=r,o=r kernel/system.dif
set `sum kernel/system.dif`
sum=$1
case $sum in
22746)	:;;
*)	echo 'Bad sum in 'kernel/system.dif >&2
esac
echo Extracting kernel/tty.dif
sed 's/^X//' > kernel/tty.dif << '+ END-OF-FILE 'kernel/tty.dif
X153c153
X< PUBLIC scan_code;		/* scan code for '=' saved by bootstrap */
X---
X> PUBLIC	int scan_code;		/* scan code for '=' saved by bootstrap */
+ END-OF-FILE kernel/tty.dif
chmod u=rw,g=r,o=r kernel/tty.dif
set `sum kernel/tty.dif`
sum=$1
case $sum in
11016)	:;;
*)	echo 'Bad sum in 'kernel/tty.dif >&2
esac
echo Extracting kernel/xt_wini.dif
sed 's/^X//' > kernel/xt_wini.dif << '+ END-OF-FILE 'kernel/xt_wini.dif
X29a30,32
X> #define DEBUG	       FALSE	/* TRUE: enable debug messages		   */
X> #define MONITOR        TRUE	/* TRUE: monitor performance of busy loops */
X> 
X32a36,40
X> #define WST_REQ        0x001	/* Request bit */
X> #define WST_INPUT      0x002	/* Set if controller is writing to cpu */
X> #define WST_BUS        0x004	/* Command/status bit */
X> #define WST_BUSY       0x008	/* Busy */
X> #define WST_INTERRUPT  0x020	/* Interrupt generated ?? */
X53d60
X< #define CTRL_BYTE	   5 /* Control byte for controller */
X70c77
X< #define MAX_WIN_RETRY  10000	/* max # times to try to output to WIN */
X---
X> #define MAX_WIN_RETRY  32000	/* max # times to try to output to WIN */
X78c85
X<   int wn_drive;			/* drive number addressed */
X---
X>   int wn_drive; 		/* drive number addressed (<< 5) */
X82a90
X>   int wn_ctrl_byte;		/* Control byte for COMMANDS (10-Apr-87 GO) */
X105,106c113,118
X< } param0, param1;
X< 
X---
X> 	int ctrl_byte;		/* Copied control-byte from bios tables */
X> } param0, param1;
X> 
X> #if	DEBUG
X> #define 	port_out(port, val)	xport_out(port, val)
X> #endif	/* DEBUG */
X117c129
X<   init_param();
X---
X>   init_params();
X151c163
X<  *				w_do_rdwt					     * 
X---
X>  *				w_do_rdwt				     * 
X168,170c180
X<   wn->wn_drive = device/DEV_PER_DRIVE;	/* save drive number */
X<   if (wn->wn_drive >= nr_drives)
X< 	return(EIO);
X---
X> 
X267c277
X<   command[1] = (wn->wn_head | (wn->wn_drive << 5));
X---
X>   command[1] = wn->wn_head | wn->wn_drive;
X271c281,282
X<   command[5] = CTRL_BYTE;
X---
X>   command[5] = wn->wn_ctrl_byte;
X> 
X277c288
X<   receive(HARDWARE, &w_mess);
X---
X>   w_wait_int();
X303,306c314,317
X<   if (!(status & 2))
X< 	return(OK);
X<   command[0] = WIN_SENSE;
X<   command[1] = (wn->wn_drive << 5);
X---
X>   if (!(status & 2))		/* Test "error" bit */
X> 	return(OK);
X>   command[0] = WIN_SENSE;
X>   command[1] = wn->wn_drive;
X312c323
X< 	if (hd_wait(1) != OK)
X---
X> 	if (hd_wait(WST_REQ) != OK)
X317,319c328,338
X<   if (wn->wn_results[0] & 63)
X< 	return(ERR);
X<   else
X---
X>   if(hd_wait(WST_REQ) != OK)	/* Missing from 		*/
X>      return (ERR);		/* Original.  11-Apr-87 G.O.	*/
X> 
X>   port_in(WIN_DATA, &status);	     /* Read "error" flag */
X> 
X>   if(((status & 2) != 0) || (wn->wn_results[0] & 0x3F)) {
X> #if	DEBUG
X> 	printf("\nwin_results: results[0] = %x", wn->wn_results[0]);
X> #endif	/* DEBUG */
X> 	return(ERR);
X>   } else
X334,336c353,360
X< 
X<   if (w_need_reset) return;	/* if controller is not listening, return */
X<   if (hd_wait(1) == OK)
X---
X>   int r;
X> 
X>   if (w_need_reset) return;	/* if controller is not listening, return */
X> 
X>   do {
X> 	port_in(WIN_STATUS, &r);
X>   } while((r & (WST_REQ | WST_BUSY)) == WST_BUSY);
X> 
X349,358c373,393
X<   int r = 1, i;
X< 
X<   /* Strobe reset bit low. */
X<   port_out(WIN_STATUS, r);
X<   for (i = 0; i < 10000; i++) {
X< 	port_in(WIN_STATUS, &r);
X< 	if ( (r&01) == 0)break;
X<   }
X<   if (r & 2) {
X< 	printf("Hard disk won't reset\n");
X---
X>   int r = 0, i;
X> 
X>   /* Strobe reset bit low. */
X>   port_out(WIN_STATUS, 0);
X> 
X>   for(i = MAX_WIN_RETRY/10; i; --i)
X> 	;	/* Spin loop for a while */
X> 
X>   port_out(WIN_SELECT, 0);	/* Issue select pulse */
X>   for (i = 0; i < MAX_WIN_RETRY; i++) {
X> 	port_in(WIN_STATUS, &r);
X> 	if(r & 0x30)		/* What is 10? 20 = INTERRUPT */
X> 		return (ERR);
X> 
X> 	if((r & (WST_BUSY | WST_BUS | WST_REQ)) ==
X> 		(WST_BUSY | WST_BUS | WST_REQ))
X> 		break;
X>   }
X> 
X>   if (i == MAX_WIN_RETRY) {
X> 	printf("Hard disk won't reset, status = %x\n", r);
X365,414c400,479
X<   return(win_init());
X< }
X< 
X< /*===========================================================================*
X<  *				win_init				     * 
X<  *===========================================================================*/
X< PRIVATE win_init()
X< {
X< /* Routine to initialize the drive parameters after boot or reset */
X< 
X<   register int i;
X< 
X<   command[0] = WIN_SPECIFY;		/* Specify some parameters */
X<   command[1] = 0;			/* Drive 0 */
X<   if (com_out(NO_DMA_INT) != OK)	/* Output command block */
X< 	return(ERR);
X<   lock();
X< 
X<   /* No. of cylinders (high byte) */
X<   win_out(param0.nr_cyl >> 8);
X< 
X<   /* No. of cylinders (low byte) */
X<   win_out(param0.nr_cyl & 0xFF);
X< 
X<   /* No. of heads */
X<   win_out(param0.nr_heads);
X< 
X<   /* Start reduced write (high byte) */
X<   win_out(param0.reduced_wr >> 8);
X< 
X<   /* Start reduced write (low byte) */
X<   win_out(param0.reduced_wr & 0xFF);
X< 
X<   /* Start write precompensation (high byte) */
X<   win_out(param0.wr_precomp >> 8);
X< 
X<   /* Start write precompensation (low byte) */
X<   win_out(param0.wr_precomp & 0xFF);
X< 
X<   /* Ecc burst length */
X<   win_out(param0.max_ecc);
X<   unlock();
X< 
X<   if (check_init() != OK) {	/* See if controller accepted parameters */
X< 	w_need_reset = TRUE;
X< 	return(ERR);
X<   }
X< 
X<   if (nr_drives > 1) {
X< 	command[1] = (1 << 5);			/* Drive 1 */
X---
X>   if(win_specify(0, &param0) != OK)
X> 	return (ERR);
X> 
X> #if	DEBUG
X>   printf("\nw_reset: drive 0 specified");
X> #endif	/* DEBUG */
X> 
X>   if ((nr_drives > 1) && (win_specify(1, &param1) != OK))
X> 	return(ERR);
X> 
X> #if	DEBUG
X>   printf("\nw_reset: drive 1 specified");
X> #endif	/* DEBUG */
X> 
X>   for (i=0; i<nr_drives; i++) {
X> 	command[0] = WIN_RECALIBRATE;
X> 	command[1] = i << 5;
X> 	command[5] = wini[i * DEV_PER_DRIVE].wn_ctrl_byte;
X> 
X> #if	DEBUG
X> 	printf("\nw_reset: recal %d, ctrl_byte = %x", i, command[5]);
X> #endif	/* DEBUG */
X> 
X> 	if (com_out(INT) != OK)
X> 		return(ERR);
X> 
X> 	w_wait_int();
X> 
X> 	if (win_results(&wini[i * DEV_PER_DRIVE]) != OK) {
X> 		w_need_reset = TRUE;
X> #if	DEBUG
X> 		printf("\nw_reset: Recal error");
X> #endif	/* DEBUG */
X> 		return(ERR);
X> 	}
X>      }
X>      return(OK);
X> }
X> 
X> 
X> /*===========================================================================*
X>  *				w_wait_int				     *
X>  *===========================================================================*/
X> PRIVATE w_wait_int()
X> {
X>    /*DEBUG: loop looking for 0x20 in status (I don't know what that is!!) */
X>    /*		 10-Apr-87. G. Oliver					  */
X>    int r, i; /* Some local storage */
X> 
X>    receive(HARDWARE, &w_mess);
X> 
X>    port_out(DMA_INIT, 0x07);	/* Disable int from DMA */
X> 
X>    for(i=0; i<MAX_WIN_RETRY; ++i) {
X> 	port_in(WIN_STATUS, &r);
X> 	if(r & WST_INTERRUPT)
X> 		break;		/* Exit if end of int */
X>   }
X> 
X> #if  MONITOR
X>    if(i > 10) { 	/* Some arbitrary limit below which we don't really care */
X> 	if(i == MAX_WIN_RETRY)
X> 		printf("wini: timeout waiting for INTERRUPT status\n");
X> 	else
X> 		printf("wini: %d loops waiting for INTERRUPT status\n", i);
X>    }
X> #endif	/* MONITOR */
X> }
X> 
X> 
X> /*============================================================================*
X>  *				win_specify				      *
X>  *============================================================================*/
X> PRIVATE win_specify(drive, paramp)
X> int drive;
X> struct param *paramp;
X> {
X>   command[0] = WIN_SPECIFY;		/* Specify some parameters */
X>   command[1] = drive << 5;		/* Drive number */
X> 
X420,442c485,508
X< 	win_out(param1.nr_cyl >> 8);
X< 
X< 	/* No. of cylinders (low byte) */
X< 	win_out(param1.nr_cyl & 0xFF);
X< 
X< 	/* No. of heads */
X< 	win_out(param1.nr_heads);
X< 
X< 	/* Start reduced write (high byte) */
X< 	win_out(param1.reduced_wr >> 8);
X< 
X< 	/* Start reduced write (low byte) */
X< 	win_out(param1.reduced_wr & 0xFF);
X< 
X< 	/* Start write precompensation (high byte) */
X< 	win_out(param1.wr_precomp >> 8);
X< 
X< 	/* Start write precompensation (low byte) */
X< 	win_out(param1.wr_precomp & 0xFF);
X< 
X< 	/* Ecc burst length */
X< 	win_out(param1.max_ecc);
X< 	unlock();
X---
X>   win_out(paramp->nr_cyl >> 8);
X> 
X> 	/* No. of cylinders (low byte) */
X>   win_out(paramp->nr_cyl);
X> 
X> 	/* No. of heads */
X>   win_out(paramp->nr_heads);
X> 
X> 	/* Start reduced write (high byte) */
X>   win_out(paramp->reduced_wr >> 8);
X> 
X> 	/* Start reduced write (low byte) */
X>   win_out(paramp->reduced_wr);
X> 
X> 	/* Start write precompensation (high byte) */
X>   win_out(paramp->wr_precomp >> 8);
X> 
X> 	/* Start write precompensation (low byte) */
X>   win_out(paramp->wr_precomp);
X> 
X> 	/* Ecc burst length */
X>   win_out(paramp->max_ecc);
X> 	unlock();
X> 
X447,459c513
X<   }
X<   for (i=0; i<nr_drives; i++) {
X< 	command[0] = WIN_RECALIBRATE;
X< 	command[1] = i << 5;
X< 	command[5] = CTRL_BYTE;
X< 	if (com_out(INT) != OK)
X< 		return(ERR);
X< 	receive(HARDWARE, &w_mess);
X< 	if (win_results() != OK) {
X< 		w_need_reset = TRUE;
X< 		return(ERR);
X< 	}
X<   }
X---
X>   else
X469,476c523,546
X<   int r;
X< 
X<   if (hd_wait(2) == OK) {
X< 	  port_in(WIN_DATA, &r);
X< 	  if (r & 2)
X< 		return(ERR);
X< 	  else
X< 		return(OK);
X---
X>   int r, s;
X> 
X>   if (hd_wait(WST_REQ | WST_INPUT) == OK) {
X> 	  port_in(WIN_DATA, &r);
X> 
X>        do {
X> 		port_in(WIN_STATUS, &s);
X>        } while(s & WST_BUSY);		/* Loop while still busy */
X> 
X>        if (r & 2)		/* Test error bit */
X> 		{
X> #if	DEBUG
X> 		printf("\ncheck_init: error bit set in %x", r);
X> #endif	/* DEBUG */
X> 		return(ERR);
X> 		}
X> 	  else
X> 		return(OK);
X>   } else
X> 	{
X> #if	DEBUG
X> 	printf("\ncheck_init: INPUT not active");
X> #endif	/* DEBUG */
X> 	return (ERR);	/* Missing from original: 11-Apr-87 G.O. */
X490,492c560,562
X<   if (com_out(NO_DMA_INT) == OK && hd_wait(1) == OK) {
X< 	port_in(WIN_DATA, &r);
X< 	if (hd_wait(1) == OK) {
X---
X>   if (com_out(NO_DMA_INT) == OK && hd_wait(WST_REQ) == OK) {
X> 	port_in(WIN_DATA, &r);
X> 	if (hd_wait(WST_REQ) == OK) {
X504,505c574,575
X< PRIVATE hd_wait(bit)
X< register int bit;
X---
X> PRIVATE hd_wait(bits)
X> register int bits;
X514,515c584,585
X< 	r &= bit;
X<   } while ((i++ < MAX_WIN_RETRY) && !r);
X---
X> 	r &= bits;
X>   } while ((i++ < MAX_WIN_RETRY) && r != bits); 	/* Wait for ALL bits */
X518a589,591
X> #if	DEBUG
X> 	printf("\nhd_wait: timeout waiting for %x (%x)", bits, r);
X> #endif	/* DEBUG */
X532,554c605,648
X< 	register int i = 0;
X< 	int r;
X< 
X< 	port_out(WIN_SELECT, mode);
X< 	port_out(WIN_DMA, mode);
X< 	for (i=0; i<MAX_WIN_RETRY; i++) {
X< 		port_in(WIN_STATUS, &r);
X< 		if ((r & 0x0F) == 0x0D)
X< 			break;
X< 	}
X< 	if (i == MAX_WIN_RETRY) {
X< 		w_need_reset = TRUE;
X< 		return(ERR);
X< 	}
X< 	lock();
X< 	for (i=0; i<6; i++)
X< 		port_out(WIN_DATA, command[i]);
X< 	unlock();
X< 	port_in(WIN_STATUS, &r);
X< 	if (r & 1) {
X< 		w_need_reset = TRUE;
X< 		return(ERR);
X< 	} else
X---
X> 	register int i;
X> 	int r;
X> 
X> 	port_out(WIN_DMA, mode);
X> 	port_out(WIN_SELECT, mode);
X> 	for (i=0; i<MAX_WIN_RETRY; i++) {
X> 		port_in(WIN_STATUS, &r);
X> 		if (r & WST_BUSY)
X> 			break;
X> 	}
X> 
X> 	if (i == MAX_WIN_RETRY) {
X> 		w_need_reset = TRUE;
X> #if	DEBUG
X> 		printf("\ncom_out: retry exceeded, status = %x", r);
X> #endif	/* DEBUG */
X> 		return(ERR);
X> 	}
X> 
X> 
X> 	lock();
X> 
X> 	for (i=0; i<6; i++) {
X> 		if(hd_wait(WST_REQ) != OK)
X> 			break;		/* No data request pending */
X> 
X> 		port_in(WIN_STATUS, &r);
X> 
X> 		if((r & (WST_BUSY | WST_BUS | WST_INPUT)) !=
X> 			(WST_BUSY | WST_BUS))
X> 			break;
X> 
X> 		port_out(WIN_DATA, command[i]);
X> 	}
X> 
X> 	unlock();
X> 
X> 	if(i != 6) {
X> #if	DEBUG
X> 		printf("\ncom_out: packet write aborted, status=%x", r);
X> #endif	/* DEBUG */
X> 		return(ERR);
X> 	}
X> 	else
X576,577c670,671
X<   type_0 = (i >> 2) & 3;
X<   type_1 = i & 3;
X---
X>   type_0 = i & 3;
X>   type_1 = (i >> 2) & 3;
X584c678
X<   address = ((long)segment << 4) + offset;
X---
X>   address = ((phys_bytes)segment << 4) + offset;
X588,591c682,685
X<   copy_param((&buf[type_0 * 16]), &param0);
X<   copy_param((&buf[type_1 * 16]), &param1);
X< 
X<   /* Get the nummer of drives from the bios */
X---
X>   copy_params(&buf[type_0 * 16], &param0);
X>   copy_params(&buf[type_1 * 16], &param1);
X> 
X>   /* Get the number of drives from the bios */
X596,602c690,705
X<   for (i=0; i<5; i++)
X< 	wini[i].wn_heads = param0.nr_heads;
X<   wini[0].wn_low = wini[5].wn_low = 0L;
X<   wini[0].wn_size = (long)((long)param0.nr_cyl * (long)param0.nr_heads * (long)NR_SECTORS);
X<   for (i=5; i<10; i++)
X< 	wini[i].wn_heads = param1.nr_heads;
X<   wini[5].wn_size = (long)((long)param1.nr_cyl * (long)param1.nr_heads * (long)NR_SECTORS);
X---
X>   for (i = 0; i < DEV_PER_DRIVE; i++) {
X> 	wini[i].wn_heads = param0.nr_heads;
X> 	wini[i].wn_ctrl_byte = param0.ctrl_byte;
X> 	wini[i].wn_drive = 0 << 5;	/* Set drive number */
X>   }
X> 
X>   wini[0].wn_low = wini[DEV_PER_DRIVE].wn_low = 0L;
X>   wini[0].wn_size = (long)((long)param0.nr_cyl * (long)param0.nr_heads * (long)NR_SECTORS);
X> 
X>   for (i = DEV_PER_DRIVE; i < (2*DEV_PER_DRIVE); i++) {
X> 	wini[i].wn_heads = param1.nr_heads;
X> 	wini[i].wn_ctrl_byte = param1.ctrl_byte;
X> 	wini[i].wn_drive = 1 << 5;	/* Set drive number */
X>   }
X>   wini[DEV_PER_DRIVE].wn_size =
X> 	(long)((long)param1.nr_cyl * (long)param1.nr_heads * (long)NR_SECTORS);
X606c709
X<   if ((nr_drives > 0) && (win_init() != OK))
X---
X>   if ((nr_drives > 0) && (w_reset() != OK))
X611c714
X< 	w_mess.DEVICE = i * 5;
X---
X> 	w_mess.DEVICE = i * DEV_PER_DRIVE;
X619c722,725
X< 	copy_prt(i * 5);
X---
X> 	copy_prt(i * DEV_PER_DRIVE);
X> #if	DEBUG
X> 	printf("\ninit_params: drive %d processed", i);
X> #endif	/* DEBUG */
X631c737
X<  * and sets the parameters for partition 0 and 5
X---
X>  * and sets the parameters for partition 0 and DEV_PER_DRIVE
X638a745
X>   dest->ctrl_byte = (int)src[8];
X691a799,816
X> 
X> #if	DEBUG
X> #undef	port_out
X> /* Write values written to ports with debugging version of port_out */
X> xport_out(port, val)
X> int port, val;
X> {
X> 	static int __ctr = 0;
X> 
X> 	printf("  (%x)=%x", port, val);
X> 	if(++__ctr > 4)
X> 	{
X> 	printf("\n");
X> 	__ctr = 0;
X> 	}
X> 	port_out(port, val);
X> }
X> #endif	/* DEBUG */
+ END-OF-FILE kernel/xt_wini.dif
chmod u=rw,g=r,o=r kernel/xt_wini.dif
set `sum kernel/xt_wini.dif`
sum=$1
case $sum in
40760)	:;;
*)	echo 'Bad sum in 'kernel/xt_wini.dif >&2
esac
exit 0