%SBTTL 'DUMPER Symbol definitions'
!++
! FACILITY:
!
!   DUMPER-32
!
! ABSTRACT:
!
!   This module contains the various symbol and macro definitions for
!   DUMPER-32.
!
! AUTHORS:
!
!   Robert C. McQueen
!
! CREATION DATE: 15-April-1985
!
! MODIFICATION HISTORY:
!--

!
! MACROS:
!
!
! Single entry vectors (useful for REF's to longwords, etc.)
!
MACRO
    $BYTE =
	VECTOR [1, BYTE] %,
    $WORD =
	VECTOR [1, WORD] %,
    $LONGWORD =
	VECTOR [1, LONG] %;

!
! Descriptor
!
MACRO
    $DESCRIPTOR_DECL =
	$BBLOCK [DSC$K_S_BLN] %;

KEYWORDMACRO
     $DESCRIPTOR_INIT (DESCRIPTOR, BUFFER, SIZE) =
	 BEGIN
	 DESCRIPTOR [DSC$B_CLASS] = DSC$K_CLASS_S;
	 DESCRIPTOR [DSC$B_DTYPE] = DSC$K_DTYPE_T;
	 DESCRIPTOR [DSC$W_LENGTH] = SIZE;
	 DESCRIPTOR [DSC$A_POINTER] = BUFFER
	 END %;
!
! IOSB block definitions
!
LITERAL
    $IOSB_LENGTH = 2;		    ! Number of long words in an IOSB

MACRO
    $IOSB_DECL =
	BLOCK[2 , LONG]
	FIELD($IOSB_FIELDS) %;

FIELD $IOSB_FIELDS =
    SET
    IOSB_START = [0, 0, 0, 0],
    IOSB_STATUS = [0, 0, 16, 0 ],
    IOSB_COUNT = [0, 16, 16, 0 ],
    IOSB_DEVDEPEND = [1, 0, 32, 0 ]
    TES;

! [~macro_or_keywordmacro_declaration~]...

!
! EQUATED SYMBOLS:
!
!
! Basic symbols
!
LITERAL
    TRUE = 0 EQL 0,		    ! Value of TRUE
    FALSE = 0 NEQ 0;		    ! Value of FALSE
!
! Symbols for the various qualifiers which take keyword values.
!
!
! Tape format
!
LITERAL
    FORMAT$K_MIN = 1,			! Minimum format value
    FORMAT$K_BACKUP = 1,	        ! Tape is non-interchange BACKUP
    FORMAT$K_DUMPER = 2,		! Tape is DUMPER format
    FORMAT$K_INTERCHANGE = 3,	        ! Tape is interchange (either)
    FORMAT$K_INTERCHANGE_BACKUP = 4,	! Tape is interchange written by BACKUP
    FORMAT$K_INTERCHANGE_DUMPER = 5,	! Tape is interchange written by DUMPER
    FORMAT$K_MAX = 5;			! Maximum format value
!
! Logging type
!
LITERAL
    LOG$K_FILES = 1,			    ! Type files info
    LOG$K_DIRECTORIES = 2,		    ! Type directory info
    LOG$K_ALL = 3;			    ! Log all info
!
! Interface symbols for determining what EXTRACT_FIELDS returns in the RESULT
! BLOCK vector.
!
LITERAL
    FLD$K_DEVICE = 0,		    ! Offset to device name
    FLD$K_DIRECT = 1,		    ! Offset to directory name
    FLD$K_NAME = 2,			    ! Offset to file name
    FLD$K_EXT = 3,			    ! Offset to file extension
    FLD$K_VERSION = 4,		    ! Offset to file version (generation)
    FLD$K_LENGTH = 5;		    ! Length of field block

!
! Symbols to set the type of file to be written
!
LITERAL
    FILE_TYPE_MINIMUM = 0,		    ! First
    FILE_TYPE_7BIT_CHARACTERS = 0,	    ! 7bit -> 8bit characters
    FILE_TYPE_8BIT_DATA = 1,		    ! 8bit data
    FILE_TYPE_36BIT_DATA = 2,		    ! 4 7bit data items into 8bits
					    !  1 8 bit data item
    FILE_TYPE_NON_STANDARD = 3,		    ! None of the above
    FILE_TYPE_MAXIMUM = 3;		    ! Last
!
! Fields for dispatch vector for BACKUP/DUMPER specific routines
!
FIELD ROUTINE_DISPATCH =
    SET
    READ_RECORD = [0],		    ! Read record and perform basic record decoding
    CHECK_SAVE_SET = [1],	    ! Check if save set record and check
				    !  if correct save set
    PROCESS_FILE = [2],		    ! Process file header record
    PROCESS_DATA = [3],		    ! Process data record
    SKIP_SAVE_SET = [4],	    ! Skip a save set
    LIST_RECORD = [5],		    ! List a record
    BLOCK_SIZE =   [6]		    ! Size of data records from tape
    TES;
!
! Blocking/direction flag values for READ_RECORD routines
!
LITERAL
    FORWARD_BLOCK = +1,		! Forward a block
    FORWARD_RECORD = 0,		! Forward a record
    BACKWARD_BLOCK = -1;	! Backwards a block


%SBTTL	'36 bit data description'
!
! The following is the 36 bit data descriptions.  This description includes
! what the frames on the magnetic tape look like from a DECSYSTEM-20 or
! DECsystem-10.
!
!   Frame #0 - Contains bits 0 to 7
!   Frame #1 - Contains bits 8 to 15
!   Frame #2 - Contains bits 16 to 23
!   Frame #3 - Contains bits 24 to 31
!   Frame #4 - Contains bits 32 to 35 in the low order part of the byte
!
!
!
! The following defines what a word is in VAX terms
!
FIELD DEC_36_BIT_WORD_FIELD =
    SET
    FRAME_ALL = [0, 0, 0, 0],		! For use in address expresions
    FRAME_0 = [0, 0, 8, 0],		! DEC-10 bits 0-7
    FRAME_1 = [1, 0, 8, 0],		! DEC-10 bits 8-15
    FRAME_2 = [2, 0, 8, 0],		! DEC-10 bits 16-23
    FRAME_3 = [3, 0, 8, 0],		! DEC-10 bits 23-31
    FRAME_4 = [4, 0, 4, 0]		! DEC-10 bits 32-35
    TES;

MACRO
    VAX_SIXBIT_CHARACTER_DECL =
	BLOCK[1, BYTE] FIELD(VAX_SIXBIT_CHAR_FIELDS) %;
!
! Fields for storing the sixbit characters into a byte
! NOTE:  Must add the 40(octal) on after the character is built into the
!	 BYTE.
!
FIELD VAX_SIXBIT_CHAR_FIELDS =
    SET
    VAX_SIXBIT_CHAR_0 = [0, 0, 8, 0],
    VAX_SIXBIT_CHAR_1_H = [0, 4, 2, 0],
    VAX_SIXBIT_CHAR_1_L = [0, 0, 4, 0],
    VAX_SIXBIT_CHAR_2_H = [0, 2, 4, 0],
    VAX_SIXBIT_CHAR_2_L = [0, 0, 2, 0],
    VAX_SIXBIT_CHAR_3 = [0, 0, 8, 0],
    VAX_SIXBIT_CHAR_4 = [0, 0, 8, 0],
    VAX_SIXBIT_CHAR_5_H = [0, 4, 2, 0],
    VAX_SIXBIT_CHAR_5_L = [0, 0, 4, 0]
    TES;
!
! Fields for fetching the sixbit information from the 36bit word
!
FIELD DEC_36_BIT_SIXBIT_CHAR_FIELDS =
    SET
    SIXBIT_CHAR_0 = [0, 2, 6, 0 ],
    SIXBIT_CHAR_1_H = [0, 0, 2, 0 ],
    SIXBIT_CHAR_1_L = [1, 4, 4, 0 ],
    SIXBIT_CHAR_2_H = [1, 0, 4, 0 ],
    SIXBIT_CHAR_2_L = [2, 6, 2, 0 ],
    SIXBIT_CHAR_3 = [2, 0, 6, 0 ],
    SIXBIT_CHAR_4 = [3, 2, 6, 0 ],
    SIXBIT_CHAR_5_H = [3, 0, 2, 0 ],
    SIXBIT_CHAR_5_L = [4, 0, 4, 0 ]
    TES;

!
! The following are the fields that are used to build a VAX character from
! the -10/20 7bit character fields
!

MACRO
    VAX_7BIT_CHARACTER_DECL =
	BLOCK[1 , BYTE] FIELD(VAX_7BIT_CHAR_FIELDS)%;

FIELD VAX_7BIT_CHAR_FIELDS =
    SET
    VAX_CHAR_0   = [0, 0, 8, 0],
    VAX_CHAR_1_H = [0, 6, 2, 0],
    VAX_CHAR_1_L = [0, 0, 6, 0],
    VAX_CHAR_2_H = [0, 5, 3, 0],
    VAX_CHAR_2_L = [0, 0, 5, 0],
    VAX_CHAR_3_H = [0, 4, 4, 0],
    VAX_CHAR_3_L = [0, 0, 4, 0],
    VAX_CHAR_4_H = [0, 3, 5, 0],
    VAX_CHAR_4_L = [0, 0, 3, 0],
    VAX_LSN_BIT =  [0, 7, 1, 0]
    TES;
!
! The following define the -10/20 7-bit character fields as they are seen in the
! frames from the tape.
!
FIELD DEC_36_BIT_7BIT_CHAR_FIELDS =
    SET
    CHAR_0   = [0, 1, 7, 0],
    CHAR_1_H = [0, 0, 1, 0],
    CHAR_1_L = [1, 2, 6, 0],
    CHAR_2_H = [1, 0, 2, 0],
    CHAR_2_L = [2, 3, 5, 0],
    CHAR_3_H = [2, 0, 3, 0],
    CHAR_3_L = [3, 4, 4, 0],
    CHAR_4_H = [3, 0, 4, 0],
    CHAR_4_L = [4, 1, 3, 0],
    LSN_BIT = [4, 0, 1, 0]
    TES;

LITERAL
    DEC_36_BIT_WORD_SIZE = 5;

MACRO
    DEC_36_BIT_WORD =
	BLOCK[DEC_36_BIT_WORD_SIZE, BYTE]
	FIELD(DEC_36_BIT_WORD_FIELD, DEC_36_BIT_7BIT_CHAR_FIELDS,
	    DEC_36_BIT_SIXBIT_CHAR_FIELDS)%;

MACRO
    DEC_36_BIT_RECORD =
	BLOCKVECTOR[, DEC_36_BIT_WORD_SIZE, BYTE]
	FIELD(DEC_36_BIT_WORD_FIELD, DEC_36_BIT_7BIT_CHAR_FIELDS,
	    DEC_36_BIT_SIXBIT_CHAR_FIELDS)%;


!
! The following describe the information about a byte pointer.
!
LITERAL
    BPT_POSITION_SIZE = 6,	    ! Position field is 6 bits
    BPT_POSITION_POS = 0,	    ! From bit 0
    BPT_SIZE_SIZE = 6,		    ! Size field is 6 bits
    BPT_SIZE_POS  = 6,		    ! From bit 6
    BPT_ZERO_SIZE = 6,		    ! Information that should be zero
    BPT_ZERO_POS  = 12,		    ! Starts at bit 12
    BPT_ADDRESS_SIZE = 18,	    ! Address field is 18 bits
    BPT_ADDRESS_POS = 18;	    ! Starting at bit 18
