mac-rom/Libs/InterfaceSrcs/piMAIN.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

849 lines
29 KiB
Plaintext

;
; File: piMAIN.a
;
; Contains: Pascal Interface for MPP and ATP drivers
;
; Written by: Gene Tyacke (GRT)
; Gursharan Sidhu (GSS)
; Alan Oppenheimer (ABO)
; Rich Andrews (RFA)
;
; Copyright: © 1984-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM3> 1/29/93 RB Do not move the SCCLockout value to the status register, always
; do an ORI.W with it so that NuKernel works and the stack is not
; changed.
; <SM2> 10/28/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <3> 7/24/91 MH also: MPPRefNum, ATPRefNum as per <2> below
; <2> 7/24/91 MH Added conditional wrapper(s) to prevent duplication of public
; interface declarations: tLAPRead, tLAPWrite, tDDPRead,
; tDDPWrite, tNBPLookUp, tNBPConfirm, tNBPRegister,
; tATPSndRequest, tATPGetRequest, tATPSdRsp, tATPAddRsp,
; tATPRequest, tATPResponse
;
;_______________________________________________________________________
;
; 8/24/84 GRT,GSS Version 1.0 Developers Release
; 8/28/84 GRT Code crunch start on versions P/13,P/14...
; 9/15/84 GRT Version 1.1 tested (P/16)
; 9/20/84 RFA UnlockAndLinkHdl not building queue right (P/17)
; 10/3/84 RFA,GRT Code crunch pass two started (P/18)
; 11/6/84 GRT DDP checksum algorithim fixed (PI/1.1C)
; 11/13/84 GRT Changed SUBQ.W to SUBQ.B in ATPRqComp's BDS test loop(PI/1.1D)
; 11/14/84 GRT BTST in ATP calls changed to test bit 0 and not 1 of Pascal
; booleans (PI/1.1E)
; 11/28/84 GRT In ATPSndRequest, clearing high byte of atpNumRsp field before
; returning to the user (PI/1.1E)
; 12/3/84 GRT NBP 1st pass code crunch; GetHdlAndLock params made into .LONG's
; 12/14/84 GRT ATPLoad call checks to make sure MPP is opened before trying to
; open the ATP driver. ATPUnload only closes the driver is the
; system size is 128K.
; 12/17/84 GRT CmpEventPost made into two different routines; one for LAP and
; DDP, and one for NBP and ATP. The original one did not always
; post events correctly when using LAP or DDP async calls.
; 12/17/84 GRT ATP ioRefNum made into constant (-11) instead of getting it
; from the driver. OpenMPP and CloseMPP calls added.
; 12/18/84 GRT LAPProtType record packing changed in interface so corresponding
; change is made here in the assembly. NBP async completion routines
; must save A0 (abRecHandle) until post event call is made. (PI/1.1G)
; 1/3/85 GRT Changed GetNodeNumber call to GetNodeAddress. It also returns
; the network number as well as the node number.
; 1/4/85 RFA Added TIDValid bit support so that ATPReqCancel will work, and
; added SktQElList plus other stuff so that ATPRspCancel works.
; ListLink is new field in ATP's IOQElement (PI/1.1I)
; 1/9/85 GRT,ABO New calls: IsMPPOpen and IsATPOpen added. Names of
; OpenMPP and CloseMPP changed to MPPOpen and MPPClose.
; 1/11/85 GRT Release 1.2a to Library, testers
; 1/21/85 GRT Using new ATalk include file; Changed SPBConfig to SPConfig
; 1/24/85 GRT Version number changed to 3.0
; 2/7/85 GRT In LAPWrite, LAPProtType offset incorrect
; 2/11/85 GRT Removing all occurrances of RTE's in the code
; 2/16/85 GRT Final (for now) Developers Release
; 3/15/85 GRT Doing actual _RecoverHandle call instead of looking at current
; zone ptr so Switcher and File Server Dispatcher will work.
; 4/27/85 GRT Made code into one .PROC so it can be made into a separate
; code resource file.
; 2/20/86 GRT In ATP; ATPRequest completion munged BDS ptr
; 4/28/86 GRT close down code didn't work if app had a IAZNotify proc
; 4/30/86 GRT _RecoverHandle trap removed in completion routines
; 9/11/86 ABO Convert to MPW
; 12/10/86 SJF Made all routines a set of linkable modules. Each major function
; is now a code PROC. The 'ATPL' resource is eliminated. Also
; removed the use of low-memory location $E0.
; 12/10/86 fixed _RecoverHandle Bug (DDPRdCancel)
; Dec. 86 SJF Added routine ATPEnter2, Fixed ATPReqCancel and ATPRspCancel
; so that they always execute syncronously.
; 12/4/89 JAL Removed error codes which are now in SysErr.a and removed
; PrNonPortable equate which is now defined in the Makefile.
;_______________________________________________________________________
BLANKS ON
STRING ASIS
PRINT NOGEN
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'AppleTalk.a' ; appletalk equates
PRINT ON
;_______________________________________________________________________
;
; Equates (offsets) for the various fields in the ABusRecord
;_______________________________________________________________________
abOpCode EQU 0 ; type of call (enumerated type)
abResult EQU abOpCode+2 ; result code
abUserReference EQU abResult+2 ; user defined space
; * LAP definitions *
lapAddress EQU abUserReference+4 ; level 0 address block
; Offsets into the lapAddress block
lapADest EQU lapAddress ; dest byte
lapASource EQU lapADest+1 ; source byte (contents of lapAddress rec)
lapAType EQU lapASource+1 ; type byte {1.1g change}
lapReqCount EQU lapAddress+4 ; request count
lapActCount EQU lapReqCount+2 ; actual count returned by call
lapDataPtr EQU lapActCount+2 ; pointer to data buffer
; * DDP definitions *
; Any BYTE fields are ODD aligned cause Pascal puts the
; byte data into the low order byte of a word in non-packed records.
ddpTypeField EQU abUserReference+5 ; BYTE! level 1 type field
ddpSocket EQU ddpTypeField+2 ; BYTE! socket number
ddpAddrNet EQU ddpSocket+1 ; address block network number
ddpAddrID EQU ddpAddrNet+2 ; address block node ID
ddpAddrSkt EQU ddpAddrID+1 ; address block socket number
ddpReqCount EQU ddpAddrSkt+1 ; request count
ddpActCount EQU ddpReqCount+2 ; actual count
ddpDataPtr EQU ddpActCount+2 ; pointer to ddp buffer
ddpNodeID EQU ddpDataPtr+5 ; BYTE! for DDPRead, who the pkt was sent to (broadcast?)
; * NBP definitions *
nbpEntityPtr EQU abUserReference+4 ; pointer to the 3 entity strings
nbpBufPtr EQU nbpEntityPtr+4 ; nbp buffer pointer
nbpBufSize EQU nbpBufPtr+4 ; size of the above buffer
nbpDataField EQU nbpBufSize+2 ; misc field for socket num, entry nums
nbpAddrNet EQU nbpDataField+2 ; address block network number
nbpAddrID EQU nbpAddrNet+2 ; address block node ID
nbpAddrSkt EQU nbpAddrID+1 ; address block socket number
nbpRetInterval EQU nbpAddrSkt+1 ; retransmission interval
nbpRetCount EQU nbpRetInterval+1 ; retransmission count
; * ATP definitions *
atpSktNum EQU abUserReference+5 ; atp socket number
atpAddress EQU atpSktNum+1 ; atp Address block
atpRCount EQU atpAddress+4 ; request number of bytes
atpDataPtr EQU atpRCount+2 ; ptr to data buffer
atpRspBDSPtr EQU atpDataPtr+4 ; ptr to BDS
atpBMap EQU atpRspBDSPtr+4 ; bit map
atpTID EQU atpBMap+2 ; transaction ID number
atpActCount EQU atpTID+2 ; actual number returned
atpUserBytes EQU atpActCount+2 ; user defined bytes
atpXO EQU atpUserBytes+4 ; exactly once bit
atpEOM EQU atpXO+1 ; end of message bit
atpTimeOut EQU atpEOM+2 ; time out in seconds
atpRetries EQU atpTimeOut+2 ; number of times to retry
atpNumBufs EQU atpRetries+2 ; number of BDS buffers
atpNumRsp EQU atpNumBufs+2 ; number of responses recvd
atpBDSSize EQU atpNumRsp+2 ; size of bds elements
atpRspUData EQU atpBDSSize+1 ; UserBytes recvd in Response
atpRspBuf EQU atpRspUData+4 ; ptr to resp message buf
atpRspSize EQU atpRspBuf+4 ; size of large resp buf
;_______________________________________________________________________
;
; Pascal data structure offsets
;_______________________________________________________________________
; NBP EntityName data structure offsets
nbpEntObj EQU 0 ; start of entity object
nbpEntTyp EQU nbpEntObj+34 ; start of entity type
nbpEntZone EQU nbpEntTyp+34 ; start of entity zone
; MPP Call Types (for storage in abOpCode of ABusRecord)
IF &TYPE('__AppleTalk__') = 'UNDEFINED' THEN
tLAPRead EQU 0
tLAPWrite EQU 1
tDDPRead EQU 2
tDDPWrite EQU 3
tNBPLookUp EQU 4
tNBPConfirm EQU 5
tNBPRegister EQU 6
tATPSndRequest EQU 7
tATPGetRequest EQU 8
tATPSdRsp EQU 9
tATPAddRsp EQU 10
tATPRequest EQU 11
tATPResponse EQU 12
ENDIF
;_______________________________________________________________________
;
; Offsets in the IOQ element block (usually at the end of the normal
; IOQ element block)
;_______________________________________________________________________
; Write Data Structure Offsets (at the end of the IOQElement Blk)
WDSXtraLAPSize EQU 26 ; size of xtra bytes in IOQ for LAP
WDSXtraDDPSize EQU 40 ; size of xtra bytes in IOQ for DDP
xtraNBPSize EQU 14 ; size of xtra bytes in IOQ for NBP
;
; Variables after the IO queue element block
;
abRecHdl EQU IOQElSize ; abRecord handle
qElHdl EQU abRecHdl+4 ; handle to queue element
; LAP and DDP
WDS1Start EQU qElHdl+4 ; start of the WDS 1 data structure
WDS2Start EQU WDS1Start+6 ; start of the WDS 2nd data structure
WDSTerm EQU WDS2Start+6 ; location of the WDS terminator bytes
ABASyncFlag EQU WDSTerm+2 ; async flag (if zero then sync)
WDS1stEntry EQU ABASyncFlag+1 ; LAP or DDP Entry 1
; DDP only
dLAPHdr EQU WDS1stEntry ; beginning of the lap header
dLength EQU dLAPHdr+3 ; length bytes
dCheckSum EQU dLength+2 ; long hdr checksum bytes
dDstNet EQU dCheckSum+2 ; long hdr dest network number
dSrcNet EQU dDstNet+2 ; long hdr src network number
dDstNodeAddr EQU dSrcNet+2 ; long hdr dest node addr
dSrcNodeAddr EQU dDstNodeAddr+1 ; long hdr src node addr
dDstSkt EQU dSrcNodeAddr+1 ; long hdr dest socket
dSrcSkt EQU dDstSkt+1 ; long hdr source socket
dType EQU dSrcSkt+1 ; long hdr type field
sdDstSkt EQU dCheckSum ; short hdr dest socket
sdSrcSkt EQU sdDstSkt+1 ; short hdr src socket
sdType EQU sdSrcSkt+1 ; short hdr type field
; NBP
compactHdl EQU qElHdl+4 ; hdl to compacted name
theAsyncFlag EQU compactHdl+4 ; async flag for NBPLookUp,etc
; ATP
asyncflg EQU qElHdl+4 ; caller's async flag
ListLink EQU asyncflg+2 ; link to other IOQEls
bdsHdl EQU ListLink+4 ; handle to our BDS elements
IOPBEnd EQU bdsHdl+4 ; size of this queue element
;_______________________________________________________________________
;
; Protocol Handler and Socket Listener Table equates
;_______________________________________________________________________
maxHndlr EQU 4 ; currently 4 max handlers
maxSkts EQU 12 ; currently 12 max socket listeners
entrySize EQU 6 ; 6 bytes per handler table entry
; The LAP protocol table is organized by complete entries and not by types
; (i.e., in memory, entry 1 is followed by entry 2, etc). NOTE: This is
; my own table, and not the one used internally by MPP.
theHndlr EQU 0 ; offset of the entries' lap type
theRcvFlag EQU theHndlr+1 ; ditto for pkt recvd flag
thePtr EQU theRcvFlag+1 ; ditto for next read buffer
; The DDP socket table is organized exactly as the LAP protocol table. This
; is also only for use by the interface. The only difference between the tables
; is the socket number at offset zero
theSktNum EQU 0 ; offset into the entries' socket num
; These offsets below are for the new socket table (V1.15 and beyond)
aSktNum EQU 0 ; offset to beginning of socket nums
aRcvFlag EQU aSktNum+maxSkts ; offset to beginning of rcv flags
aRBPtr EQU aRcvFlag+maxSkts ; offset to beginning of read blk ptrs
;_______________________________________________________________________
;
; ReadBlock size and offsets (used in LAPRead and DDPRead)
;_______________________________________________________________________
rbNxPtr EQU 0 ; next element in read link
rbABHdl EQU 4 ; handle to abRecord associated with read blk
rbAFlag EQU 8 ; async flag
rbRetCksErr EQU 9 ; Return checksum errors flag
rbHdl EQU 10 ; handle to the read block
rdBlkSize EQU 14 ; # bytes in the read blk structure
;_______________________________________________________________________
;
; MPP Driver Reference Number (currently static)
;_______________________________________________________________________
IF &TYPE('__AppleTalk__') = 'UNDEFINED' THEN
MPPRefNum EQU -(MPPUnitNum+1) ; driver ref number
ATPRefNum EQU -(ATPUnitNum+1) ; atp driver io ref num
ENDIF
;_______________________________________________________________________
;
; Miscellaneous equates
;_______________________________________________________________________
maxATPBuf EQU 578 ; max # of ATP data bytes
EJECT
;___________________________________________________________________________
;
; Local Variables
;___________________________________________________________________________
PROC
ENTRY ListEl1,myHndlrTable,theSocketTable,saveArea
ENTRY tmpHandler,myRHALen,tmpHndlrEntry,retAddr
ENTRY returnAddr,SktQElList,MPPName,ATPName
ENTRY NBPLoadStatus,tmpEntityName
ListEl1 DC.L 0 ; ptr to first removable handle
myHndlrTable DCB.B maxHndlr*entrySize,0 ; protocol handler table
theSocketTable DCB.B maxSkts*entrySize,0 ; socket listener table
saveArea DCB.B 6,0 ; temporary variable locations
tmpHandler DC.L 0 ; space for lap proto handler addr
myRHALen DC.W 0 ; number of bytes I added to the RHA
tmpHndlrEntry DC.W 0 ; entry num of the handler we are using
retAddr DC.L 0 ; save place for return address
returnAddr DC.L 0 ; place to save the return address
SktQElList DC.L 0 ; head of IOQElement list
MPPName DC.B 4 ; length of name
DC.B '.MPP ' ; driver name (aligned)
ATPName DC.B 4 ; Size of ATP name
DC.B '.ATP ' ; The name itself (aligned)
NBPLoadStatus DC.B 0 ; [NBPLoad] 0=not loaded, 1=loaded
ALIGN 2
tmpEntityName DCB.B 99,0 ; space for compacted entity name
; (only used by NBPRemove)
ENDPROC
;_______________________________________________________________________
;
; Misc Routines
;_______________________________________________________________________
;
;_______________________________________________________________________
;
; RemoveHdlBlks
;
; This call is made by almost every procedure in the pascal interface. Its
; purpose is to check and see if there are any memory blocks to be disposed
; of. The memory blocks are linked in a list (zero denoting the last). If
; there are any elements in the list, it disposes of the handles.
;
; Interrupts are turned off during part of this routine.
;
; Register Usage
; A0 and D0 are clobbered
;
; Possible errors:
; D0 may have error from memory manager call
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 8/29/84 GRT CMP.L changed to MOVE.L (code crunch;comments changed)
; 10/01/84 GRT Interrupts turned off
; 10/21/84 MPH Fixed interrupt bug
;
;_______________________________________________________________________
RemoveHdlBlocks PROC EXPORT
ENTRY RemoveHdlBlks
RemoveHdlBlks
MOVEM.L A1-A2,-(SP) ; Save registers to be conservative
LEA ListEl1,A1 ; Address of List Head
@00
MOVE SR,-(SP) ; Save old interrupt state
ORI.W #SCCLockOut,SR ; Disable interrupts <SM2> rb
MOVE.L (A1),A0 ; First Handle to Free
MOVE.L (A0),A2 ; Address of Block Text
MOVE.L A0,D0 ; Is List Empty?
BEQ.S @10
MOVE.L (A2),(A1) ; Get next block to list head.
@10
MOVE (SP)+,SR ; Enable interrupts
TST.L D0
BEQ.S @20
_DisposHandle ; get rid of handle
BRA.S @00 ; check it
@20
MOVEM.L (SP)+,A1-A2 ; Restore registers
RTS ; Return to caller
ENDPROC
;___________________________________________________________________________
;
; ExitD0,ExitD3
;
; Common Exit routine for LAP, DDP and NBP
;
; Call:
; D0 .WORD function result
; A2 .LONG return address of routine
;
; ExitD3 also restores D3 from stack
;
;___________________________________________________________________________
ExitD3 PROC
ENTRY ExitD0
MOVE.L (SP)+,D3 ; restore D3
ExitD0
MOVE D0,(SP) ; set return code
MOVE.L D2,A1 ; get return address
JMP (A1) ; exit
ENDPROC
;_______________________________________________________________________
;
; DoControlCall
;
; Test to see if the call is sync or async and make the appropriate
; call to the MPP driver. In the case of a sync call, the IO completion
; routine is called through an indirect subroutine jump of its address
; stored in A2.
;
; On Entrance:
; A0 -> IOQ element block
; A2 -> IO completion routine
; D1 = async flag (byte)
;
; On Exit:
; D0 = result of control call
;_______________________________________________________________________
DoControlCall PROC
MOVE #MPPRefNum,IORefNum(A0) ; store driver refnum
TST.B D1 ; check async flag
BEQ.S @10 ; if zero then it's sync
MOVE.L A2,IOCompletion(A0) ; store IO completion address
_Control ,ASYNC ; make async call
BRA.S @20 ; and then exit
@10 _Control ; make sync call
JSR (A2) ; and call the completion routine
@20 RTS
ENDPROC
;_______________________________________________________________________
;
; CmpEntrance
;
; Code saving subroutine that sets up registers used in the IO completion
; routines. It also unlocks the abRecord handle (which will be returned
; back to the user.
;
; On Entrance:
; A0 -> IOQ element block
;
; On Exit:
; A0 = AB Record handle
; A1 -> AB Record blk
; A2 -> IOQ element block (swapped with A0)
; D0 = result of the unlock call made on the IO queue element
;
;_______________________________________________________________________
CmpEntrance PROC
MOVE.L A0,A2 ; A2 -> IOQElement blk; A0 is scratch
MOVE.L ABRecHdl(A0),A0 ; A1 -> AB Record block
MOVE.L (A0),A1 ; dereference
MOVE D0,abResult(A1) ; return result code
_HUnlock ; unlock the ABRecord handle
RTS
ENDPROC
;_______________________________________________________________________
;
; UnlockAndLinkHdl
;
; This routine unlocks the handle (making it relocatable) and links
; the handle into a list of disposable handles. The ptr to the first
; element is stored in ListEl1. Each link is stored in the first 4
; bytes of the handles' block (not in the master pointer!). A zero
; is stored in the last element denoting the end of the list.
;
; An assumption is made that there are at least 4 bytes of space in the
; memory block and that they can be trashed (since I store the link there).
;
; Since this routine is also called by the protocol handler and socket
; listener, interrupts must be turned off during the unlink.
;
; Call:
; A0 .LONG handle to unlock and link
;
; Return:
; D0 .WORD error result from _HUnlock call
;
; Possible errors:
; NIL master pointer
; Can't lock free block
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 8/29/84 GRT Interrupts turned off
; 9/20/84 RFA Changed to add first hdl to queue correctly (P/17)
; 10/01/84 RFA,GRT Free block now linked at beginning of list
; 10/22/84 RFA Shortened interrupt lockout time by moving instruction
;
;_______________________________________________________________________
UnlockAndLinkHdl PROC
MOVE.L A1,-(SP) ; save register
_HUnlock ; unlock the relocatable blk
MOVE.L (A0),A1 ; A1 -> memory block
MOVE SR,-(SP) ; turning off interrupts
ORI.W #SCCLockOut,SR ; <SM2> rb
MOVE.L ListEl1,(A1) ; get first element ptr
LEA ListEl1,A1 ; address of variable
MOVE.L A0,(A1) ; insert new list head
MOVE (SP)+,SR ; restore interrupts
MOVE.L (SP)+,A1 ; restore register
RTS
ENDPROC
;_______________________________________________________________________
;
; Cmp1EventPost
;
; Subroutine that is called after any AppleBus call to the MPP driver
; is made. It posts an event on an async call and also places the IO
; queue element on the disposable memory block list.
;
; This subroutine only works for LAP and DDP.
;
; On Entrance:
; A0 = AB record handle
; A2 -> IOQ element block
;
; On Exit:
; D0 = result of the unlock call made on the IO queue element
;
;_______________________________________________________________________
Cmp1EventPost PROC
TST.B ABASyncFlag(A2) ; check async flag
BEQ.S @10 ; if zero then its a sync call
MOVE.L A0,D0 ; D0 = event message (ABRecHdl)
MOVE #networkEvt,A0 ; this will be a network event
; A0 = handle of the ABRecord D0 = network event number
_PostEvent ; For D0: 0 = posted, 1 = not posted
@10 MOVE.L qElHdl(A2),A0 ; get the IOQelement block handle
JSR UnlockAndLinkHdl ; remove the handle from memory
RTS
ENDPROC
;_______________________________________________________________________
;
; CmpEventPost
;
; Subroutine that is called after any AppleBus call to the MPP driver
; is made. It posts an event on an async call and also places the IO
; queue element on the disposable memory block list.
;
; This subroutine only works for NBP and ATP.
;
; On Entrance:
; A0 = AB record handle
; A2 -> IOQ element block
;
; On Exit:
; D0 = result of the unlock call made on the IO queue element
;
;_______________________________________________________________________
CmpEventPost PROC
TST.B theAsyncFlag(A2) ; check async flag
BEQ.S @10 ; if zero then its a sync call
MOVE.L A0,D0 ; D0 = event message (ABRecHdl)
MOVE #networkEvt,A0 ; this will be a network event
; A0 = handle of the ABRecord D0 = network event number
_PostEvent ; For D0: 0 = posted, 1 = not posted
@10 MOVE.L qElHdl(A2),A0 ; get the IOQelement block handle
JSR UnlockAndLinkHdl ; remove the handle from memory
RTS
ENDPROC
EJECT
;_______________________________________________________________________
;
; GetHdlAndLock
;
; This routine gets a handle to (D0) bytes on the appl heap and locks down
; the handle. This call is register based.
;
; Call:
; D0 .LONG number of bytes to allocate
;
; Return:
; A0 .LONG handle to memory block
; D0 .WORD error result
; Condition codes set upon return
;
; Possible errors:
; Not enough room in zone to allocate memory (NewHandle)
; NIL master pointer (HLock) [This shouldn't happen]
; Can't lock free block (HLock) "
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 10/1/84 GRT Comment changed (we need to pass a long word, not a word)
;
;_______________________________________________________________________
GetHdlAndLock PROC
_NewHandle ; handle will be in A0
TST D0 ; check for error
BNE.S @10 ; if non zero then exit
_HLock ; lock it down
TST D0
@10 RTS
ENDPROC
EJECT
;___________________________________________________________________________
;
; This function checks to see if MPP is open. The boolean function result
; is set to TRUE if it is open, else it will be set to FALSE.
;
; FUNCTION IsMPPOpen : BOOLEAN;
;
; Returns: TRUE if MPP is open
; FALSE if MPP is not open
;
; Uses: D0,D1
;
; Modification History:
;
; 1/9/84 ABO,GRT New Today
;
;___________________________________________________________________________
IsMPPOpen PROC EXPORT
MOVEQ #0,D1 ; clear result (assume FALSE)
MOVE.B PortBUse,D0 ; is Port B in use?
BMI.S @90 ; if not, then just exit
AND.B #$0F,D0 ; clear high bits of flag
SUBQ.B #UseATalk,D0 ; check to see if ATalk is using port
BNE.S @90 ; if not, then MPP is not open
MOVEQ #1,D1 ; else set result to TRUE
@90 MOVE.B D1,4(SP) ; return result back to user
RTS
ENDPROC
EJECT
;___________________________________________________________________________
;
; GetNodeAddress - Returns my AppleTalk node address stored in MPP variables
;
; FUNCTION GetNodeAddress(VAR myNode,myNet : INTEGER): OSErr;
;
; Returns: NoErr
; MPP driver not installed
;
; TOS => .LONG Return address
; .LONG Address of myNet variable
; .LONG Address of myNode variable
; .WORD Function result code
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 1/3/85 GRT Add the network number also
; 1/10/85 GRT Removing call to RemoveHdlBlocks so call can be made from asmb
;
;___________________________________________________________________________
GetNodeAddress PROC EXPORT
MOVE.L (SP)+,D2 ; return address popped
CLR -(SP) ; clear for function result
JSR IsMPPOpen ; is MPP opened? (D0,D1 are trashed)
TST.B (SP)+ ; check result
BNE.S @10 ; if TRUE then jump and continue
; If driver not installed, just pop off data on stack and jump to exit point
MOVE #NoMPPErr,D0 ; error constant
ADDQ #8,SP ; pop off data
BRA.S @90
; Grab the requested data from the MPP globals variable location
@10 MOVE.L ABusVars,A0 ; pointer to MPP variables
MOVE.L (SP)+,A1 ; address of myNet
MOVE SysNetNum(A0),(A1) ; store current net number
MOVE.L (SP)+,A1
CLR (A1) ; clear entire word out
MOVE.B SysLAPAddr(A0),1(A1) ; stash node number
CLR D0 ; no error
@90 MOVE D0,(SP) ; store func result
MOVE.L D2,A1 ; get return address back
JMP (A1) ; exit
ENDPROC
EJECT
;___________________________________________________________________________
;
; This function checks to see if ATP is open. The boolean function result
; is set to TRUE if it is open, else it will be set to FALSE. Note that
; we first check to see if MPP is open since you can't run ATP without MPP.
;
; FUNCTION IsATPOpen : BOOLEAN;
;
; Returns: TRUE if ATP is open
; FALSE if ATP is not open
;
; Uses: D1 (IsMPPOpen uses D0 also)
;
; Modification History:
;
; 1/9/84 ABO,GRT New Today
;
;___________________________________________________________________________
IsATPOpen PROC EXPORT
CLR -(SP) ; result for call
BSR IsMPPOpen ; check to make sure MPP is open
MOVEQ #0,D1 ; clear result (assume FALSE)
TST.B (SP)+ ; is MPP open??
BEQ.S @90 ; if not then exit
BTST #ATPLoadedBit,PortBUse ; check to see if ATP is loaded in
BEQ.S @90 ; if not, then exit
MOVEQ #1,D1 ; else set result to TRUE
@90 MOVE.B D1,4(SP) ; return result back to user
RTS
ENDPROC
EJECT
;___________________________________________________________________________
;
; MPPOpen - Opens the MPP driver. No error is returned if everything goes
; OK or MPP is already open. This routine can (and probably will) be called
; by other functions or by the user himself.
;
; FUNCTION MPPOpen : OsErr;
;
; Returns: Errors from _Open call
; PortInUse
; PortNotCf
; noErr
;
; If there is not enough memory in the heap to load MPP, the ROM sometimes
; returns back a -35 (No such volume exists) error as the function result.
; Unfortunately, we can't do anything about it other than watch for it.
;
; Modification History:
;
; 12/14/84 GRT New Today
; 1/9/85 ABO,GRT Changed the way we check to see if MPP is loaded. Using
; PortBUse lomem variable
; 1/21/85 GRT Changed SPBConfig to SPConfig (per ABO)
;
;___________________________________________________________________________
MPPOpen PROC EXPORT
CLR -(SP) ; func result space
JSR IsMPPOpen
CLR D0 ; assume no error
TST.B (SP)+ ; is mpp open?
BNE.S @90 ; if already open then just exit
; MPP is not open
MOVE.B PortBUse,D1 ; is someone else using it?
BMI.S @20 ; if not then branch
; Someone else is using the port so report the error
MOVEQ #PortInUse,D0 ; set error
BRA.S @90
@20 MOVE.B SPConfig,D0 ; get config data
AND.B #$0F,D0 ; clear high bits
SUBQ.B #UseATalk,D0 ; find out if ATalk is using it
BLE.S @30 ; branch if ATalk or port unconfigured
MOVEQ #PortNotCf,D0 ; set port not configured correctly
BRA.S @90
; Make the open call to the driver
@30 SUB #IOQElSize,SP ; allocate queue element on stack
MOVE.L SP,A0 ; put address into A0
LEA MPPName,A1 ; name of driver to open
MOVE.L A1,IOFileName(A0) ; place into IO Q element
CLR.B IOPermssn(A0)
_Open ; open the .MPP driver
ADD #IOQElSize,SP ; deallocate queue element
; D0 should be cleared
@90 MOVE D0,4(SP) ; return function result
RTS ; that's all folks!
ENDPROC
EJECT
;___________________________________________________________________________
;
;
; FUNCTION MPPClose : OsErr;
;
; Returns: Errors from _Close call
; noErr
;
; Modification History:
;
; 12/17/84 GRT New Today
;
;___________________________________________________________________________
MPPClose PROC EXPORT
SUB #IOQElSize,SP ; allocate queue element on stack
MOVE.L SP,A0 ; put address into A0
MOVE #MPPRefNum,ioRefNum(A0) ; closing the MPP dirver
_Close
ADD #IOQElSize,SP ; deallocate queue element
MOVE D0,4(SP) ; return function result
RTS ; that's all folks!
ENDPROC
EJECT
INCLUDE ':piLAP.a'
INCLUDE ':piDDP.a'
INCLUDE ':piATP.a'
INCLUDE ':piNBP.a'
END