home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / tnylib.lzh / %C86.INC < prev    next >
Encoding:
Text File  |  1986-10-30  |  9.4 KB  |  577 lines

  1. ;
  2. ; Copyright 1986 Jim Kyle and Chip Rabinowitz - All Rights Reserved
  3. ;
  4. .xlist
  5.     page    60,132
  6. ;
  7. ; %C86.INC -- include file for C86 use of D2IO .ASM files
  8. ;
  9. ;***************************************************************************
  10. ;
  11. ; This file provides standardized macros to generate ASM code that meets
  12. ; the C86 coding conventions.
  13. ;
  14. ; Last updated 10/27/86 -- Jim Kyle
  15. ;
  16. ; Assembler: MASM 4.0 from Microsoft
  17. ;
  18. ;    to assemble library module with listing and no symbol table:
  19. ;        MASM /N /L modnam;
  20. ;
  21. ;****************************************************************************
  22. ;
  23.  
  24. ttl    macro    modnam, vrsn, date, auth
  25.     title    modnam -- Version vrsn -- date -- auth
  26.     name    modnam
  27.     subttl    (c) 1986 Jim Kyle and Chip Rabinowitz - All Rights Reserved
  28. ;
  29. endm
  30.  
  31. ;            start of data segment
  32. dseg    macro
  33. data    segment    para public
  34. endm
  35.  
  36. ;            define space for a pointer
  37. defptr    macro    ptrnam
  38. ifdef    MODEL
  39. ptrnam    dd    0
  40. else
  41. ptrnam    dw    0
  42. endif
  43.     endm
  44.  
  45. ;            declare vname as external
  46. extv    macro    vname, type
  47.     extrn    vname:type
  48. endm
  49.  
  50. ;            declare vname as global and initialize it
  51. glblv    macro    vname, type, val
  52.     havtyp = 0
  53.     public    vname
  54. ifidn    <type>, <byte>
  55. vname    db    val
  56.     havtyp = 1
  57. endif
  58. ifidn    <type>, <word>
  59. vname    dw    val
  60.     havtyp = 1
  61. endif
  62. ifidn    <type>, <dword>
  63. vname    dd    val
  64.     havtyp = 1
  65. endif
  66. ife    havtyp
  67.     error -- type is unknown.
  68. endif
  69.     endm
  70.  
  71. glblvl    macro    list
  72.     irp    i, <list>
  73.     glblv    i
  74.     endm
  75. endm
  76.  
  77. ;            end of data segment, start of code segment
  78. cseg    macro
  79. data    ends
  80. ;
  81. code    segment    byte public
  82.     assume    cs:code, ds:data, ss:data, es:data
  83.     endm
  84.  
  85. ;            declare fname as external
  86. extf    macro    fname
  87.     extrn    fname:near
  88. endm
  89.  
  90. xtfs    macro    list
  91.     irp    i, <list>
  92.     extf    i
  93.     endm
  94. endm
  95.  
  96. ; declare global error value
  97. exterr    macro
  98.     extrn    _errcod:word
  99. endm
  100.  
  101. ; set global error value
  102. moverr    macro    val
  103.     mov    _errcod,val
  104. endm
  105.  
  106. ; get global error value
  107. geterr    macro    val
  108.     mov    val,_errcod
  109. endm
  110.  
  111. ; copy global error value into stream table
  112. saverr    macro
  113.     push    ax
  114.     geterr    ax
  115.     mov    byte ptr 4[si], al
  116.     pop    ax
  117. endm
  118.  
  119. ;            equate 'aname' to arg on stack (parameter)
  120. darg    macro     aname, type
  121. ;;'byte' or anything else
  122.     havtyp    = 0
  123. ifidn    <type>, <byte>
  124.     aname&_v    = (_arg + 0)
  125.     aname    equ    byte ptr aname&_v&[bp]
  126.     _arg    = _arg + 2
  127.     havtyp    = 1
  128. endif
  129. ifidn <type>, <word>
  130.     aname&_v    = (_arg + 0)
  131.     aname    equ    word ptr aname&_v&[bp]
  132.     _arg    = _arg + 2
  133.     havtyp    = 1
  134. endif
  135. ifidn    <type>, <dword>
  136.     aname&_v    = (_arg + 0)
  137.     aname    equ    dword ptr aname&_v&[bp]
  138.     _arg    = _arg + 4
  139.     havtyp    = 1
  140. endif
  141. ifidn <type>, <cdouble>
  142.     aname&_v    = (_arg + 0)
  143.     aname    equ    qword ptr aname&_v&[bp]
  144.     _arg    = _arg + 8
  145.     havtyp    = 1
  146. endif
  147. ifidn <type>, <ptr>
  148.     aname&_v    = (_arg + 0)
  149.     aname    equ    word ptr aname&_v&[bp]
  150.     _arg    = _arg + 2
  151.     havtyp    = 1
  152. endif
  153. ifidn <type>, <fptr>
  154.     aname&_v    = (_arg + 0)
  155.     aname    equ    word ptr aname&_v&[bp]
  156.     _arg    = _arg + 2
  157.     havtyp    = 1
  158. endif
  159. ife    havtyp
  160.     error -- type is unknown.
  161. endif
  162.     endm
  163.  
  164. dargs    macro    list
  165.     irp    i, <list>
  166.     darg    i
  167.     endm
  168. endm
  169.  
  170. ;            define a global procedure
  171. procdef    macro    pname, args
  172.     public    pname
  173.     _arg    = 4        ;;allow for BP and ret adr
  174.     _lsz    = 2
  175. pname    proc    near
  176.     havreg = 0
  177.     haveds = 0
  178. ifb    <args>
  179.     havbp = 0
  180. else
  181.     push    bp        ; save frame pointer, set new one
  182.     mov    bp, sp
  183.     havbp    = 1
  184.     dargs    <args>
  185. endif
  186.     endm
  187.  
  188. ;            equate 'lvnm' to local variable
  189. dclv    macro     lvnm, type, asiz
  190. ;;'byte' or anything else
  191.     havtyp    = 0
  192. ifidn    <type>, <byte>
  193.     _lsz    = _lsz + 1
  194.     lvnm&_v    = (0 - _lsz)
  195.     lvnm    equ    byte ptr lvnm&_v&[bp]
  196.     havtyp    = 1
  197. endif
  198. ifidn <type>, <word>
  199.     _lsz    = _lsz + 2
  200.     lvnm&_v    = (0 - _lsz)
  201.     lvnm    equ    word ptr lvnm&_v&[bp]
  202.     havtyp    = 1
  203. endif
  204. ifidn    <type>, <dword>
  205.     _lsz    = _lsz + 4
  206.     lvnm&_v    = (0 - _lsz)
  207.     lvnm    equ    dword ptr lvnm&_v&[bp]
  208.     havtyp    = 1
  209. endif
  210. ifidn <type>, <cdouble>
  211.     _lsz    = _lsz + 8
  212.     lvnm&_v    = (0 - _lsz)
  213.     lvnm    equ    qword ptr lvnm&_v&[bp]
  214.     havtyp    = 1
  215. endif
  216. ifidn <type>, <ptr>
  217.     _lsz    = _lsz + 2
  218.     lvnm&_v    = (0 - _lsz)
  219.     lvnm    equ    word ptr lvnm&_v&[bp]
  220.     havtyp    = 1
  221. endif
  222. ifidn <type>, <fptr>
  223.     _lsz    = _lsz + 2
  224.     lvnm&_v    = (0 - _lsz)
  225.     lvnm    equ    word ptr lvnm&_v&[bp]
  226.     havtyp    = 1
  227. endif
  228. ifidn <type>, <baray>
  229.     _lsz    = _lsz + asiz
  230.     lvnm&_v    = (0 - _lsz)
  231.     lvnm    equ    byte ptr lvnm&_v&[bp]
  232.     havtyp    = 1
  233. endif
  234. ifidn <type>, <iaray>
  235.     _lsz    = _lsz + asiz + asiz
  236.     lvnm&_v    = (0 - _lsz)
  237.     lvnm    equ    word ptr lvnm&_v&[bp]
  238.     havtyp    = 1
  239. endif
  240. ife    havtyp
  241.     error -- type is unknown.
  242. endif
  243.     endm
  244.  
  245. locs    macro    list
  246.     irp    i, <list>
  247.     dclv    i
  248.     endm
  249. if    _lsz-2
  250.     sub    sp, _lsz    ; reserve AUTO variable space
  251. endif
  252.     endm
  253.  
  254. ;            declare alt name for global procedure (alias)
  255. alias    macro    pname, altnam
  256.     public    altnam
  257. altnam    label    near
  258.     endm
  259.  
  260. ;            declare alt entry to global procedure (without args)
  261. entrdef    macro    pname
  262.     public pname
  263. pname:
  264. if    havbp
  265.     push    bp        ; save frame pointer, set new one
  266.     mov    bp, sp
  267. endif
  268.     endm
  269.  
  270. ;            define a static procedure (internal, with args)
  271. statdef    macro    pname, args
  272.     _arg    = 4        ;;allow for BP and ret adr
  273.     _lsz    = 2
  274.     havbp = 0
  275. pname    proc    near
  276.     havreg = 0
  277.     haveds = 0
  278. ifb    <args>
  279.     havbp = 0
  280. else
  281.     push    bp        ; save frame pointer, set new one
  282.     mov    bp, sp
  283.     havbp    = 1
  284.     dargs    <args>
  285. endif
  286.     endm
  287.  
  288. ;            begin a local procedure (without args)
  289. internal macro    pname
  290. pname    proc    near
  291.     havreg = 0
  292.     haveds = 0
  293.     havbp = 0
  294. endm
  295.  
  296. intrdef    macro    pname
  297. pname    label    near
  298.     havreg = 0
  299.     haveds = 0
  300.     havbp = 0
  301. endm
  302.  
  303. callit    macro    pname,args
  304.     argsize    = 0
  305. ifb    <args>
  306. else
  307.     pushargs <args>
  308. endif
  309.     call    pname
  310. if    argsize
  311.     add    sp,argsize    ; adjust stack pointer
  312. endif
  313.     endm
  314.  
  315. pushargs    macro list
  316.     irp    i,<list>
  317.     pusharg    i
  318.     endm
  319.     endm
  320.  
  321. pusharg macro varib,type,seg
  322. havtyp = 0
  323. ifidn <type>,<byte>
  324.     push    word ptr varib&_v[bp]
  325.     argsize = argsize + 2
  326.     havtyp = 1
  327. endif
  328. ifidn <type>,<word>
  329.     push    word ptr varib
  330.     argsize = argsize + 2
  331.     havtyp = 1
  332. endif
  333. ifidn <type>,<reg>
  334.     push    varib
  335.     argsize = argsize + 2
  336.     havtyp = 1
  337. endif
  338. ifidn <type>,<preg>
  339.     push    varib
  340.     argsize = argsize + 2
  341.     havtyp = 1
  342. endif
  343. ifidn <type>,<dword>
  344.     push    word ptr varib&_v[bp+2]
  345.     push    word ptr varib&_v[bp]
  346.     argsize = argsize + 4
  347.     havtyp = 1
  348. endif
  349. ifidn <type>,<cdouble>
  350.     push    word ptr varib&_v[bp+6]
  351.     push    word ptr varib&_v[bp+4]
  352.     push    word ptr varib&_v[bp+2]
  353.     push    word ptr varib&_v[bp]
  354.     argsize = argsize + 8
  355.     havtyp = 1
  356. endif
  357. ifidn <type>,<ptr>        ;;push content of pointer
  358.   ifdef varib&_v
  359.     push    word ptr varib&_v[bp]
  360.   else
  361.     push    word ptr varib
  362.   endif
  363.     argsize = argsize + 2
  364.     havtyp = 1
  365. endif
  366. ifidn <type>,<fptr>        ;;push content of function pointer
  367.   ifdef varib&_v
  368.     push    word ptr varib&_v[bp]
  369.   else
  370.     push    word ptr varib
  371.   endif
  372.     argsize = argsize + 2
  373.     havtyp = 1
  374. endif
  375. ife    havtyp
  376.     error -- type is unknown.
  377. endif
  378.     endm
  379.  
  380. ;            return values
  381. retptrm    macro    src
  382.     local    x1,x2
  383.     jnc    x1
  384.     xor    ax,ax        ; return NULL
  385.     mov    dx,ax
  386.     jmp    short    x2
  387. x1:    mov    ax, src        ; return memory value
  388.     mov    dx, src[2]
  389. x2:    pret
  390. endm
  391.  
  392. retptrr    macro    src,seg
  393.     local    x1,x2
  394.     jnc    x1
  395.     xor    ax,ax        ; return NULL
  396.     mov    dx,ax
  397.     jmp    short    x2
  398. x1:    mov    ax,src        ; return register values
  399.     mov    dx,seg
  400. x2:    pret
  401. endm
  402.  
  403. retnull    macro
  404.     sub    ax, ax
  405.     mov    dx,ax
  406.     pret
  407. endm
  408.  
  409. retyes    macro
  410.     mov    ax, 1
  411.     pret
  412. endm
  413.  
  414. ;            pushes register variables
  415. pushreg    macro
  416.     push    di
  417.     push    si
  418.     havreg = 1
  419. endm
  420.  
  421. ;            restores bp and registers 
  422. pret    macro
  423. if    haveds
  424.     pop    ds
  425. endif
  426. if    havreg
  427.     pop    si
  428.     pop    di
  429. endif
  430. if havbp
  431.     mov    sp, bp        ; restore SP
  432.     pop    bp        ; and frame pointer
  433. endif
  434.     ret
  435. endm
  436.  
  437. ;            restores register variables
  438. popreg    macro
  439.     pop    si
  440.     pop    di
  441.     havreg = 0
  442. endm
  443.  
  444. ;            end a static or internal procedure
  445. iend    macro    pname
  446. pname    endp
  447.     endm
  448.  
  449. ;            end a global procedure
  450. pend    macro    pname
  451. pname    endp
  452.     endm
  453.  
  454. ;            end of code segment
  455. finish    macro
  456. code    ends
  457.     end
  458. endm
  459.  
  460. ;    other utility stuff
  461. ;
  462. ;            push/pop pairs
  463. pushds    macro
  464. ifdef    MODEL
  465.     push    ds
  466.     haveds = 1
  467. endif
  468.     endm
  469.  
  470. popds    macro
  471. ifdef    MODEL
  472.     pop    ds
  473.     haveds = 0
  474. endif
  475.     endm
  476.  
  477. pushptr    macro    pointer        ;;need condition if LARGE model used
  478.     push    pointer
  479. endm
  480.  
  481. popptr    macro    pointer
  482.     pop    pointer
  483. endm
  484.  
  485. ;            push a local variable (relative to BP)
  486. pshloc    macro    vnam
  487.     push    word ptr vnam&_v[bp]
  488. endm
  489.  
  490. ;            push an argument (really same as pshloc)
  491. psharg    macro    anam
  492.     push    word ptr anam&_v[bp]
  493. endm
  494.  
  495. ;            this macro loads an arg pointer into DEST
  496. ldptr    macro    dest, argname,seg
  497.     mov    dest, argname    ;;get the pointer
  498. endm
  499.  
  500. ;            this macro stores an arg pointer into DEST
  501. svptr    macro    dest, argname,seg
  502.     mov    argname, dest    ;;store the pointer
  503. endm
  504.  
  505. ;            this macro sets PTRNAM to point to SEG:SYM
  506. ;                note that AX is destroyed
  507. setptr    macro    ptrnam, sym, seg
  508.     lea    ax, sym
  509.     svptr    ax, ptrnam, seg
  510. endm
  511.  
  512. ;            this macro copies FROM to TO, both pointers
  513. ;                note that AX and DX are destroyed
  514. ptrcpyinc    macro    from, to
  515.     push    ax
  516.     gwi    from
  517.     mov    to, ax
  518. ifdef MODEL
  519.     gwi    from+2
  520.     mov    to+2, ax
  521. endif
  522.     pop    ax
  523. endm
  524.  
  525. extraseg    macro
  526.     push    ds
  527.     pop    es
  528. endm
  529.  
  530. ;            get char, unsigned, into AL and increment ptr
  531. gci    macro    ptrnam, seg
  532.     ldptr    si, ptrnam, seg
  533.     cld
  534.     lodsb
  535.     sub    ah, ah
  536.     svptr    si, ptrnam, seg
  537. endm
  538.  
  539. ;            get word into AX and increment ptr
  540. gwi    macro    ptrnam, seg
  541.     ldptr    si, ptrnam, seg
  542.     cld
  543.     lodsw
  544.     svptr    si, ptrnam, seg
  545. endm
  546.  
  547. ;            put char, unsigned, from AL and increment ptr
  548. pci    macro    ptrnam, seg
  549.     ldptr    di, ptrnam, seg
  550.     cld
  551.     stosb
  552.     svptr    di, ptrnam, seg
  553. endm
  554.  
  555. ;            put word from AX and increment ptr
  556. pwi    macro    ptrnam, seg
  557.     ldptr    di, ptrnam, seg
  558.     cld
  559.     stosw
  560.     svptr    di, ptrnam, seg
  561. endm
  562.  
  563. ;            case test, byte
  564. caseb    macro    val, goto
  565.     cmp    al, val
  566.     je    goto
  567. endm
  568.  
  569. ;            case test, word
  570. casew    macro    val, goto
  571.     cmp    ax, val
  572.     je    goto
  573. endm
  574.  
  575. .list
  576. 
  577.