home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / f / file13.lbr / FILE.AZM / FILE.ASM
Encoding:
Assembly Source File  |  1993-10-26  |  12.0 KB  |  413 lines

  1.  
  2. ; FILE.ASM
  3. ;
  4. ; v13 - 13 FEB 83 - IRV HOFF
  5. ;
  6. ; ORIGINALLY WRITTEN BY R. RODMAN.  RENAMED TO 'FILEFIND' BY ANOTHER
  7. ; PERSON IN APRIL 1981.  NOW RESTORED TO ORIGINAL INTENDED NAME.
  8. ;
  9. ; THIS PROGRAM WILL SEARCH ALL USER AREAS OF ALL DRIVES (CAN BE LIMITED
  10. ; BY CHANGING THE MAXUSR' EQUATE) FOR ANY FILES MATCHING THE REQUEST ON
  11. ; THE COMMAND LINE.  IT THEN DISPLAYS THOSE FILES.  ALLOWABLE USER AREAS
  12. ; FOR CP/M ARE 0-15.
  13. ;
  14. ;
  15. ; EXAMPLE:  FILE*.COM  LISTS ALL .COM FILES ON ALL DRIVES
  16. ;
  17. ;
  18. ; THIS PROGRAM MAKES A DIRECT CALL TO THE 'SELDSK' ROUTINE OF THE BIOS
  19. ; TO DETERMINE A DRIVE'S EXISTENCE WITHOUT CAUSING A BDOS ERROR.
  20. ;
  21. ; NOTE:     THIS PROGRAM ASSUMES THAT ANY BIOS 'ILLEGAL DRIVE SELECT' TRAPS
  22. ;     WILL CAUSE THE SYSTEM TO EXECUTE A WARM-BOOT BY JUMPING TO AD-
  23. ;     DRESS 0.  THIS OCCURS ON THE FIRST NON-EXISTANT DRIVE IT TRIES
  24. ;     TO ACESS WHILE ATTEMPTING TO CHECK 0-15 DRIVES.  IF A SELECT
  25. ;     ERROR BYPASSES THE WARM-BOOT JUMP AT ADDRESS 0, THEN  THE TRAP
  26. ;     IN THIS PROGRAM WILL NOT WORK.  IN THAT CASE, SET 'DRVTYPE' TO
  27. ;     FALSE AND 'MAXDRV' TO THE NUMBER OF DRIVES YOU HAVE.
  28. ;
  29. ;
  30. ; PLEASE RETURN ANY UPDATES TO TECHNICAL CBBS DEARBORN MI (313) 846-6127
  31. ; SO THE FILE WILL BE AVAILABLE TO ALL.
  32. ;
  33. ;
  34. ;=======================================================================
  35. ;
  36. ;
  37. ; 02/13/83  NOW PRINTS A NORMAL DISPLAY FOR DRIVE/USER AREA WHILE KEEP-
  38. ;        NORMAL COLUMN WIDTH FOR JUSTIFICATION.  OTHER MINOR CHANGES.
  39. ;        ALWAYS STARTS AT FIRST DISK, USER 0, REGARDLESS WHAT DISK OR
  40. ;           USER NUMBER YOU ARE CURRENTLY IN, THEN RETURNS TO PRESENT
  41. ;           DRIVE AND USER AREA.    - Irv Hoff
  42. ;
  43. ; 02/02/82  ENABLED PROGRAM TO LOOK AT A SPECIFIC NUMBER OF DRIVES IN
  44. ;        THE EVENT THE BIOS 'ILLEGAL DRIVE SELECT' IS NOT INCLUDED.
  45. ;                    - Larry Clive
  46. ;
  47. ; 08/02/81  CLEANED UP FILE AND REMOVED UNNECESSARY CODE.  THANKS TO TOM
  48. ;        AND SHAWN FOR ADDING SOME MORE GOODIES.
  49. ;                    - Dave Hardy
  50. ;
  51. ; 07/31/81  MODIFIED 'AVAIL' ROUTINE TO ABORT ONLY ON CTL-C FROM THE
  52. ;        CONSOLE.  CLEANED UP THE FILE, RESTORED ORIGINAL AUTHOR'S
  53. ;        NAME TO THE HEADING.  ADDED TUTORIAL TO BE PRINTED IF FILE-
  54. ;        NAME (FCB) FIELD (FN.FT TAIL OF THE COMMAND LINE) IS BLANK
  55. ;        (OMITTED BY THE INEXPERIENCED USER).  SUBSTITUTED IN-LINE
  56. ;        PRINT ROUTINE WHERE APPROPRIATE FOR ALL PRINTED MESSAGES.
  57. ;        PRINTS MESSAGE ON EXIT IF NO FILES WERE FOUND (MATCHED).
  58. ;                    - Thomas V. CHURBUCK
  59. ;
  60. ; 07/30/81  MODIFIED 'AVAIL' ROUTINE TO ABORT PROGRAM IF ANY CHARACTER
  61. ;        IS TYPED FROM THE CONSOLE.  MODIFED USER NUMBER ROUTINE TO
  62. ;        INCLUDE LEADING 0 WHEN PRINTING USER #'S 0-9 TO LINE UP
  63. ;        PRINTOUT.
  64. ;                    - Shawn Everson
  65. ;
  66. ;
  67. ;=======================================================================
  68. ;
  69. ;
  70. ;  DEFINE TRUE AND FALSE
  71. ;
  72. FALSE:      EQU    0
  73. TRUE:      EQU    0FFH
  74. ;.....
  75. ;
  76. ;
  77. ; SET THE FOLLOWING AS DESIRED:
  78. ;
  79. SHOWSYS:  EQU    true        ;TRUE IF WANT TO SHOW SYSTEM FILES
  80. DRVTYP:      EQU    TRUE        ;TRUE IF BIOS HAS 'ILLEGAL DRIVE SELECT'
  81.                 ;TRAP.  SET FALSE IF NO TRAP IN BIOS,
  82.                 ;THEN SET MAXDRV TO NUMBER OF DRIVES TO
  83.                 ;SEARCH THROUGH FOR THE REQUESTED FILE.
  84. MAXDRV:      EQU    2        ;NUMBER OF DRIVES TO SEARCH THROUGH
  85. MAXCOL:      EQU    2        ;NUMBER OF COLUMNS DESIRED IN DISPLAY
  86. MAXUSR:      EQU    15        ;MAX USER # TO BE CHECKED (0-15 POSSIBLE)
  87. ;.....
  88. ;
  89. ;
  90. ;  DEFINE SOME MISCELLANEOUS VALUES:
  91. ;
  92. BASE:      EQU    0        ;SET TO BASE ADDRESS OF YOUR CP/M
  93. BDOS:      EQU    BASE+5        ;CP/M BDOS ENTRY POINT
  94. FCB:      EQU    BASE+5CH    ;CP/M FILE CONTROL BLOCK ADDRESS
  95. DMABUF:      EQU    BASE+80H    ;DMA BUFFER ADDRESS
  96. CR:      EQU    0DH        ;ASCII RETURN
  97. LF:      EQU    0AH        ;ASCII LINEFEED
  98. ;.....
  99. ;
  100. ;
  101. ;  DEFINE SOME BDOS FUNCTIONS:
  102. ;
  103. CONIN:      EQU    1        ;CONSOLE INPUT FUNCTION
  104. CONOUT:      EQU    2        ;CONSOLE OUTPUT FUNCTION
  105. PRINT:      EQU    9        ;PRINT STRING AT CONSOLE FUNCTION
  106. CONSTAT:  EQU    11        ;GET CONSOLE STATUS FUNCTION
  107. RTNVER:      EQU    12        ;RETURN VERSION NUMBER FUNCTION
  108. SRCHFST:  EQU    17        ;SEARCH FOR FIRST FUNCTION
  109. SRCHNXT:  EQU    18        ;SEARCH FOR NEXT FUNCTION
  110. SETIOB:      EQU    24        ;SET I/O BYTE
  111. SETDMA:      EQU    26        ;SET DMA ADDRESS FUNCTION
  112. SETUSR:      EQU    32        ;SET/GET USER CODE FUNCTION
  113. ;.....
  114. ;
  115. ;
  116.       ORG    BASE+100H
  117. ;
  118. ;
  119.       POP    H        ;GET RETURN ADDRESS TO CCP
  120.       SHLD    EXITSPCL+1    ;STORE FOR RETURN TO CCP
  121.       LXI    SP,STACK    ;SET UP LOCAL STACK
  122.       CALL    ILPRT        ;PRINT SIGN-ON MESSAGE
  123.       DB    CR,LF,'FILE v13  02/13/83',CR,LF
  124.       DB    'Control-C to abort',CR,LF,CR,LF,0
  125.       LDA    FCB+1        ;CHECK FOR FILENAME ON COMMAND LINE
  126.       CPI    ' '
  127.       JNZ    SETUP        ;IF IT'S THERE, THEN CONTINUE
  128.       CALL    ILPRT        ;ELSE, PRINT HELP MESSAGE AND EXIT
  129.       DB    '       You must specify the file(s) you',CR,LF
  130.       DB    '       want to find.  Wildcards are ok.',CR,LF,LF
  131.       DB    '       EXAMPLE:  FILE MODEM7.DOC',CR,LF
  132.       DB    '                 FILE MOD*.*',CR,LF
  133.       DB    '                 FILE *.ASM',CR,LF
  134.       DB    '                 FILE *.*',CR,LF,LF,0
  135. ;
  136. EXITSPCL: JMP    0000H        ;OVER-WRITTEN BY START
  137. ;.....
  138. ;
  139. ;
  140. SETUP:      LDA    0004H        ;SAVE USER/DRIVE #
  141.       STA    UDNUM
  142.       RRC            ;1ST 4 BITS GIVE CURRENT USER #
  143.       RRC
  144.       RRC
  145.       RRC
  146.       ANI    0FH        ;'AND' OFF THE DRIVE BITS
  147.       STA    CUN        ;SAVE CURRENT USER #
  148.       STA    CTU        ;SAVE AS CURRENT TRY #,TOO
  149.       MOV    B,A
  150.       MVI    A,MAXUSR
  151.       CMP    B
  152.       JC    OUTSIDE
  153.       XRA    A
  154.       STA    CTU        ;SET CURRENT TRY USER TO 0
  155.       STA    ORIGCTU        ;SET ORIGINAL CTU TO SAME
  156.       MVI    A,MAXUSR
  157.       STA    MAXTEMP        ;SET MAXIMUM USER NUMBER TO MAXUSR
  158. ;
  159. SBOOT:      LHLD    0000H+1        ;GET WARM-BOOT ADDRESS
  160.       SHLD    WBOOT        ;SAVE WARM-BOOT ADDRESS
  161.       LXI    D,SETIOB    ;GET ADDRESS FOR 'SET I/O BYTE'
  162.       DAD    D        ;INDEX INTO BIOS
  163.       SHLD    DSKSEL+1    ;GET JUMP TO BIOS 'DSKSEL' ROUTINE
  164. ;
  165. ;
  166. ; THE FOLLOWING CODE SETS A TRAP AT THE WARM-BOOT JUMP, SO THAT
  167. ; ANY 'ILLEGAL DRIVE SELECT' TRAPS IN THE BIOS WILL BE DEFEATED.
  168. ;
  169.       LXI    H,DONE        ;REPLACE WARM-BOOT POINTER WITH TRAP
  170.       SHLD    1
  171.       LXI    D,DMABUF
  172.       MVI    C,SETDMA
  173.       CALL    BDOS        ;SET DMA ADDRESS
  174.       MVI    A,0        ;START LOOKING ON 0 DRIVE ("A")
  175.       STA    TRYDRV        ;SET UP TO TRY DRIVE '0' FIRST
  176. ;
  177. TRY:      MOV    C,A        ;TRY TO SELECT DRIVE
  178.       CALL    DSKSEL
  179.       MOV    A,L
  180.       ORA    H
  181.       JZ    DONE        ;IF HL=0 THEN NO MORE DRIVES
  182.       LDA    TRYDRV
  183.       INR    A
  184.       STA    TRYDRV        ;GET READY FOR NEXT DRIVE, TOO
  185.       STA    FCB        ;STORE 1+DRIVE# IN FCB (1=A, 2=B, ETC.)
  186. ;
  187. NXTUSR:      LDA    CTU        ;SET USER TO CTU VIA A BDOS CALL
  188.       MOV    E,A
  189.       MVI    C,SETUSR
  190.       CALL    BDOS
  191. ;
  192. AVAIL:      MVI    C,CONSTAT    ;CHECK TO SEE IF KEY PRESSED
  193.       CALL    BDOS
  194.       ORA    A
  195.       JZ    NOPRESS        ;IF NO KEY PRESSED, THEN CONTINUE
  196.       MVI    C,CONIN        ;IF KEY PRESSED, THEN CHECK FOR ABORT
  197.       CALL    BDOS
  198.       CPI    'C'-40H        ;IS IT CONTROL-C?
  199.       JNZ    NOPRESS        ;IF NO, THEN CONTINUE
  200.       CALL    ILPRT        ;IF YES, THEN PRINT ABORT MESSAGE
  201.       DB    CR,LF,LF,'++ ABORTED ++',CR,LF,0
  202.       JMP    DONE1
  203. ;.....
  204. ;
  205. ;
  206. NOPRESS:  LXI    D,FCB
  207.       MVI    C,SRCHFST
  208.       CALL    BDOS        ;CHECK FOR DIRECTORY MATCH WITH FCB
  209.       CPI    0FFH        ;A-REG. HAS 0-3 IF FILE FOUND ELSE 0FFH
  210.       JZ    NXT        ;DO NEXT DRIVE IF NO MORE MATCHES FOUND
  211.       CALL    SHOFIL        ;IF MATCH FOUND, DISPLAY THE FILENAME
  212. ;
  213. SNEXT:      MVI    C,SRCHNXT
  214.       CALL    BDOS        ;CHECK FOR NEXT MATCH WITH FCB
  215.       CPI    0FFH    
  216.       JZ    NXT        ;NO MORE MATCHES? THEN DO NEXT DRIVE
  217.       CALL    SHOFIL        ;IF MATCH FOUND, DISPLAY THE FILENAME
  218.       JMP    SNEXT        ;CONTINUE UNTIL NO MORE MATCHES FOUND
  219. ;
  220. NXT:      LDA    CTU        ;INCREMENT CURRENT TRY USER NUMBER
  221.       INR    A
  222.       STA    CTU
  223.       MOV    B,A
  224.       LDA    MAXTEMP
  225.       CMP    B
  226.       JNC    NXTUSR        ;DO NEXT USER NUMBER IF ALL NOT DONE
  227.       LDA    ORIGCTU        ;ELSE RESET USER # AND DO NEXT DRIVE
  228.       STA    CTU
  229.       MVI    C,RTNVER
  230.       CALL    BDOS        ;SEE IF CP/M VERSION 1.4 OR 2.X
  231.       MVI    C,5        ;(IF CP/M 1.4, THEN BIOS MUST RETURN AN
  232.       ORA    A        ;ERROR IF BAD DRIVE #, ELSE WON'T WORK)
  233.       JZ    FOUR        ;IF 1.4 THEN FOUR DRIVES MAXIMUM
  234. ;
  235.        IF    DRVTYP
  236.       MVI    C,16+1        ;OTHERWISE 16 DRIVES MAXIMUM UNLESS
  237.        ENDIF        ;NO BIOS TRAP.
  238. ;
  239.        IF    NOT DRVTYP    ;IF NO TRAP THEN MAX DRIVES NUMBER IS
  240.       MVI    C,MAXDRV    ;IS SET MANUALLY.
  241.        ENDIF
  242. ;
  243. FOUR:      LDA    TRYDRV
  244.       CMP    C
  245.       JC    TRY        ;CONTINUE UNTIL ALL DRIVES CHECKED...
  246. ;
  247. ;
  248. ; ALL DONE NOW, RETURN TO CP/M
  249. ;
  250. DONE:      LDA    MFLAG        ;SEE IF ANY FILES FOUND
  251.       ORA   A
  252.       JNZ    DONE1        ;IF YES, THEN DONE, SO EXIT
  253.       CALL    ILPRT        ;IF NO, THEN SAY NONE FOUND FIRST
  254.       DB    '++ FILE NOT FOUND ++',0
  255. ;
  256. DONE1:      CALL    ILPRT
  257.       DB    CR,LF,0        ;TURN UP A LINE
  258.       LHLD    WBOOT        ;RESTORE WARM-BOOT JUMP
  259.       SHLD    1
  260.       LDA    UDNUM        ;RESTORE USER/DRIVE NUMBER
  261.       STA    4
  262.       ANI    0FH
  263.       MOV    C,A        ;PUT THE DRIVE INTO 'C'
  264.       CALL    DSKSEL
  265. ;
  266. EXIT:      JMP    0000H        ;THEN RETURN TO CP/M VIA WARM REBOOT
  267. ;
  268. OUTSIDE:  LDA    CUN
  269.       STA    CTU        ;SET CURRENT TRY USER TO CURRENT USER #
  270.       STA    ORIGCTU        ;SET ORIGINAL CTU TO SAME
  271.       STA    MAXTEMP        ;SET MAXIMUM USER NUMBER TO CURRENT
  272.       JMP    SBOOT        ;AND CONTINUE...
  273. ;
  274. SHOFIL:      MOV    L,A        ;GET FILENAME TO DISPLAY FROM DIRECTORY
  275.       MVI    H,0        ;WHICH CP/M PUTS AT DMA ADDRESS
  276.       DAD    H        ;("A" REGISTER HAS RELATIVE POSITION OF
  277.       DAD    H        ;NAME  WITHIN DIRECTORY RECORD)
  278.       DAD    H
  279.       DAD    H
  280.       DAD    H        ;MULTIPLY "A" BY 32 TO POINT TO START OF
  281.       LXI    D,DMABUF    ;FILENAME
  282.       DAD    D        ;NOW POINT TO FILENAME
  283.       XCHG            ;SAVE FILENAME POINTER IN DE
  284. ;
  285.        IF    NOT SHOWSYS    ;THEN IGNORE SYS FILES
  286.       LXI    H,10
  287.       DAD    D        ;POINT TO SYS FILE ATTRIBUTE
  288.       MOV    A,M
  289.       ANI    80H        ;CHECK FOR SYS TYPE FILE
  290.       RNZ            ;DON'T DISPLAY IF SYS ATTRIBUTE IS SET
  291.        ENDIF
  292. ;
  293.       LDAX    D        ;GET USER NUMBER
  294.       INX    D
  295.       PUSH    PSW        ;SAVE THE USER NUMBER
  296.       CPI    9+1        ;IS USER NUMBER = 0 THRU 9?
  297.       JNC    SHOFIL1        ;IF NOT, EXIT
  298.       MVI    A,' '
  299.       CALL  AOUT        ;PRINT THE EXTRA SPACE
  300. ;
  301. SHOFIL1:  LDA    TRYDRV        ;GET THE DISK DRIVE
  302.       ADI    'A'-1        ;CONVERT BINARY TO ASCII
  303.       CALL    AOUT        ;DISPLAY DRIVE (A-P)
  304.       POP    PSW        ;SAVE THE USER NUMBER
  305.       CPI    9+1        ;0-9 ?
  306.       JC    USRL        ;IF YES, EXIT
  307. ;
  308.       SUI    10        ;USER NUMBER = 10 THRU 15
  309.       PUSH    PSW        ;REMAINDER IS <10
  310.       MVI    A,'1'
  311.       CALL    AOUT        ;PRINT A LEADING '1'
  312.       POP    PSW        ;GET THE REMAINDER BACK
  313. ;
  314. USRL:      ADI    '0'        ;CONVERT FROM BINARY TO ASCII #
  315.       CALL    AOUT        ;PRINT DIGIT
  316. ;
  317. NOUSR:      MVI    A,':'        ;FENCE CHARACTER
  318.       CALL    AOUT        ;DISPLAY A ':' TO LOOK NICE
  319.       MVI    A,' '
  320.       CALL    AOUT        ;SEPARATE IT FROM THE FILE NAME
  321.       MVI    B,8        ;(8 CHARACTERS OR LESS IN FILENAME)
  322. ;
  323. PFN:      LDAX    D        ;NOW PRINT THE FILENAME..
  324.       INX    D
  325.       CALL    AOUT        ;..ONE CHARACTER AT A TIME
  326.       DCR    B
  327.       JNZ    PFN        ;CONTINUE FOR ALL 8 CHARACTERS 
  328.       MVI    A,'.'
  329.       CALL    AOUT        ;DISPLAY THE '.' BEFORE THE FILETYPE
  330.       MVI    B,3        ;NOW DO THE SAME FOR THE FILETYPE
  331. ;
  332. PXT:      LDAX    D
  333.       INX    D
  334.       CALL    AOUT
  335.       DCR    B
  336.       JNZ    PXT
  337.       LDA    COLUMN        ;PRINT MAXCOL COLUMNS ACROSS THE SCREEN
  338.       DCR    A
  339.       JZ    DOCRLF
  340.       STA    COLUMN
  341.       CALL    TWOSPC        ;PRINT TWO SPACES TO MAKE IT NEAT
  342.       MVI    A,0FFH        ;SHOW THAT A FILE WAS FOUND
  343.       STA    MFLAG        ;SUPPRESSES 'NOT FOUND' MESSAGE
  344.       RET
  345. ;.....
  346. ;
  347. ;
  348. DOCRLF:      MVI    A,MAXCOL    ;RESET COLUMN NUMBER AFTER LAST COLUMN
  349.       STA    COLUMN
  350.       MVI    A,CR
  351.       CALL    AOUT
  352.       MVI    A,LF
  353.       CALL    AOUT
  354.       RET
  355. ;.....
  356. ;
  357. ;
  358. TWOSPC:      MVI    A,' '
  359.       CALL    AOUT
  360.       MVI    A,' '        ;FALL INTO AOUT
  361. ;
  362. AOUT:      PUSH    H        ;SEND A CHARACTER TO THE CONSOLE
  363.       PUSH    D
  364.       PUSH    B        ;SAVE REGISTERS IN CASE BDOS EATS THEM
  365.       ANI    7FH        ;STRIP PARITY BIT
  366.       MOV    E,A
  367.       MVI    C,2
  368.       CALL    BDOS        ;PRINT THE CHAR. IN 'A' ON THE CONSOLE
  369.       POP    B
  370.       POP    D
  371.       POP    H        ;RESTORE THE REGISTERS
  372.       RET
  373. ;.....
  374. ;
  375. ;
  376. ; INLINE PRINT ROUTINE
  377. ;
  378. ILPRT:      XTHL            ;SET HL TO POINT TO MESSAGE
  379. ;
  380. ILPLP:      MOV    A,M        ;GET A CHARACTER FROM MESSAGE
  381.       CALL    AOUT        ;OUTPUT IT
  382.       INX    H        ;POINT TO NEXT CHARACTER
  383.       MOV    A,M        ;CHECK FOR END OF MESSAGE
  384.       ORA    A        ; (00H MARKS END OF MESSAGE)
  385.       JNZ    ILPLP
  386.       XTHL            ;GET PROPER RETURN ADDRESS ONTO STACK
  387.       RET            ;THEN RETURN TO PROGRAM
  388. ;.....
  389. ;
  390. ;
  391. COLUMN:      DB    MAXCOL        ;COLUMN COUNTER
  392. CTU:      DB    0        ;CURRENT TRY USER NUMBER
  393. CUN:      DB    0        ;CURRENTLY LOGGED-IN USER NUMBER
  394. MAXTEMP:  DB    0        ;MAXIMUM TRY USER NUMBER
  395. MFLAG:      DB    0        ;FLAG SET TO NON-ZERO IF FILE IS FOUND
  396. ORIGCTU:  DB    0        ;ORIGINAL CURRENT TRY USER NUMBER
  397. TRYDRV:      DB    0        ;NUMBER OF DRIVE BEING TRIED
  398. UDNUM:      DB    0        ;USER/DRIVE NUMBER IS SAVED HERE
  399. ;
  400. DSKSEL:      DB    0C3H        ;'JMP' INSTRUCTION
  401.       DW    00000H        ;(BIOS'S DSKSEL ADDRESS IS STORED HERE)
  402.                 ;(BYPASSES BDOS TO AVOID "BDOS CALL")
  403. WBOOT:      DW    0000H        ;CP/M WARM-BOOT ADDRESS IS SAVED HERE
  404. ;.....
  405. ;
  406. ;
  407.       DS    64        ;32 LEVEL STACK SHOULD BE ENOUGH ROOM
  408. STACK:      DS    0
  409. ;.....
  410. ;
  411. ;
  412.       END
  413.