1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-04-19 08:29:59 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

3140 lines
55 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
! [Beginning of MCBLIB]
!
! COPYRIGHT (C) 1980
! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS 01754
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A SINGLE
! COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION OF THE
! ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES THEREOF
! MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
! EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE
! TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES
! REMAIN IN DEC.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
!
!++
! FACILITY: MCB User's Library
!
! ABSTRACT:
!
! This file contains the macros and structure definitions
! necessary to a process for operation within MCB.
!
! ENVIRONMENT:
!
! AUTHOR: Alan D. Peckham, CREATION DATE: 13-March-1980
!
! MODIFIED BY:
!
! , : VERSION
! 01 -
! 03 - Use status definition macro from MCBSTS.
! 04 - Change PHDR$ macro to use OWN psect instead of PLIT.
! 05 - Correct RSX_UCB_SCB_IOP linkage.
! 06 - Add $MCB_EXCEPTION
! 07 - Begin MCB V3.2 changeover.
! 08 - Fix LINKAGE MCB_INTERRUPT to preserve register 0.
! 09 - Fix all linkages to routines which do not affect register 0.
! CEX auxilliary routines called through CALL$C.
! 10 - Registers not saved in EXRQN$.
! 11 - Add CE_UDR (transmitter underrun).
! 12 - Change CALL$C to CALL$I.
! 13 - Add synonyms and make some values global.
! 14 - Add interrupt inhibit/enable and table lookup services.
! 15 - Fix $RSX_GET_TCB to check for no task situation.
! 18 - Fix CALL$L to declare routine name if not already declared.
!--
literal
MCB$K_VERSION = 3,
MCB$K_LEVEL = 2, ! Updated on each data structure change
MCB$K_EDIT = 18; ! Updated on each edit
%if %bliss (bliss16) %then
literal
LIB$V0 = %rad50_11 '032',
LIB$V1 = %rad50_11 '180';
%fi
!
! Synonyms
!
macro
MCB$K_SET_EXCEPTION = %name ('E.XVST') %,
MCB$K_SET_PROCESS = %name ('P.DTST') %,
MCB$K_CLEAR_PROCESS = %name ('P.DTCL') %,
MCB$K_GET_PROCESS_INDEX = %name ('P.DTGT') %,
MCB$K_GET_PROCESS_NAME = %name ('P.NMGT') %,
MCB$K_SET_PROCESS_NAME = %name ('P.NMST') %,
MCB$K_CLEAR_PROCESS_NAME = %name ('P.NMCL') %,
MCB$K_SET_VECTOR = %name ('V.ECST') %,
MCB$K_CLEAR_VECTOR = %name ('V.ECCL') %,
MCB$K_GET_LINE_NAME = %name ('S.NMGT') %,
MCB$K_SET_LINE_PROCESSES = %name ('S.LTST') %,
MCB$K_GET_LINE_PROCESSES = %name ('S.LTGT') %,
MCB$K_GET_DEVICE_NAME = %name ('D.NMGT') %;
!
! Signal handling
!
field
CONDIT_FIELDS =
set
STS$V_SEVERITY = [0, 0, 3, 0], ! Severity field
STS$V_SUCCESS = [0, 0, 1, 0], ! Success field
STS$V_COND_ID = [0, 3, 13, 0], ! Identity field
STS$V_CUST_DEF = [0, 15, 1, 0] ! Customer definition field
tes;
macro
CONDITION_VALUE = block [1] field (CONDIT_FIELDS) %;
literal
STS$K_SUCCESS = 1, ! Success
STS$K_INFO = 3, ! Information
STS$K_WARNING = 0, ! Warning
STS$K_ERROR = 2, ! Error
STS$K_SEVERE = 4; ! Severe error
keywordmacro
STS$VALUE (
SEVERITY = STS$K_SEVERE, ! default is severe error
CODE, ! no default
CUST_DEF = 1^15 ) = ! default is user definition
(SEVERITY and 7) or
(CODE and %o'17777')^3 or
(if CUST_DEF neq 0
then 1^15
else 0) %;
macro
STS$MATCH (A, B) =
(((A) and %o'177770') eql ((B) and %o'177770')) %;
!
! MCB Completion Code Definitions
!
REQUIRE 'MCB:MCBSTS';
macro
$MCB$CODES [CODE_SET] =
$MCB$CODE (%remove (CODE_SET)) %,
$MCB$CODE (NAM, LVL, COD, TXT) [] =
NAM = STS$VALUE (SEVERITY = LVL, CODE = COD, CUST_DEF = 0) %;
literal
$MCB$CODES ($MCB_STATUS, $RSX_STATUS);
literal
$MCB$CODE (MCB$K_STATUS_MAX, 7, $MCB$NEXT_CODE - 1, 'Highest MCB status'),
$MCB$CODE (RSX$K_STATUS_MAX, 7, $RSX$NEXT_CODE - 1, 'Highest RSX status');
undeclare
%quote $MCB$CODES,
%quote $MCB$CODE;
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
MACRO
DECLARE_SEVERITY (prefix) [level] =
%IF NOT %DECLARED (%NAME ('$', prefix, '$cond_code'))
%THEN
COMPILETIME %NAME ('$', prefix, '$cond_code') = 0;
%ELSE
%ASSIGN (%NAME ('$', prefix, '$cond_code'), 0)
%FI
MACRO
%NAME ('$', prefix, '_', level) (code_name, optional_text) =
LITERAL code_name =
STS$VALUE (
CODE = %NAME ('$', prefix, '$cond_code'),
SEVERITY = %NAME ('STS$K_', level),
CUST_DEF = 1);
%ASSIGN (%NAME ('$', prefix, '$cond_code'), %NAME ('$', prefix, '$cond_code') + 1 )
%QUOTE % %;
%FI %(BLISS16)%
!
! Linkages
!
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
LINKAGE
!
! Routine invoked through synchronous calls
!
CALL$ = CALL;
%FI %(BLISS16)%
!
! Synchronous calls
!
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
macro
!
! Invoke old BLISS synchronous routine in extension process
!
CALL$B (ARG) =
%inform ('Now using CALL$E for extension process calling...')
%quote CALL$E (ARG, %remaining) %,
!
! Invoke synchronous routine in the CEX process
!
CALL$I (INDEX) =
begin
external literal
INDEX;
external routine
$CALLI;
%if %null (%remaining)
%then
$CALLI ($MCB$REVERSE (INDEX, 0))
%else
$CALLI ($MCB$REVERSE (INDEX, %length - 1, %remaining))
%fi
end %,
!
! Invoke synchronous routine in extension process
!
CALL$E (ADR, PIX) =
begin
external routine
%if not %declared (ADR) %then ADR, %fi
$CALLE;
%if %null (%remaining)
%then
$CALLE ($MCB$REVERSE (PIX, ADR, 0))
%else
$CALLE ($MCB$REVERSE (PIX, ADR, %length - 2, %remaining))
%fi
end %,
!
! Invoke synchronous routine in local process
!
CALL$L (ADR) =
begin
%if not %declared (ADR) %then external routine ADR; %fi
fortran (ADR, %remaining)
end %,
!
! Invoke synchronous routine in other process
!
CALL$P (ADR, PIX) =
begin
external routine
%if not %declared (ADR) %then ADR, %fi
$CALLP;
%if %null (%remaining)
%then
$CALLP ($MCB$REVERSE (PIX, ADR, 0))
%else
$CALLP ($MCB$REVERSE (PIX, ADR, %length - 2, %remaining))
%fi
end %,
$MCB$REVERSE (ARG) [] =
%if not %null (%remaining) %then $MCB$REVERSE (%remaining), %fi
ARG %;
;
%FI %(BLISS16)%
!
! Buffer move calls
!
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
MACRO
!
! Move from mapped buffer
!
%if %variant eql 0
%then
MFBF$S (lng, from_bias, from_adr, begin_adr, end_adr) =
BEGIN
LINKAGE
MV_LINKAGE = JSR (STANDARD, STANDARD, REGISTER = 2, REGISTER = 3)
: preserve (0) nopreserve (2, 3);
EXTERNAL ROUTINE
$MVFBF : MV_LINKAGE NOVALUE;
%IF NOT %NULL (end_adr) %THEN GLOBAL REGISTER R2 = 2; %FI
$MVFBF (from_bias, from_adr, begin_adr, lng)
%IF NOT %NULL (end_adr) %THEN ; end_adr = .R2 %FI
END %,
%else
MFBF$S (lng, from_bias, from_adr, begin_adr, end_adr) =
BEGIN
LINKAGE
MV_LINKAGE = JSR (STANDARD, STANDARD, REGISTER = 2, REGISTER = 3; REGISTER = 2)
: preserve (0) nopreserve (2, 3);
EXTERNAL ROUTINE
$MVFBF : MV_LINKAGE NOVALUE;
$MVFBF (from_bias, from_adr, begin_adr, lng; end_adr)
END %,
%fi
!
! Move to mapped buffer
!
%if %variant eql 0
%then
MTBF$S (lng, begin_adr, to_bias, to_adr, end_adr) =
BEGIN
LINKAGE
MV_LINKAGE = JSR (STANDARD, STANDARD, REGISTER = 2, REGISTER = 3)
: preserve (0) nopreserve (2, 3);
EXTERNAL ROUTINE
$MVTBF : MV_LINKAGE NOVALUE;
%IF NOT %NULL (end_adr) %THEN GLOBAL REGISTER R2 = 2; %FI
$MVTBF (to_bias, to_adr, begin_adr, lng)
%IF NOT %NULL (end_adr) %THEN ; end_adr = .R2 %FI
END %,
%else
MTBF$S (lng, begin_adr, to_bias, to_adr, end_adr) =
BEGIN
LINKAGE
MV_LINKAGE = JSR (STANDARD, STANDARD, REGISTER = 2, REGISTER = 3; REGISTER = 2)
: preserve (0) nopreserve (3);
EXTERNAL ROUTINE
$MVTBF : MV_LINKAGE NOVALUE;
$MVTBF (to_bias, to_adr, begin_adr, lng; end_adr)
END %,
%fi
!
! Map a buffer
!
MAP$ (bias) =
BEGIN
EXTERNAL
KISAR6 : volatile;
KISAR6 = bias
END %,
!
! Return the current mapping bias
!
SMAP$ (var) =
BEGIN
EXTERNAL
KISAR6 : volatile;
var = .KISAR6
END %;
%FI %(BLISS16)%
!
! Create a process header
!
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
macro
PHDR$ (NAM, LLC, DLC, DDM, INT1, INT2, INT3) =
%inform ('Please use the $MCB_PROCESS macro') %;
keywordmacro
$MCB_PROCESS (
CEX_DISPATCH = 0,
DDM_DISPATCH = %name ('.DSPCR'),
DLC_DISPATCH = %name ('.DSPCR'),
LLC_DISPATCH = %name ('.DSPCR'),
NAME,
RSX_DISPATCH = 0,
SIGNAL_HANDLER = 0) =
%if %null (NAME)
%then %errormacro ('Process name not supplied')
%fi
%if not %identical (CEX_DISPATCH, 0) and not %identical (NAME, CEX)
%then %errormacro ('CEX_DISPATCH only to be used by CEX process')
%fi
psect
own = %name (' ');
external
%if %identical (LLC_DISPATCH, %name ('.DSPCR'))
or %identical (DLC_DISPATCH, %name ('.DSPCR'))
or %identical (DDM_DISPATCH, %name ('.DSPCR'))
%then
%name ('.DSPCR'),
%fi
MCB$V0, MCB$V1;
own
HEADER : vector [16] initial (
%rad50_11 %string (NAME), 3 + 1^8, 0, 0,
SIGNAL_HANDLER, LLC_DISPATCH, DLC_DISPATCH, DDM_DISPATCH,
MCB$V0, MCB$V1, LIB$V0, LIB$V1,
1^8 + 1^9, RSX_DISPATCH, CEX_DISPATCH, 0);
undeclare
HEADER;
psect
own = $OWN$; %;
%FI %(BLISS16)%
!
! Create a RSX driver header
!
%if %bliss (bliss16)
%then %(BLISS16)%
keywordmacro
$RSX_DRIVER (
DISPATCH,
NAME) =
%if %null (NAME)
%then %errormacro ('Driver name not supplied')
%fi
global bind
%name ('$', NAME, 'TBL') = DISPATCH; %;
%fi %(bliss16)%
!
! CCB definitions
!
FIELD
C_fields =
SET
C_LNK = [0, 0, 16, 0],
C_CHN = [1, 0, 16, 0],
C_STK = [2, 0, 16, 0],
C_OWN = [3, 0, 8, 0],
C_LIX = [4, 0, 8, 0],
C_LIN = [4, 0, 8, 0],
C_PIX = [4, 8, 8, 0],
C_FNC = [5, 0, 8, 0],
C_MOD = [5, 8, 8, 0],
C_STS = [6, 0, 16, 1],
C_BUF = [7, 0, 16, 0],
C_BIAS = [7, 0, 16, 0],
C_ADDR = [8, 0, 16, 0],
C_CNT = [9, 0, 16, 0],
C_PRM = [10, 0, 16, 0],
C_PRM1 = [10, 0, 16, 0],
C_PRM2 = [11, 0, 16, 0],
C_PRM3 = [12, 0, 16, 0],
C_PRM4 = [13, 0, 16, 0],
C_PRM5 = [14, 0, 16, 0]
TES;
LITERAL
FC_AST = 0*2,
FC_XME = 1*2,
FC_RCE = 2*2,
FC_KIL = 3*2,
FC_CTL = 4*2,
FC_TIM = 5*2,
FC_XCP = 6*2,
FC_RCP = 7*2,
FC_KCP = 8*2,
FC_CCP = 9*2,
FC_SYS = FC_TIM;
LITERAL
FD_AST = 0*2,
FD_XME = 0*2,
FM_DAT = 0*2,
FM_RTN = 1*2,
FD_RCE = 2*2,
FM_KIL = 0*2,
FM_CRA = 1*2,
FM_XKL = 2*2,
FD_KIL = 2*2,
FM_STR = 1*2,
FM_STP = 2*2,
FM_NM = 3*2,
FM_SET = 5*2,
FM_GET = 6*2,
FD_CTL = 6*2,
FM_STM = 0*2,
FM_LTM = 1*2,
FD_TIM = 5*2,
FD_XCP = FD_XME,
FM_SYN = 2*2,
FD_RCP = FD_RCE,
FD_KCP = FD_KIL,
FD_CCP = FD_CTL,
FM_PWF = 2*2,
FM_PIN = 3*2,
FM_CCB = 4*2,
FM_RDB = 5*2,
FD_SYS = FD_TIM;
literal
CS_SUC = 0^3 + 1, ! Success
CE_ABO = -1^3 + 0, ! Operation aborted
CE_ERR = -2^3 + 0, ! General error
CE_MOP = -3^3 + 0, ! MOP message received
CE_SRC = -4^3 + 0, ! Start received
CE_RTE = -5^3 + 0, ! Receive error threshold
CE_NTE = -6^3 + 0, ! NAK error threshold
CE_TMO = -7^3 + 0, ! REP threshold error
CE_BUF = -16^3 + 0, ! Buffer allocation failure
CE_DCR = -17^3 + 0, ! Data CRC error
CE_HFE = -18^3 + 0, ! Header format error
CE_MTL = -19^3 + 0, ! Message too long
CE_ROV = -20^3 + 0, ! Receiver overrun
CE_DEV = -21^3 + 2, ! Hard device error
CE_DIS = -22^3 + 0, ! Disconnect detected
CE_UDR = -23^3 + 0; ! Transmitter underrun
!
! Timer block definitions
!
FIELD
T_fields =
SET
T_PIX = [1, 8, 8, 0],
T_IDN = [2, 0, 16, 0],
T_TIM = [7, 0, 16, 0]
TES;
literal
T_LENGTH = 9;
!
! MCB interface linkages and macros
!
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
LINKAGE
RSX_UCB = JSR (REGISTER = 5) : NOPRESERVE (0, 1, 2, 3, 4, 5),
RSX_UCB_SCB_IOP = JSR (REGISTER = 5, REGISTER = 4, REGISTER = 1) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_ = JSR : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_CCB = JSR (REGISTER = 4) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_CCB_MOD = JSR (REGISTER = 4, REGISTER = 3) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_DB = JSR (REGISTER = 5) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_DB_CCB = JSR (REGISTER = 5, REGISTER = 4) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_DB_CCB_MOD = JSR (REGISTER = 5, REGISTER = 4, REGISTER = 3) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_DB_MOD = JSR (REGISTER = 5, REGISTER = 3) : NOPRESERVE (0, 1, 2, 3, 4, 5),
MCB_INTERRUPT = JSR (REGISTER = 5) : PRESERVE (0, 1, 2, 3) NOPRESERVE (4, 5),
MCB_MOD = JSR (REGISTER = 3) : NOPRESERVE (0, 1, 2, 3, 4, 5),
LINKAGE_CCB = JSR (REGISTER = 4),
LINKAGE_CCB_MOD = JSR (REGISTER = 4, REGISTER = 3),
LINKAGE_DB = JSR (REGISTER = 5),
LINKAGE_DB_CCB = JSR (REGISTER = 5, REGISTER = 4),
LINKAGE_DB_CCB_MOD = JSR (REGISTER = 5, REGISTER = 4, REGISTER = 3),
LINKAGE_DB_MOD = JSR (REGISTER = 5, REGISTER = 3),
LINKAGE_MOD = JSR (REGISTER = 3);
%FI %(BLISS16)%
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
MACRO
!
! Dispatch from a MCB dispatch sub-table
!
DISPATCH$ (idx, disp, args, lnkg) =
%IF %NULL (lnkg) %THEN BLISS %ELSE lnkg %FI
(.(disp + idx), %REMOVE (args)) %,
!
! Create a dispatch table
!
TABLE$ (default, top) =
UPLIT ($MCB$TABLE_A (0, default, MAX (top, $MCB$TABLE_M (%REMAINING)), %REMAINING)) %,
$MCB$TABLE_A (offset, default, maximum_offset) [] =
$MCB$TABLE_C (offset, default, %REMAINING)
%IF offset LSS maximum_offset
%THEN , $MCB$TABLE_A (offset + 2, default, maximum_offset, %REMAINING)
%FI %,
$MCB$TABLE_C (offset, default, entry) [] =
%IF offset EQL $MCB$TABLE_offset (%REMOVE (entry))
%THEN
%IF %NULL ($MCB$TABLE_address (%REMOVE (entry)))
%THEN default
%ELSE $MCB$TABLE_address (%REMOVE (entry))
%FI
%ELSE
%IF NOT %NULL (%REMAINING)
%THEN $MCB$TABLE_C (offset, default, %REMAINING)
%ELSE default
%FI
%FI%,
$MCB$TABLE_M [entry] =
$MCB$TABLE_offset (%REMOVE (entry)) %,
$MCB$TABLE_offset (offset, address) =
offset %,
$MCB$TABLE_address (offset, address) =
address %,
!
! Create a vector
!
VECTOR$ (default, top) =
UPLIT ($MCB$VECTOR_A (0, default, MAX (top, $MCB$TABLE_M (%REMAINING)), %REMAINING)) %,
$MCB$VECTOR_A (offset, default, maximum_offset) [] =
$MCB$TABLE_C (offset, default, %REMAINING)
%IF offset LSS maximum_offset
%THEN , $MCB$VECTOR_A (offset + 1, default, maximum_offset, %REMAINING)
%FI %;
%FI %(BLISS16)%
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
MACRO
CCBGT$ = $MCB_GET_CCB %,
CCBRT$ = $MCB_RETURN_CCB %,
CMQIF$ = $MCB_STACK_CCB %,
CMQIN$ = $MCB_QUEUE_CCB %,
CMQRM$ = $MCB_DEQUEUE_CCB %,
CNSTM$ = $MCB_CANCEL_SHORT_TIMER %,
CNV22$ (BIAS, ADDRESS, LOW, HIGH) =
$MCB_CONVERT_TO_22_BIT_ADDRESS ((BIAS, ADDRESS), LOW, HIGH) %,
!
!
!
DDAST$ (index, status) =
BEGIN
LINKAGE
DDAST_LINKAGE = JSR (REGISTER = 3, REGISTER = 2) : PRESERVE (0) NOPRESERVE (3, 4) CLEARSTACK VALUECBIT;
EXTERNAL ROUTINE
$DDAST : DDAST_LINKAGE;
! Note: Cbit clear = FALSE = success
IF NOT $DDAST (status, index)
THEN
MCB$_NORMAL
ELSE
MCB$_NO_CCB
END %,
!
!
!
DDCCP$ (ccb, status) =
BEGIN
LINKAGE
DDCCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DDCCP : DDCCP_LINKAGE NOVALUE;
$DDCCP (ccb, status);
END %,
!
!
!
DDKCP$ (ccb, status) =
BEGIN
LINKAGE
DDKCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DDKCP : DDKCP_LINKAGE NOVALUE;
$DDKCP (ccb, status);
END %,
!
!
!
%if %variant eql 0
%then
DDMDB$ (index, db) =
BEGIN
LINKAGE
DDMDB_LINKAGE = JSR (REGISTER = 5) : PRESERVE (0) NOPRESERVE (5);
EXTERNAL ROUTINE
$DDMDB : DDMDB_LINKAGE NOVALUE;
GLOBAL REGISTER
R5 = 5;
$DDMDB (index);
%IF NOT %NULL (db) %THEN db = .R5; %FI
END %,
%else
DDMDB$ (index, db) =
BEGIN
LINKAGE
DDMDB_LINKAGE = JSR (REGISTER = 5; REGISTER = 5) : PRESERVE (0);
EXTERNAL ROUTINE
$DDMDB : DDMDB_LINKAGE NOVALUE;
$DDMDB (index; db);
END %,
%fi
!
!
!
DDRCP$ (ccb, status) =
BEGIN
LINKAGE
DDRCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DDRCP : DDRCP_LINKAGE NOVALUE;
$DDRCP (ccb, status);
END %,
!
!
!
DDXCP$ (ccb, status) =
BEGIN
LINKAGE
DDXCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DDXCP : DDXCP_LINKAGE NOVALUE;
$DDXCP (ccb, status);
END %,
!
!
!
DLAST$ (index, status) =
BEGIN
LINKAGE
DLAST_LINKAGE = JSR (REGISTER = 3, REGISTER = 2) : PRESERVE (0) NOPRESERVE (3, 4) CLEARSTACK VALUECBIT;
EXTERNAL ROUTINE
$DLAST : DLAST_LINKAGE;
! Note: Cbit clear = FALSE = success
IF NOT $DLAST (status, index)
THEN
MCB$_NORMAL
ELSE
MCB$_NO_CCB
END %,
!
!
!
DLCCP$ (ccb, status) =
BEGIN
LINKAGE
DLCCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DLCCP : DLCCP_LINKAGE NOVALUE;
$DLCCP (ccb, status);
END %,
!
!
!
%if %variant eql 0
%then
DLCDB$ (index, db) =
BEGIN
LINKAGE
DLCDB_LINKAGE = JSR (REGISTER = 5) : PRESERVE (0) NOPRESERVE (5);
EXTERNAL ROUTINE
$DLCDB : DLCDB_LINKAGE NOVALUE;
GLOBAL REGISTER
R5 = 5;
$DLCDB (index);
%IF NOT %NULL (db) %THEN db = .R5; %FI
END %,
%else
DLCDB$ (index, db) =
BEGIN
LINKAGE
DLCDB_LINKAGE = JSR (REGISTER = 5; REGISTER = 5) : PRESERVE (0);
EXTERNAL ROUTINE
$DLCDB : DLCDB_LINKAGE NOVALUE;
$DLCDB (index; db);
END %,
%fi
!
!
!
DLGET$ (ccb) =
BEGIN
LINKAGE
DLGET_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLGET : DLGET_LINKAGE NOVALUE;
$DLGET (ccb);
END %,
!
!
!
DLRCE$ (ccb) =
BEGIN
LINKAGE
DLRCE_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLRCE : DLRCE_LINKAGE NOVALUE;
$DLRCE (ccb);
END %,
!
!
!
DLRCP$ (ccb, status) =
BEGIN
LINKAGE
DLRCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DLRCP : DLRCP_LINKAGE NOVALUE;
$DLRCP (ccb, status);
END %,
!
!
!
DLSET$ (ccb) =
BEGIN
LINKAGE
DLSET_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLSET : DLSET_LINKAGE NOVALUE;
$DLSET (ccb);
END %,
DLSTM$ = $MCB_START_SHORT_TIMER %,
!
!
!
DLSTP$ (ccb) =
BEGIN
LINKAGE
DLSTP_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLSTP : DLSTP_LINKAGE NOVALUE;
$DLSTP (ccb);
END %,
!
!
!
DLSTR$ (ccb) =
BEGIN
LINKAGE
DLSTR_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLSTR : DLSTR_LINKAGE NOVALUE;
$DLSTR (ccb);
END %,
!
!
!
DLXCP$ (ccb, status) =
BEGIN
LINKAGE
DLXCP_LINKAGE = JSR (REGISTER = 4, REGISTER = 3) : PRESERVE (0) NOPRESERVE (3, 4);
EXTERNAL ROUTINE
$DLXCP : DLXCP_LINKAGE NOVALUE;
$DLXCP (ccb, status);
END %,
!
!
!
DLXME$ (ccb) =
BEGIN
LINKAGE
DLXME_LINKAGE = JSR (REGISTER = 4) : PRESERVE (0) NOPRESERVE (4);
EXTERNAL ROUTINE
$DLXME : DLXME_LINKAGE NOVALUE;
$DLXME (ccb);
END %,
GTPRC$ (CCB) =
begin
bind
$MCB$CCB = CCB : block field (C_FIELDS);
$MCB_GET_LINE_PROCESSES (.$MCB$CCB [C_LIX], $MCB$CCB [C_PRM1])
end %,
LDBGT$ (ccb) =
begin
local
$MCB$SAV_MAP,
$MCB$STS;
external
MCB$GW_RDB_SIZE;
SMAP$ ($MCB$SAV_MAP);
$MCB$STS = $MCB_GET_CCB_AND_BUFFER (.MCB$GW_RDB_SIZE, ccb);
MAP$ (.$MCB$SAV_MAP);
.$MCB$STS
end %,
LDBRT$ (ccb) =
begin
local
$MCB$SAV_MAP;
external
MCB$GW_RDB_SIZE;
SMAP$ ($MCB$SAV_MAP);
$MCB_RETURN_CCB_AND_BUFFER (.MCB$GW_RDB_SIZE, ccb);
MAP$ (.$MCB$SAV_MAP);
end %,
LLCDB$ (db) =
begin
external
MCB$GAW_PROCESS_DATA_BASE : vector [2];
MAP$ (.MCB$GAW_PROCESS_DATA_BASE [0]);
db = .MCB$GAW_PROCESS_DATA_BASE [1]
end %,
LLCRS$ = $MCB_SCHEDULE_CCB %,
!
!
!
LLLTM$ (dummy) =
BEGIN
EXTERNAL ROUTINE
$LLLTM : NOVALUE;
$LLLTM ();
END %,
MCB$ = $MCB_RSX_TO_MCB %,
PDVID$ (NAME, INDEX) =
begin
local
$MCB$HANDLE,
$MCB$STATUS;
if ($MCB$STATUS = $MCB_GET_PROCESS_HANDLE (NAME, $MCB$HANDLE))
then
INDEX = .$MCB$HANDLE;
.$MCB$STATUS
end %,
!
!
!
PDVNM$ (INDEX, NAME) =
begin
local
$MCB$NAME,
$MCB$STATUS;
if ($MCB$STATUS = CALL$I (MCB$K_GET_PROCESS_NAME, INDEX, $MCB$NAME))
then
NAME = .$MCB$NAME;
.$MCB$STATUS
end %,
RDBCN$ = $MCB_CANCEL_RDB_REQUEST %,
RDBGT$ = $MCB_GET_RDB %,
RDBRQ$ = $MCB_REQUEST_RDB %,
RDBRT$ = $MCB_RETURN_RDB %,
RND$ = $MCB_GET_RANDOM_NUMBER %,
RSX$ = $MCB_MCB_TO_RSX %,
SYNCH$ = $MCB_SYNCHRONIZE %,
$MCB_EXCEPTION = $MCB_SET_EXCEPTION %;
macro
MCB$GAW_PROCESS_DATA_BASE = %name ('.CRDAT') %,
MCB$GA_LOGGING_BUFFER = %name ('.LOGPT') %,
MCB$GA_PROCESS_DISPATCH = %name ('.CRDSP') %,
MCB$GW_PROCESS_HANDLE = %name ('.CRPIX') %,
MCB$GW_PROCESS_WINDOW = %name ('KISAR5') %,
MCB$GW_DATA_WINDOW = %name ('KISAR6') %,
MCB$GW_RDB_SIZE = %name ('.RDBSZ') %,
$MCB$BUFFER_ADDRESS (BIAS, ADDRESS) = ADDRESS %,
$MCB$BUFFER_BIAS (BIAS, ADDRESS) = BIAS %,
!
!
!
$MCB_CANCEL_CCB_REQUEST (DUMMY) =
begin
external routine
$CCBCN : novalue;
$CCBCN ();
end %,
!
!
!
$MCB_CANCEL_RDB_REQUEST (DUMMY) =
begin
external routine
$RDBCN : novalue;
$RDBCN ();
end %,
!
!
!
$MCB_CANCEL_SHORT_TIMER (TIMER_BLOCK) =
begin
linkage
$MCB$LINKAGE_TIMER = jsr (register = 4) : PRESERVE (0);
external routine
$STMCN : $MCB$LINKAGE_TIMER novalue;
$STMCN (TIMER_BLOCK);
end %,
!
!
!
$MCB_CLEAR_PROCESS (DUMMY) =
CALL$I (MCB$K_CLEAR_PROCESS) %,
!
!
!
$MCB_CLEAR_PROCESS_NAME (NAME) =
CALL$I (MCB$K_CLEAR_PROCESS_NAME, NAME) %,
!
!
!
$MCB_CLEAR_VECTOR (VECTOR) =
CALL$I (MCB$K_CLEAR_VECTOR, VECTOR) %,
!
!
!
$MCB_CONVERT_FROM_UBA_ADDRESS (LOW, HIGH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_HIGH_LOW = jsr (register = 0, register = 1)
: nopreserve (1);
external routine
$VIR18 : $MCB$LINKAGE_HIGH_LOW;
%if not %null (ADDRESS) %then ADDRESS = %fi
$VIR18 (HIGH, LOW)
end %,
!
!
!
%if %variant eql 0
%then
$MCB_CONVERT_TO_22_BIT_ADDRESS (BUFFER, LOW, HIGH) =
%if not %identical (BUFFER, (%remove (BUFFER)))
%then %errormacro ('Buffer bias/address must be parenthesized') %fi
begin
linkage
$MCB$LINKAGE_BIAS_ADDRESS = jsr (register = 2, register = 3)
: preserve (0) nopreserve (2, 3);
external routine
$CNV22 : $MCB$LINKAGE_BIAS_ADDRESS novalue;
global register
$MCB$R3 = 3,
$MCB$R2 = 2;
$CNV22 (%remove (BUFFER));
%if not %null (LOW) %then LOW = .$MCB$R3; %fi
%if not %null (HIGH) %then HIGH = .$MCB$R2; %fi
end %,
%else
$MCB_CONVERT_TO_22_BIT_ADDRESS (BUFFER, LOW, HIGH) =
%if not %identical (BUFFER, (%remove (BUFFER)))
%then %errormacro ('Buffer bias/address must be parenthesized') %fi
begin
linkage
$MCB$LINKAGE_BIAS_ADDRESS = jsr (register = 2, register = 3; register = 3, register = 2)
: preserve (0);
external routine
$CNV22 : $MCB$LINKAGE_BIAS_ADDRESS novalue;
$CNV22 (%remove (BUFFER); LOW, HIGH);
end %,
%fi
!
!
!
%if %variant eql 0
%then
$MCB_CONVERT_TO_UBA_ADDRESS (BUFFER, LOW, HIGH) =
%if not %identical (BUFFER, (%remove (BUFFER)))
%then %errormacro ('Buffer bias/address must be parenthesized') %fi
begin
linkage
$MCB$LINKAGE_BIAS_ADDRESS = jsr (register = 2, register = 3)
: preserve (0) nopreserve (2, 3);
external routine
$PHY18 : $MCB$LINKAGE_BIAS_ADDRESS novalue;
global register
$MCB$R3 = 3,
$MCB$R2 = 2;
$PHY18 (%remove (BUFFER));
%if not %null (LOW) %then LOW = .$MCB$R3; %fi
%if not %null (HIGH) %then HIGH = .$MCB$R2; %fi
end %,
%else
$MCB_CONVERT_TO_UBA_ADDRESS (BUFFER, LOW, HIGH) =
%if not %identical (BUFFER, (%remove (BUFFER)))
%then %errormacro ('Buffer bias/address must be parenthesized') %fi
begin
linkage
$MCB$LINKAGE_BIAS_ADDRESS = jsr (register = 2, register = 3; register = 3, register = 2)
: preserve (0);
external routine
$PHY18 : $MCB$LINKAGE_BIAS_ADDRESS novalue;
$PHY18 (%remove (BUFFER); LOW, HIGH);
end %,
%fi
!
!
!
$MCB_COPY_CHAIN_TO_BUFFER (CCB, TO_BUFFER) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (register = 4);
external routine
$CPTBF : $MCB$LINKAGE_CCB;
$CPTBF (CCB, %remove (TO_BUFFER))
end %,
!
! Remove a CCB from a queue
!
%if %variant eql 0
%then
$MCB_DEQUEUE_CCB (QUEUE, CCB) =
begin
linkage
$MCB$LINKAGE_QUEUE_CCB = jsr (register = 3) : PRESERVE (0) nopreserve (4) clearstack valuecbit;
external routine
$CMQRM : $MCB$LINKAGE_QUEUE_CCB;
global register
$MCB$R4 = 4;
! Note: Cbit clear = FALSE = success
if not $CMQRM (QUEUE)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_QUEUE_EMPTY
end %,
%else %if %variant eql 1
%then
$MCB_DEQUEUE_CCB (QUEUE, CCB) =
begin
linkage
$MCB$LINKAGE_QUEUE_CCB = jsr (register = 3; register = 4) : PRESERVE (0) clearstack valuecbit;
external routine
$CMQRM : $MCB$LINKAGE_QUEUE_CCB;
! Note: Cbit clear = FALSE = success
if not $CMQRM (QUEUE; CCB)
then
MCB$_NORMAL
else
MCB$_QUEUE_EMPTY
end %,
%else
$MCB_DEQUEUE_CCB (QUEUE, CCB) =
begin
linkage
$MCB$LINKAGE_QUEUE_CCB = jsr (register = 3; register = 4) : preserve (0) clearstack valuecbit;
register
$MCB$R4 = 4;
external routine
$CMQRM : $MCB$LINKAGE_QUEUE_CCB;
! Note: Cbit clear = FALSE = success
if not $CMQRM (QUEUE; $MCB$R4)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_QUEUE_EMPTY
end %,
%fi %fi
!
!
!
$MCB_DISABLE_INTERRUPT (VECTOR) =
begin
linkage
$MCB$LINKAGE_VECTOR = jsr (register = 0);
external routine
$INTDS : $MCB$LINKAGE_VECTOR novalue;
$INTDS (VECTOR)
end %,
!
!
!
$MCB_DISABLE_LONG_TIMER (DUMMY) =
begin
external routine
$LTMDS : novalue;
$LTMDS ()
end %,
!
!
!
$MCB_ENABLE_INTERRUPT (VECTOR) =
begin
linkage
$MCB$LINKAGE_VECTOR = jsr (register = 0);
external routine
$INTEN : $MCB$LINKAGE_VECTOR novalue;
$INTEN (VECTOR)
end %,
!
!
!
$MCB_ENABLE_LONG_TIMER (DUMMY) =
begin
external routine
$LTMEN : novalue;
$LTMEN ()
end %,
!
! Get a buffer
!
$MCB_GET_BUFFER (LENGTH, ADDRESS) =
$MCB_GET_CORE (LENGTH, ADDRESS) %,
!
! Get a CCB
!
%if %variant eql 0
%then
$MCB_GET_CCB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr : preserve (0) nopreserve (4) clearstack valuecbit;
external routine
$CCBGT : $MCB$LINKAGE_CCB;
global register
$MCB$R4 = 4;
! Note: Cbit clear = FALSE = success
if not $CCBGT ()
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_CCB
end %,
%else %if %variant eql 1
%then
$MCB_GET_CCB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (; register = 4) : preserve (0) clearstack valuecbit;
external routine
$CCBGT : $MCB$LINKAGE_CCB;
! Note: Cbit clear = FALSE = success
if not $CCBGT (; CCB)
then
MCB$_NORMAL
else
MCB$_NO_CCB
end %,
%else
$MCB_GET_CCB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (; register = 4) : preserve (0) clearstack valuecbit;
register
$MCB$R4 = 4;
external routine
$CCBGT : $MCB$LINKAGE_CCB;
! Note: Cbit clear = FALSE = success
if not $CCBGT (; $MCB$R4)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_CCB
end %,
%fi %fi
!
!
!
%if %variant eql 0
%then
$MCB_GET_CCB_AND_BUFFER (LENGTH, CCB) =
begin
linkage
$MCB$LINKAGE_LENGTH_CCB = jsr (register = 1) : preserve (0) nopreserve (4) clearstack valuecbit;
external routine
$CBBGT : $MCB$LINKAGE_LENGTH_CCB;
global register
$MCB$R4 = 4;
! Note: Cbit clear = FALSE = success
if not $CBBGT (LENGTH)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_CSB
end %,
%else %if %variant eql 1
%then
$MCB_GET_CCB_AND_BUFFER (LENGTH, CCB) =
begin
linkage
$MCB$LINKAGE_LENGTH_CCB = jsr (register = 1; register = 4) : preserve (0) clearstack valuecbit;
external routine
$CBBGT : $MCB$LINKAGE_LENGTH_CCB;
! Note: Cbit clear = FALSE = success
if not $CBBGT (LENGTH; CCB)
then
MCB$_NORMAL
else
MCB$_NO_CSB
end %,
%else
$MCB_GET_CCB_AND_BUFFER (LENGTH, CCB) =
begin
linkage
$MCB$LINKAGE_LENGTH_CCB = jsr (register = 1; register = 4) : preserve (0) clearstack valuecbit;
register
$MCB$R4 = 4;
external routine
$CBBGT : $MCB$LINKAGE_LENGTH_CCB;
! Note: Cbit clear = FALSE = success
if not $CBBGT (LENGTH; $MCB$R4)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_CSB
end %,
%fi %fi
!
!
!
%if %variant eql 0
%then
$MCB_GET_CORE (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1) : nopreserve (0) clearstack valuecbit;
external routine
$CORGT : $MCB$LINKAGE_LENGTH_ADDRESS;
global register
$MCB$R0 = 0;
! Note: Cbit clear = FALSE = success
if not $CORGT (LENGTH)
then
begin
ADDRESS = .$MCB$R0;
MCB$_NORMAL
end
else
MCB$_NO_CORE
end %,
%else %if %variant eql 1
%then
$MCB_GET_CORE (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1; register = 0) : clearstack valuecbit;
external routine
$CORGT : $MCB$LINKAGE_LENGTH_ADDRESS;
! Note: Cbit clear = FALSE = success
if not $CORGT (LENGTH; ADDRESS)
then
MCB$_NORMAL
else
MCB$_NO_CORE
end %,
%else
$MCB_GET_CORE (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1; register = 0) : clearstack valuecbit;
register
$MCB$R0 = 0;
external routine
$CORGT : $MCB$LINKAGE_LENGTH_ADDRESS;
! Note: Cbit clear = FALSE = success
if not $CORGT (LENGTH; $MCB$R0)
then
begin
ADDRESS = .$MCB$R0;
MCB$_NORMAL
end
else
MCB$_NO_CORE
end %,
%fi %fi
!
!
!
$MCB_GET_DEVICE_NAME (LIX, BUF) =
CALL$I (MCB$K_GET_DEVICE_NAME, LIX, BUF) %,
!
!
!
%if %variant eql 0
%then
$MCB_GET_DSR (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH = jsr (register = 1) : nopreserve (0, 1) clearstack valuecbit;
external routine
$DSRGT : $MCB$LINKAGE_LENGTH;
global register
$MCB$R0 = 0,
$MCB$R1 = 1;
! Note: Cbit clear = FALSE = success
if not $DSRGT (LENGTH)
then
begin
ADDRESS = .$MCB$R0;
RSX$_NORMAL
end
else
RSX$_NO_MEMORY
end %,
%else %if %variant eql 1
%then
$MCB_GET_DSR (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1; register = 0) :
clearstack valuecbit;
external routine
$DSRGT : $MCB$LINKAGE_LENGTH_ADDRESS;
! Note: Cbit clear = FALSE = success
if not $DSRGT (LENGTH; ADDRESS)
then
RSX$_NORMAL
else
RSX$_NO_MEMORY
end %,
%else
$MCB_GET_DSR (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1; register = 0) :
clearstack valuecbit;
register
$MCB$R0 = 0;
external routine
$DSRGT : $MCB$LINKAGE_LENGTH_ADDRESS;
! Note: Cbit clear = FALSE = success
if not $DSRGT (LENGTH; $MCB$R0)
then
begin
ADDRESS = .$MCB$R0;
RSX$_NORMAL
end
else
RSX$_NO_MEMORY
end %,
%fi %fi
!
!
!
$MCB_GET_EXTENSION_HANDLE (NAME, INDEX) =
begin
local
$MCB$MY_INDEX,
$MCB$STATUS;
if ($MCB$STATUS = CALL$I (MCB$K_GET_PROCESS_INDEX, NAME, $MCB$MY_INDEX))
then
INDEX = .$MCB$MY_INDEX;
.$MCB$STATUS
end %,
!
!
!
$MCB_GET_LINE_PROCESSES (LIX, BUF) =
CALL$I (MCB$K_GET_LINE_PROCESSES, LIX, BUF) %,
!
!
!
$MCB_GET_PROCESS_HANDLE (NAME, INDEX) =
begin
local
$MCB$MY_INDEX,
$MCB$STATUS;
if ($MCB$STATUS = CALL$I (MCB$K_GET_PROCESS_INDEX, NAME, $MCB$MY_INDEX))
then
INDEX = .$MCB$MY_INDEX;
.$MCB$STATUS
end %,
!
!
!
$MCB_GET_RANDOM_NUMBER (MAX) =
begin
linkage
$MCB$LINKAGE_NUM = jsr (register = 0);
external routine
$RND : $MCB$LINKAGE_NUM;
$RND (MAX)
end %,
!
!
!
%if %variant eql 0
%then
$MCB_GET_RDB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr : preserve (0) nopreserve (4) clearstack valuecbit;
external routine
$RDBGT : $MCB$LINKAGE_CCB;
global register
$MCB$R4 = 4;
! Note: Cbit clear = FALSE = success
if not $RDBGT ()
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_RDB
end %,
%else %if %variant eql 1
%then
$MCB_GET_RDB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (; register = 4) : preserve (0) clearstack valuecbit;
external routine
$RDBGT : $MCB$LINKAGE_CCB;
! Note: Cbit clear = FALSE = success
if not $RDBGT (; CCB)
then
MCB$_NORMAL
else
MCB$_NO_RDB
end %,
%else
$MCB_GET_RDB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (; register = 4) : preserve (0) clearstack valuecbit;
register
$MCB$R4 = 4;
external routine
$RDBGT : $MCB$LINKAGE_CCB;
! Note: Cbit clear = FALSE = success
if not $RDBGT (; $MCB$R4)
then
begin
CCB = .$MCB$R4;
MCB$_NORMAL
end
else
MCB$_NO_RDB
end %,
%fi %fi
!
!
!
$MCB_INITIALIZE_QUEUE (QUEUE) =
begin
bind
$MCB$HIS_QUEUE = QUEUE : vector [2];
$MCB$HIS_QUEUE [0] = 0;
$MCB$HIS_QUEUE [1] = $MCB$HIS_QUEUE [0];
end %,
!
!
!
$MCB_MATCH_COND (STATUS, PLIT_VECTOR) =
begin
linkage
$MCB$LINKAGE_STS_VEC = jsr (register = 1, register = 0);
external routine
$IDSTS : $MCB$LINKAGE_STS_VEC;
$IDSTS (STATUS, PLIT_VECTOR)
end %,
!
!
!
$MCB_MATCH_VALUE (VALUE, PLIT_VECTOR) =
begin
linkage
$MCB$LINKAGE_VAL_VEC = jsr (register = 1, register = 0);
external routine
$IDVAL : $MCB$LINKAGE_VAL_VEC;
$IDVAL (VALUE, PLIT_VECTOR)
end %,
!
!
!
%if %variant eql 0
%then
$MCB_MCB_TO_RSX (LLC_DB, UCB) =
begin
linkage
$MCB$LINKAGE_UCB = jsr : preserve (0) nopreserve (5);
external routine
$RSX : $MCB$LINKAGE_UCB novalue;
global register
$MCB$R5 = 5;
$RSX ();
%if not %null (UCB) %then UCB = .$MCB$R5; %fi
end %,
%else
$MCB_MCB_TO_RSX (LLC_DB, UCB) =
begin
linkage
$MCB$LINKAGE_UCB = jsr (; register = 5) : preserve (0);
external routine
$RSX : $MCB$LINKAGE_UCB novalue;
$RSX (; UCB);
end %,
%fi
!
! Move to mapped buffer
!
$MCB_MOVE_BUFFER_TO_BUFFER (LNG, FROM_BUFFER, TO_BUFFER) =
%if %identical (FROM_BUFFER, (%remove (FROM_BUFFER))) and
%identical (TO_BUFFER, (%remove (TO_BUFFER)))
%then %errormacro ('Cannot move from unmapped to unmapped buffer') %fi
%if not %identical (FROM_BUFFER, (%remove (FROM_BUFFER))) and
not %identical (TO_BUFFER, (%remove (TO_BUFFER)))
%then ch$move (LNG, FROM_BUFFER, TO_BUFFER) %exitmacro %fi
begin
linkage
$MCB$LINKAGE_ADDR_LNG = jsr (register = 2, register = 3) : preserve (0) nopreserve (2, 3);
external routine
%if %identical (FROM_BUFFER, (%remove (FROM_BUFFER)))
%then $MVFBF %else $MVTBF %fi : $MCB$LINKAGE_ADDR_LNG novalue;
%if %identical (FROM_BUFFER, (%remove (FROM_BUFFER)))
%then $MVFBF (TO_BUFFER, LNG, %remove (FROM_BUFFER))
%else $MVTBF (FROM_BUFFER, LNG, %remove (TO_BUFFER))
%fi
end %,
!
!
!
$MCB_PAUSE (SYNCH_BLOCK, ADDRESS) =
begin
linkage
$MCB$LINKAGE_SBLK = jsr (register = 4) : preserve (0) nopreserve (4);
external routine
$PAUSE : $MCB$LINKAGE_SBLK novalue;
block [SYNCH_BLOCK, 2, 0, %bpaddr, 0] = ADDRESS;
$PAUSE (SYNCH_BLOCK);
end %,
!
! Queue a CCB on a queue
!
$MCB_QUEUE_CCB (QUEUE, CCB) =
begin
linkage
$MCB$LINKAGE_QUEUE_CCB = jsr (register = 4, register = 3) : preserve (0);
external routine
$CMQIN : $MCB$LINKAGE_QUEUE_CCB novalue;
$CMQIN (CCB, QUEUE);
end %,
!
!
!
$MCB_REQUEST_CCB (DUMMY) =
begin
external routine
$CCBRQ : novalue;
$CCBRQ ();
end %,
!
!
!
$MCB_REQUEST_RDB (DUMMY) =
begin
external routine
$RDBRQ : novalue;
$RDBRQ ();
end %,
!
!
!
$MCB_RETURN_BUFFER (LENGTH, ADDRESS) =
$MCB_RETURN_CORE (LENGTH, ADDRESS) %,
!
! Return a CCB
!
$MCB_RETURN_CCB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (register = 4) : preserve (0) nopreserve (4);
external routine
$CCBRT : $MCB$LINKAGE_CCB novalue;
$CCBRT (CCB);
end %,
!
!
!
$MCB_RETURN_CCB_AND_BUFFER (LENGTH, CCB) =
begin
linkage
$MCB$LINKAGE_LENGTH_CCB = jsr (register = 1, register = 4) : preserve (0) nopreserve (4);
external routine
$CBBRT : $MCB$LINKAGE_LENGTH_CCB novalue;
$CBBRT (LENGTH, CCB);
end %,
!
!
!
$MCB_RETURN_CORE (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_LENGTH_ADDRESS = jsr (register = 1, register = 0) : nopreserve (0, 1);
external routine
$CORRT : $MCB$LINKAGE_LENGTH_ADDRESS novalue;
$CORRT (LENGTH, ADDRESS);
end %,
!
!
!
$MCB_RETURN_DSR (LENGTH, ADDRESS) =
begin
linkage
$MCB$LINKAGE_ADDRESS_LENGTH = jsr (register = 0, register = 1) : nopreserve (0, 1);
external routine
$DSRRT : $MCB$LINKAGE_ADDRESS_LENGTH novalue;
$DSRRT (ADDRESS, LENGTH);
end %,
!
!
!
$MCB_RETURN_RDB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (register = 4) : preserve (0) nopreserve (4);
external routine
$RDBRT : $MCB$LINKAGE_CCB novalue;
$RDBRT (CCB);
end %,
!
!
!
%if %variant eql 0
%then
$MCB_RSX_TO_MCB (UCB, LLC_DB) =
begin
linkage
$MCB$LINKAGE_UCB_DB = jsr (register = 5) : preserve (0) nopreserve (5);
external routine
$MCB : $MCB$LINKAGE_UCB_DB novalue;
global register
$MCB$R5 = 5;
$MCB (UCB);
%if not %null (LLC_DB) %then LLC_DB = .$MCB$R5; %fi
end %,
%else
$MCB_RSX_TO_MCB (UCB, LLC_DB) =
begin
linkage
$MCB$LINKAGE_UCB_DB = jsr (register = 5; register = 5) : preserve (0);
external routine
$MCB : $MCB$LINKAGE_UCB_DB novalue;
$MCB (UCB; LLC_DB)
end %,
%fi
!
!
!
$MCB_SCHEDULE_CCB (CCB) =
begin
linkage
$MCB$LINKAGE_CCB = jsr (register = 4) : preserve (0) nopreserve (4);
external routine
$SCHED : $MCB$LINKAGE_CCB novalue;
$SCHED (CCB);
end %,
!
! Setup an Exception Vector
!
$MCB_SET_EXCEPTION (TYPE, NEW, OLD) =
CALL$I (MCB$K_SET_EXCEPTION, TYPE, NEW,
%if not %null (OLD) %then OLD %else 0 %fi) %,
!
!
!
$MCB_SET_LINE_PROCESSES (LIX, BUF) =
CALL$I (MCB$K_SET_LINE_PROCESSES, LIX, BUF) %,
!
!
!
$MCB_SET_PROCESS (NAME, INDEX) =
begin
local
$MCB$MY_INDEX,
$MCB$STATUS;
if ($MCB$STATUS = CALL$I (MCB$K_SET_PROCESS, $MCB$MY_INDEX
%if not %null (NAME) %then , NAME %fi))
then
INDEX = .$MCB$MY_INDEX;
.$MCB$STATUS
end %,
!
!
!
$MCB_SET_PROCESS_NAME (NAME) =
CALL$I (MCB$K_SET_PROCESS_NAME, NAME) %,
!
!
!
$MCB_SET_VECTOR (VECTOR, DISPATCH, PRIORITY) =
CALL$I (MCB$K_SET_VECTOR, VECTOR, DISPATCH, PRIORITY) %,
!
! Stack a CCB on a queue
!
$MCB_STACK_CCB (QUEUE, CCB) =
begin
linkage
$MCB$LINKAGE_QUEUE_CCB = jsr (register = 4, register = 3) : preserve (0);
external routine
$CMQIF : $MCB$LINKAGE_QUEUE_CCB novalue;
$CMQIF (CCB, QUEUE);
end %,
!
!
!
$MCB_START_SHORT_TIMER (TIMER_BLOCK) =
begin
linkage
$MCB$LINKAGE_TIMER = jsr (register = 4) : preserve (0);
external routine
$STMRQ : $MCB$LINKAGE_TIMER novalue;
$STMRQ (TIMER_BLOCK);
end %,
!
!
!
$MCB_SYNCHRONIZE (SYNCH_BLOCK, ADDRESS) =
begin
linkage
$MCB$LINKAGE_SBLK = jsr (register = 4) : preserve (0) nopreserve (4);
external routine
$SYNCH : $MCB$LINKAGE_SBLK novalue;
block [SYNCH_BLOCK, 2, 0, %bpaddr, 0] = ADDRESS;
$SYNCH (SYNCH_BLOCK);
end %;
%FI %(BLISS16)%
%IF %BLISS (BLISS16)
%THEN %(BLISS16)%
!
! RSX interface macros
!
MACRO
!
!
!
ACHCK$ (ADDRESS, LENGTH) =
$RSX_VALIDATE_BUFFER (LENGTH, ADDRESS) %,
!
!
!
ACHKB$ (ADDRESS, LENGTH) =
begin
linkage
$RSX$LINKAGE_ADDRESS_LENGTH = jsr (register = 0, register = 1)
: nopreserve (1, 2) clearstack valuecbit;
external routine
$ACHKB : $RSX$LINKAGE_ADDRESS_LENGTH;
! Note: Cbit clear = FALSE = success
if not $ACHKB (ADDRESS, LENGTH)
then
RSX$_NORMAL
else
RSX$_INVALID_ADDRESS
end %,
!
!
!
ALOCB$ = $RSX_GET_DSR %,
!
!
!
DEACB$ (ADDRESS, LENGTH) =
$RSX_RETURN_DSR (LENGTH, ADDRESS) %,
!
!
!
GTPKT$ = $MCB_GET_IOP %,
!
!
!
%if %variant eql 0
%then
IOALT$ (UCB, STATUS, IOP) =
begin
linkage
$RSX$LINKAGE_UCB_STATUS = jsr (register = 5, register = 0)
: nopreserve (0, 1, 2, 3, 4);
external routine
$IOALT : $RSX$LINKAGE_UCB_STATUS novalue;
global register
$RSX$R3 = 3;
$IOALT (UCB, STATUS);
%if not %null (IOP) %then IOP = .$RSX$R3; %fi
end %,
%else
IOALT$ (UCB, STATUS, IOP) =
begin
linkage
$RSX$LINKAGE_UCB_STATUS = jsr (register = 5, register = 0; register = 3)
: nopreserve (0, 1, 2, 3, 4);
external routine
$IOALT : $RSX$LINKAGE_UCB_STATUS novalue;
$IOALT (UCB, STATUS; IOP)
end %,
%fi
!
!
!
%if %variant eql 0
%then
IODON$ (UCB, STATUS, COUNT, IOP) =
begin
linkage
$RSX$LINKAGE_UCB_STATUS_COUNT = jsr (register = 5, register = 0, register = 1)
: nopreserve (0, 1, 2, 3, 4);
external routine
$IODON : $RSX$LINKAGE_UCB_STATUS_COUNT novalue;
global register
$RSX$R3 = 3;
$IODON (UCB, STATUS, COUNT);
%if not %null (IOP) %then IOP = .$RSX$R3; %fi
end %,
%else
IODON$ (UCB, STATUS, COUNT, IOP) =
begin
linkage
$RSX$LINKAGE_UCB_STATUS_COUNT = jsr (register = 5, register = 0, register = 1; register = 3)
: nopreserve (0, 1, 2, 3, 4);
external routine
$IODON : $RSX$LINKAGE_UCB_STATUS_COUNT novalue;
$IODON (UCB, STATUS, COUNT; IOP)
end %,
%fi
!
!
!
IOFIN$ (UCB, IOP, STATUS, COUNT) =
begin
linkage
$RSX$LINKAGE_UCB_IOP_STS_CNT = jsr (register = 5, register = 3, register = 0, register = 1)
: nopreserve (0, 1, 2, 3, 4);
external routine
$IOFIN : $RSX$LINKAGE_UCB_IOP_STS_CNT novalue;
$IOFIN (UCB, IOP, STATUS, COUNT);
end %,
!
!
!
QINSP$ (LIST_HEAD, ENTRY) =
begin
linkage
$RSX$LINKAGE_QUEUE_ENTRY = jsr (register = 0, register = 1)
: nopreserve (2, 3);
external routine
$QINSP : $RSX$LINKAGE_QUEUE_ENTRY novalue;
$QINSP (LIST_HEAD, ENTRY);
end %,
!
!
!
%if %variant eql 0
%then
QRMVF$ (LIST_HEAD, ENTRY) =
begin
linkage
$RSX$LINKAGE_QUEUE = jsr (register = 0)
: nopreserve (1, 2, 3) clearstack valuecbit;
external routine
$QRMVF : $RSX$LINKAGE_QUEUE;
global register
$RSX$R1 = 1;
! Note: Cbit clear = FALSE = success
if not $QRMVF (LIST_HEAD)
then
begin
ENTRY = .$RSX$R1;
RSX$_NORMAL
else
else
RSX$_QUEUE_EMPTY
end %,
%else %if %variant eql 1
%then
QRMVF$ (LIST_HEAD, ENTRY) =
begin
linkage
$RSX$LINKAGE_QUEUE = jsr (register = 0; register = 1)
: nopreserve (2, 3) clearstack valuecbit;
external routine
$QRMVF : $RSX$LINKAGE_QUEUE;
! Note: Cbit clear = FALSE = success
if not $QRMVF (LIST_HEAD; ENTRY)
then
RSX$_NORMAL
else
RSX$_QUEUE_EMPTY
end %,
%else
QRMVF$ (LIST_HEAD, ENTRY) =
begin
linkage
$RSX$LINKAGE_QUEUE = jsr (register = 0; register = 1)
: nopreserve (2, 3) clearstack valuecbit;
register
$RSX$R1 = 1;
external routine
$QRMVF : $RSX$LINKAGE_QUEUE;
! Note: Cbit clear = FALSE = success
if not $QRMVF (LIST_HEAD; $RSX$R1)
then
begin
ENTRY = .$RSX$R1;
RSX$_NORMAL
end
else
RSX$_QUEUE_EMPTY
end %,
%fi %fi
!
!
!
RELOC$ = $RSX_CONVERT_TO_BIAS_ADDRESS %,
!
!
!
EXRQN$ (TCB) =
begin
linkage
$RSX$LINKAGE_TCB = jsr (register = 0) : nopreserve (0, 1, 2, 3);
external routine
$EXRQN : $RSX$LINKAGE_TCB novalue;
$EXRQN (TCB);
end %,
!
!
!
QASTT$ (TCB, AST) =
begin
linkage
$RSX$LINKAGE_TCB_AST = jsr (register = 0, register = 1)
: nopreserve (0, 2, 3);
external routine
$QASTT : $RSX$LINKAGE_TCB_AST novalue;
$QASTT (TCB, AST);
end %,
!
!
!
TSKRT$ (tcb, uic) =
begin
linkage
$RSX$LINKAGE_TCB_UIC = jsr (register = 0, register = 1) : nopreserve (0, 1, 2, 3)
clearstack valuecbit;
external routine
$TSKRT: $RSX$LINKAGE_TCB_UIC;
! Note: Cbit clear = FALSE = success
if not $TSKRT (tcb, uic)
then
RSX$_NORMAL
else
RSX$_NO_TASK
end %,
%if %variant eql 0
%then
$RSX_CONVERT_TO_BIAS_ADDRESS (USER_ADDRESS, BIAS, ADDRESS) =
begin
linkage
$RSX$LINKAGE_ADDRESS = jsr (register = 0) : nopreserve (1, 2);
external routine
$RELOC : $RSX$LINKAGE_ADDRESS novalue;
global register
$RSX$R1 = 1,
$RSX$R2 = 2;
$RELOC (USER_ADDRESS);
BIAS = .$RSX$R1;
ADDRESS = .$RSX$R2;
end %,
%else
$RSX_CONVERT_TO_BIAS_ADDRESS (USER_ADDRESS, BIAS, ADDRESS) =
begin
linkage
$RSX$LINKAGE_ADDRESS = jsr (register = 0; register = 1, register = 2);
external routine
$RELOC : $RSX$LINKAGE_ADDRESS novalue;
$RELOC (USER_ADDRESS; BIAS, ADDRESS)
end %,
%fi
%if %variant eql 0
%then
$RSX_GET_DSR (LENGTH, ADDRESS, ALLOCATED_LENGTH) =
begin
linkage
$RSX$LINKAGE_LENGTH = jsr (register = 1) : nopreserve (0, 1, 2) clearstack valuecbit;
external routine
$ALOCB : $RSX$LINKAGE_LENGTH;
global register
$RSX$R0 = 0,
$RSX$R1 = 1;
! Note: Cbit clear = FALSE = success
if not $ALOCB (LENGTH)
then
begin
ADDRESS = .$RSX$R0;
%if not %null (ALLOCATED_LENGTH)
%then ALLOCATED_LENGTH = .$RSX$R1; %fi
RSX$_NORMAL
end
else
RSX$_NO_MEMORY
end %,
%else %if %variant eql 1
%then
$RSX_GET_DSR (LENGTH, ADDRESS, ALLOCATED_LENGTH) =
begin
linkage
$RSX$LINKAGE_LENGTH = jsr (register = 1; register = 0, register = 1) :
nopreserve (0, 1, 2) clearstack valuecbit;
external routine
$ALOCB : $RSX$LINKAGE_LENGTH;
! Note: Cbit clear = FALSE = success
if not $ALOCB (LENGTH; ADDRESS, ALLOCATED_LENGTH)
then
RSX$_NORMAL
else
RSX$_NO_MEMORY
end %,
%else
$RSX_GET_DSR (LENGTH, ADDRESS, ALLOCATED_LENGTH) =
begin
linkage
$RSX$LINKAGE_LENGTH = jsr (register = 1; register = 0, register = 1) :
nopreserve (0, 1, 2) clearstack valuecbit;
register
$RSX$R1 = 1,
$RSX$R0 = 0;
external routine
$ALOCB : $RSX$LINKAGE_LENGTH;
! Note: Cbit clear = FALSE = success
if not $ALOCB (LENGTH; $RSX$R0, $RSX$R1)
then
begin
ADDRESS = .$RSX$R0;
%if not %null (ALLOCATED_LENGTH)
%then ALLOCATED_LENGTH = .$RSX$R1; %fi
RSX$_NORMAL
end
else
RSX$_NO_MEMORY
end %,
%fi %fi
%if %variant eql 0
%then
$RSX_ACCEPT_IOP (OLD_UCB, IOP, UNIT, CONTROLLER, SCB, NEW_UCB) =
begin
linkage
$RSX$LINKAGE_UCB = jsr (register = 5) : nopreserve (1, 2, 3, 4, 5) clearstack valuecbit;
external routine
$GTPKT : $RSX$LINKAGE_UCB;
global register
$RSX$R1 = 1,
$RSX$R2 = 2,
$RSX$R3 = 3,
$RSX$R4 = 4,
$RSX$R5 = 5;
! Note: Cbit clear = FALSE = success
if not $GTPKT (OLD_UCB)
then
begin
%if not %null (IOP) %then IOP = .$RSX$R1; %fi
%if not %null (UNIT) %then UNIT = .$RSX$R2; %fi
%if not %null (CONTROLLER) %then CONTROLLER = .$RSX$R3; %fi
%if not %null (SCB) %then SCB = .$RSX$R4; %fi
%if not %null (NEW_UCB) %then NEW_UCB = .$RSX$R5; %fi
RSX$_NORMAL
end
else
RSX$_NO_PACKET
end %,
%else %if %variant eql 1
%then
$RSX_ACCEPT_IOP (OLD_UCB, IOP, UNIT, CONTROLLER, SCB, NEW_UCB) =
begin
linkage
$RSX$LINKAGE_UCB = jsr (register = 5; register = 1, register = 2,
register = 3, register = 4, register = 5) : clearstack valuecbit;
external routine
$GTPKT : $RSX$LINKAGE_UCB;
! Note: Cbit clear = FALSE = success
if not $GTPKT (OLD_UCB; IOP, UNIT, CONTROLLER, SCB, NEW_UCB)
then
RSX$_NORMAL
else
RSX$_NO_PACKET
end %,
%else
$RSX_ACCEPT_IOP (OLD_UCB, IOP, UNIT, CONTROLLER, SCB, NEW_UCB) =
begin
linkage
$RSX$LINKAGE_UCB = jsr (register = 5; register = 1, register = 2,
register = 3, register = 4, register = 5) : clearstack valuecbit;
register
$RSX$R1 = 1,
$RSX$R2 = 2,
$RSX$R3 = 3,
$RSX$R4 = 4,
$RSX$R5 = 5;
external routine
$GTPKT : $RSX$LINKAGE_UCB;
! Note: Cbit clear = FALSE = success
if not $GTPKT (OLD_UCB; $RSX$R1, $RSX$R2, $RSX$R3, $RSX$R4, $RSX$R5)
then
begin
%if not %null (IOP) %then IOP = .$RSX$R1; %fi
%if not %null (UNIT) %then UNIT = .$RSX$R2; %fi
%if not %null (CONTROLLER) %then CONTROLLER = .$RSX$R3; %fi
%if not %null (SCB) %then SCB = .$RSX$R4; %fi
%if not %null (NEW_UCB) %then NEW_UCB = .$RSX$R5; %fi
RSX$_NORMAL
end
else
RSX$_NO_PACKET
end %,
%fi %fi
%if %variant eql 0
%then
$RSX_GET_TCB (NAME, TCB) =
begin
linkage
$RSX$LINKAGE_NAME = jsr (register = 3) : nopreserve (0) clearstack valuecbit;
external routine
$SRSTD : $RSX$LINKAGE_NAME;
external
$TSKHD : ref vector;
global register
$RSX$R0 = 0;
! Note: Cbit clear = FALSE = success
if .$TSKHD [12] eqla 0
then
RSX$_NO_TASK
else
if $SRSTD (NAME)
then
RSX$_NO_TASK
else
begin
TCB = .$RSX$R0;
RSX$_NORMAL
end
end %,
%else %if %variant eql 1
%then
$RSX_GET_TCB (NAME, TCB) =
begin
linkage
$RSX$LINKAGE_NAME = jsr (register = 3; register = 0) : clearstack valuecbit;
external routine
$SRSTD : $RSX$LINKAGE_NAME;
! Note: Cbit clear = FALSE = success
if not $SRSTD (NAME; TCB)
then
RSX$_NORMAL
else
RSX$_NO_TASK
end %,
%else
$RSX_GET_TCB (NAME, TCB) =
begin
linkage
$RSX$LINKAGE_NAME = jsr (register = 3; register = 0) : clearstack valuecbit;
register
$RSX$R0 = 0;
external routine
$SRSTD : $RSX$LINKAGE_NAME;
! Note: Cbit clear = FALSE = success
if not $SRSTD (NAME; $RSX$R0)
then
begin
TCB = .$RSX$R0;
RSX$_NORMAL
end
else
RSX$_NO_TASK
end %,
%fi %fi
$RSX_REQUEST_TASK (TCB, UIC) =
begin
linkage
$RSX$LINKAGE_TCB = jsr (register = 0) : nopreserve (0, 1, 2, 3),
$RSX$LINKAGE_TCB_UIC = jsr (register = 0, register = 1) : nopreserve (0, 1, 2, 3);
external routine
%if %null (UIC)
%then $EXRQN : $RSX$LINKAGE_TCB
%else $TSKRT : $RSX$LINKAGE_TCB_UIC
%fi;
! Note: Cbit clear = FALSE = success
if not
%if %null (UIC)
%then $EXRQN (TCB)
%else $TSKRT (TCB, UIC)
%fi
then
RSX$_NORMAL
else
RSX$_NO_TASK
end %,
$RSX_RETURN_DSR (LENGTH, ADDRESS) =
begin
linkage
$RSX$LINKAGE_ADDRESS_LENGTH = jsr (register = 0, register = 1) : nopreserve (0, 1, 2, 3);
external routine
$DEACB : $RSX$LINKAGE_ADDRESS_LENGTH novalue;
$DEACB (ADDRESS, LENGTH);
end %,
$RSX_FINISH_IOP (UCB, IOP, STATUS, COUNT) =
begin
linkage
$RSX$LINKAGE_UCB_STS = jsr (register = 5, register = 0)
: nopreserve (0, 1, 2, 3, 4),
$RSX$LINKAGE_UCB_STS_CNT = jsr (register = 5, register = 0, register = 1)
: nopreserve (0, 1, 2, 3, 4),
$RSX$LINKAGE_UCB_STS_CNT_IOP = jsr (register = 5, register = 0, register = 1, register = 3)
: nopreserve (0, 1, 2, 3, 4);
external routine
%if %null (COUNT, IOP)
%then $IOALT : $RSX$LINKAGE_UCB_STS
%else %if %null (COUNT)
%then $IODON : $RSX$LINKAGE_UCB_STS_CNT
%else $IOFIN : $RSX$LINKAGE_UCB_STS_CNT_IOP
%fi %fi novalue;
%if %null (COUNT, IOP)
%then $IOALT (UCB, STATUS)
%else %if %null (COUNT)
%then $IODON (UCB, STATUS, COUNT)
%else $IOFIN (UCB, STATUS, COUNT, IOP)
%fi %fi;
end %,
$RSX_SCHEDULE_AST (TCB, AST_BLOCK) =
begin
linkage
$RSX$LINKAGE_TCB_AST = jsr (register = 0, register = 1) : nopreserve (0, 2, 3);
external routine
$QASTT : $RSX$LINKAGE_TCB_AST novalue;
$QASTT (TCB, AST_BLOCK);
end %,
$RSX_VALIDATE_BUFFER (length, address) =
begin
linkage
$RSX$LINKAGE_ADDRESS_LENGTH = jsr (register = 0, register = 1)
: nopreserve (1, 2) clearstack valuecbit;
external routine
$ACHCK : $RSX$LINKAGE_ADDRESS_LENGTH;
! Note: Cbit clear = FALSE = success
if not $ACHCK (ADDRESS, LENGTH)
then
RSX$_NORMAL
else
RSX$_INVALID_ADDRESS
end %;
%FI %(BLISS16)%
!
! [End of MCBLIB]