ASMB,R,Q,C * NAME: PARSE * SOURCE: 92071-18209 * RELOC: 92071-1X209 * PGMR: HLC,DJN * * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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 PARSE,6 92071-1X209 REV.2041 800409 ENT PARSE * EXT .ENTP,.ZPRV * * A EQU 0 B EQU 1 CMBUF NOP BFLEN NOP BUFR NOP PARSE NOP JSB .ZPRV SHARABLE DEF EXIT JSB .ENTP FETCH PARAMETER ADDRESSES DEF CMBUF LDA BUFR STA BUFR1 LDA CMBUF COMMAND BUFFER ADDRESS LDB BFLEN,I JSB PARS PARSE IT BUFR1 NOP PARSE BUFFER EXIT JMP PARSE,I DEF PARSE * * PARS IS A LOCAL VERSION OF THE SYSTEM ROUTINE PARS CONTAINED * IN THE MODULE SYCOM. * 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 RETN THEN CPA =D8 JMP RETN 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 RETN 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 "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 END