TITLE MMUUO - UUO handler for MM
       SUBTTL UUO handler/MMcM/MRC

       SEARCH MACSYM,MONSYM
       SALL                    ;Suppress macro expansions
       ASUPPRESS               ;Save some symbol table space
       .DIRECTIVE FLBLST       ;Sane listings for ASCIZ, etc.

       EXTERN CMDINI,CMDRET,CMDRES,UNTAK0
       EXTERN CMDBLK,CMDFLB,CMDNO1,TPADDR,CLEVEL
       EXTERN STRBUF
       EXTERN F%TAK,F%HOER,MSGLEN

;;;AC's - must match MM.MAC

F==:0                           ;Flags
A=:1                            ;Temp and JSYS
B=:2                            ;Ditto
C=:3                            ;Ditto
D=:4                            ;Ditto
E=:5                            ;Temp & local to routine
T=:6                            ;Ditto
U=:7                            ;Ditto
V=:10                           ;Ditto
W=:11                           ;Ditto
L=:12
M=:13                           ;Current message if any
N=:14
O=:15
;CX=:16                         ;MACSYM temporary AC
;P=:17

JBUUO=40                        ;UUO saved here

       .PSECT DATA

UUOACS: BLOCK 17                ;AC's during LUUO call

       .ENDPS
       .PSECT CODE

UUOH::  MOVEM 16,UUOACS+16      ;Save all AC's
       MOVEI 16,UUOACS
       BLT 16,UUOACS+15
       LDB A,[POINT 9,.JBUUO,8] ;Get opcode field
       CAIL A,MAXUUO
        SETZ A,                ;UUO is invalid
       CALL @UUOS(A)           ;Do the right routine
       MOVSI 16,UUOACS         ;Restore ac's
       BLT 16,16
       RET

UUOS:   %ILUUO
       %PRINT
       %TYPE
       %ETYPE
       %ERROR
       %NOISE
       %DEFAL
       %PRMPT
       %HELP
MAXUUO==.-UUOS

%ILUUO: HRROI A,[ASCIZ/Invalid UUO /]
       ESOUT%
       MOVX A,.PRIOU
       MOVE B,.JBUUO
       MOVE C,[NO%MAG!NO%LFL!NO%ZRO!<^D12,,^D8>]
       NOUT%
        NOP
       HRROI A,[ASCIZ/ at /]
       PSOUT%
       MOVX A,.PRIOU
       SOS B,-1(P)             ;Get failing PC
       HRRZS B
       MOVE C,[NO%LFL!NO%ZRO+<6,,^D8>]
       NOUT%
        NOP
       HALTF%
       RET

EOL==:.CHCUN                    ;Newline for PRINT UUO

%PRINT: HRRZ A,.JBUUO           ;Get byte
       CAIN A,EOL              ;Print EOL means do CRLF
        JRST CRLF
%PRIN0: PBOUT%
       RET

%TYPE:  CALL TYCRIF             ;Check if we should do a CRLF
%TYPE0: HRRO A,.JBUUO           ;Get string
       PSOUT%
       RET

%PRMPT: SETZM CLEVEL
       HRLZ A,.JBUUO           ;Get prompt string
       CALL CMDINI             ;Setup that as prompt
       SETZM TPADDR            ;Definitely do NOT return here
       RET

TYCRIF: MOVE A,.JBUUO           ;Get instruction
       TLNE A,(<10,0>)         ;Wants cr all the time?
        JRST CRLF              ;Yes
       TLNE A,(<1,0>)          ;Wants fresh line?
        JRST CRIF              ;Yes
       RET

CRIF::  SAVEAC <A,B>
       MOVX A,.PRIOU
       RFPOS%
       HRROI A,CRLF0
       TXNE B,.RHALF           ;If not at start of line,
        PSOUT%                 ;Type crlf
       RET

CRLF::  SAVEAC <A>
       HRROI A,CRLF0
       PSOUT%
       RET

CRLF0:: ASCIZ/
/

%ERROR: CALL CRIF               ;Get a fresh line
       MOVE B,.JBUUO           ;Get instruction
       TXNE B,<10,0>           ;Wants %?
        SKIPA A,["?"]          ;No
         MOVEI A,"%"
       PBOUT%
       IFXN. B,.RHALF          ;Any message to print?
         CALL %ETYE0           ;Yes, print it out
         MOVE B,.JBUUO         ;And recover instruction
       ENDIF.
       IFXN. B,<<4,0>>         ;Wants JSYS error message?
         HRROI A,[ASCIZ/ - /]
         TXNE B,.RHALF         ;If a previous message, type delimiter
          PSOUT%
         MOVX A,.PRIOU
         HRLOI B,.FHSLF        ;This fork
         SETZ C,
         ERSTR%
          NOP
          NOP
         MOVEI A,.FHSLF        ;Yes, check last error
         GETER%
         HRRZS B               ;Only want error code
         CAIL B,NPXAMB         ;One of the CM%NOP errors?
          CAILE B,NPXCMA
       ANSKP.
         LDB A,[POINT 7,STRBUF,6] ;Yes, look like anything in atom buffer?
       ANDN. A                 ;No
         TMSG < - ">
         HRROI A,STRBUF        ;Now output atom buffer
         PSOUT%
         TMSG <"
>
       ENDIF.
       MOVE B,.JBUUO           ;Get instruction
       TXNE B,<10,0>           ;"?" error?
        TRZN F,F%TAK           ;Yes, in a TAKE file?
        IFSKP.
          HRROI A,[ASCIZ/Error in TAKE file, file aborted
/]
          ESOUT%               ;Indicate TAKE file aborted
          HLRZ A,CMDBLK+.CMIOJ ;Get TAKE file JFN back
          CALL UNTAK0          ;Leave TAKE file
        ENDIF.
       LDB A,[POINT 2,.JBUUO,12] ;Get low order bits of ac field
       TRZE F,F%HOER           ;Doing MAIL "monitor command"?
        HALTF%                 ;Yes, return to EXEC, allow continue
       XCT %ERRS(A)
       JRST %FATAL             ;Shouldn't happen

%ERRS:  JRST CMDRES             ;0 - return to top level commands
       XCT CMDRET              ;1 - user settable return
       JRST %FATAL             ;2 - return to exec
       RET                     ;3 - return to user

%FATAL: HALTF%
       HRROI A,[ASCIZ/Can't continue
/]
       ESOUT%
       JRST %FATAL

%ETYPE: CALL TYCRIF             ;Type a CR maybe
%ETYE0: HRRZ U,.JBUUO
%ETYS0: HRLI U,(<POINT 7,>)     ;Get byte pointer to string
%ETYP1: ILDB A,U                ;Get char
       JUMPE A,R               ;Done
       CAIE A,"%"              ;Escape code?
        JRST %ETYP0            ;No, just print it out
       SETZ V,                 ;Reset ac
%ETYP2: ILDB A,U
       CAIL A,"0"              ;Is it part of addr spec?
        CAILE A,"7"
         JRST %ETYP3           ;No
       IMULI V,10              ;Yes, increment address
       ADDI V,-"0"(A)
       JRST %ETYP2
%ETYP3: CAIG A,"Z"
        CAIGE A,"A"
         JRST %ETYP0
       CALL @%ETYTB-"A"(A)     ;Do dep't thing
       JRST %ETYP1

%ETYP0: PBOUT%
       JRST %ETYP1

%ETYTB: %ETYPA                  ;A - print time
       %ETYPB                  ;B - print date
       %ETYP0                  ;C
       %ETYPD                  ;D - print decimal
       %ETYER                  ;E - error code
       %ETYPF                  ;F - floating
       %ETYP0                  ;G
       %ETYPH                  ;H - RH as octal
       %ETYP0                  ;I
       %ETYPJ                  ;J - file name
       REPEAT 2,<%ETYP0>       ;K, L
       %ETYPM                  ;M - current msg number
       %ETYP0                  ;N
       %ETYPO                  ;O - octal
       %ETYPP                  ;P - pluralizer
       %ETYP0                  ;Q
       %ETYPR                  ;R - raw string w/o % processing
       %ETYPS                  ;S - string
       %ETYPT                  ;T - date and time
       %ETYPU                  ;U - user name
       REPEAT 5,<%ETYP0>       ;V, W, X, Y, Z

%ETYPA: MOVX C,OT%NDA           ;No day, just time
       JRST %ETYB0

%ETYPT: TDZA C,C                ;Both date and time
%ETYPB:  MOVSI C,(OT%NTM)       ;No time, just day
%ETYB0: JUMPE V,.+2             ;If ac field spec'd
        SKIPA B,UUOACS(V)      ;Use it
         SETO B,               ;Else use now
       MOVX A,.PRIOU
       ODTIM%
       RET

%ETYPD: SKIPA C,[^D10]          ;Decimal
%ETYPO:  MOVEI C,^D8            ;Octal
       MOVE B,UUOACS(V)        ;Get data
%ETYO0: MOVX A,.PRIOU
       NOUT%
        NOP
       RET

%ETYER: MOVX A,.PRIOU
       MOVSI B,.FHSLF          ;This fork
       HRR B,UUOACS(V)         ;Get error code
       ERSTR%
        NOP
        NOP
       RET

%ETYPM: HRRZ B,UUOACS+M         ;Current message
       IDIVI B,MSGLEN
       MOVEI C,^D10            ;Decimal
       AOJA B,%ETYO0           ;Zero is msg 1

%ETYPF: MOVX A,.PRIOU
       MOVE B,UUOACS(V)
       SETZ C,
       FLOUT%
        NOP
       RET

%ETYPH: MOVEI C,^D8
       HRRZ B,UUOACS(V)
       JRST %ETYO0

%ETYPJ: MOVX A,.PRIOU
       HRRZ B,UUOACS(V)
       MOVE C,[211110,,1]      ;Def dev, frc, dir, name, etc
       JFNS%
       RET

%ETYPP: MOVEI A,"s"
       MOVE B,UUOACS(V)
       CAIE B,1
        PBOUT%                 ;Make plural unless just one
       RET

%ETYPR: SKIPN A,UUOACS(V)
        RET
       HRLI A,(<POINT 7,>)     ;Get byte pointer to string
       PSOUT%
       RET

%ETYPS: PUSH P,U
       SKIPE U,UUOACS(V)
        CALL %ETYS0            ;Recursive call
CPOPUJ: POP P,U
       RET

%ETYPU: MOVX A,.PRIOU
       MOVE B,UUOACS(V)
       DIRST%
        NOP
       RET

;;;Parse noise word
%NOISE: MOVSI A,(<BYTE (9) .CMNOI,0>)
       MOVEM A,CMDFLB+.CMFNP
       HRRO A,.JBUUO
       JRST CMDNO1

;;;Set up a default
%DEFAL: HRRZ B,.JBUUO
       HRROM B,CMDFLB+.CMDEF   ;Save default string
       MOVX A,CM%DPP
       IORM A,CMDFLB+.CMFNP    ;Yes, say there is one
       RET

;;;Set up help string
%HELP:  HRRZ B,.JBUUO
       HRROM B,CMDFLB+.CMHLP   ;Save help string
       MOVX B,CM%HPP
       IORM B,CMDFLB+.CMFNP    ;Say there is help
       RET

       .ENDPS

       END