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 / RCPM / LUX80.ARK / LUXCHK10.MAC < prev    next >
Text File  |  1987-02-02  |  7KB  |  314 lines

  1. ;    LUXCHK10.MAC  V1.0   LUX utility CHEK transient        1/25/84 mah
  2. ;
  3. ;    This program is based on Sigi Kluger's LCHEK11, and is not intended
  4. ;    to be a replacement or improvement upon it's antecedent.  It has
  5. ;    modified only to dovetail with the LUX format.  This transient
  6. ;    generates a CRC value that is compatible with CHEK.
  7. ;
  8. ;    Modification history in reverse order:
  9. ;
  10. ; 01-25-84    Reformatted messages for LUX.  Renamed to LUXCHKxx to
  11. ; LUXCHK10    mimic other LUX transients.  - Mark Howard
  12. ;
  13. ; 01-24-84    Rewritten for M80/L80.  Fixed bug in DU: routine. - S. Kluger
  14. ; LCHEK11
  15. ;
  16. ; 01-07-84    Initially written by Sigi Kluger - SYSOP El Paso RCP/M
  17. ; LCHEK10                         915-598-1668
  18.     EXTRN    COUT    ;SYSLIB character out (convert ctl chars)
  19.     EXTRN    CIN    ;SYSLIB character in
  20.     EXTRN    CRLF    ;SYSLIB newline
  21.     EXTRN    F$OPEN    ;SYSLIB open file
  22.     EXTRN    F$READ    ;SYSLIB file read
  23.     EXTRN    BDOS    ;SYSLIB BDOS call
  24.     EXTRN    FNAME    ;SYSLIB file name parser
  25.     EXTRN    PHL4HC    ;SYSLIB print HL in hex
  26.     EXTRN    PUTUD    ;SYSLIB save current DU
  27.     EXTRN    GETUD    ;SYSLIB restore default DU
  28.     EXTRN    LOGUD    ;SYSLIB log drive/user
  29.     EXTRN    PRINT    ;SYSLIB print routine
  30.     EXTRN    RETUD    ;SYSLIB return drive/user
  31.     EXTRN    CRCCLR    ;SYSLIB clear crc acc
  32.     EXTRN    CRCUPD    ;SYSLIB update CRC
  33.     EXTRN    CRCDONE ;SYSLIB finish CRC
  34. ;
  35. cr    equ    0dh
  36. lf    equ    0ah
  37. ;
  38. dbuf    equ    80h    ;default buffer
  39. dfcb    equ    5ch    ;default fcb
  40. ;
  41. begin:    jmp    skipc        ;skip config parameters
  42. ;
  43. maxdrv:    db    1+'P'-40H    ;highest accessible drive + 1 (A=2)
  44. maxusr:    db    1+15        ;highest accessible user + 1
  45. ;
  46. skipc:    lxi    h,0        ;save CP/M stack pointer
  47.     dad    sp
  48.     shld    stack
  49.     lxi    sp,stack    ;set up local stack
  50.     call    putud        ;save default DU
  51.     lda    dfcb+1        ;check if no file name specified
  52.     cpi    ' '
  53.     jz    what        ;give help if no argument
  54.     call    retud        ;get current drive/user
  55.     mov    h,b
  56.     mov    l,c
  57.     shld    userno        ;save current DU
  58.     lxi    h,dbuf+2    ;point to argument
  59.     lxi    d,fcb        ;hopefully .lbr file
  60.     call    fname        ;parse file name
  61.     jz    what        ;not a valid file name
  62.     mov    a,m        ;get delimiter
  63.     cpi    ' '        ;more to come
  64.     jnz    nomem        ;nope, complain
  65.     inx    h        ;get next char
  66.     lxi    d,memfcb    ;point to member fcb
  67.     push    b        ;save drive/user
  68.     call    fname        ;parse member name
  69.     lxi    h,fcb+1
  70.     call    ckamb        ;check ambiguity
  71.     lxi    h,memfcb+1
  72.     call    ckamb
  73.     pop    b        ;get drive/user back
  74.     inx    b        ;check if current DU:
  75.     mov    a,b
  76.     ora    c
  77.     dcx    b        ;restore DU: value
  78.     jz    currdu        ;skip this if current
  79.     mov    a,b        ;get specified drive
  80.     dcr    b        ;get into range 0..f
  81.     cpi    0ffh        ;ff means current drive
  82.     lxi    h,maxdrv
  83.     jnz    newdsk        ;skip if different
  84.     lda    driveno
  85.     mov    b,a
  86.     jmp    curdsk
  87. ;
  88. newdsk:    cmp    m
  89.     jnc    illdu        ;yes - complain
  90. curdsk:    mov    a,c        ;get specified user area
  91.     cpi    '?'        ;all user areas???
  92.     jz    illdu        ;yes - complain
  93.     cpi    0ffh        ;current user area?
  94.     jnz    newusr
  95.     lda    userno
  96.     mov    c,a
  97.     jmp    curusr
  98. ;
  99. newusr:    inx    h        ;illegal user specified?
  100.     cmp    m
  101.     jnc    illdu        ;yes - complain
  102. curusr:    call    logud        ;log into specified DU:
  103. currdu:    lxi    h,FCB+9        ;default to .LBR
  104.     mvi    m,'L'
  105.     inx    h
  106.     mvi    m,'B'
  107.     inx    h
  108.     mvi    m,'R'
  109.     lxi    d,fcb
  110.     call    f$open        ;attempt to open file
  111.     inr    a
  112.     jz    nofile        ;barf if not found
  113.     call    f$read        ;read directory into default buffer
  114.     lxi    h,dbuf        ;point to dbuf
  115.     lxi    d,dirname    ;point to 8 blanks
  116.     call    cpfn        ;compare
  117.     jnz    nolbr        ;not equal
  118.     lxi    d,14
  119.     dad    d
  120.     mov    a,m
  121.     sta    dirsiz        ;directory size
  122.     xra    a
  123.     sta    memfcb
  124.     jmp    c00        ;skip into directory check
  125. ;
  126. dirlp:    lxi    d,fcb
  127.     call    f$read
  128. c00:    lxi    b,20h
  129.     lxi    h,dbuf
  130.     lxi    d,memfcb
  131.     call    cpfn
  132.     jz    found
  133.     dad    b
  134.     call    cpfn
  135.     jz    found
  136.     dad    b
  137.     call    cpfn
  138.     jz    found
  139.     dad    b
  140.     call    cpfn
  141.     jz    found
  142.     lda    dirs
  143.     inr    a
  144.     sta    dirs
  145.     mov    b,a
  146.     lda    dirsiz
  147.     cmp    b
  148.     jnz    dirlp
  149.     call    print
  150.     db    cr,lf
  151.     db    'File not found.',cr,lf,0
  152.     jmp    quit
  153. ;
  154. ; Found the member file name in the LDIR
  155. ;
  156. found:    lxi    d,12
  157.     dad    d
  158.     push    h        ;save pointer for now,
  159.     inx    h        ;point to size
  160.     inx    h
  161.     push    d
  162.     mov    e,m        ;get low byte
  163.     inx    h
  164.     mov    d,m        ;if a=0 then file is 0k
  165.     xchg
  166.     shld    msize        ;save member size
  167.     pop    d
  168.     mov    a,h
  169.     ora    l
  170.     jz    nullen        ;go complain
  171.     pop    h        ;get pointer back
  172.     mov    a,m        ;get file address
  173.     inx    h
  174.     mov    h,m
  175.     mov    l,a
  176.     shld    fcb+33
  177.     lxi    d,fcb
  178.     call    rndread        ;read first buffer full
  179.     call    crcclr        ;now clear the crc accumulator
  180.     call    print
  181.     db    cr,lf,'CRC value for ',0
  182.     lxi    h,memfcb+1
  183.     mvi    b,8
  184. fnlp:    mov    a,m
  185.     call    cout
  186.     inx    h
  187.     dcr    b
  188.     jnz    fnlp
  189.     mvi    a,'.'
  190.     call    cout
  191.     mvi    b,3
  192. ftlp:    mov    a,m
  193.     call    cout
  194.     inx    h
  195.     dcr    b
  196.     jnz    ftlp
  197.     call    print
  198.     db    '  =  ',0
  199. slp:    call    f$read        ;else read next sector (de still FCB)
  200.     call    ccrc        ;compute crc for sector
  201.     lhld    msize
  202.     dcx    h
  203.     shld    msize
  204.     mov    a,h
  205.     ora    l
  206.     jnz    slp
  207. ;
  208. ; all sectors have been read and computed
  209. ;
  210.     call    crcdone        ;finish up, return crc
  211.     call    phl4hc        ;print hl in hex
  212.     call    crlf
  213.     jmp    quit
  214. ;
  215. ; compute crc for sector
  216. ;
  217. ccrc:    lxi    h,dbuf
  218. ccrc1:    mov    a,m
  219.     call    crcupd
  220.     inr    l
  221.     jnz    ccrc1
  222.     ret
  223. ;
  224. ; Read random record, save all regs
  225. ;
  226. rndread:push    psw
  227.     push    b
  228.     push    d
  229.     push    h
  230.     mvi    c,33
  231.     call    bdos
  232.     pop    h
  233.     pop    d
  234.     pop    b
  235.     pop    psw
  236.     ret
  237. ;
  238. ; Here are the messages
  239. ;
  240. illdu:    call    print
  241.     db    cr,lf
  242.     db    'Drive/user out of bounds',cr,lf,0
  243.     jmp    what
  244. ;
  245. nofile:    call    print
  246.     db    cr,lf
  247.     db    'No such file on disk',cr,lf,0
  248.     jmp    what
  249. ;
  250. cpfn:    push    h
  251.     push    d
  252.     push    b
  253.     mvi    b,12    ;12 characters
  254. clpcp:    ldax    d
  255.     cmp    m    ;check file name
  256.     jnz    qcpfn    ;no match - quit
  257.     inx    d
  258.     inx    h
  259.     dcr    b
  260.     jnz    clpcp
  261. qcpfn:    pop    b
  262.     pop    d
  263.     pop    h
  264.     ret
  265. ;
  266. ckamb:    mvi    a,'?'        ;see if there is any...
  267.     mvi    e,11        ;...ambiguity in the file spec
  268. ckamlp:    cmp    m
  269.     jz    noamb        ;complain if ambiguous fn
  270.     inx    h
  271.     dcr    e
  272.     jnz    ckamlp
  273.     ret
  274. ;
  275. nolbr:    call    print
  276.     db    cr,lf
  277.     db    'LBR directory may be damaged - aborting',cr,lf,0
  278.     jmp    quit
  279. ;
  280. nomem:    call    print
  281.     db    cr,lf
  282.     db    'No member file name specified.',cr,lf,0
  283.     jmp    what
  284. ;
  285. nullen:    call    print
  286.     db    cr,lf
  287.     db    'Member file is 0k - CRC is 00 00.',cr,lf,0
  288.     jmp    quit
  289. ;
  290. noamb:    call    print
  291.     db    cr,lf
  292.     db    'No ambiguous file names allowed.',cr,lf,0
  293. what:    call    print
  294.     db    cr,lf
  295.     db    'CHEK - check CRC of member file in a LBR',cr,lf
  296.     db    'USAGE: CHEK mbrname.typ',cr,lf,0
  297. quit:    call    getud        ;restore default DU
  298.     lhld    stack
  299.     sphl
  300.     ret
  301. ;
  302. dirs:    db    0        ;# of dir sectors processed
  303. dirsiz:    db    0        ;# of total dir sectors
  304. msize:    dw    0        ;member size in sectors
  305. userno:    db    0        ;current user #
  306. driveno:db    0        ;current drive
  307. fcb:    ds    36        ;out fcb
  308. memfcb:    ds    12
  309.     ds    40        ;20 level stack
  310. stack:    dw    0        ;save CP/M stack pointer here
  311. dirname:db    0,'           '
  312.     end
  313.