;*************************** AMUS Program Label ******************************
; Filename: PROGS.SBR                                       Date: 12/12/90
; Category: UTIL         Hash Code: 655-435-373-670      Version: 1.1(101)
; Initials: ULTR/US      Name: DAVID PALLMANN
; Company: ULTRASOFT CORPORATION                   Telephone #: 5163484848
; Related Files:
; Min. Op. Sys.: AMOSL 1.3B/AMOS32 1.0         Expertise Level: BEG
; Special:
; Description: Return program names (and, optionally, job names) to BASIC
!*****************************************************************************
;****************************************************************************
;*                                                                          *
;*                                PROGS.SBR                                 *
;*   AlphaBASIC XCALL to return program names of all jobs on the system     *
;*                                                                          *
;****************************************************************************
;Copyright (C) 1990 UltraSoft Corporation.  All Rights Reserved.
;
;       MAP1 JOB'COUNT, F, 6
;       MAP1 PROG'NAME(x), S, 6
;       MAP1 JOB'NAME(x), S, 6                  <- optional
;               ...
;       XCALL PROGS, JOB'COUNT, PROG'NAME(1) {,JOB'NAME(1)}
;
;       sets JOB'COUNT to the number of jobs on the system
;       returns PROG'NAME(1) through PROG'NAME(JOB'COUNT) with program names
;
;       if specified, JOB'NAME(1) through JOB'NAME(JOB'COUNT) receives the
;       name of each job.  This third parameter is optional.
;
;Written by: David Pallmann
;
;Edit History:
;1.0(100)  29-Aug-90  created. /DFP
;1.1(101)  12-Dec-90  add optional third argument to return job names. /DFP

       VMAJOR  =1
       VMINOR  =1
       VSUB    =0
       VEDIT   =101.
       VWHO    =0

       OBJNAM  .SBR

       SEARCH  SYS
       SEARCH  SYSSYM

;XCALL argument list - indexed by A3

       .OFINI
       .OFDEF  X.ARGS, 2               ; number of arguments
       .OFDEF  X.TYP1, 2               ; arg 1 - type code
       .OFDEF  X.ADR1, 4               ;       - address
       .OFDEF  X.SIZ1, 4               ;       - size
       .OFDEF  X.TYP2, 2               ; arg 2 - type code
       .OFDEF  X.ADR2, 4               ;       - address
       .OFDEF  X.SIZ2, 4               ;       - size
       .OFDEF  X.TYP3, 2               ; arg 3 - type code             [101]
       .OFDEF  X.ADR3, 4               ;       - address               [101]
       .OFDEF  X.SIZ3, 4               ;       - size                  [101]

;XCALL variable types

       .OFINI
       .OFDEF  X.UNF,  2               ; binary
       .OFDEF  X.STR,  2               ; string
       .OFDEF  X.FLT,  2               ; float
       .OFDEF  X.BIN,  2               ; unformatted

       X.ARY   =16.

;***********
;*  START  *
;***********

START:  PHDR    -1,0,PH$REE!PH$REU      ; program header

;check validity of arguments

CHECK:  CMPW    X.ARGS(A3),#2           ; 2 or more arguments supplied? [101]
       JLO     CNTERR                  ;   no - error                  [101]
       CMPW    X.TYP1(A3),#X.FLT       ; arg 1 floating point?
       JNE     TYPERR                  ;   no - error

       MOVW    X.TYP2(A3),D7           ; get 2nd argument type
       ANDW    #^C<X.ARY>,D7           ; clear array bit
       CMPW    D7,#X.STR               ; arg 2 string?
       JNE     TYPERR                  ;   no - error

       CMPW    X.ARGS(A3),#3           ; are there 3 arguments?
       BLO     10$                     ;   no
       MOVW    X.TYP3(A3),D7           ; get 3rd argument type
       ANDW    #^C<X.ARY>,D7           ; clear array bit
       CMPW    D7,#X.STR               ; arg 3 string?
       JNE     TYPERR                  ;   no - error
       MOV     X.ADR3(A3),A4           ; set index A4

;index job table, initialize job count, and set index to array

10$:    MOV     JOBTBL,A0               ; index jobn table
       CLR     D5                      ; clear job count
       MOV     X.ADR2(A3),A2           ; index return array

;main loop of program

LOOP:   MOV     (A0)+,D7                ; get next JCB address
       BEQ     LOOP                    ; deallocated job
       CMP     D7,#-1                  ; end of job table?
       JEQ     RETURN                  ;   yes
       MOV     D7,A6                   ;
       INC     D5                      ; update job count

;check for job at AMOS command level

       MOV     A6,D4                   ; save JCB address for later
       MOVW    JOBSTS(A6),D6           ; get job status
       ANDW    #J.MON,D6               ; at AMOS command level?
       BNE     CLRPRG                  ;   yes - return empty string

;convert program name to ASCII

       LEA     A1,JOBPRG(A6)           ; index program name
       UNPACK                          ; return
       UNPACK                          ;   program name
       CALL    TRIM                    ; remove trailing spaces        [101]
       BR      CHKJOB                  ;                               [101]

;job is at AMOS - clear program name                                    [101]

CLRPRG: MOV     #6-1,D6                 ;                               [101]
10$:    CLRB    (A2)+                   ;                               [101]
       DBF     D6,10$                  ;                               [101]

;if a third argument was specified, also return job name

CHKJOB: CMPW    X.ARGS(A3),#3           ; 3rd argument specified?       [101]
       JLO     LOOP                    ;   no                          [101]

;convert job name to ASCII

       SAVE    A2                      ; save registers                [101]
       MOV     A4,A2                   ; set-up A2 for UNPACKing       [101]
       MOV     D4,A6                   ; restore JCB address           [101]
       LEA     A1,JOBNAM(A6)           ; index program name            [101]
       UNPACK                          ; return                        [101]
       UNPACK                          ;   program name                [101]
       CALL    TRIM                    ; remove trailing spaces        [101]
       MOV     A2,A4                   ; put back in A4 so we remember [101]
       REST    A2                      ; restore registers             [101]

       JMP     LOOP                    ;                               [101]

;pass back job count and return to BASIC program

RETURN: MOV     X.ADR1(A3),A0           ; return
       FLTOF   D5,@A0                  ;   job count
       RTN                             ; return

;error handling

CNTERR: TYPESP  ?Argument count         ;
       BR      ERROR                   ;

TYPERR: TYPESP  ?Argument type          ;

ERROR:  TYPECR  error in PROGS.SBR      ;
       RTN                             ;

;**********
;*  TRIM  *
;**********
;remove trailing spaces from 6-character string just output to buffer @A2

TRIM:   MOV     #6,D6                   ;
       MOV     A2,A6                   ;
5$:     CMPB    -1(A6),#40              ;
       BNE     7$                      ;
       CLRB    -(A6)                   ;
       SOB     D6,5$                   ;
7$:     BR      30$                     ;
10$:    MOV     #6,D6                   ;
20$:    CLRB    (A2)+                   ;
       SOB     D6,20$                  ;
30$:    RTN                             ;

       END