Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/rts/simrts.mac
There are 2 other files named simrts.mac in the archive. Click here to see a list.
;Edit: 260, 06-Sep-77 16:20/Lars Enderin
.DIRECTIVE SFCOND
SEARCH SIMMAC,SIMMCR,SIMRPA
IF1,<
Q==777
IFNDEF QNHGH,<QNHGH=1 ;;Default only one high segment
QHGH==Q>
IFNDEF QHGH,<QHGH=Q>
IFE QHGH,<QHGH=Q>
>;;END IF1
SALL
edit(253)
;[253] New hiseg names for version 4
IFG <QHGH-QNHGH>,<RTITLE SIMR40 - Transfer vector>
IFE <QHGH-1>,<RTITLE SIMR41 - Transfer vector and swap routine>
IFE <QHGH-2>,<RTITLE SIMR42 - Transfer vector and swap routine>
X17=17
.JBOPS=135
.JBVER=137
LOC .JBOPS
Z ;Informs OCSP that SIMRTS was loaded
LOC .JBVER
VERRTS
TWOSEG
RELOC 400K
MACINIT
DEFINE %VERFLD(p,l)<<verrts_<p-^d35>>&<1_l-1>>
RADIX 10
VSIMRTS==%VERFLD(11, 9) ;;MAJOR SIMRTS VERSION NUMBER
VRTUPD== %VERFLD(17, 6) ;;MAJOR SIMRTS EDIT NUMBER
VRTEDI== %VERFLD(35,18) ;;SIMRTS EDIT LEVEL
VRTCUS== %VERFLD( 2, 3) ;;CUSTOMER VERSION SIMRTS
RADIX 8
PURGE %VERFLD
DEFINE VER(N,MA,MI,ED,WH)<PRINTX SIMRT'N VERSION MA,MI(ED)-WH>
IF2,<IFL <QHGH-QNHGH-1>,<VER(\QHGH,\VSIMRT,\VRTUPD,\VRTEDI,\VRTCUS)>
IFG <QHGH-QNHGH>,<VER(S,\VSIMRT,\VRTUPD,\VRTEDI,\VRTCUS)>
>
SUBTTL SIMRTS transfer vector
.SIMRT= .
IF1,<
DEFINE X(A,B,C,D)<IFG <A-400k>,<
IFN <A-400010-.+.SIMRT>,<CFAIL RTSYM A phase error>
Q==1
IFNB <B>,<Q==B>
Q==Q&QHGH
IFN Q,<IFNB <D>,<
PORTAL D'##
>
IFB <D>,<
PORTAL .'A'##
>>
IFE Q,<
PUSHJ XPDP,.OCSW ;A
>
>;;END X>
DEFINE Y(NAM,SEG,S,F)<IFDIF <L>,<SEG>,<
Q==1
IFNB <SEG>,<Q==SEG>
Q==Q&QHGH
IFN Q,<D%'NAM>
IFE Q,<E%'NAM>
>>;;END Y
QRTSNM==SIXBIT/SIMR40/ ;Default high segment name ;[253]
IFE <QHGH-1>,<QRTSNM=SIXBIT/SIMR42/> ;[253]
IFE <QHGH-2>,<QRTSNM=SIXBIT/SIMR41/> ;[253]
;NOTE!!! THE OTHER name is needed to swap high segments!!!
>;;END IF1
XALL
RTSYMBOLS
SALL
SUBTTL .OCSW - swap high segment
IFG <QNHGH-1>,<
EXTERN .JBREL,.JBHRL,.OCLA
OPDEF LEGAL [PUSHJ XPDP,.OCLA]
Comment;
Purpose: If the called routine is not in the present high segment,
.OCSW is called to swap in the other high segment
and transfer control to the corresponding entry.
Entry: Called with a PUSHJ XPDP,.OCSW from the
transfer vector (or from itself on a return).
Function: All ac's are saved in YUUOAC(XLOW).
A GETSEG UUO changes high segment and returns to the
proper place in the new high segment. Channel 0 must now be
restored since it was used by GETSEG and released.
The proper entry in the current high segment is found
via XPDP.
If the call to the transfer vector was a PUSHJ,
the ultimately called routine must first return to .OCSW
to swap back the other high segment, then return to caller.
.OCSW is called to effect this swap.
Otherwise, if control was passed with a branch,
the registers are restored and control is relinquished
to the invoked routine.
;
OPDEF LINKBUFF [PUSHJ XPDP,.OCIND]
EXTERN .OCIND
.OCSW:: PROC
SAVEALLACS(YACSAV) ;;[242]
HRRZ X1,-1(XPDP) ;Check next lower element in stack
IF
LEGAL
GOTO FALSE
THEN
STACK -1(X1) ;Save what should be calling instr
ELSE
STACK [0]
FI
LOWADR
SETZ X1,
edit(63)
IF ;[63] Channel zero is active
DEVCHR X1,
JUMPE X1,FALSE
THEN ;Save its status (with -1 in left half)
GETSTS X1
HRROS X1
FI ;[63]
STACK X1 ;[63] or zero
L X1,[QRTSNM]
JSR @YOCGS(XLOW) ;Get the other hiseg
EDIT(260)
PORTAL .+1 ;[260]
edit(242)
L XPDP,YACSAV+XPDP(XLOW) ;[242]
;Retrieve calling instr from stack top+1
L X10,1(XPDP)
IF ;Channel 0 was active before swap
L X1,2(XPDP) ;[63] Old status or zero
JUMPE X1,FALSE
L X4,YOCBST(XLOW)
JUMPE X4,FALSE
THEN ;Restore it, OPEN UUO arg's in X1-X3
HRRZS X1 ;[63] Clear left half of status word
MOVSI X2,'TTY'
HRRI X3,1(X4) ;Input buffer address
HRLI X3,52+1(X4) ;Output buffer address
OPEN 0,X1
HALT
LI X6,23 ;Buffer length
LI X7,2 ;Number of buffers
HRRI X1,-1(X3) ;Input buffer address
LINKBUFF
HLRZ X1,X3
HRRI X1,-1(X1) ;Output buffer address
LINKBUFF
FI
UNSTK X1 ;Find address of called entry (in transfer
;vector or L6)
SUBI X1,1
HRLI X1,(PUSHJ XPDP,);X1 has expected instruction
EDIT(41)
HRRZ X1 ;[41] Destination address
IF ;This was the instruction
CAMN X10,X1 ;[41]
GOTO TRUE
CAIE OCUU ;[41] or OCUU or OCTR was entered
CAIN OCTR
GOTO TRUE
GOTO FALSE
THEN ;Prepare return to a new swap
STACK [L6()]
FI
STACK ;[41] Put destination on stack
MOVSI X16,YACSAV(XLOW) ;[242] Restore ac's
BLT X16,X16
RETURN
IFE <QHGH-1>,<
L6():! EXEC .OCSW
POPJ XPDP,
>
IFE <QHGH-2>,<
POPJ XPDP,
L6():! EXEC .OCSW
>
EPROC
>;;END IFG
ERRMAC(OC)
.PDERR::OCERR 1,Pushdown list underflow
EXIT 1,
END