ASMB,R,Q,C
*     NAME:   SYCOM 
*     SOURCE: 92070-18149 
*     RELOC:  92070-16149 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM SYCOM,0  92070-16149  REV.1941  791022
      ENT $MESS,$MSEX,$PARS,$PB,$XS4,$XS5 
      ENT $TYPE,$ATTN,$XQLU,$P2 
      ENT $FIND,$LUDV,$XQC,$$SYC,$.SYC
* 
      EXT $RQP1,$RQP8,$RQP9 
      EXT $INER,$IOUP,$UNAS,$DOWN 
      EXT $XEQ,$LUT#,$LUTA,$DIOC
      EXT $NOID,$BUSY,$ALCS,$NOSM 
      EXT $BRRQ,$DNRQ,$DSRQ,$GORQ,$PRRQ 
      EXT $PSRQ,$SSRQ,$ILCM,.MVW
      EXT $XQSB,$NAME,$WRKS,$XSIO 
      EXT $WORK,$TREM,$LDRS,$ZZZZ 
      EXT $IOFL,$LDAB 
* 
A     EQU 0 
B     EQU 1 
* 
      HED  TERMINATE COMMAND (OF) 
OFRQ  JSB $FIND     FIND THE ID SEGMENT 
      STA $RQP1     SAVE STATUS 
      LDA $WRKS,I 
      IOR =B400     SET 'OF' BIT IN STATUS
      LDB $PB+9 
      SZB 
      CPB =AFL
      JMP STA       FLUSH OPTION
      CPB =AID
      JMP IDBIT 
      CPB =ADR
      RSS 
      JMP $INER     ILLEGAL OPTION
* 
      LDB $RQP1 
      SZB 
      JMP $BUSY     PROGRAM MUST BE DORMANT 
      LDB $WRKS 
      ADB =D2 
      LDB B,I 
      BLF,SLB 
      JMP $BUSY     MUST NOT BE IN THE TIME LIST
      LDB $WORK 
      ADB =D27
      LDB B,I 
      SZB,RSS 
      JMP $BUSY     MUST BE DISC-RESIDENT 
* 
IDBIT IOR =B2000    SET 'ID' BIT
STA   STA $WRKS,I   STORE NEW STATUS
* 
      LDB $WORK 
      JSB $TREM     REMOVE PROGRAM FROM TIME LIST 
      LDB $WORK 
      CPB $LDRS 
      JMP LDAB      ABORT LOAD OR SWAP
      LDA $RQP1 
      CPA =D2       IF NOT IO SUSPENDED,
      RSS 
      STB $ZZZZ       ABORT NOW 
FLUSH LDA $WORK 
      JSB $IOFL     FLUSH IO
      JMP $XEQ
* 
LDAB  JSB $LDAB     ABORT LOAD OR SWAP
      JMP FLUSH 
* 
* 
* 
      HED  UP COMMAND (UP)
UPRQ  EQU *         UP COMMAND
      JSB $LUDV     FIND DVT ADDRESS IN LU TABLE
      JSB $IOUP     SET DEVICE 'UP' 
      JMP $XEQ
* 
* 
$LUDV NOP           SET UP POINTERS TO DVT
      LDA $PB+5 
      SSA 
      CMA,INA 
      STA B         MAKE POSITIVE 
      CMA,INA,SZA,RSS 
      JMP $UNAS     LU ZERO IS UNASSIGNED 
      ADA $LUT# 
      SSA 
      JMP $INER     TOO BIG 
      ADB =D-1
      ADB $LUTA 
      LDB B,I       DVT ADDRESS IN B
      SZB,RSS 
      JMP $UNAS     PRINT 'UNASSIGNED'
      CLA,INA 
      JSB $DIOC     SET UP DVT POINTERS 
      JMP $LUDV,I 
* 
* 
      HED  EXECUTE COMMAND (XQ) 
XQRQ  EQU *         EXECUTE PROGRAM 
      JSB $XQSB     SCHEDULE THE PROGRAM IF DORMANT 
      DEF $PB+5     NAME
      DEF $P2,I     PARAMETER ADDRESSES 
$XQLU NOP 
      SZB,RSS 
      JMP $NOID     NOT FOUND 
      SSA 
      JMP $DOWN     'PROGRAM DISC DOWN' 
      SZA 
      JMP $BUSY     ALREADY SCHEDULED 
* 
      LDA $PB+8 
      SZA 
      JMP $XQC      PARAMETERS PASSED 
      INB 
      LDA $XQLU     PASS LU IN FIRST PARAMETER
      STA B,I 
* 
$XQC  LDB $WORK 
      JSB $ALCS     PASS THE STRING 
      SZB           NOT ENOUGH MEMORY EVER
      JMP $NOSM     NOT ENOUGH MEMORY NOW 
      JMP $XEQ      SUCCESSFUL, OR NO MEMORY EVER 
* 
$P2   DEF $PB+9 
      DEF $PB+13
      DEF $PB+17
      DEF $PB+21
      DEF $PB+25
* 
* 
$FIND NOP           START PROGRAM NAME MESSAGE
      JSB $NAME     FIND ID SEGMENT ADDRESS 
      DEF $PB+5 
      SZB,RSS 
      JMP $NOID     PRINT 'NO PROGRAM ID' 
      JMP $FIND,I 
* 
* 
* 
      HED  MESSAGE INPUT AND OUTPUT 
* 
* 
$ATTN NOP           SET BY TERMINAL DRIVER
* 
* 
* 
$TYPE EQU *         HAS KEY BEEN STRUCK ON TERMINAL?
      LDA $ATTN 
      SZA,RSS 
      JMP $XEQ      NO
      CLB 
      STB $ATTN 
      LDB ATNLU 
      SZB 
      JMP $XEQ      BUFFER IN USE 
      STB PRIO
      STB PRIO2 
      STA ATNLU 
      STA MSGLU     SAVE LU NUMBER
$XS4  JSB $XSIO     PROMPT/READ REQUEST 
ATNLU DEC 0         LU - BUSY FLAG
      DEF TYP10     COMPLETION ADDRESS
      NOP           LINKAGE 
      OCT 10401     READ WITH ECHO AND PROMPT 
IBUF  DEF TYBUF     READ BUFFER 
      DEC -80       80 CHARACTERS MAX 
      DEF PRMPT     PROMPT BUFFER 
      DEC -8        8 CHARACTERS
PRIO  DEC 0         PRIORITY/TRANSMISSION LOG 
      NOP           RESERVED
      JMP $XEQ      WAIT FOR INPUT
* 
TYP10 LDA ATNLU 
      STA $XQLU     TERMINAL LU 
      CLA 
      STA ATNLU     BUFFER AVAILABLE IF NO RESPONSE 
      LDA IBUF
      LDB PRIO      TRANSMISSION LOG
      JSB $MESS     PROCESS MESSAGE 
      STA MSGLN     LENGTH OF RESPONSE
      STA ATNLU     BUFFER IN USE 
$XS5  JSB $XSIO     WRITE REQUEST 
MSGLU DEC 0         LU
      DEF TYP20     COMPLETION ADDRESS
      NOP           LINKAGE 
      DEC 2         WRITE REQUEST 
      DEF TYBUF     BUFFER
MSGLN DEC 0         MESSAGE LENGTH
      NOP           NO 'Z' BUFFER 
      NOP           NO 'Z' BUFFER 
PRIO2 NOP           PRIORITY/TRANSMISSION LOG 
      NOP           RESERVED
      JMP $XEQ      WAIT FOR OUTPUT 
* 
TYP20 CLA 
      STA ATNLU 
      JMP $XEQ
* 
TYBUF BSS 40        TERMINAL I/O BUFFER 
* 
PRMPT ASC 4,RTE-L: _   SYSTEM PROMPT
* 
      HED  SYSTEM COMMAND PROCESSOR 
* 
$MESS NOP           MESSAGE PROCESSOR 
      STA $RQP8     STRING BUFFER ADDRESS 
      STB $RQP9     STRING BUFFER LENGTH
      JSB $PARS     PARSE THE REQUEST 
      DEF $PB       ADDRESS OF PARAMETER BUFFER 
      SPC 2 
* 
*        THIS SECTION CHECKS THE OPERATOR REQUEST CODE AGAINST THE
*    LEGAL REQUEST CODES AND JUMPS TO THE PROPER PROCESSOR. 
* 
* 
      LDA $PB+1 
      CPA =ABR
      JMP $BRRQ 
      CPA =ADN
      JMP $DNRQ 
      CPA =ADS
      JMP $DSRQ 
      CPA =AEX
      JMP $XEQ      NO ACTION 
      CPA =AGO
      JMP $GORQ 
      CPA =AOF
      JMP OFRQ
      CPA =APR
      JMP $PRRQ 
      CPA =APS
      JMP $PSRQ 
      CPA =ARU
      JMP XQRQ
      CPA =ASS
      JMP $SSRQ 
      CPA =AUP
      JMP UPRQ
      CPA =AXQ
      JMP XQRQ
      JMP $ILCM     PRINT 'ILLEGAL COMMAND' 
* 
* 
*     CALLING SEQUENCE: 
*     JSB $MSEX 
*     DEC -2N 
*     ASC N,XXXXXXXXX 
* 
* 
$MSEX NOP           MOVE RESPONSE TO OUTPUT BUFFER
      LDB $MSEX,I 
      BRS 
      CMB,INB 
      STB $RQP9     POSITIVE NUMBER OF WORDS
      LDB $RQP8 
      LDA $MSEX 
      INA 
      JSB .MVW      MOVE WORDS
      DEF $RQP9 
      NOP 
      LDA $MSEX,I   NEGATIVE NUMBER OF CHARACTERS 
      JMP $MESS,I   DONE
      HED PARSE SUBROUTINE FOR OPERATOR MESSAGES
*     CALLING SEQUENCE: 
*     LDA BUFFER ADDRESS
*     LDB CHARACTER COUNT 
*     JSB $PARS 
*     DEF PRAM BUFFER 
*     -RETURN-
* 
*     THE PRAM BUFFER IS 33 WORDS LONG AND CONTAINS UP TO 8 
*     PRAMETER DESCRIPTERS FOLLOWED BY THE PRAMETER COUNT.
* 
*     EACH PARAMETER DESCRIPTER CONSISTS OF FOUR WORDS: 
* 
*     WORD          MEANING 
*     1             FLAG WORD 0=NULL PRAMETER 
*                             1=NUMERIC PRAMETER
*                             2=ASCII PRAMETER
*     2             0 IF NULL,VALUE IF NUMERIC,ASCII(1,2) IF ASCII
*     3             0 IF NOT ASCII ELSE ASCII(3,4)
*     4             0 IF NOT ASCII ELSE ASCII(5,6)
* 
*                                   TEMP USAGE IN PARSE SECTION:
* 
*                                   BUFAD = CHARACTER ADDRESS 
*                                   TYPE  = PARAMETER FLAG ADDRESS
*                                   FETCH = BUFFER FETCH ADD. 
*                                   STORE = BUFFER STORE ADD. 
*                                   BUFEN = LAST INPUT CHAR.+1 ADD. 
*                                   BASE  = RADIX (8 OR 10) 
*                                   TBUF  = DEF CHARS (6 LOCATIONS) 
*                                   TBUFS = DEF CHARS+7 
*                                   STOP  = DEF CHARS+6 
*                                   CHARS = 6 UNPACKED CHARACTERS 
*                                   PRCNT = PARAM COUNT ADDRESS 
* 
$PARS NOP 
      CLE,ELA       MAKE CHARACTER ADDRESS
      STA BUFAD     SET BUFFER CHAR ADD.
      ADA B         COMPUTE END ADDRESS.
      STA BUFEN     AND SET IT. 
      LDB =D-32     CLEAR PARAMETER AREA
      STB TYPE
      LDB $PARS,I 
      CLA 
CLEAR STA B,I 
      INB 
      ISZ TYPE
      JMP CLEAR 
* 
      STA B,I       CLEAR THE PRAM COUNT
      STB PRCNT     SET ADDRESS OF PRAM COUNT 
PARLP LDA TBUF
      STA FETCH 
      STA STORE 
* 
UNPAK JSB GET       GET THE NEXT CHARACTER
      CPA =B40     CHECK IF BLANK CHARACTER 
      JMP UNPAK    YES, SO SKIP CHARACTER 
      CPA =B72
      JMP SKIP      COLON, SKIP TO NEXT COMMA 
      LDB STORE     CHECK IF 6 CHARACTERS IN PRAM 
      CPB TBUFS     IF SO 
      JMP UNPAK     SKIP STORE
      STA STORE,I   STORE THE CHARACTER 
      STA LASTC     SAVE THE LAST CHARACTER 
      ISZ STORE     STEP FOR NEXT CHAR. 
* 
      JMP UNPAK     GO TO PROCESS NEXT CHARACTER
* 
*                                   ATTEMPT NUMERIC CONVERSION OF PRAM. 
* 
NUMBR LDA PRCNT,I   FIRST SET UP POINTERS 
      RAL,RAL       TAKE 4 TIMES THE PRAM NUMBER
      ADA $PARS,I   PLUS THE OP CODE ADDRESS-1
      STA TYPE      SET FLAG ADDRESS
      CLE,INA       ONE MORE AND WE HAVE
      STA VALOC     THE PRAMETER VALUE LOCATION 
      LDA STORE     IF NO CHARACTERS
      CPA TBUF      INPUT 
      JMP BUMP      GO TRY NEXT ONE 
* 
*                                   NOW TRY FOR A NUMBER
* 
      ISZ TYPE,I    SET FLAG TO 1 FOR NUMBER
      LDB FETCH,I   GET FIRST CHAR
      CPB DASH       MINUS SIGN?
      ISZ FETCH      YES, INCRE TO NEXT CHAR
      CPA FETCH     (A) STILL = STORE 
      JMP ASCII     IF "-" WAS ONLY CHAR, THEN ASCII
* 
      LDB =D10      SET UP CONVERSION BASE
      LDA LASTC 
      CPA "B"       IF B SUFFIX 
      LDB =D8        SET FOR BASE 8 
      STB BASE      SET BASE
DIGIT MPY VALOC,I   BUMP THE CURRENT VALUE
VALOC EQU *-1 
      LDB FETCH,I   GET THE NEXT CHAR.
      ADB =D-58     IF GREATER THAN "9" 
      SEZ           THEN NOT A NUMBER 
      JMP ASCII 
      ADB =D10      IF LESS THAN "0"
      SEZ,RSS       THEN
      JMP ASCII     NOT A NUMBER
      CLE 
      ADA B         ACCUMULATE THE
      STA VALOC,I   NUMBER
      ISZ FETCH     STEP THE BUFFER ADDRESS 
      LDA BASE      GET THE BASE
      LDB FETCH     AND THE NEXT CHAR. LOC. TO B
      CPB STORE     IF END THEN 
      JMP NEGCH     GO TO NEXT PRAM 
* 
      INB           IF BASE 8 CONVERSION
      CPB STORE     AND LAST
      CPA =D10      CHAR. THEN DONE SO SKIP 
      JMP DIGIT     ELSE GO GET THE NEXT ONE
* 
      SPC 1 
NEGCH LDB VALOC,I   GET VALUE 
      LDA TBUF,I    IF NEG NUMBER,
      CPA DASH
      CMB,INB        NEGATE VALUE 
      STB VALOC,I   STORE VALUE 
* 
BUMP  ISZ PRCNT,I   COUNT THE PRAMETER
      LDA PRCNT,I   IF
      LDB BUFEN      EOL OR 
      CPB BUFAD       8 PRAMS LINE
      JMP EXIT          THEN
      CPA =D8 
      JMP EXIT           GO PROCESS 
      JMP PARLP     ELSE GO GET NEXT CHARACTER
      SPC 1 
ASCII ISZ TYPE,I    SET NOT NUMBER FLAG 
      LDA =A        FILL THE PRAM WITH BLANKS 
      LDB VALOC     PRAM ADDRESS TO B 
      INB           DON'T WORRY ABOUT FIRST WORD
      STA B,I       SET SECOND WORD 
      CLE,INB       STEP TO THIRD WORD
      STA B,I       SET THIRD WORD TO DOUBLE BLANK. 
      LDB TBUF      GET THE CHAR BUFFER POINTER 
ASCLP CPB STORE     END OF INPUT? 
      JMP BUMP      YES GO PROCESS NEXT PRAM
      CPB STOP      SIXTH CHAR YET? 
      JMP BUMP       YES, END PARAM 
      LDA B,I       GET THE CHARACTER 
      SEZ,RSS       IF UPPER CHARACTER
      ALF,SLA,ALF   ROTATE AND SKIP 
      XOR VALOC,I   LOWER ADD THE UPPER CHAR. 
      XOR =B40      ADD/DELETE THE LOWER BLANK
      STA VALOC,I   STORE THE PACKED WORD 
      SEZ           SKIP IF UPPER 
      ISZ VALOC     ELSE STEP STORE ADDRESS.
      CME,INB       TOGGLE FLAG AND BUMP FETCH ADDRESS
      JMP ASCLP     GO GET OTHER CHAR.
      SPC 2 
EXIT  ISZ $PARS     STEP RETURN ADDRESS 
      JMP $PARS,I   RETURN
* 
SKIP  JSB GET       GET NEXT CHARACTER
      JMP SKIP      LOOP UNTIL COMMA OR END OF BUFFER 
* 
GET   NOP           GET NEXT CHARACTER
      LDB BUFAD 
      CPB BUFEN 
      JMP NUMBR     END OF BUFFER, GO PROCESS PARAMETER 
      ISZ BUFAD 
      CLE,ERB       WORD ADDRESS
      LDA B,I 
      SEZ,RSS 
      ALF,ALF       HIGH BYTE 
      AND =B377 
      CPA =B54
      JMP NUMBR     COMMA, GO PROCESS 
      JMP GET,I 
      SPC 2 
$PB   BSS 33        PARSE BUFFER
"B"   OCT 102       ASCII "B" 
DASH  OCT 55        ASCII "-" 
TYPE  NOP 
FETCH NOP 
STORE NOP 
BUFAD NOP 
BUFEN NOP 
PRCNT NOP 
TBUF  DEF CHARS 
STOP  DEF CHARS+6 
TBUFS DEF CHARS+7 
CHARS BSS 6 
LASTC NOP 
BASE  NOP 
* 
$$SYC EQU *         STANDARD MODULE 
$.SYC DEC 0         STANDARD MODULE 
* 
      END 
                                                                                                                                                                                                      