;[BEGIN] ; ; ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename] [/S] ; ORG #8100-512 INCLUDE "dos_equ.asm" DB "EXE" ;EXE ID DB #00 ;EXE VERSION DW #0200 ;CODE OFFSET LOW DW #0000 ;CODE OFFSET HIGH DW #0000 ;END-BEG ;PRIMARY LOADER DW #0000 ; DW #0000 ;RESERVED DW #0000 ; DW #8100 ;LOAD ADDRESS DW #8100 ;START ADDRESS DW #BFFF ;STACK ADDRESS DS 490 ;SYSTEM ATTRIBUTES READONLY_ATR EQU %00000001 HIDDEN_ATR EQU %00000010 SYSTEM_ATR EQU %00000100 ARCHIVE_ATR EQU %00100000 USAGE_MSG EQU 1 ERRATR_MSG EQU 2 ERRKEY_MSG EQU 3 START PUSH IX CALL INITDATA POP HL INC HL CALL GET_KEY LD B,1 LD A,(STOPMODE) OR A JR NZ,QUIT LD A,(MODIFY) BIT 7,A JR NZ,NAME_OK SET 7,A LD (MODIFY),A LD HL,ANYNAME LD DE,FILE_PRM LD BC,EANYNAME-ANYNAME LDIR NAME_OK LD HL,FILE_PRM CHEKNM LD A,(HL) INC HL CP "*" JR Z,CHEKEN CP "?" JR Z,CHEKEN OR A JR NZ,CHEKNM LD A,#37 LD (ATTR+1),A CHEKEN LD HL,FILE_PRM LD DE,FSTRUCT LD BC,#0119 ;FIND FIRST ATTR LD A,#27 ;%00100111 RST #10 CALL C,DOSERROR JR C,ENDOFDIR LOOP_ATTR CALL CHANGE_ATTRIB LD DE,FSTRUCT LD C,#1A RST #10 JR NC,LOOP_ATTR ENDOFDIR CALL CRLF LD B,0 QUIT LD C,EXIT RST #10 RET INITDATA XOR A LD (RESMASK),A LD (SETMASK),A LD (MODIFY),A LD (STOPMODE),A RET CHANGE_ATTRIB LD A,(MODIFY) OR A RET Z CP #80 JR Z,SHOW_ATTRIBS LD A,(RESMASK) CPL LD C,A LD A,(SETMASK) LD B,A PUSH BC LD HL,FILENAME LD BC,#0016 RST #10 CALL C,DOSERROR POP BC RET C AND C OR B LD HL,FILENAME LD BC,#0116 RST #10 CALL C,DOSERROR RET SHOW_ATTRIBS LD HL,FILENAME LD BC,#0016 RST #10 CALL C,DOSERROR RET C PRINT_ATTR_STR LD C,A LD B,8 LD HL,ATTR_STR ATTR_LP RL C LD A,(HL) INC HL JR C,PSGN_OK LD A," " PSGN_OK PUSH BC LD C,PUTCHAR RST #10 POP BC DJNZ ATTR_LP LD A,9 LD C,PUTCHAR RST #10 LD HL,FILENAME LD C,PCHARS RST #10 CALL CRLF RET ATTR_STR DB " A SHR" PRINT_USAGE LD A,USAGE_MSG CALL MESSAGE LD A,1 LD (STOPMODE),A POP HL RET GET_KEY LD DE,BUFFER LD C,#43 ;GSWITCH RST #10 EX AF,AF' LD A,(BUFFER) OR A RET Z CP "+" JR Z,SETATR CP "-" JR Z,RESATR CP "/" JR Z,SWITCH_KEY ;IT PARAMETER IS FILENAME EX AF,AF' PUSH AF PUSH HL LD HL,BUFFER LD DE,FILE_PRM LD C,#43 RST #10 POP HL POP AF EX AF,AF' LD A,(MODIFY) OR 80h LD (MODIFY),A ; GKLOOP EX AF,AF' JR NC,GET_KEY XOR A DEC A ;A=FF, ZF=0 (NO FILENAME) RET SWITCH_KEY PUSH HL LD DE,(BUFFER+1) AND A LD HL,"?" SBC HL,DE JR Z,PRINT_USAGE RES 5,E AND A LD HL,"H" SBC HL,DE JR Z,PRINT_USAGE ;UNKNOWN KEY LD A,ERRKEY_MSG CALL MESSAGE LD A,1 LD (STOPMODE),A POP HL RET RESATR LD B,0 JR RES_SET_ATR SETATR LD B,1 RES_SET_ATR PUSH HL LD DE,(BUFFER+1) AND A LD HL,"?" SBC HL,DE JR Z,PRINT_USAGE RES 5,E ;UPPER "a..z" TO "A..Z" AND A LD HL,"H" LD A,HIDDEN_ATR SBC HL,DE JR Z,ADD_IT AND A LD HL,"S" LD A,SYSTEM_ATR SBC HL,DE JR Z,ADD_IT AND A LD HL,"A" LD A,ARCHIVE_ATR SBC HL,DE JR Z,ADD_IT AND A LD HL,"R" LD A,READONLY_ATR SBC HL,DE JR Z,ADD_IT ;UNKNOWN ATTRIB LD A,ERRATR_MSG CALL MESSAGE POP HL RET ADD_IT INC B DJNZ SET_MET LD C,A LD A,(RESMASK) OR C LD (RESMASK),A LD A,(MODIFY) OR #01 LD (MODIFY),A POP HL JP GKLOOP SET_MET LD C,A LD A,(SETMASK) OR C LD (SETMASK),A LD A,(MODIFY) OR #02 LD (MODIFY),A POP HL JP GKLOOP CR EQU 13 LF EQU 10 CRLF LD A,#0D LD C,PUTCHAR RST #10 LD A,#0A LD C,PUTCHAR RST #10 RET DOSERROR LD E,A LD D,0 JP ERR_MSG ERR_MSG CALL FMESAGE CALL PRINTZ CALL CRLF CALL CRLF SCF RET MESSAGE LD E,A LD D,0 CALL MESAGE CALL PRINTZ RET MESAGE INC DE LD HL,MSG0 LD BC,MSG1-MSG0 LCPIR2 XOR A CPIR RET PO RET NZ DEC DE LD A,D OR E JP NZ,LCPIR2 RET FMESAGE INC DE LD HL,ERR0 LD BC,ERR1-ERR0 LCPIR XOR A CPIR RET PO RET NZ DEC DE LD A,D OR E JP NZ,LCPIR RET PUTVAR LD DE,PRM1 PUTPRM LD BC,15 PUTPRMA LD A,(HL) LDI RET PO OR A JR NZ,PUTPRMA RET PRINTZ LD A,(HL) INC HL OR A RET Z CP "%" JR NZ,PRINTZ2 LD A,(HL) INC HL SUB "1" PUSH HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD BC,PRM1 ADD HL,BC LD C,PCHARS RST #10 POP HL JR PRINTZ PRINTZ2 LD C,PUTCHAR RST #10 JP PRINTZ PRINT_ LD C,PUTCHAR RST #10 RET UPPER CP "a" RET C CP "{" RET NC SUB #20 RET PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 MSG0 DB #00 DB "ATTRIB",CR,LF,CR,LF,0 DB " Usage: ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename]",CR,LF,CR,LF DB " Displays or changes file attributes.",CR,LF DB "This command displays, sets, or removes the Read-Only, Archive, System, and",CR,LF DB "Hidden attributes assigned to files or directories.",CR,LF,CR,LF DB "Parameter",CR,LF,CR,LF DB "[drive:][path]filename",CR,LF DB " Specifies the location and name of the file(s) you want to process.",CR,LF,CR,LF DB "Switches",CR,LF,CR,LF DB "+R Sets the Read-Only file attribute.",CR,LF DB "-R Clears the Read-Only file attribute.",CR,LF DB "+A Sets the Archive file attribute.",CR,LF DB "-A Clears the Archive file attribute.",CR,LF DB "+S Sets the file as a System file.",CR,LF DB "-S Clears the System file attribute.",CR,LF DB "+H Sets the file as a Hidden file.",CR,LF DB "-H Clears the Hidden file attribute.",CR,LF DB 0 DB 0 MSG1 ERR0 DB #00 DB "Unknown error",0 DB "Invalid function",0 DB "Invalid drive letter",0 DB "File not found",0 DB "Path not found",0 DB "Invalid handle",0 DB "Extended error 6",0 DB "File exist",0 DB "File read only",0 DB "Root overflow",0 DB "No free space",0 DB "Directory not empty",0 DB "Can't delete current directory",0 DB "Invalid media",0 DB "Unknown operation",0 DB "Directory exist",0 DB "Invalid filename",0 DB "Invalid EXE-file",0 DB "Not supported EXE-file",0 DB "Access denied",0 DB "Not ready",0 DB "Seek error",0 DB "Sector not found",0 DB "CRC error",0 DB "Write protect",0 DB "Read error",0 DB "Write error",0 DB "Drive failure",0 DB "Extended error 28",0 DB "Extended error 29",0 DB "No free memory",0 DB "Invalid memory block",0 DB "Extended error 32",0 DB "Extended error 33",0 DB "Extended error 34",0 DB "35",0 DB "36",0 DB "37",0 DB "38",0 DB "39",0 DB "40",0 DB "41",0 DB "42",0 DB "43",0 DB "44",0 DB "45",0 DB "46",0 DB "47",0 DB "48",0 DB "49",0 DB "50" DB 0 ERR1 ; PRINT MODULE DUMP LD B,2 DUMPLP1 PUSH BC PUSH HL CALL CRLF POP HL CALL PHEXSTR POP BC DJNZ DUMPLP1 CALL CRLF RET PHEX LD E,A RRCA RRCA RRCA RRCA AND #0F ADD A,#30 CP #3A JR C,PHEX2 ADD A,7 PHEX2 CALL PRINT_ LD A,E AND #0F ADD A,#30 CP #3A JR C,PHEX3 ADD A,7 PHEX3 CALL PRINT_ RET PHEXSTR LD B,#10 PHS1 PUSH BC LD A,(HL) CALL PHEX LD A,#20 CALL PRINT_ POP BC INC HL DJNZ PHS1 RET ; .DATA STOPMODE DB #00 RESMASK DB #00 SETMASK DB #00 MODIFY DB #00 ANYNAME DB "*.*",0 EANYNAME FSTRUCT DS 256 FILENAME EQU FSTRUCT+33 BUFFER DS 256 FILE_PRM EQU FILENAME+256 CUR_DIRECTORY EQU FILE_PRM+256