;[BEGIN] ; ; ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename] [/S] ; ; ; Defines section ;---------------------------------------------------------------------[] DEFINE DEBUG 0 DEFINE EMULATOR 0 DEFINE EXE_HEADER 1 DEFINE App_EXE_Version 1 ; define NEED_LOADER 1 ; define NeedSafePort_Y 0 ;---------------------------------------------------------------------[] ; ; ; Included LUA section ;---------------------------------------------------------------------[] ; includelua ;---------------------------------------------------------------------[] ; ; ; Included constants section ;---------------------------------------------------------------------[] ; include 'Shared_Includes/constants/sp2000.inc' include 'Shared_Includes/constants/BIOS_equ.inc' include 'Shared_Includes/constants/dss_equ.inc' ; include 'Shared_Includes/constants/standart_colors.inc' ; include 'Shared_Includes/constants/ATA.inc' ;---------------------------------------------------------------------[] ; ; ; Included macroses section ;---------------------------------------------------------------------[] ; include 'Shared_Includes/macroses/macros.z80' ; include 'Shared_Includes/macroses/accelerator.z80' ;---------------------------------------------------------------------[] ; ; ; Standart EQU section ;---------------------------------------------------------------------[] org_addr: EQU #8000+CLP_Buffer code_addr: EQU START stack_point: EQU #BFFE stack_buffer: EQU 64 program_start: EQU START Loader_length: EQU 0 ;---------------------------------------------------------------------[] ; STRUCT Variables .STOPMODE: BYTE #00 .RESMASK: BYTE #00 .SETMASK: BYTE #00 .MODIFY: BYTE #00 .FSTRUCT: BLOCK 33,0 .FILENAME: BLOCK 223,0 .BUFFER: BLOCK 33,0 .FILE_PRM: BLOCK 223,0 ;CUR_DIRECTORY EQU FILE_PRM+256 ENDS ; ; Code start section ;[]-------------------------------------------------------------------[] IF EXE_HEADER INCLUDE 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr ELSE ORG org_addr-CLP_Buffer ENDIF IF DEBUG OUTPUT "Build/Debug.bin" ENDIF ; ;---------------------------------------------------------------------[] ; RST DSS ;EXIT EQU #41 PUTCHAR: EQU #5B PCHARS: EQU #5C ;SYSTEM ATTRIBUTES READONLY_ATR: EQU %0000'0001 HIDDEN_ATR: EQU %0000'0010 SYSTEM_ATR: EQU %0000'0100 ARCHIVE_ATR: EQU %0010'0000 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,(VARS.STOPMODE) OR A JR NZ,QUIT LD A,(VARS.MODIFY) BIT 7,A JR NZ,NAME_OK SET 7,A LD (VARS.MODIFY),A LD HL,ANYNAME LD DE,VARS.FILE_PRM LD BC,ANYNAME.Size LDIR NAME_OK: LD HL,VARS.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,VARS.FILE_PRM LD DE,VARS.FSTRUCT LD BC,Dss.F_First.DOSname ;FIND FIRST ATTR: LD A,#27 ;%00100111 RST ToDSS CALL C,DOSERROR JR C,ENDOFDIR LOOP_ATTR: CALL CHANGE_ATTRIB LD DE,VARS.FSTRUCT LD C,Dss.F_Next RST ToDSS JR NC,LOOP_ATTR ENDOFDIR: CALL CRLF LD B,0 QUIT: LD C,Dss.Exit RST ToDSS RET INITDATA: LD HL,VARS LD DE,VARS+1 LD (HL),0 LD BC,Variables-1 LDIR RET CHANGE_ATTRIB: LD A,(VARS.MODIFY) OR A RET Z CP #80 JR Z,SHOW_ATTRIBS LD A,(VARS.RESMASK) CPL LD C,A LD A,(VARS.SETMASK) LD B,A PUSH BC LD HL,VARS.FILENAME LD BC,Dss.Attrib.Get RST ToDSS CALL C,DOSERROR POP BC RET C AND C OR B LD HL,VARS.FILENAME LD BC,Dss.Attrib.Set RST ToDSS CALL C,DOSERROR RET SHOW_ATTRIBS: LD HL,VARS.FILENAME LD BC,Dss.Attrib.Get RST ToDSS 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,Dss.PutChar RST ToDSS POP BC DJNZ ATTR_LP LD A,9 LD C,Dss.PutChar RST ToDSS LD HL,VARS.FILENAME LD C,Dss.PChars RST ToDSS JP CRLF ;RET ATTR_STR: DB " A SHR" PRINT_USAGE: LD A,USAGE_MSG CALL MESSAGE LD A,1 LD (VARS.STOPMODE),A POP HL RET GET_KEY: LD DE,VARS.BUFFER LD C,Dss.GSwitch RST ToDSS EX AF,AF' LD A,(VARS.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,VARS.BUFFER LD DE,VARS.FILE_PRM LD C,Dss.GSwitch RST ToDSS POP HL POP AF EX AF,AF' LD A,(VARS.MODIFY) OR 80h LD (VARS.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,(VARS.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 (VARS.STOPMODE),A POP HL RET RESATR: LD B,0 JR RES_SET_ATR SETATR: LD B,1 RES_SET_ATR: PUSH HL LD DE,(VARS.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,(VARS.RESMASK) OR C LD (VARS.RESMASK),A LD A,(VARS.MODIFY) OR #01 LD (VARS.MODIFY),A POP HL JP GKLOOP SET_MET: LD C,A LD A,(VARS.SETMASK) OR C LD (VARS.SETMASK),A LD A,(VARS.MODIFY) OR #02 LD (VARS.MODIFY),A POP HL JP GKLOOP CR: EQU 13 LF: EQU 10 CRLF: LD HL,.crlf LD C,Dss.PChars RST ToDSS RET ; .crlf: DZ "\r\n" DOSERROR: LD E,A LD D,0 CALL FMESAGE CALL PRINTZ CALL CRLF CALL CRLF SCF RET MESSAGE: LD E,A LD D,0 CALL MESAGE JR PRINTZ ;RET MESAGE: INC DE LD HL,MSG0 LD BC,MSG0.Size LCPIR2: XOR A CPIR RET PO RET NZ DEC DE LD A,D OR E JR NZ,LCPIR2 RET FMESAGE: INC DE LD HL,ERR0 LD BC,ERR0.Size LCPIR: XOR A CPIR RET PO RET NZ DEC DE LD A,D OR E JR NZ,LCPIR RET PRINTZ: ;LD A,(HL) ;INC HL ;OR A ;RET Z LD C,Dss.PChars RST ToDSS ;JR PRINTZ RET MSG0: DB #00 DZ "ATTRIB\r\n\r\n" DB " Usage: ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename]\r\n\r\n" DB " Displays or changes file attributes.\r\n" DB "This command displays, sets, or removes the Read-Only, Archive, System, and\r\n" DB "Hidden attributes assigned to files or directories.\r\n\r\n" DB "Parameter\r\n\r\n" DB "[drive:][path]filename\r\n" DB " Specifies the location and name of the file(s) you want to process.\r\n\r\n" DB "Switches\r\n\r\n" DB "+R Sets the Read-Only file attribute.\r\n" DB "-R Clears the Read-Only file attribute.\r\n" DB "+A Sets the Archive file attribute.\r\n" DB "-A Clears the Archive file attribute.\r\n" DB "+S Sets the file as a System file.\r\n" DB "-S Clears the System file attribute.\r\n" DB "+H Sets the file as a Hidden file.\r\n" DZ "-H Clears the Hidden file attribute.\r\n" DB 0 .Size EQU $-MSG0 ERR0: DB #00 DZ "Unknown error" DZ "Invalid function" DZ "Invalid drive letter" DZ "File not found" DZ "Path not found" DZ "Invalid handle" DZ "Extended error 6" DZ "File exist" DZ "File read only" DZ "Root overflow" DZ "No free space" DZ "Directory not empty" DZ "Can't delete current directory" DZ "Invalid media" DZ "Unknown operation" DZ "Directory exist" DZ "Invalid filename" DZ "Invalid EXE-file" DZ "Not supported EXE-file" DZ "Access denied" DZ "Not ready" DZ "Seek error" DZ "Sector not found" DZ "CRC error" DZ "Write protect" DZ "Read error" DZ "Write error" DZ "Drive failure" DZ "Extended error 28" DZ "Extended error 29" DZ "No free memory" DZ "Invalid memory block" DZ "Extended error 32" DZ "Extended error 33" DZ "Extended error 34" DZ "35" DZ "36" DZ "37" DZ "38" DZ "39" DZ "40" DZ "41" DZ "42" DZ "43" DZ "44" DZ "45" DZ "46" DZ "47" DZ "48" DZ "49" DZ "50" .Size EQU $-ERR0 ; PRINT MODULE DUMP: LD B,2 DUMPLP1: PUSH BC PUSH HL CALL CRLF POP HL CALL PHEXSTR POP BC DJNZ DUMPLP1 JP CRLF ;RET PHEX: LD E,A RRCA RRCA RRCA RRCA AND #0F ADD A,'0' CP '9'+1 JR C,PHEX2 ADD A,7 PHEX2: LD C,Dss.PutChar RST ToDSS ; LD A,E AND #0F ADD A,'0' CP '9'+1 JR C,PHEX3 ADD A,7 PHEX3: LD C,Dss.PutChar RST ToDSS RET PHEXSTR: LD B,#10 PHS1: PUSH BC LD A,(HL) CALL PHEX LD A,' ' LD C,Dss.PutChar RST ToDSS ; POP BC INC HL DJNZ PHS1 RET ; .DATA ANYNAME: DB "*.*",0 .Size: EQU $-ANYNAME ; .Clear zone VARS: Variables = $