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] ; ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename] [/S]
; ;
ORG #8100-512 ;
INCLUDE "dos_equ.asm" ; Defines section
DB "EXE" ;EXE ID ;---------------------------------------------------------------------[]
DB #00 ;EXE VERSION DEFINE DEBUG 0
DW #0200 ;CODE OFFSET LOW DEFINE EMULATOR 0
DW #0000 ;CODE OFFSET HIGH DEFINE EXE_HEADER 1
DW #0000 ;END-BEG ;PRIMARY LOADER DEFINE App_EXE_Version 1
DW #0000 ; ; define NEED_LOADER 1
DW #0000 ;RESERVED ; define NeedSafePort_Y 0
DW #0000 ; ;---------------------------------------------------------------------[]
DW #8100 ;LOAD ADDRESS ;
DW #8100 ;START ADDRESS
DW #BFFF ;STACK ADDRESS
DS 490 ;
; 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 ;SYSTEM ATTRIBUTES
READONLY_ATR EQU %00000001 READONLY_ATR: EQU %0000'0001
HIDDEN_ATR EQU %00000010 HIDDEN_ATR: EQU %0000'0010
SYSTEM_ATR EQU %00000100 SYSTEM_ATR: EQU %0000'0100
ARCHIVE_ATR EQU %00100000 ARCHIVE_ATR: EQU %0010'0000
USAGE_MSG EQU 1 USAGE_MSG: EQU 1
ERRATR_MSG EQU 2 ERRATR_MSG: EQU 2
ERRKEY_MSG EQU 3 ERRKEY_MSG: EQU 3
START PUSH IX START: PUSH IX
CALL INITDATA CALL INITDATA
POP HL POP HL
INC HL INC HL
CALL GET_KEY CALL GET_KEY
LD B,1 LD B,1
LD A,(STOPMODE) LD A,(VARS.STOPMODE)
OR A OR A
JR NZ,QUIT JR NZ,QUIT
LD A,(MODIFY) LD A,(VARS.MODIFY)
BIT 7,A BIT 7,A
JR NZ,NAME_OK JR NZ,NAME_OK
SET 7,A SET 7,A
LD (MODIFY),A LD (VARS.MODIFY),A
LD HL,ANYNAME LD HL,ANYNAME
LD DE,FILE_PRM LD DE,VARS.FILE_PRM
LD BC,EANYNAME-ANYNAME LD BC,ANYNAME.Size
LDIR LDIR
NAME_OK NAME_OK:
LD HL,FILE_PRM LD HL,VARS.FILE_PRM
CHEKNM CHEKNM:
LD A,(HL) LD A,(HL)
INC HL INC HL
CP "*" CP "*"
@ -60,108 +130,107 @@ CHEKNM
LD A,#37 LD A,#37
LD (ATTR+1),A LD (ATTR+1),A
CHEKEN CHEKEN:
LD HL,FILE_PRM LD HL,VARS.FILE_PRM
LD DE,FSTRUCT LD DE,VARS.FSTRUCT
LD BC,#0119 ;FIND FIRST LD BC,Dss.F_First.DOSname ;FIND FIRST
ATTR LD A,#27 ;%00100111 ATTR: LD A,#27 ;%00100111
RST #10 RST ToDSS
CALL C,DOSERROR CALL C,DOSERROR
JR C,ENDOFDIR JR C,ENDOFDIR
LOOP_ATTR LOOP_ATTR:
CALL CHANGE_ATTRIB CALL CHANGE_ATTRIB
LD DE,FSTRUCT LD DE,VARS.FSTRUCT
LD C,#1A LD C,Dss.F_Next
RST #10 RST ToDSS
JR NC,LOOP_ATTR JR NC,LOOP_ATTR
ENDOFDIR ENDOFDIR:
CALL CRLF CALL CRLF
LD B,0 LD B,0
QUIT LD C,EXIT QUIT: LD C,Dss.Exit
RST #10 RST ToDSS
RET RET
INITDATA INITDATA:
XOR A LD HL,VARS
LD (RESMASK),A LD DE,VARS+1
LD (SETMASK),A LD (HL),0
LD (MODIFY),A LD BC,Variables-1
LD (STOPMODE),A LDIR
RET RET
CHANGE_ATTRIB CHANGE_ATTRIB:
LD A,(MODIFY) LD A,(VARS.MODIFY)
OR A OR A
RET Z RET Z
CP #80 CP #80
JR Z,SHOW_ATTRIBS JR Z,SHOW_ATTRIBS
LD A,(RESMASK) LD A,(VARS.RESMASK)
CPL CPL
LD C,A LD C,A
LD A,(SETMASK) LD A,(VARS.SETMASK)
LD B,A LD B,A
PUSH BC PUSH BC
LD HL,FILENAME LD HL,VARS.FILENAME
LD BC,#0016 LD BC,Dss.Attrib.Get
RST #10 RST ToDSS
CALL C,DOSERROR CALL C,DOSERROR
POP BC POP BC
RET C RET C
AND C AND C
OR B OR B
LD HL,FILENAME LD HL,VARS.FILENAME
LD BC,#0116 LD BC,Dss.Attrib.Set
RST #10 RST ToDSS
CALL C,DOSERROR CALL C,DOSERROR
RET RET
SHOW_ATTRIBS SHOW_ATTRIBS:
LD HL,FILENAME LD HL,VARS.FILENAME
LD BC,#0016 LD BC,Dss.Attrib.Get
RST #10 RST ToDSS
CALL C,DOSERROR CALL C,DOSERROR
RET C RET C
PRINT_ATTR_STR PRINT_ATTR_STR:
LD C,A LD C,A
LD B,8 LD B,8
LD HL,ATTR_STR LD HL,ATTR_STR
ATTR_LP RL C ATTR_LP: RL C
LD A,(HL) LD A,(HL)
INC HL INC HL
JR C,PSGN_OK JR C,PSGN_OK
LD A," " LD A," "
PSGN_OK PUSH BC PSGN_OK: PUSH BC
LD C,PUTCHAR LD C,Dss.PutChar
RST #10 RST ToDSS
POP BC POP BC
DJNZ ATTR_LP DJNZ ATTR_LP
LD A,9 LD A,9
LD C,PUTCHAR LD C,Dss.PutChar
RST #10 RST ToDSS
LD HL,FILENAME LD HL,VARS.FILENAME
LD C,PCHARS LD C,Dss.PChars
RST #10 RST ToDSS
CALL CRLF JP CRLF
RET ;RET
ATTR_STR ATTR_STR:
DB " A SHR" DB " A SHR"
PRINT_USAGE PRINT_USAGE:
LD A,USAGE_MSG LD A,USAGE_MSG
CALL MESSAGE CALL MESSAGE
LD A,1 LD A,1
LD (STOPMODE),A LD (VARS.STOPMODE),A
POP HL POP HL
RET RET
GET_KEY GET_KEY:
LD DE,BUFFER LD DE,VARS.BUFFER
LD C,#43 ;GSWITCH LD C,Dss.GSwitch
RST #10 RST ToDSS
EX AF,AF' EX AF,AF'
LD A,(BUFFER) LD A,(VARS.BUFFER)
OR A OR A
RET Z RET Z
CP "+" CP "+"
@ -174,26 +243,26 @@ GET_KEY
EX AF,AF' EX AF,AF'
PUSH AF PUSH AF
PUSH HL PUSH HL
LD HL,BUFFER LD HL,VARS.BUFFER
LD DE,FILE_PRM LD DE,VARS.FILE_PRM
LD C,#43 LD C,Dss.GSwitch
RST #10 RST ToDSS
POP HL POP HL
POP AF POP AF
EX AF,AF' EX AF,AF'
LD A,(MODIFY) LD A,(VARS.MODIFY)
OR 80h OR 80h
LD (MODIFY),A LD (VARS.MODIFY),A
; ;
GKLOOP EX AF,AF' GKLOOP: EX AF,AF'
JR NC,GET_KEY JR NC,GET_KEY
XOR A XOR A
DEC A ;A=FF, ZF=0 (NO FILENAME) DEC A ;A=FF, ZF=0 (NO FILENAME)
RET RET
SWITCH_KEY SWITCH_KEY:
PUSH HL PUSH HL
LD DE,(BUFFER+1) LD DE,(VARS.BUFFER+1)
AND A AND A
LD HL,"?" LD HL,"?"
SBC HL,DE SBC HL,DE
@ -207,18 +276,18 @@ SWITCH_KEY
LD A,ERRKEY_MSG LD A,ERRKEY_MSG
CALL MESSAGE CALL MESSAGE
LD A,1 LD A,1
LD (STOPMODE),A LD (VARS.STOPMODE),A
POP HL POP HL
RET RET
RESATR RESATR:
LD B,0 LD B,0
JR RES_SET_ATR JR RES_SET_ATR
SETATR SETATR:
LD B,1 LD B,1
RES_SET_ATR RES_SET_ATR:
PUSH HL PUSH HL
LD DE,(BUFFER+1) LD DE,(VARS.BUFFER+1)
AND A AND A
LD HL,"?" LD HL,"?"
SBC HL,DE SBC HL,DE
@ -250,277 +319,217 @@ RES_SET_ATR
POP HL POP HL
RET RET
ADD_IT ADD_IT:
INC B INC B
DJNZ SET_MET DJNZ SET_MET
LD C,A LD C,A
LD A,(RESMASK) LD A,(VARS.RESMASK)
OR C OR C
LD (RESMASK),A LD (VARS.RESMASK),A
LD A,(MODIFY) LD A,(VARS.MODIFY)
OR #01 OR #01
LD (MODIFY),A LD (VARS.MODIFY),A
POP HL POP HL
JP GKLOOP JP GKLOOP
SET_MET SET_MET: LD C,A
LD C,A LD A,(VARS.SETMASK)
LD A,(SETMASK)
OR C OR C
LD (SETMASK),A LD (VARS.SETMASK),A
LD A,(MODIFY) LD A,(VARS.MODIFY)
OR #02 OR #02
LD (MODIFY),A LD (VARS.MODIFY),A
POP HL POP HL
JP GKLOOP JP GKLOOP
CR EQU 13 CR: EQU 13
LF EQU 10 LF: EQU 10
CRLF LD A,#0D CRLF: LD HL,.crlf
LD C,PUTCHAR LD C,Dss.PChars
RST #10 RST ToDSS
LD A,#0A
LD C,PUTCHAR
RST #10
RET RET
;
.crlf: DZ "\r\n"
DOSERROR DOSERROR: LD E,A
LD E,A
LD D,0 LD D,0
JP ERR_MSG CALL FMESAGE
ERR_MSG CALL FMESAGE
CALL PRINTZ CALL PRINTZ
CALL CRLF CALL CRLF
CALL CRLF CALL CRLF
SCF SCF
RET RET
MESSAGE LD E,A MESSAGE: LD E,A
LD D,0 LD D,0
CALL MESAGE 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 JR PRINTZ
PRINTZ2 LD C,PUTCHAR ;RET
RST #10
JP PRINTZ
PRINT_ LD C,PUTCHAR MESAGE: INC DE
RST #10 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 RET
UPPER CP "a" FMESAGE: INC DE
RET C LD HL,ERR0
CP "{" LD BC,ERR0.Size
RET NC LCPIR: XOR A
SUB #20 CPIR
RET PO
RET NZ
DEC DE
LD A,D
OR E
JR NZ,LCPIR
RET 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 PRINTZ: ;LD A,(HL)
DB "ATTRIB",CR,LF,CR,LF,0 ;INC HL
DB " Usage: ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename]",CR,LF,CR,LF ;OR A
DB " Displays or changes file attributes.",CR,LF ;RET Z
DB "This command displays, sets, or removes the Read-Only, Archive, System, and",CR,LF LD C,Dss.PChars
DB "Hidden attributes assigned to files or directories.",CR,LF,CR,LF RST ToDSS
DB "Parameter",CR,LF,CR,LF ;JR PRINTZ
DB "[drive:][path]filename",CR,LF RET
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 MSG0: DB #00
DB "Unknown error",0 DZ "ATTRIB\r\n\r\n"
DB "Invalid function",0 DB " Usage: ATTRIB.EXE [+R|-R] [+A|-A] [+S|-S] [+H|-H][[drive:][path]filename]\r\n\r\n"
DB "Invalid drive letter",0 DB " Displays or changes file attributes.\r\n"
DB "File not found",0 DB "This command displays, sets, or removes the Read-Only, Archive, System, and\r\n"
DB "Path not found",0 DB "Hidden attributes assigned to files or directories.\r\n\r\n"
DB "Invalid handle",0 DB "Parameter\r\n\r\n"
DB "Extended error 6",0 DB "[drive:][path]filename\r\n"
DB "File exist",0 DB " Specifies the location and name of the file(s) you want to process.\r\n\r\n"
DB "File read only",0 DB "Switches\r\n\r\n"
DB "Root overflow",0 DB "+R Sets the Read-Only file attribute.\r\n"
DB "No free space",0 DB "-R Clears the Read-Only file attribute.\r\n"
DB "Directory not empty",0 DB "+A Sets the Archive file attribute.\r\n"
DB "Can't delete current directory",0 DB "-A Clears the Archive file attribute.\r\n"
DB "Invalid media",0 DB "+S Sets the file as a System file.\r\n"
DB "Unknown operation",0 DB "-S Clears the System file attribute.\r\n"
DB "Directory exist",0 DB "+H Sets the file as a Hidden file.\r\n"
DB "Invalid filename",0 DZ "-H Clears the Hidden file attribute.\r\n"
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 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 ; PRINT MODULE
DUMP LD B,2 DUMP: LD B,2
DUMPLP1 PUSH BC DUMPLP1: PUSH BC
PUSH HL PUSH HL
CALL CRLF CALL CRLF
POP HL POP HL
CALL PHEXSTR CALL PHEXSTR
POP BC POP BC
DJNZ DUMPLP1 DJNZ DUMPLP1
CALL CRLF JP CRLF
RET ;RET
PHEX LD E,A PHEX: LD E,A
RRCA RRCA
RRCA RRCA
RRCA RRCA
RRCA RRCA
AND #0F AND #0F
ADD A,#30 ADD A,'0'
CP #3A CP '9'+1
JR C,PHEX2 JR C,PHEX2
ADD A,7 ADD A,7
PHEX2 CALL PRINT_ PHEX2: LD C,Dss.PutChar
RST ToDSS
;
LD A,E LD A,E
AND #0F AND #0F
ADD A,#30 ADD A,'0'
CP #3A CP '9'+1
JR C,PHEX3 JR C,PHEX3
ADD A,7 ADD A,7
PHEX3 CALL PRINT_ PHEX3: LD C,Dss.PutChar
RST ToDSS
RET RET
PHEXSTR LD B,#10 PHEXSTR: LD B,#10
PHS1 PUSH BC PHS1: PUSH BC
LD A,(HL) LD A,(HL)
CALL PHEX CALL PHEX
LD A,#20 LD A,' '
CALL PRINT_ LD C,Dss.PutChar
RST ToDSS
;
POP BC POP BC
INC HL INC HL
DJNZ PHS1 DJNZ PHS1
RET RET
; .DATA ; .DATA
STOPMODE ANYNAME: DB "*.*",0
DB #00 .Size: EQU $-ANYNAME
RESMASK DB #00
SETMASK DB #00
MODIFY DB #00
ANYNAME DB "*.*",0 ; .Clear zone
EANYNAME VARS: Variables = $
FSTRUCT DS 256
FILENAME EQU FSTRUCT+33
BUFFER DS 256
FILE_PRM EQU FILENAME+256
CUR_DIRECTORY EQU FILE_PRM+256