Sys$CSD

Par
Benoît GILON

Ce petit utilitaire permet de connaitre, au niveau du prompt en mode ligne de commande, le nom du système de fichiers courant ainsi que le répertoire courant dans ce système de fichiers.

Il dispose des caractéristiques suivantes:

Utilisation

Le programme Sys$CSD se présente sous la forme d'un fichier de type Util nommé SysCSDxx où xx désigne la version (actuellement la version 03).

Double-cliquez dessus. Le programme va alors charger sa partie résidente dans la zone Heap du système.

Ouvrez alors une Task Window, et tapez au prompt la suite de commandes suivantes:

*SetMacro CLI$Prompt <Sys$CSD> *

ADFS::<NoCurrentDirectory> *Dir @

ADFS:IDEDisc4.$ *

Note: ce qui est souligné est ce que vous devez taper. Les réactions du système peuvent varier quelque peu en fonction de la configuration de votre ordinateur Acorn au moment du test.

Pour revenir à une présentation normale, tapez la commande suivante:

*Set CLI$Prompt *

Ou bien:

*UnSet CLI$Prompt

Il est possible de libérer la mémoire occupée par la partie résidente en supprimant la variable Sys$CSD. Ceci ne peut toutefois se faire avec la commande Unset qui ne joue que sur les variables ”classiques . Il faut alors utiliser le petit utilitaire DelVCod présenté dans un autre chapitre de ce numéro.

Implémentation

Initialisation

; Bit inhibant la génération
; d'erreurs au sein des SWI appelés
XBit	*	(1<<17)

OS_Byte	*	&06
XOS_Byte * OS_Byte :OR: Xbit

READOSVER *	129
; Version minimum supportée: RISC OS 3.00
OS_MIN	*	&A3

; Teste le numéro de version du système
        MOV	R0, #READOSVER
        MOV	R1, #0
        MOV	R2, #&FF
        SWI	XOS_Byte
        CMP	R1, #OS_MIN-1
        ADRLS	R0, meserr
        ORRLS	R14, R14, #MBITV
        MOVLSS	PC, R14
...
meserr	DCD	&1234	
        DCB "This utility requires RISC OS 3.00 (or later).",0
OS_SetVarVal *	&24
XOS_SetVarVal *	OS_SetVarVal :OR: Xbit
...
;Adresse du nom de variable
        ADR	R0, varname
;Adresse du code	
        ADR	R1, Code
        LDR	R2, size
        MOV	R3, #0
;Indique une variable "code"
        MOV	R4, #&10
;Enregistrement de la variable
        SWI	XOS_SetVarVal
        MOV	PC, R14	;Retour au système

varname DCB	"Sys$CSD",0
        ALIGN
size    DCD	EndCode-Code
Code
...

Partie résidente

; Le premier mot est une instruction de saut
; sur le code "écriture", ou un retour
; simple dans le cas le programme ne gère
; pas la modification.
Code    MOV	PC, R14
OS_ReadVarVal *	&23
XOS_ReadVarVal * OS_ReadVarVal :OR: XBit 

; Macro générique permettant de lire la
; valeur d'une variable système RISC OS
        MACRO
LITVGEN	$VarName
        ADR	R0, $VarName
        MOV	R3, #0
        MOV	R4, #0
        SWI	XOS_ReadVarVal
        MEND
; Macro normale pour lire la valeur d'une
; variable système RISC OS avec des
; définitions de zones buffer classiques.
        MACRO
LITVAR	$VarName, $Buffer
        ADR	R1, $Buffer
        MOV	R2, #?$Buffer
        LITVGEN	$VarName
        MEND
...
; A partir du deuxième mot se trouve le code
; "lecture"
; Comme le code est appelé en mode SVC et
; qu'il comporte lui même un appel SWI, il
; faut sauvegarder R14 (ici R14_svc) dans la
; pile système. De plus, R3 doit être
; préservé car utilisé par ailleurs dans le
; code.	
STMFD	SP!, {r3 , R14}
; Phase préliminaire: Initialiser la
; longueur de la chaine renvoyee a zero
        MOV	R0, #0
        STR	R0, lenbuf1
; Première phase: aller chercher le
; CurrentFilingSystem
LITVAR	Var1, buffer0
        LDMVSFD	SP!, {r3 , PC}
; A ce moment là,
; R1 (inchangé) = adresse du
; buffer; R2 = nombre de caractères lus.
; Deuxième phase: on recopie la zone
        ADR	R3, buffer1
        MOV	R4, #0
0       TEQ	R4, R2
        BEQ	%F1
        LDRB	R0, [R1, R4]
        STRB	R0, [R3, R4]
        ADD	R4, R4, #1
        B	%B0
1       STR	R4, lenbuf1	; M.A.J. longueur
; Troisième phase: on suffixe correctement
        ADR	R0, VarSuffix
        ADD	R1, R1, R2	;Adresse destinat.
        MOV	R4, #0
2       LDRB	R3, [R0, R4]
        STRB	R3, [R1], #1
        ADD	R4, R4, #1
        TEQ	R4, #?VarSuffix
        BNE	%B2
; Quatrième phase: lire le CSD courant
        ADR	R1, buffer1
        LDR	R0, lenbuf1
        ADD	R1, R1, R0
        RSB	R2, R0,#?buffer1
        LITVGEN	Var2
        MOVVS	R2, #0
; Affichage d'une chaine par
; défaut	
        TEQ	R2, #0
        BNE	%F4
        ADR	R3, mesdef
3       LDRB	R0, [R3, R2]
        STRB	R0, [R1, R2]
        ADD	R2, R2, #1
        TEQ	R2, #?mesdef
        BNE	%B3
4       LDR	R0, lenbuf1
        ADD	R2, R0, R2	;Ajout longueurs
        ADR	R0, buffer1
        LDMFD	SP!, {r3 , PC}^
lenbuf1 DCD	0	;Longueur du prompt
Var1    DCB	"FileSwitch$CurrentFilingSystem",0
Var2    DCB	"FileSwitch$"
buffer0 %	16
buffer1 %	48
VarSuffix DCB	"$CSD",0
mesdef  DCB	":<NoCurrentDirectory>"

EndCode
END