;****************************************************************************
;*                                                                          *
;*                              UltraStat 3.x                               *
;*                       GENERAL-PURPOSE SUBROUTINES                        *
;*                                                                          *
;****************************************************************************
;Copyright (C) 1988, 1989 UltraSoft Corporation.  All Rights Reserved.
;
;Written by: David Pallmann
;
;All edit history for USTAT is in USYM.M68.

       ASMMSG  "== UltraStat 3.x (SUBROUTINES) =="
       AUTOEXTERN

;--- Include files

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM
       COPY    DSKINF.CPY
       COPY    USYM/L

;--- give up some CPU time so we don't hog the system

SNOOZE::
       AND     #^C<F$UPDATE>,FLAGS(MEM)
;;;;;   CURSOR  JOB.ARROW(MEM),ARROW.COL(MEM)   ; erase the
;;;;;   TYPE    <   >                           ;  old arrow
       MOV     DELAY(MEM),D0
       BEQ     20$
       CMPW    MODE(MEM),#M$DEV
       BNE     10$
       ADD     D0,D0                   ; double delay for DEV mode
10$:    SLEEP   #2500.                  ; sleep 1/4th of a second
       KEY     GET.COMMAND
       SOB     D0,10$
20$:    JMP     HEADER.SCAN             ; back to header

;--- Update job arrow - do this at the end of each job line update

ARROW:: CMPW    MODE(MEM),#M$JOB        ; in job display mode?
       JEQ     ARROW.JOB               ;  yes - handled separately
       TSTB    JOB.UPDATE(MEM)         ; did job arrow move?
       BEQ     20$                     ;  no
       CMMB    JOB.UPDATE(MEM),JOB.ARROW(MEM) ; is job arrow the same?
       BEQ     20$                     ;          yes
       TSTB    JOB.ARROW(MEM)          ; was there a previous arrow?
       BEQ     10$                     ;  no
       CURSOR  JOB.ARROW(MEM),ARROW.COL(MEM)   ; erase the
       TYPE    <   >                   ;  old arrow
10$:    MOVB    JOB.UPDATE(MEM),JOB.ARROW(MEM) ; set new arrow
       CLRB    JOB.UPDATE(MEM)         ; clear updated arrow
       CURSOR  JOB.ARROW(MEM),ARROW.COL(MEM)   ; draw the
       CALL    PLOT.ARROW
20$:    RTN

PLOT.ARROW:
       CURSOR  ROW(MEM),ARROW.COL(MEM) ;
       LOW
       FWHITE
       TTYI                            ;  new
       ASCIZ   "<--"                   ;  arrow
       EVEN
       FCYAN
       RTN

ARROW.JOB:
       CMPW    JB.STS(JIB),#1          ; RUN or IOW?
       BHI     10$                     ;  no
       CALL    PLOT.ARROW
       BR      20$
10$:    CURSOR  ROW(MEM),ARROW.COL(MEM) ;
       TYPE    <   >
20$:    RTN

;--- set low intensity

SET.LOW::
       BIT     #F$COLOR,FLAGS(MEM)     ; color?
       BNE     10$                     ;  yes - stay in high always
       BIT     #F$HIGH,FLAGS(MEM)
       BEQ     10$
       LO
       AND     #^C<F$HIGH>,FLAGS(MEM)
10$:    RTN

;--- set high intensity

SET.HIGH::
       BIT     #F$COLOR,FLAGS(MEM)     ; color?
       BNE     10$                     ;  yes - stay in high always
       BIT     #F$HIGH,FLAGS(MEM)
       BNE     10$
       HI
       OR      #F$HIGH,FLAGS(MEM)
10$:    RTN

;--- turn on cursor

SET.CURON::
       BIT     #F$ON,FLAGS(MEM)
       BNE     10$
       CON
       OR      #F$ON,FLAGS(MEM)
10$:    RTN

;--- turn off cursor

SET.CUROFF::
       BIT     #F$ON,FLAGS(MEM)
       BEQ     10$
       COFF
       AND     #^C<F$ON>,FLAGS(MEM)
10$:    RTN

;--- set graphics mode

SET.GRAFIX::
       BIT     #F$GRAFIX,FLAGS(MEM)
       BNE     10$
       GMODE
       OR      #F$GRAFIX,FLAGS(MEM)
10$:    RTN

;--- set text mode

SET.TEXT::
       BIT     #F$GRAFIX,FLAGS(MEM)
       BEQ     10$
       TMODE
       AND     #^C<F$GRAFIX>,FLAGS(MEM)
10$:    RTN

;--- compare string @A0 to string @A1 - set Z bit if identical

CMPSTR::
       TSTB    @A0
       BNE     10$
       TSTB    @A1
       BNE     20$
       LCC     #PS.Z
       RTN
10$:    CMMB    (A0)+,(A1)+
       BEQ     CMPSTR
20$:    LCC     #0
       RTN

;--- display mini-help on line 24 or on status line

LINE24::
       LOW
       BIT     #TD$STS,TERM.FLAGS(MEM)
       BNE     LINE25
       CURSOR  #24.,#1
       BCALL   HLPOUT
       CLREOL
       RTN
LINE25: BIT     #F$STATUS,FLAGS(MEM)    ; did we set status line yet?
       RNE                             ;  yes - no need to do it again
       OR      #F$STATUS,FLAGS(MEM)    ; set status bit for next time
       STSLIN
       TYPESP                          ; select column 1
       BCALL   HLPOUT
       ENDLIN
       RTN

HLPOUT: FWHITE                          ; white fgd
       BIT     #F$OPR,FLAGS(MEM)
       BEQ     110$
       CMPW    MODE(MEM),#M$JOB
       BNE     110$
       TTYL    OPR.HELP
       RTN
110$:   TTYL    SHORT.HELP
       RTN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                           ;
;                                  PPNERZ                                   ;
;             Translate device, drive, and PPN into ersatz name             ;
;                                                                           ;
;       Entry:  A2 - buffer to return ersatz name (e.g. xxxxxx:)            ;
;               A0 - device/drive/PPN to locate (3 words)                   ;
;                                                                           ;
;       Exit:    Z - set to 1 if found, 0 if not defined                    ;
;               A0 - updated by 3 words                             ;
;                                                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PPNERZ::
       SAVE    A0-A1,A3-A5,D0-D5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;       SEARCH FOR ACCOUNT IN ERSATZ TABLE
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SEARCH: MOV     ERSATZ,D7               ; get addr of ersatz table
       JEQ     PPNERR                  ;  is none
       MOV     D7,A3                   ; put in addr reg
10$:    TST     @A3                     ; end of table?
       JEQ     PPNERR                  ;  yes - couldn't find ersatz name
       CMMW    EZ.DEV(A3),@A0          ; same device?
       BNE     20$                     ;  no
       CMMW    EZ.UNT(A3),2(A0)        ; same drive?
       BNE     20$                     ;  no
       CMMW    EZ.PPN(A3),4(A0)        ; same PPN?
       BEQ     FOUND                   ;  yes
20$:    ADD     #EZ.SIZ,A3              ;  no - point to next table entry
       BR      10$                     ; loop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;       FOUND ACCOUNT - RETURN ERSATZ NAME
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

FOUND:  LEA     A1,EZ.NAM(A3)
       UNPACK
       UNPACK
10$:    CMMB    -(A2),#40
       BEQ     10$
       INC     A2
       MOVB    #':,(A2)+

PPNRTN: REST    A0-A1,A3-A5,D0-D5
       LCC     #PS.Z
       RTN

PPNERR: REST    A0-A1,A3-A5,D0-D5
       LCC     #0
       RTN

;***************
;*  SET.COLOR  *
;***************
;Set foreground color to D1 if true color supported

SET.COLOR::
       BIT     #F$COLOR,FLAGS(MEM)
       BEQ     10$
       AND     #377,D1
       ADDW    #-2_8.,D1
       TCRT
10$:    RTN

       END