home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / DOS_HELP / DOS_FUNC.ZIP / DOS_FUNC.PF0 next >
Encoding:
Text File  |  1990-04-18  |  12.3 KB  |  528 lines

  1. public _filestat(),_attrib(),_getfree(),_prtscn(),_prtstat()
  2. public _setdate(),_settime(),_setfdate()
  3.  
  4. function _filestat(f_name,type)
  5. '============================================================================
  6. 'Written by Dave Skalick
  7. '----------------------------------------------------------------------------
  8. ' This function will return information on a file based on the file name
  9. ' and a request code.  This is accomplished by service calls to int x21h.
  10. '
  11. ' f_name -- file name to return information on
  12. '   type -- request code
  13. ' type codes:
  14. '        1 -- time
  15. '        2 -- date
  16. '        3 -- size
  17. '        4 -- attributes
  18. '        5 -- name
  19. '============================================================================
  20. local ax_reg,dx_reg,es_reg
  21. local old_es,old_bx
  22. local f_mem,dta_mem
  23. local seg,offset
  24. local _a,_t,_d,_s,_at,_f
  25.  
  26. '--- setup and pack file name in memory location ---
  27. memalloc f_mem sizeof "35s"
  28. mempack f_mem "35s" f_name
  29.  
  30. '--- setup new memory location for dta ---
  31. memalloc dta_mem size 128
  32.  
  33. '--- call for current dta location ---
  34. setreg(ax,0x2F00)
  35. interrupt 0x21
  36.  
  37. '--- store current dta location ---
  38. old_es=getreg(es)
  39. old_bx=getreg(bx)
  40.  
  41. '--- determine current segment and offset of dta memory location ---
  42. seg=dta_mem/65536
  43. offset=mod(dta_mem,65536)
  44.  
  45. '--- set segement and offset in registers for new dta ---
  46. setreg(ds,seg)
  47. setreg(dx,offset)
  48.  
  49. '--- set service number for new dta location and call interupt 21 ---
  50. setreg(ax,0x1A00)
  51. interrupt 0x21
  52.  
  53. '--- determine current segment and offset of filename memory location ---
  54. seg=f_mem/65536
  55. offset=mod(f_mem,65536)
  56.  
  57. '--- set segement and offset in registers for filename ---
  58. setreg(ds,seg)
  59. setreg(dx,offset)
  60.  
  61. '--- set cx for matching all attributes ---
  62. setreg(cx,0x00FF)
  63.  
  64. '--- set service number to find file and store information in dta location ---
  65. setreg(ax,0x4E00)
  66. interrupt 0x21
  67.  
  68. '--- get the result code from 4E call ---
  69. ax_reg=getreg(ax)
  70.  
  71. '--- set segement and offset in registers of orriginal dta ---
  72. setreg(ds,old_es)
  73. setreg(dx,old_bx)
  74.  
  75. '--- set service number for orriginal dta location and call interupt 21 ---
  76. setreg(ax,0x1A00)
  77. interrupt 0x21
  78.  
  79. '--- free filename memory ---
  80. memfree f_mem
  81.  
  82. '--- if error then exit with error message ---
  83. if bitand(ax_reg,255)<>0
  84.    errormessage 7 "File not found"
  85.    return(0)
  86. end if
  87.  
  88. '--- unpack dta for attribute, time, date, & size then clear memory---
  89. memunpack dta_mem "21xbwwl13s" _a _t _d _s _f
  90. memfree dta_mem
  91.  
  92. '--- return information based on user request ---
  93. case type
  94.  
  95.    '--- time ---
  96. when 1
  97.    return(right("00"|str(int(_t/2048)),2)|":"|right("00"|str(bitand(_t,2016)/32),2)|":00")
  98.  
  99.    '--- date ---
  100. when 2
  101.    return(right("00"|str(bitand(_d,480)/32),2)|"/"|right("00"|str(bitand(_d,31)),2)|"/"|right("0000"|str(int(_d/512)+1980),4))
  102.  
  103.    '--- file size ---
  104. when 3
  105.    return(_s)
  106.  
  107.    '--- attribute ---
  108. when 4
  109.  
  110.    '--- archive ---
  111.    if bitand(_a,32)=32
  112.       _at=_at|"A"
  113.    end if
  114.  
  115.    '--- directory ---
  116.    if bitand(_a,16)=16
  117.       _at=_at|"D"
  118.    end if
  119.  
  120.    '--- volume ---
  121.    if bitand(_a,8)=8
  122.       _at=_at|"V"
  123.    end if
  124.  
  125.    '--- system ---
  126.    if bitand(_a,4)=4
  127.       _at=_at|"S"
  128.    end if
  129.  
  130.    '--- hidden ---
  131.    if bitand(_a,2)=2
  132.       _at=_at|"H"
  133.    end if
  134.  
  135.    '--- read-only ---
  136.    if bitand(_a,1)=1
  137.       _at=_at|"R"
  138.    end if
  139.  
  140.    return(_at)
  141.  
  142.    '--- file name and extention ---
  143. when 5
  144.    return(_f)
  145.  
  146. end case
  147. end function
  148.  
  149. function _attrib(f_name,r_w,new_att)
  150. '============================================================================
  151. 'Written by Dave Skalick
  152. '----------------------------------------------------------------------------
  153. 'This function will read or set the attributes for any file.
  154. '
  155. '    f_name -- is the file to read/set the attributes on
  156. '       r_w -- 0 to read the attribute and 1 to set the attribute
  157. '   new_att -- New attributes to set the file to (only works if r_w is 1)
  158. '============================================================================
  159. local ax_reg,cx_reg,f_mem,ret_val,seg,offset,flags_reg
  160.  
  161. cx_reg=0
  162. if lower(new_att)!"a"
  163.    cx_reg=cx_reg+32
  164. end if
  165. if lower(new_att)!"d"
  166.    cx_reg=cx_reg+16
  167. end if
  168. if lower(new_att)!"v"
  169.    cx_reg=cx_reg+8
  170. end if
  171. if lower(new_att)!"s"
  172.    cx_reg=cx_reg+4
  173. end if
  174. if lower(new_att)!"h"
  175.    cx_reg=cx_reg+2
  176. end if
  177. if lower(new_att)!"r"
  178.    cx_reg=cx_reg+1
  179. end if
  180.  
  181. '--- setup and pack file name in memory location ---
  182. memalloc f_mem sizeof "35s"
  183. mempack f_mem "35s" f_name
  184.  
  185. '--- determine current segment and offset of filename memory location ---
  186. seg=f_mem/65536
  187. offset=mod(f_mem,65536)
  188.  
  189. '--- set segement and offset in registers for filename ---
  190. setreg(ds,seg)
  191. setreg(dx,offset)
  192.  
  193. '--- free filename memory ---
  194. memfree f_mem
  195.  
  196. '--- set ah with service number (hex:0x43 -- dec:17152) ---
  197. ax_reg=17152
  198.  
  199. '--- r_w=0 then read attributes -- r_w=1 then set cx reg with new attr ---
  200. if r_w=1
  201.    ax_reg=ax_reg+1
  202.    setreg(cx,cx_reg)
  203. end if
  204.  
  205. '--- set ax register for attribute and call interrupt 21 ---
  206. setreg(ax,ax_reg)
  207. interrupt 0x21
  208.  
  209. '--- check for error ---
  210. flags_reg=getreg(flags)
  211. if bitand(flags_reg,1)=1
  212.    return(0)
  213. end if
  214.  
  215. if r_w=1
  216.    '--- if no error on write then return true ---
  217.    return(1)
  218. else
  219.    '--- if request for attribute then get current attribute setting ---
  220.    cx_reg=getreg(cx)
  221.  
  222.    ret_val=""
  223.  
  224.    '--- archive ---
  225.    if bitand(cx_reg,32)=32
  226.       ret_val=ret_val|"A"
  227.    end if
  228.  
  229.    '--- directory ---
  230.    if bitand(cx_reg,16)=16
  231.       ret_val=ret_val|"D"
  232.    end if
  233.  
  234.    '--- volume ---
  235.    if bitand(cx_reg,8)=8
  236.       ret_val=ret_val|"V"
  237.    end if
  238.  
  239.    '--- system ---
  240.    if bitand(cx_reg,4)=4
  241.       ret_val=ret_val|"S"
  242.    end if
  243.  
  244.    '--- hidden ---
  245.    if bitand(cx_reg,2)=2
  246.       ret_val=ret_val|"H"
  247.    end if
  248.  
  249.    '--- read-only ---
  250.    if bitand(cx_reg,1)=1
  251.       ret_val=ret_val|"R"
  252.    end if
  253.  
  254.    return(ret_val)
  255.  
  256. end if
  257. end function
  258.  
  259. function _getfree(dr)
  260. '=======================================================================
  261. ' Will determine the disk space left on the driver letter specified
  262. '
  263. ' dr -- drive letter
  264. '-----------------------------------------------------------------------
  265. local _ax,_bx,_cx,drive
  266. if len(dr)=1 and (asc(upper(dr))>=65 and asc(upper(dr))<=90)
  267.    drive=asc(upper(dr))-64
  268. else
  269.    return(-1)
  270. end if
  271. setreg(dx,drive)
  272. setreg(ax,0x3600)
  273. interrupt 0x21
  274. _ax=getreg(ax)
  275. _bx=getreg(bx)
  276. _cx=getreg(cx)
  277. if _ax=735
  278.    return(-1)
  279. else
  280.    return(_ax*_bx*_cx)
  281. end if
  282. end function
  283.  
  284. function _prtscn()
  285. '=======================================================================
  286. 'performs a print screen via the bios interrupt 5
  287. '-----------------------------------------------------------------------
  288. interrupt 5
  289. end function
  290.  
  291. function _prtstat(port)
  292. '=======================================================================
  293. 'Will return a 1 if printer is ready or 0 if not
  294. '
  295. 'port -- parallel port number to check
  296. '-----------------------------------------------------------------------
  297. local ax_reg
  298. if port<1 or port>2
  299.    return(0)
  300. end if
  301.  
  302. setreg(ax,0x0200)
  303. setreg(dx,port-1)
  304. interrupt 0x17
  305.  
  306. ax_reg=getreg(ax)
  307. if bitand(ax_reg,32768)=32768 and bitand(ax_reg,4096)=4096
  308.    return(1)
  309. end if
  310. if bitand(ax_reg,2048)=2048 or bitand(ax_reg,512)=512
  311.    return(0)
  312. end if
  313. end function
  314.  
  315. function _setdate(set_date)
  316. '=======================================================================
  317. 'Will return 1 if current system date is set and 0 if it is not.
  318. '
  319. 'set_date -- new system date
  320. '-----------------------------------------------------------------------
  321. local ax_reg,cx_reg,dx_reg,flags_reg
  322. local m,d,y
  323.  
  324. if not(isdate(set_date))
  325.    errormessage 7 "invalid date type"
  326.    return(0)
  327. end if
  328. m=month(set_date)
  329. d=day(set_date)
  330. y=year(set_date)
  331.  
  332. if y<1980 or y>2099
  333.    errormessage 7 "Invalid year.  Must be between 1980 and 2099."
  334.    return(0)
  335. end if
  336.  
  337. '--- set cx reg with new year ---
  338. cx_reg=y
  339. setreg(cx,cx_reg)
  340.  
  341. '--- setup dx reg with month and day ---
  342. dx_reg=256*m
  343. dx_reg=dx_reg+d
  344. setreg(dx,dx_reg)
  345.  
  346. '--- setup service call in ax reg ---
  347. ax_reg=0x2B00
  348. setreg(ax,ax_reg)
  349. interrupt 0x21
  350.  
  351. '--- get return from ax reg ---
  352. ax_reg=getreg(ax)
  353.  
  354. '--- check if error occured ---
  355. if bitand(ax_reg,255)<>0
  356.    return(0)
  357. else
  358.    return(1)
  359. end if
  360. end function
  361.  
  362.  
  363. function _settime(t)
  364. '=======================================================================
  365. 'Will return 1 if current system time is set and 0 if it is not.
  366. '
  367. ' t -- new system time
  368. '-----------------------------------------------------------------------
  369. local ax_reg,cx_reg,dx_reg,h,m,s
  370. case
  371.    when (t!!":") or (len(t)<8)
  372.       errormessage 7 "Invalid time type"
  373.       return(0)
  374.    when (val(mid(t,1,2))>24) or (val(mid(t,4,2))>59) or (val(mid(t,7,2))>59)
  375.       errormessage 7 "Invalid time type"
  376.       return(0)
  377.    when (mid(t,3,1)<>":") or (mid(t,6,1)<>":")
  378.       errormessage 7 "Invalid time type"
  379.       return(0)
  380.    when (val(mid(t,1,2))=24) and ((val(mid(t,4,2))>0) or (val(mid(t,7,2))>0))
  381.       errormessage 7 "Invalid time type"
  382.       return(0)
  383. end case
  384. t=timevalue(t)
  385. h=hour(t)
  386. m=minute(t)
  387. s=second(t)
  388.  
  389. '--- set hours and minutes in cx ---
  390. cx_reg=256*h
  391. cx_reg=cx_reg+m
  392. setreg(cx,cx_reg)
  393.  
  394. '--- set seconds in dx --
  395. dx_reg=256*s
  396. setreg(dx,dx_reg)
  397.  
  398. '--- set ax with service call 0x2D and call interrupt ---
  399. setreg(ax,0x2D00)
  400. interrupt 0x21
  401.  
  402. '--- check for error ---
  403. ax_reg=getreg(ax)
  404. if bitand(ax_reg,255)<>0
  405.    return(0)
  406. else
  407.    return(1)
  408. end if
  409. end function
  410.  
  411. function _setfdate(_fname,_newdate,_newtime)
  412. '=======================================================================
  413. 'Will return 1 if file date and time is set and 0 if it is not.
  414. '
  415. '   _fname -- file name to change date & time on
  416. ' _newdate -- new file date ("" means no change made)
  417. ' _newtime -- new file time ("" means no change made)
  418. '-----------------------------------------------------------------------
  419. local _floc,_segment,_offset,_flags,_ax,_handle
  420. local _olddate,_oldtime,_cx,_dx
  421. local _hr,_mn,_sc,_m,_d,_y
  422. if (len(_newdate)=0 and len(_newtime)=0) or not(isdate(_newdate))
  423.    errormessage 7 "invalid date and time"
  424.    return(0)
  425. end if
  426. if len(_newdate)<>0
  427.    _m=month(_newdate)
  428.    _d=day(_newdate)
  429.    _y=year(_newdate)
  430. end if
  431. if len(_newtime)<>0
  432.    case
  433.       when (_newtime!!":") or (len(_newtime)<8)
  434.          errormessage 7 "invalid time"
  435.          return(0)
  436.       when (val(mid(_newtime,1,2))>24) or (val(mid(_newtime,4,2))>59) or (val(mid(_newtime,7,2))>59)
  437.          errormessage 7 "invalid time"
  438.          return(0)
  439.       when (mid(_newtime,3,1)<>":") or (mid(_newtime,6,1)<>":")
  440.          errormessage 7 "invalid time"
  441.          return(0)
  442.       when (val(mid(_newtime,1,2))=24) and ((val(mid(_newtime,4,2))>0) or (val(mid(_newtime,7,2))>0))
  443.          errormessage 7 "invalid time"
  444.          return(0)
  445.    end case
  446.    _hr=hour(timevalue(_newtime))
  447.    _mn=minute(timevalue(_newtime))
  448.    _sc=second(timevalue(_newtime))
  449. end if
  450.  
  451. '--- allocate memory for file name and store name ---
  452. memalloc _floc size 32
  453. mempack _floc "32s" _fname
  454.  
  455. '--- setup segment and offset of file name ---
  456. _segment=_floc/65536
  457. _offset=mod(_floc,65536)
  458.  
  459. '--- setup ds:dx with file name pointer ---
  460. setreg(ds,_segment)
  461. setreg(dx,_offset)
  462.  
  463. '--- send service number and request and call interrupt ---
  464. setreg(ax,0x3D00)
  465. interrupt 0x21
  466.  
  467. '--- check for error ---
  468. _flags=getreg(flags)
  469. if bitand(_flags,1)=1
  470.    errormessage 7 "error opening file"
  471.    return(_flags)
  472. end if
  473.  
  474. '--- get file handle ---
  475. _handle=getreg(ax)
  476.  
  477. '--- request file date and time ---
  478. setreg(bx,_handle)
  479. setreg(ax,0x5700)
  480. interrupt 0x21
  481.  
  482. '--- get current file date and time ---
  483. _olddate=getreg(dx)
  484. _oldtime=getreg(cx)
  485.  
  486. '--- determine date and time stamp ---
  487. if len(_newdate)=0
  488.    _dx=_olddate
  489. else
  490.    _dx=(512*(_y-1980))+(32*_m)+(_d)
  491. end if
  492.  
  493. if len(_newtime)=0
  494.    _cx=_oldtime
  495. else
  496.    _cx=(2048*_hr)+(32*_mn)+int(_sc/2)
  497. end if
  498.  
  499. '--- set registers and call interrupt ---
  500. setreg(dx,_dx)
  501. setreg(cx,_cx)
  502. setreg(bx,_handle)
  503. setreg(ax,0x5701)
  504. interrupt 0x21
  505.  
  506. '--- check for error ---
  507. _flags=getreg(flags)
  508. if bitand(_flags,1)=1
  509.    errormessage 7 "error setting date and time"
  510.    return(_flags)
  511. end if
  512.  
  513. '--- close file ---
  514. setreg(bx,_handle)
  515. setreg(ax,0x3E00)
  516. interrupt 0x21
  517.  
  518. '--- check for error ---
  519. _flags=getreg(flags)
  520. if bitand(_flags,1)=1
  521.    errormessage 7 "error closing file"
  522.    return(_flags)
  523. end if
  524.  
  525. return(1)
  526. end function
  527.  
  528.