home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / tnylib.lzh / %AZTEC.INC < prev    next >
Encoding:
Text File  |  1986-11-21  |  11.6 KB  |  743 lines

  1.     nlist
  2. ;
  3. ; %AZTEC.INC -- include file for Aztec C86 use of Tinylib .ASM files
  4. ;
  5. ;***************************************************************************
  6. ;
  7. ; This file provides standardized macros to generate ASM code that meets
  8. ; the Aztec coding conventions.
  9. ;
  10. ; Last updated 11/20/86 -- Chip Rabinowitz
  11. ;
  12. ; Assembler: Aztec V3.40A (also tested with V3.20E)
  13. ;
  14. ;****************************************************************************
  15.  
  16. MODEL equ    3        ; modify this line for the appropriate memory model
  17.                         ; 0 - small model
  18.                         ; 1 - large code, small data
  19.                         ; 2 - small code, large data
  20.                         ; 3 - large code, large data
  21.     ifndef    MODEL
  22. MODEL    equ    0
  23.     endif
  24.     if    MODEL and 1
  25.     largecode
  26. FARPROC    equ 1
  27. FPTRSIZE equ    4
  28.     else
  29. FPTRSIZE equ    2
  30.     endif
  31.     if    MODEL and 2
  32. LONGPTR equ 1
  33.     endif
  34.  
  35. ttl    macro    modnam, vrsn, date , auth
  36.     title    modnam -- Version vrsn -- d2io -- date -- auth
  37.     subttl    Copright 1986 Jim Kyle and Chip Rabinowitz
  38.     name    modnam
  39. ;
  40.     endm
  41.  
  42. ;            start of data segment
  43. dseg    macro
  44. dataseg    segment    para public 'DATA'
  45.     endm
  46.  
  47. ;            define space for a pointer
  48. defptr    macro    ptrnam
  49. ifdef    LONGPTR
  50. ptrnam    dd    0
  51. else
  52. ptrnam    dw    0
  53. endif
  54.     endm
  55.  
  56. ;            declare vname as external
  57. extv    macro    vname, type
  58.     extrn    vname&_:type
  59.     endm
  60.  
  61. ;            declare vname as global and initialize it
  62. glblv    macro    vname, type, val
  63.     havtyp = 0
  64.     public    vname&_
  65. ifidn    <type>, <byte>
  66. vname&_    db    val
  67.     havtyp = 1
  68. endif
  69. ifidn    <type>, <word>
  70. vname&_    dw    val
  71.     havtyp = 1
  72. endif
  73. ifidn    <type>, <dword>
  74. vname&_    dd    val
  75.     havtyp = 1
  76. endif
  77. ife    havtyp
  78.     error -- type is unknown.
  79. endif
  80.     endm
  81.  
  82. glblvl    macro    list
  83.     irp    i, <list>
  84.     glblv    i
  85.     endm
  86.     endm
  87.  
  88. ;            end of data segment, start of code segment
  89. cseg macro
  90. dataseg    ends
  91. codeseg    segment    byte public 'code'
  92.     assume    cs:codeseg,ds:dataseg
  93.     endm
  94.  
  95. ;            declare fname as external
  96. extf    macro    fname
  97. ifdef FARPROC
  98.     extrn    fname&_:far
  99. else
  100.     extrn fname&_:near
  101. endif
  102.     endm
  103.  
  104. xtfs    macro    list
  105.     irp    i, <list>
  106.     extf    i
  107.     endm
  108.     endm
  109.  
  110. ; declare global error value
  111. exterr    macro
  112.     extrn    errno_:word
  113. endm
  114.  
  115. ; set global error value
  116. moverr    macro    val
  117.     mov    errno_,val
  118. endm
  119.  
  120. ; get global error value
  121. geterr    macro    val
  122.     mov    val,errno_
  123. endm
  124.  
  125. ;copy global error value into stream table
  126. saverr    macro
  127.     push    ax
  128.     geterr    ax
  129.     mov    byte ptr 4[si],al
  130.     pop    ax
  131. endm
  132.  
  133. ;this macro equates 'aname' to arg on stack (parameter)
  134. darg    macro     aname, type
  135. ;;'byte' or anything else
  136.     havtyp    = 0
  137. ifidn    <type>, <byte>
  138.     aname&v    = (_arg + 0)
  139.     aname    equ    byte ptr aname&v[bp]
  140.     _arg    = _arg + 2
  141.     havtyp    = 1
  142. endif
  143. ifidn <type>, <word>
  144.     aname&v    = (_arg + 0)
  145.     aname    equ    word ptr aname&v[bp]
  146.     _arg    = _arg + 2
  147.     havtyp    = 1
  148. endif
  149. ifidn    <type>, <dword>
  150.     aname&v    = (_arg + 0)
  151.     aname    equ    dword ptr aname&v[bp]
  152.     _arg    = _arg + 4
  153.     havtyp    = 1
  154. endif
  155. ifidn <type>, <cdouble>
  156.     aname&v    = (_arg + 0)
  157.     aname    equ    qword ptr aname&v[bp]
  158.     _arg    = _arg + 8
  159.     havtyp    = 1
  160. endif
  161. ifidn <type>, <ptr>
  162.     ifdef LONGPTR
  163.         aname&v    = (_arg + 0)
  164.         aname    equ    dword ptr aname&v[bp]
  165.         _arg    = _arg + 4
  166.     else
  167.         aname&v    = (_arg + 0)
  168.         aname    equ    word ptr aname&v[bp]
  169.         _arg    = _arg + 2
  170.     endif
  171.     havtyp    = 1
  172. endif
  173. ifidn <type>, <fptr>
  174.     ifdef FARPROC
  175.         aname&v    = (_arg + 0)
  176.         aname    equ    dword ptr aname&v[bp]
  177.         _arg    = _arg + 4
  178.     else
  179.         aname&v    = (_arg + 0)
  180.         aname    equ    word ptr aname&v[bp]
  181.         _arg    = _arg + 2
  182.     endif
  183.     havtyp    = 1
  184. endif
  185. ife    havtyp
  186.     error -- type is unknown.
  187. endif
  188.     endm
  189.  
  190. dargs    macro    list
  191.     irp    i, <list>
  192.     darg    i
  193.     endm
  194.     endm
  195.  
  196. ;            define a global procedure
  197. procdef    macro    pname, args
  198.     public pname&_
  199. ifdef    FARPROC
  200.     _arg    =    6        ;;allow for BP and ret adr
  201.     _lsz    =    2
  202.     pname&_    proc    far
  203. else
  204.     _arg    =    4        ;;allow for BP and ret adr
  205.     _lsz    =    2
  206.     pname&_    proc    near
  207. endif
  208.     havreg = 0
  209.     haveds = 0
  210. ifb <args>
  211.     havbp = 0
  212. else
  213.     push bp
  214.     mov bp,sp
  215.     havbp = 1
  216.     dargs <args>
  217. endif
  218.     endm
  219.  
  220. ;            equate 'lvnm' to local variable
  221. dclv    macro     lvnm, type,asiz
  222. ;;'byte' or anything else
  223.     havtyp    = 0
  224. ifidn    <type>, <byte>
  225.     _lsz    = _lsz + 2
  226.     lvnm&l    = (0 - _lsz)
  227.     lvnm    equ    byte ptr lvnm&l[bp]
  228.     havtyp    = 1
  229. endif
  230. ifidn <type>, <word>
  231.     _lsz    = _lsz + 2
  232.     lvnm&l    = (0 - _lsz)
  233.     lvnm    equ    word ptr lvnm&l[bp]
  234.     havtyp    = 1
  235. endif
  236. ifidn    <type>, <dword>
  237.     _lsz    = _lsz + 4
  238.     lvnm&l    = (0 - _lsz)
  239.     lvnm    equ    dword ptr lvnm&l[bp]
  240.     havtyp    = 1
  241. endif
  242. ifidn <type>, <cdouble>
  243.     _lsz    = _lsz + 8
  244.     lvnm&l    = (0 - _lsz)
  245.     lvnm    equ    qword ptr lvnm&l[bp]
  246.     havtyp    = 1
  247. endif
  248. ifidn <type>, <ptr>
  249.     ifdef LONGPTR
  250.     _lsz    = _lsz + 4
  251.     lvnm&l = (0 - _lsz)
  252.     lvnm equ dword ptr lvnm&l[bp]
  253.     else
  254.     _lsz    = _lsz + 2
  255.     lvnm&l    = (0 - _lsz)
  256.     lvnm    equ    word ptr lvnm&l[bp]
  257.     endif
  258.     havtyp    = 1
  259. endif
  260. ifidn <type>, <fptr>
  261.     ifdef FARPROC
  262.     _lsz    = _lsz + 4
  263.     lvnm&l = (0 - _lsz)
  264.     lvnm equ dword ptr lvnm&l[bp]
  265.     else
  266.     _lsz    = _lsz + 2
  267.     lvnm&l    = (0 - _lsz)
  268.     lvnm    equ    word ptr lvnm&l[bp]
  269.     endif
  270.     havtyp    = 1
  271. endif
  272. ifidn <type>, <baray>
  273.     _lsz    = _lsz + asiz
  274.     lvnm&l    = (0 - _lsz)
  275.     lvnm    equ    byte ptr lvnm&l[bp]
  276.     havtyp    = 1
  277. endif
  278. ifidn <type>, <iaray>
  279.     _lsz    = _lsz + asiz + asiz
  280.     lvnm&l    = (0 - _lsz)
  281.     lvnm    equ    word ptr lvnm&l[bp]
  282.     havtyp    = 1
  283. endif
  284. ife    havtyp
  285.     error -- type is unknown.
  286. endif
  287.     endm
  288.  
  289. locs    macro    list
  290. ;    _lsz    =    2
  291.     irp    i, <list>
  292.     dclv    i
  293.     endm
  294. if    _lsz-2
  295.     sub    sp, _lsz
  296. endif
  297.     endm
  298.  
  299. ;            declare alt name for global procedure (alias)
  300. alias    macro    pname, altnam
  301.     public    altnam&_
  302. ifdef FARPROC
  303.     altnam&_    label    far
  304. else
  305.     altnam&_    label    near
  306. endif
  307.     endm
  308.  
  309. ;            declare alt entry to global procedure (without args)
  310. entrdef    macro    pname
  311.     public pname&_
  312. pname&_:
  313. if    havbp
  314.     push    bp
  315.     mov    bp, sp
  316. endif
  317.     endm
  318.  
  319. ;            define a static procedure (internal, with args)
  320. statdef    macro    pname, args
  321. ifdef    FARPROC
  322.     _arg    =    6        ;;allow for BP and ret adr
  323.     _lsz    =    2
  324.     pname    proc    far
  325. else
  326.     _arg    =    4        ;;allow for BP and ret adr
  327.     _lsz    =    2
  328.     pname    proc    near
  329. endif
  330.     havreg = 0
  331.     haveds = 0
  332. ifb    <args>
  333.     havbp = 0
  334. else
  335.     push    bp        ;;save frame pointer, set new one
  336.     mov    bp, sp
  337.     havbp    = 1
  338.     dargs    <args>
  339. endif
  340.     endm
  341.  
  342. ;            begin a local procedure (without args)
  343. internal macro    pname
  344. pname    proc    near
  345.     havreg = 0
  346.     haveds = 0
  347.     havbp = 0
  348.     endm
  349.  
  350. intrdef    macro    pname
  351. ifdef FARPROC
  352.     pname    label    far
  353. else
  354.     pname    label    near
  355. endif
  356.     havreg = 0
  357.     haveds = 0
  358.     havbp = 0
  359.     endm
  360.  
  361. callit    macro    pname,args
  362.     argsize    = 0
  363. ifnb    <args>
  364.     pushargs <args>
  365. endif
  366.     call    pname&_
  367. if    argsize
  368.     add    sp,argsize
  369. endif
  370.     endm
  371.  
  372. pushargs    macro list
  373.     irp    i,<list>
  374.     pusharg    i
  375.     endm
  376.     endm
  377.  
  378. pusharg macro varib,type,segm
  379. havtyp = 0
  380. ifidn <type>,<byte>
  381.     push    word ptr varib
  382.     argsize = argsize + 2
  383.     havtyp = 1
  384. endif
  385. ifidn <type>,<word>
  386.     push    word ptr varib
  387.     argsize = argsize + 2
  388.     havtyp = 1
  389. endif
  390. ifidn <type>,<reg>
  391.     push    varib
  392.     argsize = argsize + 2
  393.     havtyp = 1
  394. endif
  395. ifidn <type>,<preg>
  396. ifdef LONGPTR
  397.     ifnb <segm>
  398.         push    segm
  399.     else
  400.         ifidn <varib>,<si>
  401.             push    ds
  402.         else
  403.             ifidn <varib>,<di>
  404.                 push    es
  405.             else
  406.                 ifidn <varib>,<dx>
  407.                     push    ds
  408.                 else
  409.                     error - undefined segment
  410.                 endif
  411.             endif
  412.         endif
  413.     endif
  414.     push    varib
  415.     argsize = argsize + 4
  416. else
  417.     push    varib
  418.     argsize = argsize + 2
  419. endif
  420.     havtyp = 1
  421. endif
  422. ifidn <type>,<dword>
  423.     push    word ptr varib[2]
  424.     push    word ptr varib
  425.     argsize = argsize + 4
  426.     havtyp = 1
  427. endif
  428. ifidn <type>,<cdouble>
  429.     push    word ptr varib[6]
  430.     push    word ptr varib[4]
  431.     push    word ptr varib[2]
  432.     push    word ptr varib
  433.     argsize = argsize + 8
  434.     havtyp = 1
  435. endif
  436. ifidn <type>,<ptr>
  437. ifdef LONGPTR
  438.     push    word ptr varib[2]
  439.     push    word ptr varib
  440.     argsize = argsize + 4
  441. else
  442.     push    word ptr varib
  443.     argsize = argsize + 2
  444. endif
  445.     havtyp = 1
  446. endif
  447. ifidn <type>,<fptr>
  448. ifdef FARPROC
  449. ;    push    word ptr varib&_ + 2
  450. ;    push    word ptr varib&_
  451. ;    push    seg varib&_
  452. ;    push    offset varib&_
  453.     mov    dx,seg varib&_
  454.     push    dx
  455.     mov    dx,offset varib&_
  456.     push    dx
  457.     argsize = argsize + 4
  458. else
  459.     mov    dx,offset varib&_
  460.     push    dx
  461.     argsize = argsize + 2
  462. endif
  463.     havtyp = 1
  464. endif
  465. ife    havtyp
  466.     error -- type is unknown.
  467. endif
  468.     endm
  469.  
  470.  
  471.  
  472. retptrm    macro    src
  473.     local    x1,x2
  474.     jnc    x1
  475.     xor    ax,ax
  476. ifdef LONGPTR
  477.     mov    dx,ax
  478. endif
  479.     jmp    short x2
  480. x1:
  481.     mov    ax, word ptr src
  482. ifdef    LONGPTR
  483.     mov    dx, word ptr src+2
  484. endif
  485. x2:
  486.     pret
  487.     endm
  488.  
  489. retptrr    macro    src,seg
  490.     local    x1,x2
  491.     jnc    x1
  492.     xor    ax,ax
  493. ifdef LONGPTR
  494.     mov    dx,ax
  495. endif
  496.     jmp    short x2
  497. x1:
  498.     mov    ax,src
  499. ifdef LONGPTR
  500.     ifnb <seg>
  501.         mov    dx, seg
  502.     endif
  503. endif
  504. x2:
  505.     pret
  506.     endm
  507.  
  508. retnull    macro
  509.     xor    ax,ax
  510. ifdef LONGPTR
  511.     mov    dx,ax
  512. endif
  513.     pret
  514.      endm
  515.  
  516. retyes    macro
  517.     mov    ax, 1
  518.     pret
  519.     endm
  520.  
  521. ;            pushes register variables
  522. pushreg    macro
  523.     push    di
  524.     push    si
  525.     havreg = 1
  526.     endm
  527.  
  528. ;            restores bp and registers 
  529. pret    macro
  530. if    haveds
  531.     pop    ds
  532. endif
  533. if    havreg
  534.     pop    si
  535.     pop    di
  536. endif
  537. if havbp
  538.     mov    sp,bp
  539.     pop bp
  540. endif
  541.     ret
  542.     endm
  543.  
  544. ;            restores register variables
  545. popreg    macro
  546.     pop    si
  547.     pop    di
  548.     havreg = 0
  549.     endm
  550.  
  551. ;            end a internal procedure
  552. iend    macro    pname
  553. pname    endp
  554.     endm
  555.  
  556. ;            end a global or static procedure
  557. pend    macro    pname
  558. pname&_    endp
  559.     endm
  560.  
  561. finish    macro
  562. codeseg    ends
  563.     end
  564.     endm
  565.  
  566. ;    other utility stuff
  567. ;
  568. ;            push/pop pairs
  569. pushds    macro
  570.     ifdef LONGPTR
  571.     haveds = 1
  572.     push    ds
  573.     endif
  574.     endm
  575.  
  576. popds    macro
  577.     ifdef LONGPTR
  578.     haveds = 0
  579.     pop    ds
  580.     endif
  581.     endm
  582.  
  583. pushptr    macro    pointer
  584.     ifdef LONGPTR
  585.     push    word ptr pointer+2
  586.     push    word ptr pointer
  587.     else
  588.     push    word ptr pointer
  589.     endif
  590.     endm
  591.  
  592. popptr    macro    pointer
  593.     ifdef LONGPTR
  594.     pop    word ptr pointer
  595.     pop    word ptr pointer+2
  596.     else
  597.     pop    word ptr pointer
  598.     endif
  599.     endm
  600.  
  601. ;            push a local variable
  602. pshloc    macro    vnam
  603.     push    word ptr vnam&l[bp]
  604.     endm
  605.  
  606. ;            push an argument
  607. psharg    macro    anam
  608.     push    word ptr anam&v[bp]
  609.     endm
  610.  
  611.  
  612. ;this macro loads an arg pointer into DEST, with optional SEGment
  613. ldptr    macro    dest, argname, seg
  614. ifdef    LONGPTR
  615.     ifnb <seg>        ;;get segment if specified
  616.         ifidn <seg>,<es>
  617.             les    dest,argname
  618.         else
  619.             ifidn <seg>,<ds>
  620.                 lds dest,argname
  621.             else
  622.                 mov dest, word ptr argname
  623.                 mov seg, word ptr argname[2]
  624.             endif
  625.         endif
  626.     else
  627.         ifidn <dest>,<si>        ;;si gets seg in ds
  628.             lds    si, argname
  629.         else
  630.             ifidn <dest>,<di>    ;;or, es:di
  631.                 les    di, argname
  632.             else
  633.                 garbage error: no seg for long pointer
  634.             endif
  635.         endif
  636.     endif
  637. else
  638.     mov dest, word ptr argname    ;;get the pointer
  639. ENDIF
  640.     ENDM
  641.  
  642.  
  643. ;this macro unloads an arg pointer from DEST, with optional SEG
  644. svptr    macro    dest, argname, seg
  645. ifdef    LONGPTR
  646.     ifnb <seg>        ;;get segment if specified
  647.         mov word ptr argname,dest
  648.         mov word ptr argname[2],seg
  649.     else
  650.         ifidn <dest>,<si>        ;;si gets seg in ds
  651.         mov word ptr argname,si
  652.         mov word ptr argname[2],ds
  653.         else
  654.             ifidn <dest>,<di>    ;;or, es:di
  655.                 mov word ptr argname,di
  656.                 mov word ptr argname[2],es
  657.             else
  658.                 garbage error: no seg for long pointer
  659.             endif
  660.         endif
  661.     endif
  662. else
  663.     mov word ptr argname,dest    ;;get the pointer
  664. ENDIF
  665.     ENDM
  666. ;        this macro sets ptrnam to point to SEG:SYM
  667. ;            note that AX is destroyed
  668. setptr    macro    ptrnam,sym,seg
  669.     lea    ax,sym
  670.     svptr    ax,ptrnam,seg
  671. endm
  672.  
  673. ;        this macro copies FROM to TO, both pointers
  674. ;            note that AX and DX are destroyed
  675. ;
  676. ptrcpyinc    macro    from,to
  677.     push    ax
  678.     push    dx
  679.     gwi    from
  680. ifdef    LONGPTR
  681.     xchg    ax,dx
  682.     gwi    from
  683.     xchg    ax,dx
  684. endif
  685.     svptr    ax,to,dx
  686.     pop    dx
  687.     pop    ax
  688. endm
  689.  
  690. extraseg    macro
  691. ifndef    LONGPTR
  692.     push    ds
  693.     pop    es
  694. endif
  695.     endm
  696.  
  697. ;            get char, unsigned, and increment ptr
  698. gci    macro    ptr
  699.     ldptr    si, ptr
  700.     cld
  701.     lodsb
  702.     sub    ah, ah
  703.     svptr    si, ptr
  704.     endm
  705.  
  706. ;            get word into AX and increment ptr
  707. gwi    macro    ptr
  708.     ldptr    si, ptr
  709.     cld
  710.     lodsw
  711.     svptr    si, ptr
  712.     endm
  713.  
  714. ;            put char, unsigned, and increment ptr
  715. pci    macro    ptr
  716.     ldptr    di, ptr
  717.     cld
  718.     stosb
  719.     svptr    di, ptr
  720.     endm
  721.  
  722. ;            put word into AX and increment ptr
  723. pwi    macro    ptr
  724.     ldptr    di, ptr
  725.     cld
  726.     stosw
  727.     svptr    di, ptr
  728.     endm
  729.  
  730. ;            case test, byte
  731. caseb    macro    val, goto
  732.     cmp    al, val
  733.     je    goto
  734.     endm
  735.  
  736. ;            case test, word
  737. casew    macro    val, goto
  738.     cmp    ax, val
  739.     je    goto
  740.     endm
  741.  
  742.     list
  743.