.title trap processor .ident /840104/ .globl p.slms,p.slmt ;Processes trap requests for the NBS runtime system. ;All registers preserved unless the function dictates otherwise. .asect . = 34 .word p.xm .word 0 .psect p.xm:: mov 2(sp),-(sp) ;obtain previous mode bic #^c<140000>,(sp) ;isolate mov (sp)+,@#36 ;make it ours mov #p.trap,@#34 ;to correct trap processor sub #2,(sp) ;retry rti ; p.trap:: mov r0,r0save ;save temporaries mov r1,r1save mov (sp)+,r0 ;obtain return address mov (sp)+,pssave ; movb -2(r0),r1 ;execute function asl r1 jsr pc,@pt.rap(r1) br rtinbs ; ;Trap functions follow ; ;Set up stack frame for called subprogram ; stkset: mov r5,(sp) ;save links mov r4,-(sp) mov sp,r5 ;new frame sub (r0)+,sp ;claim space blos 1$ cmp sp,#p.slmt blo 1$ mov r3,-(sp) ;save extra registers mov r2,-(sp) br rtinbs ; 1$: mov @#42,sp ;reset stack fatal ; ;Reset stack frame for return ; stkrst: tst (sp)+ ;pop off extra stuff mov (sp)+,r2 mov (sp)+,r3 mov r5,sp ;back to top of frame mov (sp)+,r4 mov (sp)+,r5 ;back to previous frame ; ;Return to trap caller ; rtinbs: mov pssave,-(sp) ;restore register state mov r0,-(sp) mov r1save,r1 mov r0save,r0 rti ; .psect $varbl r0save: .word 0 r1save: .word 0 pssave: .word 0 ; .psect $trap,gbl,ovr ph.siz::.blkw 1 ;heap utilisation pr.ini::.blkw 1 ;profiler initialisation pr.trm::.blkw 1 ;profiler termination ; ; Start of trap processing vectors ; pt.rap::.word stkset .word stkrst ; .end