@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RSTS70 DECRT11A  't^^  8't^[  8't^kQd 8S  NKw  - { NN).% w Z  =w  5. 7 N=w f  e0w Z , N.w R % @w jz Bt.= w " @w Dw$O  f.4 ]=w  d w  V w g.ZKe0w ,w : 4 8 w ".( 7  $ 7N     .'t^L@G,@8@9.8@q@(N/b h(.; "  " ^7wd .  H   .6   &w 7l 0&"0&g.<w n 7V w w \ ĝ& 7  .bRN D W, 7 D  A.wFw  @p^C Dp. A  & DCc  w w  B.w  ' 7  &w <.\w 8 ww ^ w  fw n .  w 7 www 0 V (.F %E e0 wK 0"(.l:  =w : 3 w , _  .w % w  w w  7 w .7 w 7 7  N  w0.7   ww (b  wTw k.w A B` H %  i.* w  7x w  h w.Pte E 7Np gP  E[ N.v tNR $ld. !n4^4 p L!4^^pL(^.4 p wJ  Q e Q.0   e  w  8 .V  1  W wRW w-  C pJ(.  !G !BL  !;R..44  w J! 4 )| ww@  w wDOIFD#8  @. <f&f k <.  J$( .T4 %D w  4 .z @w @ % % w l4^h^4^$^(.  pt7p7t"  pt"p 7.w0w  -`w*  . rlD j &C@A.EPA&fw &t . tw tt5pppttpp&p/.6 tv  <^< !7w /w 0w F.w   ` E.8 `  n ^ .^ wt^.\ w`%6 &ee.  N @ e0w  N r|. w  7?U4W.Ew H7*E7  .P w~w^$  N    N( ;. -F,& -* :. e e N.w  ?w x7 ).H H w 7 7 7 7 6 7 4  0   ^ " .  w r%0. t pp w ,׭ pp. U6w pw  $&. 7E%7    E. `  1 W $Ć  .> w m 7 yT8Hw 7 7 >.B f7H]w ŝ.h ŝEf x*.*T "8$H&.(vd*~R`*.*~R ` . wt!^ w Rw ^$(e. w @e~%ĕt^7 pC^"px0h(8n`.0h ( 8n>.P  7  &. pw Bw Ve` w H;w @ p|. ĝ^w w7&"7^b.& vP      .D  7 Z  w 7 .7 %    w b%f.w  wt! l B.L w w :w P;w Vw @.r %7@  =w 4 w , w $w Bw.$w x  , x l h 7l .J\\ \ w 8P J H w nww nVw   {. e` w ;w ĝ ":. w w ? H> \/*.p%w  ( 6  L  $Lp. * e^  !lz !luL^l<?H D > -. 2? w "-& &  (q. -e .J%V!   .pw~ %,?&?  $.w  FORODT ALLOWS BREAKPOINTS TO BE SET IN FORTRAN AS WELL AS ASSEMBLY LANGUAGE PROGRAMS RUNNING ON THE PDP-11 WITH THE RT-11 OP j -U.Ze  w`%pw .7w  e0w F,w >ERATING SYSTEM. FORODT FEATURES ARE IN ADDITION TO THOSE PROVIDED IN DEC ODT V01-02. THE NEW FEATURES INCLUDE THE SETTING AND.w T Cå ..å$ נA  .T e`  CLEARING OF FORTRAN BREAKPOINTS, A FORTRAN "GOTO" COMMAND, AND THE CHANGE OF TYPE-IN/TYPE-OUT RADIX. OCTAL, INTEGER, REAL (2    !.zËנe ee e ѐ . @( FO-WORD FLOATING POINT), AND DOUBLE (4-WORD FLOATING POINT) I/O CONVERSIONS ARE AVAILABLE. FORODT OCCUPIES ABOUT 2100 DERODT V01-02 3  BE . *;/\ $G _<^,OWEBP@>SRC-FI!XAV#.4+89DTSPMCFRCIMAL WORDS, ABOUT 600 MORE THAN ODT. TWO FORTRAN OTS ROUTINES REQUIRE AN ADDITIONAL 633 WORDS, BUT ARE USUALLY NEEDED BY THEB  HH u 0.0 FORTRAN PROGRAM SO THE EFFECT IS USER-DEPENDENT. --- FORTRAN BREAKPOINTS ODT WAS DESIGNED TO BE USED TO DEBUG ASSEVMBLY LANGUAGE PROGRAMS. THE RT-11 FORTRAN COMPILER DOES NOT GENERATE ASSEMBLY LANGUAGE INSTRUCTIONS; IT GENERATES A LIST OF SUBROUTINE ENTRY POINTS AND ARGUMENTS WHICH PERFORM THE DESIRED FUNCTION WHEN EXECUTED IN ORDER. A POINTER IS USED TO THREAD THROUGH THE LIST. ACTUAL EXECUTION OCCURS WITHIN SUBROUTINES WHICH COME FROM THE FORTRAN LIBRARY (FORLIB). NORMAL ODT BREAKPOI  "G,. w   w&   8+.@ tE%~ %% %? tw.f 7vprE< v prg. {` w FORODT - FORTRAN DEBUG ROUTINE FOR THE PDP-11 (RT-11)   . ۇw .ח/ w r ׭r (rU. ^w ZUw R0wF D. N. TANNER SANDIA LABORATORIES LIVERMORE LIVERMORE, C0". 7B   7,N( &Nr.$"N- twp 7h ?  NA 94550 CONDENSED VERSION OF SAND76-8265 INTRODUCTION BE SET IN FORTRAN THREADED CODE. THIS IS IN ADDITION TO THE EIGHT BREAKPOINTS AVAILABLE FOR NORMAL ASSEMBLY LANGUAGE ROUTINES CODE ROUTINE NAMES OR ENTRY POINTS. THE FORTRAN BREAKPOINT COMMAND R;V OPERATES IDENTICALLY TO THE NORMAL ODT BREAKPO. THE FORTRAN COMPILER HAS AN OPTION WHICH PROVIDES THE INFORMATION NEEDED TO SET FORTRAN BREAKPOINTS. THE L SWITCINT COMMAND R;B. --- PROGRAM START AND CONTINUE WHEN THE PROGRAM IS RUN, IT WILL START UP IN FORODT. BREAKPOINTS CH (/L:7) TELLS THE FORTRAN COMPILER TO GENERATE THE GENERATED CODE LISTING AND THE STORAGE MAP IN ADDITION TO THE LISTING. AN BE SET AND THE PROGRAM IS STARTED AT THE BEGINNING OF THE MAIN PROGRAM FOR FORTRAN PROGRAMS. WHEN A BREAKPOINT OCCURS, FOR--- SETTING THREADED CODE BREAKPOINTS THE BREAKPOINT MUST BE CHOSEN FROM THE GENERATED CODE LISTING OF THE FORTRAN PROODT TYPES VN;R WHERE R IS THE LOCATION OF THE BREAKPOINT AND N IS THE BREAKPOINT NUMBER. THIS IS IDENTICALGRAM. ONCE THE ABSOLUTE OR RELATIVE LOCATION IS FOUND THE BREAKPOINT IS SET: R;NV R IS THE ADDRESS OF T IN FORM TO THE ODT BREAKPOINT BN;R. THE PROGRAM EXECUTION IS CONTINUED BY TYPING ;P OR N;P. THIS IS ALSO IDENTICAL THE BREAKPOINT N IS THE BREAKPOINT NUMBER 0 TO 7. THE ADDRESS OF THE BREAKPOINT IS EITHER ABSOLUTE OR RELATIVE FORM. TO ODT. FORODT KNOWS WHICH TYPE OF BREAKPOINT OCCURRED. --- SINGLE INSTRUCTION MODE THE ODT SINGLE INSTRUCTION MODEHE ABSOLUTE ADDRESS IS THE OCTAL LOCATION IN MEMORY. THE RELATIVE FORM IS K,L;NV WHERE K IS THE RELOCATION REGISTER AND L IS CANNOT BE SET WHEN THE BREAKPOINT IS A FORTRAN BREAKPOINT (;V). THE SINGLE INSTRUCTION MODE IS AVAILABLE FOLLOWING AN ODT BRTHE LOCATION RELATIVE TO THE CONTENTS OF RELOCATION REGISTER K. THE FORTRAN STATEMENT (LINE 7) IA(I)=K RESEAKPOINT (;B). --- FORTRAN GOTO THE "GOTO" COMMAND ALLOWS PROGRAM EXECUTION TO PROCEED AT ANY FORTRAN INSTRUCTION.ULTS IN THE FOLLOWING CODE ISN #0007 000102 ISN$ 000104 SAI$MM 000006 LCOM+#177776 000112 MOI$MA 000010 T THE COMMAND CAUSES EXECUTION TO ASSUME AT A THREADED CODE LOCATION WITH THE SAME RULES WHICH APPLY TO THE FORTRAN BREAKPOINT HE ABSOLUTE LOCATION AND ACTUAL CONTENTS ARE DETERMINED BY THE LINKER AND ARE FOUND FROM THE LOAD MAP. THE ABSOLUTE LOCATION I(;V). THE GOTO COMMAND IS R;T WHERE R IS THE LOCATION OF THE START OF THE FORTRAN INSTRUCTION. WHS FOUND BY ADDING THE RELATIVE LOCATION TO THE START OF THE ROUTINE. TO SET A BREAKPOINT, THE RELATIVE LOCATION OF LINILE THE COMMAND ALLOWS THE USER TO CHANGE THE ORDER OF PROGRAM EXECUTION, THERE ARE SOME PITFALLS WHICH MUST BE CONSIDERED. SOE 7 IS FOUND IN THE GENERATED CODE LIST. IT IS SET WITH 0,102;V. IT IS IMPORTANT TO NOTE THAT BREAKPOINTS COULD ALSO BE SET ME OF THE RESTRICTIONS AND PRECAUTIONS ARE: 1. THE FORTRAN PROGRAM SHOULD ALWAYS START INITIALLY WITH THE R;G NTS CANNOT BE USED BECAUSE THE BREAKPOINTS MUST BE AT AN EXECUTABLE LOCATION. FORODT ALLOWS UP TO EIGHT BREAKPOINTS TOAT 0,104 AND 0,112, BUT NOT AT 0,106, 0,110, AND 0,114 SINCE THESE WORDS CONTAIN ARGUMENTS FOR THE THREADED CODE, NOT THREADEDT SHOULD NOT BE ATTEMPTED AGAIN WITHOUT EXITING TO MONITOR (.). THIS IS NECESSARY BECAUSE THE FIRST ACTION FORTRAN TAKES IS TWITH THE LABEL. THE VARIABLE IS REFERENCED RELATIVE TO THAT LOCATION. --- DUMMY VARIABLES DUMMY VARIABLES (ARGUMEO SET UP THE FORTRAN OTS WORKSPACE AND TABLES. THIS CANNOT BE DONE MORE THAN ONCE. THE R;T COMMAND CAN BE USED TO RESNTS IN A SUBROUTINE) ARE REFERENCED DIFFERENTLY. WITHIN THE SUBROUTINE THE STORAGE MAP INDICATES THE ARGUMENT IS A PARAMETER V COMMAND BECAUSE THE FIRST FEW WORDS OF THE PROGRAM ARE INSTRUCTION WHICH INITIALIZES THE FORTRAN WORK SPACE AND TABTART AS LONG AS THE RESTRICTIONS WHICH APPLY TO THIS COMMAND ARE OBSERVED. IF THE RESTART FOLLOWS A BREAKPOINT IN A SUBROUTINLES AND START THE THREADED CODE EXECUTION. 2. MANY FORTRAN INSTRUCTIONS ARE MEANT TO BE EXECUTED ONLY ONCE. E, STACK OVERFLOW COULD RESULT. BY RETURNING TO THE MAIN PART OF THE PROGRAM SUBROUTINE, LINKAGE PROBLEMS ARE AVOIDED, BUT THE FOR EXAMPLE, INSTRUCTIONS WHICH SET UP AND OPEN I/O CHANNELS. A SECOND EXECUTION OF THESE INSTRUCTIONS COUL STACK POINTER IS NOT RESET TO CLEAR OUT THE LINKAGE. IF THIS IS DONE SEVERAL TIMES THE STACK WILL CONTINUE TO GROW TO THE POD PRODUCE FATAL OR UNPREDICTABLE RESULTS. 3. DISRUPTING THE NORMAL SUBROUTINE NESTING IS RISKY. AS AN EXAMPINT WHERE THE HARDWARE FLAGS THE OVERFLOW. --- DATA ACCESS ODT AND FORODT REQUIRE THAT THE ABSOLUTE OR RELATIVE LOLE: SUBROUTINE A CALLS B SUBROUTINE B CALLS C IF WE GOTO AN INSTRUCTION IN SUBROCATION BE KNOWN FOR EACH WORD TO BE OPENED. THE FORTRAN LISTING PROVIDES THIS INFORMATION IN THE STORAGE MAP. A VARIABLE CANUTINE B, THE RETURN LINK TO SUBROUTINE A WILL NOT BE SET UP AND THE PROGRAM WILL NOT RUN CORRECTLY BE EXAMINED BY TYPING R/ THE VALUE IS DISPLAYED FOLLOWING THE /. THERE ARE FOUR VARIABLE STORAGE CLAS. 4. THE GOTO SHOULD NOT START IN THE MIDDLE OF A FORTRAN STATEMENT. IN LINE 7 LOCATION 0,102 IS THE START SIFICATIONS: 1. LOCAL VARIABLES. 2. VARIABLES STORED IN BLANK COMMON. 3. VARIABLES STORED IN LABELOF THE STATEMENT AND 0,102;T IS VALID. RESUMING AT 0,104, 0,110 AND 0,112 ARE NOT RECOMMENDED UNLESS THE USED COMMON. 4. VARIABLES WHICH ARE PARAMETERS OR ARGUMENTS IN A SUBROUTINE. THE FORTRAN STORAGE MAP LISTING AND THEER IS FULLY AWARE OF THE REQUIREMENTS OF THE ROUTINES SKIPPED IN THAT LINE. MANY OF THE OTS ROUTINES REQUIRE THAT INF LOAD MAP ARE USED TO DETERMINE THE ACTUAL LOCATION OF EACH VARIABLE. --- LOCAL VARIABLES THE FORTRAN STORAGE MAP ORMATION BE PLACED ON THE STACK IN CORRECT ORDER, AND THIS MAY NOT BE ACCOMPLISHED CORRECTLY IF EXECUTION STGIVES THE RELATIVE LOCATION. --- BLANK COMMON BLANK COMMON APPEARS IN THE LOAD MAP AS THE .$$$$. AND ANY VARIABLE ARTS IN THE MIDDLE OF THE LINE. --- RESTARTING A PROGRAM ONCE THE PROGRAM HAS BEEN STARTED USING THE R;G COMMAND, IIN BLANK COMMON IS REFERENCED RELATIVE TO THAT LOCATION. --- LABELED COMMON LABELED COMMON APPEARS IN THE LOAD MAP SINGLE # FOLLOWED BY THE LETTER I, F, D, OR O. THIS WILL CAUSE THE CONTENTS OF THE CURRENT WORD TO BE DISPLAYED IN THE NEW C *##F *1012/0.158000E-04 #I 14400 1 HERE ONLY LOCATION 1044 IS CHANGED BECAUSE THE CURRENT RADIX WAS CHANGED URRENT RADIX. INPUT TO CHANGE A WORD MUST ALWAYS BE IN THE CURRENT RADIX. WORD ADDRESSES ARE ALWAYS OCTAL. FOR EXAMPLE, THE DTO DECIMAL INTEGER (1 WORD). *##I *1012/ 14400 #F 0.158000E-04 1.23 HERE THE FLOATING POINT NUMBEFAULT RADIX IS OCTAL AND THE LOCATION 1202 IS OPENED 1202/000020 #I 16 18 LOCATION 1202 CONTAINED 20 OCTAER 1.23 IS STORED IN LOCATIONS 1012 AND 1014. --- RESTRICTIONS PROGRAMS WHICH USE OVERLAYS REQUIRE SPECIAL CAUTION.L. THE #I CHANGED THE CURRENT RADIX TO DECIMAL INTEGER, AND THE CONTENTS OF 1202 WERE DISPLAYED AS 16 DECIMAL. 18 CHANGED BREAKPOINTS CANNOT BE SET IN OVERLAY REGIONS IF A NEW SEGMENT WILL BE SWAPPED IN, AS THE BREAKPOINT WILL BE DESTROYED. BREA THE CONTENTS OF 1202 TO 18 DECIMAL OR 22 OCTAL. REAL AND DOUBLE FLOATING POINT NUMBERS OCCUPY TWO OR FOUR WORDS, SO IFKPOINTS IN THE ROOT SEGMENT WILL WORK FINE. FORODT WILL OPERATE WITH ASSEMBLY LANGUAGE PROGRAMS IF THE DECIMAL I/O FEAARIABLE. THE RELATIVE LOCATION GIVEN DOES NOT CONTAIN THE VALUE, IT CONTAINS THE LOCATION OF THE VALUE. --- INPUT/OUTPUT R A LOCATION IS OPENED WITH A REAL RADIX, THAT WORD AND THE NEXT WORD ARE OPENED AND DISPLAYED IN FLOATING POINT. THE REPLY ISADIX FORODT HAS THE FEATURE TO CHANGE THE I/O RADIX FROM OCTAL TO DECIMAL INTEGER OR FLOATING POINT. WHEN FORODT IS F CONVERTED BACK AND TWO WORDS ARE MODIFIED. IF A LINE FEED IS TYPED, THE NEXT REAL NUMBER IS OPENED AND DISPLAYED. EXAMPLE: IRST STARTED, THE DEFAULT I/O RADIX IS OCTAL. WHEN A WORD IS OPENED THE CONTENTS ARE DISPLAYED IN THE CURRENT RADIX. *1012/ 034100 #F 0.1148000E-04 1.158E-5 001016/0.1296000E-03 THE SECOND LOCATION OPENED IS FOUR M TO BETTER EXPLAIN THE I/O RADIX OPERATION, IT IS NECESSARY TO DEFINE TWO TERMS: 1. CURRENT RADIX THE I/ORE THAN THE FIRST. THE CURRENT RADIX DETERMINES THE NUMBER OF WORDS DISPLAYED AND MODIFIED. EXAMPLE: *10O RADIX WHICH IS IN EFFECT FOR WHEN A WORD IS OPEN AND IS THE RADIX USED LAST TO DISPLAY THE CONTENTS TO THAT WORD. 44/ 000000 #F 0.0000000 #I 0 1 IN THIS CASE, THE CURRENT RADIX WAS CHANGED FROM REAL TO INTEGER AND ONLY ONE WORD WAS M 2. DEFAULT RADIX THE CURRENT RADIX IS RESTORED TO THE DEFAULT RADIX WHEN FORODT TYPES AN *. IF SODIFIED. THE LINE FEED CAUSED THE NEXT WORD TO OPEN AND IT WAS DISPLAYED AS A DECIMAL INTEGER. THE DEFAULT RADIX IS SEUCCESSIVE WORDS ARE OPENED BY TYPING A LINE FEED, THE CURRENT RADIX IS RETAINED UNTIL A CARRIAGE RETURN IS TYPED OR T BY TYPING TWO #'S AND THE LETTER I, F, D, OR O. WHEN FORODT IS FIRST RUN, THE DEFAULT RADIX IS OCTAL. *##F AN ERROR OCCURS. BOTH THE CURRENT RADIX AND DEFAULT RADIX CAN BE CHANGED. THE CURRENT RADIX IS CHANGED BY TYPING A SET THE DEFAULT RADIX TO 2 WORD FLOATING POINT *1012/0.1158000E-04 001014/0.129000E-03 REGISTER. R-> K,L WHERE K IS THE RELOCATION REGISTER NUMBER AND L IS THE RELAT COMMAND FORMAT EXPLANATION / R/ OPENS THE WORD AT LOCATION R. THEIVE LOCATION. R -> L + CONTENTS OF RELOCATION REGISTER K. ;NV REMOVES BREAKPOI CONTENTS DISPLAYED IN THE CURRENT RADIX. THE LOCATION MAY BE MODIFIED BY TYPING A NEW VALUE IN NT N. ## ##I SETS DEFAULT I/O RADIX TO 1-WORD DECIMAL INTEGER. ##F SETS DEFAULT I/O THE CURRENT RADIX FOLLOWED BY A OR . CARRIAGE RETURN. CLOSES AN OPEN LO RADIX TO 2-WORD FLOATING POINT (REAL). ##D SETS DEFAULT I/O RADIX TO 4-WORD FLOATING POINT CATION MODIFYING IT IF A NUMBER WAS TYPED AND IT TYPES AN * FOR THE NEXT COMMA (DOUBLE). ##O SETS DEFAULT I/O RADIX TO 1-WORD OCTAL. # USED ONLYND. LINE FEED. CLOSES THE CURRENT LOCATION, MODIFYING IT IF A NUMBER WAS T WHEN A LOCATION IS OPEN TO CHANGE THE CURRENT I/O RADIX. THE CURRENTLY OPENED LOCATION IS YPED AND OPENS THE NEXT SEQUENTIAL LOCATION. THE F AND D RADIX OPTIONS MODIFY TWO AND DISPLAYED IN THE RADIX INDICATED FOLLOWING THE #. THIS NEW CURRENT I/O RADIX IS MAINTAINE FOUR WORDS AND OPEN THE NEXT TWO OR FOUR WORD GROUP. R ;R RESETS ALL RELOCATION REGISTER TO -1 (D UNTIL A CARRIAGE RETURN IS TYPED OR FORODT TYPES AN *. #I SETS CURRENT I/O RUNASSIGNED). ;NR RESETS RELOCATION REGISTER N TO -1. R;NR SETS RELOCATION REGISTETURES ARE DESIRED, BUT THE PROGRAM MUST BE LINKED WITH THE F SWITCH BECAUSE FORODT USES FORTRAN I/O CONVERSION ROUTINES. ADIX TO 1-WORD DECIMAL INTEGER. #F SETS CURRENT I/O RADIX TO 2-WORD FLOATING POINT (REAL). COMMAND SUMMARY COMMAND FORMAT EXPLANATION V ;V REMOVES ALL #D SETS CURRENT I/O RADIX TO 4-WORD FLOATING POINT (DOUBLE). #O SFORTRAN BREAKPOINTS. R;V SETS FORTRAN BREAKPOINT AT ABSOLUTE LOCATION R. THE NEETS CURRENT I/O RADIX TO 1-WORD OCTAL. $ $V/ OPENS THE FIRST WORD OF THE FORTRAN BREAKPOINT TABLE. XT AVAILABLE BREAKPOINT NUMBER IS USED. R;NV SETS FORTRAN BREAKPOINT N AT LOCATION R. THE T R;T GOTO -- RESUMES PROGRAM AT THREADED CODE LOCATION R. ODT COMMANDS LOCATION R IS EITHER THE ABSOLUTE LOCATION (OCTAL) OR THE LOCATION RELATIVE TO A RELOCATION ALL OF THE ODT COMMANDS ARE AVAILABLE IN FORODT. THOSE MOST USEFUL TO THE FORTRAN PROGRAMMER ARE SUMMARIZED HERE. OPERATE PROPERLY. P ;P PROCEED WITH PROGRAM EXECUTION FROM THE BREAKPOINT UP IN LOAD MAP ; ; DEFINE FORTRAN (FORLIB) I/O CONVERSION ROUTINES .GLOBL ICI$,RCI$,ICO$,GCO$,DCO$ . = .+232+60 ;RE B OR V. K;P PROCEED WITH PROGRAM EXECUTION FROM THE BREAKPOINT B OR V; ANDSERVES SPACE FOR STACK R0 = %0 ; REGISTER R1 = %1 ; NAMING R2 = %2 ; CONVENTIONS R3 = %3 R4 = %4 R5 = %5 SP = %6 PC SKIPS K-1 ENCOUNTERS WITH THIS BREAKPOINT. = %7 ST = 177776 ;STATUS REGISTER O.BKP = 16 ;NUMBER OF BREAKPOINTS-1 MULT. BY 2 O.RLR = 16 ;NO. OF RELOC. REGISTERS-1, TIMES 2 O.TVEC = 14 ;TRT VECTOR LOCATION O.RELC = 20 ;NUMBER OF RELOC.REGISTERS(TIMES 2) O.STM = 340 ;PRIORITY MASK - STATUS REGISTER O.TBT = 20 ;T-BIT MASK - STATUS REGISTER TRT = 000003 ;TRT INSTRUCTION O.RDB = 177562 ;R DATA BUFFER O.RCSR = 177560 ;R C/SR O.TDB = 177566 ;T DATA BUFFER O.TCSR = 177564 ;T C/SR MTPS = 106400 ;MOVE TO PS FOR LSI MFPS = 106700 ;MOVE FROM PS FOR LSI .PAGE ; INITIALIZE ODT ; USE O.ODT FOR A NORMAL ENTRY ; USE O.ODT+2 TO RESTART ODT - WIPING OUT ALL BREAKPOINTS ; USE O.ODT+4 TO RE-ENTER (I.E. - FAKE A BREAKPOINT) O.ODT: BR O.STRT ;NORMAL ENTRY BR O.RST ;RESTART O.ENTR: JSR PC,O.RRST ;RE-ENTER -- SAVE STATUS MOV O.TVEC+2,-(SP) ;SET UP LOCAL STATUS JSR PC,O.WST MOV PC,-(SP) ;FAKE THE PC MOV (SP)+,O.UPC MOVB #-1,O.P ;DISALLOW PROCEED CLRB O.S JMP O.BK1 O.STRT: NOP ;TO SAVE STATUS NOP ;JSR PC,O..TITLE FORODT V01-02 ; ODT WITH FORTRAN BREAKPOINT AND DECIMAL I/O FEATURES ; ADAPTED FROM RT-11 ODT V01-02 ; D. N. TANNERRST FOR PDP11 ;MFPS,O.UST FOR LSI MOV @#4,-(SP) ;SAVE RT INTERRUPT VECTOR MOV #O.STR1,@#4 ;SET ODT VECTOR TST ST ;LR N TO VALUE OF R. G R;G GOES TO LOCATION R AND STARTS THE PROGRAM. R;G SHOULD BR ; SANDIA LABORATORIES LIVERMORE ; LIVERMORE CA. 94550 ; DOCUMENTED IN SAND76-8265 ; January 1977 ;IF YOU CHANGE THE TO THE BEGINNING OF THE MAIN FORTRAN PROGRAM. R;G TO THREADED CODE LOCATIONS WILL NOT E VERSION #, ;DON'T FORGET TO CHANGE AT O.ID! .PAGE ;EDIT # V01-02-00 .GLOBL O.ODT ;GETS ENTRY POINT TO SHOW R PC,F.RALL ;CLEAR THREADED CODE BREAK PT TBL CLR F.RAD ;I/O RADIX TO OCTAL JMP O.RALL ;CLEAR BRK PT TABLES ;O.CTLC ; ^CRRING MOV R4,-(SP) ;BY O.RORA JSR 5,O.RORA MOV (SP)+,R4 MOV (SP)+,R2 MOVB #'\,R0 ;PRINT BACK SLASH JSR 5,O.FTYP JSI WILL TRAP TO 4 ;PDP11 WILL CONTINUE BR O.STR2 ;DON'T CHANGE ACCESS TO PS O.STR1: MOV #MFPS+67,O.RRST ;CHANGE PS ACCE PROCESSING. RETURN TO KEYBOARD MONITOR ; ; O.CTLC: MOV O.USP,SP ;RESTORE USER STACK MOV #O.CCST,R4 MOV #O.CCSP,R3 JSR SS IN TWO SUBROUTINES ;O.RRST AND O.WST ;STORE MFPS O.UST IN O.RRST MOV #O.UST-O.RRST-4,O.RRST+2 MOV #NOP,O.RRST+4R5,O.TYPE ;ECHO "^C" MOVB #100,O.RCSR ;TURN ON KEYBOARD INTERRUPT MOV SP,R0 ;WE WANT EXIT TO DO A SOFT RESET EMT 340+10 MOV #MTPS+66,O.WST ;STORE MTPS 2(SP) MOV #240,O.WST+4 MOV #O.STR2,(SP) ;REPLACE PC ON STACK WITH CONTINUE ;LOCATION.;EXIT TO KEYBOARD MONITOR O.CCST: .BYTE '^ O.CCSP: .BYTE 'C ; O.ALF REXP;NA TYPE N CHARACTERS STARTING AT REXP; ; THEN--PC,SP WERE PUT THERE BY ;THE TIMEOUT TRAP TO 4 RTI ;RESTORE PS AND CONTINUE AT O.STR2 O.STR2: MOV (SP)+,@#4 ;RESTOR ; ACCEPT A STRING OF ASCII TEXT. STORE IT IN ; SUCCESIVE BYTES STARTING AT THE INDICATED ; LOCATION. TEXT TERMINATED BY COUNE CONTENTS OF 4 ;RUN AT CURRENT STATUS JSR 5,O.SVTT ;SAVE TTY STATUS JSR 0,O.SVR ;SAVE REGISTERS (MAINLY SP) MOV #O.UR0T, N. ; OR CR OR LF. ODT PRINTS THE ADDR OF ; THE NEXT AVAILABLE LOCATION IN CORE ; O.ALF: TST R3 ;WAS REXP TYPED? BEQ O.,SP ;SET UP STACK MOV #O.ID,R4 ;TYPE ID MOV #O.IDND,R3 JSR 5,O.TYPE BR O.RST1 O.RST: JSR 0,O.SVR ;SAVE REGISTERS JSRELF1 ;BR IF NOT TSTB O.SMFD ;WAS ; TYPED? BEQ O.ELF1 ;BR IF NOT, ERROR TST R2 ;IF N NOT TYPED, ASSUME 1 BNE O.ELF4 I 5,O.REM ;REMOVE ALL BREAKPOINTS JSR 5,O.CLRR ; CLEAR RELOCATION REGISTERS MOVB O.PRI,R4 ;GET ODT PRIORITY RORB R4 ;SHIFNC R4 O.ELF4: MOV R4,-(SP) ;SAVE COUNT ;SET UP TO TYPE N CHAR. MOV R5,R4 ;ADDR OF 1ST BYTE IN R4 MOV R5,R3 ;ADDR OF 1STT RORB R4 ; INTO RORB R4 ; POSITION MOVB R4,-(SP) ;STORE IN STATUS JSR PC,O.WST O.RST1: CLRB O.S ;DISABLE SINGLE IN BYTE IN R3 ADD (SP),R3 ;ADD N TO R3 DEC R3 ;SUB. 1 TO GET LAST ADDR MOV R3,O.XXX ;SAVE LAST ADDR. JSR 5,O.TYPE ;TYPE TSTRUCTION FOR NOW MOVB #-1,O.P ;DISALLOW PROCEED MOV #O.STM,O.TVEC+2 ;STATUS WORD TO TRT VECTOR+2 MOV #O.BRK,O.TVEC ;PC THE CHARACTERS JSR 5,O.CRLF ;TYPE CR/LF MOV (SP)+,R4 ;RECALL N TO R4 ;NOW ACCEPT INPUT STRING INCB O.SCRN ;ALLOW SPACES VIO TRT VECTOR ; THIS NEXT INSTRUCTION RAISES THE "Z" FLAG BECAUSE ; ITS PURPOSE IN LIFE IS TO BEHAVE DIFFERENTLY ON THE /20 ; A O.GET JSR 5,O.GET ;LOOK AT FIRST CH. CMPB R0,#015 ;IS IT A CARR.RET? BEQ O.ELF5 ;IF YES, RETURN TO COMM. DEC. CMPB AND THE /45 SO WE CAN CHANGE THE RTT WHICH ALSO ; BEHAVES DIFFERENTLY ON THE /20 AND /45. JMP (PC)+ ;PROCESSOR DEPENDENT INR0,#012 ;CHK FOR LF BNE O.ELF7 ;IF NOT, ACCEPT N CHARACTERS CLRB O.SCRN ;MAKE SPACES INVISIABLE TO O.GET MOV O.XXX,R4 ;STRUCTION BR O.45 ;THIS PROCESSOR IS A 40 OR 45 MOV #RTI,O.RTIT ;CHANGE THE RTT TO AN RTI IF THEIS IS 11/20 OR 05 O.45: JSIF LINE FEED, OPEN NEXT AVAILABLE CH. INC R4 INC R2 MOV R4,R0 ;PRINT NEXT AVAIL BYTE MOV R2,-(SP) ;SAVE TO AVOID CLOBBE ; ;RETYPE OPENED WORD IN ANSCII (CONVERTED FROM MOD40) O.MOD: MOV O.CAD,R0 ;CALL MOD40 UNPACK MOV #O.ALF1,R1 JSR PC,UNPA0 ERROR MOV O.CAD,R2 ;CURRENT ADDRESS IN R2 RTS R5 O.TCL1: TST (SP)+ O.TCL2: JMP O.ERR ;POP A WORD AND SHOW THE ERROR ;0 ;ASCII CHARS GO INTO O.ALF1,2,3 MOV #'=,R0 ;PRINT "=" JSR R5,O.FTYP INCB O.SCRN ;SET FLAG TO ALLOW SPACES MOVB O.ALF1 PROCESS S - SINGLE INSTRUCTION MODE O.SNGL: TSTB O.SMFD ;DONT REACT IF ; NOT TYPED BEQ O.TCL2 TST R2 ;SEE IF TURN ON OR,R0 ;PRINT 1ST CHAR JSR R5,O.FTYP MOVB O.ALF2,R0 ;PRINT 2ND CH JSR R5,O.FTYP MOVB O.ALF3,R0 ;PRINT 3RD CH JSR R5,O.FTY TURN OFF BNE O.SI1 ;BRANCH IF TURNING IT ON CLRB O.S ;CLEAR THE FLAG JMP O.DCD ;CONTINUE THE SCAN O.SI1: TST F.FLAG P MOV #' ,R0 ;PRINT SPACE JSR R5,O.FTYP JSR R5,O.GET ;USER MUST NOW TYPE: CMPB R0,#' ;IF CHAR IS LESS THAN SPACE, BLT; ;S NOT ALLOWED BNE O.TCL2 ;FROM ;V BRK PT MOVB #-1,O.S ;SET THE FLAG O.SI2: JMP O.DCD .PAGE ;COMMA PROCESSING. N IN RMP O.BYT O.ELF3: JSR 5,O.GET ;GET NXT CH. O.ELF7: JSR 5,O.CU ;CHK FOR ^U MOVB R0,(R5)+ DEC R4 ;REDUCE COUNT. IS IT ZERO O.MOD1 ;PREPARE TO ENTER COMMAND DECODER MOVB R0,O.ALF1 ;OTHERWISE READ 3 CHAR JSR R5,O.GET ;2ND CH MOVB R0,O.ALF2 JSR ? BEQ O.ELF2 ;BR IF YES BR O.ELF3 O.ELF2: MOV R5,-(SP) ;PRINT NXT AVAIL LOC: JSR 5,O.CRLF ;CR,LF MOVB #2,O.BW ;FORCE R5,O.GET ;3RD CHAR CLRB O.SCRN ;RESTORE O.GET TO NORMAL MOVB R0,O.ALF3 MOV #O.XXX,R0 ;TELL MOD40 TPACK TO PACK MOV #O.AWORD MODE MOV (SP)+,R0 ;THEN, ADDRESS JSR 5,O.RORA ; O.ELF5: CLRB O.SCRN ;MAKE SPACE INVISABLE TO O.GET JMP O.DCD ;RETLF1,R1 ;INTO O.XXX JSR PC,PACK00 MOV O.XXX,R4 ;MAKE IT APPEAR AS IF THE MOV #1,R2 ;PACKED # WAS TYPED JMP O.SCAN ;LET COURN TO COMMAND DECODER O.ELF1: JMP O.ERR ; ; SPECIAL NAME HANDLER ; DEPENDS UPON THE EXPLICIT ORDER OF THE TWO TABLES OMMAND DECODER DO THE REST O.MOD1: CLRB O.SCRN CLR R4 ;MAKE IT APPEAR CLR R2 ;AS IF NO NUMBERS WERE TYPED IN O.MOD2: JMP .TL AND O.UR0 O.REGT: JSR 5,O.GET ;SPECIAL NAME, GET ONE MORE CHARACTER CMPB R0,#'V ;$V? BEQ F.DOL ;YES, OPEN THREADEDO.SCN1 ;TYPED IN .PAGE ; "BACKARROW" HANDLER - OPEN INDEXED ON THE PC (BACK ARROW) O.ORPC: JSR 5,O.TCLS ;TEST WORD MODE AN CODE BRK PT TABLE MOV #O.TL,R4 ;TABLE START ADDRESS O.RSP: CMPB R0,(R4)+ ;IS THIS THE CORRECT CHARACTER? BEQ O.SP ;JUMP ID CLOSE ADD @R2,R2 ;COMPUTE INC R2 INC R2 ; NEW ADDRESS O.PCS: MOV R2,O.CAD ;UPDATE CAD JMP O.OP2A ;GO FINISH UP F YES CMP #O.TL+O.LG,R4 ;IS THE SEARCH DONE? BHI O.RSP ;BRANCH IF NOT BIC #177770,R0 ;MASK OFF OCTAL MOV R0,R4 O.SP1: O.ORAB: JSR 5,O.TCLS ;TEST WORD MODE AND CLOSE MOV @R2,R2 ;GET ABSOLUTE ADDRESS BR O.PCS O.ORRB: JSR 5,O.TCLS ;TEST AND CASL R4 ADD #O.UR0,R4 ;GENERATE ADDRESS O.SP2: INC R2 ;SET FOUND FLAG JMP O.SCAN ;GO FIND NEXT CHARACTER O.SP: SUB #O.TL-LOSE MOV @R2,R1 ;COMPUTE NEW ADDRESS MOVB R1,R1 ;EXTEND THE SIGN ASL R1 ;R2=2(@R2) INC R1 ; +2 INC R1 ADD R1,R7,R4 ;GO FIND NEXT CHARACTER BR O.SP1 ; ; F.DOL: MOV #F.ADR1,R4 ;THREADED CODE BREAK POINT TABLE BR O.SP2 ;GO FINISH 2 ; +PC BR O.PCS O.TCLS: JSR PC,O.CLSE ;CLOSE CURRENT CELL CMP #2,O.BW ;ONLY WORD MODE ALLOWED BNE O.TCL1 ;BRANCH IF70,R4 ;GUARANTEE THAT N<10 ASL R4 ;N TYPED, CASE B OR C. SET $NR. TST R3 ;IF REXP NOT TYPED,CLEAR TO -1 BEQ O.RELA MOVENTS OF $C O.CNS: TSTB O.SMFD ;WAS A SEMICOLON TYPED? BNE O.CNS1 ;REXP TYPED PRIOR TO ; CASE A MOV O.CNST,R4 ;CASE C. RE R5,O.RELT(R4) ;IF REXP NOT TYPED, R5=0. CASE B. O.REL5: BR O.H1 ;EXIT TO DECODER O.REL2: TST R3 ;IF REXP TYPED, CASE B OR CPLACE R4 WITH ($C) MOV #1,R2 BR O.SCAN ;RETURN TO SCAN MORE O.CNS1: MOV #'=,R0 ;PRINT VALUE MOV #2,O.BW JSR 5,O.FTYP WITH N=0 BEQ O.REL3 ;REXP NOT TYPED, N NOT TYPED, CLEAR ALL. BR O.REL4 ;REXP TYPED- N NOT TYPED O.RELA: MOV #-1,O.RELTMOV R5,R0 JSR 5,O.CADV MOV R5,O.CNST ;AND STORE IN $C O.H1: O.CNS2: BR O.DCD ; ;MINUS PROCESSING ; O.MIN: TST F.TRAD (R4) BR O.H1 ;CLEAR RELOCATION REGISTERS. O.REL3: JSR 5,O.CLRR ;CLEAR RELOC REG'S BR O.SI2 ;GO BACK TO SCAN O.REL1: C ;DECIMAL RADIX? BEQ 1$ ;NO JSR PC,F.CHAR ;GO STORE CHAR 1$: INCB O.MINS ;SET MINUS FOUND SWITCH ON O.MIN1: BR O.DCD1 MP O.BW,#2 ;CASE D, PRINT @O.CAD IN RELATIVE FORM BNE O.TCL2 ;ERROR IF BYTE OPENED CMP #0,R2 ; CHECK IF R BNE O.REL6 ;.EOT ;END OF TAPE #1 .PAGE ; ;REPRINT LAST OPENED ADDRESS RELATIVELY. ; A. N! WAS TYPED--PRINT N,((O.CAD)-($NR)) IF R MOV @O.CAD,R0 JSR R5,O.LOC ; THEN FIND BEST N CMP R0,#-1 ;WAS A RELOC REG FOUND? BNE O.REL8 ;BR IF YES. ELSE-- ; B. ! WAS TYPED. FIND THE CLOSEST BIAS LESS THAN ; (O.CAD) AND USE ITS "N" -- THEN DO CASE A. ; O.RCMP: MOV #'=,R0 ;FIRS MOV #'=,R0 ;TYPE "=" JSR 5,O.FTYP MOV @O.CAD,R0 ;TYPE ABS. VAL OF CONTENTS BR O.REL9 ;OF OPENED LOC. O.REL8: MOV R0,R4 T TYPE A "=" JSR 5,O.FTYP ;WAS N TYPED IN? TST R2 ;WAS N TYPED IN? BNE O.RCM1 ;BRANCH IF YES MOV O.CAD,R0 JSR 5,O.L4 IS THE RELOCATION REGISTER NUMB; O.COMM: INCB O.CMFD ;SET "COMMA FOUND" SWITCH TO ON TST R2 ;WAS A NUMBER TYPED IN? BEQ ; PUT NEW N INTO R4 O.REL6: MOV @O.CAD,R1 ;OPENED VALUE IS THE MINUEND MOV R4,O.TMP1 ; SAVE N ASL R4 ;GET BIAS FROM $NR O.COM1 ;NO,USE CURRENT BIAS; I.E.,EXIT BIC #177770,R4 ;MAKE SURE THAT N IS LESS THAN 10(8) ASL R4 ;YES, LOCATE RELOC. REGI SUB O.RELT(R4),R1 ;BIAS IS THE SUBTRAHEND MOV #'=,R0 ;TYPE "=" JSR 5,O.FTYP MOV O.TMP1,R0 ; PREPARE INPUTE FOR O.FTYP STER MOV O.RELT(R4),O.BIAS ;PUT BIAS IN O.BIAS O.COM1: BR O.MIN1 ;GO BACK TO DECODER ;R PROCESSING. SEVERAL POSSIBILITIES- ADD #60,R0 ; CONVERT N TO ANSCII JSR 5,O.FTYP ; TYPE N MOV #',,R0 ;PREPARE INPUT FOR O.FTYP JSR 5,O.FTYP ; TYPE COMMA ; A. ;R WAS TYPED. ZERO OUT ALL RELOCATION REGISTERS ; B. ;NR WAS TYPED. ZERO OUT $NR ; C. REXP;NR WAS TYPED. SET $NR TOCMP #0,R2 ; CHECK IF R BNE O.REL7 ; IF R MOV O.XXY,R0 ; THEN PREPARE INPUT FOR O.CADV O.REL7: MOV R1,R0 ;TYPE THE VALU REXP ; D. NR WAS TYPED, WHILE A WORD WAS OPENED- ; COMPUTE (O.CAD)-($NR) AND PRINT IT ; O.REL: TSTB O.SMFD ;TEST IF A SEE (@O.CAD)-($NR) O.REL9: JSR 5,O.CADV BR O.DCD1 .PAGE ; ;C PROCESSING. ; A. REXP;C WAS TYPED- PRINT THE VALUE OF REXP ANMICOLON WAS TYPED BEQ O.REL1 ;NO CASE D TST R2 ;NOTHING OPENED, WAS N TYPED? BEQ O.REL2 ;N NOT TYPED O.REL4: BIC #1777D STORE IN $C ; B. ;C WAS TYPED- SAME AS C., BUT REXP=0 BY DEFAULT ; C. NO SEMICOLON HAS BEEN TYPED-REPLACE R4 WITH THE CONT MOV (SP)+,O.BW ;RESTORE MODE BR O.DCD1 ;EXIT TO SCAN ROUTINE O.RCM1: MOV R4,R0 ;GET N. THIS CODE SIMULATES O.LOC ASL IMAL CONVERSION 1$: BIC #177770,R0 ;CONVERT TO BCD ASL R4 ; MAKE ROOM ASL R4 ; IN ASL R4 ; R4 ADD R0,R4 ;PACK TR0 ;TIMES 2 FOR INDEXING MOV O.CAD,O.XXY SUB O.RELT(R0),O.XXY ;COMPUTE DIFFERENCE ASR R0 ;RESTORE N. BR O.RCM2 ;PRINTHREE BITS IN R4 INC R2 ;R2 HAS NUMERIC FLAG BR O.SCAN ; AND TRY AGAIN O.CLGL: CLR R1 ;CLEAR INDEX O.LGL1: CMPB R0,O.L RESULTS ; ;FILL MEMORY WORDS. LIMITS ARE THE SEARCH LIMITS. ; O.FILL: MOV #2,O.BW ;SET MODE TO "OPEN WORD" O.FIL1: TSTB OGCH(R1) ;DO THE CODES MATCH? BEQ O.LGL2 ;JUMP IF YES INC R1 ; SET INDEX FOR NEXT SEARCH CMP R1,#O.CLGT ;IS THE SEARCH DO.SMFD ;DONT REACT UNLESS ";" WAS TYPED BEQ O.ERR ;IF NOT TYPED, ERROR. MOV O.CNST, R0 ;ACTUAL VALUE MOV O.LOW,R4 ;USE SEANE? BHIS O.ERR ; OOPS! BR O.LGL1 ;RE-LOOP O.LGL2: TSTB O.MINS ;IF MINUS WAS NOT TYPED BEQ O.LGL4 ;DO NOT NEGATE K RCH LIMITS FOR MOV O.HI,R3 ; FILL LIMITS. JSR 5,O.ST BR O.DCD ;EXIT ; ;INITIALIZE MEMORY BYTES. ; O.INIT: MOV #1,O.B NEG R4 ;OTHERWISE, TAKE 2'S COMPLEMENT. O.LGL4: TSTB O.CMFD ;IF A COMMA NOT TYPED, BEQ O.LGL3 ;SKIP NEXT INSTRUCTION. W BR O.FIL1 ;LET O.FILL DO THE WORK .PAGE ; COMMAND DECODER - ODT11X ; ALL REGISTERS MAY BE USED (R0-R5), O.ERR: MADD O.BIAS,R4 ;OTHERWISE, ADD RELOC. BIAS TO (R4) O.LGL3: CLRB O.MINS ;REINITIALIZE MINUS-TYPED SWITCH FOR NXT SCAN ASL R1 OV #'?,R0 ; ? TO BE TYPED JSR 5,O.FTYP ; OUTPUT ? O.DCD: CLR O.BW ;CLOSE ALL MOV F.RAD,F.TRAD ;RESTORE DEFAULT I/O RADIX;MULTIPLY BY TWO JMP @O.LGDR(R1) ;GO TO PROPER ROUTINE O.LGDR: O.SEMI ; ; SEMICOLON O.WRD ; / OPEN WORD O.BYT ; JSR 5,O.CRLS ;TYPE * O.DCD3: CLRB O.SMFD ;SEMICOLON FOUND FLAG CLRB O.CMFD ;COMMA FOUND FLAG CLRB O.MINS ;MI \ OPEN BYTE -BACK SLASH O.CRET ; CARRIAGE RETURN CLOSE O.REGT ; $ REGISTER OPS O.GO ; G GO TO ADDRESS K O.OPNUS SIGN FOUND FLAG CLR F.CFLG ;# FOUND FLAG CLR F.NC ;CHAR COUNT FOR INPUT MOV #F.CHR,F.CLOC ;RESET CHARACTER BUFFER O1 ; MODIFY, CLOSE, OPEN NEXT O.ORPC ; "BACKARROW" OPEN RELATED, INDEX - PC (BACK ARROW) O.OLD ; < RETURN TO OLD S.DCD2: CLR R3 ;R3 IS A SAVE REGISTER FOR R2 CLR R5 ;R5 IS A SAVE REGISTER FOR R4 O.DCD1: CLR R4 ; R4 CONTAINS THE CONVERTEEQUENCE AND OPEN O.BACK ; ^ OPEN PREVIOUS (UP ARROW) O.COMM ; , COMMA. SEPERATES REL.REG. FROM INCREMENT O.OFST ; O OOC ;ELSE, FIND BEST N CMP R0,#-1 ;IF REL.REG FOUND, BNE O.RCM2 ; BR; ELSE-- MOV O.CAD,R0 ;PRINT ADDR IN ABS. JSR 5,O.CD OCTAL CLR R2 ; R2 IS THE NUMBER FOUND FLAG O.SCAN: JSR 5,O.GET ;GET A CHAR, RETURN IN R0 O.SCN1: CMP #'0,R0 ;COMPARE WIADV BR O.DCD1 O.RCM2: ADD #060,R0 ;CONVERT N TO ANSCII JSR 5,O.FTYP ;TYPE N MOV #',,R0 ;TYPE COMMA JSR 5,O.FTYP MOVTH ASCII 0 BHI O.CLGL ;CHECK LEGALITY IF NON-NUMERIC CMP #'7,R0 ;COMPARE WITH ASCII 7 BLO O.CLGL ;CHECK LEGALITY IF NOT O.BW,-(SP) ;SAVE O.BW MOV #2,O.BW ;ARTIFCIALLY SET MODE FOR WORDS MOV O.XXY,R0 ;TYPE RELATIVE AMOUNT O.RCM3: JSR 5,O.CADV OCTAL TST O.BW ;WORD OPEN? BEQ 1$ ;NO TST F.TRAD ;OCTAL RADIX? BEQ 1$ ;YES JSR PC,F.CHR1 ;STORE CHARACTER FOR DECFFSET O.WSCH ; W SEARCH WORD O.EFF ; E SEARCH EFFECTIVE ADDRESS O.BKPT ; B BREAKPOINTS O.PROC ; P PROCEED O.ORB O.SMFD BNE O.WB3 BR O.WRD1 ;NO NUMBER - REOPEN PREVIOUS LOCATION O.WB4: MOV R4,O.DOT ;PUT VALUE IN DOT MOV R4,O.CAD ; AB ; @ OPEN RELATED, ABSOLUTE O.ORRB ; > OPEN RELATED, REL. BRANCH O.SNGL ; S SINGLE INSTRUCTION MODE O.REL ; R RE ALSO IN CAD O.WRD1: CMP #1,O.BW ;CHECK BYTE MODE BEQ O.WRD2 ;JUMP IF BYTE MOV O.CAD,R4 ASR R4 ;MOVE ONE BIT TO CARRLOCATION PROCESSING O.CNS ; C CONSTANT REGISTER PROCESSING O.MIN ; - MINUS, NEGATES NUMBER TYPED IN O.FILL ; F FILL MEY BCS O.BYT1 ;JUMP IF ODD ADDRESS MOV @O.CAD,R0 ;GET CONTENTS OF WORD BR O.WRD3 O.WRD2: MOVB @O.CAD,R0 ;GET CONTENTS OF MORY WORDS FROM THE CONSTANT REGISTER O.INIT ; I INITIALIZE MEMORY BYTES FROM THE CONSTANT REGISTER O.RCMP ; ! PRINT CURREBYTE O.WRD3: JSR 5,O.CDV1 ;GO GET AND TYPE OUT @CAD IN CURRENT RADIX CMP #1,O.BW ;CHECK IF BYTE MODE. BNE 1$ ;IF NOT WE'RNT OPENED ADDRESS IN REL. FORM O.MOD ; X RETYPE OPENED CONTENTS, MOD40 O.ALF ; A ACCEPT ASCII INPUT O.CTLC ; ^C EXIT TOE DONE. ELSE: MOVB #'=,R0 ;TYP "=" AND THEN THE ASCII BYTE JSR 5,O.FTYP MOVB @O.CAD,R0 JSR 5,O.FTYP MOVB #' ,R0 JSR MONITOR F.BKPT ; V THREADED CODE BREAK POINT F.CONV ; # I/O RADIX CONVERSION F.CHR2 ; . (FOR REAL AND DECIMAL INTEGER 5,O.FTYP 1$: JMP O.DCD3 ;GO BACK TO DECODER ; PROCESS CARRIAGE RETURN O.CRET: JSR PC,O.CLSE ;CLOSE LOCATION O.DCDA: JMINPUT F.CHR2 ; + F.CHR2 ; 8 F.CHR2 ; 9 F.CHR3 ; D DOUBLE F.GOTO ; T, GO TO THREADED CODE LOCATION O.LGL = .-O.LGP O.DCD ;RETURN TO DECODER O.ERR3: JMP O.ERR ; INTERMEDIATE HELP .PAGE ; PROCESS , OPEN NEXT WORD O.OLD: IDR ;LGL MUST EQUAL 2X CHLGT ALWAYS .PAGE ; SEMI-COLON PROCESSOR O.SEMI: MOV R2,R3 ;A SEMI-COLON HAS BEEN RECEIVED MOV R4,NCB O.SEQ ;SET FLAG TO LATER RESTORE CAD O.OP1: TST O.BW ; RECEIVED BEQ O.ERR3 ;ERROR IF NOTHING IS OPEN JSR PC,O.CLSR5 ;NUMERIC FLAG TO R3, CONTENTS TO R5 INCB O.SMFD ;SET SEMICOLON FOUND FLAG CLRB O.CMFD ;RESET COMMA FOUND FLAG BR O.DCD1E ;CLOSE PRESENT CELL TST O.SEQ ;SHOULD CAD BE RESTORED? BEQ O.OP5 ;BRANCH IF NOT MOV O.DOT,O.CAD ;RESTORE PREVIOUS SEQU ;GO BACK FOR MORE ; PROCESS / AND \ - OPEN WORD OR BYTE ;INPUT - IF R2 IS NON-ZERO A NEW REXP HAS BEEN TYPED IN ;INPUT ENCE CLRB O.SEQ ;RESET FLAG; NO LONGER NEEDED O.OP5: JSR PC,F.CADM ;GENERATE NEW ADDRESS O.OP2: MOV O.CAD,O.DOT ;INITIALIZE- -ADDRESS OF WORD TO BE OPENED IS IN R4 O.WRD: MOV #2,O.BW ;OPEN WORD BR O.WB1 O.BYT1: ROL R4 ;GET THE ADDRESS BACK O.BY DOT O.OP2A: JSR 5,O.CRLF ; MOV O.BW,-(SP) ;SAVE BW MOV #2,O.BW ;SET TO TYPE FULL WORD ADDRESS MOV O.CAD,R0 ;NUMT: MOV #1,O.BW ;OPEN BYTE CLR F.TRAD ;BYTE IS ALWAYS OCTAL O.WB1: TST R2 ;GET VALUE IF R2 IS NON-ZERO BNE O.WB4 ;BRANCHBER TO TYPE JSR 5,O.RORA ; CHECK FORMAT MOV @SP,O.BW ;RESTORE BW MOV #27534,R0 ;PUT "/\" IN R0 CMP #1,(SP)+ ;IS IT BYTE IF NUMBER INPUT TSTB O.CMFD ;TEST FOR ","AND";" BEQ O.WB2 O.WB3: JMP O.ERR ;ERROR IF PRESENT WITHOUT NUMBER. O.WB2: TSTMODE? BEQ O.OP4 ;JUMP IF YES SWAB R0 ;TYPE A / O.OP4: JSR 5,O.FTYP ;TYPE THE LOW BYTE OF R0 BR O.WRD1 ;GO PROCESS IT JMP O.ERR ;INTERMEDITE HELP .PAGE ; V HANDLER - SETS AND REMOVES THREADED CODE BRK PTS ; F.BKPT: MOV #F.THRD,R0 ;TH ;TYPE ONE BLANK JSR 5,O.FTYP ; AS A SEPARATOR TST R3 ;WAS SEMI-COLON TYPED? BEQ O.ERR1 ;NO, CALL IT AN ERROR O.OF2: SREADED CODE PROTOTYPE ASL R4 ;BKPT # * 2 TST R3 BEQ F.REMB ;IF R3=0, REMOVE BRK PT UB O.CAD,R5 ;COMPUTE DEC R5 DEC R5 ; 16 BIT OFFSET MOV R5,R0 JSR 5,O.CADV ;NUMBER IN R0 - WORD MODE MOV R5,R0 AS ASR R5 ;LOW BIT TO CARRY BCS O.ERR1 ;ODD ADDRESS IS BAD ASL R5 ;RESTORE AR R0 ;DIVIDE BY TWO BCS O.OF1 ;ERROR IF ODD CMP #-200,R0 ;COMPARE WITH -200 BGT O.OF1 ;DO NOT TYPE IF OUT OF RANGE CM.PAGE ; PROCESS ^, OPEN PREVIOUS WORD O.BACK: TST O.BW ; ^ RECEIVED BEQ O.ERR4 ;ERROR IF NOTHING OPEN JSR PC,O.CLSE DD #F.ADR1,R4 TST R2 ;SPECIFIED BRK PT #? BNE F.SET1 ;YES F.SET: CMP R0,@R4 ;IS THIS CELL JSR PC,F.CADN ;GENERATE NEW ADDRESS BR O.OP2 ;GO DO THE REST ; B HANDLER - SET AND REMOVE BREAKPOINTS O.BKPT: MOV #O.T FREE BEQ F.SET1 ;YES CMP R4,#O.BKP+F.ADR1 BHIS O.ERR1 ;AT END, NONE AVAILABLE TST RTC,R0 ASL R4 ;MULTIPLY NUMBER BY TWO TST R3 BEQ O.REMB ;IF R3 IS ZERO GO REMOVE BREAKPOINT ASR R5 ;GET ONE BIT TO CA(R4)+ ;NEXT BR F.SET F.SET1: CMP R4,#O.BKP+F.ADR1 ;WITHIN BOUNDS? BHI O.ERR1 ;NO MOV R5,RRY BCS O.ERR4 ;BADNESS IF ODD ADDRESS ASL R5 ;RESTORE ONE BIT ADD #O.ADR1,R4 TST R2 BNE O.SET1 ;JUMP IF SPECIFIC C@R4 ;SET BREAK POINT BR O.DCDC ;RETURN ; F.REMB: TST R2 ;BRK PT SPECIFIED BEQ F.ELL O.SET: CMP R0,@R4 ;IS THIS CELL FREE? BEQ O.SET1 ;JUMP IF YES CMP R4,#O.BKP+O.ADR1 ;ARE WE AT THE END OF OUR ROPE BALL ;NO, REMOVE ALL CMP R4,#O.BKP ;NUMBER IN RANGE? BHI O.ERR1 ;NO MOV R0,F.ADR1(R4) ;CHIS O.ERR1 ;YES, THERE IS NOTHING FREE TST (R4)+ ;INCREMENT BY TWO BR O.SET O.SET1: CMP R4,#O.BKP+O.ADR1 BHI O.ERR1 ;ELEAR BREAK POINT CLR F.CT (R4) ;CLEAR COUNT BR O.DCDC ; F.ALL: JSR PC,F.RALL ;RRROR IF TOO LARGE MOV R5,@R4 ;SET BREAKPOINT BR O.DCDA ;RETURN O.REMB: TST R2 BEQ O.RALL ;GO REMOVE ALL CMP R4,#O.BKEMOVE ALL THREADED CODE BREAK POINTS O.DCDC: JMP O.DCD ; ; ; SUBROUTINE TO REMOVE ALL BREAK POINTS ; CALLED BY P BHI O.ERR1 ;JUMP IF NUMBER TOO LARGE MOV R0,O.ADR1(R4) ;CLEAR BREAKPOINT CLR O.CT(R4) ;CLEAR COUNT ALSO O.DCDB: BR O.D;V AND AT START UP ; F.RALL: CLR R4 MOV #F.THRD,R0 1$: CMP R4,#O.BKP+2 ;DONE? BHI 2$ ;YES CDA O.RALL: CLR R4 MOV #O.TRTC,R0 O.RM1: CMP R4,#O.BKP+2 ;ALL DONE? BHI O.DCDA ;JUMP IF YES MOV R0,O.ADR1(R4) ;RESET BK MOV R0,F.ADR1(R4) MOV #F.BRK,F.UIN(R4) CLR F.CT(R4) TST (R4)+ BR 1$ 2$: RTS PC .PPT MOV #TRT,O.UIN(R4) ;RESET CONTENTS OF TABLE CLR O.CT(R4) ;CLEAR COUNT TST (R4)+ ;INCREMENT BY TWO BR O.RM1 O.ERR4: AGE ; PROCESS O, COMPUTE OFFSET O.OFST: CMP #2,O.BW ;CHECK WORD MODE BNE O.ERR1 ;ERROR IF NOT CORRECT MODE MOV #' ,R0 DONE? BHI O.DCDC ; YES MOV @R2,R0 ; GET OBJECT TST R1 ;NO BNE O.EFF1 ;BRANCH IF EFFECTIVE SEARCH MOV R0,-(SP) METYPE TST R1 ; WAS THIS A ;T? BNE F.GO1 ;YES O.TBIT: CLRB O.T ;CLEAR BIS #O.TBT,O.UST ; BOTH T-BIT FLAGS TSTB O.S OV R5,R3 ;EXCLUSIVE OR BIC R5,R0 ; IS DONE BIC (SP)+,R3 ; IN A VERY BIS R0,R3 ; FANCY MANNER HERE BIC R4,R3 ;AN ;SEE IF WE NEED A T BIT BNE O.GO2 ;IF NOT GO NOW BIC #O.TBT,O.UST ;SET TH T BIT O.GO1: JSR 5,O.RSB ;RESTORE BREAKPOINTS D RESULT WITH MASK O.WDS3: BNE O.WDS4 ;RE-LOOP IF NO MATCH MOV R4,-(SP) ;REGISTERS R2,R4, AND R5 ARE SAFE MOV R1,-(SP) ;SA O.GO2: JSR 0,O.RSR ;RESTORE REGISTERS MOV O.UST,-(SP) ; AND STATUS MOV O.UPC,-(SP) ; AND PC NOP ; CHANGE TO HALTVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) JSR 5,O.CRLF MOV R2,R0 ;GET READY TO TYPE JSR 5,O.RORA ; CHECK FORMAT MOV FOR DEBUGGING MOV O.UST,-(SP) ; MOV IN STATUS FIRST W/O T BIT BIC #O.TBT,(SP) ; SO INTERRUPTS CAN HAPPEN BEFORE CLR F.FL #'/,R0 ;SLASH TO R0 JSR 5,O.FTYP ;TYPE IT MOV @R2,R0 ;GET CONTENTS JSR 5,O.CDV2 ; TYPE CONTENT IN CURRENT RADIX MOV (AG ;BREAK POINT TYPE TO NORMAL JSR PC,O.WST ; RTT TURNS ON THE T BIT. O.RTIT: RTT ; CHANGED TO RTI WHEN RUNNING ON /05 ORSP)+,R3 MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R4 ; RESTORE R4 .PAGE ;HAS CTRL/U BEEN STRUCK? JSR /20 ; PROCESS T - THREADED CODE GO F.GOTO: MOV #1,R1 ;TELL O.GO THIS IS A ;T BR O.GOA ;GO DO SOME COMMON PART OF THP #177,R0 ;COMPARE WITH +177 BLT O.OF1 ;DO NOT TYPE IF OUT OF RANGE DEC O.BW ;SET TEMPORARY BYTE MODE JSR 5,O.CADV ;NUM R5,O.CU ;CHECK FOR ^U O.WDS4: TST (R2)+ ;INCREMENT TO NEXT CELL AND BR O.WDS2 ; RETURN O.EFF1: CMP R0,R5 ; IS (X)=K?BER IN R0 - BYTE MODE INC O.BW ;RESTORE WORD MODE O.OF1: JMP O.DCD3 ;ALL DONE O.ERR1: JMP O.ERR ;INTERMEDIATE HELP .E BEQ O.WDS3 ;TYPE IF EQUAL MOV R0,R3 ;(X) TO R3 ADD R2,R3 ;(X)+X INC R3 INC R3 ;(X)+X+2 CMP R3,R5 ;IS (X)+X+2=KOT ;END OF TAPE #2 .PAGE ; ; SEARCHES - $MSK HAS THE MASK ; $MSK+2 HAS THE FWA ; $MSK+4 HAS THE LWA O.EFF: TSTB O.S? BEQ O.WDS3 ;BRANCH IF EQUAL BIC #177400,R0 ;WIPE OUT EXTRANEOUS BITS MOVB R0,R0 CCC ASL R0 ;MULTIPLY BY TWO INC MFD ;SEMI-COLON FOUND? BGT 1$ ;YES ASSUME EFFECTIVE SEARCH TST O.BW ;WORD OPEN? BEQ O.ERR1 ;NO CMP F.TRAD,#2 ;DECIMAR0 INC R0 ADD R2,R0 ;ADD PC CMP R0,R5 ;IS THE RESULT A PROPER REL. BRANCH? BR O.WDS3 .PAGE ; PROCESS G - GO O.GO:L RADIX? BLT O.ERR1 ;LETTER E ALLOWED ONLY WITH FLOATING POINT JMP F.CHR2 ;GO STORE IT 1$: INC R1 ;SET EFFECTIVE SEARCH CLR R1 ;NORMAL ;G O.GOA: TSTB O.SMFD ;WAS ";" TYPED? BEQ O.ERR1 ;BR IF NOT TYPED TST R3 ;WAS K; TYPED? BEQ O.ERR1 ; TY BR O.WDS O.WSCH: CLR R1 ;SET WORD SEARCH O.WDS: TST R3 ;CHECK FOR OBJECT FOUND BEQ O.ERR1 ;ERROR IF NO OBJECT MOV #2,PE ? IF NOT MOVB #O.BKP+3,O.P ;CLEAR PROCEED ASR R5 ;CHECK LOW ORDER BIT BCS O.ERR1 ;ERROR IF ODD NUMBER ASL R5O.BW ;SET WORD MODE MOV O.MSK+2,R2 ;SET ORIGIN MOV O.MSK,R4 ;SET MASK COM R4 O.WDS2: CMP R2,O.MSK+4 ; IS THE SEARCH ALL ;RESTORE WORD MOV R5,O.UPC ;SET UP NEW PC MOVB #O.STM,-(SP) ;SET HIGH PRIORITY JSR PC,O.WST JSR 5,O.RSTT ;RESTORE TEL TST R3 ;WAS COUNT SPECIFIED? BEQ O.PR1 ;NO MOV R5,O.CT(R0) ;YES, PUT AWAY COUNT O.PR1: MOVB #O.STM,-(SP) ;FORCE HIGH PTATUS AWAY WHERE IT BELONGS JSR PC,O.WST MOV O.UPC,R5 ;GET PC, IT POINTS TO THE TRT TSTB O.S ;SEE IF IT WAS SINGLE INSTRURIORITY JSR PC,O.WST JSR 5,O.RSTT ;RESTORE TTY O.C1: CMPB O.P,#O.BKP ;SEE IF A REAL ONE OR A FAKE BGT O.TBIT ;BRANCH IF CTION FUN BMI O.B4 ;IF SO HANDLE THERE TST -(R5) MOV R5,O.UPC MOV #O.BKP,R4 ;GET A COUNTER O.B1: CMP R5,O.ADR1(R4) ;COFAKE TSTB O.S ;SEE IF SINGLE INSTRUCTION MODE BNE O.TBIT ;IF SO EXIT NOW MOVB #O.STM,-(SP) ;SET HIGH PRIORITY JSR PC,OMPARE WITH LIST BEQ O.B2 ;JUMP IF FOUND DEC R4 DEC R4 BGE O.B1 ;RE-LOOP UNTIL FOUND JSR 5,O.SVTT ;SAVE TELETYPE STAT.WST INCB O.T ;SET T-BIT FLAG BIS #O.TBT,O.UST ;SET T-BIT BR O.GO2 O.ERR5: JMP O.ERR ; ;PROCEED FROM TUS JSR 5,O.CRLF MOV #O.BD,R4 ;ERROR, NOTHING FOUND MOV #O.BD+1,R3 JSR 5,O.TYPE ;OUTPUT "BE" FOR BAD ENTRY MOV R5,R0 HREADED CODE BREAK ; F.PR1: TST R3 ;WAS COUNT SPECIFIED? BEQ 1$ ;NO MOV R5,F.CT(R0) ;SAVE COUNT 1ADD #2,O.UPC ;POP OVER THE ADJUSTMENT ABOVE BR O.B3 ; OR CONTINUE .PAGE O.B4: MOVB #O.BKP+2,R4 ;SET BREAK POINT HIGH + 1 $: JSR R5,O.RSTT ;RESTOR TTY F.C1: CLRB O.T ;CLEAR BIC #O.TBT,O.UST ;BOTH T BIT FLAGS MOV @O.UPC,O.UPC ;GET NEXT THREAMOV R5,O.ADR1(R4) ;STORE NEXT PC VALUE FOR TYPE OUT BR O.B2 O.B2: MOVB R4,O.P ;ALLOW PROCEED DEC O.CT(R4) BGT O.C1 ;JUMPD JSR R5,O.RSB ;RESTORE BREAK POINTS CLR F.FLAG ;THREADED CODE BRK PT FLAG JSR R0,O.RSR ;RESTORE REGISTERS MOV O.UST,-( IF REPEAT MOV #1,O.CT(R4) ;RESET COUNT TO 1 JSR 5,O.SVTT ;SAVE TELETYPE STATUS, R4 IS SAFE MOV #'B,R0 JSR 5,O.FTYP ;TYPSP) JSR PC,O.WST ;RESTORE STATUS JMP @O.UPC ;RETURN TO USER PROGRAM .PAGE ; BREAKPOINT HANDLER O.BRK: MOV (SP)+,O.UPC ;PE "B" MOVB O.P,R0 ;CONVERT BREAKPOINT NUMBER TO ASCII ADD #140,R0 ASR R0 JSR 5,O.FTYP MOV #';,R0 JSR 5,O.FTYP ; TYPRIORITY IS 7 UPON ENTRY MOV (SP)+,O.UST ;SAVE STATUS AND PC MOVB #O.BKP+3,O.P ;TELL ;P THAT WE CAN CONTINUE O.BK1: JSR 0,O.E MOV #2,O.BW ; SET WORD MODE MOVB O.P,R4 MOV O.ADR1(R4),R0 ;GET ADDRESS OF BREAK O.B3: JSR 5,O.RORA ; CHECK FORMAT JE GO F.GO1: TST (R5)+ ;INCREMENT ADDRESS BY 2 SO R4 WILL OK MOV R5,O.UR0+10 ;FIX USER R4 JMP F.C1 ;GO FINISH IN THREADSVR ;SAVE VARIOUS REGISTERS TSTB O.T ;CHECK FOR T-BIT SET BNE O.TBIT ;JUMP IF SET JSR 5,O.REM ;REMOVE BREAKPOINTS TSED CODE ;P SECTION .PAGE ; PROCESS P - PROCEED ; ONLY ALLOWED AFTER A BREAKPOINT O.PROC: TSTB O.SMFD ;WAS ";" TYPED? TB O.PRI ;CHECK IF PRIORITY BPL O.BK2 ; IS AS SAME AS USER PGM MOVB O.UST,R5 ;PICK UP USER UST IF SO BR O.BK3 O.BK2: MOBEQ O.ERR5 ;BR IF NOT TYPED MOVB O.P,R0 TSTB R0 ;CHECK LEGALITY OF PROCEED BLT O.ERR5 ;NOT LEGAL TST R2 ;CHECK FOR ILVB O.PRI,R5 ;OTHERWISE PICK UP ACTUAL PRIORITY CCC ;CLEAR CARRY RORB R5 ;SHIFT LOW ORDER BITS RORB R5 ; INTO RORB RLEGAL COUNT BNE O.ERR5 ;JUMP IF ILLEGAL TST F.FLAG ;WAS THIS A THREADED CODE BRK PT? BGT F.PR1 ;YES, GO PROCEED FROM IT5 ; HIGH ORDER RORB R5 ; POSITION O.BK3: BIC #O.TBT,R5 ;CLEAR POSSIBLE T BIT (S/I MODE) MOVB R5,-(SP) ;PUT THE SER MOV ST,O.UST ;STATUS MOVB #O.BKP+3,O.P ;TELL ;P WE CAN CONTINUE JSR R0,O.SVR ;SAVE REGISTER ;WORD OPEN? BEQ F.ERR1 ;NO, CAN'T ACCEPT TST F.TRAD ;OCTAL OR DECIMAL BEQ F.ERR1 ;OCTAL CAN'T ACCEPT F.CHR1: MOVB R0S JSR R5,O.REM ;REMOVE BREAK POINTS MOV O.UPC,R5 ;GET THREADED CODE POINTER TST -(R5) ;PO,@F.CLOC ;STORE CHARACTER INC F.CLOC ;INCREMENT POINTER INC F.NC ;INCREMENT CHARACTER COUNTER INC R2 ;NUMBER TYPED RTINT TO BREAK ADDRESS MOV R5,O.UPC ;FIX RETURN MOV #O.BKP,R4 ;COUNT 1$: CMP R5,F.ADR1(R4) ;LOOK FOR ADDR S PC ;NEXT CHARACTER F.CHR3: CMP F.TRAD,#3 ;D IS ALLOWED ONLY IF DOUBLE BNE F.ERR ;D NOT ALLOWED F.CHR2: JSR PC,F.CHAR BEQ 2$ ;FOUND DEC R4 DEC R4 BGE 1$ ;TRY NEXT ONE ; ; FALL THRU MEANS A JMP O.SCAN ; CONVERTS INPUT DECIMAL CHARACTER STRING TO OCTAL IN THE ; CURRENT RADIX ; ;SETUP FOR CONVERSION CABAD BREAK POINT MOV #-1,O.P ;CAN'T CONTINUE JSR R5,O.SVTT ;SAVE TTY STATUS JSR R5,O.CRLF LL CONVRT: MOV #F.CHR,-(SP) ;STRING LOCATION MOV F.NC,-(SP) ;CHAR COUNT, FIELD WIDTH CMP F.TRAD,#1 ;INTEGER? BLE 1$ ;YES MOV #O.BD,R4 MOV #O.BD+1,R3 JSR R5,O.TYPE ;OUTPUT "BE" FOR BAD ENTRY MOV #';,R0 JSR R5, CLR -(SP) CLR -(SP) JSR PC,RCI$ ;CONVERT READ OR DOUBLE BNE 7$ ;IF NOT ZERO THERE IS AN ERROR MOV #2,R3 ;COUNT CO.FTYP ;TYPE ";" MOV #'V,R0 JSR R5,O.FTYP ;TYPE "V" MOV R5,R0 BR 3$ 2$: MOVB R4,O.PMP F.TRAD,#3 ;DOUBLE? BNE 3$ ;NO ADD #2,R3 3$: MOV #4,R4 ;WORD COUNT SUB R3,R4 ;EXCESS STACK COUNT 4$: MOV O.CAD,R0 ; ;ALLOW ;P DEC F.CT(R4) BLE 4$ JMP F.C1 ;PROCEED IF COUNT > 0 4$: MOV #1,F.CT(R4) ;RESET COUNT JSGET ADDRESS 9$: MOV (SP)+,(R0)+ ;STORE RESULT DEC R3 ;DEC COUNT BGT 9$ ;AGAIN 5$: DEC R4 ;CLEAR STACK BLT 6$ ;DONE R R5,O.SVTT ;SAVE TTY STATUS MOV #'V,R0 JSR R5,O.FTYP ;TYPE "V" MOVB O.P,R0 ;CONVERT BREAKPOI TST (SP)+ ;INCREMENT THE STACK BR 5$ ;NEXT 6$: RTS PC ;RETURN ; INTEGER INPUT CONVERSION 1$: JSR PC,ICI$ ;FORTRAN NT TO ASCII ADD #140,R0 ASR R0 JSR R5,O.FTYP MOV #';,R0 JSR R5,O.FTYP MOV INTEGER CONVERSION ROUTINE BCS 8$ ;ERROR CLR R4 ;EXCESS STACK COUNT MOV #1,R3 ;WORD COUNT BR 4$ ;GO FINISH 7$: AD#2,O.BW ;SET WORD MODE MOVB O.P,R4 MOV F.ADR1(R4),R0 ;BREAK ADDRESS MOV #1,F.FLAG ;THREADED COD #6,SP ;ADJUST STACK 8$: TST (SP)+ ;AGAIN F.ERR1: MOV #O.ERR,(SP) ;FAKE THE RETURN RTS PC ;RETURN TO ERROR ROUTINE .PAGDE BRK PT FLAG 3$: JSR R5,O.RORA ;CHECK FORMAT JMP O.DCD ;GO TO DECODER .PAGE ; TESTS AND PUTS INPUT CHAE ; RADIX CONVERSION FLAG SET (# HANDLER) ; ; SETS THE TYPE OUT RADIX ; F.RAD INDICATES THE DEFAULT RADIX ; 0 - OCTAL, INIMP O.DCD ;GO TO DECODER ; .PAGE ; THREADED CODE BREAK POINT HANDLER ; F.BRK: MOV R4,O.UPC ;THREADED CODE POINTRACTERS INTO AN ARRAY ; FOR LATER CONVERSION FROM ASCII ; DECIMAL TO OCTAL ; SOME VALIDITY TESTS ARE MADE F.CHAR: TST O.BWRSR: TST (SP)+ ;POP THE EXTRA CELL MOV (SP)+,O.XXX ;GET R0 FROM STACK MOV (SP)+,R1 ;RESTORE MOV (SP)+,R2 ; REGISTERS MOG SPACE ; WORD IS IN R0 O.CDV1: TST F.TRAD ;TEST RADIX BEQ O.CADV JMP F.CADV O.CADV: MOV #6,R3 ;# OF DIGITS MOV #-2V (SP)+,R3 ; 1 MOV (SP)+,R4 ; THRU MOV (SP)+,R5 ; 5 MOV O.USP,SP ;RESTORE USER STACK MOV O.XXX,-(SP) ;PUT R0 ON USE,R4 ;# OF BITS FIRST-3 CMP #1,O.BW ;SEE IF WORD MODE BNE O.SPC ;BRANCH IF SO SUB #3,R3 ;ONLY DO 3 DIGITS INC R4 ;DOTIAL DEFAULT RADIX ; 1 - INTEGER ; 2 - REAL, 2 WORDS ; 3 - DOUBLE, 4 WORDS ; ; F.TRAD IS THE TEMPORARY OR CURRENT RADIX.R STACK RTS R0 ; RESTORE BREAKPOINTS 0-7 O.RSB: MOV #O.BKP,R4 ;RESTORE ALL BREAKPOINTS O.RS1: MOV @O.ADR1(R4),O.UIN(R4) IT IS SET TO F.RAD ; WHEN A WORD IS OPENED. A SINGLE # WILL MODIFY ; F.TRAD. ; TWO # WILL MODIFY F.RAD TO CHANGE THE D ;SAVE CONTENTS MOV O.TRTC,@O.ADR1(R4) ;REPLACE WITH TRAP MOV @F.ADR1(R4),F.UIN(R4) ;THREADED CODE BREAK POINT MOV #F.BRK,EFAULT RADIX. ; F.CONV: INC F.CFLG ;CONVERSION FLAG JSR R5,O.GET ;GET NEXT CHARACTER CLR R1 ;COUNTER FOR SEARCH 1$: C@F.ADR1(R4) ;BRK PT HANDLER DEC R4 DEC R4 BGE O.RS1 ;RE-LOOP UNTIL DONE RTS R5 ; THEN QUIT .PAGE ; SAVE TELETYPE SMPB R0,F.CTBL(R1) ;CHARACTER MATCH? BEQ F.CV1 ;YES INC R1 CMP R1,#4 ;DONE? BLE 1$ ;NO, TRY NEXT ONE F.ERR: JMP O.ERRTATUS O.SVTT: MOVB O.RCSR,O.CSR1 ;SAVE R C/SR MOVB O.TCSR,O.CSR2 ;SAVE T C/SR CLRB O.RCSR ;CLEAR ENABLE AND MAINTENANCE ;YEP! ERROR F.CV1: CMP R1,#4 ;WAS CHAR A # BGE F.CONV ;YES, WE NOW HAVE 2 MOV R1,F.TRAD ;SET TEMP RADIX CMP F.CFLG,# CLRB O.TCSR ; BITS IN BOTH C/SR O.SVT1: TSTB O.TCSR ;LOOP UNTIL READY BIT COMES ON BPL O.SVT1 ;BR IF BIT NOT ON RTS R1 ;TEMP CONVERSION? BEQ 4$ ;YES MOV R1,F.RAD ;MAKE IT PERMANENT 3$: JMP O.DCD ;RETURN TO COMMAND DECODER 4$: TST O.BW ;5 ; RESTORE TELETYPE STATUS O.RSTT: JSR 5,O.CRLF TSTB O.TCSR ;WAIT READY BPL .-4 ; ON PRINTER BIT #4000,O.RCSR ;CHEMUST HAVE A WORD OPEN FOR SINGLE # BEQ 3$ ;NOPE! DO NOTHING MOV #' ,R0 ;TYPE A SPACE JSR R5,O.FTYP JMP O.WRD1 ;RE-OPECK BUSY FLAG BEQ O.RSE1 ;SKIP READY LOOP IF NOT BUSY TSTB O.RCSR ;WAIT READY BPL .-4 ; ON READER O.RSE1: MOVB O.CSRN THE WORD ; ; # CHARACTER TABLE ; F.CTBL: .BYTE 'O .BYTE 'I .BYTE 'F .BYTE 'D .BYTE '# .EVEN .PAGE ; SAVE REGIS1,O.RCSR ;RESTORE MOVB O.CSR2,O.TCSR ; THE STATUS REGISTERS RTS R5 ; REMOVE BREAKPOINTS 0-7 ; IN THE OPPOSITE ORDER OTERS R0-R6 ; INTERNAL STACK O.SVR: MOV (SP)+,O.XXX ;PICK REGISTER FROM STACK AND SAVE MOV SP,O.USP ;SAVE USER STACK ADDRF SETTING O.REM: TSTB O.S ;SEE IF SINGLE INSTRUCTION IS GOING BNE O.R2 ;EXIT IF SO CLR R4 ;REMOVE ALL BREAKPOINTS O.RESS MOV #O.USP,SP ;SET TO INTERNAL STACK MOV R5,-(SP) ;SAVE MOV R4,-(SP) ; REGISTERS MOV R3,-(SP) ;1 MOV R2,-(SP) ; TH1: MOV O.UIN(R4),@O.ADR1(R4) ;CLEAR BREAKPOINT MOV F.UIN(R4),@F.ADR1(R4) ;REMOVE THREADED CODE BRK PT INC R4 INC R4 CMP RU MOV R1,-(SP) ; 5 MOV O.XXX,-(SP) ;PUT SAVED REGISTER ON STACK TST -(SP) RTS R0 ; RESTORE REGISTERS R0-R6 O.R4,#O.BKP BLE O.R1 ;RE-LOOP UNTIL DONE O.R2: RTS R5 ;THEN QUIT .PAGE ; TYPE OUT CONTENTS OF WORD OR BYTE WITH ONE TRAILIN.CADV: MOV O.CAD,R4 ;GET ADDRESS TO BE OPENED F.CDV1: MOV #F.CHR,-(SP) ;CHARACTER BUFFER CMP F.TRAD,#1 ;INTEGER? BEQ 5$ ;Y7600,R0 ;STRIP OFF PARITY FROM CHARACTER CMPB #3,R0 ;IS IT ^C? BEQ O.GET1 ;IF SO, DO NOT ECHO TSTB O.SCRN ;SHOULD WE ECHO ES MOV #14.,-(SP) ;FIELD WIDTH MOV #7,-(SP) ;DECIMAL FACTOR CLR -(SP) ;P FACTOR SUB #10,SP ;ADJ STACK FOR 4 WORDS MO? BNE O.GET2 ;BR IF YES CMPB R0,#012 ;SEE IF A BEQ O.GET1 ;IF SO SAVE THE PAPER O.GET2: CMPB R0,#173 BGE O.NV SP,R3 ;COPY IT MOV (R4)+,(R3)+ ;GET NUMBER MOV (R4)+,(R3)+ ;NEXT NUMBER CMP F.TRAD,#2 ;REAL OR DOUBLE? BEQ 1$ ;REAL OLC CMPB #140,R0 ;TEST FOR LOWER CASE BGE O.NOLC SUB #40,R0 ;CHAR IS LC-CONVERT TO UPPER CASE O.NOLC: JSR 5,O.FTYP ;EC MOV (R4)+,(R3)+ MOV (R4)+,(R3)+ ADD #10.,12(SP) ;D FACTOR 17. ADD #16.,14(SP) ;WIDTH IS 30. JSR PC,DCO$ ;DO FORTRAN DHO CHARACTER BEQ O.GET ;IGNORE NULLS TSTB O.SCRN ;SHOULD WE PASS ON SPACES? BNE O.GET1 ;BR IF YES CMPB #40,R0 ;CHECK30.17 CONV. MOV #30.,R1 ;30. CHARACTERS TO BE TYPED BR 3$ 1$: CLR (R3)+ CLR (R3)+ JSR PC,GCO$ ;DO A FORTRAN G14.7 FOR FOR SPACES BEQ O.GET ;IGNORE SPACES O.GET1: RTS R5 ; GENERAL CHARACTER OUTPUT ROUTINE - ODT11X ; ADDRESS OF FIRST BYTE 2 BITS FIRST SWAB R0 ;AND TURN R0 AROUND O.SPC: MOV R0,-(SP) ;SAVE R0 O.V0: ADD #3,R4 ;COMPUTE THE NUMBER OF BITS TO DO MAT CONVERSION ; NEED TO TEST FOR ERRORS HERE MOV #14.,R1 ;GET SET TO TYPE RESULTS 3$: MOV #F.CHR,R2 4$: MOVB (R2)+,R0 ; CLR R0 O.V1: ROL (SP) ;GET A BIT ROL R0 ;STORE IT AWAY DEC R4 ;DECREMENT COUNTER BGT O.V1 ;LOOP IF MORE BITS NEEDED GET CHARACTER JSR R5,O.FTYP ;TYPE IT DEC R1 BGT 4$ ;NEXT ONE MOV #' ,R0 ;SPACE JMP O.FTYP ;TYPE SPACE AND RETURN ; ADD #'0,R0 ;CONVERT TO ASCII JSR R5,O.FTYP ;TYPE IT DEC R3 ;SEE IF MORE DIGITS TO DO BGT O.V0 ;LOOP IF SO MOVB #' , ; ; INTEGER OUTPUT ROUTINE 5$: MOV #6,-(SP) ;FIELD WIDTH MOV @R4,-(SP) ;NUMBER JSR PC,ICO$ ;DO A FORTRAN I6 CONVERSION R0 ;SET UP FOR TRAILING SPACE TST (SP)+ ;GET RID OF JUNK BR O.FTYP O.CDV2: TST F.TRAD ;OCTAL RADIX? BEQ O.CADV ;YE MOV #6,R1 ;6 CHARACTERS FOR OUTPUT BR 3$ ;GO TYPE IT .PAGE ; TYPE ONLY ONE CHARACTER (CONTAINED IN R0) O.FTYP: TSTBS MOV R2,R4 ;COPY ADDRESS BR F.CDV1 ;GO TYPE CONTENTS IN CURRENT RADIX ; ;O.CLRR CLEAR RELOCATION REGS ; I.E., SET O.TCSR BPL .-4 BIC #177400,R0 ;CLEAR HIGH BYTE,SHOULD NOT ;CONTAIN INPORTANT INFO. BEQ O.FTY3 CMP #176,R0 ;PRINTTHEM TO A HIGH MEM LOC. (-1) ; R1,R0 CLOBBERED ; O.CLRR: MOV #O.RELT,R1 MOV #-1,R0 MOV R0,(R1)+ MOV R0,(R1)+ MOV R0, ? FOR 177;16-37 BLO O.FTY2 ; 1-10 AND 200-377. CMP #37,R0 BLO O.FTY3 CMP #15,R0 BLO O.FTY2 CMP #10,R0 BLO O.FTY3(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1)+ MOV R0,(R1) RTS R5 ; .EOT ;END OF TAPE #3 .PAGE ; C O.FTY2: MOV #'?,R0 O.FTY3: MOVB R0,O.TDB O.TYP1: RTS R5 ; GENERAL CHARACTER INPUT ROUTINE -- ODT11X ; CHARACTER INPUT GOESONVERTS CONTENTS OF ADDRESS TO ASCII AT TYPES IT ; F.CADV USES O.CAD AS THE ADDRESS. ; F.CDV1 ASSUMES R4 HAS THE LOCATION F TO R0 O.GET: TSTB O.RCSR ;WAIT FOR BPL .-4 ; INPUT FROM KBD MOVB O.RDB,R0 ;GET CHARACTER - STRIP OFF PARITY BIC #17 ;CHECKS FOR ^U. IF PRESENT, ECHOS IT ;GOES TO COMMAND DECODER. STACK GETS INITIALIZED O.CU: CMPB O.RDB,#225 ;IS ^U IN TTY LOOP BACK FOR NEXT COMPARISON O.LOC1: MOV O.XXX,R0 ;PUT REG.# IN R0 RTS 5 ;JOB OVER, RETURN O.LOC3: MOV R1,O.XXY ;REMEMBER BUFFER BNE O.TYP1 ;BR TO RETURN IF NOT MOV #136,R0 ;PUT "^" IN R0 JSR R5,O.FTYP MOV #125,R0 ;PUT U IN R0 JSR R5,O.FSMALLEST DIFFERENCE IN O.XXY ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,O.XXX ; IN O.XXX ASL R0 ;RESTORE R0 TO ORIGINTYP MOV #O.UR0,SP ;INT STACK JMP O.DCD ;SUBROUTINE TO READ THE PS INDEPENDENT OF MACHINE O.RRST: MOVB ST,O.UST ;STORE THAL VALUE BR O.LOC2 ;GO FO NEXT COMPARISON. O.LOC5: .WORD ;TEMP LOCATION. .PAGE ; ; ;SET A SEGMENT OF MEMORY TO A GIVIENE STATUS IN USER ;STATUS AREA.FOR AN LSI ;THIS IS CHANGED TO ;MFPS O.UST RTS PC ;SUBROUTINE TO WRITE PS INDE VALUE. (ENTERED VIA R5) ;FIRST WORD OR BYTE ADDRESS IS IN R4, =TO R3 AT EXIT ;LAST WORD OR BYTE ADDRESS IS IN R3 ;BYTE OR WOPENDENT OF MACHINE ;CALL ROUTINE WITH PS VALUE ;ON THE STACK O.WST: MOVB 2(SP),ST ;STORE NEW PS VALUE ;THIS INSTRUCTIORD VALUE IS IN R0 ;BYTE OR WORD MODE IS SPECIFIED BY O.BW ; O.ST: O.ST2: CMP #1,O.BW ;IF NOT BYTE MODE, ASSUME WORD BEQ ON IS CHANGED FOR LSI ;TO MTPS 2(SP) MOV (SP)+,(SP) ;PUT RETURN PC OVER SUB. ARGUMENT RTS PC ;TO RETURN WITHOUT IT ON T.ST1 ;BRANCH IF BYTE MODE MOV R0,(R4)+ ;DEPOSIT WORD VALUE, BUMP R4 BY 2 O.ST3: CMP R4,R3 ;ARE WE DONE? BLOS O.ST2 ;BRANHE STACK .PAGE ; ;SUBROUTINE TO LOCATE RELOCATION REGISTER NEAREST BUT STILL ;BELOW THE ADDRESS IN R0. RETURNS WITH THE CH IF NOT DONE RTS 5 ;OTHERWISE EXIT O.ST1: MOVB R0,(R4) ;DEPOSIT BYTE VALUE INC R4 ;BUMP R4 BY 1 BR O.ST3 ;GO TO TESREGISTER ;NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER ;AND (R0) IN O.XXY ;IF NO GOOD RELOC. REG. FOUND, R0 WILT IF DONE ; CLOSE WORD OR BYTE AND EXIT, ; UPON ENTERING, R2 HAS NUMERIC FLAG, R4 HAS CONTENTS O.CLSE: TST F.TRAD ;DEC IN R4, ; ADDRESS OF LAST BYTE IN R3, (R3)>(R4) ; EXPECTS LOCS 56,57 TO BE INITIALIZED BY MONITOR FOR FILL ; CHARACTERISTICSL = -1 O.LOC: MOV R0,O.LOC5 ;PUT R0 IN WORKINK LOCATION. CLR R0 MOV #-1,O.XXX ;INITIALIZE RELOC. REG. INDEX MOV #177777, OF TERMINAL ; 56=CHAR TO BE FILLED AFTER ; 57=# OF NULLS TO FILL WITH O.TYPE: CMP R3,R4 ;CHECK FOR COMPLETION BLO O.TO.XXY ;INITIALIZE DISTANCE TO A HIGH VALUE O.LOC4: CMP R0,#O.RLR ;ARE WE DONE COMPARING? BHI O.LOC1 ;BRANCH IF DONE CMP O.YP1 ; EXIT WHEN DONE MOVB (R4)+,R0 ;GET A CHARACTER JSR 5,O.FTYP ;TYPE ONE CHARACTER CMPB R0,@#56 ;COMPARE CHAR AGAINST RELT(R0),O.LOC5 ;IS CURR. RELOC. BIAS > (O.CAD)? BHI O.LOC2 ;IF SO, BRANCH -- DON'T SUBTRACT, GET NEXT MOV O.LOC5,R1 ;OTHERFILL REQUIREMENT BNE O.TYPE ;NO FILL NEEDED MOVB @#57,(PC)+ ;FILL COUNT INTO TEMP O.FTMP: 0 CLR R0 ;FILL WITH NULLS OWISE TAKE THE DIFFERENCE SUB O.RELT(R0),R1 ; OF CURR. RELOC. REG. AND O.CAD CMP O.XXY,R1 ;IS THE RESULT THE SMALLEST SO FAR?.FLP: JSR R5,O.FTYP ;TYPE NULLS DEC O.FTMP ;DECREASE COUNT BGT O.FLP ;BRANCH IF NOT DONE BR O.TYPE ;LOOP UNTIL DONE ; BHI O.LOC3 ;BRANCH IF YES (UNSIGNED CONDITIONAL) O.LOC2: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG. BR O.LOC4 ;S2 ;JUMP IF BYTE MODE BHI O.CLS1 ;JUMP IF ALREADY CLOSED O.CLS4: MOV R4,@O.CAD ;STORE WORD O.CLS3: BR O.CLS1 O.CLS2: MOVBE CURRENT ADDRESS WERE SAVED AND RESTORED. ;CALLED: JSR 5,O.RORA O.RORA: CMP #0,O.FORM ;CHECK FORMAT BEQ O.NOTA ; GO TO R4,@O.CAD ;STORE BYTE O.CLS1: RTS PC O.CRLF: MOV #O.CR+1,R3 ;LWA BR O.CRS O.CRLS: MOV #O.CR+2,R3 ;LWA * O.NOTA IF RELATIVE O.ABS: JSR 5,O.CADV ;PRINT ABSOLUTE ADDRESS RTS R5 O.NOTA: MOV R0,O.TMP2 ;SAVE R0 JSR 5,O.LOC ; FIND BO.CRS: MOV #O.CR,R4 ;FWA JSR 5,O.TYPE ;TYPE SOMETHING RTS R5 .PAGE ; ROUTINE TO UPDATE O.CAD DEPENDING ON THE CURRENT RADIEST N TST R0 ;IF = -1, PRINT IN ABS. BLT O.ABS1 ADD #60,R0 ; CONVERT N TO ANSCII JSR 5,O.FTYP ; TYPE N MOV #',,R0 ; X ; BYTE: 1, OCTAL OR INTEGER: 2, REAL: 4, DOUBLE: 10 BYTES ; F.CADM MAKES A POSITIVE ADJUSTMENT ; F.CADN MAKES A NEGATIVE ADPREPARE INPUT FOR O.FTYP JSR 5,O.FTYP ; TYPE COMMA MOV O.BW,-(SP) ; SAVE O.BW MOV #2,O.BW ;ARTIFICIALLY SET MODE FOR WORDJUSTMENT F.CADN: MOV #-1,R0 ;SET FLAG FOR NEGATIVE ADJUSTMENT BR F.CDM1 ;FINISH F.CADM: CLR R0 ;FLAG FOR POSITIVE ADJUSTMS MOV O.XXY,R0 ;PREPARE INPUT FOR O.CADV JSR 5,O.CADV ;TYPE RELATIVE AMOUNT MOV (SP)+,O.BW ;RESTORE MODE MOV O.TMP2,R0 ;ENT F.CDM1: TST F.TRAD ;OCTAL RADIX? BNE 1$ ;NO 5$: MOV O.BW,R1 ;OCTAL MODE, USE O.BW TO ADJUST BR 3$ ;GO DO IT 1$: M RESTORE R0 RTS R5 O.ABS1: MOV O.TMP2,R0 ;RESTORE R0,CAD BEFORE BR O.ABS ; ; MOD40 PACK - ENTERED WITH JSR PC, PACK00 OV #2,R1 ;BASIC ADJUSTMENT IS 2 BYTES CMP F.TRAD,#2 ;RADIX? BLT 3$ ;INTEGER BEQ 2$ ;REAL ADD #4,R1 ;MUST BE DOUBLE ; ; INPUT: R0=ADR OF MOD40 WORD (1 WORD) ; R1=ADR OF ASCII CHARACTERS (3 CHARS) ; ; OUTPUT: R1 POINTS ONE PAST END OF ASCII2$: TST (R1)+ ;2 MORE FOR REAL AND DOUBLE 3$: TST R0 ;WHICH WAY TO ADJUST? BEQ 4$ ;POSITIVE NEG R1 ;NEGATIVE 4$: ADD R STRINT ; THE MOD40 WORD IS FORMED AS ; N=C1*40^2+C2*40+C3 ; ; R2,R3,R4 ARE CLOBBERED PACK00: PACK01: MOV #-3,R4 ;LOO1,O.CAD ;ADJUST O.CAD RTS PC ;RETURN .PAGE ;SUBROUTINE O.RORA ;FUNCTION: DECIDE IF AN ADDRESS IS ;TO BE PRINTED IN ABSOLUP CT. CLR R2 ;0 SUM PACK05: MOVB (R1)+,R3 ;GET NEXT ASCII CHAR. CMPB #' ,R3 BEQ PACK02 ;"BLANK" CMPB #'$,R3 BEQ PATE OR IN RELATIVE ;FORM. IF THE FLAG O.FORM=0 THEN PRINT ;IN RELATIVE FORM, OTHERWISE PRINT IN ;ABSOLUTE FORM. ;IF THE ADDRCK04 ;"$" CMPB R3,#'A BLO PACK03 ;"." OR "0-9" SUB #40,R3 ;"A-1" PACK02: SUB #16,R3 PACK03: SUB #11,R3 PACK04:ESS IS TO BE PRINTED IN RELATIVE ;FORM, ;THEN THE ADDRESS WILL BE PRINTED OUT ;RELATIVE TO A RELOCATION REGISTER NEAREST ;BU SUB #11,R3 ; MULT R2 BY 40. ASL R2 ;2*R2 ASL R2 ;4*R2 ASL R2 ;8*R2 MOV R2,-(SP) ;STACK 8*R2 ASL R2 ;16.*R2 IMAL RADIX? BEQ 1$ ;NO TST F.NC ;ANY CHARACTERS FOR DECIMAL CONVERSION? BEQ O.CLS1 ;NO JMP CONVRT ;CONVERT AND STORET STILL BELOW THE ADDRESS. IF NO SUCH ;RELOCATION REGISTER EXIST THEN THE ;ADDRESS WILL BE PRINTED IN ABSOLUTE FORM ;INPUT: DECIMAL NUMBER 1$: TST R2 ;IF NO NUMBER WAS TYPED THERE IS BEQ O.CLS1 ;NO CHANGE TO THE OPEN CELL CMP #1,O.BW BEQ O.CLTHE ADDRESS TO BE PRINTED IS IN R0. ;DATA SAVED: R0 CONTAINING THE ADDRESS TO BE ;PRINTED, AND LOCATION O.CAD CONTAINING ;THADDRESS O.XXX: .WORD 0 ;TEMPORARY STORAGE O.XXY: .WORD 0 ;2ND WORD OF TEMPORARY STORAGE O.SEQ: .BYTE 0 ;CHANGE SEQUENCE IND- ; - .BYTE 'F ; F .BYTE 'I ; I .BYTE '! ; ! .BYTE 'X ; X .BYTE 'A ; A .BYTE 003 ;CTRL C .BYTE 'V ; V THREASL R2 ;32.*R2 ADD (SP)+,R2 ;40.*R2 ; INCLUDE CURRENT CHARACTER ADD R3,R2 INC R4 ;DONE 3 CHARS? BLT PACK05 ;NO MOVICATOR O.WDFG: .BYTE 0 ;SEARCH FLAG = 1 - EFFECTIVE ; = 0 - WORD O.S: .BYTE 0 ;SINGLE INSTRUCTION FLAG R2,(R0)+ ;YES-STORE MOD40 WORD RTS PC ;EXIT ; ; MOD40 UNPACK - ENTERED VIA JSR PC,UNPA00 ; ; INPUT: R0=ADR OF MOD40 NU;0 IF NOT ACTIVE ;-1 IF ACTIVE ;NO BREAK BOINTS MAY BE SET WHILE IN ;SINGLE INSTRUCTION MODE O.T: .BYTE 0 ; TMBER (1 WORD) ; R1=ADR OF ASCII STRING (3 BYTES) ; ; OUTPUT: R1 POINTS ONE PAST LAST GENERATED CHARACTER ; ; ; IF N IS TH-BIT FLAG O.P: .BYTE 0 ;PROCEED FLAG = -2 IF MANUAL ENTRY ; -1 IF NO PROCEED ALLOWED ; 0-7 IF PCEED ALLOWED O.CSRE MOD40 NUMBER, THEN ; N=C1*50 ^ 2+C2*50+C3 ; THUS, N/50^2 IS C1 AND THE REMAINDER IS C2*50+C3 ; THE REMAINDER IS DIVIDED BY1: .BYTE 0 ;SAVE CELL - R C/SR O.CSR2: .BYTE 0 ;SAVE CELL - T C/SR O.CMFD: .BYTE 0 ;COMMA FOUND SWITCH, =0 NO COMMA FOUND 50 TO GET C2 ETC. ; UNPA00: UNPA07: MOV #-3,R5 ;MINOR LOOP COUNT MOV (R0),R0 ;GET MOD40 WORD MOV #COEFF,R2 ;PTR TO C ; =1 COMMA FOUND O.SMFD: .BYTE 0 ;SEMICOLON FOUND SWITCH ;=0 NO SEMICOLON FOUND ;=1 SEMICOLON FOUND O.ALF1: OEFFICIENT TABLE UNPA06: CLR R3 ;0 QUOTIENT ; DIVIDE BY COEFFICIENTS UNPA02: CMP R0,(R2) ;DONE WITH DIVIDE? BLO UNPA01 ;Y.BYTE 0 O.ALF2: .BYTE 0 O.ALF3: .BYTE 0 O.SCRN: .BYTE 0 ;FLAG; 1=PASS SPACES ON FROM TTY ;ALSO, IF =1, IS ECHOED O.ES SUB (R2),R0 ;NO-SUBTRACT COEFF. INC R3 ;ADD 1 TO QUOTIENT BR UNPA02 ; DIVIDE DONE. QUOT IN R3, REMAINDER IN R0 ; CID: .BYTE 012 .BYTE 015 .BYTE 40 .ASCII /FORODT V01-02 / O.IDND=.-1 .EVEN O.BD: .WORD "BE O.BIAS: .WORD 0 ;CURRENT RONVERT TO AN ASCII CHARACTER UNPA01: TSTB R3 BEQ UNPA03 ;"BLANK" CMPB R3,#33 BEQ UNPA05 ;"$" BGT UNPA04 ;"." OR "0ELOCATION BIAS O.MINS: .BYTE 0 ;MINUS SIGN TYPED (SWITCH) ;0=NO MINUS TYPED; 1=MINUS SIGN TYPED .EVEN O.TMP1: .WORD 0 -9" ADD #40,R3 ;"A-Z" UNPA03: ADD #16,R3 UNPA04: ADD #11,R3 UNPA05: ADD #11,R3 MOVB R3,(R1)+ ;STORE CHARACTER TS;SAVE CELL O.TMP2: .WORD 0 ;SAVE CELL O.CR: .BYTE 015 ; .BYTE 012 ; .BYTE '* ; * O.LGCH: .BYTE '; ; T (R2)+ ;ADVANCE TO NEXT COEFF. INC R5 ;DONE 3 CHARS? BLT UNPA06 ;NO-DO MORE MOV (SP),R0 ;RESTORE ORIGINAL R0 AND TS.BYTE '/ ; / .BYTE '\ ; \ (BACK SLASH) .BYTE 015 ; CARRIAGE RETURN .BYTE '$ ; $ .BYTE 'G ; G .BYTE 012 ; T (R0)+ ;MOVE TO NEXT WORD RTS PC ; ; COEFFICIENT TABLE ; COEFF: +1600. ;40. ^ 2 +40. ;40. ^ 1 +1. ;40. ^ 0 O. .BYTE '_ ; _ (BACK ARROW) .BYTE '< ; < .BYTE '^ ; ^ (UP ARROW) .BYTE ', ; , .BYTE 'O ; O .BYTE 'W ; W .BYTE 'BW: .WORD 0 ; =0 - ALL CLOSED ; =1 - BYTE OPEN, ; =2 - WORD OPEN O.CAD: 0 ; CURRENT ADDRESS O.DOT: 0 ; ORIGIN E ; E .BYTE 'B ; B .BYTE 'P ; P .BYTE '@ ; @ .BYTE '> ; > .BYTE 'S ; S .BYTE 'R ; R .BYTE 'C ; C .BYTE 'USER R0 0 ; R1 0 ; R2 0 ; R3 0 ; R4 0 ; R5 O.USP: 0 ;USER SP O.UPC: 0 ;USER PC O.UST: 0 ;USER ST O.PRI: 7 ;ODT PRIORITY O.MSK: 0 ;MASK O.LOW: 0 ;LOW LIMIT O.HI: 0 ;HIGH LIMIT O.CNST: 0 ;CONSTANT REGISTER O.FORM: 0 ; FORMAT REGISTER ; IF $F=0 RELATIVE ADDRESSING ; ABSOLUTE OTHERWISE ;RELOCATION REGISTERS O.RELT: -1,-1,-1,-1,-1,-1,-1,-1 ;INITIALLY SET TO A HIGH ADDR. ; BREAK POINT LISTS, ADR1 = ADDRESS OF BREAKPOINT,CT = COUNT, ; UIN = CONTENTS O.ADR1:ADED CODE BREAK POINT .BYTE '# ; # SETS I/O RADIX .BYTE '. ; PERIOD FOR DECIMAL CONVERSION .BYTE '+ ; PLUS FOR DECIMAL CO . = .+O.BKP+4 O.CT: . = .+O.BKP+4 O.UIN: . = .+O.BKP+4 F.ADR1: .=.+O.BKP+4 F.CT: .=.+O.BKP+4 F.UIN: .=.+O.BKP+NVERSION .BYTE '8 .BYTE '9 .BYTE 'D .BYTE 'T ; T THREADED CODE ;G O.CLGT = .-O.LGCH ;TABLE LENGTH O.TL: .BYTE 'S4 . = O.TRTC+2 .END O.ODT ;END OF TAPE #4 ;DO 1 .BYTE 'P ;NOT 2 .BYTE 'M ;CHANGE 3 .BYTE 0 ;THE 4 .BYTE 0 ;ORDER 5 .BYTE 'C ; 6 .BYTE 'F ; 7 .BYTE 'R ; 10 .BYTE 0 ; 11 .BYTE 0 ; 12 .BYTE 0 ; 13 .BYTE 0 ; 14 .BYTE 0 ; 15 .BYTE 0 ; 16 .BYTE 0 ; 17 .BYTE 'B ; 20 O.LG = .-O.TL .EVEN .PAGE F.RAD: .WORD 0 ;DEFAULT I/O RADIX, CHANGED BY ## F.TRAD: .WORD 0 ;TEMP I/O RADIX F.CFLG: .WORD 0 ;# FOUND FLAG F.NC: .WORD 0 ;CHAR COUNT FOR INPUT F.CLOC: .WORD 0 ;POINTER TO CURRENT BYTE IN F.CHR F.CHR: .BLKW 20. ;CHARACTER BUFFER, 40. CHARACTERS F.FLAG: 0 ;FLAG INDICATES IF BREAK PT IS: ; NORMAL = 0 OR ; THREADED CODE = 1 F.THRD: F.BRK ;THREADED CODE BRK PT PROTOTYPE O.TRTC: TRT ;TRACE TRAP PROTOTYPE ;THE ORDER OF THE FOLLOWING ENTRIES IS CRITICAL . = O.ODT-232 ;ODT'S STACK IMMEDIATELY PRECEDES ODT O.UR0: 0 ;