ASMB,R,L
      HED HIGH SPEED READ PACKAGE FOR HP 2240A
      NAM R2240,7 92400-16001 REV 2001 791026 
      ENT C2240,R2240 
      EXT .ENTR,EXEC
* 
*    NAME:    R2240 
*    SOURCE:  92400-18001         
*    RELOC:  92400-16001        
*    PGMR: UNKNOWN
* 
******************************************************************* 
*  (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS  
*  RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, 
*  REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT 
*  THE PRIOR WRITTEN CNSENT OF HEWLETT-PACKARD COMPANY. 
******************************************************************
* 
*    REQUIRES:  DVR37  59310-16002/3  1726 OR LATER 
*               HPIB CARD  59310-60101  1716 OR LATER 
* 
*    CALL  R2240 (LU, NSEC, LSTR, ISTR) 
* 
*      LU IS THE 2240 LOGICAL UNIT NUMBER 
*      NSEC IS -1 TO READ A RESULT RECORD, OR 
*               0 TO 32 TO READ STATUS FROM A SECONDARY 
*      LSTR IS THE NUMBER OF WORDS IN THE ARRAY ISTR, 
*           WHICH MUST BE > 1 
*      ISTR IS THE ARRAY FOR THE RESULT OR STATUS STRING. 
* 
*      SUCCESSFUL CALL WILL READ ONE RECORD FROM THE 2240 
*      INTO ISTR, FORMATTED FOR C2240:
*             ISTR(1) = CHARACTER COUNT IN STRING 
*             ISTR(2)... = ASCII CHARACTERS 
* 
*      ERROR RETURNS: 
*             ISTR(1) = 0 IF EXEC CALL TO READ FAILS, THEN: 
*                 ISTR(2) = A-REGISTER FROM EXEC/DVR37 ERROR
*                 ISTR(2) = -1 IF RECORD WAS EMPTY
*             ISTR(1) = -1 IF R2240 PARAMETER INVALID 
* 
* 
*    CALL C2240 (ISTR, IRSLT, INDEX, NRSLT, IERR) 
* 
*      ISTR IS A STRING WITH ISTR(1) AS ITS CHARACTER 
*           COUNT AND THE REST AS THE ASCII RESULT
*           FROM THE 2240A. ISTR IS UNCHANGED BY C2240. 
*      IRSLT IS A VARIABLE OR ARRAY FOR THE RESULTS.
*      INDEX IS A CHARACTER POINTER WHICH MUST BE A 
*           VARIABLE.  PRESET IT TO 0 ON THE FIRST C2240
*           CALL, AND LEAVE IT ALONE FOR ANY OTHER
*           CONVERSION CALLS ON THE SAME STRING.
*      NRSLT IS THE NUMBER OF RESULTS TO CONVERT
*           ON THIS CALL OF C2240.
*      IERR IS AN ERROR CODE RETURNED BY C2240. 
* 
*      SUCCESSFUL CONVERSION RETURNS: 
*           IRSLT = THE RESULT VALUES CONVERTED 
*           INDEX = NUMBER OF CHARACTERS SCANNED SO FAR 
*           IERR = 0
*           ISTR AND NRSLT UNCHANGED
     SKP
* 
*      ERROR RETURN IF PARAMETER INVALID OR TOO MANY RESULTS
*      TO BE CONVERTED FROM STRING: 
*           IERR = -1 
*           ISTR AND NRSLT UNCHANGED
*           INDEX AND IRSLT UNDEFINED 
*      C2240 ASSUMES THE STRING IS VALID AND TAKES NO TIME
*      FOR DETAIL ERROR TESTS.  IT EXPECTS INTEGERS, SEPARATED
*      BY COMMAS, WITH LEADING BLANKS OR MINUS SIGNS.  ANY
*      IMBEDDED INVALID CHARACTERS MAY CONVERT TO INVALID 
*      IRSLT NUMBERS WITHOUT ERROR MESSAGES.
* 
*      NOTE: ERRORS FROM R2240 WILL BE TRAPPED BY C2240, SO 
*      PROGRAMS NEED ONLY TEST IERR. ALSO, R2240 AND C2240
*      NEED NOT BE USED IN PAIRS -- STRINGS CAN BE STORED FOR 
*      LATER CONVERSION.
* 
*      EXAMPLE:       CALL  R2240 (LU, NSEC, LSTR, ISTR)
*                     INDEX = 0 
*                     CALL  C2240 (ISTR, IRSLT, INDEX, NRSLT, IERR) 
*                     IF (IERR)  1000, 100
*               C   100 TO USE IRSLT, 1000 TO HANDLE ERRORS 
* 
* 
********************** R2240 ******************************** 
* 
LU    NOP 
NSEC  NOP 
LSTR  NOP 
ISTRR NOP 
R2240 NOP 
      JSB .ENTR 
      DEF LU
      JSB EXEC        GET BOX HP-IB ADDRESS WITH
      DEF *+6         A STATUS EXEC CALL
      DEF THRTN 
      DEF LU,I
      DEF T1
      DEF T2
      DEF CB2 
      LDA T1
      AND MSK3        DOES LU POINT TO DVR37 (HP-IB)? 
      CPA D37 
      JMP A2          YES -- CONTINUE 
E1    CCA             NO -- PARAMETER ERROR 
      STA ISTRR,I     SET ISTR(1) = -1 AND RETURN 
      JMP R2240,I 
* 
A2    LDA CB2         PICK UP LU'S SUB-CHANNEL
      AND MSK2
      SZA,RSS         HPIB CARD LU (SUBCHANNEL = 0) ? 
      JMP E1          YES -- ERROR EXIT 
      ADA TLK0        NO
      ALF,ALF 
      STA CB2         CB2 = 2240 TALK ADDR IN UPPER BYTE
      LDA NSEC,I      GET SECONDARY 
      LDB M3
      SSA             NSEC < 0 ?
      JMP A4          YES -- RESULT, SO NO SECONDARY ADDR 
      ADB MONE        NO -- STATUS, BUMP CMD BYTE COUNT 
      ADA MSA0        CONVERT NSEC TO SECONDARY ADDR
      IOR CB2         MERGE WITH 2240 TALK ADDRESS
      STA CB2         CB2 = COMB 2240 TALK AND SECONDARY
A4    STB CCNT        CCNT = - # BUS CMD BYTES (3 OR 4) 
      LDA ISTRR 
      INA 
      STA A3          A3 = STRING BUFFER ADDRESS
      LDA LSTR,I      GET STRING ARRAY LENGTH 
      ADA MONE
      SZA             WAS IT >= 2 ? 
      SSA 
      JMP E1          NO -- PARAMETER ERROR 
      ALS             YES -- CONVERT TO BUFFER LENGTH 
      CMA,INA 
      STA T1          T1 = MAX # CHARS = -2 * (LSTR-1)
      LDA LU,I
      IOR DIO 
      STA T2          T2 = LU # PLUS BIT 12 ON
      CCA 
      STA A3,I        ISTR(2) = -1 IN CASE REC. IS EMPTY
* 
      JSB EXEC
      DEF *+7 
      DEF ONE         READ
      DEF T2          DIRECT I/O, ASCII MODE
A3    NOP             STRING ADDRESS
      DEF T1          - MAXIMUM STRING CHAR COUNT 
      DEF CB1         BUS COMMANDS
      DEF CCNT        - COMMAND CHAR COUNT
* 
      SSB             SUCCESSFUL READ?
      JMP E2          NO -- ERROR EXIT
      STB ISTRR,I     YES -- ISTR(1) = CHAR COUNT IN (B)
      JMP R2240,I     AND RETURN
E2    STA A3,I        ON ERR, ISTR(2) = DVR37 ERR CODE
      CLA 
      STA ISTRR,I     AND ISTR(1) = 0 
      JMP R2240,I     RETURN
* 
********************** C2240 ******************************** 
* 
ISTR  NOP 
IRSLT NOP 
INDEX NOP 
NRSLT NOP 
IERR  NOP 
C2240 NOP 
      JSB .ENTR 
      DEF ISTR
      LDA INDEX,I 
      SSA           INDEX < 0?
      JMP ERROR     YES -- ERROR
      LDB ISTR,I
      CMB,INB 
      SSB,RSS       ISTR(1) < 1?
      JMP ERROR     YES -- INVALID STRING LENGTH
      ADA 1 
      ADA MONE
      STA CCNT      CCNT = INDEX - ISTR(1) - 1
      SSA,RSS       CCNT < 0? 
      JMP ERROR     NO -- NO CHARACTERS LEFT TO SCAN
      LDA ISTR
      INA 
      RAL 
      ADA INDEX,I 
      STA CPTR      CPTR = NEXT CHARACTER BYTE ADDRESS
      LDA NRSLT,I 
      CMA,INA 
      SSA,RSS       NRSLT < 1 ? 
      JMP ERROR     YES -- PARAMETER ERROR
      STA NCNT      NCNT = -NRSLT 
      CLA           ASSUME NORMAL RETURN FROM THIS
      STA IERR,I        POINT, SO IERR = 0
* 
******** LOOP TO CONVERT RESULTS **************** 
* 
A1    JSB SCAN      GET NEXT RESULT INTO NUM
      LDA NUM 
      LDB NFLAG     NEG RESULT? 
      SZB 
      CMA,INA       YES -- COMPLIMENT (A) 
      STA IRSLT,I   SAVE IN ARRAY 
      ISZ IRSLT     BUMP ARRAY POINTER
      ISZ NCNT      DONE WITH # RESULTS ASKED FOR?
      JMP A1        NO -- LOOP
      JMP C2240,I   YES -- RETURN OK
* 
*      ERROR RETURNS
* 
ERROR CCA 
      STA IERR,I    IERR = -1 
      JMP C2240,I   AND RETURN
* 
*********** INTERNAL C2240 SUBROUTINES *************
* 
*  JSB SCAN -- CONVERTS NEXT NUMBER IN BUFFER INTO NUM
* 
SCAN  NOP 
      CLA 
      STA NUM       NUM = 0 
      STA NFLAG     NFLAG = 0 
S2    JSB GETC      GETC FIRST CHAR 
      CPA BLNK      = BLANK?
      JMP S2        YES -- SKIP IT
      CPA MINUS     NO -- NEGATIVE #? 
      RSS 
      JMP S1        NO -- START CONVERSION
      ISZ NFLAG     YES -- SET NFLAG = 1 AND
      JMP S2        GET NEXT CHAR 
* 
S1    CPA COMMA     = COMMA?
      JMP SCAN,I    YES -- DELIMITER, SO DONE 
      AND MSK2      NO -- TREAT AS A DIGIT
      LDB NUM 
      BLS 
      ADA 1 
      BLS,BLS 
      ADA 1 
      STA NUM       NUM = 10*NUM + DIGIT
      CCA 
      CPA CCNT      BUFFER EMPTY? 
      JMP SCAN,I    YES -- THIS # CONVERSION DONE 
      JSB GETC      NO -- GET NEXT CHARACTER
      JMP S1        AND LOOP
* 
*  JSB GETC -- GETS NEXT CHARACTER INTO LOWER 
*  7 BITS OF (A) AND BUMPS POINTER. 
* 
GETC  NOP 
      LDB CPTR
      CLE,ERB 
      LDA 1,I 
      SEZ,RSS      UPPER OR LOWER BYTE? 
      ALF,ALF      ROTATE IF UPPER
      AND MSK1     MASK BYTE W/O PARITY BIT 
      ISZ INDEX,I  BUMP INDEX 
      ISZ CPTR     BUMP CHARACTER POINTER 
      ISZ CCNT     BEYOND END OF THE STRING?
      JMP GETC,I   NO -- RETURN O.K.
      JMP ERROR    YES -- TOO MANY RESULTS REQUESTED
* 
**************  DATA AREA  ***************
* 
MSK1  OCT 177      7 BIT ASCII MASK 
CPTR  NOP          NEXT CHARACTER ADDRESS 
NUM   NOP          RESULT FROM SCAN 
NCNT  NOP          COUNTS # OF RESULTS SCANNED
CCNT  NOP          COUNTS CHARS REMAINING IN STRING 
NFLAG NOP          >0 IF NUM WAS NEGATIVE FROM SCAN 
MINUS OCT 55
BLNK  OCT 40
COMMA OCT 54
MSK2  OCT 17       4 BIT DIGIT MASK 
MONE  DEC -1
ONE   DEC 1 
TWO   DEC 2 
THRTN DEC 13
M3    DEC -3
TLK0  OCT 000100   TALK ADDRESS 0 
MSA0  OCT 000140   SECONDARY ADDRESS 0
MSK3  OCT 037400   DVR NUMBER MASK
D37   OCT 017400   CODE FOR DVR37 
DIO   OCT 010000   BIT 12 ON FOR DIRECT I O 
T1    NOP 
T2    NOP 
CB1   OCT 057477   COMMAND BUFFER: UNTALK, UNLISTEN 
CB2   NOP                          2240 TALK, SECONDARY 
      END 
                        