Attrib/attrib.asm
Anatoliy Belyanskiy 24dcb0042d initial commite
2023-11-09 00:22:08 +10:00

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