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