home *** CD-ROM | disk | FTP | other *** search
/ Transactor / Transactor_25_1988_Transactor_Publishing.d64 / whereis.asm < prev    next >
Assembly Source File  |  2023-02-26  |  10KB  |  246 lines

  1. ;
  2. ; WHEREIS (C) 1988 ADAM HERST
  3. ;       
  4. ;       WHERE IS THE MATCH TO THE FILE SPECIFICATION ON COMMAND LINE
  5. ;       EXPAND WILD CARDS
  6. ;       SEARCH DRIVE IF SPECIFIED OR SEARCH ALL DRIVES IN DRIVE PATH
  7. ;       SEARCH ALL USER AREAS
  8. ;       RETURN THE DRIVE SPECIFICATION IN THE FORM duu:FILENAME.TYP
  9. ;       SET PROGRAM RETURN CODE TO UNSUCCESSFUL IF NO MATCH FOUND
  10. ;
  11. ; bdos SERVICES
  12.         cONoUT  EQU   2H        ; PRINT CHARACTER
  13.         pRsTR   EQU   9H        ; PRINT STRING
  14.         vERnUM  EQU   0CH       ; RETURN CPM VERSION NUMBER
  15.         sRCHf   EQU   11H       ; SEARCH FOR FIRST FILE NAME
  16.         sRCHn   EQU   12H       ; SEARCH FOR NEXT FILE NAME
  17.         cURdRV  EQU   19H       ; GET CURRENT DRIVE CODE
  18.         sETdMA  EQU   1AH       ; SET DMA BUFFER
  19.         gETuSR  EQU   20H       ; GET/SET USER NUMBER
  20.         gETsCB  EQU   31H       ; GET/SET SCB
  21.         rcODE   EQU   06CH      ; GET/SET PROGRAM RETURN CODE
  22. ; SYSTEM POINTERS               
  23.         fcb     EQU   5CH       ; fcb BUFFER POINTER
  24.         dma     EQU   400H      ; dma BUFFER POINTER
  25.         bdos    EQU   5H        ; bdos FUNCTION POINTER
  26. ; SYMBOLS                       
  27.         cr      EQU   0DH       ; ASCII CARRIAGE RETURN
  28.         lf      EQU   0AH       ; ASCII LINE FEED
  29.         rcode0  EQU   0000H     ; SUCCESSFUL RETURN CODE 
  30.         rcode1  EQU   0FF01H    ; USER UNSUCCESSFUL RETURN CODE
  31.  
  32.         ORG     100H
  33.         
  34. ; EXIT WITH MESSAGE IF NOT CPM 3.0
  35.         MVI     C,vERnUM
  36.         CALL    bdos
  37.         ORA     A
  38.         JNZ     iscpm3
  39.         MVI     C,pRsTR
  40.         LXI     D,iscpm2
  41.         CALL    bdos
  42.         RET
  43. iscpm2  DB      'WHEREIS REQUIRES cp/m 3.0',cr,lf,'$'
  44.  
  45. ; SET DMA BUFFER
  46. iscpm3  MVI     C,sETdMA
  47.         LXI     D,dma
  48.         CALL    bdos
  49.  
  50. ; SET RETURN CODE TO UNSUCCESSFUL
  51.         MVI     C,rcode
  52.         LXI     D,rcode1   
  53.         CALL    bdos
  54.  
  55. ; CHECK IF A DRIVE IS SPECIFIED FOR SEARCH
  56.         LXI     H,fcb      ; POINT TO DRIVE CODE IN FCB
  57.         MOV     A,M        ; GET DRIVE CODE FROM FCB
  58.         ORA     A          ; IS IT THE DEFAULT DRIVE CODE?
  59.         JZ      drive      ; YES SO START SEARCHING DRIVE PATH
  60.         LXI     H,drvoff   ; POINT TO OFFSET VALUE FOR DRIVE PATH IN SUBROUTINE
  61.         MVI     M,04FH     ; SET OFFSET TO END OF DRIVE PATH TO FORCE AN EXIT 
  62.         JMP     user       ; SEARCH USER AREAS
  63.  
  64. ; SEARCH DRIVES IN DRIVE PATH
  65. drive   CALL    pathf      ; GET FIRST DRIVE IN PATH, LEAVE IN A
  66. nodrv   CPI     0H         ; IS THERE A DRIVE IN THE PATH?
  67.         RZ                 ; NO SO EXIT
  68.         LXI     H,fCB      ; POINT TO DRIVE CODE IN FCB
  69.         MOV     M,A        ; PUT DRIVE CODE IN FCB
  70.  
  71. ; SEARCH USER AREAS
  72. user    MVI     C,gETuSR   ; START AT USER AREA 0
  73.         MVI     E,0H
  74.         CALL    bdos
  75.  
  76. ; SEARCH FOR FIRST MATCH TO THE FILE NAME IN THE fcb
  77. file    MVI     C,sRCHf
  78.         LXI     D,fcb
  79.         CALL    bdos
  80. ; CHECK RETURN STATUS
  81.         CPI     0FFH       ; FOUND FILE?
  82.         JZ      nxtusr     ; NO SO SET NEXT USER NUMBER
  83.         CALL    pfspec     ; YES SO PRINT FILESPEC
  84. ; SEARCH FOR NEXT MATCH IN THIS USER AREA
  85. nxtfil  MVI     C,sRCHn
  86.         LXI     D,fcb
  87.         CALL    bdos
  88. ; CHECK RETURN STATUS
  89.         CPI     0FFH       ; FOUND FILE?
  90.         JZ      nxtusr     ; NO SO SET NEXT USER NUMBER
  91.         CALL    pfspec     ; YES SO PRINT FILESPEC
  92. ; DO NEXT FILE
  93.         JMP     nxtfil 
  94.  
  95. ; DO NEXT USER AREA
  96. nxtusr  MVI     C,gETuSR
  97.         MVI     E,0FFH     ; GET USER NUMBER FROM SYSTEM
  98.         CALL    bdos
  99.         INR     A          ; INCREMENT USER NUMBER
  100.         CPI     10H        ; IS IT USER NUMBER 16?
  101.         JZ      nxtdrv     ; YES SO DO NEXT DRIVE IN PATH
  102.         MVI     C,gETuSR
  103.         MOV     E,A        ; SET NEW USER NUMBER
  104.         CALL    bdos
  105.         JMP     file       ; SEARCH THE NEXT USER AREA FOR  FIRST FILE
  106.  
  107. ; DO NEXT DRIVE IN PATH
  108. nxtdrv  CALL    pathn      ; GET NEXT DRIVE CODE, LEAVE IN A
  109.         JMP     nodrv      ; SEARCH THE DRIVE IF THERE IS ONE
  110.  
  111. ; CREATE AND PRINT THE FILESPEC OF DMA ENTRY IN A
  112. pfspec
  113. ; DO USER NUMBER
  114.         LXI     H,dma      ; POINT TO USER NUMBER IN FIRST ENTRY
  115.         MVI     B,0H       ; ENTRY COUNTER TO 0
  116. entry   CMP     B          ; IS IT THE RIGHT DMA ENTRY?
  117.         JZ      number     ; YES SO PUT USER NUMBER IN FILESPEC BUFFER
  118.         LXI     D,20H      ; POINT TO USER NUMBER NEXT ENTRY
  119.         DAD     D
  120.         INR     B          ; INCREMENT ENTRY COUNTER
  121.         JMP     entry      ; CHECK IF THE RIGHT ENTRY
  122. number  MOV     A,M        ; GET USER NUMBER FROM DMA ENTRY
  123.         CPI     10D        ; IS IT LESS THAN 10
  124.         JNC     one        ; YES SO 1 AS FIRST DIGIT IN USER NUMBER
  125.         MVI     A,'0'      ; 0 AS FIRST DIGIT IN USER NUMBER
  126.         STA     fspec+1    
  127.         JMP     second     ; DO SECOND DIGIT IN USER NUMBER
  128. one     MVI     A,'1'      ; PUT A 1 IN FILESPEC BUFFER
  129.         STA     fspec+1
  130. second  MOV     A,M        ; GET USER NUMBER FROM FILE ENTRY IN dma BUFFER
  131.         CPI     10D        ; IS IT LESS THAN 10
  132.         JC      nosub      ; NO SO DON'T SUBTRACT
  133.         SUI     10         ; SUBTRACT THE TEN
  134. nosub   ADI     30H        ; MAKE IT PRINTABLE
  135.         STA     fspec+2    ; PUT IT IN THE FILESPEC BUFFER
  136. ; DO FILENAME 
  137. ; COPY FILE NAME FROM DMA BUFFER TO FILESPEC BUFFER
  138.         INX     H          ; POINT TO FILENAME IN CURRENT ENTRY
  139.         LXI     D,fspec+4H ; POINT TO FILENAME IN FILESPEC BUFFER
  140.         MVI     B,8H       ; SET COUNTER FOR FILENAME LENGTH
  141. fname   MOV     A,M
  142.         STAX    D
  143.         INX     H
  144.         INX     D
  145.         DCR     B
  146.         JNZ     fname
  147.         MVI     B,3H       ; SET COUNTER FOR FILETYPE LENGTH
  148.         INX     D          ; POINT TO FILETYPE IN FILESPEC BUFFER
  149. ftype   MOV     A,M
  150.         STAX    D
  151.         INX     H
  152.         INX     D
  153.         Dcr     B
  154.         JNZ     ftype
  155. ; DO DRIVE LETTER
  156.         LXI     H,fcb      ; POINT TO DRIVE CODE IN FCB
  157.         MOV     A,M        ; GET THE DRIVE CODE
  158.         ADI     40H        ; MAKE IT PRINTABLE
  159.         LXI     H,fspec    ; POINT TO DRIVE CODE IN FILESPEC BUFFER
  160.         MOV     M,A        ; PUT DRIVE CODE IN FILESPEC BUFFER
  161. ; PRINT THE FILESPEC
  162.         MVI     C,pRsTR
  163.         LXI     D,fspec
  164.         CALL    bdos
  165. ; SET RETURN CODE TO SUCCESSFUL
  166.         MVI     C,rcODE
  167.         LXI     D,rcode0
  168.         CALL    bdos
  169. ; RETURN FROM pfspec
  170.         RET
  171.  
  172. ; RETURN THE NEXT DRIVE IN THE DRIVE PATH IN A
  173. ;
  174. ; INITIALIZE FOR FIRST DRIVE IN PATH
  175. pathf   MVI     C,cURdRV   ; GET CURRENT DRIVE CODE
  176.         CALL    bdos
  177.         INR     A          ; ADD DRIVE CODE OFFSET
  178.         LXI     H,drvflg   ; POINT TO DRIVE FLAG
  179.         MOV     M,A        ; SET FLAG, LOW BITS TO DRIVE CODE, HIGH BITS TO 0
  180.         LXI     H,drvoff   ; POINT TO OFFSET OF CURRENT DRIVE IN PATH
  181.         MVI     M,4BH      ; SET OFFSET TO FIRST DRIVE IN PATH - 1
  182. ; GET NEXT DRIVE IN PATH
  183. pathn   LXI     H,drvoff   ; POINT TO SCB OFFSET VALUE FOR PREVIOUS DRIVE 
  184.         MOV     A,M        ; GET THE OFFSET 
  185.         INR     A          ; SET OFFSET FOR CURRENT DRIVE
  186.         MOV     M,A        ; PUT OFFSET VALUE OF CURRENT DRIVE
  187.         CPI     50H        ; IS CURRENT OFFSET POINTING PAST LAST DRIVE IN PATH?
  188.         JZ      retend     ; YES SO RETURN
  189.         LXI     H,scbpb    ; POINT TO OFFSET IN SCB PARAMETER BLOCK
  190.         MOV     M,A        ; PUT OFFSET OF CURRENT DRIVE IN SCBPB OFFSET
  191.         INX     H          ; POINT TO GET/SET CODE IN SCBPB
  192.         MVI     M,0H       ; SET FOR GET OPERATION
  193.         MVI     C,gETsCB   ; GET THE CURRENT DRIVE IN THE DRIVE PATH
  194.         LXI     D,scbpb    ; POINT TO SCB PARAMETER BLOCK
  195.         CALL    bdos
  196.         CPI     0FFH       ; IS IT THE END OF THE PATH?
  197.         JZ      retend     ; YES SO RETURN NO MORE DRIVES CODE
  198.         MOV     B,A        ; STORE CURRENT DRIVE CODE FROM PATH
  199.         CPI     0H         ; IS IT THE DEFAULT DRIVE CODE?
  200.         JZ      chkflg     ; YES SO CHECK IF DEFAULT DRIVE ALREADY RETURNED
  201.         LXI     D,DRVFLG   ;  POINT TO THE DRIVE FLAG
  202.         LDAX    D          ; GET DRIVE FLAG
  203.         ANI     0FH        ; MASK OFF DEFAULT DRIVE RETURNED BITS
  204.         CMP     B          ; IS IT THE DRIVE CODE OF THE DEFAULT DRIVE?
  205.         JNZ     retdrv     ; NO SO RETURN DRIVE CODE
  206. ; CHECK IF DEFAULT DRIVE HAS ALREADY BEEN RETURNED
  207. chkflg  LXI     D,drvflg        ; POINT TO DRIVE FLAG
  208.         LDAX    D          ; GET DRIVE FLAG
  209.         ANI     0F0H       ; MASK OFF DRIVE CODE
  210.         CPI     0F0H       ; HAS IT ALREADY BEEN SEARCHED?
  211.         JZ      pathn      ; YES SO GET NEXT DRIVE IN PATH
  212.         LDAX    D          ; GET DRIVE FLAG, SEARCHED BITS ARE ALREADY 0
  213.         MOV     B,A        ; STORE DRIVE CODE OF CURRENT DRIVE
  214.         ORI     0F0H       ; MASK ON DEFAULT RETURNED FLAG TO RETURNED (0FH)
  215.         STAX    D          ; PUT DEFAULT RETURNED FLAG IN DRIVE FLAG
  216. ; RETURN DRIVE CODE OF CURRENT DRIVE IN A
  217. retdrv  MOV     A,B        ; LEAVE THE DRIVE CODE IN A 
  218.         RET                ; 
  219. retend  MVI     A,0H       ; LEAVE NO MORE DRIVES CODE IN A
  220.         RET
  221.  
  222. ; exit          
  223. exit    RET
  224.  
  225. ; FILEPEC BUFFER
  226. fspec   DB      '   :        .   ',cr,lf,'$'
  227. ;
  228. ; 'WHERE' VERSION NUMBER
  229. where   DB      'V1.2$'
  230. ;
  231. ; SCB PARAMETER BLOCK
  232. scbpb
  233. scboff  DB      ' '        ; OFFSET BYTE, SET TO START OF DRIVE PATH - 1
  234. scbcod  DB      ' '        ; GET/SET CODE
  235. scbval  DW      '  '       ; BYTE OR WORD VALUE FOR SET OPERATIONS
  236. ;
  237. ; DRIVE FLAG
  238. drvflg  DB      ' '        ; HIGH NYBBLE = 0H, DEFAULT NOT SEARCHED
  239.                            ;             = fH, SEARCHED
  240.                            ; LOW NYBBLE = DEFAULT DRIVE DRIVE CODE
  241. ;
  242. ; SCB OFFSET FOR CURRENT DRIVE IN DRIVE PATH
  243. drvoff  DB      ' '     
  244.  
  245.         END
  246.