home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tasm / idos.mac < prev    next >
Text File  |  1988-08-28  |  40KB  |  1,637 lines

  1.  
  2. ;   FILENAME: IDOS.MAC
  3. ;
  4. ;   Copyright (c) 1988 by Borland International, Inc.
  5. ;
  6. ;   DESCRIPTION: This include file contains various macros that may
  7. ;   be used to communicate with DOS. This include file uses Ideal mode
  8. ;   syntax. For documentation on each of the macros in this file see the
  9. ;   file DOSMAC.DOC.
  10. ;
  11. ;   NOTE: In order to use this macro file you must also include the files:
  12. ;   IMACROS.MAC, KBD.EQU, and DOS.EQU in your module.
  13. ;
  14.  
  15. macro   Terminate10Program
  16.     DosCall <DOS_PROGRAM_TERMINATE>
  17. endm
  18.  
  19. macro   ReadKBDEcho
  20.     DosCall <DOS_READ_KBD_ECHO>
  21. endm
  22.  
  23. macro   CharacterOutput Character
  24.     ifb <Character>
  25.         display "Caller must provide Character parameter to CharacterOutput."
  26.         err
  27.     else
  28.         mov     dl, Character
  29.         DosCall <DOS_WRITE_CHARACTER>
  30.     endif
  31. endm
  32.  
  33. macro   AuxiliaryInput
  34.     DosCall <DOS_AUXILIARY_INPUT>
  35. endm
  36.  
  37. macro   AuxiliaryOutput Character
  38.     ifb <Character>
  39.         display "Caller must provide Character parameter to AuxiliaryOutput."
  40.         err
  41.     else
  42.         mov     dl, <Character>
  43.         DosCall <DOS_AUXILIARY_OUTPUT>
  44.     endif
  45. endm
  46.  
  47. macro   PrinterOutput   Character
  48.     ifb <Character>
  49.         display "Caller must provide Character parameter to PrinterOutput."
  50.         err
  51.     else
  52.         mov     dl, <Character>
  53.         DosCall <DOS_PRINTER_OUTPUT>
  54.     endif
  55. endm
  56.  
  57. macro   ConsoleIO   Value
  58.     ifb <Value>
  59.         display "Caller must provide the Value parameter to ConsoleIO."
  60.         err
  61.     else
  62.         mov     dl, Value
  63.         DosCall <DOS_CONSOLE_IO>
  64.     endif
  65. endm
  66.  
  67. macro   UnfilteredCharInput
  68.     DosCall <DOS_UNFILTERED_INPUT>
  69. endm
  70.  
  71. macro   CharInputNoEcho
  72.     DosCall <DOS_CHARACTER_INPUT>
  73. endm
  74.  
  75. macro   WriteString StringSeg, StringOfs
  76.     macro   ErrMsg
  77.         display "You must provide the string address parameters to WriteString."
  78.         err
  79.     endm
  80.  
  81.     ifb <StringSeg>
  82.         ErrMsg
  83.     else
  84.         ifb <StringOfs>
  85.             ErrMsg
  86.         else
  87.             ifidni  <StringSeg>, <ds>
  88.                 ; Do nothing
  89.             else
  90.                 LoadSegment <ds>, <StringSeg>
  91.             endif
  92.             mov     dx, StringOfs
  93.             DosCall DOS_WRITE_STRING
  94.         endif
  95.     endif
  96. endm
  97.  
  98. macro   BufferedInput   StringSeg, StringOfs
  99.     macro   ErrMsg
  100.         display "Caller must provide the address parameters to BufferedInput."
  101.         err
  102.     endm
  103.  
  104.     ifb <StringSeg>
  105.         ErrMsg
  106.     else
  107.         ifb <StringOfs>
  108.             ErrMsg
  109.         else
  110.             ifidni  <ds>, <StringSeg>
  111.                 ; Do nothing
  112.             else
  113.                 LoadSegment <ds>, <StringSeg>
  114.             endif
  115.             mov     dx, StringOfs
  116.             DosCall <DOS_BUFFERED_INPUT>
  117.         endif
  118.     endif
  119. endm
  120.  
  121. macro   GetInputStatus
  122.     DosCall <DOS_GET_INPUT_STATUS>
  123. endm
  124.  
  125. macro   ResetInputBuffer    Function, StringSeg, StringOfs
  126.     ifb <Function>
  127.         display "Caller must provide the Function parameter to ResetInputBuffer."
  128.         err
  129.     else
  130.         ifb <StringSeg>
  131.             mov     al, Function
  132.         else
  133.             ifb <StringOfs>
  134.                 display "Caller must provide the StringOfs parameter to ResetInputBuffer."
  135.                 err
  136.             else
  137.                 ifidni  <ds>, <StringSeg>
  138.                     ; Do nothing
  139.                 else
  140.                     LoadSegment <ds>, <StringSeg>
  141.                 endif
  142.                 mov     dx, StringOfs
  143.             endif
  144.         endif
  145.         DosCall <DOS_RESET_INPUT>
  146.     endif
  147. endm
  148.  
  149. macro   ResetDisk
  150.     DosCall <DOS_DISK_RESET>
  151. endm
  152.  
  153. macro   ChangeDrive Drive
  154.     ifb <Drive>
  155.         display "You must provide the Drive parameter to ChangeDrive."
  156.         err
  157.     else
  158.         mov     dl, Drive
  159.         DosCall DOS_CHANGE_DISK_DRIVE
  160.     endif
  161. endm
  162.  
  163. macro   OpenFCBFile FCBSeg, FCBOfs
  164.     macro   ErrMsg
  165.         display "Caller must provide FCB address to OpenFCBFile."
  166.         err
  167.     endm
  168.  
  169.     ifb <FCBSeg>
  170.         ErrMsg
  171.     else
  172.         ifb <FCBOfs>
  173.             ErrMsg
  174.         else
  175.             ifidni  <ds>, <FCBSeg>
  176.                 ; Do nothing
  177.             else
  178.                 LoadSegment <ds>, <FCBSeg>
  179.             endif
  180.             mov     dx, FCBOfs
  181.             DosCall <DOS_OPEN_FCB_FILE>
  182.         endif
  183.     endif
  184. endm
  185.  
  186. macro   CloseFCBFile    FCBSeg, FCBOfs
  187.     macro   ErrMsg
  188.         display "Caller must provide FCB address to CloseFCBFile."
  189.         err
  190.     endm
  191.  
  192.     ifb <FCBSeg>
  193.         ErrMsg
  194.     else
  195.         ifb <FCBOfs>
  196.             ErrMsg
  197.         else
  198.             ifidni  <ds>, <FCBSeg>
  199.                 ; Do nothing
  200.             else
  201.                 LoadSegment <ds>, <FCBSeg>
  202.             endif
  203.             mov     dx, FCBOfs
  204.             DosCall <DOS_CLOSE_FCB_FILE>
  205.         endif
  206.     endif
  207. endm
  208.  
  209. macro   FindFirstFCB    FCBSeg, FCBOfs
  210.     macro   ErrMsg
  211.         display "Caller must provide FCB address to FindFirstFCB."
  212.         err
  213.     endm
  214.  
  215.     ifb <FCBSeg>
  216.         ErrMsg
  217.     else
  218.         ifb <FCBOfs>
  219.             ErrMsg
  220.         else
  221.             ifidni  <ds>, <FCBSeg>
  222.                 ; Do nothing
  223.             else
  224.                 LoadSegment <ds>, <FCBSeg>
  225.             endif
  226.             mov     dx, FCBOfs
  227.             DosCall <DOS_FIND_FIRST_FCB>
  228.         endif
  229.     endif
  230. endm
  231.  
  232. macro   FindNextFCB    FCBSeg, FCBOfs
  233.     macro   ErrMsg
  234.         display "Caller must provide FCB address to FindNextFCB."
  235.         err
  236.     endm
  237.  
  238.     ifb <FCBSeg>
  239.         ErrMsg
  240.     else
  241.         ifb <FCBOfs>
  242.             ErrMsg
  243.         else
  244.             ifidni  <ds>, <FCBSeg>
  245.                 ; Do nothing
  246.             else
  247.                 LoadSegment <ds>, <FCBSeg>
  248.             endif
  249.             mov     dx, FCBOfs
  250.             DosCall <DOS_FIND_NEXT_FCB>
  251.         endif
  252.     endif
  253. endm
  254.  
  255. macro   DeleteFCBFile    FCBSeg, FCBOfs
  256.     macro   ErrMsg
  257.         display "Caller must provide FCB address to DeleteFCBFile."
  258.         err
  259.     endm
  260.  
  261.     ifb <FCBSeg>
  262.         ErrMsg
  263.     else
  264.         ifb <FCBOfs>
  265.             ErrMsg
  266.         else
  267.             ifidni  <ds>, <FCBSeg>
  268.                 ; Do nothing
  269.             else
  270.                 LoadSegment <ds>, <FCBSeg>
  271.             endif
  272.             mov     dx, FCBOfs
  273.             DosCall <DOS_DELETE_FCB_FILE>
  274.         endif
  275.     endif
  276. endm
  277.  
  278. macro   SequentialFCBRead   FCBSeg, FCBOfs
  279.     macro   ErrMsg
  280.         display "Caller must provide FCB address to SequentialFCBRead."
  281.         err
  282.     endm
  283.  
  284.     ifb <FCBSeg>
  285.         ErrMsg
  286.     else
  287.         ifb <FCBOfs>
  288.             ErrMsg
  289.         else
  290.             ifidni  <ds>, <FCBSeg>
  291.                 ; Do nothing
  292.             else
  293.                 LoadSegment <ds>, <FCBSeg>
  294.             endif
  295.             mov     dx, FCBOfs
  296.             DosCall <DOS_SEQUENTIAL_READ>
  297.         endif
  298.     endif
  299. endm
  300.  
  301. macro   SequentialFCBWrite  FCBSeg, FCBOfs
  302.     macro   ErrMsg
  303.         display "Caller must provide FCB address to SequentialFCBWrite."
  304.         err
  305.     endm
  306.  
  307.     ifb <FCBSeg>
  308.         ErrMsg
  309.     else
  310.         ifb <FCBOfs>
  311.             ErrMsg
  312.         else
  313.             ifidni  <ds>, <FCBSeg>
  314.                 ; Do nothing
  315.             else
  316.                 LoadSegment <ds>, <FCBSeg>
  317.             endif
  318.             mov     dx, FCBOfs
  319.             DosCall <DOS_SEQUENTIAL_WRITE>
  320.         endif
  321.     endif
  322. endm
  323.  
  324. macro   CreateFCBFile   FCBSeg, FCBOfs
  325.     macro   ErrMsg
  326.         display "Caller must provide FCB address to CreateFCBFile."
  327.         err
  328.     endm
  329.  
  330.     ifb <FCBSeg>
  331.         ErrMsg
  332.     else
  333.         ifb <FCBOfs>
  334.             ErrMsg
  335.         else
  336.             ifidni  <ds>, <FCBSeg>
  337.                 ; Do nothing
  338.             else
  339.                 LoadSegment <ds>, <FCBSeg>
  340.             endif
  341.             mov     dx, FCBOfs
  342.             DosCall <DOS_CREATE_FCB_FILE>
  343.         endif
  344.     endif
  345. endm
  346.  
  347. macro   RenameFCBFile   FCBSeg, FCBOfs
  348.     macro   ErrMsg
  349.         display "Caller must provide FCB address to RenameFCBFile."
  350.         err
  351.     endm
  352.  
  353.     ifb <FCBSeg>
  354.         ErrMsg
  355.     else
  356.         ifb <FCBOfs>
  357.             ErrMsg
  358.         else
  359.             ifidni  <ds>, <FCBSeg>
  360.                 ; Do nothing
  361.             else
  362.                 LoadSegment <ds>, <FCBSeg>
  363.             endif
  364.             mov     dx, FCBOfs
  365.             DosCall <DOS_RENAME_FCB_FILE>
  366.         endif
  367.     endif
  368. endm
  369.  
  370. macro   GetDrive
  371.     DosCall <DOS_GET_DISK_DRIVE>
  372. endm
  373.  
  374. macro   SetDTA  DTASeg, DTAOfs
  375.     macro   ErrMsg
  376.         display "You must provide the DTASeg:DTAOfs parameters to SetDTA."
  377.         err
  378.     endm
  379.  
  380.     ifb <DTASeg>
  381.         ErrMsg
  382.     else
  383.         ifb <DTAOfs>
  384.             ErrMsg
  385.         else
  386.  
  387.             ; First check if the parameter is a register. If it is then
  388.             ; push it and pop the value into ds. If not check if it's a
  389.             ; constant or variable and act accordingly.
  390.  
  391.             ifidni  <ds>, <DTASeg>
  392.                 ; Do nothing
  393.             else
  394.                 LoadSegment <ds>, <DTASeg>
  395.             endif
  396.             mov     dx, DTAOfs              ; Get offset of DTA
  397.             DosCall DOS_SET_DTA             ; Set new DTA address
  398.         endif
  399.     endif
  400. endm
  401.  
  402. macro   DefaultDiskAllocation
  403.     DosCall <DOS_DEFAULT_DRIVE_INFO>
  404. endm
  405.  
  406. macro   DiskAllocation  Drive
  407.     ifb <Drive>
  408.         display "Caller must provide Drive parameter to DiskAllocation."
  409.         err
  410.     else
  411.         mov     dl, Drive
  412.         DosCall <DOS_DRIVE_INFO>
  413.     endif
  414. endm
  415.  
  416. macro   RandomFCBRead   FCBSeg, FCBOfs
  417.     macro   ErrMsg
  418.         display "Caller must provide FCB address to RandomFCBRead."
  419.         err
  420.     endm
  421.  
  422.     ifb <FCBSeg>
  423.         ErrMsg
  424.     else
  425.         ifb <FCBOfs>
  426.             ErrMsg
  427.         else
  428.             ifidni  <ds>, <FCBSeg>
  429.                 ; Do nothing
  430.             else
  431.                 LoadSegment <ds>, <FCBSeg>
  432.             endif
  433.             mov     dx, FCBOfs
  434.             DosCall <DOS_RANDOM_READ>
  435.         endif
  436.     endif
  437. endm
  438.  
  439. macro   RandomFCBWrite  FCBSeg, FCBOfs
  440.     macro   ErrMsg
  441.         display "Caller must provide FCB address to RandomFCBWrite."
  442.         err
  443.     endm
  444.  
  445.     ifb <FCBSeg>
  446.         ErrMsg
  447.     else
  448.         ifb <FCBOfs>
  449.             ErrMsg
  450.         else
  451.             ifidni  <ds>, <FCBSeg>
  452.                 ; Do nothing
  453.             else
  454.                 LoadSegment <ds>, <FCBSeg>
  455.             endif
  456.             mov     dx, FCBOfs
  457.             DosCall <DOS_RANDOM_WRITE>
  458.         endif
  459.     endif
  460. endm
  461.  
  462. macro   GetFCBFileSize  FCBSeg, FCBOfs
  463.     macro   ErrMsg
  464.         display "Caller must provide FCB address to GetFCBFileSize."
  465.         err
  466.     endm
  467.  
  468.     ifb <FCBSeg>
  469.         ErrMsg
  470.     else
  471.         ifb <FCBOfs>
  472.             ErrMsg
  473.         else
  474.             ifidni  <ds>, <FCBSeg>
  475.                 ; Do nothing
  476.             else
  477.                 LoadSegment <ds>, <FCBSeg>
  478.             endif
  479.             mov     dx, FCBOfs
  480.             DosCall <DOS_GET_FILE_SIZE>
  481.         endif
  482.     endif
  483. endm
  484.  
  485. macro   SetFCBFileRecord    FCBSeg, FCBOfs
  486.     macro   ErrMsg
  487.         display "Caller must provide FCB address to SetFCBFileRecord."
  488.         err
  489.     endm
  490.  
  491.     ifb <FCBSeg>
  492.         ErrMsg
  493.     else
  494.         ifb <FCBOfs>
  495.             ErrMsg
  496.         else
  497.             ifidni  <ds>, <FCBSeg>
  498.                 ; Do nothing
  499.             else
  500.                 LoadSegment <ds>, <FCBSeg>
  501.             endif
  502.             mov     dx, FCBOfs
  503.             DosCall <DOS_SET_RECORD_NUMBER>
  504.         endif
  505.     endif
  506. endm
  507.  
  508. macro   SetVector   Vector, VectorSeg, VectorOfs
  509.     macro   ErrMsg
  510.         display "You must provide the Vector, VectorSeg and VectorOfs parameters to SetVector."
  511.         err
  512.     endm
  513.  
  514.     ifb <Vector>
  515.         ErrMsg
  516.     else
  517.         ifb <VectorSeg>
  518.             ErrMsg
  519.         else
  520.             ifb <VectorOfs>
  521.                 ErrMsg
  522.             else
  523.                 ifidni  <ds>, <VectorSeg>
  524.                     ; Do nothing
  525.                 else
  526.                     LoadSegment <ds>, <VectorSeg>
  527.                 endif
  528.                 mov     dx, VectorOfs
  529.                 DosCall DOS_SET_VECTOR
  530.             endif
  531.         endif
  532.     endif
  533. endm
  534.  
  535. macro   CreatePSP   PSPSeg
  536.     ifb <PSPSeg>
  537.         display "Caller must provide PSPSeg parameter to CreatePSP."
  538.         err
  539.     else
  540.         mov     dx, <PSPSeg>
  541.         DosCall <DOS_CREATE_PSP>
  542.     endif
  543. endm
  544.  
  545. macro   RandomFCBBlockRead  FCBSeg, FCBOfs, Count
  546.     macro   ErrMsg
  547.         display "Caller must provide FCB address to RandomFCBBlockRead."
  548.         err
  549.     endm
  550.  
  551.     ifb <FCBSeg>
  552.         ErrMsg
  553.     else
  554.         ifb <FCBOfs>
  555.             ErrMsg
  556.         else
  557.             ifb <Count>
  558.                 ErrMsg
  559.             else
  560.                 ifidni  <ds>, <FCBSeg>
  561.                     ; Do nothing
  562.                 else
  563.                     LoadSegment <ds>, <FCBSeg>
  564.                 endif
  565.                 mov     dx, FCBOfs
  566.                 mov     cx, Count
  567.                 DosCall <DOS_RANDOM_BLOCK_READ>
  568.             endif
  569.         endif
  570.     endif
  571. endm
  572.  
  573. macro   RandomFCBBlockWrite FCBSeg, FCBOfs, Count
  574.     macro   ErrMsg
  575.         display "Caller must provide FCB address to RandomFCBBlockWrite."
  576.         err
  577.     endm
  578.  
  579.     ifb <FCBSeg>
  580.         ErrMsg
  581.     else
  582.         ifb <FCBOfs>
  583.             ErrMsg
  584.         else
  585.             ifb <Count>
  586.                 ErrMsg
  587.             else
  588.                 ifidni  <ds>, <FCBSeg>
  589.                     ; Do nothing
  590.                 else
  591.                     LoadSegment <ds>, <FCBSeg>
  592.                 endif
  593.                 mov     dx, FCBOfs
  594.                 mov     cx, Count
  595.                 DosCall <DOS_RANDOM_BLOCK_WRITE>
  596.             endif
  597.         endif
  598.     endif
  599. endm
  600.  
  601. macro   ParseFCBFilename    Flags, FilenameSeg, FilenameOfs, FCBSeg, FCBOfs
  602.     macro   ErrMsg
  603.         display "Caller must provide the Flags and address parameters to ParseFCBFilename."
  604.         err
  605.     endm
  606.  
  607.     ifb <Flags>
  608.         ErrMsg
  609.     else
  610.         ifb <FilenameSeg>
  611.             ErrMsg
  612.         else
  613.             ifb <FilenameOfs>
  614.                 ErrMsg
  615.             else
  616.                 ifb <FCBSeg>
  617.                     ErrMsg
  618.                 else
  619.                     ifb <FCBOfs>
  620.                         ErrMsg
  621.                     else
  622.                         LoadSegment <es>, <FCBSeg>
  623.                         mov     di, FCBOfs
  624.                         LoadSegment <ds>, <FilenameSeg>
  625.                         mov     si, FilenameOfs
  626.                         mov     al, Flags
  627.                         DosCall <DOS_PARSE_FILENAME>
  628.                     endif
  629.                 endif
  630.             endif
  631.         endif
  632.     endif
  633. endm
  634.  
  635. macro   GetDate
  636.     DosCall <DOS_GET_DATE>
  637. endm
  638.  
  639. macro   SetDate Year, Month, Day
  640.     macro   ErrMsg
  641.         display "Caller must provide Year, Month and Day parameters to SetDate."
  642.         err
  643.     endm
  644.  
  645.     ifb <Year>
  646.         ErrMsg
  647.     else
  648.         ifb <Month>
  649.             ErrMsg
  650.         else
  651.             ifb <Day>
  652.                 ErrMsg
  653.             else
  654.                 mov     cx, Year
  655.                 mov     dh, Month
  656.                 mov     dl, Day
  657.                 DosCall <DOS_SET_DATE>
  658.             endif
  659.         endif
  660.     endif
  661. endm
  662.  
  663. macro   GetTime
  664.     DosCall <DOS_GET_TIME>
  665. endm
  666.  
  667. macro   SetTime Hour, Minute, Second, Hundredth
  668.     macro   ErrMsg
  669.         display "Caller must provide Hour, Minute, Second and Hundredth parameters to SetTime."
  670.         err
  671.     endm
  672.  
  673.     ifb <Hour>
  674.         ErrMsg
  675.     else
  676.         ifb <Minute>
  677.             ErrMsg
  678.         else
  679.             ifb <Second>
  680.                 ErrMsg
  681.             else
  682.                 ifb <Hundredth>
  683.                     ErrMsg
  684.                 else
  685.                     mov     ch, Hour
  686.                     mov     cl, Minute
  687.                     mov     dh, Second
  688.                     mov     dl, Hundredth
  689.                     DosCall <DOS_SET_TIME>
  690.                 endif
  691.             endif
  692.         endif
  693.     endif
  694. endm
  695.  
  696. macro   SetVerifyFlag   Flag
  697.     ifb <Flag>
  698.         display "Caller must provide Flag parameter to SetVerifyFlag."
  699.         err
  700.     else
  701.         xor     dl, dl
  702.         mov     al, Flag
  703.         DosCall <DOS_SET_VERIFY_FLAG>
  704.     endif
  705. endm
  706.  
  707. macro   GetDTA
  708.     DosCall DOS_GET_DTA
  709. endm
  710.  
  711. macro   GetDOSVersion
  712.     DosCall DOS_GET_DOS_VERSION
  713. endm
  714.  
  715. macro   TSR Result, Paragraphs
  716.     macro   ErrMsg
  717.         display "Caller must provide Result and Paragraphs parameters to TSR."
  718.         err
  719.     endm
  720.  
  721.     ifb <Result>
  722.         ErrMsg
  723.     else
  724.         ifb <Paragraphs>
  725.             ErrMsg
  726.         else
  727.             mov     al, Result
  728.             mov     dx, Paragraphs
  729.             DosCall <DOS_KEEP>
  730.         endif
  731.     endif
  732. endm
  733.  
  734. macro   GetSetBREAK Mode, Value
  735.     ifb <Mode>
  736.         display "Caller must provide Mode and optionally Value parameters to GetSetBREAK."
  737.         err
  738.     else
  739.         ifnb    <Value>
  740.             mov     dl, Value
  741.         endif
  742.         mov     al, Mode
  743.         DosCall <DOS_GET_SET_CTRL_BREAK>
  744.     endif
  745. endm
  746.  
  747. macro   GetVector   Interrupt
  748.     ifb <Interrupt>
  749.         display "Caller must provide Interrupt parameter to GetVector."
  750.         err
  751.     else
  752.         mov     al, Interrupt
  753.         DosCall <DOS_GET_VECTOR>
  754.     endif
  755. endm
  756.  
  757. macro   GetDiskSpace    Disk
  758.     ifb <Disk>
  759.         display "Caller must provide Disk parameter to GetDiskSpace."
  760.         err
  761.     else
  762.         mov     dl, Disk
  763.         DosCall <DOS_GET_DISK_SPACE>
  764.     endif
  765. endm
  766.  
  767. macro   GetSetCountryInfo   BufferSeg, BufferOfs, ShortCode, LongCode
  768.     macro   ErrMsg
  769.         display "Caller must provide the buffer address and country code parameters"
  770.         display "to GetSetCountryInfo."
  771.         err
  772.     endm
  773.  
  774.     ifb <BufferSeg>
  775.         ErrMsg
  776.     else
  777.         ifb <BufferOfs>
  778.             ErrMsg
  779.         else
  780.             ifb <ShortCode>
  781.                 ErrMsg
  782.             else
  783.                 ifnb    <LongCode>
  784.                     mov     bx, LongCode
  785.                 endif
  786.                 mov     al, ShortCode
  787.                 LoadSegment <ds>, <BufferSeg>
  788.                 mov     dx, BufferOfs
  789.                 DosCall <DOS_GET_SET_COUNTRY>
  790.             endif
  791.         endif
  792.     endif
  793. endm
  794.  
  795. macro   CreateDir   StringSeg, StringOfs
  796.     macro   ErrMsg
  797.         display "You must provide address parameters to CreateDir."
  798.         err
  799.     endm
  800.  
  801.     ifb <StringSeg>
  802.         ErrMsg
  803.     else
  804.         ifb <StringOfs>
  805.             ErrMsg
  806.         else
  807.             ifidni  <ds>, <StringSeg>
  808.                 ; Do nothing
  809.             else
  810.                 LoadSegment <ds>, <StringSeg>
  811.             endif
  812.             mov     dx, StringOfs
  813.             DosCall DOS_MAKE_DIRECTORY
  814.         endif
  815.     endif
  816. endm
  817.  
  818. macro   RemoveDir   StringSeg, StringOfs
  819.     macro   ErrMsg
  820.         display "You must provide address parameters to RemoveDir."
  821.         err
  822.     endm
  823.  
  824.     ifb <StringSeg>
  825.         ErrMsg
  826.     else
  827.         ifb <StringOfs>
  828.             ErrMsg
  829.         else
  830.             ifidni  <ds>, <StringSeg>
  831.                 ; Do nothing
  832.             else
  833.                 LoadSegment <ds>, <StringSeg>
  834.             endif
  835.             mov     dx, StringOfs
  836.             DosCall DOS_DELETE_DIRECTORY
  837.         endif
  838.     endif
  839. endm
  840.  
  841. macro   ChangeDirectory StringSeg, StringOfs
  842.     macro   ErrMsg
  843.         display "You must provide the segment and offset of the new path to ChangeDirectory."
  844.         err
  845.     endm
  846.  
  847.     ifb <StringSeg>
  848.         ErrMsg
  849.     else
  850.         ifb <StringOfs>
  851.             ErrMsg
  852.         else
  853.             ifidni  <ds>, <StringSeg>
  854.                 ; Do nothing
  855.             else
  856.                 LoadSegment <ds>, <StringSeg>
  857.             endif
  858.             mov     dx, StringOfs           ; Store the offset of the
  859.             DosCall DOS_SET_CURRENT_DIR     ; new path
  860.         endif
  861.     endif
  862. endm
  863.  
  864.  
  865. macro   CreateFile  Attributes, StringSeg, StringOfs
  866.     macro   ErrMsg
  867.         display "You must provide Attributes and address parameters to CreateFile."
  868.         err
  869.     endm
  870.  
  871.     ifb <Attributes>
  872.         ErrMsg
  873.     else
  874.         ifb <StringSeg>
  875.             ErrMsg
  876.         else
  877.             ifb <StringOfs>
  878.                 ErrMsg
  879.             else
  880.                 ifidni  <ds>, <StringSeg>
  881.                     ; Do nothing
  882.                 else
  883.                     LoadSegment <ds>, <StringSeg>
  884.                 endif
  885.                 mov     dx, StringOfs
  886.                 mov     cx, Attributes
  887.                 DosCall DOS_CREATE_FILE
  888.             endif
  889.         endif
  890.     endif
  891. endm
  892.  
  893. macro   OpenFile  AccessMode, StringSeg, StringOfs
  894.     macro   ErrMsg
  895.         display "You must provide AccessMode and address parameters to OpenFile."
  896.         err
  897.     endm
  898.  
  899.     ifb <AccessMode>
  900.         ErrMsg
  901.     else
  902.         ifb <StringSeg>
  903.             ErrMsg
  904.         else
  905.             ifb <StringOfs>
  906.                 ErrMsg
  907.             else
  908.                 ifidni  <ds>, <StringSeg>
  909.                     ; Do nothing
  910.                 else
  911.                     LoadSegment <ds>, <StringSeg>
  912.                 endif
  913.                 mov     dx, StringOfs
  914.                 mov     al, AccessMode
  915.                 DosCall DOS_OPEN_FILE
  916.             endif
  917.         endif
  918.     endif
  919. endm
  920.  
  921. macro   CloseFile   Handle
  922.     ifb <Handle>
  923.         display "You must provide a file handle to CloseFile."
  924.         err
  925.     else
  926.         mov     bx, Handle
  927.         DosCall DOS_CLOSE_FILE
  928.     endif
  929. endm
  930.  
  931. macro   ReadFile    Handle, Count, StringSeg, StringOfs
  932.     macro   ErrMsg
  933.         display "You must provide Handle, Count and address parameters to ReadFile."
  934.         err
  935.     endm
  936.  
  937.     ifb <Handle>
  938.         ErrMsg
  939.     else
  940.         ifb <Count>
  941.             ErrMsg
  942.         else
  943.             ifb <StringSeg>
  944.                 ErrMsg
  945.             else
  946.                 ifb <StringOfs>
  947.                     ErrMsg
  948.                 else
  949.                     ifidni  <ds>, <StringSeg>
  950.                         ; Do nothing
  951.                     else
  952.                         LoadSegment <ds>, <StringSeg>
  953.                     endif
  954.                     mov     dx, StringOfs
  955.                     mov     cx, Count
  956.                     mov     bx, Handle
  957.                     DosCall DOS_READ_FROM_HANDLE
  958.                 endif
  959.             endif
  960.         endif
  961.     endif
  962. endm
  963.  
  964. macro   WriteFile    Handle, Count, StringSeg, StringOfs
  965.     macro   ErrMsg
  966.         display "You must provide Handle, Count and address parameters to WriteFile."
  967.         err
  968.     endm
  969.  
  970.     ifb <Handle>
  971.         ErrMsg
  972.     else
  973.         ifb <Count>
  974.             ErrMsg
  975.         else
  976.             ifb <StringSeg>
  977.                 ErrMsg
  978.             else
  979.                 ifb <StringOfs>
  980.                     ErrMsg
  981.                 else
  982.                     ifidni  <ds>, <StringSeg>
  983.                         ; Do nothing
  984.                     else
  985.                         LoadSegment <ds>, <StringSeg>
  986.                     endif
  987.                     mov     dx, StringOfs
  988.                     mov     cx, Count
  989.                     mov     bx, Handle
  990.                     DosCall DOS_WRITE_TO_HANDLE
  991.                 endif
  992.             endif
  993.         endif
  994.     endif
  995. endm
  996.  
  997. macro   DeleteFile  StringSeg, StringOfs
  998.     macro   ErrMsg
  999.         display "You must provide address parameters to OpenFile."
  1000.         err
  1001.     endm
  1002.  
  1003.     ifb <StringSeg>
  1004.         ErrMsg
  1005.     else
  1006.         ifb <StringOfs>
  1007.             ErrMsg
  1008.         else
  1009.             ifidni  <ds>, <StringSeg>
  1010.                 ; Do nothing
  1011.             else
  1012.                 LoadSegment <ds>, <StringSeg>
  1013.             endif
  1014.             mov     dx, StringOfs
  1015.             DosCall DOS_DELETE_FILE
  1016.         endif
  1017.     endif
  1018. endm
  1019.  
  1020. macro   MoveFilePtr Mode, Handle, OffsetHigh, OffsetLow
  1021.     macro   ErrMsg
  1022.         display "You must provide Mode, Handle and offset parameters to MoveFilePtr."
  1023.         err
  1024.     endm
  1025.  
  1026.     ifb <Mode>
  1027.         ErrMsg
  1028.     else
  1029.         ifb <Handle>
  1030.             ErrMsg
  1031.         else
  1032.             ifb <OffsetHigh>
  1033.                 ErrMsg
  1034.             else
  1035.                 ifb <OffsetLow>
  1036.                     ErrMsg
  1037.                 else
  1038.                     mov     al, Mode
  1039.                     mov     bx, Handle
  1040.                     mov     cx, OffsetHigh
  1041.                     mov     dx, OffsetLow
  1042.                     DosCall DOS_MOVE_FILE_POINTER
  1043.                 endif
  1044.             endif
  1045.         endif
  1046.     endif
  1047. endm
  1048.  
  1049. macro   GetSetAttributes    Mode, Attributes, StringSeg, StringOfs
  1050.     macro   ErrMsg
  1051.         display "You must provide Mode, Attribute and address parameters to GetSetAttributes."
  1052.         err
  1053.     endm
  1054.  
  1055.     ifb <Mode>
  1056.         ErrMsg
  1057.     else
  1058.         ifb <Attributes>
  1059.             ErrMsg
  1060.         else
  1061.             ifb <StringSeg>
  1062.                 ErrMsg
  1063.             else
  1064.                 ifb <StringOfs>
  1065.                     ErrMsg
  1066.                 else
  1067.                     ifidni  <ds>, <StringSeg>
  1068.                         ; Do nothing
  1069.                     else
  1070.                         LoadSegment <ds>, <StringSeg>
  1071.                     endif
  1072.                     mov     dx, StringOfs
  1073.                     mov     al, Mode
  1074.                     cmp     al, 1
  1075.                     mov     cx, Attributes
  1076.                     DosCall DOS_GET_SET_ATTRIBUTES
  1077.                 endif
  1078.             endif
  1079.         endif
  1080.     endif
  1081. endm
  1082.  
  1083. macro   IOCTL   Function, HandleDrive, Count, BufSegDevInfo, BufferOfs
  1084.     macro   ErrMsg
  1085.         display "Caller must provide Function, HandleDrive, Count, BufferSeg,"
  1086.         display "BufferOfs and DeviceInfo parameters to IOCTL."
  1087.         err
  1088.     endm
  1089.  
  1090.     ifb <Function>
  1091.         ErrMsg
  1092.     else
  1093.         ifb <HandlDrive>
  1094.             ErrMsg
  1095.         else
  1096.             ifb <Count>
  1097.                 ErrMsg
  1098.             else
  1099.                 ifnb    <BufferOfs>                   ; Assume that the buffer
  1100.                     LoadSegment <ds>, <BufSegDevInfo> ; address parameters are
  1101.                     mov     dx, BufferOfs             ; are defined
  1102.                 else                                  ; Assume that the Device
  1103.                     mov     dx, BufSegDevinfo         ; information parameter
  1104.                 endif                                 ; is defined
  1105.                 mov     al, Function
  1106.                 mov     bx, HandleDrive
  1107.                 mov     cx, Count
  1108.                 DosCall <DOS_IOCTL>
  1109.             endif
  1110.         endif
  1111.     endif
  1112. endm
  1113.  
  1114. macro   DuplicateHandle Handle
  1115.     ifb <Handle>
  1116.         display "Caller must provide Handle parameter to DuplicateHandle."
  1117.         err
  1118.     else
  1119.         mov     bx, Handle
  1120.         DosCall <DOS_DUPLICATE_HANDLE>
  1121.     endif
  1122. endm
  1123.  
  1124. macro   ForceDupHandle  OriginalHandle, HandleCopy
  1125.     macro   ErrMsg
  1126.         display "Caller must provide handle parameters to ForceDupHandle."
  1127.         err
  1128.     endm
  1129.  
  1130.     ifb <Original>
  1131.         ErrMsg
  1132.     else
  1133.         ifb <Copy>
  1134.             ErrMsg
  1135.         else
  1136.             mov     bx, OriginalHandle
  1137.             mov     cx, HandleCopy
  1138.             DosCall <DOS_FORCE_DUP_HANDLE>
  1139.         endif
  1140.     endif
  1141. endm
  1142.  
  1143. macro   GetCurrentDir   Drive, StringSeg, StringOfs
  1144.     macro   ErrMsg
  1145.         display "You must provide Drive and address parameters to GetCurrentDir."
  1146.         err
  1147.     endm
  1148.  
  1149.     ifb <Drive>
  1150.         ErrMsg
  1151.     else
  1152.         ifb <StringSeg>
  1153.             ErrMsg
  1154.         else
  1155.             ifb <StringOfs>
  1156.                 ErrMsg
  1157.             else
  1158.                 ifidni  <ds>, <StringSeg>
  1159.                     ; Do nothing
  1160.                 else
  1161.                     LoadSegment <ds>, <StringSeg>
  1162.                 endif
  1163.                 mov     si, StringOfs
  1164.                 mov     dl, Drive
  1165.                 DosCall DOS_GET_DIRECTORY
  1166.             endif
  1167.         endif
  1168.     endif
  1169. endm
  1170.  
  1171. macro   AllocateMemory  Paragraphs
  1172.     ifb <Paragraphs>
  1173.         display "You must provide the number of paragraphs to AllocateMemory."
  1174.         err
  1175.     else
  1176.         mov     bx, Paragraphs
  1177.         DosCall DOS_ALLOCATE_MEMORY
  1178.     endif
  1179. endm
  1180.  
  1181. macro   FreeMemory  BlockAddress
  1182.     ifb <BlockAddress>
  1183.         display "You must provide the BlockAddress parameter to FreeMemory."
  1184.         err
  1185.     else
  1186.         LoadSegment <es>, <BlockAddress>
  1187.         DosCall DOS_FREE_MEMORY
  1188.     endif
  1189. endm
  1190.  
  1191. macro   ModifyMemory    Size, MemoryBlock
  1192.     macro   ErrMsg
  1193.         display "You must provide the Size and MemoryBlock parameters to ModifyMemory."
  1194.         err
  1195.     endm
  1196.  
  1197.     ifb <Size>
  1198.         ErrMsg
  1199.     else
  1200.         ifb <MemoryBlock>
  1201.             ErrMsg
  1202.         else
  1203.             ifidni  <es>, <MemoryBlock>
  1204.                 ; Do nothing
  1205.             else
  1206.                 LoadSegment <es>, <MemoryBlock>
  1207.             endif
  1208.             mov     bx, Size
  1209.             DosCall DOS_MODIFY_MEMORY
  1210.         endif
  1211.     endif
  1212. endm
  1213.  
  1214. macro   Exec    Type, ParmSeg, ParmOfs, ProgramSeg, ProgramOfs
  1215.     macro   ErrMsg
  1216.         display "Caller must provide Type and address parameters to Exec."
  1217.         err
  1218.     endm
  1219.  
  1220.     ifb <Type>
  1221.         ErrMsg
  1222.     else
  1223.         ifb <ParmSeg>
  1224.             ErrMsg
  1225.         else
  1226.             ifb <ParmOfs>
  1227.                 ErrMsg
  1228.             else
  1229.                 ifb <ProgramSeg>
  1230.                     ErrMsg
  1231.                 else
  1232.                     ifb <ProgramOfs>
  1233.                         ErrMsg
  1234.                     else
  1235.                         mov     al, Type
  1236.                         LoadSegment <es>, <ParmSeg>
  1237.                         mov     bx, ParmOfs
  1238.                         LoadSegment <ds>, <ProgramSeg>
  1239.                         mov     dx, ProgramOfs
  1240.                         DosCall <DOS_EXEC>
  1241.                     endif
  1242.                 endif
  1243.             endif
  1244.         endif
  1245.     endif
  1246. endm
  1247.  
  1248. macro   TerminateProgram    ErrorLevel
  1249.     ifnb    <ErrorLevel>
  1250.         mov al, ErrorLevel      ; Return optional errorlevel to DOS
  1251.     endif
  1252.     DosCall DOS_TERMINATE_EXE
  1253. endm
  1254.  
  1255. macro   GetReturnCode
  1256.     DosCall <DOS_GET_RETURN_CODE>
  1257. endm
  1258.  
  1259. macro   FindFirst   Attributes, StringSeg, StringOfs
  1260.     macro   ErrMsg
  1261.         display "You must provide Attributes and address parameters to FindFirst."
  1262.         err
  1263.     endm
  1264.  
  1265.     ifb <Attributes>
  1266.         ErrMsg
  1267.     else
  1268.         ifb <StringSeg>
  1269.             ErrMsg
  1270.         else
  1271.             ifb <StringOfs>
  1272.                 ErrMsg
  1273.             else
  1274.                 ifidni  <ds>, <StringSeg>
  1275.                     ; Do nothing
  1276.                 else
  1277.                     LoadSegment <ds>, <StringSeg>
  1278.                 endif
  1279.                 mov     dx, StringOfs
  1280.                 mov     cx, Attributes
  1281.                 DosCall DOS_FIND_FIRST
  1282.             endif
  1283.         endif
  1284.     endif
  1285. endm
  1286.  
  1287. macro   FindNext
  1288.     DosCall DOS_FIND_NEXT
  1289. endm
  1290.  
  1291. macro   GetVerifyFlag
  1292.     DosCall <DOS_GET_VERIFY_FLAG>
  1293. endm
  1294.  
  1295. macro   RenameFile  OrigSeg, OrigOfs, NewSeg, NewOfs
  1296.     macro   ErrMsg
  1297.         display "Caller must provide address parameters to RenameFile."
  1298.         err
  1299.     endm
  1300.  
  1301.     ifb <OrigSeg>
  1302.         ErrMsg
  1303.     else
  1304.         ifb <OrigOfs>
  1305.             ErrMsg
  1306.         else
  1307.             ifb <NewSeg>
  1308.                 ErrMsg
  1309.             else
  1310.                 ifb <NewOfs>
  1311.                     ErrMsg
  1312.                 else
  1313.                     LoadSegment <es>, <NewSeg>
  1314.                     LoadSegment <ds>, <OrigSeg>
  1315.                     mov     dx, OrigOfs
  1316.                     mov     di, NewOfs
  1317.                     DosCall <DOS_RENAME_FILE>
  1318.                 endif
  1319.             endif
  1320.         endif
  1321.     endif
  1322. endm
  1323.  
  1324. macro   GetSetFileDateTime  GetSet, Handle, Time, Date
  1325.     macro   ErrMsg
  1326.         display "Caller must provide GetSet and Handle parameters to GetSetFileDateTime."
  1327.         err
  1328.     endm
  1329.  
  1330.     ifb <GetSet>
  1331.         ErrMsg
  1332.     else
  1333.         ifb <Handle>
  1334.             ErrMsg
  1335.         else
  1336.             ifnb    <Time>
  1337.                 mov     cx, Time
  1338.                 ifb <Date>
  1339.                     display "You must provide the Date parameter to GetSetFileDateTime."
  1340.                     err
  1341.                 else
  1342.                     mov     dx, Date
  1343.                 endif
  1344.                 mov     bx, Handle
  1345.                 mov     al, GetSet
  1346.                 DosCall <DOS_GET_SET_DATE_TIME>
  1347.             endif
  1348.         endif
  1349.     endif
  1350. endm
  1351.  
  1352. macro   GetSetAllocationStrategy
  1353.     DosCall <DOS_GET_SET_ALLOCATION>
  1354. endm
  1355. macro   GetExtendedErrors
  1356.     xor     bx, bx
  1357.     DosCall <DOS_GET_EXTENDED_ERRORS>
  1358. endm
  1359.  
  1360. macro   CreateTemporaryFile Attribute, FilenameSeg, FilenameOfs
  1361.     macro   ErrMsg
  1362.         display "Caller must provide Attribute and address parameters to CreateTemporaryFile."
  1363.         err
  1364.     endm
  1365.  
  1366.     ifb <Attribute>
  1367.         ErrMsg
  1368.     else
  1369.         ifb <FilenameSeg>
  1370.             ErrMsg
  1371.         else
  1372.             ifb <FilenameOfs>
  1373.                 ErrMsg
  1374.             else
  1375.                 LoadSegment <ds>, <FilenameSeg>
  1376.                 mov     dx, FilenameOfs
  1377.                 mov     cx, Attribute
  1378.                 DosCall <DOS_CREATE_TEMP_FILE>
  1379.             endif
  1380.         endif
  1381.     endif
  1382. endm
  1383.  
  1384. macro   CreateNewFile   Attribute, FilenameSeg, FilenameOfs
  1385.     macro   ErrMsg
  1386.         display "Caller must provide Attribute and address parameters to CreateNewFile."
  1387.         err
  1388.     endm
  1389.  
  1390.     ifb <Attribute>
  1391.         ErrMsg
  1392.     else
  1393.         ifb <FilenameSeg>
  1394.             ErrMsg
  1395.         else
  1396.             ifb <FilenameOfs>
  1397.                 ErrMsg
  1398.             else
  1399.                 LoadSegment <ds>, <FilenameSeg>
  1400.                 mov     dx, FilenameOfs
  1401.                 mov     cx, Attribute
  1402.                 DosCall <DOS_CREATE_NEW_FILE>
  1403.             endif
  1404.         endif
  1405.     endif
  1406. endm
  1407.  
  1408. macro   ControlFileAccess   LockUnlock, Handle, OffsetHigh, OffsetLow, LengthHigh, LengthLow
  1409.     macro   ErrMsg
  1410.         display "Caller must provide the function, file handle, record position and size"
  1411.         display "parameters to ControlFileAccess."
  1412.         err
  1413.     endm
  1414.  
  1415.     ifb <LockUnlock>
  1416.         ErrMsg
  1417.     else
  1418.         ifb <Handle>
  1419.             ErrMsg
  1420.         else
  1421.             ifb <OffsetHigh>
  1422.                 ErrMsg
  1423.             else
  1424.                 ifb <OffsetLow>
  1425.                     ErrMsg
  1426.                 else
  1427.                     ifb <LengthHigh>
  1428.                         ErrMsg
  1429.                     else
  1430.                         ifb <LengthLow>
  1431.                             ErrMsg
  1432.                         else
  1433.                             mov     al, LockUnlock
  1434.                             mov     bx, Handle
  1435.                             mov     cx, OffsetHigh
  1436.                             mov     dx, OffsetLow
  1437.                             mov     si, LengthHigh
  1438.                             mov     di, LengthLow
  1439.                             DosCall <DOS_CONTROL_ACCESS>
  1440.                         endif
  1441.                     endif
  1442.                 endif
  1443.             endif
  1444.         endif
  1445.     endif
  1446. endm
  1447.  
  1448. macro   GetMachineName  BufferSeg, BufferOfs
  1449.     macro   ErrMsg
  1450.         display "Caller must provide buffer address parameters to GetMachineName."
  1451.         err
  1452.     endm
  1453.  
  1454.     ifb <BufferSeg>
  1455.         ErrMsg
  1456.     else
  1457.         ifb <BufferOfs>
  1458.             ErrMsg
  1459.         else
  1460.             LoadSegment <ds>, <BufferSeg>
  1461.             mov     dx, BufferOfs
  1462.             xor     al, al
  1463.             DosCall <NET_GET_MACHINE_NAME>
  1464.         endif
  1465.     endif
  1466. endm
  1467.  
  1468. macro   SetupPrinter    BufferSeg, BufferOfs, ListIndex, StrLength
  1469.     macro   ErrMsg
  1470.         display "Caller must provide buffer address, Index and length parameters"
  1471.         display "to SetupPrinter."
  1472.         err
  1473.     endm
  1474.  
  1475.     ifb <BufferSeg>
  1476.         ErrMsg
  1477.     else
  1478.         ifb <BufferOfs>
  1479.             ErrMsg
  1480.         else
  1481.             ifb <ListIndex>
  1482.                 ErrMsg
  1483.             else
  1484.                 ifb <StrLength>
  1485.                     ErrMsg
  1486.                 else
  1487.                     mov     al, 2
  1488.                     mov     bx, ListIndex
  1489.                     mov     cx, StrLength
  1490.                     LoadSegment <ds>, <BufferSeg>
  1491.                     mov     si, BufferOfs
  1492.                     DosCall <NET_SET_PRINTER_SETUP>
  1493.                 endif
  1494.             endif
  1495.         endif
  1496.     endif
  1497. endm
  1498.  
  1499. macro   GetPrinterSetup BufferSeg, BufferOfs, ListIndex
  1500.     macro   ErrMsg
  1501.         display "Caller must provide buffer address and Index parameters GetPrinterSetup."
  1502.         err
  1503.     endm
  1504.  
  1505.     ifb <BufferSeg>
  1506.         ErrMsg
  1507.     else
  1508.         ifb <BufferOfs>
  1509.             ErrMsg
  1510.         else
  1511.             ifb <ListIndex>
  1512.                 ErrMsg
  1513.             else
  1514.                 mov     al, 3
  1515.                 mov     bx, ListIndex
  1516.                 LoadSegment <es>, <BufferSeg>
  1517.                 mov     di, BufferOfs
  1518.                 DosCall <NET_GET_PRINTER_SETUP>
  1519.             endif
  1520.         endif
  1521.     endif
  1522. endm
  1523.  
  1524. macro   GetListEntry    ListIndex, DeviceSeg, DeviceOfs, NetworkSeg, NetworkOfs
  1525.     macro   ErrMsg
  1526.         display "Caller must provide ListIndex and buffer address parameters to GetListEntry."
  1527.         err
  1528.     endm
  1529.  
  1530.     ifb <ListIndex>
  1531.         ErrMsg
  1532.     else
  1533.         ifb <DeviceSeg>
  1534.             ErrMsg
  1535.         else
  1536.             ifb <DeviceOfs>
  1537.                 ErrMsg
  1538.             else
  1539.                 ifb <NetworkSeg>
  1540.                     ErrMsg
  1541.                 else
  1542.                     ifb <NetworkOfs>
  1543.                         ErrMsg
  1544.                     else
  1545.                         mov     al, 2
  1546.                         mov     bx, ListIndex
  1547.                         LoadSegment <ds>, <DeviceSeg>
  1548.                         LoadSegment <es>, <NetworkSeg>
  1549.                         mov     si, DeviceOfs
  1550.                         mov     di, NetworkOfs
  1551.                         DosCall <NET_GET_REDIRECTION_LIST>
  1552.                     endif
  1553.                 endif
  1554.             endif
  1555.         endif
  1556.     endif
  1557. endm
  1558.  
  1559. macro   GetListEntry    Type, Save, DeviceSeg, DeviceOfs, NetworkSeg, NetworkOfs
  1560.     macro   ErrMsg
  1561.         display "Caller must provide ListIndex and buffer address parameters to GetListEntry."
  1562.         err
  1563.     endm
  1564.  
  1565.     ifb <Type>
  1566.         ErrMsg
  1567.     else
  1568.         ifb <Save>
  1569.             ErrMsg
  1570.             ifb <DeviceSeg>
  1571.                 ErrMsg
  1572.             else
  1573.                 ifb <DeviceOfs>
  1574.                     ErrMsg
  1575.                 else
  1576.                     ifb <NetworkSeg>
  1577.                         ErrMsg
  1578.                     else
  1579.                         ifb <NetworkOfs>
  1580.                             ErrMsg
  1581.                         else
  1582.                             mov     al, 3
  1583.                             mov     bl, Type
  1584.                             mov     cx, Save
  1585.                             LoadSegment <ds>, <DeviceSeg>
  1586.                             LoadSegment <es>, <NetworkSeg>
  1587.                             mov     si, DeviceOfs
  1588.                             mov     di, NetworkOfs
  1589.                             DosCall <NET_REDIRECT_DEVICE>
  1590.                         endif
  1591.                     endif
  1592.                 endif
  1593.             endif
  1594.         endif
  1595.     endif
  1596. endm
  1597.  
  1598. macro   GetListEntry    DeviceSeg, DeviceOfs
  1599.     macro   ErrMsg
  1600.         display "Caller must provide ListIndex and buffer address parameters to GetListEntry."
  1601.         err
  1602.     endm
  1603.  
  1604.     ifb <DeviceSeg>
  1605.         ErrMsg
  1606.     else
  1607.         ifb <DeviceOfs>
  1608.             ErrMsg
  1609.         else
  1610.             mov     al, 4
  1611.             mov     cx, Save
  1612.             LoadSegment <ds>, <DeviceSeg>
  1613.             mov     si, DeviceOfs
  1614.             DosCall <NET_CANCEL_REDIRECT>
  1615.         endif
  1616.     endif
  1617. endm
  1618.  
  1619. macro   GetPSPAddress
  1620.     DosCall <DOS_GET_PSP>
  1621. endm
  1622.  
  1623. macro   LeadByteTable   Function, Console
  1624.     ifb <Function>
  1625.         display "Caller must provide Function parameter to LeadByteTable."
  1626.         err
  1627.     else
  1628.         ifnb    <Console>
  1629.             mov     dl, Console
  1630.         else
  1631.             mov     al, Function
  1632.             DosCall <DOS_GET_LEAD_BYTE_TABLE>
  1633.         endif
  1634.     endif
  1635. endm
  1636.  
  1637.