Updated for CLP

This commit is contained in:
Tolik Trek 2026-05-16 23:46:06 +10:00
parent 24dcb0042d
commit dd6dd7bf0c
2 changed files with 494 additions and 485 deletions

@ -1 +1 @@
Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca
Subproject commit d2ba40c4620459681fdc5eb8d4cadcb50eb79aa8

View File

@ -2,52 +2,122 @@
;
; 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
;
; 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 %00000001
HIDDEN_ATR EQU %00000010
SYSTEM_ATR EQU %00000100
ARCHIVE_ATR EQU %00100000
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
USAGE_MSG: EQU 1
ERRATR_MSG: EQU 2
ERRKEY_MSG: EQU 3
START PUSH IX
START: PUSH IX
CALL INITDATA
POP HL
INC HL
CALL GET_KEY
LD B,1
LD A,(STOPMODE)
LD A,(VARS.STOPMODE)
OR A
JR NZ,QUIT
LD A,(MODIFY)
LD A,(VARS.MODIFY)
BIT 7,A
JR NZ,NAME_OK
SET 7,A
LD (MODIFY),A
LD (VARS.MODIFY),A
LD HL,ANYNAME
LD DE,FILE_PRM
LD BC,EANYNAME-ANYNAME
LD DE,VARS.FILE_PRM
LD BC,ANYNAME.Size
LDIR
NAME_OK
LD HL,FILE_PRM
CHEKNM
NAME_OK:
LD HL,VARS.FILE_PRM
CHEKNM:
LD A,(HL)
INC HL
CP "*"
@ -60,108 +130,107 @@ 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
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
LOOP_ATTR:
CALL CHANGE_ATTRIB
LD DE,FSTRUCT
LD C,#1A
RST #10
LD DE,VARS.FSTRUCT
LD C,Dss.F_Next
RST ToDSS
JR NC,LOOP_ATTR
ENDOFDIR
ENDOFDIR:
CALL CRLF
LD B,0
QUIT LD C,EXIT
RST #10
QUIT: LD C,Dss.Exit
RST ToDSS
RET
INITDATA
XOR A
LD (RESMASK),A
LD (SETMASK),A
LD (MODIFY),A
LD (STOPMODE),A
INITDATA:
LD HL,VARS
LD DE,VARS+1
LD (HL),0
LD BC,Variables-1
LDIR
RET
CHANGE_ATTRIB
LD A,(MODIFY)
CHANGE_ATTRIB:
LD A,(VARS.MODIFY)
OR A
RET Z
CP #80
JR Z,SHOW_ATTRIBS
LD A,(RESMASK)
LD A,(VARS.RESMASK)
CPL
LD C,A
LD A,(SETMASK)
LD A,(VARS.SETMASK)
LD B,A
PUSH BC
LD HL,FILENAME
LD BC,#0016
RST #10
LD HL,VARS.FILENAME
LD BC,Dss.Attrib.Get
RST ToDSS
CALL C,DOSERROR
POP BC
RET C
AND C
OR B
LD HL,FILENAME
LD BC,#0116
RST #10
LD HL,VARS.FILENAME
LD BC,Dss.Attrib.Set
RST ToDSS
CALL C,DOSERROR
RET
SHOW_ATTRIBS
LD HL,FILENAME
LD BC,#0016
RST #10
SHOW_ATTRIBS:
LD HL,VARS.FILENAME
LD BC,Dss.Attrib.Get
RST ToDSS
CALL C,DOSERROR
RET C
PRINT_ATTR_STR
PRINT_ATTR_STR:
LD C,A
LD B,8
LD HL,ATTR_STR
ATTR_LP RL C
ATTR_LP: RL C
LD A,(HL)
INC HL
JR C,PSGN_OK
LD A," "
PSGN_OK PUSH BC
LD C,PUTCHAR
RST #10
PSGN_OK: PUSH BC
LD C,Dss.PutChar
RST ToDSS
POP BC
DJNZ ATTR_LP
LD A,9
LD C,PUTCHAR
RST #10
LD HL,FILENAME
LD C,PCHARS
RST #10
CALL CRLF
RET
LD C,Dss.PutChar
RST ToDSS
LD HL,VARS.FILENAME
LD C,Dss.PChars
RST ToDSS
JP CRLF
;RET
ATTR_STR
ATTR_STR:
DB " A SHR"
PRINT_USAGE
PRINT_USAGE:
LD A,USAGE_MSG
CALL MESSAGE
LD A,1
LD (STOPMODE),A
LD (VARS.STOPMODE),A
POP HL
RET
GET_KEY
LD DE,BUFFER
LD C,#43 ;GSWITCH
RST #10
GET_KEY:
LD DE,VARS.BUFFER
LD C,Dss.GSwitch
RST ToDSS
EX AF,AF'
LD A,(BUFFER)
LD A,(VARS.BUFFER)
OR A
RET Z
CP "+"
@ -174,26 +243,26 @@ GET_KEY
EX AF,AF'
PUSH AF
PUSH HL
LD HL,BUFFER
LD DE,FILE_PRM
LD C,#43
RST #10
LD HL,VARS.BUFFER
LD DE,VARS.FILE_PRM
LD C,Dss.GSwitch
RST ToDSS
POP HL
POP AF
EX AF,AF'
LD A,(MODIFY)
LD A,(VARS.MODIFY)
OR 80h
LD (MODIFY),A
LD (VARS.MODIFY),A
;
GKLOOP EX AF,AF'
GKLOOP: EX AF,AF'
JR NC,GET_KEY
XOR A
DEC A ;A=FF, ZF=0 (NO FILENAME)
RET
SWITCH_KEY
SWITCH_KEY:
PUSH HL
LD DE,(BUFFER+1)
LD DE,(VARS.BUFFER+1)
AND A
LD HL,"?"
SBC HL,DE
@ -207,18 +276,18 @@ SWITCH_KEY
LD A,ERRKEY_MSG
CALL MESSAGE
LD A,1
LD (STOPMODE),A
LD (VARS.STOPMODE),A
POP HL
RET
RESATR
RESATR:
LD B,0
JR RES_SET_ATR
SETATR
SETATR:
LD B,1
RES_SET_ATR
RES_SET_ATR:
PUSH HL
LD DE,(BUFFER+1)
LD DE,(VARS.BUFFER+1)
AND A
LD HL,"?"
SBC HL,DE
@ -250,277 +319,217 @@ RES_SET_ATR
POP HL
RET
ADD_IT
ADD_IT:
INC B
DJNZ SET_MET
LD C,A
LD A,(RESMASK)
LD A,(VARS.RESMASK)
OR C
LD (RESMASK),A
LD A,(MODIFY)
LD (VARS.RESMASK),A
LD A,(VARS.MODIFY)
OR #01
LD (MODIFY),A
LD (VARS.MODIFY),A
POP HL
JP GKLOOP
SET_MET
LD C,A
LD A,(SETMASK)
SET_MET: LD C,A
LD A,(VARS.SETMASK)
OR C
LD (SETMASK),A
LD A,(MODIFY)
LD (VARS.SETMASK),A
LD A,(VARS.MODIFY)
OR #02
LD (MODIFY),A
LD (VARS.MODIFY),A
POP HL
JP GKLOOP
CR EQU 13
LF EQU 10
CR: EQU 13
LF: EQU 10
CRLF LD A,#0D
LD C,PUTCHAR
RST #10
LD A,#0A
LD C,PUTCHAR
RST #10
CRLF: LD HL,.crlf
LD C,Dss.PChars
RST ToDSS
RET
;
.crlf: DZ "\r\n"
DOSERROR
LD E,A
DOSERROR: LD E,A
LD D,0
JP ERR_MSG
ERR_MSG CALL FMESAGE
CALL FMESAGE
CALL PRINTZ
CALL CRLF
CALL CRLF
SCF
RET
MESSAGE LD E,A
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
;RET
PRINT_ LD C,PUTCHAR
RST #10
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
UPPER CP "a"
RET C
CP "{"
RET NC
SUB #20
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
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
PRINTZ: ;LD A,(HL)
;INC HL
;OR A
;RET Z
LD C,Dss.PChars
RST ToDSS
;JR PRINTZ
RET
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"
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
ERR1
.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
DUMP: LD B,2
DUMPLP1: PUSH BC
PUSH HL
CALL CRLF
POP HL
CALL PHEXSTR
POP BC
DJNZ DUMPLP1
CALL CRLF
RET
JP CRLF
;RET
PHEX LD E,A
PHEX: LD E,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CP #3A
ADD A,'0'
CP '9'+1
JR C,PHEX2
ADD A,7
PHEX2 CALL PRINT_
PHEX2: LD C,Dss.PutChar
RST ToDSS
;
LD A,E
AND #0F
ADD A,#30
CP #3A
ADD A,'0'
CP '9'+1
JR C,PHEX3
ADD A,7
PHEX3 CALL PRINT_
PHEX3: LD C,Dss.PutChar
RST ToDSS
RET
PHEXSTR LD B,#10
PHS1 PUSH BC
PHEXSTR: LD B,#10
PHS1: PUSH BC
LD A,(HL)
CALL PHEX
LD A,#20
CALL PRINT_
LD A,' '
LD C,Dss.PutChar
RST ToDSS
;
POP BC
INC HL
DJNZ PHS1
RET
; .DATA
STOPMODE
DB #00
RESMASK DB #00
SETMASK DB #00
MODIFY DB #00
ANYNAME: DB "*.*",0
.Size: EQU $-ANYNAME
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
; .Clear zone
VARS: Variables = $