home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDOS / DOSPLSOR.ARK / FDATE.MAC < prev    next >
Text File  |  1986-10-29  |  14KB  |  740 lines

  1. title    'FDATE list file dates'
  2. ;
  3. ver    equ    10
  4. cr    equ    0dh
  5. lf    equ    0ah
  6. tab    equ    09h
  7. ;
  8. ; CPM/DOS+ syscall values
  9. @cin    equ    1
  10. @cout    equ    2
  11. @csta    equ    11
  12. @seldk    equ    14
  13. @srch1    equ    17
  14. @srchn    equ    18
  15. @curdk    equ    25
  16. @stdma    equ    26
  17. @usrcd    equ    32
  18. ;
  19. ; CPM/DOS+ definitions
  20. reboot    equ    0
  21. sysfnc    equ    reboot+5;    connector to BDOS system
  22. defdma    equ    reboot+080h
  23. ;
  24. ; UPPER case in following line for M80. SLRMAC does not need the file.
  25. INCLUDE    Z80.LIB
  26. ;
  27. ;    --------- Start    ----------
  28. ;
  29.     jmp    begin
  30. ;
  31. maxusr:    db    31
  32. ;
  33. ; Upshift (a) if lower case alpha.
  34. ; a,f
  35. upshft:    cpi    'a'
  36.     rc
  37.     cpi    'z'+1
  38.     rnc
  39.     ani    05fh
  40.     ret
  41. ;
  42. ; Check (a) valid digit, carry if not
  43. ; f
  44. qnum:    cpi    '0'
  45.     rc
  46.     cpi    '9'+1
  47.     cmc
  48.     ret
  49. ;
  50. ; crlf to console
  51. ; a,f
  52. crlf:    mvi    a,cr
  53.     call    couta
  54.     mvi    a,lf
  55. ;    "    "
  56. ; console output from (a)
  57. ; a,f
  58. couta:    push    d
  59.     mov    e,a
  60.     mvi    a,@cout
  61.     call    bdos
  62.     pop    d
  63.     ret
  64. ;
  65. ; Numeric 1..99 to console.  Convert to Ascii, no zero suppress
  66. ; a,f
  67. putnum:    push    b
  68.     mvi    c,'0'-1
  69. pn1:    inr    c
  70.     adi    -10
  71.     jrc    pn1
  72.     adi    10
  73.     push    psw
  74.     mov    a,c
  75.     call    couta
  76.     pop    psw
  77.     pop    b
  78.     adi    '0'
  79.     jr    couta
  80. ;
  81. ; Test for any console character ready. If so purge it and
  82. ; return nz flag.  Else return z flag.  Nulls absorbed
  83. ; a,f
  84. qbreak:    mvi    a,@csta
  85.     call    bdos
  86.     rz
  87.     mvi    a,@cin
  88.     jr    bdos
  89. ;
  90. ; search next on (de)^. Z flag for failure, exit (a) incremented
  91. ; a,f
  92. srchn:    mvi    a,@srchn
  93. ;    "    "
  94. ; execute functions, Z flag for 0ffh, increment return value
  95. ; a,f
  96. sfncr:    call    bdos
  97.     inr    a
  98.     ret
  99. ;
  100. ; search for file fcbdrv. Z flag for failure, exit (a) incremented.
  101. ; a,f,d,e
  102. ffind:    lxi    d,fcbdrv
  103.     mvi    a,@srch1
  104.     jr    sfncr
  105. ;
  106. ; Find current logged disk
  107. qdisk:    mvi    a,@curdk
  108.     jr    bdos
  109. ;
  110. ; Set user to absolute value in fcbusr and select on BDOS.
  111. ; Do not modify or select drive. Leave drv/usr in bc
  112. ; Update fcbusr to absolute value
  113. ; a,f,b,c,e
  114. setusr:    lbcd    fcbusr;        c := user, b := drive
  115.     mov    a,c
  116.     ora    a
  117.     cm    quser;        default, get current user
  118.     mov    c,a;        now an absolute value
  119.     sbcd    fcbusr
  120. ;    "    "
  121. ; set user to a
  122. ; a,f,e
  123. susera:    mov    e,a
  124.     jr    suser
  125. ;
  126. ; find current user code
  127. ; a,f,e
  128. quser:    mvi    e,0ffh
  129. ;    "    "
  130. ; set user (e)
  131. ; a,f
  132. suser:    mvi    a,@usrcd
  133. ;    "    "
  134. ; execute bdos call, return (a), set flags. Preserve other registers
  135. ; This is the sole connection to the outside world.
  136. ; a,f
  137. bdos:    push    h
  138.     push    d
  139.     push    b
  140.     pushix
  141.     mov    c,a
  142.     call    sysfnc
  143.     ora    a;        set flags on return value
  144.     popix
  145.     pop    b
  146.     pop    d
  147.     pop    h
  148.     ret
  149. ;
  150. ; set drive/user from fcbusr/fcbdrv
  151. setdu:    call    setusr;        and b := drv, c := usr
  152.     mov    a,b
  153.     dcr    a
  154.     cm    qdisk;        get default disk
  155.     mov    b,a
  156.     inr    b
  157.     sbcd    fcbusr;        jam id
  158. ;    "    "
  159. ; select drive (a). DOS handles redundancies.
  160. ; a,f,e
  161. seldka:    ani    0fh
  162.     mov    e,a
  163.     mvi    a,@seldk
  164.     jr    bdos
  165. ;
  166. ; Parse the next field from the command line (IX^) into fcbdrv. Any
  167. ; drive/user specifications are recorded in fcbdrv and fcbusr
  168. ; (which default to 0 and -1 respectively).  name and type are parsed
  169. ; into fname and ftype, blank padded, with any '*'s expanded into
  170. ; '?'s, and the fields are blank padded.  At exit IX points to the
  171. ; field terminating delimiter char and lastwd points to the 1st char.
  172. ; a contains a count of '?' characters in fname & ftype fields, with
  173. ; flags set on it.  Illegal chars. cause abort.
  174. ; a,f,b,c,d,e,h,l,ix
  175. parse:    xra    a
  176. ;    "    "
  177. ; Entry to parse 2nd drive spec. for xcom, when a = 010h
  178. parsef:    lxi    h,fcbusr
  179.     call    index;        select fcb or alternate fcb
  180.     call    skipbk;        skip any leading blanks
  181.     sixd    lastwd;        save marker for errors
  182.     call    getdu;        c := user, b := drv
  183.     mov    m,c;        set fcbusr
  184.     inx    h
  185.     mov    m,b;        set fcbdrv, set up for ldfld
  186.     call    lastch
  187.     cpi    ':'
  188.     cz    nextch;        Absorb any du terminating ':'
  189.     mvi    b,8
  190.     push    h
  191.     call    ldfld;        fill the name field
  192.     call    lastch
  193.     cpi    '.'
  194.     cz    nextch;        Absorb any name terminating '.'
  195.     mvi    b,3;         (else terminator blank fills)
  196.     call    ldfld;        fill the type field
  197.     mvi    b,3
  198. parse1:    inx    h
  199.     mvi    m,0
  200.     djnz    parse1;        zero ex, s2, s1 fields
  201.     lxi    b,11 shl 8;    b := 11, c := 0
  202.     pop    h
  203.     mvi    a,'?'
  204. parse2:    inx    h
  205.     cmp    m
  206.     jrnz    parse3
  207.     inr    c
  208. parse3:    djnz    parse2;        count the '?'s in fname/ftype
  209.     mov    a,c
  210.     ora    a;        z flag for no wild cards
  211.     ret
  212. ;
  213. ; load up to (b) chars from (ix)^ up to (hl)^ up.
  214. ; skip to delimiter.  Implement any wild cards on "*"
  215. ; blank fill if less than (b) chars available.
  216. ; Upshift any lower case characters.
  217. ; a,f,b,h,l,ix
  218. ldfld:    call    lastch;        on (ix)^ and load it
  219.     jrz    ldfld4;        delimiter
  220.     inx    h
  221.     cpi    '*'
  222.     jrnz    ldfld1
  223.     mvi    m,'?';        expand '*'
  224.     jr    ldfld2;        dont skip past it
  225. ldfld1:    call    upshft;        upshift any lower case
  226.     mov    m,a
  227.     call    nextch
  228. ldfld2:    djnz    ldfld
  229.     call    lastch;        on (de)^ and load it
  230.     rz;            a delimiter
  231. ldfld3:    call    nextch;        else skip to a delimiter
  232.     rz
  233.     jr    ldfld3
  234. ldfld4:    inx    h
  235.     mvi    m,' ';        blank fill
  236.     djnz    ldfld4
  237.     ret
  238. ;
  239. ; getdu returns any "du" spec. in b and c, with c = user, b = drv
  240. ; The default user is signified by a -1 value, default drive by 0
  241. ; At entry, IX points to the start of the field to be parsed. At
  242. ; exit, either IX is unchanged (no du found), or points to ':'
  243. ; a,f,b,c,d,e,ix
  244. getdu:    lxi    b,0ffh;        set defaults
  245.     pushix
  246.     pop    d;        pre-scan for valid du field
  247.     ldax    d
  248.     call    upshft;        2.1 - No ':' abort here
  249.     call    qnum
  250.     jrnc    getdu1;        1st char digit, no d
  251.     cpi    '@'
  252.     rc;            < '@', no du spec
  253.     cpi    'P'+1
  254.     rnc;            > P, no du spec
  255.     inx    d
  256.     ldax    d
  257.     cpi    ':'
  258.     jrz    getdu2;        d spec only
  259.     call    qnum
  260.     rc;            no 'du' spec
  261. getdu1:    inx    d
  262.     ldax    d
  263.     cpi    ':'
  264.     jrz    getdu2;        du spec found
  265.     call    qnum
  266.     rc;            no du spec
  267.     inx    d
  268.     ldax    d
  269.     cpi    ':'
  270.     rnz;            not terminal ':', no du spec
  271. ;    "    "
  272. ; prescan found a valid du format, now load it
  273. getdu2:    call    lastch
  274.     call    qnum
  275.     jrnc    getdu3;        digit, no d portion
  276.     call    upshft
  277.     sui    '@'
  278.     mov    b,a;        save d portion
  279.     call    nextch
  280. getdu3:    cpi    ':'
  281.     rz;            no 'u' portion
  282.     ani    0fh
  283.     mov    c,a
  284.     call    nextch
  285.     rz;            ':', 1 digit only
  286.     call    dstep;        incorporate
  287.     call    nextch;        and advance to the (known) ':'
  288.     lda    maxusr
  289.     cmp    c
  290.     jrc    help;        User # too large
  291.     ret
  292. ;
  293. ; Decimal input step. Carry for overflow. c is accumulator, a digit
  294. ; a,f,c,d
  295. dstep:    ani    0fh
  296.     mov    d,a
  297.     mov    a,c
  298.     cpi    26
  299.     cmc
  300.     rc;            overflow
  301.     add    a
  302.     add    a
  303.     add    c;        5*
  304.     add    a;        10*
  305.     add    d
  306.     mov    c,a;        result
  307.     ret;            cy for overflow
  308. ;
  309. ; Get next character from line.  Z flag for a delimiter,
  310. ; and abort if the character is illegal. Do not advance past eoln.
  311. ; Return char in a and leave IX pointing to it. cy for eoln
  312. ; a,f,ix
  313. nextch:    ldx    a,+0
  314.     ora    a
  315.     jrz    lastch;        don't advance past eol
  316.     inxix
  317. ;    "    "
  318. ; Return last character, as above.  Abort if invalid, cy for eoln
  319. ; a,f
  320. lastch:    ldx    a,+0
  321.     ora    a
  322.     stc
  323.     rz;            null is a delimiter
  324.     cpi    '=';        and all these
  325.     rz
  326.     cpi    '_'
  327.     rz
  328.     cpi    '.'
  329.     rz
  330.     cpi    ':'
  331.     rz
  332.     cpi    ';'
  333.     rz
  334.     cpi    '<'
  335.     rz
  336.     cpi    '>';        Redirection chars
  337.     rz
  338.     cpi    ',';        Operand separator
  339.     rz
  340.     cpi    '|';        Piping  separator
  341.     rz;
  342. ;    "    "
  343. ; Check white space, abort on illegal chars. z flag for white
  344. qwhite:    cpi    tab
  345.     rz;            white space is a delimiter
  346.     cpi    ' '
  347.     jrc    help;        abort on illegals
  348.     ret
  349. ;
  350. ; skip blanks and tabs in input line.  Abort on illegal chars.
  351. ; return the 1st non-blank char. found.
  352. ; a,f,ix
  353. skipbk:    call    lastch
  354.     rc;            eoln
  355. skip1:    call    qwhite
  356.     rnz;            not white space
  357. ;    "    "
  358. ; Effectively "call nextch ! call skipbk"
  359. next:    call    nextch
  360.     jrnc    skip1
  361.     ret;            eoln
  362. ;
  363. ; hl := hl + a
  364. ; a,f,h,l
  365. index:    add    l
  366.     mov    l,a
  367.     rnc
  368.     inr    h
  369.     ret
  370. ;
  371. ; load (a+c)th char from defdma array
  372. ; a,f,h,l
  373. idxac:    lxi    h,defdma
  374.     add    c
  375.     call    index
  376.     mov    a,m
  377.     ret
  378. ;
  379. ; crlf, then tstr
  380. ; a,f,h,l
  381. tstrc:    call    crlf
  382. ;    "    "
  383. ; string (hl) to console until 0 byte
  384. ; a,f,h,l
  385. tstr:    mov    a,m
  386.     ora    a
  387.     rz
  388.     inx    h
  389.     call    couta
  390.     jr    tstr
  391. ;
  392. help:    lxi    h,hlpmsg
  393. ;    "    "
  394. ; exit with message
  395. msgxit:    call    tstrc
  396.     jr    done
  397. ;
  398. ; no time stamp message & exit
  399. notime:    lxi    h,notimemsg
  400.     jr    msgxit
  401. ;
  402. ; jam fcb to all wild cards
  403. mkwild:    lxi    h,fname
  404.     mvi    b,11
  405. mkwld1:    mvi    m,'?'
  406.     inx    h
  407.     djnz    mkwld1
  408.     ret
  409. ;
  410. ; one blank to console
  411. blk:    mvi    b,1
  412. ;    "    "
  413. ; blank to console
  414. blks:    mvi    a,' '
  415.     call    couta
  416.     djnz    blks
  417.     ret
  418. ;
  419. ; Main program operation
  420. begin:    lxi    h,0
  421.     dad    sp
  422.     shld    stksav
  423.     lxi    sp,stksav
  424.     lxi    h,defdma
  425.     mov    a,m
  426.     ora    a
  427.     inx    h
  428.     push    h
  429.     popix;            init input scanner
  430.     jz    help;        empty input line
  431.     call    skipbk
  432.     jc    help;        or only blanks
  433.     call    parse
  434.     lda    fname
  435.     cpi    ' '
  436.     cz    mkwild;        must be a du spec
  437.     call    setdu
  438.     call    ffind;        sets de := ^fcbdrv
  439.     cnz    flist;        If any found, list them
  440. done:    lhld    stksav
  441.     sphl
  442.     ret
  443. ;
  444. ; List files found
  445. flist:    push    psw
  446.     lda    defdma + 060h
  447.     cpi    021h
  448.     jrnz    notime;        and abort
  449.     lxi    h,head
  450.     call    tstrc
  451.     pop    psw
  452. flist1:    dcr    a;        compensate for file-find inr
  453.     push    psw
  454.     mvi    c,060h
  455.     add    a;        2*
  456.     mov    b,a
  457.     add    a;        4*
  458.     add    a;        8*
  459.     add    b;        10*
  460.     adi    2;        displacement of 1st stamp
  461.     call    idxac;        point to time stamp
  462.     lxi    d,fcreat
  463.     lxi    b,10
  464.     ldir;            move into fcb on 1st
  465. ; really want min of all create, max of modify/access for file
  466.     pop    psw
  467.     rrc
  468.     rrc
  469.     rrc
  470.     ani    060h
  471.     mvi    c,1
  472.     call    idxac;        point to DIR entry
  473.     call    crlf
  474.     lda    fcbdrv
  475.     adi    '@'
  476.     call    couta
  477.     lda    fcbusr
  478.     call    putnum
  479.     mvi    a,':'
  480.     call    couta
  481.     mvi    b,8
  482.     call    tname
  483.     mvi    a,'.'
  484.     call    couta
  485.     mvi    b,3
  486.     call    tname
  487.     mvi    b,2
  488.     call    blks
  489.     call    dates
  490.     call    qbreak
  491.     rnz
  492.     call    srchn
  493.     jnz    flist1
  494.     ret
  495. ;
  496. dates:    lhld    fcreat
  497.     call    date
  498.     mvi    b,2
  499.     call    blks
  500.     lhld    fmodif
  501.     call    date
  502.     call    blk
  503.     lhld    fmodif+2
  504.     call    time
  505.     mvi    b,2
  506.     call    blks
  507.     lhld    facces
  508.     call    date
  509.     call    blk
  510.     lhld    facces+2
  511.     call    time
  512.     ret
  513. ;
  514. date:    mvi    b,8
  515.     mov    a,h
  516.     ora    l
  517.     jz    blks
  518.     call    drtodate
  519.     mov    a,c;        year
  520.     call    t2hx
  521.     mvi    a,'/'
  522.     call    couta
  523.     mov    a,d
  524.     call    t2hx
  525.     mvi    a,'/'
  526.     call    couta
  527.     mov    a,e
  528.     jmp    t2hx
  529. ;
  530. time:    mvi    b,5
  531.     mov    a,h
  532.     ora    l
  533.     jz    blks
  534.     mov    a,l
  535.     call    t2hx
  536.     mvi    a,':'
  537.     call    couta
  538.     mov    a,h
  539. ;    "    "
  540. t2hx:    push    psw
  541.     rlc
  542.     rlc
  543.     rlc
  544.     rlc
  545.     call    t1hx
  546.     pop    psw
  547. ;    "    "
  548. t1hx:    ani    0fh
  549.     adi    090h
  550.     daa
  551.     aci    040h
  552.     daa
  553.     jmp    couta
  554. ;
  555. ; type b chars from hl^
  556. tname:    mov    a,m
  557.     ani    07fh
  558.     call    couta
  559.     inx    h
  560.     djnz    tname
  561.     ret
  562. ;
  563. ; days per month, except leap year. Leading dummy 0 for month 0
  564. mtbl:    db    0,31,28,31,30,31,30,31,31,30,31,30,31
  565. ;
  566. ; Convert (a) in binary to BCD. No overflow check. Return z flag.
  567. ; a,f
  568. binbcd:    push    b
  569.     lxi    b,0affh;        b := 10, c := -1
  570. bbcd1:    inr c !    sub b !jrnc bbcd1;    divide by 10
  571.     add    b;            correct remainder
  572.     mov    b,a
  573.     mov    a,c;            quotient
  574.     add a !    add a !    add a !    add a;    * 16. Cy for o'flow
  575.     add    b;            + remainder. clears cy
  576.     pop    b
  577.     ret
  578. ;
  579. ; PROCEDURE drtodate(thedate : integer; VAR yr, mo, day : integer);
  580. ; (* 1 Jan 1978 corresponds to Digital Research date = 1  *)
  581. ; (* BUG - cannot handle negative values for dates > 2067 *)
  582. ;
  583. ;   VAR
  584. ;     i, y1        : integer;
  585. ;     dayspermonth : ARRAY[1..12] OF 1..31;
  586. ;
  587. ;   BEGIN (* drtodate *)
  588. ;   FOR i := 1 TO 12 DO dayspermonth[i] := 31;
  589. ;   dayspermonth[4] := 30; dayspermonth[6] := 30;
  590. ;   dayspermonth[9] := 30; dayspermonth[11] := 30;
  591. ;   IF thedate > 731 THEN BEGIN (* avoid overflows *)
  592. ;     yr := 1980; thedate := thedate - 731; END
  593. ;   ELSE BEGIN
  594. ;     thedate := thedate + 730; yr := 1976; END;
  595. ;   (* 0..365=y0; 366..730=y1; 731..1095=y2; 1096..1460=y3 *)
  596. ;   i := thedate DIV 1461; thedate := thedate MOD 1461;
  597. ;   y1 := (thedate-1) DIV 365; yr := yr + y1 + 4*i;
  598. ;   IF y1 = 0 THEN (* leap year *) dayspermonth[2] := 29
  599. ;   ELSE BEGIN
  600. ;     thedate := thedate - 1; (* 366 -> 365 -> 1 Jan *)
  601. ;     dayspermonth[2] := 28; END;
  602. ;   day := thedate - 365*y1 + 1; mo := 1;
  603. ;   WHILE day > dayspermonth[mo] DO BEGIN
  604. ;     day := day - dayspermonth[mo];
  605. ;     mo := succ(mo); END;
  606. ;   END; (* drtodate *)
  607. ;
  608. ; Incorporate (a) in year (c), overflows to century (b)
  609. addyr:    add    c
  610.     jnc    addyr1;        <256
  611.     sui    100;        256..276
  612.     jmp    addyr2
  613. addyr1:    dcr    b
  614. addyr2:    inr    b
  615.     sui    100
  616.     jnc    addyr2
  617.     adi    100;        b = century, c = year MOD 100
  618.     mov    c,a
  619.     ret
  620. ;
  621. ; divide hl by -de, rdr to hl, quotient to a
  622. divd:    mvi    a,-1
  623. divd1:    inr    a
  624.     dad    d
  625.     jc    divd1
  626.     push    psw
  627.     mov    a,l
  628.     sub    e
  629.     mov    l,a
  630.     mov    a,h
  631.     sbb    d
  632.     mov    h,a
  633.     pop    psw
  634.     ret
  635. ;
  636. ; Input  : hl = drdate (days since 78/1/1, 1 = 78/1/1)
  637. ; Output : b, c, d, e = cent, year, month, day (binary)
  638. ; a,f,b,c,d,e,h,l
  639. drtodate:
  640.     lxi    b,256*19 + 76;    731 represents 80/1/1
  641.     push    h
  642.     lxi    d,-731
  643.     dad    d
  644.     pop    h
  645.     jnc    drd1;        before 80/1/1
  646.     dad    d;        on or after 80/1/1
  647.     mvi    c,80;        now 0 represents 80/1/1
  648.     jmp    drd2
  649. drd1:    lxi    d,730
  650.     dad    d;        now 731 represents 78/1/1
  651. drd2:    lxi    d,-1461
  652.     call    divd;        get quad years since base (in c)
  653.     add    a
  654.     add    a;        4 * i.  180 max
  655.     call    addyr;        yr := yr + 4 * i
  656.     mov    a,h
  657.     ora    l
  658.     jz    drd3;        At Jan 1, leap year
  659.     dcx    h;        thedate := thedate - 1
  660.     lxi    d,-365;        so year thresholds come out right
  661.     call    divd;        thedate := thedate MOD 365
  662.     push    psw;        y1 := a := thedate DIV 365
  663.     call    addyr;        yr := yr+y1
  664.     pop    psw;        0 for leapyear
  665.     jnz    drd5;        not a leap year
  666.     inx    h;        thedate := thedate+1 (1..365)
  667. drd3:    mvi    a,29
  668.     sta    mtbl+2
  669. drd5:    xchg
  670.     lxi    h,mtbl
  671.     push    b
  672.     mvi    b,0;        mo := 0
  673. drd6:    inx    h;        WHILE
  674.     inr    b;         day := day-dayspermo[mo := mo+1] >= 0
  675.     mov    a,e;            DO (* again *)
  676.     sub    m
  677.     mov    e,a
  678.     mov    a,d
  679.     sbi    0
  680.     mov    d,a
  681.     jnc    drd6
  682.     mov    a,e;        day := day+dayspermo[mo]
  683.     add    m
  684.     mov    e,a;        range 0..pred(dayspermo[mo])
  685.     adc    d
  686.     sub    e
  687.     mov    d,a
  688.     xchg
  689.     mov    d,b
  690.     pop    b
  691.     mov    e,l
  692.     inr    e;        make result 1 based
  693.     mvi    a,28
  694.     sta    mtbl+2;        restore month table
  695.     mov    a,b
  696.     call    binbcd
  697.     mov    b,a
  698.     mov    a,c
  699.     call    binbcd
  700.     mov    c,a
  701.     mov    a,d
  702.     call    binbcd
  703.     mov    d,a
  704.     mov    a,e
  705.     call    binbcd
  706.     mov    e,a    
  707.     ret
  708. ;
  709. hlpmsg:        db    'FDATE ver. '
  710.         db    ver / 10 + '0', '.', ver mod 10 + '0'
  711.         db    'by C.B. Falconer',cr,lf,lf
  712.         db    'Usage: FDATE [d[u]:][afn.aft]',cr,lf
  713.         db    'shows timestamps for DOS+ directories',0
  714. notimemsg:    db    'No time stamps on this volume',0
  715. head:        db    'd/u:Filename.Typ  Created   '
  716.         db    '---Modified---  ---Accessed---',cr,lf
  717.         db    '--- -------- ---  --------  '
  718.         db    '--------------  --------------',0
  719. ;
  720. ; NOTE: the ",0" in ds statements ensures the areas are 0 filled
  721. ;
  722. ; File control block and receiver of parse fields (34 bytes)
  723. fcbusr:    ds    1
  724. fcbdrv:    ds    1
  725. fname:    ds    8
  726. ftype:    ds    3
  727.     ds    3
  728.     ds    1
  729. fcreat:    ds    2;        date created or disk map
  730. fmodif:    ds    4;        date/time modified
  731. facces:    ds    4;        date/time accessed
  732. ;
  733. ; Parsing
  734. lastwd:    ds    2;        start of current word in iobuff
  735. ;
  736.     ds    64;        stack space
  737. stksav:    ds    2;        save entry stack
  738. ;
  739.     end
  740. 0▐