home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / cpm / utils / f / pwaids.ark / PWDIR.ASM < prev    next >
Assembly Source File  |  1989-09-27  |  6KB  |  327 lines

  1. ;    PWDIR.ASM -- RON FRIEDRICH  DEC. 1984
  2. ;    See PWDIR.DOC for installation procedures.
  3. ;
  4. ;Set MHELP and MGOSPEL below to the proper function addresses
  5. ;for your version of Perfect Writer.  See the PW.SYM file on the PW
  6. ;installation disk.  Don't forget the 'H' for hex numbers.  The values
  7. ;given here are for PW v.1.20.
  8. ;
  9. MHELP    EQU    45F1H
  10. MGOSPEL    EQU    5EC9H
  11. ;
  12. BDOS    EQU    0005H    ;DOS ENTRY POINT (DE)
  13. CONIN    EQU    1    ;READ CONSOLE (C; BYTE RETURNED TO A)
  14. CONOUT    EQU    2    ;TYPE CHARACTER (C; BYTE IN E)
  15. PRINTS    EQU    9    ;PRINT STRING FUNCTION (C; ADR IN DE)
  16. RSTDSK    EQU    13    ;RESET DISK SYSTEM (C)
  17. SELDSK  EQU    14    ;SELECT DISK (C; DISK # IN E)
  18. SRCH    EQU    17    ;SEARCH DIRECTORY (C; FCB IN DE)
  19. SRCHMOR EQU    18    ;SEARCH FOR NEXT IN DIRECTORY (C) 
  20. CURDSK    EQU    25    ;CURRENT DISK (C; DISK # RETURNED IN A)
  21. SETDMA    EQU    26    ;(C; DMA adr in DE)
  22. ALLOC    EQU    27    ;Get ALLOCATION address (C; returned in HL)
  23. PARAMS    EQU    31    ;Get DISK PARAMETER address (C; returned in HL)
  24. ;
  25. ;    NON GRAPHIC CHARACTERS
  26. CR    EQU    0DH    ;CARRIAGE RETURN
  27. LF    EQU    0AH    ;LINE FEED
  28. SPACE    EQU    32
  29. CLINE    EQU    24    ;CLEAR TO END OF LINE
  30. CLEAR    EQU    26    ;CLEAR SCREEN
  31. ESC    EQU    27
  32. ;
  33. ;****************************************************************
  34. ;AUTOMATIC DISK RESET WHEN PW.COM IS LOADED:
  35.     ORG    104H        ;address of null bytes PW.COM v.1
  36.     CALL    MGOSPEL
  37. ;
  38. ;****************************************************************
  39. ;DISPLAY DISK DIRECTORY ROUTINE:
  40. ;
  41.     ORG    MHELP
  42.     PUSH B
  43.     MVI    C,CURDSK
  44.     CALL    BDOS        ;Get current default disk.
  45.     STA    OLDSEL
  46.     XRA    A        ;ZERO A; DEFAULT DISK 'A'
  47.     STA    NEWSEL
  48.     INR    A        ; A = 1; IN 'FOUR' VAR
  49.     STA    FOUR
  50.     MVI    A,'A'
  51.     STA    TITLE2
  52.     LXI    D,DRSEL
  53.     CALL    PSTRING    ;PRINT SIGN ON MESSAGE
  54.     MVI    C,CONIN
  55.     CALL    BDOS    ;GET DISK SELECTION (A OR B)
  56.     CPI    'B'    ;IS IT B?
  57.     CZ    DRIVEB    ;IF YES, SWITCH IT 'B'
  58.     CPI    'b'
  59.     CZ    DRIVEB
  60.     LXI    D,TITLE1    ;PRINT TITLE
  61.     CALL    PSTRING
  62.     MVI    C,RSTDSK
  63.     CALL    BDOS        ;Reset disk system.
  64.     LDA    NEWSEL
  65.     MOV    E,A
  66.     MVI    C,SELDSK
  67.     CALL    BDOS        ;Select disk to check.
  68. ;
  69. ;START DIRECTORY SEARCH
  70.     LXI    H,0
  71.     SHLD    FILECT
  72.     LXI    D,DMA
  73.     MVI    C,SETDMA
  74.     CALL    BDOS
  75.     LXI    D,FCB
  76.     MVI    C,SRCH
  77. ;
  78. NEXTNAME:
  79.     CALL    BDOS
  80.     INR    A
  81.     JZ    CALCFREE
  82.     DCR    A
  83.     PUSH    PSW    ;PUSH A
  84.     LHLD    FILECT    ;GET FILE COUNT
  85.     INX    H    ;INCREMENT FILE COUNT
  86.     SHLD    FILECT    ;SAVE IT
  87.     LDA    FOUR
  88.     DCR    A
  89.     JZ    RST4
  90.     STA    FOUR
  91.     LXI    D,DIV
  92.     CALL    PSTRING    ; ' | '
  93.     POP PSW
  94. MULTA:    ;A * 32 + 1
  95.     RAL        ;Rotate A five times.
  96.     RAL        ; ADD A five times also works.
  97.     RAL
  98.     RAL
  99.     RAL
  100.     INR    A
  101.     MVI    B,0    ;CLEAR B
  102.     MOV    C,A    ;DMA BYTE COUNT IN BC
  103.     LXI    H,DMA    ;DMA ADDRESS IN HL
  104.     DAD    B    ;ADD BC+LH = FIRST BYTE OF FILENAME
  105.     MVI    B,8    ;START BYTE COUNT 'FILENAME'
  106. ;
  107. FILENAME:
  108.     CALL    PRINTFN
  109.     JNZ    FILENAME
  110. ;Print space
  111.     PUSH    H
  112.     MVI    A,SPACE
  113.     CALL    PCHAR
  114.     POP    H
  115.     MVI    B,3    ;START BYTE COUNT 'EXT'
  116. ;
  117. EXTENT:
  118.     CALL    PRINTFN
  119.     JNZ    EXTENT
  120. ;
  121.     MVI    C,SRCHMOR
  122.     JMP    NEXTNAME
  123. ;
  124. CALCFREE:    ;CALCULATE FREE SPACE
  125.     MVI    C,PARAMS
  126.     CALL    BDOS
  127.     INX    H
  128.     INX    H
  129.     MOV    A,M
  130.     STA    BYTE
  131.     INX    H
  132.     INX    H
  133.     INX    H
  134.     MOV    E,M
  135.     INX    H
  136.     MOV    D,M
  137.     PUSH    D
  138.     MVI    C,ALLOC
  139.     CALL    BDOS
  140.     XCHG
  141.     POP    H
  142.     INX    H
  143.     LXI    B,0
  144. LOOP1:
  145.     PUSH    D
  146.     LDAX    D
  147.     MVI    E,8
  148. LOOP2:
  149.     RAL
  150.     JC    JMP1
  151.     INX    B
  152. JMP1:
  153.     MOV    D,A
  154.     DCX    H
  155.     MOV    A,L
  156.     ORA    H
  157.     JZ    JMP2
  158.     MOV    A,D
  159.     DCR    E
  160.     JNZ    LOOP2
  161.     POP    D
  162.     INX    D
  163.     JMP    LOOP1
  164. JMP2:
  165.     POP    D
  166.     MOV    L,C
  167.     MOV    H,B
  168.     LDA    BYTE
  169.     SUI    3
  170.     JZ    PSIZE
  171. LOOP3:
  172.     DAD    H
  173.     DCR    A
  174.     JNZ    LOOP3
  175. ;
  176. PSIZE:    PUSH    H
  177.     CALL    NEWLN
  178.     CALL    NEWLN
  179.     LHLD    FILECT
  180.     CALL    PRNUM
  181.     LXI    D,FLMSG
  182.     CALL    PSTRING
  183.     POP    H
  184.     CALL    PRNUM
  185.     LXI    D,FREE
  186.     CALL    PSTRING
  187. ;
  188.     LDA    OLDSEL
  189.     MOV    E,A
  190.     MVI    C,SELDSK
  191.     CALL    BDOS        ;Restore default disk.
  192.     POP    B
  193.     RET            ;EXIT
  194. ;
  195. ;    SUBROUTINES
  196. ;
  197. PCHAR:    ;PRINT A CHARACTER
  198.     PUSH D
  199.     MVI    C,CONOUT
  200.     MOV    E,A
  201.     CALL    BDOS
  202.     POP D
  203.     RET
  204. ;
  205. PRNUM:    ;BCD ADJUST (BINARY NUMBER IS IN HL) AND PRINT IT (NUM < 1000)
  206.     XRA    A    ;ZERO A
  207.     LXI    D,0    ;ZERO DE  (BCD count)
  208.     LXI    B,0    ;ZERO BC  (BINARY count)
  209. LOOP4:
  210.     PUSH    PSW    ;save packed BCD number
  211.     MOV    A,C
  212.     CMP    L    ;low binary byte match?
  213.     JNZ    INCR    ;no, skip high byte check
  214.     MOV    A,B
  215.     CMP    H    ;high binary byte match?
  216.     JZ    PRINT    ;yes, BCD adjust done, print the number
  217. INCR:    POP    PSW    ;recover packed BCD number
  218.     INX    B    ;increment binary (BC)
  219.     ANA    A    ;clear carry bit
  220.     INR    A    ;increment BCD number
  221.     DAA        ;decimal adjust
  222.     JNC    LOOP4    ;no carry
  223.     INR    D    ;carry "100" byte
  224.     JMP    LOOP4    ;check it
  225. PRINT:
  226.     MOV    A,D    ;get '100' byte
  227.     CPI    0    ;is it zero?
  228.     JZ    GET10    ;yes, skip it
  229.     ADI    '0'    ;otherwise print it
  230.     CALL    PCHAR
  231. GET10:    POP    PSW    ;recover packed BCD number
  232.     PUSH    PSW    ;save it again
  233.     RRC        ;shift high nibble down
  234.     RRC
  235.     RRC
  236.     RRC
  237.     ANI    0FH    ;zero all other bits
  238.     CPI    0    ;is '10' byte = 0?
  239.     JNZ    PR10    ;no, print it
  240.     SUB    D    ;is '100' byte also = 0?
  241.     JZ    PR1    ;yes, skip '10' byte
  242.     XRA    A    ;no, zero A and print it
  243. PR10:    ADI    '0'
  244.     CALL    PCHAR
  245. PR1:    POP    PSW    ;recover packed BCD number
  246.     ANI    0FH    ;zero high ('10') nibble
  247.     ADI    '0'    ;print units nibble
  248.     CALL    PCHAR
  249.     RET
  250. ;
  251. RST4:    ; The 'FOUR' variable counts # of file names / printed line.
  252.     CALL    NEWLN
  253.     MVI    A,4
  254.     STA    FOUR
  255.     POP    PSW
  256.     JMP    MULTA
  257. ;
  258. DRIVEB:    ;SWITCH DRIVE SELECTION TO B:
  259.     MVI    A,1
  260.     STA    NEWSEL
  261.     MVI    A,'B'
  262.     STA    TITLE2
  263.     RET
  264. ;
  265. NEWLN:
  266.     LXI    D,CRLF
  267.     CALL    PSTRING
  268.     RET
  269. ;
  270. PSTRING:    ;PRINT STRING
  271. ;    D,E ADDRESSES MESSAGE ENDING WITH "$"
  272.     MVI    C,PRINTS    ;PRINT BUFFER FUNCTION
  273.     CALL    BDOS
  274.     RET
  275. ;
  276. PRINTFN:
  277.     MOV    A,M    ;GET FILENAME BYTE
  278.     PUSH    H    ;STASH DMA ADDRESS
  279.     PUSH    B    ;STASH LINE BYTE COUNT
  280.     CALL    PCHAR    ;PRINT IT
  281.     POP    B
  282.     POP    H
  283.     INX    H    ;INCREMENT DMA ADDRESS
  284.     DCR    B    ;DECREMENT LINE BYTE COUNT
  285.     RET
  286. ;
  287. ;
  288. ;    VARIABLE & STRING AREA
  289. FOUR:    DB    1
  290. CRLF:    DB    CR,LF,'$'
  291. DIV:    DB    ' | $'
  292. DRSEL:    DB    ESC,'=7 ',CLINE,'DIRECTORY: Drive A or B? $'
  293. TITLE1: DB    CLEAR,'Directory of disk in Drive '
  294. TITLE2:    DB    'A: $'
  295. FCB:    DB    0,'???????????',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  296. FLMSG:  DB    ' files,   $'
  297. FREE:    DB    'K free disk space',ESC,'=6 '
  298. REDRW:    DB    'Hit ESC --> or ESC CTRL-L to redraw screen.$'
  299. ;
  300. OLDSEL: DS    1    ;CURRENT DEFAULT DISK
  301. NEWSEL: DS    1    ;DISK TO CHECK
  302. FILECT: DS    2    ;FILE COUNT
  303. BYTE:    DS    1
  304. DMA:    NOP    ;START DISK INPUT BUFFER
  305. ;
  306. ;*********************************************************************
  307. ;RESET DISK SYSTEM ROUTINE:
  308. ;
  309.     ORG    MGOSPEL
  310.     PUSH    B
  311.     MVI    C,CURDSK
  312.     CALL    BDOS        ;Get current default disk.
  313.     MOV    E,A
  314.     PUSH    D        ;Save it.
  315.     MVI    C,RSTDSK
  316.     CALL    BDOS        ;Reset disk system.
  317.     POP    D
  318.     MVI    C,SELDSK
  319.     CALL    BDOS        ;Restore default disk.
  320.     POP    B
  321.     RET
  322.     END
  323. B    ;STASH LINE BYTE COUNT
  324.     CALL    PCHAR    ;PRINT IT
  325.     POP    B
  326.     POP    H
  327.     INX    H    ;INCREMENT