Found at http://www.interex.org/tech/csl/RTE/submits2001.html FST archive at ftp://ftp.interex.org/pub/rtecsl/rev2001_x145.fst Edited submission description.... **DATE CODE: 2001 **PROGRAM TITLE: OCTAL ASSEMBLY PROCESSOR AND UTILITY SYSTEM **PACKAGE: 99 **CATEGORY: 5 **SUBCATEGORY: 4 **LANGUAGES: ASMB(ABS) **OPERATING SYSTEMS: SELF-CON **MEMORY REQUIREMENTS: 4K **ABSTRACT: OCTAPUS IS A TROUBLESHOOTING AID WHICH ELIMINATES TIME CONSUMING TOGGLING FROM THE SWITCH REGISTER. IT IS A SELF-CONFIGURING, SELF- CONTAINED PROGRAM RESIDING WITHIN THE BOUNDS OF A SINGLE PAGE IN CORE. COMMUNICATION IS CONVERSATIONAL THROUGH THE TELEPRINTER. THE FOLLOWING FUNCTIONS CAN BE PERFORMED: ASSEMBLY INTO CORE, PUNCH ABSOLUTE TAPE FROM CORE, LOAD ABSOLUTE TAPE TO CORE, VERIFY ABSOLUTE TAPE TO CORE, LIST MEMORY BOUNDS OF ABSOLUTE TAPE, DUMP CORE TO TELEPRINTER (OCTAL AND INVERSE ASSEMBLY), JUMP TO ANY LOCATION IN CORE, AND SEARCH CORE FOR ANY OCTAL VALUE. IN ADDITION, IT PROVIDES THE CAPABILITY OF HANDLING EAU INSTRUCTIONS, TO REVERSE THE SKIP SENSE OF ASG INSTRUCTIONS, TO DO AN INVERSE ASB. OF A BINARY TAPE WITHOUT LOADING IT, AND TO RELOCATE SECTIONS OF CORE EITHER ONLINE OR BY THE PRODUCTION OF A BINARY TAPE. **PROGRAM DESCRIPTION: ASSEMBLE AND LOAD OCTAPUS-C: SET THE TTY SELECT CODE IN THE S-REGISTER, 2 IN P-REGISTER AND PRESS RUN. IN RESPONSE TO QUESTIONS SUPPLY THE SELECT CODES FOR PAPER-TAPE READER, PUNCH AND LINE PRINTER IF AVAILABLE (FORMAT 3). TTY WILL PRINT "*** OCTAPUS-C *** ?" AND WAIT FOR CONTROL COMMANDS. AT THIS STAGE A CONFIGURED TAPE MAY BE PUNCHED OR THE PROGRAM CAN BE SELF-RELOCATED TO ANOTHER PAGE (SEE EX 1: 14000 IS COMPATIBLE WITH 8K BASIC). THE SUBSEQUENT ENTRY POINT TO THE PROGRAM IS ITS HEAD (4000B OR NEW RELOCATED ORIGIN). THE FOLLOWING CONTROL COMMANDS MAY BE USED TO PERFORM THE FUNCTIONS DESCRIBED. CONTROL + A ASSEMBLY THE TTY ASKS FOR A STARTING ADDRESS (FORMAT 3), REPRINTS IT AND WAITS FOR MNEUMONIC CODE AND OPERAND TO BE ASSEMBLED INTO THAT LOCATION. THE INSTRUCTIONS ARE TYPED IN FORMAT 1 AND ARE SUBJECT TO THE FOLLOWING RESTRICTIONS: 1. ONLY MACHINE INSTRUCTIONS AND THE PSEUDO-INSTRUCTION OCT (FOR OCTAL CONSTANTS) MAY BE GIVEN. ANY OTHER WILL PRODUCE AN "OPCODE ERROR" MESSAGE. 2. ONLY ONE INSTRUCTION IS ALLOWED PER LINE, EXCEPT ,RSS WHICH MAY BE APPENDED TO ANY ASG INSTRUCTION. 3. THE INSTRUCTION CODE MUST BE FOLLOWED BY EITHER A CR IF NO OPERAND EXISTS, OR BY A SINGLE SPACE FOLLOWED BY THE OPERAND WHICH MUST BE OCTAL (1 TO 6 DIGITS - NO B). 4. ,I AND ,C MAY BE APPENDED TO THE OPERANDS OF MGR + 10G INSTRUCTIONS RESPECTIVELY. 5. SINGLE WORD EAU INSTRUCTIONS WITH 16 SHIFTS SHOULD BE INPUT AS HAVING ZERO SHIFTS (AND WILL BE SIMILARLY INVERSELY ASSEMBLED). SWP IS NOT RECOGNIZED. 6. TWO-WORD EAU INSTRUCTIONS MUST BE INPUT AS TWO WORDS, THE FIRST BEING AN INSTRUCTION MNEUMONIC, AND THE SECOND, THE ADDRESS. THE ASSEMBLY ADDRESS MAY BE CHANGED AT ANY TIME BY INPUTTING AN OBLIQUE FOLLOWED BY THE NEW ADDRESS. THE ESCAPE KEY WILL RECOMMENCE ANY LINE. THE RUBOUT KEY WILL ABORT ASSEMBLY AND RETURN TO THE COMMAND REQUEST STATE. PRESSING CONTROL + C WILL CAUSE THE PRINTING OF THE CONTENTS OF THE CURRENT ADDRESS IN OCTAL AND IN MNEUMONIC FORM IF INTERPRETABLE AS SUCH. CONTROL + D OCTAL DUMP + INVERSE CAUSES TTY TO PRINT "DUMP RANGE?" AND THE OPERATOR RESPONDS WITH A STARTING AND ENDING LOCATION IN FORMAT 2. THE CONTENTS OF ALL LOCATIONS INCLUSIVE OF THE SPECIFIED ADDRESS ARE THEN PRINTED IN OCTAL TOGETHER WITH THEIR INSTRUCTION MNEUMONICS IF INTERPRETABLE. CONTROL + P PUNCH CAUSES TTY TO PRINT PUNCH? THE OPERATOR SPECIFIES A RANGE OF MEMORY IN FORMAT 2, AND A BINARY (BBL COMPATIBLE) TAPE OF THE CONTENTS OF THOSE LOCATIONS IS PUNCHED. CONTROL + T LOAD TAPE LOADS TAPE IN READER INTO CORE PRINTS "*EOT" IF SUCCESSFUL "CHECKSUM" FOR CHECKSUM FAILURE "ADDRESS=XXX" IF ATTEMPT MADE TO OVERLAY OCTAPUS-C CONTROL + V VERIFY COMPARES TAPE IN READER & CORE, & PRINTS OUT ANY LOCATIONS AND THEIR CONTENTS WHERE THE TAPE IS DIFFERENT. CONTROL + B BOUND PRINTS LOADING ADDRESS DESTINATION OF EACH BINARY TAPE SECTION. CONTROL + I INVERSE OF TAPES PRINTS DUMP + INVERSE (AS FOR DUMP ROUTINE) OF BINARY TAPE WITHOUT LOADING IT. CONTROL + R RUN TTY ASKS FOR ADDRESS (FORMAT 3), AND WILL TRANSFER CONTROL AND START RUNNING PROGRAM AT THE SPECIFIED ADDRESS. CONTROL + S SEARCH IN REPLY TO "SEARCH FOR?", GIVE OCTAL CODE (FORMAT 3) IN REPLY TO "RANGE?" , GIVE RANGE (FORMAT 2) THE ADDRESSES OF ALL LOCATIONS CONTAINING THE CODE IN THE SPECIFIED RANGE WILL BE PRINTED. CONTROL + L RELOCATE IN REPLY TO "RELOCATE?", THE USER GIVES THE SECTION TO BE RELOCATED (FORMAT 2). THE MESSAGE "NEW ORIGIN?" CALLS FOR THE NEW STARTING ADDRESS FOR THE SECTION (FORMAT 3). THE MESSAGE "ADDRESSES OF POINTERS?" (TERM.BY 0)" CALLS FOR THE ADDRESS OR ADDRESSES OF ANY LOCATIONS IN THE SECTION THAT ARE USED FOR INDIRECT ADDRESSING: THE PROGRAM EVALUATES WHETHER THESE NEED ALTERING (IF LOCATION POINTED TO IS IN SECTION BEING RELOCATED) OR NOT. THESE ADDRESSES MAY BE INPUT EITHER SINGLY, (FORMAT 3) OR IN BLOCKS, USING FORMAT 2 (SEE EXAMPLES). THE LIST MUST BE TERMINATED (OR IF NULL LIST) BY ZERO. IF THE SECTION IS BEING RELOCATED TO A DIFFERENT PART OF A PAGE, SO THAT MEMORY REFERENCE INSTRUCTIONS NEED ALTERATION, THE PROGRAM ASKS "CONSTANTS?". REPLY BY INPUTTING THE ADDRESSES OF ANY CONSTANTS, IN PARTICULAR ANY THAT MIGHT APPEAR TO BE A MRG OR EAG INSTRUCTION, SINGLY OR IN BLOCKS AS FOR THE POINTERS. THE CONSTANT BLOCKS MAY (BUT NEED NOT) INCLUDE THE POINTER ADDRESS. AGAIN TERMINATE BY ZERO. A BINARY TAPE WILL THEN BE PUNCHED, THE MESSAGE "LAST WORD = XXX" GIVEN AND THE PROGRAM RETURNS TO THE "?" INPUT REQUEST MODE. OPTION: IF SWITCH REGISTER BIT ZERO IS SET ON, THE RELOCATION WILL BE DONE ON-LINE AND THE MESSAGE "LAST WORD=XXX" GIVEN WHEN FINISHED. CAUTION: THIS SHOULD NOT BE USED TO MOVE A SECTION OF PROGRAM DOWN WHERE IT WILL OVERLAY ITSELF BEFORE ALL OF IT HAS BEEN RELOCATED. PUNCH A TAPE, OR MOVE TO A DIFFERENT PAGE AND THEN BACK. NOTES ON RELOCATING 1. THE PROGRAM DOES NOT GENERATE INDIRECT ADDRESSING IF RELOCATION CAUSES AN ADDRESSED LOCATION TO RESIDE IN CORE ON A DIFFERENT PAGE FROM THE INSTRUCTION. A "PAGE ERROR, LINE NUMBER" MESSAGE IS GIVEN, THE PROGRAM BEING LEFT IN THE ASSEMBLY MODE. 2. THE WORD EAU INSTRUCTIONS ARE HANDLED AUTOMATICALLY: IT IS NOT NECESSARY TO DESIGNATE THE SECOND WORD AS A POINTER. 3. WHENEVER A SECTION OF MEMORY IS RELOCATED, ALL JUMPS AND REFERENCES TO IT FROM OUTSIDE THE SECTION BECOME INVALID. THESE MAY BE ADJUSTED MANUALLY (SEE EX 2A) OR THE RELOCATION CAN OFTEN BE DONE IN TWO STAGES (SEE EX 2B). FIRST SHIFT ALL THE PROGRAM INVOLVED. THIS WILL UPDATE THE REFERENCING INSTRUCTIONS. THEN SHIFT BACK ALL THE PROGRAM EXCEPT THE SECTION DESIRED TO BE RELOCATED. 4. WHEN MOVING A SECTION OF THE PROGRAM TO ANOTHER PAGE, INSTRUCTIONS WHICH REFERENCE OTHER UNMOVED LOCATIONS BECOME INVALID. THIS MAY BE DELIBERATE IF A TWO-STAGE RELOCATION IS BEING PERFORMED. AS A WARNING OF THIS CONDITION, BITS 12-14 OF THE SWITCH REGISTER ARE SET ON. GENERAL OCTAPUS-C DOES NOT USE THE INTERRUPT SYSTEM. ANY PROCESS MAY BE ABORTED BY SETTING SWITCH REGISTER BIT 15 ON IF PRINTING IS OCCURRING OR BY PRESSING THE RUBOUT KEY IF THE KEYBOARD IS LIVE. TTY LIST OUTPUT MAY BE DIVERTED TO THE LINE PRINTER BY SETTING SWITCH REGISTER BIT 1 ON. OUTPUT RETURNS AUTOMATICALLY TO THE TTY WHEN THE LISTING PROCESS IS COMPLETE. THE POINTER AND CONSTANT TABLE IS BUILT UP FROM LOCATION 6161B(+N000B, N EVEN, FOR DIFFERENT ORIGIN). ONE WORD IS REQUIRED FOR EACH CONSTANT OR POINTER. ALTHOUGH OCTAPUS-C WILL HANDLE EAU INSTRUCTIONS, IT DOES NOT REQUIRE AN EAU FOR ITS OPERATION. FORMATS CR REPRESENTS CARRIAGE RETURN KEY FORMAT I CLA CR SZA,RSS CR LDA 7233 CR LDB 7234,I CR FORMAT II XXXX,YYYY CR IMPLIES ALL LOCATIONS FROM XXXX TO YYYY INCLUSIVE. FORMAT III XXXX CR A SINGLE OCTAL VALUE. Assembly source follows. This was two files, appended them together and verified the splice point was correct. Producing this file took a bit of work, starting with just extracting the files from the FST archive. 'nix's tar -x < file.fst worked but complained. The files contained many '0' bytes, changed all to LF (0a) using a hex editor then loaded into a text editor where I had to do massive editing to strip out the extra lines and data. Fortunately the text itself was in good shape. After doing this one manually I discovered a method to the madness.. all 16b words [length][that many text words][length again], ignore lengths of zero. The following HP-IPL/OS word does the trick... DEFINE FIXP DO MSWIN DUP IFNZ #1 SWAP +DO MSWIN MSWOUT +LOOP MSCRLF MSWIN DROP "." $PRINT ENDIF #1 WHILE END The raw file from the FST archive is attached to PTR, attach PTP to the output file, run FIXP, when the dots stop scrolling halt and detach PTP. If it works plain text will be present in the output file, with a bit of garbage text or a partially repeated line at the end. ------------------------- cut -------------------------------- *** OCTAPUS-C *** * * TO CONFIGURE, SET TTY SELECT CODE IN SW REG, & 2 IN P REG. * * OCTAPUS-C HAS THE FOLLOWING ROUTINES, SELECTED BY:- * * COMMAND ROUTINE USER RESPONSE * CONTROL&A ASSEMBLY SPECIFY STARTING ADDRESS * IN THIS MODE, CONTROL&C GIVES CONTENTS OF CURRENT LOCATION * CONTROL&D INVERSE ASSEMBLY SPECIFY RANGE OF MEMORY TO BE DUMPED * CONTROL&P PUNCH SPECIFY RANGE FOR BINARY TAPE PUNCH * CONTROL&T LOAD TAPE * CONTROL&V VERIFY TAPE * CONTROL&B PRINT BOUNDS OF BINARY TAPE * CONTROL&I DO INVERSE ASSEMBLY OF BINARY TAPE * CONTROL&R RUN SPECIFY STARTING ADDRESS * CONTROL&S SEARCH CORE SPECIFY OCTAL TO BE SOUGHT * & SEARCH RANGE * CONTROL&L RELOCATE SPECIFY SECTION FOR RELOCATION * NEW ORIGIN * POINTER ADDRESSES * & CONSTANTS * * SW REG BIT 15 ON WILL ABORT ANY PROCESS * SW REG BIT 1 ON WILL DIVERT LIST OUTPUT TO LP * SW REG BIT 0 ON WILL PERFORM ON-LINE RELOCATION * 0 OFF PUNCHES BINARY TAPE * * OCTAPUS-C IS SELF RELOCATED TO ANOTHER PAGE BY * CONTROL&L RELOCATE? 4000,6161 * NEW ORIGIN? NN000 * ADDRESSES OF POINTERS? (TERM BY 0) 5507,5537 * 0 *********************************************** HED *** OCTAPUS-C *** 17/3/76 ORG 2B JMP *+1,I DEF FIXIO * ORG 4000B ENTRY JMP ADCON,I JSB EOL AFTER CONFIG LDA MSL15 LDB MSG15 JSB PRTBF * STCLR LIA 01 REMOVE ABORT, LP & AND M1 RELOCATE WARNING BITS OTA 01 FROM SW REGISTER. START JSB BELL LDA QMARK PRINT "?" JSB PRTWD JSB CHRIN JMP START * ASMBL LDA MSL12 ASSEMBLY/ ADDRESS= LDB MSG12 JSB PRTBF NEWAD JSB .ATB GET ADDRESS STA ORG NEWLN JSB EOL LDA ORG JSB PRTNM JSB BLANK CLA STA WORD ALOOP JSB CHRIN GET CHARACTER STA 01 CPA SPACE SPACE? JMP GETAD YES, GET OPCODE & ADDRESS CPA CR CARRIAGE RETURN? JMP NOADD YES, NO ADDRESS FIELD-GET OPCODE CPA ./. SLASH? JMP NEWAD YES, GET NEW ORG ADDRESS CPA CTRLC CONTROL C? JMP CNTNS YES: PRINT CONTENTS CPA COMMA JMP REVSS AND B37 THEN PACK LEAST 5 BITS OF LDB WORD CHARACTER INTO PSEUDO BLF,RBL OPCODE WORD. IOR 01 STA WORD JMP ALOOP * REVSS JSB .ATB CPA RSS TEST FOR ,RSS RSS JMP OPERR JSB TBSCH IF SO, GET OPCODE CLA,INA & SET RSS BIT JMP CMBIN+1 & COMBINE * CNTNS LDA ORG FOR CONTROL & C IN STA SA ASSEMBLY MODE, PRINT LDA ORG,I INVERSE OF CURRENT JSB INVIT ADDRESS JMP NEWLN+1 * EOL NOP END OF LINE - PRINT CARRIAGE LDA B6412 RETURN & LINE FEED JSB PRTWD JMP EOL,I * * CHRIN NOP INPUT ONE CHARACTER LDB CW1 TTY1 OTB 00 TTY2 STC 00,C TTY3 SFS 00 JMP *-1 TTY4 LIA 00 AND M177 CPA CTRLA CONTROL A? JMP ASMBL YES, ASSEMBLY MODE CPA CTRLP CONTROL P? JMP PUNCH YES, PUNCH TAPE CPA CTRLT CONTROL T? JMP LOAD YES, LOAD TAPE CPA CTRLV CONTROL V? JMP COMPR YES, VERIFY TAPE CPA CTRLD CONTROL D? JMP INVRS YES, DUMP & INVERSE OF CORE CPA CTRLS JMP SURCH SEARCH MEMORY CPA CTRLR JMP RUN RUN CPA CTRLB JMP BOUND PRINT BOUNDS OF BINARY TAPE CPA CTRLL JMP RELOC RELOCATE CPA CTRLI JMP EPAT INVERSE OF TAPE CPA M177 RUBOUT ? JMP START RESTART CPA ESC ESCAPE ? JMP NEWLN NEW LINE JMP CHRIN,I * CHARO NOP OUTPUT ONE CHARACTER LIB 01 BIT 1 CONTROLS TTY BRS,SLB OFF GIVES TTY ON JMP LP1 ON GIVES LP ON LDB CW2 TTY5 OTB 00 AND M177 TTY6 OTA 00 TTY7 STC 00,C TTY8 SFS 00 JMP *-1 JMP CHARO,I LP1 OTA 0 LP2 STC 0,C LP3 SFS 0 JMP *-1 JMP CHARO,I * BLANK NOP LDA SPACE JSB CHARO JMP BLANK,I * TBSCH NOP TABLE SEARCH LDA TABL2 INITIALIZE STA PNTR THE LDA TABL1 POINTERS LDB WORD LOOP3 CPB A,I BEGIN LINEAR SEARCH JMP FOUND ISZ PNTR INA CPA TBEND END OF TABLE ? JMP OPERR YES, OPCODE NOT FOUND JMP LOOP3 FOUND LDB PNTR,I GET & SAVE STB OPCOD TRUE OPCODE JMP TBSCH,I * * * FABRICATE MACHINE INSTRUCTION * FAB LDA OPCOD IS OPCODE NOP OR OCT? SZA,RSS JMP CMBIN YES, EXIT LDA ADDR AND B176K MASK OFF BITS 0-9 SZA,RSS IS ADDRESS ON BASE PAGE? JMP CMBIN YES, EXIT XOR ORG IS ADDRESS ON SAME PAGE AND B176K WITH MACHINE INSTRUCTION SZA DESTINATION? JMP PGERR NO,OUTPUT ERROR MESSAGE LDA ADDR YES, GET BITS 0-9 OF ADDRESS AND B1777 IOR B2000 SET BIT 10(CURRENT PAGE) STA ADDR CMBIN LDA ADDR IOR OPCOD STA ORG,I ISZ ORG JMP NEWLN+1 * * INVRS LDA MSL13 DUMP RANGE? LDB MSG13 JSB PRTBF JSB .ATB GET STARTING ADDRESS STA SA JSB .ATB GET ENDING ADDRESS STA EA NEXT1 LDA SA JSB PRTNM PRINT ADDRESS JSB BLANK LDA SA,I JSB INVIT BUMP LDA SA CPA EA JMP STCLR ISZ SA JMP NEXT1 * * PRINT OCTAL AND INVERSE * INVIT NOP STA INSTR JSB PRTNM PRINT OCTAL JSB BLANK CLO CLEAR BASE PAGE FLAG LDA INSTR AND MRMSK CLE,SZA MRG ? JMP MRG YES LDA INSTR SSA IOG OR EAG ? JMP IOG * NO-MUST BE ASG OR SRG JSB MNSCH GO SEARCH MNEMONIC TABLE JMP RETRY NOT FOUND - TRY RSS GOTYA JSB PRTIT FIN JSB EOL JMP INVIT,I * RETRY LDA INSTR AND N2 REMOVE RSS BIT STA INSTR ALF,RAL SSA ASG ? JSB MNSCH SEARCH MNE TABLE AGAIN JMP FIN NOT FOUND JSB PRTIT PRINT MNEMONIC LDA COMAR JSB PRTWD PRINT ",RSS" LDA COMAR+1 JSB PRTWD JMP FIN * MRG LDA INSTR AND B2000 BASE PAGE REFERENCE? SZA,RSS STO YES: SET BP FLAG LDA INSTR CLE,SSA INDIRECT? CCE YES: SET APPEND FLAG AND B1777 STA LOBTS SAVE BITS 0-9 LDA INSTR AND B74K STRIP ADDRESS & INDIRECT OFF STA INSTR JSB MNSCH GO SEARCH MNEMONIC TABLE JMP FIN RETURN HERE IF DEFAULT JSB PRTIT ELSE HERE- GO PRINT MNEMONIC JSB BLANK LDA SA GET PAGE AND B176K BITS SOC BASE PAGE FLAG SET? CLA YES IOR LOBTS ADD ADDRESS & JSB PRTNM PRINT IT LDA COMAI GX1 SEZ JSB PRTWD APPENDS ,I OR ,C JMP FIN * IOG LDB B17 ALF,RAL SSA IOG OR EAG ? LDB B77 IOG LDA INSTR GET SELECT CODE AND B OR NO. OF SHIFTS STA I/O AND SAVE CLA CPB B77 IF EAG & ZERO SHIFTS INA OR IOG & SELECT CODE 1 CPA I/O THEN LOOK FOR INSTRUCTIONS JSB MNSCH WITHOUT SELECT CODES JMP NONO NONE FOUND LDA PNTR CMA,INA DOES ADA SOSAD IT NEED SSA,RSS CODE ? JMP GOTYA NO NONO LDA INSTR XOR I/O STA INSTR JSB MNSCH JMP TRYAC NOT FOUND, GO REMOVE CBIT WASAC JSB PRTIT FOUND, PRINT MNEMONIC JSB BLANK LDA I/O JSB PRTNM PRINT SELECT CODE LDA COMAC JMP GX1 APPEND ,C IF E SET * TRYAC LDA INSTR AND NOT9 REMOVE H/C BIT STA INSTR JSB MNSCH JMP FIN STILL NOT FOUND CCE JMP WASAC YES, WAS A C * MNSCH NOP MNEMONIC TABLE SEARCH LDA TABL2 INITIALIZE STA PNTR THE LDA TABL1 POINTERS LDB INSTR GOMAN CPB PNTR,I BEGIN LINEAR SEARCH JMP GOTIT ISZ PNTR INA CPA TBEND END OF TABLE ? JMP MNSCH,I YES, NOT FOUND JMP GOMAN NO GOTIT LDA A,I GET & SAVE STA NEMON MNEMONIC ISZ MNSCH BUMP RETURN ADDRESS & JMP MNSCH,I EXIT * PRTIT NOP PRINT MNEMONIC LDA NEMON ALF,RAL RAL STA TEMP1 JSB MAKIT LDA TEMP1 ALF,RAL STA TEMP1 JSB MAKIT LDA TEMP1 ALF,RAL JSB MAKIT JMP PRTIT,I * MAKIT NOP MAKE ASCII & PRINT AND B37 IOR ALPHA JSB CHARO JMP MAKIT,I * SURCH LDA MSL6 SEARCH FOR ? LDB MSG6 JSB PRTBF JSB .ATB STA NEMON LDA MSL7 LDB MSG7 RANGE ? JSB PRTBF JSB .ATB STA SA JSB .ATB STA EA JSB EOL LDA SA SLOOP LDB A,I CPB NEMON JSB MATCH CPA EA JMP START INA JMP SLOOP MATCH NOP STA I/O JSB PRTNM JSB EOL LDA I/O JMP MATCH,I * RUN LDA MSL9 ADDRESS= LDB MSG9 JSB PRTBF JSB .ATB STA ADDR JSB EOL CLC 0,C JMP ADDR,I * * SUBROUTINE TO PRINT OCTAL NUMBER * PRTNM NOP RAL STA TEMP1 AND M1 ADA M60 JSB CHARO LDA M5 STA TEMP2 LOOP7 LDA TEMP1 ALF,RAR STA TEMP1 AND MSK7 ADA M60 JSB CHARO ISZ TEMP2 JMP LOOP7 LIA 01 ABORT IF SW 15 SET SSA JMP STCLR JMP PRTNM,I * .ATB NOP GET ASCII FROM TTY & CONVERT CLA,CLE STA TEMP2 JSB CHRIN CPA COMMA JMP EXITA CPA CR JMP EXIT CPA SPACE ILLEGAL SPACE? JMP FMTER YES,FORMAT ERROR LDB TEMP2 BLF,RBR AND MSK7 IOR B STA TEMP2 JMP .ATB+3 EXITA CCE,RSS EXIT JSB EOL GIVE LF IF CR LDA TEMP2 JMP .ATB,I * GETAD JSB TBSCH GET OPCODE & SAVE JSB .ATB GET ADDRESS STA ADDR SEZ,RSS JMP FAB JSB .ATB CPA CTRLC JMP G2 CPA M1 RSS JMP OPERR RAR G1 IOR OPCOD STA OPCOD JMP FAB G2 LDA BIT9 JMP G1 * NOADD JSB TBSCH GET OPCODE & SAVE JSB EOL CLA SET ADDRESS=0 JMP CMBIN+1 * PRTWD NOP PRINT 16 BIT WORD IN ASCII STA TEMP1 FORMAT ALF,ALF AND M177 JSB CHARO LDA TEMP1 JSB CHARO JMP PRTWD,I * PRTBF NOP PRINT ASCII FROM BUFFER CMA,INA (LENGTH IN A ) STA CNTR1 (ADDRESS IN B) STB TEMP2 MORE LDA TEMP2,I JSB PRTWD ISZ TEMP2 ISZ CNTR1 JMP MORE JMP PRTBF,I * BELL NOP RING TTY BELL JSB EOL LDA MSK7 JSB CHARO JMP BELL,I * PGERR JSB BELL LDA MSL3 PAGE ERROR LDB MSG3 JSB PRTBF JMP NEWLN * OPERR JSB BELL LDA MSL4 OPCODE ERROR LDB MSG4 JSB PRTBF JMP NEWLN * FMTER JSB BELL LDA MSL5 FORMAT ERROR LDB MSG5 JSB PRTBF JMP NEWLN SKP * * THIS SUBROUTINE GIVES A CORE DUMP ON PAPER TAPE * * * TAPE RECORD FORMAT: * * *************** * * * * * REC LENGTH * * * * * *************** * * * * * STARTING * * * RECORD * * * ADDRESS * * * * * *************** * * * * * * * * D * * * A * * * T * * * A * * * * * *************** * * * * * * * * CKSUM * * * * * *************** * * * PUNCH LIA 1 ENSURE NOT AND N2 ONLINE FOR OTA 1 PUNCHING LDA MSL2 LDB MSG2 JMP PLINK LINK TO RELOCATION PROG ENDCN LDB N15 JSB LEADR * * CALCULATE WHETHER A COMPLETE 128 WORD * RECORD CAN BE PUNCHED. IF NOT, PUNCH THE * REMAINING SHORT RECORD AND TERMINATE. * NEWRC LDA END LDB BEGIN CMB,INB -BEGIN ADA B END-BEGIN ADA N127 END-BEGIN-127 SZA CHECK FOR EXACT FIT SSA JMP ENDRC PUNCH LAST SHORT RECORD * * PUNCH FULL SIZE RECORD * LDA P128 NUMBER WORDS IN RECORD JSB PCHRD PUNCH FULL RECORD * * PUNCH 4-FEED FRAMES,END OF RECORD * LDB N2 4-FEED FRAMES JSB LEADR JMP NEWRC CHECK FOR NEXT RECORD * * PUNCH LAST SHORT RECORD * ENDRC LDA END END ADA B END-BEGIN ADA M1 JSB PCHRD * * PUNCH TRAILER 30-FEED FRAMES * LDB N15 JSB LEADR LDA PSWCH SZA RELOCATION ? JMP START NO, SUPPRESS MESSAGE JSB EOL LDA MSL24 LAST WORD= LDB MSG24 JSB PRTBF CCA ADA NEWAS JSB PRTNM PRINT ADDRESS JMP START * PCHRD NOP CMA,INA STA TEMP1 NEG OF LENGTH AS COUNTER CMA,INA ALF,ALF JSB PCHDR PUNCH REC LENGTH IN TAPE-1ST WD LDA NEWAS STA CHKSM JSB PCHDR PUNCH ADD IN TAPE-2ND WD * * OUTPUT DATA WORDS AND CALCULATE CHECKSUM * NXT CCA CPA EAUFG EAU FLAG SET ? JMP EAPNT LDA BEGIN SEARCH CONST TABLE FOR ADDRESS LDB ADCON START OF TABLE CONCK CPB ADFIN END OF CONST TABLE JMP ENDPC REACHED ? CPA 1,I IS IT A POINTER OR CONSTANT ? JMP POINT YES INB JMP CONCK TRY AGAIN ENDPC LDA CORRN AND B1777 SZA,RSS NULL CORRECTION ? JMP PNCHK YES LDA BEGIN,I LOAD THE WORD AND MRMSK (070000) SZA IS IT MRG ? JMP MMALT YES, GO AND ADJUST LDA BEGIN,I SSA,RSS BIT 15 = 0 ? JMP PNCHK YES, ASG OR SRG ALF,RAL SSA BIT 10 =0 ? JMP PNCHK NO, PUNCH (IOG) LDA BEGIN,I AND EAMSK BITS 7,8 SZA,RSS TWO WORD EAU INSTR? JMP PNCHK NO CCA YES, SO SET STA EAUFG EAU FLAG * * OUTPUT DRIVER DRIVER * PNCHK LDB BEGIN,I FETCH UNALTERED WORD PUNSH LDA 1 WORD TO BE PUNCHED IS IN B ADB CHKSM UPDATE CHECKSUM STB CHKSM LIB 1 LOAD SW REG SSB ABORT IF BIT JMP STCLR 15 SET SLB ONLINE RELOCATION? STA NEWAS,I YES JSB PCHDR OUTPUT DATA WORD ISZ BEGIN UPDATE OLD & ISZ NEWAS NEW ADDRESSES ISZ TMP1 JMP NXT LDA CHKSM JSB PCHDR OUTPUT CHECKSUM JMP PCHRD,I RETURN * * PCHDR NOP SETS UP THE ALF,ALF TWO CHARS IN JSB CHROT THE WORD TO BE ALF,ALF PUNCHED JSB CHROT JMP PCHDR,I RETURN * * CHROT NOP STA TMP2 LIA 1 SLA ONLINE RELOCATION ? JMP CHROT,I YES LDA CW3 OUT1 OTA 0 LDA TMP2 AND M377 OUT4 OTA 0 OUT2 STC 0,C OUT3 SFS 0 JMP *-1 LDA TMP2 JMP CHROT,I RETURN * * LEADR NOP CLA CHAR TO BE PUNCHED JSB PCHDR PUNCH WORD INB,SZB JMP *-2 JMP LEADR,I RETURN * * RELOCATION PROGRAM * RELOC CCA SET FLAG FOR STA PSWCH RELOCATION LDA MSL20 SECTION FOR RELOCATION ? LDB MSG20 PLINK JSB PRTBF JSB .ATB STA BEGIN STA FIRST JSB .ATB STA END LDA ADCON SET THE POINTER FOR STA ADFIN THE CONSTANT TABLE LDA BEGIN ISZ PSWCH PUNCH OR RELOCATE ? JMP PNCHO PUNCH LDA MSL21 NEW ORIGIN ? LDB MSG21 JSB PRTBF JSB .ATB PNCHO STA NEWAS LDB BEGIN CMB,INB ADA 1 STA CORRN STORE * * SECTION TO STORE POINTER & CONSTANT TABLE * SZA,RSS RELOCATION ? JMP ENDCN NO LDA MSL23 LDB MSG23 MESSAGE TO INPUT JSB PRTBF POINTERS JSB CONIN LDB ADFIN STORE END OF STB PFIN POINTER TABLE LDA CORRN AND B1777 SZA,RSS NULL CORRECTION ? JMP ENDCN YES LDA MSL22 MESSAGE TO INPUT LDB MSG22 CONSTANTS JSB PRTBF JSB CONIN JMP ENDCN * * SUBROUTINE TO INPUT TABLES * CONIN NOP JSB .ATB GET ADDRESS SZA,RSS END OF TABLE ? JMP CONIN,I YES STA ADFIN,I NO, STORE IT SEZ BLOCK OF CONSTANTS ? JMP REPET YES ISZ ADFIN JMP CONIN+1 NO, GET NEXT * * SUBROUTINE FOR MULTIPLE CONSTANT INPUT * REPET JSB .ATB GET ADDRESS OF END OF BLOCK LDB ADFIN,I GET PREVIOUS ADDRESS ISZ ADFIN CPA B END OF BLOCK ? JMP CONIN+1 YES INB STB ADFIN,I NO,STORE NEXT VALUE JMP REPET+1 * * MRG ALTERATION * MMALT LDA BEGIN GET CURRENT PAGE AND PGMSK BITS LDB BEGIN,I BLF,RBL IS INSTRUCTION CURRENT SSB,RSS OR BASE PAGE ? CLA BASE STA B LDA BEGIN,I LOAD INSTRUCTION AND B1777 GET ADDRESS BITS ADB 0 ADD PAGE BITS STB REFAD JSB DUZIT NEED ALTERATION ? JMP CKPGE NO, CHECK PAGING LDA REFAD ADA CORRN CALCULATE NEW ONE STA REFAD NEW LOCATION ADDRESSED XOR NEWAS IS IT STILL AND PGMSK ON SAME PAGE SZA AS INSTRUCTION ? JMP PGERR NO, NOT ADDRESSABLE * * FORM NEW INSTRUCTION * LDA BEGIN,I GET AND B176K OPERATION STA B AND LDA REFAD ADD AND B1777 NEW ADB A ADDRESS JMP PUNSH * * INSTRUCTION UNCHANGED. REFERENCED LOCATION NOT MOVED. * WARNING GIVEN IF NOT STILL ADDRESSABLE. * CKPGE LDA REFAD AND PGMSK SZA,RSS BASE PAGE ? JMP PNCHK YES XOR NEWAS AND PGMSK SZA,RSS SAME PAGE ? JMP PNCHK YES LIA 1 NO, SET BITS IOR MRMSK 12-14 ON SW REG OTA 1 AS WARNING JMP PNCHK BUT WILL BE OK IF PART OF * OF DOUBLE RELOCATION * * POINTER ALTERATION * POINT CMB ADB PFIN PFIN-ADDR-1 SSB POINTER ? JMP PNCHK NO, CONSTANT EAPNT LDB BEGIN,I LOAD THE POINTER ELB,CLE,ERB REMOVE INDIRECT IF PRESENT STB EAUFG CLEAR EAU FLAG JSB DUZIT NEED ALTERATION ? JMP PNCHK NO LDB BEGIN,I YES, UPDATE ADB CORRN POINTER JMP PUNSH * * SUBROUTINE TO DETERMINE WHETHER REFERENCED ADDRESS * IS IN THE BLOCK BEING RELOCATED * DUZIT NOP CMB,INB STB 0 ADA FIRST CMA,INA IS THE REFERENCED SSA ADDRESS IN THE JMP NOTIN ADB END BLOCK BEING SSB,RSS MOVED ? ISZ DUZIT YES, BUMP RETURN ADDR NOTIN JMP DUZIT,I SKP * * BOUND, LOAD, VERIFY & INVERSE TAPE ROUTINES * BOUND CLA JMP STORE LOAD LDA MSL10 LOAD LDB MSG10 JSB PRTBF LDA LDWRD STORE LOAD INSTRUCTION JMP STORE COMPR JSB EOL LDA MSL11 LDB MSG11 JSB PRTBF LDA CPWRD STORE COMPARE INSTRUCTION STORE STA OPTI JSB EOL * CLB,RSS CONT LDB CM11 EOTCH INB,SZB JMP LD1 JMP FINIS END OF TAPE EXIT LD1 JSB GETCR SZA,RSS JMP EOTCH CMA,CLE,INA STA EA JSB GETCR JSB GETWD STA ADDR STA CHKSM LDB OPTI SZB,RSS ZERO ? JMP PRBND YES,BOUND LD2 LDB OPTI CPB LDWRD LOAD ? JMP ADERR YES, CHECK FOR SUICIDE OK JSB GETWD GET WORD FROM TAPE STA INSTR ADA CHKSM STA CHKSM LDA INSTR OPTI NOP OPERATIVE WORD GOES HERE CLE,RSS JMP MISCM TAPE # CORE MISBK ISZ ADDR ISZ EA FINISHED BLOCK ? JMP LD2 JSB GETWD YES, GET NEXT WORD FROM CPA CHKSM TAPE & CHECK---SUM JMP CONT OK LDA MSL8 CHECKSUM LDB MSG8 JSB PRTBF JMP STCLR * EPAT LDA PATWD TAPE INVERSE ENTRY POINT JMP STORE * TRAPP LDA ADDR CATCH POINT FOR INVERSE STA SA JSB PRTNM PRINT ADDRESS JSB BLANK LDA INSTR JSB INVIT DO INVERSE JMP OPTI+1 GETWD NOP JSB GETCR ALF,ALF STA WORD JSB GETCR IOR WORD JMP GETWD,I GETCR NOP RDR1 STC 0,C RDR2 SFS 0 JMP *-1 RDR3 LIA 0 JMP GETCR,I * PRBND JSB PRTNM JSB BLANK LDA EA CMA ADA ADDR JSB PRTNM JSB EOL JMP OK * FINIS LDA MSL14 PRINT *EOT & RETURN TO LDB MSG14 MODE REQUEST STATE JSB PRTBF JMP STCLR ADERR LDA ADDR CMA STA B ADA PENTR SSA,RSS PENTR > ADDR ? JMP OK ADB ADCON SSB ADDR >= ADCON ? JMP OK LDA MSL9 PRINT ADDRESS & ABORT LDB MSG9 JSB PRTBF LDA ADDR JSB PRTNM JMP START * MISCM LDA ADDR JSB PRTNM PRINT ADDRESS OF FAILING WORD JSB BLANK LDA ADDR,I JSB PRTNM PRINT CONTENTS JSB BLANK LDA INSTR JSB PRTNM PRINT WORD FROM TAPE JSB EOL JMP MISBK RETURN * * SKP * *** CONSTANTS AND STORAGE *** * LDWRD STA ADDR,I CPWRD CPA ADDR,I PATWD JMP TRAPP * CR OCT 15 M1 OCT 1 M5 DEC -5 MSK7 OCT 7 M60 OCT 60 ./. OCT 57 M177 OCT 177 B1777 OCT 1777 B2000 OCT 2000 PGMSK OCT 76000 B176K OCT 176000 CW1 OCT 160000 CW2 OCT 120000 CW3 OCT 110000 M377 OCT 377 COMMA OCT 54 CTRLC OCT 3 CTRLR OCT 22 CTRLP OCT 20 CTRLS OCT 23 CTRLD OCT 4 CTRLB OCT 2 CTRLI OCT 11 CTRLL OCT 14 B17 OCT 17 B70K OCT 70000 B74K OCT 74000 B37 OCT 37 COMAI OCT 26111 COMAC OCT 26103 COMAR ASC 2,,RSS QMARK ASC 1,? B77 OCT 77 BTS05 OCT 177700 ALPHA OCT 100 B6412 OCT 6412 CTRLT OCT 24 CTRLV OCT 26 ESC OCT 33 N15 EQU BTS05 P128 DEC 128 N127 DEC -127 N2 DEC -2 CM11 DEC -11 NOT9 OCT 176777 RSS OCT 233 EAMSK OCT 600 CHKSM BSS 1 WORD BSS 1 OPCOD BSS 1 SA BSS 1 EA BSS 1 ADDR BSS 1 TEMP1 BSS 1 TEMP2 BSS 1 I/O BSS 1 NEMON BSS 1 LOBTS BSS 1 ORG BSS 1 INSTR EQU WORD PNTR EQU TEMP1 EAUFG EQU ADDR CNTR1 EQU WORD BEGIN EQU ORG PFIN EQU BELL PSWCH EQU OPTI REFAD EQU CONIN END EQU EA A EQU 0 B EQU 1 TMP1 EQU TEMP1 TMP2 EQU TEMP2 CTRLA EQU M1 MRMSK EQU B70K FIRST EQU SA NEWAS EQU I/O CORRN EQU NEMON ADFIN EQU LOBTS * * POINTERS * TBEND ABS MS2 TABL1 DEF PSEUD TABL2 DEF OPTAB PENTR DEF ENTRY SOSAD ABS SOS ADCON DEF FIXIO MSG2 DEF MS2 MSG3 DEF MS3 MSG4 DEF MS4 MSG5 DEF MS5 MSG6 DEF MS6 MSG7 DEF MS7 MSG8 DEF MS8 MSG9 DEF MS9 MSG10 DEF MS10 MSG11 DEF MS11 MSG12 DEF MS12 MSG13 DEF MS13 MSG14 DEF MS14 MSG15 DEF MS15 MSG20 DEF MS20 MSG21 DEF MS21 MSG22 DEF MS22 MSG23 DEF MS23 MSG24 DEF MS24 * * MESSAGE LENGTHS * MSL2 EQU CTRLD MSL3 DEC 5 MSL4 DEC 6 MSL5 EQU MSK7 MSL6 EQU MSL4 MSL7 EQU CTRLC MSL8 EQU CTRLD MSL9 EQU CTRLD MSL10 EQU CTRLB MSL11 EQU CTRLI MSL12 EQU CTRLI MSL13 EQU MSL4 MSL14 EQU MSL10 MSL15 EQU MSL11 MSL20 EQU MSL3 MSL21 EQU MSL4 MSL22 EQU MSL3 MSL23 EQU CTRLR MSL24 EQU MSL3 * SUP PSEUD OCT 2704 PSEUDO OPCODE TABLE OCT 60762 OCT 22762 OCT 25142,24660,23172,2201,2202,7001,7002 OCT 30201,30202,47201,47202,34760,6605 OCT 46601,46602 OCT 46601,46602,2623,4623,3123,5123,44054 OCT 44114,44062,44122,2622,4622,13101 OCT 13102,12601,12602,2606,4606,6601,6602 OCT 6641,6642,6141,6142,6645,6145,46272 OCT 47141,47142,22701,22702,47501,47502 OCT 33031,10466,10604,11164 OCT 47217,6617,46743,46763,20624,47206 OCT 6606,46303,46323,32441,32442,30441 OCT 30442,37201,37202,47203,6603 OCT 3162,3154,31162,31154,45122,45114 OCT 36164 OCT 45163 * OPTAB AND 00 TRUE OPCODE TABLE XOR 00 IOR 00 JSB 00 JMP 00 ISZ 00 ADA 00 ADB 00 CPA 00 CPB 00 LDA 00 LDB 00 STA 00 STB 00 NOP SPACE CLE OCT 2010 SLA IN ASG OCT 6010 SLB IN ASG SLA SLB BIT9 ALS BLS ARS BRS RAL RBL RAR RBR ALR BLR ERA ERB ELA ELB ALF BLF CLA CLB CMA CMB CCA CCB CME CCE SEZ SSA SSB INA INB SZA SZB OCT 100200 MPY OCT 100400 DIV OCT 104200 DLD OCT 104400 DST STO CLO SOC SOS SOS HLT 00 STF 00 CLF 00 SFC 00 SFS 00 MIA 00 MIB 00 LIA 00 LIB 00 OTA 00 OTB 00 STC 00 CLC 00 OCT 101020 ASR OCT 100020 ASL OCT 101040 LSR OCT 100040 LSL OCT 101100 RRR OCT 100100 RRL OCT 0 OCT RSS * * MESSAGES * MS2 ASC 4,PUNCH ? MS3 ASC 5,PAGE ERROR MS4 ASC 6,OPCODE ERROR MS5 ASC 7,ILLEGAL SPACE MS6 ASC 6,SEARCH FOR? MS7 ASC 3,RANGE? MS8 ASC 4,CHECKSUM MS12 ASC 5,ASSEMBLY/ MS9 ASC 4,ADDRESS= MS10 ASC 2,LOAD MS11 ASC 9,ADDR CORE TAPE MS13 ASC 6,DUMP RANGE? MS14 ASC 2,*EOT MS15 ASC 9,*** OCTAPUS-C *** * MS20 ASC 5,RELOCATE ? MS21 ASC 6,NEW ORIGIN ? MS22 ASC 5,CONSTANTS? MS23 ASC 18,ADDRESSES OF POINTERS ? (TERM. BY 0) MS24 ASC 5,LAST WORD= * *** CONFIGURATION SECTION *** * CONSTANTS & POINTER TABLE IS STORED OVER THIS * FIXIO CLC 0,C LIA 1 AND IB77,I SZA,RSS HLT 33B LDB LIST1 JSB CONF JSB IEOL,I LDA MSL16 LDB MSG16 JSB IPRTB,I JSB I.ATB,I LDB LIST2 JSB CONF JSB IEOL,I LDA MSL17 LDB MSG17 JSB IPRTB,I JSB I.ATB,I LDB LIST3 JSB CONF JSB IEOL,I LDA MSL18 LDB MSG18 JSB IPRTB,I JSB I.ATB,I LDB LIST4 JSB CONF JSB IEOL,I LDA ENTIN,I STA IENTR,I JMP IENTR,I * CONF NOP STA TEMPP LDA B,I SZA,RSS JMP CONF,I AND IBTS0,I IOR TEMPP STA B,I INB JMP *-7 * TEMPP BSS 1 ENTIN DEF START IB77 DEF B77 IEOL DEF EOL IPRTB DEF PRTBF I.ATB DEF .ATB IENTR DEF ENTRY IBTS0 DEF BTS05 * LIST1 DEF *+1,I DEF TTY1 DEF TTY2 DEF TTY3 DEF TTY4 DEF TTY5 DEF TTY6 DEF TTY7 DEF TTY8 DEF ZERO * LIST2 DEF *+1,I DEF RDR1 DEF RDR2 DEF RDR3 DEF ZERO * LIST3 DEF *+1,I DEF OUT1 DEF OUT2 DEF OUT3 DEF OUT4 DEF ZERO * LIST4 DEF *+1,I DEF LP1 DEF LP2 DEF LP3 DEF ZERO ZERO OCT 0 * MSG16 DEF *+1 ASC 10,READER SELECT CODE? MSL16 DEC 10 * MSG17 DEF *+1 ASC 9,PUNCH SELECT CODE? MSL17 DEC 9 * MSG18 DEF *+1 ASC 10,LINE PRINTER(2767A)? MSL18 EQU MSL16 * END **END-OF-TAPE ------------------------- cut --------------------------------