mirror of
https://github.com/Tolik-Trek/Attrib.git
synced 2026-06-15 17:31:39 +03:00
536 lines
9.2 KiB
NASM
536 lines
9.2 KiB
NASM
;[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 <Shared_Includes/LUA/Functions.LUA>
|
|
;---------------------------------------------------------------------[]
|
|
;
|
|
|
|
|
|
|
|
;
|
|
; 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 = $
|