ASMB,R,B,L,C *********************************************************** * * BCS 210X MICROASSEMBLER * ********************************************************** NAM MICRO EXT .IOC.,LEADR,.MEM. ENT MICRO JMP MICRO SUP * HED PASS 1 * * PASS 1 STARTS HERE. * * * PRINT REQUEST FOR INPUT L.U. #. * MICRO NOP LDA PNT01,I GET ADA .3 LWAM LDA 0,I FROM SYSTEM STA LWAM SAVE IT LDA .+1 SPACE A FEW LINES ON KEYBOARD. LDB .+2 JSB SPACE LDA .+2 JSB IOSUB OUTPUT PROGRAM TITLE. DEF TTYO DEF MSG1 DEF .M22 LDA .+1 LDB .+1 SPACE A LINE ON KEYBOARD. JSB SPACE D1 LDA B1 SET 1 (KEYBOARD) AS INITIAL STA RDR "CARD" INPUT L.U. NO. LDA .+2 JSB IOSUB DEF TTYO DEF MSG2 DEF .M32 * * INITIALIZE. * LDA SYMD STA SYMB STA HDTAB ADA .+4 STA VALU INA STA TAG LDA B4 SET 4 AS PUNCH L.U. # STA PCH DEFAULT VALUE. LDA B6 SET 6 AS LIST L.U. # DEFAULT STA LIST VALUE. CLA SET FLAG TO "DON'T SAVE SOURCE STA MAG ON MAG TAPE". STA ILUN STA SPRES STA PCNTR STA DBUG STA ORFLG STA NMERR STA SYFLG STA BEWFL STA RCFLG CMA STA BASE LDA NO PUT THE 'NO' IN STA DJ+3 'NO ERRORS' MESSAGE. LDA RDRAD STA RDCR9 LDA .+1 STA PASSN LDA OLY2 SET 'JMP INPUT' INSTRUCTION. STA OLAY2 STA OLAY8 LDA OLY3 SET 'JMP .BAD.' INSTRUCTIONS. STA OLAY3 STA OLAY4 STA OLAY5 STA OLAY6 STA OLAY7 LDA .-2 STA LASTP LDA .+5 STA PNBUF LDA .1024 CLEAN LDB SYMD SYMBOL JSB CLEAN TABLE. DEF . * NOW SET STARTING BYTE ADDRESSES OF INPUT FIELDS. LDB ACARD RBL STB F1ADR ADB .+9 STB F2ADR ADB .+5 STB F3ADR ADB .+5 STB F4ADR ADB .+5 STB F5ADR ADB .+5 STB F6ADR * END OF ADDRESS SETTING * * INPUT AND EXAMINE A RECORD. * INPUT JSB RDCRD READ CARD LDB CRLEN WAS CARD A BLANK? SZB,RSS JMP INPUT YES. IGNORE. READ NEXT CARD. LDB ACARD NO. EXAMINE RBL 1ST STB BYTAD BYTE JSB LOADB CPA ASTER =*? JMP INPUT YES, IGNORE. CPA BUCK =$? JMP CNTRL CONTROL STATE. LDB ORFLG HAS ORIGIN BEEN ESTABLISHED? SZB,RSS JMP INP3 NO, SO ERROR. CPA SPAC YES. LABEL PRESENT? JMP INP1 NO. LDB F2ADR YES. THIS AN EQU STATEMENT? JSB EQU SZA,RSS JMP INPUT YES. DONE, GO READ NEXT STATMT. CLE NO. ADD LABEL TO LDA PCNTR LDB BYTAD JSB SYMAD SYMBOL TABLE INP1 JSB SKP 'SKP' PSEUDO OP? SZA JMP INPUT YES. GET NEXT RECORD. ISZ PCNTR NO. INCREMENT PROGRAM COUNTER. CLB,INB LDA PCNTR AND =B377 DOES THAT MAKE REL ADDR CPA =B377 = 377 OCT? STB BEWFL YES. SO SET BEWARE FLAG. LDA PCNTR NO. DOES IT MAKE NEXT AND =B777 REL ADDR = 401 OCT? CPA =B401 RSS JMP INPUT NO, SO OK. LDA BEWFL IS 'BEWARE, WE PASSED THRU CPA =B1 REL ADDR 377' FLAG SET? RSS YES JMP INPUT NO, SO OK. LDA .-9 PROGRAM IS OUT OF BOUNDS. INP2 JSB ERROR YES. PRINT ERROR MESSAGE. JMP ABORT QUIT. INP3 LDA .-10 JMP INP2 * * CONTROL CARD PROCESSOR * CNTRL INB CHECK NEXT JSB LOADB BYTE. CPA .O =O? JMP CTRL1 YES. 'ORIGIN' OR 'OUTPUT'. CPA .S =S? JMP CTRL2 YES. COULD BE SYMTAB OR SUPPR. CPA .N =N? JMP CTRL3 YES COULD BE NOLIST OR NOPUNCH. CPA .E =E? JMP CTRL4 YES EXTERNAL OR END CPA .I =I? JMP CTRL7 YES. INPUT L.U. #. CPA .P =P? JMP CTRL8 YES. PASS 2 MAG TAPE L.U. #. CPA .L =L? JMP CTRL9 YES. LIST L.U. #. CPA .R =R? JMP CTR10 YES. SUITCASE ROM OBJECT TAPE. * * BAD CONTROL STATEMENT * .BAD. LDA .-2 PRINT BAD JSB ERROR CONTROL STATEMENT MESSAGE. LDA .-2 LIST THE STATEMENT, ADJUSTING ADA CRLEN # OF CHARS TO INCLUDE LIST STA CRLEN DEVICE CONTROL CHARS. LDA .+2 JSB IOSUB DEF LIST DEF CARD-1 DEF CRLEN JMP INPUT READ NEXT CARD. * * OUTPUT AND ORIGIN CONTROL STATEMENTS * ORIG NOP CTRL1 INB JSB LOADB CPA .R ORIGIN CARD? JMP CTR15 YES. CPA .U OUTPUT CARD? RSS YES. OLAY9 JMP .BAD. NO, THEN ERROR. * OUTPUT STATEMENT STB SAVB FIRST, SEE IF USER TOLD US LDB PCH "NO PUNCH" PREVIOUSLY. SZB,RSS JMP .BAD. YES, HE DID, SO ERROR. LDB SAVB NO, HE DIDN'T. JSB LOGUN GET L.U. #. SOC # OK? JMP .BAD. NO, ERROR. STA PCH OLAY8 JMP INPUT GO READ NEXT CARD. * ORIGIN STATEMENT CTR15 LDA .EQ. SKIP TO JSB SKPTO EQUAL SIGN. SOC END OF LINE? OLAY3 JMP .BAD. YES, ERROR. INB LDA SPAC SKIP OVER JSB SKIP BLANKS SOC END OF LINE? OLAY4 JMP .BAD. YES, ERROR. CLA CONVER TO JSB CNVRT OCTAL SOC ANY ERRORS? OLAY5 JMP .BAD. YES. LDB 0 NO AND LOMSK SEPARATE STA T.001 LOWER LDA 1 & AND HIMSK UPPER STA T.002 LDB BASE HAS BASE SSB,RSS BEEN INITIALIZED? JMP CTR18 YES. CMA,INA NO. IS SPECIFIED ADDRESS ADA B7400 GREATER THAN MAX ALLOWED? SSA OLAY6 JMP .BAD. YES, ERROR. LDA T.002 NO. SET STA BASE BASE. CTR18 LDB T.001 IS NEW ORIGIN VALUE LESS THAN CMB OLD 'PCNTR' VALUE? LDA PCNTR AND =B377 ADA 1 SSA,RSS OLAY7 JMP .BAD. YES, ERROR. LDA T.001 SET IOR T.002 STA PCNTR PCNTR CLA CLEAR 'BEWARE WE PASSED THRU STA BEWFL REL ADDR 377' FLAG. LDA .+1 SET 'ORIGIN ESTABLISHED' FLAG. STA ORFLG OLAY2 JMP INPUT JMP ORIG,I * * SUPPRESS AND SYMTAB CONTROL STATEMENTS * CTRL2 INB JSB LOADB CPA .U SECOND CHAR A "U"? JMP CTR25 YES. CPA .Y NO. SECOND CHAR A "Y"? RSS YES. JMP .BAD. NO. THEN ERROR. * SYMTAB STATEMENT CLA,INA SET SYMBOL TABLE FLAG. STA SYFLG JMP INPUT GO READ NEXT RECORD. * SUPPRESS STATEMENT CTR25 CCA STA SPRES SET SUPPRESS FLAG. JMP INPUT GO READ NEXT RECORD. * * NOLIST OR NOPUNCH * CTRL3 INB CHECK INB 3RD BYTE JSB LOADB CLB CPA .L =L? JMP *+6 CPA .P =P? RSS JMP .BAD. NO ERROR STB PCH SUPPRESS PUNCHING JMP INPUT STB LIST ITS L THUS NOLIST. JMP INPUT EXIT. * * SUITCASE ROM OBJECT TAPE OPTION * CTR10 CLA,INA STA RCFLG JMP INPUT * * END OR EXTERNAL * CTRL4 INB CHECK NEXT JSB LOADB BYTE. CPA .X =X? RSS JMP CTR42 LDA .EQ. YES EXTERNALS SKIP TO JSB SKPTO = SIGN. SOC END OF CARD? JMP .BAD. YES ERROR CTR41 INB NO LDA SPAC SKIP JSB SKIP BLANKS. SOC END OF CARD? JMP .BAD. YES ERROR. STB SAVM NO, SAVE ADDR OF SYMBOL. LDA SPAC SKIP TO JSB SKPTO END OF SYMBOL. SOC END OF CARD? JMP .BAD. YES ERROR LDA SPAC NO. SKIP ACROSS JSB SKIP BLANKS. SOC END OF CARD? JMP .BAD. YES ERROR. STB SAVN SAVE START ADDR OF VALUE. CLA CONVERT JSB CNVRT OCTAL VALUE. SOC END OF CARD.OR ERROR. JMP .BAD. YES ERROR. LDB SAVM GET SYMBOL ADDRESS. CCE SET E-REG TO INDICATE EXT JSB SYMAD ADD TO SYMBOL TABLE LDB SAVN GET START ADDR OF VALUE. LDA COMMA SKIP JSB SKPTO TO COMA SOC END OF CARD? JMP INPUT EXIT JMP CTR41 GO BACK. CTR42 CPA .N "N" RSS JMP .BAD. NO, BAD CONTROL STATE LDA MAG YES, '$END'. SOURCE ON MAG TAPE? SZA,RSS JMP CTR47 NO. LDA .+3 YES. WRITE END-OF-FILE(EOF). JSB IOSUB DEF MAG DEF * DUMMY PARAMETERS, SINCE THESE DEF * NOT NEEDED TO WRITE EOF. NOP LDA B400 REWIND TAPE TO START OF STA MCODE SOURCE FILE. LDA .+3 JSB IOSUB DEF MAG DEF * DUMMY PARAMETERS, SINCE THESE DEF * NOT NEEDED TO REWIND TAPE. NOP LDA B100 NOW REFIX MAG TAPE SUBFUNCTION STA MCODE CODE FOR NON-REWIND OPERATIONS. NOP CTR47 LDA SYFLG SYMBOL TABLE SZA,RSS WANTED? JMP PASS2 NO, SO GO TO PASS 2. LDA HDTAB YES. GET STA PNTR START OF TABLE CPA SYMB END? JMP PASS2 YES. GO TO PASS2. LDB LIST JSB TTYIO WE LISTING ON TTY? SZA JMP CTR49 NO. LDA .+1 YES. SO JUST SPACE A FEW LINES. LDB .+2 JSB SPACE RSS CTR49 JSB EJECT EJECT A PAGE LDA .+2 PRINT SYMBOL TABLE HEADING. JSB IOSUB DEF LIST DEF HED1 DEF .-14 LDA LIST LDB .+2 JSB SPACE PR1 LDA .+10 FILL THE PERTINENT PART OF LDB ACARD ASCII OUTPUT BUFFER WITH JSB CLEAN SPACES. DEF BLNK2 * 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 (I.E. VALUE) OF SYMBOL. ISZ PNTR LDA PNTR,I ISZ PNTR SSA IS THIS AN EQU SYMBOL? JMP PR4 YES. THEN NO PRINT SYMB VAL. * CONVERT TO ASCII AND STORE IN * NEXT LOCATION IN OUTPUT BUFFER. LDB ACARD RBL ADB .+10 STB SAVB SAVE BYTE ADDRESS. JSB OCTL DEC 6 LDA PNTR,I SZA,RSS JMP *+3 LDA .X RSS LDA SPAC LDB SAVB GET BYTE ADDR OF VALUE. ADB .+6 INC PAST VALUE. JSB STORB STORE SPACE OR 'X' THERE. PR4 LDA BLNK2 STA CARD-1 LDA .+2 JSB IOSUB DEF LIST ENTRY DEF CARD-1 DEF .M20 ISZ PNTR POINT LDA PNTR TO CPA SYMB NEXT ENTRY. END? RSS JMP PR1 NO, GO DO NEXT. JSB EJECT YES EJECT FOR PASS 2. JMP PASS2 NOW GO TO PASS2. * * INPUT CARD * CTRL7 STB SAVB FIRST, SEE IF USER TOLD US LDB PCH "NO PUNCH" PREVIOUSLY. SZB,RSS JMP .BAD. YES, HE DID, SO ERROR. LDB SAVB JSB LOGUN GET L.U.#. SOC # OK? JMP .BAD. NO, ERROR. STA RDR YES, OK. JMP INPUT GO READ NEXT CARD. * * PASS2 CARD * CTRL8 JSB LOGUN GET L.U. #. SOC # OK? JMP .BAD. NO, BAD. STA MAG JMP INPUT GO READ NEXT CARD. * * LIST CARD * CTRL9 STB SAVB FIRST, SEE IF USER TOLD US LDB LIST "NO LIST" PREVIOUSLY. SZB,RSS JMP .BAD. YES, HE DID, SO ERROR. LDB SAVB JSB LOGUN GET L.U. #. SOC # OK? JMP .BAD. NO, ERROR. STA LIST YES, OK. JMP INPUT GO READ NEXT CARD. HED PASS 2 * * * PASS 2 STARTS HERE. * * * * INITIALIZATION FOR PASS 2. * PASS2 LDA .+2 STA PASSN LDA MAG IS SOURCE ON MAG TAPE? SZA JMP P20F YES. SKIP 'RELOAD SOURCE' MSG. LDA .+1 LDB .+2 JSB SPACE LDA .+2 JSB IOSUB DEF .+2 DEF MSG5 DEF .M28 LDA .+1 LDB .+2 JSB SPACE HLT 34B * * INITIALIZE FLAGS, COUNTERS, ETC, FOR 2ND PASS. * GENERATE LEADER. * P20F CLA STA PCNTR STA OLAY2 CMA STA BASE CLA,INA STA LINE# LDA OLAY2+1 STA OLAY3 STA OLAY4 STA OLAY5 STA OLAY6 STA OLAY7 STA OLAY8 STA OLAY9 JSB LEEDR * * READ A SOURCE RECORD. * P21 CLA STA EQUFL CLEAR EQU FLAG. JSB RDCRD READ CARD. LDB CRLEN WAS CARD A BLANK? SZB,RSS JMP P21 YES. IGNORE. READ NEXT CARD. LDB ACARD NO. CHECK RBL 1ST JSB LOADB BYTE. CPA ASTER =*? JMP P21A YES,IGNORE BUT PRINT CPA BUCK =$? RSS JMP P21B NO, GOOD CODE. INB YES JSB LOADB CPA .O =ORIGIN? RSS JMP P21AB NO,CHECK FOR END CLA YES STA OLAY2 PROCESS JSB ORIG ORIGIN CARD JMP P21A P21AB CPA .E BYTE IS E? RSS JMP P21A NO, NOT END IGNORE IT INB YES JSB LOADB BYTE IS N? CPA .N JMP END P21A LDA CRLEN LIST THE RECORD IN FORMAT 1. JSB LSTR ISZ LINE# JMP P21 GO BACK. P21B JSB SKP 'SKP' PSEUDO OP? SZA JMP P21 YES. ALREADY PROCESSED. LDA ORFLG NO. HAS ORIGIN BEEN SZA,RSS ESTABLISHED? RSS NO, THEN ERROR. JMP P21C YES, SO OK. P21B4 LDA .+10 PRINT ERROR MESSAGE. JSB ERROR JMP ABORT QUIT. * * DETERMINE STATEMENT TYPE. * P21C JSB ONEST 'ONES' STATEMENT? SZA JMP P21C2 YES. WAS PROCESSED. JSB ZERST NO. 'ZEROES' STATEMENT? SZA JMP P21C2 YES. WAS PROCESSED. LDB F2ADR NO. GET FIELD 2 START BYTE ADDR. JSB DEF DEF STATEMENT? SZA JMP P21C3 NO. P21C2 JSB OUTPT YES. OUTPUT IT. JMP P21 GO READ NEXT RECORD. P21C3 LDB F2ADR JSB EQU EQU STATEMENT? SZA JMP P21C5 NO. CLA,INA YES. PRINT IT. STA EQUFL JSB OUTPT JMP P21 GO READ NEXT RECORD. P21C5 LDB F2ADR GET FIELD 2 STARTING BYTE ADR. LDA .+1 GO GET AN JSB $SRCH 'OPCODE' BINARY OPCODE. CPA .-1 BAD MNEMONIC? RSS YES. JMP P21D NO. LDA .+3 YES. OUTPUT JSB ERROR MESSAGE. JSB NOPER CREATE NOP MICROINSTRUCTION. JMP TY1.6 GO PROCESS IT. P21D STA 1 AND HHMSK SAVE BINARY STA FLD2 OPCODE. LDA 1 ISOLATE AND HHHMS WORD TYPE. ALF CPA .+1 WORD TYPE 1? JMP TYPE1 YES. CPA .+2 WORD TYPE 2? JMP TYPE2 YES. LDB F3ADR GET FIELD 3 STRTNG BYTE ADDR. LDA .+2 GO GET A JSB $SRCH 'SPECIAL' BINARY OPCODE. CPA .-1 BAD MNEMONIC? RSS YES. JMP P21E NO. LDA .+4 YES. OUTPUT ERROR MESSAGE. JSB ERROR JSB NOPER NOP WORD TYPE 1 FIELDS. JMP TY1.6 GO OUTPUT WD TYPE 1 INSTR. P21E STA FLD3 SAVE 'SPECIAL' OPCODE. CPA CNDX WAS FIELD 3 'CNDX'? RSS YES. JMP TYPE4 NO, SO WORD TYPE 4. LDA FLD2 WAS FIELD 2 'JMP'? CPA JMP JMP TYPE3 YES, SO WORD TYPE 3. JMP TYPE4 NO, SO (BAD) WORD TYPE 4. * SKP * * 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 CPA JTAB WAS IT 'JTAB'? JMP TY1.0 YES. 'JMP-SPEC' BUT OK. CPA RTN WAS IT 'RTN'? JMP TY1.0 YES. 'JMP-SPECIAL' BUT OK. ADA .M24 NO. OTHER 'JMP-SPECIAL'? SSA,RSS RSS YES, SO ERROR. JMP TY1.0 NO. LDA .+4 PRINT ERROR MESSAGE. JSB ERROR LDA .+2 STORE A NOP IN THE ADA DEFLT FIELD 3 LDA 0,I WORD. LDB .+3 ADB FWORD STA 1,I TY1.0 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. * TY1.6 LDA FLD3 BITS 0-4 GET FIELD 3 (HERE, STA INST1 A 'SPECIAL'). LDA FLD5 BITS 5-9 GET FIELD 5 (HERE, ALF A 'STORE'). ALS IOR INST1 STA INST1 LDA FLD6 BITS 10-14 GET FIELD 6 (HERE, ALF,ALF AN 'S-BUS'.) ALS ALS IOR INST1 STA INST1 LDA FLD4 BITS 15-19 GET FIELD 4 (HERE, AN RAR 'ALU'). AND MSK15 IOR INST1 STA INST1 BIT 15 DONE. LDA FLD4 ARS STA INST2 BITS 16-19 (0-3) DONE. LDA FLD2 BITS 20-23 (4-7) GET ALF FIELD 2(HERE, 'OPCODE'). IOR INST2 STA INST2