ASMB,R,Q,C NAM TIM,7 09580-16022 REV.1926 790312 *------------------------------------------------------------------- * * RELOC. 09580-16022 * SOURCE 09580-18022 * * C. LEATH 03/15/77 REV. A * 790307 REV 1926 * * HP 92425A TEST SYSTEM SOFTWARE IS THE PROPRIETARY * MATERIAL OF THE HEWLETT-PACKARD COMPANY. USE AND * DISCLOSURE THEREOF ARE RESTRICTED BY WRITTEN AGREEMENT. * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. * ALL RIGHTS RESERVED. NO PART OF THIS PROGRAM * MAY BE PHOTOCOPIED, REPRODUCED OR TRANSLATED * TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR * WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. * *------------------------------------------------------------------- EXT EXEC,RTCLN,ISN,.ENTR EXT ERROR ENT TIM A EQU 0 B EQU 1 SKP * * * COMMENTS ************************************************** * * THIS IS THE TABLE INTERFACE MODULE FOR THE 9580 SYSTEM * RESPONSIBLE FOR RETRIEVING DATA FROM SYSTEM AVAILABLE * MEMORY (SAM) AND RETURNING THE DATA OF INTEREST TO * THE REQUESTING DEVICE SUBROUTINE. THE PARAMETERS * IN THE CALLING SEQUENCE DETERMINE WHAT DATA IS TO * BE RETURNED AND HOW MUCH. THE DEVICE SUBROUTINE * IS RESPONSIBLE FOR KNOWING WHAT DATA IS IN THE TABLE * AND WHAT FORMAT IT IS IN. * THE PARAMETERS IN THE CALLING SEQUENCE ARE DEFINED AS * AS FOLLOWS: * IDTN = DEVICE TYPE NUMBER, UNIQUE FOR EACH DEVICE * IUN = UNIT NUMBER * IRW = 1(READ),2(WRITE),3(# UNITS) * IBUF= DEVICE SUBROUTINE BUFFER IN WHICH DATA IS TO * BE RETURNED. * IBL = IBUF LENGTH * N = ERROR INDICATOR, * WHERE: * 1 = DEVICE TYPE NOT EXISTENT IN TABLE * 2 = LENGTH OF REQUEST BUFFER IBL DOES NOT * JIBE WITH THE LENGTH OF THE RECORD SET. * 3 = UNIT # DOES NOT EXIST IN THE TABLE. * 4 = NO CLASS # * 5 = ILLEGAL IRW REQUEST # * * ERRORS ARE RECOVERABLE BY CHANGING THE ASCII TABLE * OR BY CHANGING THE TEST PROGRAM. * * SUBROUTINE TIM IS INCLUDED WITH EACH BASIC OVERLAY * IN ORDER TO ENABLE EACH DEVICE SUBROUTINE THAT * NEEDS VARIABLE DATA TO ACCESS TABLE DATA. * * PRIOR TO USING THIS PROGRAM IT IS ASSUMED THAT THE * ALLOC PROGRAM HAS BEEN RUN. ALLOC IS THE PROGRAM THAT TAKES * THE ASCII FILE CONTAINING THE CONFIGURATION INFORMATION * AND PLACES IT IN SAM (SYSTEM AVAILABLE MEMORY). OF COURSE * THE DATA IN SAM IS BINARY. THE FORMAT OF THE TABLE IN * IS AS SHOWN IN THE FOLLOWING FIGURE. EACH TABLE IN SAM * IS LINKED BY THE FIRST IN THE TABLE WHICH IS THE CLASS * NUMBER FOR THE SUCCEEDING TABLE. THE LAST TABLE IN SAM * HAS THE FIRST WORD POINTING TO THE FIRST TABLE OF THE GROUP, * SO THAT WE HAVE IN A SENSE A CIRCULARLY LINKED LIST. * THE SECOND WORD OF THE TABLE CONTAINS THE ACTUAL LENGTH * OF THE TABLE, WITH THE MAXIMUM SIZE ANY ONE TABLE CAN BE * IS 130 WORDS. * * ----------------------------------------- * WORD 1 * CLASS # FOR NEXT TABLE IF ANY * * * (MAY POINT TO ITSELF) * * ----------------------------------------- * WORD 2 * LENGTH (MAXIMUM 130 WORDS) * * *---------------------------------------- * WORD 3 * DEVICE TYPE NUMBER * * *---------------------------------------- * WORD 4 * # UNITS * * *---------------------------------------* * WORD 5 * # OF ENTRIES * * *---------------------------------------* * WORD 6 * DATA AND INFO SIMILAR TO WORDS 3-5 * * *---------------------------------------* * * NOTE: WORDS 3-5 ARE HEADER INFORMATION FOR EACH DEVICE * * * COMMENTS RELATED TO THE PROGRAM, KEYED TO THE NUMBERS. * ****#1 * * * SOME ERROR CHECKING IS DONE TO VERIFY IRW IS CORRECT. * THE STATION NUMBER IS RETRIEVED VIA ISN AND THE CLASS * NUMBER FOR THE FIRST BUFFER IN SAM IS ALSO RETRIEVED * VIA "RTCLN". * ****#2 * RETRIEVE THE BUFFER WITH A CLASS GET REQUEST, USING * SUBROUTINE "GTBUF". LDT IS THE POINTER INTO IBC AND * IT IS INITIALIZED TO 3 TO POINT TO THE THIRD WORD SINCE * WORDS 1 AND 2 CONTAIN RESPECTIVELY THE CLASS NUMBER * FOR THE NEXT BUFFER IF ANY AND THE LENGTH OF THE BUFFER. * ****#3 * * AT THIS POINT WE BEGIN SEARCHING THRU THE BUFFER IBC TO * FIND THE DEVICE TYPE NUMBER (IDTN). THE FOLLOWING ALGORITHM * IS USED TO INDEX TO EACH IDTN IN THE TABLE: * * LDT(N) = [IBC(LDT(N-1) + 2) + 1] *[IBC(LDT(N-1)] + [LDT(N-1)+3] * A B C * * WHERE: LDT IS THE INDEX THAT IS UPDATED EACH TIME THRU LOOP(TM3). * A = THE NUMBER OF ENTRIES PLUS ONE FOR EACH UNIT NUMBER WORD. * B = THE NUMBER OF UNITS * C = THREE WORDS OF OVERHEAD FOR EACH DEVICE TYPE. * * IF AFTER COMPUTING EACH LDT IT IS DISCOVERED THAT THE VALUE * EXCEEDS THE TABLE LENGTH THE NEXT TABLE IS RETRIEVED FROM * SAM. * ****#4 * * THIS PORTION SEARCHES FOR THE UNIT NUMBER "IUN". * THE POINTER LDT AT THIS TIME POINTS TO THE * FIRST UNIT NUMBER OF A PARTICULAR DEVICE TYPE (IDTN) * AND THE COUNTER "IUCNT" IS INITIALIZED WITH * THE NUMBER OF UNITS ASSIGNED TO THE DEVICE TYPE. * IF THE UNIT NUMBER (IUN) IS NOT FOUND * A RETURN IS MADE TO THE CALLING ROUTINE WITH THE * THE ERROR FLAG (N) = -2. * THE ALGORITHM USED TO COMPUTE THE INDEX (LDT) FOR EACH * UNIT NUMBER IS: * * LDT(N) = LDT(N-1) +IUPTR + 1 * A B C * * WHERE: A = THE PREVIOUS INDEX TO A UNIT NUMBER. * B = THE NUMBER OF ENTRIES PER UNIT. * C = ONE WORD FOR UNIT # * * ****#5 * * HERE THE READ/WRITE INDICATOR (IRW) IS EXAMINED TO * DETERMINE WHICH DIRECTION DATA IS TO FLOW, AND IF * A WRITE (IRW = 2) WE GO TO TM16. IF A * READ THE DATA OF INTEREST IS TRANSFERRED TO THE * DEVICE SUBROUTINE BUFFER (IBUF). IN CASE THE DATA * OVERFLOWS INTO ANOTHER BUFFER A CLASS GET REQUEST (GTBUF) * IS MADE TO RETRIEVE THE OTHER BUFFER. * ****#6 * * THIS IS THE WRITE SECTION, WITH THE ONLY DIFFERNCE FROM * THE READ REQUEST BEING THAT "ICL" IN THE GET REQUEST * HAS BIT 14 =0 TO INDICATE TO THE SYSTEM THAT WE WANT * TO RELEASE THE BUFFER BU RETAIN THE CLASS NUMBER. * OVERFLOWS ARE HANDLED PRETTY MUCH THE SAME WAY AS IN THE * READ REQUEST. * * * SAME #6 EXCEPT THIS IS FOR A WRITE REQUEST. SKP SPC 3 IDTN NOP IUN NOP IRW NOP IBUF NOP IBL NOP N NOP TIM NOP JSB .ENTR RETRIEVE PARAMETER ADDRESSES DEF IDTN CLA STA N,I STA IFND STA J ************************** # 1 PARAMETER CHECK AND INITIALIZATION * OF STATION #(ISTN) AND CLASS # (ICLAS). * SEE IF IRW IS < 0 OR > 3 * LDA IRW,I SZA,RSS JMP ERR5 SSA JMP ERR5 CMA,INA ADA .2 SSA JMP ERR5 JSB ISN GET STATION # DEF *+2 DEF IDMY STA ISTN JSB RTCLN GET CLASS # FOR STATION DEF *+3 DEF ISTN DEF ICLAS STA IFCLS SAVE FIRST CLASS # SZA,RSS IS CLASS # = 0 JMP ERR4 YES ERROR TM1 LDA .3 INITIALIZE LDT(POINTER FOR SEARCHING) STA LDT LDA IDTN,I DEVICE TYPE NUMBER STA ISV SEARCH VARIABLE * ************************* # 2 GET TABLES AND SEARCH FOR IDTN. * TM2 LDB ICLAS LDA IC1 MASK (BITS 13 1AND 14 SET) JSB GTBUF GET CLASS BUFFER JSB FOUND SEE IF IBC(LDT) = ISV JMP TM5 EUREKA!! * **************************** # 3 * TM3 LDA LDT CHECK IF NUMBER OF CPA .130 INITS IS CURRENT BUFFER JMP *+2 IF NOT, READ NEXT BUFFER JMP TM3A * LDB IBC SET CLASS# OF NEXT BUFFER STB ICLAS * LDA IC1 GET NEXT BUFFER JSB GTBUF * LDA .2 SET CURRENT LOCATION OF STA LDT DEVICE TYPE TO PSEUDO LOCATION. * LDA .2 SET TO (FIRST DATA LOC.) - 1 * * TM3A ADA IBCPT GET NUMBER OF UNITS INA LDB A,I STB TEMP * LDB LDT CHECK IF NUMBER OF INB CPB .130 ENTRIES IS IN CURRENT BUFFER JMP *+2 IF NOT, READ NEXT BUFFER JMP TM3B * LDB IBC SET CLASS # OF NEXT BUFFER STB ICLAS * LDA IC1 GET NEXT BUFFER JSB GTBUF * CLB,INB SET CURRENT LOCATION OF STB LDT DEVICE TYPE TO PSEUDO LOCATION * LDB .2 SET TO (FIRST DATA LOC.) - 1 * TM3B ADB IBCPT FETCH NUMBER OF ENTRIES INB LDA B,I * INA ADJUST NUMBER OF ENTRIES CLB MPY TEMP STA TEMP ADA LDT ADA .3 LDT = TEMP +(LDT+3) STA LDT CMA,INA SEE IF LDT > LENGTH OF TABLE(IBC(2)) ADA IBC2 SSA,RSS JMP TM4 LDA LDT LDT = LDT - 128 ADA M128 STA LDT LDA IBC CPA IFCLS HAVE WE EXAMINED ALL CLASS BUFFERS? JMP ERR1 YES THEN IDTN DOES NOT EXIST IN CONFIG TABLE LDB IBC STB ICLAS JMP TM2 TRY AGAIN (READ IN ANOTHER BUFFER) TM4 JSB FOUND JMP TM5 FOUND IT THIS TIME JMP TM3 GO LOOP DE LOOP * * SKP SPC 3 * ************************** # 4 * DEVICE TYPE NUMBER HAS BEEN FOUND SO THEREFORE WE MUST * NOW FIND THE UNIT # AND ENTRIES * TM5 LDA LDT MAKE SURE LDT+1 .NE. 130 INA CPA .130 JMP *+2 JMP TM6 LDA IB130 STA IUCNT NUMBER OF UNITS LDB IBC STB ICLAS KEEP ICLAS CURRENT LDA IC1 JSB GTBUF LDA .4 SET POINTER TO FIRST UNIT NUMBER STA LDT LDB IBCPT ADB .3 PICK UP # OF ENTRIES LDA B,I STA IUPTR CPA IBL,I SEE IF IBL(BUFFER LENGTH) = #ENTRIES(SUBRECORDS) JMP TM10 JMP ERR2 TM6 LDA LDT SEE IF LDT = 130(END OF BUFFER). CPA .130 JMP *+2 JMP TM7 LDB IBC SINCE LDT= 130, THE INFORMATION WE NEED IS IN STB ICLAS LDA IC1 THE NEXT CLASS BUFFER JSB GTBUF LDA .2 SET LDT TO POINT TO IBC LENGTH WORD (IBC(2)) STA LDT TM7 LDB IBCPT ADB LDT COMPUTE IBC(LDT+2) AND IBC(LDT+1), #ENTRIES AND INB # UNITS RESPECTIVELY LDA B,I STA IUCNT INB LDA B,I STA IUPTR CPA IBL,I SEE IF IBL = #ENTRIES JMP *+2 JMP ERR2 LDA LDT LDT = LDT + 3, POINT IT TO FIRST UNIT # ADA .3 STA LDT * * TM10 LDA IRW,I SEE IF THIS IS A UNIT COUNT REQUEST ONLY CPA .3 JMP TM20 * LDA IUN,I SET UP UNIT# TO BE TESTED FOR. STA ISV * LDA IUCNT PRESET COUNTER FOR #UNITS + 1. CMA STA IFND * TM11 ISZ IFND TEST IF #UNITS HAS BEEN EXCEEDED. JMP *+2 JMP ERR3 * TM12 LDA LDT CHECK IF UNIT # IS IN CURRENT BUFFER. CMA,INA ADA IBC2 SSA,RSS JMP TM13 YES. UNIT# IS IN CURRENT BUFFER. * LDA LDT ADJUST UNIT# POINTER FOR POSISTION IN ADA M128 NEXT BUFFER. STA LDT * LDA IC1 READ NEXT BUFFER. LDB IBC (NOTE. ENTRIES FOR A UNIT MAY SPAN MORE STB ICLAS THAN ONE BUFFER.) JSB GTBUF JMP TM12 * TM13 JSB FOUND CHECK IF UNIT# IS RIGHT ONE. JMP TM14 YES. * LDA LDT INDEX TO NEXT UNIT# POSITION. ADA IUPTR INA STA LDT * JMP TM11 * SKP SPC 3 ************************ # 5 * AT THIS POINT THE UNIT # AND DEVICE TYPE HAVE BEEN FOUND * AND WE ARE READY TO TRANSFER DATA TO OR FROM THE CLASS * TABLES IN SAM. * TM14 ISZ LDT POINT LDT TO FIRST SUBRECORD ENTRY IN TABLE LDA IBL,I INITIALIZE COUNTER CMA,INA STA TRCNT LDA IRW,I READ OR WRITE REQUEST? CPA .2 JMP TM16 WRITE REQUEST * * READ REQUEST * LDA IBUF INITIALIZE ADDRESS POINTERS STA TO TM15 LDA IBCPT ADA LDT STA FROM JSB TRFER BEGIN TO TRANSFER JMP TIM,I ALL DONE LDB IBC GET THE REST LDA IC1 JSB GTBUF CLA STA J RE-INIT POINTERS LDA .3 STA LDT JMP TM15 SPC 3 ********************** #6 * WRITE REQUEST * TM16 LDB ICLAS LDA IC2 (BIT 13 ONLY SET) RELEASE BUFFER,KEEP CLASS # JSB GTBUF LDA IBUF STA FROM TM17 LDA IBCPT ADA LDT STA TO JSB TRFER JMP TM18 * * CLASS READ/WRITE * LDA IBC STA TEMP SAVE CURRENT CLASS # JSB WRTBF LDB TEMP GET THE NEXT BUFFER STB ICLAS LDA IC2 JSB GTBUF CLA RE-INIT POINTERS STA J LDA .3 STA LDT JMP TM17 TM18 JSB WRTBF JMP TIM,I GET HAT TM20 LDA IUCNT STA IBUF,I JMP TIM,I * SKP SPC 3 * * SPECIAL SUBROUTINES THAT MAKE THE JOB OF ALL THE PREVIOUS * BIT CRUNCHING IN THIS ROUTINE EASIER. * ************************************************************** * ******CLASS GET REQUEST UPON ENTRY A=MASK B=CLASS # * GTBUF NOP IOR B A /\ B STA ICL JSB EXEC DEF RTG DEF .21 DEF ICL DEF IBC DEF .130 RTG JMP GTBUF,I * .21 DEC 21 .130 DEC 130 ICL NOP * SPC 2 * *CLASS READ/WRITE REQUEST * WRTBF NOP JSB EXEC DEF RTW DEF .20 DEF .0 DEF IBC DEF IBC+1 LENGTH DEF IDMY DEF JDMY DEF ICLAS RTW JMP WRTBF,I * .20 DEC 20 .0 OCT 0 IDMY NOP JDMY NOP ICLAS NOP * SPC 2 * * MATCH CHECKING ROUTINE WHICH SEES WHETHER IBC(LDT) = ISV * WHERE ISV IS EITHER THE IDTN OR THE IUN. * * IF A MATCH RETURN IS P+1 * IF NO MATCH RETURN IS P+2 * FOUND NOP LDB IBCPT ADB LDT LDA B,I CPA ISV JMP FOUND,I ISZ FOUND JMP FOUND,I * SPC 2 * * DATA TRANSFER ROUTINE, TAKES DATA FROM ONE LOCATION(FROM) * AND TRANSFERS IT TO ANOTHER (TO). * P+1 RETURN INDICATES ALL DATA TRANSFERRED * P+2 RETURN " MORE TO GO * !!ATTENTION!! ZERO WORDS CANNOT MOVED.(IE TRCNT.NE.0) * TRFER NOP * TRLOP LDA J CHECK IF WORD ABOUT TO BE MOVED ADA LDT IS IN CURRENT BUFFER. CMA,INA ADA IBC2 SSA,RSS JMP *+3 * ISZ TRFER RETURN TO GET NEXT BUFFER. JMP TRFER,I * LDA FROM,I MOVE DATA WORD. STA TO,I * ISZ J SET POINTER TO NEXT WORD. ISZ FROM ISZ TO * ISZ TRCNT CHECK IF ALL WORDS HAVE BEEN MOVED. JMP TRLOP * JMP TRFER,I MAKE "FINISHED (P+1)" RETURN. * FROM NOP TO NOP J NOP TRCNT NOP SKP SPC 3 * * ERROR MESSAGES * ERR5 ISZ N,I ERR4 ISZ N,I ERR3 ISZ N,I ERR2 ISZ N,I ERR1 ISZ N,I JSB ERROR DEF *+3 DEF N,I DEF IERMS JMP TIM,I * IERMS DEC 5 ASC 3,TIM * SPC 3 * * STORAGE, CONSTANTS ETC * IBC BSS 130 IFND NOP .3 DEC 3 IBC2 EQU IBC+1 IBCPT DEF IBC-1 IB130 EQU IBC+129 .4 DEC 4 .2 DEC 2 IUCNT NOP IUPTR NOP IC1 OCT 60000 IC2 OCT 20000 ISV NOP TEMP NOP IFCLS NOP ISTN NOP M128 DEC -128 LDT NOP END