;THIS IS A REWRITE OF BDPATCH.ASM TO ELIMINATE SOME ;SERIOUS DRAWBACKS. THESE ARE: ;IF YOU TYPED ERA *.* YOU WOULD ERASE ALL PUBLIC FILES AND ;ALL PUBLIC FILES THAT ARE NOT SYSTEM FILES WOULD BE SHOWN ;EACH TIME YOU TYPED DIR OR IN WORDSTAR. EVEN AFTER YOU ;ERASED A FILE DIR WOULD STILL FIND IT AS A PUBLIC FILE. ;THIS PROGRAM CONTAINS A PATCH FOR CP/M 2.2 THAT ADDS ;A NEW FILE ATTRIBUTE: THE PUBLIC ATTRIBUTE. ;WHEN A FILE'S PUBLIC ATTRIBUTE IS SET, IT IS AVAILABLE ;TO ALL USERS. THE PUBLIC ATTRIBUTE IS F1' (THE HIGH BIT ;OF THE FIRST CHARACTER OF THE FILENAME). ;I DON'T KNOW WHO WROTE THE ORIGINAL VERSION BUT I ADDED ;SOME ADDITIONAL CODE AND NOW THIS WORKS CORRECTLY. I AM ;AFRAID IT IS LONGER THAN THE ORIGINAL PATCH AND YOU WILL ;HAVE TO PUT SOME OF THIS ELSEWHERE. IF ANYONE CAN MAKE ;THIS CODE SMALLER, PLEASE DO SO. THIS WILL ALSO LET YOU SEE ;THE PUBLIC FILES IF YOU ARE ON THE CORRECT USER. A.S.A. MSIZE EQU 63 ;PUT YOUR CP/M SIZE IN K-BYTES BIAS EQU (MSIZE - 20) * 1024 HI$MEMORY EQU 0F662H ;WHEREVER YOU WANT THE REST OF CODE ;Z80 MACROS @GENDD MACRO ?DD IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;RANGE ERROR ON JUMP RELATIVE ELSE DB ?DD ENDIF ENDM JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM JRZ MACRO ?N ;;JUMP RELATIVE ON ZERO DB 28H @GENDD ?N-$-1 ENDM JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM DJNZ MACRO ?N ;;DECREMENT B, JMP NZ DB 10H @GENDD ?N-$-1 ENDM ;BDOS ENTRY POINTS FIND EQU 432DH + BIAS NXTDIR EQU 4205H + BIAS CHKLST EQU 41F5H + BIAS EXITFF EQU 4394H + BIAS FCBPTR EQU 49D9H + BIAS CKNDIR EQU 417FH + BIAS DIRADD EQU 415EH + BIAS CMPCNT EQU 49D8H + BIAS CMPEXT EQU 4307H + BIAS DIRNUM EQU 49EAH + BIAS RESULT EQU 3F45H + BIAS FNDFLG EQU 49D4H + BIAS ORG FIND FIND: LXI H,0FFFFH ;SET UP CONTROL SHLD SER$EXIT+1 MVI C,0 CALL NXTDIR ;SET UP NEXT DIR ENTRY CALL CHKLST ;SET Z IF READ PAST END OF DIR JRZ EXITFF ;RET NOT FOUND IF SO LHLD FCBPTR XCHG LDAX D CPI 0E5H ;LOOKING FOR FREE DIR SLOT? JRZ FIND1 PUSH D ;QUIT IF PASSED ALL ACTIVE CALL CKNDIR ;CALL IF NOT LOOKING FOR FREE SLOT POP D FIND1: CALL DIRADD ;GET ADDR OF NEXT ENTRY LDA CMPCNT ;NR. OF FCB BYTES TO COMPARE INR A MOV C,A MVI B,-1 ;C IS COUNT, B IS INDEX FIND2: DCR C ;ALL MATCHED? JZ FIND5 ;JMP IF SO INR B ;BUMP INDEX JRNZ FIND2A ;JMP IF NOT CHECKING USER BYTE ;FIRST SEE IF FREE DIRECTORY SPACE LDAX D ; CPI 0E5H ;LOOKING FOR FREE DIR SLOT? JRZ FIND2A ;SKIP PUBLIC CHECK IF SO ;SEE IF WE ARE ON THE SAME USER AREA SO WE CAN SEE ;PUBLIC FILES IF WE ARE ON THAT USER AREA SUB M ;CHECKS USER AREA WE ARE ON JZ FIND4 ;IF SO WE HAVE A MATCH ;NEXT SEE IF THIS IS A DELETED FILE ELSE THESE WILL ;SHOW UP AGAIN IF DIR IS TYPED MOV A,M RAL ;SET CY FLAG IF E5 JRC FIND2A ;SKIP PUBLIC CHECK ;SEE IF WE ARE LOOKING AT A PUBLIC FILE INX H ;->F1 BYTE MOV A,M DCX H RAL ;SET CY FLAG ON PUBLIC ATTRIBUTE JRNC FIND2A ;IF NOT CORRECT USER OR PUBLIC CHECK ;NEXT FILE ;NOW TELL WE HAVE FOUND A PUBLIC FILE XRA A STA PUB$FLAG JMP FIND4 ;WE ARE HERE IF WE HAVE A CORRECT USER OR IF PUBLIC FILE FIND2A: ;NEXT CHECK IF ANY WILD CARDS USED IN FILE LDAX D CPI '?' ;? MATCHES ANYTHING JRNZ FIND2B ;NO WILD CARDS SEARCH ON ;FOUND A WILD CARD TELL ABOUT IT XRA A STA WILD$FLAG JMP FIND4 ;WE ARE HERE ONLY IF NOT FINDING ANY WILD CARDS FIND2B: MOV A,B CPI 13 ;WE ON S1 BYTE? JZ FIND4 ;S1 BYTE ALWAYS MATCHES CPI 12 ;EXTENT BYTE? LDAX D ;GET BYTE AGAIN JMP FIND$HI ;THIS MUST BE PUT IN SOMEWHERE OTHER THAN IN BDOS BECAUSE THE ;WHOLE ROUTINE IS LONGER THAN AVAILABLE SPACE. I PUT THIS IN MY ;BIOS FOR NOW ORG HI$MEMORY FIND$HI: JZ FIND3 ;JMP IF ON EXTENT BYTE SUB M ;COMPARE ANI 7FH ;MASK OUT ATTRIB BIT JNZ FIND ;MISMATCH, TRY NEXT DIR ENTRY JMP FIND4 ;IF MATCHED FIND3: PUSH B MOV C,M CALL CMPEXT ;COMPARE EXTENT BYTES POP B JNZ FIND ;JMP IF MISMATCH FIND4: INX D ;BUMP TO NEXT BYTES INX H JMP FIND2 ;WE ARRIVE HERE ONLY ON MATCHED BYTES FIND5: WILD$FLAG EQU $+1 PUB$FLAG EQU $+2 SER$EXIT: LXI H,0000H ;THIS GETS PATCHED IF WE HAVE EITHER A PUBLIC ;FILE OR A WILD CARD IS USED MOV A,H ORA L JZ FIND ;WE CAN NOT ALLOW SEARCHING FOR ANY PUBLIC ;FILES IF WE USE WILD CARDS LDA DIRNUM ;MATCHED, FIX UP RESULT ANI 3 STA RESULT LXI H,FNDFLG MOV A,M RAL RNC XRA A MOV M,A RET END