$MOD186
$PAGELENGTH (72)
$PAGEWIDTH  (136)

;Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved.

;-- stored as [Idun]<WDLion>Dove>RAMHInit.asm
;-- created on  27-Jun-85  8:09:06

;-- last edited by:

;--	KEK	16-Mar-86 13:42:22	;add PROC'ness; org'd at 0.
;--	JAC	 6-Jan-86 14:06:26	:Make InitializeRAMFunctions a far proc
;--	JAC	 4-Dec-85 10:44:13	:Don't call init procs if in main memory
;--	JPM	17-Sep-85 12:32:36	:Use BOOTPROC for boot device handlers
;--	JPM	12-Aug-85  9:14:24	:Change IOPEInRAM alignment to WORD
;--	JPM	25-Jul-85  9:25:24	:Remove OpieIOR (not used)
;--	JPM	27-Jun-85  8:09:06	:Creation from HandInit.asm,
;--				adding CALLPROC option for restarting ROM handlers


NAME		RAMHInit

$NOLIST
$INCLUDE	(IOPDefs.asm)
$INCLUDE	(OpieDefs.asm)
$INCLUDE	(ROMBDefs.asm)
$LIST
;********************************************************************************

IOPELocalRam		SEGMENT		AT 0

			EXTRN	HandlerInitProcTable: SegmentAndOffset
			EXTRN	device: WORD

IOPELocalRam		ENDS

;********************************************************************************

IOPEInRAM		SEGMENT	WORD PUBLIC
			ASSUME	CS:IOPEInRAM
			ORG	0
			

$INCLUDE	(RAMHands.asm)	;file specifying which handlers we link with.


PUBLIC	InitializeRAMFunctions

InitializeRAMFunctions	PROC	FAR

			MOV	AX, IOPELocalRam
			MOV	ES, AX
			ASSUME	ES:IOPELocalRam

$NOGEN

;The following macro enumerates those which are expected to be linked.

%' RAMHands.asm defines a macro called HandlersLinked, which calls the
%' %Handler macro for the names of all handlers the author provided.

%*DEFINE(Handler(name,id,initProcAction,codeLocation))	(
			PUBLIC	%name%(HandlerID)
%name%(HandlerID)	EQU	%id
			
	%IF (%NES (%codeLocation,MEMORY)) THEN (
	    %IF (%EQS (%initProcAction,CALL))
	        THEN (EXTRN	%name%(Init): NEAR
	  	      PUSH	ES
%name%(StartMe:)      PUSH	CS
	  	      CALL	%name%(Init)
	  	      POP	ES
	        ) ELSE
	            (
	            %IF (%EQS (%initProcAction,PROC))
		        THEN (EXTRN	%name%(Init): NEAR
			      MOV	DI, SIZE SegmentEntry * %id
%name%(StoreMe:)	      MOV	HandlerInitProcTable[DI].segmentValue, CS
			      MOV	HandlerInitProcTable[DI].offsetValue, OFFSET %name%(Init)
		        ) ELSE
		            (
			    %IF (%EQS (%initProcAction,CALLPROC))
			        THEN (MOV	DI, SIZE SegmentEntry * %id
				      PUSH	ES
%name%(StartMe:)		      CALL	DWORD PTR HandlerInitProcTable[DI]
				      POP	ES
			        ) ELSE
			            (
				    %IF (%EQS (%initProcAction,BOOTPROC))
				        THEN (CMP	device, %name
					      JE	%name%(SkipMe)
					      MOV	DI, SIZE SegmentEntry * %id
					      PUSH	ES
%name%(StartMe:)			      CALL	DWORD PTR HandlerInitProcTable[DI]
					      POP	ES
%name%(SkipMe:)
				        ) FI
			        ) FI
		        ) FI
	        ) FI
	) FI
)

;Generate calls to Init Routines
$GENONLY
			%HandlersLinked

			RET
InitializeRAMFunctions	ENDP

IOPEInRAM		ENDS


			END