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