ASMB,R,L,C HED RTE MICRO-ASSEMBLER -- PASS 1 NAM MICRO,3 92061-16001 REV.2013 800131 SUP * * * ********************************************************* * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. * * * * * * THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT * * * A TIME AND SHALL NOT OTHERWISE BE RECORDED, * * * TRANSMITTED OR STORED IN A RETRIEVAL SYSTEM. COPYING * * * OR OTHER REPRODUCTION OF THIS PROGRAM EXCEPT FOR * * * ARCHIVAL PURPOSES IS PROHIBITED WITHOUT THE PRIOR * * * WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * ********************************************************* * * HEADR ASC 15,PAGE .... RTE MICRO-ASSEMBLER ASC 10,REV.2013 800131 TIME BSS 16 * EXT EXEC EXT C.SOR,C.TTY,C.LST,C.BIN CMPLR LIB FCB EXT SUP.C,OPN.C,PRM.C,GMM.C,WRT.C,RWN.C CMPLR LIB EXT RUN.C,END.C,SPC.C,EOF.C,RED.C CMPLR LIB * * ****************************** * * PASS 1 STARTS HERE. * * HERE WE GET THE PARAMETERS, IF ANY, FROM THE * USER'S RUN COMMAND: * :RU,MICRO,,,, * MICRO NOP JSB SUP.C DEF TIME JMP ABRT ERROR RTN JSB PRM.C DEF .3 SZA JSB PUNCH LDA PRMPT SET A = "]_" JSB OPN.C DEF C.SOR JMP ABRT ERROR RTN JSB OPN.C DEF C.LST JMP ABORT ERROR RTN JSB PRM.C DEF .4 SZA,RSS LDA .56 DEFAULT STA LPP LINES PER PAGE FOR MXREF CMA -((LPP-3)+1): REMAINING STA LINE3 LINES+1 AFTER HEADER JSB EJECT PRINT HEADER JSB EXEC SWAP WHOLE DISC PARTITION DEF *+3 (NO SUCH FUNCT IN CMPLR LIB)UNLESS AUTO DEF .22 DEF .3 JSB GMM.C GET FWA,LWA DEF .0 STA @SYMB STA @SYMT ADA .4 STA @VAL INA STA @TAG CMB STB LWA -LWA-1 * * INPUT AND EXAMINE A RECORD. * JSB MIC GET MICMX OR MICMXE COMMAND INPUT JSB LSTR? LIST PRIOR LINE IF ERROR ISZ LINE# JSB RDCRD READ CARD LDB @FLD1 EXAMINE 1ST BYTE JSB LOADB CPA ASTER =*? JMP INPUT YES, IGNORE. CPA "$" =$? JMP CNTRL CONTROL STATE. LDA .10 CHECK FOR EQU,ORG,ALGN LDB @FLD2 JSB $SRCH SSA JMP INP0 NOT PSEUDO-OP AND =B77 ADA *+2 JMP A,I DEF *,I ONE-ORIGINED BRANCH TABLE DEF INP4 EQU STMT DEF INP0 DEF STMT DEF INP0 ONES STMT DEF INP0 ZERO STMT DEF INP3 ALGN STMT DEF INP2 ORG STMT DEF END1 END STMT * * NORMAL STATEMENT. PROCESS LABEL IF ANY * INP0 JSB ORGD? ENSURE WE HAVE AN ORIGIN JSB LBL? JMP INP1 LDA PCNTR ENTER INTO SYMTAB CLE NON-EQU LABEL JSB SYMAD INP1 JSB POVF? LDA PCNTR INA JSB SETP JMP INPUT * * ORG STATEMENT * INP2 LDA @FLD2 DISALLOW LABEL LDB @FLD1 JSB BLNK? JMP *+2 LABEL PRESENT JMP INP21 LDA ERR24 JSB ERROR INP21 JSB ORIG JMP BAD.3 JMP INPUT * * ALGN STATEMENT * INP3 LDA @FLD2 DISALLOW LABEL LDB @FLD1 JSB BLNK? JMP *+2 LABEL PRESENT JMP INP31 LDA ERR24 JSB ERROR INP31 JSB ORGD? ENSURE WE HAVE ORIGIN JSB ALGN JMP INPUT * * EQU STATEMENT * INP4 LDA @FLD6 FIND ADDR EXPRESSION LDB @FLD3 JSB BLNK? NOP JSB NUM (CHECKED IN NUM) SOC JMP BAD.2 STA SAVA SAVE EXPR VALUE JSB LBL? JMP INPUT LDA SAVA RESTORE EXPR VALUE CCE EQU FLAG JSB SYMAD JMP INPUT * * CONTROL CARD PROCESSOR * B= BPTR TO COMMAND * CNTRL JSB PSRCH DBL CTBL DEC 10 CPA .7 $CODE COMMAND? JMP FDESG YES SZA JMP INPUT NO: IGNORE COMMAND IN PASS1 * * BAD CONTROL STATEMENT OR PSEUDO-OP * LDA ERR18 BAD COMMAND JMP *+2 BAD.2 LDA ERR19 BAD LABEL EXPRESSION BAD.3 JSB ERROR JMP INPUT * * $CODE PARAMETERS ARE NOW INCLUDED IN RUN STRING FDESG LDA ERR12 $CODE -> RUN STRING LDB ANYER STB TEMP JSB ERROR LDB TEMP STB ANYER RESTORE FLAG JMP INPUT TEMP BSS 1 * * ****************************** * * END STATEMENT * END1 LDA SYFLG SYMBOL TABLE SZA,RSS WANTED? JMP PASS2 NO, SO GO TO PASS 2. LDA @SYMT YES. GET STA PNTR START OF TABLE CPA @SYMB END? JMP PASS2 YES. GO TO PASS2. LDA ANYER PAGE EJECT IF ERROR SZA JSB EJECT LDA .2 JSB SPACE LDA .M12 JSB PRINT DEF HED1 LDA .2 JSB SPACE PR1 LDA .9 FILL THE PERTINENT PART OF LDB @CARD ASCII OUTPUT BUFFER WITH JSB CLEAN SPACES. * NOW WE STORE THE SYMBOL (LABEL) IN THE * INPUT BUFFER, WHICH WE ARE USING AS PART OF OUR * ASCII OUTPUT BUFFER. LDA PNTR,I STA CARD ISZ PNTR LDA PNTR,I STA CARD+1 ISZ PNTR LDA PNTR,I STA CARD+2 ISZ PNTR LDA PNTR,I STA CARD+3 * NOW PICK UP OCTAL LOCATION (IE., VALUE) OF SYMBOL. ISZ PNTR LDA PNTR,I ISZ PNTR * CONVERT TO ASCII AND STORE IN * NEXT LOCATION IN OUTPUT BUFFER. LDB @FLD1 ADB .15 STB SAVB SAVE BYTE ADDRESS. JSB OCTAL DEC 6 LDA BLNK LDB PNTR,I PICK UP TAG SZB LDA "X" APPEND "X" FOR EXTERNAL (EQU) LDB SAVB GET BYTE ADDR OF VALUE. INB INC PAST VALUE JSB STORB STORE SPACE OR 'X' THERE. LDA BLNK2 STA CARD-1 LDA .18 JSB PRINT DEF CARD ISZ PNTR POINT LDA PNTR TO CPA @SYMB NEXT ENTRY. END? JMP *+2 JMP PR1 NO, GO DO NEXT. HED RTE MICRO-ASSEMBLER -- PASS 2 * * PASS 2 STARTS HERE. * * * * INITIALIZATION FOR PASS 2. * PASS2 JSB FINI PRINT END-PASS-1 MSG LDA FILE? OUTPUT TO FILE? SZA,RSS JMP OK NO. * * OPEN BINARY FILE * JSB OPN.C DEF C.BIN RSS ERROR RTN JMP OK NORMAL RTN CLA STA FILE? RESET OUTPUT FLAGS STA FILE LDA ERR13 JSB ERROR * * INITIALIZE FLAGS, COUNTERS, ETC, FOR 2ND PASS. * GENERATE LEADER. * OK LDA BASE RESET ORIGINAL ORG STA PCNTR JSB RWN.C DEF C.SOR JMP ABORT ERROR RTN ISZ PASS# CLA STA LINE# * * READ A SOURCE RECORD. * JSB EJCT? JSB MIC P21 ISZ LINE# JSB RDCRD READ CARD LDB @FLD1 NO. CHECK JSB LOADB BYTE. CPA ASTER =*? JMP P21A YES,IGNORE BUT PRINT CPA "$" =$? JMP *+2 JMP P21C NO, GOOD CODE. JSB PSRCH DBL CTBL DEC 10 ADA *+2 JMP A,I DEF *+1,I ZERO-ORIGINED JUMP TABLE DEF P21A ERROR: IGNORE IN PASS2 DEF $PAGE DEF $TITL $PAGE= DEF $LST DEF $NOLS DEF $PNCH DEF $NOPN DEF P21A $CODE * * * $PAGE= AND $PAGE * $TITL LDA .M37 STA COUNT MAX CHAR COUNT LDA @HFD2 STA @DEST P.GET JSB LOADB MOVE TITLE INTO HEADER STB @INP LDB @DEST JSB STORB STB @DEST LDB @INP ISZ COUNT JMP P.GET * * $PAGE JSB EJCT? JMP P21 DON'T LIST COMMAND * * $NOLIST: LIST RECORD, THEN TURN OFF LISTING * $NOLS CLA JSB LSTR2 CLA STA LIST? JMP P21 * * $NOPUNCH: TURN OFF PUNCHING * $NOPN CLA STA FILE? JMP P21A * * $LIST: TURN ON LISTING * $LST JSB $LIST ENABLE LISTING JMP P21A * * $PUNCH: TURN ON PUNCHING AND SET LEADER FLAG * $PNCH LDA FILE STA FILE? * P21A CLA LIST WITHOUT CODE JSB LSTR2 JMP P21 GO BACK. * * DETERMINE STATEMENT TYPE. * P21C LDB @FLD2 GET FIELD 2 STARTING BYTE ADR. CLA,INA GO GET AN JSB $SRCH 'OPCODE' BINARY OPCODE. SSA,RSS BAD CODE? JMP P21D NO. LDA ERR2 YES. OUTPUT JSB ERROR MESSAGE. JSB DEFLT DEC 1 P21D STA OPTKN AND =B77 ISOLATE OPCODE STA FLD2 LDA OPTKN ISOLATE INSTR TYPE AND =B170000 ALF ADA *+2 JMP A,I DEF *+1,I ZERO-ORIGINED BRANCH TABLE DEF P21E DEF TYPE1 DEF TYPE2 DEF TYPE3 DEF TYPE4 DEF TYPE0 * * DISTINGUISH TYPE3 & TYPE4 BY "CNDX" * P21E LDA .2 GET SPECIAL FIELD LDB .3 JSB CODE LDA FLD3 ALF,RAR CMA,SSA,SLA BIT 12 OR 13 SET? JMP TYP3A NO: WORD-TYPE-3 SPECIAL (CNDX) LDA OPTKN CPA RTN JMP TYP1A JMP TYP4A * * ****************************** * * * PROCESS PSEUDO-OPS * TYPE0 LDA FLD2 ADA *+2 JMP A,I DEF *,I ONE-ORIGINED BRANCH TABLE DEF TY0.3 IGNORE EQU THIS PASS DEF DEFST DEF ONEST DEF ZERST DEF ALNST DEF ORGST DEF END2 * * ZERO STATEMENT * ZERST CLA STA INST1 JMP TY0.2 * * DEF STATEMENT * DEFST LDA @FLD6 FIND EXPRESSION LDB @FLD3 JSB BLNK? NOP JSB NUM SOS JMP TY0.1 LDA ERR19 JSB ERROR CLA TY0.1 STA INST1 CLA JMP TY0.2 * * ONES STATEMENT * ONEST CCB STB INST1 LDA =B377 * TY0.2 STA INST2 JSB OUTPT JMP P21 * * ALGN STATEMENT * ALNST JSB ALGN JMP TY0.3 * * ORG STATEMENT * ORGST JSB ORIG NOP * TY0.3 CLA JSB LSTR2 LIST WITHOUT CODE JMP P21 * * ****************************** * * * CREATE A WORD TYPE 1 INSTRUCTION. * * FIRST, CHECK MNEMONICS AND COLLECT THE BINARY * CODES FOR EACH FIELD. * TYPE1 LDA .2 GO GET A 'SPECIAL' CODE LDB .3 FROM FIELD 3. JSB CODE LDA FLD3 ALF,SLA ALLOWED IN TYPE-1 INSTRUCTION? JMP TYP1A YES. LDA ERR16 PRINT ERROR MESSAGE. JSB ERROR JSB DEFLT DEC 2 STA FLD3 TYP1A LDA .4 GO GET AN 'ALU' CODE LDB .4 FROM FIELD 4. JSB CODE LDA .6 GO GET A 'STORE' CODE LDB .5 FROM FIELD 5. JSB CODE LDA .7 GO GET AN 'S-BUS' CODE LDB .6 FROM FIELD 6. JSB CODE * * NOW PUT TOGETHER THE FIELDS OF THE TYPE 1 WORD. * LDB FLD3 SPECIAL FIELD LSR 5 LDB FLD5 STORE FIELD LSR 5 LDB FLD6 SBUS FIELD LSR 5 LDB FLD4 ALU FIELD LSR 1 JMP EMIT1 * * ****************************** * * * CREATE A WORD TYPE 2 INSTRUCTION. * FIRST, CHECK MNEMONICS AND COLLECT BINARY CODES * FOR EACH FIELD. * TYPE2 LDA .2 GET A 'SPECIAL' CODE LDB .3 FROM FIELD 3. JSB CODE LDA FLD3 ALF,SLA ALLOWED IN TYPE-2 INSTRUCTION? JMP TY2.0 YES. LDA ERR16 JSB ERROR JSB DEFLT DEC 2 STA FLD3 TY2.0 LDA .5 GO GET AN MODIFIER CODE LDB .4 FROM FIELD 4. JSB CODE LDA .6 GO GET A 'STORE' CODE LDB .5 FROM FIELD 5. JSB CODE LDB @FLD6 GET FLD 6 STARTING BYTE ADDRESS. JSB NUM CONVERT FIELD TO BINARY. SOS ANY PROBLEMS? JMP TY2.2 NO. TY2.1 LDA ERR11 PRINT ERROR MESSAGE. JSB ERROR CLA MAKE FIELD 6 = 0. TY2.2 STA FLD6 AND =B177400 IS # 8 BITS OR LESS? SZA JMP TY2.1 NO, SO ERROR. * * NOW PUT TOGETHER THE FIELDS OF THE TYPE 2 WORD. * LDB FLD3 SPECIAL FIELD LSR 5 LDB FLD5 STORE FIELD LSR 5 LDB FLD6 OPND FIELD LSR 6 STA INST1 CLA LSR 2 HI BITS OF OPND IOR FLD4 MODIFIER RAR,RAR JMP EMIT2 * * ****************************** * * * CREATE A WORD TYPE 3 INSTRUCTION. * FIRST, CHECK MNEMONICS AND COLLECT BINARY CODES. * TYPE3 LDA .2 GET SPECIAL FIELD LDB .3 JSB CODE LDA FLD3 ALF,RAR CMA,SSA,SLA BIT 12 OR 13 SET? JMP TYP3A NO: WORD-TYPE-3 SPECIAL LDA ERR15 JSB ERROR JSB DEFLT DEC 2 STA FLD3 TYP3A LDA .3 GO GET A 'CONDITION' CODE LDB .4 FROM FIELD 4. JSB CODE LDA .9 GET SENSE CODE (STORE FIELD) LDB .5 FROM FIELD 5 JSB CODE LDA OPTKN CPA RTN JMP TY3.4 LDB @FLD6 GET ADDRESS FIELD JSB NUM SOS JMP TY3.2 LDA ERR19 TY3.0 JSB ERROR LDA PCNTR DEFAULT TO ADDR 0 IN CURRENT BLK INA OR BLK+1 IF PCNTR=XXX777 AND =B177000 TY3.2 STA FLD6 LDB PCNTR IS IT IN SAME BLK OR INB BLK+1 IF PCNTR=XXX777 XOR B AND =B177000 SZA,RSS JMP TY3.3 YES LDA ERR23 OUT OF RANGE IN FIELD 6 JMP TY3.0 TY3.4 LDB @FLD6 ENSURE: NO EXPR FOR RTN OP JSB LOADB CPA BLNK JMP TY3.3 LDA ERR33 EXPR NOT ALLOWED JMP TY3.0 * * NOW PUT TOGETHER FIELDS OF TYPE 3 WORD * TY3.3 LDB FLD3 SPECIAL FIELD LSR 5 LDB FLD6 OPND FIELD LSR 9 MODULO 512 IOR FLD5 RJS SENSE RAR LDB FLD4 CONDITION FIELD LSR 1 JMP EMIT1 * * ****************************** * * * CREATE A WORD TYPE 4 INSTRUCTION. * WE ALREADY HAVE CODES FROM FIELDS 2 AND 3. * TYPE4 LDA .8 LDB .3 JSB CODE TYP4A LDA FLD3 GET SPECIAL FIELD LDB MX? CPA SPBLK+1 MX BLANK? SZB,RSS JMP TY4.3 LDA UNCD YES: CHANGE TO UNCD STA FLD3 TY4.3 ALF,RAR SLA BIT 13 SET? JMP TY4.0 YES: WORD-TYPE-4 SPECIAL LDA ERR17 JSB ERROR JSB DEFLT DEC 8 STA FLD3 TY4.0 LDA @FLD6 ENSURE: EMPTY FIELDS 4 & 5 LDB @FLD4 JSB BLNK? JMP *+2 JMP TY4.4 YES: B=@FLD6 LDA ERR25 JSB ERROR LDB @FLD6 TY4.4 JSB NUM SOS JMP TY4.1 LDA ERR19 JSB ERROR CLA DEFAULT TO 0 TY4.1 STA FLD6 AND MXAD1 SZA,RSS JMP TY4.2 XOR FLD6 MODULO MAX ADDR STA FLD6 LDA ERR23 OUT OF RANGE IN FIELD 6 JSB ERROR * * NOW PUT TOGETHER THE FIELDS OF THE TYPE 4 WORD. * TY4.2 LDB FLD3 LSR 5 LDB FLD6 LSR 11 EMIT1 STA INST1 CLA LSR 4 EMIT2 IOR FLD2 ALF STA INST2 JSB OUTPT JMP P21 * * ****************************** * * * WE COME HERE AFTER READING AN '$END' RECORD * IN PASS 2. * END2 JSB $LIST ENABLE LISTING CLA LIST $END IF NOT OURS LDB NOEND SZB,RSS JSB LSTR2 JSB DONE CLEAN UP LDB .6 WRITE CONSOLE END MSG LDA ANYER SZA LDB .12 STB BLEN JSB WRT.C DEF C.TTY DEF ENDMS DEF BLEN JMP ABORT ERROR RTN LDA XREF? CROSS-REF OPTION? SZA,RSS JMP STOP JSB XREF YES: SCHEDULE MXREF JMP STOPX SKIP PAGE EJECT (DONE BY MXREF) * * ABORT MICRO-ASSEMBLER * ABORT JSB DONE CLEAN UP JSB WRT.C PRINT ABORT MSG DEF C.TTY DEF AEND DEF .8 NOP ERROR RTN STOP JSB SPC.C EJECT PAGE DEF C.LST DEF .M2 NOP ERROR RTN LDA .M10 STA TEMP STOPX JSB END.C DEF ANYER ISZ TEMP TRY AGAIN FOR A WHILE JMP STOPX JMP 12 MP ABORT IF WE CAN'T QUIT NICE SPC 2 ABRT JSB WRT.C DEF C.TTY DEF AEND DEF .8 NOP JMP STOPX HED RTE MICRO-ASSEMBLER -- SUBROUTINES SKP ****************************** * * A L G N * * ENTRY: * JSB ALGN * * EFFECTS THE "ALGN" PSEUDO-OP BY ADJUSTING * PCNTR TO A HEX BOUNDARY. NOTE THAT WE * DO NOT FLAG P-OVERFLOW HERE (ANALOGOUS * TO "ORG" PROCESSING). * ALGN NOP LDA PCNTR ADA =B17 AND =B177760 JSB SETP JMP ALGN,I * * ****************************** * * B L N K ? * * ENTRY: * LDA * LDB * JSB BLNK? * * * * EXIT: * B= BPTR TO CHAR FOLLOWING LAST BLANK * * SKIPS CONTIGUOUS BLANKS UP TO (BUT NOT INCLUDING) * CHAR POINTED TO IN A-REG. IF ALL BLANKS, RETURNS * TO "TRUE" EXIT...OTHERWISE, RETURNS TO "FALSE" EXIT. * BLNK? NOP STA BTMP LDA BLNK JSB SKIP SKIP ALL BLANKS LDA BTMP @NEXT>=LIMIT? CMA,INA ADA B SSA JMP BLNK?,I NO: B=BPTR TO NEXT LDB BTMP YES: SET B=BPTR TO LAST+1 ISZ BLNK? JMP BLNK?,I BTMP BSS 1 * * ****************************** * * C L E A N * * 'CLEAN' FILLS A BUFFER WITH A GIVEN CHAR. * * CALLING SEQUENCE: * LDB * * LDA <+ NO. OF WORDS IN BUFFER> * * JSB CLEAN * ASC 1, * CLEAN NOP CMA,INA STA COUNT LDA BLNK2 BRING IN BLANKS CLE0 STA B,I INB ISZ COUNT JMP CLE0 JMP CLEAN,I * * ****************************** * * C M P B * * ENTRY: * LDA * LDB * JSB CMPB * DEC * * EXIT: * A<0 -- LEFT < RIGHT * =0 -- LEFT = RIGHT * >0 -- LEFT > RIGHT * B= NUMBER OF EQUAL CHARACTERS * * COMPARISON OF TWO STRINGS. * CMPB NOP STA CBINP STB CBDST LDA CMPB,I COMPUTE -COUNT CMA,INA STA COUNT SZA,RSS CHECK FOR ZERO LENGTH JMP CMPB2 CMPB1 LDB CBINP GET CHAR FROM LEFT STRING JSB LOADB STB CBINP STA CLFT LDB CBDST GET CHAR FROM RIGHT STRING JSB LOADB STB CBDST CMA,INA LEFT >= RIGHT? ADA CLFT SZA JMP CMPB2 ISZ COUNT LEFT=RIGHT JMP CMPB1 CMPB2 LDB CMPB,I MAX - RESIDUAL = # EQUAL CHARS ADB COUNT ISZ CMPB SKIP COUNT JMP CMPB,I CBDST BSS 1 CBINP BSS 1 CLFT BSS 1 * * ****************************** * * C N V R T * * ASCII TO BINARY CONVERSION ROUTINE. * * CALLING SEQUENCE: * A REG SHOULD BE 0 IF STRING OF OCTAL * ASCII DIGITS IS TO BE CONVERTED TO BINARY; * #0 IF STRING OF DECIMAL ASCII DIGITS. * B REG SHOULD CONTAIN THE STARTING BYTE ADDRESS * OF THE STRING OF ASCII DIGITS TO BE * CONVERTED. * JSB CNVRT * * ON RETURN RESULT IN A REG. * OVERFLOW SET ON ERROR * B= BPTR TO NEXT CHAR (EXCEPT WHEN OVERFLOW IS SET). * CNVRT NOP STB TMPC1 SAVE BYTE ADDRESS LDB .8 PUT OCTAL BASE IN B. SZA WAMT DECIMAL? LDB .10 YES, PUT DECIMAL BASE INB. STB TMPC2 SAVE BASE. CLA CLEAR TEMPORARY STA TMPC3 STA CFLG CN1 LDB TMPC1 LOAD JSB LOADB BYTE. ADA .M48 VALUE OF BYTE SSA <@60? JMP CN4 YES STA TMPC4 NO,SAVE BYTE. LDA TMPC2 IS CMA,INA BUTE ADA TMPC4 NON LEGAL SSA,RSS DIGIT? JMP CN4 YES LDA TMPC3 COMPUTE NEXT MPY TMPC2 TEMPORARY RESULT. SZB OVERFLOW? JMP CN2 YES CLO NO, CLEAR O-BIT. ADA TMPC4 ADD IN NEW DIGIT SOC OVERFLOW? JMP CNVRT,I YES RETURN STA TMPC3 SAVE INTERMEDIATE RESULT ISZ CFLG SET GOOD DIGIT FLAG. ISZ TMPC1 BUMP BYTE ADDRESS. JMP CN1 CN4 LDA CFLG ILLEGAL DIGIT FOUND LDB TMPC1 PUT BYTE ADDRESS IN B SZA,RSS DID WE GET ANYTHING? STO NO, SET ERROR CONDITION LDA TMPC3 PUT RESULT IN A-REG JMP CNVRT,I CN2 STO OVERFLOW JMP CNVRT,I * * ****************************** * * C O D E * * "CODE" OBTAINS THE BINARY CODE EQUIVALENT FOR * THE MNEMONIC IN A GIVEN FIELD, AND STORES IT IN * THE APPROPRIATE FIELD STORAGE LOCATION, EG. "FLD1", ETC. * IT PRINTS AN ERROR MESSAGE IF THE MNEMONIC WAS INVALID. * * CALLING SEQUENCE: * LDA * LDB * JSB CODE * * CALLED FOR TYPES 2 THROUGH 9. * UPON RETURN: THE CODE WILL BE IN THE FIELD STORAGE * LOCATION; A AND B REGS ARE NOT SIGNIFICANT. * CODE NOP STA CSAVA STB CSAVB ADB @FADR GET STARTING BYTE ADDRESS OF LDB B,I FIELD. JSB $SRCH GO GET BINARY CODE. SSA JMP C06 LDB CSAVA MNEMONIC TYPE CPB .6 JMP C01 CPB .7 JMP *+2 JMP C07 * VERIFY THAT IT'S OK IN S-BUS FIELD LDB A BLF,SLB JMP C07 OK JMP C06 * VERIFY THAT IT'S OK IN STORE FIELD C01 LDB A BLF,RBR SLB JMP C07 OK C06 LDA CSAVA ADA CERR LDA A,I JSB ERROR PRINT ERROR MESSAGE. JSB DEFLT CSAVA BSS 1 TABLE TYPE C07 LDB CSAVB STORE CODE IN PROPER ADB @FLDS FIELD WORD. STA B,I JMP CODE,I CERR DEF *-1,I 2-ORIGINED TABLE DEF ERR3 DEF ERR4 DEF ERR5 DEF ERR6 DEF ERR7 DEF ERR8 DEF ERR3 DEF ERR9 * * ****************************** * * C O N ? * * ENTRY: * LDB * JSB CON? * * * * EXIT (OK EXIT): * A= VALUE * B= BPTR TO NEXT CHAR (AFTER NUMERIC STRING) * * ROUTINE CONVERTS A NUMERIC STRING OF THE FORM: * [+/-] [B] * CON? NOP CCA STA POS? JSB LOADB CPA MINUS ISZ POS? CLEAR FLAG & SKIP CPA PLUS JMP *+2 SKIP SIGN ADB .M1 BACK-UP OVER FIRST CHAR JSB OCT? TRAILING "B"? JMP C.DEC NO CLO YES: CONVERT B-FORM OCTAL JSB CNVRT SOC C JMP CON?,I INVALID NUMBER INB SKIP "B" JMP C.CV1 C.DEC CCA CONVERT DECIMAL VALUE CLO JSB CNVRT SOC C JMP CON?,I INVALID NUMBER C.CV1 STB CTMP SAVE POINTER LDB POS? CORRECT SIGN SZB,RSS CMA,INA POS?=0 ==> NEGATE LDB CTMP RESET B=BPTR TO NEXT CHAR ISZ CON? JMP CON?,I CTMP BSS 1 * * ****************************** * * D E C M L * * ENTRY: * LDA * LDB * JSB DECML * EXIT: * B= BYTE POINTER TO BYTE PRECEDING MOST-SIGNIFICANT * DIGIT * * ROUTINE CONVERTS NON-NEGATIVE NUMBER (IE., SIGN=0) * TO 4-DIGIT DECIMAL ASCII STRING * DECML NOP STA BINRY LDA .M4 NUMBER OF DIGITS STA DGITS DEC0 STB @DEST CLB LDA BINRY DIV .10 STA BINRY BINRY/10 LDA B BINRY MOD 10 ADA =B60 LDB @DEST JSB STORB ADB .M2 BPTR TO NEXT MOST-SIG DIGIT ISZ DGITS JMP DEC0 JMP DECML,I * * ****************************** * * D E F L T * * ENTRY: * JSB DEFLT * DEC * * EXIT: * A= DEFAULT FIELD ENTRY FOR TABLE TYPE * * TABLE TYPE MUST BE ON [1,9] * DEFLT NOP LDA DEFLT,I ISZ DEFLT ADA @DFLT LDA A,I JMP DEFLT,I * @DFLT DEF *,I ONE-ORIGINED XE TABLE DEF OPBLK DEF SPBLK DEF ALZ DEF ALBLK DEF HIGH DEF STBLK DEF SBBLK DEF SPBLK DEF SNBLK @MXD DEF *,I ONE-ORIGINED MX TABLE DEF OPBLK+1 DEF SPBLK+1 DEF CDBLK+1 DEF ALBLK+1 DEF HIGH+1 DEF STBLK+1 DEF SBBLK+1 DEF UNCD DEF SNBLK+1 * * ****************************** * * D O N E * * ENTRY: * JSB DONE * * FOR PASS2 COMPLETION ONLY. DUMP CURRENT BUFFER AND * CLOSE OBJECT FILE. ALSO PRINT PASS-COMPLETION * MESSAGE. * DONE NOP ISZ END? LDA FILE RESET FILE STATE LDB FMGR IGNORE IF FILE ERROR SZB,RSS STA FILE? JSB EMBUF DUMP RECORD & WRITE END RECORD JSB FINI WRITE END-PASS MSG JMP DONE,I * * ****************************** * * E J E C T * E J C T ? * * ENTRY: * JSB EJECT -OR- JSB EJCT? * * EJECTS PAGE AND PRINTS HEADING. IF ENTRY IS THROUGH * EJCT?, WE IGNORE REQUEST IF LISTING IS NOT ENABLED. * WE DON'T PAGE EJECT IF WE ARE ALREADY POSITIONED AT * TOP OF FORM.