;Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved. ;-- stored as [Igor]Dove>OpieDefs.asm ;-- created on 20-Nov-84 17:04:39 ;-- This file contains non-hardware related definitions which are of interest ;-- only to Opie. ; ;-- last edited by: ;-- JPM 2-Aug-85 16:23:28 :Added eePromStackFlagOffset ;-- JPM 6-Jul-85 12:17:16 :Added stackFlagOffset, waitStackFlagOffset ;-- JPM 24-Jun-85 10:57:14 :Added nilHandlerID, WriteMap, dontTrustEEPROM ;-- JPM 20-Jun-85 16:50:10 :Added LoadHandlerAndOpieSegments ;-- JPM 20-Jun-85 12:56:56 :Added offsetToPrevState ;-- JPM 18-Jun-85 13:20:14 :Added IOPE queue types ;-- JPM 23-May-85 12:24:58 :Reordered task status constants ;-- JPM 20-May-85 14:39:10 :Added LoadHandlerSegment, LoadOpieSegment, CallIRETproc ;-- JPM 17-May-85 13:03:34 :Added SegmentAndOffset, WorkMaskConditionPtr, ICStatusBits; re-added NullTCBPtr ;-- JPM 16-May-85 14:43:31 :Added opieHandlerID ;-- JPM 14-May-85 13:01:02 :Opie redesign ;-- KEK 2-Mar-85 19:00:29 :added NullTCBPtr ;-- VXS 27-Nov-84 11:47:39 :change DW SIZE to DB size in IOPEFCB definition ;-- VXS 20-Nov-84 17:10:23 :Creation $NOGEN ;Opie's "handler ID" (of course, Opie's not really a handler) opieHandlerID EQU 0 ;nil handler ID (for delineating end of queues) nilHandlerID EQU 0FFH ;constant for Opie to represent Null TCB (when no task is running) NullTCBPtr EQU -1 ;IOPE queue types systemQueueType EQU 1 timerQueueType EQU 2 ;IOPE task states. runningStateMask EQU 08H ;task is running waitStateMask EQU 04H ;task is waiting interruptStateMask EQU 04H ;task is at interrupt level jamStateMask EQU 02H ;task jammed, or jam at next wait restartStateMask EQU 01H ;restart at next wait offsetToPrevState EQU 4 ;each state takes 4 bits interruptState EQU runningStateMask+interruptStateMask prevStateinterrupt EQU (interruptState SHL offsetToPrevState) interruptWaitJamState EQU interruptState+jamStateMask prevStateinterruptWaitJam EQU (interruptWaitJamState SHL offsetToPrevState) interruptWaitRestartState EQU interruptState+restartStateMask prevStateinterruptWaitRestart EQU (interruptWaitRestartState SHL offsetToPrevState) jammedState EQU jamStateMask prevStatejammed EQU (jammedState SHL offsetToPrevState) systemState EQU runningStateMask prevStatesystem EQU (systemState SHL offsetToPrevState) systemWaitJamState EQU systemState+jamStateMask prevStatesystemWaitJam EQU (systemWaitJamState SHL offsetToPrevState) systemWaitRestartState EQU systemState+restartStateMask prevStatesystemWaitRestart EQU (systemWaitRestartState SHL offsetToPrevState) waitForConditionState EQU waitStateMask+2 prevStatewaitForCondition EQU (waitForConditionState SHL offsetToPrevState) waitForInterruptState EQU waitStateMask+3 prevStatewaitForInterrupt EQU (waitForInterruptState SHL offsetToPrevState) waitForSystemState EQU waitStateMask prevStatewaitForSystem EQU (waitForSystemState SHL offsetToPrevState) waitForTimeState EQU waitStateMask+1 prevStatewaitForTime EQU (waitForTimeState SHL offsetToPrevState) unInitializedState EQU 00H prevStateunInitialized EQU (unInitializedState SHL offsetToPrevState) ;----------------------- ;Interrupt Context status bits ICStatusBits RECORD ICTaskWaiting: 1, ICTimed: 1, ICActive: 1, & ICUnexpected: 1, ICUnused: 4 = 0 ;----------------------- ;Preboot switch values dontTrustEEPROM EQU 8000H ;----------------------- ;Macro used to load segment register (DS/ES) for a handler ID in AX. ; Target register and an available index register (BX/BP/SI/DI) are specified. %*DEFINE (LoadHandlerSegment (segReg, workReg)) ( $SAVE $GENONLY MOV %workReg, IOPELocalRAM MOV %segReg, %workReg L%segReg %workReg, %segReg:IORSegmentTableAddress SHL AX, 2 ADD %workReg, AX MOV %segReg, %segReg:[%workReg].ioRegionSegment $RESTORE ) ;----------------------- ;Macro used to load segment register (DS/ES) with Opie's IORegion segment. ; Target register and an available work register are specified. %*DEFINE (LoadOpieSegment (segReg, workReg)) ( $SAVE $GENONLY MOV %workReg, IOPELocalRAM MOV %segReg, %workReg MOV %segReg, %segReg:IOROpieSegmentAddress $RESTORE ) ;----------------------- ;Macro used to load segment register DS for a handler ID in AX, and segment register ES ; with Opie's IORegion segment. An available index register (BX/BP/SI/DI) is specified. ; If stackReg is non-nil, load the handler's stack segment into that register. %*DEFINE (LoadHandlerAndOpieSegments (workReg, stackReg)) ( $SAVE $GENONLY MOV %workReg, IOPELocalRAM MOV DS, %workReg MOV ES, DS:IOROpieSegmentAddress LDS %workReg, DS:IORSegmentTableAddress SHL AX, 2 ADD %workReg, AX %IF (%NES (%stackReg,%())) THEN ( MOV %stackReg, DS:[%workReg].stackSegment ) FI MOV DS, DS:[%workReg].ioRegionSegment $RESTORE ) ;----------------------- ;Macro used to setup general map register for a task. ; Designed for minimum overhead if no map register is setup. ;Destroys AL, DX nilMapData EQU 0FFH ;make it illegal data. %*DEFINE (WriteMap (mapReg)) ( $SAVE $GENONLY %IF (%EQS (%mapReg,DX)) THEN ( ADD DX, daybreakMapIOAddressBase OUT DX, AL SUB DX, daybreakMapIOAddressBase ) ELSE ( MOV DX, daybreakMapIOAddressBase+%mapReg OUT DX, AL ) FI $RESTORE ) ;----------------------- ;Macro used to call a proc that returns via IRET. ; (Pushes flags and CS onto stack.) %*DEFINE (CallIRETproc (proc)) ( $SAVE $GENONLY PUSHF PUSH CS CALL NEAR PTR %proc $RESTORE ) ;------------------------- ;Interrupt controller definition ControllerBlock STRUC interruptSlaveEOIPort DW ? interruptPendingPort DW ? interruptMaskPort DW ? ControllerBlock ENDS sizeOfCB EQU (SIZE ControllerBlock) ; in bytes! ;------------------------- ;Opie queue definition IOPEQueue STRUC handlerIDforHead DB ? handlerIDforTail DB ? linkPtrforHead DW ? linkPtrforTail DW ? IOPEQueue ENDS ;------------------------- ;Segment entry definition (in table: one entry per handler) SegmentEntry STRUC ioRegionSegment DW ? stackSegment DW ? SegmentEntry ENDS ;------------------------- ;Time-of-day format definition timeOfDayFormat STRUC lowWord DW ? highWord DW ? timeOfDayFormat ENDS ;------------------------- ;Address segment & offset format definition SegmentAndOffset STRUC offsetValue DW ? segmentValue DW ? SegmentAndOffset ENDS ;------------------------- ;constants for adjusting flags on stack stackFlagOffset EQU 2 + (SIZE SegmentAndOffset) ;seg-reg, IP, CS waitStackFlagOffset EQU 4 + (SIZE SegmentAndOffset) ;map reg, seg-reg, IP, CS eePromStackFlagOffset EQU 4 + (SIZE SegmentAndOffset) ;BP, DS, IP, CS ;------------------------- ;Work mask condition ptr format definition WorkMaskConditionPtr RECORD workMaskHandlerID: 7, workMaskConditionOffset: 9