Trailing-Edge
-
PDP-10 Archives
-
decuslib20-07
-
decus/20-0172/x10scn.r36
There is 1 other file named x10scn.r36 in the archive. Click here to see a list.
!
! SCAN File Specification Area
!
$FIELD SCAN$FILE_SPEC = SET
SCAN$C_FXDEV = [$SIXBIT(6)] , ! device name (non-zero if any part of spec)
SCAN$C_FXNAM = [$SIXBIT(6)] , ! file name (non-zero if name present)
SCAN$V_FXNMM = [$BYTES(4)] , ! file name mask
SCAN$Z_FXEXT = [$BYTES(4)] , ! included for compatibility - do not use
$OVERLAY( SCAN$Z_FXEXT ) ! backup to redefine file extension field
SCAN$C_FXEXT = [$SIXBIT(3)] , ! file extension
SCAN$V_FXEXT = [$BYTES(2)] , ! file extension mask
SCAN$G_FXMOD = [$INTEGER] , ! modifier word
SCAN$V_FXMOM = [$BYTES(4)] , ! modifier mask
SCAN$G_FXDIR = [$INTEGER] , ! directory word
$OVERLAY( SCAN$G_FXDIR ) ! backup to redefine directory word
SCAN$H_FXDIR2 = [$SHORT_INTEGER] , ! programmer number
SCAN$H_FXDIR1 = [$SHORT_INTEGER] , ! project number
SCAN$V_FXDIM = [$BYTES(4)] , ! directory mask
SCAN$Z_FILLER = [$SUB_BLOCK(11)] , ! *** unspecified ***
SCAN$G_FXBFR = [$INTEGER] , ! /BEFORE
SCAN$G_FXSNC = [$INTEGER] , ! /SINCE
SCAN$G_FXABF = [$INTEGER] , ! /ABEFORE
SCAN$G_FXASN = [$INTEGER] , ! /ASINCE
SCAN$G_FXFLI = [$INTEGER] , ! minimum file size (words)
SCAN$G_FXFLM = [$INTEGER] , ! maximum file size (words)
SCAN$G_FXEST = [$INTEGER] , ! /ESTIMATE
SCAN$G_FXVER = [$INTEGER] ! /VERSION
TES;
LITERAL SCAN$K_FXLEN = $FIELD_SET_SIZE ; ! Length of file specification area
MACRO
$SCAN_SPEC_INFO =
BLOCK[ SCAN$K_FXLEN ]
FIELD( SCAN$FILE_SPEC ) %;
!
! TOPS-10 SCAN Interface Macros
!
LINKAGE ! Define several SCAN routine linkages:
$SCAN_P1_T1234 = PUSHJ ( REGISTER = 1 ) : ! argument passed in register 1
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
NOPRESERVE( 1,2,3,4 ) ! SCAN temporary registers
PRESERVE( 0,5,6,7,8,9,10,11,12,14 ), ! SCAN preserved registers
$SCAN_G12 = PUSHJ : ! no argument
GLOBAL( SWITCH_VALUE = 1, ! global "switch value" register
SWITCH_TABLE = 2 ) ! global "switch table address" register
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
PRESERVE( 0,3,4,5,6,7,8,9,10,11,12,14 ), ! SCAN preserved registers
$SCAN_G78 = PUSHJ : ! no argument
GLOBAL( SWITCH_VALUE = 7, ! global "switch value" register
CHARACTER = 8 ) ! global "current character" register
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
PRESERVE( 0,1,2,3,4,5,6,9,10,11,12,14 ), ! SCAN preserved registers
$SCAN_G78_T1 = PUSHJ : ! no argument
GLOBAL( SWITCH_VALUE = 7, ! global "switch value" register
CHARACTER = 8 ) ! global "current character" register
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
NOPRESERVE( 1 ) ! SCAN temporary register
PRESERVE( 0,2,3,4,5,6,9,10,11,12,14 ), ! SCAN preserved registers
$SCAN_G178_T234 = PUSHJ : ! no argument
GLOBAL( KEYWORD_INFO = 1, ! global "keyword table" register
SWITCH_VALUE = 7, ! global "switch value" register
CHARACTER = 8 ) ! global "current character" register
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
NOPRESERVE( 2,3,4 ) ! SCAN temporary registers
PRESERVE( 0,5,6,9,10,11,12,14 ), ! SCAN preserved registers
$SCAN_G1 = PUSHJ : ! no argument
GLOBAL( KEYWORD_INFO = 1 ) ! global "keyword indicator" register
LINKAGE_REGS( 15, 13, 0 ) ! ( stack, frame, return value )
PRESERVE( 0,2,3,4,5,6,7,8,9,10,11,12,14 ); ! Scan preserved registers
MACRO ! Define SCAN routine names
SCAN$ISCAN = %NAME( '.ISCAN' ) %, ! $SCAN_P1_T1234 linkage
SCAN$MNRET = %NAME( '.MNRET' ) %,
SCAN$NAME = %NAME( '.NAME' ) %, ! $SCAN_G178_T234 linkage
SCAN$OCTNC = %NAME( '.OCTNC' ) %, ! $SCAN_G78 linkage
SCAN$OSCAN = %NAME( '.OSCAN' ) %, ! $SCAN_P1_T1234 linkage
SCAN$SIXSC = %NAME( '.SIXSC' ) %, ! $SCAN_G78_T1 linkage
SCAN$SIXSW = %NAME( '.SIXSW' ) %, ! $SCAN_G78_T1 linkage
SCAN$SWASQ = %NAME( '.SWASQ' ) %,
SCAN$SWDEC = %NAME( '.SWDEC' ) %,
SCAN$SWFIL = %NAME( '.SWFIL' ) %,
SCAN$SWOCT = %NAME( '.SWOCT' ) %,
SCAN$TIAUC = %NAME( '.TIAUC' ) %, ! $SCAN_G78 linkage
SCAN$TISQT = %NAME( '.TISQT' ) %, ! $SCAN_G78 linkage
SCAN$TSCAN = %NAME( '.TSCAN' ) %, ! $SCAN_P1_T1234 linkage
! Define SCAN global symbols
SCAN$NMUL = %NAME( '.NMUL' ) %,
SCAN$NMUE = %NAME( '.NMUE' ) %,
SCAN$LASWD = %NAME( '.LASWD' ) %,
SCAN$QUOTE = %NAME( '.QUOTE' ) %,
SCAN$TFCHR = %NAME( '.TFCHR' ) %;
MACRO
$SCAN_ERROR( type ) =
BEGIN
%IF NOT %DECLARED( KEYWORD_INFO )
%THEN
GLOBAL REGISTER
KEYWORD_INFO = 1;
%FI
EXTERNAL ROUTINE
%NAME( 'E.', type ) : $SCAN_G1 NOVALUE;
%NAME( 'E.', type )();
END %;
LITERAL
! SCAN switch table flags:
SCAN$M_FS_NFS = 1^(17-0), ! this switch is never part of a file-spec
SCAN$M_FS_LRG = 1^(17-1), ! the max and default values are 0 or > 2**17
SCAN$M_FS_NUE = 1^(17-2), ! no user exit on this switch
SCAN$M_FS_VRQ = 1^(17-3), ! value required
SCAN$M_FS_OBV = 1^(17-4), ! OR bit values to right half
SCAN$M_FS_NOS = 1^(17-5), ! switch takes "NO" prefix (internal for $SCAN_SN macro only)
SCAN$M_FS_NCM = 1^(17-6), ! switch does not constitute a command
! SCAN ISCAN option flags:
SCAN$M_FS_ICL = 1^(17-17), ! ignore special command-line handling
! SCAN TSCAN option flags:
SCAN$M_FS_MOT = 1^(35-18), ! multiple output specs possible
SCAN$M_FS_MIO = 1^(35-19), ! mixed input and output specs
SCAN$M_0 = 0; ! Needed for ISCAN and TSCAN FLAGS=0
MACRO
SCAN$LH_RH( lh, rh ) =
%IF %LENGTH LSS 2
%THEN
lh
%ELSE
lh^18 + (rh AND %O'777777')
%FI %,
SCAN$IOWD( lh, rh ) =
%IF %LENGTH GEQ 2
%THEN
-lh^18 + (rh-1 AND %O'777777')
%ELSE
lh
%IF lh NEQ 0
%THEN
%WARN( 'Keyword value "', lh, '" is invalid' )
%FI
%FI %,
SCAN$LIST( list ) =
INITIAL( SCAN$LH_RH( %LENGTH, UPLIT( SCAN$PLIT( list, %REMAINING ) ) ) ) %,
SCAN$PLIT[ item ] =
SCAN$LH_RH( %REMOVE( item ) ) %,
SCAN$REQUIRED( name, value ) =
%IF %NULL( value )
%THEN
%WARN( name, '= parameter must be specified')
%FI %,
SCAN$SIX_SIX[ text ] =
%SIXBIT %EXACTSTRING( 6, %C' ', text ) %,
SCAN$FLAGS( flag_name ) [] =
%IF %COUNT NEQ 0
%THEN
OR
%FI
%NAME( 'SCAN$M_', flag_name )
SCAN$FLAGS( %REMAINING ) %;
KEYWORDMACRO
$ISCAN_LIST(
command_list=(0,0), ! length and address of monitor command list or 0
ccl_name=0, ! CCL name (6-bit) or 0 (no CCL mode)
ccl_offset=UPLIT(0), ! address of starting offset or 0
char_output=0, ! address of character typeout routine or 0
char_input=0, ! address of character input routine or 0
indirect_block=(0,0), ! length and address of indirect file block or 0
monitor_return=0, ! address of monitor return routine or 0
prompt=0, ! address of prompt routine or 0
flags=0 ! flags
) =
SCAN$LIST(
SCAN$IOWD( %REMOVE( command_list ) ), ! word 0
( ccl_offset, ccl_name ), ! word 1
( char_input, char_output ), ! word 2
indirect_block, ! word 3
( prompt, monitor_return ), ! word 4
( SCAN$FLAGS(%REMOVE(flags)), 0 ) ) %, ! word 5
$TSCAN_LIST(
switch_table, ! name of the switch table
help_string, ! address of help string
help_routine, ! address of help routine
clear_all=0, ! address of routine to clear all answers or 0
clear_file=0, ! address of routine to clear file answers or 0
input_area, ! address of routine to allocate input file area
output_area, ! address of routine to allocate output area
memorize_sticky=0, ! address of routine to memorize sticky defaults or 0
apply_sticky=0, ! address of routine to apply sticky defaults or 0
clear_sticky=0, ! address of routine to clear sticky defaults or 0
flags=0, ! SCAN control flags
store_values=0 ! address of routine to store switch values or 0
) =
SCAN$REQUIRED( %QUOTE SWITCH_TABLE, switch_table )
SCAN$REQUIRED( %QUOTE INPUT_AREA, input_area )
SCAN$REQUIRED( %QUOTE OUTPUT_AREA, output_area )
%IF NOT %NULL( help_string ) AND NOT %NULL( help_routine )
%THEN
%WARN(' HELP_STRING= and HELP_ROUTINE= parameters are mutually exclusive' )
%FI
SCAN$LIST(
%IF %IDENTICAL( switch_table, 0 )
%THEN
(0,0), (0,0), (0,0), ! words 0, 1 and 2
%ELSE
SCAN$IOWD( %NAME(switch_table,'_L'), ! word 0
%NAME(switch_table,'_N') ), !
( %NAME(switch_table,'_D'), ! word 1
%NAME(switch_table,'_M') ), !
( 0, %NAME(switch_table,'_P') ), ! word 2
%FI
%IF %NULL(help_string) AND %NULL(help_routine)
%THEN
(0,0), ! word 3
%ELSE
%IF NOT %NULL(help_string)
%THEN
( 1, help_string ), ! word 3
%ELSE
%IF help_routine EQL -1
%THEN
(-1,-1), ! word 3
%ELSE
( 2, help_routine ), ! word 3
%FI
%FI
%FI
( clear_all, clear_file ), ! word 4
( input_area, output_area ), ! word 5
( memorize_sticky, apply_sticky ), ! word 6
( clear_sticky, ! word 7
SCAN$FLAGS( %REMOVE( flags ) ) ), !
( 0, store_values ) ) %, ! word 8
$OSCAN_LIST(
switch_table, ! name of the switch table
help_string, ! address of help string
help_routine, ! address of help routine
option_name=(0,0) ! option name (6-bit) or 0 (program name) or
) =
! length and address of option names list or 0
SCAN$REQUIRED( %QUOTE SWITCH_TABLE, switch_table )
%IF NOT %NULL( help_string ) AND NOT %NULL( help_routine )
%THEN
%WARN(' HELP_STRING= and HELP_ROUTINE= parameters are mutually exclusive' )
%FI
SCAN$LIST(
SCAN$IOWD( %NAME(switch_table,'_L'), ! word 0
%NAME(switch_table,'_N') ), !
( %NAME(switch_table,'_D'), ! word 1
%NAME(switch_table,'_M') ), !
( 0, %NAME(switch_table,'_P') ), ! word 2
%IF %NULL(help_string) AND %NULL(help_routine)
%THEN
(0,0), ! word 3
%ELSE
%IF NOT %NULL(help_string)
%THEN
( 1, help_string ), ! word 3
%ELSE
%IF help_routine EQL -1
%THEN
(-1,-1), ! word 3
%ELSE
( 2, help_routine ), ! word 3
%FI
%FI
%FI
option_name ) %; ! word 4
MACRO
$SCAN_KEYS( switch_name ) =
SCAN$KEYS( switch_name, %REMOVE( %REMAINING ) ) %,
SCAN$KEYS( switch_name ) =
OWN
%NAME( switch_name, '_T' ) :
VECTOR[ %LENGTH-1 ]
INITIAL( SCAN$SIX_SIX( %REMAINING ) );
LITERAL
%NAME( switch_name, '_L' ) = %LENGTH-1; %,
$SCAN_TABLE( table_name ) =
LITERAL
%NAME( table_name, '_L' ) = %LENGTH-1;
OWN
%NAME( table_name, '_N' ) : VECTOR[ %LENGTH-1 ]
INITIAL( SCAN$TABLE( 1, %REMAINING ) ),
%NAME( table_name, '_P' ) : VECTOR[ %LENGTH-1 ]
INITIAL( SCAN$TABLE( 2, %REMAINING ) ),
%NAME( table_name, '_M' ) : VECTOR[ %LENGTH-1 ]
INITIAL( SCAN$TABLE( 3, %REMAINING ) ),
%NAME( table_name, '_D' ) : VECTOR[ %LENGTH-1 ]
INITIAL( SCAN$TABLE( 4, %REMAINING ) ); %,
SCAN$TABLE( table_number ) [ table_entry ] =
%NAME( 'SCAN$TABLE', table_number ) ( %REMOVE( table_entry ) ) %,
SCAN$TABLE1( switch_name, processor, result, default, max_value, flags ) =
SCAN$SIX_SIX( switch_name ) %,
SCAN$TABLE2( switch_name, processor, result, default, max_value, flags ) =
CH$PTR( result, 1, 36 ) %,
SCAN$TABLE3( switch_name, processor, result, default, max_value, flags ) =
SCAN$LH_RH( max_value, processor ) %,
SCAN$TABLE4( switch_name, processor, result, default, max_value, flags ) =
SCAN$LH_RH( ( SCAN$FLAGS( %REMOVE( flags ) ) ), default ) %;
KEYWORDMACRO
$SCAN_SP( switch, result, processor, flags ) =
( switch, processor, result,
%IF %DECLARED(%NAME('PD_',switch))
%THEN
%NAME('PD_',switch),
%ELSE
0,
%FI
%IF %DECLARED(%NAME('MX_',switch))
%THEN
%NAME('MX_',switch),
%ELSE
0,
%FI
flags ) %,
$SCAN_SS( switch, result, value, flags ) =
( switch, 0, result, value, 0, flags ) %,
$SCAN_SN( switch, result, flags ) =
( switch, 0, result, 0, 0, ( FS_NOS, %REMOVE( flags ) ) ) %;