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 / CPM / BDOS / BDPATCH2.AQM / BDPATCH2.ASM
Assembly Source File  |  2000-06-30  |  5KB  |  211 lines

  1.  ;THIS IS A REWRITE OF BDPATCH.ASM TO ELIMINATE SOME
  2.  ;SERIOUS DRAWBACKS. THESE ARE:
  3.  
  4.  ;IF YOU TYPED ERA *.* YOU WOULD ERASE ALL PUBLIC FILES AND
  5.  ;ALL PUBLIC FILES THAT ARE NOT SYSTEM FILES WOULD BE SHOWN
  6.  ;EACH TIME YOU TYPED DIR OR IN WORDSTAR. EVEN AFTER YOU 
  7.  ;ERASED A FILE DIR WOULD STILL FIND IT AS A PUBLIC FILE.
  8.  
  9.  ;THIS PROGRAM CONTAINS A PATCH FOR CP/M 2.2 THAT ADDS
  10.  ;A NEW FILE ATTRIBUTE: THE PUBLIC ATTRIBUTE.
  11.  ;WHEN A FILE'S PUBLIC ATTRIBUTE IS SET, IT IS AVAILABLE
  12.  ;TO ALL USERS. THE PUBLIC ATTRIBUTE IS F1' (THE HIGH BIT
  13.  ;OF THE FIRST CHARACTER OF THE FILENAME).
  14.  
  15.  ;I DON'T KNOW WHO WROTE THE ORIGINAL VERSION BUT I ADDED
  16.  ;SOME ADDITIONAL CODE AND NOW THIS WORKS CORRECTLY. I AM 
  17.  ;AFRAID IT IS LONGER THAN THE ORIGINAL PATCH AND YOU WILL 
  18.  ;HAVE TO PUT SOME OF THIS ELSEWHERE. IF ANYONE CAN MAKE
  19.  ;THIS CODE SMALLER, PLEASE DO SO. THIS WILL ALSO LET YOU SEE
  20.  ;THE PUBLIC FILES IF YOU ARE ON THE CORRECT USER.   A.S.A.
  21.  
  22.  MSIZE    EQU    63    ;PUT YOUR CP/M SIZE IN K-BYTES
  23.  
  24.  BIAS    EQU    (MSIZE - 20) * 1024
  25.  HI$MEMORY    EQU    0F662H    ;WHEREVER YOU WANT THE REST OF CODE
  26.  
  27.  
  28.  ;Z80 MACROS
  29.  
  30.  @GENDD    MACRO    ?DD
  31.      IF (?DD GT 7FH) AND (?DD LT 0FF80H)
  32.      DB    100H    ;RANGE ERROR ON JUMP RELATIVE
  33.      ELSE
  34.      DB    ?DD
  35.      ENDIF
  36.      ENDM
  37.  JR    MACRO    ?N    ;;JUMP RELATIVE
  38.      DB    18H
  39.      @GENDD    ?N-$-1
  40.      ENDM
  41.  JRC    MACRO    ?N    ;;JUMP RELATIVE ON CARRY
  42.      DB    38H
  43.      @GENDD    ?N-$-1
  44.      ENDM
  45.  JRNC    MACRO    ?N    ;;JUMP RELATIVE ON NO CARRY
  46.      DB    30H
  47.      @GENDD    ?N-$-1
  48.      ENDM
  49.  JRZ    MACRO    ?N    ;;JUMP RELATIVE ON ZERO
  50.      DB    28H
  51.      @GENDD    ?N-$-1
  52.      ENDM
  53.  JRNZ    MACRO    ?N    ;;JUMP RELATIVE ON NO ZERO
  54.      DB    20H
  55.      @GENDD    ?N-$-1
  56.      ENDM
  57.  DJNZ    MACRO    ?N    ;;DECREMENT B, JMP NZ
  58.      DB    10H
  59.      @GENDD    ?N-$-1
  60.      ENDM
  61.  
  62.  ;BDOS ENTRY POINTS
  63.  FIND    EQU    432DH + BIAS
  64.  NXTDIR    EQU    4205H + BIAS
  65.  CHKLST    EQU    41F5H + BIAS
  66.  EXITFF    EQU    4394H + BIAS
  67.  FCBPTR    EQU    49D9H + BIAS
  68.  CKNDIR    EQU    417FH + BIAS
  69.  DIRADD    EQU    415EH + BIAS
  70.  CMPCNT    EQU    49D8H + BIAS
  71.  CMPEXT    EQU    4307H + BIAS
  72.  DIRNUM    EQU    49EAH + BIAS
  73.  RESULT    EQU    3F45H + BIAS
  74.  FNDFLG    EQU    49D4H + BIAS
  75.  
  76.      ORG    FIND  
  77.  
  78.  FIND:
  79.      LXI    H,0FFFFH    ;SET UP CONTROL
  80.      SHLD    SER$EXIT+1    
  81.  
  82.      MVI    C,0
  83.      CALL    NXTDIR    ;SET UP NEXT DIR ENTRY
  84.      CALL    CHKLST    ;SET Z IF READ PAST END OF DIR
  85.      JRZ    EXITFF    ;RET NOT FOUND IF SO
  86.      LHLD    FCBPTR
  87.      XCHG
  88.      LDAX    D
  89.      CPI    0E5H    ;LOOKING FOR FREE DIR SLOT?
  90.      JRZ    FIND1    
  91.      PUSH    D    ;QUIT IF PASSED ALL ACTIVE
  92.      CALL    CKNDIR    ;CALL IF NOT LOOKING FOR FREE SLOT
  93.      POP    D
  94.  
  95.  FIND1:
  96.      CALL    DIRADD    ;GET ADDR OF NEXT ENTRY
  97.      LDA    CMPCNT    ;NR. OF FCB BYTES TO COMPARE
  98.      INR    A
  99.      MOV    C,A
  100.      MVI    B,-1    ;C IS COUNT, B IS INDEX
  101.  
  102.  FIND2:
  103.      DCR    C    ;ALL MATCHED?
  104.      JZ     FIND5    ;JMP IF SO
  105.      INR    B    ;BUMP INDEX
  106.      JRNZ    FIND2A    ;JMP IF NOT CHECKING USER BYTE
  107.  
  108.  ;FIRST SEE IF FREE DIRECTORY SPACE
  109.      LDAX    D    ;
  110.      CPI    0E5H    ;LOOKING FOR FREE DIR SLOT?
  111.      JRZ    FIND2A    ;SKIP PUBLIC CHECK IF SO
  112.  
  113.  
  114.  ;SEE IF WE ARE ON THE SAME USER AREA SO WE CAN SEE 
  115.  ;PUBLIC FILES IF WE ARE ON THAT USER AREA
  116.      SUB    M    ;CHECKS USER AREA WE ARE ON
  117.      JZ     FIND4    ;IF SO WE HAVE A MATCH
  118.  
  119. ;NEXT SEE IF THIS IS A DELETED FILE ELSE THESE WILL   
  120. ;SHOW UP AGAIN IF DIR IS TYPED
  121.     MOV    A,M
  122.     RAL        ;SET CY FLAG IF E5
  123.     JRC    FIND2A    ;SKIP PUBLIC CHECK
  124.  
  125.  ;SEE IF WE ARE LOOKING AT A PUBLIC FILE
  126.      INX    H    ;->F1 BYTE
  127.      MOV    A,M
  128.      DCX    H
  129.      RAL        ;SET CY FLAG ON PUBLIC ATTRIBUTE
  130.      JRNC    FIND2A  ;IF NOT CORRECT USER OR PUBLIC CHECK 
  131.              ;NEXT FILE
  132.  ;NOW TELL WE HAVE FOUND A PUBLIC FILE
  133.      XRA    A
  134.      STA    PUB$FLAG
  135.      JMP     FIND4
  136.  
  137.  ;WE ARE HERE IF WE HAVE A CORRECT USER OR IF PUBLIC FILE
  138.  
  139.  FIND2A:
  140.  ;NEXT CHECK IF ANY WILD CARDS USED IN FILE
  141.      LDAX    D
  142.      CPI    '?'    ;? MATCHES ANYTHING
  143.      JRNZ    FIND2B    ;NO WILD CARDS SEARCH ON
  144.  
  145.  ;FOUND A WILD CARD TELL ABOUT IT
  146.      XRA    A
  147.      STA    WILD$FLAG
  148.      JMP     FIND4
  149.  
  150.  ;WE ARE HERE ONLY IF NOT FINDING ANY WILD CARDS
  151.  FIND2B:
  152.      MOV    A,B
  153.      CPI    13    ;WE ON S1 BYTE?
  154.      JZ     FIND4    ;S1 BYTE ALWAYS MATCHES
  155.      CPI    12    ;EXTENT BYTE?
  156.      LDAX    D    ;GET BYTE AGAIN
  157.      JMP    FIND$HI
  158.  
  159.  
  160.  ;THIS MUST BE PUT IN SOMEWHERE OTHER THAN IN BDOS BECAUSE THE 
  161.  ;WHOLE ROUTINE IS LONGER THAN AVAILABLE SPACE. I PUT THIS IN MY 
  162.  ;BIOS FOR NOW
  163.  
  164.      ORG    HI$MEMORY
  165.  
  166. FIND$HI:
  167.      JZ     FIND3    ;JMP IF ON EXTENT BYTE
  168.      SUB    M    ;COMPARE
  169.      ANI    7FH    ;MASK OUT ATTRIB BIT
  170.      JNZ     FIND    ;MISMATCH, TRY NEXT DIR ENTRY
  171.      JMP    FIND4    ;IF MATCHED
  172.  
  173.  FIND3:
  174.      PUSH    B
  175.      MOV    C,M
  176.      CALL    CMPEXT    ;COMPARE EXTENT BYTES
  177.      POP    B
  178.      JNZ    FIND    ;JMP IF MISMATCH
  179.  FIND4:
  180.      INX    D    ;BUMP TO NEXT BYTES
  181.      INX    H
  182.      JMP    FIND2
  183.  
  184.  ;WE ARRIVE HERE ONLY ON MATCHED BYTES
  185.  
  186.  FIND5:
  187.  
  188.  WILD$FLAG    EQU    $+1
  189.  PUB$FLAG    EQU    $+2
  190.  
  191.  SER$EXIT:
  192.      LXI    H,0000H    ;THIS GETS PATCHED IF WE HAVE EITHER A PUBLIC
  193.              ;FILE OR A WILD CARD IS USED
  194.      MOV    A,H
  195.      ORA    L
  196.      JZ    FIND    ;WE CAN NOT ALLOW SEARCHING FOR ANY PUBLIC
  197.              ;FILES IF WE USE WILD CARDS
  198.      LDA    DIRNUM    ;MATCHED, FIX UP RESULT
  199.      ANI    3
  200.      STA    RESULT
  201.      LXI    H,FNDFLG
  202.      MOV    A,M
  203.      RAL
  204.      RNC
  205.      XRA    A
  206.      MOV    M,A
  207.      RET
  208.  
  209.  
  210.      END
  211.