ASMB,R,L,C HED LO.. SUBROUTINE TO LOAD PROGRAMS FROM A REMOTE NODE * NAME: LO.. * SOURCE: 91750-18131 * RELOC: 91750-1X131 * PGMR: GERRY BELDEN * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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. * * *************************************************************** * NAM LO..,7 91750-1X131 REV.2013 800316 L * SKP * ENT LO.. * EXT $LIBR,$LIBX,IDSGA,NAM..,$.LOA,.ENTR EXT O.BUF,WRITF,CNUMD EXT $ID#,$IDA EXT $CKSM,IDMEM,.MVW EXT $FWBG,$BGBP,D$OVR EXT #NCNT,SECUR,FINFO EXT DOPEN,DREAD,DCLOS SUP * * * PURPOSE: * TO ACCOMPLISH THE EQUIVALENT OF A FMGR ":RP,PROG" REMOTELY IN A * SUBROUTINE. CALL IS STANDARD "L-ACTION ROUTINE" FORMAT. * THE PROGRAM IS LOADED INTO MEMORY AFTER THE ID SEGMENT * IS LOADED. LO.. WILL HANDLE R.T. PROGRAMS OR B.G. BUT * B.G. IS ONLY ALLOWED IF "LOAD/SWAP" IS NOT IN THE SYSTEM. * * WORDS SET BY LO..: * * LONG ID SEGMENT * 7 PRIORITY CHANGED IF 0 TO 99 * 13-15 PROGRAM NAME FROM LOAD FILE NAME * 16 ID BIT ALWAYS LEFT RESET, MR BIT SET * 28 DISC LU LEFT 0 * * * SHORT ID SEGMENT * 7 SEGMENT MAIN'S LOAD FILE BLOCK # FOR SEGLD * 8 SHORT ID SEGMENT'S CHECKSUM (ONE'S COMPLEMENTED) * FOR SEGLD. * SKP DUMMY NOP NAME NOP ER NOP LO.. NOP ENTRY POINT JSB .ENTR DEF DUMMY GET PARAMETERS LDA NAME ADVANCE TO INA THE NAME STA ANAME MOVE THE NAME LDB ER TO THE 2ND INB THROUGH 4TH JSB .MVW RETURN PARAMETERS DEF D3 NOP * LDA ANAME,I AND B77 TEST FOR LU CPA ANAME,I JMP ERR00 ANY LU IS ILLEGAL ! LDA #NCNT IS THIS NODE INITIALIZED ? SZA,RSS YES -- GO OPEN FILE JMP ERR01 NO -- DSPLY MSG & ABORT * CLA,INA TURN ON REMOTE SESSION STA D$OVR OVERIDE FOR FILE ACCESS JSB DOPEN OPEN THE ABS INPUT FILE DEF *+7 DEF DCB DEF IERR ANAME NOP A(FILE NAME) DEF D4 FORCE FILE TO TYPE 1 DEF SECUR SECURITY CODE DEF FINFO CRN & FILE NODE (2 WORDS) LDA IERR ANY ERROR ? SSA JMP ERR50 RFA ERROR SKP * * WORK ON LONG ID * JSB DREAD READ IN SKELETON ID DEF *+6 DEF DCB DEF IERR DEFID DEF IDBUF DEF D34 LENGTH OF ID + 4 EXTRA WORDS DEF LEN * LDA IERR ANY ERROR ? SSA JMP ERR50 RFA ERROR * CLA,CCE CLEAR SUM TOTAL JSB SUM CALCULATE CHECKSUM DEF IDBUF DEC -31 CPA ID+32 EQUAL TO WORD 32 ? CLA,RSS YES JMP ERR12 NO LDA $CKSM GET SYSTEM CHECKWORD CPA ID+31 COMPARE ? RSS JMP ERR12 * * TEST FOR BACKGROUND PROGRAM - IF SO, ONLY LEGAL * TO LOAD IF 'LOAD' & 'SWAP' MODULES NOT IN SYSTEM * AND NO OTHER BG PROGRAM IS LOADED * LDA $FWBG START OF BACKGROUND CMA,INA COMPARE WITH LOW MAIN ADA ID+21 SSA JMP LO..1 REAL TIME SO OK LDA $ID# GET NEGATIVE NUMBER CMA,INA OF ID SEGMENTS STA LPCNT FOR COUNTER LDB $IDA POINT TO LO MAIN ADDRESS ADB D20 OF FIRST ID SEGMENT LO..5 LDA B,I IS THIS CPA $FWBG A BACKGROUND PROGRAM? RSS YES JMP LO..6 NO, NO PROBLEM ADB M8 YES, GET FIRST WORD LDA B,I OF NAME SZA NON-ZERO? JMP ERR40 YES, PROGRAM CONFLICT ADB D8 NO, GO BACK TO LOW MAIN ADDRESS LO..6 ADB D30 ADVANCE TO NEXT ID SEGMENT ISZ LPCNT MORE TO DO? JMP LO..5 YES LDA $.LOA 'LOAD MODULE IN SYSTEM' FLAG SZA 0 IS YES JMP LO..2 BACKGROUND OK ! JMP ERR13 ILLEGAL BG LOAD ATTEMPT * * TEST FOR SEGMENTED PROGRAM AND IF SO RAISE HIGH * MAIN TO LIMIT OF REAL-TIME AREA FOR PROGRAM * CONFLICT CHECKS LATER. * LO..1 LDA ID+24 FIND # OF SEGMENTS AND B176K SZA,RSS JMP LO..2 NONE LDA $FWBG YES, CHANGE UPPER LIMIT STA ID+33 LDA $BGBP ALSO OF BASE PAGE STA ID+34 SKP * * SET UP PROGRAM NAME * LO..2 JSB NAM.. CHECK FOR LEGAL NAME DEF *+2 DEF ANAME,I PROGRAM NAME IS FILE NAME SZA NAME OK ? JMP ERR00 NO LDB ANAME GET 1ST 2 CHARS OF NAME LDA B,I STA ID+13 SAVE THEM INB DLD B,I NOW GET THE REST STA ID+14 LDA B LAST CHAR. AND UBYTE CLEAR LOWER BYTE STA ID+15 * * CHECK PRIORITY, SET TO 99 IF 0 * LDA ID+7 GET PRIORITY SZA,RSS TEST FOR ZERO LDA D99 IF SO SET IT TO 99 STA ID+7 * * GO PRIVILEGED TO WRITE THE ID SEGMENT * JSB $LIBR NOP * JSB IDSGA SEARCH FOR DUPLICATE PROGRAM NAMES DEF *+2 DEF ANAME,I SEZ,CME IF NOT FOUND, CLEAR E-REG JMP RTPRG AND CHECK MEMORY BOUNDS LDA M61 SET ERROR STA ER,I CODE DLD DUP IF FOUND, RETURN DUPLICATE ERROR JMP PEXIT WITH E-REG = 1 * * TEST FOR REAL-TIME PROGRAM MEMORY CONFLICT * RTPRG JSB IDMEM TEST FOR REAL-TIME MEMORY BOUNDS DEF *+2 CONFLICTS DEF IDBUF PASS IT THE BUILT UP ID SEGMENT CCE,SZA,RSS IF NO CONFLICT FOUND (OR NOT R.T.) JMP SERCH THEN SEARCH FOR FREE ID SEG. LDB A PUT NAME ADDRESS IN B CLA & FLAG SPECIAL 'REMOVE' MESSAGE JMP PEXIT WITH E-REG = 1 SKP * * SEARCH FOR FREE ID SEGMENT * SERCH JSB IDSGA CALL FOR MATCH OF BLANK NAME DEF *+2 DEF ZERO ARRAY OF THREE ZEROS SEZ,RSS IF FOUND, GO MOVE ID DOWN JMP MOVE LDA M64 SET ERROR STA ER,I CODE DLD NOID OTHERWISE 'NO ID' MESSAGE & EXIT JMP PEXIT E-REG = 1 * * MOVE ID SEGMENT INTO SYSTEM * MOVE STA B SAVE COPY OF ID ADDRESS STB IDSEG SAVE FOR COMPLETION LDA DEFID SET A TO SOURCE (B TO DEST.) JSB .MVW MOVE THE ID SEGMENT DEF D30 NOP CLA,CLE SET UP FOR GOOD RETURN PEXIT JSB $LIBX DONE! DEF *+1 DEF LO..3 * LO..3 SEZ,RSS CHECK FOR AN ERROR JMP LO..4 NONE SZA 'REM' ERROR ? JMP ERR30 ID SEG ERROR JMP ERR40 MEMORY CONFLICT ('REM') SKP * * LOAD BASE PAGE * FIND BLOCK # OF BP, POSITION FILE PTR, LOAD IT * LO..4 LDA D2 SET SECTOR POINTER STA SECTR TO START OF MAIN LDA ID+22 HIGH MAIN STA HMAIN LDB ID+21 LOW MAIN STB LMAIN JSB BUMP GET NEXT BLOCK # LDA SECTR SET UP FILE POSITIONING STA IREC LDA ID+24 LOW BASE PAGE STA LBSPG AND BPMSK (B1777) LDB A LDA ID+25 HIGH BASE PAGE STA HBSPG JSB LODIT LOAD IT ! * * LOAD THE MAIN * LDA D2 BLOCK # OF MAIN STA IREC SET UP FILE POSITIONING LDA HMAIN HIGH MAIN LDB LMAIN LOW MAIN JSB LODIT LOAD IT ! SKP * * SET UP BLOCK NUMBERS OF SEGMENT MAINS & PLACE IN * SHORT IDS * LDA LBSPG FIND # OF SEGMENTS ALF,ALF RAR,RAR AND B77 SZA,RSS ARE THERE ANY ? JMP DONE SET MR BIT & EXIT CMA,INA NEGATE & SAVE AS LOOP COUNT STA LPCNT LDA LMAIN LOW MAIN ADDRESS (1ST SHORT ID) STA SEGAD SAVE FOR CHECKSUM * * FIND BLOCK # OF 1ST SEGMENT MAIN * LDA LBSPG LOW BP ADDRESS AND BPMSK LDB A LDA HBSPG HIGH BP JSB BUMP SECTR NOW IS BLOCK # OF 1ST * SEGMENT MAIN * * FIX UP SHORT IDS * LOOP LDB SEGAD CURRENT SHORT ID STB SIDAD SAVE FOR CHECKSUM CALL ADB D4 STB TEMP SAVE A(SEG HIGH MAIN) ADB D2 STA B,I SAVE SEG MAIN BLK# (FROM BUMP CALL) INB POINT TO CHECKSUM WORD STB SEGAD CLA JSB SUM DO CHECKSUM SIDAD NOP DEC -7 CMA DS REQUIRES ONE'S COMPLEMENT STA SEGAD,I ISZ SEGAD NEXT SHORT ID LDA TEMP,I SEGMENT HIGH MAIN+1 LDB HMAIN SEGMENT START ADDRESS JSB BUMP ADVANCE FILE BLOCK # ISZ TEMP A(HIGH BASE PAGE+1) LDA TEMP,I LDB HBSPG SEG. B.P. START JSB BUMP ADVANCE FILE BLOCK # * (BLOCK # FOR NEXT SEG IN A) ISZ LPCNT DONE ? JMP LOOP SKP * * SET UP DS RESERVED AREA FOLLOWING SHORT IDS * LDA ANAME PICK UP 6TH CHAR OF FILE NAME ADA D2 LDA A,I AND B377 STA SEGAD,I PLACE IN 1ST WORD OF BLOCK LDB SEGAD BLOCK ADDRESS STB TEMP SAVE FOR CHECKSUM ISZ SEGAD POINT TO 2ND WORD LDA SECUR SAVE FILE SECURITY CODE STA SEGAD,I ISZ SEGAD 3RD WORD DLD FINFO SAVE FILE CRN & NODE # DST SEGAD,I CLA CLEAR CHECKSUM JSB SUM TEMP NOP START ADDR OF RESERVED BLOCK DEC -7 CMA ONE'S COMPLEMENT FOR DS SEGLD LDB SEGAD ADB D5 POINT TO CHECKSUM WORD STA B,I SAVE IT SKP * * DONE LOADING & FIXING UP SEGMENTS AS WAS REQUIRED * - NOW DO CLEANUP & EXIT * DONE DLD DNMSG MESSAGE ADDRESS DST MESS1 LDA AD5 A(LENGTH) STA LENGT A(MESSAGE LENGTH) JSB MSOUT DISPLAY THE MESSAGE LDB IDSEG FIND ADDRESS OF ID SEG STATUS WRD ADB D15 JSB $LIBR GO PRIVELEGED NOP LDA B,I IOR SBIT SET MR BIT (#15) STA B,I JSB $LIBX DEF *+1 DEF EXIT * * EXIT * EXIT JSB DCLOS CLOSE INPUT FILE IF ANY DEF *+3 DEF DCB DEF IERR * CLA TURN OFF SESSION OVERIDE STA D$OVR JMP LO..,I SKP * * ERROR PROCESSING * ERR00 LDA M65 SET ERROR STA ER,I CODE DLD BDNM ILLEGAL FILE NAME JMP ERR30 ERR01 DLD NODE NODE NOT INITIALIZED JMP ERR30 ERR12 LDA M66 SET ERROR STA ER,I CODE DLD CKSM ID CHECKSUM OR SYSTEM JMP ERR30 CHECKWORD MISMATCH ERR13 LDA M62 SET ERROR STA ER,I CODE DLD NOBG ILLEGAL ATTEMPT TO LOAD BG * ERR30 DST MESS1 SAVE IN MESSAGE BUFFER LDA AD5 STANDARD LENGTH ECONT STA LENGT SAVE LENGTH DEF JSB MSOUT DLD ABORT LOAD ABORT MESSAGE DST MESS1 SAVE IT LDA AD5 STA LENGT LENGTH OF MESSAGE JSB MSOUT JMP EXIT ALL DONE * * * REMOVE CONFLICTING PROGRAM * * ENTERED WITH B POINTING TO NAME OF PROGRAM * TO BE REMOVED * ERR40 LDA B REMOVE PROGRAM: MEMORY BOUNDS LDB AMES2 CONFLICT JSB .MVW MOVE THE NAME TO MSG BUFFER DEF D3 NOP LDA AMES2 ALSO MOVE TO LDB ER RETURN PARAMETERS INB 2 THROUGH 4 JSB .MVW DEF D3 NOP LDA M60 SET ERROR STA ER,I CODE DLD REM 'REMOVE' MESSAGE DST MESS1 LDA AD8 MESSAGE LENGTH JMP ECONT OUTPUT IT * * RFA / DS ERROR EXIT * ERR50 LDA IERR GET RFA ERROR STA ER,I SET IT FOR APLDR CMA,INA & MAKE IT POSITIVE STA IERR JSB CNUMD CONVERT TO ASCII DEF *+3 DEF IERR DEF MESS1 MESSAGE BUFFER DLD ERMSG OVERLAY MSG ONTO 1ST DST MESS1 TWO WORDS OF BUFFER LDA AD6 JMP ECONT SKP * * ERROR MESSAGES * BDNM ASC 2,BDNM NODE ASC 2,NODE ERMSG ASC 2,ERR- CKSM ASC 2,CKSM DNMSG ASC 2,DONE ABORT ASC 2,ABRT REM ASC 2,REM DUP ASC 2,DUP NOID ASC 2,NOID NOBG ASC 2,NOBG SKP * * BUMP - BUMP BLOCK NUMBERS TO POINT AT THE VARIOUS MAINS, BASE * PAGES, AND SEGMENTS CONTAINED WITHIN A TYPE 6 FILE. * * * CALLING SEQUENCE: * A = HIGH ADDRESS + 1 * B = LOW ADDRESS * JSB BUMP * * ON RETURN: A = BLOCK # AND SECTR = BLOCK # * B IS DESTROYED * * BUMP NOP CMB,INB SET THE LOW ADDRESS NEGATIVE ADA B AND ADD TO HIGH ADDRES. CLB CLEAR FOR DIVIDE DIV D128 FIND # OF BLOCKS SZB IF REMAINDER IS ZERO OK INA OTHERWISE, ADD 1 MORE BLOCK ADA SECTR CURRENT + OLD STA SECTR JMP BUMP,I RETURN SKP * * MESSAGE OUTPUTTER * MSOUT NOP CLA TURN OFF OVERIDE TEMPORARILY STA D$OVR JSB WRITF OUTPUT THE MESSAGE DEF *+5 DEF O.BUF DEF IERR DEF MESSG LENGT NOP CLA,INA TURN SESSION OVERIDE BACK ON STA D$OVR JMP MSOUT,I * * MESSG ASC 3, LOAD MESS1 BSS 2 MESS2 BSS 3 AMES2 DEF MESS2 SKP * * LODIT - LOAD MEMORY FROM A REMOTE FILE * * LODIT LOADS PROGRAM OR BASE PAGE FROM A REMOTE FILE AS * FOLLOWS: IT TAKES THE HIGH & LOW LOAD ADDRESSES FROM * THE A & B REGISTERS, THE STARTING LOAD FILE RECORD # * FROM IREC AND TRANSFERS THE DATA BLOCK BY BLOCK UNTIL * COMPLETE. THE FILE MUST BE AN ALREADY OPENED TYPE 6 * FILE (FORCED TO TYPE 1) AND NO CHECKING IS DONE AS TO * WHETHER THE HIGH & LOW LOAD ADDRESSES ARE CORRECT. * * CALLING SEQUENCE: * A = HIGH ADDRESS + 1 * B = LOW ADDRESS * IREC = LOAD FILE RECORD # * * JSB LODIT * ON RETURN: * CONTENTS OF BOTH REGS. DESTROYED * LODIT NOP STA HIHAD SAVE HIGH ADDRESS LDA D128 INITIALIZE TRANSFER SIZE STA SVAMT * * READ / LOAD LOOP * LODLP STB LOWAD SAVE LOW ADDRESS CMB,INB ADB HIHAD HIGH - LOW SZB,RSS ANYTHING LEFT ? JMP LODIT,I NOPE, DONE ! SSB JMP LODIT,I DONE ! LDA D128 LESS THAN 128 WORDS LEFT ? CMA,INA ADA B SSA STB SVAMT YES, ONLY TRANSFER REMAINDER * JSB DREAD READ IN A BLOCK DEF *+7 (OR PARTIAL BLOCK) DEF DCB DEF IERR DEF IDBUF INPUT BUFFER DEF SVAMT # WORDS (