ASMB,R,L,C HED PLOSB 91700-16149 REV.A * (C) HEWLETT-PACKARD CO. 1976 NAM PLOSB,2,30 91700-16149 REV.A 760325 SUP SPC 2 *********************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL * RIGHTS RESERVED. NO PART OF THIS PROGRAM MAY BE * PHOTOCOPIED, REPRODUCED, OR TRANSLATED TO ANOTHER * PROGRAM LANGUAGE WITHOUT THE PRIOR CONSENT OF * HEWLETT-PACKARD COMPANY. *********************************************************** SPC 3 * *********************************************************** * * PROGRAM LOAD AND SAVE FOR BASIC * * BUFFERED DATA TRANSFER FOR 8500 SATELLITES * * SOURCE PART # 91700-18149 REV A * * REL PART # 91700-16149 REV A * * LISTING PART # A-91700-16149-1 * * WRITTEN BY: BARBARA PACKARD, LARRY POMATTO * * DATE WRITTEN: 12-05-74 * * MODIFIED BY: JEAN-PIERRE BAUDOUIN * * DATE MODIFIED: DEC 1975 *********************************************************** SPC 2 * * PROGRAM TO DO READ/WRITE ON UP TO MAXN * OPEN FILES FOR 8500 SATELLITES. MAXN IS THE NO. * OF FILES WHICH MAY BE OPEN AN ANY ONE TIME. * REMEMBER EACH FILE TAKES 145 WORDS!!! * CENTRAL PROGRAM WHEN SCHEDULED MUST BE * PASSED THE CLASS NUMBER. * * DATA IS PACKED INTO 512 WORD BUFFERS BEFORE * TRANSFER. * SKP * DEFINE ENTRY POINTS SPC 2 * DEFINE EXTERNALS SPC 1 EXT EXEC,READF,POSNT,CLOSE,WRITF EXT OPEN,CREAT,D65SV,D65CL IFN EXT DBUG XIF SPC 2 * DEFINE A AND B REG SPC 1 A EQU 0 B EQU 1 SKP * * PROGRAM STARTS HERE * PLOSB LDA B,I GET CLASS NUMBER STA CLSNM SAVE CLASS NUMBER IFN SZA DO THEY WANT DBUG? JMP PLOSS YES WAIT FOR FIRST USER JSB DBUG NO...GIVE THEM DBUG DEF *+1 JSB EXEC TURN OFF, SAVE RESOURCES FOR LATTER DEF *+4 DEF D6 DEF D0 DEF D1 JMP PLOSB GO TO BEGINING WHEN RE-STARTED XIF SPC 1 D6 DEC 6 * * WE SHOULD ONLY GO THROUGH THE ABOVE ONCE * SPC 1 PLOS0 BSS 0 HERE ON ALL OTHER CALLS PLOSS JSB EXEC DO A GET CALL...WAIT FOR SOMETHING DEF *+5 DEF D21 CODE FOR A GET CALL DEF CLSNM CLASS # DEF RBUF REQUEST BUFFER DEF D35 REQUEST BUFFER LENGTH * * WHEN WE GET HERE SOMEONE WANTS SOMETHING * LDA DCBN GET DCB NUMBER..IF ZERO SZA IT IS A NEW REQUEST JMP PLOS1 NOT A NEW REQUEST LDA STAT GET STATUS WORD CPA M1 JMP CLSIT CLOSE REQUEST LDA CALOC NEW REQUEST...SEE IF WE CAN HANDLE IT ADA MMAXS LDB M3 SET ERROR TO -3 ...CAN'T HANDLE IT SSA,RSS HANDLE REQUEST? JMP TERM NO...TELL THEM TRY LATER LDB M4 GET ERROR CODE IF LENGTH ERROR LDA BLEN GET LENGTH WORD ADA MBUFS SEE IF LARGER THAN BUFFER SSA,RSS JMP TERM YES...ERROR LDA LSFG GET LOAD-SAVE FLAG SSA LOAD OR SAVE LOAD=0,SAVE=1 JMP PSAV1 SAVE JSB OPN GO OPEN FILE JMP PLOS1 OK ON OPEN...TREAT AS STANDARD PSAV2 LDB M2 SET FOR NOT THERE JMP TERM AND TERMINATE * HERE FOR SAVE * PSAV1 JSB CRET GO CREATE THE FILE JMP PLOS1 CREATED OK...PROCESS LDA FERR GET ERROR CODE STA TEMP0 SAVE INCASE NOT TYPE 0 FILE JSB OPN CHECK IF TYPE 0 FILE RSS POSSIBLY JMP PSAV2 NO...OH WELL LDA LSFG GET LOAD-SAVE FLAG SLA OVERRIDE BIT SET? JMP PLOS1 YES,OK LDA DCBN GET ADDRESS WHERE DCB LOCATED ADA D2 GET TO TYPE WORD LDA A,I GET WORD SZA,RSS TYPE 0? JMP PLOS1 YES...GOOD JSB DALOC NO...DEALOCATE DCB LDA TEMP0 GET FILE ERROR STA FERR RESET ERROR TYPE JMP PSAV2 TERMINATE * * AT THIS POINT THE DCB IS DEFINED * THE FILE IS OPENED AND WE ARE READY TO DO * OUR THING. * PLOS1 LDA STAT GET STATUS WORD CPA M1 JMP PLOS3 REQUEST WAS TO CLOSE THE FILE LDA LSFG LOAD OR SAVE? SSA JMP PLOS2 SAVE JSB LBUF LOAD THE BUFFER FROM THE DISC STB STAT SAVE THE FILE STATUS CPB M2 FMGR ERROR? JMP TERM YES, TERMINATE JSB WREC SEND THE DATA ACROSS THE LINE JSB WRPLY SEND STATUS REPLY JMP PLOS0 AND TERMINATE AND WAIT SPC 1 PLOS2 JSB RREC READ THE DATA FOR SAVE CLB TELL THEM ALL WENT WELL STB STAT SAVE IT IN THE STATUS WORD JSB SBUF SAVE BUFFER IN FILE CPB M2 FMGR ERROR? JMP TERM YES, TERMINATE JSB WRPLY SEND REPLY JMP PLOS0 GO WAIT FOR MORE * * CLOSE FILE AND DEALLOCATE DCB * PLOS3 JSB DALOC DEALLOCATE DCB AND CLOSE FILE CLB STB STAT STATUS OK JSB WRPLY SEND REPLY JMP PLOS0 GO TO SLEEP * * SUBROUTINE TO READ RECORDS FROM A FILE UNTIL * BUFFER IS FULL. * CALLING SEQUENCE * JSB LBUF * UPON RETURN...B REG= STATUS * STATUS= -1=EOF,O=BUFFER FULL * LBUF NOP LDA DBUFA GET DATA BUFFER ADDRESS STA TEMP1 SAVE AS CURRENT DATA ADDRESS INA GET TO FIRST DATA WORD STA LBUF1 SAVE FOR FILE WRITE COMMAND LDA BLEN GET MAX BUFFER SIZE ADA M1 EOB WORD, JUST IN CASE STA TEMP2 SAVE CURRENT BUFFER SIZE LBUFA JSB READF GO READ A RECORD DEF *+6 DEF DCBN,I DCB ADDRESS DEF FERR FILE STATUS AFTER READ LBUF1 NOP BUFFER ADDRESS GOES HERE DEF TEMP2 CURRENT MAX BUFFER LENGTH DEF TEMP3 ACTUAL SIZE OF RECORD LDA FERR GET FILE STATUS LDB TEMP3 GET LENGTH SSA,RSS ERROR? JMP LBUFF NO CCB YES...SET TO -1 JMP LBUFG AND TERMINATE LBUFF CPB TEMP2 ARE THE TWO EQUAL? CLB,RSS YES...LOST SOMETHING SZB NO, 0 LENGTH? RSS NO JMP LBUFA YES,GET NEXT ONE LBUFG STB TEMP1,I SET STATUS IN BUFFER SZB EOF OR BUFFER FULL? CPB M1 ? JMP LBUFB YES...EITHER BACKSPACE OR TERMINATE LDB TEMP3 GET RECORD LENGTH AGAIN ADB LBUF1 GET ADDRESS OF NEXT RECORD TO READ STB TEMP1 SAVE ADDRESS INB GET TO FIRST DATA WORD STB LBUF1 SAVE AS CURRENT BUFFER ADDESS LDB TEMP3 GET LENGTH OF LAST READ CMB NEGATE AND SUBTRACT 1 (INCLUDE COUNT WORD) ADB TEMP2 SAVE AS NEW LENGTH STB TEMP2 SAVE NEW LENGTH SSB,RSS SHOULD NEVER GO NEGATIVE JMP LBUFA BUT MAKE SURE ANYWAY * * AT THIS POINT THE BUFFER IS FULL OR AN * EOF HAS BEEN HIT...IN ANY CASE DON'T READ * ANY MORE NOW * LBUFB SZB EOF? JMP LBUFC YES...CLOSE FILE JSB POSNT NO...BACKSPACE ONE RECORD DEF *+4 DEF DCBN,I DCB ADDRESS DEF FERR DEF M1 CLB SET THE B REG...BUFFER FULL LDA FERR GET ERROR CODE SSA LDB M2 SET TO -2 IF ERROR JMP LBUF,I RETURN * * EOF HIT...CLOSE FILE * LBUFC JSB DALOC DEALOCATE DCB AND CLOSE FILE CCB SET B=-1...EOF LDA FERR GET ERROR CODE SSA LDB M2 SET TO -2 FOR STATUS IF ERROR JMP LBUF,I RETURN SKP * * SUBROUTINE TO MOVE BUFFER TO FILE * CALLING SEQUENCE * JSB SBUF * SBUF NOP LDA DBUFA GET DATA BUFFER ADDRESS STA TEMP1 SAVE BUFFER ADDRESS SBUFA LDA TEMP1,I GET LENGTH OF RECORD SZA,RSS DONE? JMP SBUF,I YES...RETURN ISZ TEMP1 GET ADDRESS OF 1ST DATA WORD STA TEMP2 SAVE LENGTH FOR WRITE INA,SZA,RSS EOF? JMP SBUFB YES...CLOSE FILE JSB WRITF WRITE THE RECORD DEF *+5 DEF DCBN,I DCB ADDRESS DEF FERR ERROR STATUS DEF TEMP1,I BUFFER ADDRESS DEF TEMP2 LENGTH OF WRITE GOES HERE LDA FERR GET ERROR CODE SSA ERROR? JMP SBUFB YES, TRY TO CLOSE FILE LDA TEMP2 GET LENGTH OF LAST WRITE ADA TEMP1 GET ADDRESS OF NEXT WRITE STA TEMP1 SAVE FOR NEXT WRITE JMP SBUFA CONTINUE WRITING ON FILE * * HERE WHEN EOF REACHED * SBUFB JSB DALOC DEALOCATE THE DCB CLB LDA FERR GET CLOSE ERROR CODE SSA SKIP IF OK LDB M2 SET FOR STATUS WORD STA FERR RESTORE ERROR CODE JMP SBUF,I RETURN SKP SPC 2 * * THIS SECTION CLOSES ALL FILES CURRENTLY * OPEN TO THE REMOTE LU # * CLSIT LDA SATA GET ADDRESS OF ACTIVE SATELLITES STA TEMP1 SAVE IN UP COUNTER LDA MMAXS GET MAX # OF ENTRIES INA STA TEMP2 SAVE IN DOWN COUNTER CLA SET UP FOR TABLE DISPLACEMENT STA TEMP3 CLOS1 LDA RLU GET REMOTE LU # CPA TEMP1,I IS THERE A MATCH RSS JMP CLOS2 NO, TRY NEXT ONE * LDA TEMP3 GET DISPLACEMENT ADA DCBBA GET TO DCB ADDRESS LDB A,I GET DCB ADDRESS STB CLSAL SAVE FOR CLOSE CLB DEALLOCATE DCB STB A,I CLEAR TABLE LOCATION STB TEMP1,I CLEAR SATELLITE ENTRY JSB CLOSE CLOSE DCB DEF *+3 CLSAL NOP DEF FERR LDA CALOC GET CURRENT # OF ACTIVE TERMINAL ADA M1 DECREASE IT BY 1 CPA M1 NONE ACTIVE? JMP CLOS3 YES. GO TO COMPLETION. STA CALOC SAVE NEW CURRENT # * CLOS2 ISZ TEMP1 NO...GET NEXT ENTRY ISZ TEMP3 ISZ TEMP2 DONE? JMP CLOS1 NO...CONTINUE * CLOS3 LDB M2 LDA FERR GET FMGR ERROR CODE SSA NO ERROR CPA M11 OR FILE ALREADY CLOSED CLB CPB M2 JMP TERM EXIT IF ERROR STB STAT OK IN STATUS WORD JSB WRPLY SEND REPLY JMP PLOS0 GO TO SLEEP SKP * SUBROUTINE TO ALOCATE DCB AND OPEN A FILE * CALLING SEQUENCE * JSB OPN * NORMAL RETURN * ERROR RETURN * OPN NOP JSB ALOC GO GET A DCB ADDRESS LDA DCBN GET DCB ADDRESS STA OPEN1 SAVE DCB ADDRESS JSB OPEN GO TRY TO OPEN FILE DEF *+7 OPEN1 NOP DCB ADDRESS HERE DEF FERR DEF PNAM NAME OF FILE DEF D0 DEF SC DEF LU LDA FERR ANY ERRORS? SSA,RSS JMP OPN,I NO...RETURN JSB DALOC YES...DEALOCATE THE DCB ISZ OPN SET FOR ERROR RETURN JMP OPN,I ERROR RETURN SKP * * SUBROUTINE TO CREATE A FILE * CALLING SEQUENCE * JSB CRET * NORMAL RETURN * ERROR RETURN * CRET NOP JSB ALOC GO GET A DCB LDA DCBN GET THE DCB ADDRESS STA CRET1 SAVE DCB ADDRESS LDA TYPE GET TYPE WORD SZA,RSS IS IT ZERO? LDA D11 YES...DEFAULT TO TYPE 11 STA TYPE SAVE TYPE WORD LDA SIZE GET SIZE WORD SZA,RSS IS IT ZERO? LDA D40 YES...DEFAULT TO 40 RECORDS STA SIZE SAVE SIZE WORD JSB CREAT CREATE THE FILE DEF *+8 CRET1 NOP DEF FERR DEF PNAM NAME TO BE USED DEF SIZE DEF TYPE TYPE IS DEFINED AS TYPE 9 DEF SC SECURITY CODE DEF LU LDA FERR GET FILE STATUS SSA,RSS ANY ERRORS? JMP CRET,I NO...RETURN JSB DALOC DEALOCTE DCB ISZ CRET SET FOR ERROR RETURN JMP CRET,I RETURN...ERROR SKP * * SUBROUTINE TO ALOCATE A DCB * CALLING SEQUENCE * JSB ALOC * ALOC NOP LDA DCBBA GET ADDRESS OF DCB AVAILABLE TABLE STA TEMP1 SAVE IN TEMP LOCATION LDA MMAXS GET MAX # OF ENTRIES STA TEMP2 SAVE IN DOWN COUNTER CLA GET A ZERO STA TEMP3 SAVE AS MULT. FACTOR ALOC1 ISZ TEMP2 DONE? JMP ALOC3 NO...CONTINUE LDB M3 YES...NO ROOM JMP TERM TELL OTHER SIDE TO TRY LATER ALOC3 LDA TEMP1,I GET CONTENTS OF TABLE SZA,RSS IS THERE SOMETHING THERE? JMP ALOC2 NO...GOOD FOUND A HOME!!! ISZ TEMP1 GET NEXT ADDRESS ISZ TEMP3 INCREMENT MULT COUNT JMP ALOC1 CONTINUE * * HERE IF WE HAVE ROOM * ALOC2 LDA TEMP3 GET MULT FACTOR MPY D144 GET DISPLACEMENT FROM FIRST ADA DCBA ADDRESS OF AVAILABLE DCB STA TEMP1,I SAVE IN TABLE TO HOLD A PLACE STA DCBN SAVE IN PARMB ISZ CALOC INCREMENT # OF ACTIVE TERMINALS NOP LDA TEMP3 GET DISPLACEMENT ADA SATA ADD FOR SATELLITE TABLE ENTRY LDB RLU GET REMOTE LU STB A,I SAVE PLACE IN TABLE JMP ALOC,I RETURN SPC 3 SKP * * SUBROUTINE TO DALOCATE A DCB * CALLING SEQUENCE * JSB DALOC * DALOC NOP LDA DCBBA GET ADDRES OF DCB ACTIVE TABLE STA TEMP1 SAVE IN TEMP LOCATION LDA MMAXS GET MAX # OF ENTRIES STA TEMP2 SAVE IN TEMP LOCATION LDA SATA GET ADDRESS OF SATELLITE OPEN TABLE STA TEMP3 DALC1 ISZ TEMP2 GONE THRU TABLE? JMP DALC2 NO....GOOD LDB M4 WE IN BIG TROUBLE...SHOULD NEVER GET HERE JMP TERM UNKNOWN DCB DALC2 LDA TEMP1,I GET ADDRESS IN TABLE CPA DCBN THE SAME? JMP DALC3 YES...DEALOCATE IT ISZ TEMP3 GET TO NEXT SATELLITE ENTRY ISZ TEMP1 GET NEXT BUFFER ADDRESS JMP DALC1 GO TRY AGAIN * * HERE FOR MATCH CONDITION * DALC3 JSB CLOSE CLOSE THE FILE DEF *+3 RETURN DEF DCBN,I DCB ADDRESS DEF DCBN IGNORE ANY ERRORS CLA GET A ZERO STA TEMP1,I CLEAR OUT TABLE LOCATION STA TEMP3,I CLEAR OUT SATELLITE ENTRY STA DCBN CLEAR OUT DCB POINTER LDA CALOC GET CURRENT # OF ACTIVE TERMINALS SZA [ PROTECT AGAINST A NEGATIVE COUNT ] ADA M1 DECREASE IT BY 1 STA CALOC SAVE AS CURRENT # OF ACTIVE JMP DALOC,I RETURN SKP * * SUBROUTINE TO SEND DATA TO TERMINAL * CALLING SEQUENCE * JSB WREC * WREC NOP LDA RLU GET LU AND B77 CLEAN IT IOR B300 SET FOR DATA ONLY STA CNWD JSB D65CL SEND EXEC CALL DEF *+7 DEF IWRIT WRITE REQUEST DEF CNWD DEF DBUF ADDRESS OF DATA BUFFER DEF BLEN DATA LENGTH DEF RBUF+33 PASS TIME-TAGS TO DRIVER DEF RBUF+34 NOP ERROR RETURN JMP WREC,I RETURN SPC 4 * * ROUTINE TO READ DATA FROM A TERMINAL * CALLING SEQUENCE * JSB RREC * RREC NOP LDA RLU AND B77 IOR B300 SET FOR DATA ONLY STA CNWD JSB D65CL DEF *+7 DEF IREAD READ DATA DEF CNWD DEF DBUF DEF BLEN DEF RBUF+33 PASS TIME-TAGS TO DRIVER DEF RBUF+34 NOP ERROR RETURN JMP RREC,I RETURN SKP * * SUBROUTINE TO SEND A REPLY TO THE TERMINAL * CALLING SEQUENCE * JSB WRPLY * B REG= STATUS * WRPLY NOP LDA RBUF SET IN REPLY BIT IOR BIT14 STA RBUF LDA RLU GET REMOTE LU STA RRLU SAVE IN REPLY BUFFER AND B77 STA CNWD SET CONTROL WORD (MODE 0) JSB D65SV SEND REPLY DEF *+7 DEF IWRIT WRITE DEF CNWD REQUEST ONLY DEF RBUF REQUST BUFFER DEF RBUFL REQUST BUFFER LENGTH DEF DUMMY DEF DUMMY NOP ERROR RETURN JMP WRPLY,I RETURN SPC 4 * * HERE TO TERMINATE ON AN ERROR CONDITION * B REG=STATUS * TERM STB STAT SAVE STATUS LDA RLU GET LU AND B77 CLEAN IT STA CNWD SAVE THE CONTROL WORD. JSB D65CL TELL OTHER SIDE, NO DATA DEF *+7 DEF ICONT CONTROL REQUEST DEF CNWD SEND STOP DEF DUMMY DEF DUMMY DEF DUMMY DEF DUMMY NOP ERROR RETURN JSB WRPLY SEND REPLY...REASON FOR STOP JMP PLOS0 WAIT FOR SOMEONE ELSE SPC 3 SKP * * TEMP VALUES,CONSTANTS,BUFFERS, WHAT EVER * MAXN EQU 2 MAX # OF OPEN TERMINALS BUFS EQU 512 SIZE OF DATA BUFFER SPC 1 CLSNM NOP CLASS NUMBER BIT14 OCT 40000 D21 DEC 21 D1 DEC 1 D2 DEC 2 D11 DEC 11 D40 DEC 40 D144 DEC 144 M1 DEC -1 M2 DEC -2 M3 DEC -3 M4 DEC -4 M11 DEC -11 MMAXS ABS 0-MAXN-1 MAX # OF TERMINALS + 1 MBUFS ABS 0-BUFS-1 DATA BUFFER SIZE CALOC OCT 0 CURRENT # OF ACTIVE DCB'S TEMP0 NOP TEMP1 NOP TEMP2 NOP TEMP3 NOP D0 OCT 0 DBUFA DEF DBUF D35 DEC 35 IREAD OCT 100001 READ / RETURN IF ERROR IWRIT OCT 100002 WRITE / RETURN IF ERROR ICONT OCT 100003 CONTROL / RETURN IF ERROR RBUFL ABS RBFL REQUEST BUFFER LENGTH DCBBA DEF DCCB DCBA DEF DCBF SATA DEF SAT CNWD NOP B77 OCT 77 B300 OCT 300 DUMMY NOP SKP * * HERE WE DEFINE THE PARMB * . EQU * RBUF NOP STREAM ID DCBN NOP DCB ADDRESS LSFG NOP LOAD-SAVE FLAG,OVERIDE FLAG FERR NOP FILE MANAGER STATUS STAT NOP STATUS PNAM NOP PROGRAM NAME BSS 2 SC NOP SECURITY CODE LU NOP LOGICAL UNIT TYPE NOP FILE TYPE SIZE NOP FILE SIZE BLEN NOP BUFFER LENGTH BSS 3 NOT USED RRLU NOP REMOTE LU RBFL EQU *-. LENGTH OF REQUEST BUFFER BSS 7 NOT USED RLU NOP REMOTE LU (PARMB + 24) BSS 10 REMAINDER OF PARMB (TIME TAGS) SPC 2 * * DEFINE SATELLITE OPEN TABLE * SAT REP MAXN NOP SPC 2 * DEFINE DCB TABLE DCCB BSS 0 REP MAXN NOP SPC 2 * DEFINE DCB AREA DCBF BSS 0 REP MAXN BSS 144 SPC 2 * DEFINE DATA BUFFER DBUF BSS 512 END EQU * END PLOSB