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 / ENTERPRS / CPM / UTILS / F / PWLKWS24.LZH / PWDIR120.ASM < prev    next >
Assembly Source File  |  1991-01-16  |  11KB  |  616 lines

  1. ;    PWDIR2.ASM -- DISK DIRECTORIES FROM INSIDE THE PW EDITOR --
  2. ;
  3. ;    PWDIR2.ASM -- PWDIR.ASM by Ron Friedrich, 5/1/87; modifications
  4. ;    in this version by Andrew Marchant Shapiro, 4/30/89.
  5. ;
  6. ;    NOTE:  This version will ONLY work with Perfect Writer 1.20;  it
  7. ;    probably can be modified for 1.03 without trouble, but be careful!
  8. ;
  9. ;    Ron's original PWDIR.ASM addressed two shortfalls in the PW editor:
  10. ;    it allowed you to get a directory of any disk from within the editor,
  11. ;    and it automatically logged in new disks, so you didn't need to
  12. ;    worry about hitting a disk R/O error.
  13. ;
  14. ;    The one problem was that Ron made space for it by overwriting the
  15. ;    Perfect Speller functions that integrated PW with its spell checker.
  16. ;    That was no real problem unless you LIKED PS, and I do, since I have
  17. ;    a RAMdisk that's just big enough for PW and PS to reside on.  No
  18. ;    other spelling checker quite fit, or was as nicely integrated.
  19. ;
  20. ;    So I decided to fix things up.  In this version of PWDIR.ASM, PWDIR is ;    added on the END of PW.COM instead of in the middle.  You assemble
  21. ;    this file to HEX, and patch it onto PW.COM with DDT.  You then have
  22. ;    to SAVE 142 PW.COM.  This makes a PW file that's 36K long
  23. ;    instead of 35K on the disk, but that's no problem.
  24. ;
  25. ;    OK, so the patch is in place.  HOW DO YOU ACTIVATE THE SUCKER? 
  26. ;    For this part, you need DDT or PATCH or somesuch.  Use the
  27. ;    PW.SYM file (it came with PW) to find a function you don't
  28. ;    really need -- like the HELP function, MHELP, which resides at
  29. ;    45F1H.  Go to address 45F1H, and patch in the following code:
  30. ;
  31. ;    CALL 89A0
  32. ;    RET
  33. ;
  34. ;    If you're doing this with PATCH, enter the following bytes:
  35. ;
  36. ;    CD A0 89 C9
  37. ;
  38. ;    and save the result.  Now, whenever you push the HELP key sequence
  39. ;    (usually ^X-H or ESC-H), it calls MHELP, which in turn calls --
  40. ;    yup -- that set of routines hanging off the end of PW.  No
  41. ;    sacrifice of internal code is needed, beyond your giving up
  42. ;    your least favorite function.  You might want to patch in the
  43. ;    calling code at MWHATVER (4AC9).  That's the really useful function
  44. ;    that returns the version and date for PW.  Wherever you do the
  45. ;    patch, the code remains the same.
  46. ;
  47. ;    Note -- the directory output overwrites what you have on the screen,
  48. ;    but doesn't actually enter the buffer.  It's video only.  To get back
  49. ;    to your editing session. use the refresh screen command, ^L or ESC-^L.
  50. ;
  51. ;
  52. ;    -----------------------IMPORTANT-------------------------
  53. ;
  54. ;    Note that I have removed the disk system reset code from
  55. ;    PWDIR.ASM.  The reason has to do with the fact that Ron
  56. ;    located it at MGOSPELL, the routine that calls PS.COM in the
  57. ;    first place, and that most people still using CP/M now have
  58. ;    BDOS replacements that handle logging in new floppies
  59. ;
  60. ;    ---------------------------------------------------------
  61. ;
  62. ;    The modified code follows.  Like Friedrich's original, it's PD,
  63. ;    and you can give it to anyone you want...
  64. ;
  65. ;
  66. ;    PWDIR2.ASM -- ANDREW MARCHANT SHAPIRO  rev. 4/30/89
  67. ;    PWDIR.ASM -- RON FRIEDRICH  rev. 5/1/87
  68. ;
  69. YES    EQU    0FFH
  70. NO    EQU    0
  71. ;
  72. ;
  73. ORG 36E1H
  74. TAIL        EQU    89A0H
  75. OVLSTART    EQU    5F00H    ;NEXT ROUND SECTOR ADR AFTER MGOSPELL
  76. ;
  77. RECSTART    EQU    (OVLSTART-100H)/80H
  78. ;
  79. ;
  80. ;bdos functions
  81. CONIN    EQU    1    ;READ CONSOLE (C; BYTE RETURNED TO A)
  82. CONOUT    EQU    2    ;TYPE CHARACTER (C; BYTE IN E)
  83. PRINTS    EQU    9    ;PRINT STRING FUNCTION (C; ADR IN DE)
  84. RSTDSK    EQU    13    ;RESET DISK SYSTEM (C)
  85. SELDSK  EQU    14    ;SELECT DISK (C; DISK # IN E)
  86. OPENF    EQU    15    ;OPEN FILE
  87. CLOSEF    EQU    16    ;CLOSE FILE
  88. SRCH    EQU    17    ;SEARCH DIRECTORY (C; FCB IN DE)
  89. SRCHMOR EQU    18    ;SEARCH FOR NEXT IN DIRECTORY (C) 
  90. DELF    EQU    19    ;DELETE FILE
  91. READF    EQU    20    ;READ FILE
  92. WRITEF    EQU    21    ;WRITE FILE
  93. MAKEF    EQU    22    ;CREATE FILE
  94. CURDSK    EQU    25    ;CURRENT DISK (C; DISK # RETURNED IN A)
  95. SETDMA    EQU    26    ;(C; DMA adr in DE)
  96. ALLOC    EQU    27    ;Get ALLOCATION address (C; returned in HL)
  97. PARAMS    EQU    31    ;Get DISK PARAMETER address (C; returned in HL)
  98. READRND    EQU    33    ;READ RANDOM FILE
  99. ;
  100. ;BDOS ADR
  101. BDOS    EQU    5    ;DOS ENTRY POINT
  102. FCB1    EQU    5CH    ;DEFAULT FILE CONTROL BLOCK
  103. DMA1    EQU    80H    ;DEFAULT DIRECT (DISK) MEMORY ACCESS AREA
  104. FCBLEN    EQU    36
  105. CPMREC    EQU    33
  106. ;
  107. ;    NON GRAPHIC CHARACTERS
  108. LF    EQU    10    ;LINE FEED
  109. UP    EQU    11    ;CURSOR UP
  110. CR    EQU    13    ;CARRIAGE RETURN
  111. CLINE    EQU    24    ;CLEAR TO END OF LINE
  112. CLEAR    EQU    26    ;CLEAR SCREEN
  113. ESC    EQU    27
  114. HOME    EQU    30
  115. SPACE    EQU    32
  116. ;
  117. ;DISPLAY DISK DIRECTORY ROUTINE:
  118. ;
  119.     ORG    TAIL
  120.     PUSH B
  121.      CALL    TYPE
  122.     DB    ESC,'=7 ',CLINE,'DIRECTORY: Which disk drive? ',0
  123.     mvi    c,conin
  124.     call    bdos
  125.     CPI    'A'
  126.     JC    ABORT
  127.     call    upcase
  128.     STA    DIRSTAT
  129. ;
  130.     MVI    C,CURDSK
  131.     CALL    BDOS
  132.     STA    OLDSEL
  133.     MVI    C,RSTDSK    ;NB: also resets DMA to 80H
  134.     CALL    BDOS
  135.     LDA    DIRSTAT
  136.     SUI    'A'
  137.     MOV    E,A
  138.     MVI    C,SELDSK
  139.     CALL    BDOS
  140.     MVI    A,1
  141.     STA    FIVE
  142.     MVI    B,5
  143.     LXI    H,COLCT
  144.     MVI    M,4
  145.     INX    H
  146.     XRA    A
  147.     CALL    FILLMEM
  148.     LXI    H,OVLSTART
  149.     SHLD    DIRTBL
  150. ;
  151. ;START DIRECTORY SEARCH
  152.     LXI    H,0
  153.     SHLD    FILECT
  154.     CALL    CLEARFCB
  155.     LXI    H,FCB1+1
  156.     MVI    B,11
  157.     MVI    A,'?'
  158.     CALL    FILLMEM
  159.     LXI    D,FCB1
  160.     MVI    C,SRCH
  161. NEXTNAME:
  162.     CALL    BDOS
  163.     cpi    255
  164.     JZ    CALCFREE
  165.     PUSH    PSW    ;PUSH A
  166.     LXI    H,FILECT
  167.     INR    M
  168.     LDA    FIVE
  169.     DCR    A
  170.     JNZ    STA5
  171.     MVI    A,5
  172. STA5    STA    FIVE
  173.     MOV    E,A
  174.     MVI    D,0
  175.     LXI    H,COLCT
  176.     DAD    D
  177.     INR    M
  178.     POP    PSW
  179. ;A * 32 + 1
  180.     RLC        ;Rotate A five times.
  181.     RLC        ; ADD A five times also works.
  182.     RLC
  183.     RLC
  184.     RLC
  185.     INR    A
  186.     MVI    B,0    ;CLEAR B
  187.     MOV    C,A    ;DMA BYTE COUNT IN BC
  188.     LXI    H,DMA1    ;DMA ADDRESS IN HL
  189.     DAD    B    ;ADD BC+LH = FIRST BYTE OF FILENAME
  190.     XCHG
  191.     LHLD    DIRTBL
  192.     MVI    M,0
  193.     INX    H
  194.     XCHG
  195.     LXI    B,11
  196.     DB    0EDH,0B0H    ;Z80 (HL) -> (DE), BC COUNT
  197.     XCHG
  198.     SHLD    DIRTBL
  199.     MVI    C,SRCHMOR
  200.     JMP    NEXTNAME
  201. ;
  202. CALCFREE:    ;CALCULATE FREE SPACE
  203.     MVI    C,PARAMS
  204.     CALL    BDOS
  205.     INX    H
  206.     INX    H
  207.     MOV    A,M
  208.     STA    ABYTE
  209.     INX    H
  210.     INX    H
  211.     INX    H
  212.     MOV    E,M
  213.     INX    H
  214.     MOV    D,M
  215.     PUSH    D
  216.     MVI    C,ALLOC
  217.     CALL    BDOS
  218.     XCHG
  219.     POP    H
  220.     INX    H
  221.     LXI    B,0
  222. LOOP1:
  223.     PUSH    D
  224.     LDAX    D
  225.     MVI    E,8
  226. LOOP2:
  227.     RAL
  228.     JC    JMP1
  229.     INX    B
  230. JMP1:
  231.     MOV    D,A
  232.     DCX    H
  233.     MOV    A,L
  234.     ORA    H
  235.     JZ    JMP2
  236.     MOV    A,D
  237.     DCR    E
  238.     JNZ    LOOP2
  239.     POP    D
  240.     INX    D
  241.     JMP    LOOP1
  242. JMP2:
  243.     POP    D
  244.     MOV    L,C
  245.     MOV    H,B
  246.     LDA    ABYTE
  247.     SUI    3
  248.     JZ    SORTNAMES
  249. LOOP3:
  250.     DAD    H
  251.     DCR    A
  252.     JNZ    LOOP3
  253. ;
  254. SORTNAMES:
  255.     SHLD    FREESIZE
  256.     LHLD    DIRTBL
  257.     INX    H
  258.     SHLD    SORTBL
  259.     SHLD    SORPTR
  260.     LDA    FILECT
  261.     STA    FILECTR
  262.     ana    a
  263.     jz    PSIZE
  264. ;
  265. NEXTSORT:
  266.     LXI    H,OVLSTART-12
  267.     LXI    D,12
  268.     LDA    FILECT
  269.     INR    A
  270.     MOV    B,A
  271.     XRA    A
  272. SEEK1ST
  273.     DCR    B
  274.     DAD    D
  275.     CMP    M
  276.     JNZ    SEEK1ST
  277.     SHLD    LOWSTRING
  278. SEEK2ND
  279.     DCR    B
  280.     JZ    LDTBL
  281.     DAD    D
  282.     PUSH    H    ;SAVE TEST ADR
  283.     PUSH    D    ;SAVE 12
  284.     XCHG
  285.     LHLD    LOWSTRING
  286. CMPLOOP:
  287.     LDAX    D
  288.     CMP    M
  289.     JNZ    OKCMP
  290.     INX    H
  291.     INX    D
  292.     JMP    CMPLOOP
  293. OKCMP:
  294.     POP    D
  295.     POP    H
  296.     JNC    SEEK2ND    ;HL$ < DE$
  297.     SHLD    LOWSTRING ;DE$ < HL$
  298.     JMP    SEEK2ND
  299. LDTBL:
  300.     LHLD    LOWSTRING
  301.     MVI    M,0FFH
  302.     INX    H
  303.     XCHG
  304.     LHLD    SORPTR
  305.     MOV    M,E    ! INX    H
  306.     MOV    M,D    ! INX    H
  307.     SHLD    SORPTR
  308.     LXI    H,FILECTR
  309.     DCR    M
  310.     JNZ    NEXTSORT
  311. ;
  312.     call    type! db HOME,cline,0
  313.     LDA    FILECT
  314.     STA    FILECTR
  315. PDIR0:
  316.     MVI    A,21
  317.     STA    LINECT
  318. PDIR1:
  319.     MVI    A,5
  320.     STA    FIVE
  321.     LHLD    SORTBL
  322. PDIR2:
  323.     SHLD    SORPTR
  324.     MOV    A,M
  325.     INX    H
  326.     MOV    H,M
  327.     MOV    L,A
  328.     MVI    B,8
  329.     CALL    PLINE
  330.     MVI    A,'.'
  331.     CALL    PCHAR
  332.     MVI    B,3
  333.     CALL    PLINE
  334.     LXI    H,FILECTR
  335.     DCR    M
  336.     JZ    PSIZE
  337.     LXI    H,FIVE
  338.     mov    e,m
  339.     mvi    d,0
  340.     DCR    M
  341.     JZ    NEXTLINE
  342.     lxi    h,colct
  343.     DAD    d
  344.     MOV    E,M
  345.     mvi    d,0
  346.     LHLD    SORPTR
  347.     DAD D!    DAD D
  348.     push    h
  349.     CALL    TYPE! DB ' | ',0
  350.     pop    h
  351.     JMP    PDIR2
  352. NEXTLINE:
  353.     call    type! db cr,lf,CLINE,0
  354.     LHLD    SORTBL
  355.     INX H!  INX H
  356.     SHLD    SORTBL
  357.     LXI    H,LINECT
  358.     DCR    M
  359.     JNZ    PDIR1
  360.     CALL    TYPE! DB 'Hit any key to continue.',0
  361.     mvi    c,conin
  362.     call    bdos
  363.     CALL    TYPE! DB CR,CLINE,0
  364.     JMP    PDIR0
  365. ;
  366. PSIZE:
  367.     CALL    type
  368.     db cr,lf,cline,lf,esc,'=7 ',cline,up,cline
  369. dirstat    db    'A: ',0
  370.     LHLD    FILECT
  371.     call    prnum
  372.     CALL    TYPE! DB ' files;  ',0
  373.     LHLD    FREESIZE
  374.     CALL    PRNUM
  375.     CALL    TYPE
  376.     DB    'K free disk space',0
  377. ;
  378.     CALL    LDPWDIROVL
  379.     MVI    C,OPENF
  380.     CALL    BDOS
  381.     LXI    H,RECSTART
  382.     SHLD    FCB1+CPMREC
  383.     MVI    B,32
  384.     MVI    C,SETDMA
  385.     LXI    D,OVLSTART
  386. RESTORE:
  387.     PUSH B! PUSH D
  388.     CALL    BDOS
  389.     LXI    D,FCB1
  390.     MVI    C,READRND
  391.     CALL    BDOS
  392.     POP D! POP B
  393.     ANA    A
  394.     JNZ    NOPE
  395.     LHLD    FCB1+CPMREC
  396.     INX    H
  397.     SHLD    FCB1+CPMREC
  398.     LXI    H,128
  399.     DAD    D
  400.     XCHG
  401.     DCR    B
  402.     JNZ    RESTORE
  403. ;
  404. EXITDIR
  405.     LDA    OLDSEL
  406.     MOV    E,A
  407.     MVI    C,SELDSK
  408.     CALL    BDOS
  409.     POP    B
  410.     RET
  411. ;
  412. ABORT:    CALL    TYPE ! DB CR,CLINE,0
  413.     POP    B
  414.     RET
  415. ;
  416. NOPE    CALL    TYPE
  417.     DB    7,esc,'=7 BAD TROUBLE! Unable to read A:PW.COM',7,0
  418.     POP    B
  419.     RET
  420. ;
  421. ;----------------------------------------------------
  422. ;subroutines
  423. ;
  424. LDPWDIROVL
  425.     CALL    CLEARFCB
  426.     LXI    H,PWDIROVL
  427.     LXI    D,FCB1
  428.     LXI    B,12
  429.     DB    0EDH,0B0H    ;Z80 COPY MEMORY CMD
  430.     LXI    D,FCB1
  431.     RET
  432. ;
  433. clearfcb:
  434.     xra    a
  435.     mvi    b,fcblen
  436.     lxi    h,fcb1
  437. ;fall into..
  438. ;
  439. FILLMEM:
  440.     MOV    M,A
  441.     INX    H
  442.     DCR    B
  443.     JNZ    FILLMEM
  444.     RET
  445. ;
  446. UPCASE:    ;MAKES BYTE IN A UPPERCASE
  447.     ana    a    ;clear carry flag
  448.     CPI    60H    ;IS IT lower case?
  449.     RC        ;no
  450.     SUI    20H
  451.     RET
  452. ;
  453. PCHAR:    ;PRINT CHARACTER IN A, save BC and HL
  454.     push h    ! push b
  455.     MVI    C,CONOUT
  456.     MOV    E,A
  457.     CALL    BDOS
  458.     pop b ! POP H
  459.     RET
  460. ;
  461. TYPE:    ;type text that immediately follows the call to this function.
  462.     XTHL        ;= POP H (stack had next program address=text adr)
  463. TYPELOOP:
  464.     MOV    A,M
  465.     ANA    A
  466.     JZ    EXITYPE
  467.     CALL    PCHAR    ;Be sure HL is preserved
  468.     INX    H
  469.     JMP     TYPELOOP
  470. EXITYPE:
  471.     INX    H
  472.     XTHL        ;= push h
  473.     RET
  474. ;
  475. PLINE:    ;PRINT (HL) B COUNT
  476.     MOV    A,M
  477.     CALL    PCHAR
  478.     INX    H
  479.     DCR    B
  480.     JNZ    PLINE
  481.     RET
  482. ;
  483. ;
  484. ;****** ARITHMETIC ROUTINES *******
  485. ;
  486. CMPDH:  ;IF DE=HL set ZERO FLAG, if HL<DE set carry flag
  487.     MOV    A,H
  488.     CMP    D
  489.     RNZ
  490.     MOV    A,L
  491.     CMP    E
  492.     RET
  493. ;
  494. hsubd:    ;HL=HL-DE
  495.     ana    a    ;clear carry bit
  496.     DB    0EDH,52H    ;Z-80 instr: HL=HL=DE
  497.     RET
  498. ;
  499. PRNUM:    ;print non-negative integer in HL
  500.     xchg
  501.     xra    a
  502.     lxi    h,s10000
  503.     mov    m,a    ;10000
  504.     inx    h
  505.     mov    m,a    ;1000
  506.     inx    h
  507.     mov    m,a    ;100
  508.     inx    h
  509.     mov    m,a    ;10
  510.     inx    h
  511.     mov    m,a    ;1
  512.     inx    h
  513.     mov    m,a    ;zero flag
  514.     lxi    b,s10000
  515. ;setup done, now convert binary to decimal
  516.     lxi    h,10000
  517.     call    btod
  518.     lxi    h,1000
  519.     call    btod
  520.     lxi    h,100
  521.     call    btod
  522.     lxi    h,10
  523.     call    btod
  524.     lxi    h,1
  525.     call    btod
  526. ;done converting the number from binary to decimal, now print it...
  527.     lda    s10000
  528.     call    prdig
  529.     lda    s1000
  530.     call    prdig
  531.     call    prcomma
  532.     lda    s100
  533.     call    prdig
  534.     lda    s10
  535.     call    prdig
  536.     mvi    a,1
  537.     sta    zero
  538.     lda    s1
  539.     call    prdig
  540.     ret
  541. ;
  542. ;
  543. ;binary to decimal conversion.  de=binary number
  544. ;hl=binary equiv. of decimal factor,  bc=decimal digit adr.
  545. BTOD:
  546.     XCHG
  547.     call    cmpdh
  548.     XCHG
  549.     jc    nextd    ;done if binary is less than dec factor
  550.     XCHG
  551.     CALL    HSUBD
  552.     xchg
  553.     ldax    b
  554.     inr    a
  555.     stax    b
  556.     jmp    btod
  557. nextd:    inx    b
  558.     ret
  559. ;
  560. prdig    ;print the digit in a
  561.     mov    b,a
  562.     ana    a
  563.     jnz    adasc
  564.     lda    zero
  565.     ana    a
  566.     rz
  567. adasc:    mvi    a,1
  568.     sta    zero
  569.     mvi    a,'0'
  570.     add    b
  571.     call    pchar
  572.     ret
  573. ;
  574. prcomma:
  575.     lda    zero
  576.     ana    a
  577.     rz
  578.     mvi    a,','
  579.     call    pchar
  580.     ret
  581. ;
  582. ;    VARIABLE & STRING AREA
  583. ;
  584. s10000:    ds    1    ;decimal storage
  585. s1000:    ds    1
  586. s100:    ds    1
  587. s10:    ds    1
  588. s1:    ds    1
  589. zero    ds    1    ;leading zero flag
  590. ;
  591. ;
  592. ;
  593. FIVE:    DB    1    ;counts 5 file names across screen
  594. ;
  595. OLDSEL:     DS    1    ;CURRENT DEFAULT DISK
  596. NEWSEL:     DS    1    ;DISK TO CHECK
  597. FILECT        Dw    0    ;FILE COUNT
  598. FILECTR        Dw    0    ;FILE COUNT (print)
  599. DIRTBL        DS    2
  600. FREESIZE    DS    2
  601. ABYTE:        DS    1
  602. ;
  603. LOWSTRING    DS    2
  604. LINECT        DS    1
  605. COLCT        DS    1
  606. COL5        DS    1
  607. COL4        DS    1
  608. COL3        DS    1
  609. COL2        DS    1
  610. COL1        DS    1
  611. SORTBL        DS    2
  612. SORPTR        DS    2
  613. ;
  614. PWDIROVL    db    1,'PW      COM'
  615. ecimal conversion.  de=binary number
  616. ;hl=bin