;*****************************************************************************;
;                                                                           ;
;                              Super STAT                                   ;
;               screen-oriented dynamic system status monitor               ;
;                                                                           ;
;                         author: David F. Pallmann                         ;
;                       Donated to AMUS on 04-Apr-84                        ;
;                   Enhanced at MARCOM, Inc. By: Doug Azzarito              ;
;                   Enhanced at NTSC By Cary Fitch 11/13/85                 ;
;                   Enhanced at NTSC By Cary Fitch 01/30/86                 ;
;                   Enhanced at NTSC By Cary Fitch 01/31/86                 ;
;***************************************************************************;

OBJNAM  SPSTAT.LIT

VMAJOR=2

;edit history
VEDIT=100.      ;17-Dec-83 DFP creation.
VEDIT=101.      ;05-Jan-84 DFP [P,PN]s were displayed in hex after a SET HEX
VEDIT=102.      ;19-Jul-85 DAA Added CPU time, more Jobs/Page
VEDIT=103.      ;11-Nov-85 DAA Added system up time.
VEDIT=104.      ;13-Nov-85 FCF Added Slow & Fast Help instructions
VEDIT=105.      ;13-Nov-85 FCF Corrected flow so Slow and Fast work
               ;              when (Jobs in use) = (Jobs allocated)
VEDIT=106.      ;05-Jan-86 FCF Check keyboard buffer until all pending
               ;              inputs are processed to speed up mode changes
VEDIT=107.      ;29-Jan-86 FCF Added variable speeds for update
               ;       Slow = low system overhead  "S"
               ;       Med. = med.overhead         "M"
               ;       Fast = ...all together now..."high overhead" "F"
VEDIT=108.      ;30-Jan-86 FCF Added 10 Speeds for update "1 - 0"
VEDIT=109.      ;30-JAN-86 FCF Added speed report in upper right hand corner
VEDIT=110.      ;31-JAN-86 FCF Fixed problem in clearing DEV & PPN display
               ;                on LOGOFF
VEDIT=111.      ;31-jan-86 FCF Added "Arrow Control" "A & Z"
VEDIT=112.      ;16-feb-86 FCF reduced space blanking to 1 after queue display
VEDIT=113.      ;26-feb-86 DKM fixed display of AMOS ver. was NDOS/L to AMOS/L

;universals
SEARCH  SYS
SEARCH  SYSSYM
SEARCH  MACLIB
SEARCH  TRM

EXTERN  $OTCPU,$OTCON

;ASCII characters
ESC=33

;registers
JOBLCL=A3                               ;index to job data in local memory
JOBSYS=A4                               ;index to job data in system memory
IMP=A5                                  ;impure index
ROW=D5                                  ;cursor row

;job data entry
OFINI
OFDEF  JB.NAM,4                        ;job name RAD50
OFDEF  JB.TRM,4                        ;job terminal name RAD50
OFDEF  JB.DEV,2                        ;job log-device
OFDEF  JB.DRV,2                        ;job log-drive
OFDEF  JB.PPN,2                        ;job log-PPN
OFDEF  JB.PRG,4                        ;job program name
OFDEF  JB.STS,2                        ;job status
OFDEF  JB.MEM,2                        ;job memory (K bytes)
OFDEF  JB.RED,4                        ;disk reads
OFDEF  JB.WRT,4                        ;disk writes
OFDEF   JB.CPU,4                        ; CPU time
OFSIZ  JB.SIZ

;impure area
OFINI
OFDEF  STATUS,2                        ;saved JCB JOBTYP word
OFDEF  JOBDAT,JB.SIZ*22.               ;job data area
OFDEF  JOBOFF,2                        ;job offset count
OFDEF  JOBCNT,2                        ;number of jobs
OFDEF  BUFFER,10                       ;PACK-UNPACK buffer
OFDEF  ACTJOB,2                        ;last job active
OFDEF  HD.DAT,4                        ;header - date
OFDEF  HD.QUE,4                        ;header - free queue blocks
OFDEF  HD.TIM,4                        ;header - time
OFDEF  TEMP,4                          ;temporary work area
OFDEF   CPUHOLD,14                      ; CPU time hold area
OFDEF   SPEED,4                         ; screen speed flag [108. CF]
OFDEF   CHRSAV,1                        ; last character from KBD
OFDEF   AROFLG,1                        ; flag for arrow display
OFSIZ  IMPSIZ

DEFINE  DEPACK  ADDR,COL,COUNT
       LEA     A1,ADDR
       LEA     A2,BUFFER(IMP)
       UNPACK
       IF      GT,ROW-1,UNPACK
       CLRB    @A2
       CRT     #12.
       CRT     ROW,COL
       TTYL    BUFFER(IMP)
       ENDM

;standard initialization code
START:  PHDR    -1,0,PH$REE!PH$REU      ;program header
       GETIMP  IMPSIZ,IMP              ;allocate impure area
;       CLRW    JOBOFF(IMP)
       MOVL    #10000.,SPEED(IMP)      ; set med. speed [107 CF]
       MOVB    #'M,CHRSAV(IMP)
       MOVB    #-1,AROFLG(IMP)
;set user terminal to data mode, no-echo, cursor off
SETTRM: MOV     JOBCUR,A6
       MOV     JOBTRM(A6),A6
       ORW     #<T$DAT!T$ECS>,T.STS(A6)
       CRT     #29.

;count number of jobs
CNTJOB: CLR     D2
       MOV     JOBTBL,A0
10$:    MOV     (A0)+,D0
       BEQ     10$
       BMI     20$
       INC     D2
       BR      10$
20$:    MOVW    D2,JOBCNT(IMP)

;save job type and temporarily force a SET OCTAL
RADIX8: MOV     JOBCUR,A0
       MOVW    JOBTYP(A0),STATUS(IMP)
       ANDW    #^C<J.HEX>,JOBTYP(A0)

;set up screen background
BCKGND: CRT     #0

       CRT     #12.
       TTYI
       ASCIZ   "AMOS/L Ver. "
       EVEN
       VCVT    2,OT$TRM

       CRT     #11.
       CRT     #1,#24.
       TYPE    Queue:
       CRT     #1,#35.
       TYPE    Date:
       CRT     #1,#50.
       TYPE    Time:
       CRT     #1,#64.
       TYPE    Up:
       CRT     #2,#79.
       CRT     #31.
       CRT     #1,#80.
       CRT     #30.
       CRT     #2,#1
       TYPE    Job    Name     Log-In      Prog  State Memory    Reads  Writes  CPU time  CPU
;       CRT     #31.

;initialize header data
INIHDR: MOV     #-1,HD.DAT(IMP)
       MOV     #-1,HD.QUE(IMP)
       MOV     #-1,HD.TIM(IMP)

;initialize job data area to insure full screen display
INIJOB: LEA     JOBLCL,JOBDAT(IMP)
       MOV     #22.,D0
10$:    CLR     JB.NAM(JOBLCL)
       CLR     JB.TRM(JOBLCL)
       CLRW    JB.DEV(JOBLCL)
       MOVW    #-2,JB.DRV(JOBLCL)
       MOVW    #<<1_8.>+0>,JB.PPN(JOBLCL)
       CLR     JB.PRG(JOBLCL)
       CLRW    JB.STS(JOBLCL)
       MOVW    #-1,JB.MEM(JOBLCL)
       MOV     #-1,JB.RED(JOBLCL)
       MOV     #-1,JB.WRT(JOBLCL)
       MOV     #-1,JB.CPU(JOBLCL)
       ADD     #JB.SIZ,JOBLCL
       SOB     D0,10$

;reset active job arrow count
SETACT: MOVW    #3,ACTJOB(IMP)

;clear job update sub-screen
CLRSCR: CRT     #3,#1
       CRT     #10.

;update header
HEADER: CALL    CMDCHK                  ;process any pending commands
       CALL    UPDQUE                  ;update queue
       CALL    UPDDAT                  ;update date
       CALL    UPDTIM                  ;update time
       CALL    CHRUPD                  ;update "speed" char [109 CF]

;begin job scan
;locate initial job by adding JOBOFF(IMP)*4 to JOBTBL
JOBSCN: MOV     JOBTBL,A2
       MOVW    JOBOFF(IMP),D0
       ROL     D0,#2
       ADD     D0,A2
       MOV     #22.,D2
       MOV     #3.,ROW
       LEA     JOBLCL,JOBDAT(IMP)

;update a single job
UPDJOB: MOV     (A2)+,D0
       BEQ     NXTJOB
       BMI     NOD                     ; was HEADER [105, FCF]
       MOV     D0,JOBSYS
       SAVE    A0-A5,D0-D5
       CALL    UPDNAM                  ;update job name
       CALL    UPDTRM                  ;update job terminal name
       CALL    UPDACT                  ;update job log account
       CALL    UPDPRG                  ;update program name
       CALL    UPDSTS                  ;update job status
       CALL    UPDMEM                  ;update job memory
       CALL    UPDRED                  ;update disk reads
       CALL    UPDWRT                  ;update disk writes
       CALL    UPDCPU                  ;update job priority
       REST    A0-A5,D0-D5

NXTJOB: INCW    ROW
       ADD     #JB.SIZ,JOBLCL
       SOB     D2,UPDJOB
;sleep so other jobs can run
                                       ; NOD is new label [105, FCF]
NOD:    TSTB    AROFLG(IMP)
       BEQ     NOZAP
       CALL    ZAPARW                  ; Erase the arrow while sleeping
NOZAP:  MOVL    SPEED(IMP),D6           ; fast med. or slow?    [107, CF]
       SLEEP
       JMP     HEADER

PAGE
;update date
UPDDAT: GDATES  TEMP(IMP)
       CMM     TEMP(IMP),HD.DAT(IMP)
       REQ
       MOV     TEMP(IMP),HD.DAT(IMP)
       CRT     #12.
       CRT     #1,#40.
       CLR     D1
       MOVB    HD.DAT+1(IMP),D1
       DCVT    2,OT$TRM
       TYPE    -
       MOVB    HD.DAT(IMP),D1
       DECB    D1
       ADD     D1,D1
       ADD     D1,D1
       LEA     A0,MONTHS
       ADD     D1,A0
       TTYL    @A0
       TYPE    -
       MOVB    HD.DAT+2(IMP),D1
       DCVT    2,OT$TRM
       RTN

;update free queue block count
UPDQUE: MOV     QFREE,D0
       CMM     D0,HD.QUE(IMP)
       REQ
       MOV     D0,HD.QUE(IMP)
       CRT     #12.
       CRT     #1,#30.
       MOV     D0,D1
       DCVT    0,OT$TRM
       TYPE    < >             ; reduced from 3 spaces to one space [112. CF]
       RTN

;update time
UPDTIM: GTIMES  TEMP(IMP)
       CMM     TEMP(IMP),HD.TIM(IMP)
       REQ
       MOV     TEMP(IMP),HD.TIM(IMP)
       CRT     #12.
       CRT     #1,#55.
       CLR     D1
       MOVB    HD.TIM(IMP),D1
       DCVT    2,OT$TRM
       TYPE    :
       MOVB    HD.TIM+1(IMP),D1
       DCVT    2,OT$TRM
       TYPE    :
       MOVB    HD.TIM+2(IMP),D1
       DCVT    2,OT$TRM
       CALL    UPDUTM
       RTN

;update Uptime
UPDUTM: CRT     #1,#67.
       CLR     D1
       MOV     D1,A2
       MOV     UPTIME,BUFFER(IMP)
       MOV     BUFFER(IMP),D1
       CALL    $OTCON
       RTN
PAGE
;update job name
UPDNAM: MOV     JOBNAM(JOBSYS),D0
       CMM     D0,JB.NAM(JOBLCL)
       REQ
       MOV     D0,JB.NAM(JOBLCL)
       DEPACK  JB.NAM(JOBLCL),#1,2
       JMP     ARROW

;update job terminal name
UPDTRM: MOV     JOBTRM(JOBSYS),D0
       BEQ     10$
       MOV     D0,A0
       MOV     -4(A0),D0
10$:    CMM     D0,JB.TRM(JOBLCL)
       REQ
       MOV     D0,JB.TRM(JOBLCL)
       DEPACK  JB.TRM(JOBLCL),#8.,2
       JMP     ARROW

;update log account
UPDACT: CLR     D0
       CLR     D2
       CLR     D3
       MOVW    JOBDEV(JOBSYS),D0
       MOVW    JOBDRV(JOBSYS),D2
       MOVW    JOBUSR(JOBSYS),D3
       BNE     10$
       CLRW    D0
       MOVW    #-1,D2
10$:    CMPW    D0,JB.DEV(JOBLCL)
       BNE     20$
       CMPW    D2,JB.DRV(JOBLCL)
       BNE     20$
       CMPW    D3,JB.PPN(JOBLCL)
       REQ
20$:    MOVW    D0,JB.DEV(JOBLCL)
       MOVW    D2,JB.DRV(JOBLCL)
       MOVW    D3,JB.PPN(JOBLCL)
       JEQ     50$
       CRT     #12.
       CRT     ROW,#15.
       TSTW    D0
       BNE     30$
       TYPE    <      >
       BR      40$
30$:    LEA     A1,JB.DEV(JOBLCL)
       LEA     A2,BUFFER(IMP)
       UNPACK
       CLRB    @A2
       TTYL    BUFFER(IMP)
       MOVW    D2,D1
       DCVT    0,OT$TRM
       TYPE    :
       CMPW    D2,#9.
       BGT     40$
       TYPESP
40$:    MOV     D3,D1
       BEQ     50$
       RORW    D1,#8.
       AND     #377,D1
       OCVT    3,OT$TRM!OT$ZER
       TYPE    <,>
       MOV     D3,D1
       AND     #377,D1
       OCVT    0,OT$TRM
       CMPW    D1,#77
       BGT     60$
       TYPESP
       CMPW    D1,#7
       BGT     60$
       TYPESP
       BR      60$
50$:    CRT     #11.
       CRT     ROW,#15.
       TYPE    <             >         ; [110 CF] blank DEV & PPN
60$:    JMP     ARROW

;update job program
UPDPRG: MOV     JOBPRG(JOBSYS),D0
       CMM     D0,JB.PRG(JOBLCL)
       REQ
       MOV     D0,JB.PRG(JOBLCL)
       DEPACK  JB.PRG(JOBLCL),#29.,2
       JMP     ARROW

;update job status
UPDSTS: CLR     D0
       CLR     D2
       MOVW    JOBSTS(JOBSYS),D0
10$:    LEA     A0,STSTBL
20$:    TSTW    @A0
       BEQ     30$
       MOVW    (A0)+,D2
       ADD     #4,A0
       MOVW    D0,D7
       ANDW    D2,D7
       BEQ     20$
       LEA     A1,-4(A0)
       BR      40$
30$:    MOV     #100000,D0
       BR      10$
40$:    CMMW    D2,JB.STS(JOBLCL)
       BNE     50$
       CMMW    D2,#J.IOW
       JEQ     ARROW
       CMPW    D2,#100000
       RNE
       JMP     ARROW
50$:    MOVW    D2,JB.STS(JOBLCL)
       CRT     ROW,#36.
       CMPB    @A1,#'a
       BGE     60$
       CRT     #12.
       BR      70$
60$:    CRT     #11.
70$:    TTYL    @A1
       JMP     ARROW

UPDMEM: MOV     JOBSIZ(JOBSYS),D0
       DIV     D0,#1024.
       AND     #177777,D0
       CMMW    D0,JB.MEM(JOBLCL)
       REQ
       MOVW    D0,JB.MEM(JOBLCL)
       CRT     #12.
       CRT     ROW,#41.
       MOV     D0,D1
       BEQ     10$
       DCVT    5,OT$TRM!OT$ZER
       TYPE    K
       BR      20$
10$:    CRT     #11.
       TYPE    <  none>
20$:    JMP     ARROW

UPDRED: MOV     JOBDSR(JOBSYS),D0
       CMM     D0,JB.RED(JOBLCL)
       REQ
       MOV     D0,JB.RED(JOBLCL)
       CRT     #12.
       CRT     ROW,#48.
       MOV     D0,D1
       BEQ     10$
       DCVT    8.,OT$TRM!OT$ZER
       BR      20$
10$:    CRT     #11.
       TYPE    <    none>
20$:    JMP     ARROW

UPDWRT: MOV     JOBDSW(JOBSYS),D0
       CMM     D0,JB.WRT(JOBLCL)
       REQ
       MOV     D0,JB.WRT(JOBLCL)
       CRT     #12.
       CRT     ROW,#56.
       MOV     D0,D1
       BEQ     10$
       DCVT    8.,OT$TRM!OT$ZER
       BR      20$
10$:    CRT     #11.
       TYPE    <    none>
20$:    JMP     ARROW

UPDCPU: MOV     JOBCPU(JOBSYS),D1
       CMM     D1,JB.CPU(JOBLCL)
       REQ
       MOV     D1,JB.CPU(JOBLCL)
       LEA     A2,CPUHOLD(IMP)
       CALL    $OTCPU
       CLRB    @A2
       CRT     #12.
       CRT     ROW,#65.
       TTYL    CPUHOLD(IMP)
       JMP     ARROW

DEFINE  STATUS  BIT,NAME
       WORD    BIT
       ASCIZ   "'NAME"
       ENDM

STSTBL: STATUS  J.IOW,IOW
       STATUS  100000,RUN
       STATUS  J.MON,mon
       STATUS  J.TIW,tiw
       STATUS  J.TOW,tow
       STATUS  J.EXW,exw
       STATUS  J.SMW,smw
       STATUS  J.SLP,slp
       STATUS  J.FIL,lok
       STATUS  J.CCC,<^C >
       0

;update job arrow
ARROW:  TSTB    AROFLG(IMP)
       REQ
       CLR     D1
       CMMW    ROW,ACTJOB(IMP)
       REQ
       CRT     ROW,#75.
       CRT     #12.
       TTYI
       ASCIZ   " <--"
       EVEN
ZAPARW: CRT     ACTJOB(IMP),#75.
       TYPE    <    >
       MOVW    ROW,ACTJOB(IMP)
       RTN

;check for command
CMDCHK: TCKI                            ;char ready?
       RNE                             ; no
       KBD                             ; yes - put in D1
       AND     #177,D1                 ;mask to 7-bit ASCII
       UCS                             ;fold to upper case
       LEA     A0,CMDTBL               ;index command table
       MOV     #-2,D0
10$:    TSTB    @A0
       REQ
       ADD     #2,D0
       CMMB    (A0)+,D1
       BNE     10$
;       MOVB    D1,CHRSAV(IMP)          ; save the last KBD
       TJMP    D0
       OFFSET  QUIT                    ;^C  - exit
       OFFSET  BCKPAG                  ;^R  - back display page
       OFFSET  FWDPAG                  ;^T  - forward display page
       OFFSET  QUIT                    ;ESC - exit
       OFFSET  HOLD                    ;SPC - hold till next character
       OFFSET  HELP                    ;H   - help (command summary)
       OFFSET  RESET                   ;R   - restart display
       OFFSET  FAST                    ;F   - fast refresh
       OFFSET  MEDIUM                  ;S   - med. refresh [107 CF]
       OFFSET  SLOW                    ;S   - slow refresh
       OFFSET  S1                      ; multi speed refresh
       OFFSET  S2
       OFFSET  S3
       OFFSET  S4
       OFFSET  S5
       OFFSET  S6
       OFFSET  S7
       OFFSET  S8
       OFFSET  S9
       OFFSET  S0
       OFFSET  AROWON          ; [111 CF]
       OFFSET  AROWOF          ; [111 CF]
       OFFSET  QUIT            ; [111 CF]
       OFFSET  QUIT            ; [111 CF]

;back display page
BCKPAG: TSTW    JOBOFF(IMP)
       BEQ     CMDCHK
       REQ
       SUBW    #22.,JOBOFF(IMP)
       JMP     RESET

;forward display page
FWDPAG: MOVW    JOBOFF(IMP),D0
       ADD     #22.,D0
       CMMW    D0,JOBCNT(IMP)
       BLT     10$
       JEQ     CMDCHK
       RTN
10$:    MOVW    D0,JOBOFF(IMP)
       JMP     RESET

;hold display
HOLD:   CRT     #1,#67.
       CRT     #21.
       TYPE    < HOLD  >
       CRT     #22.
       KBD
       CRT     #1,#67.
       TYPE    <
>
       JMP     CMDCHK

;fast refresh
FAST:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #1000,SPEED(IMP)                ; [107 CF]
       JMP     CMDCHK                          ; [106 CF]

;medium refresh
MEDIUM:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #5000.,SPEED(IMP)               ; [107 CF]
       JMP     CMDCHK                          ; [107 CF]

;slow refresh
SLOW:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #50000.,SPEED(IMP)              ; [107 CF]
       JMP     CMDCHK                          ; [106 CF]

;var. refresh
S1:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #100000.,SPEED(IMP)             ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S2:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #80000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S3:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #60000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S4:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #40000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S5:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #30000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S6:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #20000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S7:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #10000.,SPEED(IMP)              ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S8:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD
       MOVL    #5000.,SPEED(IMP)               ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S9:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD                          ; [109 CF]
       MOVL    #1000.,SPEED(IMP)               ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

S0:
       MOVB    D1,CHRSAV(IMP)                  ; [109 CF]
       CALL    CHRUPD                          ; [109
       MOVL    #100.,SPEED(IMP)                ; [108 CF]
       JMP     CMDCHK                          ; [108 CF]

AROWON: MOVB    #-1,AROFLG(IMP)                 ; [111 CF]
       JMP     CMDCHK                          ; [111 CF]

AROWOF: MOVB    #0,AROFLG(IMP)                  ; [111 CF]
       JMP     CMDCHK                          ; [111 CF]

CHRUPD: CRT     #1,#77.
       MOVB    CHRSAV(IMP),D1
       TTY
       RTN


;help
HELP:   CRT     #0
       CRT     #12.
       CRLF
       TYPECR  <Super STAT Command summary>
       CRLF
       CRLF
       CRT     #12.
       TYPECR  <     display commands:>
       CRLF
       CRT     #11.
       TYPECR  <           H - help (Display this screen)>
       TYPECR  <           R - reset display>
       TYPECR  <           F - fast update> ; [104, FCF]
       TYPECR  <           M - med. update> ; [107, FCF]
       TYPECR  <           S - slow update> ; [104, FCF]
       TYPECR  <         1-0 - var. update> ; [108, FCF]
       TYPECR  <           A - arrow on>
       TYPECR  <           Z - zap the arrow>
       TYPECR  <      CTRL-R - back display page>
       TYPECR  <      CTRL-T - forward display page>
       TYPECR  <     [space] - suspend Super STAT>

       CRLF
       CRT     #12.
       TYPECR  <     exit commands:>
       CRLF
       CRT     #11.
       TYPECR  <      ctrl-C - exit to AMOS>
       TYPECR  <       [ESC] - exit to AMOS>

       CRT     #23.,#1
       TYPESP  Depress any key to continue:
       KBD
                                       ;fall thru to RESET
;restart display
RESET:  POP
       JMP     BCKGND

;clear screen, re-enable cursor, set high intensity, and exit
QUIT:   CRT     #0
       CRT     #28.
       CRT     #12.
       MOV     JOBCUR,A0               ;index own JCB
       MOVW    STATUS(IMP),JOBTYP(A0)  ;restore user's job flags

EXIT:   CRLF
       EXIT

PAGE
CMDTBL: BYTE    'C-'@,'R-'@,'T-'@,ESC
       ASCIZ   " HRFMS1234567890AZEQ"
       EVEN

DEFINE  MONTH   NAME
       ASCIZ   "'NAME"
       ENDM

MONTHS: MONTH   Jan
       MONTH   Feb
       MONTH   Mar
       MONTH   Apr
       MONTH   May
       MONTH   Jun
       MONTH   Jul
       MONTH   Aug
       MONTH   Sep
       MONTH   Oct
       MONTH   Nov
       MONTH   Dec

       END