DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ P T ┃
Length: 7947 (0x1f0b) Types: TextFile Names: »PEAB_INTERPROGRAM_COMMUNICATION_ASM«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2 └─ ⟦77aa8350c⟧ »DATA« └─⟦f794ecd1d⟧ └─⟦24d1ddd49⟧ └─⟦this⟧
;============================================================================= ; Copyright (C) 1989 PHILIPS ELEKTRONIKINDUSTRIER AB , SWEDEN 3.0 ;============================================================================= ; ; ; UNIT NAME : ; PEAB_INTERPROGRAM_COMMUNICATION_ASM ; ; KEYWORDS ; IPCO ; ; CONTENTS ; ; Creation information: ; ; CI-Element-Id : 15/SOURCE-100132 ; Programmer : CURT STR\M/CUST ; Creation date : 1989-01-02 ; Department : DGG ; Project : BS2000 ; ; Revision history: ; 1.0/CUST/1989-01-02/First release ; ; Unit function: ; Support for Ada runtime. IPC-specific operations required by ART ; to handle IPC messages in rendezvous. The actual code is contained ; in OS2000 and this unit is just the interface. ; ; N.B. This unit is ONLY referenced by ART and is logically an ; extension of ART. ; ; Dependencies: ; MC68020/OS2000/CDF ; ; Improvements: ; No suggestions ; ;============================================================================= .module "PEAB_INTERPROGRAM_COMMUNICATION_ASM" .gbl.l __ipc_handle_protocol .gbl.l __ipc_release_buffer .gbl.l __ipc_evacuate_queue ; ; Miscellaneous definitions ; cct_start equ 16#400# a32_size equ 16#0200_0000# ; ; CCT offsets ; pi_cpt equ 88 ; ; CPT offsets ; os2000svcptr equ 72 ; ; OS2000 svc offsets ; ipc$handle_protocol equ 79 ipc$release_buffer equ 80 ipc$evacuate_queue equ 81 ;------------------------------------------------------------------- ; General parameter offsets in stack ; P1 is the first parameter in the list, P2 is the second and so on. ; Link A6,xx is supposed to have been performed and the offsets ; are valid from the resulting A6 frame pointer. P1 equ 8 P2 equ P1+4 P3 equ P2+4 P4 equ P3+4 P5 equ P4+4 P6 equ P5+4 ;------------------------------------------------------------------------ .sect ada_code,code,relocatable,alignment:=2 ;---------------------------------------------------------------- ; ; Macro _$setup_svc_in_a1 ; ; Set up a1 to point to the svc table ; ; Destroys: d1 ; ;---------------------------------------------------------------- .macro setup_svc_in_a1 move.l sp,d1 andi.l #(-a32_size),d1 movea.l ([cct_start+pi_cpt,d1.l],os2000svcptr),a1 ;a1 -> svc .endmacro ;------------------------------------------------------------------------ ; ; procedure Handle_Protocol (Buffer : in out Buffer_Address; P1 ; Slot_Data : in Message_Slot_Data; P2 ; Queue_Data : in Associated_Data; P3 ; Parameters : out Parameter_Address; P4 ; Ignore_Message : out Boolean); P5 ; ; Shared C interface: ; ; status IPC$Handle_Protocol (Buffer,Slot_Data,Queue_Data,Parameters) ; ; uchar **Buffer; /* in out Pointer to buffer address d0 */ ; ulong Slot_Data; /* in Third word in IPC token d1 */ ; uchar *Queue_Data; /* in User data of current queue sp+4 */ ; uchar **Parameters;/* in out Pointer to parameter address sp+8 */ ; ; ; Stack layout before call to IPC$Handle_Protocol: ; ; sp -> Queue_Data ; +4 *Parameters ------------+ ; a6 -> Old a6 ! ; a6+4 Return address ! ; a6+8 Buffer (=> d0) ! ; a6+12 Slot_Data (=> d1) ! ; a6+16 Queue_Data ! ; a6+20 Parameters <------------+ ; a6+24 Ignore_Message ; ; Function: ; Process an incoming message and produce a parameter block which ; is suitable for a rendezvous call to the receiver. Also manage ; virtual channels on a low level for a receiver. This format is ; depending on the actual parameter profile for a receiver. The incoming ; message buffer may be exchanged by this procedure! If a message is ; not qualified to be passed to the receiver then Ignore_Message is ; True and the buffer is deallocated. If Ignore_Message is False then ; the buffer is NOT deallocated. ; ; This procedure is called by ART when it has retreived an IPC token ; from the queue but before the actual "rendezvous". ; ;------------------------------------------------------------------------ __ipc_handle_protocol: .local link a6,#0 setup_svc_in_a1 clr.l (p5,a6) ; Ignore_Message = False moveq.l #p1,d0 add.l a6,d0 ; d0 := *Buffer move.l (p2,a6),d1 ; D1 = Slot_Data pea (p4,a6) ; -(sp) = *Parameters move.l (p3,a6),-(sp) ; -(sp) = Queue_Data jsr ([IPC$Handle_Protocol*4,a1]) ; Call shared library tst.l d0 ; D0=status beq.s $exit $ignore:move.b #1,(p5+3,a6) ; Ignore_Message = True $exit: unlk a6 rts ;------------------------------------------------------------------------ ; ; procedure Release_Buffer (The_Buffer : in Buffer_Address; P1 ; Slot_Data : in Message_Slot_Data); P2 ; ; Shared C interface: ; ; status IPC$Release_Buffer (Buffer,Slot_Data) ; ; uchar *Buffer /* in The buffer address d0 */ ; ulong Slot_Data /* in Third longword in IPC token d1 */ ; ; Function: ; Release a buffer (deallocate). Use the proper method which is ; controlled by the Slot_Data parameter. ; ; This procedure is called by ART after a "rendezvous" is made to ; free the message buffer. ; ;------------------------------------------------------------------------ __ipc_release_buffer: .local link a6,#0 setup_svc_in_a1 move.l (p1,a6),d0 ; D0 = Buffer move.l (p2,a6),d1 ; D1 = Slot_Data jsr ([IPC$Release_Buffer*4,a1]) ; Call shared library unlk a6 rts ;------------------------------------------------------------------------ ; ; procedure Evacuate_Queue (The_Queue : in out Message_Queue.Queue; P1 ; Queue_Data : in Associated_Data); P2 ; ; Shared C interface: ; ; status IPC$Evacuate_Queue (Queue,Delete_Queue) ; ; q_address_t *Queue /* in out The queue pointer d0 */ ; ulong *Delete_Queue /* in TRUE/FALSE d1 */ ; ; N.B. The Queue_Data parameter is discarded in this interface! ; ; Function: ; Close a queue and deallocate all resources tied to it. Also abort ; any open channels, "group_off" any multicast subscriptions and ; undefine any name in the name server. The queue is emptied but ; NOT deleted! ; ; This procedure is called by ART as a result of a "Detach_Queue" call ; from IPC ; OR by ART when a task is terminating and the entry is still ; attached to IPC. ; ;------------------------------------------------------------------------ __ipc_evacuate_queue: .local link a6,#0 setup_svc_in_a1 move.l (p1,a6),d0 ; D0 = The_Queue clr.l d1 ; D1 = FALSE (<=> keep q) jsr ([ipc$evacuate_queue*4,a1]) ; Call shared library unlk a6 rts .end