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: ┃ M T ┃
Length: 20063 (0x4e5f) Types: TextFile Names: »MSQTI_OPS_ASM«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2 └─ ⟦77aa8350c⟧ »DATA« └─⟦f794ecd1d⟧ └─⟦24d1ddd49⟧ └─⟦this⟧
; The use of this system is subject to the software license terms and ; conditions agreed upon between Rational and the Customer. ; ; Copyright 1988 by Rational. ; ; RESTRICTED RIGHTS LEGEND ; ; Use, duplication, or disclosure by the Government is subject to ; restrictions as set forth in subdivision (b)(3)(ii) of the Rights in ; Technical Data and Computer Software clause at 52.227-7013. ; ; ; Rational ; 3320 Scott Boulevard ; Santa Clara, California 95054-3197 ; ; PROPRIETARY AND CONFIDENTIAL INFORMATION OF RATIONAL; ; USE OR COPYING WITHOUT EXPRESS WRITTEN AUTHORIZATION ; IS STRICTLY PROHIBITED. THIS MATERIAL IS PROTECTED AS ; AN UNPUBLISHED WORK UNDER THE U.S. COPYRIGHT ACT OF ; 1976. CREATED 1988. ALL RIGHTS RESERVED. ; ; .module "MESSAGE_QUEUE_TIMER_OPERATIONS" ; ; Implements the body of the Ada packages Message_Queue and Timer ; .include "^^standard_assembler_include_file" .include "^^common.runtime_definitions" .include "^^common.os2000_definitions" .include "^^common.msqti_definitions" comp_unit runtime_compunit .sect ada_runtime_code,code,relocatable,alignment:=2 .gbl.l __msgq$create .gbl.l __msgq$delete .gbl.l __msgq$delete$veremp .gbl.l __msgq$send .gbl.l __msgq$send$retrdy .gbl.l __msgq$send$nopri .gbl.l __msgq$wait .gbl.l __msgq$wait$nonblk .gbl.l __msgq$retriev .gbl.l __msgq$retriev_if_available .gbl.l __msgq$remove .gbl.l __msgq$length .gbl.l __msgq$get_associated_data .gbl.l __timer$start .gbl.l __timer$stop .ext.l __msgq_entry_pointer .ext.l __process_descriptor_pointer ; ; Have to a pointer to the table of entry points for ; message queue operations in __MsgQ_Entry_Pointer. ; Calls to the services are performed by ; ; movea.l (__MsgQ_Entry_Pointer, a5), a1 ; jsr ([Q$service, a1]) ; Local_No_Channels equ 0; ; ; procedure Create (Max_Message_Size : Message_Size; ; Max_Message_Count : Queue_Length; ; Result : out Stratus; ; New_Queue : out Id); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$create: .local $max_size'offset equ 4+16 $max_count'offset equ 8+16 $status'offset equ 12+16 $queue'offset equ 16+16 statement 0,0,0 movem.l d2/d3/d4/d5,-(sp) statement 16,0,0 lea ($null_queue_name:16,pc),a0 ; queue name string clr.l ($status'offset,sp) ; result := successful moveq.l #local_no_channels,d0 ; qualifier flags move.l ($max_size'offset,sp),d4 ; max message size move.l ($max_count'offset,sp),d5 ; max number of messages movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$create,a1]) ; jump to create entry bcs.b $error ; check for error movea.l ($queue'offset,sp),a0 ; get pointer to id move.w d2,(a0)+ ; upper part of id move.l d3,(a0) ; lower part of id $exit: movem.l (sp)+,d2/d3/d4/d5 ; restore registers statement 0,0,0 rts $error: move.w d1,($status'offset+2,sp) ; result := error code bra.b $exit $null_queue_name: .asciz "" .align ; ; procedure Delete (Queue : Id; ; Result : out Stratus); ; ; procedure Delete_If_Empty (Queue : Id; ; Result : out Stratus); ; subprogram sp_rt,sp.internal,linkage.simple .local $queue'offset equ 4+8 $result'offset equ 8+8 __msgq$delete: moveq.l #0,d0 ; set qualifier bra.b $common __msgq$delete$veremp: move.l #q$veremp,d0 ; set qualifier $common:move.l d2,-(sp) statement 0,0,1 move.l d3,-(sp) statement 0,0,2 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([Q$Delete, a1]) ; jump to create entry bcc.b $return $error: move.w d1,($result'offset+2,sp) $return:move.l (sp)+,d3 statement 0,0,1 move.l (sp)+,d2 statement 0,0,0 rts ; ; procedure Send (Buffer : System.Address; ; Size : Message_Size; ; Queue : Id; ; Result : out Stratus; ; Handle : out Message_Id); ; ; ; procedure Conditional_Send (Buffer : System.Address; ; Size : Message_Size; ; To_Queue : Id; ; Result : out Stratus; ; Handle : out Message_Id); ; subprogram sp_rt,sp.internal,linkage.simple .local $buffer'offset equ 4+20 $size'offset equ 8+20 $queue'offset equ 12+20 $result'offset equ 16+20 $handle'offset equ 20+20 __msgq$send$retrdy: move.l #(Q$UsePri ! Q$RetRdy),d0 ; set qualifier bra.b $common __msgq$send: move.l #q$usepri,d0 ; set qualifier $common:movem.l d2/d3/d4/d5/d6,-(sp) statement 0,0,5 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l ($buffer'offset,sp),a0 ; address of message buffer move.l ($size'offset,sp),d4 ; message size movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$send,a1]) ; jump to create entry bcs.b $error ; check for error move.l d5,($handle'offset,sp) ; handle := message id $exit: movem.l (sp)+,d2/d3/d4/d5/d6 ; restore registers statement 0,0,0 rts $error: clr.l ($handle'offset,sp) ; handle := null_message move.w d1,($result'offset+2,sp) ; result := error code bra.b $exit ; ; procedure Send_Without_Priority (Value : Integer; ; Queue : Id); ; ; -- special purpose send for the reply queue ; subprogram sp_rt,sp.internal,linkage.simple __msgq$send$nopri: .local $value'offset equ 4+20 $queue'offset equ 8+20 movem.l d2/d3/d4/d5/d6,-(sp) statement 0,0,5 moveq.l #0,d0 ; set qualifier movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l d2 move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id lea.l ($value'offset,sp),a0 ; address of value moveq.l #4,d4 ; message size = 4 bytes movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$send,a1]) ; jump to create entry movem.l (sp)+,d2/d3/d4/d5/d6 statement 0,0,0 rtd #8 ; ; procedure Wait (On_List : System.Address; ; Maximum : Wait_List_Index; ; Available : out Wait_List_Index); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$wait: .local $on_list'offset equ 4+8 $maximum'offset equ 8+8 $available'offset equ 12+8 ; -- prior to blocking in message queue, save the ; -- frame pointer and pc for the debugger movea.l (__process_descriptor_pointer,a5),a0 movea.l (a0),a0 ; get current descriptor move.l (sp),(art$savepc,a0) ; save pc move.l a6,(art$savefp,a0) ; save frame pointer move.l d2,-(sp) statement 0,0,1 move.l d3,-(sp) statement 0,0,2 moveq.l #0,d0 ; set qualifier movea.l ($on_list'offset,sp),a0 ; pointer to wait list move.l ($maximum'offset,sp),d2 ; max of queues in wait list movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([Q$Wait, a1]) ; jump to create entry clr.w ($available'offset,sp) ; clear upper word move.w d3,($available'offset+2,sp) ; available := index move.l (sp)+,d3 ; restore registers statement 0,0,1 move.l (sp)+,d2 statement 0,0,0 ; ; now clear debugger blocking info ; movea.l (__process_descriptor_pointer,a5),a0 movea.l (a0),a0 ; get current descriptor clr.l (art$savefp,a0) ; clear saved frame pointer rts ; ; procedure Wait_Nonblocking (On_List : System.Address; ; Maximum : Wait_List_Index; ; Result : out Stratus; ; Available : out Wait_List_Index); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$wait$nonblk: .local $list'offset equ 4+8 $maximum'offset equ 8+8 $result'offset equ 12+8 $available'offset equ 16+8 move.l d2,-(sp) statement 0,0,1 move.l d3,-(sp) statement 0,0,2 clr.l ($result'offset,sp) ; result := successful clr.l ($available'offset,sp) ; available := 0 move.l #q$nonblk,d0 ; set qualifier movea.l ($list'offset,sp),a0 ; pointer to wait list move.l ($maximum'offset,sp),d2 ; max of queues in wait list movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$wait,a1]) ; jump to create entry bcs.b $error move.w d3,($available'offset+2,sp) ; available := index $exit: move.l (sp)+,d3 statement 0,0,1 move.l (sp)+,d2 statement 0,0,0 movea.l (__process_descriptor_pointer,a5),a0 movea.l (a0),a0 ; a0 := descriptor pointer clr.l (art$savefp,a0) ; clear debugger info rts $error: move.w d1,($result'offset+2,sp) ; result := error code bra.s $exit ; ; procedure Retrieve_Message (From_Queue : Id; ; To_Buffer : System.Address; ; Buffer_Size : Message_Size); subprogram sp_rt,sp.internal,linkage.simple __msgq$retriev: $from_queue'offset equ 4+16 $to_buffer'offset equ 8+16 $buffer_size'offset equ 12+16 movem.l d2/d3/d4/d5,-(sp) statement 0,0,4 movea.l ($from_queue'offset,sp),a0 ; pointer to queue id clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l ($to_buffer'offset,sp),a0 ; address of message buffer move.l ($buffer_size'offset,sp),d4 ; buffer size movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$retriev,a1]) ; jump to create entry movem.l (sp)+,d2/d3/d4/d5 ; restore registers statement 0,0,0 rtd #12 ; ; procedure Retrieve_If_Available (From_Queue : Id; ; To_Buffer : System.Address; ; Buffer_Size : Message_Size; ; Result : out Stratus); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$retriev_if_available: .local $queue'offset equ 4+16 $to_buffer'offset equ 8+16 $buffer_size'offset equ 12+16 $result'offset equ 16+16 movem.l d2/d3/d4/d5,-(sp) ; save the nonvolatile registers statement 16,0,0 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l ($to_buffer'offset,sp),a0 ; address of message buffer move.l ($buffer_size'offset,sp),d4 ; buffer size movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$retriev,a1]) ; jump to create entry bcc.b $exit $error: move.w d1,($result'offset+2,sp) ; result := error code $exit: movem.l (sp)+,d2-d5 statement 0,0,0 rts ; ; procedure Remove_Message (From_Queue : Id; ; Remove_Id : Message_Id; ; Result : out Stratus); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$remove: .local $queue'offset equ 4+12 $id'offset equ 8+12 $result'offset equ 12+12 movem.l d2/d3/d5,-(sp) ; save the nonvolatile statement 0,0,3 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id move.l ($id'offset,sp),d5 ; id of message to remove movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$remove,a1]) ; jump to create entry bcc.b $exit $error: move.w d1,($result'offset+2,sp) ; result := error code $exit: movem.l (SP)+,d2/d3/d5 ; restore registers statement 0,0,0 rts ; ; procedure Length (Of_Queue : Id; ; Result : out Stratus; ; Count : out Queue_Length); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$length: .local $queue'offset equ 4+12 $result'offset equ 8+12 $count'offset equ 12+12 movem.l d2/d3/d4,-(sp) statement 0,0,3 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l (__msgq_entry_pointer,a5),a1 ; get entry table pointer jsr ([q$length,a1]) ; jump to create entry bcs.b $error clr.w ($count'offset,SP) ; clear upper word move.w d4,($count'offset+2,sp) ; count := computed $exit: movem.l (sp)+,d2/d3/d4 statement 0,0,0 rts $error: clr.l ($count'offset,sp) ; count := 0 move.w d1,($result'offset+2,sp) ; result := error code bra.b $exit ; ; ; procedure Get_Associated_Data (For_Queue : Id; ; Result : out Stratus; ; Data : out Associated_Data); ; subprogram sp_rt,sp.internal,linkage.simple __msgq$get_associated_data: .local $queue'offset equ 4+12 $result'offset equ 8+12 $data'offset equ 12+12 movem.l d2/d3/d4,-(sp) statement 0,0,3 movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l ($result'offset,sp) ; result := successful clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id movea.l (__MsgQ_Entry_Pointer, a5), a1 ; get entry table pointer jsr ([Q$RQuData, a1]) ; jump to create entry bcs.b $error move.l d4,($data'offset,sp) ; store data $exit: movem.l (sp)+,d2/d3/d4 ; restore registers statement 0,0,0 rts $error: clr.l ($data'offset,sp) ; data := 0 move.w d1,($result'offset+2,sp) ; result := error code bra.b $exit ; ; procedure Start (Time : Delay_Time; ; Queue : Message_Queue.Id; ; Signal : Timeout_Message; ; Result : out Stratus; ; Handle : out Id); ; subprogram sp_rt,sp.internal,linkage.simple __timer$start: .local $rounding_factor equ 15 $time'offset equ 4+12 $queue'offset equ 8+12 $signal'offset equ 12+12 $result'offset equ 16+12 $handle'offset equ 20+12 movem.l d2/d3/d4,-(sp) statement 0,0,3 move.l ($time'offset,sp),d0 ; delay time in d0 clr.l ($result'offset,sp) ; result := successful moveq.l #$rounding_factor,d1 ; factor to round up add.l d0,d1 ; do round bvc.b $timeok ; ok if not overflow move.l d0,d1 ; else get value passed $timeok:asr.l #4,d1 ; scale duration for timer movea.l ($queue'offset,sp),a0 ; pointer to queue id clr.l d2 ; clear upper word move.w (a0),d2 ; upper part of queue id move.l (2,a0),d3 ; lower part of queue id move.l ($signal'offset,sp),d4 ; timeout message move.l #(Ti$Start ! Ti$OneSh),d0 trap #0 .dc.w f$peab bcs.b $error ; check for error move.l d0,($handle'offset,sp) ; handle := id $exit: movem.l (sp)+,d2/d3/d4 ; restore registers statement 0,0,0 rts $error: clr.l ($handle'offset,sp) ; handle := 0 move.w d1,($result'offset+2,sp) ; result := error code bra.b $exit ; ; procedure Stop (Handle : Id; Result : out Stratus); ; subprogram sp_rt,sp.internal,linkage.simple __timer$stop: .local $handle'offset equ 4 $result'offset equ 8 move.l ($handle'offset,sp),d1 ; time id clr.l ($result'offset,sp) ; result := successful move.l #Ti$Stop,d0 trap #0 .dc.w F$PEAB bcc.b $return move.w d1,($result'offset+2,sp) $return:rts end_subprograms .end