Attrib/attrib.asm
2026-05-16 23:46:11 +10:00

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 = $