mirror of
https://github.com/Tolik-Trek/Attrib.git
synced 2026-06-15 17:31:39 +03:00
527 lines
8.0 KiB
NASM
527 lines
8.0 KiB
NASM
;[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
|