* 4/14/72 -- 10:00 (7F)
* MODULE NAME: CNVRT
* NUMBER: 35
* PURPOSE: CONVERT VARIABLES TO AND FROM EBCDIC CODE FOR I/O
*        AND FIND EBCDIC LINE NUMBERS
*
* ENTRY POINTS:
*
         DEF      S35CNVRT          CONVERT INTEGERS TO EBCDIC FORMAT
         DEF      S35LINE           CONVERT LINE NUMBERS TO EBCDIC
         DEF      S35HEXC           CONVERT HEX STRING TO BINARY
*
*
         SYSTEM   TEXTDEF
*
*
         DEF      35P,35D
*
35P      EQU      %
         DATA     X'35'             MODULE NUMBER
         DATA     X'041472'         DATE
         DATA     X'1000'           TIME
*
*
         TITLE    '** CNVRT(35) **'
*
* S35CNVRT -- CONVERT INTEGERS TO EBCDIC FOR OUTPUT
*
* ENTRY PARAMETER: AC1 = INTEGER (0-9999)
*
* EXIT PARAMETER: AC2 = FOUR CHAR EBCDIC FORM R-J WITH LEADING BLANKS
*
*
S35CNVRT EQU      %
         SAVRTN
*
         STW,AC1  CNVRTWD           SAVE ORIGINAL NUMBER
         LW,AC2   L('    ')
         STW,AC2  ANSWR             INITIALIZE ANSWER
         LI,DX1   1000              INITIALIZE FIRST DIVIDE WORD
         LI,X4    0                 INITIALIZE ANSWER POINTER
         STW,X4   DIGFLG            INITIALIZE SIGNIFICANT DIGIT FLAG
*
CNVLP1   EQU      %
         SLD,AC1  -32               SHIFT FOR DIVIDE
         DW,AC1   DX1               DIVIDE--QUOTIENT IN AC2,REM IN AC1
         BEZ      NXTDIV            QUOTIENT ZERO, NO STORE
         MTW,1    DIGFLG            SET SIGNIFICANT DIGIT FLAG
         AI,AC2   '0'               SET EBCDIC ZONE
         STB,AC2  ANSWR,X4          STORE ANSWER
         B        INCRPTR           GO INCREMENT ANSWER POINTER
*
*
         PAGE
*
*
NXTDIV   EQU      %
         MTW,0    DIGFLG            TEST SIGNIFICANT DIGIT FLAG
         BEZ      INCRPTR              NOT SET, GO INCR POINTER
         LI,AC2   '0'                  SET, STORE ZERO
         STB,AC2  ANSWR,X4
*
INCRPTR  EQU      %
         AI,X4    1                 INCREMENT ANSWER POINTER
         DW,DX1   L(10)             GET NEW DIVIDE WORD
         BGZ      CNVLP1            IF NON-ZERO, REPEAT
*
         LD,AC1   CNVRTWD           RESTORE AC1 AND GET ANSWER IN AC2
         RETURN
*
*
         PAGE
*
* S35LINE -- CONVERT LINE NUMBERS TO EBCDIC FORM
*
* ENTRY PARAMETER: AC2 = KEY (0-9999.999)
*
* EXIT PARAMETERS:
*        AC1,AC2 = EBCDIC KEY WITH DECIMAL PT IN FIRST OF AC2
*
S35LINE  EQU      %
         SAVRTN
         LI,AC1   0
         STB,AC1  AC2               SET BYTE 0 TO ZERO (KEY COUNT)
*
         DW,AC1   L(1000)           DIVIDE BY KEY INCREMENT
         LCI      2                    FRACTION IN AC1
         STM,AC1  FLN                  WHOLE LINE IN AC2
*
         BAL,SRTN S35CNVRT          GO CONVERT FRACTION TO EBCDIC
         STW,AC2  FLN               STORE VALUE
         LI,X3    3                 INITIALIZE ZERO-STORE COUNT
TSTFLIMS EQU      %
         CH,AC1   FLNLIMS,X3        TEST FLN LIMITS
         BL       SETZROS              <, SET ZEROES
         BDR,X3   TSTFLIMS             >=, TEST NEXT
         B        SETPT             NO LIMIT, STORE POINT
*
*
         PAGE
*
*
SETZROS  EQU      %
         LI,AC1   '0'               GET LEADING ZERO CHAR
         STB,AC1  FLN,X3            STORE IN FLN
         BDR,X3   SETZROS           STORE X3 ZEROES
*
SETPT    EQU      %
         LI,AC1   '.'               GET DECIMAL PT
         STB,AC1  FLN               STORE IN FIRST BYTE
*
GETWLN   EQU      %
         LW,AC1   WLN               NOW GET WHOLE LINE
         BAL,SRTN S35CNVRT          CONVERT TO EBCDIC
         LW,AC1   AC2               GET VALUE FOR WHOLE LINE IN AC1
         LW,AC2   FLN               AND FRACTIONAL PART IN AC2
*
         RETURN
*
*
FLNLIMS  EQU      %                 FRACTIONAL LN LIMITS
         DATA,2   0,100,10,1
*
*
         PAGE
*
* S35HEXC -- CONVERT EBCDIC REPRESENTION OF HEX STRING
*
* ENTRY PARAMETERS:
*        AC1 = 1ST DIGIT
*        AC2 = 2ND DIGIT
*
* EXIT PARAMETERS:
*        AC1 = 2 HEX DIGITS (1 BYTE)
*           = -1 FOR INVALID HEX DIGITS
*
S35HEXC  EQU      %
         SAVRTN
         LCI      2                 SAVE INPUT PARAMS
         STM,AC1  HEXNUMS
*
         LI,X1    2                 INDEX TO HEX NUMBERS
GETNXT   EQU      %
         LI,AC3   9                 INITIALIZE ADD-WORD FOR ALPHA
         LW,AC1   HEXNUMS-1,X1      GET EBCDIC NUMBER
         CLM,AC1  ATHRUF            TEST FOR A THRU F CHARS
         BCR,9    GETDIG                YES, GET HEX DIGIT
         LI,AC3   0                 SET ADD-WORD FOR NUMBERS
         CLM,AC1  NUMLIMS           TEST FOR NUMBERS
         BCS,9    HEXERR                NO, HEX ERROR
*
*
         PAGE
*
*
GETDIG   EQU      %
         AND,AC1  L(X'0F')          REMOVE ZONE BITS
         AW,AC1   AC3               ADD 9 FOR A-F
         STW,AC1  HEXNUMS-1,X1      STORE DIGIT
         BDR,X1   GETNXT            GET NEXT DIGIT
*
         LCI      2                 GET DIGITS
         LM,AC1   HEXNUMS
         SLS,AC2  28                SHIFT 2ND DIGIT
         SLD,AC1  4                 BOTH DIGITS IN AC1
         B        RTNHEXC           RETURN
*
HEXERR   EQU      %
         LI,AC1   -1                SET ERROR RETURN
RTNHEXC  EQU      %
         RETURN
*
*
         BOUND    8
ATHRUF   DATA     'A','F'           A THRU F LIMITS
NUMLIMS  DATA     '0','9'           NUMBER LIMITS
*
*
         PAGE
*
* LOCAL VARIABLES FOR CONVERT
*
35D CSECT                      0         START OF LOCALS
         BOUND    8
CNVRTWD  RES      1                 ORIGINAL INTEGER
ANSWR    RES      1                 ANSWER WORD
DIGFLG   RES      1                 SIGNIFICANT DIGIT FLAG
*
FLN      RES      1                 FRACTIONAL PART OF LINE NUMBER
WLN      RES      1                 WHOLE PART OF LINE NUMBER
HEXNUMS                        RES       2 HEX DIGITS
*
         USECT    #ULOC
         END
