mac-rom/Libs/InterfaceSrcs/piNBP.a

660 lines
21 KiB
Plaintext
Raw Normal View History

BLANKS ON
STRING ASIS
EJECT
;_______________________________________________________________________
;
; NBP Routines
;_______________________________________________________________________
;
;_______________________________________________________________________
;
; NBPLoad
;
; Loads NBP code into the application heap. If it is already loaded,
; it does nothing.
;
; This call can only be made syncronously. The IOQ element block is
; allocated on the stack for the control call.
;
; FUNCTION NBPLoad : INTEGER;
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .WORD function result code
;
; Returns: .WORD Result code
;
; Possible errors:
;
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 12/3/84 GRT Code crunch; eliminated register saving
;
;_______________________________________________________________________
NBPLoad PROC EXPORT
ENTRY NBPEnterInit,CheckNBPLoaded
JSR NBPEnterInit ; init code
MOVE #LoadNBP,CSCode(A0) ; code number for load NBP
_Control
ADD #IOQElSize,SP ; deallocate the queue element
MOVE D0,4(SP) ; return function result (CCRs set)
LEA NBPLoadStatus,A1
SEQ (A1) ; set load status information
RTS
EJECT
;_______________________________________________________________________
;
; NBPEnterInit
;
; Common code for NBP Load and Unload calls std init routines and allocates
; an IO queue element on the stack.
;
; On return, A0 is a pointer to the IO queue element block
; A1 is trashed
;_______________________________________________________________________
NBPEnterInit MOVE.L (SP)+,A1 ; get subroutine return addr
JSR RemoveHdlBlks ; check handles
SUB #IOQElSize,SP ; allocate space for the IOQEl
MOVE.L SP,A0 ; A0 -> IO queue element block
MOVE #MPPRefNum,IORefNum(A0) ; set refnum up
JMP (A1) ; exit
;_______________________________________________________________________
;
; CheckNBPLoaded
;
; Checks to see if NBP has been loaded in. If not, an open call is
; automatically made to the driver.
;
; On Return:
; D0 = zero if NBP is loaded and ready
; Condition codes are set upon exit
; A1 is trashed and D0 returns error result
;_______________________________________________________________________
CheckNBPLoaded CLR D0 ; clear error result (assume no error)
LEA NBPLoadStatus,A1
TST.B (A1) ; test to see if NBP is loaded in
BNE.S @90
MOVEM.L D1-D2/A0,-(SP) ; save required registers
CLR -(SP) ; space for function result
JSR NBPLoad ; make the call
MOVE (SP)+,D0 ; get result of load call
MOVEM.L (SP)+,D1-D2/A0 ; restore registers
@90 TST D0 ; test
RTS
ENDPROC
EJECT
;_______________________________________________________________________
;
; NBPUnload
;
; Unload the NBP non-resident code
;
; FUNCTION NBPUnload : INTEGER;
;
; This call can only be made syncronously. The IOQ element block is
; allocated on the stack for the control call.
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .WORD function result code
;
; Returns: .WORD Result code
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 12/3/84 GRT Code curnch; eliminated register saving
;
;_______________________________________________________________________
NBPUnload PROC EXPORT
JSR NBPEnterInit ; std init calls; allocate IOQ element
MOVE #UnLoadNBP,CSCode(A0) ; code number for unload NBP
_Control
ADD #IOQElSize,SP ; deallocate the queue element
MOVE D0,4(SP) ; return function result
LEA NBPLoadStatus,A1
CLR.B (A1) ; clear (nbp not loaded)
RTS
ENDPROC
EJECT
;_______________________________________________________________________
;
; NBPLookUp
;
; Looks up a name over the (inter)net.
;
; The IOQ element block associated with the control call contains an
; extra 6 bytes at the end, holding the ptr to the abRecord and the
; async flag.
;
; FUNCTION NBPLookUp(abRecord : ABRecHandle; async: BOOLEAN): INTEGER;
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .BYTE async flag
; .BYTE pascal filler
; .LONG record handle
; .WORD function result code
;
; Returns: .WORD Result code
;
; Possible errors:
;
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 12/3/84 GRT Made BRA.S after @2; GetHdlAndLock requires .LONG param
; 12/18/84 GRT In completion routine, abRecHandle saved on stack and
; later restored
; 3/15/85 GRT RecoverHandle call added
; 5/1/86 GRT saving queue element handle in the queue element
;_______________________________________________________________________
NBPLookUp PROC EXPORT
ENTRY CompactData,CrunchName
JSR RemoveHdlBlks ; check handles to be disposed
MOVE.L (SP)+,D2 ; save return address
MOVE.B (SP)+,D1 ; save async flag
MOVE.L (SP)+,A0 ; record handle copy made
JSR CheckNBPLoaded ; does NBP need to be loaded?
BNE.S @100 ; if error then exit!
@2 MOVEM.L A2-A3,-(SP) ; save A2/3
_HLock ; lock record handle down
TST D0 ; test result
BNE.S @90 ; if not zero return an error
MOVE.L (A0),A2 ; A2 -> Ptr to ABRecord
MOVE.L A0,A1 ; save handle for later storage
MOVE #1,abResult(A2) ; 1 means we are currently in execution
MOVE.B #tNBPLookUp,abOpCode(A2) ; put call type in record
MOVE.L #IOQElSize+xtraNBPSize,D0 ; number of bytes to allocate
JSR GetHdlAndLock ; allocate the memory A0->IOQElement Hdl
BNE.S @90 ; error if didn't work
MOVE.L A0,D0 ; D0 = handle to queue element
MOVE.L (A0),A0 ; A0 -> IOQElement blk (dereferenced)
MOVE.L D0,qElHdl(A0) ; save handle in queue element
MOVE.L A1,ABRecHdl(A0) ; save it in case the call is async
; A2 points to ABRecord. A0 points to IOQElement
JSR CompactData ; compact the entity name into a ptr
BNE.S @90 ; error can only be from GetHdlAndLock
; Upon return, A3 = ptr to compacted data.
; Since we have to dispose of the compaction ptr, I am assuming that entityPtr
; contains a valid ptr to the data block, even after returning from the control call.
LEA Interval(A0),A1 ; A1 -> start of CSParam area
MOVE nbpRetInterval(A2),(A1)+ ; set interval time
MOVE.L A3,(A1)+ ; set entity ptr for control call
MOVE.L nbpBufPtr(A2),(A1)+ ; ptr to where matches will be
MOVE nbpBufSize(A2),(A1)+ ; size of return buffer
MOVE nbpDataField(A2),(A1) ; max entries to get
MOVE.B D1,theAsyncFlag(A0) ; save async flag in IOQ blk
MOVE #LookUpName,CSCode(A0) ; set control code
LEA LkUpComplete,A2 ; A2 -> our IO completion routine
JSR DoControlCall ; make the call
@90 MOVEM.L (SP)+,A2-A3 ; restore A2/3
@100 JMP ExitD0 ; return
;_______________________________________________________________________
;
; LkUpComplete
;
; IO completion routine for NBP LookUp
; A0 -> IOQ element block
;_______________________________________________________________________
LkUpComplete
MOVEM.L D0/A0-A2,-(SP) ; save registers
JSR CmpEntrance ; set up registers, unlock AB record hdl
MOVE.L A0,-(SP) ; save abRecHandle temporarily
MOVE NumGotten(A2),nbpDataField(A1) ; return num received
; release memory space used by the compacted entity name
MOVE.L compactHdl(A2),A0 ; A0 = handle to compaction block
JSR UnlockAndLinkHdl
MOVE.L (SP)+,A0 ; get back the abRecHandle
JSR CmpEventPost ; check to see if we need to post event
MOVEM.L (SP)+,D0/A0-A2 ; restore registers
RTS
EJECT
;_______________________________________________________________________
;
; CompactData
;
; Compacts a pascal entity record into a single name for use by
; NBP. This routine allocates max size for the entity name on the heap.
;
; Entry: A2 ptr to ab record
; A0 ptr to current IO Q element block
; Returns: A3 ptr to compacted name
; D0 error code
;
; Modification History:
; 8/23/84 ABO New Today
; 12/3/84 GRT GetHdlAndLock requires .LONG parameter
; 5/1/86 GRT saving memory block hdl into queue element
;_______________________________________________________________________
CompactData
MOVEM.L A0-A2/D1,-(SP)
MOVE.L A0,A1 ; A1 -> queue element
MOVE.L #99,D0 ; max size of names entity
JSR GetHdlAndLock ; allocate space
BNE.S @90 ; if error, exit
MOVE.L A0,compactHdl(A1) ; save hdl in queue element
MOVE.L (A0),A0 ; dereference ptr to compact data
MOVE.L A0,A3 ; save for returning later
MOVE.L nbpEntityPtr(A2),A2 ; A2 = ptr to beginnning of pascal data
BSR.S CrunchName ; do the compaction
CLR D0 ; no error
@90 MOVEM.L (SP)+,A0-A2/D1
RTS
;
; This lower level routine does the actual compaction. NBPRemove uses
; this routine directly.
;
; Call: A2 -> pascal entity name structure
; A0 -> where to put the compacted name
;
; D0-D1 are trashed; A0-A2 are too.
CrunchName
LEA nbpEntObj(A2),A1 ; initial starting address
MOVE.B (A1),D1 ; get length byte of string
BSR MoveBytes ; move those bytes!
LEA nbpEntTyp(A2),A1 ; address of type field
MOVE.B (A1),D1 ; get type length
BSR MoveBytes
LEA nbpEntZone(A2),A1 ; address of zone field
MOVE.B (A1),D1 ; get zone name length
BSR MoveBytes
RTS
;
; MoveBytes is a specific NBP routine for moving an unsigned number of bytes.
;
; Call: D1 = number of bytes to move
; A0 = ptr to place bytes
; A1 = ptr to move bytes from
;
; A0,A1,D1 is modified
;
MoveBytes MOVE.B (A1)+,(A0)+ ; move a byte
SUBQ.B #1,D1 ; dec counter
BHS.S MoveBytes ; if still more then go back
RTS
ENDPROC
EJECT
;___________________________________________________________________________
;
; NBPExtract - extract a tuple from a NBPLookup buffer.
;
; This call does not check to load the NBP code in since it really is only
; a utility, and never actually calls the NBP low level code.
;
; Call: theBuffer - pointer to the lookup buffer
; NumInBuff - number of tuples in the buffer
; whichOne - which tuple to extract (starts at one)
;
; Returns: abEntity - the extracted entity name
; addr - the extracted entity address
; error result - noErr or eExtractErr
;
; FUNCTION NBPExtract (theBuffer : Ptr; numInBuf : INTEGER;
; whichOne : INTEGER; VAR abEntity : EntityName
; VAR address : addrBlock) : INTEGER;
;
; Stack setup upon entry:
; .LONG Return address
; .LONG AddrBlock address
; .LONG abEntity address
; .WORD whichOne
; .WORD NumInBuf
; .LONG theBuffer pointer
; .WORD Function result (return code)
;
; Modification History:
; 8/24/84 New Today (ABO)
;
;_____________________________________________________________________________
NBPExtract PROC EXPORT
JSR RemoveHdlBlks ; check handles to be disposed
LEA 12(SP),A0 ; A0 -> whichone
MOVE #extractErr,D2 ; Assume an error
MOVE (A0)+,D1 ; D1 = whichOne
BEQ.S ExtError ; Zero's an error
CMP (A0)+,D1 ; Is it there?
BHI.S ExtError ; Error if not
MOVE.L (A0),A1 ; A1 -> the buffer
ExtLoop SUBQ #1,D1 ; Decrement count until got it
BEQ.S ExtGot ; Branch if got the one we want
ADDQ #TupleName,A1 ; A1 -> name in next tuple
CLR D2 ; Clear out D2 high byte
MOVE.B (A1),D2 ; D2 = object length
ADD.B 1(A1,D2),D2 ; D2 = type + object length
ADD.B 2(A1,D2),D2 ; D2 = zone + type + object length
ADDQ.B #3,D2 ; D2 = entity name length
ADD D2,A1 ; A1 -> next entity
BRA.S ExtLoop ; Loop
ExtGot MOVE.L 4(SP),A0 ; A0 -> address block
MOVE.B (A1)+,(A0)+ ; Move in address from the tuple
MOVE.B (A1)+,(A0)+ ; (All four bytes)
MOVE.B (A1)+,(A0)+
MOVE.B (A1)+,(A0)+
ADDQ #1,A1 ; Skip over enumerator
MOVEQ #3,D2 ; D2 = number of parts to do
MOVE.L 8(SP),D0 ; D0 -> place for entity
@5 MOVE.L D0,A0 ; A0 -> place for next part
MOVE.B (A1),D1 ; D1 = size of next part
@10 MOVE.B (A1)+,(A0)+ ; Move in next byte of next part
SUBQ.B #1,D1 ; Decrement count
BCC.S @10 ; Move in whole next part
ADD.L #nbpEntTyp,D0 ; D0 -> place for next part
SUBQ #1,D2 ; Decrement count of parts to do
BNE.S @5 ; Move in all three parts
ExtError MOVE.L (SP)+,A1 ; A1 = return address
ADD #4+4+2+2+4,SP ; Pop off arguments
MOVE D2,(SP) ; Set error code
JMP (A1) ; And return
ENDPROC
EJECT
;_______________________________________________________________________
;
; NBPConfirm
;
; Confirms an entity name over the net.
;
; The IOQ element block associated with the control call contains an
; extra 6 bytes at the end, holding the ptr to the abRecord and the
; async flag.
;
; FUNCTION NBPConfirm(abRecord : ABRecHandle; async: BOOLEAN): INTEGER;
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .BYTE async flag
; .BYTE pascal filler
; .LONG record handle
; .WORD function result code
;
; Returns: .WORD Result code
;
; Possible errors:
;
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 12/3/84 GRT GetHdlAndLock requires .LONG parameter; made BRA.S after @2
; 12/18/84 GRT In completion routine, abRecHandle saved on stack and
; then restored before making CmpPostEvent call.
; 3/15/85 GRT RecoverHandle call added
; 5/1/86 GRT saving queue element handle in the queue element
; No more _RecoverHandle in completion routine
;_______________________________________________________________________
NBPConfirm PROC EXPORT
JSR RemoveHdlBlks ; check handles to be disposed
MOVE.L (SP)+,D2 ; save return address
MOVE.B (SP)+,D1 ; save async flag
MOVE.L (SP)+,A0 ; record handle copy made
JSR CheckNBPLoaded ; do we need to load in NBP?
BNE @100 ; if error then exit!
@2 MOVEM.L A2-A3,-(SP) ; save A2/3
_HLock ; lock record handle down
TST D0 ; test result
BNE.S @90 ; if not zero return an error
MOVE.L (A0),A2 ; A2 -> Ptr to ABRecord
MOVE.L A0,A1 ; save another copy of the handle
MOVE #1,abResult(A2) ; 1 means we are currently in execution
MOVE.B #tNBPConfirm,abOpCode(A2) ; put call type in record
MOVE.L #IOQElSize+xtraNBPSize,D0 ; number of bytes to allocate
JSR GetHdlAndLock ; allocate the memory A0->IOQElement Hdl
BNE.S @90 ; error if didn't work
MOVE.L A0,D0 ; D0 = handle to queue element
MOVE.L (A0),A0 ; A0 -> IOQElement blk (dereferenced)
MOVE.L D0,qElHdl(A0) ; save hdl in queue element
MOVE.L A1,ABRecHdl(A0) ; save it for use by the completion routine
; A2 points to ABRecord. A0 points to IOQElement
JSR CompactData ; compact the entity name into a ptr
BNE.S @90 ; if error then exit
; Upon return, A3 = ptr to compacted data.
; Since we have to dispose of the compaction ptr, I am assuming that entityPtr
; contains a valid ptr to the data block, even after returning from the control call.
MOVE.L A3,EntityPtr(A0) ; set entity ptr for control call
MOVE nbpRetInterval(A2),Interval(A0) ; set interval time (gets bothe info)
MOVE.L nbpAddrNet(A2),ConfirmAddr(A0) ; addr to confirm at
MOVE.B D1,theAsyncFlag(A0) ; save aysnc flag
MOVE #ConfirmName,CSCode(A0) ; set control code
LEA CnfrmComplete,A2 ; A2 -> our IO completion routine
JSR DoControlCall ; make the call to the driver
@90 MOVEM.L (SP)+,A2-A3 ; restore A2/3
@100 JMP ExitD0 ; return
;_______________________________________________________________________
;
; CnfrmComplete
;
; IO completion routine for NBP LookUp
; A0 -> IOQ element block
;_______________________________________________________________________
CnfrmComplete
MOVEM.L D0/A0-A2,-(SP) ; save registers
JSR CmpEntrance ; set up registers, unlock AB record hdl
MOVE.L A0,-(SP) ; save abRecHandle temporarily
; return relevant info to ab record
CLR nbpDataField(A1) ; zero out entire word
MOVE.B NewSocket(A2),nbpDataField+1(A1) ; return new socket info
; release memory block associated with the compacted entity name
MOVE.L compactHdl(A2),A0 ; A0 = handle to compact memory blk
JSR UnlockAndLinkHdl
MOVE.L (SP)+,A0 ; get back the abRecHandle
JSR CmpEventPost ; see if we need to post event
MOVEM.L (SP)+,D0/A0-A2 ; restore registers
RTS
ENDPROC
EJECT
;_______________________________________________________________________
;
; NBPRegister
;
; Registers a name in the Names Directory. The user is responsible for
; allocating a n byte Names Table Queue Element. Once passed to MPP,
; it belongs to the driver until a NBPRemove call is made. The ptr
; to the NTQEl is passed in nbpBufPtr.
;
; The IOQ element block associated with the control call contains an
; extra 8 bytes at the end, holding the ptr to the abRecord and a ptr
; to the compacted entity name.
;
; FUNCTION NBPRegister(abRecord : ABRecHandle; async: BOOLEAN): INTEGER;
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .BYTE async flag
; .BYTE pascal filler
; .LONG record handle
; .WORD function result code
;
; Returns: .WORD Result code
;
; Possible errors:
;
;
; Modification History:
; 8/24/84 GRT Ready for alpha release
; 12/3/84 GRT GetHdlAndLock requires .LONG parameter
; 5/1/86 GRT Saving queue element handle in queue element
;_______________________________________________________________________
NBPRegister PROC EXPORT
JSR RemoveHdlBlks ; check handles to be disposed
MOVE.L (SP)+,D2 ; save return address
MOVE.B (SP)+,D1 ; save async flag
MOVE.L (SP)+,A0 ; record handle copy made
JSR CheckNBPLoaded ; do we need to load in NBP code?
BNE @100 ; if error then exit!
@2 MOVEM.L A2-A3,-(SP) ; save A2/3
_HLock ; lock record handle down
TST D0 ; test result
BNE.S @90 ; if not zero return an error
MOVE.L (A0),A2 ; A2 -> ptr to ABRecord
MOVE.L A0,A1 ; save handle for later
MOVE #1,abResult(A2) ; 1 means we are currently in execution
MOVE.B #tNBPRegister,abOpCode(A2) ; put call type in record
MOVE.L #IOQElSize+xtraNBPSize,D0 ; number of bytes to allocate
JSR GetHdlAndLock ; allocate the memory A0->IOQElement Hdl
BNE.S @90 ; error if didn't work
MOVE.L A0,D0 ; D0 = handle
MOVE.L (A0),A0 ; A0 -> IOQElement blk (dereferenced)
MOVE.L D0,qElHdl(A0) ; save handle in queue element
MOVE.L A1,ABRecHdl(A0) ; save ab ptr for completion routine
MOVEM.L A0-A2/D1,-(SP) ; must save cause crunch name clobbers them
MOVE.L nbpBufPtr(A2),A3 ; get ptr to new buffer
MOVE.L A3,NTQElPtr(A0) ; save for MPP
ST VerifyFlag(A0) ; no verify on network
MOVE.B nbpAddrSkt(A2),NTSocket(A3) ; save socket number
LEA NTEntity(A3),A0 ; get ptr to the entity name
MOVE.L nbpEntityPtr(A2),A2 ; ptr to pascal entity name
; On call, A2 -> pascal entity name, A0 -> place to put crunched name
; Crunch name does not allocate any memory (unlike CompactName)
JSR CrunchName ; compact the entity name into a ptr
MOVEM.L (SP)+,A0-A2/D1 ; restore saved registers
; Restored: A2 points to ABRecord. A0 points to IOQElement
MOVE nbpRetInterval(A2),Interval(A0) ; set interval time (gets both info)
MOVE.B D1,theAsyncFlag(A0) ; save async flag
MOVE #RegisterName,CSCode(A0) ; set control code
LEA RgstrComplete,A2 ; A2 -> our IO completion routine
JSR DoControlCall ; make the control call
@90 MOVEM.L (SP)+,A2-A3 ; restore A2/3
@100 JMP ExitD0 ; return
;_______________________________________________________________________
;
; RgstrComplete
;
; IO completion routine for NBP Confirm
; A0 -> IOQ element block
;_______________________________________________________________________
RgstrComplete
MOVEM.L D0/A0-A2,-(SP) ; save registers
JSR CmpEntrance ; set up registers, unlock AB record hdl
JSR CmpEventPost ; check to see if we need to post event
MOVEM.L (SP)+,D0/A0-A2 ; restore registers
RTS
ENDPROC
EJECT
;_______________________________________________________________________
;
; NBPRemove
;
; Remove a name from the Names Directory.
;
; The IOQ element block associated with the control call is allocated
; on the stack. This call is only made synchronously.
;
; FUNCTION NBPRemove(abEntity : EntityPtr): INTEGER;
;
; Stack upon entry:
;
; TOS => .LONG Return address
; .LONG ptr to entity name
; .WORD function result code
;
; Returns: .WORD Result code
;
; Possible errors:
;
;
; Modification History:
; 8/24/84 Ready for alpha release (GRT)
;
;_______________________________________________________________________
NBPRemove PROC EXPORT
JSR RemoveHdlBlks ; check handles
MOVE.L (SP)+,D1 ; save return address
MOVE.L (SP)+,D0 ; ptr to pascal entity name
MOVE.L D1,-(SP) ; push back return address
MOVE.L A2,-(SP) ; save A2
MOVE.L D0,A2 ; put entity name ptr in A2
JSR CheckNBPLoaded ; do we need to load in NBP code?
BNE @100 ; if error then exit!
@2 LEA tmpEntityName,A0 ; address of where to put name
JSR CrunchName ; put the name in the right order
SUB #IOQElSize,SP ; allocate space for the IOQEl
MOVE.L SP,A0 ; A0 -> IO queue element block
LEA tmpEntityName,A1 ; get the addr of the name back
MOVE.L A1,EntityPtr(A0) ; set entity ptr
MOVE #RemoveName,CSCode(A0) ; code number for load NBP
MOVE #MPPRefNum,IORefNum(A0) ; set refnum up
_Control
ADD #IOQElSize,SP ; deallocate the queue element
@100 MOVE.L (SP)+,A2 ; restore A2
MOVE D0,4(SP) ; return function result
RTS
ENDPROC