home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PARASOL / PARASOLS.ARK / LSTMT.ASM < prev    next >
Assembly Source File  |  1986-10-05  |  151KB  |  8,469 lines

  1.  
  2. ;
  3. ;
  4. ;-------------------------------
  5. ;    The program
  6. ;-------------------------------
  7. compile.the.program:
  8.     call    process.a.statement
  9.     call    get.word
  10.     lda    rsvd.wd.ix
  11.     cpi    rwix.semicolon
  12.     cz    get.word
  13.     lda    word
  14.     cpi    1ah
  15.     jz    MAIN.eof.src
  16. ;
  17.     call    err.txt.after.END
  18. MAIN.flush.src:
  19.     call    get.src.char
  20.     cpi    1ah
  21.     jnz    MAIN.flush.src
  22. MAIN.eof.src:
  23.     jmp    MAIN.end.pgm
  24. ;
  25. err.txt.after.end:
  26.     lxi    h,em.txt.after.end
  27.     jmp    print.error
  28. ;
  29. ;
  30. em.txt.after.end:
  31.     db    'text found following final end',0
  32. ;
  33. ;
  34. ;-----------------------------------
  35. ;   statement compilation routine
  36. ;-----------------------------------
  37. ;
  38. ;
  39. last.err.ctr:        db    0
  40. last.good.code        dw    0100h
  41. ;
  42. process.a.statement:
  43.     lda    last.err.ctr
  44.     lxi    h,err.ctr
  45.     cmp    m
  46.     jz    prc.no.new.err
  47.     lhld    last.good.code    ;erase bad obj-code
  48.     shld    curr.code.addr
  49. prc.no.new.err:
  50.     lda    err.ctr
  51.     sta    last.err.ctr
  52.     lhld    curr.code.addr
  53.     shld    last.good.code
  54.  
  55.     call    prc.stmt
  56. prc.stmt.skip.semi:
  57.     lda    rsvd.wd.ix
  58.     cpi    rwix.semicolon
  59.     rnz
  60.     call    get.word
  61.     jmp    prc.stmt.skip.semi
  62. ;
  63. ;
  64. ;
  65. prc.stmt:
  66.     lhld    statement.counter
  67.     inx    h
  68.     shld    statement.counter
  69.     call    chk.stk.overflow
  70.     call    debug.routine
  71.     call    switch.rsvd.wd.ix
  72.     db rwix.end.of.source    ! dw err.eof.on.src
  73.     db rwix.semicolon    ! dw process.semicolon
  74.     db rwix.ACCEPT        ! dw process.ACCEPT
  75.     db rwix.ADD        ! dw process.ADD
  76.     db rwix.AND        ! dw process.AND
  77.     db rwix.APPEND        ! dw process.APPEND
  78.     db rwix.BCD        ! dw process.BCD
  79.     db rwix.BEGIN        ! dw process.BEGIN
  80.     db rwix.BIT        ! dw process.BIT
  81.     db rwix.BYTE        ! dw process.BYTE
  82.     db rwix.CALL        ! dw process.CALL
  83.     db rwix.CLOSE        ! dw process.CLOSE
  84.     db rwix.COMMENT        ! dw process.COMMENT
  85.     db rwix.CONVERT        ! dw process.CONVERT
  86.     db rwix.COPY        ! dw process.COPY
  87.     db rwix.DISABLE        ! dw process.DISABLE
  88.     db rwix.DISPLAY        ! dw process.DISPLAY
  89.     db rwix.DIVIDE        ! dw process.DIVIDE
  90.     db rwix.DO        ! dw process.DO
  91.     db rwix.EDIT        ! dw process.EDIT
  92.     db rwix.ELSE        ! dw err.unmtchd.ELSE
  93.     db rwix.ENABLE        ! dw process.ENABLE
  94.     db rwix.ENDREC        ! dw err.unmtchd.ENDREC
  95.     db rwix.ENDREDEF    ! dw err.unmtchd.ENDREDEF
  96.     db rwix.ENDSWITCH    ! dw err.unmtchd.ENDSWITCH
  97.     db rwix.END        ! dw err.unmtchd.END
  98.     db rwix.EXCHANGE    ! dw process.EXCHANGE
  99.     db rwix.EXECUTE        ! dw process.EXECUTE
  100.     db rwix.EXITBEGIN    ! dw process.EXITBEGIN
  101.     db rwix.EXITDO        ! dw process.EXITDO
  102.     db rwix.EXITSWITCH    ! dw process.EXITSWITCH
  103.     db rwix.EXIT        ! dw process.EXIT
  104.     db rwix.EXTERNAL    ! dw process.EXTERNAL
  105.     db rwix.FIELD        ! dw process.FIELD
  106.     db rwix.FILE        ! dw process.FILE
  107.     db rwix.FILL        ! dw process.FILL
  108.     db rwix.FIND        ! dw process.FIND
  109.     db rwix.FI        ! dw err.unmtchd.FI
  110.     db rwix.GOTO        ! dw process.GOTO
  111.     db rwix.GO        ! dw process.GO
  112.     db rwix.IF        ! dw process.IF
  113.     db rwix.INDEX        ! dw process.INDEX
  114.     db rwix.INPUT        ! dw process.INPUT
  115.     db rwix.JUSTIFY        ! dw process.JUSTIFY
  116.     db rwix.MCALL        ! dw process.MCALL
  117.     db rwix.MOVE        ! dw process.MOVE
  118.     db rwix.MULTIPLY    ! dw process.MULTIPLY
  119.     db rwix.NULL        ! dw process.NULL
  120.     db rwix.OD        ! dw err.unmtchd.OD
  121.     db rwix.OPEN        ! dw process.OPEN
  122.     db rwix.OR        ! dw process.OR
  123.     db rwix.OUTPUT        ! dw process.OUTPUT
  124.     db rwix.POINTER        ! dw process.POINTER
  125.     db rwix.POP        ! dw process.POP
  126.     db rwix.PRINT        ! dw process.PRINT
  127.     db rwix.PROCEDURE    ! dw process.PROCEDURE
  128.     db rwix.PUSH        ! dw process.PUSH
  129.     db rwix.READ        ! dw process.READ
  130.     db rwix.REBOOT        ! dw process.REBOOT
  131.     db rwix.RECORD        ! dw process.RECORD
  132.     db rwix.REDEFINE    ! dw process.REDEFINE
  133.     db rwix.REMOVE        ! dw process.REMOVE
  134.     db rwix.RENAME        ! dw process.RENAME
  135.     db rwix.SCAN        ! dw process.SCAN
  136.     db rwix.SEGMENTED    ! dw process.SEGMENTED
  137.     db rwix.SET        ! dw process.SET
  138.     db rwix.SIZE        ! dw process.SIZE
  139.     db rwix.STRING        ! dw process.STRING
  140.     db rwix.SUBTRACT    ! dw process.SUBTRACT
  141.     db rwix.SWITCH        ! dw process.SWITCH
  142.     db rwix.TRACEBACK    ! dw process.TRACEBACK
  143.     db rwix.UNSTRING    ! dw process.UNSTRING
  144.     db rwix.UNTIL        ! dw err.unmtchd.OD    ;UNTIL
  145.     db rwix.WHILE        ! dw process.WHILE
  146.     db rwix.WORD        ! dw process.WORD
  147.     db rwix.WRITE        ! dw process.WRITE
  148.     db rwix.XOR        ! dw process.XOR
  149.     db    0        ! dw process.not.rsvd
  150. ;
  151. ;
  152. ;
  153.     ds    10    ;*************** debug patch area
  154. ;
  155. ;
  156. ;
  157. ;------------------------------------------
  158. ;
  159. ;
  160. process.not.rsvd:
  161.     call    set.byte.boundary
  162.     lda    word.type
  163.     ani    wtp.ident
  164.     jz    err.unexpect.word
  165. ;
  166.     lxi    h,word
  167.     lxi    d,ste.A.name
  168.     call    move.string
  169.     call    get.word
  170.     lda    rsvd.wd.ix
  171.     cpi    rwix.colon
  172.     jnz    err.unexpect.word
  173.     call    chk.strt.code
  174.     lxi    h,ste.A.name
  175.     lxi    d,word
  176.     call    move.string
  177.     lxi    h,word
  178.     lxi    d,last.label
  179.     call    move.string
  180.     call    chk.word.not.in.tbl
  181.     mvi    a,stet.label
  182.     sta    ste.type
  183.     lxi    h,0
  184.     shld    ste.length
  185.     call    put.word.into.tbl
  186. ;
  187. ;---check if I need to save sym-tbl-ptr to overlay name---
  188. ;
  189.     lhld    curr.ovl.ste.ptr
  190.     mov    a,h
  191.     ora    l
  192.     jnz    pnr.already
  193.     lhld    start.sym.tbl.addr
  194.     shld    curr.ovl.ste.ptr
  195. pnr.already:
  196. ;
  197.     call    fix.up.fwd.ref.word
  198. process.semicolon:
  199.     call    get.word
  200.     call    chk.not.blk.ender
  201.     rz
  202.     jmp    prc.stmt
  203. ;
  204. ;
  205. ;------------------------------------------------------
  206. ;
  207. process.ACCEPT:
  208.     call    chk.strt.code
  209.     call    get.word
  210.     call    get.var.A.word
  211. ;
  212.     lda    A.word.type
  213.     ani    wtp.string
  214.     jnz    p.ACCEPT.DISPLAY
  215. ;
  216.     lda    ste.A.type
  217.     cpi    stet.RECORD
  218.     jz    p.ACCEPT.type.ok
  219.     cpi    stet.STRING
  220.     cnz    err.inv.var.type
  221. p.ACCEPT.type.ok:
  222.     call    put.LXI.H.A
  223.     call    put.MVI.C
  224.     lda    ste.A.length
  225.     dcr    a
  226.     call    put.code.byte
  227.     mvi    a,bir.ACCEPT
  228.     call    put.bir.call.fwd
  229.     jmp    p.ACCEPT.next
  230. ;
  231. ;
  232. p.ACCEPT.DISPLAY:
  233.     call    put.inline.A.string
  234. ;
  235.     call    put.LXI.H.A
  236.     mvi    a,bir.DISPLAY
  237.     call    put.bir.call.fwd
  238.     lda    rsvd.wd.ix
  239.     cpi    rwix.comma
  240.     jnz    err.mssng.rsvd.wd
  241. ;
  242. p.ACCEPT.next:
  243.     lda    rsvd.wd.ix
  244.     cpi    rwix.comma
  245.     jz    process.ACCEPT
  246.     ret
  247. ;
  248. ;
  249. ;------------------------------------------------------
  250. ;
  251. ;
  252. process.ADD:
  253.     call    chk.strt.code
  254.     call    get.word
  255.     call    get.var.A.word
  256. ;
  257.     lda    rsvd.wd.ix
  258.     cpi    rwix.TO
  259.     cz    get.word
  260. ;
  261.     call    get.var.B.word
  262. ;
  263.     lda    rsvd.wd.ix
  264.     cpi    rwix.GIVING
  265.     jnz    p.ADD.2
  266. ;
  267.     call    get.word
  268.     call    chk.word.id.only
  269.     call    get.var.C.word
  270. ;
  271. ;
  272.     lda    A.word.type
  273.     ani    wtp.cnst
  274.     jnz    p.ADD.3.c
  275.     call    switch.A
  276.     db stet.BYTE        ! dw p.ADD.3.8
  277.     db stet.WORD        ! dw p.ADD.3.16
  278.     db stet.BCD        ! dw p.ADD.BCD.general
  279.     db stet.spcl.bcd.ptr    ! dw p.ADD.BCD.general
  280.     db    0        ! dw p.ADD.general
  281. ;
  282. ;
  283. p.ADD.3.8:
  284.     lda    B.word.type
  285.     ani    wtp.cnst
  286.     jnz    p.ADD.3.8.c
  287.     call    switch.B
  288.     db stet.BYTE        ! dw p.ADD.3.8.8
  289.     db stet.WORD        ! dw p.ADD.3.8.16
  290.     db stet.spcl.byte.ptr    ! dw p.ADD.general
  291.     db stet.spcl.word.ptr    ! dw p.ADD.general
  292.     db    0        ! dw p.ADD.3.8.err
  293. ;
  294. p.ADD.3.8.err:
  295.     call    err.inv.numeric.var
  296. p.ADD.3.8.8:
  297.     call    switch.C
  298.     db stet.BYTE        ! dw put.add.3.A8.B8.C8
  299.     db    0        ! dw p.ADD.general
  300. ;
  301. p.ADD.3.8.16:
  302.     call    switch.C
  303.     db stet.BYTE        ! dw put.add.3.A8.B8.C8.tru
  304.     db    0        ! dw p.ADD.general
  305. ;
  306. p.ADD.3.8.c:
  307.     call    switch.C
  308.     db stet.BYTE        ! dw put.add.3.A8.BN.C8
  309.     db    0        ! dw p.ADD.general
  310. ;
  311. p.ADD.3.16:
  312.     call    switch.B
  313.     db stet.BYTE        ! dw p.ADD.3.16.8
  314.     db stet.WORD        ! dw p.ADD.3.16.16
  315.     db    0        ! dw p.ADD.general
  316. ;
  317. p.ADD.3.16.8:
  318.     call    switch.C
  319.     db stet.BYTE        ! dw put.add.3.A8.B8.C8.tru
  320.     db    0        ! dw p.ADD.general
  321. ;
  322. p.ADD.3.16.16:
  323.     call    switch.C
  324.     db stet.BYTE        ! dw put.ADD.3.A8.B8.C8.tru
  325.     db    0        ! dw p.ADD.general
  326. ;
  327. p.ADD.2:
  328.     lxi    h,sym.tbl.entry.B
  329.     lxi    d,sym.tbl.entry.C
  330.     call    move.sym.tbl.entry
  331.     lda    B.word.type
  332.     sta    C.word.type
  333. ;
  334.     lda    A.word.type
  335.     ani    wtp.cnst
  336.     jnz    p.ADD.2.c
  337.     call    switch.A
  338.     db stet.BYTE        ! dw p.ADD.2.8
  339.     db stet.WORD        ! dw p.ADD.2.16
  340.     db stet.spcl.byte.ptr    ! dw p.ADD.2.BP
  341.     db stet.BCD        ! dw p.ADD.BCD.general
  342.     db stet.spcl.BCD.ptr    ! dw p.ADD.BCD.general
  343.     db    0        ! dw p.ADD.general
  344. ;
  345. p.ADD.2.8:
  346.     call    switch.B
  347.     db stet.BYTE        ! dw put.add.2.A8.B8
  348.     db stet.spcl.byte.ptr    ! dw put.add.2.A8.BBP
  349.     db    0        ! dw p.ADD.general
  350. ;
  351. p.ADD.2.16:
  352.     call    switch.B
  353.     db stet.BYTE        ! dw put.add.2.A16.B8
  354.     db    0        ! dw p.ADD.general
  355. ;
  356. p.ADD.2.BP:
  357.     call    switch.B
  358.     db stet.BYTE        ! dw put.add.2.ABP.B8
  359.     db stet.spcl.byte.ptr    ! dw put.add.2.ABP.BBP
  360.     db    0        ! dw p.ADD.general
  361. ;
  362. p.ADD.3.c:
  363.     call    switch.B
  364.     db stet.BYTE        ! dw p.ADD.3.c.8
  365.     db stet.WORD        ! dw p.ADD.3.c.16
  366.     db stet.BCD        ! dw p.ADD.BCD.general
  367.     db stet.spcl.BCD.ptr    ! dw p.ADD.BCD.general
  368.     db    0        ! dw p.ADD.general
  369. ;
  370. p.ADD.3.c.8:
  371.     call    switch.C
  372.     db stet.BYTE        ! dw put.add.3.AN.B8.C8
  373.     db    0        ! dw p.ADD.general
  374. ;
  375. p.ADD.3.c.16:
  376.     call    switch.C
  377.     db stet.BYTE        ! dw put.add.3.AN.B8.C8.tru
  378.     db    0        ! dw p.ADD.general
  379. ;
  380. p.ADD.2.c:
  381.     call    switch.B
  382.     db stet.BYTE        ! dw put.add.2.AN.B8
  383.     db stet.WORD        ! dw put.add.AN.B16.C16
  384.     db stet.spcl.byte.ptr    ! dw put.add.2.AN.BBP
  385.     db stet.BCD        ! dw p.ADD.BCD.general
  386.     db stet.spcl.BCD.ptr    ! dw p.ADD.BCD.general
  387.     db    0        ! dw p.ADD.general
  388. ;
  389. ;
  390. ;
  391. p.ADD.general:
  392. ;
  393. ;---if only one is cnst, make it A---
  394. ;
  395.     lda    B.word.type
  396.     ani    wtp.cnst
  397.     jz    p.ADD.g.cnst.ok
  398.     call    swap.A.B.sym.entries
  399.     jmp    p.ADD.g.c
  400. ;
  401. p.ADD.g.cnst.ok:
  402.     lda    A.word.type
  403.     ani    wtp.cnst
  404.     jnz    p.ADD.g.c
  405. ;
  406. ;---special optimization for adding number to itself---
  407. ;
  408.     lxi    h,sym.tbl.entry.A
  409.     lxi    d,sym.tbl.entry.B
  410.     call    compare.sym.tbl.entries
  411.     jz    put.add.misc.A.eql.B
  412. ;
  413.     call    switch.A
  414.     db stet.BYTE        ! dw put.add.misc.A.WORD
  415.     db stet.WORD        ! dw put.add.misc.A.WORD
  416.     db stet.spcl.byte.ptr    ! dw put.add.misc.BP
  417.     db stet.spcl.word.ptr    ! dw put.add.misc.WP
  418.     db    0        ! dw p.ADD.g.A.err
  419. ;
  420. p.ADD.g.A.err:
  421.     call    err.inv.numeric.var
  422. p.ADD.g.c:
  423.     lda    B.word.type
  424.     ani    wtp.cnst
  425.     jnz    put.add.misc.c.c
  426.     jmp    put.add.AN.B16.C16
  427. ;
  428. ;
  429. ;
  430. ;
  431. ;
  432. p.ADD.BCD.general:
  433.     call    switch.C
  434.     db stet.BCD        ! dw p.ADD.gBCD.C.BCD
  435.     db stet.spcl.BCD.ptr    ! dw p.ADD.gBCD.C.ptr
  436.     db    0        ! dw p.ADD.gBCD.C.err
  437. ;
  438. p.ADD.gBCD.C.err:
  439.     call    err.inv.var.type
  440. p.ADD.gBCD.C.BCD:
  441.     call    put.LXI.B.C
  442.     jmp    p.ADD.gBCD.A
  443. ;
  444. p.ADD.gBCD.C.ptr:
  445.     call    put.LHLD.C
  446.     call    put.mv.HL.to.BC
  447. ;
  448. p.ADD.gBCD.A:
  449.     lda    A.word.type
  450.     ani    wtp.cnst
  451.     jnz    p.ADD.gBCD.A.cnst
  452. ;
  453.     call    switch.A
  454.     db stet.BCD        ! dw p.ADD.gBCD.A.BCD
  455.     db stet.spcl.BCD.ptr    ! dw p.ADD.gBCD.A.ptr
  456.     db    0        ! dw p.ADD.gBCD.A.err
  457. ;
  458. p.ADD.gBCD.A.err:
  459.     call    err.inv.var.type
  460. p.ADD.gBCD.A.cnst:
  461.     lxi    h,sym.tbl.entry.A
  462.     call    put.inline.BCD
  463. p.ADD.gBCD.A.BCD:
  464.     call    put.LXI.D.A
  465.     jmp    p.ADD.gBCD.B
  466. ;
  467. p.ADD.gBCD.A.ptr:
  468.     call    put.LHLD.A
  469.     call    put.XCHG
  470. ;
  471. p.ADD.gBCD.B:
  472.     lda    B.word.type
  473.     ani    wtp.cnst
  474.     jnz    p.ADD.gBCD.B.cnst
  475. ;
  476.     call    switch.B
  477.     db stet.BCD        ! dw p.ADD.gBCD.B.BCD
  478.     db stet.spcl.BCD.ptr    ! dw p.ADD.gBCD.B.ptr
  479.     db    0        ! dw p.ADD.gBCD.B.err
  480. ;
  481. p.ADD.gBCD.B.err:
  482.     call    err.inv.var.type
  483. p.ADD.gBCD.B.cnst:
  484.     lxi    h,sym.tbl.entry.B
  485.     call    put.inline.BCD
  486. p.ADD.gBCD.B.BCD:
  487.     call    put.LXI.H.B
  488.     jmp    p.ADD.gBCD.ADD
  489. ;
  490. p.ADD.gBCD.B.ptr:
  491.     call    put.LHLD.B
  492. ;
  493. p.ADD.gBCD.ADD:
  494.     mvi    a,bir.BCD.add
  495.     jmp    put.bir.call.fwd
  496. ;
  497. ;
  498. ;
  499. ;
  500. ;------------------------------------------------------
  501. ;
  502. ;
  503. process.AND:
  504. process.OR:
  505. process.XOR:
  506.     lda    rsvd.wd.ix
  507.     sta    and.or.xor.type
  508.     call    get.word
  509.     call    chk.strt.code
  510.     call    get.var.A.word
  511.     lda    rsvd.wd.ix
  512.     cpi    rwix.WITH
  513.     cz    get.word
  514. ;
  515.     call    get.var.B.word
  516.     lda    rsvd.wd.ix
  517.     cpi    rwix.GIVING
  518.     jz    p.AOX.GIVING
  519. ;
  520.     lxi    h,sym.tbl.entry.A
  521.     lda    A.word.type
  522.     sta    C.word.type
  523.     ani    wtp.cnst
  524.     jz    p.AOX.no.g.A.ok
  525.     lda    B.word.type
  526.     sta    C.word.type
  527.     lxi    h,sym.tbl.entry.B
  528. p.AOX.no.g.A.ok:
  529.     lxi    d,sym.tbl.entry.C
  530.     call    move.sym.tbl.entry
  531.     jmp    p.AOX.cont
  532. ;
  533. p.AOX.GIVING:
  534.     call    get.word
  535.     call    get.var.C.word
  536. p.AOX.cont:
  537.     lxi    h,sym.tbl.entry.B
  538.     lxi    d,sym.tbl.entry.C
  539.     call    compare.sym.tbl.entries
  540.     cz    swap.A.B.sym.entries
  541. ;
  542.     call    switch.C
  543.     db stet.BYTE        ! dw p.AOX.x.x.8
  544.     db stet.WORD        ! dw p.AOX.16
  545.     db stet.spcl.byte.ptr    ! dw p.AOX.x.x.8
  546.     db stet.spcl.word.ptr    ! dw p.AOX.16
  547.     db    0        ! dw p.AOX.C.err
  548. ;
  549. ;
  550. p.AOX.C.err:
  551.     call    err.inv.var.type
  552. p.AOX.x.x.8:
  553.     lda    A.word.type
  554.     ani    wtp.cnst
  555.     jnz    p.AOX.c.x.8
  556. ;
  557.     lda    B.word.type
  558.     ani    wtp.cnst
  559.     jnz    p.AOX.x.c.8
  560. ;
  561.     call    switch.B
  562.     db stet.BYTE        ! dw p.AOX.x.8.8
  563.     db stet.WORD        ! dw p.AOX.x.16.8
  564.     db stet.spcl.byte.ptr    ! dw p.AOX.x.8.8
  565.     db stet.spcl.word.ptr    ! dw p.AOX.x.16.8
  566.     db    0        ! dw p.AOX.B8.err
  567. ;
  568. ;
  569. p.AOX.B8.err:
  570.     call    err.inv.var.type
  571. p.AOX.x.16.8:
  572.     call    err.truncate
  573. p.AOX.x.8.8:
  574.     call    put.get.B.into.A
  575. ;
  576.     call    switch.A
  577.     db stet.BYTE        ! dw p.AOX.8.8.8
  578.     db stet.WORD        ! dw p.AOX.16.8.8
  579.     db stet.spcl.byte.ptr    ! dw p.AOX.BP.8.8
  580.     db stet.spcl.word.ptr    ! dw p.AOX.WP.8.8
  581.     db    0        ! dw p.AOX.A8.err
  582. ;
  583. ;
  584. p.AOX.A8.err:
  585.     call    err.inv.var.type
  586. p.AOX.16.8.8:
  587.     call    err.truncate
  588. p.AOX.8.8.8:
  589.     call    put.LXI.H.A
  590.     jmp    p.AOX.8.go
  591. ;
  592. p.AOX.WP.8.8:
  593.     call    err.truncate
  594. p.AOX.BP.8.8:
  595.     call    put.LHLD.A
  596. p.AOX.8.go:
  597.     lda    and.or.xor.type
  598.     cpi    rwix.AND
  599.     jz    p.AOX.8.AND
  600.     cpi    rwix.OR
  601.     jz    p.AOX.8.OR
  602. ;
  603.     call    put.XRA.M
  604.     jmp    p.AOX.8.cont
  605. ;
  606. p.AOX.8.AND:
  607.     call    put.ANA.M
  608.     jmp    p.AOX.8.cont
  609. ;
  610. p.AOX.8.OR:
  611.     call    put.ORA.M
  612. p.AOX.8.cont:
  613.     lxi    h,sym.tbl.entry.A
  614.     lxi    d,sym.tbl.entry.B
  615.     call    compare.sym.tbl.entries
  616.     jz    put.MOV.M.A
  617.     jmp    put.store.A.at.C
  618. ;
  619. ;
  620. p.AOX.x.c.8:
  621.     call    swap.A.B.sym.entries
  622. ;
  623. p.AOX.c.x.8:
  624.     lda    B.word.type
  625.     ani    wtp.cnst
  626.     jnz    p.AOX.c.c.8
  627. ;
  628.     call    switch.B
  629.     db stet.BYTE        ! dw p.AOX.c.8.8
  630.     db stet.WORD        ! dw p.AOX.c.16.8
  631.     db stet.spcl.byte.ptr    ! dw p.AOX.c.8.8
  632.     db stet.spcl.word.ptr    ! dw p.AOX.c.16.8
  633.     db    0        ! dw p.AOX.cnst.err
  634. ;
  635. ;
  636. p.AOX.cnst.err:
  637.     call    err.inv.var.type
  638. p.AOX.c.c.8:
  639. ;
  640.     lda    ste.A.address
  641.     mov    b,a
  642.     lxi    h,ste.B.address
  643. ;
  644.     lda    and.or.xor.type
  645.     cpi    rwix.AND
  646.     jz    p.AOX.c.c.AND
  647.     cpi    rwix.OR
  648.     jz    p.AOX.c.c.OR
  649. ;
  650.     mov    a,b
  651.     xra    m
  652.     jmp    p.AOX.c.c.cont
  653. ;
  654. p.AOX.c.c.AND:
  655.     mov    a,b
  656.     ana    m
  657.     jmp    p.AOX.c.c.cont
  658. ;
  659. p.AOX.c.c.OR:
  660.     mov    a,b
  661.     ora    m
  662. p.AOX.c.c.cont:
  663.     mov    l,a
  664.     call    put.MVI.A.L
  665.     jmp    put.store.A.at.C
  666. ;
  667. ;
  668. ;
  669. ;
  670. ;
  671. p.AOX.c.16.8:
  672.     call    err.truncate
  673. p.AOX.c.8.8:
  674.     call    put.get.B.into.A
  675.     lhld    ste.A.address
  676.     lda    and.or.xor.type
  677.     cpi    rwix.AND
  678.     jz    p.AOX.A.c.AND
  679.     cpi    rwix.OR
  680.     jz    p.AOX.A.c.OR
  681. ;
  682.     call    put.XRI.L
  683.     jmp    put.store.A.at.C
  684. ;
  685. p.AOX.A.c.AND:
  686.     call    put.ANI.L
  687.     jmp    put.store.A.at.C
  688. ;
  689. p.AOX.A.c.OR:
  690.     call    put.ORI.L
  691.     jmp    put.store.A.at.C
  692. ;
  693. ;
  694. p.AOX.16:
  695.     lda    A.word.type
  696.     lxi    h,B.word.type
  697.     ana    m
  698.     ani    wtp.cnst
  699.     jnz    p.AOX.16.c.c
  700. ;
  701.     call    put.get.A.into.HL
  702.     call    put.XCHG
  703.     call    put.get.B.into.HL
  704. ;
  705.     lda    and.or.xor.type
  706.     cpi    rwix.AND
  707.     jz    p.AOX.AND
  708.     cpi    rwix.OR
  709.     jz    p.AOX.OR
  710. ;
  711.     call    put.bir.xor.16
  712.     jmp    put.store.HL.at.C
  713. ;
  714. p.AOX.AND:
  715.     call    put.bir.and.16
  716.     jmp    put.store.HL.at.C
  717. ;
  718. p.AOX.OR:
  719.     call    put.bir.or.16
  720.     jmp    put.store.HL.at.C
  721. ;
  722. ;
  723. ;
  724. p.AOX.16.c.c:
  725.     lhld    ste.A.address
  726.     xchg
  727.     lhld    ste.B.address
  728.     lda    and.or.xor.type
  729.     cpi    rwix.AND
  730.     jz    p.AOX.16.c.c.AND
  731.     cpi    rwix.OR
  732.     jz    p.AOX.16.c.c.OR
  733. ;
  734.     call    XOR.d.and.h
  735.     jmp    p.AOX.16.c.c.cont
  736. ;
  737. p.AOX.16.c.c.AND:
  738.     call    AND.d.and.h
  739.     jmp    p.AOX.16.c.c.cont
  740. ;
  741. p.AOX.16.c.c.OR:
  742.     call    OR.d.and.h
  743. p.AOX.16.c.c.cont:
  744.     call    put.LXI.H.hl
  745.     jmp    put.store.HL.at.C
  746. ;
  747. ;
  748. ;
  749. ;
  750. ;------------------------------------------------------
  751. ;
  752. ;
  753. process.APPEND:
  754.     call    chk.strt.code
  755.     call    get.word
  756.     call    get.var.A.word
  757. ;
  758.     lda    A.word.type
  759.     ani    wtp.string
  760.     cnz    put.inline.A.string
  761. ;
  762.     call    switch.A
  763.     db stet.STRING        ! dw p.APPEND.A.ok
  764.     db stet.spcl.string.ptr    ! dw p.APPEND.A.ok
  765.     db    0        ! dw p.APPEND.A.err
  766. p.APPEND.A.err:
  767.     call    err.inv.var.type
  768. p.APPEND.A.ok:
  769.     lda    rsvd.wd.ix
  770.     cpi    rwix.TO
  771.     cz    get.word
  772. ;
  773.     call    chk.word.id.only
  774.     call    get.var.B.word
  775.     call    switch.B
  776.     db stet.STRING        ! dw p.APPEND.B.str
  777.     db stet.spcl.string.ptr    ! dw p.APPEND.B.SP
  778.     db    0        ! dw p.APPEND.B.err
  779. ;
  780. p.APPEND.B.SP:
  781.     call    put.LHLD.B
  782.     call    put.XCHG
  783.     jmp    p.APPEND.go
  784. ;
  785. p.APPEND.B.err:
  786.     call    err.inv.var.type
  787. p.APPEND.B.str:
  788.     call    put.LXI.D.B
  789. p.APPEND.go:
  790.     lda    ste.A.type
  791.     cpi    stet.spcl.string.ptr
  792.     jz    p.APPEND.go.SP
  793.     call    put.LXI.H.A
  794.     jmp    p.APPEND.go.bir
  795. p.APPEND.go.SP:
  796.     call    put.LHLD.A
  797. p.APPEND.go.bir:
  798.     jmp    put.bir.APPEND
  799. ;
  800. ;
  801. ;
  802. ;
  803. ;------------------------------------------------------
  804. ;
  805. ;
  806. process.BCD:
  807.     call    set.byte.boundary
  808.     call    chk.strt.data
  809.     call    get.word
  810. ;
  811.     call    switch.rsvd.wd.ix
  812.     db rwix.POINTER        ! dw p.POINTER.BCD
  813.     db rwix.VALUE        ! dw p.BCD.VALUE
  814.     db rwix.comma        ! dw p.BCD.no.VALUE
  815.     db rwix.semicolon    ! dw p.BCD.no.VALUE
  816.     db    0        ! dw p.BCD.id
  817. ;
  818. p.BCD.id:
  819.     call    chk.word.id.only
  820.     call    chk.word.not.in.tbl
  821.     mvi    a,stet.BCD
  822.     sta    ste.type
  823.     lda    curr.bit.posn
  824.     sta    ste.bit.posn
  825.     lxi    h,bcd.size
  826.     shld    ste.length
  827.     call    put.word.into.tbl
  828. ;
  829.     call    get.word
  830.     lda    rsvd.wd.ix
  831.     cpi    rwix.VALUE
  832.     jz    p.BCD.VALUE
  833. ;
  834. p.BCD.no.VALUE:
  835.     lhld    curr.code.addr
  836.     lxi    d,bcd.size
  837.     dad    d
  838.     shld    curr.code.addr
  839.     jmp    p.BCD.comma
  840. ;
  841. p.BCD.VALUE:
  842.     call    get.word
  843.     lda    word
  844.     cpi    '0'
  845.     jc    p.BCD.inv.value
  846.     cpi    '9'+1
  847.     jnc    p.BCD.inv.value
  848. ;
  849.     lxi    h,word
  850.     lxi    d,BCD.cnst.value.wk
  851.     call    cvt.str.2.bcd
  852. ;
  853.     lxi    h,BCD.cnst.value.wk
  854.     lxi    b,BCD.size
  855.     call    put.code.block
  856. ;
  857.     call    get.word
  858.     jmp    p.BCD.comma
  859. ;
  860. p.BCD.inv.value:
  861.     call    err.inv.value
  862.     call    get.word
  863.     jmp    p.BCD.no.VALUE
  864. ;
  865. p.BCD.comma:
  866.     lda    rsvd.wd.ix
  867.     cpi    rwix.comma
  868.     jz    process.BCD
  869.     ret
  870. ;
  871. ;------------------------------------------------------
  872. ;
  873. ;
  874. process.BEGIN:
  875.     call    chk.strt.code
  876.     xra    a
  877.     sta    code.started.this.blk
  878.     sta    data.started.this.blk
  879.     call    bump.block.level
  880.     lhld    curr.src.line.num
  881.     push    h
  882.     call    get.word
  883. p.BEGIN.lup:
  884.     lda    rsvd.wd.ix
  885.     cpi    rwix.END
  886.     jz    p.BEGIN.exitloop
  887. ;
  888.     call    chk.not.blk.ender
  889.     jnz    p.BEGIN.stmt
  890. ;
  891.     call    err.missing.END
  892.     jmp    p.BEGIN.err.exitloop
  893. ;
  894. p.BEGIN.stmt:
  895.     call    process.a.statement
  896.     jmp    p.BEGIN.lup
  897. ;
  898. p.BEGIN.exitloop:
  899.     call    debug.routine
  900.     pop    h
  901.     shld    curr.block.match
  902.     call    chk.strt.code    ;for print address
  903.     call    get.word
  904.     jmp    p.BEGIN.got.mtch
  905. p.BEGIN.err.exitloop:
  906.     pop    h
  907.     shld    curr.block.match
  908. p.BEGIN.got.mtch:
  909.     call    chk.strt.code    ;in case no code
  910. ;
  911.     mvi    a,bir.EXITBEGIN
  912.     call    fix.up.built.in.rtn
  913. ;
  914.     mvi    a,0ffh
  915.     sta    code.started.this.blk
  916.     call    decr.block.level
  917.     jmp    squish.sym.tbl
  918. ;
  919. ;------------------------------------------------------
  920. ;
  921. ;
  922. process.BIT:
  923.     call    chk.strt.data
  924.     call    get.word
  925.     call    switch.rsvd.wd.ix
  926.     db rwix.VALUE        ! dw p.BIT.VALUE
  927.     db rwix.comma        ! dw p.BIT.FALSE
  928.     db    0        ! dw p.BIT.id
  929. ;
  930. p.BIT.id:
  931.     call    chk.word.id.only
  932.     call    chk.word.not.in.tbl
  933.     mvi    a,stet.BIT
  934.     sta    ste.type
  935.     lda    curr.bit.posn
  936.     sta    ste.BIT.posn
  937.     lxi    h,0
  938.     shld    ste.length
  939.     call    put.word.into.tbl
  940. ;
  941.     call    get.word
  942.     lda    rsvd.wd.ix
  943.     cpi    rwix.VALUE
  944.     jnz    p.BIT.not.VALUE
  945. p.BIT.VALUE:
  946.     call    get.word
  947.     lda    word.type
  948.     ani    wtp.cnst
  949.     jz    p.BIT.not.cnst
  950.     lda    cnst.value
  951.     ani    01h
  952.     jz    p.BIT.FALSE
  953.     jmp    p.BIT.TRUE
  954. p.BIT.not.cnst:
  955.     lda    word.type
  956.     ani    wtp.ident
  957.     jnz    p.BIT.VALUE.ident
  958. ;
  959. p.BIT.inv.VALUE:
  960.     call    err.inv.VALUE
  961.     call    get.word
  962.     jmp    p.BIT.not.VALUE
  963. ;
  964. p.BIT.VALUE.ident:
  965.     lda    rsvd.wd.ix
  966.     cpi    rwix.FALSE
  967.     jz    p.BIT.FALSE
  968.     cpi    rwix.TRUE
  969.     jnz    p.BIT.inv.VALUE
  970. p.BIT.TRUE:
  971.     lda    curr.BIT.posn
  972.     lxi    h,curr.BIT.build
  973.     ora    m
  974.     mov    m,a
  975.     call    get.word
  976.     jmp    p.BIT.not.VALUE
  977. p.BIT.FALSE:
  978.     lda    curr.bit.posn
  979.     cma
  980.     lxi    h,curr.bit.build
  981.     ana    m
  982.     mov    m,a
  983.     call    get.word
  984. p.BIT.not.VALUE:
  985.     lda    curr.BIT.posn
  986.     rrc
  987.     sta    curr.BIT.posn
  988.     cpi    80h
  989.     jnz    p.BIT.comma
  990.     lda    curr.BIT.build
  991.     call    put.code.byte
  992. ;---init for next bit
  993.     lhld    curr.code.addr
  994.     mvi    h,0
  995.     mov    a,l
  996.     ani    7fh
  997.     mov    l,a
  998.     lxi    d,code.buffer
  999.     dad    d
  1000.     mov    a,m
  1001.     sta    curr.bit.build
  1002. p.BIT.comma:
  1003.     lda    rsvd.wd.ix
  1004.     cpi    rwix.comma
  1005.     jz    process.BIT
  1006.     ret
  1007. ;
  1008. ;------------------------------------------------------
  1009. ;
  1010. ;
  1011. process.BYTE:
  1012.     call    set.byte.boundary
  1013.     call    chk.strt.data
  1014.     call    get.word
  1015. ;
  1016.     call    switch.rsvd.wd.ix
  1017.     db rwix.POINTER        ! dw p.POINTER.BYTE
  1018.     db rwix.VALUE        ! dw p.BYTE.VALUE
  1019.     db rwix.comma        ! dw p.BYTE.no.VALUE
  1020.     db rwix.semicolon    ! dw p.BYTE.no.VALUE
  1021.     db    0        ! dw p.BYTE.id
  1022. p.BYTE.id:
  1023.     call    chk.word.id.only
  1024.     call    chk.word.not.in.tbl
  1025.     mvi    a,stet.BYTE
  1026.     sta    ste.type
  1027.     lda    curr.BIT.posn
  1028.     sta    ste.BIT.posn
  1029.     lxi    h,1
  1030.     shld    ste.length
  1031.     call    put.word.into.tbl
  1032. ;
  1033.     call    get.word
  1034.     lda    rsvd.wd.ix
  1035.     cpi    rwix.VALUE
  1036.     jz    p.BYTE.VALUE
  1037. ;
  1038. p.BYTE.no.VALUE:
  1039.     lhld    curr.code.addr
  1040.     inx    h
  1041.     shld    curr.code.addr
  1042.     jmp    p.BYTE.comma
  1043. ;
  1044. p.BYTE.VALUE:
  1045.     call    get.word
  1046.     lda    word.type
  1047.     ani    wtp.cnst
  1048.     jnz    p.BYTE.cnst
  1049. ;
  1050.     call    err.inv.VALUE
  1051.     lhld    curr.code.addr
  1052.     inx    h
  1053.     shld    curr.code.addr
  1054.     call    get.word
  1055.     jmp    p.BYTE.comma
  1056. p.BYTE.cnst:
  1057.     lda    cnst.value
  1058.     call    put.code.byte
  1059.     call    get.word
  1060. p.BYTE.comma:
  1061.     lda    rsvd.wd.ix
  1062.     cpi    rwix.comma
  1063.     jz    process.BYTE
  1064.     ret
  1065. ;
  1066. ;------------------------------------------------------
  1067. ;
  1068. ;
  1069. process.CALL:
  1070.     call    chk.strt.code
  1071.     call    get.word
  1072.     lda    word.type
  1073.     ani    wtp.cnst
  1074.     jz    p.CALL.label
  1075. ;
  1076.     call    put.CALL
  1077.     lhld    cnst.value
  1078.     call    put.code.word
  1079.     jmp    get.word
  1080. ;
  1081. p.CALL.label:
  1082.     call    chk.word.id.only
  1083.     call    get.var.sym.tbl.entry
  1084.     lda    ste.type
  1085.     cpi    stet.end.tbl
  1086.     jz    p.CALL.fwd.ref
  1087. ;
  1088. ;---don't allow a call from one overlay to another that overlays it.---
  1089. ;---There would be nothing to return to upon completion of the call.---
  1090. ;
  1091.     lhld    ste.ovl.key
  1092.     mov    a,h
  1093.     ana    l
  1094.     inr    a
  1095.     jz    p.CALL.normal
  1096. ;
  1097. ;--this statement must be in global to call an overlay
  1098.     lda    overlay.in.process
  1099.     ora    a
  1100.     jz    p.CALL.from.global
  1101. ;--it is allowed to call within an overlay
  1102.     xchg
  1103.     lhld    curr.ovl.start.key
  1104.     xchg
  1105.     call    cmp.de.fm.hl
  1106.     jz    p.CALL.normal
  1107. ;--it is allowed to call an overlay in a different memory area--
  1108.     lhld    ste.address
  1109.     xchg
  1110.     lhld    start.code.addr
  1111.     call    cmp.de.fm.hl
  1112.     jnz    p.CALL.from.global    ;act like global call
  1113. ;
  1114.     call    err.ovl.call.ovl    ;same memory area -- no good
  1115. ;
  1116. p.CAll.from.global:
  1117.     lhld    ste.ovl.key
  1118.     call    put.LXI.H.hl
  1119.     lhld    ste.address
  1120.     call    put.LXI.D.hl
  1121.     lhld    ste.length
  1122.     call    put.LXI.B.hl
  1123. ;
  1124.     mvi    a,bir.overlay.load
  1125.     call    put.bir.call.fwd
  1126.     jmp    get.word
  1127. ;
  1128. p.CALL.fwd.ref:
  1129.     call    put.CALL
  1130.     call    put.fwd.ref.addr
  1131.     jmp    get.word
  1132. ;
  1133. p.CALL.normal:
  1134.     call    put.CALL
  1135.     lhld    ste.address
  1136.     call    put.code.word
  1137.     jmp    get.word
  1138. ;
  1139. ;------------------------------------------------------
  1140. ;
  1141. ;
  1142. process.CLOSE:
  1143.     call    chk.strt.code
  1144.     call    get.word
  1145.     call    chk.word.id.only
  1146.     call    get.var.A.word
  1147.     lda    ste.A.type
  1148.     cpi    stet.FILE
  1149.     cnz    err.undef.file.name
  1150. ;
  1151.     lda    ste.A.FILE.device
  1152.     cpi    rwix.DISK
  1153.     jnz    p.CLOSE.chk.comma
  1154. ;
  1155.     lda    rsvd.wd.ix
  1156.     cpi    rwix.PARTIAL
  1157.     jnz    p.CLOSE.not.PARTIAL
  1158.     call    get.word
  1159. ;---don't check MPM flag since close-routine needs
  1160. ;---this bit to not mark file closed.
  1161.     lhld    ste.A.address
  1162.     lxi    d,5
  1163.     dad    d
  1164.     call    put.LXI.H.hl
  1165.     call    put.MOV.A.M
  1166.     mvi    l,80h
  1167.     call    put.ORI.L
  1168.     call    put.MOV.M.A
  1169. p.CLOSE.not.PARTIAL:
  1170. ;
  1171.     call    put.LXI.D.A
  1172.     lda    ste.A.file.misc.flag
  1173.     ani    FILE.c.flag.text
  1174.     jz    p.CLOSE.not.text
  1175.     mvi    a,bir.dsk.ch.close
  1176.     call    put.bir.call.fwd
  1177. p.CLOSE.not.text:
  1178. ;
  1179.     call    put.MVI.C
  1180.     lda    rsvd.wd.ix
  1181.     cpi    rwix.REMOVE
  1182.     jnz    p.CLOSE.not.REMOVE
  1183.     call    get.word
  1184.     mvi    a,19    ;delete file
  1185.     jmp    p.CLOSE.do.it
  1186. p.CLOSE.not.REMOVE:
  1187.     mvi    a,16    ;close file
  1188. p.CLOSE.do.it:
  1189.     call    put.code.byte
  1190.     mvi    a,bir.close.disk
  1191.     call    put.bir.call.fwd
  1192. ;
  1193.     lda    rsvd.wd.ix
  1194.     cpi    rwix.ERROR
  1195.     jnz    p.CLOSE.chk.comma
  1196. ;
  1197.     call    put.INR.A
  1198.     call    get.word
  1199.     lda    rsvd.wd.ix
  1200.     cpi    rwix.STANDARD
  1201.     jz    p.CLOSE.err.STANDARD
  1202. ;
  1203.     call    put.JNZ
  1204.     mvi    a,bir.CLOSE.fwd
  1205.     call    put.fwd.ref.bir
  1206. ;
  1207.     call    process.a.statement
  1208. ;
  1209.     mvi    a,bir.CLOSE.fwd
  1210.     call    fix.up.built.in.rtn
  1211.     jmp    p.CLOSE.chk.comma
  1212. ;
  1213. p.CLOSE.err.STANDARD:
  1214.     call    put.CZ
  1215.     mvi    a,bir.close.error
  1216.     call    put.fwd.ref.bir
  1217.     call    get.word
  1218. ;
  1219. p.CLOSE.chk.comma:
  1220.     lda    rsvd.wd.ix
  1221.     cpi    rwix.comma
  1222.     jz    process.CLOSE
  1223.     ret
  1224. ;
  1225. ;
  1226. ;------------------------------------------------------
  1227. ;
  1228. ;
  1229. process.COMMENT:
  1230.     lda    src.char
  1231.     cpi    0dh
  1232.     jz    p.COMMENT.end
  1233.     cpi    1ah
  1234.     jz    p.COMMENT.end
  1235.     call    get.src.char
  1236.     jmp    process.COMMENT
  1237. ;
  1238. p.COMMENT.end:
  1239.     call    get.src.char
  1240.     jmp    get.word
  1241. ;
  1242. ;------------------------------------------------------
  1243. ;
  1244. ;
  1245. process.CONVERT:
  1246.     call    chk.strt.code
  1247.     call    get.word
  1248.     call    switch.rsvd.wd.ix
  1249.     db rwix.DEC        ! dw p.CONVERT.dec.bin
  1250.     db rwix.DECIMAL        ! dw p.CONVERT.dec.bin
  1251.     db rwix.HEX        ! dw p.CONVERT.hex.bin
  1252.     db rwix.HEXADECIMAL    ! dw p.CONVERT.hex.bin
  1253.     db rwix.OCT        ! dw p.CONVERT.oct.bin
  1254.     db rwix.OCTAL        ! dw p.CONVERT.oct.bin
  1255.     db    0        ! dw p.CONVERT.str.x
  1256. ;
  1257. p.CONVERT.str.x:
  1258.     call    chk.word.id.only
  1259.     call    get.var.A.word
  1260.     call    switch.A
  1261.     db stet.BCD        ! dw p.CONVERT.A.BCD
  1262.     db stet.spcl.BCD.ptr    ! dw p.CONVERT.A.BCD
  1263.     db stet.STRING        ! dw p.CONVERT.A.SP
  1264.     db stet.spcl.string.ptr    ! dw p.CONVERT.A.SP
  1265.     db    0        ! dw p.CONVERT.bin.x
  1266. ;
  1267. p.CONVERT.A.SP:
  1268.     lda    rsvd.wd.ix
  1269.     cpi    rwix.TO
  1270.     cz    get.word
  1271.     call    switch.rsvd.wd.ix
  1272.     db rwix.UPPER        ! dw p.CONVERT.UPPER
  1273.     db rwix.LOWER        ! dw p.CONVERT.LOWER
  1274.     db    0        ! dw p.CONVERT.unspec
  1275. ;
  1276. p.CONVERT.unspec:
  1277.     call    chk.word.id.only
  1278.     call    get.var.B.word
  1279.     call    switch.B
  1280.     db stet.BCD        ! dw p.CONVERT.str.BCD
  1281.     db stet.spcl.BCD.ptr    ! dw p.CONVERT.str.BCDP
  1282.     db    0        ! dw p.CONVERT.str.bin
  1283. ;
  1284. p.CONVERT.str.bin:
  1285.     call    p.CONVERT.x.bin.entry
  1286.     mvi    a,bir.cvt.dec.bin
  1287.     call    put.bir.call.fwd
  1288.     jmp    put.store.HL.at.B
  1289. ;
  1290. p.CONVERT.UPPER:
  1291.     call    put.LXI.H.A
  1292.     mvi    a,bir.cvt.upper.case
  1293.     jmp    p.CONVERT.up.lo.cont
  1294. ;
  1295. p.CONVERT.LOWER:
  1296.     call    put.LXI.H.A
  1297.     mvi    a,bir.cvt.lower.case
  1298. p.CONVERT.up.lo.cont:
  1299.     call    put.bir.call.fwd
  1300.     call    get.word
  1301.     lda    rsvd.wd.ix
  1302.     cpi    rwix.CASE
  1303.     cz    get.word
  1304.     ret
  1305. ;
  1306. p.CONVERT.A.BCD:
  1307.     lda    rsvd.wd.ix
  1308.     cpi    rwix.TO
  1309.     cz    get.word
  1310.     lda    rsvd.wd.ix
  1311.     cpi    rwix.DEC
  1312.     cz    get.word
  1313.     lda    rsvd.wd.ix
  1314.     cpi    rwix.DECIMAL
  1315.     cz    get.word
  1316.     call    chk.word.id.only
  1317.     call    get.var.B.word
  1318.     call    switch.B
  1319.     db stet.BYTE        ! dw p.CONVERT.BCD.bin
  1320.     db stet.WORD        ! dw p.CONVERT.BCD.bin
  1321.     db stet.spcl.byte.ptr    ! dw p.CONVERT.BCD.bin
  1322.     db stet.spcl.word.ptr    ! dw p.CONVERT.BCD.bin
  1323.     db stet.STRING        ! dw p.CONVERT.BCD.str
  1324.     db stet.spcl.string.ptr    ! dw p.CONVERT.BCD.str.ptr
  1325.     db    0        ! dw p.CONVERT.BCD.err
  1326. ;
  1327. p.CONVERT.BCD.str.ptr:
  1328.     call    put.LHLD.B
  1329.     call    put.XCHG
  1330.     jmp    p.CONVERT.BCD.str.cont
  1331. ;
  1332. p.CONVERT.BCD.STR:
  1333.     call    put.LXI.D.B
  1334. p.CONVERT.BCD.str.cont:
  1335.     lda    ste.A.type
  1336.     cpi    stet.BCD
  1337.     jz    p.CONVERT.BCD.s.A.bcd
  1338.     call    put.LHLD.A
  1339.     jmp    p.CONVERT.BCD.s.A.cont
  1340. p.CONVERT.BCD.s.A.bcd:
  1341.     call    put.LXI.H.A
  1342. p.CONVERT.BCD.s.A.cont:
  1343.     mvi    a,bir.cvt.bcd.str
  1344.     jmp    put.bir.call.fwd
  1345. ;
  1346. ;
  1347. ;
  1348. p.CONVERT.BCD.err:
  1349.     call    err.inv.var.type
  1350. p.CONVERT.BCD.bin:
  1351.     lda    ste.A.type
  1352.     cpi    stet.BCD
  1353.     jz    p.CONVERT.BCD.b.A.bcd
  1354.     call    put.LHLD.A
  1355.     jmp    p.CONVERT.BCD.b.A.cont
  1356. p.CONVERT.BCD.b.A.bcd:
  1357.     call    put.LXI.H.A
  1358. p.CONVERT.BCD.b.A.cont:
  1359.     mvi    a,bir.cvt.bcd.bin
  1360.     call    put.bir.call.fwd
  1361.     jmp    put.store.HL.at.B
  1362. ;
  1363. ;
  1364. ;
  1365. p.CONVERT.str.BCD:
  1366.     call    put.LXI.D.B
  1367.     jmp    p.CONVERT.str.BCD.cont
  1368. p.CONVERT.str.BCDP:
  1369.     call    put.LHLD.B
  1370.     call    put.XCHG
  1371. p.CONVERT.str.BCD.cont:
  1372.     lda    ste.A.type
  1373.     cpi    stet.spcl.string.ptr
  1374.     jz    p.CONVERT.SP.BCD
  1375.     call    put.LXI.H.A
  1376.     jmp    p.CONVERT.str.BCD.more
  1377. p.CONVERT.SP.BCD:
  1378.     call    put.LHLD.A
  1379. p.CONVERT.str.BCD.more:
  1380.     mvi    a,bir.cvt.str.bcd
  1381.     jmp    put.bir.call.fwd
  1382. ;
  1383. ;
  1384. ;
  1385. p.CONVERT.hex.bin:
  1386.     call    p.CONVERT.x.bin.prefix
  1387.     mvi    a,bir.cvt.hex.bin
  1388.     jmp    p.CONVERT.x.bin.post
  1389. ;
  1390. p.CONVERT.dec.bin:
  1391.     call    p.CONVERT.x.bin.prefix
  1392.     mvi    a,bir.cvt.dec.bin
  1393.     jmp    p.CONVERT.x.bin.post
  1394. ;
  1395. p.CONVERT.oct.bin:
  1396.     call    p.CONVERT.x.bin.prefix
  1397.     mvi    a,bir.cvt.oct.bin
  1398.     jmp    p.CONVERT.x.bin.post
  1399. ;
  1400. p.CONVERT.x.bin.prefix:
  1401.     call    get.word
  1402.     call    chk.word.id.only
  1403.     call    get.var.A.word
  1404. p.CONVERT.x.bin.entry:
  1405.     lda    ste.A.type
  1406.     cpi    stet.STRING
  1407.     jz    p.CONVERT.str.prefix
  1408.     cpi    stet.spcl.string.ptr
  1409.     jz    p.CONVERT.SP.prefix
  1410.     jmp    err.inv.var.type
  1411. ;
  1412. p.CONVERT.str.prefix:
  1413.     jmp    put.LXI.H.A
  1414. ;
  1415. p.CONVERT.SP.prefix:
  1416.     jmp    put.LHLD.A
  1417. ;
  1418. ;
  1419. p.CONVERT.x.bin.post:
  1420.     call    put.bir.call.fwd
  1421.     lda    rsvd.wd.ix
  1422.     cpi    rwix.TO
  1423.     cz    get.word
  1424.     call    chk.word.id.only
  1425.     call    get.var.B.word
  1426.     jmp    put.store.HL.at.B
  1427. ;
  1428. ;
  1429. ;
  1430. p.CONVERT.bin.x:
  1431.     lda    rsvd.wd.ix
  1432.     cpi    rwix.TO
  1433.     cz    get.word
  1434. ;
  1435.     call    switch.rsvd.wd.ix
  1436.     db rwix.DEC        ! dw p.CONVERT.bin.dec
  1437.     db rwix.DECIMAL        ! dw p.CONVERT.bin.dec
  1438.     db rwix.HEX        ! dw p.CONVERT.bin.hex
  1439.     db rwix.HEXADECIMAL    ! dw p.CONVERT.bin.hex
  1440.     db rwix.OCT        ! dw p.CONVERT.bin.oct
  1441.     db rwix.OCTAL        ! dw p.CONVERT.bin.oct
  1442.     db    0        ! dw p.CONVERT.bin.not.str
  1443. ;
  1444. p.CONVERT.bin.not.str:
  1445.     call    chk.word.id.only
  1446.     call    get.var.B.word
  1447.     call    switch.B
  1448.     db stet.BCD        ! dw p.CONVERT.bin.BCD
  1449.     db stet.spcl.BCD.ptr    ! dw p.CONVERT.bin.BCDP
  1450.     db    0        ! dw p.CONVERT.bin.unspec
  1451. ;
  1452. p.CONVERT.bin.unspec:
  1453.     mvi    a,bir.cvt.bin.dec
  1454.     sta    curr.cvt.type
  1455.     jmp    p.CONVERT.bin.x.entry
  1456. ;
  1457. p.CONVERT.bin.BCD:
  1458.     call    put.LXI.D.B
  1459.     jmp    p.CONVERT.bin.BCD.cont
  1460. ;
  1461. p.CONVERT.bin.BCDP:
  1462.     call    put.LHLD.B
  1463.     call    put.XCHG
  1464. p.CONVERT.bin.BCD.cont:
  1465.     call    put.get.A.into.HL
  1466.     mvi    a,bir.cvt.bin.bcd
  1467.     jmp    put.bir.call.fwd
  1468. ;
  1469. p.CONVERT.bin.dec:
  1470.     mvi    a,bir.cvt.bin.dec
  1471.     jmp    p.CONVERT.bin.x.post
  1472. ;
  1473. p.CONVERT.bin.hex:
  1474.     mvi    a,bir.cvt.bin.hex
  1475.     jmp    p.CONVERT.bin.x.post
  1476. ;
  1477. p.CONVERT.bin.oct:
  1478.     mvi    a,bir.cvt.bin.oct
  1479. ;
  1480. p.CONVERT.bin.x.post:
  1481.     sta    curr.cvt.type
  1482.     call    get.word
  1483.     call    chk.word.id.only
  1484.     call    get.var.B.word
  1485. p.CONVERT.bin.x.entry:
  1486.     call    switch.B
  1487.     db stet.STRING        ! dw p.CONVERT.bin.str
  1488.     db stet.spcl.string.ptr    ! dw p.CONVERT.bin.SP
  1489.     db    0        ! dw p.CONVERT.bin.err
  1490. p.CONVERT.bin.err:
  1491.     call    err.inv.var.type
  1492. p.CONVERT.bin.str:
  1493.     call    put.get.A.into.HL
  1494.     call    put.LXI.D.B
  1495.     jmp    p.CONVERT.bin.x.cont
  1496. ;
  1497. p.CONVERT.bin.SP:
  1498.     call    put.LHLD.B
  1499.     call    put.XCHG
  1500.     call    put.get.A.into.HL
  1501. ;
  1502. p.CONVERT.bin.x.cont:
  1503.     lda    curr.cvt.type
  1504.     jmp    put.bir.call.fwd
  1505. ;
  1506. ;
  1507. ;------------------------------------------------------
  1508. ;
  1509. ;
  1510. process.COPY:
  1511.     call    get.word
  1512.     call    get.var.A.word
  1513.     lda    A.word.type
  1514.     ani    wtp.string
  1515.     jz    err.unexpect.word
  1516. ;
  1517.     lxi    h,copy.nest.count
  1518.     mov    a,m
  1519.     cpi    copy.nest.limit
  1520.     jnc    err.nested.copy
  1521. ;
  1522.     inr    m
  1523. ;
  1524.     lxi    h,src.in + copy.move.size
  1525.     lxi    d,copy.swap.area + copy.move.size
  1526.     lxi    b,copy.move.size
  1527.     call    move.bkwds.h.2.d.cnt.b
  1528. ;
  1529.     lxi    h,1    ;new line # for libr
  1530.     shld    curr.src.line.num
  1531. ;
  1532.     lxi    h,ste.A.name
  1533. ;
  1534. p.COPY.try.open:
  1535.     lxi    d,src.in
  1536.     call    format.file.name
  1537. ;
  1538.     call    set.up.src.fcb
  1539.     lxi    h,src.in + 6    ;R/O mode for MP/M
  1540.     mov    a,m
  1541.     ori    80h
  1542.     mov    m,a
  1543.     lxi    d,src.in
  1544.     mvi    c,15    ;open
  1545.     call    entry
  1546.     inr    a
  1547.     jnz    p.COPY.opened
  1548. ;
  1549.     lxi    h,src.in + 1
  1550.     lxi    d,p.COPY.dsk.name
  1551.     lxi    b,11
  1552.     call    move.h.2.d.cnt.b
  1553. ;
  1554.     lxi    d,p.COPY.dsk.msg
  1555.     mvi    c,9    ;display
  1556.     call    entry
  1557. ;
  1558.     lxi    H,word
  1559.     mvi    c,20
  1560.     call    ACCEPT.from.console
  1561. ;
  1562.     lxi    h,word
  1563.     jmp    p.COPY.try.open
  1564. ;
  1565. ;
  1566. p.COPY.opened:
  1567.     call    get.src.char
  1568.     jmp    get.word
  1569. ;
  1570. ;
  1571. p.COPY.dsk.msg:
  1572.     db    'Can''t find COPY file - '
  1573. p.COPY.dsk.name:
  1574.     ds    12
  1575.     db    '. Please enter file-name:$'
  1576. ;
  1577. ;
  1578. ;
  1579. ;------------------------------------------------------
  1580. ;
  1581. ;
  1582. process.DISABLE:
  1583.     call    chk.strt.code
  1584.     call    get.word
  1585.     lda    rsvd.wd.ix
  1586.     cpi    rwix.INTERRUPTS
  1587.     cz    get.word
  1588.     jmp    put.DI
  1589. ;
  1590. ;
  1591. ;------------------------------------------------------
  1592. ;
  1593. ;
  1594. process.DISPLAY:
  1595.     call    chk.strt.code
  1596.     call    get.word
  1597.     lda    rsvd.wd.ix
  1598.     cpi    rwix.semicolon
  1599.     rz
  1600.     call    get.var.A.word
  1601.     lda    A.word.type
  1602.     ani    wtp.string
  1603.     jz    p.DISPLAY.var
  1604. ;
  1605.     call    put.inline.A.string
  1606. ;
  1607. p.DISPLAY.var:
  1608.     call    switch.A
  1609.     db stet.STRING        ! dw p.DISPLAY.str
  1610.     db stet.spcl.string.ptr    ! dw p.DISPLAY.SP
  1611.     db stet.RECORD        ! dw p.DISPLAY.str
  1612.     db    0        ! dw p.DISPLAY.err
  1613. p.DISPLAY.err:
  1614.     call    err.inv.var.type
  1615. p.DISPLAY.str:
  1616.     call    put.LXI.H.A
  1617.     jmp    p.DISPLAY.call
  1618. ;
  1619. p.DISPLAY.SP:
  1620.     call    put.LHLD.A
  1621. p.DISPLAY.call:
  1622.     mvi    a,bir.DISPLAY
  1623.     call    put.bir.call.fwd
  1624. ;
  1625.     lda    rsvd.wd.ix
  1626.     cpi    rwix.comma
  1627.     jz    process.DISPLAY
  1628.     mvi    a,bir.DISPLAY.crlf
  1629.     jmp    put.bir.call.fwd
  1630. ;
  1631. ;
  1632. ;
  1633. ;------------------------------------------------------
  1634. ;
  1635. ;
  1636. process.DIVIDE:
  1637.     call    chk.strt.code
  1638.     call    get.word
  1639.     call    get.var.A.word
  1640.     lda    A.word.type
  1641.     ani    wtp.cnst
  1642.     jnz    p.DIVIDE.A
  1643.     call    switch.A
  1644.     db stet.BYTE        ! dw p.DIVIDE.A
  1645.     db stet.WORD        ! dw p.DIVIDE.A
  1646.     db stet.spcl.byte.ptr    ! dw p.DIVIDE.A
  1647.     db stet.spcl.word.ptr    ! dw p.DIVIDE.A
  1648.     db stet.BCD        ! dw p.DIVIDE.BCD
  1649.     db stet.spcl.BCD.ptr    ! dw p.DIVIDE.BCD
  1650.     db    0        ! dw p.DIVIDE.A.err
  1651. ;
  1652. p.DIVIDE.A.err:
  1653.     call    err.inv.numeric.var
  1654. p.DIVIDE.A:
  1655.     lda    rsvd.wd.ix
  1656.     cpi    rwix.BY
  1657.     jnz    err.mssng.rsvd.wd
  1658.     call    get.word
  1659. ;
  1660.     call    get.var.B.word
  1661.     lda    rsvd.wd.ix
  1662.     cpi    rwix.GIVING
  1663.     jz    p.DIVIDE.3
  1664. ;
  1665. ;---2-address divide---
  1666. ;
  1667.     lxi    h,sym.tbl.entry.A
  1668.     lxi    d,sym.tbl.entry.C
  1669.     call    move.sym.tbl.entry
  1670.     lda    A.word.type
  1671.     sta    C.word.type
  1672.     jmp    p.DIVIDE.ok
  1673. ;
  1674. p.DIVIDE.3:
  1675.     call    get.word
  1676.     call    chk.word.id.only
  1677.     call    get.var.C.word
  1678.     lda    ste.C.type
  1679.     cpi    stet.BYTE
  1680.     jz    p.DIVIDE.ok
  1681.     cpi    stet.WORD
  1682.     cnz    err.inv.numeric.var
  1683. p.DIVIDE.ok:
  1684. ;
  1685.     lda    A.word.type
  1686.     ani    wtp.cnst
  1687.     jnz    p.DIVIDE.A.cnst
  1688.     call    switch.A
  1689.     db stet.BYTE        ! dw p.DIVIDE.A.BYTE
  1690.     db stet.WORD        ! dw p.DIVIDE.A.WORD
  1691.     db stet.spcl.byte.ptr    ! dw p.DIVIDE.A.BP
  1692.     db stet.spcl.word.ptr    ! dw p.DIVIDE.A.WP
  1693.     db    0        ! dw p.DIVIDE.A.c.err
  1694. ;
  1695. p.DIVIDE.A.c.err:
  1696.     call    err.inv.numeric.var
  1697. p.DIVIDE.A.cnst:
  1698.     lda    B.word.type
  1699.     ani    wtp.cnst
  1700.     jnz    p.DIVIDE.cnst.cnst
  1701. ;
  1702.     call    switch.A
  1703.     db stet.BCD        ! dw p.DIVIDE.cnst.BCD
  1704.     db stet.spcl.BCD.ptr    ! dw p.DIVIDE.cnst.BCD
  1705.     db    0        ! dw p.DIVIDE.A.really.cnst
  1706. ;
  1707. p.DIVIDE.A.really.cnst:
  1708.     call    put.LXI.D.A
  1709.     jmp    p.DIVIDE.A.done
  1710. ;
  1711. p.DIVIDE.cnst.cnst:
  1712.     lhld    ste.A.address
  1713.     xchg
  1714.     lhld    ste.B.address
  1715.     call    div.d.by.h.2.d.r.h
  1716.     push    d
  1717.     call    put.LXI.H.hl
  1718.     pop    h
  1719.     call    put.LXI.D.hl
  1720.     jmp    p.DIVIDE.result
  1721. ;
  1722. p.DIVIDE.A.BYTE:
  1723. p.DIVIDE.A.WORD:
  1724.     call    put.get.A.into.HL
  1725.     call    put.XCHG
  1726.     jmp    p.DIVIDE.A.done
  1727. ;
  1728. p.DIVIDE.A.BP:
  1729.     call    put.LHLD.A
  1730.     call    put.mv.@HLB.to.DE
  1731.     jmp    p.DIVIDE.A.done
  1732. ;
  1733. p.DIVIDE.A.WP:
  1734.     call    put.LHLD.A
  1735.     call    put.mv.@HL.to.DE
  1736. p.DIVIDE.A.done:
  1737.     lda    B.word.type
  1738.     ani    wtp.cnst
  1739.     jz    p.DIVIDE.not.spcl
  1740.     call    put.LXI.H.B
  1741.     jmp    p.DIVIDE.B.done
  1742. ;
  1743. p.DIVIDE.not.spcl:
  1744.     call    put.get.B.into.HL
  1745. p.DIVIDE.B.done:
  1746.     call    put.div.16
  1747. ;
  1748. p.DIVIDE.result:
  1749.     lda    rsvd.wd.ix
  1750.     cpi    rwix.REMAINDER
  1751.     jnz    p.DIVIDE.no.rmdr
  1752.     call    get.word
  1753.     call    chk.word.id.only
  1754.     call    get.var.B.word
  1755.     call    switch.B
  1756.     db stet.BYTE        ! dw p.DIVIDE.rmdr.BYTE
  1757.     db stet.WORD        ! dw p.DIVIDE.rmdr.WORD
  1758.     db stet.spcl.byte.ptr    ! dw p.DIVIDE.rmdr.BP
  1759.     db stet.spcl.word.ptr    ! dw p.DIVIDE.rmdr.WP
  1760.     db    0        ! dw p.DIVIDE.rmdr.err
  1761. ;
  1762. p.DIVIDE.rmdr.err:
  1763.     call    err.inv.numeric.var
  1764. p.DIVIDE.rmdr.BP:
  1765.     call    err.truncate
  1766.     call    put.MOV.A.L
  1767.     call    put.LHLD.B
  1768.     call    put.MOV.M.A
  1769.     jmp    p.DIVIDE.no.rmdr
  1770. ;
  1771. p.DIVIDE.rmdr.WP:
  1772.     call    put.mv.HL.to.BC
  1773.     call    put.LHLD.B
  1774.     call    put.MOV.M.C
  1775.     call    put.INX.H
  1776.     call    put.MOV.M.B
  1777.     jmp    p.DIVIDE.no.rmdr
  1778. ;
  1779. p.DIVIDE.rmdr.WORD:
  1780.     call    put.SHLD.B
  1781.     jmp    p.DIVIDE.no.rmdr
  1782. p.DIVIDE.rmdr.BYTE:
  1783.     call    err.truncate
  1784.     call    put.MOV.A.L
  1785.     call    put.STA.B
  1786. p.DIVIDE.no.rmdr:
  1787.     call    switch.C
  1788.     db stet.BYTE        ! dw p.DIVIDE.rslt.BYTE
  1789.     db stet.WORD        ! dw p.DIVIDE.rslt.WORD
  1790.     db stet.spcl.byte.ptr    ! dw p.DIVIDE.rslt.BP
  1791.     db stet.spcl.word.ptr    ! dw p.DIVIDE.rslt.WP
  1792.     db    0        ! dw p.DIVIDE.rslt.err
  1793. ;
  1794. p.DIVIDE.rslt.err:
  1795.     call    err.inv.numeric.var
  1796. p.DIVIDE.rslt.BP:
  1797.     call    err.truncate
  1798.     call    put.LHLD.C
  1799.     jmp    put.MOV.M.E
  1800. ;
  1801. p.DIVIDE.rslt.WP:
  1802.     call    put.LHLD.C
  1803.     jmp    put.mv.DE.to.@HL
  1804. ;
  1805. p.DIVIDE.rslt.WORD:
  1806.     call    put.XCHG
  1807.     jmp    put.SHLD.C
  1808. ;
  1809. p.DIVIDE.rslt.BYTE:
  1810.     call    err.truncate
  1811.     call    put.MOV.A.E
  1812.     jmp    put.STA.C
  1813. ;
  1814. ;
  1815. ;
  1816. p.DIVIDE.BCD:
  1817.     lda    rsvd.wd.ix
  1818.     cpi    rwix.BY
  1819.     jnz    err.mssng.rsvd.wd
  1820.     call    get.word
  1821.     call    get.var.B.word
  1822. ;
  1823.     lda    B.word.type
  1824.     ani    wtp.cnst
  1825.     jnz    p.DIVIDE.BCD.cnst
  1826.     call    switch.B
  1827.     db stet.BCD        ! dw p.DIVIDE.BCD.B.ok
  1828.     db stet.spcl.BCD.ptr    ! dw p.DIVIDE.BCD.B.ok
  1829.     db    0        ! dw p.DIVIDE.BCD.B.err
  1830. p.DIVIDE.BCD.B.err:
  1831.     call    err.inv.var.type
  1832. p.DIVIDE.BCD.B.ok:
  1833.     lda    rsvd.wd.ix
  1834.     cpi    rwix.GIVING
  1835.     jz    p.DIVIDE.BCD.3
  1836. ;---2-address BCD divide---
  1837.     lxi    h,sym.tbl.entry.A
  1838.     lxi    d,sym.tbl.entry.C
  1839.     call    move.sym.tbl.entry
  1840.     lda    A.word.type
  1841.     sta    C.word.type
  1842.     jmp    p.DIVIDE.BCD.C.ok
  1843. ;
  1844. p.DIVIDE.BCD.3:
  1845.     call    get.word
  1846.     call    chk.word.id.only
  1847.     call    get.var.C.word
  1848. p.DIVIDE.BCD.C.ok:
  1849.     lda    ste.C.type
  1850.     cpi    stet.BCD
  1851.     jz    p.DIVIDE.BCD.C
  1852.     cpi    stet.spcl.bcd.ptr
  1853.     cnz    err.inv.var.type
  1854. ;
  1855.     call    put.LHLD.C
  1856.     call    put.mv.HL.to.BC
  1857.     jmp    p.DIVIDE.BCD.A
  1858. ;
  1859. p.DIVIDE.BCD.C:
  1860.     call    put.LXI.B.C
  1861. p.DIVIDE.BCD.A:
  1862.     lda    ste.A.type
  1863.     cpi    stet.spcl.bcd.ptr
  1864.     jz    p.DIVIDE.BCD.A.ptr
  1865. ;
  1866.     call    put.LXI.D.A
  1867.     jmp    p.DIVIDE.BCD.B
  1868. ;
  1869. p.DIVIDE.BCD.A.ptr:
  1870.     call    put.LHLD.A
  1871.     call    put.XCHG
  1872. p.DIVIDE.BCD.B:
  1873.     lda    ste.B.type
  1874.     cpi    stet.spcl.bcd.ptr
  1875.     jz    p.DIVIDE.BCD.B.ptr
  1876. ;
  1877.     call    put.LXI.H.B
  1878.     jmp    p.DIVIDE.BCD.call
  1879. ;
  1880. p.DIVIDE.BCD.B.ptr:
  1881.     call    put.LHLD.B
  1882. p.DIVIDE.BCD.call:
  1883.     mvi    a,bir.BCD.divide
  1884.     call    put.bir.call.fwd
  1885. ;
  1886.     lda    rsvd.wd.ix
  1887.     cpi    rwix.REMAINDER
  1888.     jnz    p.DIVIDE.BCD.no.rmdr
  1889. ;
  1890.     call    get.word
  1891.     call    chk.word.id.only
  1892.     call    get.var.B.word
  1893.     lda    ste.B.type
  1894.     cpi    stet.BCD
  1895.     jz    p.DIVIDE.BCD.rmdr
  1896.     cpi    stet.spcl.bcd.ptr
  1897.     cnz    err.inv.var.type
  1898. ;
  1899.     call    put.LHLD.B
  1900.     call    put.XCHG
  1901.     jmp    p.DIVIDE.BCD.R.cont
  1902. ;
  1903. p.DIVIDE.BCD.rmdr:
  1904.     call    put.LXI.D.B
  1905. p.DIVIDE.BCD.R.cont:
  1906.     mvi    a,bir.dividend
  1907.     call    put.LXI.H.fwd
  1908.     lxi    h,bcd.size - 2
  1909.     call    put.LXI.B.hl
  1910.     call    put.DAD.B
  1911.     call    put.bir.move.bcd
  1912.     call    get.word
  1913. p.DIVIDE.BCD.no.rmdr:
  1914.     ret
  1915. ;
  1916. ;
  1917. p.DIVIDE.cnst.BCD:
  1918.     lxi    h,sym.tbl.entry.A
  1919.     call    put.inline.BCD
  1920.     jmp    p.DIVIDE.BCD.C.ok
  1921. ;
  1922. ;
  1923. p.DIVIDE.BCD.cnst:
  1924.     lxi    h,sym.tbl.entry.B
  1925.     call    put.inline.BCD
  1926.     jmp    p.DIVIDE.BCD.B.ok
  1927. ;
  1928. ;------------------------------------------------------
  1929. ;
  1930. ;
  1931. process.DO:
  1932.     call    chk.strt.code
  1933.     call    bump.block.level
  1934.     lhld    curr.code.addr
  1935.     push    h
  1936. ;
  1937.     lhld    curr.src.line.num
  1938.     push    h
  1939.     call    get.word
  1940. p.DO.lup:
  1941.     mvi    a,bir.WHILE.TRUE
  1942.     call    fix.up.built.in.rtn
  1943. p.DO.stmt.lup:
  1944.     call    switch.rsvd.wd.ix
  1945.     db rwix.OD        ! dw p.DO.OD
  1946.     db rwix.UNTIL        ! dw p.DO.UNTIL
  1947.     db    0        ! dw p.DO.chk.unmatch
  1948. ;
  1949. p.DO.chk.unmatch:
  1950.     call    chk.not.blk.ender
  1951.     jnz    p.DO.stmt
  1952.     call    err.missing.OD
  1953.     jmp    p.DO.OD.err
  1954. ;
  1955. p.DO.stmt:
  1956.     call    process.a.statement
  1957.     jmp    p.DO.stmt.lup
  1958. ;
  1959. p.DO.OD:
  1960.     call    debug.routine
  1961.     pop    h
  1962.     shld    curr.block.match
  1963.     call    get.word
  1964.     jmp    p.DO.OD.got.mtch
  1965. ;
  1966. p.DO.OD.err:
  1967.     pop    h
  1968.     shld    curr.block.match
  1969. p.DO.OD.got.mtch:
  1970.     lda    rsvd.wd.ix
  1971.     cpi    rwix.UNTIL
  1972.     jz    p.DO.UNTIL.got.mtch
  1973.     call    put.JMP
  1974.     pop    h
  1975.     call    put.code.word
  1976. ;
  1977. ;---clean-up any exitloop references---
  1978. ;
  1979. p.DO.fix.up:
  1980.     mvi    a,bir.WHILE.TRUE
  1981.     call    fix.up.built.in.rtn
  1982.     mvi    a,bir.EXITDO
  1983.     call    fix.up.built.in.rtn
  1984.     call    decr.block.level
  1985.     jmp    squish.sym.tbl
  1986. ;
  1987. p.DO.UNTIL:
  1988.     call    debug.routine
  1989.     pop    h
  1990.     shld    curr.block.match
  1991. p.DO.UNTIL.got.mtch:
  1992.     call    get.word
  1993. ;
  1994.     mvi    a,bir.UNTIL.FALSE
  1995.     sta    curr.fwd.no.fall.thru
  1996.     mvi    a,0ffh
  1997.     sta    fall.thru.true
  1998.     sta    no.fall.thru.fwd.flag
  1999.     call    process.expression
  2000. ;
  2001. p.DO.UNTIL.compound:
  2002.     call    switch.rsvd.wd.ix
  2003.     db rwix.AND        ! dw p.DO.UNTIL.got.mtch
  2004.     db rwix.OR        ! dw p.DO.OR
  2005.     db rwix.COMMENT        ! dw p.DO.UNTIL.COMMENT
  2006.     db    0        ! dw p.DO.UNTIL.expr.end
  2007. ;
  2008. p.DO.UNTIL.COMMENT:
  2009.     call    process.COMMENT
  2010.     jmp    p.DO.UNTIL.compound
  2011. ;
  2012. p.DO.UNTIL.expr.end:
  2013.     lhld    curr.code.addr
  2014.     xthl    ;hl <- start loop
  2015.     shld    curr.code.addr
  2016.     mvi    a,bir.UNTIL.FALSE
  2017.     call    fix.up.built.in.rtn
  2018.     pop    h
  2019.     shld    curr.code.addr
  2020. ;
  2021.     jmp    p.DO.fix.up
  2022. ;
  2023. ;
  2024. p.DO.OR:
  2025.     mvi    a,bir.EXITDO
  2026.     call    put.bir.jmp.fwd
  2027.     mvi    a,bir.UNTIL.FALSE
  2028.     call    fix.up.built.in.rtn
  2029.     jmp    p.DO.UNTIL.got.mtch
  2030. ;
  2031. ;
  2032. ;------------------------------------------------------
  2033. ;
  2034. ;
  2035. process.EDIT:
  2036.     call    chk.strt.code
  2037.     call    get.word
  2038.     call    get.var.A.word
  2039.     lda    A.word.type
  2040.     ani    wtp.string
  2041.     cnz    put.inline.A.string
  2042. ;
  2043.     lda    ste.A.type
  2044.     cpi    stet.string
  2045.     jz    p.EDIT.A.ok
  2046.     cpi    stet.spcl.string.ptr
  2047.     cnz    err.inv.var.type
  2048. p.EDIT.A.ok:
  2049.     lda    rsvd.wd.ix
  2050.     cpi    rwix.WITH
  2051.     cz    get.word
  2052.     call    get.var.B.word
  2053.     lda    B.word.type
  2054.     ani    wtp.string
  2055.     cnz    put.inline.B.string
  2056. ;
  2057.     lda    ste.B.type
  2058.     cpi    stet.string
  2059.     jz    p.EDIT.B.ok
  2060.     cpi    stet.spcl.string.ptr
  2061.     cnz    err.inv.var.type
  2062. p.EDIT.B.ok:
  2063.     lda    rsvd.wd.ix
  2064.     cpi    rwix.GIVING
  2065.     jnz    p.EDIT.2
  2066. ;
  2067.     call    get.word
  2068.     call    chk.word.id.only
  2069.     call    get.var.C.word
  2070.     jmp    p.EDIT.go
  2071. ;
  2072. p.EDIT.2:
  2073.     lxi    h,sym.tbl.entry.A
  2074.     lxi    d,sym.tbl.entry.C
  2075.     call    move.sym.tbl.entry
  2076. p.EDIT.go:
  2077.     lda    ste.C.type
  2078.     cpi    stet.STRING
  2079.     jz    p.EDIT.C.STR
  2080.     cpi    stet.spcl.string.ptr
  2081.     cnz    err.inv.var.type
  2082. ;
  2083.     call    put.LHLD.C
  2084.     call    put.XCHG
  2085.     jmp    p.EDIT.B
  2086. ;
  2087. p.EDIT.C.str:
  2088.     call    put.LXI.D.C
  2089. p.EDIT.B:
  2090.     lda    ste.B.type
  2091.     cpi    stet.STRING
  2092.     jz    p.EDIT.B.str
  2093.     cpi    stet.spcl.string.ptr
  2094.     cnz    err.inv.var.type
  2095. ;
  2096.     call    put.LHLD.B
  2097.     call    put.mv.HL.to.BC
  2098.     jmp    p.EDIT.A
  2099. ;
  2100. p.EDIT.B.str:
  2101.     call    put.LXI.B.B
  2102. p.EDIT.A:
  2103.     lda    ste.A.type
  2104.     cpi    stet.STRING
  2105.     jz    p.EDIT.A.str
  2106.     cpi    stet.spcl.string.ptr
  2107.     jnz    err.inv.var.type
  2108. ;
  2109.     call    put.LHLD.A
  2110.     jmp    p.EDIT.call
  2111. ;
  2112. p.EDIT.A.str:
  2113.     call    put.LXI.H.A
  2114. p.EDIT.call:
  2115.     mvi    a,bir.EDIT.STRING
  2116.     jmp    put.bir.call.fwd
  2117. ;
  2118. ;------------------------------------------------------
  2119. ;
  2120. ;
  2121. process.ENABLE:
  2122.     call    chk.strt.code
  2123.     call    get.word
  2124.     lda    rsvd.wd.ix
  2125.     cpi    rwix.INTERRUPTS
  2126.     cz    get.word
  2127.     jmp    put.EI
  2128. ;
  2129. ;
  2130. ;------------------------------------------------------
  2131. ;
  2132. ;
  2133. process.EXCHANGE:
  2134.     call    chk.strt.code
  2135.     call    get.word
  2136.     call    get.var.A.word
  2137.     lda    rsvd.wd.ix
  2138.     cpi    rwix.WITH
  2139.     cz    get.word
  2140.     call    get.var.B.word
  2141.     lda    rsvd.wd.ix
  2142.     cpi    rwix.LENGTH
  2143.     jnz    p.EXCHANGE.no.LENGTH
  2144. ;
  2145.     call    get.word
  2146.     call    get.var.C.word
  2147.     lda    C.word.type
  2148.     ani    wtp.cnst
  2149.     jnz    p.EXCHANGE.C.cnst
  2150. ;
  2151.     call    put.get.C.into.HL
  2152.     call    put.MOV.B.H
  2153.     call    put.MOV.C.L
  2154.     jmp    p.EXCHANGE.got.length
  2155. ;
  2156. p.EXCHANGE.C.cnst:
  2157.     call    put.LXI.B.C
  2158.     jmp    p.EXCHANGE.got.length
  2159. ;
  2160. p.EXCHANGE.no.LENGTH:
  2161.     lhld    ste.A.length
  2162.     xchg
  2163.     lhld    ste.B.length
  2164.     call    cmp.de.fm.hl
  2165.     jc    p.EXCHANGE.A.gtr
  2166.     xchg
  2167. p.EXCHANGE.A.gtr:
  2168.     call    cmp.de.fm.hl
  2169.     push    h
  2170.     cnz    err.truncate
  2171.     pop    h
  2172.     mov    a,h
  2173.     ora    a
  2174.     jnz    p.EXCHANGE.block
  2175.     mov    a,l
  2176.     dcr    a
  2177.     jnz    p.EXCHANGE.block
  2178. ;--byte exchange---
  2179.     call    p.EXCHANGE.prefix
  2180.     call    put.MOV.B.M
  2181.     call    put.LDAX.D
  2182.     call    put.MOV.M.A
  2183.     call    put.MOV.A.B
  2184.     jmp    put.STAX.D
  2185. ;
  2186. p.EXCHANGE.block:
  2187.     call    put.LXI.B.hl
  2188. p.EXCHANGE.got.length:
  2189.     call    p.EXCHANGE.prefix
  2190.     mvi    a,bir.exchange
  2191.     jmp    put.bir.call.fwd
  2192. ;
  2193. ;
  2194. p.EXCHANGE.prefix:
  2195.     call    switch.B
  2196.     db stet.spcl.byte.ptr    ! dw p.EXECUTE.B.ptr
  2197.     db stet.spcl.word.ptr    ! dw p.EXECUTE.B.ptr
  2198.     db stet.spcl.string.ptr    ! dw p.EXECUTE.B.ptr
  2199.     db stet.spcl.BCD.ptr    ! dw p.EXECUTE.B.ptr
  2200.     db    0        ! dw p.EXECUTE.B.not
  2201. p.EXECUTE.B.ptr:
  2202.     call    put.LHLD.B
  2203.     call    put.XCHG
  2204.     jmp    p.EXECUTE.do.A
  2205. p.EXECUTE.B.not:
  2206.     call    put.LXI.D.B
  2207. p.EXECUTE.do.A:
  2208.     call    switch.A
  2209.     db stet.spcl.byte.ptr    ! dw put.LHLD.A
  2210.     db stet.spcl.word.ptr    ! dw put.LHLD.A
  2211.     db stet.spcl.string.ptr    ! dw put.LHLD.A
  2212.     db stet.spcl.BCD.ptr    ! dw put.LHLD.A
  2213.     db    0        ! dw put.LXI.H.A
  2214. ;
  2215. ;
  2216. ;------------------------------------------------------
  2217. ;
  2218. ;
  2219. process.EXECUTE:
  2220.     call    chk.strt.code
  2221.     call    get.word
  2222.     call    get.var.A.word
  2223.     lda    A.word.type
  2224.     ani    wtp.string
  2225.     cnz    put.inline.A.string
  2226. ;
  2227. ;--close overlay file if any---
  2228.     lda    any.overlay
  2229.     ora    a
  2230.     jz    p.EXEC.no.ovl
  2231.     lxi    h,0ffffh
  2232.     call    put.LXI.H.hl
  2233.     mvi    a,bir.overlay.load
  2234.     call    put.bir.call.fwd
  2235. ;
  2236. p.EXEC.no.ovl:
  2237. ;
  2238. ;---if MPM set, need to reset vector at ENTRY---
  2239. ;
  2240.     lda    MPM.flag
  2241.     ora    a
  2242.     jz    p.EXECUTE.not.MPM
  2243.     lxi    h,MPM.bdos.jmp + 1
  2244.     call    put.LHLD.hl
  2245.     lxi    h,entry + 1
  2246.     call    put.SHLD.hl
  2247. p.EXECUTE.not.MPM:
  2248. ;
  2249.     lda    ste.A.type
  2250.     cpi    stet.STRING
  2251.     jz    p.EXECUTE.string
  2252.     cpi    stet.spcl.string.ptr
  2253.     jnz    err.inv.var.type
  2254. ;
  2255.     call    put.LHLD.A
  2256.     call    put.XCHG
  2257.     jmp    p.EXECUTE.chk.using
  2258. ;
  2259. p.EXECUTE.string:
  2260.     call    put.LXI.D.A
  2261. p.EXECUTE.chk.using:
  2262.     lda    rsvd.wd.ix
  2263.     cpi    rwix.USING
  2264.     jnz    p.EXECUTE.no.USING
  2265. ;
  2266.     call    get.word
  2267.     call    get.var.B.word
  2268.     lda    B.word.type
  2269.     ani    wtp.string
  2270.     cnz    put.inline.B.string
  2271. ;
  2272.     lda    ste.B.type
  2273.     cpi    stet.STRING
  2274.     jz    p.EXECUTE.u.string
  2275.     cpi    stet.spcl.string.ptr
  2276.     cnz    err.inv.var.type
  2277. ;
  2278.     call    put.LHLD.B
  2279.     jmp    p.EXECUTE.chk.ERROR
  2280. ;
  2281. p.EXECUTE.u.string:
  2282.     call    put.LXI.H.B
  2283.     jmp    p.EXECUTE.chk.ERROR
  2284. ;
  2285. p.EXECUTE.no.USING:
  2286.     lxi    h,0
  2287.     call    put.LXI.H.hl
  2288. p.EXECUTE.chk.ERROR:
  2289.     lda    rsvd.wd.ix
  2290.     cpi    rwix.ERROR
  2291.     jnz    p.EXECUTE.no.ERROR
  2292.     call    get.word
  2293.     lda    rsvd.wd.ix
  2294.     cpi    rwix.STANDARD
  2295.     jz    p.EXECUTE.no.ERROR
  2296. ;
  2297.     mvi    l,0ffh
  2298.     call    put.MVI.A.L
  2299.     call    put.execute.program
  2300.     jmp    process.a.statement
  2301. ;
  2302. p.EXECUTE.no.ERROR:
  2303.     call    put.XRA.A
  2304.     jmp    put.execute.program
  2305. ;
  2306. ;
  2307. ;------------------------------------------------------
  2308. ;
  2309. ;
  2310. process.EXITBEGIN:
  2311.     call    chk.strt.code
  2312.     mvi    a,bir.EXITBEGIN
  2313.     call    put.bir.jmp.fwd
  2314.     jmp    get.word
  2315. ;
  2316. ;------------------------------------------------------
  2317. ;
  2318. ;
  2319. process.EXITDO:
  2320.     call    chk.strt.code
  2321.     mvi    a,bir.EXITDO
  2322.     call    put.bir.jmp.fwd
  2323.     jmp    get.word
  2324. ;
  2325. ;------------------------------------------------------
  2326. ;
  2327. ;
  2328. process.EXITSWITCH:
  2329.     call    chk.strt.code
  2330.     mvi    a,bir.EXITSWITCH
  2331.     call    put.bir.jmp.fwd
  2332.     jmp    get.word
  2333. ;
  2334. ;------------------------------------------------------
  2335. ;
  2336. ;
  2337. process.EXIT:
  2338.     call    set.byte.boundary
  2339.     call    chk.strt.code
  2340.     call    get.word
  2341.     jmp    put.RET
  2342. ;
  2343. ;
  2344. ;------------------------------------------------------
  2345. ;
  2346. ;
  2347. process.EXTERNAL:
  2348.     call    get.word
  2349.     call    switch.rsvd.wd.ix
  2350.     db rwix.BCD        ! dw p.EXTERNAL.BCD
  2351.     db rwix.BYTE        ! dw p.EXTERNAL.BYTE
  2352.     db rwix.FIELD        ! dw p.EXTERNAL.FIELD
  2353.     db rwix.LABEL        ! dw p.EXTERNAL.LABEL
  2354.     db rwix.RECORD        ! dw p.EXTERNAL.RECORD
  2355.     db rwix.STRING        ! dw p.EXTERNAL.STRING
  2356.     db rwix.WORD        ! dw p.EXTERNAL.WORD
  2357.     db    0        ! dw err.mssng.rsvd.wd
  2358. ;
  2359. p.EXTERNAL.BCD:
  2360.     call    get.word
  2361.     lda    rsvd.wd.ix
  2362.     cpi    rwix.POINTER
  2363.     jz    p.EXTERNAL.BCDP
  2364. ;
  2365.     lxi    h,bcd.size
  2366.     shld    ste.length
  2367.     mvi    a,stet.BCD
  2368.     sta    ste.type
  2369.     jmp    p.EXTERNAL.cont
  2370. ;
  2371. p.EXTERNAL.BCDP:
  2372.     lxi    h,2
  2373.     shld    ste.length
  2374.     mvi    a,stet.BCD.ptr
  2375.     sta    ste.type
  2376.     jmp    p.EXTERNAL.cont
  2377. ;
  2378. p.EXTERNAL.BYTE:
  2379.     call    get.word
  2380.     lda    rsvd.wd.ix
  2381.     cpi    rwix.POINTER
  2382.     jz    p.EXTERNAL.BP
  2383.     lxi    h,1
  2384.     shld    ste.length
  2385.     mvi    a,stet.BYTE
  2386.     sta    ste.type
  2387.     jmp    p.EXTERNAL.cont
  2388. ;
  2389. p.EXTERNAL.BP:
  2390.     lxi    h,2
  2391.     shld    ste.length
  2392.     mvi    a,stet.byte.ptr
  2393.     jmp    p.EXTERNAL.id
  2394. ;
  2395. p.EXTERNAL.LABEL:
  2396.     lxi    h,0
  2397.     shld    ste.length
  2398.     mvi    a,stet.LABEL
  2399.     jmp    p.EXTERNAL.id
  2400. ;
  2401. p.EXTERNAL.FIELD:
  2402.     mvi    a,stet.FIELD
  2403.     jmp    p.EXTERNAL.common
  2404. ;
  2405. p.EXTERNAL.RECORD:
  2406.     mvi    a,stet.RECORD
  2407. p.EXTERNAL.common:
  2408.     lxi    h,0
  2409.     shld    ste.length
  2410.     jmp    p.EXTERNAL.id
  2411. ;
  2412. p.EXTERNAL.STRING:
  2413.     call    get.word
  2414.     lda    rsvd.wd.ix
  2415.     cpi    rwix.POINTER
  2416.     jz    p.EXTERNAL.SP
  2417.     lxi    h,0
  2418.     shld    ste.length
  2419.     mvi    a,stet.STRING
  2420.     sta    ste.type
  2421.     jmp    p.EXTERNAL.cont
  2422. ;
  2423. p.EXTERNAL.SP:
  2424.     lxi    h,2
  2425.     shld    ste.length
  2426.     mvi    a,stet.string.ptr
  2427.     jmp    p.EXTERNAL.id
  2428. ;
  2429. p.EXTERNAL.WORD:
  2430.     lxi    h,2
  2431.     shld    ste.length
  2432.     call    get.word
  2433.     lda    rsvd.wd.ix
  2434.     cpi    rwix.POINTER
  2435.     jz    p.EXTERNAL.WP
  2436.     mvi    a,stet.WORD
  2437.     sta    ste.type
  2438.     jmp    p.EXTERNAL.cont
  2439. ;
  2440. p.EXTERNAL.WP:
  2441.     mvi    a,stet.word.ptr
  2442. ;
  2443. p.EXTERNAL.id:
  2444.     sta    ste.type
  2445.     call    get.word
  2446. p.EXTERNAL.cont:
  2447.     call    chk.word.id.only
  2448.     lxi    h,word
  2449.     lxi    d,ste.name
  2450.     call    move.string
  2451.     call    get.word
  2452.     lda    rsvd.wd.ix
  2453.     cpi    rwix.ADDRESS
  2454.     cz    get.word
  2455.     lda    word.type
  2456.     ani    wtp.cnst
  2457.     jz    err.inv.cnst
  2458.     lhld    cnst.value
  2459.     shld    ste.address
  2460. ;
  2461.     xchg
  2462.     lhld    curr.print.addr
  2463.     mov    a,h
  2464.     ora    l
  2465.     jnz    p.EXT.no.new.addr
  2466.     xchg
  2467.     shld    curr.print.addr
  2468. p.EXT.no.new.addr:
  2469. ;
  2470.     lxi    h,0
  2471.     shld    ste.length
  2472.     call    get.word
  2473.     lda    rsvd.wd.ix
  2474.     cpi    rwix.LENGTH
  2475.     jnz    p.EXTERNAL.no.length
  2476.     call    get.word
  2477.     lda    word.type
  2478.     ani    wtp.cnst
  2479.     cz    err.inv.cnst
  2480.     lhld    cnst.value
  2481.     shld    ste.length
  2482.     call    get.word
  2483. p.EXTERNAL.no.length:
  2484.     lda    curr.block.level
  2485.     sta    ste.block.level
  2486.     call    move.entry.to.sym.tbl
  2487. ;
  2488.     lda    ste.type
  2489.     cpi    stet.FIELD
  2490.     jz    p.EXT.chk.size
  2491.     cpi    stet.RECORD
  2492.     jz    p.EXT.chk.size
  2493.     cpi    stet.STRING
  2494.     jnz    p.EXT.no.size.chk
  2495. p.EXT.chk.size:
  2496.     lhld    ste.length
  2497.     mov    a,h
  2498.     ora    l
  2499.     cz    err.inv.STRING.size
  2500. p.EXT.no.size.chk:
  2501. ;
  2502.     lda    rsvd.wd.ix
  2503.     cpi    rwix.comma
  2504.     rnz
  2505.     lda    ste.type
  2506.     jmp    p.EXTERNAL.id
  2507. ;
  2508. ;
  2509. ;------------------------------------------------------
  2510. ;
  2511. ;
  2512. process.FIELD:
  2513.     call    set.byte.boundary
  2514.     call    chk.strt.data
  2515. ;
  2516.     xra    a
  2517.     sta    ste.A.name
  2518. ;
  2519.     call    get.word
  2520.     lda    word.type
  2521.     ani    wtp.cnst
  2522.     jnz    p.FIELD.no.name
  2523.     lda    rsvd.wd.ix
  2524.     cpi    rwix.LENGTH
  2525.     jz    p.FIELD.get.size
  2526. ;
  2527.     call    chk.word.id.only
  2528.     call    chk.word.not.in.tbl
  2529.     lxi    h,word
  2530.     lxi    d,ste.A.name
  2531.     call    move.string
  2532. ;
  2533.     call    get.word
  2534. p.FIELD.get.size:
  2535.     lda    rsvd.wd.ix
  2536.     cpi    rwix.LENGTH
  2537.     cz    get.word
  2538.     lda    word.type
  2539.     ani    wtp.cnst
  2540.     cz    err.inv.STRING.size
  2541. p.FIELD.no.name:
  2542.     lhld    cnst.value
  2543.     lxi    d,257
  2544.     call    cmp.de.fm.hl
  2545.     cnc    err.inv.STRING.size
  2546. ;
  2547.     shld    ste.length
  2548. ;
  2549.     lxi    h,ste.A.name
  2550.     lxi    d,word
  2551.     call    move.string
  2552.     mvi    a,stet.FIELD
  2553.     sta    ste.type
  2554.     lda    ste.A.name
  2555.     ora    a
  2556.     cnz    put.word.into.tbl
  2557.     call    get.word
  2558. ;
  2559. ;---check for value---
  2560. ;
  2561.     lda    rsvd.wd.ix
  2562.     cpi    rwix.VALUE
  2563.     jnz    p.FIELD.no.VALUE
  2564. ;
  2565.     call    get.word
  2566.     lda    word.type
  2567.     ani    wtp.string
  2568.     jnz    p.FIELD.VALUE
  2569.     call    err.inv.value
  2570.     jmp    p.FIELD.no.VALUE
  2571. ;
  2572. p.FIELD.VALUE:
  2573.     lhld    ste.length
  2574.     lda    word.length
  2575.     mov    e,a
  2576.     mvi    d,0
  2577.     call    cmp.de.fm.hl
  2578.     push    h
  2579.     cc    err.pad.string
  2580.     pop    h
  2581.     lxi    d,word
  2582. p.FIELD.VALUE.lup:
  2583.     push    h
  2584.     ldax    d
  2585.     ora    a
  2586.     jnz    p.FIELD.VALUE.ok
  2587.     dcx    d
  2588.     mvi    a,' '
  2589. p.FIELD.VALUE.ok:
  2590.     push    d
  2591.     call    put.code.byte
  2592.     pop    d
  2593.     pop    h
  2594.     inx    d
  2595.     dcx    h
  2596.     mov    a,h
  2597.     ora    l
  2598.     jnz    p.FIELD.VALUE.lup
  2599.     call    get.word
  2600.     jmp    p.FIELD.comma
  2601. ;
  2602. p.FIELD.no.VALUE:
  2603.     lhld    ste.length
  2604.     xchg
  2605.     lhld    curr.code.addr
  2606.     dad    d
  2607.     shld    curr.code.addr
  2608. ;
  2609. p.FIELD.comma:
  2610.     lda    rsvd.wd.ix
  2611.     cpi    rwix.comma
  2612.     jz    process.FIELD
  2613.     ret
  2614. ;
  2615. ;
  2616. ;------------------------------------------------------
  2617. ;
  2618. ;
  2619. process.FILE:
  2620.     call    set.byte.boundary
  2621.     call    chk.strt.data
  2622. ;
  2623.     xra    a
  2624.     sta    ste.C.name
  2625.     sta    ste.B.name
  2626. ;
  2627.     xra    a
  2628.     lxi    h,curr.fcb
  2629.     mov    m,a
  2630.     lxi    d,curr.fcb + 1
  2631.     lxi    b,fcb.rec.buffer - 1
  2632.     call    move.h.2.d.cnt.b
  2633. ;
  2634.     mvi    a,' '
  2635.     lxi    h,curr.fcb + fcb.name
  2636.     mov    m,a
  2637.     mov    e,l
  2638.     mov    d,h
  2639.     inx    d
  2640.     lxi    b,11
  2641.     call    move.h.2.d.cnt.b
  2642. ;
  2643.     lxi    h,FILE.flags
  2644.     mvi    c,(FILE.flags.end - FILE.flags)
  2645. p.FILE.clr.lup:
  2646.     mvi    m,0
  2647.     inx    h
  2648.     dcr    c
  2649.     jnz    p.FILE.clr.lup
  2650. ;
  2651.     call    get.word
  2652.     lda    word.type
  2653.     ani    wtp.ident
  2654.     cz    err.inv.file.id
  2655. ;
  2656.     lxi    h,word
  2657.     lxi    d,curr.file.name
  2658.     call    move.string
  2659. ;
  2660.     lxi    h,word
  2661.     lxi    d,curr.fcb
  2662.     call    format.file.name
  2663. ;
  2664. p.FILE.next:
  2665.     call    get.word
  2666. p.FILE.main.lup:
  2667.     call    debug.routine
  2668.     call    switch.rsvd.wd.ix
  2669.     db rwix.comma        ! dw p.FILE.next
  2670.     db rwix.BLOCKED        ! dw p.FILE.BLOCKED
  2671.     db rwix.BUFFER        ! dw p.FILE.BUFFER
  2672.     db rwix.CON        ! dw p.FILE.CON
  2673.     db rwix.COMMENT        ! dw p.FILE.COMMENT
  2674.     db rwix.DISK        ! dw p.FILE.DISK
  2675.     db rwix.FILE1        ! dw p.FILE.FILE1
  2676.     db rwix.FILE2        ! dw p.FILE.FILE2
  2677.     db rwix.KEY        ! dw p.FILE.KEY
  2678.     db rwix.LST        ! dw p.FILE.LST
  2679.     db rwix.NO        ! dw p.FILE.NO
  2680.     db rwix.PRN        ! dw p.FILE.PRN
  2681.     db rwix.PUN        ! dw p.FILE.PUN
  2682.     db rwix.RANDOM        ! dw p.FILE.RANDOM
  2683.     db rwix.RDR        ! dw p.FILE.RDR
  2684.     db rwix.RECORD        ! dw p.FILE.RECORD
  2685.     db rwix.STATUS        ! dw p.FILE.STATUS
  2686.     db rwix.TEXT        ! dw p.FILE.TEXT
  2687.     db rwix.TTY        ! dw p.FILE.TTY
  2688.     db rwix.VALUE        ! dw p.FILE.VALUE
  2689.     db    0        ! dw p.FILE.main.exitloop
  2690. ;
  2691. ;
  2692. p.FILE.COMMENT:
  2693.     call    process.COMMENT
  2694.     jmp    p.FILE.main.lup
  2695. ;
  2696. ;
  2697. p.FILE.CON:
  2698. p.FILE.LST:
  2699. p.FILE.PRN
  2700. p.FILE.PUN:
  2701. p.FILE.RDR:
  2702. p.FILE.TTY:
  2703.     sta    FILE.device
  2704.     jmp    p.FILE.TEXT    ;--always text
  2705. ;
  2706. ;
  2707. p.FILE.DISK:
  2708.     sta    FILE.device
  2709.     jmp    p.FILE.next
  2710. ;
  2711. ;
  2712. p.FILE.FILE1:
  2713.     mvi    a,FILE.cr.flag.FILE1
  2714.     call    p.FILE.set.c.flag
  2715.     call    p.FILE.set.r.flag
  2716.     jmp    p.FILE.next
  2717. ;
  2718. ;
  2719. p.FILE.FILE2:
  2720.     mvi    a,FILE.cr.flag.FILE2
  2721.     call    p.FILE.set.c.flag
  2722.     call    p.FILE.set.r.flag
  2723.     jmp    p.FILE.next
  2724. ;
  2725. ;
  2726. ;
  2727. p.FILE.KEY:
  2728.     call    get.word
  2729.     call    chk.word.id.only
  2730.     call    chk.word.not.in.tbl
  2731.     lxi    h,word
  2732.     lxi    d,ste.C.name
  2733.     call    move.string
  2734.     jmp    p.FILE.next
  2735. ;
  2736. ;
  2737. ;
  2738. p.FILE.RANDOM:
  2739.     mvi    a,FILE.c.flag.RANDOM
  2740.     call    p.FILE.set.c.flag
  2741.     jmp    p.FILE.next
  2742. ;
  2743. ;
  2744. ;
  2745. p.FILE.BLOCKED:
  2746.     call    get.word
  2747.     lda    word.type
  2748.     ani    wtp.cnst
  2749.     cz    err.inv.cnst
  2750.     lhld    cnst.value
  2751.     shld    curr.fcb + fcb.rec.blk.fac
  2752.     call    p.FILE.set.rec.mode
  2753.     jmp    p.FILE.next
  2754. ;
  2755. ;
  2756. ;
  2757. p.FILE.NO:
  2758.     call    get.word
  2759.     lda    rsvd.wd.ix
  2760.     cpi    rwix.BUFFER
  2761.     cnz    err.mssng.rsvd.wd
  2762.     mvi    a,FILE.r.flag.no.buff
  2763.     call    p.FILE.set.r.flag
  2764.     jmp    p.FILE.next
  2765. ;
  2766. ;
  2767. ;
  2768. ;
  2769. p.FILE.BUFFER:
  2770.     call    get.word
  2771.     lda    rsvd.wd.ix
  2772.     cpi    rwix.EXTERNAL
  2773.     jz    p.FILE.BUFFER.EXTERNAL
  2774.     call    lookup.word
  2775.     lhld    wk.sym.tbl.addr
  2776.     mov    a,m
  2777.     cpi    stet.end.tbl
  2778.     jnz    p.FILE.BUFFER.ok
  2779.     push    h
  2780.     call    err.undef.var
  2781.     pop    h
  2782. p.FILE.BUFFER.ok:
  2783.     lxi    d,(ste.address - symbol.table.entry)
  2784.     dad    d
  2785.     mov    e,m
  2786.     inx    h
  2787.     mov    d,m
  2788.     xchg
  2789.     shld    curr.fcb + fcb.buf.addr
  2790. ;
  2791.     lhld    wk.sym.tbl.addr
  2792.     lxi    d,(ste.length - symbol.table.entry)
  2793.     dad    d
  2794.     mov    e,m
  2795.     inx    h
  2796.     mov    d,m
  2797.     xchg
  2798.     call    p.FILE.chk.mod.128
  2799.     shld    curr.fcb + fcb.buf.size
  2800. ;
  2801.     jmp    p.FILE.next
  2802. ;
  2803. ;
  2804. ;
  2805. p.FILE.BUFFER.EXTERNAL:
  2806.     call    get.word
  2807.     lda    rsvd.wd.ix
  2808.     cpi    rwix.ADDRESS
  2809.     cz    get.word
  2810.     lda    word.type
  2811.     ani    wtp.cnst
  2812.     cz    err.inv.cnst
  2813. ;
  2814.     lhld    cnst.value
  2815.     shld    curr.fcb + fcb.buf.addr
  2816. ;
  2817.     call    get.word
  2818.     lda    rsvd.wd.ix
  2819.     cpi    rwix.LENGTH
  2820.     cz    get.word
  2821.     lda    word.type
  2822.     ani    wtp.cnst
  2823.     cz    err.inv.cnst
  2824.     lhld    cnst.value
  2825.     call    p.FILE.chk.mod.128
  2826.     shld    curr.fcb + fcb.buf.size
  2827.     jmp    p.FILE.next
  2828. ;
  2829. ;
  2830. ;
  2831. p.FILE.RECORD:
  2832.     call    get.word
  2833.     lda    rsvd.wd.ix
  2834.     cpi    rwix.EXTERNAL
  2835.     jz    p.FILE.RECORD.EXTERNAL
  2836.     call    lookup.word
  2837.     lhld    wk.sym.tbl.addr
  2838.     mov    a,m
  2839.     cpi    stet.end.tbl
  2840.     jnz    p.FILE.RECORD.ok
  2841.     push    h
  2842.     call    err.undef.var
  2843.     pop    h
  2844. p.FILE.RECORD.ok:
  2845. ;
  2846. ;---check record length---
  2847. ;
  2848.     lda    FILE.c.flags
  2849.     ani    FILE.c.flag.text
  2850.     jz    p.FILE.chk.REC.128
  2851. ;
  2852.     mov    a,m
  2853.     cpi    stet.BYTE
  2854.     cnz    err.buf.size
  2855.     jmp    p.FILE.REC.size.ok
  2856. ;
  2857. p.FILE.chk.REC.128:
  2858.     xchg
  2859.     lxi    h,ste.length - symbol.table.entry
  2860.     dad    d
  2861.     mov    a,m
  2862.     inx    h
  2863.     mov    h,m
  2864.     mov    l,a
  2865.     cpi    80h
  2866.     jnz    p.FILE.rec.rec.mode
  2867.     mov    a,h
  2868.     ora    a
  2869.     jz    p.FILE.rec.sctr.mode
  2870. p.FILE.rec.rec.mode:
  2871.     call    p.FILE.set.rec.mode
  2872. p.FILE.rec.sctr.mode:
  2873.     shld    curr.fcb + fcb.buf.size
  2874.     xchg
  2875. p.FILE.REC.size.ok:
  2876.     lxi    d,(ste.address - symbol.table.entry)
  2877.     dad    d
  2878.     mov    e,m
  2879.     inx    h
  2880.     mov    d,m
  2881.     xchg
  2882.     shld    curr.fcb + fcb.rec.addr
  2883. ;
  2884.     jmp    p.FILE.REC.chk.BUF
  2885. ;
  2886. ;
  2887. ;
  2888. p.FILE.RECORD.EXTERNAL:
  2889.     call    get.word
  2890.     lda    rsvd.wd.ix
  2891.     cpi    rwix.ADDRESS
  2892.     cz    get.word
  2893.     lda    word.type
  2894.     ani    wtp.cnst
  2895.     cz    err.inv.cnst
  2896. ;
  2897.     lhld    cnst.value
  2898.     shld    curr.fcb + fcb.rec.addr
  2899. ;
  2900.     call    get.word
  2901.     lda    rsvd.wd.ix
  2902.     cpi    rwix.LENGTH
  2903.     cz    get.word
  2904.     lda    word.type
  2905.     ani    wtp.cnst
  2906.     cz    err.inv.cnst
  2907.     lhld    cnst.value
  2908.     mov    a,l
  2909.     cpi    80h
  2910.     jnz    p.FILE.xrec.rec.mode
  2911.     mov    a,h
  2912.     ora    a
  2913.     jz    p.FILE.xrec.sctr.mode
  2914. p.FILE.xrec.rec.mode:
  2915.     call    p.FILE.set.rec.mode
  2916. p.FILE.xrec.sctr.mode:
  2917.     shld    curr.fcb + fcb.buf.size
  2918. p.FILE.REC.chk.BUF:
  2919.     lhld    curr.fcb + fcb.buf.addr
  2920.     mov    a,h
  2921.     ora    l
  2922.     jnz    p.FILE.next
  2923. ;
  2924.     lhld    curr.fcb + fcb.rec.addr
  2925.     shld    curr.fcb + fcb.buf.addr
  2926.     jmp    p.FILE.next
  2927. ;
  2928. ;
  2929. ;
  2930. p.FILE.chk.mod.128:
  2931.     mov    a,l
  2932.     ani    7fh
  2933.     rz
  2934.     push    h
  2935.     call    err.buf.size
  2936.     pop    h
  2937.     mov    a,l
  2938.     ani    80h
  2939.     mov    l,a
  2940.     ret
  2941. ;
  2942. ;
  2943. ;
  2944. p.FILE.STATUS:
  2945.     call    get.word
  2946.     call    chk.word.id.only
  2947.     call    chk.word.not.in.tbl
  2948.     lxi    h,word
  2949.     lxi    d,ste.B.name
  2950.     call    move.string
  2951.     jmp    p.FILE.next
  2952. ;
  2953. ;
  2954. ;
  2955. p.FILE.TEXT:
  2956.     mvi    a,FILE.c.flag.TEXT
  2957.     call    p.FILE.set.c.flag
  2958.     jmp    p.FILE.next
  2959. ;
  2960. ;
  2961. ;
  2962. p.FILE.VALUE:
  2963.     call    get.word
  2964.     lda    word.type
  2965.     ani    wtp.string
  2966.     jnz    p.FILE.VALUE.string
  2967. ;
  2968.     call    chk.word.id.only
  2969.     call    get.var.sym.tbl.entry
  2970.     lda    ste.type
  2971.     cpi    stet.string
  2972.     jz    p.FILE.VALUE.ok
  2973.     cpi    stet.RECORD
  2974.     cnz    err.inv.var.type
  2975. p.FILE.VALUE.ok:
  2976.     lhld    ste.address
  2977.     shld    curr.fcb + fcb.name.addr
  2978.     mvi    a,FILE.c.flag.ext.name
  2979.     call    p.FILE.set.c.flag
  2980.     jmp    p.FILE.next
  2981. ;
  2982. p.FILE.VALUE.string:
  2983.     lxi    h,word
  2984.     lxi    d,curr.fcb
  2985.     call    format.file.name
  2986.     jmp    p.FILE.next
  2987. ;
  2988. ;
  2989. p.FILE.set.rec.mode:
  2990.     mvi    a,FILE.c.flag.rec.mode
  2991. p.FILE.set.c.flag:
  2992.     push    h
  2993.     push    psw
  2994.     lxi    h,FILE.c.flags
  2995.     ora    m
  2996.     mov    m,a
  2997.     pop    psw
  2998.     pop    h
  2999.     ret
  3000. ;
  3001. ;
  3002. p.FILE.set.r.flag:
  3003.     push    h
  3004.     push    psw
  3005.     lxi    h,FILE.r.flags
  3006.     ora    m
  3007.     mov    m,a
  3008.     pop    psw
  3009.     pop    h
  3010.     ret
  3011. ;
  3012. ;
  3013. ;
  3014. p.FILE.main.exitloop:
  3015.     lda    curr.fcb + fcb.name
  3016.     ora    a
  3017.     jnz    p.FILE.name.done
  3018.     lxi    h,curr.file.name
  3019.     lxi    d,curr.fcb
  3020.     call    format.file.name
  3021. p.FILE.name.done:
  3022.     lhld    curr.fcb + fcb.rec.addr
  3023.     mov    a,h
  3024.     ora    l
  3025.     cz    err.no.rec
  3026. ;
  3027. ;---put filename into symbol-table---
  3028. ;
  3029.     mvi    a,stet.file
  3030.     sta    ste.type
  3031.     lda    curr.block.level
  3032.     sta    ste.block.level
  3033.     lhld    curr.code.addr
  3034.     shld    ste.address
  3035.     lda    FILE.device
  3036.     sta    ste.FILE.device
  3037.     lda    FILE.c.flags
  3038.     sta    ste.FILE.misc.flag
  3039.     lda    FILE.r.flags
  3040.     sta    curr.fcb + fcb.flags
  3041.     lxi    h,curr.file.name
  3042.     lxi    d,ste.name
  3043.     call    move.string
  3044.     call    move.entry.to.sym.tbl
  3045. ;
  3046. ;---put key-name into sym tbl---
  3047. ;
  3048.     lxi    h,ste.C.name
  3049.     mov    a,m
  3050.     ora    a
  3051.     jz    p.FILE.no.KEY
  3052.     lxi    d,ste.name
  3053.     call    move.string
  3054.     lhld    curr.code.addr
  3055.     lxi    d,fcb.rnd.rec
  3056.     lda    FILE.c.flags
  3057.     ani    FILE.c.flag.rec.mode
  3058.     jz    p.FILE.normal.key
  3059.     lxi    d,fcb.rec.key
  3060. p.FILE.normal.key:
  3061.     dad    d
  3062.     shld    ste.address
  3063.     lxi    h,2
  3064.     shld    ste.length
  3065.     mvi    a,stet.WORD
  3066.     sta    ste.type
  3067.     call    move.entry.to.sym.tbl
  3068. p.FILE.no.KEY:
  3069. ;
  3070. ;---put status-name into sym tbl---
  3071. ;
  3072.     lxi    h,ste.B.name
  3073.     mov    a,m
  3074.     ora    a
  3075.     jz    p.FILE.no.STATUS
  3076.     lxi    d,ste.name
  3077.     call    move.string
  3078.     lhld    curr.code.addr
  3079.     lxi    d,fcb.status
  3080.     dad    d
  3081.     shld    ste.address
  3082.     mvi    a,stet.BYTE
  3083.     sta    ste.type
  3084.     call    move.entry.to.sym.tbl
  3085. p.FILE.no.STATUS:
  3086. ;
  3087. ;
  3088. ;---put an fcb into the code file---
  3089. ;
  3090.     lda    FILE.c.flags
  3091.     ani    FILE.c.flag.rec.mode
  3092.     jz    p.FILE.put.fcb.to.code
  3093.     lxi    h,0
  3094.     shld    curr.fcb + fcb.rec.buf.sctr
  3095. p.FILE.put.fcb.to.code:
  3096.     lxi    h,curr.fcb
  3097.     lxi    b,fcb.limit
  3098.     lda    FILE.c.flags
  3099.     ani    FILE.c.flag.rec.mode
  3100.     jz    put.code.block            ;exit
  3101. ;
  3102. ;---special stuff for record-mode files---
  3103. ;
  3104.     lxi    b,fcb.rec.buffer
  3105.     call    put.code.block
  3106.     lda    FILE.r.flags
  3107.     ani    FILE.r.flag.no.buff
  3108.     jnz    p.FILE.no.code.buff
  3109. ;
  3110.     lxi    d,128    ;currently only 128 byte buffer
  3111.     lhld    curr.code.addr
  3112.     dad    d
  3113.     shld    curr.code.addr
  3114. ;
  3115. ;---show rec-size on listing---
  3116. ;
  3117. p.FILE.no.code.buff:
  3118.     lhld    curr.fcb + fcb.rec.size
  3119.     lxi    d,p.FILE.dec.rec.size
  3120.     call    cvt.bin.2.dec.str
  3121.     lxi    h,p.FILE.msg.rec.size
  3122.     jmp    print.warning
  3123. ;
  3124. p.FILE.msg.rec.size:    db    'Record-Size = '
  3125. p.FILE.dec.rec.size:    db    '00000',0
  3126. ;
  3127. ;
  3128. ;
  3129. ;------------------------------------------------------
  3130. ;
  3131. ;
  3132. process.FILL:
  3133.     call    chk.strt.code
  3134.     call    get.word
  3135.     call    get.var.A.word
  3136.     call    switch.A
  3137.     db stet.FIELD        ! dw p.FILL.A.ok
  3138.     db stet.RECORD        ! dw p.FILL.A.ok
  3139.     db stet.STRING        ! dw p.FILL.A.str
  3140.     db    0        ! dw p.FILL.A.err
  3141. p.FILL.A.err:
  3142.     call    err.inv.var.type
  3143. p.FILL.A.str:
  3144. ;--string - leave room for null terminator---
  3145.     lhld    ste.A.length
  3146.     dcx    h
  3147.     shld    ste.A.length
  3148. p.FILL.A.ok:
  3149.     lda    rsvd.wd.ix
  3150.     cpi    rwix.WITH
  3151.     cz    get.word
  3152.     call    get.var.B.word
  3153.     lda    B.word.type
  3154.     ani    wtp.cnst
  3155.     jnz    p.FILL.B.cnst
  3156. ;
  3157.     lda    B.word.type
  3158.     ani    wtp.string
  3159.     jnz    p.FILL.B.str
  3160. ;
  3161.     call    switch.B
  3162.     db stet.BYTE        ! dw p.FILL.B.BYTE
  3163.     db stet.WORD        ! dw p.FILL.B.WORD
  3164.     db    0        ! dw err.inv.cnst
  3165. ;
  3166. p.FILL.B.cnst:
  3167.     lxi    h,1
  3168.     shld    ste.B.length
  3169.     lhld    ste.A.length
  3170.     mov    a,h
  3171.     ora    a
  3172.     jnz    p.FILL.B.cnst.2
  3173.     mov    a,l
  3174.     dcr    a
  3175.     jz    p.FILL.B.cnst.1
  3176. p.FILL.B.cnst.2:
  3177.     lda    ste.B.address + 1
  3178.     ora    a
  3179.     jz    p.FILL.B.cnst.1
  3180.     lxi    h,2
  3181.     shld    ste.B.length
  3182.     call    put.LXI.H.B
  3183. p.FILL.B.16.x:
  3184.     call    put.SHLD.A
  3185.     jmp    p.FILL.FILL
  3186. ;
  3187. p.FILL.B.BYTE:
  3188.     call    put.LDA.B
  3189.     jmp    p.FILL.B.c.1.cont
  3190. ;
  3191. p.FILL.B.WORD:
  3192.     call    put.LHLD.B
  3193.     jmp    p.FILL.B.16.x
  3194. ;
  3195. p.FILL.B.cnst.1:
  3196.     lda    ste.B.address
  3197.     ora    a
  3198.     jnz    p.FILL.B.c.1.not.0
  3199.     call    put.XRA.A
  3200.     jmp    p.FILL.B.c.1.cont
  3201. p.FILL.B.c.1.not.0:
  3202.     call    put.MVI.A.B
  3203. p.FILL.B.c.1.cont:
  3204.     jmp    p.FILL.FILL
  3205. ;
  3206. p.FILL.B.str:
  3207. ;---no need for null terminator on source string---
  3208.     lhld    ste.B.length
  3209.     dcx    h
  3210.     shld    ste.B.length
  3211.     call    put.inline.B.string
  3212.     call    put.LXI.H.B
  3213.     call    put.LXI.D.A
  3214.     call    put.LXI.B.B.length
  3215.     call    put.mov.blk
  3216. ;
  3217. p.FILL.FILL:
  3218.     lhld    ste.B.length
  3219.     call    negate.hl
  3220.     xchg
  3221.     lhld    ste.A.length
  3222.     dad    d
  3223.     mov    a,h
  3224.     ora    l
  3225.     rz        ;--area is already filled
  3226.     call    put.LXI.B.hl
  3227.     call    put.LXI.H.A
  3228. ;--special case for byte---
  3229.     lda    ste.B.length
  3230.     cpi    1
  3231.     cz    put.MOV.M.A
  3232. ;
  3233.     lhld    ste.A.address
  3234.     xchg
  3235.     lhld    ste.B.length
  3236.     dad    d
  3237.     call    put.LXI.D.hl
  3238. ;
  3239.     call    put.mov.blk
  3240. ;--null terminator for string---
  3241.     lda    ste.A.type
  3242.     cpi    stet.STRING
  3243.     rnz            ;exit
  3244.     lda    Z80.flag
  3245.     ora    a
  3246.     cnz    put.XRA.A
  3247.     jmp    put.STAX.D
  3248. ;
  3249. ;
  3250. ;------------------------------------------------------
  3251. ;
  3252. ;
  3253. process.FIND:
  3254.     call    chk.strt.code
  3255.     call    get.word
  3256.     lda    rsvd.wd.ix
  3257.     cpi    rwix.NEXT
  3258.     jz    p.FIND.NEXT
  3259.     call    get.var.A.word
  3260.     lda    A.word.type
  3261.     ani    wtp.string
  3262.     cnz    put.inline.A.string
  3263.     call    switch.A
  3264.     db stet.FILE        ! dw p.FIND.FILE
  3265.     db stet.STRING        ! dw p.FIND.str
  3266.     db stet.spcl.string.ptr    ! dw p.FIND.SP
  3267.     db    0        ! dw p.FIND.err
  3268. p.FIND.err:
  3269.     call    err.inv.var.type
  3270. p.FIND.SP:
  3271.     call    put.LHLD.A
  3272.     jmp    p.FIND.format
  3273. ;
  3274. p.FIND.str:
  3275.     call    put.LXI.H.A
  3276. p.FIND.format:
  3277.     call    put.LXI.D.dflt.fcb
  3278.     call    put.format.file.name
  3279.     call    put.LXI.D.dflt.fcb
  3280.     jmp    p.FIND.first
  3281. ;
  3282. p.FIND.FILE:
  3283.     call    p.OPEN.put.FILE1.2
  3284.     call    put.LXI.D.A
  3285. p.FIND.first:
  3286.     call    put.MVI.C
  3287.     mvi    a,17
  3288.     jmp    p.FIND.type
  3289. ;
  3290. p.FIND.NEXT:
  3291.     call    get.word
  3292.     call    put.MVI.C
  3293.     mvi    a,18
  3294. p.FIND.type:
  3295.     call    put.code.byte
  3296.     mvi    a,bir.find.file
  3297.     call    put.bir.call.fwd
  3298. ;
  3299.     lda    rsvd.wd.ix
  3300.     cpi    rwix.GIVING
  3301.     cz    get.word
  3302.     call    get.var.B.word
  3303.     call    put.store.A.at.B
  3304.     lda    rsvd.wd.ix
  3305.     cpi    rwix.ADDRESS
  3306.     rnz        ;---exit---
  3307.     call    get.word
  3308.     call    get.var.B.word
  3309.     jmp    put.store.HL.at.B
  3310. ;
  3311. ;
  3312. ;------------------------------------------------------
  3313. ;
  3314. ;
  3315. process.GOTO:
  3316. process.GO:
  3317.     call    chk.strt.code
  3318.     call    put.JMP
  3319.     call    get.word
  3320.     lda    rsvd.wd.ix
  3321.     cpi    rwix.TO
  3322.     cz    get.word
  3323. ;
  3324.     lda    word.type
  3325.     ani    wtp.cnst
  3326.     jz    p.GO.label
  3327.     lhld    cnst.value
  3328.     call    put.code.word
  3329.     jmp    get.word
  3330. ;
  3331. p.GO.label:
  3332.     lda    rsvd.wd.ix
  3333.     cpi    rwix.END
  3334.     jz    p.GO.END
  3335. ;
  3336.     call    chk.word.id.only
  3337. ;
  3338.     lda    word.type
  3339.     ani    wtp.ptr
  3340.     jnz    p.GO.ptr
  3341. ;
  3342.     call    put.word.addr
  3343.     jmp    get.word
  3344. ;
  3345. ;
  3346. p.GO.END:
  3347.     mvi    a,bir.END
  3348.     call    put.fwd.ref.bir
  3349.     jmp    get.word
  3350. ;
  3351. ;
  3352. p.GO.ptr:
  3353.     call    get.var.A.word
  3354.     call    put.get.A.into.HL
  3355.     jmp    put.PCHL
  3356. ;
  3357. ;
  3358. ;
  3359. ;------------------------------------------------------
  3360. ;
  3361. ;
  3362. process.IF:
  3363.     call    chk.strt.code
  3364.     call    bump.block.level
  3365.     lhld    curr.src.line.num
  3366.     push    h
  3367. ;
  3368. p.IF.AND.lup:
  3369.     call    get.word
  3370. ;
  3371.     mvi    a,0ffh
  3372.     sta    fall.thru.true
  3373.     sta    no.fall.thru.fwd.flag
  3374.     mvi    a,bir.ELSE
  3375.     sta    curr.fwd.no.fall.thru
  3376.     call    process.expression
  3377. ;
  3378. p.IF.compound:
  3379.     call    switch.rsvd.wd.ix
  3380.     db rwix.AND        ! dw p.IF.AND.lup
  3381.     db rwix.OR        ! dw p.IF.OR
  3382.     db rwix.THEN        ! dw p.IF.THEN
  3383.     db rwix.COMMENT        ! dw p.IF.THEN.COMMENT
  3384.     db    0        ! dw p.IF.THEN.no.THEN
  3385. ;
  3386. p.IF.THEN.COMMENT:
  3387.     call    process.COMMENT
  3388.     jmp    p.IF.compound
  3389. ;
  3390. p.IF.THEN:
  3391.     call    get.word
  3392. p.IF.THEN.no.THEN:
  3393.     mvi    a,bir.THEN
  3394.     call    fix.up.built.in.rtn
  3395. p.IF.THEN.lup:
  3396.     call    switch.rsvd.wd.ix
  3397.     db rwix.ELSE        ! dw p.IF.THEN.end
  3398.     db rwix.FI        ! dw p.IF.FI
  3399.     db    0        ! dw p.IF.THEN.chk.miss
  3400. ;
  3401. p.IF.THEN.chk.miss:
  3402.     call    chk.not.blk.ender
  3403.     jnz    p.IF.THEN.stmt
  3404.     call    err.missing.FI
  3405.     jmp    p.IF.FI.err
  3406. ;
  3407. p.IF.THEN.stmt:
  3408.     call    process.a.statement
  3409.     jmp    p.IF.THEN.lup
  3410. ;
  3411. p.IF.OR:
  3412.     mvi    a,bir.THEN
  3413.     call    put.bir.jmp.fwd
  3414.     mvi    a,bir.ELSE
  3415.     call    fix.up.built.in.rtn
  3416.     jmp    p.IF.AND.lup
  3417. ;
  3418. ;
  3419. p.IF.THEN.end:
  3420.     call    debug.routine
  3421.     mvi    a,bir.EXITIF
  3422.     call    put.bir.jmp.fwd
  3423.     mvi    a,bir.ELSE
  3424.     call    fix.up.built.in.rtn
  3425.     call    get.word
  3426. p.IF.ELSE.lup:
  3427.     lda    rsvd.wd.ix
  3428.     cpi    rwix.FI
  3429.     jz    p.IF.FI
  3430. ;
  3431.     call    chk.not.blk.ender
  3432.     jnz    p.IF.ELSE.stmt
  3433.     call    err.missing.FI
  3434.     jmp    p.IF.FI.err
  3435. ;
  3436. p.IF.ELSE.stmt:
  3437.     call    process.a.statement
  3438.     jmp    p.IF.ELSE.lup
  3439. ;
  3440. ;
  3441. p.IF.FI:
  3442.     call    debug.routine
  3443.     pop    h
  3444.     shld    curr.block.match
  3445.     call    get.word
  3446.     jmp    p.IF.FI.got.mtch
  3447. ;
  3448. p.IF.FI.err:
  3449.     pop    h
  3450.     shld    curr.block.match
  3451. p.IF.FI.got.mtch:
  3452.     mvi    a,bir.THEN
  3453.     call    fix.up.built.in.rtn
  3454.     mvi    a,bir.ELSE
  3455.     call    fix.up.built.in.rtn
  3456.     mvi    a,bir.EXITIF
  3457.     call    fix.up.built.in.rtn
  3458.     call    decr.block.level
  3459.     jmp    squish.sym.tbl
  3460. ;
  3461. ;
  3462. ;
  3463. ;
  3464. ;------------------------------------------------------
  3465. ;
  3466. ;
  3467. process.INDEX:
  3468.     xra    a
  3469.     sta    p.INDEX.length
  3470.     call    chk.strt.code
  3471.     call    get.word
  3472.     call    chk.word.id.only
  3473.     call    get.var.A.word
  3474.     call    switch.A
  3475.     db stet.byte    ! dw p.INDEX.A.ok
  3476.     db stet.word    ! dw p.INDEX.A.ok
  3477.     db stet.string    ! dw p.INDEX.A.ok
  3478.     db stet.field    ! dw p.INDEX.A.ok
  3479.     db stet.record    ! dw p.INDEX.A.ok
  3480.     db stet.BCD    ! dw p.INDEX.A.ok
  3481.     db    0    ! dw p.INDEX.A.err
  3482. p.INDEX.A.err:
  3483.     call    err.inv.var.type
  3484. p.INDEX.A.ok:
  3485.     lhld    ste.A.address
  3486.     shld    p.INDEX.base.addr
  3487.     lda    rsvd.wd.ix
  3488.     cpi    rwix.OF
  3489.     jnz    p.INDEX.B.ok
  3490.     call    get.word
  3491.     call    get.var.A.word
  3492. p.INDEX.no.OF:
  3493.     call    switch.A
  3494.     db stet.string    ! dw p.INDEX.B.ok
  3495.     db stet.field    ! dw p.INDEX.B.ok
  3496.     db stet.record    ! dw p.INDEX.B.ok
  3497.     db    0    ! dw p.INDEX.B.err
  3498. p.INDEX.B.err:
  3499.     call    err.inv.var.type
  3500. p.INDEX.B.ok:
  3501.     lhld    ste.A.length
  3502.     mov    a,h
  3503.     ora    a
  3504.     cnz    err.inv.var.type
  3505.     mov    a,l
  3506.     sta    p.INDEX.length
  3507.     ora    a
  3508.     cz    err.inv.var.type
  3509.     lda    rsvd.wd.ix
  3510.     cpi    rwix.WITH
  3511.     jz    p.INDEX.got.WITH
  3512.     cpi    rwix.USING
  3513.     jnz    err.mssng.rsvd.wd
  3514. p.INDEX.got.WITH:
  3515.     call    get.word
  3516.     call    get.var.A.word
  3517.     lda    A.word.type
  3518.     ani    wtp.cnst
  3519.     jz    p.INDEX.WITH.not.cnst
  3520. ;---index is constant -- no need to compute at run-time---
  3521.     lhld    ste.A.address
  3522.     lda    p.INDEX.length
  3523.     dcr    a
  3524.     jz    p.INDEX.cnst.1
  3525.     dcr    a
  3526.     jz    p.INDEX.cnst.2
  3527. ;---index is cnst, but gtr than 2 -- multiply --
  3528.     xchg
  3529.     lhld    p.INDEX.length
  3530.     mvi    h,0
  3531.     call    mul.h.by.d.2.h
  3532.     jmp    p.INDEX.cnst.1
  3533. p.INDEX.cnst.2:
  3534.     dad    h
  3535. p.INDEX.cnst.1:
  3536.     xchg
  3537.     lhld    p.INDEX.base.addr
  3538.     dad    d
  3539.     call    put.LXI.H.hl
  3540.     jmp    p.INDEX.GIVING
  3541. ;
  3542. ;
  3543. p.INDEX.WITH.not.cnst:
  3544.     call    put.get.A.into.HL
  3545.     lhld    p.INDEX.base.addr
  3546.     call    put.LXI.B.hl
  3547.     lda    p.INDEX.length
  3548.     dcr    a
  3549.     jz    p.INDEX.1
  3550.     dcr    a
  3551.     jz    p.INDEX.2
  3552.     dcr a ! dcr a
  3553.     jz    p.INDEX.4
  3554.     dcr a ! dcr a ! dcr a ! dcr a
  3555.     jz    p.INDEX.8
  3556.     dcr a ! dcr a ! dcr a ! dcr a
  3557.     dcr a ! dcr a ! dcr a ! dcr a
  3558.     jnz    p.INDEX.gtr.16
  3559. ;---index by 16---
  3560.     call    put.DAD.H
  3561. p.INDEX.8:
  3562.     call    put.DAD.H
  3563. p.INDEX.4:
  3564.     call    put.DAD.H
  3565. p.INDEX.2:
  3566.     call    put.DAD.H
  3567. p.INDEX.1:
  3568.     call    put.DAD.B
  3569.     jmp    p.INDEX.GIVING
  3570. p.INDEX.gtr.16:
  3571.     lhld    p.INDEX.length
  3572.     call    put.MVI.E.L
  3573.     mvi    a,bir.index
  3574.     call    put.bir.call.fwd
  3575. p.INDEX.GIVING:
  3576.     lda    rsvd.wd.ix
  3577.     cpi    rwix.GIVING
  3578.     jnz    err.mssng.rsvd.wd
  3579.     call    get.word
  3580.     call    get.var.B.word
  3581.     jmp    put.store.HL.at.B
  3582. ;
  3583. ;
  3584. p.INDEX.length:        db    0
  3585. p.INDEX.base.addr:    dw    0
  3586. ;
  3587. ;
  3588. ;------------------------------------------------------
  3589. ;
  3590. ;
  3591. process.INPUT:
  3592.     call    chk.strt.code
  3593.     call    get.word
  3594.     call    chk.word.id.only
  3595.     call    get.var.A.word
  3596.     lda    ste.A.type
  3597.     cpi    stet.BYTE
  3598.     cnz    err.inv.var.type
  3599.     lda    rsvd.wd.ix
  3600.     cpi    rwix.FROM
  3601.     cz    get.word
  3602.     lda    word.type
  3603.     ani    wtp.cnst
  3604.     jnz    p.INPUT.cnst
  3605. ;
  3606.     call    err.not.rom.able
  3607.     call    chk.word.id.only
  3608.     call    get.var.B.word
  3609.     lda    ste.B.type
  3610.     cpi    stet.BYTE
  3611.     cnz    err.inv.var.type
  3612.     call    put.LDA.B
  3613.     call    put.STA
  3614.     lhld    curr.code.addr
  3615.     lxi    d,3
  3616.     dad    d
  3617.     call    put.code.word
  3618.     call    put.IN
  3619.     xra    a
  3620.     call    put.code.byte
  3621.     call    put.STA.A
  3622.     jmp    p.INPUT.end
  3623. ;
  3624. p.INPUT.cnst:
  3625.     call    put.IN
  3626.     lda    cnst.value
  3627.     call    put.code.byte
  3628.     call    put.STA.A
  3629.     call    get.word
  3630. p.INPUT.end:
  3631.     lda    rsvd.wd.ix
  3632.     cpi    rwix.comma
  3633.     jz    process.INPUT
  3634.     ret
  3635. ;
  3636. ;
  3637. ;
  3638. ;
  3639. ;
  3640. ;------------------------------------------------------
  3641. ;
  3642. ;
  3643. process.JUSTIFY:
  3644.     call    chk.strt.code
  3645.     call    get.word
  3646.     call    chk.word.id.only
  3647.     call    get.var.A.word
  3648. ;
  3649.     call    switch.rsvd.wd.ix
  3650.     db rwix.RIGHT        ! dw p.JUSTIFY.RIGHT
  3651.     db rwix.LEFT        ! dw p.JUSTIFY.LEFT
  3652.     db    0        ! dw p.JUSTIFY.err
  3653. p.JUSTIFY.err:
  3654.     call    err.mssng.rsvd.wd
  3655. p.JUSTIFY.LEFT:
  3656.     mvi    a,bir.justify.left
  3657.     jmp    p.JUSTIFY.cont
  3658. ;
  3659. p.JUSTIFY.RIGHT:
  3660.     mvi    a,bir.JUSTIFY.RIGHT
  3661. p.JUSTIFY.cont:
  3662.     sta    p.JUSTIFY.type
  3663. ;
  3664.     call    get.word
  3665.     lda    rsvd.wd.ix
  3666.     cpi    rwix.LENGTH
  3667.     jnz    p.JUSTIFY.dflt
  3668.     call    get.word
  3669. ;
  3670.     call    get.var.B.word
  3671.     lda    B.word.type
  3672.     ani    wtp.cnst
  3673.     jnz    p.JUSTIFY.cnst
  3674.     lda    ste.B.type
  3675.     cpi    stet.BYTE
  3676.     jz    p.JUSTIFY.var
  3677.     cpi    stet.WORD
  3678.     jz    p.JUSTIFY.var
  3679.     cpi    stet.spcl.byte.ptr
  3680.     jz    p.JUSTIFY.var
  3681.     cpi    stet.spcl.word.ptr
  3682.     cnz    err.inv.var.type
  3683. p.JUSTIFY.var:
  3684.     call    put.get.B.into.HL
  3685.     call    put.XCHG
  3686.     call    put.INX.D
  3687.     jmp    p.JUSTIFY.go
  3688. ;
  3689. p.JUSTIFY.cnst:
  3690. ;
  3691.     lhld    ste.B.address
  3692.     inx    h
  3693.     shld    ste.A.length
  3694. p.JUSTIFY.dflt:
  3695.     call    put.LXI.D.A.length
  3696. ;
  3697. p.JUSTIFY.go:
  3698. ;
  3699.     call    switch.A
  3700.     db stet.STRING        ! dw p.JUSTIFY.A.str
  3701.     db stet.spcl.string.ptr    ! dw p.JUSTIFY.A.SP
  3702.     db    0        ! dw p.JUSTIFY.A.err
  3703. p.JUSTIFY.A.err:
  3704.     call    err.inv.var.type
  3705. p.JUSTIFY.A.SP:
  3706.     call    put.LHLD.A
  3707.     jmp    p.JUSTIFY.A.ok
  3708. ;
  3709. p.JUSTIFY.A.str:
  3710.     call    put.LXI.H.A
  3711. p.JUSTIFY.A.ok:
  3712.     lda    p.JUSTIFY.type
  3713.     jmp    put.bir.call.fwd
  3714. ;
  3715. ;
  3716. p.JUSTIFY.type:
  3717.     db    0
  3718. ;
  3719. ;
  3720. ;
  3721. ;
  3722. ;------------------------------------------------------
  3723. ;
  3724. ;
  3725. process.MCALL:
  3726.     call    chk.strt.code
  3727.     call    get.word
  3728.     call    get.var.A.word
  3729.     lda    ste.A.type
  3730.     cpi    stet.end.tbl
  3731.     cz    err.undef.label
  3732. ;
  3733.     lda    rsvd.wd.ix
  3734.     cpi    rwix.USING
  3735.     jz    p.MCALL.go.USING
  3736.     cpi    rwix.WITH
  3737.     jnz    p.MCALL.end.USING
  3738. p.MCALL.go.USING:
  3739. ;
  3740.     call    get.word
  3741.     call    switch.rsvd.wd.ix
  3742.     db rwix.semicolon    ! dw p.MCALL.end.USING
  3743.     db rwix.comma        ! dw p.MCALL.no.u.bc
  3744.     db rwix.GIVING        ! dw p.MCALL.end.USING
  3745.     db    0        ! dw p.MCALL.do.u.BC
  3746. p.MCALL.do.u.BC:
  3747. ;
  3748. ;---bc value in---
  3749. ;
  3750.     call    get.var.B.word
  3751.     call    p.MCALL.chk.type
  3752. ;
  3753.     lda    B.word.type
  3754.     ani    wtp.cnst
  3755.     jz    p.MCALL.u.BC
  3756. ;
  3757.     call    put.LXI.B.B
  3758.     jmp    p.MCALL.no.u.bc
  3759. ;
  3760. p.MCALL.u.bc:
  3761.     call    put.get.B.into.HL
  3762.     call    put.mv.HL.to.BC
  3763. ;
  3764. p.MCALL.no.u.bc:
  3765.     lda    rsvd.wd.ix
  3766.     cpi    rwix.comma
  3767.     cz    get.word
  3768. ;
  3769.     call    switch.rsvd.wd.ix
  3770.     db rwix.comma        ! dw p.MCALL.no.u.DE
  3771.     db rwix.semicolon    ! dw p.MCALL.end.USING
  3772.     db rwix.GIVING        ! dw p.MCALL.end.USING
  3773.     db    0        ! dw p.MCALL.do.u.DE
  3774. p.MCALL.do.u.DE:
  3775. ;
  3776. ;--- de value in ---
  3777. ;
  3778.     call    get.var.B.word
  3779.     call    p.MCALL.chk.type
  3780. ;
  3781.     lda    B.word.type
  3782.     ani    wtp.cnst
  3783.     jz    p.MCALL.u.DE
  3784. ;
  3785.     call    put.LXI.D.B
  3786.     jmp    p.MCALL.no.u.de
  3787. ;
  3788. p.MCALL.u.de:
  3789.     call    put.get.B.into.HL
  3790.     call    put.XCHG
  3791. ;
  3792. p.MCALL.no.u.de:
  3793.     lda    rsvd.wd.ix
  3794.     cpi    rwix.comma
  3795.     cz    get.word
  3796.     call    switch.rsvd.wd.ix
  3797.     db rwix.comma        ! dw p.MCALL.no.u.HL
  3798.     db rwix.semicolon    ! dw p.MCALL.end.USING
  3799.     db rwix.GIVING        ! dw p.MCALL.end.USING
  3800.     db    0        ! dw p.MCALL.do.u.HL
  3801. p.MCALL.do.u.HL:
  3802. ;
  3803. ;--- hl value in ---
  3804. ;
  3805.     call    get.var.B.word
  3806.     call    p.MCALL.chk.type
  3807.     call    put.get.B.into.HL
  3808. ;
  3809. p.MCALL.no.u.hl:
  3810.     lda    rsvd.wd.ix
  3811.     cpi    rwix.comma
  3812.     cz    get.word
  3813.     call    switch.rsvd.wd.ix
  3814.     db rwix.semicolon    ! dw p.MCALL.end.USING
  3815.     db rwix.GIVING        ! dw p.MCALL.end.USING
  3816.     db    0        ! dw p.MCALL.do.u.A
  3817. p.MCALL.do.u.A:
  3818. ;
  3819. ;--- a value in ---
  3820. ;
  3821.     call    get.var.B.word
  3822.     lda    B.word.type
  3823.     ani    wtp.cnst
  3824.     jnz    p.MCALL.u.A.type.ok
  3825.     lda    ste.B.type
  3826.     cpi    stet.BYTE
  3827.     cnz    err.inv.var.type
  3828. p.MCALL.u.A.type.ok:
  3829.     call    put.get.B.into.A
  3830. ;
  3831. p.MCALL.end.USING:
  3832. ;
  3833. ;
  3834. ;--- the call ---
  3835. ;
  3836. ;
  3837.     call    put.CALL
  3838.     call    put.A.address
  3839. ;
  3840. ;-----all regs undefined (in put.CALL rtn.)-----
  3841. ;
  3842. ;
  3843.     lda    rsvd.wd.ix
  3844.     cpi    rwix.GIVING
  3845.     jnz    p.MCALL.end.GIVING
  3846. ;
  3847.     call    get.word
  3848. ;
  3849.     call    switch.rsvd.wd.ix
  3850.     db rwix.comma        ! dw p.MCALL.no.g.HL
  3851.     db rwix.semicolon    ! dw p.MCALL.end.GIVING
  3852.     db    0        ! dw p.MCALL.do.g.HL
  3853. p.MCALL.do.g.HL:
  3854. ;
  3855. ;--- hl value out ---
  3856. ;
  3857.     call    get.var.B.word
  3858.     call    p.MCALL.chk.type
  3859. ;
  3860.     call    put.store.HL.at.B
  3861. ;
  3862. p.MCALL.no.g.hl:
  3863.     lda    rsvd.wd.ix
  3864.     cpi    rwix.comma
  3865.     cz    get.word
  3866. ;
  3867.     call    switch.rsvd.wd.ix
  3868.     db rwix.comma        ! dw p.MCALL.no.g.DE
  3869.     db rwix.semicolon    ! dw p.MCALL.end.GIVING
  3870.     db    0        ! dw p.MCALL.do.g.DE
  3871. p.MCALL.do.g.DE:
  3872. ;
  3873. ;--- de value out ---
  3874. ;
  3875.     call    get.var.B.word
  3876.     call    p.MCALL.chk.type
  3877.     call    put.XCHG
  3878.     call    put.store.HL.at.B
  3879. ;
  3880. p.MCALL.no.g.de:
  3881.     lda    rsvd.wd.ix
  3882.     cpi    rwix.comma
  3883.     cz    get.word
  3884.     call    switch.rsvd.wd.ix
  3885.     db rwix.comma        ! dw p.MCALL.no.g.BC
  3886.     db rwix.semicolon    ! dw p.MCALL.end.GIVING
  3887.     db    0        ! dw p.MCALL.do.g.BC
  3888. p.MCALL.do.g.BC:
  3889. ;
  3890. ;--- bc value out ---
  3891. ;
  3892.     call    get.var.B.word
  3893.     call    p.MCALL.chk.type
  3894.     call    put.mv.BC.to.HL
  3895.     call    put.store.HL.at.B
  3896. ;
  3897. p.MCALL.no.g.bc:
  3898.     lda    rsvd.wd.ix
  3899.     cpi    rwix.comma
  3900.     cz    get.word
  3901.     call    switch.rsvd.wd.ix
  3902.     db rwix.comma        ! dw p.MCALL.end.GIVING
  3903.     db rwix.semicolon    ! dw p.MCALL.end.GIVING
  3904.     db    0        ! dw p.MCALL.do.g.A
  3905. p.MCALL.g.err:
  3906.     call    err.unexpect.word
  3907.     jmp    p.MCALL.end.GIVING
  3908. ;
  3909. ;--- a value out ---
  3910. ;
  3911. p.MCALL.do.g.A:
  3912.     call    get.var.B.word
  3913.     lda    ste.B.type
  3914.     cpi    stet.BYTE
  3915.     cnz    err.inv.var.type
  3916.     jmp    put.store.A.at.B
  3917. ;
  3918. p.MCALL.end.GIVING:
  3919.     jmp    get.word
  3920. ;
  3921. ;
  3922. ;
  3923. p.MCALL.chk.type:
  3924.     lda    B.word.type
  3925.     ani    wtp.cnst
  3926.     rnz
  3927.     lda    ste.B.type
  3928.     cpi    stet.BYTE
  3929.     rz
  3930.     cpi    stet.WORD
  3931.     jnz    err.inv.var.type
  3932.     ret
  3933. ;
  3934. ;
  3935. ;------------------------------------------------------
  3936. ;
  3937. ;
  3938. process.MOVE:
  3939.     call    chk.strt.code
  3940.     call    get.word
  3941.     call    get.var.A.word
  3942.     lda    rsvd.wd.ix
  3943.     cpi    rwix.TO
  3944.     jnz    err.mssng.rsvd.wd
  3945.     call    get.word
  3946.     call    chk.word.id.only
  3947.     call    get.var.B.word
  3948. ;
  3949.     call    switch.B
  3950.     db stet.BYTE        ! dw p.MOVE.x.B8
  3951.     db stet.WORD        ! dw p.MOVE.x.B16
  3952.     db stet.BCD        ! dw p.MOVE.x.BCD
  3953.     db stet.spcl.byte.ptr    ! dw p.MOVE.x.BBP
  3954.     db stet.spcl.word.ptr    ! dw p.MOVE.x.BWP
  3955.     db stet.spcl.BCD.ptr    ! dw p.MOVE.x.BCDP
  3956.     db stet.STRING        ! dw p.MOVE.x.STRING
  3957.     db stet.spcl.string.ptr    ! dw p.MOVE.x.SP
  3958.     db stet.RECORD        ! dw p.MOVE.x.REC
  3959.     db stet.BIT        ! dw p.MOVE.x.BIT
  3960.     db stet.FIELD        ! dw p.MOVE.x.FIELD
  3961.     db    0        ! dw p.MOVE.B.err
  3962. p.MOVE.B.err:
  3963.     call    err.inv.var.type
  3964. ;
  3965. p.MOVE.x.B8:
  3966.     lda    A.word.type
  3967.     ani    wtp.cnst
  3968.     jnz    put.mv.AN.B8
  3969. ;
  3970.     call    switch.A
  3971.     db stet.BYTE        ! dw put.mv.A8.B8
  3972.     db stet.WORD        ! dw put.mv.A16.B8
  3973.     db stet.spcl.byte.ptr    ! dw put.mv.ABP.B8
  3974.     db stet.spcl.word.ptr    ! dw put.mv.AWP.B8
  3975.     db    0        ! dw p.MOVE.x.B8.err
  3976. p.MOVE.x.B8.err:
  3977.     call    err.inv.var.type
  3978.     jmp    put.mv.AN.B8
  3979. ;
  3980. p.MOVE.x.B16:
  3981.     lda    A.word.type
  3982.     ani    wtp.cnst
  3983.     jnz    put.mv.AN.B16
  3984. ;
  3985.     call    switch.A
  3986.     db stet.BYTE        ! dw put.mv.A8.B16
  3987.     db stet.WORD        ! dw put.mv.A16.B16
  3988.     db stet.spcl.byte.ptr    ! dw put.mv.ABP.B16
  3989.     db stet.spcl.word.ptr    ! dw put.mv.AWP.B16
  3990.     db    0        ! dw p.MOVE.x.B8.err
  3991. ;
  3992. ;
  3993. p.MOVE.x.BWP:
  3994.     lda    A.word.type
  3995.     ani    wtp.cnst
  3996.     jnz    put.mv.AN.BWP
  3997. ;
  3998.     call    switch.A
  3999.     db stet.BYTE        ! dw put.mv.A8.BWP
  4000.     db stet.WORD        ! dw put.mv.A16.BWP
  4001.     db stet.spcl.byte.ptr    ! dw put.mv.ABP.BWP
  4002.     db stet.spcl.word.ptr    ! dw put.mv.AWP.BWP
  4003.     db    0        ! dw p.MOVE.x.B8.err
  4004. ;
  4005. p.MOVE.x.BBP:
  4006.     lda    A.word.type
  4007.     ani    wtp.cnst
  4008.     jnz    put.mv.AN.BBP
  4009. ;
  4010.     call    switch.A
  4011.     db stet.BYTE        ! dw put.mv.A8.BBP
  4012.     db stet.WORD        ! dw put.mv.A16.BBP
  4013.     db stet.spcl.byte.ptr    ! dw put.mv.ABP.BBP
  4014.     db stet.spcl.word.ptr    ! dw put.mv.AWP.BBP
  4015.     db    0        ! dw p.MOVE.x.B8.err
  4016. ;
  4017. ;
  4018. ;
  4019. p.MOVE.x.BIT:
  4020.     lda    A.word.type
  4021.     ani    wtp.cnst
  4022.     jz    err.inv.cnst
  4023.     call    put.LXI.H.B
  4024.     lda    ste.A.address
  4025.     ora    a
  4026.     jz    p.MOVE.0.BIT
  4027.     lda    ste.B.BIT.posn
  4028.     mov    l,a
  4029.     call    put.MVI.A.L
  4030.     call    put.ORA.M
  4031.     jmp    put.MOV.M.A
  4032. ;
  4033. p.MOVE.0.BIT:
  4034.     lda    ste.B.BIT.posn
  4035.     cma
  4036.     mov    l,a
  4037.     call    put.MVI.A.L
  4038.     call    put.ANA.M
  4039.     jmp    put.MOV.M.A
  4040. ;
  4041. ;
  4042. ;
  4043. p.MOVE.x.BCD:
  4044.     call    put.LXI.D.B
  4045.     jmp    p.MOVE.BCD.cont
  4046. ;
  4047. p.MOVE.x.BCDP:
  4048.     call    put.LHLD.B
  4049.     call    put.XCHG
  4050. p.MOVE.BCD.cont:
  4051.     lda    A.word.type
  4052.     ani    wtp.cnst
  4053.     lxi    h,sym.tbl.entry.A
  4054.     cnz    put.inline.BCD
  4055. ;
  4056.     lda    ste.A.type
  4057.     cpi    stet.BCD
  4058.     jz    p.MOVE.BCD.BCD
  4059.     cpi    stet.spcl.BCD.ptr
  4060.     cnz    err.inv.var.type
  4061. ;
  4062.     call    put.LHLD.A
  4063.     jmp    p.MOVE.BCD.move
  4064. ;
  4065. p.MOVE.BCD.BCD:
  4066.     call    put.LXI.H.A
  4067. p.MOVE.BCD.move:
  4068.     jmp    put.bir.MOVE.BCD
  4069. ;
  4070. ;
  4071. ;
  4072. p.MOVE.x.STRING:
  4073.     lda    A.word.type
  4074.     ani    wtp.string
  4075.     cnz    put.inline.A.string
  4076. ;
  4077.     call    switch.A
  4078.     db stet.STRING        ! dw p.MOVE.STR.STR
  4079.     db stet.spcl.string.ptr    ! dw p.MOVE.SP.STR
  4080.     db stet.FIELD        ! dw p.MOVE.FIELD.STR
  4081.     db    0        ! dw p.MOVE.x.STR.err
  4082. p.MOVE.x.STR.err:
  4083.     call    err.inv.var.type
  4084.     jmp    p.MOVE.STR.STR
  4085. ;
  4086. p.MOVE.x.SP:
  4087.     lda    A.word.type
  4088.     ani    wtp.string
  4089.     cnz    put.inline.A.string
  4090. ;
  4091.     call    switch.A
  4092.     db stet.STRING        ! dw p.MOVE.STR.SP
  4093.     db stet.spcl.string.ptr    ! dw p.MOVE.SP.SP
  4094.     db stet.FIELD        ! dw p.MOVE.FIELD.SP
  4095.     db    0        ! dw p.MOVE.x.STR.err
  4096. ;
  4097. p.MOVE.x.REC:
  4098.     lda    ste.A.type
  4099.     cpi    stet.RECORD
  4100.     jz    p.MOVE.x.REC.ok
  4101.     cpi    stet.STRING
  4102.     jz    p.MOVE.x.REC.ok
  4103.     cpi    stet.FIELD
  4104.     cnz    err.inv.var.type
  4105. p.MOVE.x.REC.ok:
  4106.     call    p.MOVE.S.S.prefix
  4107.     call    put.LXI.H.A
  4108.     call    put.LXI.D.B
  4109.     lda    blk.mov.this.stmt
  4110.     ora    a
  4111.     jnz    p.MOVE.block.move
  4112. ;
  4113.     call    put.LXI.B
  4114.     lhld    ste.B.length
  4115.     xchg
  4116.     lhld    ste.A.length
  4117.     call    cmp.hl.fm.de
  4118.     jnc    p.MOVE.REC.A.short
  4119.     push    d
  4120.     call    err.truncate
  4121.     pop    h
  4122. p.MOVE.REC.A.short:
  4123.     call    put.code.word
  4124.     jmp    p.MOVE.block.move
  4125. ;
  4126. ;
  4127. p.MOVE.x.FIELD:
  4128.     lhld    ste.B.length
  4129.     mov    a,h
  4130.     ora    a
  4131.     cnz    err.inv.string.size
  4132.     mov    a,l
  4133.     ora    a
  4134.     cz    err.inv.string.size
  4135.     lda    A.word.type
  4136.     ani    wtp.string
  4137.     cnz    put.inline.A.string
  4138.     call    switch.A
  4139.     db stet.FIELD        ! dw p.MOVE.FIELD.FIELD
  4140.     db stet.STRING        ! dw p.MOVE.STR.FIELD
  4141.     db stet.spcl.string.ptr    ! dw p.MOVE.SP.FIELD
  4142.     db    0        ! dw p.MOVE.x.STR.err
  4143. ;
  4144. p.MOVE.FIELD.FIELD:
  4145.     call    chk.MOVE.LENGTH
  4146.     jz    p.MOVE.STR.STR
  4147.     lda    ste.A.length
  4148.     mov    l,a
  4149.     lda    ste.B.length
  4150.     mov    h,a
  4151.     call    put.LXI.B.hl
  4152.     call    put.LXI.H.A
  4153.     call    put.LXI.D.B
  4154.     mvi    a,bir.move.field
  4155.     jmp    put.bir.call.fwd
  4156. ;
  4157. p.MOVE.STR.FIELD:
  4158.     call    chk.MOVE.LENGTH
  4159.     jz    p.MOVE.STR.STR
  4160.     call    put.LXI.H.A
  4161.     jmp    p.MOVE.S.SP.FIELD
  4162. ;
  4163. p.MOVE.SP.FIELD:
  4164.     call    chk.MOVE.LENGTH
  4165.     jz    p.MOVE.SP.STR
  4166.     call    put.LHLD.A
  4167. p.MOVE.S.SP.FIELD:
  4168.     call    put.LXI.D.B
  4169.     call    put.MVI.C
  4170.     lda    ste.B.length
  4171.     call    put.code.byte
  4172.     mvi    a,bir.move.str.2.field
  4173.     jmp    put.bir.call.fwd
  4174. ;
  4175. p.MOVE.FIELD.STR:
  4176.     call    chk.MOVE.LENGTH
  4177.     jz    p.MOVE.STR.STR
  4178.     call    put.LXI.D.B
  4179.     jmp    p.MOVE.FIELD.S.SP
  4180. ;
  4181. p.MOVE.FIELD.SP:
  4182.     call    chk.MOVE.LENGTH
  4183.     jz    p.MOVE.STR.SP
  4184.     call    put.LHLD.B
  4185.     call    put.XCHG
  4186. p.MOVE.FIELD.S.SP:
  4187.     call    put.LXI.H.A
  4188.     call    put.LXI.B.A.length
  4189.     mvi    a,bir.move.field.2.str
  4190.     jmp    put.bir.call.fwd
  4191. ;
  4192. ;
  4193. chk.MOVE.LENGTH:
  4194.     lda    rsvd.wd.ix
  4195.     cpi    rwix.LENGTH
  4196.     ret
  4197. ;
  4198. ;
  4199. p.MOVE.S.S.prefix:
  4200.     xra    a
  4201.     sta    blk.mov.this.stmt
  4202. ;
  4203.     lda    rsvd.wd.ix
  4204.     cpi    rwix.LENGTH
  4205.     rnz
  4206. ;
  4207.     mvi    a,0ffh
  4208.     sta    blk.mov.this.stmt
  4209. ;
  4210.     call    get.word
  4211.     call    get.var.C.word
  4212.     lda    C.word.type
  4213.     ani    wtp.cnst
  4214.     jnz    p.MOVE.S.S.get.C.len
  4215. ;
  4216.     call    put.get.C.into.HL
  4217.     call    put.MOV.B.H
  4218.     jmp    put.MOV.C.L
  4219. ;
  4220. ;
  4221. p.MOVE.S.S.get.C.len:
  4222.     lhld    ste.C.address
  4223.     mov    a,h
  4224.     ora    l
  4225.     cz    err.inv.string.size
  4226.     jmp    put.LXI.B.C
  4227. ;
  4228. ;
  4229. p.MOVE.S.S.chk.blk:
  4230.     lda    blk.mov.this.stmt
  4231.     ora    a
  4232.     jz    put.move.string
  4233. ;
  4234. p.MOVE.block.move:
  4235.     lda    rsvd.wd.ix
  4236.     cpi    rwix.REVERSE
  4237.     jnz    put.mov.blk
  4238. ;
  4239.     call    get.word
  4240.     call    put.XCHG
  4241.     call    put.DAD.B
  4242.     call    put.XCHG
  4243.     call    put.DAD.B
  4244.     jmp    put.bir.mov.rev
  4245. ;
  4246. ;
  4247. ;
  4248. p.MOVE.STR.STR:
  4249.     call    p.MOVE.S.S.prefix
  4250.     lda    blk.mov.this.stmt
  4251.     ora    a
  4252.     jnz    p.MOVE.S.S.got.len
  4253. ;
  4254.     lda    string.move.block.flag
  4255.     ora    a
  4256.     jz    p.MOVE.S.S.got.len
  4257. ;
  4258.     mvi    a,0ffh
  4259.     sta    blk.mov.this.stmt
  4260. ;
  4261.     call    put.LXI.B
  4262.     lhld    ste.B.length
  4263.     xchg
  4264.     lhld    ste.A.length
  4265.     call    cmp.hl.fm.de
  4266.     jc    p.MOVE.S.S.A.short
  4267.     xchg
  4268.     push    h
  4269.     call    err.truncate
  4270.     pop    h
  4271. p.MOVE.S.S.A.short:
  4272.     call    put.code.word
  4273. p.MOVE.S.S.got.len:
  4274.     call    put.LXI.H.A
  4275.     call    put.LXI.D.B
  4276.     jmp    p.MOVE.S.S.chk.blk
  4277. ;
  4278. p.MOVE.c.STR:
  4279.     call    put.inline.A.string
  4280.     jmp    p.MOVE.STR.STR
  4281. ;
  4282. p.MOVE.STR.SP:
  4283.     call    p.MOVE.S.S.prefix
  4284.     call    put.LHLD.B
  4285.     call    put.XCHG
  4286.     call    put.LXI.H.A
  4287. ;
  4288.     lda    string.move.block.flag
  4289.     ora    a
  4290.     jz    p.MOVE.S.S.chk.blk
  4291.     lda    blk.mov.this.stmt
  4292.     ora    a
  4293.     jnz    p.MOVE.S.S.chk.blk
  4294. ;
  4295.     call    put.LXI.B.A.length
  4296.     mvi    a,0ffh
  4297.     sta    blk.mov.this.stmt
  4298.     jmp    p.MOVE.S.S.chk.blk
  4299. ;
  4300. p.MOVE.SP.SP:
  4301.     call    p.MOVE.S.S.prefix
  4302.     call    put.LHLD.B
  4303.     call    put.XCHG
  4304.     call    put.LHLD.A
  4305.     jmp    p.MOVE.S.S.chk.blk
  4306. ;
  4307. p.MOVE.SP.STR:
  4308.     call    p.MOVE.S.S.prefix
  4309.     call    put.LHLD.A
  4310.     call    put.LXI.D.B
  4311. ;
  4312.     lda    string.move.block.flag
  4313.     ora    a
  4314.     jz    p.MOVE.S.S.chk.blk
  4315.     lda    blk.mov.this.stmt
  4316.     ora    a
  4317.     jnz    p.MOVE.S.S.chk.blk
  4318. ;
  4319.     call    put.LXI.B.B.length
  4320.     mvi    a,0ffh
  4321.     sta    blk.mov.this.stmt
  4322.     jmp    p.MOVE.S.S.chk.blk
  4323. ;
  4324. ;
  4325. ;------------------------------------------------------
  4326. ;
  4327. ;
  4328. process.MULTIPLY:
  4329.     call    chk.strt.code
  4330.     call    get.word
  4331.     call    get.var.A.word
  4332.     lda    rsvd.wd.ix
  4333.     cpi    rwix.BY
  4334.     cz    get.word
  4335. ;
  4336.     call    get.var.B.word
  4337.     lda    rsvd.wd.ix
  4338.     cpi    rwix.GIVING
  4339.     jz    p.MULTIPLY.3
  4340. ;
  4341. ;---2-address multiply---
  4342. ;
  4343.     lxi    h,sym.tbl.entry.A
  4344.     lxi    d,sym.tbl.entry.C
  4345.     call    move.sym.tbl.entry
  4346.     jmp    p.MULTIPLY.ok
  4347. ;
  4348. p.MULTIPLY.3:
  4349.     call    get.word
  4350.     call    chk.word.id.only
  4351.     call    get.var.C.word
  4352. p.MULTIPLY.ok:
  4353.     lda    A.word.type
  4354.     ani    wtp.cnst
  4355.     jnz    p.MULTIPLY.cnst
  4356. ;
  4357.     call    switch.A
  4358.     db stet.BYTE        ! dw p.MULTIPLY.8
  4359.     db stet.WORD        ! dw p.MULTIPLY.16
  4360.     db stet.spcl.byte.ptr    ! dw p.MULTIPLY.BP
  4361.     db stet.spcl.word.ptr    ! dw p.MULTIPLY.WP
  4362.     db stet.BCD        ! dw p.MULTIPLY.BCD
  4363.     db stet.spcl.BCD.ptr    ! dw p.MULTIPLY.BCDP
  4364.     db    0        ! dw p.MULTIPLY.A.err
  4365. ;
  4366. p.MULTIPLY.A.err:
  4367.     call    err.inv.var.type
  4368. p.MULTIPLY.8:
  4369. p.MULTIPLY.16:
  4370.     call    put.get.A.into.HL
  4371.     call    put.XCHG
  4372.     jmp    p.MULTIPLY.got.A
  4373. ;
  4374. p.MULTIPLY.BP:
  4375.     call    put.LHLD.A
  4376.     call    put.mv.@HLB.to.DE
  4377.     jmp    p.MULTIPLY.got.A
  4378. ;
  4379. p.MULTIPLY.WP:
  4380.     call    put.LHLD.A
  4381.     call    put.mv.@HL.to.DE
  4382.     jmp    p.MULTIPLY.got.A
  4383. ;
  4384. p.MULTIPLY.cnst:
  4385.     lda    B.word.type
  4386.     ani    wtp.cnst
  4387.     jnz    p.MULTIPLY.c.c
  4388. ;
  4389.     lda    ste.B.type
  4390.     cpi    stet.BCD
  4391.     jz    p.MULTIPLY.BCD.cnst
  4392.     cpi    stet.spcl.bcd.ptr
  4393.     jz    p.MULTIPLY.BCD.cnst
  4394. ;
  4395.     call    put.LXI.D.A
  4396. p.MULTIPLY.got.A:
  4397.     call    put.get.B.into.HL
  4398. p.MULTIPLY.got.B:
  4399.     call    put.mul.16
  4400.     jmp    put.store.HL.at.C
  4401. ;
  4402. ;
  4403. ;
  4404. p.MULTIPLY.c.c:
  4405.     lhld    ste.A.address
  4406.     xchg
  4407.     lhld    ste.B.address
  4408.     call    mul.h.by.d.2.h
  4409.     call    put.LXI.H.hl
  4410.     jmp    put.store.HL.at.C
  4411. ;
  4412. ;
  4413. ;
  4414. p.MULTIPLY.BCD.cnst:
  4415.     lxi    h,sym.tbl.entry.A
  4416.     call    put.inline.BCD
  4417. ;
  4418. p.MULTIPLY.BCD:
  4419.     call    put.LXI.D.A
  4420.     jmp    p.MULTIPLY.BCD.C
  4421. ;
  4422. p.MULTIPLY.BCDP:
  4423.     call    put.LHLD.A
  4424.     call    put.XCHG
  4425. p.MULTIPLY.BCD.C:
  4426.     lda    ste.C.type
  4427.     cpi    stet.BCD
  4428.     jz    p.MULTIPLY.C.BCD
  4429.     cpi    stet.spcl.bcd.ptr
  4430.     jnz    err.inv.var.type
  4431. ;
  4432.     call    put.LHLD.C
  4433.     call    put.mv.HL.to.BC
  4434.     jmp    p.MULTIPLY.BCD.B
  4435. ;
  4436. p.MULTIPLY.C.BCD:
  4437.     call    put.LXI.B.C
  4438. p.MULTIPLY.BCD.B:
  4439.     lda    B.word.type
  4440.     ani    wtp.cnst
  4441.     lxi    h,sym.tbl.entry.B
  4442.     cnz    put.inline.BCD
  4443. ;
  4444.     lda    ste.B.type
  4445.     cpi    stet.BCD
  4446.     jz    p.MULTIPLY.B.BCD
  4447.     cpi    stet.spcl.bcd.ptr
  4448.     jnz    err.inv.var.type
  4449. ;
  4450.     call    put.LHLD.B
  4451.     jmp    p.MULTIPLY.BCD.call
  4452. ;
  4453. p.MULTIPLY.B.BCD:
  4454.     call    put.LXI.H.B
  4455. p.MULTIPLY.BCD.call:
  4456.     mvi    a,bir.BCD.multiply
  4457.     jmp    put.bir.call.fwd
  4458. ;
  4459. ;
  4460. ;
  4461. ;
  4462. ;
  4463. ;------------------------------------------------------
  4464. ;
  4465. ;
  4466. process.NULL:
  4467.     jmp    get.word
  4468. ;
  4469. ;
  4470. ;------------------------------------------------------
  4471. ;
  4472. ;
  4473. ;
  4474. process.OPEN:
  4475.     call    chk.strt.code
  4476.     call    get.word
  4477.     call    chk.word.id.only
  4478.     call    get.var.A.word
  4479.     lda    ste.A.type
  4480.     cpi    stet.FILE
  4481.     cnz    err.undef.file.name
  4482.     lda    ste.A.FILE.device
  4483.     cpi    rwix.DISK
  4484.     rnz
  4485. ;---init FILE flags---
  4486.     mvi    a,FILE.r.flag.OPEN
  4487.     sta    FILE.r.flags
  4488. ;
  4489. ;---code to test for filename---
  4490. ;
  4491.     lda    ste.A.FILE.misc.flag
  4492.     ani    FILE.c.flag.ext.name
  4493.     jz    p.OPEN.no.ext.name
  4494. ;
  4495.     lhld    ste.A.address
  4496.     lxi    d,fcb.name.addr
  4497.     dad    d
  4498.     call    put.LHLD.hl
  4499.     call    put.MOV.A.H
  4500.     call    put.ORA.L
  4501.     call    put.JZ
  4502.     lhld    curr.code.addr
  4503.     lxi    d,8
  4504.     dad    d
  4505.     call    put.code.word
  4506.     call    put.LXI.D.A
  4507.     call    put.format.file.name
  4508. ;
  4509. p.OPEN.no.ext.name:
  4510.     call    p.OPEN.put.FILE1.2
  4511.     xra    a
  4512.     sta    file.new.flag
  4513. ;
  4514.     lda    rsvd.wd.ix
  4515.     cpi    rwix.INPUT
  4516.     jnz    p.OPEN.not.INPUT
  4517. ;
  4518.     mvi    a,FILE.r.flag.INPUT
  4519.     call    p.FILE.set.r.flag
  4520. ;
  4521.     call    get.word
  4522.     jmp    p.OPEN.stat.ok
  4523. ;
  4524. p.OPEN.not.INPUT:
  4525.     lda    rsvd.wd.ix
  4526.     cpi    rwix.OUTPUT
  4527.     jnz    p.OPEN.not.OUTPUT
  4528. ;
  4529.     mvi    a,FILE.r.flag.OUTPUT
  4530.     call    p.FILE.set.r.flag
  4531.     mvi    a,0ffh
  4532.     sta    file.new.flag
  4533.     call    get.word
  4534.     jmp    p.OPEN.stat.ok
  4535. ;
  4536. p.OPEN.not.OUTPUT:
  4537.     lda    rsvd.wd.ix
  4538.     cpi    rwix.IO
  4539.     jnz    p.OPEN.not.IO
  4540. ;
  4541.     mvi    a,FILE.r.flag.INPUT + FILE.r.flag.OUTPUT
  4542.     call    p.FILE.set.r.flag
  4543.     call    get.word
  4544.     lda    ste.A.FILE.misc.flag
  4545.     ani    FILE.c.flag.TEXT
  4546.     cnz    err.file.cant.io
  4547.     jmp    p.OPEN.stat.ok
  4548. ;
  4549. p.OPEN.not.IO:
  4550.     lda    rsvd.wd.ix
  4551.     cpi    rwix.OI
  4552.     jnz    p.OPEN.not.OI
  4553. ;
  4554.     mvi    a,FILE.r.flag.INPUT + FILE.r.flag.OUTPUT
  4555.     call    p.FILE.set.r.flag
  4556.     lda    ste.A.FILE.misc.flag
  4557.     ani    FILE.c.flag.TEXT
  4558.     cnz    err.file.cant.io
  4559.     mvi    a,0ffh
  4560.     sta    file.new.flag
  4561.     call    get.word
  4562.     jmp    p.OPEN.stat.ok
  4563. ;
  4564. p.OPEN.not.OI:
  4565.     mvi    a,FILE.r.flag.INPUT
  4566.     call    p.FILE.set.r.flag
  4567. p.OPEN.stat.OK:
  4568.     lda    rsvd.wd.ix
  4569.     cpi    rwix.NO
  4570.     jnz    p.OPEN.not.NO
  4571. ;
  4572.     call    get.word
  4573.     lda    rsvd.wd.ix
  4574.     cpi    rwix.REMOVE
  4575.     cnz    err.mssng.rsvd.wd
  4576.     call    get.word
  4577.     xra    a
  4578.     sta    file.new.flag
  4579.     jmp    p.OPEN.not.REMOVE
  4580. ;
  4581. p.OPEN.not.NO:
  4582.     cpi    rwix.REMOVE
  4583.     jnz    p.OPEN.chk.output
  4584. ;
  4585.     call    get.word
  4586.     mvi    a,FILE.r.flag.OUTPUT
  4587.     call    p.FILE.set.r.flag
  4588. ;
  4589. p.OPEN.chk.output:
  4590.     lda    file.new.flag
  4591.     ora    a
  4592.     jz    p.OPEN.not.REMOVE
  4593. ;
  4594.     call    put.LXI.D.A
  4595.     call    put.MVI.C
  4596.     mvi    a,19    ;delete file
  4597.     call    put.code.byte
  4598.     call    put.CALL.ENTRY
  4599.     mvi    a,0ffh
  4600.     sta    file.new.flag
  4601. ;
  4602. p.OPEN.not.REMOVE:
  4603.     lda    rsvd.wd.ix
  4604.     cpi    rwix.SHARED
  4605.     jnz    p.OPEN.not.SHARED
  4606.     call    get.word
  4607.     lda    MPM.flag
  4608.     ora    a
  4609.     jz    p.OPEN.not.SHARED
  4610.     lhld    ste.A.address
  4611.     lxi    d,5
  4612.     dad    d
  4613.     call    put.LXI.H.hl
  4614.     call    put.MOV.A.M
  4615.     mvi    l,80h
  4616.     call    put.ORI.L
  4617.     call    put.MOV.M.A
  4618.     ori    FILE.r.flag.SHARED
  4619.     call    p.FILE.set.r.flag
  4620. p.OPEN.not.SHARED:
  4621.     lda    ste.A.FILE.misc.flag
  4622.     ani    FILE.c.flag.rec.mode
  4623.     jz    p.OPEN.not.rec.mode
  4624.     lxi    h,0
  4625.     call    put.LXI.H.hl
  4626.     lhld    ste.A.address
  4627.     lxi    d,fcb.rec.buf.sctr
  4628.     dad    d
  4629.     call    put.SHLD.hl
  4630. p.OPEN.not.rec.mode:
  4631.     lda    ste.A.FILE.misc.flag
  4632.     ani    FILE.c.flag.TEXT + FILE.c.flag.rec.mode
  4633.     cpi    FILE.c.flag.TEXT
  4634.     jnz    p.OPEN.not.TEXT
  4635.     call    put.LXI.D.A
  4636.     lda    FILE.r.flags
  4637.     ani    FILE.r.flag.INPUT
  4638.     mvi    a,bir.dsk.ch.in.open
  4639.     jnz    p.OPEN.bir.open
  4640.     mvi    a,bir.dsk.ch.out.open
  4641. p.OPEN.bir.open:
  4642.     call    put.bir.call.fwd
  4643. ;
  4644. p.OPEN.not.TEXT:
  4645.     lhld    FILE.r.flags
  4646.     call    put.MVI.A.L
  4647. ;
  4648.     call    put.LXI.D.A
  4649.     call    put.MVI.C
  4650.     lda    file.new.flag
  4651.     ora    a
  4652.     mvi    a,22    ;create new file
  4653.     jnz    p.OPEN.new.file
  4654.     mvi    a,15    ;open old file
  4655. p.OPEN.new.file:
  4656.     call    put.code.byte
  4657.     mvi    a,bir.OPEN.DISK
  4658.     call    put.bir.call.fwd
  4659. ;
  4660.     lda    rsvd.wd.ix
  4661.     cpi    rwix.ERROR
  4662.     jnz    p.OPEN.end
  4663. ;
  4664.     call    put.INR.A
  4665.     call    get.word
  4666.     lda    rsvd.wd.ix
  4667.     cpi    rwix.STANDARD
  4668.     jz    p.OPEN.err.STANDARD
  4669. ;
  4670.     call    put.JNZ
  4671.     mvi    a,bir.OPEN.fwd
  4672.     call    put.fwd.ref.bir
  4673. ;
  4674.     call    process.a.statement
  4675. ;
  4676.     mvi    a,bir.OPEN.fwd
  4677.     call    fix.up.built.in.rtn
  4678.     jmp    p.OPEN.end
  4679. ;
  4680. p.OPEN.err.STANDARD:
  4681.     call    put.CZ
  4682.     mvi    a,bir.OPEN.error
  4683.     call    put.fwd.ref.bir
  4684.     call    get.word
  4685. ;
  4686. p.OPEN.end:
  4687.     lda    rsvd.wd.ix
  4688.     cpi    rwix.comma
  4689.     jz    process.OPEN
  4690.     ret
  4691. ;
  4692. ;
  4693. p.OPEN.put.FILE1.2:
  4694.     lxi    h,dflt.fcb
  4695.     lda    ste.A.FILE.misc.flag
  4696.     ani    FILE.cr.flag.FILE1
  4697.     jnz    p.OPEN.actual.FILE.1.2
  4698. ;
  4699.     lxi    h,dflt.2nd.fcb
  4700.     lda    ste.A.FILE.misc.flag
  4701.     ani    FILE.cr.flag.FILE2
  4702.     rz
  4703. ;
  4704. ;
  4705. p.OPEN.actual.FILE1.2:
  4706.     call    p.FILE.set.r.flag
  4707.     call    put.LXI.H.hl
  4708.     call    put.LXI.D.A
  4709.     mvi    a,bir.file1.move
  4710.     jmp    put.bir.call.fwd
  4711. ;
  4712. ;
  4713. ;
  4714. ;------------------------------------------------------
  4715. ;
  4716. ;
  4717. process.OUTPUT:
  4718.     call    chk.strt.code
  4719.     call    get.word
  4720.     call    get.var.A.word
  4721.     lda    A.word.type
  4722.     ani    wtp.cnst
  4723.     jnz    p.OUTPUT.ok
  4724. ;
  4725.     lda    ste.A.type
  4726.     cpi    stet.BYTE
  4727.     cnz    err.inv.var.type
  4728. p.OUTPUT.ok:
  4729.     lda    rsvd.wd.ix
  4730.     cpi    rwix.TO
  4731.     cz    get.word
  4732.     lda    word.type
  4733.     ani    wtp.cnst
  4734.     jnz    p.OUTPUT.cnst
  4735. ;
  4736.     call    err.not.rom.able
  4737.     call    chk.word.id.only
  4738.     call    get.var.B.word
  4739.     lda    ste.B.type
  4740.     cpi    stet.BYTE
  4741.     jnz    err.inv.var.type
  4742.     call    put.LDA.B
  4743.     call    put.STA
  4744.     lhld    curr.code.addr
  4745.     lxi    d,6
  4746.     dad    d
  4747.     call    put.code.word
  4748.     call    put.LDA.A
  4749.     call    put.OUT
  4750.     xra    a
  4751.     call    put.code.byte
  4752.     jmp    p.OUTPUT.end
  4753. ;
  4754. p.OUTPUT.cnst:
  4755.     call    get.var.B.word
  4756.     lda    A.word.type
  4757.     ani    wtp.cnst
  4758.     jz    p.OUTPUT.var
  4759.     call    put.MVI.A.A
  4760.     jmp    p.OUTPUT.out
  4761. ;
  4762. p.OUTPUT.var:
  4763.     call    put.LDA.A
  4764. p.OUTPUT.out:
  4765.     call    put.OUT
  4766.     lda    ste.B.address
  4767.     call    put.code.byte
  4768. p.OUTPUT.end:
  4769.     lda    rsvd.wd.ix
  4770.     cpi    rwix.comma
  4771.     jz    process.OUTPUT
  4772.     ret
  4773. ;
  4774. ;
  4775. ;------------------------------------------------------
  4776. ;
  4777. ;
  4778. process.POINTER:
  4779.     call    set.byte.boundary
  4780.     call    chk.strt.data
  4781.     call    get.word
  4782.     lda    rsvd.wd.ix
  4783.     cpi    rwix.TO
  4784.     cz    get.word
  4785. ;
  4786.     call    switch.rsvd.wd.ix
  4787.     db rwix.STRING        ! dw p.POINTER.STRING
  4788.     db rwix.WORD        ! dw p.POINTER.WORD
  4789.     db rwix.BYTE        ! dw p.POINTER.BYTE
  4790.     db rwix.BCD        ! dw p.POINTER.BCD
  4791.     db    0        ! dw err.mssng.rsvd.wd
  4792. ;
  4793. p.POINTER.BCD:
  4794.     mvi    a,stet.bcd.ptr
  4795.     jmp    p.POINTER.id
  4796. ;
  4797. p.POINTER.BYTE:
  4798.     mvi    a,stet.byte.ptr
  4799.     jmp    p.POINTER.id
  4800. ;
  4801. p.POINTER.WORD:
  4802.     mvi    a,stet.word.ptr
  4803.     jmp    p.POINTER.id
  4804. ;
  4805. p.POINTER.STRING:
  4806.     mvi    a,stet.string.ptr
  4807. ;
  4808. p.POINTER.id:
  4809.     sta    ste.type
  4810.     sta    curr.ptr.type
  4811.     call    get.word
  4812.     call    chk.word.id.only
  4813.     lda    curr.BIT.posn
  4814.     sta    ste.BIT.posn
  4815.     lxi    h,2
  4816.     shld    ste.length
  4817.     call    put.word.into.tbl
  4818.     call    get.word
  4819.     lda    rsvd.wd.ix
  4820.     cpi    rwix.VALUE
  4821.     jz    p.POINTER.VALUE
  4822.     lhld    curr.code.addr
  4823.     inx    h
  4824.     inx    h
  4825.     shld    curr.code.addr
  4826.     jmp    p.POINTER.comma
  4827. ;
  4828. p.POINTER.VALUE:
  4829.     call    get.word
  4830.     lda    word.type
  4831.     ani    wtp.cnst
  4832.     jnz    p.POINTER.cnst
  4833. ;
  4834.     lda    rsvd.wd.ix
  4835.     cpi    rwix.HIMEM
  4836.     jnz    p.POINTER.label
  4837.     mvi    a,bir.HIMEM
  4838.     call    put.fwd.ref.bir
  4839.     call    get.word
  4840.     jmp    p.POINTER.comma
  4841. ;
  4842. p.POINTER.label:
  4843.     lda    word.type
  4844.     ani    wtp.ident
  4845.     jz    p.POINTER.inv.VALUE
  4846.     call    lookup.word
  4847.     lhld    wk.sym.tbl.addr
  4848.     mov    a,m
  4849.     cpi    stet.end.tbl
  4850.     jz    p.POINTER.fwd.ref
  4851. ;
  4852.     lxi    b,(ste.address - ste.type)
  4853.     dad    b
  4854.     mov    e,m
  4855.     inx    h
  4856.     mov    d,m
  4857.     jmp    p.POINTER.put.VALUE
  4858. ;
  4859. p.POINTER.inv.VALUE:
  4860.     call    err.inv.VALUE
  4861.     lhld    curr.code.addr
  4862.     inx    h
  4863.     inx    h
  4864.     shld    curr.code.addr
  4865.     call    get.word
  4866.     jmp    p.POINTER.comma
  4867. ;
  4868. p.POINTER.fwd.ref:
  4869.     mvi    a,stet.fwd.ref
  4870.     sta    ste.type
  4871.     call    put.word.into.tbl
  4872.     lxi    h,0
  4873.     jmp    p.POINTER.put.value
  4874. ;
  4875. p.POINTER.cnst:
  4876.     lhld    cnst.value
  4877. p.POINTER.put.VALUE:
  4878.     call    put.code.word
  4879.     call    get.word
  4880. p.POINTER.comma:
  4881.     lda    rsvd.wd.ix
  4882.     cpi    rwix.comma
  4883.     jnz    get.word    ;exit
  4884. ;
  4885.     lda    curr.ptr.type
  4886.     jmp    p.POINTER.id
  4887. ;
  4888. ;
  4889. ;------------------------------------------------------
  4890. ;
  4891. ;
  4892. process.POP:
  4893.     call    chk.strt.code
  4894.     call    get.word
  4895.     call    chk.word.id.only
  4896.     call    get.var.B.word
  4897.     call    put.POP.H
  4898.     call    put.store.HL.at.B
  4899.     lda    rsvd.wd.ix
  4900.     cpi    rwix.comma
  4901.     jz    process.POP
  4902.     ret
  4903. ;
  4904. ;
  4905. ;------------------------------------------------------
  4906. ;
  4907. ;
  4908. process.PRINT:
  4909.     call    get.word
  4910.     lda    rsvd.wd.ix
  4911.     cpi    rwix.PAGE
  4912.     jz    p.PRINT.PAGE
  4913.     lda    print.on.off.flag
  4914.     cpi    rwix.FULL
  4915.     jz    get.word
  4916. ;
  4917.     lda    rsvd.wd.ix
  4918.     sta    print.on.off.flag
  4919.     jmp    get.word
  4920. ;
  4921. p.PRINT.PAGE:
  4922.     mvi    e,0ch
  4923.     lda    print.on.off.flag
  4924.     cpi    rwix.OFF
  4925.     cnz    print.out
  4926.     jmp    get.word
  4927. ;
  4928. ;
  4929. ;------------------------------------------------------
  4930. ;
  4931. ;
  4932. process.PROCEDURE:
  4933.     call    opt.undef.all
  4934.     call    get.word
  4935.     call    chk.strt.data    ;honest
  4936.     mvi    a,0ffh
  4937.     sta    code.started.this.blk
  4938. ;
  4939.     call    process.a.statement
  4940.     call    put.RET
  4941. ;
  4942.     xra    a
  4943.     sta    code.started.this.blk
  4944.     mvi    a,0ffh
  4945.     sta    data.started.this.blk
  4946.     ret
  4947. ;
  4948. ;
  4949. ;------------------------------------------------------
  4950. ;
  4951. ;
  4952. process.PUSH:
  4953.     call    chk.strt.code
  4954.     call    get.word
  4955.     call    get.var.A.word
  4956.     call    put.get.A.into.HL
  4957.     call    put.PUSH.H
  4958.     lda    rsvd.wd.ix
  4959.     cpi    rwix.comma
  4960.     jz    process.PUSH
  4961.     ret
  4962. ;
  4963. ;------------------------------------------------------
  4964. ;
  4965. ;
  4966. process.READ:
  4967.     call    chk.strt.code
  4968.     call    get.word
  4969.     call    chk.word.id.only
  4970.     call    get.var.A.word
  4971. ;
  4972.     lda    ste.A.FILE.device
  4973.     call    switch
  4974.     db rwix.CON        ! dw p.READ.CON
  4975.     db rwix.RDR        ! dw p.READ.RDR
  4976.     db rwix.TTY        ! dw p.READ.CON
  4977.     db rwix.DISK        ! dw p.READ.DISK
  4978.     db    0        ! dw err.inv.dev.io
  4979. ;
  4980. p.READ.DISK:
  4981.     xra    a
  4982.     sta    read.fresh.flag
  4983.     sta    read.lock.flag
  4984.     lda    rsvd.wd.ix
  4985.     cpi    rwix.FRESH
  4986.     jnz    p.READ.not.FRESH
  4987.     call    get.word
  4988.     mvi    a,0ffh
  4989.     sta    read.fresh.flag
  4990. p.READ.not.FRESH:
  4991.     lda    rsvd.wd.ix
  4992.     cpi    rwix.LOCK
  4993.     jnz    p.READ.not.LOCK
  4994.     call    get.word
  4995.     mvi    a,0ffh
  4996.     sta    read.lock.flag
  4997. ;---ignore LOCK if not MPM---
  4998.     lda    MPM.flag
  4999.     ora    a
  5000.     jz    p.READ.not.LOCK
  5001.     mvi    a,0ffh
  5002.     mov    l,a
  5003.     call    put.MVI.A.L
  5004.     lxi    h,MPM.lock.flag
  5005.     call    put.STA.hl
  5006. ;---if record-mode file - force fresh read---
  5007. p.READ.not.LOCK:
  5008.     lda    read.lock.flag
  5009.     mov    b,a
  5010.     lda    read.fresh.flag
  5011.     ora    b
  5012.     jz    p.READ.skip.FRESH
  5013.     lda    ste.A.FILE.misc.flag
  5014.     ani    FILE.c.flag.rec.mode
  5015.     jz    p.READ.skip.FRESH
  5016.     lxi    h,0
  5017.     call    put.LXI.H.hl
  5018.     lhld    ste.A.address
  5019.     lxi    d,fcb.rec.buf.sctr
  5020.     dad    d
  5021.     call    put.SHLD.hl
  5022. p.READ.skip.FRESH:
  5023.     lda    ste.A.FILE.misc.flag
  5024.     ani    FILE.c.flag.TEXT
  5025.     jz    p.READ.not.text
  5026. ;
  5027.     call    put.LXI.D.A
  5028.     mvi    a,bir.dsk.ch.in
  5029.     call    put.bir.call.fwd
  5030. ;
  5031.     lhld    ste.A.address
  5032.     lxi    d,fcb.rec.addr
  5033.     dad    d
  5034.     call    put.LHLD.hl
  5035.     call    put.MOV.M.A
  5036. ;
  5037.     lda    rsvd.wd.ix
  5038.     cpi    rwix.EOF
  5039.     rnz
  5040. ;
  5041.     call    put.CPI
  5042.     mvi    a,1ah
  5043.     call    put.code.byte
  5044.     call    put.JNZ
  5045.     mvi    a,bir.READ.fwd
  5046.     call    put.fwd.ref.bir
  5047.     call    get.word
  5048. ;
  5049.     call    process.a.statement
  5050. ;
  5051.     mvi    a,bir.READ.fwd
  5052.     call    fix.up.built.in.rtn
  5053.     jmp    p.READ.chk.LOCK
  5054. ;
  5055. ;
  5056. p.READ.not.text:
  5057. ;
  5058.     lda    ste.A.type
  5059.     cpi    stet.FILE
  5060.     jnz    err.undef.file.name
  5061. ;
  5062.     call    put.LXI.D.A
  5063.     lda    ste.A.file.misc.flag
  5064.     ani    FILE.c.flag.rec.mode
  5065.     jz    p.READ.not.rec.mode
  5066. ;
  5067.     mvi    a,bir.rec.read
  5068.     jmp    p.READ.rec.cont
  5069. ;
  5070. p.READ.not.rec.mode:
  5071.     call    put.MVI.C
  5072. ;
  5073.     lda    ste.A.file.misc.flag
  5074.     ani    FILE.c.flag.RANDOM
  5075.     mvi    a,33
  5076.     jnz    p.READ.RANDOM
  5077.     mvi    a,20    ;seq read
  5078. p.READ.RANDOM:
  5079.     call    put.code.byte
  5080. ;
  5081.     mvi    a,bir.disk.sctr.io
  5082. p.READ.rec.cont:
  5083.     call    put.bir.call.fwd
  5084. ;
  5085.     lda    rsvd.wd.ix
  5086.     cpi    rwix.ERROR
  5087.     jz    p.READ.ERROR
  5088.     cpi    rwix.EOF
  5089.     jnz    p.READ.chk.lock
  5090. ;
  5091. p.READ.ERROR:
  5092.     call    get.word
  5093.     call    put.ORA.A
  5094.     lda    rsvd.wd.ix
  5095.     cpi    rwix.STANDARD
  5096.     jz    p.READ.err.STANDARD
  5097. ;
  5098.     call    put.JZ
  5099.     mvi    a,bir.READ.fwd
  5100.     call    put.fwd.ref.bir
  5101. ;
  5102.     call    process.a.statement
  5103. ;
  5104.     mvi    a,bir.READ.fwd
  5105.     call    fix.up.built.in.rtn
  5106.     jmp    p.READ.chk.lock
  5107. ;
  5108. p.READ.err.STANDARD:
  5109.     call    put.CNZ
  5110.     mvi    a,bir.read.error
  5111.     call    put.fwd.ref.bir
  5112.     call    get.word
  5113. ;
  5114. p.READ.chk.lock:
  5115.     lda    read.lock.flag
  5116.     ora    a
  5117.     rz                    ;exit
  5118.     call    put.XRA.A
  5119.     lxi    h,MPM.lock.flag
  5120.     jmp    put.STA.hl
  5121. ;
  5122. read.lock.flag:        db    0
  5123. read.fresh.flag:    db    0
  5124. ;
  5125. ;---------------NON-DISK DEVICES------------
  5126. ;
  5127. p.READ.CON:
  5128.     call    put.MVI.C
  5129.     mvi    a,1
  5130. p.READ.device:
  5131.     call    put.code.byte
  5132.     call    put.CALL.ENTRY
  5133.     lhld    ste.A.address
  5134.     lxi    d,fcb.rec.addr
  5135.     dad    d
  5136.     call    put.LHLD.hl
  5137.     call    put.MOV.M.A
  5138.     lhld    ste.A.address
  5139.     lxi    d,fcb.rec.addr
  5140.     dad    d
  5141.     call    put.LHLD.hl
  5142.     call    put.MOV.M.A
  5143. ;
  5144.     lda    rsvd.wd.ix
  5145.     cpi    rwix.EOF
  5146.     rnz
  5147. ;
  5148.     call    put.CPI
  5149.     mvi    a,1ah
  5150.     call    put.code.byte
  5151.     call    put.JNZ
  5152.     mvi    a,bir.READ.fwd
  5153.     call    put.fwd.ref.bir
  5154.     call    get.word
  5155. ;
  5156.     call    process.a.statement
  5157. ;
  5158.     mvi    a,bir.READ.fwd
  5159.     jmp    fix.up.built.in.rtn
  5160. ;
  5161. ;
  5162. ;
  5163. p.READ.RDR:
  5164.     call    put.MVI.C
  5165.     mvi    a,3
  5166.     jmp    p.READ.device
  5167. ;
  5168. ;
  5169. ;------------------------------------------------------
  5170. ;
  5171. ;
  5172. process.REBOOT:
  5173.     call    chk.strt.code
  5174.     call    put.JMP
  5175.     lxi    h,BOOT
  5176.     call    put.code.word
  5177.     jmp    get.word
  5178. ;
  5179. ;------------------------------------------------------
  5180. ;
  5181. ;
  5182. process.RECORD:
  5183.     call    set.byte.boundary
  5184.     call    chk.strt.data
  5185.     call    get.word
  5186.     call    chk.word.id.only
  5187.     call    chk.word.not.in.tbl
  5188. ;
  5189.     mvi    a,stet.RECORD
  5190.     sta    ste.type
  5191. ;
  5192.     lxi    h,0
  5193.     shld    ste.length
  5194. ;
  5195.     lxi    h,word
  5196.     lxi    d,last.label
  5197.     call    move.string
  5198.     call    put.word.into.tbl
  5199. ;
  5200.     lhld    start.sym.tbl.addr
  5201.     push    h    ;will come back to this later
  5202. ;
  5203.     lhld    curr.src.line.num
  5204.     push    h
  5205. ;
  5206.     call    get.word
  5207. p.RECORD.lup:
  5208.     lda    rsvd.wd.ix
  5209.     cpi    rwix.ENDREC
  5210.     jz    p.RECORD.ENDREC
  5211. ;
  5212.     call    chk.not.blk.ender
  5213.     jnz    p.RECORD.stmt
  5214.     call    err.missing.ENDREC
  5215.     jmp    p.RECORD.ENDREC.err
  5216. ;
  5217. p.RECORD.stmt:
  5218.     call    process.a.statement
  5219.     jmp    p.RECORD.lup
  5220. ;
  5221. p.RECORD.ENDREC:
  5222.     call    debug.routine
  5223.     pop    h
  5224.     shld    curr.block.match
  5225.     call    get.word
  5226.     jmp    p.RECORD.got.mtch
  5227. ;
  5228. p.RECORD.ENDREC.err:
  5229.     pop    h
  5230.     shld    curr.block.match
  5231. p.RECORD.got.mtch:
  5232.     pop    h
  5233.     push    h
  5234.     lxi    d,ste.address - symbol.table.entry
  5235.     dad    d
  5236.     mov    e,m
  5237.     inx    h
  5238.     mov    d,m
  5239.     lhld    curr.code.addr
  5240.     call    sub.de.fm.hl.2.hl
  5241.     xchg
  5242.     lxi    b,ste.length - symbol.table.entry
  5243.     pop    h
  5244.     dad    b
  5245.     mov    m,e
  5246.     inx    h
  5247.     mov    m,d
  5248.     ret
  5249. ;
  5250. ;
  5251. ;------------------------------------------------------
  5252. ;
  5253. ;
  5254. process.REDEFINE:
  5255.     call    get.word
  5256.     call    get.var.A.word
  5257.     lda    A.word.type
  5258.     ani    wtp.cnst
  5259.     jnz    p.REDEFINE.ok
  5260.     lda    ste.A.type
  5261.     cpi    stet.end.tbl
  5262.     cz    err.undef.var
  5263. p.REDEFINE.ok:
  5264.     lhld    curr.code.addr
  5265.     push    h
  5266. ;
  5267. ;---push ending address for limit test---
  5268. ;
  5269.     lhld    ste.A.address
  5270.     xchg
  5271.     lhld    ste.A.length
  5272.     dad    d
  5273.     push    h
  5274. ;
  5275.     lda    curr.BIT.posn
  5276.     push    psw
  5277.     lhld    code.started.this.blk
  5278.     push    h
  5279.     lhld    curr.src.line.num
  5280.     push    h
  5281.     lxi    h,redef.ctr
  5282.     inr    m
  5283. ;
  5284.     mvi    a,80h
  5285.     sta    curr.BIT.posn
  5286.     lda    ste.A.type
  5287.     cpi    stet.BIT
  5288.     jnz    p.REDEFINE.not.BIT
  5289.     lda    ste.A.BIT.posn
  5290.     sta    curr.BIT.posn
  5291. p.REDEFINE.not.BIT:
  5292.     lhld    ste.A.address
  5293.     shld    curr.code.addr
  5294.     call    p.REDEFINE.align
  5295. ;
  5296. p.REDEFINE.lup:
  5297.     lda    rsvd.wd.ix
  5298.     cpi    rwix.ENDREDEF
  5299.     jz    p.REDEFINE.ENDREDEF
  5300. ;
  5301.     call    chk.not.blk.ender
  5302.     jnz    p.REDEFINE.stmt
  5303. ;
  5304.     call    err.missing.ENDREDEF
  5305.     jmp    p.REDEFINE.err.ENDREDEF
  5306. ;
  5307. p.REDEFINE.stmt:
  5308.     call    process.a.statement
  5309.     jmp    p.REDEFINE.lup
  5310. ;
  5311. p.REDEFINE.ENDREDEF:
  5312.     call    debug.routine
  5313.     pop    h
  5314.     shld    curr.block.match
  5315.     call    get.word
  5316.     jmp    p.REDEFINE.finish
  5317. ;
  5318. p.REDEFINE.err.ENDREDEF:
  5319.     pop    h
  5320.     shld    curr.block.match
  5321. p.REDEFINE.finish:
  5322.     lxi    h,redef.ctr
  5323.     dcr    m
  5324.     pop    h
  5325.     shld    code.started.this.blk
  5326.     pop    psw
  5327.     sta    curr.BIT.posn
  5328. ;
  5329.     lhld    curr.code.addr
  5330.     xchg
  5331.     pop    h
  5332.     call    cmp.de.fm.hl
  5333.     cc    err.redef.sz
  5334.     pop    h
  5335.     shld    curr.code.addr
  5336. p.REDEFINE.align:
  5337.     xra    a
  5338.     sta    curr.BIT.build
  5339.     lhld    start.code.addr
  5340.     xchg
  5341.     lhld    curr.code.addr
  5342.     call    cmp.de.fm.hl
  5343.     rc
  5344. ;
  5345.     call    read.code
  5346.     lhld    curr.code.addr
  5347.     mov    a,l
  5348.     lhld    start.code.addr
  5349.     sub    l
  5350.     ani    7fh
  5351.     mov    l,a
  5352.     mvi    h,0
  5353.     lxi    d,code.buffer
  5354.     dad    d
  5355.     mov    a,m
  5356.     sta    curr.BIT.build
  5357.     ret
  5358. ;
  5359. ;
  5360. ;------------------------------------------------------
  5361. ;
  5362. ;
  5363. process.REMOVE:
  5364.     call    chk.strt.code
  5365.     call    get.word
  5366.     call    get.var.A.word
  5367.     lda    A.word.type
  5368.     ani    wtp.string
  5369.     cnz    put.inline.A.string
  5370.     call    switch.A
  5371.     db stet.STRING        ! dw p.REMOVE.str
  5372.     db stet.spcl.string.ptr    ! dw p.REMOVE.SP
  5373.     db stet.FILE        ! dw p.REMOVE.FILE
  5374.     db    0        ! dw p.REMOVE.err
  5375. p.REMOVE.err:
  5376.     call    err.inv.var.type
  5377. p.REMOVE.str:
  5378.     call    put.LXI.H.A
  5379.     jmp    p.REMOVE.fmt
  5380. p.REMOVE.SP:
  5381.     call    put.LHLD.A
  5382. p.REMOVE.fmt:
  5383.     call    put.LXI.D.dflt.fcb
  5384.     call    put.format.file.name
  5385.     call    put.LXI.D.dflt.fcb
  5386.     jmp    p.REMOVE.go
  5387. ;
  5388. p.REMOVE.FILE:
  5389.     call    p.OPEN.put.FILE1.2
  5390.     call    put.LXI.D.A
  5391. p.REMOVE.go:
  5392.     mvi    a,bir.remove.file
  5393.     call    put.bir.call.fwd
  5394.     lda    rsvd.wd.ix
  5395.     cpi    rwix.GIVING
  5396.     rnz        ;---exit---
  5397.     call    get.word
  5398.     call    get.var.A.word
  5399.     jmp    put.store.A.at.A
  5400. ;
  5401. ;
  5402. ;------------------------------------------------------
  5403. ;
  5404. ;
  5405. process.RENAME:
  5406.     call    chk.strt.code
  5407.     call    get.word
  5408.     call    get.var.A.word
  5409.     lda    A.word.type
  5410.     ani    wtp.string
  5411.     cnz    put.inline.A.string
  5412.     call    switch.A
  5413.     db stet.STRING        ! dw p.RENAME.A.str
  5414.     db stet.spcl.string.ptr    ! dw p.RENAME.A.SP
  5415.     db stet.FILE        ! dw p.RENAME.A.FILE
  5416.     db    0        ! dw p.RENAME.A.err
  5417. p.RENAME.A.err:
  5418.     call    err.inv.var.type
  5419. p.RENAME.A.str:
  5420.     call    put.LXI.H.A
  5421.     jmp    p.RENAME.A.fmt
  5422. p.RENAME.A.SP:
  5423.     call    put.LHLD.A
  5424. p.RENAME.A.fmt:
  5425.     call    put.LXI.D.dflt.fcb
  5426.     call    put.format.file.name
  5427.     jmp    p.RENAME.B
  5428. p.RENAME.A.FILE:
  5429.     call    put.LXI.H.A
  5430.     call    put.LXI.D.dflt.fcb
  5431.     lxi    h,16
  5432.     call    put.LXI.B.hl
  5433.     call    put.mov.blk
  5434. p.RENAME.B:
  5435.     lda    rsvd.wd.ix
  5436.     cpi    rwix.TO
  5437.     cz    get.word
  5438.     call    get.var.A.word
  5439.     lda    A.word.type
  5440.     ani    wtp.string
  5441.     cnz    put.inline.A.string
  5442.     call    switch.A
  5443.     db stet.STRING        ! dw p.RENAME.B.str
  5444.     db stet.spcl.string.ptr    ! dw p.RENAME.B.SP
  5445.     db stet.FILE        ! dw p.RENAME.B.FILE
  5446.     db    0        ! dw p.RENAME.B.err
  5447. p.RENAME.B.err:
  5448.     call    err.inv.var.type
  5449. p.RENAME.B.str:
  5450.     call    put.LXI.H.A
  5451.     jmp    p.RENAME.B.fmt
  5452. p.RENAME.B.SP:
  5453.     call    put.LHLD.A
  5454. p.RENAME.B.fmt:
  5455.     lxi    h,dflt.2nd.fcb
  5456.     call    put.LXI.D.hl
  5457.     call    put.format.file.name
  5458.     jmp    p.RENAME.go
  5459. ;
  5460. p.RENAME.B.FILE:
  5461.     call    put.LXI.H.A
  5462.     lxi    h,dflt.2nd.fcb
  5463.     call    put.LXI.D.hl
  5464.     lxi    h,16
  5465.     call    put.LXI.B.hl
  5466.     call    put.mov.blk
  5467. p.RENAME.go:
  5468.     mvi    a,bir.rename.file
  5469.     call    put.bir.call.fwd
  5470.     lda    rsvd.wd.ix
  5471.     cpi    rwix.GIVING
  5472.     rnz        ;---exit---
  5473.     call    get.word
  5474.     call    get.var.A.word
  5475.     jmp    put.store.A.at.A
  5476. ;
  5477. ;
  5478. ;------------------------------------------------------
  5479. ;
  5480. ;
  5481. process.SCAN:
  5482.     call    chk.strt.code
  5483.     xra    a
  5484.     sta    SCAN.type.flag
  5485.     sta    SCAN.pos.flag
  5486.     sta    SCAN.addr.flag
  5487.     call    get.word
  5488. ;
  5489.     call    get.var.A.word
  5490.     lda    A.word.type
  5491.     ani    wtp.string
  5492.     cnz    put.inline.A.string
  5493. ;
  5494.     call    switch.A
  5495.     db stet.STRING        ! dw p.SCAN.A
  5496.     db stet.spcl.string.ptr    ! dw p.SCAN.A
  5497.     db stet.RECORD        ! dw p.SCAN.A
  5498.     db    0        ! dw p.SCAN.A.err
  5499. p.SCAN.A.err:
  5500.     call    err.inv.var.type
  5501. p.SCAN.A:
  5502.     lda    rsvd.wd.ix
  5503.     cpi    rwix.FOR
  5504.     jnz    err.mssng.rsvd.wd
  5505. ;
  5506.     call    get.word
  5507.     call    switch.rsvd.wd.ix
  5508.     db rwix.ANY        ! dw p.SCAN.for.ANY
  5509.     db rwix.NO        ! dw p.SCAN.for.NO
  5510.     db rwix.TRAILING    ! dw p.SCAN.for.TRAILING
  5511.     db    0        ! dw p.SCAN.cont
  5512. ;
  5513. p.SCAN.for.ANY:
  5514.     call    get.word
  5515.     mvi    a,'A'
  5516.     sta    SCAN.type.flag
  5517.     jmp    p.SCAN.cont
  5518. ;
  5519. p.SCAN.for.NO:
  5520.     call    get.word
  5521.     mvi    a,'N'
  5522.     sta    SCAN.type.flag
  5523.     jmp    p.SCAN.cont
  5524. ;
  5525. p.SCAN.for.TRAILING:
  5526.     call    get.word
  5527.     mvi    a,'T'
  5528.     sta    scan.type.flag
  5529. ;
  5530. p.SCAN.cont:
  5531.     call    get.var.B.word
  5532.     lda    B.word.type
  5533.     ani    wtp.string
  5534.     cnz    put.inline.B.string
  5535. ;
  5536.     call    switch.B
  5537.     db stet.STRING        ! dw p.SCAN.do.it
  5538.     db stet.spcl.string.ptr    ! dw p.SCAN.do.it
  5539.     db stet.RECORD        ! dw p.SCAN.do.it
  5540.     db    0        ! dw p.SCAN.B.err
  5541. p.SCAN.B.err:
  5542.     call    err.inv.var.type
  5543. p.SCAN.do.it:
  5544.     lda    ste.B.type
  5545.     cpi    stet.spcl.string.ptr
  5546.     jz    p.SCAN.B.SP
  5547. ;
  5548.     call    put.LXI.D.B
  5549.     jmp    p.SCAN.middle
  5550. ;
  5551. p.SCAN.B.SP:
  5552.     call    put.LHLD.B
  5553.     call    put.XCHG
  5554. p.SCAN.middle:
  5555.     lda    ste.A.type
  5556.     cpi    stet.spcl.string.ptr
  5557.     jz    p.SCAN.A.SP
  5558. ;
  5559.     call    put.LXI.H.A
  5560.     jmp    p.SCAN.A.done
  5561. ;
  5562. p.SCAN.A.SP:
  5563.     call    put.LHLD.A
  5564. ;
  5565. p.SCAN.A.done:
  5566.     lda    rsvd.wd.ix
  5567.     cpi    rwix.GIVING
  5568.     jnz    p.SCAN.no.GIVING
  5569.     call    get.word
  5570.     lda    rsvd.wd.ix
  5571.     cpi    rwix.ADDRESS
  5572.     jz    p.SCAN.ADDRESS
  5573. ;
  5574.     call    chk.word.id.only
  5575.     call    get.var.C.word
  5576. ;
  5577.     mvi    a,0ffh
  5578.     sta    SCAN.pos.flag
  5579.     lda    rsvd.wd.ix
  5580.     cpi    rwix.ADDRESS
  5581.     jnz    p.SCAN.not.addr
  5582. p.SCAN.ADDRESS:
  5583.     call    get.word
  5584.     call    chk.word.id.only
  5585.     call    get.var.B.word
  5586.     mvi    a,0ffh
  5587.     sta    SCAN.addr.flag
  5588. p.SCAN.not.addr:
  5589. ;
  5590. p.SCAN.no.GIVING:
  5591.     lda    SCAN.type.flag
  5592.     call    switch
  5593.     db 'A'            ! dw p.SCAN.ANY
  5594.     db 'N'            ! dw p.SCAN.NO
  5595.     db 'T'            ! dw p.SCAN.TRAILING
  5596.     db    0        ! dw p.SCAN.default
  5597. p.SCAN.default:
  5598.     mvi    a,bir.SCAN
  5599.     jmp    p.SCAN.result
  5600. ;
  5601. p.SCAN.ANY:
  5602.     mvi    a,bir.SCAN.ANY
  5603.     jmp    p.SCAN.result
  5604. ;
  5605. p.SCAN.TRAILING:
  5606.     mvi    a,bir.SCAN.TRAILING
  5607.     jmp    p.SCAN.result
  5608. ;
  5609. p.SCAN.NO:
  5610.     mvi    a,bir.SCAN.NO
  5611. ;
  5612. p.SCAN.result:
  5613.     call    put.bir.call.fwd
  5614.     lda    SCAN.pos.flag
  5615.     ora    a
  5616.     cnz    put.store.HL.at.C
  5617.     lda    SCAN.addr.flag
  5618.     ora    a
  5619.     jz    p.SCAN.chk.ERROR
  5620.     call    put.XCHG
  5621.     call    put.store.HL.at.B
  5622. ;
  5623. p.SCAN.chk.ERROR:
  5624.     lda    rsvd.wd.ix
  5625.     cpi    rwix.TRUE
  5626.     jz    p.SCAN.TRUE
  5627.     cpi    rwix.FALSE
  5628.     jz    p.SCAN.FALSE.no.TRUE
  5629.     cpi    rwix.ERROR
  5630.     rnz                ;exit**
  5631. p.SCAN.FALSE.no.TRUE:
  5632.     call    bump.block.level
  5633.     call    put.JNZ
  5634.     mvi    a,bir.SCAN.TRUE.fwd
  5635.     call    put.fwd.ref.bir
  5636.     jmp    p.SCAN.do.FALSE
  5637. ;
  5638. p.SCAN.TRUE:
  5639.     call    get.word
  5640.     call    bump.block.level
  5641.     call    put.JZ
  5642.     mvi    a,bir.SCAN.FALSE.fwd
  5643.     call    put.fwd.ref.bir
  5644. ;
  5645.     call    process.a.statement
  5646. ;
  5647.     lda    rsvd.wd.ix
  5648.     cpi    rwix.FALSE
  5649.     jz    p.SCAN.got.FALSE
  5650.     cpi    rwix.ERROR
  5651.     jnz    p.SCAN.decr.blk.lvl
  5652. ;
  5653. p.SCAN.got.FALSE:
  5654.     mvi    a,bir.SCAN.TRUE.fwd
  5655.     call    put.bir.jmp.fwd
  5656.     mvi    a,bir.SCAN.FALSE.fwd
  5657.     call    fix.up.built.in.rtn
  5658. p.SCAN.do.FALSE:
  5659.     call    get.word
  5660. ;
  5661.     call    process.a.statement
  5662. ;
  5663. p.SCAN.decr.blk.lvl:
  5664.     mvi    a,bir.SCAN.TRUE.fwd
  5665.     call    fix.up.built.in.rtn
  5666.     mvi    a,bir.SCAN.FALSE.fwd
  5667.     call    fix.up.built.in.rtn
  5668.     jmp    decr.block.level
  5669. ;
  5670. ;
  5671. ;
  5672. ;
  5673. ;
  5674. ;--------------------------------------------------------
  5675. ;
  5676. ;
  5677. ;
  5678. process.SEGMENTED:
  5679.     call    get.word
  5680.     lda    rsvd.wd.ix
  5681.     cpi    rwix.PROCEDURE
  5682.     jnz    err.mssng.rsvd.wd
  5683. ;
  5684.     lda    overlay.in.process
  5685.     ora    a
  5686.     jnz    err.nested.overlay
  5687. ;
  5688. ;---put null value for key of overlay present---
  5689. ;
  5690.     lxi    h,0ffffh
  5691.     call    put.code.word
  5692. ;
  5693.     call    write.code.write    ;flush any partial buff
  5694. ;
  5695. ;---save COM fcb & map---
  5696. ;
  5697.     lxi    h,code.fcb
  5698.     lxi    d,code.fcb.save
  5699.     lxi    b,36
  5700.     call    move.h.2.d.cnt.b
  5701.     lxi    h,code.file.map
  5702.     lxi    d,code.map.save
  5703.     lxi    b,512
  5704.     call    move.h.2.d.cnt.b
  5705. ;
  5706. ;---replace COM fcb with OVL---
  5707. ;
  5708.     lxi    h,ovl.fcb
  5709.     lxi    d,code.fcb
  5710.     lxi    b,36
  5711.     call    move.h.2.d.cnt.b
  5712. ;
  5713.     lhld    curr.code.addr
  5714.     shld    start.code.addr
  5715. ;
  5716. ;---open OVL fcb if needed---
  5717. ;
  5718. p.SEG.again:
  5719. ;
  5720. ;---set flag to save pointer to overlay-name sym-tbl-entry----
  5721. ;
  5722.     lxi    h,0
  5723.     shld    curr.ovl.ste.ptr
  5724. ;
  5725. ;---open overlay file if first overlay---
  5726. ;
  5727.     lda    any.overlay
  5728.     ora    a
  5729.     jnz    p.SEG.ovl.open
  5730. ;
  5731.     lxi    d,code.fcb
  5732.     mvi    c,19
  5733.     call    entry
  5734. ;
  5735.     lxi    d,code.fcb
  5736.     mvi    c,22
  5737.     call    entry
  5738.     inr    a
  5739.     jnz    p.SEG.ovl.open
  5740.     call    err.code.write
  5741.     jmp    boot
  5742. ;
  5743. p.SEG.ovl.open:
  5744.     lhld    curr.ovl.start.key
  5745.     shld    ovl.sctr.offset
  5746. ;
  5747.     mvi    a,0ffh
  5748.     sta    overlay.in.process
  5749.     sta    any.overlay
  5750. ;
  5751.     lxi    h,code.file.map
  5752.     lxi    d,code.file.map + 1
  5753.     mvi    m,0
  5754.     lxi    b,511
  5755.     call    move.h.2.d.cnt.b
  5756. ;
  5757.     lxi    h,0
  5758.     shld    code.fcb + fcb.rnd.rec
  5759. ;
  5760. ;
  5761. ;---compile the overlay---
  5762. ;
  5763.     call    process.a.statement
  5764. ;
  5765. ;
  5766.     call    write.code.write    ;flush any partial OVL sctr
  5767. ;
  5768. ;---put overlay length into symbol table---
  5769. ;
  5770.     lhld    start.code.addr
  5771.     xchg
  5772.     lhld    curr.code.addr
  5773.     call    sub.de.fm.hl.2.hl
  5774.     xchg
  5775.     lhld    curr.ovl.ste.ptr
  5776.     mov    a,h
  5777.     ora    l
  5778.     jz    err.undef.label    ;error if no procedure-name
  5779.     lxi    b,(ste.length - ste.type)
  5780.     dad    b
  5781.     mov    m,e
  5782.     inx    h
  5783.     mov    m,d
  5784. ;
  5785.     lhld    code.fcb + fcb.rnd.rec
  5786.     inx    h    ;HL = # sctrs in old ovly
  5787.     xchg
  5788.     lhld    curr.ovl.start.key
  5789.     dad    d        ;HL = new ovl hdr sctr #
  5790.     shld    curr.ovl.start.key    ;save for next overlay
  5791. ;
  5792. ;----Message on Console and Print File showing stats---
  5793. ;
  5794.     lda    nowarn.flag
  5795.     ora    a
  5796.     jnz    SEG.msg.skip
  5797. ;
  5798.     lda    print.console
  5799.     push    psw
  5800.     mvi    a,0ffh
  5801.     sta    print.console
  5802. ;
  5803.     lhld    ovl.sctr.offset
  5804.     lxi    d,p.SEG.msg.key + 8
  5805.     call    cvt.bin.2.hex.str
  5806.     lxi    d,p.SEG.msg.key        ! call    listing.string.out
  5807. ;
  5808.     lhld    start.code.addr
  5809.     lxi    d,p.SEG.msg.strt + 13
  5810.     call    cvt.bin.2.hex.str
  5811.     lxi    d,p.SEG.msg.strt    ! call    listing.string.out
  5812. ;
  5813.     lhld    curr.code.addr
  5814.     lxi    d,p.SEG.msg.end + 11
  5815.     call    cvt.bin.2.hex.str
  5816.     lxi    d,p.SEG.msg.end        ! call    listing.string.out
  5817. ;
  5818.     lxi    d,p.SEG.msg.name    ! call    listing.string.out
  5819.     lhld    curr.ovl.ste.ptr
  5820.     lxi    d,(ste.name - ste.type)
  5821.     dad    d    ! xchg        ! call    listing.string.out
  5822.     call    listing.crlf
  5823. ;
  5824.     pop    psw
  5825.     sta    print.console
  5826. SEG.msg.skip:
  5827. ;
  5828. ;---check if this overlay is larger than any previous at this level---
  5829. ;
  5830.     lhld    highest.ovl.addr
  5831.     xchg
  5832.     lhld    curr.code.addr
  5833.     call    cmp.hl.fm.de
  5834.     jnc    p.SEG.no.new.hi
  5835.     shld    highest.ovl.addr
  5836. p.SEG.no.new.hi:
  5837. ;
  5838. ;---check for another overlay following---
  5839. ;
  5840. p.SEG.test.SEG:
  5841.     call    p.SWITCH.flush.COMMENT
  5842.     lda    rsvd.wd.ix
  5843.     cpi    rwix.semicolon
  5844.     jnz    p.SEG.not.semicolon
  5845. ;
  5846.     call    get.word
  5847.     jmp    p.SEG.test.SEG
  5848. ;
  5849. p.SEG.not.semicolon:
  5850.     cpi    rwix.COPY
  5851.     jnz    p.SEG.not.COPY
  5852. ;
  5853.     call    process.COPY
  5854.     jmp    p.SEG.test.SEG
  5855. ;
  5856. p.SEG.not.COPY:
  5857.     cpi    rwix.SEGMENTED
  5858.     jnz    p.SEG.not.SEGMENTED
  5859. ;
  5860. ;---another overlay follows -- it goes at same address ---
  5861. ;
  5862.     call    get.word    ;skip SEGMENTED
  5863.     lda    rsvd.wd.ix
  5864.     cpi    rwix.PROCEDURE
  5865.     jnz    err.mssng.rsvd.wd
  5866.     lhld    start.code.addr
  5867.     shld    curr.code.addr
  5868.     jmp    p.SEG.again
  5869. ;
  5870. ;
  5871. ;---this overlay is not followed by another overlay
  5872. ;---reset back to COM file
  5873. ;
  5874. p.SEG.not.SEGMENTED:
  5875. ;
  5876. ;---save current OVL fcb---
  5877. ;
  5878.     lxi    h,code.fcb
  5879.     lxi    d,ovl.fcb
  5880.     lxi    b,36
  5881.     call    move.h.2.d.cnt.b
  5882. ;
  5883. ;---restore COM fcb & map
  5884. ;
  5885.     lxi    h,code.fcb.save
  5886.     lxi    d,code.fcb
  5887.     lxi    b,36
  5888.     call    move.h.2.d.cnt.b
  5889.     lxi    h,code.map.save
  5890.     lxi    d,code.file.map
  5891.     lxi    b,512
  5892.     call    move.h.2.d.cnt.b
  5893. ;
  5894. ;---finish up--
  5895. ;
  5896.     lhld    highest.ovl.addr
  5897.     shld    curr.code.addr
  5898.     call    set.code.key
  5899.     shld    code.fcb + fcb.rnd.rec
  5900.     lxi    h,0
  5901.     shld    ovl.sctr.offset
  5902.     shld    highest.ovl.addr
  5903.     lxi    h,0100h
  5904.     shld    start.code.addr
  5905.     xra    a
  5906.     sta    overlay.in.process
  5907.     call    clear.code.buff
  5908.     jmp    read.code.buff.only    ;possibly refresh buffer
  5909. ;
  5910. ;
  5911. p.SEG.msg.key:    db    'OVL key 0000',0
  5912. p.SEG.msg.strt:    db    '  Start addr 0000',0
  5913. p.SEG.msg.end:    db    '  End addr 0000',0
  5914. p.SEG.msg.name:    db    '  Name: ',0
  5915. ;
  5916. ;
  5917. ;
  5918. ;------------------------------------------------------
  5919. ;
  5920. ;
  5921. process.SET:
  5922.     call    get.word
  5923.     call    chk.word.id.only
  5924.     lxi    h,word
  5925.     lxi    d,ste.A.name
  5926.     call    move.string
  5927. ;
  5928.     call    get.word
  5929.     lda    rsvd.wd.ix
  5930.     cpi    rwix.eql
  5931.     cz    get.word
  5932.     lda    rsvd.wd.ix
  5933.     cpi    rwix.TO
  5934.     cz    get.word
  5935. ;
  5936.     lda    word.type
  5937.     ani    wtp.cnst
  5938.     jnz    p.SET.cnst
  5939. ;--not a CNST, must be rsvd wd--
  5940.     lda    rsvd.wd.ix
  5941.     ora    a
  5942.     jz    err.mssng.rsvd.wd
  5943. ;
  5944.     lxi    h,ste.address
  5945.     mov    m,a
  5946.     lda    word.type
  5947.     inx    h
  5948.     mov    m,a
  5949.     mvi    a,stet.SET.word
  5950.     jmp    p.SET.go
  5951. ;
  5952. p.SET.cnst:
  5953.     lhld    cnst.value
  5954.     shld    ste.address
  5955. ;
  5956.     lhld    curr.print.addr
  5957.     mov    a,h
  5958.     ora    l
  5959.     jnz    p.SET.no.new.addr
  5960.     lhld    ste.address
  5961.     shld    curr.print.addr
  5962. p.SET.no.new.addr:
  5963. ;
  5964.     mvi    a,stet.SET.cnst
  5965. p.SET.go:
  5966.     sta    ste.type
  5967.     lhld    word.length
  5968.     mvi    h,0
  5969.     shld    ste.length
  5970.     lxi    h,ste.A.name
  5971.     lxi    d,ste.name
  5972.     call    move.string
  5973.     call    put.ste.into.tbl.no.addr
  5974.     call    get.word
  5975.     lda    rsvd.wd.ix
  5976.     cpi    rwix.comma
  5977.     jz    process.SET
  5978.     ret
  5979. ;
  5980. ;
  5981. ;
  5982. ;
  5983. ;------------------------------------------------------
  5984. ;
  5985. ;
  5986. process.SIZE:
  5987.     call    chk.strt.code
  5988.     xra    a
  5989.     sta    size.cnt.flag
  5990.     call    get.word
  5991.     call    chk.word.id.only
  5992.     call    get.var.A.word
  5993.     call    switch.A
  5994.     db stet.STRING        ! dw p.SIZE.type.ok
  5995.     db stet.spcl.string.ptr    ! dw p.SIZE.type.ok
  5996.     db stet.FIELD        ! dw p.SIZE.type.ok
  5997.     db stet.RECORD        ! dw p.SIZE.type.ok
  5998.     db    0        ! dw p.SIZE.A.type.err
  5999. p.SIZE.A.type.err:
  6000.     call    err.inv.var.type
  6001. p.SIZE.type.ok:
  6002.     lda    rsvd.wd.ix
  6003.     cpi    rwix.GIVING
  6004.     cz    get.word
  6005.     lda    rsvd.wd.ix
  6006.     cpi    rwix.ADDRESS
  6007.     jz    p.SIZE.go
  6008.     call    get.var.B.word
  6009.     mvi    a,0ffh
  6010.     sta    size.cnt.flag
  6011. ;
  6012. p.SIZE.go:
  6013.     call    switch.A
  6014.     db stet.spcl.string.ptr    ! dw p.SIZE.SP
  6015.     db stet.FIELD        ! dw p.SIZE.RECORD
  6016.     db stet.RECORD        ! dw p.SIZE.RECORD
  6017.     db    0        ! dw p.SIZE.STRING
  6018. ;
  6019. p.SIZE.STRING:
  6020.     call    put.LXI.D.A
  6021. p.SIZE.call:
  6022.     mvi    a,bir.SIZE
  6023.     call    put.bir.call.fwd
  6024.     lda    size.cnt.flag
  6025.     ora    a
  6026.     cnz    put.store.HL.at.B
  6027.     lda    rsvd.wd.ix
  6028.     cpi    rwix.ADDRESS
  6029.     rnz
  6030.     call    get.word
  6031.     call    get.var.B.word
  6032.     call    put.XCHG
  6033.     jmp    put.store.HL.at.B
  6034. ;
  6035. ;
  6036. p.SIZE.SP:
  6037.     call    put.LHLD.A
  6038.     call    put.XCHG
  6039.     jmp    p.SIZE.call
  6040. ;
  6041. p.SIZE.RECORD:
  6042.     call    put.LXI.H.A.length
  6043.     jmp    put.store.HL.at.B
  6044. ;
  6045. ;
  6046. ;------------------------------------------------------
  6047. ;
  6048. ;
  6049. process.STRING:
  6050.     call    set.byte.boundary
  6051.     call    chk.strt.data
  6052.     call    get.word
  6053. ;
  6054.     lda    rsvd.wd.ix
  6055.     cpi    rwix.POINTER
  6056.     jz    p.POINTER.STRING    ;non-standard flow
  6057.     lda    word.type
  6058.     ani    wtp.cnst
  6059.     jnz    p.STRING.no.name
  6060.     call    chk.word.id.only
  6061.     call    chk.word.not.in.tbl
  6062. ;---save string name until size gotten---
  6063.     lxi    h,word
  6064.     lxi    d,ste.A.name
  6065.     call    move.string
  6066.     call    get.word
  6067. ;
  6068. p.STRING.get.size:
  6069.     lda    rsvd.wd.ix
  6070.     cpi    rwix.LENGTH
  6071.     cz    get.word
  6072.     lda    word.type
  6073.     ani    wtp.cnst
  6074.     cz    err.inv.STRING.size
  6075.     lhld    cnst.value
  6076.     mov    a,h
  6077.     ora    l
  6078.     cz    err.inv.string.size
  6079.     shld    ste.length
  6080.     lxi    h,ste.A.name
  6081.     lxi    d,word
  6082.     call    move.string
  6083.     mvi    a,stet.STRING
  6084.     sta    ste.type
  6085.     lda    ste.A.name
  6086.     ora    a        ;null name?
  6087.     cnz    put.word.into.tbl
  6088. ;
  6089.     call    get.word
  6090.     lda    rsvd.wd.ix
  6091.     cpi    rwix.VALUE
  6092.     jz    p.STRING.VALUE
  6093. ;---no value - fill with nulls---
  6094. p.STRING.no.VALUE:
  6095.     lhld    ste.length
  6096.     xchg
  6097.     lhld    curr.code.addr
  6098.     dad    d
  6099.     shld    curr.code.addr
  6100.     jmp    p.STRING.comma
  6101. ;
  6102. p.STRING.no.name:
  6103.     xra    a
  6104.     sta    ste.A.name
  6105.     jmp    p.STRING.get.size
  6106. ;
  6107. p.STRING.VALUE:
  6108. ;---clear word for clean value---
  6109.     lxi    h,word
  6110.     lxi    d,word + 1
  6111.     lxi    b,max.word.length - 1
  6112.     mvi    m,0
  6113.     call    move.h.2.d.cnt.b
  6114. ;
  6115.     call    get.word
  6116.     lda    word.type
  6117.     ani    wtp.string
  6118.     jnz    p.STRING.got.VALUE
  6119. ;
  6120.     call    err.inv.VALUE
  6121.     jmp    p.STRING.no.VALUE
  6122. ;
  6123. p.STRING.got.VALUE:
  6124.     lhld    ste.length
  6125.     lda    word.length
  6126.     inr    a    ;plus null byte
  6127.     mov    e,a
  6128.     mvi    d,0
  6129.     mov    a,h
  6130.     cmp    d
  6131.     jc    p.STRING.trunc
  6132.     jnz    p.STRING.no.trunc
  6133.     mov    a,l
  6134.     cmp    e
  6135.     jnc    p.STRING.no.trunc
  6136.     jnz    p.STRING.trunc
  6137.     push    h
  6138.     dcx    d
  6139.     call    cmp.de.fm.hl
  6140.     cz    err.no.term.byte
  6141.     pop    h
  6142.     jmp    p.STRING.no.trunc
  6143. p.STRING.trunc:
  6144.     push    h
  6145.     call    err.pad.string
  6146.     call    err.no.term.byte
  6147.     pop    h
  6148. p.STRING.no.trunc:
  6149.     lxi    d,word
  6150. p.STRING.value.lup:
  6151.     push    h
  6152.     push    d
  6153.     ldax    d
  6154.     call    put.code.byte
  6155.     pop    d
  6156.     pop    h
  6157.     inx    d
  6158.     dcx    h
  6159.     mov    a,h
  6160.     ora    l
  6161.     jnz    p.STRING.VALUE.lup
  6162.     call    get.word
  6163. p.STRING.comma:
  6164.     lda    rsvd.wd.ix
  6165.     cpi    rwix.comma
  6166.     jz    process.STRING
  6167.     ret
  6168. ;
  6169. ;------------------------------------------------------
  6170. ;
  6171. ;
  6172. process.SUBTRACT:
  6173.     call    chk.strt.code
  6174.     call    get.word
  6175.     call    get.var.A.word
  6176. ;
  6177.     lda    rsvd.wd.ix
  6178.     cpi    rwix.FROM
  6179.     cz    get.word
  6180. ;
  6181.     call    get.var.B.word
  6182. ;
  6183.     lda    rsvd.wd.ix
  6184.     cpi    rwix.GIVING
  6185.     jz    p.SUBTRACT.3
  6186. ;
  6187.     lxi    h,sym.tbl.entry.B
  6188.     lxi    d,sym.tbl.entry.C
  6189.     call    move.sym.tbl.entry
  6190.     jmp    p.SUBTRACT.go
  6191. ;
  6192. p.SUBTRACT.3:
  6193.     call    get.word
  6194.     call    chk.word.id.only
  6195.     call    get.var.C.word
  6196. ;
  6197. p.SUBTRACT.GO:
  6198.     call    switch.C
  6199.     db stet.BYTE        ! dw p.SUBTRACT.x.x.8
  6200.     db stet.WORD        ! dw p.SUBTRACT.x.x.16
  6201.     db stet.spcl.byte.ptr    ! dw p.SUBTRACT.x.x.8
  6202.     db stet.spcl.word.ptr    ! dw p.SUBTRACT.x.x.16
  6203.     db stet.BCD        ! dw p.SUBTRACT.BCD
  6204.     db stet.spcl.BCD.ptr    ! dw p.SUBTRACT.BCDP
  6205.     db    0        ! dw p.SUBTRACT.x.x.err
  6206. ;
  6207. p.SUBTRACT.x.x.err:
  6208.     call    err.inv.var.type
  6209. p.SUBTRACT.x.x.8:
  6210.     lxi    h,sym.tbl.entry.B
  6211.     lxi    d,sym.tbl.entry.C
  6212.     call    compare.sym.tbl.entries
  6213.     jz    p.subtract.2.x.8
  6214. ;
  6215.     lda    B.word.type
  6216.     ani    wtp.cnst
  6217.     jnz    p.SUBTRACT.x.c.8
  6218.     call    switch.B
  6219.     db stet.BYTE        ! dw p.SUBTRACT.x.8.8
  6220.     db stet.WORD        ! dw p.SUBTRACT.x.16.8
  6221.     db stet.spcl.byte.ptr    ! dw p.SUBTRACT.8.general
  6222.     db stet.spcl.word.ptr    ! dw p.SUBTRACT.8.general
  6223.     db    0        ! dw err.inv.var.type
  6224. ;
  6225. ;
  6226. p.SUBTRACT.2.x.8:
  6227.     lda    A.word.type
  6228.     ani    wtp.cnst
  6229.     jnz    put.sub.2.AN.B8
  6230. ;
  6231.     lda    ste.A.type
  6232.     cpi    stet.BYTE
  6233.     jz    put.sub.2.AB.BB
  6234.     jmp    p.SUBTRACT.8.general
  6235. ;
  6236. p.SUBTRACT.x.16.8:
  6237.     call    err.truncate
  6238. p.SUBTRACT.x.8.8:
  6239.     lda    A.word.type
  6240.     ani    wtp.cnst
  6241.     jnz    put.sub.AN.BB.CB
  6242.     jmp    p.SUBTRACT.8.general
  6243. ;
  6244. p.SUBTRACT.x.c.8:
  6245.     lda    A.word.type
  6246.     ani    wtp.cnst
  6247.     jnz    put.sub.AN.BN.C8
  6248.     jmp    p.SUBTRACT.8.general
  6249. ;
  6250. p.SUBTRACT.x.x.16:
  6251.     lda    B.word.type
  6252.     ani    wtp.cnst
  6253.     jz    p.SUBTRACT.general
  6254.     lda    A.word.type
  6255.     ani    wtp.cnst
  6256.     jz    p.SUBTRACT.general
  6257.     jmp    put.sub.AN.BN.C16
  6258. ;
  6259. ;
  6260. ;
  6261. ;
  6262. p.SUBTRACT.8.general:
  6263.     lda    B.word.type
  6264.     ani    wtp.cnst
  6265.     jnz    p.SUBTRACT.g.8.x.c.x
  6266. ;
  6267.     call    switch.B
  6268.     db stet.BYTE        ! dw p.SUBTRACT.g.8.x.8.x
  6269.     db stet.WORD        ! dw p.SUBTRACT.g.8.x.16.x
  6270.     db stet.spcl.byte.ptr    ! dw p.SUBTRACT.g.8.x.BP.x
  6271.     db stet.spcl.WORD.ptr    ! dw p.SUBTRACT.g.8.x.WP.x
  6272.     db    0        ! dw p.SUBTRACT.g.8.err
  6273. ;
  6274. p.SUBTRACT.g.8.err:
  6275.     call    err.inv.var.type
  6276. p.SUBTRACT.g.8.x.16.x:
  6277.     call    err.truncate
  6278. p.SUBTRACT.g.8.x.8.x:
  6279.     call    put.LDA.B
  6280.     jmp    p.SUBTRACT.g.8.A
  6281. ;
  6282. p.SUBTRACT.g.8.x.WP.x:
  6283.     call    err.truncate
  6284. p.SUBTRACT.g.8.x.BP.x:
  6285.     call    put.LHLD.B
  6286.     call    put.MOV.A.M
  6287.     jmp    p.SUBTRACT.g.8.A
  6288. ;
  6289. p.SUBTRACT.g.8.x.c.x:
  6290.     lhld    ste.B.address
  6291.     call    put.MVI.A.L
  6292. p.SUBTRACT.g.8.A:
  6293.     lda    A.word.type
  6294.     ani    wtp.cnst
  6295.     jnz    p.SUBTRACT.g.8.c.x.x
  6296. ;
  6297.     call    switch.A
  6298.     db stet.BYTE        ! dw p.SUBTRACT.g.8.8.x.x
  6299.     db stet.WORD        ! dw p.SUBTRACT.g.8.16.x.x
  6300.     db stet.spcl.BYTE.ptr    ! dw p.SUBTRACT.g.8.BP.x.x
  6301.     db stet.spcl.WORD.ptr    ! dw p.SUBTRACT.g.8.WP.x.x
  6302.     db    0        ! dw p.SUBTRACT.g.8.x.err
  6303. ;
  6304. p.SUBTRACT.g.8.x.err:
  6305.     call    err.inv.var.type
  6306. p.SUBTRACT.g.8.16.x.x:
  6307.     call    err.truncate
  6308. p.SUBTRACT.g.8.8.x.x:
  6309.     call    put.LXI.H.A
  6310.     call    put.SUB.M
  6311.     jmp    p.SUBTRACT.g.8.C
  6312. ;
  6313. p.SUBTRACT.g.8.c.x.x:
  6314.     lhld    ste.A.address
  6315.     call    put.SUI.L
  6316.     jmp    p.SUBTRACT.g.8.C
  6317. ;
  6318. p.SUBTRACT.g.8.WP.x.x:
  6319.     call    err.truncate
  6320. p.SUBTRACT.g.8.BP.x.x:
  6321.     call    put.LHLD.A
  6322.     call    put.SUB.M
  6323. p.SUBTRACT.g.8.C:
  6324.     call    switch.C
  6325.     db stet.BYTE        ! dw p.SUBTRACT.g.8.x.x.8
  6326.     db stet.spcl.BYTE.ptr    ! dw p.SUBTRACT.g.8.x.x.BP
  6327.     db    0        ! dw p.SUBTRACT.g.8.x.x.err
  6328. p.SUBTRACT.g.8.x.x.err:
  6329.     call    err.inv.var.type
  6330. p.SUBTRACT.g.8.x.x.8:
  6331.     jmp    put.STA.C
  6332. ;
  6333. p.SUBTRACT.g.8.x.x.BP:
  6334.     call    put.LHLD.C
  6335.     jmp    put.MOV.M.A
  6336. ;
  6337. ;
  6338. ;
  6339. ;
  6340. p.SUBTRACT.general:
  6341.     lda    A.word.type
  6342.     ani    wtp.cnst
  6343.     jnz    p.SUBTRACT.g.c.chk
  6344. ;
  6345.     call    switch.A
  6346.     db stet.BYTE        ! dw put.sub.g.A8.B16.C16
  6347.     db stet.WORD        ! dw put.sub.g.A16.B16.C16
  6348.     db stet.spcl.BYTE.ptr    ! dw put.sub.g.ABP.B16.C16
  6349.     db stet.spcl.WORD.ptr    ! dw put.sub.g.AWP.B16.C16
  6350.     db    0        ! dw p.SUBTRACT.g.err
  6351. ;
  6352. ;
  6353. p.SUBTRACT.g.err:
  6354.     call    err.inv.var.type
  6355. p.SUBTRACT.g.c.chk:
  6356.     lda    B.word.type
  6357.     ani    wtp.cnst
  6358.     jnz    put.sub.g.AN.BN.C16
  6359.     jmp    put.sub.g.ANsmall
  6360. ;
  6361. ;
  6362. ;
  6363. ;
  6364. ;
  6365. p.SUBTRACT.BCD:
  6366.     call    put.LXI.B.C
  6367.     jmp    p.SUBTRACT.BCD.A
  6368. ;
  6369. p.SUBTRACT.BCDP:
  6370.     call    put.LHLD.C
  6371.     call    put.mv.HL.to.BC
  6372. p.SUBTRACT.BCD.A:
  6373.     lda    A.word.type
  6374.     ani    wtp.cnst
  6375.     lxi    h,sym.tbl.entry.A
  6376.     cnz    put.inline.BCD
  6377. ;
  6378.     lda    ste.A.type
  6379.     cpi    stet.BCD
  6380.     jz    p.SUBTRACT.A.BCD
  6381.     cpi    stet.spcl.bcd.ptr
  6382.     cnz    err.inv.var.type
  6383. ;
  6384.     call    put.LHLD.A
  6385.     call    put.XCHG
  6386.     jmp    p.SUBTRACT.BCD.B
  6387. ;
  6388. p.SUBTRACT.A.BCD:
  6389.     call    put.LXI.D.A
  6390. p.SUBTRACT.BCD.B:
  6391.     lda    B.word.type
  6392.     ani    wtp.cnst
  6393.     lxi    h,sym.tbl.entry.B
  6394.     cnz    put.inline.BCD
  6395. ;
  6396.     lda    ste.B.type
  6397.     cpi    stet.BCD
  6398.     jz    p.SUBTRACT.B.BCD
  6399.     cpi    stet.spcl.bcd.ptr
  6400.     cnz    err.inv.var.type
  6401.     call    put.LHLD.B
  6402.     jmp    p.SUBTRACT.BCD.call
  6403. ;
  6404. p.SUBTRACT.B.BCD:
  6405.     call    put.LXI.H.B
  6406. p.SUBTRACT.BCD.call:
  6407.     mvi    a,bir.BCD.subtract
  6408.     jmp    put.bir.call.fwd
  6409. ;
  6410. ;
  6411. ;
  6412. ;
  6413. ;
  6414. ;
  6415. ;------------------------------------------------------
  6416. ;
  6417. ;  bir.SWITCH    jumps to selection-fail address
  6418. ;        (past executable-stmt this selection)
  6419. ;  bir.SWITCH.multiple    jumps TO the executable statement
  6420. ;  bir.SWITCH.range.fail..jumps either to next comparison this group,
  6421. ;            or to next selection-group if no next cmpr.
  6422. ;
  6423. ;
  6424. process.SWITCH:
  6425.     call    chk.strt.code
  6426.     call    bump.block.level
  6427.     lhld    curr.src.line.num
  6428.     push    h
  6429. ;
  6430.     call    get.word
  6431.     lda    rsvd.wd.ix
  6432.     cpi    rwix.ON
  6433.     cz    get.word
  6434.     call    chk.word.id.only
  6435.     call    get.var.A.word
  6436.     lda    rsvd.wd.ix
  6437.     cpi    rwix.colon
  6438.     cz    get.word
  6439.     lda    rsvd.wd.ix
  6440.     cpi    rwix.semicolon
  6441.     cz    get.word
  6442.     xra    a
  6443.     sta    first.switch.flag
  6444. ;
  6445. p.SWITCH.lup:
  6446.     mvi    a,bir.SWITCH.range.fail
  6447.     call    fix.up.built.in.rtn
  6448.     call    p.SWITCH.flush.COMMENT
  6449.     call    switch.rsvd.wd.ix
  6450.     db rwix.ENDSWITCH    ! dw p.SWITCH.ENDSWITCH
  6451.     db rwix.ELSE        ! dw p.SWITCH.ELSE
  6452.     db    0        ! dw p.SWITCH.chk.more
  6453. p.SWITCH.chk.more:
  6454.     call    chk.not.blk.ender
  6455.     jnz    p.SWITCH.get.test
  6456.     call    err.missing.ENDSWITCH
  6457.     jmp    p.SWITCH.err.ENDSWITCH
  6458. ;
  6459. ;
  6460. p.SWITCH.get.test:
  6461.     mvi    a,bir.SWITCH.range.fail
  6462.     call    fix.up.built.in.rtn
  6463.     call    p.SWITCH.flush.COMMENT
  6464.     call    chk.strt.code    ;get right addr on listing
  6465.     call    get.var.B.word
  6466.     call    p.SWITCH.flush.COMMENT
  6467.     lda    rsvd.wd.ix
  6468.     cpi    rwix.minus
  6469.     jz    p.SWITCH.range
  6470.     cpi    rwix.TO
  6471.     jnz    p.SWITCH.not.range
  6472. ;
  6473. ;
  6474. ;----range specified (ex: 1-5)-----
  6475. ;
  6476. p.SWITCH.range:
  6477.     call    p.SWITCH.flush.COMMENT
  6478.     call    get.word    ;skip '-' or TO
  6479.     call    p.SWITCH.flush.COMMENT
  6480.     call    get.var.C.word
  6481. ;
  6482. ;--check if range forwards or backwards--
  6483. ;
  6484.     call    switch.A
  6485.     db stet.STRING        ! dw p.SWITCH.rng.str
  6486.     db stet.spcl.string.ptr    ! dw p.SWITCH.rng.str
  6487.     db stet.BCD        ! dw p.SWITCH.rng.BCD
  6488.     db stet.spcl.bcd.ptr    ! dw p.SWITCH.rng.BCD
  6489.     db    0        ! dw p.SWITCH.rng.bin
  6490. ;
  6491. p.SWITCH.rng.bin:
  6492.     lhld    ste.B.address
  6493.     xchg
  6494.     lhld    ste.C.address
  6495.     call    cmp.de.fm.hl
  6496.     jc    p.SWITCH.rng.bkwds
  6497.     jmp    p.SWITCH.rng.fwd
  6498. ;
  6499. p.SWITCH.rng.str:
  6500.     lxi    h,ste.B.name
  6501.     lxi    d,ste.C.name
  6502.     call    compare.strings
  6503.     jc    p.SWITCH.rng.bkwds
  6504.     jmp    p.SWITCH.rng.fwd
  6505. ;
  6506. p.SWITCH.rng.bcd:
  6507.     lxi    h,ste.B.name
  6508.     lxi    d,switch.bcd.wk
  6509.     call    cvt.str.2.bcd
  6510.     lxi    h,ste.C.name
  6511.     lxi    d,bcd.cnst.value.wk
  6512.     call    cvt.str.2.bcd
  6513.     lxi    h,switch.bcd.wk
  6514.     lxi    d,bcd.cnst.value.wk
  6515.     call    bcd.compare
  6516.     jnc    p.SWITCH.rng.fwd
  6517. ;
  6518. p.SWITCH.rng.bkwds:
  6519.     lxi    h,sym.tbl.entry.B
  6520.     lxi    d,sym.tbl.entry.C
  6521.     mvi    b,sym.tbl.entry.C - sym.tbl.entry.B
  6522. p.SWITCH.swap.lup:
  6523.     mov    c,m
  6524.     ldax    d
  6525.     mov    m,a
  6526.     mov    a,c
  6527.     stax    d
  6528.     dcr    b
  6529.     jnz    p.SWITCH.swap.lup
  6530. p.SWITCH.rng.fwd:
  6531.     call    switch.A
  6532.     db stet.BYTE        ! dw p.SWITCH.rng.0.8.strt
  6533.     db stet.spcl.byte.ptr    ! dw p.SWITCH.rng.0.8.strt
  6534.     db stet.WORD        ! dw p.SWITCH.rng.0.16.strt
  6535.     db stet.spcl.word.ptr    ! dw p.SWITCH.rng.0.16.strt
  6536.     db    0        ! dw p.SWITCH.rng.cont
  6537. ;
  6538. p.SWITCH.rng.0.8.strt:
  6539.     lda    ste.B.address + 1
  6540.     ora    a
  6541.     cnz    err.truncate
  6542. p.SWITCH.rng.0.16.strt:
  6543.     lhld    ste.B.address
  6544.     mov    a,h
  6545.     ora    l
  6546.     jz    p.SWITCH.rng.B.skip
  6547. ;
  6548. p.SWITCH.rng.cont:
  6549.     xra    a
  6550.     call    p.SWITCH.compare
  6551.     call    put.JC
  6552.     mvi    a,bir.SWITCH.range.fail
  6553.     call    put.fwd.bir.sv.word
  6554. ;
  6555. p.SWITCH.rng.B.skip:
  6556.     lxi    h,sym.tbl.entry.C
  6557.     lxi    d,sym.tbl.entry.B
  6558.     call    move.sym.tbl.entry
  6559.     call    switch.A
  6560.     db stet.BYTE        ! dw p.SWITCH.erng.8.0.end
  6561.     db stet.spcl.byte.ptr    ! dw p.SWITCH.erng.8.0.end
  6562.     db stet.WORD        ! dw p.SWITCH.erng.16.0.end
  6563.     db stet.spcl.word.ptr    ! dw p.SWITCH.erng.16.0.end
  6564.     db    0        ! dw p.SWITCH.erng.cont
  6565. ;
  6566. p.SWITCH.erng.8.0.end:
  6567.     lda    ste.B.address + 1
  6568.     ora    a
  6569.     cnz    err.truncate
  6570.     lda    ste.B.address
  6571.     sta    ste.B.address + 1
  6572. ;
  6573. ;---skip end test for binary if = ^hff or ^hffff---
  6574. ;
  6575. p.SWITCH.erng.16.0.end:
  6576.     lhld    ste.B.address
  6577.     mov    a,h
  6578.     ana    l
  6579.     inr    a
  6580.     jz    p.SWITCH.rng.chk.more
  6581. p.SWITCH.erng.cont:
  6582.     mvi    a,1
  6583.     call    p.SWITCH.compare
  6584. ;
  6585. ;--if STRING or BCD, flag still set for special case of end range equal
  6586. ;
  6587.     lda    switch.end.rng.flag
  6588.     ora    a
  6589.     jz    p.SWITCH.end.off.done
  6590.     call    put.JZ
  6591.     mvi    a,bir.SWITCH.multiple
  6592.     call    put.fwd.bir.sv.word
  6593. p.SWITCH.end.off.done:
  6594.     call    p.SWITCH.flush.COMMENT
  6595.     lda    rsvd.wd.ix
  6596.     cpi    rwix.comma
  6597.     jnz    p.SWITCH.end.range
  6598.     call    put.JC
  6599.     mvi    a,bir.SWITCH.multiple
  6600.     call    put.fwd.bir.sv.word
  6601.     jmp    p.SWITCH.rng.chk.more
  6602. ;
  6603. p.SWITCH.end.range:
  6604.     call    put.JNC
  6605.     mvi    a,bir.SWITCH
  6606.     call    put.fwd.bir.sv.word
  6607. p.SWITCH.rng.chk.more:
  6608.     call    p.SWITCH.flush.COMMENT
  6609.     mvi    a,0ffh
  6610.     sta    first.switch.flag
  6611.     lda    rsvd.wd.ix
  6612.     cpi    rwix.comma
  6613.     jnz    p.SWITCH.rng.not.mult
  6614.     call    get.word
  6615.     jmp    p.SWITCH.get.test
  6616. ;
  6617. ;---not range---
  6618. ;
  6619. p.SWITCH.not.range:
  6620.     call    switch.B
  6621.     db stet.BYTE        ! dw p.SWITCH.nrng.8
  6622.     db stet.spcl.byte.ptr    ! dw p.SWITCH.nrng.8
  6623.     db    0        ! dw p.SWITCH.nrng.cont
  6624. p.SWITCH.nrng.8:
  6625.     lda    ste.B.address + 1
  6626.     ora    a
  6627.     cnz    err.truncate
  6628. p.SWITCH.nrng.cont:
  6629.     xra    a
  6630.     call    p.SWITCH.compare
  6631.     mvi    a,0ffh
  6632.     sta    first.switch.flag
  6633.     call    p.SWITCH.flush.COMMENT
  6634.     lda    rsvd.wd.ix
  6635.     cpi    rwix.comma
  6636.     jnz    p.SWITCH.not.multiple
  6637.     call    put.JZ
  6638.     mvi    a,bir.SWITCH.multiple
  6639.     call    put.fwd.ref.bir
  6640.     call    get.word
  6641.     jmp    p.SWITCH.get.test
  6642. ;
  6643. p.SWITCH.not.multiple:
  6644.     call    put.JNZ
  6645.     mvi    a,bir.SWITCH
  6646.     call    put.fwd.bir.sv.word
  6647. p.SWITCH.rng.not.mult:
  6648.     mvi    a,0ffh
  6649.     sta    first.switch.flag
  6650.     lda    rsvd.wd.ix
  6651.     cpi    rwix.colon
  6652.     cz    get.word
  6653.     mvi    a,bir.SWITCH.multiple
  6654.     call    fix.up.built.in.rtn
  6655.     lhld    ste.A.type
  6656.     push    h
  6657.     lhld    ste.A.address
  6658.     push    h
  6659.     call    process.a.statement
  6660.     mvi    a,bir.EXITSWITCH
  6661.     call    put.bir.jmp.fwd
  6662.     mvi    a,bir.SWITCH
  6663.     call    fix.up.built.in.rtn
  6664.     pop    h
  6665.     shld    ste.A.address
  6666.     pop    h
  6667.     mov    a,l
  6668.     sta    ste.A.type
  6669.     jmp    p.SWITCH.lup
  6670. ;
  6671. ;
  6672. p.SWITCH.ELSE:
  6673.     call    debug.routine
  6674.     mvi    a,bir.SWITCH
  6675.     call    fix.up.built.in.rtn
  6676.     call    get.word
  6677.     call    process.a.statement
  6678.     lda    rsvd.wd.ix
  6679.     cpi    rwix.ENDSWITCH
  6680.     cnz    err.missing.ENDSWITCH
  6681. p.SWITCH.ENDSWITCH:
  6682.     call    debug.routine
  6683.     pop    h
  6684.     shld    curr.block.match
  6685.     call    get.word
  6686.     jmp    p.SWITCH.got.mtch
  6687. ;
  6688. p.SWITCH.err.ENDSWITCH:
  6689.     pop    h
  6690.     shld    curr.block.match
  6691. p.SWITCH.got.mtch:
  6692.     mvi    a,bir.SWITCH
  6693.     call    fix.up.built.in.rtn
  6694.     mvi    a,bir.EXITSWITCH
  6695.     call    fix.up.built.in.rtn
  6696.     call    decr.block.level
  6697.     jmp    squish.sym.tbl
  6698. ;
  6699. ;
  6700. ;
  6701. p.SWITCH.flush.COMMENT:
  6702.     lda    rsvd.wd.ix
  6703.     cpi    rwix.COMMENT
  6704.     rnz
  6705.     call    process.COMMENT
  6706.     jmp    p.SWITCH.flush.COMMENT
  6707. ;
  6708. ;
  6709. ;
  6710. ;==========comparison routine for switch========
  6711. ;
  6712. p.SWITCH.compare:
  6713.     sta    switch.end.rng.flag
  6714.     lda    ste.A.type
  6715.     cpi    stet.string
  6716.     jz    p.SWITCH.string
  6717.     cpi    stet.spcl.string.ptr
  6718.     jnz    p.SWITCH.cnst
  6719. ;
  6720. p.SWITCH.string:
  6721.     lda    B.word.type
  6722.     ani    wtp.string
  6723.     cz    err.inv.cnst
  6724. ;
  6725.     call    switch.A
  6726.     db stet.STRING        ! dw p.SWITCH.str.str
  6727.     db stet.spcl.string.ptr    ! dw p.SWITCH.str.SP
  6728.     db    0        ! dw p.SWITCH.str.err
  6729. p.SWITCH.str.err:
  6730.     call    err.inv.var.type
  6731. p.SWITCH.str.str:
  6732.     call    put.LXI.H.A
  6733. p.SWITCH.cmp.str:
  6734.     call    put.inline.B.string
  6735.     call    put.LXI.D.B
  6736.     jmp    put.cmp.str
  6737. ;
  6738. p.SWITCH.str.SP:
  6739.     call    put.LHLD.A
  6740.     jmp    p.SWITCH.cmp.str
  6741. ;
  6742. p.SWITCH.cnst:
  6743.     lda    B.word.type
  6744.     ani    wtp.cnst
  6745.     cz    err.inv.cnst
  6746. ;
  6747.     call    switch.A
  6748.     db stet.BYTE        ! dw p.SWITCH.BYTE.cnst
  6749.     db stet.WORD        ! dw p.SWITCH.WORD.cnst
  6750.     db stet.spcl.BYTE.ptr    ! dw p.SWITCH.BP.cnst
  6751.     db stet.spcl.WORD.ptr    ! dw p.SWITCH.WP.cnst
  6752.     db stet.BCD        ! dw p.SWITCH.BCD.cnst
  6753.     db stet.spcl.BCD.ptr    ! dw p.SWITCH.BCDP.cnst
  6754.     db    0        ! dw p.SWITCH.A.err
  6755. ;
  6756. p.SWITCH.A.err:
  6757.     call    err.inv.var.type
  6758. p.SWITCH.BCDP.cnst:
  6759.     call    put.LHLD.A
  6760.     jmp    p.SWITCH.BCD.cmp
  6761. ;
  6762. p.SWITCH.BCD.cnst:
  6763.     call    put.LXI.H.A
  6764. p.SWITCH.BCD.cmp:
  6765.     lxi    h,sym.tbl.entry.B
  6766.     call    put.inline.BCD
  6767.     call    put.LXI.D.B
  6768.     jmp    put.cmp.BCD
  6769. ;
  6770. p.SWITCH.BYTE.cnst:
  6771.     lda    first.switch.flag
  6772.     ora    a
  6773.     jnz    p.SWITCH.CPI
  6774.     call    put.LDA.A
  6775. p.SWITCH.CPI:
  6776.     lda    ste.B.address
  6777.     ora    a
  6778.     jz    p.SWITCH.CPI.0
  6779. ;
  6780.     call    put.CPI
  6781.     lda    ste.B.address
  6782.     lxi    h,switch.end.rng.flag
  6783.     add    m
  6784.     call    put.code.byte
  6785.     xra    a
  6786.     sta    switch.end.rng.flag
  6787.     ret
  6788. ;
  6789. p.SWITCH.CPI.0:
  6790.     jmp    put.ORA.A
  6791. ;
  6792. p.SWITCH.BP.cnst:
  6793.     lda    first.switch.flag
  6794.     ora    a
  6795.     jnz    p.SWITCH.CPI
  6796.     call    put.LHLD.A
  6797.     call    put.MOV.A.M
  6798.     jmp    p.SWITCH.CPI
  6799. ;
  6800. p.SWITCH.WP.cnst:
  6801.     lda    first.switch.flag
  6802.     ora    a
  6803.     jnz    p.SWITCH.cmp.16
  6804.     call    put.LHLD.A
  6805.     call    put.mv.@HL.to.DE
  6806.     lda    switch.end.rng.flag
  6807.     mov    c,a
  6808.     mvi    b,0
  6809.     xra    a
  6810.     sta    switch.end.rng.flag
  6811.     lhld    ste.B.address
  6812.     dad    b
  6813.     call    put.LXI.H.hl
  6814.     jmp    p.SWITCH.cmp.16
  6815. ;
  6816. ;
  6817. ;
  6818. p.SWITCH.WORD.cnst:
  6819.     lda    first.switch.flag
  6820.     ora    a
  6821.     jnz    p.SWITCH.cmp.16
  6822.     call    put.LHLD.A
  6823. p.SWITCH.cmp.16:
  6824.     lda    switch.end.rng.flag
  6825.     mov    c,a
  6826.     mvi    b,0
  6827.     xra    a
  6828.     sta    switch.end.rng.flag
  6829.     lhld    ste.B.address
  6830.     dad    b
  6831.     call    put.LXI.D.hl
  6832.     jmp    put.cmp.16
  6833.  
  6834.  
  6835.  
  6836. switch.end.rng.flag:
  6837.     db    0
  6838. switch.bcd.wk:
  6839.     ds    bcd.size
  6840. ;
  6841. ;
  6842. ;
  6843. ;------------------------------------------------------
  6844. ;
  6845. ;
  6846. process.TRACEBACK:
  6847.     call    chk.strt.code
  6848.     call    get.word
  6849. ;
  6850.     call    put.MVI.C
  6851.     lda    word.type
  6852.     ani    wtp.cnst
  6853.     jz    p.TRACEBACK.dflt
  6854. ;
  6855.     lda    cnst.value
  6856.     call    put.code.byte
  6857.     call    get.word
  6858.     jmp    p.TRACEBACK.cont
  6859. ;
  6860. p.TRACEBACK.dflt:
  6861.     mvi    a,10
  6862.     call    put.code.byte
  6863. p.TRACEBACK.cont:
  6864.     mvi    a,bir.traceback
  6865.     jmp    put.bir.call.fwd
  6866. ;
  6867. ;
  6868. ;------------------------------------------------------
  6869. ;
  6870. ;
  6871. process.UNSTRING:
  6872.     call    chk.strt.code
  6873.     call    get.word
  6874. ;
  6875.     call    get.var.B.word
  6876.     lda    B.word.type
  6877.     ani    wtp.string
  6878.     cnz    put.inline.B.string
  6879. ;
  6880.     call    switch.B
  6881.     db stet.STRING        ! dw p.UNSTRING.src.ok
  6882.     db stet.spcl.string.ptr    ! dw p.UNSTRING.src.ok
  6883.     db stet.RECORD        ! dw p.UNSTRING.src.ok
  6884.     db    0        ! dw p.UNSTRING.src.err
  6885. p.UNSTRING.src.err:
  6886.     call    err.inv.var.type
  6887. p.UNSTRING.src.ok:
  6888.     lda    rsvd.wd.ix
  6889.     cpi    rwix.FROM
  6890.     jz    p.UNSTRING.FROM
  6891. ;
  6892. ;---no starting location given -- start at front---
  6893. ;
  6894.     lxi    h,0
  6895.     call    put.LXI.D.hl
  6896.     jmp    p.UNSTRING.FROM.end
  6897. ;
  6898. p.UNSTRING.FROM:
  6899.     call    get.word
  6900. ;
  6901. ;
  6902. p.UNSTRING.FROM.id:
  6903.     call    chk.word.id.only
  6904.     call    get.var.A.word
  6905. ;
  6906.     lda    A.word.type
  6907.     ani    wtp.cnst
  6908.     jnz    p.UNSTRING.FROM.cnst
  6909. ;
  6910.     call    switch.A
  6911.     db stet.BYTE        ! dw p.UNSTRING.FROM.8
  6912.     db stet.WORD        ! dw p.UNSTRING.FROM.16
  6913.     db stet.spcl.BYTE.ptr    ! dw p.UNSTRING.FROM.BP
  6914.     db stet.spcl.WORD.ptr    ! dw p.UNSTRING.FROM.WP
  6915.     db    0        ! dw p.UNSTRING.FROM.err
  6916. ;
  6917. p.UNSTRING.FROM.err:
  6918.     call    err.inv.var.type
  6919. p.UNSTRING.FROM.cnst:
  6920.     lhld    ste.A.address
  6921.     call    put.LXI.D.hl
  6922.     call    get.word
  6923.     jmp    p.UNSTRING.FROM.end
  6924. ;
  6925. p.UNSTRING.FROM.WP:
  6926.     call    put.LHLD.A
  6927.     call    put.mv.@HL.to.DE
  6928.     jmp    p.UNSTRING.FROM.end
  6929. ;
  6930. p.UNSTRING.FROM.BP:
  6931.     call    put.LHLD.A
  6932.     call    put.mv.@HLB.to.DE
  6933.     jmp    p.UNSTRING.FROM.end
  6934. ;
  6935. p.UNSTRING.FROM.16:
  6936.     call    put.LHLD.A
  6937.     call    put.XCHG
  6938.     jmp    p.UNSTRING.FROM.end
  6939. ;
  6940. p.UNSTRING.FROM.8:
  6941.     call    put.LHLD.A
  6942.     call    put.XCHG
  6943.     call    put.MVI.D.0
  6944. p.UNSTRING.FROM.end:
  6945.     lda    rsvd.wd.ix
  6946.     cpi    rwix.TO
  6947.     jz    p.UNSTRING.TO
  6948. ;
  6949. ;---no ending location given -- end at end of string---
  6950. ;
  6951.     lxi    h,0ffffh
  6952.     call    put.LXI.B.hl
  6953.     jmp    p.UNSTRING.TO.end
  6954. ;
  6955. p.UNSTRING.TO:
  6956.     call    get.word
  6957. ;
  6958. p.UNSTRING.TO.id:
  6959.     call    chk.word.id.only
  6960.     call    get.var.A.word
  6961.     lda    A.word.type
  6962.     ani    wtp.cnst
  6963.     jnz    p.UNSTRING.TO.cnst
  6964. ;
  6965.     call    switch.A
  6966.     db stet.BYTE        ! dw p.UNSTRING.TO.8
  6967.     db stet.WORD        ! dw p.UNSTRING.TO.16
  6968.     db stet.spcl.byte.ptr    ! dw p.UNSTRING.TO.BP
  6969.     db stet.spcl.WORD.ptr    ! dw p.UNSTRING.TO.WP
  6970.     db    0        ! dw p.UNSTRING.TO.err
  6971. ;
  6972. p.UNSTRING.TO.err:
  6973.     call    err.inv.var.type
  6974. p.UNSTRING.TO.cnst:
  6975.     lhld    ste.A.address
  6976.     call    put.LXI.B.hl
  6977.     call    get.word
  6978.     jmp    p.UNSTRING.TO.end
  6979. ;
  6980. p.UNSTRING.TO.WP:
  6981.     call    put.LHLD.A
  6982.     call    put.mv.@HL.to.BC
  6983.     jmp    p.UNSTRING.TO.end
  6984. ;
  6985. p.UNSTRING.TO.BP:
  6986.     call    put.LHLD.A
  6987.     call    put.mv.@HLB.to.BC
  6988.     jmp    p.UNSTRING.TO.end
  6989. ;
  6990. p.UNSTRING.TO.16:
  6991.     call    put.LHLD.A
  6992.     call    put.mv.HL.to.BC
  6993.     jmp    p.UNSTRING.TO.end
  6994. ;
  6995. p.UNSTRING.TO.8:
  6996.     call    put.LHLD.A
  6997.     call    put.MOV.C.L
  6998.     call    put.MVI.B.0
  6999. p.UNSTRING.TO.end:
  7000.     lda    rsvd.wd.ix
  7001.     cpi    rwix.GIVING
  7002.     jz    p.UNSTRING.got.dest
  7003. ;
  7004.     lxi    h,sym.tbl.entry.B
  7005.     lxi    d,sym.tbl.entry.A
  7006.     call    move.sym.tbl.entry
  7007.     jmp    p.UNSTRING.code
  7008. ;
  7009. p.UNSTRING.got.dest:
  7010.     call    get.word
  7011.     call    chk.word.id.only
  7012.     call    get.var.A.word
  7013. p.UNSTRING.code:
  7014.     call    switch.A
  7015.     db stet.STRING        ! dw p.UNSTRING.S.cont
  7016.     db stet.spcl.string.ptr    ! dw p.UNSTRING.SP.cont
  7017.     db    0        ! dw p.UNSTRING.S.err
  7018. p.UNSTRING.S.err:
  7019.     call    err.inv.var.type
  7020. p.UNSTRING.S.cont:
  7021.     call    put.LXI.H.A
  7022.     jmp    p.UNSTRING.S.2.cont
  7023. ;
  7024. p.UNSTRING.SP.cont:
  7025.     call    put.LHLD.A
  7026. p.UNSTRING.S.2.cont:
  7027.     call    put.PUSH.H
  7028. ;
  7029. ;
  7030.     lda    ste.B.type
  7031.     cpi    stet.spcl.string.ptr
  7032.     jz    p.UNSTRING.code.SP
  7033.     cpi    stet.STRING
  7034.     jnz    err.inv.var.type
  7035.     call    put.LXI.H.B
  7036.     jmp    p.UNSTRING.cont
  7037. ;
  7038. p.UNSTRING.code.SP:
  7039.     call    put.LHLD.B
  7040. p.UNSTRING.cont:
  7041.     mvi    a,bir.UNSTRING
  7042.     jmp    put.bir.call.fwd
  7043. ;
  7044. ;
  7045. ;------------------------------------------------------
  7046. ;
  7047. ;
  7048. process.WHILE:
  7049.     call    chk.strt.code
  7050.     call    bump.block.level
  7051.     call    opt.undef.all
  7052. ;
  7053.     lhld    curr.code.addr
  7054.     push    h
  7055. ;
  7056.     lhld    curr.src.line.num
  7057.     push    h
  7058. ;
  7059. p.WHILE.AND.lup:
  7060.     call    get.word
  7061.     mvi    a,0ffh
  7062.     sta    fall.thru.true
  7063.     mvi    a,0ffh
  7064.     sta    no.fall.thru.fwd.flag
  7065.     mvi    a,bir.EXITDO
  7066.     sta    curr.fwd.no.fall.thru
  7067.     call    process.expression
  7068. ;
  7069. p.WHILE.compound:
  7070.     call    switch.rsvd.wd.ix
  7071.     db rwix.AND        ! dw p.WHILE.AND.lup
  7072.     db rwix.OR        ! dw p.WHILE.OR
  7073.     db rwix.DO        ! dw p.WHILE.DO
  7074.     db rwix.COMMENT        ! dw p.WHILE.COMMENT
  7075.     db    0        ! dw p.DO.lup
  7076. ;
  7077. p.WHILE.COMMENT:
  7078.     call    process.COMMENT
  7079.     jmp    p.WHILE.compound
  7080. ;
  7081. p.WHILE.DO:
  7082.     call    get.word
  7083.     jmp    p.DO.lup
  7084. ;
  7085. ;
  7086. p.WHILE.OR:
  7087.     mvi    a,bir.WHILE.TRUE
  7088.     call    put.bir.jmp.fwd
  7089.     mvi    a,bir.EXITDO
  7090.     call    fix.up.built.in.rtn
  7091.     jmp    p.WHILE.AND.lup
  7092. ;
  7093. ;------------------------------------------------------
  7094. ;
  7095. ;
  7096. process.WORD:
  7097.     call    set.byte.boundary
  7098.     call    chk.strt.data
  7099.     call    get.word
  7100. ;
  7101.     call    switch.rsvd.wd.ix
  7102.     db rwix.POINTER        ! dw p.POINTER.WORD
  7103.     db rwix.VALUE        ! dw p.WORD.VALUE
  7104.     db rwix.comma        ! dw p.WORD.no.VALUE
  7105.     db rwix.semicolon    ! dw p.WORD.no.VALUE
  7106.     db    0        ! dw p.WORD.id
  7107. ;
  7108. p.WORD.id:
  7109.     call    chk.word.id.only
  7110.     call    chk.word.not.in.tbl
  7111.     mvi    a,stet.WORD
  7112.     sta    ste.type
  7113.     lda    curr.BIT.posn
  7114.     sta    ste.BIT.posn
  7115.     lxi    h,2
  7116.     shld    ste.length
  7117.     call    put.word.into.tbl
  7118.     call    get.word
  7119.     lda    rsvd.wd.ix
  7120.     cpi    rwix.VALUE
  7121.     jz    p.WORD.VALUE
  7122. p.WORD.no.VALUE:
  7123.     lhld    curr.code.addr
  7124.     inx    h
  7125.     inx    h
  7126.     shld    curr.code.addr
  7127.     jmp    p.WORD.comma
  7128. ;
  7129. p.WORD.VALUE:
  7130.     call    get.word
  7131.     lda    word.type
  7132.     ani    wtp.cnst
  7133.     jnz    p.WORD.cnst
  7134. ;
  7135.     lda    rsvd.wd.ix
  7136.     cpi    rwix.HIMEM
  7137.     jnz    p.WORD.label
  7138.     mvi    a,bir.HIMEM
  7139.     call    put.fwd.ref.bir
  7140.     call    get.word
  7141.     jmp    p.WORD.comma
  7142. ;
  7143. p.WORD.label:
  7144.     lda    word.type
  7145.     ani    wtp.ident
  7146.     jz    p.WORD.inv.VALUE
  7147.     call    lookup.word
  7148.     lhld    wk.sym.tbl.addr
  7149.     mov    a,m
  7150.     cpi    stet.end.tbl
  7151.     jz    p.WORD.fwd.ref
  7152. ;
  7153.     lxi    b,(ste.address - ste.type)
  7154.     dad    b
  7155.     mov    e,m
  7156.     inx    h
  7157.     mov    d,m
  7158.     jmp    p.WORD.put.VALUE
  7159. ;
  7160. p.WORD.inv.VALUE:
  7161.     call    err.inv.VALUE
  7162.     lhld    curr.code.addr
  7163.     inx    h
  7164.     inx    h
  7165.     shld    curr.code.addr
  7166.     call    get.word
  7167.     jmp    p.WORD.comma
  7168. ;
  7169. p.WORD.fwd.ref:
  7170.     mvi    a,stet.fwd.ref
  7171.     sta    ste.type
  7172.     call    put.word.into.tbl
  7173.     lxi    h,0
  7174.     jmp    p.WORD.put.VALUE
  7175. ;
  7176. p.WORD.cnst:
  7177.     lhld    cnst.value
  7178. p.WORD.put.VALUE:
  7179.     call    put.code.word
  7180.     call    get.word
  7181. p.WORD.comma:
  7182.     lda    rsvd.wd.ix
  7183.     cpi    rwix.comma
  7184.     jz    process.WORD
  7185.     ret
  7186. ;
  7187. ;------------------------------------------------------
  7188. ;
  7189. ;
  7190. process.WRITE:
  7191.     call    chk.strt.code
  7192.     call    get.word
  7193.     call    chk.word.id.only
  7194.     call    get.var.A.word
  7195. ;
  7196.     lda    ste.A.FILE.device
  7197.     call    switch
  7198.     db rwix.CON        ! dw p.WRITE.CON
  7199.     db rwix.LST        ! dw p.WRITE.LST
  7200.     db rwix.PRN        ! dw p.WRITE.LST
  7201.     db rwix.PUN        ! dw p.WRITE.PUN
  7202.     db rwix.TTY        ! dw p.WRITE.CON
  7203.     db rwix.DISK        ! dw p.WRITE.DISK
  7204.     db    0        ! dw p.WRITE.err
  7205. p.WRITE.err:
  7206.     call    err.inv.dev.io
  7207. p.WRITE.DISK:
  7208.     xra    a
  7209.     sta    write.lock.flag
  7210.     sta    write.unlock.flag
  7211. ;
  7212.     lda    rsvd.wd.ix
  7213.     cpi    rwix.LOCK
  7214.     jnz    p.WRITE.not.LOCK
  7215.     call    get.word
  7216.     lda    MPM.flag
  7217.     ora    a
  7218.     jz    p.WRITE.not.LOCK
  7219.     mvi    a,0ffh
  7220.     sta    write.lock.flag
  7221.     mov    l,a
  7222.     call    put.MVI.A.L
  7223.     lxi    h,MPM.lock.flag
  7224.     call    put.STA.hl
  7225. ;---if record-mode file - force fresh read---
  7226.     lda    ste.A.FILE.misc.flag
  7227.     ani    FILE.c.flag.rec.mode
  7228.     jz    p.WRITE.not.LOCK
  7229.     lxi    h,0
  7230.     call    put.LXI.H.hl
  7231.     lhld    ste.A.address
  7232.     lxi    d,fcb.rec.buf.sctr
  7233.     dad    d
  7234.     call    put.SHLD.hl
  7235. p.WRITE.not.LOCK:
  7236.     lda    rsvd.wd.ix
  7237.     cpi    rwix.UNLOCK
  7238.     jnz    p.WRITE.not.UNLOCK
  7239.     call    get.word
  7240.     lda    MPM.flag
  7241.     ora    a
  7242.     jz    p.WRITE.not.UNLOCK
  7243.     mvi    a,0ffh
  7244.     sta    write.unlock.flag
  7245.     mov    l,a
  7246.     call    put.MVI.A.L
  7247.     lxi    h,MPM.unlock.flag
  7248.     call    put.STA.hl
  7249. p.WRITE.not.UNLOCK:
  7250.     lda    ste.A.FILE.misc.flag
  7251.     ani    FILE.c.flag.TEXT
  7252.     jz    p.WRITE.not.TEXT
  7253. ;
  7254.     lhld    ste.A.address
  7255.     lxi    d,fcb.rec.addr
  7256.     dad    d
  7257.     call    put.LHLD.hl
  7258.     call    put.MOV.A.M
  7259.     call    put.LXI.D.A
  7260.     mvi    a,bir.dsk.ch.out
  7261.     call    put.bir.call.fwd
  7262.     jmp    p.WRITE.chk.unlock
  7263. ;
  7264. p.WRITE.not.TEXT:
  7265.     lda    ste.A.type
  7266.     cpi    stet.FILE
  7267.     cnz    err.undef.file.name
  7268. ;
  7269.     call    put.LXI.D.A
  7270.     lda    ste.A.FILE.misc.flag
  7271.     ani    FILE.c.flag.rec.mode
  7272.     jz    p.WRITE.not.rec.mode
  7273. ;
  7274.     mvi    a,bir.rec.write
  7275.     jmp    p.WRITE.rec.cont
  7276. ;
  7277. p.WRITE.not.rec.mode:
  7278.     call    put.MVI.C
  7279.     lda    ste.A.FILE.misc.flag
  7280.     ani    FILE.c.flag.RANDOM
  7281.     mvi    a,34    ;write rnd
  7282.     jnz    p.WRITE.RANDOM
  7283.     mvi    a,21    ;write seq
  7284. p.WRITE.RANDOM:
  7285.     call    put.code.byte
  7286. ;
  7287.     mvi    a,bir.disk.sctr.io
  7288. p.WRITE.rec.cont:
  7289.     call    put.bir.call.fwd
  7290. ;
  7291.     lda    rsvd.wd.ix
  7292.     cpi    rwix.ERROR
  7293.     jz    p.WRITE.ERROR
  7294.     cpi    rwix.EOF
  7295.     jnz    p.WRITE.chk.unlock
  7296. ;
  7297. p.WRITE.ERROR:
  7298.     call    put.ORA.A
  7299.     call    get.word
  7300.     lda    rsvd.wd.ix
  7301.     cpi    rwix.STANDARD
  7302.     jz    p.WRITE.err.STANDARD
  7303. ;
  7304.     call    put.JZ
  7305.     mvi    a,bir.WRITE.fwd
  7306.     call    put.fwd.ref.bir
  7307. ;
  7308.     call    process.a.statement
  7309. ;
  7310.     mvi    a,bir.WRITE.fwd
  7311.     call    fix.up.built.in.rtn
  7312.     jmp    p.WRITE.chk.unlock
  7313. ;
  7314. p.WRITE.err.STANDARD:
  7315.     call    put.CNZ
  7316.     mvi    a,bir.write.error
  7317.     call    put.fwd.ref.bir
  7318.     call    get.word
  7319. ;
  7320. p.WRITE.chk.unlock:
  7321.     lda    write.unlock.flag
  7322.     ora    a
  7323.     jz    p.WRITE.chk.lock
  7324.     mvi    l,0
  7325.     call    put.MVI.A.L
  7326.     lxi    h,MPM.unlock.flag
  7327.     call    put.STA.hl
  7328. p.WRITE.chk.lock:
  7329.     lda    write.lock.flag
  7330.     ora    a
  7331.     rz            ;exit
  7332.     mvi    l,0
  7333.     call    put.MVI.A.L
  7334.     lxi    h,MPM.lock.flag
  7335.     jmp    put.STA.hl
  7336. ;
  7337. write.lock.flag:    db    0
  7338. write.unlock.flag:    db    0
  7339. ;
  7340. ;-----------NON-DISK DEVICES-----------
  7341. ;
  7342. ;
  7343. p.WRITE.CON:
  7344.     call    p.WRITE.prefix
  7345.     mvi    a,2
  7346.     jmp    p.WRITE.postfix
  7347. ;
  7348. p.WRITE.PUN:
  7349.     call    p.WRITE.prefix
  7350.     mvi    a,4
  7351.     jmp    p.WRITE.postfix
  7352. ;
  7353. p.WRITE.LST:
  7354.     call    p.WRITE.prefix
  7355.     mvi    a,5
  7356.     jmp    p.WRITE.postfix
  7357. ;
  7358. ;
  7359. p.WRITE.prefix:
  7360.     lhld    ste.A.address
  7361.     lxi    d,fcb.rec.addr
  7362.     dad    d
  7363.     call    put.LHLD.HL
  7364.     call    put.MOV.E.M
  7365.     jmp    put.MVI.C
  7366. ;
  7367. ;
  7368. p.WRITE.postfix:
  7369.     call    put.code.byte
  7370.     jmp    put.CALL.ENTRY
  7371. ;
  7372. ;
  7373. ;
  7374. ;
  7375. ;
  7376. ;
  7377. ;
  7378. ;------------------------------------------------------
  7379. ;    end of statement-compilation routine
  7380. ;------------------------------------------------------
  7381. ;
  7382. ;
  7383. ;
  7384. ;
  7385. ;
  7386. ;
  7387. ;
  7388. ;
  7389. ;
  7390. ;
  7391. ;
  7392. ;
  7393. ;
  7394. ;
  7395. ;
  7396. ;
  7397. ;
  7398. ;------------------------------------------------------
  7399. ;   expression evaluation routine
  7400. ;   (currently only handles simple expressions)
  7401. ;------------------------------------------------------
  7402. ;
  7403. ;
  7404. ;
  7405. ;
  7406. process.expression:
  7407.     call    chk.strt.code
  7408. ;
  7409.     call    switch.rsvd.wd.ix
  7410.     db rwix.eql        ! dw pe.eql
  7411.     db rwix.neq        ! dw pe.neq
  7412.     db rwix.lss        ! dw pe.lss
  7413.     db rwix.gtr        ! dw pe.gtr
  7414.     db rwix.leq        ! dw pe.leq
  7415.     db rwix.geq        ! dw pe.geq
  7416.     db rwix.COMMENT        ! dw pe.start.COMMENT
  7417.     db    0        ! dw pe.not.oprtr.only
  7418. ;
  7419. pe.start.COMMENT:
  7420.     call    process.COMMENT
  7421.     jmp    process.expression
  7422. ;
  7423. pe.not.oprtr.only:
  7424.     call    get.var.A.word
  7425.     lda    ste.A.type
  7426.     cpi    stet.BIT
  7427.     jz    pe.BIT
  7428.     lda    word.type
  7429.     ani    wtp.oprtr
  7430.     jnz    pe.two.operands
  7431. ;
  7432. ;
  7433.     lda    A.word.type
  7434.     ani    wtp.cnst
  7435.     jnz    pe.cnst.only
  7436. ;
  7437.     lda    A.word.type
  7438.     ani    wtp.string
  7439.     jnz    pe.lit.str.only
  7440. ;
  7441.     call    switch.A
  7442.     db stet.BYTE        ! dw pe.BYTE.only
  7443.     db stet.WORD        ! dw pe.WORD.only
  7444.     db stet.spcl.byte.ptr    ! dw pe.BP.only
  7445.     db stet.spcl.word.ptr    ! dw pe.WP.only
  7446.     db stet.BCD        ! dw pe.BCD.only
  7447.     db stet.spcl.BCD.ptr    ! dw pe.BCDP.only
  7448.     db stet.STRING        ! dw pe.STRING.only
  7449.     db stet.spcl.string.ptr    ! dw pe.SP.only
  7450.     db stet.FIELD        ! dw pe.FIELD.only
  7451.     db    0        ! dw pe.one.op.err
  7452. pe.one.op.err:
  7453.     call    err.inv.oprnd
  7454. pe.two.operands:
  7455.     lda    rsvd.wd.ix
  7456.     sta    curr.expr.oprtr
  7457.     call    get.word
  7458.     call    get.var.B.word
  7459. ;
  7460. pe.two.ops.entry:
  7461.     lda    A.word.type
  7462.     ani    wtp.cnst
  7463.     jnz    pe.cnst.x
  7464. ;
  7465.     lda    A.word.type
  7466.     ani    wtp.string
  7467.     jnz    pe.general.string
  7468. ;
  7469.     call    switch.A
  7470.     db stet.BYTE        ! dw pe.BYTE.x
  7471.     db stet.WORD        ! dw pe.general.16
  7472.     db stet.spcl.byte.ptr    ! dw pe.BP.x
  7473.     db stet.spcl.WORD.ptr    ! dw pe.general.16
  7474.     db stet.BCD        ! dw pe.general.BCD
  7475.     db stet.spcl.BCD.ptr    ! dw pe.general.BCD
  7476.     db stet.STRING        ! dw pe.general.string
  7477.     db stet.spcl.string.ptr    ! dw pe.general.string
  7478.     db stet.RECORD        ! dw pe.RECORD.x
  7479.     db stet.FIELD        ! dw pe.FIELD.x
  7480.     db    0        ! dw pe.two.ops.err
  7481. pe.two.ops.err:
  7482.     call    err.inv.oprnd
  7483. ;
  7484. ;
  7485. ;----- condition-code expression-----
  7486. ;
  7487. ;
  7488. pe.eql:    jmp    put.JZ.true
  7489. pe.neq:    jmp    put.JNZ.true
  7490. pe.lss:    jmp    put.JC.true
  7491. pe.geq:    jmp    put.JNC.true
  7492. ;
  7493. pe.gtr:    call    fall.thru.swap
  7494. pe.leq:    call    put.JZ.true
  7495.     jmp    put.JC.true
  7496. ;
  7497. ;
  7498. ;
  7499. ;----------BIT expression-----------
  7500. ;
  7501. ;
  7502. pe.BIT:
  7503.     call    put.LDA.A
  7504.     lhld    ste.A.BIT.posn
  7505.     call    put.ANI.L
  7506.     jmp    put.JNZ.true
  7507. ;
  7508. ;-----------------------------------
  7509. ;
  7510. pe.TRUE:
  7511.     lda    fall.thru.true
  7512.     ora    a
  7513.     rnz
  7514.     call    put.JMP
  7515.     jmp    put.expr.jmp.addr
  7516. ;
  7517. ;-----------------------------------
  7518. ;
  7519. pe.FALSE:
  7520.     lda    fall.thru.true
  7521.     ora    a
  7522.     rz
  7523.     call    put.JMP
  7524.     jmp    put.expr.jmp.addr
  7525. ;
  7526. ;-----------------------------------
  7527. ;
  7528. pe.STRING.only:
  7529.     jmp    pe.BYTE.only    ;if null
  7530. ;
  7531. ;-----------------------------------
  7532. ;
  7533. pe.BCD.only:
  7534. pe.BCDP.only:
  7535.     mvi    a,rwix.neq
  7536.     sta    curr.expr.oprtr
  7537.     mvi    a,wtp.cnst
  7538.     sta    B.word.type
  7539.     lxi    h,0
  7540.     shld    ste.B.address
  7541.     lxi    h,'0'
  7542.     shld    ste.B.name
  7543.     jmp    pe.two.ops.entry
  7544. ;
  7545. ;-----------------------------------
  7546. ;
  7547. pe.FIELD.only:
  7548.     mvi    a,rwix.neq
  7549.     sta    curr.expr.oprtr
  7550.     mvi    a,wtp.string
  7551.     sta    B.word.type
  7552.     lxi    h,0
  7553.     shld    ste.B.address
  7554.     lxi    h,' '
  7555.     shld    ste.B.name
  7556.     jmp    pe.two.ops.entry
  7557. ;
  7558. ;-------------------------------------
  7559. ;
  7560. pe.BP.only:
  7561.     call    put.LHLD.A
  7562.     call    put.MOV.A.M
  7563.     call    put.ORA.A
  7564.     jmp    put.JNZ.true
  7565. ;
  7566. ;-----------------------------------
  7567. ;
  7568. pe.WP.only:
  7569.     call    put.LHLD.A
  7570.     call    put.MOV.A.M
  7571.     call    put.INX.H
  7572.     call    put.ORA.M
  7573.     jmp    put.JNZ.true
  7574. ;
  7575. ;-----------------------------------
  7576. ;
  7577. pe.cnst.only:
  7578.     lhld    cnst.value
  7579. pe.cnst.16.bit:
  7580.     mov    a,h
  7581.     ora    l
  7582.     jnz    pe.TRUE
  7583.     jmp    pe.FALSE
  7584. ;
  7585. ;-----------------------------------
  7586. ;
  7587. pe.lit.str.only:
  7588.     lda    word
  7589.     ora    a
  7590.     jz    pe.FALSE
  7591.     jmp    pe.TRUE
  7592. ;
  7593. ;-----------------------------------
  7594. ;
  7595. pe.SP.only:
  7596.     jmp    pe.BP.only
  7597. ;
  7598. ;-----------------------------------
  7599. ;
  7600. pe.cnst.x:
  7601.     lda    B.word.type
  7602.     ani    wtp.cnst
  7603.     jnz    pe.cnst.cnst
  7604. ;
  7605.     lda    B.word.type
  7606.     ani    wtp.string
  7607.     jnz    pe.general.string
  7608. ;
  7609.     call    switch.B
  7610.     db stet.BYTE        ! dw pe.cnst.BYTE
  7611.     db stet.WORD        ! dw pe.general.16
  7612.     db stet.spcl.BYTE.ptr    ! dw pe.general.8
  7613.     db stet.spcl.WORD.ptr    ! dw pe.general.16
  7614.     db stet.BCD        ! dw pe.general.BCD
  7615.     db stet.spcl.BCD.ptr    ! dw pe.general.BCD
  7616.     db stet.string        ! dw pe.general.string
  7617.     db stet.spcl.string.ptr    ! dw pe.general.string
  7618.     db    0        ! dw pe.cnst.err
  7619. pe.cnst.err:
  7620.     call    err.inv.oprnd
  7621. ;
  7622. ;-----------------------------------
  7623. ;
  7624. pe.RECORD.x:
  7625. pe.FIELD.x:
  7626.     lda    B.word.type
  7627.     ani    wtp.string
  7628.     cnz    put.inline.B.string
  7629. ;--check < 256 bytes---
  7630.     lda    ste.A.length + 1
  7631.     mov    b,a
  7632.     lda    ste.B.length + 1
  7633.     ora    b
  7634.     cnz    err.truncate
  7635. ;
  7636.     call    switch.B
  7637.     db stet.FIELD        ! dw pe.FIELD.FIELD
  7638.     db stet.RECORD        ! dw pe.FIELD.FIELD
  7639.     db stet.string        ! dw pe.FIELD.STRING
  7640.     db stet.spcl.string.ptr    ! dw pe.FIELD.SP
  7641.     db    0        ! dw pe.FIELD.err
  7642. pe.FIELD.err:
  7643.     call    err.inv.var.type
  7644. pe.FIELD.FIELD:
  7645.     call    switch.expr.oprtr
  7646.     db rwix.leq        ! dw pe.ff.swap
  7647.     db rwix.gtr        ! dw pe.ff.swap
  7648.     db    0        ! dw pe.ff.no.swap
  7649. pe.ff.swap:
  7650.     call    swap.curr.expr
  7651. pe.ff.no.swap:
  7652.     call    put.LXI.H.B
  7653.     call    put.LXI.D.A
  7654.     lda    ste.B.length
  7655.     mov    l,a
  7656.     lda    ste.A.length
  7657.     mov    h,a
  7658.     call    put.LXI.B.hl
  7659.     mvi    a,bir.cmp.field
  7660.     call    put.bir.call.fwd
  7661.     jmp    pe.str.rec.oprtr
  7662. ;
  7663. pe.FIELD.SP:
  7664.     call    put.LHLD.B
  7665.     jmp    pe.FIELD.str.cont
  7666. pe.FIELD.STRING:
  7667.     call    put.LXI.H.B
  7668. pe.FIELD.str.cont:
  7669.     call    put.LXI.D.A
  7670.     call    put.MVI.C
  7671.     lda    ste.A.length
  7672. pe.FIELD.STR.entry:
  7673.     call    put.code.byte
  7674.     mvi    a,bir.cmp.field.2.str
  7675.     call    put.bir.call.fwd
  7676.     call    switch.expr.oprtr
  7677.     db rwix.eql        ! dw pe.STR.REC.oprtr
  7678.     db rwix.neq        ! dw pe.STR.REC.oprtr
  7679.     db    0        ! dw err.inv.oprtr
  7680. ;
  7681. pe.STRING.FIELD:
  7682.     call    put.LXI.H.A
  7683.     call    put.LXI.D.B
  7684.     call    put.MVI.C
  7685.     lda    ste.B.length
  7686.     jmp    pe.FIELD.STR.entry
  7687. ;
  7688. ;-----------------------------------
  7689. ;
  7690. pe.BP.x:
  7691. pe.BYTE.x:
  7692.     call    switch.B
  7693.     db stet.WORD        ! dw pe.general.16
  7694.     db stet.spcl.word.ptr    ! dw pe.general.16
  7695.     db    0        ! dw pe.general.8
  7696. ;
  7697. ;-----------------------------------
  7698. ;
  7699. pe.cnst.cnst:
  7700.     lhld    ste.A.address
  7701.     xchg
  7702.     lhld    ste.B.address
  7703.     lda    curr.expr.oprtr
  7704.     cpi    rwix.eql
  7705.     jnz    pe.c.c.not.eql
  7706. ;
  7707.     call    cmp.de.fm.hl
  7708.     jz    pe.TRUE
  7709.     jmp    pe.FALSE
  7710. ;
  7711. pe.c.c.not.eql:
  7712.     cpi    rwix.neq
  7713.     jnz    pe.c.c.not.neq
  7714. ;
  7715.     call    cmp.de.fm.hl
  7716.     jnz    pe.TRUE
  7717.     JMP    pe.FALSE
  7718. ;
  7719. pe.c.c.not.neq:
  7720.     cpi    rwix.gtr
  7721.     jnz    pe.c.c.not.gtr
  7722. ;
  7723.     call    cmp.de.fm.hl
  7724.     jc    pe.TRUE
  7725.     jmp    pe.FALSE
  7726. ;
  7727. pe.c.c.not.gtr:
  7728.     cpi    rwix.geq
  7729.     jnz    pe.c.c.not.geq
  7730. ;
  7731.     call    cmp.hl.fm.de
  7732.     jc    pe.FALSE
  7733.     jmp    pe.TRUE
  7734. ;
  7735. pe.c.c.not.geq:
  7736.     cpi    rwix.lss
  7737.     jnz    pe.c.c.not.lss
  7738. ;
  7739.     call    cmp.de.fm.hl
  7740.     jc    pe.FALSE
  7741.     jmp    pe.TRUE
  7742. ;
  7743. pe.c.c.not.lss:
  7744.     cpi    rwix.leq
  7745.     jnz    pe.c.c.not.leq
  7746. ;
  7747.     call    cmp.hl.fm.de
  7748.     jc    pe.TRUE
  7749.     jmp    pe.FALSE
  7750. ;
  7751. pe.c.c.not.leq:
  7752.     cpi    rwix.AND
  7753.     jnz    pe.c.c.not.AND
  7754. ;
  7755.     call    AND.d.and.h
  7756.     jmp    pe.cnst.16.bit
  7757. ;
  7758. pe.c.c.not.AND:
  7759.     cpi    rwix.OR
  7760.     jnz    pe.c.c.not.OR
  7761. ;
  7762.     call    OR.d.and.h
  7763.     jmp    pe.cnst.16.bit
  7764. ;
  7765. pe.c.c.not.OR:
  7766.     cpi    rwix.XOR
  7767.     jnz    pe.c.c.not.XOR
  7768. ;
  7769.     call    XOR.d.and.h
  7770.     jmp    pe.cnst.16.bit
  7771. ;
  7772. pe.c.c.not.XOR:
  7773.     jmp    err.inv.oprtr
  7774. ;
  7775. ;------------------------------
  7776. ;
  7777. pe.cnst.BYTE:
  7778.     lda    curr.expr.oprtr
  7779.     cpi    rwix.eql
  7780.     jz    pe.cnst.BYTE.ok
  7781.     cpi    rwix.neq
  7782.     jnz    pe.cnst.BYTE.reject
  7783. pe.cnst.BYTE.ok:
  7784.     lda    ste.A.address
  7785.     ora    a
  7786.     jz    pe.0.BYTE
  7787.     dcr    a
  7788.     jz    pe.1.BYTE
  7789.     inr    a
  7790.     inr    a
  7791.     jz    pe.ff.byte
  7792.     jmp    pe.cnst.BYTE.reject
  7793. ;
  7794. pe.0.BYTE:
  7795.     call    put.LDA.B
  7796.     call    put.ORA.A
  7797.     jmp    pe.cnst.BYTE.cont
  7798. ;
  7799. pe.1.BYTE:
  7800.     call    put.LDA.B
  7801.     call    put.DCR.A
  7802.     jmp    pe.cnst.BYTE.cont
  7803. ;
  7804. pe.ff.BYTE:
  7805.     call    put.LDA.B
  7806.     call    put.INR.A
  7807. pe.cnst.BYTE.cont:
  7808.     lda    curr.expr.oprtr
  7809.     cpi    rwix.neq
  7810.     jz    put.JNZ.true
  7811.     jmp    put.JZ.true
  7812. ;
  7813. ;-----------------------------------
  7814. ;
  7815. pe.general.8:
  7816.     lda    A.word.type
  7817.     ani    wtp.cnst
  7818.     jnz    pe.cnst.BYTE
  7819. pe.cnst.BYTE.reject:
  7820.     call    switch.expr.oprtr
  7821.     db rwix.neq        ! dw pe.g8.neq
  7822.     db rwix.leq        ! dw pe.g8.leq
  7823.     db rwix.lss        ! dw pe.g8.lss
  7824.     db rwix.eql        ! dw pe.g8.eql
  7825.     db rwix.gtr        ! dw pe.g8.gtr
  7826.     db rwix.geq        ! dw pe.g8.geq
  7827.     db rwix.AND        ! dw pe.g8.AND
  7828.     db rwix.OR        ! dw pe.g8.OR
  7829.     db rwix.XOR        ! dw pe.g8.XOR
  7830.     db    0        ! dw pe.g8.oprtr.err
  7831. pe.g8.oprtr.err:
  7832.     call    err.inv.oprtr
  7833. ;
  7834. ;
  7835. pe.g8.neq:
  7836.     call    fall.thru.swap
  7837. pe.g8.eql:
  7838.     call    pe.g8.get.A
  7839.     lda    B.word.type
  7840.     ani    wtp.cnst
  7841.     jz    pe.g8.eql.go
  7842. ;
  7843.     lda    ste.B.address
  7844.     ora    a
  7845.     jz    pe.g8.eql.0
  7846.     dcr    a
  7847.     jz    pe.g8.eql.1
  7848.     inr    a
  7849.     inr    a
  7850.     jz    pe.g8.eql.ff
  7851. ;
  7852. pe.g8.eql.go:
  7853.     call    pe.g8.cmp.B
  7854.     jmp    put.JZ.true
  7855. ;
  7856. pe.g8.eql.0:
  7857.     call    put.ORA.A
  7858.     jmp    put.JZ.true
  7859. ;
  7860. pe.g8.eql.1:
  7861.     call    put.DCR.A
  7862.     jmp    put.JZ.true
  7863. ;
  7864. pe.g8.eql.ff:
  7865.     call    put.INR.A
  7866.     jmp    put.JZ.true
  7867. ;
  7868. pe.g8.lss:
  7869.     call    fall.thru.swap
  7870. pe.g8.geq:
  7871.     call    pe.g8.get.A
  7872.     call    pe.g8.cmp.B
  7873.     jmp    put.JNC.true
  7874. ;
  7875. ;
  7876. pe.g8.leq:
  7877.     call    fall.thru.swap
  7878. pe.g8.gtr:
  7879.     call    swap.curr.expr
  7880.     call    pe.g8.get.A
  7881.     call    pe.g8.cmp.B
  7882.     jmp    put.JC.true
  7883. ;
  7884. ;
  7885. ;
  7886. ;-----------------------------------
  7887. ;
  7888. ;
  7889. pe.g8.get.A:
  7890.     lda    A.word.type
  7891.     ani    wtp.cnst
  7892.     jnz    put.MVI.A.A
  7893. ;
  7894.     lda    ste.A.type
  7895.     cpi    stet.BYTE
  7896.     jz    put.LDA.A
  7897. ;
  7898.     cpi    stet.spcl.byte.ptr
  7899.     cnz    err.inv.var.type
  7900.     call    put.LHLD.A
  7901.     jmp    put.MOV.A.M
  7902. ;
  7903. ;
  7904. pe.g8.cmp.B:
  7905.     lda    B.word.type
  7906.     ani    wtp.cnst
  7907.     jnz    put.CPI.B
  7908. ;
  7909.     lda    ste.B.type
  7910.     cpi    stet.BYTE
  7911.     jz    pe.g8.cmp.B.BYTE
  7912.     cpi    stet.spcl.byte.ptr
  7913.     jz    pe.g8.cmp.B.BP
  7914.     call    err.inv.var.type
  7915. ;
  7916. pe.g8.cmp.B.BYTE:
  7917.     call    put.LXI.H.B
  7918.     jmp    put.CMP.M
  7919. ;
  7920. pe.g8.cmp.B.BP:
  7921.     call    put.LHLD.B
  7922.     jmp    put.CMP.M
  7923. ;
  7924. ;-----------------------------------
  7925. ;
  7926. pe.g8.AND:
  7927.     call    pe.g8.get.A
  7928. ;
  7929.     lda    B.word.type
  7930.     ani    wtp.cnst
  7931.     jnz    pe.g8.AND.cnst
  7932. ;
  7933.     lda    ste.B.type
  7934.     cpi    stet.BYTE
  7935.     jz    pe.g8.AND.BYTE
  7936.     cpi    stet.spcl.byte.ptr
  7937.     jz    pe.g8.AND.BP
  7938.     call    err.inv.var.type
  7939. ;
  7940. pe.g8.AND.cnst:
  7941.     call    put.ANI.B
  7942.     jmp    put.JNZ.true
  7943. ;
  7944. pe.g8.AND.BYTE:
  7945.     call    put.LXI.H.B
  7946.     call    put.ANA.M
  7947.     jmp    put.JNZ.true
  7948. ;
  7949. pe.g8.AND.BP:
  7950.     call    put.LHLD.B
  7951.     call    put.ANA.M
  7952.     jmp    put.JNZ.true
  7953. ;
  7954. ;
  7955. ;
  7956. pe.g8.OR:
  7957.     call    pe.g8.get.A
  7958. ;
  7959.     lda    B.word.type
  7960.     ani    wtp.cnst
  7961.     jnz    pe.g8.OR.cnst
  7962. ;
  7963.     lda    ste.B.type
  7964.     cpi    stet.BYTE
  7965.     jz    pe.g8.OR.BYTE
  7966.     cpi    stet.spcl.byte.ptr
  7967.     jz    pe.g8.OR.BP
  7968.     call    err.inv.var.type
  7969. ;
  7970. ;
  7971. pe.g8.OR.cnst:
  7972.     call    put.ORI.B
  7973.     jmp    put.JNZ.true
  7974. ;
  7975. ;
  7976. pe.g8.OR.BYTE:
  7977.     call    put.LXI.H.B
  7978.     call    put.ORA.M
  7979.     jmp    put.JNZ.true
  7980. ;
  7981. ;
  7982. pe.g8.OR.BP:
  7983.     call    put.LHLD.B
  7984.     call    put.ORA.M
  7985.     jmp    put.JNZ.true
  7986. ;
  7987. ;
  7988. ;
  7989. ;
  7990. ;
  7991. pe.g8.XOR:
  7992.     call    pe.g8.get.A
  7993. ;
  7994.     lda    B.word.type
  7995.     ani    wtp.cnst
  7996.     jnz    pe.g8.XOR.cnst
  7997. ;
  7998.     lda    ste.B.type
  7999.     cpi    stet.BYTE
  8000.     jz    pe.g8.XOR.BYTE
  8001.     cpi    stet.spcl.byte.ptr
  8002.     jz    pe.g8.XOR.BP
  8003.     call    err.inv.var.type
  8004. ;
  8005. ;
  8006. pe.g8.XOR.cnst:
  8007.     call    put.XRI.B
  8008.     jmp    put.JNZ.true
  8009. ;
  8010. ;
  8011. pe.g8.XOR.BYTE:
  8012.     call    put.LXI.H.B
  8013.     call    put.XRA.M
  8014.     jmp    put.JNZ.true
  8015. ;
  8016. ;
  8017. pe.g8.XOR.BP:
  8018.     call    put.LHLD.B
  8019.     call    put.XRA.M
  8020.     jmp    put.JNZ.true
  8021. ;
  8022. ;
  8023. ;
  8024. ;
  8025. ;-----------------------------------
  8026. ;
  8027. ;
  8028. ;
  8029. pe.general.16:
  8030.     lda    A.word.type    ;if one is cnst, make it B
  8031.     ani    wtp.cnst
  8032.     jnz    pe.g16.swap
  8033.     lda    curr.expr.oprtr
  8034.     cpi    rwix.gtr
  8035.     jz    pe.g16.swap
  8036.     cpi    rwix.leq
  8037.     jnz    pe.g16.no.swap
  8038. pe.g16.swap:
  8039.     call    swap.curr.expr
  8040. pe.g16.no.swap:
  8041.     lda    B.word.type
  8042.     ani    wtp.cnst
  8043.     jnz    pe.g16.B.cnst
  8044. ;
  8045.     call    switch.B
  8046.     db stet.BYTE        ! dw pe.g16.B.BYTE
  8047.     db stet.WORD        ! dw pe.g16.B.WORD
  8048.     db stet.spcl.byte.ptr    ! dw pe.g16.B.BP
  8049.     db stet.spcl.word.ptr    ! dw pe.g16.B.WP
  8050.     db    0        ! dw pe.g16.B.err
  8051. ;
  8052. pe.g16.B.err:
  8053.     call    err.inv.var.type
  8054. ;
  8055. pe.g16.B.BYTE:
  8056. pe.g16.B.WORD:
  8057.     call    put.get.B.into.HL
  8058.     call    put.XCHG
  8059.     jmp    pe.g16.got.B
  8060. ;
  8061. ;
  8062. ;-----one operand is constant - check if zero-----
  8063. pe.g16.B.cnst:
  8064.     lhld    ste.B.address
  8065.     mov    a,h
  8066.     ora    l
  8067.     jnz    pe.g16.B.not.0.cnst
  8068. ;---it's zero - check operation---
  8069.     call    switch.expr.oprtr
  8070.     db rwix.AND        ! dw pe.FALSE
  8071.     db rwix.gtr        ! dw pe.FALSE
  8072.     db rwix.geq        ! dw pe.TRUE
  8073.     db    0        ! dw pe.cnst.eval
  8074. pe.cnst.eval:
  8075. ;---some kind of evaluation needs to be done---
  8076.     call    put.get.A.into.HL
  8077.     call    put.MOV.A.H
  8078.     call    put.ORA.L
  8079.     call    switch.expr.oprtr
  8080.     db rwix.leq        ! dw put.JZ.true
  8081.     db rwix.eql        ! dw put.JZ.true
  8082.     db rwix.neq        ! dw put.JNZ.true
  8083.     db rwix.XOR        ! dw put.JNZ.true
  8084.     db rwix.OR        ! dw put.JNZ.true
  8085.     db    0        ! dw err.inv.oprtr
  8086. ;
  8087. pe.g16.B.not.0.cnst:
  8088.     call    put.LXI.D.B
  8089.     jmp    pe.g16.got.B
  8090. ;
  8091. ;
  8092. pe.g16.B.BP:
  8093.     call    put.LHLD.B
  8094.     call    put.mv.@HLB.to.DE
  8095.     jmp    pe.g16.got.B
  8096. ;
  8097. ;
  8098. pe.g16.B.WP:
  8099.     call    put.LHLD.B
  8100.     call    put.mv.@HL.to.DE
  8101. ;
  8102. ;
  8103. pe.g16.got.B:
  8104.     call    put.get.A.into.HL
  8105.     lda    curr.expr.oprtr
  8106.     cpi    rwix.AND
  8107.     jz    pe.g16.AND
  8108.     cpi    rwix.OR
  8109.     jz    pe.g16.OR
  8110.     cpi    rwix.XOR
  8111.     jz    pe.g16.XOR
  8112. ;
  8113.     call    put.cmp.16
  8114. ;
  8115.     call    switch.expr.oprtr
  8116.     db rwix.lss        ! dw pe.g16.lss
  8117.     db rwix.eql        ! dw pe.g16.eql
  8118.     db rwix.neq        ! dw pe.g16.neq
  8119.     db rwix.geq        ! dw pe.g16.geq
  8120.     db    0        ! dw pe.g16.oprtr.err
  8121. pe.g16.oprtr.err:
  8122. ;            ; gtr & leq already converted
  8123.     call    err.inv.oprtr
  8124. ;
  8125. ;
  8126. pe.g16.lss:
  8127.     jmp    put.JC.true
  8128. ;
  8129. pe.g16.eql:
  8130.     jmp    put.JZ.true
  8131. ;
  8132. pe.g16.neq:
  8133.     jmp    put.JNZ.true
  8134. ;
  8135. pe.g16.geq:
  8136.     jmp    put.JNC.true
  8137. ;
  8138. ;
  8139. pe.g16.AND:
  8140.     call    put.AND.16
  8141.     jmp    put.JNZ.true
  8142. ;
  8143. ;
  8144. pe.g16.OR:
  8145.     call    put.OR.16
  8146.     jmp    put.JNZ.true
  8147. ;
  8148. ;
  8149. pe.g16.XOR:
  8150.     call    put.XOR.16
  8151.     jmp    put.JNZ.true
  8152. ;
  8153. ;
  8154. ;
  8155. ;-----------------------------------
  8156. ;
  8157. pe.general.string:
  8158.     call    switch.expr.oprtr
  8159.     db rwix.leq        ! dw pe.gs.swap
  8160.     db rwix.gtr        ! dw pe.gs.swap
  8161.     db    0        ! dw pe.gs.no.swap
  8162. pe.gs.swap:
  8163.     call    swap.curr.expr
  8164. pe.gs.no.swap:
  8165.     lda    ste.B.type
  8166.     cpi    stet.FIELD
  8167.     jz    pe.STRING.FIELD
  8168. ;
  8169.     lda    A.word.type
  8170.     ani    wtp.string
  8171.     cnz    put.inline.A.string
  8172. ;
  8173.     call    switch.A
  8174.     db stet.STRING        ! dw pe.gs.A.str
  8175.     db stet.spcl.string.ptr    ! dw pe.gs.A.SP
  8176.     db stet.FIELD        ! dw pe.STRING.FIELD
  8177.     db    0        ! dw pe.gs.A.err
  8178. pe.gs.A.err:
  8179.     call    err.inv.var.type
  8180. pe.gs.A.str:
  8181.     call    put.LXI.D.A
  8182.     jmp    pe.gs.got.A
  8183. ;
  8184. ;
  8185. pe.gs.A.SP:
  8186.     call    put.LHLD.A
  8187.     call    put.XCHG
  8188. ;
  8189. ;
  8190. pe.gs.got.A:
  8191. ;---check for LENGTH---
  8192.     xra    a
  8193.     sta    pe.gs.blk.cmp
  8194.     lda    rsvd.wd.ix
  8195.     cpi    rwix.LENGTH
  8196.     jnz    pe.GS.no.length
  8197. ;
  8198.     call    get.word
  8199.     call    get.var.C.word
  8200.     mvi    a,0ffh
  8201.     sta    pe.gs.blk.cmp
  8202.     lda    C.word.type
  8203.     ani    wtp.cnst
  8204.     jz    pe.gs.C.not.cnst
  8205.     call    put.LXI.B.C
  8206.     jmp    pe.gs.no.length
  8207. ;
  8208. pe.gs.C.not.cnst:
  8209.     call    put.get.C.into.HL
  8210.     call    put.mv.HL.to.BC
  8211. ;
  8212. pe.gs.no.length:
  8213.     lda    B.word.type
  8214.     ani    wtp.string
  8215.     cnz    put.inline.B.string
  8216. ;
  8217.     call    switch.B
  8218.     db stet.STRING        ! dw pe.gs.B.str
  8219.     db stet.spcl.string.ptr    ! dw pe.gs.B.sp
  8220.     db    0        ! dw pe.gs.B.err
  8221. pe.gs.B.err:
  8222.     call    err.inv.var.type
  8223. pe.gs.B.str:
  8224.     call    put.LXI.H.B
  8225.     jmp    pe.gs.got.B
  8226. ;
  8227. ;
  8228. pe.gs.B.SP:
  8229.     call    put.LHLD.B
  8230.     jmp    pe.gs.got.B
  8231. ;
  8232. ;
  8233. ;
  8234. pe.gs.got.B:
  8235.     lda    pe.gs.blk.cmp
  8236.     ora    a
  8237.     jz    pe.gs.str.cmp
  8238.     call    put.cmp.blk
  8239.     jmp    pe.STR.REC.oprtr
  8240. ;
  8241. pe.gs.str.cmp:
  8242.     call    put.cmp.str
  8243. ;
  8244. pe.STR.REC.oprtr:
  8245.     call    switch.expr.oprtr
  8246.     db rwix.lss        ! dw put.JC.true
  8247.     db rwix.eql        ! dw put.JZ.true
  8248.     db rwix.neq        ! dw put.JNZ.true
  8249.     db rwix.geq        ! dw put.JNC.true
  8250.     db    0        ! dw err.inv.oprtr
  8251. ;
  8252. ;
  8253. ;
  8254. ;
  8255. pe.gs.blk.cmp:
  8256.     db    0
  8257. ;
  8258. ;
  8259. ;
  8260. ;
  8261. ;-----------------------------------
  8262. ;
  8263. pe.general.BCD:
  8264.     call    switch.expr.oprtr
  8265.     db rwix.leq        ! dw pe.gBCD.swap
  8266.     db rwix.gtr        ! dw pe.gBCD.swap
  8267.     db    0        ! dw pe.gBCD.no.swap
  8268. pe.gBCD.swap:
  8269.     call    swap.curr.expr
  8270. pe.gBCD.no.swap:
  8271.     lda    A.word.type
  8272.     ani    wtp.cnst
  8273.     lxi    h,sym.tbl.entry.A
  8274.     cnz    put.inline.BCD
  8275. ;
  8276.     call    switch.A
  8277.     db stet.BCD        ! dw pe.gBCD.A.BCD
  8278.     db stet.spcl.BCD.ptr    ! dw pe.gBCD.A.BCDP
  8279.     db    0        ! dw pe.gBCD.A.err
  8280. pe.gBCD.A.err:
  8281.     call    err.inv.var.type
  8282. pe.gBCD.A.BCD:
  8283.     call    put.LXI.D.A
  8284.     jmp    pe.gBCD.got.A
  8285. ;
  8286. ;
  8287. pe.gBCD.A.BCDP:
  8288.     call    put.LHLD.A
  8289.     call    put.XCHG
  8290.     jmp    pe.gBCD.got.A
  8291. ;
  8292. ;
  8293. ;
  8294. pe.gBCD.got.A:
  8295.     lda    B.word.type
  8296.     ani    wtp.cnst
  8297.     lxi    h,sym.tbl.entry.B
  8298.     cnz    put.inline.BCD
  8299. ;
  8300.     call    switch.B
  8301.     db stet.BCD        ! dw pe.gBCD.B.BCD
  8302.     db stet.spcl.BCD.ptr    ! dw pe.gBCD.B.BCDP
  8303.     db    0        ! dw pe.gBCD.B.err
  8304. pe.gBCD.B.err:
  8305.     call    err.inv.var.type
  8306. pe.gBCD.B.BCD:
  8307.     call    put.LXI.H.B
  8308.     jmp    pe.gBCD.got.B
  8309. ;
  8310. ;
  8311. pe.gBCD.B.BCDP:
  8312.     call    put.LHLD.B
  8313.     jmp    pe.gBCD.got.B
  8314. ;
  8315. ;
  8316. ;
  8317. pe.gBCD.got.B:
  8318.     call    put.cmp.BCD
  8319. ;
  8320.     call    switch.expr.oprtr
  8321.     db rwix.lss        ! dw put.JC.true
  8322.     db rwix.eql        ! dw put.JZ.true
  8323.     db rwix.neq        ! dw put.JNZ.true
  8324.     db rwix.geq        ! dw put.JNC.true
  8325.     db    0        ! dw err.inv.oprtr
  8326. ;
  8327. ;
  8328. ;
  8329. ;-----------------------------------
  8330. ;
  8331. ;
  8332. pe.BYTE.only:
  8333.     call    put.LDA.A
  8334.     call    put.ORA.A
  8335.     jmp    put.JNZ.true
  8336. ;
  8337. ;
  8338. ;
  8339. ;-----------------------------------
  8340. ;
  8341. ;
  8342. ;
  8343. put.JNZ.true:
  8344.     call    fall.thru.swap
  8345. ;
  8346. ;
  8347. put.JZ.true:
  8348.     lda    fall.thru.true
  8349.     ora    a
  8350.     jnz    put.JZ.true.swapped
  8351.     call    put.JZ
  8352.     jmp    put.expr.jmp.addr
  8353. put.JZ.true.swapped:
  8354.     call    put.JNZ
  8355. put.expr.jmp.addr:
  8356.     lda    no.fall.thru.fwd.flag
  8357.     ora    a
  8358.     jnz    put.jmp.addr.fwd
  8359.     lhld    no.fall.thru.addr
  8360.     jmp    put.code.word
  8361. ;
  8362. put.jmp.addr.fwd:
  8363.     lda    curr.fwd.no.fall.thru
  8364.     jmp    put.fwd.ref.bir
  8365. ;
  8366. ;
  8367. put.JC.true:
  8368.     lda    fall.thru.true
  8369.     ora    a
  8370.     jnz    put.JC.true.swapped
  8371.     call    put.JC
  8372.     jmp    put.expr.jmp.addr
  8373. put.JC.true.swapped:
  8374.     call    put.JNC
  8375.     jmp    put.expr.jmp.addr
  8376. ;
  8377. ;
  8378. put.JNC.true:
  8379.     call    fall.thru.swap
  8380.     jmp    put.JC.true
  8381. ;
  8382. ;
  8383. ;
  8384. ;
  8385. ;-----------------------------------
  8386. ;
  8387. ;
  8388. ;
  8389. pe.WORD.only:
  8390.     call    put.LHLD.A
  8391.     call    put.MOV.A.L
  8392.     call    put.ORA.H
  8393.     jmp    put.JNZ.true
  8394. ;
  8395. ;
  8396. ;
  8397. ;-----------------------------------
  8398. ;
  8399. ;
  8400. ;
  8401. swap.curr.expr:
  8402.     lxi    h,sym.tbl.entry.A
  8403.     lxi    d,symbol.table.entry
  8404.     call    move.sym.tbl.entry
  8405. ;
  8406.     lxi    h,sym.tbl.entry.B
  8407.     lxi    d,sym.tbl.entry.A
  8408.     call    move.sym.tbl.entry
  8409. ;
  8410.     lxi    h,symbol.table.entry
  8411.     lxi    d,sym.tbl.entry.B
  8412.     call    move.sym.tbl.entry
  8413. ;
  8414.     lda    A.word.type
  8415.     mov    b,a
  8416.     lda    B.word.type
  8417.     sta    A.word.type
  8418.     mov    a,b
  8419.     sta    B.word.type
  8420. ;
  8421.     call    switch.expr.oprtr
  8422.     db rwix.gtr        ! dw sce.lss
  8423.     db rwix.geq        ! dw sce.leq
  8424.     db rwix.lss        ! dw sce.gtr
  8425.     db rwix.leq        ! dw sce.geq
  8426.     db    0        ! dw sce.null
  8427. ;
  8428. sce.lss:
  8429.     mvi    a,rwix.lss
  8430.     jmp    sce.exit
  8431. ;
  8432. sce.leq:
  8433.     mvi    a,rwix.leq
  8434.     jmp    sce.exit
  8435. ;
  8436. sce.geq:
  8437.     mvi    a,rwix.geq
  8438.     jmp    sce.exit
  8439. ;
  8440. sce.gtr:
  8441.     mvi    a,rwix.gtr
  8442. sce.exit:
  8443.     sta    curr.expr.oprtr
  8444. sce.null:
  8445.     ret
  8446. ;
  8447. ;
  8448. ;
  8449. ;
  8450. ;
  8451. fall.thru.swap:
  8452.     lda    fall.thru.true
  8453.     cma
  8454.     sta    fall.thru.true
  8455.     ret
  8456. ;
  8457. ;
  8458. ;
  8459. ;
  8460. ;
  8461. ;
  8462. ;
  8463. ;
  8464. ;
  8465. ;
  8466. ;
  8467. ;
  8468. ;---------END OF 'LSTMT.ASM' SOURCE-CODE SEGMENT---------
  8469.