DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ R T

⟦cf708d2d6⟧ TextFile

    Length: 7699 (0x1e13)
    Types: TextFile
    Names: »RAISING_ASM«

Derivation

└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
    └─ ⟦77aa8350c⟧ »DATA« 
        └─⟦f794ecd1d⟧ 
            └─⟦24d1ddd49⟧ 
                └─⟦this⟧ 

TextFile

;    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 "RAISING"

        .include        "^standard_assembler_include_file"
        .include        "^common.runtime_definitions"
        .include        "^common.os2000_definitions"
        comp_unit      runtime_compunit
        .sect           ada_runtime_code,code,relocatable,alignment:=2

        .gbl.l  __raise_exception
        .gbl.l  __propagate_exception
        .gbl.l  __raise_constraint_error
        .gbl.l  __raise_numeric_error
        .gbl.l  __raise_program_error
        .gbl.l  __raise_storage_error
        .gbl.l  __raise_tasking_error
        .gbl.l  __unelaborated_subprogram
        .gbl.l  __debug.raise
        .gbl.l  __prolog_check
        .gbl.l  __claim_check
        .gbl.l  __undefined_trap
        .gbl.l  __put_error_msg_and_exit

        .ext.l  __process_descriptor_pointer
        .ext.l  __runtime_entry_pointer
        .ext.l  __get_exception_indirect
        .ext.l  __set_exception_indirect
        .ext.l  __trace_exception
        .ext.l  __error_path
        .ext.l  __constraint_error
        .ext.l  __numeric_error
        .ext.l  __program_error
        .ext.l  __storage_error
        .ext.l  __tasking_error

        no_op equ 16#4e71#       ; the opcode "nop"

        subprogram sp_rt,sp.internal,linkage.simple
__raise_tasking_error:
        lea     (__tasking_error:16,a5),a0
        bra.b   $move_and_raise

        subprogram sp_rt,sp.internal,linkage.simple
__raise_storage_error:
        lea     (__storage_error:16,a5),a0
        bra.b   $move_and_raise

        subprogram sp_rt,sp.internal,linkage.simple
__Raise_Numeric_Error:
        lea     (__numeric_error:16,a5),a0
        bra.b   $move_and_raise

        subprogram sp_rt,sp.internal,linkage.simple
__unelaborated_subprogram:
__raise_program_error:
        lea     (__program_error:16,a5),a0
        bra.b   $move_and_raise

        subprogram sp_rt,sp.internal,linkage.simple
__raise_constraint_error:
        lea     (__constraint_error:16,a5),a0

$move_and_raise:
        move.l  a0,d0
        bra.w   __raise_exception
;
;   fall through to __Raise_Exception
;

        subprogram sp_rt,sp.internal,linkage.simple
__raise_exception:
        move.l  (a7),-(a7)                      ; Save copy of raise pc
        statement 0,0,1
        move.l  d0,-(a7)                        ; push exception id 
        statement 0,0,2
        move.l  d0,-(a7)                        ; push exception id 
        statement 0,0,3
        movea.l (__Set_Exception_Indirect,a5),a0; routine to set Exception_Id
        jsr     (a0)                            ;   for current context   
        statement 0,0,2
        bsr.l   __trace_exception
        statement 0,0,1
                        
; The debugger will set a breakpoint at the following NOP in order to
; intercept the raise of all exceptions.  At this point, the raise PC
; must be on the top of the stack.  It is only used by the debugger, so
; it is immediately thrown away when continuing beyond this point.
;
__debug.raise:
        nop                             ; debugger breakpoint on NOP
        addq.l  #4,a7                           ; Remove raise pc
        statement 0,0,0

__propagate_exception:
        .local
$search:move.l  (4,a6),d0               ; get handler for current frame
        bne.b   handler_found           ; any handler ?

$pop:   unlk    a6                      ; no handler, so unwind frame
        bra.b   $search                 ; try next frame

handler_found:
        movea.l d0,a0                   ; a0 := handler address
        cmpi.w  #no_op,(a0)             ; is it a finalization handler?
        bne.b   $finalize

        move.l  a0,-(a7)                ; save handler address
        statement 0,0,1
        movea.l (__get_exception_indirect,a5),a0
        jsr     (a0)                    ; d0 := exception id

        rts                             ; invoke handler

$finalize:
        lea     ($search:16,pc),a1      ; a1 := address of unwinder
        move.l  a1,(8,a6)               ; replace return pc in frame      
        jmp     (a0)                    ; invoke handler
;
;       procedure prolog_check (amount : natural);
;
;       Amount is passed in D0; This routine may alter D0, D1, and A0.
;
        subprogram sp_rt,sp.internal,linkage.simple
__prolog_check:
        movea.l (__process_descriptor_pointer,a5),a0
        movea.l (a0),a0
        add.l   (art$stk_lo,a0),d0
        cmp.l   sp,d0
        bhs.s   out_of_stack
        rts
;
;       procedure Claim_Check (Amount : Natural);
;
;       Amount is passed on the stack.  This routine may not
;       alter ANY registers.
;
        subprogram sp_rt,sp.internal,linkage.simple
__claim_check:
        move.l  a0,-(sp)                ; save a0
        movea.l (__process_descriptor_pointer,a5),a0
        movea.l (a0),a0
        movea.l (art$stk_lo,a0),a0
        adda.l  (8,sp),a0
        cmpa.l  a0,sp
        blo.s   out_of_stack
        movea.l (sp)+,a0
        rtd     #4

out_of_stack:
        move.w  (__error_path,a5),d0            ; get path for error messages
        move.w  #stack$request$warning,d1       ; get error number
        ori.w   #warning$code,d1                ; set high byte
        trap    #os9_call                       ; make system call to
        .dc.w   f$perr                          ; put error message
        bra.w   __raise_storage_error           ; raise exception
;
;       procedure undefined_trap;
;
        subprogram sp_rt,sp.internal,linkage.trap
__undefined_trap:
        statement 8,0,0
        move.l  a0, d1                  ; save raise PC in d1
        statement 1,0,0
        movea.l a5,a0                   ; get address of register save area
        addq.l  #8,a0                   ; skip d0, d1
        movem.l (a0)+,d2-d7             ; restore data registers
        addq.l  #8,a0                   ; skip a0, a1
        movem.l (a0)+,a2-a6             ; restore address registers
        movea.l a1,a7                   ; restore stack pointer

        move.l  d1,-(sp)                ; push pc on stack

        statement 16,0,0
        clr.l   -(sp)                   ; push null for exception name     
        statement 16,0,1
        bsr.l   __trace_exception
        statement 16,0,0

        move.w   #unhandled$main$trap$ferror,d1; get error number
        bra.w   __put_error_msg_and_exit

        subprogram sp_rt,sp.internal,linkage.simple
__put_error_msg_and_exit:
        move.w  (__error_path,a5),d0   ; get path for error messages
        ori.w   #error$code,d1         ; set high byte
        trap    #os9_call              ; make system call
        .dc.w   f$perr                 ; to report error
        moveq.l #some$error,d1         ; flag some error
        trap    #os9_call              ; terminate process
        .dc.w   f$exit

        end_subprograms

        .end