489 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			489 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | ||
| ; LAST UPDATE: 13.07.2025 savelij
 | ||
| 
 | ||
| 		include macros.a80
 | ||
| 		include bios_sp.a80
 | ||
| 		include dss_sp.a80
 | ||
| 		include errors_sp.a80
 | ||
| 		include fat_dir_sp.a80
 | ||
| 		include macros_sp.a80
 | ||
| 		include vers.a80
 | ||
| 
 | ||
| ;[BEGIN]
 | ||
| ;
 | ||
| ; CDX.EXE [command] [-switches] [directory]
 | ||
| ;
 | ||
| ;commands:
 | ||
| ;	OPEN
 | ||
| ;	EJECT
 | ||
| ;	CLOSE
 | ||
| ;	COPY
 | ||
| ;	LIST
 | ||
| ;	DUMP
 | ||
| ;	COMMAND
 | ||
| ;	SEND
 | ||
| ; -h,?	Help page
 | ||
| 	
 | ||
| 	HDR_EXE 0x8100,1,0,START,START,0xBFFF,0
 | ||
| 
 | ||
| START:		PUSH	IX
 | ||
| 		XOR	A
 | ||
| ;		LD	HL,BUF1
 | ||
| ;		LD	(HL),A
 | ||
| ;		LD	DE,BUF1+1
 | ||
| ;		LD	BC,BUFFERS_END-1
 | ||
| ;		LDIR
 | ||
| 		LD	HL,'\\'
 | ||
| 		LD	(DIRSPEC),HL
 | ||
| 		LD	HL,BUF1
 | ||
| 		LD	B,BUFERS_NUMBER
 | ||
| .initBuffersLoop:
 | ||
| 		LD	(HL),A
 | ||
| 		INC	H
 | ||
| 		DJNZ	.initBuffersLoop
 | ||
| 		LD	A,MSG0.MSG_HELLO
 | ||
| 		CALL	MESSAGE
 | ||
| 		CALL	INIT
 | ||
| 		JR	NC,.next
 | ||
| 		LD	HL,PRM1
 | ||
| 		LD	(HL),0
 | ||
| 		LD	A,MSG0.MSG_NO_CDROM
 | ||
| 		CALL	MESSAGE
 | ||
| 		LD	A,1
 | ||
| 		LD	(STOPMODE),A
 | ||
| .next:		
 | ||
| 	SPDSS DSSF.VERSION
 | ||
| 		EX	DE,HL
 | ||
| 		AND	A
 | ||
| 		LD	DE,0x0146	;1.70
 | ||
| 		SBC	HL,DE		;CHECK DSS VERSION
 | ||
| 		POP	HL
 | ||
| 		JP	C,OLD_DSS
 | ||
| 		LD	IX,BUF_PTRS
 | ||
| 		CALL	EX_COMMAND_LINE
 | ||
| 		CALL	MALLOC
 | ||
| 		JR	C,QUIT
 | ||
| ;		CALL	FIND_CDROM
 | ||
| 		LD	A,(STOPMODE)
 | ||
| 		OR	A
 | ||
| 		CALL	Z,COMMAND
 | ||
| ;		CALL	MDEALLOC
 | ||
| QUIT:		CALL	CRLF
 | ||
| 		CALL	RESTORE_STATE
 | ||
| .loop:
 | ||
| 	SPDSS DSSF.EXIT,0
 | ||
| 		JP	.loop
 | ||
| 
 | ||
| OLD_DSS:	LD	A,MSG0.MSG_OLD_DSS
 | ||
| 		CALL	MESSAGE
 | ||
| 		JR	QUIT
 | ||
| 
 | ||
| RESTORE_STATE:	LD	B,1
 | ||
| .set_par:	EQU $-1
 | ||
| 		LD	A,(CDDRIVE)
 | ||
| 	SPBIOS BIOSF.DRV_SET_PAR
 | ||
| 		RET
 | ||
| 
 | ||
| ;HNDMEM	DB	0xFF
 | ||
| 
 | ||
| MALLOC:
 | ||
| 	SPDSS DSSF.GETMEM,2
 | ||
| 		JR	NC,.cont
 | ||
| 		LD	A,MSG0.MSG_MEMERROR
 | ||
| 		CALL	MESSAGE
 | ||
| 		SCF
 | ||
| 		RET
 | ||
| 
 | ||
| .cont:		PUSH	AF
 | ||
| 	SPDSS DSSF.SETWIN3,1
 | ||
| 		LD	HL,BANKTBL
 | ||
| 		POP	AF
 | ||
| 	SPBIOS BIOSF.GETMEMBLKPAGES
 | ||
| 		RET
 | ||
| 
 | ||
| ; MDEALLOC
 | ||
| ; 	LD	A,(HNDMEM)
 | ||
| ; 	LD	C,Dss.FreeMem
 | ||
| ; 	JP	ToDSS
 | ||
| 
 | ||
| ; FIND_CDROM
 | ||
| ; 	LD	IX,DEV_CFG
 | ||
| ; 	LD	C,BIOS.DRV_LIST
 | ||
| ; 	RST	ToBIOS
 | ||
| ; 	LD	A,(IX+3)	;CDROM
 | ||
| ; 	OR	A
 | ||
| ; 	JR	Z,W_O_CD
 | ||
| ; 	LD	A,(CDDRIVE)
 | ||
| ; 	INC	A
 | ||
| ; 	RET	NZ
 | ||
| ; 	LD	A,SLAVE		;DEFAULT
 | ||
| ; 	LD	(CDDRIVE),A
 | ||
| ; 	RET
 | ||
| ; W_O_CD	LD	A,MSG_NO_CDROM
 | ||
| ; 	CALL	MESSAGE
 | ||
| ; 	LD	A,1
 | ||
| ; 	LD	(STOPMODE),A
 | ||
| ; 	SCF
 | ||
| ; 	RET
 | ||
| 
 | ||
| ;BUF_PRINT
 | ||
| ;	LD	HL,BUF_PTRS
 | ||
| ;BUF_PL	LD	E,(HL)
 | ||
| ;	INC	HL
 | ||
| ;	LD	D,(HL)
 | ||
| ;	INC	HL
 | ||
| ;	LD	A,D
 | ||
| ;	OR	E
 | ||
| ;	RET	Z
 | ||
| ;	PUSH	HL
 | ||
| ;	EX	DE,HL
 | ||
| ;	LD	C,Dss.PCHARS
 | ||
| ;	RST	ToDSS
 | ||
| ;	CALL	CRLF
 | ||
| ;	POP	HL
 | ||
| ;	JR	BUF_PL
 | ||
| 
 | ||
| ;OPEN_FILE
 | ||
| ;	LD	HL,FILENAME
 | ||
| ;	XOR	A
 | ||
| ;	LD	C,Dss.OPEN
 | ||
| ;	RST	ToDSS
 | ||
| ;	LD	(FILEHND),A
 | ||
| ;	RET	NC
 | ||
| ;	LD	HL,FILENAME
 | ||
| ;	CALL	PUTVAR
 | ||
| ;	LD	A,MSG_CANT_OPEN
 | ||
| ;	CALL	MESSAGE
 | ||
| ;	SCF
 | ||
| ;	RET
 | ||
| 
 | ||
| ;CLOSE_FILE
 | ||
| ;	LD	A,(FILEHND)
 | ||
| ;	LD	C,Dss.CLOSE
 | ||
| ;	RST	ToDSS
 | ||
| ;	RET
 | ||
| 
 | ||
| INIT:		XOR	A
 | ||
| 		LD	(STOPMODE),A
 | ||
| 		DEC	A
 | ||
| 		LD	(CDDRIVE),A
 | ||
| 		LD B,0xC0 - 1
 | ||
| .loop:		INC	B
 | ||
| 		LD	A,B
 | ||
| 		CP	0xC4
 | ||
| 		SCF
 | ||
| 		RET	Z
 | ||
| 		PUSH	BC
 | ||
| 	SPBIOS BIOSF.DRV_DETECT
 | ||
| 		POP	BC
 | ||
| 		JR	NC,.found
 | ||
| 		CP	ERR_DRV.ATAPI_MediumError
 | ||
| 		JR	Z,.media_changed
 | ||
| 		CP	ERR_DRV.ATAPI_UnitAttention
 | ||
| 		JR	NZ,.loop
 | ||
| .media_changed:	PUSH	BC
 | ||
| 		LD	A,B
 | ||
| 		CALL	SAVE_MEDIA_CHANGED
 | ||
| 		POP	BC
 | ||
| .found:		LD	A,B
 | ||
| 		LD	(CDDRIVE),A
 | ||
| 		RET
 | ||
| 
 | ||
| SAVE_MEDIA_CHANGED:
 | ||
| 	SPBIOS BIOSF.DRV_GET_PAR
 | ||
| 		OR	%00000010
 | ||
| 		LD	B,A
 | ||
| 		LD	A,(RESTORE_STATE.set_par)
 | ||
| 		OR	B
 | ||
| 		LD	(RESTORE_STATE.set_par),A
 | ||
| 		RET
 | ||
| 
 | ||
| STOPMODE	DB	0x00
 | ||
| 
 | ||
| CMD_PARSE_ASM.Start:
 | ||
| 		include cmdparse.a80
 | ||
| CMD_PARSE_ASM.End	EQU	$
 | ||
| COMMAND_ASM.Start
 | ||
| 		include command.a80
 | ||
| COMMAND_ASM.End		EQU	$
 | ||
| CD_DOS_ASM.Start:
 | ||
| 		include cd_dos.a80
 | ||
| CD_DOS_ASM.End		EQU	$
 | ||
| 
 | ||
| CRLF:		PUSH	HL
 | ||
| 		LD	HL,MSG0.crlf
 | ||
| 	SPDSS DSSF.PCHARS
 | ||
| 		POP	HL
 | ||
| 		RET
 | ||
| 
 | ||
| ERROR:		;CP	MAX_DSS_ERR
 | ||
| 		LD	E,A
 | ||
| 		LD	D,0
 | ||
| 		;JR	C,.ERR_MSG
 | ||
| 		;LD	E,D
 | ||
| 		;JP	.ERR_MSG
 | ||
| 
 | ||
| .ERR_MSG:	PUSH	DE
 | ||
| 		LD	HL,ERRCDX
 | ||
| 		CALL	PRINTZ
 | ||
| 		POP	DE
 | ||
| 		CALL	FMESAGE
 | ||
| 		CALL	PRINTZ
 | ||
| 		CALL	CRLF
 | ||
| 		JP	CRLF
 | ||
| 
 | ||
| FMESAGE:	LD	A,E
 | ||
| 		LD	HL,SYS_ERRORS		; <20><><EFBFBD>ᨢ <20><>ப
 | ||
| 		LD	BC,SYS_ERRORS.Size	; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
 | ||
| 		RLA
 | ||
| 		jr	nc,.set_de		
 | ||
| 		ld	hl,DRV_ERRORS		; <20><><EFBFBD>ᨢ <20><>ப
 | ||
| 		ld	bc,DRV_ERRORS.Size	; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
 | ||
| .set_de:	SRL	A
 | ||
| 		LD	E,A
 | ||
| 		INC	DE
 | ||
| LCPIR:		XOR	A
 | ||
| 		CPIR
 | ||
| 		RET	PO
 | ||
| 		RET	NZ
 | ||
| 		XOR	A
 | ||
| 		CP	(HL)
 | ||
| 		JR	Z,.no_mess
 | ||
| 		DEC	DE
 | ||
| 		LD	A,D
 | ||
| 		OR	E
 | ||
| 		JP	NZ,LCPIR
 | ||
| 		RET
 | ||
| .no_mess:	INC	HL
 | ||
| 		RET
 | ||
| 
 | ||
| 	IF 0;/*
 | ||
| LCPIR:		xor	a
 | ||
| 		cpir
 | ||
| 		ret	po
 | ||
| 		ret	nz
 | ||
| 		;R11
 | ||
| 		 XOR	A
 | ||
| 		 CP	(HL)
 | ||
| 		 JR	Z,.no_mess
 | ||
| 		;
 | ||
| 		dec	de
 | ||
| 		ld	a,d
 | ||
| 		or	e
 | ||
| 		jr	nz,LCPIR
 | ||
| 		ret
 | ||
| .no_mess:	INC	HL
 | ||
| 		RET
 | ||
| 
 | ||
| print_err_message:
 | ||
| 		ld	hl,SYS_ERRORS		; <20><><EFBFBD>ᨢ <20><>ப
 | ||
| 		ld	bc,SYS_ERRORS.Size	; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
 | ||
| 		;cp	%1000'0000
 | ||
| 		RLA
 | ||
| 		jr	nc,.set_de
 | ||
| 		;
 | ||
| 		;and	%0111'1111
 | ||
| 		ld	hl,DRV_ERRORS		; <20><><EFBFBD>ᨢ <20><>ப
 | ||
| 		ld	bc,DRV_ERRORS.Size	; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
 | ||
| 		;
 | ||
| .set_de:	SRL	A
 | ||
| 		ld	e,a
 | ||
| 		ld	d,0
 | ||
| 		inc	de
 | ||
| 		call	LCPIR			; <20><><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD>
 | ||
| 		call	PRINTZ			; <20><>ଠ<EFBFBD>. <20>뢮<EFBFBD> <20><>ப<EFBFBD>
 | ||
| 		jp	newline
 | ||
| 	ENDIF;*/
 | ||
| 
 | ||
| ERRCDX		DB	"CDX: ",0
 | ||
| 
 | ||
| 		include dss_errors.a80
 | ||
| 
 | ||
| ;FIND_MESSAGE	LD	E,A
 | ||
| ;		LD	D,0
 | ||
| ;		CALL	MESAGE
 | ||
| ;		RET
 | ||
| 
 | ||
| MESSAGE		LD	E,A
 | ||
| 		LD	D,0
 | ||
| 		CALL	MESAGE
 | ||
| 		JP	PRINTZ
 | ||
| 
 | ||
| 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
 | ||
| 
 | ||
| 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
 | ||
| 	SPDSS DSSF.PCHARS
 | ||
| 		POP	HL
 | ||
| 		JR	PRINTZ
 | ||
| 
 | ||
| PRINTZ2
 | ||
| 	SPDSS DSSF.PUTCHAR
 | ||
| 		JP	PRINTZ
 | ||
| 
 | ||
| PRINT_
 | ||
| 	SPBIOS BIOSF.LP_PRINT_SYM,1
 | ||
| 		RET
 | ||
| 
 | ||
| PUTVAR		LD	DE,PRM1
 | ||
| PUTPRM		LD	BC,15
 | ||
| PUTPRMA		LD	A,(HL)
 | ||
| 		LDI
 | ||
| 		RET	PO
 | ||
| 		OR	A
 | ||
| 		JR	NZ,PUTPRMA
 | ||
| 		RET
 | ||
| 
 | ||
| CDDRIVE		DB	0xFF
 | ||
| 
 | ||
| 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	0
 | ||
|  _INIT_VAR
 | ||
|  _SETVAR .MSG_HELLO
 | ||
| 		DB	"CDROM eXtension utility v\{VERS}, build \{BUILDDATE} (c) Sprinter Team\r\n"
 | ||
| 		DZ	"Type CDX.EXE -? for help.\r\n"
 | ||
|  _SETVAR .MSG_TRAY_OPEN
 | ||
| 		DZ	"Opening tray..."
 | ||
|  _SETVAR .MSG_TRAY_CLOSE
 | ||
| 		DZ	"Closing tray..."
 | ||
| 		;        01234567890123456789012345678901234567890123456789012345678901234567890123456789
 | ||
|  _SETVAR .MSG_USAGE
 | ||
| 		DB "  Usage: CDX.EXE [-switches] [command] [param1] [param2]\r\n\r\n"
 | ||
| 		DB "Commands:\r\n"
 | ||
| 		DB " CDX OPEN                            - Open tray\r\n"
 | ||
| 		DB " CDX CLOSE                           - Close tray\r\n"
 | ||
| 		DB " CDX LIST [\\cd_path\\][pattern]       - Show CDROM filelist\r\n"
 | ||
| 		DB " CDX COPY \\source d:\\destination\\    - Copy file(s) from CDROM to another disk\r\n"
 | ||
| 		DB " CDX DUMP sector [offset]            - Show sector dump from CDROM\r\n"
 | ||
| 		DB " CDX SEND hexline [\".\" separator]    - Send ATAPI command\r\n"
 | ||
| 		DB " example:\r\n"
 | ||
| 		DB " CDX SEND 4B.000000.0000000000000000.00000000\r\n"
 | ||
| 		DB "\r\n"
 | ||
| 		DB " CDX READTOC                         - Read TOC Audio-CD\r\n"
 | ||
| 		DB " CDX CLOSETOC                        - Close tray and read TOC Audio-CD\r\n"
 | ||
| 		DB "Switches:\r\n"
 | ||
| 		DB " -1    CDROM installed as Primary IDE Master device\r\n"
 | ||
| 		DB " -2    CDROM installed as Primary IDE Slave device\r\n"
 | ||
| 		DB " -3    CDROM installed as Secondary IDE Master device\r\n"
 | ||
| 		DB " -4    CDROM installed as Secondary IDE Slave device\r\n"
 | ||
| 		DZ " -h,?	Help page\r\n"
 | ||
|  _SETVAR .MSG_UNK_DEVICE_NUMBER
 | ||
| 		DZ	"  Error: Unknown device number %1\r\n"
 | ||
|  _SETVAR .MSG_UNK_COMMAND
 | ||
| 		DZ	"  Error: Unknown command: %1\r\n"
 | ||
|  _SETVAR .MSG_DONE
 | ||
| 		DZ	"Done!\r\n"
 | ||
|  _SETVAR .MSG_NO_CDROM
 | ||
| 		DZ	"  Error: Can't find CDROM device %1\r\n"
 | ||
|  _SETVAR .MSG_IO_ERROR
 | ||
| 		DZ	"  Error: I/O Error\r\n"
 | ||
|  _SETVAR .MSG_OLD_DSS
 | ||
| 		DZ	"  Error: Need DSS version 1.70 or higher\r\n"
 | ||
|  _SETVAR .MSG_COPYFILE
 | ||
| 		DZ	"Copying "
 | ||
|  _SETVAR .MSG_DIRHEAD
 | ||
| 		DZ	"Directory of CDROM:"
 | ||
|  _SETVAR .MSG_DIRENTRY
 | ||
| ;		 FILENAME EXT SIZE DATE	TIME
 | ||
| 		DZ	"%1 %2  %3  %4  %5\r\n"
 | ||
|  _SETVAR .MSG_MEMERROR
 | ||
| 		DZ	"  Error: Memory allocation error\r\n"
 | ||
|  _SETVAR .MSG_COPYTO
 | ||
| 		DZ	" to "
 | ||
|  _SETVAR .MSG_CD_READ_ERR
 | ||
| 		DZ	"  Error: Reading failure\r\n"
 | ||
|  _SETVAR .MSG_F_WRITE_ERR
 | ||
| 		DZ	"  Error: Writing failure\r\n"
 | ||
|  _SETVAR .MSG_FAILURE
 | ||
| 		DZ	"Failure!\r\n"
 | ||
|  _SETVAR .MSG_ERR_DEST
 | ||
| 		DZ	"  Error: Can't open destination file\r\n"
 | ||
|  _SETVAR .MSG_COPYABORTED
 | ||
| 		DZ	"Copying aborted\r\n"
 | ||
|  _SETVAR .MSG_ERR_PACKET
 | ||
| 		DZ "Error: packet size incorrect\r\n"
 | ||
|  _SETVAR .MSG_SEND_ATAPI
 | ||
| 		DZ "Send ATAPI packet..."
 | ||
|  _SETVAR .MSG_READTOC
 | ||
| 		DZ "Read audio CD-ROM TOC..."
 | ||
|  _SETVAR .MSG_RESULT_READTOC
 | ||
| 		DB "RESULT: 0x00\r\n"
 | ||
| .MRR1		EQU $-4
 | ||
| 		DZ "Found in TOC: 0x00\r\n"
 | ||
| .MRR2		EQU $-5
 | ||
|  _SETVAR .MSG_CLOSETRAY_READTOC
 | ||
| 		DZ "Close tray and read TOC Audio-CD..."
 | ||
| 
 | ||
| .crlf:		DZ	"\r\n"
 | ||
| 
 | ||
| 		DB	0
 | ||
| MSG1
 | ||
| 
 | ||
| BUF_PTRS	DW	BUF1,BUF2,BUF3,BUF4,0
 | ||
| 
 | ||
| APCMD_BUF	DB 12 DUP 0
 | ||
| 
 | ||
| ;-------------------------------//BUFFERS\\-------------------------------;
 | ||
| FF_STRUCT:	DB	"12345678"
 | ||
| 		DB	"123"
 | ||
| 		DB	0x00
 | ||
| 		DW	0,0,0,0
 | ||
| CDFPOSH		DW	0	;CLUSTER HIGH
 | ||
| CDFTIME		DW	0	;TIME
 | ||
| CDFDATE		DW	0	;DATE
 | ||
| CDFPOSL		DW	0	;CLUSTER
 | ||
| CDFSIZE		DW	0,0	;SIZE
 | ||
| CDFATTR		DB	0x00	;ATTR
 | ||
| CDFNAME		DB	"12345678123",0
 | ||
| 
 | ||
| BUFFERS_START	EQU $
 | ||
| 
 | ||
|  INIT_VAR FF_STRUCT+256
 | ||
|  SETVAR DIRSPEC,	256
 | ||
|  SETVAR BUF1,		256
 | ||
|  SETVAR BUF2,		256
 | ||
|  SETVAR BUF3,		256
 | ||
|  SETVAR BUF4,		256
 | ||
|  SETVAR ARGCBUF,	256
 | ||
|  SETVAR DUMPBUF,	256
 | ||
| 
 | ||
| BUFFERS_END	EQU DUMPBUF+2048-BUFFERS_START
 | ||
| BUFERS_NUMBER	EQU 6
 | ||
| ;DEV_CFG:
 | 
