home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol071 / promain.src < prev    next >
Text File  |  1984-04-29  |  12KB  |  804 lines

  1. ; Pascal/Z run-time support interface -- WITH PROFILER
  2. ; COPYRIGHT 1978, 1979, 1980, 1981 BY JEFF MOSKOW
  3.     NAME MAIN
  4.     ENTRY .FLTERR,.HPERR,.REFERR,.STKERR,.RNGERR,.DIVERR,.MLTERR,L98,.CRLF
  5.     ENTRY .PERROR,.STMTMSG,.CHIN$,.STRERR,.MAXOUT,.MXOUT,.MXUT1,.STRMSG
  6.     ENTRY .START
  7.     EXT .ILDV,.ILDV1,.ILDV2,.ILD1,.ILD11,.ILD12,.ILD2,.ILD21
  8.     EXT .ILD22
  9.     EXT .ISTR,.ISTR1,.ISTR2,.XADDR,.YADDR,.FSUB,.FADD,.ENTRSC,.ENTER
  10.     EXT .EXITF,.FPEQ,.SEQUL,.FPNEQ,.SNE,.FPLTE,.SLE,.ILE,.FPLT,.SLT,.ILT
  11.     EXT .FPGTE,.SGE,.IGE,.FPGT,.SGT,.IGT,.FMULT,.IMULT,.QMULT,.IDIVD,.IMOD
  12.     EXT .NCDVD,.NCMOD,.ERROR,.CSTS,.CI,.CO,.CHKDE,.CHKHL,.PSTAT,.CONSET
  13.     EXT .RCSET,.UNION,.INN,.LTEQ
  14.     EXT .GTEQ,.INSECT,.ORGAN,.COMP,.FUSS,.FOUT,.FXDCVT,.CVTFLT,.TOUT
  15.     EXT .TXTYP 
  16.     EXT .FDIVD,.STREQL,.STRNQL,.STRLEQ,.STRLSS,.STRGEQ,.STRGRT,.LAST
  17.     EXT    .WRITELN,L109,L110,L111,L112,L115,L116,L117,L118,L120
  18.     EXT    .READLN,L121,L122,L123,L124,L125,L126,L127,L128,L129
  19.     EXT    .WRITE,L130,L131,L132,L133,L134,L135,L136,L0
  20.     EXT    .READ,L137,.ABS,.FPABS,.SQR,.FPSQR,.EOLN,.EOF,.RESET,.REWRITE
  21.     EXT    .FTXTIN,.CHAIN,.NEW,.MARK,.RELEASE,.TRUNC,.ROUND,.ARCTAN,.COS
  22.     EXT    .EXPFCT,.LN,.SQRT,.SIN
  23. R:    SET    0FFFFH
  24. C:    SET    0FFFFH
  25. M:    SET    0FFFFH
  26. S:    SET    0FFFFH
  27. D:    SET    0FFFFH
  28. E:    SET    00000H
  29. F:    SET    0FFFFH
  30. T:    SET    00000H
  31. VALID:    SET    00000H
  32. FIRSTMT SET    00000H ; NO 'STMT' CALLS YET
  33. MINSTMT SET    00000H ; LOWEST, HIGHEST TRACED
  34. MAXSTMT SET    00000H ; ..STATEMENT NUMBERS
  35. .MAXOUT EQU    4
  36. .MXOUT    EQU    .MAXOUT*256
  37. .MXUT1    EQU    .MXOUT*2
  38. CR    EQU    13
  39. LF    EQU    10
  40. EOFMRK    EQU    1AH
  41. BUFLEN    EQU    80
  42. TOPFRM    EQU    .MAXOUT+.MAXOUT+BUFLEN+3+1
  43. MARGIN    EQU    50
  44. COMPILER EQU    0H
  45. MAXDRV    EQU    16
  46. CPM    EQU    5
  47. .START: MVI    C,25
  48.     CALL    CPM
  49.     LHLD    6
  50.     DCX    H
  51.     MOV    M,A
  52.     LXI    B,0
  53.     LXI    H,.LAST
  54.     EXX
  55.     LHLD    6
  56.     LXI    D,0-TOPFRM-1
  57.     DAD    D
  58.     PUSH    H
  59.     PUSH    H
  60.     POP    X
  61.     POP    Y
  62.     SPHL
  63.     MVI    B,.MAXOUT*2+1
  64.     XRA    A
  65. CLRSTK: MOV    M,A
  66.     INX    H
  67.     DJNZ    CLRSTK
  68.     INX    H
  69.     MOV    M,A
  70.     LXI    H,80H
  71.     MOV    A,M
  72.     CPI    2
  73.     JRC    NOCOM
  74.     MOV    B,M
  75.     DCR    B
  76.     INX    H
  77. INITLP    INX    H
  78.     MOV    C,M
  79.     CALL    .TOUT
  80.     DJNZ    INITLP
  81. NOCOM    MVI    C,CR
  82.     CALL    .TOUT
  83. ; code to clear the profile table to zero
  84.     lbcd    proclear    ; bytes in stmt buckets
  85.     lxi    h,proftab    ; start of bucket area
  86.     mvi    m,00h        ; begin zeros
  87.     lxi    d,proftab+1
  88.     ldir            ; propogate zero
  89. ; end inserted code
  90.     JMP    L99
  91. ; code inserted to increment a statement count
  92. .profinc:
  93.     push    psw
  94.     push    b
  95.     push    h
  96.     lhld    profset     ; -(lowest number)
  97.     dad    b        ; relative stmt number
  98.     dad    h        ; relative byte
  99.     lxi    b,proftab    ; base address
  100.     dad    b        ; hl->stmt bucket
  101.     mov    b,m        ; pick up stmt's counter
  102.     inx    h
  103.     mov    c,m
  104.     inx    b        ; ..increment,
  105.     mov    m,c        ; ..put back
  106.     dcx    h
  107.     mov    m,b
  108.     pop    h
  109.     pop    b
  110.     pop    psw
  111.     ret
  112. ; end of insertion
  113. FINI:    MACRO    ; as modified to write profile table
  114.     mvi    c,19
  115.     lxi    d,profile
  116.     call    cpm        ; erase existing profile
  117.     mvi    c,22
  118.     lxi    d,profile
  119.     call    cpm        ; create 'A:PROFILER.DAT'
  120.     lxi    h,proferr
  121.     inr    a
  122.     jz    .ERROR        ; -- make failed
  123.     lxi    h,prodata    ; hl->next record
  124.     lda    pronio
  125.     mov    b,a        ; b=record count
  126. profout:
  127.     xchg            ; de->next record
  128.     push    d        ; (save it)
  129.     mvi    c,26
  130.     push    b        ; (save loop count)
  131.     call    cpm        ; set buffer address
  132.     lxi    d,profile
  133.     mvi    c,21
  134.     call    cpm        ; write one record
  135.     lxi    h,proferr
  136.     ora    a
  137.     jnz    .ERROR
  138.     pop    b
  139.     pop    h
  140.     lxi    d,128
  141.     dad    d        ; hl->next record
  142.     djnz    profout     ; repeat for all sectors
  143. ;
  144.     lxi    d,profile
  145.     mvi    c,16
  146.     call    cpm        ; close file
  147.     lxi    h,proferr
  148.     inr    a
  149.     jz    .ERROR
  150. ; end of insertion
  151.     JMP    L0
  152. ; the profile work areas
  153. proferr:    ; error message for make, write, close
  154.     dbs    'Error writing A:PROFILE.DAT'
  155. profile:    ; file control block: A:PROFILER.DAT
  156.     db    1,'PROFILER','DAT',0,0,0,0
  157.     dw    0,0,0,0,0,0,0,0
  158.     db    0,0,0,0
  159. ; the following definitions have to be at the end of
  160. ; the program, following the last set of MAX/MINSTMT.
  161.     IF    MINSTMT
  162. pronums set    MAXSTMT-MINSTMT+1 ; number of traced stmts
  163.     ELSE
  164. pronums set    0
  165.     ENDIF
  166. prosize set    pronums*2    ; bytes of stmt buckets
  167. prorecs set    prosize+6    ; allow for count, lo, hi
  168. prorecs set    prorecs+127    ; round to logical sector
  169. prorecs set    prorecs/128    ; number of logical sectors
  170. ;
  171.     IF    PRONUMS
  172. proclear dw    prosize     ; for clearing the array
  173.     ELSE
  174. proclear set    2
  175.     ENDIF
  176. profset dw    -MINSTMT    ; for addressing buckets
  177. pronio    db    prorecs     ; for write-loop
  178. ;
  179. prodata equ    $        ; start of profiler.dat
  180. promsb    set    pronums/256
  181. prolsb    set    promsb*256
  182. prolsb    set    pronums-prolsb
  183.     db    promsb,prolsb    ; integer number of stmts
  184. promsb    set    MINSTMT/256
  185. prolsb    set    promsb*256
  186. prolsb    set    MINSTMT-prolsb
  187.     db    promsb,prolsb    ; int. lowest stmt number
  188. promsb    set    MAXSTMT/256
  189. prolsb    set    promsb*256
  190. prolsb    set    MAXSTMT-prolsb
  191.     db    promsb,prolsb    ; int. highest ditto
  192. proftab ds    prosize     ; statement buckets
  193.     db    0        ; force .rel file to size
  194. ; end of insertion
  195.     END    .START
  196.     ENDMAC
  197. EXTD:    MACRO    INTN,EXTN
  198.     EXT    EXTN
  199. INTN:    equ    EXTN
  200.     ENDMAC
  201. SPSH:    MACRO    Q,SIZE
  202.     IF    SIZE
  203.     IF    SIZE&8000H
  204.     LXI    H,SIZE
  205.     DAD    S
  206.     SPHL
  207.     ELSE
  208.     MVI    A,SIZE
  209.     CMP    M
  210.     JC    .STRERR
  211.     MOV    B,A
  212.     INR    B
  213. PSHLP:    SET    $
  214.     MOV    D,M
  215.     PUSH    D
  216.     INX    S
  217.     DCX    H
  218.     DJNZ    PSHLP
  219.     XRA    A
  220.     ENDIF
  221.     ENDIF
  222.     ENDMAC
  223. MLOAD:    MACRO    WHERE,VALUE
  224.     IF    VALUE
  225.     IF    VALUE&0FF00H
  226.     LXI    B,VALUE
  227.     CALL    WHERE!2
  228.     ELSE
  229.     MVI    C,VALUE
  230.     CALL    WHERE!1
  231.     ENDIF
  232.     ELSE
  233.     CALL    WHERE
  234.     ENDIF
  235.     ENDMAC
  236. ILOD:    MACRO    Q,SIZE,OFST
  237.     IF    SIZE&8000H
  238.     MLOAD    .ILDV,OFST
  239.     ELSE
  240.     IF    SIZE-1
  241.     MLOAD    .ILD2,OFST
  242.     ELSE
  243.     MLOAD    .ILD1,OFST
  244.     ENDIF
  245.     ENDIF
  246.     ENDMAC
  247. ISTR:    MACRO    Q,SIZE,OFST
  248.     MLOAD    .ISTR,OFST
  249.     IF    R
  250.     JC    .REFERR
  251.     ENDIF
  252.     ENDMAC
  253. LPOP:    MACRO    REG,DISTANCE
  254.     IF    DISTANCE
  255.     PUSH    H
  256.     LXI    H,DISTANCE+2
  257.     DAD    S
  258.     MOV    E,M
  259.     INX    H
  260.     MOV    D,M
  261.     PUSH    D
  262.     MOV    D,H
  263.     MOV    E,L
  264.     DCX    H
  265.     DCX    H
  266.     LXI    B,DISTANCE
  267.     LDDR
  268.     POP    D
  269.     POP    H
  270.     POP    B
  271.     ELSE
  272.     POP    D
  273.     ENDIF
  274.     ENDMAC
  275. LPUSH:    MACRO    REG,SIZE
  276.     IF    SIZE-2 
  277.     PUSH    REG
  278.     LXI    H,0
  279.     DAD    S
  280.     XCHG
  281.     LXI    H,-2
  282.     DAD    S    
  283.     SPHL
  284.     XCHG
  285.     LXI    B,SIZE+2
  286.     LDIR
  287.     POP    D
  288.     LXI    H,SIZE
  289.     DAD    S
  290.     MOV    M,E
  291.     INX    H
  292.     MOV    M,D
  293.     ELSE
  294.     IF    'REG'-'H'
  295.     XCHG
  296.     ENDIF
  297.     XTHL
  298.     PUSH    H
  299.     ENDIF
  300.     ENDMAC
  301. ADDR:    MACRO    Q
  302. TEMP    SET    'Q'-'IY'
  303.     IF    'Q'-'Y'*TEMP
  304.     CALL    .XADDR
  305.     ELSE
  306.     CALL    .YADDR
  307.     ENDIF
  308.     ENDMAC
  309. MIDL:    MACRO    REG,LEVEL
  310.     PUSH    X
  311.     MVI    A,LEVEL
  312. MIDL1:    SET    $
  313.     MOV    C,4(X)
  314.     MOV    B,5(X)
  315.     PUSH    B
  316.     POP    X
  317.     CMP    1(X)
  318.     JRNZ    MIDL1
  319.     XRA    A
  320.     ENDMAC
  321. DSUB:    MACRO    Q,SIZE
  322.     IF    0!SIZE&8000H
  323.     CALL    .FSUB
  324.     IF    F
  325.     JC    .FLTERR
  326.     ENDIF
  327.     ELSE
  328.     XRA    A
  329.     DSBC    Q D
  330.     ENDIF
  331.     ENDMAC
  332. DADD    MACRO    Q,SIZE
  333.     IF    0!SIZE&8000H
  334.     CALL    .FADD
  335.     IF    F
  336.     JC    .FLTERR
  337.     ENDIF
  338.     ELSE
  339.     IF    'Q'-'C'
  340.     DAD    Q D
  341.     ELSE
  342.     IF    M
  343.     XRA    A
  344.     DADC    H
  345.     JV    .MLTERR
  346.     ELSE
  347.     DAD    H
  348.     ENDIF
  349.     ENDIF
  350.     ENDIF
  351.     ENDMAC
  352. ENTR:    MACRO    Q,LVL,VSIZ
  353.     IF    LVL-1
  354.     MVI    B,LVL
  355.     LXI    D,1-VSIZ
  356.     IF    S
  357.     CALL    .ENTRSC
  358.     ELSE
  359.     CALL    .ENTER
  360.     ENDIF
  361.     ELSE
  362.     LXI    H,1-VSIZ
  363.     DAD    S
  364.     SPHL
  365. .CHIN$:
  366.     EXX
  367.     LXI    H,.LAST
  368.     EXX
  369.     LXI    H,-MARGIN
  370.     DAD    S
  371.     LXI    D,.LAST
  372.     DSUB    D
  373.     JC    .STKERR
  374.     ENDIF
  375.     ENDMAC
  376. EXIT:    MACRO    Q,SSIZ
  377.     LXI    H,SSIZ+8
  378.     JMP    .EXITF
  379.     ENDMAC
  380. L98:    DAD    D
  381.     DAD    D
  382.     MOV    E,M
  383.     INX    H
  384.     MOV    D,M
  385.     XCHG
  386.     PCHL
  387. EQUL:    MACRO    Q,SIZE1,SIZE2
  388.     IF    'Q'-'S'
  389.     IF    SIZE1
  390.     IF    SIZE1&8000H
  391.     CALL    .FPEQ
  392.     ELSE
  393.     LXI    B,SIZE1
  394.     CALL    .SEQUL
  395.     ENDIF
  396.     ENDIF
  397.     ELSE
  398.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  399.     CALL    .STREQL
  400.     ENDIF
  401.     ENDMAC
  402. NEQL:    MACRO    Q,SIZE1,SIZE2
  403.     IF    'Q'-'S'
  404.     IF    SIZE1
  405.     IF    SIZE1&8000H
  406.     CALL    .FPNEQ
  407.     ELSE
  408.     LXI    B,SIZE1
  409.     CALL    .SNE
  410.     ENDIF
  411.     ENDIF
  412.     ELSE
  413.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  414.     CALL    .STRNQL
  415.     ENDIF
  416.     ENDMAC
  417. LE:    MACRO    Q,SIZE1,SIZE2
  418.     IF    'Q'-'S'
  419.     IF    SIZE1
  420.     IF    SIZE1&8000H
  421.     CALL    .FPLTE
  422.     ELSE
  423.     LXI    B,SIZE1
  424.     CALL    .SLE
  425.     ENDIF
  426.     ELSE
  427.     CALL    .ILE
  428.     ENDIF
  429.     ELSE
  430.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  431.     CALL    .STRLEQ
  432.     ENDIF
  433.     ENDMAC
  434. LESS:    MACRO    Q,SIZE1,SIZE2
  435.     IF    'Q'-'S'
  436.     IF    SIZE1
  437.     IF    SIZE1&8000H
  438.     CALL    .FPLT
  439.     ELSE
  440.     LXI    B,SIZE1
  441.     CALL    .SLT
  442.     ENDIF
  443.     ELSE
  444.     CALL    .ILT
  445.     ENDIF
  446.     ELSE
  447.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  448.     CALL    .STRLSS
  449.     ENDIF
  450.     ENDMAC
  451. GE:    MACRO    Q,SIZE1,SIZE2
  452.     IF    'Q'-'S'
  453.     IF    SIZE1
  454.     IF    SIZE1&8000H
  455.     CALL    .FPGTE
  456.     ELSE
  457.     LXI    B,SIZE1
  458.     CALL    .SGE
  459.     ENDIF
  460.     ELSE
  461.     CALL    .IGE
  462.     ENDIF
  463.     ELSE
  464.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  465.     CALL    .STRGEQ
  466.     ENDIF
  467.     ENDMAC
  468. GRET:    MACRO    Q,SIZE1,SIZE2
  469.     IF    'Q'-'S'
  470.     IF    SIZE1
  471.     IF    SIZE1&8000H
  472.     CALL    .FPGT
  473.     ELSE
  474.     LXI    B,SIZE1
  475.     CALL    .SGT
  476.     ENDIF
  477.     ELSE
  478.     CALL    .IGT
  479.     ENDIF
  480.     ELSE
  481.     LXI    B,255*SIZE1-257+SIZE1+SIZE2
  482.     CALL    .STRGRT
  483.     ENDIF
  484.     ENDMAC
  485. FDVD:    MACRO    Q,SIZE
  486.     CALL    .FDIVD
  487.     IF    F
  488.     JC    .DIVERR
  489.     ENDIF
  490.     ENDMAC
  491. MULT:    MACRO    Q,SIZE
  492.     IF    0!SIZE&8000H
  493.     CALL    .FMULT
  494.     IF    F
  495.     JC    .MLTERR
  496.     ENDIF
  497.     ELSE
  498.     IF    M
  499.     CALL    .IMULT
  500.     ELSE
  501.     CALL    .QMULT
  502.     ENDIF
  503.     ENDIF
  504.     ENDMAC
  505. DIVD:    MACRO
  506.     IF    M
  507.     CALL    .IDIVD
  508.     ELSE
  509.     CALL    .NCDVD
  510.     ENDIF
  511.     ENDMAC
  512. MMOD:    MACRO
  513.     IF    M
  514.     CALL    .IMOD
  515.     ELSE
  516.     CALL    .NCMOD
  517.     ENDIF
  518.     ENDMAC
  519. NEGT:    MACRO    REG
  520.     IF    'REG'-'H'
  521.     IF    'REG'-'D'
  522.     POP    H
  523.     POP    D
  524.     MVI    A,80H
  525.     XRA    E
  526.     MOV    E,A
  527.     PUSH    D
  528.     PUSH    H
  529.     ELSE
  530.     MOV    A,E
  531.     CMA
  532.     MOV    E,A
  533.     MOV    A,REG
  534.     CMA
  535.     MOV    REG,A
  536.     INX    REG
  537.     ENDIF
  538.     ELSE
  539.     MOV    A,L
  540.     CMA
  541.     MOV    L,A
  542.     MOV    A,REG
  543.     CMA
  544.     MOV    REG,A
  545.     INX    REG
  546.     ENDIF
  547.     XRA    A
  548.     ENDMAC
  549. CTRL:    MACRO    Q,X
  550.     STMT    M,X
  551.     IF    C
  552.     CALL    .CSTS
  553.     JRZ    $+16
  554.     CALL    .CI
  555.     CPI    'C'&3FH
  556.     JZ    .ERROR
  557.     MVI    C,7
  558.     CALL    .CO
  559.     XRA    A
  560.     ENDIF
  561.     ENDMAC
  562. RCHK:    MACRO    REG,LBND,HBND
  563.     LXI    B,LBND
  564.     IF    'REG'-'H'
  565.     IF    'REG'-'S'
  566.     PUSH    H
  567.     LXI    H,HBND
  568.     CALL    .CHKDE
  569.     POP    H
  570.     ELSE
  571.     MVI    A,LBND
  572.     CMP    M
  573.     JC    .STRERR
  574.     XRA    A
  575.     ENDIF
  576.     ELSE
  577.     PUSH    D
  578.     LXI    D,HBND
  579.     CALL    .CHKHL
  580.     POP    D
  581.     ENDIF
  582.     ENDMAC
  583. STMT:    MACRO    Q,NUMBER
  584.     IF    T+E
  585. VALID    SET    0FFFFH
  586.     EXX
  587.     LXI    B,NUMBER
  588.     IF    T
  589.     IF    NOT FIRSTMT
  590. MINSTMT SET    NUMBER
  591. FIRSTMT SET    0FFFFH
  592.     ENDIF    ; FIRST STMT
  593. MAXSTMT SET    NUMBER
  594.     IF    'M'-'Q'
  595.     call    .profinc
  596.     ENDIF    ; Q IS D
  597.     ENDIF    ; T TRUE
  598.     EXX
  599.     ELSE    ; NEITHER T NOR E
  600.     IF    VALID
  601.     EXX
  602.     MOV    B,A
  603.     MOV    C,A
  604.     EXX
  605. VALID    SET    00000H
  606.     ENDIF    ; VALID
  607.     ENDIF    ; T+E
  608.     ENDMAC
  609. GLBP    MACRO    Q,OFFSET,SIZE
  610.     PUSH    Y
  611.     POP    B
  612.     DAD    B
  613.     MOV    B,M
  614.     DCX    H
  615.     MOV    L,M
  616.     MOV    H,B
  617.     LXI    B,OFFSET
  618.     DAD    B
  619.     IF    SIZE-1
  620.     MOV    B,M
  621.     DCX    H
  622.     MOV    L,M
  623.     MOV    H,B
  624.     ELSE
  625.     MOV    L,M
  626.     MOV    H,A
  627.     ENDIF
  628.     ENDMAC
  629.     IF    NOT COMPILER
  630. .STRERR:    LXI    H,.STRMSG
  631.     JR    .PERROR
  632. .REFERR:    LXI    H,.REFMSG
  633.     JR    .PERROR
  634. .RNGERR:    LXI    H,.RNGMSG
  635.     JR    .PERROR
  636.     ENDIF
  637. .HPERR: LXI    H,.STKMSG
  638.     JR    .PERROR
  639. .FLTERR:    LXI    H,.FLTMSG
  640.     JR    .PERROR
  641. .STKERR:    LXI    H,.STKMSG
  642.     JR    .PERROR
  643. .DIVERR:    LXI    H,.OUMSG
  644.     JR    .PERROR
  645. .MLTERR LXI    H,.MLTMSG
  646. .PERROR:    CALL    .TXTYP
  647.     JMP    .ERROR
  648.     IF    NOT COMPILER
  649. .STRMSG DB    'String too lon','g'+80H
  650. .REFMSG DB    'Call by reference precision erro','r'+80H
  651. .RNGMSG DB    'Index or value out of rang','e'+80H
  652.     ENDIF
  653. .OUMSG    DB    'Attempted divide by zer','o'+80H
  654. .MLTMSG IF    COMPILER
  655.     DB    'Too many error','s'+80H
  656.     ELSE
  657.     DB    'Multiply overflo','w'+80H
  658.     ENDIF
  659. .STKMSG IF    COMPILER
  660.     DB    'Program too comple','x'+80H
  661.     ELSE
  662.     DB    'Stack overflo','w'+80H
  663.     ENDIF
  664. .FLTMSG DB    'Floating point overflow/underflo','w'+80H
  665. .STMTMSG    DB    ' -- statement',' '+80H
  666. .CRLF    DB    CR,LF+80H
  667. CSET:    MACRO    Q,OFF
  668.     IF    OFF
  669.     IF    OFF-1
  670.     CALL    .RCSET
  671.     ELSE
  672.     CALL    .CONSET
  673.     ENDIF
  674.     ELSE
  675.     MVI    B,16
  676.     LXI    H,0
  677. CSETCL: SET    $
  678.     PUSH    H
  679.     DJNZ    CSETCL
  680.     ENDIF
  681.     ENDMAC
  682. UNIN:    MACRO    Q,OFFSET,OFF1
  683.     CALL    .UNION
  684.     ENDMAC
  685. MEMB:    MACRO    Q,OFFSET,OFF2
  686.     CALL    .INN
  687.     ENDMAC
  688. INCL:    MACRO    Q,OFFSET,OFF1
  689.     CALL    .LTEQ
  690.     ENDMAC
  691. SBST:    MACRO    Q,OFFSET,OFF1
  692.     CALL    .GTEQ
  693.     ENDMAC
  694. INTR:    MACRO    Q,OFFSET,OFF1
  695.     CALL    .INSECT
  696.     ENDMAC
  697. DIFF:    MACRO    Q,OFFSET,OFF1
  698.     CALL    .ORGAN
  699.     ENDMAC
  700. MTCH:    MACRO    Q,OFFSET,OFF1
  701.     CALL    .COMP
  702.     ENDMAC
  703. NOMT:    MACRO    Q,OFFSET,OFF1
  704.     CALL    .FUSS
  705.     ENDMAC
  706. xcfp:    macro
  707.     pop    d
  708.     pop    h
  709.     pop    b
  710.     xthl
  711.     push    d
  712.     push    h
  713.     push    b
  714.     endmac
  715. cvtf:    macro    where,value
  716.     if    'A'-'where'
  717.     if    'B'-'where'
  718.     if    'C'-'where'
  719.     if    'D'-'where'
  720.     if    'H'-'where'
  721.     if    value-4
  722.     mov    a,l
  723.     pop    b
  724.     pop    d
  725.     pop    h
  726.     mov    h,a
  727.     push    h
  728.     push    d
  729.     push    b
  730.     xra    a
  731.     call    .fout
  732.     dcx    s
  733.     lxi    h,14
  734.     dad    s
  735.     push    h
  736.     call    .fxdcvt
  737.     else
  738.     call    .fout
  739.     dcx    s
  740.     lxi    h,0
  741.     dad    s
  742.     xchg
  743.     lxi    h,1
  744.     dad    d
  745.     lxi    b,14
  746.     ldir
  747.     dcx    h
  748.     mvi    m,14
  749.     endif
  750.     else
  751.     call    .cvtflt
  752.     endif
  753.     else
  754.     xchg
  755.     call    .cvtflt
  756.     endif
  757.     else
  758.     pop    b
  759.     pop    d
  760.     pop    h
  761.     push    d
  762.     push    b
  763.     call    .cvtflt
  764.     xcfp
  765.     endif
  766.     else
  767.     pop    h
  768.     call    .cvtflt
  769.     endif
  770.     else
  771.     lxi    h,value
  772.     call    .cvtflt
  773.     endif
  774.     endmac
  775. dsb1    macro    reg
  776.     xra    a
  777.     dsbc    reg d
  778.     endmac
  779. cmpi    macro    q,value
  780.     cpi    value
  781.     endmac
  782.  
  783. svln:    macro
  784.     mov    a,m
  785.     exx
  786.     mov    e,a
  787.     xra    a
  788.     exx
  789.     dcx    h
  790.     endmac
  791.  
  792. gtln:    macro    reg,size
  793.     exx
  794.     mov    a,e
  795.     exx
  796.     mov    c,a
  797.     xra    a
  798.     mov    b,a
  799.     lxi    h,size
  800.     dsub    b
  801.     dad    s
  802.     mvi    m,cr
  803.     endmac
  804.