/// / / THIS CODE SERVES AS THE FRONT PANEL FOR / THE PDP-4/X SYSTEM. ON RESET THE PROCESSOR COPIES THE / PANEL PROGRAM FROM ROM INTO THE PANEL FIELD OF / MEMORY, AND JMP'S TO THE PANEL PROGRAM AT 0. ON HALTS THE / PROCESSOR JMS'S TO THE PANEL PROGRAM AT 0 (WRITING / OVER THE JMP TO THE INITIALIZATION CODE). / / COPYRIGHT (C) 2001 BY DAVID G. CONROY / / PERMISSION TO USE, COPY, MODIFY, AND DISTRIBUTE THIS SOFTWARE AND ITS / DOCUMENTATION FOR ANY PURPOSE AND WITHOUT FEE IS HEREBY GRANTED, PROVIDED / THAT THE ABOVE COPYRIGHT NOTICE APPEARS IN ALL COPIES, THAT BOTH THE / ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN SUPPORTING / DOCUMENTATION, AND THAT THE NAME OF DAVID G. CONROY NOT BE USED IN ADVERTISING / OR PUBLICITY PERTAINING TO DISTRIBUTION OF THE SOFTWARE WITHOUT SPECIFIC, / WRITTEN PRIOR PERMISSION. THIS SOFTWARE IS MADE AVAILABLE "AS IS", AND / DAVID G. CONROY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO / THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF / MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL / DAVID G. CONROY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES / OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, / WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT / LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF / THIS SOFTWARE. / / 01 DGC 15-JAN-2001 / INITIAL VERSION, DERIVED FROM PDP-7/X CODE / 02 DGC 30-JAN-2001 / ADDED CODE FOR THE TRACE COMMAND, WHICH REQUIRES / CHANGES TO THE HARDWARE (MOVE SDM, ADD SHM) / 03 DGC 03-FEB-2001 / SYNTAX CHANGES CAUSED BY REPLACING PAL-4/X WITH / PAL-18/X (THE LOC PSEUDO-OPERATION) / 04 DGC 01-APR-2001 / ADDED LINE BUFFERED INPUT WITH ERASE/KILL / ADDED BREAKPOINTS (B AND C COMMANDS) / REDID THE WHOLE STRUCTURE OF COMMANDS (MORE JMP'S, FEWER JMS'S) / ADDED L AND AC TO DATA PRINTED ON HLT/BPT / 05 DGC 08-APR-2001 / FIXED BUG WHICH MADE IT IMPOSSIBLE TO TRACE THROUGH A / BREAKPOINT (THE ADDRESS MATCHED AN ENTRY IN THE BREAKPOINT TABLE / AND THE PC GOT BACKED UP EVERYTIME, WHICH IS WRONG) / I SHOULD HAVE GOT THIS RIGHT; AS SOON AS I SAW IT I REMEMBER / THAT I HAD THIS BUG IN A DEBUGGER I WROTE LONG AGO! / ALSO CHANGED THE WAY THAT THE AC AND L WERE PRINTED ON / HLT/BPT BECAUSE 04 FORMAT WAS CONFUSING / 06 DGC 15-APR-2001 / CHANGES NEEDED TO SUPPORT EXTENDED MEMORY (32K) / 07 DGC 21-JUL-2001 / FIXED BUG IS PRINTING OF 4 CHARACTER OPCODES / REMOVED EMIR FROM DECIDE TABLES, REPLACED IT WITH EEMR / ADDED Z COMMAND TO PLANT ERSATZ-DECTAPE LOADER INTO MEMORY / ADDED CODE TO SET NIEN=1 IN ATTACHED DISK / ADDED F COMMAND TO SEARCH MEMORY FOR INTERESTING WORDS / 08 DGC 01-OCT-2001 / ADDED Q COMMAND TO READ/WRITE THE MQ / TURNED S COMMAND (SWITCHES) INTO W COMMAND / ADDED S COMMAND TO READ/WRITE THE SC / ADDED EAE INSTRUCTIONS TO THE DISASSEMBLY TABLE / CHANGED THE CODE WHICH INITIALIZES THE TTY FLAG ON PANEL / ENTRY SO THAT IT TRIES A LITTLE HARDER NOT TO SMASH / A CHARACTER WHICH IS ALREADY ON THE WAY OUT; THIS SHOULD / FIX THE PROBLEM WHERE LINEFEEDS GET EATEN WHEN USING / THE T COMMAND TO SINGLE STEP / /// BS=10 / ASCII CHARACTERS LF=12 CR=15 SP=40 ERASE=177 / ERASE IS DEL KILL=25 / KILL IS ^U NCHB=200 / 128 CHARACTER LINES NBPT=4 / 4 BREAKPOINTS LMASK=400000 / FIELDS IN SAVED PC WORD EMASK=200000 AMASK=077777 FMASK=060000 / FIELD AND OFFSET IN AN INSTRUCTION OMASK=017777 LOC 00000 PC, JMP RES JMP ENT LOC 00010 X0, BSS 1 X1, BSS 1 CHP, BSS 1 LOC 00020 T0, BSS 1 T1, BSS 1 T2, BSS 1 T3, BSS 1 T4, BSS 1 AC, BSS 1 VAL, BSS 1 ADR, BSS 1 CH, BSS 1 CHB, BSS NCHB BPT, BSS 2*NBPT MODE, BSS 1 / RESET ENTRY POINT RES, DZM PC / CLEAR MACHINE STATE DZM AC LEM IOF CLQ ALS / SC = 0 CLA LSA LAC (BPT) / CLEAR BPTS DAC T0 LAW -NBPT DAC T1 CLA CMA RES1, DAC I T0 / IF MI, ENTRY IS UNUSED ISZ T0 ISZ T0 ISZ T1 JMP RES1 JMS KTI / KBD FLAG = 0, TTY FLAG = 1 LAW LAW+2 / IDE NIEN=1, FLOAT IRQ HWC 600 LAC (MSG1-1) / SAY HELLO JMS PMSG JMS PCR JMP CMD / HALT ENTRY POINT / IF MODE<0 / THEN WE ARE DOING BREAKPOINT PROCEED / PUT THE BREAKPOINTS BACK IN, START FREE RUN / IF MODE=0 / THEN WE ARE FREE RUNNING / ON HLT SWAP OUT BREAKPOINTS, BACK UP PC IF HLT IS / AT THE LOCATION OF A BREAKPOINT / IF MODE>0 / THEN WE ARE SINGLE STEPPING / THE HLT IS EXPECTED, AND NO BREAKPOINT ACTION / IS NEEDED (OR CORRECT) ENT, DAC AC / SAVE MACHINE STATE LAC (BPT) DAC T0 LAW -NBPT DAC T1 LAC MODE / BPT PROCEED ? SMA JMP ENT3 ENT1, LAC I T0 / YES, SWAP BPTS IN ISZ T0 SPA JMP ENT2 DAC T2 SDM LAC I T2 DAC I T0 LAC (HLT) SDM DAC I T2 ENT2, ISZ T0 ISZ T1 JMP ENT1 DZM MODE / FREE RUN LAC PC RAL LAC AC SIM / IM=1 HM=0 (FREE RUN) JMP I PC ENT3, SZA / STEP ? JMP ENT5 ENT3A, LAC I T0 / YES, SWAP BPTS OUT ISZ T0 SPA JMP ENT4 DAC T2 LAC I T0 SDM DAC I T2 LAW -1 / AT THIS BPT ? TAD PC AND (AMASK) SAD T2 SKP JMP ENT4 / NO LAC PC / YES, BACK UP PC AND (LMASK+EMASK) TAD T2 DAC PC ENT4, ISZ T0 ISZ T1 JMP ENT3A ENT5, JMS KTI / KBD FLAG = 0, TTY FLAG = 1 LAC PC / PC, CUR INS AND (AMASK) DAC ADR JMS PINS LAC (MSG8-1) / " L: " JMS PMSG LAC PC RTL AND (1) TAD ("0) JMS PCH LAC (MSG9-1) / " AC: " JMS PMSG LAC AC / AC JMS POCT JMS PCR / PRINT THE PROMPT, GET A CHARACTER, AND SEE IF IT'S A GOOD COMMAND / IF IT IS, JUMP TO THE COMMAND PROCESSOR / COMMAND PROCESSORS JUMP BACK TO CMD WHEN THEY ARE FINISHED / ON ERRORS, THEY JUMP BACK TO ONE OF THE ERROR LABELS (CMDIC, CMDSN / CMDBE) WHICH PRINTS AN ERROR MESSAGE CMD, LAC (MSG4-1) / PROMPT JMS GCHB JMS GCH SAD (CR) / EAT BLANK LINES JMP CMD LAC (CMDT-1) DAC X0 CMD1, LAC I X0 SNA JMP CMDIC SAD CH JMP CMD2 ISZ X0 JMP CMD1 CMD2, JMS GCH / FOUND IT, EAT COMMAND LAC I X0 / JMP TO THE COMMAND'S HANDLER DAC T0 JMP I T0 CMDIC, LAC (MSG5-1) / ?ILL CMD JMP CMD3 CMDSN, LAC (MSG6-1) / ?SYN ERR JMP CMD3 CMDBE, LAC (MSG7-1) / ?BPT ERR CMD3, JMS PMSG JMS PCR JMP CMD CMDT, "A; ACMD "B; BCMD "C; CCMD "D; DCMD "E; ECMD "F; FCMD "G; GCMD "I; ICMD "L; LCMD "M; MCMD "P; PCMD "Q; QCMD "R; RCMD "S; SCMD "T; TCMD "U; UCMD "V; VCMD "W; WCMD "X; XCMD "Z; ZCMD 0 / A [VAL] ACMD, JMS GOCT JMP ACMD1 JMS ISCR LAC VAL DAC AC JMP CMD ACMD1, JMS ISCR LAC AC JMS POCT JMS PCR JMP CMD / B [ADR] BCMD, LAC (BPT) / SET UP FOR DAC T2 / BREAKPOINT TABLE SCAN LAW -NBPT DAC T3 JMS GOCT / IS THERE AN ADR ? JMP BCMD3 / NO LAC VAL AND (AMASK) DAC ADR JMS ISCR DZM T4 / NO FREE BPT ENTRY BCMD1, LAC I T2 SAD ADR JMP CMDBE / ERROR IF DUPLICATE SMA JMP BCMD2 / IN USE LAC T2 / REMEMBER FREE BPT ENTRY DAC T4 BCMD2, ISZ T2 ISZ T2 ISZ T3 JMP BCMD1 LAC T4 / FREE ENTRY ? SNA JMP CMDBE / NO, ERROR LAC ADR / MAKE NEW BPT ENTRY DAC I T4 JMP CMD BCMD3, JMS ISCR BCMD4, LAC I T2 SPA JMP BCMD5 JMS POCT / BPT ADR JMS PCR BCMD5, ISZ T2 ISZ T2 ISZ T3 JMP BCMD4 JMP CMD / C [ADR] CCMD, LAC (BPT) / SET UP FOR BPT DAC T2 / TABLE SCAN LAW -NBPT DAC T3 JMS GOCT / ADR ? JMP CCMD3 / NO LAC VAL AND (AMASK) DAC ADR JMS ISCR CCMD1, LAC I T2 SAD ADR JMP CCMD2 / MATCH ISZ T2 ISZ T2 ISZ T3 JMP CCMD1 JMP CMDBE / NO MATCH, ERROR CCMD2, CLA CMA / MAKE ENTRY A FREE ENTRY DAC I T2 JMP CMD CCMD3, JMS ISCR CLA CMA CCMD4, DAC I T2 / MAKE ENTRY A FREE ENTRY ISZ T2 ISZ T2 ISZ T3 JMP CCMD4 / DO THEM ALL JMP CMD / D ADR [VAL ...] DCMD, JMS GOCT JMP CMDSN LAC VAL AND (AMASK) DAC ADR DCMD1, JMS GOCT JMP DCMD2 LAC VAL SDM DAC I ADR LAC ADR TAD (1) AND (AMASK) DAC ADR JMP DCMD1 DCMD2, JMS ISCR JMP CMD / E ADR [LEN] ECMD, JMS GOCT JMP CMDSN LAC VAL AND (AMASK) DAC ADR CLA CMA DAC T2 JMS GOCT JMP ECMD1 LAC VAL CMA TAD (1) DAC T2 ECMD1, JMS ISCR DZM T3 ECMD2, LAC T3 TAD (-10) SZA JMP ECMD3 JMS PCR DZM T3 ECMD3, LAC T3 SZA JMP ECMD4 LAC ADR JMS POCT LAW LAW+": JMS PCH ECMD4, LAW LAW+SP JMS PCH SDM LAC I ADR JMS POCT LAC ADR TAD (1) AND (AMASK) DAC ADR ISZ T3 ISZ T2 JMP ECMD2 JMS PCR JMP CMD / F ADR LEN DATA [MASK] FCMD, JMS GOCT / ADR JMP CMDSN LAC VAL AND (AMASK) DAC ADR JMS GOCT / LEN JMP CMDSN LAC VAL CMA TAD (1) DAC T2 JMS GOCT / DATA JMP CMDSN LAC VAL DAC T3 LAW 777777 / DEFAULT MASK DAC T4 JMS GOCT / MASK JMP FCMD1 LAC VAL DAC T4 FCMD1, JMS ISCR FCMD2, SDM LAC I ADR / GET WORD AND T4 / AND WITH THE MASK XOR T3 / AND COMPARE TO THE DATA SZA JMP FCMD3 / NO MATCH LAC ADR / DISPLAY ADDRESS, DATA JMS POCT LAW LAW+SP JMS PCH SDM LAC I ADR JMS POCT JMS PCR FCMD3, ISZ ADR / ADVANCE ADDRESS ISZ T2 / AND REPEAT FOR LEN WORDS JMP FCMD1 JMP CMD / G [ADR] GCMD, JMS GOCT JMP GCMD1 LAC VAL / IF A PC IS SPECIFIED AND (AMASK) / RESET PC AND QUASI-RESET THE DAC PC / REST OF THE MACHINE DZM AC LEM IOF GCMD1, JMS ISCR LAC (BPT) DAC T0 LAW -NBPT DAC T1 GCMD2, LAC I T0 / BPT ACTIVE ? SMA JMP GCMD3 / YES ISZ T0 ISZ T0 ISZ T1 JMP GCMD2 DZM MODE / NO BPTS, MODE=0, FREE RUN LAC PC RAL LAC AC SIM JMP I PC GCMD3, LAW -1 / BPTS, MODE<0, BPT PROCEED DAC MODE LAC PC RAL LAC AC SHM JMP I PC / I [DATA] ICMD, JMS GOCT JMP ICMD1 JMS ISCR LAC VAL RAR LAC (IOF) SZL LAC (ION) DAC T0 XCT T0 JMP CMD ICMD1, JMS ISCR IORS RTL AND (1) TAD ("0) JMS PCH JMS PCR JMP CMD / L [DATA] LCMD, JMS GOCT JMP LCMD1 JMS ISCR LAC VAL / BIT [17] OF DATA TO LINK RAR LAC PC AND (EMASK+AMASK) / ASSUME NEW LINK = 0 SZL / IS THAT WHAT WE ACTUALLY WANT ? TAD (LMASK) / NOPE, NEW LINK = 1 DAC PC JMP CMD LCMD1, JMS ISCR LAC PC AND (LMASK) / THIS CODE MOVES SZA CLA / THE LMASK BIT OF THE PC WORD TAD (1) / INTO LSB OF AC TAD ("0) JMS PCH JMS PCR JMP CMD / M [DATA] MCMD, JMS GOCT JMP MCMD1 JMS ISCR LAC VAL RTR LAC PC / WE NEED TO KEEP PC.EMASK AND (LMASK+AMASK) / CORRECT, BECAUSE IT'S NEEDED FOR PRINTING SZL / EM[00], WHICH CANNOT BE READ TAD (EMASK) DAC PC LEM / LEM ON 0X, EEM ON 10, EEMR ON 11 SNL JMP CMD LAC VAL RAR EEM SZL EEMR JMP CMD MCMD1, JMS ISCR LAC PC / EM[00] COMES FROM PC.EMASK AND (EMASK) SZA CLA TAD (2) SEM / EM[01] IS TESTED BY SEM SKP TAD (1) TAD ("0) JMS PCH JMS PCR JMP CMD / P [DATA] PCMD, JMS GOCT JMP PCMD1 JMS ISCR LAC PC AND (LMASK+EMASK) DAC PC LAC VAL AND (AMASK) TAD PC DAC PC JMP CMD PCMD1, JMS ISCR LAC PC AND (AMASK) JMS POCT JMS PCR JMP CMD / Q [DATA] QCMD, JMS GOCT JMP QCMD1 JMS ISCR LAC VAL LMQ JMP CMD QCMD1, JMS ISCR LACQ JMS POCT JMS PCR JMP CMD / R RCMD, JMS ISCR RCMD1, JMS RCMD4 / GET AN (ADDRESS) WORD DAC ADR JMS RCMD5 / GET NEXT FRAME SNA / IF 0, THEN ITS THE END JMP RCMD3 CMA / OTHERWISE IT'S A LENGTH OF TAD (1) / THE LOAD BLOCK DAC T1 RCMD2, JMS RCMD4 / COPY A LOAD BLOCK SDM / INTO MEMORY DAC I ADR ISZ ADR ISZ T1 JMP RCMD2 JMP RCMD1 RCMD3, LAC ADR / END, RESET THE PC DAC PC / TO THE PC FROM THE TAPE JMP CMD RCMD4, 0 JMS RCMD5 / BITS [12..17] DAC T0 JMS RCMD5 / BITS [06..11] CLL RTL RTL RTL TAD T0 DAC T0 JMS RCMD5 / BITS [00..05] CLL RAR RTR RTR RTR TAD T0 JMP I RCMD4 RCMD5, 0 RCMD6, KSF / GET 6 BITS IF DATA JMP RCMD6 / IN EXCESS 41 NOTION, IGNORING SMALL KRB / THINGS, WHICH ARE PROBABLY CR'S AND LF'S AND (177) TAD (-41) SPA JMP RCMD6 JMP I RCMD5 / S [DATA] SCMD, JMS GOCT JMP SCMD1 JMS ISCR LAC VAL AND (77) / THIS IS BASED ON THE SEQUENCE XOR (77) / FROM PAGE 7-32 OF THE PDP-9 MANUAL TAD (640402) / FOR RESTORING THE SC SHOULD AND (640477) / THE EAE NEED TO BE USED IN AN DAC T0 / INTERRUPT HANDLER XCT T0 JMP CMD SCMD1, JMS ISCR LACS RTR RAR AND (7) TAD ("0) JMS PCH LACS AND (7) TAD ("0) JMS PCH JMS PCR JMP CMD / T TCMD, JMS ISCR DZM MODE / MODE>0, SINGLE STEP ISZ MODE LAC PC RAL LAC AC SHM / IM=1 HM=1 JMP I PC / U ADDR [LEN] UCMD, JMS GOCT JMP CMDSN LAC VAL AND (AMASK) DAC ADR CLA CMA DAC T4 JMS GOCT JMP UCMD1 LAC VAL CMA TAD (1) DAC T4 UCMD1, JMS ISCR UCMD2, JMS PINS JMS PCR LAC ADR TAD (1) AND (AMASK) DAC ADR ISZ T4 JMP UCMD2 JMP CMD / V VCMD, JMS ISCR LAC (MSG1-1) JMS PMSG JMS PCR JMP CMD / W [DATA] WCMD, JMS GOCT JMP WCMD1 JMS ISCR LAC VAL LSA JMP CMD WCMD1, JMS ISCR LAS JMS POCT JMS PCR JMP CMD / X INST [DATA] XCMD, JMS GOCT JMP CMDSN LAC VAL DAC XCMD1 JMS GOCT DZM VAL JMS ISCR LAC VAL XCMD1, 0 JMP XCMD2 JMS POCT LAC (MSG3-1) JMS PMSG JMP XCMD3 XCMD2, JMS POCT XCMD3, JMS PCR JMP CMD / Z ZCMD, JMS ISCR LAC (ZROM-1 / COPY DTLDR TO 77637..77777 DAC X0 LAC (077637-1 DAC X1 LAW ZROM-ZROME DAC T0 ZCMD1, LAC I X0 SDM DAC I X1 ISZ T0 JMP ZCMD1 LAC (277646 / THE DTLDF STARTS AT 77646 DAC PC / IN EXTEND MODE DZM AC / WITH INTERRUPTS DISABLED EEM IOF JMP CMD ZROM, 000000 / DTLDR.003 000000 000000 000077 700000 000000 000105 157637 217642 057640 760400 057641 157644 617663 000000 704616 517771 557770 637655 617656 760040 617666 760060 057723 217644 517643 744020 742020 742020 357637 744010 057772 760100 704605 117655 217640 617706 740040 617646 057773 217641 057774 217772 457772 704305 740010 704445 704515 760001 704205 777600 057775 000000 704705 557663 617736 117655 457773 237773 704045 704005 457775 617730 117655 704616 740020 741400 617704 217723 557665 617760 457773 704054 704004 077773 457774 741000 617764 457775 617746 617711 217774 357767 741100 617710 237645 057775 137775 000200 000100 000300 000000 000000 000000 000000 000000 000000 ZROME, / INITIALIZE THE KBD FLAG TO 0 AND THE / TTY FLAG TO 1 ON PANEL ENTRY, TAKING CARE NOT TO SMASH / A CHARACTER WHICH IS ALREADY ON THE WAY OUT / THIS IS DONE BY DELAYING FOR 15 BIT TIMES AT 9600 BITS / PER SECOND (LONG ENOUGH TO ENSURE THAT IF A CHARACTER WAS / IN THE TXBR THAT IT HAS BEEN MOVED TO THE TXSR; 3 FOR / THE SYNCHRO BETWEEN TSBR/TXSR, 1+8+2 FOR THE TXSR TO GET / SHIFTED OUT, AND 1 FOR THE TXSR TO LOAD), AND THEN, / IF THE TTY FLAG IS NOT SET, ASSUMING IT'S NEVER GOING TO / SET, AND SENDING A NUL TO FORCE THE ISSUE / AT 9600 BITS PER SECOND EACH BIT IS AROUND 100US, AND / AT 8 MHZ, EACH CYCLE IS 0.5US, SO THE TOTAL DELAY / NEEDED IS (15*100)/0.5 = 3000 CYCLES KTI, 0 KSF / IF KBD FLAG = 1 SKP KRB / MAKE IT 0 LAW -1750 / 1750 OCT IS 1000 DEC DAC T0 KTI1, ISZ T0 / 3 CYCLES/LOOP JMP KTI1 CLA TSF / IF TTY FLAG = 0 TLS / MAKE IT 1 JMP I KTI / CHECK FOR CR AT END OF CMD / JMP DIRECTLY TO CMDSN IF IT ISN'T A CR ISCR, 0 LAC CH SAD (CR) JMP I ISCR JMP CMDSN / PRINT INSTRUCTION / CALLED WITH THE ADDRESS OF THE INSTRUCTION / TO BE PRINTED IN ADR / USES T2, T3, X0, AND CALLS POCT, WHICH USES T0, T1 PINS, 0 SDM / FETCH INSTRUCTION LAC I ADR DAC T2 LAC ADR / DISPLAY THE ADDRESS, AND THE JMS POCT / INSTRUCTION WORD LAW LAW+": JMS PCH LAW LAW+SP JMS PCH LAC T2 JMS POCT / THE BULK OF THE WORK OF DECODING / INSTRUCTION IS DONE WITH THE AID OF A BIG TABLE / EACH ENTRY CONSISTS OF A MASK, A VALUE, AND 3 OR 4 CHARACTERS / IF (OPCODE AND MASK) EQ VALUE, THEN THE CHARACTERS / ARE WRITTEN OUT, PRECEEDED BY A SPACE LAC (PTAB-1) DAC X0 LAC (-NPTAB) DAC T3 PINS1, LAC T2 / OPCODE AND I X0 / AND MASK SAD I X0 / EQ VALUE JMP PINS2 ISZ X0 / NO MATCH, SO SKIP ISZ X0 / OVER THE CHARS ISZ X0 ISZ X0 JMP PINS3 PINS2, LAW LAW+SP / PUT OUT A SPACE JMS PCH LAC I X0 / THEN CHARS 1, 2, 3 JMS PCH LAC I X0 JMS PCH LAC I X0 JMS PCH LAC I X0 / AND (OPTIONAL) 4 SZA JMS PCH PINS3, ISZ T3 / LOOP OVER ALL ENTRIES IN JMP PINS1 / THE TABLE / IF THE INSTRUCTION IS A MEMORY / REFERENCE INSTRUCTION, TACK THE ADDRESS FIELD / ON THE END (THE OPCODE IS DONE) LAC T2 AND (740000) SAD (640000) / EAE JMP PINS5 SAD (700000) / IOT JMP PINS5 SAD (740000) / OPR, LAW JMP PINS5 LAW LAW+SP JMS PCH LAC T2 / PRINT AN "I" IF AND (020000) / THE INDIRECT BIT IS SET SNA JMP PINS4 LAW LAW+"I JMS PCH LAW LAW+SP JMS PCH PINS4, LAC ADR / PRINT THE 15 BIT AND (FMASK) / EFFECTIVE ADDRESS OF THE DAC T0 / MRI OPERAND LAC T2 AND (OMASK) TAD T0 JMS POCT PINS5, JMP I PINS / PRINT OCTAL WORD IN AC / USES T0, T1 POCT, 0 RAL / PRE-ROTATE INTO DAC T0 / THE LINK LAW -6 DAC T1 POCT1, LAC T0 / GET 3 NEW BITS IN RTL / AC [15..17], LEAVING A BIT RAL / IN THE LINK DAC T0 AND (7) TAD ("0) JMS PCH ISZ T1 JMP POCT1 JMP I POCT / PRINT MESSAGE / TEXT IS IN ASCII, END MARK IS 0 / ENTER WITH MSG-1 IN AC / USES X0 PMSG, 0 DAC X0 PMSG1, LAC I X0 SNA JMP I PMSG JMS PCH JMP PMSG1 / PRINT CR/LF PCR, 0 LAW LAW+CR JMS PCH LAW LAW+LF JMS PCH JMP I PCR / PRINT CHARACTER IN AC PCH, 0 PCH1, TSF JMP PCH1 TLS JMP I PCH / GET OCTAL NUMBER / ENTER FIRST CHARACTER IN CH / RETURN JMS+1 IF NO NUMBER / RETURN JMS+2 IF NUMBER; NUMBER IN VAL; DELIM IN CH / SKIPS LEADING BLANKS GOCT, 0 LAC CH JMP GOCT2 GOCT1, JMS GCH GOCT2, SAD (SP) JMP GOCT1 JMS GOCT4 JMP I GOCT ISZ GOCT DZM VAL GOCT3, LAC VAL CLL RTL RAL TAD CH TAD (-"0) DAC VAL JMS GCH JMS GOCT4 JMP I GOCT JMP GOCT3 GOCT4, 0 TAD (-"0) SPA JMP I GOCT4 TAD (-10) SPA ISZ GOCT4 JMP I GOCT4 / GET CHARACTER FROM COMMAND / SHOULD NEVER BE CALLED WITH CH=CR (NOTHING LEFT) / IF YOU DO, BAD THINGS HAPPEN GCH, 0 LAC I CHP DAC CH JMP I GCH / GET COMMAND LINE INTO CHB, DOING ECHO, MASKING / CHARACTERS TO 7 BITS, AND HANDLING CHARACTER ERASE AND LINE KILL / ON ENTRY AC IS A PROMPT STRING / ON EXIT CHP IS READY FOR THE FIRST CALL TO GCH GCHB, 0 JMS PMSG / PRINT PROMPT LAC (CHB-1) / POINT CHP AT CHB (-1 FOR AUTOINC) DAC CHP GCHB1, KSF / GET CHARACTER JMP GCHB1 KRB AND (177) / MASK TO 7 BITS SAD (CR) / CHECK FOR CHARACTERS WITH JMP GCHB4 / SPECIAL MEANING SAD (ERASE) JMP GCHB2 SAD (KILL) JMP GCHB3 DAC T0 / NOT SPECIAL, STASH IN LAC CHP / BUFFER IF IT (AND A CR) WILL FIT SAD (CHB+NCHB-1-1) JMP GCHB1 LAC T0 DAC I CHP JMS PCH JMP GCHB1 GCHB2, LAC CHP / ERASE, ANYTHING TO DO ? SAD (CHB-1) JMP GCHB1 / NO JMS GCHB5 JMP GCHB1 GCHB3, LAC CHP / KILL, ANYTHING TO DO ? SAD (CHB-1) JMP GCHB1 / NO JMS GCHB5 JMP GCHB3 / DELETE UNTIL ALL ARE GONE GCHB4, DAC I CHP / CR, STORE IT JMS PCR / ECHO CR AS CR-LF LAC (CHB-1) / WIND CHP BACK TO THE BEGINNING DAC CHP JMP I GCHB GCHB5, 0 LAW -1 / BACK UP CHP TO TAD CHP / MAKE A CHARACTER GO AWAY DAC CHP LAW LAW+BS / ECHO BS-SP-BS JMS PCH LAW LAW+SP JMS PCH LAW LAW+BS JMS PCH JMP I GCHB5 / INSTRUCTION PRINTING TABLE / EACH ENTRY IS A MASK, THEN A VALUE, THEN 4 CHARACTERS / CHARACTER 4 IS 0 IF IT ISN'T NEEDED / EAE OPCODES ARE LITTLE MORE THAN FUNCTION CODE DECODES / WITH A HACK TO TELL SIGNED FROM UNSIGNED / NORMALIZE IS "NOR" RATHER THAN "NORM" BECAUSE "NORS" / FITS IN THE TABLE AND "NORMS" DOESN'T PTAB, 740000; 000000; "C; "A; "L; 0 740000; 040000; "D; "A; "C; 0 740000; 100000; "J; "M; "S; 0 740000; 140000; "D; "Z; "M; 0 740000; 200000; "L; "A; "C; 0 740000; 240000; "X; "O; "R; 0 740000; 300000; "A; "D; "D; 0 740000; 340000; "T; "A; "D; 0 740000; 400000; "X; "C; "T; 0 740000; 440000; "I; "S; "Z; 0 740000; 500000; "A; "N; "D; 0 740000; 540000; "S; "A; "D; 0 740000; 600000; "J; "M; "P; 0 777777; 700002; "I; "O; "F; 0 777777; 700042; "I; "O; "N; 0 777777; 700001; "C; "L; "S; "F 777777; 700004; "C; "L; "O; "F 777777; 700044; "C; "L; "O; "N 777777; 700301; "K; "S; "F; 0 777777; 700312; "K; "R; "B; 0 777777; 700314; "I; "O; "R; "S 777777; 700401; "T; "S; "F; 0 777777; 700402; "T; "C; "F; 0 777777; 700406; "T; "L; "S; 0 777077; 704000; "H; "S; "I; 0 777077; 704014; "H; "R; "R; 0 777077; 704005; "H; "W; "R; 0 777077; 704016; "H; "R; "S; 0 777077; 704007; "H; "W; "C; 0 777777; 707701; "S; "E; "M; 0 777777; 707702; "E; "E; "M; 0 777777; 707742; "E; "E; "M; "R 777777; 707704; "L; "E; "M; 0 770000; 750000; "C; "L; "A; 0 764000; 744000; "C; "L; "L; 0 761400; 740400; "S; "N; "L; 0 761400; 741400; "S; "Z; "L; 0 761200; 740200; "S; "Z; "A; 0 761200; 741200; "S; "N; "A; 0 761100; 740100; "S; "M; "A; 0 761100; 741100; "S; "P; "A; 0 777777; 740000; "N; "O; "P; 0 761700; 741000; "S; "K; "P; 0 760040; 740040; "H; "L; "T; 0 762020; 740020; "R; "A; "R; 0 762020; 742020; "R; "T; "R; 0 762010; 740010; "R; "A; "L; 0 762010; 742010; "R; "T; "L; 0 760004; 740004; "O; "A; "S; 0 760002; 740002; "C; "M; "L; 0 760001; 740001; "C; "M; "A; 0 760000; 760000; "L; "A; "W; 0 760700; 640500; "L; "R; "S; 0 760700; 660500; "L; "R; "S; "S 760700; 640600; "L; "L; "S; 0 760700; 660600; "L; "L; "S; "S 760700; 640700; "A; "L; "S; 0 760700; 660700; "A; "L; "S; "S 760700; 640400; "N; "O; "R; 0 760700; 660400; "N; "O; "R; "S 744700; 640100; "M; "U; "L; 0 744700; 644100; "M; "U; "L; "S 744700; 640300; "D; "I; "V; 0 744700; 644300; "D; "I; "V; "S 777777; 641002; "L; "A; "C; "Q 777777; 641001; "L; "A; "C; "S 777777; 650000; "C; "L; "Q; 0 777777; 644000; "A; "B; "S; 0 777777; 664000; "G; "S; "M; 0 777777; 640001; "O; "S; "C; 0 777777; 640002; "O; "M; "Q; 0 777777; 640004; "C; "M; "Q; 0 777777; 652000; "L; "M; "Q; 0 NPTAB=111 / TEXT MESSAGES / AS USED BY PMSG (ASCII, 0 ON THE END) MSG1, "P "D "P "- "4 "/ "X SP "0 "8 SP "D "G "C SP "0 "1 "- "O "C "T "- "2 "0 "0 "1 0 MSG3, SP "( "S "K "P ") 0 MSG4, "> "> "> SP 0 MSG5, "? "I "L "L SP "C "M "D 0 MSG6, "? "S "Y "N SP "E "R "R 0 MSG7, "? "B "P "T SP "E "R "R 0 MSG8, SP "L ": SP 0 MSG9, SP "A "C ": SP 0 / END