/XOD (DECUS 8-89) IFNDEF BRLOC IFNDEF N IFNDEF H FIELD N *6430 START, HLT /IN CASE PROGRAMS RUN WILD. APOS3, TAD (NOP DCA DIRADI TAD TEMP2 AND (4400 SZA CLA JMP .+5 TAD PRIN /DIRECT AND,TAD,ISZ,DCA DCA DIRADI TAD (NOP DCA PRIN TAD PRAD DCA PRINAD /SET UP PROCEED ADDRESS RIF TAD (CIF DCA RENTER /SET UP CIF '.' TO DISABLE INTERRUPTS TAD BKPTIF SPA /IS A BREAKPOINT ASSIGNED JMP NOBKPT / NO JMP APOS4 STMASK, ISZ LL /SET MASK UL, ISZ LL /SET UPPER LIMIT JMP LL CR, SNL /ANYTHING TYPED ISZ OREG / IS A REGISTER OPEN JMP CR0 / NO OR NO JMS STORE / YES, BOTH, STORE EXPRESSION JMP CR0 APEXS, 0 /APOS, EXCL SUBROUTINE CMA DCA PROCCT /SET UP PROCEED COUNTER TSF JMP .-1 /WAIT FOR TTY FLAG TO SET JMP I APEXS MONIT, 7600 /CLA CIF CDF /SET IF AND DF TO 0 JMP I .-2 /GO TO 07600 BKPTYP, JMS TYDIG /TYPE FIELD NUMBER AND SEPARATOR TAD BKLAST JMS OCPT /TYPE BREAKPOINT LOCATION TAD (251 JMS TYO /TYPE RIGHT PARENTHESIS JMS TYO /TYPE SPACE TAD SAVLNK JMS TYDIG /TYPE LINK AND SEPARATOR TAD SAVAC JMS OCPT /TYPE ACCUMULATOR JMP RETURN TYDIG, 0 /TYPE DIGIT AND SEPARATOR TAD (260 JMS TYO /TYPE DIGIT TAD (273 /SEMICOLON JMS TYO /TYPE SEPARATOR JMP I TYDIG / EXIT OCPT, 0 /TYPE FOUR OCTAL DIGITS CLL RAL DCA OCPTNM /FOR KEEPING NUMBER TAD (-4 DCA OCPTCT /FOR DIGIT COUNT OCPT1, TAD OCPTNM /GET NUMBER RTL /ROTATE LEFT THREE BITS RAL DCA OCPTNM /SAVE AGAIN TAD OCPTNM AND (7 /MASK TO DIGIT TAD (260 /FORM ASCII CODE JMS TYO /TYPE DIGIT ISZ OCPTCT /INDEX, TEST COUNT JMP OCPT1 /KEEP GOING JMP I OCPT /EXIT QUOTE, DCA BKPT /STORE CURRENT EXPRESSION RAR /SET LINK IF NO EXPRESSION TAD FIELDD /GET CURRENT FIELD DCA BKPTIF /STORE FIELD WITH INDICATOR JMP CR0 OCPTNM= APEXS /KEEPS OCTAL PRINT NUMBER OCPTCT= TYDIG /DIGIT COUNT FOR OCPT PAGE SAVLNK, 0 /SAVED LINK AT BREAKPOINT SAVAC, 0 /SAVED ACCUMULATOR AT BREAKPOINT SAVDF, 0 /SAVED DATA FIELD AT BREAKPOINT TTYSAV, 0 /SAVES TTY FLAG STATUS, 0=CLEAR, NON-0=SET IONSAV, 0 /0 OR 1 TO SAVE INTERRUPT STATUS PROCCT, 0 /PROCEED COUNTER BKPTIF, 4000 /BREAKPOINT FIELD (BITS 6-8) OR MINUS SIGN TO /INDICATE NO BREAKPOINT ASSIGNED BKPT, 0 /BREAKPOINT LOCATION PROCIF, 4000 /PROCEED INSTRUCTION FIELD (BITS 6-8) OR MINUS /TO INDICATE A PROCEED CANNOT BE DONE BKLAST, 0 /LAST BREAK LOCATION,USED FOR PROCEEDING FIELDS, H^10 /HIGHEST FIELD USED (BITS 6-8) /RE-ENTER AFTER BREAKPOINT ENCOUNTERED OR AFTER FORCED INTERRUPT RENTER, CIF!N^10 /CIF '.' OR JMP INTRPT / OR 0000 (INDICATOR /OF RESTART NOW IS FROM WITHIN THIS PROGRAM) DCA SAVAC /SAVE ACCUMULATOR GLK /LINK TO BIT 11 DCA SAVLNK /SAVE LINK RDF DCA SAVDF /SAVE DATA FIELD TAD BKPT DCA BKLAST /SAVE THE BREAKPOINT LOCATION 12-BIT ADDRESS TAD BKPTIF DCA PROCIF /SAVE THE BREAKPOINT LOCATION FIELD DCA IONSAV /CLEAR TO INDICATE IOF IAC DCA TTYSAV /STORE NON-ZERO SO TTY FLAG IS UNAFFECTED ISZ PROCCT /INDEX AND TEST PROCEED COUNTER JMP MULTPR /MULTIPLE PROCEEDS CCDF, CDF 0 /TIME TO INFORM USER. LOOK AT FIELD 0 TAD I (0 DCA SAV0 /SAVE LOCATION 00000 TAD I (1 DCA SAV1 /SAVE LOCATION 00001 TAD (-4 DCA COUNT1 /SET UP COUNT FOR TIMING LOOP TAD (JMP INTRPT DCA RENTER /RESET RENTER IN CASE OF FORCED INTERRUPT TAD (JMP BRLOC DCA I (1 /SET UP TO RE-ENTER IN CASE OF INTERRUPT CLA IAC /SET ACC. TO 1 TO INDICATE TTY FLAG SET WAITLP, ISZ TEMP1 /WAITLOOP JMP WAIT /THIS ALLOWS INTERRUPT AFTER CIF AT RENTER ISZ COUNT1 /SKIP ON 100 MS. TIME-OUT JMP WAIT CLA /TTY FLAG WAS CLEAR, SET TO NULLL CHARACTER TLS /TYPE IT, CLEAR TTY FLAG UNTIL 100 MS. WAIT, TSF /IS FLAG CLEAR JMP WAITLP /YES, KEEP WAITING DCA TTYSAV /SAVE 0 FOR CLEAR OR 4000 FOR SET TAD SAV0 DCA I (0 /RESTORE LOCATION 00000 TAD SAV1 DCA I (1 /RESTORE LOCATION 00001 JMS RESFLD /RESTORE DATA FIELD TAD PROCIF CLL RTR RAR JMP BKPTYP /BREAKPOINT TYPE-OUT, ETC. INTRPT, ISZ IONSAV /IN CASE OF INTERRUPT, SET 10 1 JMP WAIT /GO BACK TO WAIT LOOP APOS4, JMS SETFLD /YES, SET UP DATA FIELD TAD (JMP BRLOC DCA I BKPT /SET UP THE BREAKPOINT INSTRUCTION TAD FIELDS /INITIALIZE TO HIGHEST FIELD NUMBER APOS5, DCA TEMP1 /CONTAINS FIELD NUMBER TAD TEMP1 JMS SETFLD /SET UP FOR FIELD TAD RENTER DCA I (BRLOC /SET UP CIF INSTRUCTION TAD (JMP I BRLOC+2 DCA I (BRLOC+1 /SET UP 'JMP I .+1' TAD (RENTER DCA I (BRLOC+2 TAD TEMP1 TAD M10 /SUBTRACT 1 FROM FIELD NUMBER SMA /ANY MORE FIELDS JMP APOS5 /YES, KEEP GOING NOBKPT, CLA IAC TAD CCDF /FORM CIF TAD PROCIF DCA CIFPRI /SET UP CIF INSTRUCTIONS //FOR THE PROCEEE/D TAD PROCIF JMS SETFLD /SET UP DATAFIELD FOR DIRECT DATA ADDRESSING STL RAR /ACC.=4000 DCA PROCIF /MAKE NEGATIVE SO NO PROCEED UNTIL AFTER BREAK ISZ BKLAST /INDEX POINTER TO LAST BREAK LOCATION M10, 7770 /-10 TAD TTYSAV SNA CLA /ACC. IS 0 IF FLAG IS TO BE CLEARED TAD (TCF DCA TTYPRI /SET UP 0 OR TCF TO PRESERVE TTY FLAG TAD IONSAV /EITHER 0 OR 1 TAD CIOT /IOT DCA IONPRI /SET UP EITHER IOT OR ION TAD SAVLNK CLL RAR /RESTORE LINK TTYPRI, TCF /0 OR TCF TO PRESERVE TTY FLAG TAD SAVAC /RESTORE ACCUMULATOR DIRADI, 0 /DIRECT ADDRESSING JMP .+3 ISZ BKLAST /SKIP OCCURRRED ON ISZ NOP DCA SAVAC TAD SAVDF JMS SETFLD /RESTORE DATA FIELD TAD SAVAC CIFPRI, 0 /CIF TO PROCED FIELD IONPRI, 0 /EITHER IOT OR ION TO PRESERVE INTERRUPT STATUS PRIN, 0 /PROCEED INSTRUCTION JMP I BKLAST /GO TO NEXT INSTRUCTION ISZ BKLAST /SKIP OCCURED CIOT, IOT /CONSTANT, HERE IS NOP /NOTE POSSIBLE PDP8/E PROBLEM HERE!!! (JCA) JMP I BKLAST /GO TO NEXT INSTRUCTION ANDIPRINTAD=AND I . JMPIPRINTAD=JMP I . PRINAD, 0 /PROCEED INSTRUCTION ADDRESS, IND. ADDRESSED TEMP1=TTYPRI /TEMPORARY SAV0=CIFPRI /SAVED LOCATION 00000 SAV1=IONPRI /SAVED LOCATION 00001 COUNT1=PRIN /TEMPORARY PAGE C7600, 7600 /CLA, IGNORE ACCUMULATOR TLS /FORCE TYPE OUT TO SET FLAG JMS RESFLD /RESTORE DATA FIELD TAD RENTER /GET EITHER CIF,JMP INTRPT, OR 0. SNA CLA /WAS USER'S PROGRAM RUNNING? JMP CR1 /NO DCA SAVAC /CLEAR SAVED REGISTERS. DCA SAVLNK DCA TTYSAV RETURN, DCA RENTER /RESET INDICATOR JMS CR1S /CHECK FOR ASSIGNED BREAKPOINT TAD BKSAV DCA I TEMP2 /BKPT, RESTORE SAVED INSTRUCTION /AT BREAKPOINT. CR0, JMS RESFLD /RESTORE DATAFIELD CR1, JMS CR1S /CHECK FOR ASSIGNED BREAKPOINT TAD I TEMP2 /BKPT, GET INSTRUCTION THERE. JMS RESFLD /RESTORE DATA FIELD DCA BKSAV /SAVE INSTRUCTION AT BREAKPOINT. JMP CR2 CR1S, 0 /CR1 SUBROUTINE TAD BKPT DCA TEMP2 /SETUP TO BE INDIRECTLY ADDRESSED. TAD BKPTIF SPA /IS THERE A BREAKPOINT ASSIGNED JMP CR2 /NO JMS SETFLD /YES,SETUP DATA FIELD. JMP I CR1S /EXIT EXCL, JMS APEXS /SETUP PROCEED COUNT, WAIT FOR TTY TAD BKLAST DCA TEMP2 /SETUP TO BE INDERECTLY ADDRESSED TAD PROCIF SPA /SKIP IF PROCEED TO BE DONE. JMP ERROR /NO JMS SETFLD /SET DATA FIELD TO PROCEED FIELD TAD I TEMP2 /GET PROCEED INSTRUCTION. JMP .+2 MULTPR, TAD BKSAV /MULTIPLE PROCEEDS, GET PROCEED INST. JMS RESFLD /RESTORE DATA FIELD DCA TEMP2 /SAVE PROCEED INSTRUCION FOR USE. TAD TEMP2 /GET IT BACK. AND (177 DCA PRAD /SET UP PAGE ADDRESS OF SAVED INSTRUCTION TAD TEMP2 /GET PROCEED INSTRUCTION RAL SZL SMA JMP ADRSBL /ADDRESSABLE INSTRUCTION RAR /IOT OR OPR INSTRUCTION JMP APOS2 ADRSBL, RAL RTL /CURRENT PAGE BIT TO SIGN, INDIRECT BIT TO LINK SMA CLA /CURRENT PAGE BIT IS 1 JMP ADRSB1 /NO, PAGE ZERO TAD BKLAST /YES, GET ADDRESS OF INSTRUCTION AND C7600 /MASK TO PAGE BITS TAD PRAD /FORM 12-BIT ADDRESS DCA PRAD /SAVE IT ADRSB1, SNL /INDIRECT BIT IS 1 JMP ADRSB2 /NO TAD PROCIF /YES JMS SETFLD /SET DATA FIELD TO PROCEED INSTRUCTION'S TAD PRAD /GET PROCEED ADDRESS AND C7770 /MASK OUT LOW ORDER THREE BITS TAD C7770 /SUBTRACT 10 SNA CLA /IS PROCEED ADDRESS BETWEEN 10 AND 17 ISZ I PRAD /YES, INDEX AUTO-INDEX REGISTER C7770, 7770 /NOP WHEN ACC. IS CLEAR TAD I PRAD /GET INDIRECT ADDRESS DCA PRAD /SET UP DIRECT EFFECTIVE ADDRESS JMS RESFLD /RESTORE DATA FIELD ADRSB2, TAD TEMP2 /GET PROCEED INSTRUCTION AND C7000 TAD (ANDIPRINAD DCA PRIN /SET UP PROCEED INSTRUCTION INDIRECTLY /ADDRESSING LOCATION PRINAD STL RAR /ACC.=4000 TAD TEMP2 /GET PROCEED INSTRUCTION AND C7000 /MASK TO INSTRUCTION TYPE SZA CLA /IS INSTRUCTION JMS JMP APOS3 /NO TAD BKLAST /YES, SIMULATE STORING OF PROGRAM COUNTER DCA TEMP3 /SET UP TO BE DIRECTLY ADDRESSED TAD PROCIF JMS SETFLD /SET DATA FIELD TO PROCEED INSTRUCTION'S TAD TEMP3 IAC DCA I PRAD /STORE PROGRAM COUNTER+1 JMS RESFLD /RESTORE DATA FIELD ISZ PRAD /INDEX PROCEED ADDRESS C7000, 7000 /NOP JMP APOS1 APOS, SZL JMP ERROR /NO ADDRESS GIVEN DCA PRAD /SET UP PROCEED ADDRESS TAD FIELDD DCA PROCIF /SET UP INSTRUCTION FIELD TAD FIELDD DCA SAVDF /SET UP DATA FIELD DCA IONSAV /SET UP TO HAVE INTERRUPT OFF STL RAR DCA TEMP2 /AVOID DIRECT ADDRESS OF DATA JMS APEXS /SET PROCEED COUNTER TO 1, WAIT FOR TTY APOS1, TAD (JMPIPRINAD APOS2, DCA PRIN /SET UP PROCEED INSTRUCTION JMP APOS3 TEMP2, 0 /TEMPORARIES TEMP3, 0 BKSAV, 0 /INSTRUCTION AT BREAKPOINT SAVED PRAD=CR1S /PROCEED ADDRESS TEMPORAILY PAGE EXPR, 0 /CURRENT EXPRESSION, MUST BE AT PAGE START LOADER=07777 /ENTRY OF PDP-8 BINARY LOADER. TABLE, 200;LOADER 203;MONIT CLF, 212;LF CCR, 215;CR TABLE1, 241;EXCL /ABOVE CHARACTERS ARE NOT ECHOED 242;QUOTE 243;NUMB 245;PERC 247;APOS 252;ASTR 257;SLASH 274;LESS 276;GREAT 314;LLP,TEMP4P,LL 315;STMASK 325;UL ERROR, CLA CMA /MINUS SIGN SIGNALS END OF TABLE, USED TAD C300 JMS TYO /TYPE QUESTION MARK CR2, JMS CRLF /TYPE CR,LF CR3, DCA OREG /NO OPEN REGISTER DCA TYO /NO EXPRESSION YET CSKP, SKP /USED ASTR, TAD LOC /CURRENT LOCATION LISTEN, DCA EXPR /UPDATE EXPRESSION, USED TAD FIELDD JMS SETFLD /SET DATA FIELD LIGHTS KSF JMP .-1 /WAIT FOR TYPE IN. JMS RESFLD /RESTORE DATA FIELD KRB /READ CHARACTER DCA I TEMP4P /SAVE IT TAD (TABLE-1 DCA CRLF /POINTER TO DISPATCH TABLE LOOK, ISZ CRLF /INDEX POINTER TAD I CRLF /GET NEXT TABLE ENTRY SPA /IT IT THE END JMP DIGIT /YES, CHECK FOR DIGIT CIA STL /NO, MINUS TAD I TEMP4P /ADD BACK CHARACTER ISZ CRLF /INDEX POINTER SZA CLA /DO THEY MATCH JMP LOOK /NO, KEEP LOOKING TAD TYO /LINK NOW CLEARED SNA CLA /ANY EXPRESSION YET STL /NO TAD CRLF /GET POINTER TO DISPATCH ADDRESS TAD (-TABLE1 SPA CLA /SHOULD CHARACTER BE ECHOED JMP .+4 /NO CML /PRESERVE LINK TAD I TEMP4P JMS TYO /ECHO CHARACTER TAD I CRLF DCA CRLF /SET UP DISPATCH ADDRESS TAD CSKP /SKP DCA SLASH1 /SET UP INSTRUCTION TAD LISTEN /3200 DCA I LLP /SET UP INSTRUCTION TAD EXPR /GET EXPRESSION JMP I CRLF /DISPATCH DIGIT, KRB /READ CHARACTER AGAIN TAD M270 /SUBTRACT 270 SMA /IS CHARACTER .GE. 270 JMP ERROR /YES TAD (10 /NO, ADD 10 M270, SPA /IS CHARACTER AN OCTAL DIGIT JMP ERROR /NO DCA CRLF /YES, SAVE IT TAD I TEMP4P /GET CHARACTER JMS TYO /ECHO IT TAD EXPR /GET EXPRESSION CLL RAL /MULTIPLY BY 8 CLL RAL CLL RAL TAD CRLF /ADD IN DIGIT JMP LISTEN /GO UPDATE EXPRESSION CRLF, 0 /TYPE CR,LF, USED AS TEMPORARY C300, CLA CLL /USED AS 300 TAD CCR /CR JMS TYO /TYPE CR TAD CLF /LF JMS TYO /TYPE LF JMP I CRLF /EXIT TYO, 0 /TYPE CHARACTER SNA /IS ACC. ZERO TAD ERROR /YES, GET SPACE TSF JMP .-1 /WAIT FOR FLAG TLS /TYPE CLA JMP I TYO /EXIT SETFLD, 0 /SET DATA FIELD WITH BITS 6-8 OF ACC. TAD (CDF DCA .+1 /SET UP CDF 0 JMP I SETFLD /EXIT RESFLD, 0 /RESTORE DATA TO INSTRUCTION FIELD DCA CRLF /SAVE ACCUMULATOR RIF JMS SETFLD TAD CRLF /RESTORE ACCUMULATOR JMP I RESFLD /EXIT FIELDD, 00 /CURRENT FIELD OF ATTENTION (BITS 6-8) LOC, 0 /CURRENT LOCATION PAGE LLIM, 0 /LOW LIMIT FOR BLOCK OPERATIONS HLIM, START-1 /HIGH LIMIT FOR BLOCK OPERATIONS MASK, 7777 GREAT, SKP CLA LESS, SKP CLA TAD CM10 /-10, MAKES 'SZA CLA' TAD NUMB1 /SNA CLA JMS SULI /SET UP SKIP INSTRUCTION AND SET UP LIMITS DCA SLASH1 /SET UP INSTRUCTION TAD EXPR AND MASK CIA DCA EXPR SEAR1, JMS FETCH /GET C(C(PT)) AND MASK TAD EXPR TEMP5, /TEMPORARY SEAR2, 0 /'SZA CLA' OR 'SNA CLA' JMP SEAR4 CLL CMA /ACC.=-1, MATCH TAD PT DCA LOC /UPDATE LOCATION AND TYPE RESULT DCA OREG /MAKE REGISTER NOT OPEN LF, SNL /ANYTHING TYPED ISZ OREG /IS A REGISTER OPEN SKP /NO OR NO JMS STORE /STORE IT JMS CRLF /TYPE CR,LF ISZ LOC /INDEX LOCATION TAD LOC JMS OCPT /TYPE LOCATION TAD C257 /257, SLASH JMS TYO /TYPE SLASH TAD LOC SLASH, SZL /ANYTHING TYPED JMP ERROR /NO DCA PT /SAVE EXPRESSION TAD OREG SPA CLA /IS A REGISTER ALREADY OPEN JMP .+3 /YES TAD PT /GET EXPRESSION BACK DCA LOC /NEW LOCATION JMS TYO /TYPE SPACE JMS FETCH /GET C(C(PT)) JMS OCPT /TYPE IT OUT SLASH1, SKP /NORMALLY 'SKP', CHANGED TO '0' BY SEARCHES JMP SEAR4 JMS TYO /TYPE SPACE CLA CMA JMP CR3 /SET UP REGISTER OPEN SEAR4, ISZ PT /INDEX POINTER C257, 257 /NOP, CONSTANT KSF /ALSO CLEAR FLAG SKP JMP CR0 ISZ CNT /INDEX, TEST COUNT JMP SEAR1 /KEEP GOING JMP CR0 PERC, JMS SULI /SAVE EXPRESSION AND SET UP LIMITS TAD FIELDD JMS SETFLD /SET DATA FIELD PERC1, TAD SEAR2 /GET EXPRESSION DCA I PT /STORE EXPRESSION ISZ PT /INDEX POINTER CM10, 7770 /NOP, CONSTANT ISZ CNT /INDEX, TEST COUNT JMP PERC1 /KEEP GOING JMP CR0 /GO RESTORE DATA FIELD OREG, /-1= REGISTER OPEN, OTHERWISE NONE SULI, 0 /SET UP LIMITS DCA SEAR2 /SAVE ACCUMULATOR TAD HLIM CMA TAD LLIM DCA CNT /LLIM-HLIM-1 FOR COUNT TAD LLIM DCA PT /POINTER JMP I SULI /EXIT FETCH, 0 /GET C(C(PT)) TAD FIELDD JMS SETFLD /SET UP DATA FIELD TAD I PT /GET WORD JMS RESFLD /RESTORE DATA FIELD JMP I FETCH /EXIT STORE, 0 /STORE C(ACC) INTO C(PT) DCA TEMP5 /SAVE ACC. TAD FIELDD JMS SETFLD /SET UP DATA FIELD TAD TEMP5 /GET BACK ACC. DCA I PT /STORE WORD JMS RESFLD /RESTORE DATA FIELD JMP I STORE /EXIT NUMB, SZL /ANYTHING TYPED JMP ERROR /NO CLL RAL CLL RAL CLL RAL CIA STL TAD FIELDS SZL JMP ERROR /REQUESTED FIELD GR. THAN MAX. ALLOWED CIA TAD FIELDS /INPUT IN BITS 6-8 DCA FIELDD /SET UP NEW FIELD RIF CIA TAD FIELDD NUMB1, SNA CLA /USED, IS INSTRUCTION FIELD SAME AS ASSIGNED ONE TAD (-START CMA DCA HLIM /SET UP HLIM AS EITHER START-1 OR 7777 CMA DCA MASK TEMP4, /TEMPORARY LL, DCA LLIM /OR +1 OR +2 JMP CR0 PT, 0 /POINTER IN BLOCK OPERATIONS CNT, 0 /COUNTER IN BLOCK OPERATIONS $ $ $ $ *