%OUT 0 DAC %CHARO /SAVE OUTPUT CHAR. LAC %LTOVL /SET 150 MS. TIME OUT DAC %TO /SET TIME-OUT FOR OUTPUT LAC %CHARO /GET CHAR. %OUT3 TSF /SKIP ON HARDWARE FLAG JMP %OUT1 %OUT2 TLS /OUTPUT DZM %TTOF /CLEAR PROG TTO FLAG. JMP* %OUT /EXIT %OUT1 ISZ %TTOF /IS PROG TTO FLAG ON? SKP /NO-SKIP JMP %OUT2 /YES-GO OUTPUT ISZ %TO /TIME-OUT? JMP %OUT3 /NO-TRY AGAIN JMP %OUT2 /YES-GO OUTPUT / /TAPE 3A / /%TYPMG TYPE A MESSAGE / INPUT ADR OF MESSAGE IN AC. MESSAGE IN / .SIXBT FORMAT. TERMINATED BY @. / %TYPMG 0 DAC %SAV3 /SAVE ADR %TYPB LAW -3 DAC %SAV5 /SET 3 COUNT LAC* %SAV3 /GET A WORD ISZ %SAV3 /UPDATE POINTER / RAL %TYPA JMS %R6L /ROTATE 6 LEFT DAC %SAV1 AND %L77 /SAVE 6 BITS TAD %L40 AND %L77 TAD %L40 /CONVERT TO ASCII SAD %L100 /IS IT AN @? JMP* %TYPMG /YES-EXIT %JMSOT JMS %OUT /NO-PRINT THE CHAR LAC %SAV1 ISZ %SAV5 /DONE WITH 3 CHARACTERS JMP %TYPA /NO JMP %TYPB /YES-GET NEXT WORD. / / /********** / /%INT INTERRUPT HANDLER FOR ODT15 %INT %MODE DAC %INAC /SAVE AC LAC* %L0 DAC %LOC0 KSF /IS IT KEYBOARD? JMP %INTA /NO KRBN /READ KEYBOARD DAC %CHARI CLC DAC %TTIF /SET PROG TTI FLAG. JMP %INT2 /GO EXIT %INTA TSF /IS IT TELEPRINTER? JMP %INT1 /NO. TCF /YES, CLEAR FLAG. CLC DAC %TTOF /SET PROG TTO FLAG. %INT2 LAC %INAC /RESTORE AC ION RES JMP* %LOC0 /RETURN TO ODT15. /THIS IS A NON-TELETYPE INTERRUPTION ANS IS IGNORED BY ODT15. /A BASIC RULE IS THAT THE USER MUST HAVE A JMP INSTRUCTION A /AT LOCATION 1 IF HE USES INTERRUPTIONS DURING BREAKPOINTS. / %INT1 LAC %LOC1 /USER INSTRUCTION FROM LOC1. AND %L347S /IT MAY BE JMP* AUTOINDEXREG. TAD %LLAC /BUILD LAC* USER ADDRESS. DAC .+1 %IN000 XX LAC %LOC1 AND %L147S SAD %LL02 /WAS IT A JMP* 2. JMP %JI2 /YES USE ADDRESS AT 2 DAC %IN000 LAC %LOC1 /WAS IT AN INDIRECT REFERENCE AND %INBIT SNA JMP %INTOK LAC* %IN000 DAC %IN000 %INTOK LAC %LOC0 /RESTOREUSER MODE LINK ETC. AND %LIOT /(700000 TAD %IN000 DAC %LOC0 JMP %INT2 /THE ADDRESS REFERENCED AT LOCATION 1 IS 2. /ITS AGAINST THE RULES TO HAVE A JMP 2 SO ASSUME /ITS A JMP* 2. %JI2 LAC %LOC2 /CONTENTS OF LOC 2 AND %L147S /KEEP 13 BITS JMP %INTOK-1 / / / / / / /%SEEND SEEN THE $ / IF YES, TAKE NORMAL EXIT / IF NO, GO TO %QUEST %SAV3=. %SEEND 0 LAC %DOL SMA JMP %QUEST /TO %QUEST IF NOT SEEN $. JMP* %SEEND /NORMAL EXIT. /%IORES IO RESET ROUTINE %SAV5=. %IORES 0 %IOFF IOF /DISABLE PI %ISAPT ISA+10 / API CAF / ALL FLAGS JMP* %IORES /RETURN /%BRKST SET UP ENTRY OF BREAKPOINT ROUTINE / THE FIRST FEW LOCATIONS OF ROUTINE %BRK / CAN BE DESTROYED. THIS ROUTINE RESTORES / THE FIRST 4 LOCATIONS. .IFUND %%OB %BRKST 0 LAC %LJBRK1 DAC %BRK+2 LAC %IOFF DAC %BRK+3 DAC %BRK+5 LAC %ISAPT DAC %BRK+4 JMP* %BRKST .ENDC /%PNUM PRINT A 6 DIGIT #. / INPUT 18-BIT LOGICAL # IN AC. / OUTPUT 6 OCTAL DIGITS FOLLOWED BY TWO BLANKS / %PNUM 0 RCL DAC %SAV5 /SAVE#. LAW -6 /GET 6 COUNT JMS %NUMOU /PRINT 6 CHARACTERS LAW %BLNK JMS %OUT JMS %OUT /PRINT 2 MORE BLANKS JMP* %PNUM /EXIT /PRINT AN ADDRESS (5 OCTAL DIGITS) / INPUT 18-BIT # IN AC / OUTPUT 4 DIGITS / %PRTAD 0 AND %LM4K RTL RTL /REMOVE 1 CHAR. DAC %SAV5 LAW -5 JMS %NUMOU /PRINT 4 CHARS JMP* %PRTAD /EXIT / / / ODT-15 DUMPING FEATURE / / THE DUMPING IS DONE IN THE ABSOLUTE LOADER FORMAT. / THERE ARE 5 COMMANDS: / $L: USE SLOW PUNCH (ASR) / $H: USE FAST PUNCH / $F: PUNCH LEADER (2 FEET) / K1;K2$D: DUMP FROM K1 THRU K2 / $T: PUNCH TERMINAL BLOCK AND TRAILER / / .IFDEF %%FS / /********** ($H) USE FAST PUNCH / %H JMS %SEEND LAC %LNOP DAC %HLTA /NO HALT FOR HIGH SPEED PUNCH LAC %LPSA1 DAC %HISPD /INST TO TURN ON HIGH SPEED PUNCH. LAC %LJPHI /GET JMS TO PUNCH HI SPEED. %F1 DAC %CALLI JMP %ODT0 /GO TO COMMAND PROCESSOR %LJPHI JMS %PHI / /********** ($L) USE SLOW PUNCH / %L JMS %SEEND LAC %HALT DAC %HLTA /HALT FOR TURN ON/OFF OF SLOW PUNCH. LAC %LNOP DAC %HISPD /DON'T TURN ON HI SPEED PUNCH. LAC %JMSOT /GET JMS TO SLOW SPEED OUTPUT JMP %F1 .ENDC .IFUND %%DFT / /**********($F) PUNCH LEADER / %F JMS %SEEND JMS %IORES /IO RESET JMS %CRLF XCT %HLTA /HALT IF $L IN EFFECT. XCT %HISPD /PSA+10 IF $H IN EFFECT. %L1 LAW -360 /DECIMAL -240=24 INCHES OF TAPE / /PUNCH N BLANKS / %L2 DAC %SAV1 /SET COUNT %PSPCI CLA %CALLI JMS %OUT /JMS %OUT FOR $L;JMS %PHI FOR$H. PUNCHES A FRAME. ISZ %SAV1 /DONE? JMP %PSPCI /NO- DO IT AGAIN. XCT %HLTA /YES - HALT IF $L. JMS %CRLF JMP %ODT0 /TO NEXT COMMAND / /********** (K1;K2$D) DUMP FROM K1 THRU K2. / %D JMS %SEEND ISZ %SEMI /SEEN ; ? JMP %QUEST /NO - ERROR /YES - %WORDT = K1 (START ADR) /AND %WORDS = K2 (STOP ADR). / /THE STOP ADR MUST BE LARGER OR EQUAL TO START ADR. LAC %WORDS CMA TAD %WORDT /DIFF = # OF WORDS TO PUNCH (2'S COMP). DAC %WORDS /SET COUNT. SMA JMP %QUEST /ERROR IF DIFF NOT NEGATIVE. / /FORM CHECKSUM, INCLUDING %WORDT AND %WORDS / DAC %SAV3 TAD %WORDT DAC %CKSM /INITIAL VALUE OF CHECKSUM JMS %CRLF JMS %RLOC1 /RESET LOC. 1 %HLTA HLT /HALT FOR $L; NOP FOR $H. %HISPD NOP /NOP FOR $L; PSA+10 FOR $H. LAC %WORDT DAC %SAV1 /SET INITIAL POINTER LAC %CKSM /GET INITIAL VALUE OF CHECKSUM %D2 TAD* %SAV1 /ADD IN CORE VALUES ISZ %SAV1 /UPDATE POINTER ISZ %SAV3 /DONE ? JMP %D2 /NO - GO ADD SOME MORE CMA /FORM FINAL CHECKSUM TAD %LL01 /IN 2'S COMP. DAC %CKSM /STORE LAC %WORDT /GET START ADR. JMS %3OUT /PUNCH IT. LAC %WORDS /GET WORD COUNT JMS %3OUT /PUNCH IT LAC %CKSM JMS %3OUT /PUNCH CHECKSUM %D1 LAC* %WORDT /GET SOURCE ISZ %WORDT JMS %3OUT /PUNCH ISZ %WORDS /DONE? JMP %D1 /NO LAW -12 /YES- PUNCH SPACER BLOCK JMP %L2 / /********** PUNCH TERMINAL BLOCK / %T JMS %SEEND JMS %CRLF LAC %WORDS /GET INPUT ISZ %FRSCS /WAS THERE ANY OCTAL INPUT? SKP!CLC /NO-- -1 TO HALT LOADER XOR %LXCT /YES---SET HIGH BIT OF WORD DAC %SAV1 XCT %HLTA /HALT IF $L XCT %HISPD /START PNCH IF $H LAC %SAV1 JMS %3OUT /PUNCH START ADDRESS CLA JMS %3OUT /PUNCH DUMMY WORD JMP %L1 /PUNCH TRAILER / /%PHI PUNCH A FRAME ON HIGH SPEED PUNCH / / CHARACTER IN AC. / / %PHI 0 DAC %CHARO /SAVE CHARACTER %PHIA IORS AND %L400 /SAVE NO TAPE FLAG SZA /SKIP IF OFF JMP %PHIA /WAIT IF ON %PHIC LAC %CHARO /GET CHAR PSF /TEST FLAG JMP .-1 /WAIT IF OFF PSA /PUNCH (ALPHA) JMP* %PHI /EXIT / /%3OUT PUNCH 3 FRAMES / 18 BITS IN AC / %3OUT 0 RCL DAC %SAV1 /SAVE OUTPUT LAW -3 DAC %SAV3 /SET 3 COUNTER %3OUTA LAC %SAV1 JMS %R6L /GET A 6 BIT FRAME DAC %SAV1 AND %L77 XOR %L200 /SET CHANNEL 8 XCT %CALLI /PUNCH A FRAME ISZ %SAV3 /DONE 3 FRAMES? JMP %3OUTA /NO JMP* %3OUT /YES-EXIT .ENDC /%NOBRK REMOVE ALL BREAK ADDRESSES %DUM=. %NOBRK 0 .IFUND %%OB LAW %DUM /DUMMY ADDRESS JMS %FILL LAW %T1 /FILL TABLE 1 LAW %T1+3 JMP* %NOBRK /EXIT .ENDC /%NUMOU PRINT SOME OCTAL NUMBERS / INPUT # OF DIGITS TO PRINT IN AC / SOURCE # IN LOC. % SAV5 %NUMOU 0 DAC %SAV1 /SET LOOP COUNT %NUMOA LAC %SAV5 /GET SOURCE RTL RAL DAC %SAV5 /GET 3 BITS IN LOW ORDER C. AND %L7 TAD %L260 /CONVERT TO ASCII JMS %OUT /PRINT ISZ %SAV1 /DONE? JMP %NUMOA /NO JMP* %NUMOU /YES /%DELY DELAY FOR 200 MS %DELY 0 LAC %LTIM DAC %SAV5 /SET A 200 MS TIME-OUT ISZ %SAV5 JMP .-1 JMP* %DELY /EXIT / /R6L ROTATE AC 6 LEFT %R6L 0 RTL RTL RTL JMP* %R6L /EXIT / /SUBROUTINE %SETLO SAVES LOW CORE AND SETS IT UP FOR INTERCEPTING /INTERRUPTS / %SETLO 0 LAC* %LL01 /SAVE LOCATION 1 DAC %LOC1 LAC* %LL02 /SAVE LOCATION 2 DAC %LOC2 LAC %LJMP2 DAC* %LL01 /SET UP FOR JMP* 2, 2=%INT ADDRESS. LAC %JINT /%LJINT=%INT DAC* %LL02 JMP* %SETLO / / ODT15 DATA AREA / / GENERAL REGISTERS. %AREG 0 /AC AT BREAKPOINT %LINK 0 /LINK AT BREAKPOINT %XMODE 0 .IFDEF %%BANK %AMODE LAC .ENDC .IFUND %%BANK %AMODE 0 .ENDC .IFUND %%WM %MASK 0 /SEARCH MASK %LO 0 /LOW LIMIT %HI 0 /HIGH LIMIT .ENDC %CAD 0 /CURRENT ADR OF OPEN REGISTER. .IFUND %%KU %HF 0 /$K,$U FLAG .ENDC %USTAD 0 /USER PROG START ADDRESS. .IFUND %%V %VREG 17 /AUTOINDEX # .ENDC .IFUND %%OB / / BREAKPOINT STATUS TABLE / / ADR OF BREAK; IF NOT ACTIVW, ADR IS SET=%DUM, A DUMMY. / %T1 0; 0; 0; 0 / / LOOP COUNT FOR BREAK / %T3 0; 0; 0; 0 / / USER INSTRUCTION AT BREAK. / %T2 0; 0; 0; 0 / .ENDC .IFDEF %%OB %T1 0 %T3 0 %T2 0 .ENDC / / GENERAL STORAGE AND FLAGS / / NOTE: THE AREA FROM %N THRU %NOGO IS CLEARED BY %REST / %N 0 /# OF ACTIVE BREAK. .IFUND %%X %SKPX 0 /$X OF A SKIP. %XIP 0 /$X IN PROGRESS .ENDC %TTIF 0 /TTI CHAR READY. %TTOF 0 /TTO READY FOR CHAR. .IFUND %%KU %HFF 0 /PI,API OFF BECAUSE OF $K. .ENDC %TTOST 0 /TTO STATUS AT BREAK. %NOGO 0 /DO NOT BREAK; COUNT NOT SATISFIED. %SHUT -1 /0=OPEN REGISTER /-1=NO OPEN REGISTER .IFUND %%DFT %SEMI 0 /SEMICOLON SEEN IN INPUT. %WORDT 0 /INPUT STATUS WHEN; SEEN. %FRSCT 0 %CKSM=%SAV5 /CHECKSUM STORAGE FOR DUMP. .ENDC %DOL 0 /$ SEEN IN INPUT. %WORD 0 /OCTAL INPUT ACCUMULATOR. %FRSTC 0 /OCTAL INPUT SEEN. %TOTE 0 /CHARACTER COUNTER. %WORDS 00 /SAVED INPUT STATUS WHEN %FRSCS 0 / $ SEEN. %PC 0 /PSEUDO PC %PCS=%PIAPI /SAVED PC FOR $ %LOC1 0 /USER'S LOC. 1 INSTRUCTION. / .IFUND %%OB %TP1 0 /POINTER TO TABLE %T1 %TP3 0 /POINTER TO TABLE %T3 .ENDC %STAT1 0 /PI STATUS AND %STAT2 0 /API STATUS AT BREAK. %CHARI 0 /INPUT CHAR %CHARO 0 /OUTPUT CHAR. %INAC 0 /AC AT INTERRUPT (PI) %TO 0 /TIME-OUT FOR OUTPUT %BRKIN JMS+%AUTOX+20000 /(JMS* %AUTO) BREAKPOINT INSTRUCTION. %JINT %INT .ENDC /EXTRA .ENDC'S IN .ENDC /CASE OF ERROR. .ENDC / /CONSTANTS ********** %LAUTO %AUTOX /USED TO RESET %AUTOX %AXREG %AUTOX /VARIABLE CHANGES EVERY TIME $V IS USED. %LBRK1 %BRK-1 %L10 10 %LINST CAL* %SAV4 %L175 175 %L176 176 %L33 33 %L44 44 %L25 25 %L3777 3777 %LODT %ODT %LL01 1 %LL02 2 %LM4K 17777 %L147S=%LM4K %T1M1 %T1-1 %L4 4 %L45Z 400000 %L200 200 %L42 400200 %LNOP NOP %SAV4 0 %LEBA EBA %LDBA DBA %L47S 7777 %LJMP2 620002 /JMP* 2 %L0 0 /CONSTANT. %LEAE 640000 %LIOT IOT %L24Z 20000 %INBIT=%L24Z %LPAGE 10000 /PAGE BIT. %L347S 37777 %LLAC LAC %LJMP JMP %LJMS JMS %LXCT=%L45Z %L700 700 %L300 300 %L100 100 %LX4 %X4 %LDT11 DAC %T1-1 %LTOVL %TOVAL %L77 77 %JMSI JMS+20000 /JMS* %L40 40 %LPSA1 PSA+10 %L400 400 %L7 7 %L260 260 %LTIM %TIMO %LJBRK1 JMP %BRK1 %LOC0 0 %LOC2 0 /USER MUST SUPPLY THE .END STATEMENTg