LS-DOS 6.3.1 - LBDO Assembly Listing (HTML format version)

[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

MISOSYS EDAS-4.3 04/11/99 00:18:23 DO - LS-DOS 6.2              Page 00001 

              00001 ;LBDO/ASM - Library 'DO' command
              00003 ;
00C0          00004 JFCB$   EQU     0C0H            ;Low core EQU*
              00005 ;
              00006 ;
0000          00007 SMALL   EQU     0
000D          00008 CR      EQU     13
0000          00009 *GET    BUILDVER/ASM:3
              00010 ;
              00011 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00012 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00013 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00014 ;       for programs that can use that.
              00015 ;
FFFF          00016 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00017 ;       These switches activate patches made since the 1B release.
              00018 ;       It is important that all earlier patches be enabled when a higher
              00019 ;       patch is enabled.
              00020 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00021 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00022 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00023 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00024 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00025 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00026 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00027 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00028 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00029 ;
              00030 ;End of BUILDVER/ASM
0000          00031 *GET    SVCMAC:3                ;SVC Macro equivalents
              00032 ;SVCMAC/ASM - LS-DOS Version VI
              00033 *LIST   OFF
              00425 *LIST   ON
              00427 ;
2400          00428         ORG     2400H
              00429 ;
2400          00430 DO      EQU     $
              00431 ;
              00432 ;       Note: The first 80 bytes (until PARSINP) are
              00433 ;       Used as a line buffer during processing.
              00434 ;
2400          00435 JCLBUF2 EQU     $
2400 ED738229 00436         LD      (SPSAV+1),SP    ;Save stack pointer
              00437 ;
              00438         IF      SMALL
              00439         JR      NOCPLS          ;No compile if Small
              00440         ENDIF
2404 228024   00441         LD      (INBUF+1),HL    ;Save start of command
              00442 ;
              00443 *LIST   OFF
              00445 *LIST   ON
2407          00446         @@FLAGS                 ;Get flag table pointer
2407+3E65     00447         LD      A,101
2409+EF       00448         RST     40
240A 7E       00449         LD      A,(HL)
240B FE2A     00450         CP      '*'             ;Execute last DO file?
240D CAFE24   00451         JP      Z,NOCPL2
2410 FE3D     00452         CP      '='             ;Execute without compile?
2412 CAEA24   00453         JP      Z,NOCPL
2415 FE24     00454         CP      '$'             ;Compile only?
2417 200A     00455         JR      NZ,GETSPEC
2419 32C624   00456         LD      (NOEXEC?+1),A
241C 23       00457         INC     HL
241D 7E       00458         LD      A,(HL)
241E FE20     00459         CP      ' '             ;Bypass space separator
2420 2001     00460         JR      NZ,GETSPEC      ;  if present
2422 23       00461         INC     HL
2423 118C29   00462 GETSPEC LD      DE,DOFCB        ;Get DO filespec
2426          00463         @@FSPEC
2426+3E4E     00464         LD      A,78
2428+EF       00465         RST     40
2429 C25129   00466         JP      NZ,SPCREQ       ;Go if bad/missing filespec
242C E5       00467         PUSH    HL              ;Save INBUF$ pointer
              00468         IF      @BLD631
242D CD8529   00469         CALL    DOFEXT          ;<631>Default ext to "/JCL"
              00470         ELSE
              00471         LD      HL,SYSJCL+7     ;Default ext to "/JCL"
              00472         @@FEXT
              00473         ENDIF
2430 21002C   00474         LD      HL,INPBUF       ;Open DO file
2433 45       00475         LD      B,L             ;LRL=256
2434 FDCB12C6 00476         SET     0,(IY+'S'-'A')  ;Inhibit file open bit
2438          00477         @@OPEN
2438+3E3B     00478         LD      A,59
243A+EF       00479         RST     40
243B C24629   00480         JP      NZ,IOERR        ;Jump on open error
              00481         IF      @BLD631
243E 0EFF     00482         LD      C,0FFH          ;<631>
2440 0C       00483 L2440:  INC     C               ;<631>
2441 79       00484         LD      A,C             ;<631>
2442 FE08     00485         CP      08H             ;<631>
2444 D26529   00486         JP      NC,DSKFUL       ;<631>
2447          00487         @@CKDRV                 ;<631>
2447+3E21     00488         LD      A,33
2449+EF       00489         RST     40
244A 20F4     00490         JR      NZ,L2440        ;<631>
244C 38F2     00491         JR      C,L2440         ;<631>
244E 79       00492         LD      A,C             ;<631>
244F C630     00493         ADD     A,'0'           ;<631>
              00494         IF      @BLD631G
2451 CDAC2A   00495         CALL    P631G1          ;<631G>
              00496         ELSE
              00497         LD      (DRVNUM),A      ;<631>Set drive number in filespec
              00498         ENDIF
              00499         ENDIF
2454 CD0325   00500         CALL    MOVFCB          ;Move SYSTEM/JCL into FCB
2457 11C000   00501         LD      DE,JFCB$        ;Init FCB pointer
245A 21002D   00502         LD      HL,OUTBUF
245D          00503         @@INIT
245D+3E3A     00504         LD      A,58
245F+EF       00505         RST     40
2460 C26529   00506         JP      NZ,DSKFUL       ;Jump on error
2463 E1       00507         POP     HL              ;Rcvr pointer to INBUF$
              00508 ;
              00509 ;       Routine to parse a command line
              00510 ;
2464 7E       00511 PARSINP LD      A,(HL)          ;P/u line char
2465 FE0D     00512         CP      CR              ;End of line?
2467 CA5625   00513         JP      Z,TSTLBL
246A 23       00514         INC     HL              ;Bump pointer
246B CD3629   00515         CALL    CKSPCOM         ;Ignore spaces & commas
246E 28F4     00516         JR      Z,PARSINP
2470 FE28     00517         CP      '('             ;Beginning of parms?
2472 CA0F25   00518         JP      Z,PARAM
2475 FE3B     00519         CP      ';'             ;Line continuation?
2477 C26929   00520         JP      NZ,PRMERR
247A 0E3F     00521         LD      C,'?'           ;Prompt for line continue
247C          00522         @@DSP
247C+3E02     00523         LD      A,2
247E+EF       00524         RST     40
247F 210000   00525 INBUF   LD      HL,$-$          ;Input continuation line
2482 2D       00526         DEC     L               ;Backup to start
2483 2D       00527         DEC     L
2484 01004F   00528         LD      BC,79<8         ;Max 79 chars input
2487          00529         @@KEYIN
2487+3E09     00530         LD      A,9
2489+EF       00531         RST     40
248A DA6929   00532         JP      C,PRMERR        ;Jump if break
248D          00533         @@LOGER                 ;Log the line
248D+3E0B     00534         LD      A,11
248F+EF       00535         RST     40
2490 18D2     00536         JR      PARSINP         ;Go parse it
              00537 ;
              00538 ;       Routine to move to higher level nest
              00539 ;
2492 2ACC2A   00540 UNNEST  LD      HL,(NESTPTR)    ;Shift the last nest's
2495 2B       00541         DEC     HL              ;  FCB into FCB area
2496 11AB29   00542         LD      DE,DOFCB+31
2499 012000   00543         LD      BC,32
249C EDB8     00544         LDDR
249E 23       00545         INC     HL
249F 22CC2A   00546         LD      (NESTPTR),HL    ;Reset current FCB ptr
24A2 118C29   00547         LD      DE,DOFCB        ;Reread last sector of
24A5          00548         @@RREAD                 ;  nested FCB
24A5+3E45     00549         LD      A,69
24A7+EF       00550         RST     40
              00551         IF      @BLD631
24A8 C8       00552         RET     Z               ;<631>
24A9 C34629   00553 NIOERR: JP      IOERR           ;<631>
              00554         ELSE
              00555         JP      NZ,IOERR
              00556         RET
              00557         ENDIF
              00558 ;
24AC 2ACC2A   00559 CKNEST  LD      HL,(NESTPTR)    ;P/u current FCB pointer
24AF 11CE2A   00560         LD      DE,NESTFCB      ;Is it the first nest?
24B2 AF       00561         XOR     A
24B3 ED52     00562         SBC     HL,DE
24B5 2806     00563         JR      Z,CPLFIN        ;Jump if so & exit
24B7 CD9224   00564         CALL    UNNEST          ;  processing
24BA C38C25   00565         JP      CPLJCL
              00566 ;
              00567 ;       Finished compilation - Close 'er up
              00568 ;
24BD 11C000   00569 CPLFIN  LD      DE,JFCB$        ;Close SYSTEM/JCL file
24C0          00570         @@CLOSE
24C0+3E3C     00571         LD      A,60
24C2+EF       00572         RST     40
              00573         IF      @BLD631
24C3 20E4     00574         JR      NZ,NIOERR       ;<631>
              00575         ELSE
              00576         JP      NZ,IOERR
              00577         ENDIF
24C5 3E00     00578 NOEXEC? LD      A,0             ;Set to non-zero on
24C7 B7       00579         OR      A               ;  compile only
24C8 210000   00580         LD      HL,0
24CB C0       00581         RET     NZ              ;Exit on compile only
              00582         ENDIF
              00583 *LIST   ON
              00584 ;
24CC 11C000   00585 CPLFIN1 LD      DE,JFCB$        ;Point to SYSTEM/JCL FCB
24CF 210000   00586         LD      HL,0            ;Correct bufptr later
24D2 45       00587         LD      B,L             ;LRL=256
24D3 FDCB12C6 00588         SET     0,(IY+'S'-'A')  ;Inhibit file open bit
24D7          00589         @@OPEN                  ;Open it up
24D7+3E3B     00590         LD      A,59
24D9+EF       00591         RST     40
              00592         IF      @BLD631
24DA 20CD     00593         JR      NZ,NIOERR       ;<631>Jump on error
              00594         ELSE
              00595         JP      NZ,IOERR        ;Jump on error
              00596         ENDIF
24DC ED4BC600 00597         LD      BC,(JFCB$+6)    ;Get SBUFF$
24E0          00598         @@DIRRD
24E0+3E57     00599         LD      A,87
24E2+EF       00600         RST     40
24E3 7C       00601         LD      A,H             ;Stuff high order to
24E4 32C400   00602         LD      (JFCB$+4),A     ;  use for JFCB$ buffer
24E7 3E9D     00603         LD      A,9DH           ;Call SYS11, entry 1
24E9 EF       00604         RST     28H
              00605 ;
              00606 ;       Process execution without compilation
              00607 ;
24EA 23       00608 NOCPL   INC     HL
24EB 7E       00609 NOCPLS  LD      A,(HL)          ;Bypass space separator
24EC FE20     00610         CP      ' '             ;  if present
24EE 28FA     00611         JR      Z,NOCPL
24F0 11C000   00612 NOCPL1  LD      DE,JFCB$        ;Fetch DO filespec
24F3          00613         @@FSPEC
24F3+3E4E     00614         LD      A,78
24F5+EF       00615         RST     40
24F6 C25129   00616         JP      NZ,SPCREQ       ;Jump on error
              00617         IF      @BLD631
24F9 CD8529   00618         CALL    DOFEXT          ;<631>
              00619         ELSE
              00620         LD      HL,SYSJCL+7     ;Default to /JCL
              00621         @@FEXT
              00622         ENDIF
24FC 18CE     00623         JR      CPLFIN1         ;Go execute file
              00624 ;
              00625 *LIST   OFF
              00627 *LIST   ON
24FE CD0325   00628 NOCPL2  CALL    MOVFCB          ;Execute SYSTEM/JCL
2501 18C9     00629         JR      CPLFIN1         ;  file
              00630 ;
2503 21E029   00631 MOVFCB  LD      HL,SYSJCL       ;Move SYSTEM/JCL into
2506 11C000   00632         LD      DE,JFCB$        ;  FCB area
              00633         IF      @BLD631
              00634 DOLDIR:                         ;<631>
              00635         ENDIF
2509 012000   00636         LD      BC,32
250C EDB0     00637         LDIR
250E C9       00638         RET
              00639 ;
              00640 ;       Found a parm entered
              00641 ;
250F CDF027   00642 PARAM   CALL    PARSNAM         ;Parse symbol -> current
2512 2014     00643         JR      NZ,PARAM1       ;Jump if bad symbol
2514 F5       00644         PUSH    AF              ;Save separator char
2515 3E00     00645 FNDLBL  LD      A,0             ;Test if a label
2517 B7       00646         OR      A               ;  was found
2518 2029     00647         JR      NZ,MOVLBL
251A CDBA28   00648         CALL    FINDSYM         ;Search symbol table
251D CA6D29   00649         JP      Z,MULDEF        ;Multiply defined if in
2520 CD9D28   00650         CALL    MOVNAME         ;Add symbol to table
2523 F1       00651         POP     AF              ;Recover separator
2524 FE3D     00652         CP      '='             ;Assignment?
2526 2811     00653         JR      Z,PARAM2
2528 CD3629   00654 PARAM1  CALL    CKSPCOM         ;Ck space or comma
252B 28E2     00655         JR      Z,PARAM
252D FE29     00656         CP      ')'             ;Exit parm scan on
252F CA6424   00657         JP      Z,PARSINP       ;  closing paren
2532 FE0D     00658         CP      CR              ;Also accept closing CR
2534 2820     00659         JR      Z,TSTLBL
2536 C36929   00660         JP      PRMERR          ;Else parm error
              00661 ;
2539 CDFB27   00662 PARAM2  CALL    PARSVAL         ;Parse value into buf
253C F5       00663         PUSH    AF              ;Save separator char
253D CDAF28   00664         CALL    MOVALUE         ;Symbol value into table
2540 F1       00665 GETSEP  POP     AF              ;Recover separator
2541 18E5     00666         JR      PARAM1          ;Loop
              00667 ;
2543 E5       00668 MOVLBL  PUSH    HL
2544 21AC29   00669         LD      HL,CURSYM       ;Pt to current sym buf
2547 11D529   00670         LD      DE,LBLSAV       ;  & save label for
254A 010800   00671         LD      BC,8            ;  later testing
254D EDB0     00672         LDIR
254F AF       00673         XOR     A               ;Turn off "found label"
2550 321625   00674         LD      (FNDLBL+1),A
2553 E1       00675         POP     HL              ;Rcvr line ptr
2554 18EA     00676         JR      GETSEP          ;Back for more
              00677 ;
              00678 ;       Got to end of JCL command line
              00679 ;
2556 3A5E28   00680 TSTLBL  LD      A,(GOTLBL+1)    ;Was @LABEL a parm?
2559 B7       00681         OR      A
255A 2830     00682         JR      Z,CPLJCL        ;If not, don't look
              00683 ;
              00684 ;       Find the procedure block named @LABEL
              00685 ;
255C CD6F26   00686 FINDLBL CALL    RDJCL           ;Read JCL line
255F 2811     00687         JR      Z,GOTLIN        ;Go if line read
2561 2ACC2A   00688         LD      HL,(NESTPTR)    ;See if nested
2564 11CE2A   00689         LD      DE,NESTFCB      ;  in an Include file
2567 AF       00690         XOR     A
2568 ED52     00691         SBC     HL,DE
256A CA5D29   00692         JP      Z,NOFIND        ;If not, lable not found
256D CD9224   00693         CALL    UNNEST          ;  else continue search
2570 18EA     00694         JR      FINDLBL
              00695 ;
2572 219E2B   00696 GOTLIN  LD      HL,JCLBUF1      ;Pt to start
2575 7E       00697         LD      A,(HL)          ;Is 1st char a label
2576 FE40     00698         CP      '@'             ;  indicator?
2578 20E2     00699         JR      NZ,FINDLBL      ;Back for more if not
              00700 ;
              00701 ;       Found a label - is it the one needed?
              00702 ;
257A 23       00703         INC     HL              ;Pt to 1st char
257B EB       00704         EX      DE,HL           ;Ptr to DE
257C 21D529   00705         LD      HL,LBLSAV
257F 010808   00706         LD      BC,808H         ;Symbol & field len =8
2582 CDE628   00707         CALL    FNDPRM          ;A match?
2585 20D5     00708         JR      NZ,FINDLBL      ;No match? look for next
2587 1803     00709         JR      CPLJCL          ;  else you're the one
              00710 ;
2589 CDA026   00711 CONDCPL CALL    TSTCOND
258C CD6F26   00712 CPLJCL  CALL    RDJCL           ;Read line from JCL file
258F C2AC24   00713         JP      NZ,CKNEST       ;Exit on end of file
2592 219E2B   00714         LD      HL,JCLBUF1      ;Parse the line just read
2595 110024   00715         LD      DE,JCLBUF2
2598 7E       00716         LD      A,(HL)
2599 23       00717         INC     HL
259A FE40     00718         CP      '@'             ;End procedure if found
259C CAAC24   00719         JP      Z,CKNEST        ;  another label
259F FE2F     00720         CP      '/'             ;Slash?
25A1 2004     00721         JR      NZ,CPLJCL1
25A3 BE       00722         CP      (HL)            ;Double slash?
25A4 CA4126   00723         JP      Z,MACRO         ;Jump on double slash
              00724 CPLJCL1
              00725 ;
              00726 ;       Modification for HEX parsing
              00727 ;
25A7 FE23     00728         CP      '#'             ;Substitution?
25A9 2825     00729         JR      Z,CPLJCL4
25AB FE25     00730         CP      '%'             ;Hex value?
25AD 2017     00731         JR      NZ,CPLJCL2      ;Back to take char if not
25AF CDB425   00732         CALL    CPLJCL7         ;Go test double %
25B2 1818     00733         JR      CPLJCL3
25B4 BE       00734 CPLJCL7 CP      (HL)            ;Double %?
25B5 2821     00735         JR      Z,CPLJCL6
25B7 CDDC25   00736         CALL    CVRTHEX         ;Convert digit
25BA 23       00737         INC     HL              ;Bump to next char
25BB 07       00738         RLCA
25BC 07       00739         RLCA
25BD 07       00740         RLCA
25BE 07       00741         RLCA                    ;Rotate into left nybble
25BF 4F       00742         LD      C,A             ;Save for now
25C0 CDDC25   00743         CALL    CVRTHEX         ;Convert 2nd digit
25C3 B1       00744         OR      C               ;Merge left nybble
25C4 1812     00745         JR      CPLJCL6
25C6 12       00746 CPLJCL2 LD      (DE),A          ;Nothing special, xfer
25C7 13       00747         INC     DE
25C8 FE0D     00748         CP      CR
25CA 28BD     00749         JR      Z,CONDCPL       ;Exit on end of line
25CC 7E       00750 CPLJCL3 LD      A,(HL)          ;Grab next input char
25CD 23       00751         INC     HL
25CE 18D7     00752         JR      CPLJCL1         ;  & loop
25D0 CDD525   00753 CPLJCL4 CALL    CPLJCL5         ;Ck on double '#'
25D3 18F7     00754         JR      CPLJCL3         ;Substitute if not ##
25D5 BE       00755 CPLJCL5 CP      (HL)            ;Double #?
25D6 2015     00756         JR      NZ,SUBSYM       ;Jump to substitute if
25D8 23       00757 CPLJCL6 INC     HL              ;  only single #
25D9 12       00758         LD      (DE),A          ;  else xfer the char
25DA 13       00759         INC     DE
25DB C9       00760         RET
              00761 ;
25DC 7E       00762 CVRTHEX LD      A,(HL)          ;P/u the digit
25DD D630     00763         SUB     30H             ;Start conversion
25DF 380A     00764         JR      C,CVRTHE1       ;Error if < 0
25E1 FE0A     00765         CP      10
25E3 D8       00766         RET     C               ;Go if 0-9
25E4 CBAF     00767         RES     5,A             ;In case l/c
25E6 D607     00768         SUB     7               ;Adjust A-F -> 10-15
25E8 FE10     00769         CP      16
25EA D8       00770         RET     C               ;Go if 10-15
25EB 183F     00771 CVRTHE1 JR      BADHDR
              00772 ;
              00773 ;       Symbol substitution routine
              00774 ;
25ED E5       00775 SUBSYM  PUSH    HL
25EE D5       00776         PUSH    DE
25EF CDF027   00777         CALL    PARSNAM         ;Parse symbol
25F2 FE23     00778         CP      '#'             ;Must have closing #
25F4 2036     00779         JR      NZ,BADHDR       ;Bad JCL format if not
25F6 E3       00780         EX      (SP),HL         ;Put new posn on stack
25F7 E5       00781         PUSH    HL              ;  and get HL=start posn
25F8 CDBA28   00782         CALL    FINDSYM         ;Get symbol value
25FB 200F     00783         JR      NZ,SUBSYM1      ;Bypass if not in table
25FD 1A       00784         LD      A,(DE)          ;Get symbol length
25FE B7       00785         OR      A
25FF 280B     00786         JR      Z,SUBSYM1       ;Bypass if zero length
2601 0600     00787         LD      B,0
2603 4F       00788         LD      C,A
2604 13       00789         INC     DE              ;Point to 1st symbol char
2605 E1       00790         POP     HL              ;Rcvr where we need to
2606 EB       00791         EX      DE,HL           ;  substitute then move
2607 EDB0     00792         LDIR                    ;  symbol value into pos
2609 E1       00793         POP     HL
260A F1       00794         POP     AF
260B C9       00795         RET
              00796 ;
260C D1       00797 SUBSYM1 POP     DE              ;Symbol not in table, so
260D F1       00798         POP     AF              ;  leave as is in the DO
260E E1       00799         POP     HL              ;  file.
260F 3E23     00800         LD      A,'#'           ;Starting #
2611 12       00801 SUBSYM2 LD      (DE),A
2612 13       00802         INC     DE              ;Inc buffer
2613 7E       00803         LD      A,(HL)          ;Get a char from line
2614 23       00804         INC     HL
2615 FE0D     00805         CP      CR              ;If a CR before closing #
2617 2813     00806         JR      Z,BADHDR        ;  abort
2619 FE23     00807         CP      '#'             ;End of substitution?
261B 20F4     00808         JR      NZ,SUBSYM2      ;Get more if not
261D 12       00809         LD      (DE),A
261E 13       00810         INC     DE
261F C9       00811         RET
              00812 ;
              00813 ;       Check if conditional is at top level
              00814 ;
2620 ED5B6E2B 00815 CKCOND  LD      DE,(CONDPTR)    ;P/u conditional pointer
2624 21702B   00816         LD      HL,CONDFLG      ;Test if still on 1st one
2627 AF       00817         XOR     A
2628 ED52     00818         SBC     HL,DE
262A EB       00819         EX      DE,HL           ;Pointer back to HL
262B C0       00820         RET     NZ              ;Ok if nested else error
              00821 ;
              00822 ;       Output invalid JCL format message
              00823 ;
262C 11952B   00824 BADHDR  LD      DE,BADHDR$+5    ;Show bad JCL line found
262F 2ADE29   00825         LD      HL,(LINENO)     ;Put decimal line #
2632          00826         @@HEXDEC                ;  into message
2632+3E61     00827         LD      A,97
2634+EF       00828         RST     40
2635 21902B   00829         LD      HL,BADHDR$      ;Display bad line #
2638          00830         @@LOGOT
              00831         IFEQ    00H,1
              00832         LD      HL,
              00833         ENDIF
2638+3E0C     00834         LD      A,12
263A+EF       00835         RST     40
263B 218C2A   00836 BADH1   LD      HL,BADJCL$      ;  and abort message
263E C37029   00837         JP      EXTERR
              00838 ;
              00839 ;       Compile "//" line
              00840 ;
2641 23       00841 MACRO   INC     HL
2642 CDF027   00842         CALL    PARSNAM         ;Get symbol name
2645 2015     00843         JR      NZ,MACRO2       ;Go if not JCL macro
2647 CDCB28   00844         CALL    CK4COND         ;Ck for IF, ELSE, END
264A D5       00845         PUSH    DE              ;Stack the routine entry
264B C8       00846         RET     Z               ;  & branch if found
264C D1       00847         POP     DE              ;  else remove RET &...
              00848 ;
              00849 ;       Test the conditional logic state
              00850 ;
264D ED5B6E2B 00851         LD      DE,(CONDPTR)    ;P/u conditional pointer
2651 1A       00852         LD      A,(DE)          ;  & conditional state
2652 B7       00853         OR      A
2653 C28C25   00854         JP      NZ,CPLJCL       ;Jump if logic FALSE
2656 CDD428   00855         CALL    CK4ASSN         ;Test for SET, RESET,
              00856                                 ;  ASSIGN, INCLUDE, QUIT
2659 D5       00857         PUSH    DE              ;Stack the routine entry
265A C8       00858         RET     Z               ;  & branch if found
265B D1       00859         POP     DE
265C 119E2B   00860 MACRO2  LD      DE,JCLBUF1      ;Point to where we left
265F AF       00861         XOR     A               ;  off and continue to
2660 ED52     00862         SBC     HL,DE           ;  parse the input line
2662 44       00863         LD      B,H             ;  from the JCL file
2663 4D       00864         LD      C,L
2664 219E2B   00865         LD      HL,JCLBUF1
2667 110024   00866         LD      DE,JCLBUF2
266A EDB0     00867         LDIR
266C C3CC25   00868         JP      CPLJCL3
              00869 ;
              00870 ;       Read a line from the JCL file
              00871 ;
266F 2ADE29   00872 RDJCL   LD      HL,(LINENO)     ;Bump line counter
2672 23       00873         INC     HL
2673 22DE29   00874         LD      (LINENO),HL
2676 219E2B   00875         LD      HL,JCLBUF1      ;Point to line buffer
2679 118C29   00876         LD      DE,DOFCB        ;Point to FCB
267C 0650     00877         LD      B,80            ;Permit only 80 chars
267E          00878 RDJCL1  @@GET                   ;Get a char
267E+3E03     00879         LD      A,3
2680+EF       00880         RST     40
2681 2014     00881         JR      NZ,RDJCL2       ;Jump on error
2683 B7       00882         OR      A
2684 2816     00883         JR      Z,RDJCL3        ;Bypass on null byte
2686 77       00884         LD      (HL),A          ;Xfer byte to line buf
2687 23       00885         INC     HL
2688 FE0D     00886         CP      CR              ;End of line?
268A C8       00887         RET     Z
268B 10F1     00888         DJNZ    RDJCL1          ;Loop if not
              00889 ;
              00890 ;       If falls through, line too long
              00891 ;
268D 360D     00892         LD      (HL),CR         ;Stuff CR & provide
268F 21002A   00893         LD      HL,LINLNG$      ;  error log message
2692 223C26   00894         LD      (BADH1+1),HL
2695 1895     00895         JR      BADHDR
              00896 ;
2697 FE1C     00897 RDJCL2  CP      1CH             ;EOF?
2699 C24629   00898         JP      NZ,IOERR        ;Jump on any other error
269C 3E1C     00899 RDJCL3  LD      A,1CH
269E B7       00900         OR      A
269F C9       00901         RET
              00902 ;
              00903 ;       Act on JCL line if conditional state = TRUE
              00904 ;
26A0 2A6E2B   00905 TSTCOND LD      HL,(CONDPTR)    ;Grab conditional pointer
26A3 7E       00906         LD      A,(HL)          ;Grab conditional state
26A4 B7       00907         OR      A
26A5 C0       00908         RET     NZ              ;Return if logic FALSE
26A6 210024   00909         LD      HL,JCLBUF2      ;Point to processed line
26A9 11C000   00910         LD      DE,JFCB$        ;SYSTEM/JCL FCB
26AC 7E       00911         LD      A,(HL)          ;Ck on double /
26AD FE2F     00912         CP      '/'
26AF 2010     00913         JR      NZ,WRCPLD       ;Done if not /
26B1 23       00914         INC     HL
26B2 BE       00915         CP      (HL)            ;Check for double /
26B3 2B       00916         DEC     HL
26B4 200B     00917         JR      NZ,WRCPLD       ;Jump if not //
26B6 3A0224   00918         LD      A,(JCLBUF2+2)   ;Ck on comment
26B9 FE2E     00919         CP      '.'             ;//. ?
26BB 2004     00920         JR      NZ,WRCPLD       ;Bypass if not comment
26BD          00921         @@DSPLY                 ;Else display the comment
              00922         IFEQ    00H,1
              00923         LD      HL,
              00924         ENDIF
26BD+3E0A     00925         LD      A,10
26BF+EF       00926         RST     40
26C0 C9       00927         RET
              00928 ;
              00929 ;       Write compiled line to SYSTEM/JCL
              00930 ;
26C1 4E       00931 WRCPLD  LD      C,(HL)          ;P/u a char
26C2          00932         @@PUT                   ;Put it out
26C2+3E04     00933         LD      A,4
26C4+EF       00934         RST     40
26C5 C24629   00935         JP      NZ,IOERR        ;Jump on error
26C8 7E       00936         LD      A,(HL)          ;Grab again to test
26C9 23       00937         INC     HL              ;Bump pointer
26CA FE0D     00938         CP      CR              ;End of line?
26CC 20F3     00939         JR      NZ,WRCPLD       ;Loop if not
26CE C9       00940         RET
              00941 ;
              00942 ;       Parameter tables
              00943 ;
26CF 49       00944 CONDTBL DB      'IF   '
     46 20 20 20 
26D4 1827     00945         DW      IF01
26D6 45       00946         DB      'ELSE '
     4C 53 45 20 
26DB 4127     00947         DW      ELSE1
26DD 45       00948         DB      'END  '
     4E 44 20 20 
26E2 4C27     00949         DW      END1
26E4 00       00950         NOP
26E5 53       00951 ASSNTBL DB      'SET     '
     45 54 20 20 20 20 20 
26ED 7B27     00952         DW      SET1
26EF 52       00953         DB      'RESET   '
     45 53 45 54 20 20 20 
26F7 8A27     00954         DW      RESET1
26F9 41       00955         DB      'ASSIGN  '
     53 53 49 47 4E 20 20 
2701 9C27     00956         DW      ASSIGN
2703 49       00957         DB      'INCLUDE '
     4E 43 4C 55 44 45 20 
270B B727     00958         DW      INCLUD
270D 51       00959         DB      'QUIT    '
     55 49 54 20 20 20 20 
2715 EA27     00960         DW      QUIT
2717 00       00961         NOP
              00962 ;
              00963 ;       Process IF command
              00964 ;
2718 CD5527   00965 IF01    CALL    IF05            ;Parse expression
271B 2814     00966         JR      Z,IF02          ;Z=true, NZ=false
271D FE0D     00967         CP      CR              ;False & end of line?
271F 2813     00968         JR      Z,IF03
2721 FE2B     00969         CP      '+'             ;Logical OR?
2723 28F3     00970         JR      Z,IF01
              00971 ;
              00972 ;       Test for FALSE and logical AND (&)
              00973 ;
2725 FE26     00974         CP      '&'             ;Separator AND?
2727 2055     00975         JR      NZ,BADHDR0      ;Invalid format if not
2729 23       00976 IF01A   INC     HL              ;Ignore rest of line
272A 7E       00977         LD      A,(HL)
272B FE0D     00978         CP      CR
272D 20FA     00979         JR      NZ,IF01A
272F 1803     00980         JR      IF03
2731 AF       00981 IF02    XOR     A               ;Logic = true
2732 1802     00982         JR      IF04
2734 3EFF     00983 IF03    LD      A,0FFH          ;Logic = false
2736 2A6E2B   00984 IF04    LD      HL,(CONDPTR)    ;Get conditional pointer
2739 B6       00985         OR      (HL)            ;Set logic state
273A 23       00986         INC     HL              ;Bump pointer
273B 77       00987         LD      (HL),A          ;Stuff state result
273C 226E2B   00988         LD      (CONDPTR),HL    ;Save pointer
273F 1846     00989         JR      GOJCL
              00990 ;
              00991 ;       Process ELSE command
              00992 ;
2741 CD2026   00993 ELSE1   CALL    CKCOND          ;Ck nest of conditional
2744 7E       00994         LD      A,(HL)          ;Flip state of flag based
2745 2F       00995         CPL                     ;  on previous test
2746 2B       00996         DEC     HL
2747 B6       00997         OR      (HL)            ;OR in previous state
2748 23       00998         INC     HL
2749 77       00999         LD      (HL),A          ;Store new value
274A 183B     01000         JR      GOJCL
              01001 ;
              01002 ;       Process END command
              01003 ;
274C CD2026   01004 END1    CALL    CKCOND          ;Ck nest level
274F 2B       01005         DEC     HL              ;Backup conditional one
2750 226E2B   01006         LD      (CONDPTR),HL    ;  level & reset pointer
2753 1832     01007         JR      GOJCL
              01008 ;
              01009 ;       Parse conditional expression logic
              01010 ;
2755 CD5F27   01011 IF05    CALL    IF06            ;Get if symbol is true
2758 C0       01012         RET     NZ              ;  or false & ret if false
2759 FE26     01013         CP      '&'             ;Logical AND separator?
275B 28F8     01014         JR      Z,IF05          ;If TRUE AND -> ck next
275D AF       01015         XOR     A               ;True and not AND,
275E C9       01016         RET                     ;  ret true
275F 7E       01017 IF06    LD      A,(HL)
2760 FE2D     01018         CP      '-'             ;Logical NOT?
2762 200A     01019         JR      NZ,IF08
2764 23       01020         INC     HL              ;Bypass '-'
2765 CD6E27   01021         CALL    IF08            ;Grab symbol logic state
2768 2001     01022         JR      NZ,IF07         ;Z=true, NZ=false
276A F6       01023         DB      0F6H            ;Was true, not => false
276B AF       01024 IF07    XOR     A               ;Was false, not => true
276C 78       01025         LD      A,B             ;Rcvr separator
276D C9       01026         RET
276E CDF027   01027 IF08    CALL    PARSNAM         ;Get symbol name into buf
2771 C0       01028         RET     NZ              ;Ret if bad symbol
2772 F5       01029         PUSH    AF
2773 E5       01030         PUSH    HL
2774 CDBA28   01031         CALL    FINDSYM         ;Find symbol in table
2777 E1       01032         POP     HL
2778 C1       01033         POP     BC
2779 78       01034         LD      A,B             ;Put zero in A & use flag
277A C9       01035         RET                     ;From search
              01036 ;
              01037 ;       Process SET command
              01038 ;
277B CDF027   01039 SET1    CALL    PARSNAM         ;Parse symbol name
277E C22C26   01040 BADHDR0 JP      NZ,BADHDR       ;Jump if bad symbol
2781 CDBA28   01041         CALL    FINDSYM         ;Find in table
2784 C49D28   01042         CALL    NZ,MOVNAME      ;Move name into table
2787 C38C25   01043 GOJCL   JP      CPLJCL
              01044 ;
              01045 ;       Process RESET command
              01046 ;
278A CDF027   01047 RESET1  CALL    PARSNAM         ;Parse symbol name
278D 20EF     01048         JR      NZ,BADHDR0
278F CDBA28   01049         CALL    FINDSYM         ;Find symbol in table
2792 20F3     01050         JR      NZ,GOJCL        ;No problem if not there
2794 21F8FF   01051         LD      HL,-8           ;Point to start of name
2797 19       01052         ADD     HL,DE           ;  & put in a blank
2798 3620     01053         LD      (HL),' '        ;  to remove symbol
279A 18EB     01054         JR      GOJCL
              01055 ;
              01056 ;       Process ASSIGN command
              01057 ;
279C CDF027   01058 ASSIGN  CALL    PARSNAM         ;Parse symbol name
279F 20DD     01059         JR      NZ,BADHDR0      ;Jump on bad name
27A1 F5       01060         PUSH    AF              ;Save separator char
27A2 CDBA28   01061         CALL    FINDSYM         ;Find in table
27A5 C49D28   01062         CALL    NZ,MOVNAME      ;Add to table if not in
27A8 F1       01063         POP     AF              ;Recover separator
27A9 FE3D     01064         CP      '='             ;Error if not =
27AB 20D1     01065         JR      NZ,BADHDR0
27AD CDFB27   01066         CALL    PARSVAL         ;Parse value of symbol
27B0 20CC     01067         JR      NZ,BADHDR0
27B2 CDAF28   01068         CALL    MOVALUE         ;Place value into table
27B5 18D0     01069         JR      GOJCL
              01070 ;
              01071 ;       Process INCLUDE command
              01072 ;
27B7 E5       01073 INCLUD  PUSH    HL
27B8 ED5BCC2A 01074         LD      DE,(NESTPTR)    ;Point to next FCB save
27BC 216E2B   01075         LD      HL,NESTEND      ;  area & check if room
27BF AF       01076         XOR     A               ;  to store another FCB
27C0 ED52     01077         SBC     HL,DE
27C2 CA5529   01078         JP      Z,NESTS         ;Error if 5 nests already
27C5 218C29   01079         LD      HL,DOFCB        ;Shift current FCB into
              01080         IF      @BLD631
27C8 CD0925   01081         CALL    DOLDIR          ;<631>INCLUDE FCB save area
              01082         ELSE
              01083         LD      BC,32           ;  INCLUDE FCB save area
              01084         LDIR
              01085         ENDIF
27CB ED53CC2A 01086         LD      (NESTPTR),DE    ;Update new nest pointer
27CF E1       01087         POP     HL
27D0 118C29   01088         LD      DE,DOFCB        ;Point to FCB
27D3          01089         @@FSPEC                 ;Fetch included file
27D3+3E4E     01090         LD      A,78
27D5+EF       01091         RST     40
27D6 20A6     01092         JR      NZ,BADHDR0      ;Jump on error
              01093         IF      @BLD631
27D8 CD8529   01094         CALL    DOFEXT          ;<631>
              01095         ELSE
              01096         LD      HL,SYSJCL+7     ;Default to /JCL
              01097         @@FEXT
              01098         ENDIF
27DB 21002C   01099         LD      HL,INPBUF       ;Open the included file
27DE 45       01100         LD      B,L
27DF FDCB12C6 01101         SET     0,(IY+'S'-'A')  ;Inhibit file open bit
27E3          01102         @@OPEN
27E3+3E3B     01103         LD      A,59
27E5+EF       01104         RST     40
27E6 2096     01105         JR      NZ,BADHDR0
27E8 189D     01106         JR      GOJCL
              01107 ;
              01108 ;       Process QUIT command
              01109 ;
27EA 219E2B   01110 QUIT    LD      HL,JCLBUF1      ;Log the //QUIT command
27ED C37029   01111         JP      EXTERR
              01112 ;
              01113 ;       Parse symbol name
              01114 ;       A <= separator char
              01115 ;       Z  = ok, NZ = bad symbol char
              01116 ;
27F0 D5       01117 PARSNAM PUSH    DE
27F1 0608     01118         LD      B,8             ;8 chars max
27F3 11AC29   01119         LD      DE,CURSYM       ;Symbol buffer area
27F6 CD3728   01120         CALL    PARSER          ;Parse it
27F9 D1       01121         POP     DE
27FA C9       01122         RET
              01123 ;
              01124 ;       Parse a symbol value
              01125 ;
27FB D5       01126 PARSVAL PUSH    DE
27FC 0620     01127         LD      B,32            ;32 chars max
27FE 11B529   01128         LD      DE,VALBUF       ;Value buffer
2801 CD1A28   01129         CALL    XFRSTR          ;Transfer from input
2804 F5       01130         PUSH    AF
2805 E5       01131         PUSH    HL
2806 EB       01132         EX      DE,HL           ;Calculate length of
2807 11B529   01133         LD      DE,VALBUF       ;  the string
280A AF       01134         XOR     A
280B ED52     01135         SBC     HL,DE
280D 7D       01136         LD      A,L
280E FE21     01137         CP      33
2810 D25929   01138         JP      NC,TOOLNG       ;Jump if > 32 chars
2813 32B429   01139         LD      (STRLEN),A      ;Stuff string length
2816 E1       01140         POP     HL
2817 F1       01141         POP     AF
2818 D1       01142         POP     DE
2819 C9       01143         RET
              01144 ;
              01145 ;       Transfer a string field
              01146 ;
281A CD3728   01147 XFRSTR  CALL    PARSER          ;Xfer max of 32 chars
281D CD3629   01148 XFRSTR1 CALL    CKSPCOM         ;Return on space
2820 C8       01149         RET     Z               ;  or comma
2821 FE0D     01150         CP      CR
2823 C8       01151         RET     Z               ;Ret on end of line
2824 FE3D     01152         CP      '='
2826 C8       01153         RET     Z               ;Ret on =
2827 FE28     01154         CP      '('
2829 C8       01155         RET     Z               ;Ret on left paren
282A FE29     01156         CP      ')'
282C C8       01157         RET     Z               ;Ret on right paren
282D FE23     01158         CP      '#'
282F 20E9     01159         JR      NZ,XFRSTR       ;Loop if not #
2831 CDD525   01160         CALL    CPLJCL5         ;Ck on substitution
2834 7E       01161         LD      A,(HL)
2835 18E6     01162         JR      XFRSTR1         ;Then loop
              01163 ;
              01164 ;       Parse a field
              01165 ;
2837 78       01166 PARSER  LD      A,B             ;Set max length of field
2838 329928   01167         LD      (PAR6+1),A
283B 04       01168         INC     B
283C 7E       01169 PAR2    LD      A,(HL)          ;P/u entry char
283D FE03     01170         CP      3               ;ETX?
283F 284C     01171         JR      Z,PAR5
2841 FE0D     01172         CP      CR
2843 2848     01173         JR      Z,PAR5
2845 23       01174         INC     HL              ;Not ending char, bump
2846 FE22     01175         CP      '"'             ;Ck on string quote
2848 2007     01176         JR      NZ,NOTQT
284A EE22     01177         XOR     '"'             ;Ck if opening or closing
284B          01178 STUFQT  EQU     $-1
284C 324B28   01179         LD      (STUFQT),A
284F 18EB     01180         JR      PAR2            ;Loop until terminator
2851 4F       01181 NOTQT   LD      C,A             ;Save char & test if
2852 3A4B28   01182         LD      A,(STUFQT)      ;  within quoted string
2855 B7       01183         OR      A
2856 79       01184         LD      A,C             ;Get back the char
2857 2826     01185         JR      Z,PAR3          ;Allow all within "..."
2859 FE40     01186         CP      '@'             ;Start of label?
285B 200D     01187         JR      NZ,NOLBL
285D D600     01188 GOTLBL  SUB     0               ;Make sure only one
285F CA6129   01189         JP      Z,LBLERR
2862 325E28   01190         LD      (GOTLBL+1),A    ;Stuff '&' into test
2865 321625   01191         LD      (FNDLBL+1),A    ;  & also for check
2868 18D2     01192         JR      PAR2            ;Loop through start
286A FE2E     01193 NOLBL   CP      '.'             ;Accept (., /, 0-9, :)
286C 381F     01194         JR      C,PAR5
286E FE3B     01195         CP      ':'+1
2870 380D     01196         JR      C,PAR3
2872 FE41     01197         CP      'A'             ;Test for A-Z
2874 3817     01198         JR      C,PAR5
2876 FE5B     01199         CP      'Z'+1
2878 3805     01200         JR      C,PAR3
287A CD3C29   01201         CALL    CKLCA2Z         ;Test for a-z
287D 380E     01202         JR      C,PAR5
287F 05       01203 PAR3    DEC     B               ;Char count down
2880 2808     01204         JR      Z,PAR4
2882 12       01205         LD      (DE),A          ;Save the char
2883 AF       01206         XOR     A               ;Show we found at
2884 329928   01207         LD      (PAR6+1),A      ;  least one valid char
2887 13       01208         INC     DE              ;Bump receiving buffer
2888 18B2     01209         JR      PAR2            ;Loop
288A 04       01210 PAR4    INC     B               ;Ignore trailing chars
288B 18AF     01211         JR      PAR2            ;  past max length
288D 4F       01212 PAR5    LD      C,A             ;Found char out of range
288E D5       01213         PUSH    DE              ;Save current end of buf
288F 1804     01214         JR      PAR5B
2891 3E20     01215 PAR5A   LD      A,' '           ;Fill out remaining field
2893 12       01216         LD      (DE),A          ;  with blanks
2894 13       01217         INC     DE
2895 10FA     01218 PAR5B   DJNZ    PAR5A
2897 D1       01219         POP     DE              ;Recover pointer to last
2898 3E00     01220 PAR6    LD      A,0             ;Char xfered, get max len
289A B7       01221         OR      A               ;Note if we found a char
289B 79       01222         LD      A,C             ;Xfer separator char
289C C9       01223         RET
              01224 ;
              01225 ;       Xfer symbol name to table & init value
              01226 ;
289D E5       01227 MOVNAME PUSH    HL
289E 21AC29   01228         LD      HL,CURSYM       ;Current symbol buffer
28A1 010800   01229         LD      BC,8            ;8 chars to move
28A4 EDB0     01230         LDIR
28A6 AF       01231         XOR     A               ;Zero accumulator
28A7 12       01232         LD      (DE),A          ;Show symbol length=0
28A8 212100   01233         LD      HL,33           ;Point to 1st byte
28AB 19       01234         ADD     HL,DE           ;  of next symbol pos and
28AC 77       01235         LD      (HL),A          ;  show it spare
28AD E1       01236         POP     HL
28AE C9       01237         RET
              01238 ;
              01239 ;       Place symbol value into table
              01240 ;
28AF E5       01241 MOVALUE PUSH    HL
28B0 21B429   01242         LD      HL,STRLEN       ;Current value buffer
28B3 012100   01243         LD      BC,33           ;Length & value
28B6 EDB0     01244         LDIR
28B8 E1       01245         POP     HL
28B9 C9       01246         RET
              01247 ;
              01248 ;       Find symbol in table
              01249 ;
28BA E5       01250 FINDSYM PUSH    HL
28BB 11AC29   01251         LD      DE,CURSYM       ;Symbol buffer
28BE 21002E   01252         LD      HL,SYMTAB       ;Start of table
28C1 012908   01253         LD      BC,8<8!41       ;CP8, field (8,1,32)
28C4 CDE628   01254         CALL    FNDPRM          ;Search in progress
28C7 54       01255         LD      D,H             ;Xfer pointer of symbol
28C8 5D       01256         LD      E,L             ;  or to spare slot
28C9 E1       01257         POP     HL
28CA C9       01258         RET
              01259 ;
              01260 ;       Routine to check for IF, ELSE, END
              01261 ;
28CB E5       01262 CK4COND PUSH    HL
28CC 21CF26   01263         LD      HL,CONDTBL      ;Parm table
28CF 010705   01264         LD      BC,5<8!7        ;5 chars, 7-char field
28D2 1807     01265         JR      CK4AS1
              01266 ;
              01267 ;       Check on SET, RESET, ASSIGN, INCLUDE, QUIT
              01268 ;
28D4 E5       01269 CK4ASSN PUSH    HL
28D5 21E526   01270         LD      HL,ASSNTBL      ;Parm table
28D8 010A08   01271         LD      BC,8<8!10       ;Parm length, field len
28DB 11AC29   01272 CK4AS1  LD      DE,CURSYM       ;Buffer area
28DE CDE628   01273         CALL    FNDPRM          ;Ck for match
28E1 5E       01274         LD      E,(HL)          ;Xfer vector address
28E2 23       01275         INC     HL
28E3 56       01276         LD      D,(HL)
28E4 E1       01277         POP     HL
28E5 C9       01278         RET
              01279 ;
              01280 ;       Scan parm table for match
              01281 ;
28E6 7E       01282 FNDPRM  LD      A,(HL)          ;End of parm table?
28E7 B7       01283         OR      A
28E8 2002     01284         JR      NZ,FND1         ;Jump if not
28EA 3C       01285         INC     A               ;  else show not found
28EB C9       01286         RET
28EC 1A       01287 FND1    LD      A,(DE)          ;Char match?
28ED CD3C29   01288         CALL    CKLCA2Z         ;Convert a-z to A-Z
28F0 BE       01289         CP      (HL)
28F1 2807     01290         JR      Z,FND3          ;Jump if 1st matches
28F3 C5       01291 FND2    PUSH    BC              ;  else bypass complete
28F4 0600     01292         LD      B,0             ;  field & go to next one
28F6 09       01293         ADD     HL,BC
28F7 C1       01294         POP     BC
28F8 18EC     01295         JR      FNDPRM
28FA E5       01296 FND3    PUSH    HL              ;1st matches, ck rest
28FB D5       01297         PUSH    DE
28FC C5       01298         PUSH    BC
28FD 05       01299         DEC     B               ;Adj for 1st match
28FE 13       01300 FND4    INC     DE
28FF 23       01301         INC     HL
2900 1A       01302         LD      A,(DE)
2901 FE20     01303         CP      ' '
2903 2827     01304         JR      Z,FND7          ;Stop checking on space
2905 FE0D     01305         CP      CR
2907 2823     01306         JR      Z,FND7          ;Or end of line
2909 CD3C29   01307         CALL    CKLCA2Z         ;Ck & convert a-z to A-Z
290C BE       01308         CP      (HL)            ;Compare remaining chars
290D 200D     01309         JR      NZ,FND6         ;Jump on mismatch
290F 10ED     01310         DJNZ    FND4            ;Loop to count
2911 C1       01311 FND5    POP     BC              ;Must have matched
2912 D1       01312         POP     DE              ;Bypass remaining part
2913 E1       01313         POP     HL              ;  of field and point to
2914 C5       01314         PUSH    BC              ;  address vector of parm
2915 48       01315         LD      C,B             ;  in parm table
2916 0600     01316         LD      B,0
2918 09       01317         ADD     HL,BC
2919 C1       01318         POP     BC
291A AF       01319         XOR     A
291B C9       01320         RET
291C FE30     01321 FND6    CP      '0'             ;No match, is it ASCII?
291E 380C     01322         JR      C,FND7
2920 FE3A     01323         CP      '9'+1           ;0-9?
2922 380D     01324         JR      C,FND8
2924 FE41     01325         CP      'A'             ;A-Z?
2926 3804     01326         JR      C,FND7
2928 FE5B     01327         CP      'Z'+1
292A 3805     01328         JR      C,FND8
292C 7E       01329 FND7    LD      A,(HL)          ;If table entry also a
292D FE20     01330         CP      ' '             ;  space, we have a match
292F 28E0     01331         JR      Z,FND5
2931 C1       01332 FND8    POP     BC
2932 D1       01333         POP     DE
2933 E1       01334         POP     HL
2934 18BD     01335         JR      FND2
              01336         ENDIF
              01337 ;
              01338 ;       Routine to ck on space or comma
              01339 ;
2936 FE20     01340 CKSPCOM CP      ' '
2938 C8       01341         RET     Z
2939 FE2C     01342         CP      ','
293B C9       01343         RET
              01344 ;
              01345 ;       Routine to convert a-z to A-Z & set C-flag
              01346 ;
293C FE61     01347 CKLCA2Z CP      'a'             ;Back with C-flag if
293E D8       01348         RET     C               ;  not a-z
293F FE7B     01349         CP      'z'+1
2941 3F       01350         CCF
2942 D8       01351         RET     C
2943 EE20     01352         XOR     20H             ;Make U/C & reset CF
2945 C9       01353         RET
              01354 *LIST   ON
              01355 ;
              01356 ;
              01357 ;       Error processing
              01358 ;
2946 6F       01359 IOERR   LD      L,A             ;Xfer errnum to HL
2947 2600     01360         LD      H,0
2949 F6C0     01361         OR      0C0H            ;Set brief, return
294B 4F       01362         LD      C,A
294C          01363         @@ERROR                 ;Display error
294C+3E1A     01364         LD      A,26
294E+EF       01365         RST     40
294F 1825     01366         JR      ERREXIT
              01367 ;
2951 21ED29   01368 SPCREQ  LD      HL,SPCREQ$      ;"filespec required"
              01369 ;
              01370 *LIST   OFF
              01372 *LIST   ON
2954 DD       01373         DB      0DDH
2955 21B32A   01374 NESTS   LD      HL,NESTS$
2958 DD       01375         DB      0DDH
2959 210E2A   01376 TOOLNG  LD      HL,TOOLNG$      ;"symbol too long..
295C DD       01377         DB      0DDH
295D 21252A   01378 NOFIND  LD      HL,NOFIND$      ;"proc not found..
2960 DD       01379         DB      0DDH
2961 21392A   01380 LBLERR  LD      HL,LBLERR$      ;"too many proc labels..
2964 DD       01381         DB      0DDH
2965 214E2A   01382 DSKFUL  LD      HL,DSKFUL$      ;"can't create SYS/JCL"
2968 DD       01383         DB      0DDH
2969 217C2A   01384 PRMERR  LD      HL,PRMERR$      ;"parameter error"
296C DD       01385         DB      0DDH
296D 216B2A   01386 MULDEF  LD      HL,MULDEF$      ;"multiply defined
              01387         ENDIF
              01388 *LIST   ON
              01389 ;
2970          01390 EXTERR  @@LOGOT
              01391         IFEQ    00H,1
              01392         LD      HL,
              01393         ENDIF
2970+3E0C     01394         LD      A,12
2972+EF       01395         RST     40
2973 21FFFF   01396         LD      HL,-1           ;Set error exit
2976          01397 ERREXIT EQU     $
2976 11C000   01398         LD      DE,JFCB$        ;If the output JCL file
2979 1A       01399         LD      A,(DE)          ;  is open, then we need
297A CB7F     01400         BIT     7,A             ;  to close it
297C 2803     01401         JR      Z,SPSAV
297E          01402         @@CLOSE
297E+3E3C     01403         LD      A,60
2980+EF       01404         RST     40
2981 310000   01405 SPSAV   LD      SP,$-$
2984 C9       01406         RET
              01407         IF      @BLD631
2985 21E729   01408 DOFEXT: LD      HL,SYSJCL+7     ;<631>Default to /JCL
2988          01409         @@FEXT                  ;<631>
2988+3E4F     01410         LD      A,79
298A+EF       01411         RST     40
298B C9       01412         RET                     ;<631>
              01413         ENDIF
              01414 ;
              01415 *LIST   OFF
              01417 *LIST   ON
298C          01418 DOFCB   DS      32
29AC          01419 CURSYM  DS      8
29B4          01420 STRLEN  DS      1
29B5          01421 VALBUF  DS      32
29D5          01422 LBLSAV  DS      8
29DD 00       01423         NOP                     ;Must be zero
              01424         ENDIF
              01425 ;
              01426 *LIST   ON
29DE 0000     01427 LINENO  DW      0               ;JCL line #
              01428         IF      @BLD631
              01429         IF      @BLD631G
29E0 53       01430 SYSJCL  DB      'SYSTEM/JCL',3          ;<631G>
     59 53 54 45 4D 2F 4A 43
     4C 03 
              01431         ELSE
              01432 SYSJCL  DB      'SYSTEM/JCL:'           ;<631>
              01433         ENDIF
29EB 30       01434 DRVNUM  DB      '0',3                   ;<631>
     03 
              01435         ELSE
              01436 SYSJCL  DB      'SYSTEM/JCL',3
              01437         ENDIF
29ED 46       01438 SPCREQ$ DB      'File spec required',CR
     69 6C 65 20 73 70 65 63
     20 72 65 71 75 69 72 65
     64 0D 
              01439 *LIST   OFF
              01441 *LIST   ON
2A00 4C       01442 LINLNG$ DB      'Line too long',CR
     69 6E 65 20 74 6F 6F 20
     6C 6F 6E 67 0D 
2A0E 53       01443 TOOLNG$ DB      'Symbol string too long',CR
     79 6D 62 6F 6C 20 73 74
     72 69 6E 67 20 74 6F 6F
     20 6C 6F 6E 67 0D 
2A25 50       01444 NOFIND$ DB      'Procedure not found',CR
     72 6F 63 65 64 75 72 65
     20 6E 6F 74 20 66 6F 75
     6E 64 0D 
2A39 54       01445 LBLERR$ DB      'Too many Proc labels',CR
     6F 6F 20 6D 61 6E 79 20
     50 72 6F 63 20 6C 61 62
     65 6C 73 0D 
2A4E 43       01446 DSKFUL$ DB      'Can''t create SYSTEM/JCL file',CR
     61 6E 27 74 20 63 72 65
     61 74 65 20 53 59 53 54
     45 4D 2F 4A 43 4C 20 66
     69 6C 65 0D 
2A6B 4D       01447 MULDEF$ DB      'Multiply defined '     ;Follow with PRMERR$
     75 6C 74 69 70 6C 79 20
     64 65 66 69 6E 65 64 20
2A7C 50       01448 PRMERR$ DB      'Parameter error',CR
     61 72 61 6D 65 74 65 72
     20 65 72 72 6F 72 0D 
              01449         IF      @BLD631G
2A8C 42       01450 BADJCL$ DB      'Bad JCL format, process aborted',CR    ;<631G>
     61 64 20 4A 43 4C 20 66
     6F 72 6D 61 74 2C 20 70
     72 6F 63 65 73 73 20 61
     62 6F 72 74 65 64 0D 
2AAC 67       01451 P631G1: LD      H,A             ;<631G>
2AAD 2E3A     01452         LD      L,':'           ;<631G>
2AAF 22EA29   01453         LD      (DRVNUM-1),HL   ;<631G>29EAH
2AB2 C9       01454         RET                     ;<631G>
              01455         ELSE
              01456 BADJCL$ DB      'Invalid JCL format, processing aborted',CR
              01457         ENDIF
2AB3 54       01458 NESTS$  DB      'Too many nested INCLUDEs',CR
     6F 6F 20 6D 61 6E 79 20
     6E 65 73 74 65 64 20 49
     4E 43 4C 55 44 45 73 0D
2ACC CE2A     01459 NESTPTR DW      NESTFCB         ;Pointer to nest FCB
2ACE          01460 NESTFCB DS      32*5            ;Space for 5 levels
2B6E          01461 NESTEND EQU     $               ;Ck for too many includes
2B6E 702B     01462 CONDPTR DW      CONDFLG         ;Conditional pointer
2B70 00       01463 CONDFLG DB      0               ;Init 1st state to TRUE
2B71          01464         DS      31              ;32 conditional levels
2B90 4C       01465 BADHDR$ DB      'Line xxxxx -->'
     69 6E 65 20 78 78 78 78
     78 20 2D 2D 3E 
2B9E          01466 JCLBUF1 DS      80
2C00          01467         ORG     $<-8+1<+8
2C00          01468 INPBUF  DS      256
2D00          01469 OUTBUF  DS      256
2E00 00       01470 SYMTAB  DB      0
              01471         ENDIF
              01472 *LIST   ON
2E01          01473 CORE$   DEFL    $
              01474 ;
2400          01475         END     DO
2400 is the transfer address
00000 Total errors


[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

Valid HTML 4.01!