home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol075 / fm.asm < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  478 lines

  1. .TITLE    'FM File Directory Map Catalog Utility'
  2.  
  3. .remark    ' ADAPTED FROM FMAP.COM in CP/M Users Group
  4.     Tony Nicholson - initial dissassembly and conversion
  5.     to TDL mnemonics and commenting.
  6.     Modified to look at all user areas on the
  7.     specified drive.
  8.     Last edited 11-Mar-1982
  9.     '
  10.     .XLINK
  11.     .PABS
  12.     .PHEX
  13.     .LOC    0100H
  14.  
  15.     .INSERT    CPMLIB.ASM
  16. ;
  17. CPM    =    00000H
  18. BDOS    =    00005H
  19. FCB1    =    0005CH
  20. PARAM2    =    0006DH
  21. DMAADR    =    00080H
  22. CR    =    0DH
  23. LF    =    0AH
  24. CTRLZ    =    1AH
  25. $getdk    ==    25
  26. ;
  27. FM:    LXI    H,0    ;save stack pointer
  28.     DAD    SP
  29.     SHLD    STACK
  30.     LXI    SP,STACK; and set up program stack
  31.     lxi    d,dmaadr
  32.     mvi    c,$dma
  33.     call    bdos
  34. ;    LDA    PARAM2
  35.     mvi    a,'F'    ;force write of 'names.sub' file
  36.     STA    SWITCH
  37.     mvi    c,$getdk;get current disk no
  38.     call    bdos
  39.     sta    cdisk
  40.     lda    fcb1    ;get specified disk no
  41.     ora    a
  42.     jnz    login
  43.     lda    cdisk
  44.     jmp    logcur
  45. login:    dcr    a
  46. logcur:    mov    e,a    ; and login this drive
  47.     mvi    c,$lgin
  48.     call    bdos
  49.     LXI    H,fcb1
  50.     inx    h
  51.     MOV    A,M
  52.     dcx    h
  53.     CPI    ' '    ;Was a filename specified ?
  54.     JNZ    FNAME    ;Yes
  55.     MVI    B,12
  56. FILLQ:    MVI    M,'?'
  57.     INX    H
  58.     DCR    B
  59.     JNZ    FILLQ
  60. FNAME:    MVI    C,$SERCH;Search directory for
  61.     LXI    D,FCB1    ; the filename
  62.     CALL    BDOS
  63.     INR    A
  64.     STA    RELPOS
  65.     JNZ    FOUND
  66. NOTFND:    LXI    D,NFMSG
  67.     CALL    PMSG
  68.     JMP    ABORT
  69. ;
  70. NFMSG:    .ASCII    '++NOT FOUND$'
  71. ;
  72. FOUND:    LDA    RELPOS
  73.     JMP    GETSIZ
  74. ;
  75. NEXT:    MVI    C,$NEXT
  76.     LXI    D,FCB1
  77.     CALL    BDOS
  78.     INR    A
  79.     JZ    DONE
  80. GETSIZ:    DCR    A
  81.     ANI    3
  82.     ADD    A
  83.     ADD    A
  84.     ADD    A
  85.     ADD    A
  86.     ADD    A
  87.     LXI    H,DMAADR
  88.     ADD    L
  89.     MOV    L,A
  90.     mvi    a,0e5h    ;check if file has
  91.     cmp    m    ; deleted.
  92.     jz    next    ;yes, ignore it
  93.     push    h
  94.     lxi    d,12    ;check if this is the
  95.     dad    d    ; zero extent record
  96.     mov    a,m
  97.     pop    h
  98.     ora    a
  99.     jnz    next    ;yes, ignore it
  100.     XCHG
  101.     LHLD    FREEAD
  102.     MVI    B,32    ;Copy directory info
  103. COPYD:    LDAX    D    ; to memory
  104.     MOV    M,A
  105.     INX    D
  106.     INX    H
  107.     DCR    B
  108.     JNZ    COPYD
  109.     SHLD    FREEAD
  110.     LDA    FREENM
  111.     INR    A
  112.     STA    FREENM
  113.     JMP    NEXT
  114. ;
  115. DONE:    lda    cdisk    ;reset default disk
  116.     mov    e,a
  117.     mvi    c,$lgin
  118.     call    bdos
  119.     LDA    FREENM
  120.     LXI    H,FREPTR
  121.     LXI    D,FREE
  122.     LXI    B,32
  123. COPYFR:    MOV    M,E
  124.     INX    H
  125.     MOV    M,D
  126.     INX    H
  127.     XCHG
  128.     DAD    B
  129.     XCHG
  130.     DCR    A
  131.     JNZ    COPYFR
  132.     LDA    FREENM
  133.     STA    D03F5
  134.     DCR    A
  135.     JZ    OUTPUT
  136. A01DF:    XRA    A
  137.     STA    D03F6
  138.     LDA    D03F5
  139.     DCR    A
  140.     STA    RELPOS
  141.     STA    D03F5
  142.     JZ    OUTPUT
  143.     LXI    H,FREPTR
  144. A01F3:    CALL    COMPARE
  145.     CM    SWAP
  146.     INX    H
  147.     INX    H
  148.     LDA    RELPOS
  149.     DCR    A
  150.     STA    RELPOS
  151.     JNZ    A01F3
  152.     LDA    D03F6
  153.     ORA    A
  154.     JNZ    A01DF
  155. OUTPUT:    LXI    D,HDMSG
  156.     CALL    PMSG
  157.     CALL    CRLF
  158.     LXI    H,FREPTR
  159.     SHLD    FREEAD
  160.     LDA    SWITCH
  161.     CPI    'F'
  162.     JNZ    NOTFSW
  163.     LXI    D,NAMFCB
  164.     MVI    C,$DELET
  165.     CALL    BDOS
  166.     LXI    D,NAMFCB
  167.     MVI    C,$MAKE
  168.     CALL    BDOS
  169.     INR    A
  170.     JNZ    NOTFSW
  171.     CALL    PRINT
  172. ;
  173.     .ASCII    '++FILE MAKE ERROR$'
  174. ;
  175. NOTFSW:    MVI    C,$CSTS
  176.     CALL    BDOS
  177.     DCR    A
  178.     JZ    CIEXIT
  179.     LHLD    FREEAD
  180.     MOV    E,M
  181.     INX    H
  182.     MOV    D,M
  183.     INX    H
  184.     SHLD    FREEAD
  185.     XCHG
  186.     inx    h
  187.     MVI    B,8
  188.     CALL    PUTCM        ;print filename
  189.     CALL    PUTDOT
  190.     MVI    B,3
  191.     CALL    PUTCM        ; type
  192.     CALL    PUTNL
  193.     mov    a,m        ; extent
  194.     call    phexbs
  195.     INX    H
  196.     INX    H
  197.     INX    H
  198.     MOV    A,M        ;get RC
  199.     DCR    A
  200.     RAR
  201.     RAR
  202.     RAR
  203.     ANI    01FH
  204.     INR    A
  205.     MOV    B,A
  206.     MOV    A,M        ;get RC and print it
  207.     CALL    PHEXBS
  208.     INX    H
  209.     MVI    C,0
  210. A027A:    MOV    A,M
  211.     ORA    A
  212.     JZ    pnl
  213.     CALL    PHEXB
  214.     INR    C
  215. A0283:    MOV    A,C
  216.     ANI    3
  217. A0286:    CZ    SPACE
  218.     INX    H
  219.     DCR    B
  220.     JNZ    A027A
  221. pnl:    CALL    CRLF
  222. A028E:    LDA    NFILES
  223.     INR    A
  224.     DAA
  225.     STA    NFILES
  226.     jnz    lt100
  227.     lda    nf100
  228.     inr    a
  229.     sta    nf100
  230. lt100:    LDA    FREENM
  231.     DCR    A
  232.     STA    FREENM
  233.     JNZ    NOTFSW
  234.     lda    nf100
  235.     ora    a
  236.     jz    ptens
  237.     adi    '0'
  238.     call    co
  239. ptens:    LDA    NFILES
  240.     CALL    PHEXBS
  241.     LXI    D,FLMSG
  242.     CALL    PMSG
  243.     LDA    SWITCH
  244.     CPI    'F'
  245.     JNZ    ABORT
  246.     MVI    A,CTRLZ
  247.     CALL    PUTC
  248.     CALL    WRITE
  249.     LXI    D,NAMFCB
  250.     MVI    C,$CLOSE
  251.     CALL    BDOS
  252.     JMP    ABORT
  253. ;
  254. FLMSG:    .ASCII    'FILES$'
  255. ;
  256. PHEXBS:    CALL    PHEXB
  257.     JMP    SPACE
  258. ;
  259. PHEXB:    PUSH    PSW
  260.     RAR
  261.     RAR
  262.     RAR
  263.     RAR
  264.     CALL    PHEXC
  265.     POP    PSW
  266. PHEXC:    ANI    00FH
  267.     CPI    10
  268.     JC    PHEX1
  269.     ADI    7
  270. PHEX1:    ADI    '0'
  271. CO:    PUSH    B
  272.     PUSH    D
  273.     PUSH    H
  274.     MOV    E,A
  275.     MVI    C,$CO
  276.     CALL    BDOS
  277.     POP    H
  278.     POP    D
  279.     POP    B
  280.     RET
  281. ;
  282. PMSG:    MVI    C,$PRINT
  283.     JMP    BDOS
  284. ;
  285. PUTCM:    MOV    A,M
  286.     CALL    PUTC
  287.     CALL    CO
  288.     INX    H
  289.     DCR    B
  290.     JNZ    PUTCM
  291.     RET
  292. ;
  293. SPACE:    MVI    A,' '
  294.     JMP    CO
  295. ;
  296. CRLF:    MVI    E,CR
  297.     MVI    C,$CO
  298.     CALL    BDOS
  299.     MVI    E,LF
  300.     MVI    C,$CO
  301.     JMP    BDOS
  302. ;
  303. RELPOS:    .BYTE    0
  304. ;
  305. PRINT:    POP    D
  306.     MVI    C,$PRINT
  307.     JMP    BDOSEX
  308. ;
  309. CIEXIT:    MVI    C,$CI
  310. BDOSEX:    CALL    BDOS
  311. ABORT:    lda    cdisk
  312.     mov    e,a
  313.     mvi    c,$lgin
  314.     call    bdos
  315.     LHLD    STACK
  316.     SPHL
  317.     RET
  318. ;
  319. PUTC:    CPI    ' '
  320.     RZ
  321.     ani    07fh
  322.     PUSH    PSW
  323.     LDA    SWITCH
  324.     CPI    'F'
  325.     JNZ    A034A
  326.     POP    PSW
  327.     PUSH    PSW
  328.     PUSH    H
  329.     LHLD    D03F8
  330.     MOV    M,A
  331.     INX    H
  332.     SHLD    D03F8
  333.     MOV    A,H
  334.     DCR    A
  335.     CZ    WRITE
  336.     POP    H
  337. A034A:    POP    PSW
  338.     RET
  339. ;
  340. WRITE:    PUSH    B
  341.     PUSH    D
  342.     LXI    D,NAMFCB
  343.     MVI    C,$WRITE
  344.     CALL    BDOS
  345.     ORA    A
  346.     JZ    WROK
  347.     CALL    PRINT
  348. ;
  349.     .ASCII    '++WRITE ERROR$'
  350. ;
  351. WROK:    LXI    H,DMAADR
  352.     SHLD    D03F8
  353.     POP    D
  354.     POP    B
  355.     RET
  356. ;
  357. PUTDOT:    MVI    A,'.'
  358.     CALL    PUTC
  359.     JMP    SPACE
  360. ;
  361. PUTNL:    MVI    A,CR
  362.     CALL    PUTC
  363.     MVI    A,LF
  364.     CALL    PUTC
  365.     JMP    SPACE
  366. ;
  367. COMPARE:PUSH    H
  368.     MOV    E,M
  369.     INX    H
  370.     MOV    D,M
  371.     INX    H
  372.     MOV    C,M
  373.     INX    H
  374.     MOV    B,M
  375.     XCHG
  376.     inx    h    ;don't compare user no
  377.     inx    b
  378. A0392:    LDAX    B
  379.     CMP    M
  380.     INX    H
  381.     INX    B
  382.     JZ    A0392
  383.     POP    H
  384.     RET
  385. ;
  386. SWAP:    MVI    A,1
  387.     STA    D03F6
  388.     MOV    C,M
  389.     INX    H
  390.     PUSH    H
  391.     MOV    B,M
  392.     INX    H
  393.     MOV    E,M
  394.     MOV    M,C
  395.     INX    H
  396.     MOV    D,M
  397.     MOV    M,B
  398.     POP    H
  399. A03AB:    MOV    M,D
  400.     DCX    H
  401.     MOV    M,E
  402.     RET
  403. ;
  404. HDMSG:    .ASCII    'FILENAME TYP EX RC -----EXTENT-----$'
  405. ;
  406.     .WORD    0,0,0,0,0,0,0,0
  407.     .WORD    0,0,0,0,0,0,0,0
  408.     .WORD    0,0,0,0,0,0,0,0
  409.     .WORD    0,0,0,0,0,0,0,0
  410. ;
  411. STACK:    .BLKB    2
  412. NFILES:    .BYTE    0
  413. nf100:    .byte    0
  414. cdisk:    .byte    0
  415. FREEAD:    .WORD    FREE
  416. FREENM:    .BYTE    0
  417. D03F5:    .BYTE    0
  418. D03F6:    .BYTE    0
  419. SWITCH:    .BYTE    0
  420. D03F8:    .WORD    DMAADR
  421. ;
  422. NAMFCB:    .ASCII    [0]'NAMES   SUB'
  423.     .BYTE    0,0,0,0,0,0,0,0
  424.     .BYTE    0,0,0,0,0,0,0,0
  425.     .BYTE    0,0,0,0,0
  426. ;
  427. FREPTR:    .WORD    0,0,0,0,0,0,0,0
  428.     .WORD    0,0,0,0,0,0,0,0
  429.     .WORD    0,0,0,0,0,0,0,0
  430.     .WORD    0,0,0,0,0,0,0,0
  431.     .WORD    0,0,0,0,0,0,0,0
  432.     .WORD    0,0,0,0,0,0,0,0
  433.     .WORD    0,0,0,0,0,0,0,0
  434.     .WORD    0,0,0,0,0,0,0,0
  435.     .WORD    0,0,0,0,0,0,0,0
  436.     .WORD    0,0,0,0,0,0,0,0
  437.     .WORD    0,0,0,0,0,0,0,0
  438.     .WORD    0,0,0,0,0,0,0,0
  439.     .WORD    0,0,0,0,0,0,0,0
  440.     .WORD    0,0,0,0,0,0,0,0
  441.     .WORD    0,0,0,0,0,0,0,0
  442.     .WORD    0,0,0,0,0,0,0,0
  443.     .WORD    0,0,0,0,0,0,0,0
  444.     .WORD    0,0,0,0,0,0,0,0
  445.     .WORD    0,0,0,0,0,0,0,0
  446.     .WORD    0,0,0,0,0,0,0,0
  447.     .WORD    0,0,0,0,0,0,0,0
  448.     .WORD    0,0,0,0,0,0,0,0
  449.     .WORD    0,0,0,0,0,0,0,0
  450.     .WORD    0,0,0,0,0,0,0,0
  451.     .WORD    0,0,0,0,0,0,0,0
  452.     .WORD    0,0,0,0,0,0,0,0
  453.     .WORD    0,0,0,0,0,0,0,0
  454.     .WORD    0,0,0,0,0,0,0,0
  455.     .WORD    0,0,0,0,0,0,0,0
  456.     .WORD    0,0,0,0,0,0,0,0
  457.     .WORD    0,0,0,0,0,0,0,0
  458.     .WORD    0,0,0,0,0,0,0,0
  459.     .WORD    0,0,0,0,0,0,0,0
  460.     .WORD    0,0,0,0,0,0,0,0
  461.     .WORD    0,0,0,0,0,0,0,0
  462.     .WORD    0,0,0,0,0,0,0,0
  463.     .WORD    0,0,0,0,0,0,0,0
  464.     .WORD    0,0,0,0,0,0,0,0
  465.     .WORD    0,0,0,0,0,0,0,0
  466.     .WORD    0,0,0,0,0,0,0,0
  467.     .WORD    0,0,0,0,0,0,0,0
  468.     .WORD    0,0,0,0,0,0,0,0
  469.     .WORD    0,0,0,0,0,0,0,0
  470.     .WORD    0,0,0,0,0,0,0,0
  471.     .WORD    0,0,0,0,0,0,0,0
  472.     .WORD    0,0,0,0,0,0,0,0
  473.     .WORD    0,0,0,0,0,0,0,0
  474.     .WORD    0,0,0,0,0,0,0,0
  475.  
  476. FREE:
  477.     .END    FM
  478.