Google
 

Trailing-Edge - PDP-10 Archives - bb-ee87b-sb - 10,7/dil/dixcst.bli
There are 21 other files named dixcst.bli in the archive. Click here to see a list.
%TITLE 'Library definitions for character conversion tables'

!  COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1983, 1985.
!  ALL RIGHTS RESERVED.
!  
!  THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED  AND
!  COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND 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.  NO TITLE TO AND OWNERSHIP OF  THE
!  SOFTWARE IS HEREBY TRANSFERRED.
!  
!  THE INFORMATION IN THIS SOFTWARE IS  SUBJECT  TO  CHANGE  WITHOUT
!  NOTICE  AND  SHOULD  NOT  BE CONSTRUED AS A COMMITMENT BY DIGITAL
!  EQUIPMENT CORPORATION.
!  
!  DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF
!  ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.

!++
! .chapter >DIXCST
! 
!   This file is the source for the library DIXCST.  This library
! defines the character conversion tables for all character sets known
! to the DIX string module.
! 
!   These are defined in a library so that an auxiliary program could be
! written which would search the library and print authoritative
! character conversion tables.  Also, putting the definitions in a
! library eliminates the necessity of compiling them every time the
! string module (DIXSTR) is compiled.
!--

LIBRARY 'DIXLIB';                       ! \.p;\ is used.
LIBRARY 'FIELDS';                       ! \.p;\ is used.

! ;   Library XPORT is used.

%BLISS32 (

LIBRARY 'SYS$LIBRARY:XPORT';

)
%BLISS36 (

LIBRARY 'BLI:XPORT';

)
%sbttl 'Edit History'                   ! [7] Add this entire subsection

!++
! .hl 1 Edit History
!
!   The edit history/version number information in this file is used
! to build a literal, dix$k_dixcst_version, giving the full version
! information.  Modules that use this library (in particular, the
! DIXSTR module) should make an OWN location called
! dix$g_dixcst_version and initialize it to dix$k_dixcst_version.
! This makes it possible to tell at debug time what version of the
! library was actually compiled against.
!--

LIBRARY 'VERSION';

! ; .autotable

!++ COPY 

new_version (1, 0)

edit (7, '23-Aug-82', 'David Dyer-Bennet')
 %( Change version and revision standards everywhere.
    Files: All. )%

Edit (%O'30', '19-Jan-83', 'David Dyer-Bennet')
%(  Update copyright notices, add mark at end of edit histories.
)%

Edit (%O'35', '10-Mar-83', 'Charlotte L. Richardson')
%( Declare version 1.  All modules.
)%

new_version (1, 1)

new_version (2, 0)

Edit (%O'36', '11-Apr-84', 'Sandy Clemens')
%( Put all Version 2 DIX development files under edit control.  Some of
   the files listed below have major code edits, or are new modules.  Others
   have relatively minor changes, such as cleaning up a comment.
   FILES: COMDIX.VAX-COM, COMPDX.CTL, DIXCST.BLI, DIXDEB.BLI,
   DIXDN.BLI (NEW), DIXFBN.BLI, DIXFP.BLI, DIXGBL.BLI, DIXGEN.BLI,
   DIXHST.BLI, DIXINT.PR1, DIXINT.PR2, DIXLIB.BLI, DIXPD.BLI (NEW),
   DIXREQ.REQ, DIXSTR.BLI, DIXUTL.BLI, DXCM10.10-CTL, MAKDIXMSG.BLI,
   STAR36.BLI, VERSION.REQ.
)%

Edit (%O'50', '8-Oct-84', 'Sandy Clemens')
  %( Add new format of COPYRIGHT notice.  FILES:  ALL )%

! **EDIT**
!-- .autoparagraph

LITERAL
    dix$k_dixcst_version = version_number
        (major = major_version,
        minor = minor_version,
        edit_no = edit_number);

UNDECLARE 
    major_version, minor_version, edit_number, sequence_check_edits;

%SBTTL 'Character Set Tables (CST)'

!++
! .hl 1 Character set tables (>CST>)
!
!   Each of these tables defines one character set and its translation to the
! String Intermediate (SI) form, and vs.
!
!   The structure prefix for character set tables is CST.
!
!   Each table entry contains the information to go from its index character
! (the character whose code is its index into the table) to the proper SI
! character, and from an SI character (used as an index) to the appropriate
! character of the character set defined.
!
!   The SI form is ASCII for the printing characters and formatting controls.
! The other positions are arbitrary.
!--

! ; .HL 2 BLISS definition of CST format
! ; .literal
!++ copy

$field

    cst_fields =
	SET
	cst$v_to_si_char = [$byte],		! Equiv SI char for this index
	cst$v_to_si_valid = [$bit],		! Set if conversion is "valid"
	cst$v_to_si_format_err = [$bit],	! Set if conversion doesn't 
                                                ! preserve formatting
	cst$v_to_si_noprint_err = [$bit],	! Set if conversion doesn't
                                                ! preserve nonprinting
	cst$v_to_si_graphic_err = [$bit],	! Set if conversion doesn't
                                                ! preserve graphic
    	cst$v_kludge = [$bit],			! Initialized to prevent overlap
	$align (WORD) blf$comma			! Force efficient alignment
	cst$v_to_typ_char = [$byte],    ! Equiv char set char for this index
	cst$v_to_typ_valid = [$bit],		! Set if conversion is "valid"
	cst$v_to_typ_format_err = [$bit],	! Set if conversion doesn't
                                                ! preserve formatting
	cst$v_to_typ_noprint_err = [$bit],	! Set if conversion doesn't 
                                                ! preserve non-printing
	cst$v_to_typ_graphic_err = [$bit]	! Set if conversion doesn't 
                                                ! preserve graphic
	TES;

LITERAL
    cst_size = $field_set_size,
    si$k_invalid = 26;                  ! ASCII SUB

!-- .end literal

!++
! .hl 1 Mechanism of definition
! 
!   The full details of the mechanism used in defining CST's are
! complicated.  This scheme was adopted because it is extremely
! powerful, and because the work of adding a new character set
! definition is very simple if approached in a cook-book fashion
! (recipes below).
! 
!   However, the price of this is that the mechanism is non-trivial.  If
! the mechanism itself breaks, you will need to understand it.
! Therefore a full explanation of it is included here.  Note, however,
! that if all you want to do is add a new character set, or change a few
! of the existing definitions, you don't need to know the full details.
! 
!   See the module that performs the actual string conversions (DIXSTR)
! for details of how the tables built here are used.
! 
!   Each character set is assigned a name.  This name must conform to
! the rules for BLISS names when appended to the end of a valid BLISS
! name.  Many of the macros used in defining character set tables take
! the character set name as a string literal as one of their arguments.
! It is a very important name.  Each string data type has, as one of its
! defining parameters, the name of the character set used to encode the
! data.  The association between the data types and the character sets
! is made solely in terms of the character set name.
! 
!   To define a character set, the following things must be done:
! .s 1.list 1
! .le;Select the character set name.
! .le;In file DIXCST, insert a definition of a macro DEF_CST_name, where
! "name" is the character set name selected.
! 
!   The body of the macro should consist of a series of calls to the
! macros LOC_DEF_TO_SI, LOC_DEF_TO_TYP, and DEF_SI_AND_TYP.  In all
! three cases the parameter list is the same -- see documentation on
! DEF_TO_SI or DEF_TO_TYP below.  LOC_DEF_TO_SI defines a conversion
! from the character set to SI.  LOC_DEF_TO_TYP defines a conversion
! from SI to the character set.  DEF_SI_AND_TYP does both.
! .le;After the definition of DEF_CST_name, place a call to COUNT_CST
! giving the name of the character set as the argument.
! .le;In file DIXSTR, place a call to BUILD_CST giving the character set
! name as the argument.  This expands to the actual conversion table.
! .end list
! 
!   In defining DEF_CST_name, be sure to include a conversion from SI
! >SI$K_INVALID>.  This is the SI code that will be presented if the
! source contains some invalid character. 
! 
!   The reason for the two "LOC" macros is as follows:  In the library
! pre-compilation of DIXCST, the DEF_CST_name macros are expanded once
! to find the maximum type and SI characters present in the table.  In
! the compilation of DIXSTR, the DEF_CST_name macros are expanded again
! to build the actual table initialization information.  These two
! different effects are obtained from expanding a single macro by
! establishing different defintions of the "LOC" macros in the two
! situations.  (DEF_SI_AND_TYP simply calls both "LOC" functions, so it
! needs no LOC definition).
!--


! ; .hl 2 Specific macros used

MACRO
    cst (table_size) =                  ! \.p;
    !
    ! ; Macro to define a CST of specified size.  Size should be MAX (max 
    ! ; type character, max SI character) + 1 .
    !
        BLOCKVECTOR [table_size, cst_size]   ! 
        FIELD (cst_fields)
    %,						! End CST definition
    cst_ref (addr, char_index, field_name) =    ! \.p;>
    !
    ! ; Make general structure reference to CST entry given necessary data.
    !
        BLOCKVECTOR [(addr), (char_index), field_name;  ! 
            1, cst_size]                ! Repetition count must be ctce, but is errelevant
    %,						! End cst_ref definition
    def_si_and_typ (char_index, si_index, format_err,   ! \.p;>
        print_err, graphic_err) =       ! \
    !
    ! ; This macro calls the local to-SI and to-TYP macros, one for each half
    ! ; of the 1-to-1 character conversion specified.
    !
        loc_def_to_si (char_index, si_index, format_err, print_err, graphic_err)
        loc_def_to_typ (char_index, si_index, format_err, print_err, graphic_err)
    %,						! End def_si_and_typ definition
    def_to_si (char_index, si_index, format_err,        ! \.p;>
        print_err, graphic_err) =       ! \
    !
    ! ; This macro generates preset-entries for the to-SI half of a character
    ! ; conversion.
    !
        [char_index, cst$v_to_si_char] = si_index,
        [char_index, cst$v_to_si_valid] = 1,
        [char_index, cst$v_to_si_format_err] = format_err,
        [char_index, cst$v_to_si_noprint_err] = print_err,
        [char_index, cst$v_to_si_graphic_err] = graphic_err,
    %,                                  ! End def_to_si definition
    def_to_typ (char_index, si_index, format_err,       ! \.p;>
        print_err, graphic_err) =       ! \
    !
    ! ; This macro generates preset-entries for the to-type half of a character
    ! ; conversion.
    !
        [si_index, cst$v_to_typ_char] = char_index,
        [si_index, cst$v_to_typ_valid] = 1,
        [si_index, cst$v_to_typ_format_err] = format_err,
        [si_index, cst$v_to_typ_noprint_err] = print_err,
        [si_index, cst$v_to_typ_graphic_err] = graphic_err,
    %,                                  ! End def_to_typ
    count_cst (char_set_name) =         ! \.p;>
    !
    ! ; This macro, when called with a valid character set name and a proper
    ! ; prior definition of DEF_CST_name, will define:
    ! ; .list 0, " "
    ! ; .le;CST$K_name_MAX          Max character code occurring in set
    ! ; .le;CST$K_name_SI_MAX       Max SI code assigned to character in set
    ! ; .end list
    !
        !
        ! First, go through that stack of data to determine maximum ASCII 
        ! and SI characters involved.
        !
        MACRO
            %QUOTE %QUOTE loc_def_to_si (typ_char, si_char, skp1, skp2, skp3) =
                %ASSIGN (si_max, MAX (si_max, si_char))
                %ASSIGN (typ_max, MAX (typ_max, typ_char)) 
            %QUOTE %,
            !
            ! Define to-typ to be same as to-si, since all we care about are
            ! the max values of some params, and they're in the same order
            ! for both.
            !
            %QUOTE %QUOTE loc_def_to_typ = loc_def_to_si
            %QUOTE %
        ;

        !
        ! Now, extract that information from the above table.
        !

        COMPILETIME
            si_max = 0,
            typ_max = 0;

        %NAME ('def_cst_', char_set_name)

        LITERAL
            %NAME ('cst$k_', char_set_name, '_max') = %NUMBER (typ_max),
            %NAME ('cst$k_', char_set_name, '_si_max') = %NUMBER (si_max);

        %PRINT (%NAME ('cst$k_', char_set_name, '_max'), '=',
            %NUMBER (%NAME ('cst$k_', char_set_name, '_max')))
        %PRINT (%NAME ('cst$k_', char_set_name, '_si_max'), '=', 
            %NUMBER (%NAME ('cst$k_', char_set_name, '_si_max')))

        UNDECLARE
            si_max,
            typ_max,
            %QUOTE %QUOTE loc_def_to_si,
            %QUOTE %QUOTE loc_def_to_typ;
    % ,					! End count_cst definition
    build_cst (char_set_name) =         ! \.p;>
    !++
    ! This macro, when called with a valid character set name and a proper
    ! prior definition of DEF_CST_name, CST$K_name_MAX, and CST$K_name_SI_MAX
    ! will define:
    ! .list  0, " "
    ! .le;DIX$ACST_name           CST for character set
    ! .end list
    !
    !   DEF_CST_name must be previously defined to call def_si_and_typ or 
    ! either of the local half-conversion macros passing
    ! character code, SI equivalent, and flags for format preservation
    ! error, non-printing preservation error, and graphic preservation error
    ! for each character in the character set.
    !--

        MACRO
            %QUOTE %QUOTE loc_def_to_si = %QUOTE %QUOTE def_to_si
                %QUOTE % ,
            %QUOTE %QUOTE loc_def_to_typ = %QUOTE %QUOTE def_to_typ
                %QUOTE % ;

        OWN                             ! ;   Place CST tables in OWN storage.
            %NAME ('dix$acst_', char_set_name) :
                cst (MAX (%NAME ('cst$k_', char_set_name, '_max'),
                    %NAME ('cst$k_', char_set_name, '_si_max')) + 1)
                                        ! Define character set table 
    		PSECT (readonly_psect)  ! \Assign to \.
                PRESET (                ! Begin PRESET
                %NAME ('def_cst_', char_set_name)
                [%NAME ('cst$k_', char_set_name, '_max'), cst$v_kludge] = 1 !
                                        ! Previous macro leaves trailing comma
                );                      ! End PRESET

        UNDECLARE                       ! Clean up our mess
            %QUOTE %QUOTE loc_def_to_si,
            %QUOTE %QUOTE loc_def_to_typ;

    %                                   ! End bld_cst definition
;                                       ! End MACRO statement
%SBTTL 'Define ASCII conversion table (dix$acst_ascii)'

!++
! .hl 1 Character set ASCII
!--

MACRO
    !
    ! Put all the ascii conversion information into a macro definition
    !
    def_cst_ascii =
        def_si_and_typ (  0,   0, 0, 0, 0)	! NUL
        def_si_and_typ (  1,   1, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  2,   2, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  3,   3, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  4,   4, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  5,   5, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  6,   6, 0, 0, 0)	! (arbitrary)
        def_si_and_typ (  7,   7, 0, 0, 0)	! BEL (ring bell)
        def_si_and_typ (  8,   8, 0, 0, 0)	! BS (backspace)
        def_si_and_typ (  9,   9, 0, 0, 0)	! HT (horizontal tab)
        def_si_and_typ ( 10,  10, 0, 0, 0)	! LF (line feed)
        def_si_and_typ ( 11,  11, 0, 0, 0)	! VT (vertical tab)
        def_si_and_typ ( 12,  12, 0, 0, 0)	! FF (form feed)
        def_si_and_typ ( 13,  13, 0, 0, 0)	! CR (carriage return)
        def_si_and_typ ( 14,  14, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 15,  15, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 16,  16, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 17,  17, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 18,  18, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 19,  19, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 20,  20, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 21,  21, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 22,  22, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 23,  23, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 24,  24, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 25,  25, 0, 0, 0)	! (arbitrary)
        loc_def_to_si ( 26, si$k_invalid, 0, 0, 0)      ! SUB (invalid character)
        loc_def_to_typ ( 92, si$k_invalid, 0, 0, 1)     ! Invalid converts to "\"
        def_si_and_typ ( 27,  27, 0, 0, 0)	! ESC (escape sequence start)
        def_si_and_typ ( 28,  28, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 29,  29, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 30,  30, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 31,  31, 0, 0, 0)	! (arbitrary)
        def_si_and_typ ( 32,  32, 0, 0, 0)	! Space
        def_si_and_typ ( 33,  33, 0, 0, 0)	! "!"
        def_si_and_typ ( 34,  34, 0, 0, 0)	! '"' (double quote)
        def_si_and_typ ( 35,  35, 0, 0, 0)	! "#"
        def_si_and_typ ( 36,  36, 0, 0, 0)	! "$"
        def_si_and_typ ( 37,  37, 0, 0, 0)	! "%"
        def_si_and_typ ( 38,  38, 0, 0, 0)	! "&"
        def_si_and_typ ( 39,  39, 0, 0, 0)	! "'" (single quote)
        def_si_and_typ ( 40,  40, 0, 0, 0)	! "("
        def_si_and_typ ( 41,  41, 0, 0, 0)	! ")"
        def_si_and_typ ( 42,  42, 0, 0, 0)	! "*"
        def_si_and_typ ( 43,  43, 0, 0, 0)	! "+"
        def_si_and_typ ( 44,  44, 0, 0, 0)	! "," (comma)
        def_si_and_typ ( 45,  45, 0, 0, 0)	! "-" (minus)
        def_si_and_typ ( 46,  46, 0, 0, 0)	! "." (period)
        def_si_and_typ ( 47,  47, 0, 0, 0)	! "/" (slash)
        def_si_and_typ ( 48,  48, 0, 0, 0)	! "0" (zero)
        def_si_and_typ ( 49,  49, 0, 0, 0)	! "1" (one)
        def_si_and_typ ( 50,  50, 0, 0, 0)	! "2"
        def_si_and_typ ( 51,  51, 0, 0, 0)	! "3"
        def_si_and_typ ( 52,  52, 0, 0, 0)	! "4"
        def_si_and_typ ( 53,  53, 0, 0, 0)	! "5"
        def_si_and_typ ( 54,  54, 0, 0, 0)	! "6"
        def_si_and_typ ( 55,  55, 0, 0, 0)	! "7"
        def_si_and_typ ( 56,  56, 0, 0, 0)	! "8"
        def_si_and_typ ( 57,  57, 0, 0, 0)	! "9"
        def_si_and_typ ( 58,  58, 0, 0, 0)	! ":" (colon)
        def_si_and_typ ( 59,  59, 0, 0, 0)	! ";" (semicolon)
        def_si_and_typ ( 60,  60, 0, 0, 0)	! "<" (less than)
        def_si_and_typ ( 61,  61, 0, 0, 0)	! "=" (equals)
        def_si_and_typ ( 62,  62, 0, 0, 0)	! ">" (greater than)
        def_si_and_typ ( 63,  63, 0, 0, 0)	! "?"
        def_si_and_typ ( 64,  64, 0, 0, 0)	! "@" (at sign)
        def_si_and_typ ( 65,  65, 0, 0, 0)	! "A" (capital A)
        def_si_and_typ ( 66,  66, 0, 0, 0)	! "B"
        def_si_and_typ ( 67,  67, 0, 0, 0)	! "C"
        def_si_and_typ ( 68,  68, 0, 0, 0)	! "D"
        def_si_and_typ ( 69,  69, 0, 0, 0)	! "E"
        def_si_and_typ ( 70,  70, 0, 0, 0)	! "F"
        def_si_and_typ ( 71,  71, 0, 0, 0)	! "G"
        def_si_and_typ ( 72,  72, 0, 0, 0)	! "H"
        def_si_and_typ ( 73,  73, 0, 0, 0)	! "I"
        def_si_and_typ ( 74,  74, 0, 0, 0)	! "J"
        def_si_and_typ ( 75,  75, 0, 0, 0)	! "K"
        def_si_and_typ ( 76,  76, 0, 0, 0)	! "L"
        def_si_and_typ ( 77,  77, 0, 0, 0)	! "M"
        def_si_and_typ ( 78,  78, 0, 0, 0)	! "N"
        def_si_and_typ ( 79,  79, 0, 0, 0)	! "O"
        def_si_and_typ ( 80,  80, 0, 0, 0)	! "P"
        def_si_and_typ ( 81,  81, 0, 0, 0)	! "Q"
        def_si_and_typ ( 82,  82, 0, 0, 0)	! "R"
        def_si_and_typ ( 83,  83, 0, 0, 0)	! "S"
        def_si_and_typ ( 84,  84, 0, 0, 0)	! "T"
        def_si_and_typ ( 85,  85, 0, 0, 0)	! "U"
        def_si_and_typ ( 86,  86, 0, 0, 0)	! "V"
        def_si_and_typ ( 87,  87, 0, 0, 0)	! "W"
        def_si_and_typ ( 88,  88, 0, 0, 0)	! "X"
        def_si_and_typ ( 89,  89, 0, 0, 0)	! "Y"
        def_si_and_typ ( 90,  90, 0, 0, 0)	! "Z"
        def_si_and_typ ( 91,  91, 0, 0, 0)	! "[" (left square bracket)
        def_si_and_typ ( 92,  92, 0, 0, 0)	! "\" (back slash)
        def_si_and_typ ( 93,  93, 0, 0, 0)	! "]" (right square bracket)
        def_si_and_typ ( 94,  94, 0, 0, 0)	! "^" (caret)
        def_si_and_typ ( 95,  95, 0, 0, 0)	! "_" (underscore)
        def_si_and_typ ( 96,  96, 0, 0, 0)	! "`" (accent grave)
        def_si_and_typ ( 97,  97, 0, 0, 0)	! "a" (lower case A)
        def_si_and_typ ( 98,  98, 0, 0, 0)	! "b"
        def_si_and_typ ( 99,  99, 0, 0, 0)	! "c"
        def_si_and_typ (100, 100, 0, 0, 0)	! "d"
        def_si_and_typ (101, 101, 0, 0, 0)	! "e"
        def_si_and_typ (102, 102, 0, 0, 0)	! "f"
        def_si_and_typ (103, 103, 0, 0, 0)	! "g"
        def_si_and_typ (104, 104, 0, 0, 0)	! "h"
        def_si_and_typ (105, 105, 0, 0, 0)	! "i"
        def_si_and_typ (106, 106, 0, 0, 0)	! "j"
        def_si_and_typ (107, 107, 0, 0, 0)	! "k"
        def_si_and_typ (108, 108, 0, 0, 0)	! "l"
        def_si_and_typ (109, 109, 0, 0, 0)	! "m"
        def_si_and_typ (110, 110, 0, 0, 0)	! "n"
        def_si_and_typ (111, 111, 0, 0, 0)	! "o"
        def_si_and_typ (112, 112, 0, 0, 0)	! "p"
        def_si_and_typ (113, 113, 0, 0, 0)	! "q"
        def_si_and_typ (114, 114, 0, 0, 0)	! "r"
        def_si_and_typ (115, 115, 0, 0, 0)	! "s"
        def_si_and_typ (116, 116, 0, 0, 0)	! "t"
        def_si_and_typ (117, 117, 0, 0, 0)	! "u"
        def_si_and_typ (118, 118, 0, 0, 0)	! "v"
        def_si_and_typ (119, 119, 0, 0, 0)	! "w"
        def_si_and_typ (120, 120, 0, 0, 0)	! "x"
        def_si_and_typ (121, 121, 0, 0, 0)	! "y"
        def_si_and_typ (122, 122, 0, 0, 0)	! "z"
        def_si_and_typ (123, 123, 0, 0, 0)	! "{" (left curly brace)
        def_si_and_typ (124, 124, 0, 0, 0)	! "|" (vertical bar)
        def_si_and_typ (125, 125, 0, 0, 0)	! "}" (right curly brace)
        def_si_and_typ (126, 126, 0, 0, 0)	! "~" (tilde)
        def_si_and_typ (127, 127, 0, 0, 0) 	! (arbitrary)
    %;
count_cst ('ascii')
%SBTTL 'Define SIXBIT conversion table (dix$acst_sixbit)'

!++
! .hl 1 Character set SIXBIT
!--

MACRO
    def_cst_sixbit =
        def_si_and_typ (0, 32, 0, 0, 0) ! Space
        def_si_and_typ (1, 33, 0, 0, 0) ! "!" (exclamation mark)
        def_si_and_typ (2, 34, 0, 0, 0) ! '"' (double quote)
        def_si_and_typ (3, 35, 0, 0, 0) ! "#" (commercial pould/hash/sharp)
        def_si_and_typ (4, 36, 0, 0, 0) ! "$" (dollar sign)
        def_si_and_typ (5, 37, 0, 0, 0) ! "%" (percent sign)
        def_si_and_typ (6, 38, 0, 0, 0) ! "&" (ampersand)
        def_si_and_typ (7, 39, 0, 0, 0) ! "'" (single quote/apostrophe)
        def_si_and_typ (8, 40, 0, 0, 0) ! "(" (left paren)
        def_si_and_typ (9, 41, 0, 0, 0) ! ")" (right paren)
        def_si_and_typ (10, 42, 0, 0, 0)        ! "*" (asterisk)
        def_si_and_typ (11, 43, 0, 0, 0)        ! "+" (plus)
        def_si_and_typ (12, 44, 0, 0, 0)        ! "," (comma)
        def_si_and_typ (13, 45, 0, 0, 0)        ! "-" (minus)
        def_si_and_typ (14, 46, 0, 0, 0)        ! "." (period)
        def_si_and_typ (15, 47, 0, 0, 0)        ! "/" (slash)
        def_si_and_typ (16, 48, 0, 0, 0)        ! "0" (digit zero)
        def_si_and_typ (17, 49, 0, 0, 0)        ! "1" (digit one)
        def_si_and_typ (18, 50, 0, 0, 0)        ! "2" (digit two)
        def_si_and_typ (19, 51, 0, 0, 0)        ! "3"
        def_si_and_typ (20, 52, 0, 0, 0)        ! "4"
        def_si_and_typ (21, 53, 0, 0, 0)        ! "5"
        def_si_and_typ (22, 54, 0, 0, 0)        ! "6"
        def_si_and_typ (23, 55, 0, 0, 0)        ! "7"
        def_si_and_typ (24, 56, 0, 0, 0)        ! "8"
        def_si_and_typ (25, 57, 0, 0, 0)        ! "9"
        def_si_and_typ (26, 58, 0, 0, 0)        ! ":" (colon)
        def_si_and_typ (27, 59, 0, 0, 0)        ! ";" (semi-colon)
        def_si_and_typ (28, 60, 0, 0, 0)        ! "<" (greater-than/left angle bracket)
        def_si_and_typ (29, 61, 0, 0, 0)        ! "=" (equals)
        def_si_and_typ (30, 62, 0, 0, 0)        ! ">" (less-than/right angle bracket)
        def_si_and_typ (31, 63, 0, 0, 0)        ! "?" (question mark)
        def_si_and_typ (32, 64, 0, 0, 0)        ! "@" (at sign)
        def_si_and_typ (33, 65, 0, 0, 0)        ! "A" (capital A)
        def_si_and_typ (34, 66, 0, 0, 0)        ! "B"
        def_si_and_typ (35, 67, 0, 0, 0)        ! "C"
        def_si_and_typ (36, 68, 0, 0, 0)        ! "D"
        def_si_and_typ (37, 69, 0, 0, 0)        ! "E"
        def_si_and_typ (38, 70, 0, 0, 0)        ! "F"
        def_si_and_typ (39, 71, 0, 0, 0)        ! "G"
        def_si_and_typ (40, 72, 0, 0, 0)        ! "H"
        def_si_and_typ (41, 73, 0, 0, 0)        ! "I"
        def_si_and_typ (42, 74, 0, 0, 0)        ! "J"
        def_si_and_typ (43, 75, 0, 0, 0)        ! "K"
        def_si_and_typ (44, 76, 0, 0, 0)        ! "L"
        def_si_and_typ (45, 77, 0, 0, 0)        ! "M"
        def_si_and_typ (46, 78, 0, 0, 0)        ! "N"
        def_si_and_typ (47, 79, 0, 0, 0)        ! "O" (capital letter O)
        def_si_and_typ (48, 80, 0, 0, 0)        ! "P"
        def_si_and_typ (49, 81, 0, 0, 0)        ! "Q"
        def_si_and_typ (50, 82, 0, 0, 0)        ! "R"
        def_si_and_typ (51, 83, 0, 0, 0)        ! "S"
        def_si_and_typ (52, 84, 0, 0, 0)        ! "T"
        def_si_and_typ (53, 85, 0, 0, 0)        ! "U"
        def_si_and_typ (54, 86, 0, 0, 0)        ! "V"
        def_si_and_typ (55, 87, 0, 0, 0)        ! "W"
        def_si_and_typ (56, 88, 0, 0, 0)        ! "X"
        def_si_and_typ (57, 89, 0, 0, 0)        ! "Y"
        def_si_and_typ (58, 90, 0, 0, 0)        ! "Z"
        def_si_and_typ (59, 91, 0, 0, 0)        ! "[" (left square bracket)
        def_si_and_typ (60, 92, 0, 0, 0)        ! "\" (backslash)
        def_si_and_typ (61, 93, 0, 0, 0)        ! "]" (right square bracket)
        def_si_and_typ (62, 94, 0, 0, 0)        ! "^" (caret/uparrow)
        def_si_and_typ (63, 95, 0, 0, 0)        ! "_" (underscore)
        loc_def_to_typ (33, 97, 0, 0, 0)        ! lc to UC => A
        loc_def_to_typ (34, 98, 0, 0, 0)        ! lc to UC => B
        loc_def_to_typ (35, 99, 0, 0, 0)        ! lc to UC => C
        loc_def_to_typ (36, 100, 0, 0, 0)       ! lc to UC => D
        loc_def_to_typ (37, 101, 0, 0, 0)       ! lc to UC => E
        loc_def_to_typ (38, 102, 0, 0, 0)       ! lc to UC => F
        loc_def_to_typ (39, 103, 0, 0, 0)       ! lc to UC => G
        loc_def_to_typ (40, 104, 0, 0, 0)       ! lc to UC => H
        loc_def_to_typ (41, 105, 0, 0, 0)       ! lc to UC => I
        loc_def_to_typ (42, 106, 0, 0, 0)       ! lc to UC => J
        loc_def_to_typ (43, 107, 0, 0, 0)       ! lc to UC => K
        loc_def_to_typ (44, 108, 0, 0, 0)       ! lc to UC => L
        loc_def_to_typ (45, 109, 0, 0, 0)       ! lc to UC => M
        loc_def_to_typ (46, 110, 0, 0, 0)       ! lc to UC => N
        loc_def_to_typ (47, 111, 0, 0, 0)       ! lc to UC => O
        loc_def_to_typ (48, 112, 0, 0, 0)       ! lc to UC => P
        loc_def_to_typ (49, 113, 0, 0, 0)       ! lc to UC => Q
        loc_def_to_typ (50, 114, 0, 0, 0)       ! lc to UC => R
        loc_def_to_typ (51, 115, 0, 0, 0)       ! lc to UC => S
        loc_def_to_typ (52, 116, 0, 0, 0)       ! lc to UC => T
        loc_def_to_typ (53, 117, 0, 0, 0)       ! lc to UC => U
        loc_def_to_typ (54, 118, 0, 0, 0)       ! lc to UC => V
        loc_def_to_typ (55, 119, 0, 0, 0)       ! lc to UC => W
        loc_def_to_typ (56, 120, 0, 0, 0)       ! lc to UC => X
        loc_def_to_typ (57, 121, 0, 0, 0)       ! lc to UC => Y
        loc_def_to_typ (58, 122, 0, 0, 0)       ! lc to UC => Z
        loc_def_to_typ (60, si$k_invalid, 0, 0, 1) ! SI invalid prints as "\"
        loc_def_to_typ (59, 123, 0, 0, 1)       ! SI "{" becomes "["
        loc_def_to_typ (61, 125, 0, 0, 1)       ! SI "}" becomes "]"
    %;
count_cst ('sixbit')
%SBTTL 'Define EBCDIC conversion table (dix$acst_ebcdic)'

!++
! .HL 1 Character set EBCDIC
!   This is based on EBCDIC, not IBM multinational.  The definitions come from
! the DEC multinational standard, and the existing DEC-20 COBOL conversions.
!--

MACRO
    def_cst_ebcdic =
        def_si_and_typ (%X'05', %X'09', 0, 0, 0)        ! Horizontal Tab
        def_si_and_typ (%X'0B', %X'0B', 0, 0, 0)        ! Vertical Tab
        def_si_and_typ (%X'0C', %X'0C', 0, 0, 0)        ! Form Feed
        def_si_and_typ (%X'15', %X'0D', 0, 0, 0)        ! Carriage return/new line
    	def_si_and_typ (%X'16', %X'08', 0, 0, 0)	! Back space
        def_si_and_typ (%X'25', %X'0A', 0, 0, 0)        ! Line feed
        def_si_and_typ (%X'27', %X'16', 0, 0, 0)        ! Escape
        def_si_and_typ (%X'2F', %X'07', 0, 0, 0)        ! Bell
        def_si_and_typ (%X'40', %X'20', 0, 0, 0)        ! Space
        def_si_and_typ (%X'4B', %X'2E', 0, 0, 0)        ! period/decimal point
        def_si_and_typ (%X'4C', %X'3C', 0, 0, 0)        ! Less than
        def_si_and_typ (%X'4D', %X'28', 0, 0, 0)        ! Open paren
        def_si_and_typ (%X'4E', %X'2B', 0, 0, 0)        ! Plus
        loc_def_to_si (%X'4F', %X'7C', 0, 0, 1)         ! Short vertical bar -> vertical bar
        def_si_and_typ (%X'50', %X'26', 0, 0, 0)        ! Ampersand
        def_si_and_typ (%X'5A', %X'21', 0, 0, 0)        ! Exclamation point
        def_si_and_typ (%X'5B', %X'24', 0, 0, 0)        ! Dollar sign
        def_si_and_typ (%X'5C', %X'2A', 0, 0, 0)        ! Asterisk
        def_si_and_typ (%X'5D', %X'29', 0, 0, 0)        ! Close paren
        def_si_and_typ (%X'5E', %X'3B', 0, 0, 0)        ! Semicolon
        def_si_and_typ (%X'60', %X'2D', 0, 0, 0)        ! hyphen/minus
        def_si_and_typ (%X'61', %X'2F', 0, 0, 0)        ! slash/slant/solidus
        def_si_and_typ (%X'6A', %X'7C', 0, 0, 0)        ! vertical line
        def_si_and_typ (%X'6B', %X'2C', 0, 0, 0)        ! Comma
        def_si_and_typ (%X'6C', %X'25', 0, 0, 0)        ! Percent sign
        def_si_and_typ (%X'6D', %X'5F', 0, 0, 0)        ! Underline
        def_si_and_typ (%X'6E', %X'3E', 0, 0, 0)        ! Greater than
        def_si_and_typ (%X'6F', %X'3F', 0, 0, 0)        ! Question mark
        def_si_and_typ (%X'79', %X'60', 0, 0, 0)        ! opening single quote
        def_si_and_typ (%X'7A', %X'3A', 0, 0, 0)        ! Colon
        def_si_and_typ (%X'7B', %X'23', 0, 0, 0)        ! Number/pound sign
        def_si_and_typ (%X'7C', %X'40', 0, 0, 0)        ! Commercial at
        def_si_and_typ (%X'7D', %X'27', 0, 0, 0)        ! Apostrophe
        def_si_and_typ (%X'7E', %X'3D', 0, 0, 0)        ! Equals
        def_si_and_typ (%X'7F', %X'22', 0, 0, 0)        ! Double quotes
        def_si_and_typ (%X'81', %X'61', 0, 0, 0)        ! small a
        def_si_and_typ (%X'82', %X'62', 0, 0, 0)        ! small b
        def_si_and_typ (%X'83', %X'63', 0, 0, 0)        ! small c
        def_si_and_typ (%X'84', %X'64', 0, 0, 0)        ! small d
        def_si_and_typ (%X'85', %X'65', 0, 0, 0)        ! small e
        def_si_and_typ (%X'86', %X'66', 0, 0, 0)        ! small f
        def_si_and_typ (%X'87', %X'67', 0, 0, 0)        ! small g
        def_si_and_typ (%X'88', %X'68', 0, 0, 0)        ! small h
        def_si_and_typ (%X'89', %X'69', 0, 0, 0)        ! small i
        def_si_and_typ (%X'91', %X'6A', 0, 0, 0)        ! small j
        def_si_and_typ (%X'92', %X'6B', 0, 0, 0)        ! small k
        def_si_and_typ (%X'93', %X'6C', 0, 0, 0)        ! small l
        def_si_and_typ (%X'94', %X'6D', 0, 0, 0)        ! small m
        def_si_and_typ (%X'95', %X'6E', 0, 0, 0)        ! small n
        def_si_and_typ (%X'96', %X'6F', 0, 0, 0)        ! small o
        def_si_and_typ (%X'97', %X'70', 0, 0, 0)        ! small p
        def_si_and_typ (%X'98', %X'71', 0, 0, 0)        ! small q
        def_si_and_typ (%X'99', %X'72', 0, 0, 0)        ! small r
        def_si_and_typ (%X'A1', %X'7E', 0, 0, 0)        ! tilde
        def_si_and_typ (%X'A2', %X'73', 0, 0, 0)        ! small s
        def_si_and_typ (%X'A3', %X'74', 0, 0, 0)        ! small t
        def_si_and_typ (%X'A4', %X'75', 0, 0, 0)        ! small u
        def_si_and_typ (%X'A5', %X'76', 0, 0, 0)        ! small v
        def_si_and_typ (%X'A6', %X'77', 0, 0, 0)        ! small w
        def_si_and_typ (%X'A7', %X'78', 0, 0, 0)        ! small x
        def_si_and_typ (%X'A8', %X'79', 0, 0, 0)        ! small y
        def_si_and_typ (%X'A9', %X'7A', 0, 0, 0)        ! small z
    	def_si_and_typ (%X'AD', %X'5B', 0, 0, 0)	! left square bracket
    	def_si_and_typ (%X'BD', %X'5D', 0, 0, 0)	! right square bracket
        def_si_and_typ (%X'C0', %X'7B', 0, 0, 0)        ! opening brace
        def_si_and_typ (%X'C1', %X'41', 0, 0, 0)        ! "A"
        def_si_and_typ (%X'C2', %X'42', 0, 0, 0)        ! "B"
        def_si_and_typ (%X'C3', %X'43', 0, 0, 0)        ! "C"
        def_si_and_typ (%X'C4', %X'44', 0, 0, 0)        ! "D"
        def_si_and_typ (%X'C5', %X'45', 0, 0, 0)        ! "E"
        def_si_and_typ (%X'C6', %X'46', 0, 0, 0)        ! "F"
        def_si_and_typ (%X'C7', %X'47', 0, 0, 0)        ! "G"
        def_si_and_typ (%X'C8', %X'48', 0, 0, 0)        ! "H"
        def_si_and_typ (%X'C9', %X'49', 0, 0, 0)        ! "I"
        def_si_and_typ (%X'D0', %X'7D', 0, 0, 0)        ! closing brace
        def_si_and_typ (%X'D1', %X'4A', 0, 0, 0)        ! "J"
        def_si_and_typ (%X'D2', %X'4B', 0, 0, 0)        ! "K"
        def_si_and_typ (%X'D3', %X'4C', 0, 0, 0)        ! "L"
        def_si_and_typ (%X'D4', %X'4D', 0, 0, 0)        ! "M"
        def_si_and_typ (%X'D5', %X'4E', 0, 0, 0)        ! "N"
        def_si_and_typ (%X'D6', %X'4F', 0, 0, 0)        ! "O"
        def_si_and_typ (%X'D7', %X'50', 0, 0, 0)        ! "P"
        def_si_and_typ (%X'D8', %X'51', 0, 0, 0)        ! "Q"
        def_si_and_typ (%X'D9', %X'52', 0, 0, 0)        ! "R"
        def_si_and_typ (%X'E0', %X'5C', 0, 0, 0)        ! Back slash
        def_si_and_typ (%X'E2', %X'53', 0, 0, 0)        ! "S"
        def_si_and_typ (%X'E3', %X'54', 0, 0, 0)        ! "T"
        def_si_and_typ (%X'E4', %X'55', 0, 0, 0)        ! "U"
        def_si_and_typ (%X'E5', %X'56', 0, 0, 0)        ! "V"
        def_si_and_typ (%X'E6', %X'57', 0, 0, 0)        ! "W"
        def_si_and_typ (%X'E7', %X'58', 0, 0, 0)        ! "X"
        def_si_and_typ (%X'E8', %X'59', 0, 0, 0)        ! "Y"
        def_si_and_typ (%X'E9', %X'5A', 0, 0, 0)        ! "Z"
        def_si_and_typ (%X'F0', %X'30', 0, 0, 0)        ! Digit 0
        def_si_and_typ (%X'F1', %X'31', 0, 0, 0)        ! Digit 1
        def_si_and_typ (%X'F2', %X'32', 0, 0, 0)        ! Digit 2
        def_si_and_typ (%X'F3', %X'33', 0, 0, 0)        ! Digit 3
        def_si_and_typ (%X'F4', %X'34', 0, 0, 0)        ! Digit 4
        def_si_and_typ (%X'F5', %X'35', 0, 0, 0)        ! Digit 5
        def_si_and_typ (%X'F6', %X'36', 0, 0, 0)        ! Digit 6
        def_si_and_typ (%X'F7', %X'37', 0, 0, 0)        ! Digit 7
        def_si_and_typ (%X'F8', %X'38', 0, 0, 0)        ! Digit 8
        def_si_and_typ (%X'F9', %X'39', 0, 0, 0)        ! Digit 9
    	loc_def_to_typ (%X'E0', si$k_invalid, 0, 0, 0)	! for invalid
    % ;                                 ! end def_cst_ebcdic
count_cst ('ebcdic')
%sbttl 'Cleanup'

!++
! .hl 1 Cleanup
! 
!   XPORT isn't housebroken yet, so it is necessary to trash this
! definition:
!--

UNDECLARE
    %QUOTE $descriptor;			! \\