ASMB,R,L,C HED PLOS 91700-16101 REV A * (C) HEWLETT-PACKARD CO. 1976 NAM PLOS,2,30 91700-16101 REV A 760329 SPC 1 ****************************************************************** * * (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 WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 SPC 1 ************************************************** * *PLOS PROGRAM LOAD SAVE FOR BASIC * *SOURCE PART # 91700-18101 REV A * *REL PART # 91700-16101 REV A * *WRITTEN BY: LARRY POMATTO * *DATE WRITTEN: 12-17-74 * *MODIFIED BY JEAN-PIERRE BAUDOUIN * *DATE MODIFIED: DECEMBER 1975 * *************************************************** SPC 1 SUP SPC 2 * * PROGRAM TO DO LOADS AND SAVE ON UP TO * MAXN TERMINALS. WHERE MAXN IS THE NUMBER OF TERMINALS * WHICH CAN OPERATE AT ANY ONE TIME * REMEMBER EACH TERMINAL TAKE 145 WORDS!!! * CENTRAL PROGRAM WHEN SCHEDULED MUST BE * PASSED THE CLASS NUMBER * SPC 2 * DEFINE ENTRY POINTS SPC 2 * DEFINE EXTERNALS SPC 1 EXT EXEC,READF,POSNT,CLOSE,WRITF EXT OPEN,CREAT,D65SV EXT D65CL SPC 2 * DEFINE A AND B REG SPC 1 A EQU 0 B EQU 1 SKP * * PROGRAM STARTS HERE * PLOS LDA B,I GET CLASS NUMBER STA CLSNM SAVE CLASS NUMBER JMP PLOSS AND WAIT FOR FIRST USER * * 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 * LDA RLU GET COMM. LU AND MSK1 KEEP ONLY LOW 6 BITS STA RLU * * * 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 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 PSAV3 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 OPN CHECK FOR TYPE 0 FILE RSS POSSIBLE JMP PSAV4 TRY TO CREATE IT LDA DCBN SEE IF TYPE 0 ADA D2 LDA A,I SZA TYPE ZERO? PSAV4 JSB CRET NO...TRY TO CREATE IT JMP PLOS1 OK..GO TO IT JSB DALOC CLOSE FILE IF OPEN JMP PSAV2 TERMINATE * * AT THIS POINT THE DCB IS DEFINED * THE FILE IS OPENED AND WE ARE READ TO DO * OUR THING. * PLOS1 LDA LSFG LOAD OR SAVE? SSA JMP PLOS2 SAVE JSB LBUF LOAD THE BUFFER FROM THE DISC STB STAT SAVE THE FILE STATUS 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 JSB WRPLY SEND REPLY JMP PLOS0 GO WAIT FOR MORE SKP * * 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 MAKE SURE DON'T OVERWRITE BUFFER STA TEMP2 SAVE CURRENT BUFFER SIZE LBUFA JSB READF GO READ A RECORD DEF *+6 DEF DCBN,I DCB ADDRESS GOES HERE 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 EOF? JMP LBUFF NO CCB YES...SET TO -1 JMP LBUFG AND TERMINATE LBUFF CPB TEMP2 ACTUAL=REQUESTED LENGTH? CLB,RSS YES...SET THAT WE LOST SOMETHING SZB IF LENGTH NOT MATCH, IS IT A ZERO LN REC.? RSS NO...CONTINUE PROCESSING JMP LBUFA YES, ZERO LENGTH RECORD...IGNORE IT LBUFG STB TEMP1,I SET STATUS IN BUFFER SZB EOF OR BUFFER FULL? CPB M1 ? JMP LBUFB YES...EITHER BACKSPACE OR TERMINATE JSB LIMCK CHECK IF IN LIMITS JMP LBUFA NOT IN LIMITS...IGNORE 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 DEF FERR DEF M1 CLB SET THE B REG...BUFFER FULL JMP LBUF,I RETURN * * EOF HIT...CLOSE FILE * LBUFC JSB DALOC DEALOCATE THE DCB CCB SET B=-1...EOF 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 INA,SZA,RSS EOF? JMP SBUFB YES...CLOSE FILE STA TEMP2 SAVE LENGTH FOR WRITE LDB C4040 GET TWO SPACES STB TEMP1,I MOVE SPACES INTO LENGTH WORD JSB WRITF WRITE THE RECORD DEF *+5 DEF DCBN,I DEF FERR ERROR STATUS DEF TEMP1,I BUFFER ADDRESS DEF TEMP2 LENGTH OF WRITE GOES HERE 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 JMP SBUF,I RETURN 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 D9 YES...DEFAULT TO TYPE 9 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 * * BEFORE WE ALOCATE A DCB, CHECK IF ONE IS * ALREADY ALOCATED * LDA SATA GET ADDRESS OF ACTIVE SATELITE TABLE 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 LDA RLU GET REMOTE LU # ALOC4 CPA TEMP1,I IS THERE A MATCH JMP ALOC5 YES...DCB ALOCATED FOR TERMINAL ALREADY ISZ TEMP1 NO...GET NEXT ENTRY ISZ TEMP3 ISZ TEMP2 DONE? JMP ALOC4 NO...CONTINUE * * TERMINAL DOESN'T ALREADY HAVE A DCB...TRY TO FIND ONE * 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 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 * * TERMINAL ALREADY HAS A DCB...CLOSE IT AND REUSE IT * ALOC5 LDA TEMP3 GET DISPLACEMENT ADA DCBBA GET TO DCB ADDRESS LDA A,I GET DCB ADDRESS STA DCBN SAVE DCB ADDRESS IN PARMB STA CLSAL SAVE FOR CLOSE JSB CLOSE CLOSE CURRENTLY OPEN DCB DEF *+3 CLSAL NOP DEF FERR JMP ALOC,I DCB IS NOW ALOCATED 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 FILE...IF OPEN DEF *+3 DEF DCBN,I DCB ADDRESS DEF DCBN IGNORE ERROR 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 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 IOR MSK2 DATA ONLY STA IMODE * JSB D65CL SEND DATA CALL DEF *+7 DEF IRWW WRITE DEF IMODE DEF DBUF DEF BLEN DEF RBUF+33 PASS TIME-TAGS DEF RBUF+34 * JMP BAD ERROR RETURN JMP WREC,I RETURN SPC 4 * * ROUTINE TO READ DATA FROM A TERMINAL * CALLING SEQUENCE * JSB RREC * RREC NOP * LDA RLU IOR MSK2 STA IMODE * JSB D65CL READ DATA DEF *+7 DEF IRWR DEF IMODE DEF DBUF DEF BLEN LENGTH DEF RBUF+33 PASS TIME-TAGS DEF RBUF+34 * JMP BAD ERROR RETURN JMP RREC,I RETURN SPC 3 BAD JSB CMER JMP PLOS0 SKP * * SUBROUTINE TO DO LIMIT CHECKING * CALLING SEQUENCE * JSB LIMCK * OUT OF RANGE RETURN * IN RANGE RETURN * B REG=BUFFER LENGTH ON ENTRY * LIMCK NOP LDA LBUF1 GET STARTING BUFFER ADDRESS CLE,ELA CONVERT TO BYTE ADDRESS STA LMCKA SAVE AS STARTING BYTE ADDRESS CLE,ELB CONVERT LENGTH TO BYTE LENGTH CMB,INB NEGATE LENGTH STB LMCKC SAVE IN DOWN COUNTER LDA ULIM GET UPPER LIMIT SZA,RSS ANY LIMITS? JMP INRNG NO...ALL LINES IN RANGE CLA GET A ZERO STA LMCKB CLEAR BINARY SUM...LINE # LMCK1 LDB LMCKA GET BYTE ADDRESS ISZ LMCKA GET NEXT BYTE ADDRESS ISZ LMCKC OUT OF BUFFER? RSS NO JMP LIMCK,I YES...TREAT AS OUT OF RANGE JSB ABYTE GET A CHARACTER CPA C40 IS IT A SPACE? JMP LMCK1 YES...IGNORE SPACES STA B MOVE CHAR TO B REG ADB MC60 ADD TO -60B ADA MC72 ADD TO -72B SSA OUT OF RANGE? SSB TO LOW? JMP CKRNG LAST NUMERIC...CHECK RANGE LDA LMCKB GET PARTICAL SUM STB LMCKB SAVE CURRENT VALUE MPY D10 MOVE OVER A PLACE FOR NEXT CHAR ADA LMCKB ADD IN CURRENT NUMBER STA LMCKB SAVE AS PARTICAL JMP LMCK1 GET NEXT CHAR SPC 2 * AT THIS POINT WE HAVE BINARY LINE NUMBER SPC 1 SPC 1 CKRNG LDA LMCKB GET LINE NUMBER CMA,INA CONVERT TO NEGATIVE VALUE STA B GET IT IN B REG ADA M1 ADD 1 FOR CHECKING LOWER LIMIT ADA LLIM ADD IN LOWER LIMIT...+..OUT OF RANGE ADB ULIM ADD IN UPLIM...-..OUT OF RANGE SSA SSB JMP LIMCK,I OUT OF RANGE INRNG ISZ LIMCK IN RANGE...IN RANGE RETURN JMP LIMCK,I SPC 2 LMCKA NOP LMCKB NOP LMCKC NOP * * 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 LDB D35 GET FRIENDLY REPLY SIZE(35WDS) ALF POSITION FRIENDLY BIT(#11) TO SIGN. SSA,RSS IF REPLY GOING TO AN ALIEN SATELLITE, LDB D21 MAX. REPLY LENGTH IS 21 WORDS. STB RBUFL CONFIGURE THE REPLY LENGTH. JSB D65SV SEND REPLY DEF *+7 DEF IRWW DEF RLU REQ ONLY DEF RBUF DEF RBUFL LENGTH DEF DUMMY DEF DUMMY JSB CMER ERROR RETURN * JMP WRPLY,I RETURN SPC 4 * * HERE TO TERMINATE ON AN ERROR CONDITION * B REG=STATUS * TERM STB STAT SAVE STATUS JSB D65CL TELL OTHER SIDE, NO DATA DEF *+7 DEF ICR SEND STOP DEF RLU DEF DUMMY DEF DUMMY DEF DUMMY DEF DUMMY * JSB CMER ERROR RETURN JSB WRPLY SEND REPLY...REASON FOR STOP JMP PLOS0 WAIT FOR SOMEONE ELSE SPC 3 * * SUBROUTINE TO GET A CHARACTER * CALLING SEQUENCE * JSB ABYTE * B REG= BYTE ADDRESS....UPON RETURN A REG=CHAR * ABYTE NOP CLE,ERB CONVERT TO WORD ADDRESS LDA B,I GET CHARACTER SEZ,RSS UPPER HALF? ALF,ALF YES AND B377 MASK OFF UPPER HALF ELB,CLE GET BYTE ADDRESS AGAIN JMP ABYTE,I RETURN SPC 3 CMER NOP DST ERVAL JSB EXEC DEF *+5 DEF D2 DEF D1 DEF ERMS DEF ERML * JMP CMER,I SPC 3 ERMS ASC 9,PLOS : COMM. ERROR ERVAL BSS 2 ERML DEC 11 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 B377 OCT 377 BIT14 OCT 40000 D21 DEC 21 D1 DEC 1 D2 DEC 2 D9 DEC 9 D10 DEC 10 D35 DEC 35 D40 DEC 40 D144 DEC 144 MC60 OCT -60 MC72 OCT -72 C40 OCT 40 C4040 ASC 1, M1 DEC -1 M2 DEC -2 M3 DEC -3 M4 DEC -4 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 TEMP1 NOP TEMP2 NOP TEMP3 NOP D0 OCT 0 DBUFA DEF DBUF RBUFL NOP REPLY LENGTH: 35WD-FRIEND/21WD-ALIEN. DCBBA DEF DCCB DCBA DEF DCBF SATA DEF SAT IRWW OCT 100002 IRWR OCT 100001 DUMMY OCT 0 MSK1 OCT 77 MSK2 OCT 300 ICR OCT 100003 IMODE NOP SPC 2 * * HERE WE DEFINE THE PRMB * 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 LLIM NOP LOWER LIMIT ULIM NOP UPPER LIMIT BSS 9 NOT USED RLU NOP REMOTE LU BSS 10 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 PLOS