TITLE[EOMDefs];
*last edited by rej August 6, 1979  1:22 PM	added code for new CSB
*last edited by srd February 26, 1980  2:30 PM	added hooks for verdi disk change.
*last edited by srd February 29, 1980  1:45 PM	moved bit in eomState to allow
*					different new list size specification.
*last edited by srd March 24, 1980  9:11 AM	eliminated font bank register
*last edit by srd March 26, 1980  1:35 PM		modified new list size mask
*last edit by srd March 27, 1980  2:34 PM		added new list overflow reason bit
*last edit by srd October 28, 1980  4:09 PM	put in stuff for modified EOP handling
*last edit by srd February 9, 1981  1:38 PM	put in stuff for improved block builder
*last edit by srd March 2, 1981  1:36 PM		Fixed dummy EOP code address to account
*					for band list prefetch.  Put in revision
*					level number.

*REVISION LEVELS

*Revision Level 1 - - March 2, 1981  1:39 PM
*Revision Level 2 - - March 6, 1981  1:33 PM	This revision is bad
*Revision Level 3 - - March 12, 1981  1:07 PM

*REGISTER OFFSETS AND TASK CODE STARTS

SET[loTaskIOoffset,LSHIFT[eomLoTask,4]];
SET[hiTaskIOoffset,LSHIFT[eomHiTask,4]];
SET[hiEOMTaskCodeStart,LSHIFT[eomHiTaskPage,10]];
SET[loEOMTaskCodeStart,LSHIFT[eomLoTaskPage,10]];

*HIGH TASK DISPATCHES

SET[hiTaskWakeupDispatch,ADD[hiEOMTaskCodeStart,20]];
SET[hiTaskWakeupReasonDisp,ADD[hiEOMTaskCodeStart,40]];

*LOW TASK DISPATCHES

SET[loTaskMainDispatch,ADD[loEOMTaskCodeStart,20]];
SET[loTaskMesaDispatch,ADD[loEOMTaskCodeStart,40]];
SET[loTaskBlockBldDispatch,ADD[loEOMTaskCodeStart,60]];
SET[ruleMaskDispatch,ADD[loEOMTaskCodeStart,100]];
SET[type6Dispatch,ADD[loEOMTaskCodeStart,140]];

*HARDWARE INTERFACE REGISTER DEFINITIONS

SET[wakeUpType,3];		* (input)
SET[opcStartupIn,1];		* (input)
SET[bandBufferCmndReg,1];	* (output)
SET[loTaskStatus,1];		* (input)
SET[outputChannelBuffer,2];	* (input)
SET[loTaskCommandReg,3];	* (output)
SET[rosStartupCmnds,5];	* (output)
SET[opcStartupOut,6];	* (output)
SET[inputParameterBuffer,16];	* (output)
SET[inputChannelBuffer,17];	* (output)

*CSB OFFSET VALUES

SET[wakeupMaskOffset,0];
SET[wakeupReasonOffset,1];
SET[mesaCommandOffset,2];
SET[statusOffset,3];
SET[fontPointerOffset,4];
SET[workingStorageOffset,6];
SET[fragmentsOffset,10];
SET[auxCmnd,11];
SET[bandListOffset,12];
SET[outputBufferOffset,14];
SET[outputBufferRingChar,17];

*JUNK AREA OFFSET VALUES

SET[parametricBlockCount,14];
SET[thirdJunkQuad,10];
SET[endOfPageCodeLoc,16];

*INPUT REGISTER ADDRESSES - These are register addresses for use in INPUT operations to perform
	*the resets.

SET[hiTaskPause,10];
SET[resetMesaCommand,14];
SET[resetParityError,12];
SET[resetBandSwitch,16];
SET[resetLoTaskRun,17];

*CSB LOCATION

*MC[eomLhLoCsbBase,400];
*MC[eomRhLoCsbBase,320];
*MC[eomHiCsbBase,0];
SET[eomCSBpage,377];					*CSB address
SET[eomCSBbank,0];
MC[eomRhLoCSBbase, LSHIFT[eomLoTask,4]];
MC[eomLhLoCSBbase, LSHIFT[eomCSBpage,10]];
MC[eomLhHiCSBbase, LSHIFT[eomCSBbank,10]];
MC[eomRhHiCSBbase, ADD[eomCSBbank,1]];

*REGISTER COMMANDS

MC[setLoTaskRun,3];
MC[eomStart,1];
MC[hiTaskUnPause,40];

*PARAMETER BLOCK CONSTANTS

MC[previousLineNotPresent,20];
MC[ruleParmWord2,160];
MC[partialStateSave,400];

*WORK SPACE RING CONSTANTS

MC[newListReadRingBase,60];
MC[newListWriteRingBase,74];
MC[newListSizeMask,76000];
*MC[newListSizeMask,74000];
MC[oldListInitA,4000];
MC[oldListInitB,10000];
MC[oldListInitC,20000];
MC[oldListInitD,40000];
*MC[oldListInit,20000];		*This will cause the old list to begin at 20020B.

*IMAGINAL RING CONSTANTS

*MC[incSectorsFilledByOne,400];
*SET[sectorsFilledFieldWidth,10];
*SET[blocksPerSectorStartBit,sectorsFilledFieldWidth];
*SET[blocksPerSectorFieldWidth,10];
MC[incSectorsFilledByOne,1000];
SET[sectorsFilledFieldWidth,7];
SET[blocksPerSectorStartBit,sectorsFilledFieldWidth];
SET[blocksPerSectorFieldWidth,11];

*INTERNAL FLAG CONSTANTS

MC[bandDone,4];
MC[workingFromNewList,100000];
MC[parametricModeFlag,400];
MC[firstBlockAndSectorEmpty,4000];
MC[freezeEOBChar,1000];
MC[newListAndParametricMode,100400];
MC[firstParametricReturnBlock,10];
MC[firstParametricAndBandDone,14];
MC[hiTaskRunning,1];
MC[eopAlreadySent,2];
MC[nakedNotifyRegisterAddress,21];
MC[forceWord8ToZero,40000];
MC[abnormalInkIndication,100000];
MC[hiEOPcode,120000];
MC[loEOPcode,100];
MC[bandListEOPpointerMinusTwo,SUB[endOfPageCodeLoc,2]];
MC[highFontBitsMask,30000];
MC[revisionLevel,3];			*REVISION LEVEL NUMBER.  MUST UPDATE WHEN ANY CHANGE
				*OCCURS TO THE CODE.

*CSB COMMUNICATION CONSTANTS

MC[image0SectorEmpty,1];
MC[image1SectorEmpty,2];
MC[image2SectorEmpty,4];
MC[image3SectorEmpty,10];
MC[bandSwitch,20];
MC[imageUnderflow,40];
MC[bandAllReturned,100];
MC[workSpaceOverflow,200];
MC[EOPProcessed,400];
MC[parityError,1000];
MC[bandBufferBehind,2000];
MC[firstBandReady,4000];
MC[newListOverflow,10000];


*TASK LEVEL REGISTERS (tasks are in the same quadblock, so they share registers)

SETTASK[eomLoTask];

**********

RV[eomInkSetting,0];		*this is the current ink setting.  It is merged into character
			*and rule parameter blocks by the low task.  It is initialized
			*by the z-Plane setting code.

**********

RV[eomBandListPointer,1];	*This is the offset used for accessing band list entries.

**********

RV[eomZPlane,3];		*this is the z-Plane value used by the low task for block building

**********

RV[eomFragA,4];		*This quadblock is where parameter block fragments are placed.
RV[eomFragB,5];		*Some of these locations are used as temporaries various places
RV[eomFragC,6];		*in the low task code.
RV[eomFragD,7];

**********

RV[eomBListEntryA,10];	*this register pair is the destination of PFETCH2
RV[eomBListEntryB,11];		*operations which fetch band list entries.

**********

RV[eomBandListA,12];		*this register pair is the base pointer used for accessing
RV[eomBandListB,13];		*band list entries.

**********

RV[eomParmA,14];		*This is the area where quadwords of parameter blocks are
RV[eomParmB,15];		*created by the low task
RV[eomParmC,16];
RV[eomParmD,17];

**********

RV[eomNewListRead,20];		*The read pointer into the new list.

**********

RV[eomNewBlocksFull,21];	*this contains the count of full slots in the new ring.
			*  "totalNewListBlocks" is the max value this can contain.
			*   -1 indicates the ring is empty.

**********

RV[eomCsbBaseLo,22];	*This is the double base pointer used for accessing the CSB.
RV[eomCsbBaseHi,23];	*The high word is not really right, but since Lo + T will never
			*carry, it will do.

**********

RV[eomSectorsFilled,24];	*The max value of this register is 1 less than the number of sectors
			*filled.  This is because it is used as a fast branch. 

**********

RV[eomActiveAttributes,25];	*The microcode attributes for the object which most recently had a
			*"first" data transfer (hi task IOATTEN branch 0).  The attributes
			*are in bits 15, 16, and 17.  The 15B high order bits are always
			*zero, except when the lo task has set the register to 177777B
			*to force a base register load.  This happens on page startup,
			*and on parametric page continue.
**********

RV[eomOldBlocksFull,26];	*A count of the number of blocks of data in the old list which
			*remain to be sent out on the current band.
**********

RV[eomOldListWrite,27];		*The write pointer into the old list.

**********

RV[eomOldBlocksReturned,30];	*A count of the number of blocks of data in the old list which have
			*been returned during the current band.
**********

RV[eomPreviousZPlane,31];	*z-Plane value of previous block transferred

**********

RV[eomDataTransferOffset,32];	*The offset value used for data transfers.

**********

RV[eomNewListWrite,33];		*this is the write pointer into the new list.

**********

RV[eomBlocksRemaining,34];	*The max value of this register is 2 less than the number of
			*blocks in a sector.  This is because it is used as a fast branch
			*and is decremented during the instruction which does the fast
			*branch.

RV[eomAlternateZPlane,35];	*next z-Plane value out of alternate list

RV[eomImageXferOffset,35];	*This register is used for image ring wrap computations.  It is
			*fetched with a PFETCH2 along with eomBlocksRemaining.  It is also
			*used as a non-task specific temporary for the naked notify
			*operation in eomHiTaskModifyWakeupReasons.
**********

RV[eomParameterTransferBaseA,36];	*this register pair is used as the long base pair for
RV[eomParameterTransferBaseB,37];	*accessing the workspace and parameter block fragments.
				*This, along with fontPointerA,B is initialized with a
				*quadWord reference.
**********

RV[eomOldListRead,60];		*The read pointer into the old list.

**********


RV[eomFragments,61];		*The pointer, relative to parameterTransferBaseA,B, which indicates
			*the start of the fragments table.  It also indicates the end of
			*the workspace.
**********

RV[eomState,62];		*This register contains 2 fast branch flags defined as follows:
				*sign bit = 0 implies working from old list
				*sign bit = 1 implies working from new list
				*bit 15 = 0 implies hi task paused
				*bit 15 = 1 implies hi task running
			*and several slow branch flags defined as follows:

			*LO BYTE:
				*bit 14 = 0 implies EOP not sent
				*bit 14 = 1 implies EOP sent
				*bit 13 = 0 implies band in progress
				*bit 13 = 1 implies band done
				*bit 12 = 0 implies first bitmap request
				*bit 12 = 1 implies not first request

			*HI BYTE:
				*bit 7 = 0 implies real time generation
				*bit 7 = 1 implies parametric time generation
				*bit 6 = 0 implies OK to ship EOB character.
				*bit 6 = 1 implies do not ship EOB character.

				*BITS 1,2,3,4 are the four most significant bits of the
				*new list size.
**********

RV[eomDispField,63];		*The register used for the dispatch fields and temporaries in the
			*high task.

**********

RV[eomDataTransferBaseA,64];	*The base from which compressed data transfers are done.
RV[eomDataTransferBaseB,65];

**********

RV[eomTerminalBlockAddress,66];	*For images, this gives the end of the ring, in blocks.

**********

RV[eomRingChar,67];			*The boundary between fields in this register are
				*controlled by the imaginal ring constant values.

**********

RV[eomParmBlock0,74];	*parmBlock0 and blockPointer are used in a PFETCH2.  They must be
RV[eomBlockPointer,75];		*together word 1 of the parameter block

**********

RV[eomTemp,76];

**********

RV[eomTemp1,77];

**********

END;